sp_arm32.c 4.8 MB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747374837493750375137523753375437553756375737583759376037613762376337643765376637673768376937703771377237733774377537763777377837793780378137823783378437853786378737883789379037913792379337943795379637973798379938003801380238033804380538063807380838093810381138123813381438153816381738183819382038213822382338243825382638273828382938303831383238333834383538363837383838393840384138423843384438453846384738483849385038513852385338543855385638573858385938603861386238633864386538663867386838693870387138723873387438753876387738783879388038813882388338843885388638873888388938903891389238933894389538963897389838993900390139023903390439053906390739083909391039113912391339143915391639173918391939203921392239233924392539263927392839293930393139323933393439353936393739383939394039413942394339443945394639473948394939503951395239533954395539563957395839593960396139623963396439653966396739683969397039713972397339743975397639773978397939803981398239833984398539863987398839893990399139923993399439953996399739983999400040014002400340044005400640074008400940104011401240134014401540164017401840194020402140224023402440254026402740284029403040314032403340344035403640374038403940404041404240434044404540464047404840494050405140524053405440554056405740584059406040614062406340644065406640674068406940704071407240734074407540764077407840794080408140824083408440854086408740884089409040914092409340944095409640974098409941004101410241034104410541064107410841094110411141124113411441154116411741184119412041214122412341244125412641274128412941304131413241334134413541364137413841394140414141424143414441454146414741484149415041514152415341544155415641574158415941604161416241634164416541664167416841694170417141724173417441754176417741784179418041814182418341844185418641874188418941904191419241934194419541964197419841994200420142024203420442054206420742084209421042114212421342144215421642174218421942204221422242234224422542264227422842294230423142324233423442354236423742384239424042414242424342444245424642474248424942504251425242534254425542564257425842594260426142624263426442654266426742684269427042714272427342744275427642774278427942804281428242834284428542864287428842894290429142924293429442954296429742984299430043014302430343044305430643074308430943104311431243134314431543164317431843194320432143224323432443254326432743284329433043314332433343344335433643374338433943404341434243434344434543464347434843494350435143524353435443554356435743584359436043614362436343644365436643674368436943704371437243734374437543764377437843794380438143824383438443854386438743884389439043914392439343944395439643974398439944004401440244034404440544064407440844094410441144124413441444154416441744184419442044214422442344244425442644274428442944304431443244334434443544364437443844394440444144424443444444454446444744484449445044514452445344544455445644574458445944604461446244634464446544664467446844694470447144724473447444754476447744784479448044814482448344844485448644874488448944904491449244934494449544964497449844994500450145024503450445054506450745084509451045114512451345144515451645174518451945204521452245234524452545264527452845294530453145324533453445354536453745384539454045414542454345444545454645474548454945504551455245534554455545564557455845594560456145624563456445654566456745684569457045714572457345744575457645774578457945804581458245834584458545864587458845894590459145924593459445954596459745984599460046014602460346044605460646074608460946104611461246134614461546164617461846194620462146224623462446254626462746284629463046314632463346344635463646374638463946404641464246434644464546464647464846494650465146524653465446554656465746584659466046614662466346644665466646674668466946704671467246734674467546764677467846794680468146824683468446854686468746884689469046914692469346944695469646974698469947004701470247034704470547064707470847094710471147124713471447154716471747184719472047214722472347244725472647274728472947304731473247334734473547364737473847394740474147424743474447454746474747484749475047514752475347544755475647574758475947604761476247634764476547664767476847694770477147724773477447754776477747784779478047814782478347844785478647874788478947904791479247934794479547964797479847994800480148024803480448054806480748084809481048114812481348144815481648174818481948204821482248234824482548264827482848294830483148324833483448354836483748384839484048414842484348444845484648474848484948504851485248534854485548564857485848594860486148624863486448654866486748684869487048714872487348744875487648774878487948804881488248834884488548864887488848894890489148924893489448954896489748984899490049014902490349044905490649074908490949104911491249134914491549164917491849194920492149224923492449254926492749284929493049314932493349344935493649374938493949404941494249434944494549464947494849494950495149524953495449554956495749584959496049614962496349644965496649674968496949704971497249734974497549764977497849794980498149824983498449854986498749884989499049914992499349944995499649974998499950005001500250035004500550065007500850095010501150125013501450155016501750185019502050215022502350245025502650275028502950305031503250335034503550365037503850395040504150425043504450455046504750485049505050515052505350545055505650575058505950605061506250635064506550665067506850695070507150725073507450755076507750785079508050815082508350845085508650875088508950905091509250935094509550965097509850995100510151025103510451055106510751085109511051115112511351145115511651175118511951205121512251235124512551265127512851295130513151325133513451355136513751385139514051415142514351445145514651475148514951505151515251535154515551565157515851595160516151625163516451655166516751685169517051715172517351745175517651775178517951805181518251835184518551865187518851895190519151925193519451955196519751985199520052015202520352045205520652075208520952105211521252135214521552165217521852195220522152225223522452255226522752285229523052315232523352345235523652375238523952405241524252435244524552465247524852495250525152525253525452555256525752585259526052615262526352645265526652675268526952705271527252735274527552765277527852795280528152825283528452855286528752885289529052915292529352945295529652975298529953005301530253035304530553065307530853095310531153125313531453155316531753185319532053215322532353245325532653275328532953305331533253335334533553365337533853395340534153425343534453455346534753485349535053515352535353545355535653575358535953605361536253635364536553665367536853695370537153725373537453755376537753785379538053815382538353845385538653875388538953905391539253935394539553965397539853995400540154025403540454055406540754085409541054115412541354145415541654175418541954205421542254235424542554265427542854295430543154325433543454355436543754385439544054415442544354445445544654475448544954505451545254535454545554565457545854595460546154625463546454655466546754685469547054715472547354745475547654775478547954805481548254835484548554865487548854895490549154925493549454955496549754985499550055015502550355045505550655075508550955105511551255135514551555165517551855195520552155225523552455255526552755285529553055315532553355345535553655375538553955405541554255435544554555465547554855495550555155525553555455555556555755585559556055615562556355645565556655675568556955705571557255735574557555765577557855795580558155825583558455855586558755885589559055915592559355945595559655975598559956005601560256035604560556065607560856095610561156125613561456155616561756185619562056215622562356245625562656275628562956305631563256335634563556365637563856395640564156425643564456455646564756485649565056515652565356545655565656575658565956605661566256635664566556665667566856695670567156725673567456755676567756785679568056815682568356845685568656875688568956905691569256935694569556965697569856995700570157025703570457055706570757085709571057115712571357145715571657175718571957205721572257235724572557265727572857295730573157325733573457355736573757385739574057415742574357445745574657475748574957505751575257535754575557565757575857595760576157625763576457655766576757685769577057715772577357745775577657775778577957805781578257835784578557865787578857895790579157925793579457955796579757985799580058015802580358045805580658075808580958105811581258135814581558165817581858195820582158225823582458255826582758285829583058315832583358345835583658375838583958405841584258435844584558465847584858495850585158525853585458555856585758585859586058615862586358645865586658675868586958705871587258735874587558765877587858795880588158825883588458855886588758885889589058915892589358945895589658975898589959005901590259035904590559065907590859095910591159125913591459155916591759185919592059215922592359245925592659275928592959305931593259335934593559365937593859395940594159425943594459455946594759485949595059515952595359545955595659575958595959605961596259635964596559665967596859695970597159725973597459755976597759785979598059815982598359845985598659875988598959905991599259935994599559965997599859996000600160026003600460056006600760086009601060116012601360146015601660176018601960206021602260236024602560266027602860296030603160326033603460356036603760386039604060416042604360446045604660476048604960506051605260536054605560566057605860596060606160626063606460656066606760686069607060716072607360746075607660776078607960806081608260836084608560866087608860896090609160926093609460956096609760986099610061016102610361046105610661076108610961106111611261136114611561166117611861196120612161226123612461256126612761286129613061316132613361346135613661376138613961406141614261436144614561466147614861496150615161526153615461556156615761586159616061616162616361646165616661676168616961706171617261736174617561766177617861796180618161826183618461856186618761886189619061916192619361946195619661976198619962006201620262036204620562066207620862096210621162126213621462156216621762186219622062216222622362246225622662276228622962306231623262336234623562366237623862396240624162426243624462456246624762486249625062516252625362546255625662576258625962606261626262636264626562666267626862696270627162726273627462756276627762786279628062816282628362846285628662876288628962906291629262936294629562966297629862996300630163026303630463056306630763086309631063116312631363146315631663176318631963206321632263236324632563266327632863296330633163326333633463356336633763386339634063416342634363446345634663476348634963506351635263536354635563566357635863596360636163626363636463656366636763686369637063716372637363746375637663776378637963806381638263836384638563866387638863896390639163926393639463956396639763986399640064016402640364046405640664076408640964106411641264136414641564166417641864196420642164226423642464256426642764286429643064316432643364346435643664376438643964406441644264436444644564466447644864496450645164526453645464556456645764586459646064616462646364646465646664676468646964706471647264736474647564766477647864796480648164826483648464856486648764886489649064916492649364946495649664976498649965006501650265036504650565066507650865096510651165126513651465156516651765186519652065216522652365246525652665276528652965306531653265336534653565366537653865396540654165426543654465456546654765486549655065516552655365546555655665576558655965606561656265636564656565666567656865696570657165726573657465756576657765786579658065816582658365846585658665876588658965906591659265936594659565966597659865996600660166026603660466056606660766086609661066116612661366146615661666176618661966206621662266236624662566266627662866296630663166326633663466356636663766386639664066416642664366446645664666476648664966506651665266536654665566566657665866596660666166626663666466656666666766686669667066716672667366746675667666776678667966806681668266836684668566866687668866896690669166926693669466956696669766986699670067016702670367046705670667076708670967106711671267136714671567166717671867196720672167226723672467256726672767286729673067316732673367346735673667376738673967406741674267436744674567466747674867496750675167526753675467556756675767586759676067616762676367646765676667676768676967706771677267736774677567766777677867796780678167826783678467856786678767886789679067916792679367946795679667976798679968006801680268036804680568066807680868096810681168126813681468156816681768186819682068216822682368246825682668276828682968306831683268336834683568366837683868396840684168426843684468456846684768486849685068516852685368546855685668576858685968606861686268636864686568666867686868696870687168726873687468756876687768786879688068816882688368846885688668876888688968906891689268936894689568966897689868996900690169026903690469056906690769086909691069116912691369146915691669176918691969206921692269236924692569266927692869296930693169326933693469356936693769386939694069416942694369446945694669476948694969506951695269536954695569566957695869596960696169626963696469656966696769686969697069716972697369746975697669776978697969806981698269836984698569866987698869896990699169926993699469956996699769986999700070017002700370047005700670077008700970107011701270137014701570167017701870197020702170227023702470257026702770287029703070317032703370347035703670377038703970407041704270437044704570467047704870497050705170527053705470557056705770587059706070617062706370647065706670677068706970707071707270737074707570767077707870797080708170827083708470857086708770887089709070917092709370947095709670977098709971007101710271037104710571067107710871097110711171127113711471157116711771187119712071217122712371247125712671277128712971307131713271337134713571367137713871397140714171427143714471457146714771487149715071517152715371547155715671577158715971607161716271637164716571667167716871697170717171727173717471757176717771787179718071817182718371847185718671877188718971907191719271937194719571967197719871997200720172027203720472057206720772087209721072117212721372147215721672177218721972207221722272237224722572267227722872297230723172327233723472357236723772387239724072417242724372447245724672477248724972507251725272537254725572567257725872597260726172627263726472657266726772687269727072717272727372747275727672777278727972807281728272837284728572867287728872897290729172927293729472957296729772987299730073017302730373047305730673077308730973107311731273137314731573167317731873197320732173227323732473257326732773287329733073317332733373347335733673377338733973407341734273437344734573467347734873497350735173527353735473557356735773587359736073617362736373647365736673677368736973707371737273737374737573767377737873797380738173827383738473857386738773887389739073917392739373947395739673977398739974007401740274037404740574067407740874097410741174127413741474157416741774187419742074217422742374247425742674277428742974307431743274337434743574367437743874397440744174427443744474457446744774487449745074517452745374547455745674577458745974607461746274637464746574667467746874697470747174727473747474757476747774787479748074817482748374847485748674877488748974907491749274937494749574967497749874997500750175027503750475057506750775087509751075117512751375147515751675177518751975207521752275237524752575267527752875297530753175327533753475357536753775387539754075417542754375447545754675477548754975507551755275537554755575567557755875597560756175627563756475657566756775687569757075717572757375747575757675777578757975807581758275837584758575867587758875897590759175927593759475957596759775987599760076017602760376047605760676077608760976107611761276137614761576167617761876197620762176227623762476257626762776287629763076317632763376347635763676377638763976407641764276437644764576467647764876497650765176527653765476557656765776587659766076617662766376647665766676677668766976707671767276737674767576767677767876797680768176827683768476857686768776887689769076917692769376947695769676977698769977007701770277037704770577067707770877097710771177127713771477157716771777187719772077217722772377247725772677277728772977307731773277337734773577367737773877397740774177427743774477457746774777487749775077517752775377547755775677577758775977607761776277637764776577667767776877697770777177727773777477757776777777787779778077817782778377847785778677877788778977907791779277937794779577967797779877997800780178027803780478057806780778087809781078117812781378147815781678177818781978207821782278237824782578267827782878297830783178327833783478357836783778387839784078417842784378447845784678477848784978507851785278537854785578567857785878597860786178627863786478657866786778687869787078717872787378747875787678777878787978807881788278837884788578867887788878897890789178927893789478957896789778987899790079017902790379047905790679077908790979107911791279137914791579167917791879197920792179227923792479257926792779287929793079317932793379347935793679377938793979407941794279437944794579467947794879497950795179527953795479557956795779587959796079617962796379647965796679677968796979707971797279737974797579767977797879797980798179827983798479857986798779887989799079917992799379947995799679977998799980008001800280038004800580068007800880098010801180128013801480158016801780188019802080218022802380248025802680278028802980308031803280338034803580368037803880398040804180428043804480458046804780488049805080518052805380548055805680578058805980608061806280638064806580668067806880698070807180728073807480758076807780788079808080818082808380848085808680878088808980908091809280938094809580968097809880998100810181028103810481058106810781088109811081118112811381148115811681178118811981208121812281238124812581268127812881298130813181328133813481358136813781388139814081418142814381448145814681478148814981508151815281538154815581568157815881598160816181628163816481658166816781688169817081718172817381748175817681778178817981808181818281838184818581868187818881898190819181928193819481958196819781988199820082018202820382048205820682078208820982108211821282138214821582168217821882198220822182228223822482258226822782288229823082318232823382348235823682378238823982408241824282438244824582468247824882498250825182528253825482558256825782588259826082618262826382648265826682678268826982708271827282738274827582768277827882798280828182828283828482858286828782888289829082918292829382948295829682978298829983008301830283038304830583068307830883098310831183128313831483158316831783188319832083218322832383248325832683278328832983308331833283338334833583368337833883398340834183428343834483458346834783488349835083518352835383548355835683578358835983608361836283638364836583668367836883698370837183728373837483758376837783788379838083818382838383848385838683878388838983908391839283938394839583968397839883998400840184028403840484058406840784088409841084118412841384148415841684178418841984208421842284238424842584268427842884298430843184328433843484358436843784388439844084418442844384448445844684478448844984508451845284538454845584568457845884598460846184628463846484658466846784688469847084718472847384748475847684778478847984808481848284838484848584868487848884898490849184928493849484958496849784988499850085018502850385048505850685078508850985108511851285138514851585168517851885198520852185228523852485258526852785288529853085318532853385348535853685378538853985408541854285438544854585468547854885498550855185528553855485558556855785588559856085618562856385648565856685678568856985708571857285738574857585768577857885798580858185828583858485858586858785888589859085918592859385948595859685978598859986008601860286038604860586068607860886098610861186128613861486158616861786188619862086218622862386248625862686278628862986308631863286338634863586368637863886398640864186428643864486458646864786488649865086518652865386548655865686578658865986608661866286638664866586668667866886698670867186728673867486758676867786788679868086818682868386848685868686878688868986908691869286938694869586968697869886998700870187028703870487058706870787088709871087118712871387148715871687178718871987208721872287238724872587268727872887298730873187328733873487358736873787388739874087418742874387448745874687478748874987508751875287538754875587568757875887598760876187628763876487658766876787688769877087718772877387748775877687778778877987808781878287838784878587868787878887898790879187928793879487958796879787988799880088018802880388048805880688078808880988108811881288138814881588168817881888198820882188228823882488258826882788288829883088318832883388348835883688378838883988408841884288438844884588468847884888498850885188528853885488558856885788588859886088618862886388648865886688678868886988708871887288738874887588768877887888798880888188828883888488858886888788888889889088918892889388948895889688978898889989008901890289038904890589068907890889098910891189128913891489158916891789188919892089218922892389248925892689278928892989308931893289338934893589368937893889398940894189428943894489458946894789488949895089518952895389548955895689578958895989608961896289638964896589668967896889698970897189728973897489758976897789788979898089818982898389848985898689878988898989908991899289938994899589968997899889999000900190029003900490059006900790089009901090119012901390149015901690179018901990209021902290239024902590269027902890299030903190329033903490359036903790389039904090419042904390449045904690479048904990509051905290539054905590569057905890599060906190629063906490659066906790689069907090719072907390749075907690779078907990809081908290839084908590869087908890899090909190929093909490959096909790989099910091019102910391049105910691079108910991109111911291139114911591169117911891199120912191229123912491259126912791289129913091319132913391349135913691379138913991409141914291439144914591469147914891499150915191529153915491559156915791589159916091619162916391649165916691679168916991709171917291739174917591769177917891799180918191829183918491859186918791889189919091919192919391949195919691979198919992009201920292039204920592069207920892099210921192129213921492159216921792189219922092219222922392249225922692279228922992309231923292339234923592369237923892399240924192429243924492459246924792489249925092519252925392549255925692579258925992609261926292639264926592669267926892699270927192729273927492759276927792789279928092819282928392849285928692879288928992909291929292939294929592969297929892999300930193029303930493059306930793089309931093119312931393149315931693179318931993209321932293239324932593269327932893299330933193329333933493359336933793389339934093419342934393449345934693479348934993509351935293539354935593569357935893599360936193629363936493659366936793689369937093719372937393749375937693779378937993809381938293839384938593869387938893899390939193929393939493959396939793989399940094019402940394049405940694079408940994109411941294139414941594169417941894199420942194229423942494259426942794289429943094319432943394349435943694379438943994409441944294439444944594469447944894499450945194529453945494559456945794589459946094619462946394649465946694679468946994709471947294739474947594769477947894799480948194829483948494859486948794889489949094919492949394949495949694979498949995009501950295039504950595069507950895099510951195129513951495159516951795189519952095219522952395249525952695279528952995309531953295339534953595369537953895399540954195429543954495459546954795489549955095519552955395549555955695579558955995609561956295639564956595669567956895699570957195729573957495759576957795789579958095819582958395849585958695879588958995909591959295939594959595969597959895999600960196029603960496059606960796089609961096119612961396149615961696179618961996209621962296239624962596269627962896299630963196329633963496359636963796389639964096419642964396449645964696479648964996509651965296539654965596569657965896599660966196629663966496659666966796689669967096719672967396749675967696779678967996809681968296839684968596869687968896899690969196929693969496959696969796989699970097019702970397049705970697079708970997109711971297139714971597169717971897199720972197229723972497259726972797289729973097319732973397349735973697379738973997409741974297439744974597469747974897499750975197529753975497559756975797589759976097619762976397649765976697679768976997709771977297739774977597769777977897799780978197829783978497859786978797889789979097919792979397949795979697979798979998009801980298039804980598069807980898099810981198129813981498159816981798189819982098219822982398249825982698279828982998309831983298339834983598369837983898399840984198429843984498459846984798489849985098519852985398549855985698579858985998609861986298639864986598669867986898699870987198729873987498759876987798789879988098819882988398849885988698879888988998909891989298939894989598969897989898999900990199029903990499059906990799089909991099119912991399149915991699179918991999209921992299239924992599269927992899299930993199329933993499359936993799389939994099419942994399449945994699479948994999509951995299539954995599569957995899599960996199629963996499659966996799689969997099719972997399749975997699779978997999809981998299839984998599869987998899899990999199929993999499959996999799989999100001000110002100031000410005100061000710008100091001010011100121001310014100151001610017100181001910020100211002210023100241002510026100271002810029100301003110032100331003410035100361003710038100391004010041100421004310044100451004610047100481004910050100511005210053100541005510056100571005810059100601006110062100631006410065100661006710068100691007010071100721007310074100751007610077100781007910080100811008210083100841008510086100871008810089100901009110092100931009410095100961009710098100991010010101101021010310104101051010610107101081010910110101111011210113101141011510116101171011810119101201012110122101231012410125101261012710128101291013010131101321013310134101351013610137101381013910140101411014210143101441014510146101471014810149101501015110152101531015410155101561015710158101591016010161101621016310164101651016610167101681016910170101711017210173101741017510176101771017810179101801018110182101831018410185101861018710188101891019010191101921019310194101951019610197101981019910200102011020210203102041020510206102071020810209102101021110212102131021410215102161021710218102191022010221102221022310224102251022610227102281022910230102311023210233102341023510236102371023810239102401024110242102431024410245102461024710248102491025010251102521025310254102551025610257102581025910260102611026210263102641026510266102671026810269102701027110272102731027410275102761027710278102791028010281102821028310284102851028610287102881028910290102911029210293102941029510296102971029810299103001030110302103031030410305103061030710308103091031010311103121031310314103151031610317103181031910320103211032210323103241032510326103271032810329103301033110332103331033410335103361033710338103391034010341103421034310344103451034610347103481034910350103511035210353103541035510356103571035810359103601036110362103631036410365103661036710368103691037010371103721037310374103751037610377103781037910380103811038210383103841038510386103871038810389103901039110392103931039410395103961039710398103991040010401104021040310404104051040610407104081040910410104111041210413104141041510416104171041810419104201042110422104231042410425104261042710428104291043010431104321043310434104351043610437104381043910440104411044210443104441044510446104471044810449104501045110452104531045410455104561045710458104591046010461104621046310464104651046610467104681046910470104711047210473104741047510476104771047810479104801048110482104831048410485104861048710488104891049010491104921049310494104951049610497104981049910500105011050210503105041050510506105071050810509105101051110512105131051410515105161051710518105191052010521105221052310524105251052610527105281052910530105311053210533105341053510536105371053810539105401054110542105431054410545105461054710548105491055010551105521055310554105551055610557105581055910560105611056210563105641056510566105671056810569105701057110572105731057410575105761057710578105791058010581105821058310584105851058610587105881058910590105911059210593105941059510596105971059810599106001060110602106031060410605106061060710608106091061010611106121061310614106151061610617106181061910620106211062210623106241062510626106271062810629106301063110632106331063410635106361063710638106391064010641106421064310644106451064610647106481064910650106511065210653106541065510656106571065810659106601066110662106631066410665106661066710668106691067010671106721067310674106751067610677106781067910680106811068210683106841068510686106871068810689106901069110692106931069410695106961069710698106991070010701107021070310704107051070610707107081070910710107111071210713107141071510716107171071810719107201072110722107231072410725107261072710728107291073010731107321073310734107351073610737107381073910740107411074210743107441074510746107471074810749107501075110752107531075410755107561075710758107591076010761107621076310764107651076610767107681076910770107711077210773107741077510776107771077810779107801078110782107831078410785107861078710788107891079010791107921079310794107951079610797107981079910800108011080210803108041080510806108071080810809108101081110812108131081410815108161081710818108191082010821108221082310824108251082610827108281082910830108311083210833108341083510836108371083810839108401084110842108431084410845108461084710848108491085010851108521085310854108551085610857108581085910860108611086210863108641086510866108671086810869108701087110872108731087410875108761087710878108791088010881108821088310884108851088610887108881088910890108911089210893108941089510896108971089810899109001090110902109031090410905109061090710908109091091010911109121091310914109151091610917109181091910920109211092210923109241092510926109271092810929109301093110932109331093410935109361093710938109391094010941109421094310944109451094610947109481094910950109511095210953109541095510956109571095810959109601096110962109631096410965109661096710968109691097010971109721097310974109751097610977109781097910980109811098210983109841098510986109871098810989109901099110992109931099410995109961099710998109991100011001110021100311004110051100611007110081100911010110111101211013110141101511016110171101811019110201102111022110231102411025110261102711028110291103011031110321103311034110351103611037110381103911040110411104211043110441104511046110471104811049110501105111052110531105411055110561105711058110591106011061110621106311064110651106611067110681106911070110711107211073110741107511076110771107811079110801108111082110831108411085110861108711088110891109011091110921109311094110951109611097110981109911100111011110211103111041110511106111071110811109111101111111112111131111411115111161111711118111191112011121111221112311124111251112611127111281112911130111311113211133111341113511136111371113811139111401114111142111431114411145111461114711148111491115011151111521115311154111551115611157111581115911160111611116211163111641116511166111671116811169111701117111172111731117411175111761117711178111791118011181111821118311184111851118611187111881118911190111911119211193111941119511196111971119811199112001120111202112031120411205112061120711208112091121011211112121121311214112151121611217112181121911220112211122211223112241122511226112271122811229112301123111232112331123411235112361123711238112391124011241112421124311244112451124611247112481124911250112511125211253112541125511256112571125811259112601126111262112631126411265112661126711268112691127011271112721127311274112751127611277112781127911280112811128211283112841128511286112871128811289112901129111292112931129411295112961129711298112991130011301113021130311304113051130611307113081130911310113111131211313113141131511316113171131811319113201132111322113231132411325113261132711328113291133011331113321133311334113351133611337113381133911340113411134211343113441134511346113471134811349113501135111352113531135411355113561135711358113591136011361113621136311364113651136611367113681136911370113711137211373113741137511376113771137811379113801138111382113831138411385113861138711388113891139011391113921139311394113951139611397113981139911400114011140211403114041140511406114071140811409114101141111412114131141411415114161141711418114191142011421114221142311424114251142611427114281142911430114311143211433114341143511436114371143811439114401144111442114431144411445114461144711448114491145011451114521145311454114551145611457114581145911460114611146211463114641146511466114671146811469114701147111472114731147411475114761147711478114791148011481114821148311484114851148611487114881148911490114911149211493114941149511496114971149811499115001150111502115031150411505115061150711508115091151011511115121151311514115151151611517115181151911520115211152211523115241152511526115271152811529115301153111532115331153411535115361153711538115391154011541115421154311544115451154611547115481154911550115511155211553115541155511556115571155811559115601156111562115631156411565115661156711568115691157011571115721157311574115751157611577115781157911580115811158211583115841158511586115871158811589115901159111592115931159411595115961159711598115991160011601116021160311604116051160611607116081160911610116111161211613116141161511616116171161811619116201162111622116231162411625116261162711628116291163011631116321163311634116351163611637116381163911640116411164211643116441164511646116471164811649116501165111652116531165411655116561165711658116591166011661116621166311664116651166611667116681166911670116711167211673116741167511676116771167811679116801168111682116831168411685116861168711688116891169011691116921169311694116951169611697116981169911700117011170211703117041170511706117071170811709117101171111712117131171411715117161171711718117191172011721117221172311724117251172611727117281172911730117311173211733117341173511736117371173811739117401174111742117431174411745117461174711748117491175011751117521175311754117551175611757117581175911760117611176211763117641176511766117671176811769117701177111772117731177411775117761177711778117791178011781117821178311784117851178611787117881178911790117911179211793117941179511796117971179811799118001180111802118031180411805118061180711808118091181011811118121181311814118151181611817118181181911820118211182211823118241182511826118271182811829118301183111832118331183411835118361183711838118391184011841118421184311844118451184611847118481184911850118511185211853118541185511856118571185811859118601186111862118631186411865118661186711868118691187011871118721187311874118751187611877118781187911880118811188211883118841188511886118871188811889118901189111892118931189411895118961189711898118991190011901119021190311904119051190611907119081190911910119111191211913119141191511916119171191811919119201192111922119231192411925119261192711928119291193011931119321193311934119351193611937119381193911940119411194211943119441194511946119471194811949119501195111952119531195411955119561195711958119591196011961119621196311964119651196611967119681196911970119711197211973119741197511976119771197811979119801198111982119831198411985119861198711988119891199011991119921199311994119951199611997119981199912000120011200212003120041200512006120071200812009120101201112012120131201412015120161201712018120191202012021120221202312024120251202612027120281202912030120311203212033120341203512036120371203812039120401204112042120431204412045120461204712048120491205012051120521205312054120551205612057120581205912060120611206212063120641206512066120671206812069120701207112072120731207412075120761207712078120791208012081120821208312084120851208612087120881208912090120911209212093120941209512096120971209812099121001210112102121031210412105121061210712108121091211012111121121211312114121151211612117121181211912120121211212212123121241212512126121271212812129121301213112132121331213412135121361213712138121391214012141121421214312144121451214612147121481214912150121511215212153121541215512156121571215812159121601216112162121631216412165121661216712168121691217012171121721217312174121751217612177121781217912180121811218212183121841218512186121871218812189121901219112192121931219412195121961219712198121991220012201122021220312204122051220612207122081220912210122111221212213122141221512216122171221812219122201222112222122231222412225122261222712228122291223012231122321223312234122351223612237122381223912240122411224212243122441224512246122471224812249122501225112252122531225412255122561225712258122591226012261122621226312264122651226612267122681226912270122711227212273122741227512276122771227812279122801228112282122831228412285122861228712288122891229012291122921229312294122951229612297122981229912300123011230212303123041230512306123071230812309123101231112312123131231412315123161231712318123191232012321123221232312324123251232612327123281232912330123311233212333123341233512336123371233812339123401234112342123431234412345123461234712348123491235012351123521235312354123551235612357123581235912360123611236212363123641236512366123671236812369123701237112372123731237412375123761237712378123791238012381123821238312384123851238612387123881238912390123911239212393123941239512396123971239812399124001240112402124031240412405124061240712408124091241012411124121241312414124151241612417124181241912420124211242212423124241242512426124271242812429124301243112432124331243412435124361243712438124391244012441124421244312444124451244612447124481244912450124511245212453124541245512456124571245812459124601246112462124631246412465124661246712468124691247012471124721247312474124751247612477124781247912480124811248212483124841248512486124871248812489124901249112492124931249412495124961249712498124991250012501125021250312504125051250612507125081250912510125111251212513125141251512516125171251812519125201252112522125231252412525125261252712528125291253012531125321253312534125351253612537125381253912540125411254212543125441254512546125471254812549125501255112552125531255412555125561255712558125591256012561125621256312564125651256612567125681256912570125711257212573125741257512576125771257812579125801258112582125831258412585125861258712588125891259012591125921259312594125951259612597125981259912600126011260212603126041260512606126071260812609126101261112612126131261412615126161261712618126191262012621126221262312624126251262612627126281262912630126311263212633126341263512636126371263812639126401264112642126431264412645126461264712648126491265012651126521265312654126551265612657126581265912660126611266212663126641266512666126671266812669126701267112672126731267412675126761267712678126791268012681126821268312684126851268612687126881268912690126911269212693126941269512696126971269812699127001270112702127031270412705127061270712708127091271012711127121271312714127151271612717127181271912720127211272212723127241272512726127271272812729127301273112732127331273412735127361273712738127391274012741127421274312744127451274612747127481274912750127511275212753127541275512756127571275812759127601276112762127631276412765127661276712768127691277012771127721277312774127751277612777127781277912780127811278212783127841278512786127871278812789127901279112792127931279412795127961279712798127991280012801128021280312804128051280612807128081280912810128111281212813128141281512816128171281812819128201282112822128231282412825128261282712828128291283012831128321283312834128351283612837128381283912840128411284212843128441284512846128471284812849128501285112852128531285412855128561285712858128591286012861128621286312864128651286612867128681286912870128711287212873128741287512876128771287812879128801288112882128831288412885128861288712888128891289012891128921289312894128951289612897128981289912900129011290212903129041290512906129071290812909129101291112912129131291412915129161291712918129191292012921129221292312924129251292612927129281292912930129311293212933129341293512936129371293812939129401294112942129431294412945129461294712948129491295012951129521295312954129551295612957129581295912960129611296212963129641296512966129671296812969129701297112972129731297412975129761297712978129791298012981129821298312984129851298612987129881298912990129911299212993129941299512996129971299812999130001300113002130031300413005130061300713008130091301013011130121301313014130151301613017130181301913020130211302213023130241302513026130271302813029130301303113032130331303413035130361303713038130391304013041130421304313044130451304613047130481304913050130511305213053130541305513056130571305813059130601306113062130631306413065130661306713068130691307013071130721307313074130751307613077130781307913080130811308213083130841308513086130871308813089130901309113092130931309413095130961309713098130991310013101131021310313104131051310613107131081310913110131111311213113131141311513116131171311813119131201312113122131231312413125131261312713128131291313013131131321313313134131351313613137131381313913140131411314213143131441314513146131471314813149131501315113152131531315413155131561315713158131591316013161131621316313164131651316613167131681316913170131711317213173131741317513176131771317813179131801318113182131831318413185131861318713188131891319013191131921319313194131951319613197131981319913200132011320213203132041320513206132071320813209132101321113212132131321413215132161321713218132191322013221132221322313224132251322613227132281322913230132311323213233132341323513236132371323813239132401324113242132431324413245132461324713248132491325013251132521325313254132551325613257132581325913260132611326213263132641326513266132671326813269132701327113272132731327413275132761327713278132791328013281132821328313284132851328613287132881328913290132911329213293132941329513296132971329813299133001330113302133031330413305133061330713308133091331013311133121331313314133151331613317133181331913320133211332213323133241332513326133271332813329133301333113332133331333413335133361333713338133391334013341133421334313344133451334613347133481334913350133511335213353133541335513356133571335813359133601336113362133631336413365133661336713368133691337013371133721337313374133751337613377133781337913380133811338213383133841338513386133871338813389133901339113392133931339413395133961339713398133991340013401134021340313404134051340613407134081340913410134111341213413134141341513416134171341813419134201342113422134231342413425134261342713428134291343013431134321343313434134351343613437134381343913440134411344213443134441344513446134471344813449134501345113452134531345413455134561345713458134591346013461134621346313464134651346613467134681346913470134711347213473134741347513476134771347813479134801348113482134831348413485134861348713488134891349013491134921349313494134951349613497134981349913500135011350213503135041350513506135071350813509135101351113512135131351413515135161351713518135191352013521135221352313524135251352613527135281352913530135311353213533135341353513536135371353813539135401354113542135431354413545135461354713548135491355013551135521355313554135551355613557135581355913560135611356213563135641356513566135671356813569135701357113572135731357413575135761357713578135791358013581135821358313584135851358613587135881358913590135911359213593135941359513596135971359813599136001360113602136031360413605136061360713608136091361013611136121361313614136151361613617136181361913620136211362213623136241362513626136271362813629136301363113632136331363413635136361363713638136391364013641136421364313644136451364613647136481364913650136511365213653136541365513656136571365813659136601366113662136631366413665136661366713668136691367013671136721367313674136751367613677136781367913680136811368213683136841368513686136871368813689136901369113692136931369413695136961369713698136991370013701137021370313704137051370613707137081370913710137111371213713137141371513716137171371813719137201372113722137231372413725137261372713728137291373013731137321373313734137351373613737137381373913740137411374213743137441374513746137471374813749137501375113752137531375413755137561375713758137591376013761137621376313764137651376613767137681376913770137711377213773137741377513776137771377813779137801378113782137831378413785137861378713788137891379013791137921379313794137951379613797137981379913800138011380213803138041380513806138071380813809138101381113812138131381413815138161381713818138191382013821138221382313824138251382613827138281382913830138311383213833138341383513836138371383813839138401384113842138431384413845138461384713848138491385013851138521385313854138551385613857138581385913860138611386213863138641386513866138671386813869138701387113872138731387413875138761387713878138791388013881138821388313884138851388613887138881388913890138911389213893138941389513896138971389813899139001390113902139031390413905139061390713908139091391013911139121391313914139151391613917139181391913920139211392213923139241392513926139271392813929139301393113932139331393413935139361393713938139391394013941139421394313944139451394613947139481394913950139511395213953139541395513956139571395813959139601396113962139631396413965139661396713968139691397013971139721397313974139751397613977139781397913980139811398213983139841398513986139871398813989139901399113992139931399413995139961399713998139991400014001140021400314004140051400614007140081400914010140111401214013140141401514016140171401814019140201402114022140231402414025140261402714028140291403014031140321403314034140351403614037140381403914040140411404214043140441404514046140471404814049140501405114052140531405414055140561405714058140591406014061140621406314064140651406614067140681406914070140711407214073140741407514076140771407814079140801408114082140831408414085140861408714088140891409014091140921409314094140951409614097140981409914100141011410214103141041410514106141071410814109141101411114112141131411414115141161411714118141191412014121141221412314124141251412614127141281412914130141311413214133141341413514136141371413814139141401414114142141431414414145141461414714148141491415014151141521415314154141551415614157141581415914160141611416214163141641416514166141671416814169141701417114172141731417414175141761417714178141791418014181141821418314184141851418614187141881418914190141911419214193141941419514196141971419814199142001420114202142031420414205142061420714208142091421014211142121421314214142151421614217142181421914220142211422214223142241422514226142271422814229142301423114232142331423414235142361423714238142391424014241142421424314244142451424614247142481424914250142511425214253142541425514256142571425814259142601426114262142631426414265142661426714268142691427014271142721427314274142751427614277142781427914280142811428214283142841428514286142871428814289142901429114292142931429414295142961429714298142991430014301143021430314304143051430614307143081430914310143111431214313143141431514316143171431814319143201432114322143231432414325143261432714328143291433014331143321433314334143351433614337143381433914340143411434214343143441434514346143471434814349143501435114352143531435414355143561435714358143591436014361143621436314364143651436614367143681436914370143711437214373143741437514376143771437814379143801438114382143831438414385143861438714388143891439014391143921439314394143951439614397143981439914400144011440214403144041440514406144071440814409144101441114412144131441414415144161441714418144191442014421144221442314424144251442614427144281442914430144311443214433144341443514436144371443814439144401444114442144431444414445144461444714448144491445014451144521445314454144551445614457144581445914460144611446214463144641446514466144671446814469144701447114472144731447414475144761447714478144791448014481144821448314484144851448614487144881448914490144911449214493144941449514496144971449814499145001450114502145031450414505145061450714508145091451014511145121451314514145151451614517145181451914520145211452214523145241452514526145271452814529145301453114532145331453414535145361453714538145391454014541145421454314544145451454614547145481454914550145511455214553145541455514556145571455814559145601456114562145631456414565145661456714568145691457014571145721457314574145751457614577145781457914580145811458214583145841458514586145871458814589145901459114592145931459414595145961459714598145991460014601146021460314604146051460614607146081460914610146111461214613146141461514616146171461814619146201462114622146231462414625146261462714628146291463014631146321463314634146351463614637146381463914640146411464214643146441464514646146471464814649146501465114652146531465414655146561465714658146591466014661146621466314664146651466614667146681466914670146711467214673146741467514676146771467814679146801468114682146831468414685146861468714688146891469014691146921469314694146951469614697146981469914700147011470214703147041470514706147071470814709147101471114712147131471414715147161471714718147191472014721147221472314724147251472614727147281472914730147311473214733147341473514736147371473814739147401474114742147431474414745147461474714748147491475014751147521475314754147551475614757147581475914760147611476214763147641476514766147671476814769147701477114772147731477414775147761477714778147791478014781147821478314784147851478614787147881478914790147911479214793147941479514796147971479814799148001480114802148031480414805148061480714808148091481014811148121481314814148151481614817148181481914820148211482214823148241482514826148271482814829148301483114832148331483414835148361483714838148391484014841148421484314844148451484614847148481484914850148511485214853148541485514856148571485814859148601486114862148631486414865148661486714868148691487014871148721487314874148751487614877148781487914880148811488214883148841488514886148871488814889148901489114892148931489414895148961489714898148991490014901149021490314904149051490614907149081490914910149111491214913149141491514916149171491814919149201492114922149231492414925149261492714928149291493014931149321493314934149351493614937149381493914940149411494214943149441494514946149471494814949149501495114952149531495414955149561495714958149591496014961149621496314964149651496614967149681496914970149711497214973149741497514976149771497814979149801498114982149831498414985149861498714988149891499014991149921499314994149951499614997149981499915000150011500215003150041500515006150071500815009150101501115012150131501415015150161501715018150191502015021150221502315024150251502615027150281502915030150311503215033150341503515036150371503815039150401504115042150431504415045150461504715048150491505015051150521505315054150551505615057150581505915060150611506215063150641506515066150671506815069150701507115072150731507415075150761507715078150791508015081150821508315084150851508615087150881508915090150911509215093150941509515096150971509815099151001510115102151031510415105151061510715108151091511015111151121511315114151151511615117151181511915120151211512215123151241512515126151271512815129151301513115132151331513415135151361513715138151391514015141151421514315144151451514615147151481514915150151511515215153151541515515156151571515815159151601516115162151631516415165151661516715168151691517015171151721517315174151751517615177151781517915180151811518215183151841518515186151871518815189151901519115192151931519415195151961519715198151991520015201152021520315204152051520615207152081520915210152111521215213152141521515216152171521815219152201522115222152231522415225152261522715228152291523015231152321523315234152351523615237152381523915240152411524215243152441524515246152471524815249152501525115252152531525415255152561525715258152591526015261152621526315264152651526615267152681526915270152711527215273152741527515276152771527815279152801528115282152831528415285152861528715288152891529015291152921529315294152951529615297152981529915300153011530215303153041530515306153071530815309153101531115312153131531415315153161531715318153191532015321153221532315324153251532615327153281532915330153311533215333153341533515336153371533815339153401534115342153431534415345153461534715348153491535015351153521535315354153551535615357153581535915360153611536215363153641536515366153671536815369153701537115372153731537415375153761537715378153791538015381153821538315384153851538615387153881538915390153911539215393153941539515396153971539815399154001540115402154031540415405154061540715408154091541015411154121541315414154151541615417154181541915420154211542215423154241542515426154271542815429154301543115432154331543415435154361543715438154391544015441154421544315444154451544615447154481544915450154511545215453154541545515456154571545815459154601546115462154631546415465154661546715468154691547015471154721547315474154751547615477154781547915480154811548215483154841548515486154871548815489154901549115492154931549415495154961549715498154991550015501155021550315504155051550615507155081550915510155111551215513155141551515516155171551815519155201552115522155231552415525155261552715528155291553015531155321553315534155351553615537155381553915540155411554215543155441554515546155471554815549155501555115552155531555415555155561555715558155591556015561155621556315564155651556615567155681556915570155711557215573155741557515576155771557815579155801558115582155831558415585155861558715588155891559015591155921559315594155951559615597155981559915600156011560215603156041560515606156071560815609156101561115612156131561415615156161561715618156191562015621156221562315624156251562615627156281562915630156311563215633156341563515636156371563815639156401564115642156431564415645156461564715648156491565015651156521565315654156551565615657156581565915660156611566215663156641566515666156671566815669156701567115672156731567415675156761567715678156791568015681156821568315684156851568615687156881568915690156911569215693156941569515696156971569815699157001570115702157031570415705157061570715708157091571015711157121571315714157151571615717157181571915720157211572215723157241572515726157271572815729157301573115732157331573415735157361573715738157391574015741157421574315744157451574615747157481574915750157511575215753157541575515756157571575815759157601576115762157631576415765157661576715768157691577015771157721577315774157751577615777157781577915780157811578215783157841578515786157871578815789157901579115792157931579415795157961579715798157991580015801158021580315804158051580615807158081580915810158111581215813158141581515816158171581815819158201582115822158231582415825158261582715828158291583015831158321583315834158351583615837158381583915840158411584215843158441584515846158471584815849158501585115852158531585415855158561585715858158591586015861158621586315864158651586615867158681586915870158711587215873158741587515876158771587815879158801588115882158831588415885158861588715888158891589015891158921589315894158951589615897158981589915900159011590215903159041590515906159071590815909159101591115912159131591415915159161591715918159191592015921159221592315924159251592615927159281592915930159311593215933159341593515936159371593815939159401594115942159431594415945159461594715948159491595015951159521595315954159551595615957159581595915960159611596215963159641596515966159671596815969159701597115972159731597415975159761597715978159791598015981159821598315984159851598615987159881598915990159911599215993159941599515996159971599815999160001600116002160031600416005160061600716008160091601016011160121601316014160151601616017160181601916020160211602216023160241602516026160271602816029160301603116032160331603416035160361603716038160391604016041160421604316044160451604616047160481604916050160511605216053160541605516056160571605816059160601606116062160631606416065160661606716068160691607016071160721607316074160751607616077160781607916080160811608216083160841608516086160871608816089160901609116092160931609416095160961609716098160991610016101161021610316104161051610616107161081610916110161111611216113161141611516116161171611816119161201612116122161231612416125161261612716128161291613016131161321613316134161351613616137161381613916140161411614216143161441614516146161471614816149161501615116152161531615416155161561615716158161591616016161161621616316164161651616616167161681616916170161711617216173161741617516176161771617816179161801618116182161831618416185161861618716188161891619016191161921619316194161951619616197161981619916200162011620216203162041620516206162071620816209162101621116212162131621416215162161621716218162191622016221162221622316224162251622616227162281622916230162311623216233162341623516236162371623816239162401624116242162431624416245162461624716248162491625016251162521625316254162551625616257162581625916260162611626216263162641626516266162671626816269162701627116272162731627416275162761627716278162791628016281162821628316284162851628616287162881628916290162911629216293162941629516296162971629816299163001630116302163031630416305163061630716308163091631016311163121631316314163151631616317163181631916320163211632216323163241632516326163271632816329163301633116332163331633416335163361633716338163391634016341163421634316344163451634616347163481634916350163511635216353163541635516356163571635816359163601636116362163631636416365163661636716368163691637016371163721637316374163751637616377163781637916380163811638216383163841638516386163871638816389163901639116392163931639416395163961639716398163991640016401164021640316404164051640616407164081640916410164111641216413164141641516416164171641816419164201642116422164231642416425164261642716428164291643016431164321643316434164351643616437164381643916440164411644216443164441644516446164471644816449164501645116452164531645416455164561645716458164591646016461164621646316464164651646616467164681646916470164711647216473164741647516476164771647816479164801648116482164831648416485164861648716488164891649016491164921649316494164951649616497164981649916500165011650216503165041650516506165071650816509165101651116512165131651416515165161651716518165191652016521165221652316524165251652616527165281652916530165311653216533165341653516536165371653816539165401654116542165431654416545165461654716548165491655016551165521655316554165551655616557165581655916560165611656216563165641656516566165671656816569165701657116572165731657416575165761657716578165791658016581165821658316584165851658616587165881658916590165911659216593165941659516596165971659816599166001660116602166031660416605166061660716608166091661016611166121661316614166151661616617166181661916620166211662216623166241662516626166271662816629166301663116632166331663416635166361663716638166391664016641166421664316644166451664616647166481664916650166511665216653166541665516656166571665816659166601666116662166631666416665166661666716668166691667016671166721667316674166751667616677166781667916680166811668216683166841668516686166871668816689166901669116692166931669416695166961669716698166991670016701167021670316704167051670616707167081670916710167111671216713167141671516716167171671816719167201672116722167231672416725167261672716728167291673016731167321673316734167351673616737167381673916740167411674216743167441674516746167471674816749167501675116752167531675416755167561675716758167591676016761167621676316764167651676616767167681676916770167711677216773167741677516776167771677816779167801678116782167831678416785167861678716788167891679016791167921679316794167951679616797167981679916800168011680216803168041680516806168071680816809168101681116812168131681416815168161681716818168191682016821168221682316824168251682616827168281682916830168311683216833168341683516836168371683816839168401684116842168431684416845168461684716848168491685016851168521685316854168551685616857168581685916860168611686216863168641686516866168671686816869168701687116872168731687416875168761687716878168791688016881168821688316884168851688616887168881688916890168911689216893168941689516896168971689816899169001690116902169031690416905169061690716908169091691016911169121691316914169151691616917169181691916920169211692216923169241692516926169271692816929169301693116932169331693416935169361693716938169391694016941169421694316944169451694616947169481694916950169511695216953169541695516956169571695816959169601696116962169631696416965169661696716968169691697016971169721697316974169751697616977169781697916980169811698216983169841698516986169871698816989169901699116992169931699416995169961699716998169991700017001170021700317004170051700617007170081700917010170111701217013170141701517016170171701817019170201702117022170231702417025170261702717028170291703017031170321703317034170351703617037170381703917040170411704217043170441704517046170471704817049170501705117052170531705417055170561705717058170591706017061170621706317064170651706617067170681706917070170711707217073170741707517076170771707817079170801708117082170831708417085170861708717088170891709017091170921709317094170951709617097170981709917100171011710217103171041710517106171071710817109171101711117112171131711417115171161711717118171191712017121171221712317124171251712617127171281712917130171311713217133171341713517136171371713817139171401714117142171431714417145171461714717148171491715017151171521715317154171551715617157171581715917160171611716217163171641716517166171671716817169171701717117172171731717417175171761717717178171791718017181171821718317184171851718617187171881718917190171911719217193171941719517196171971719817199172001720117202172031720417205172061720717208172091721017211172121721317214172151721617217172181721917220172211722217223172241722517226172271722817229172301723117232172331723417235172361723717238172391724017241172421724317244172451724617247172481724917250172511725217253172541725517256172571725817259172601726117262172631726417265172661726717268172691727017271172721727317274172751727617277172781727917280172811728217283172841728517286172871728817289172901729117292172931729417295172961729717298172991730017301173021730317304173051730617307173081730917310173111731217313173141731517316173171731817319173201732117322173231732417325173261732717328173291733017331173321733317334173351733617337173381733917340173411734217343173441734517346173471734817349173501735117352173531735417355173561735717358173591736017361173621736317364173651736617367173681736917370173711737217373173741737517376173771737817379173801738117382173831738417385173861738717388173891739017391173921739317394173951739617397173981739917400174011740217403174041740517406174071740817409174101741117412174131741417415174161741717418174191742017421174221742317424174251742617427174281742917430174311743217433174341743517436174371743817439174401744117442174431744417445174461744717448174491745017451174521745317454174551745617457174581745917460174611746217463174641746517466174671746817469174701747117472174731747417475174761747717478174791748017481174821748317484174851748617487174881748917490174911749217493174941749517496174971749817499175001750117502175031750417505175061750717508175091751017511175121751317514175151751617517175181751917520175211752217523175241752517526175271752817529175301753117532175331753417535175361753717538175391754017541175421754317544175451754617547175481754917550175511755217553175541755517556175571755817559175601756117562175631756417565175661756717568175691757017571175721757317574175751757617577175781757917580175811758217583175841758517586175871758817589175901759117592175931759417595175961759717598175991760017601176021760317604176051760617607176081760917610176111761217613176141761517616176171761817619176201762117622176231762417625176261762717628176291763017631176321763317634176351763617637176381763917640176411764217643176441764517646176471764817649176501765117652176531765417655176561765717658176591766017661176621766317664176651766617667176681766917670176711767217673176741767517676176771767817679176801768117682176831768417685176861768717688176891769017691176921769317694176951769617697176981769917700177011770217703177041770517706177071770817709177101771117712177131771417715177161771717718177191772017721177221772317724177251772617727177281772917730177311773217733177341773517736177371773817739177401774117742177431774417745177461774717748177491775017751177521775317754177551775617757177581775917760177611776217763177641776517766177671776817769177701777117772177731777417775177761777717778177791778017781177821778317784177851778617787177881778917790177911779217793177941779517796177971779817799178001780117802178031780417805178061780717808178091781017811178121781317814178151781617817178181781917820178211782217823178241782517826178271782817829178301783117832178331783417835178361783717838178391784017841178421784317844178451784617847178481784917850178511785217853178541785517856178571785817859178601786117862178631786417865178661786717868178691787017871178721787317874178751787617877178781787917880178811788217883178841788517886178871788817889178901789117892178931789417895178961789717898178991790017901179021790317904179051790617907179081790917910179111791217913179141791517916179171791817919179201792117922179231792417925179261792717928179291793017931179321793317934179351793617937179381793917940179411794217943179441794517946179471794817949179501795117952179531795417955179561795717958179591796017961179621796317964179651796617967179681796917970179711797217973179741797517976179771797817979179801798117982179831798417985179861798717988179891799017991179921799317994179951799617997179981799918000180011800218003180041800518006180071800818009180101801118012180131801418015180161801718018180191802018021180221802318024180251802618027180281802918030180311803218033180341803518036180371803818039180401804118042180431804418045180461804718048180491805018051180521805318054180551805618057180581805918060180611806218063180641806518066180671806818069180701807118072180731807418075180761807718078180791808018081180821808318084180851808618087180881808918090180911809218093180941809518096180971809818099181001810118102181031810418105181061810718108181091811018111181121811318114181151811618117181181811918120181211812218123181241812518126181271812818129181301813118132181331813418135181361813718138181391814018141181421814318144181451814618147181481814918150181511815218153181541815518156181571815818159181601816118162181631816418165181661816718168181691817018171181721817318174181751817618177181781817918180181811818218183181841818518186181871818818189181901819118192181931819418195181961819718198181991820018201182021820318204182051820618207182081820918210182111821218213182141821518216182171821818219182201822118222182231822418225182261822718228182291823018231182321823318234182351823618237182381823918240182411824218243182441824518246182471824818249182501825118252182531825418255182561825718258182591826018261182621826318264182651826618267182681826918270182711827218273182741827518276182771827818279182801828118282182831828418285182861828718288182891829018291182921829318294182951829618297182981829918300183011830218303183041830518306183071830818309183101831118312183131831418315183161831718318183191832018321183221832318324183251832618327183281832918330183311833218333183341833518336183371833818339183401834118342183431834418345183461834718348183491835018351183521835318354183551835618357183581835918360183611836218363183641836518366183671836818369183701837118372183731837418375183761837718378183791838018381183821838318384183851838618387183881838918390183911839218393183941839518396183971839818399184001840118402184031840418405184061840718408184091841018411184121841318414184151841618417184181841918420184211842218423184241842518426184271842818429184301843118432184331843418435184361843718438184391844018441184421844318444184451844618447184481844918450184511845218453184541845518456184571845818459184601846118462184631846418465184661846718468184691847018471184721847318474184751847618477184781847918480184811848218483184841848518486184871848818489184901849118492184931849418495184961849718498184991850018501185021850318504185051850618507185081850918510185111851218513185141851518516185171851818519185201852118522185231852418525185261852718528185291853018531185321853318534185351853618537185381853918540185411854218543185441854518546185471854818549185501855118552185531855418555185561855718558185591856018561185621856318564185651856618567185681856918570185711857218573185741857518576185771857818579185801858118582185831858418585185861858718588185891859018591185921859318594185951859618597185981859918600186011860218603186041860518606186071860818609186101861118612186131861418615186161861718618186191862018621186221862318624186251862618627186281862918630186311863218633186341863518636186371863818639186401864118642186431864418645186461864718648186491865018651186521865318654186551865618657186581865918660186611866218663186641866518666186671866818669186701867118672186731867418675186761867718678186791868018681186821868318684186851868618687186881868918690186911869218693186941869518696186971869818699187001870118702187031870418705187061870718708187091871018711187121871318714187151871618717187181871918720187211872218723187241872518726187271872818729187301873118732187331873418735187361873718738187391874018741187421874318744187451874618747187481874918750187511875218753187541875518756187571875818759187601876118762187631876418765187661876718768187691877018771187721877318774187751877618777187781877918780187811878218783187841878518786187871878818789187901879118792187931879418795187961879718798187991880018801188021880318804188051880618807188081880918810188111881218813188141881518816188171881818819188201882118822188231882418825188261882718828188291883018831188321883318834188351883618837188381883918840188411884218843188441884518846188471884818849188501885118852188531885418855188561885718858188591886018861188621886318864188651886618867188681886918870188711887218873188741887518876188771887818879188801888118882188831888418885188861888718888188891889018891188921889318894188951889618897188981889918900189011890218903189041890518906189071890818909189101891118912189131891418915189161891718918189191892018921189221892318924189251892618927189281892918930189311893218933189341893518936189371893818939189401894118942189431894418945189461894718948189491895018951189521895318954189551895618957189581895918960189611896218963189641896518966189671896818969189701897118972189731897418975189761897718978189791898018981189821898318984189851898618987189881898918990189911899218993189941899518996189971899818999190001900119002190031900419005190061900719008190091901019011190121901319014190151901619017190181901919020190211902219023190241902519026190271902819029190301903119032190331903419035190361903719038190391904019041190421904319044190451904619047190481904919050190511905219053190541905519056190571905819059190601906119062190631906419065190661906719068190691907019071190721907319074190751907619077190781907919080190811908219083190841908519086190871908819089190901909119092190931909419095190961909719098190991910019101191021910319104191051910619107191081910919110191111911219113191141911519116191171911819119191201912119122191231912419125191261912719128191291913019131191321913319134191351913619137191381913919140191411914219143191441914519146191471914819149191501915119152191531915419155191561915719158191591916019161191621916319164191651916619167191681916919170191711917219173191741917519176191771917819179191801918119182191831918419185191861918719188191891919019191191921919319194191951919619197191981919919200192011920219203192041920519206192071920819209192101921119212192131921419215192161921719218192191922019221192221922319224192251922619227192281922919230192311923219233192341923519236192371923819239192401924119242192431924419245192461924719248192491925019251192521925319254192551925619257192581925919260192611926219263192641926519266192671926819269192701927119272192731927419275192761927719278192791928019281192821928319284192851928619287192881928919290192911929219293192941929519296192971929819299193001930119302193031930419305193061930719308193091931019311193121931319314193151931619317193181931919320193211932219323193241932519326193271932819329193301933119332193331933419335193361933719338193391934019341193421934319344193451934619347193481934919350193511935219353193541935519356193571935819359193601936119362193631936419365193661936719368193691937019371193721937319374193751937619377193781937919380193811938219383193841938519386193871938819389193901939119392193931939419395193961939719398193991940019401194021940319404194051940619407194081940919410194111941219413194141941519416194171941819419194201942119422194231942419425194261942719428194291943019431194321943319434194351943619437194381943919440194411944219443194441944519446194471944819449194501945119452194531945419455194561945719458194591946019461194621946319464194651946619467194681946919470194711947219473194741947519476194771947819479194801948119482194831948419485194861948719488194891949019491194921949319494194951949619497194981949919500195011950219503195041950519506195071950819509195101951119512195131951419515195161951719518195191952019521195221952319524195251952619527195281952919530195311953219533195341953519536195371953819539195401954119542195431954419545195461954719548195491955019551195521955319554195551955619557195581955919560195611956219563195641956519566195671956819569195701957119572195731957419575195761957719578195791958019581195821958319584195851958619587195881958919590195911959219593195941959519596195971959819599196001960119602196031960419605196061960719608196091961019611196121961319614196151961619617196181961919620196211962219623196241962519626196271962819629196301963119632196331963419635196361963719638196391964019641196421964319644196451964619647196481964919650196511965219653196541965519656196571965819659196601966119662196631966419665196661966719668196691967019671196721967319674196751967619677196781967919680196811968219683196841968519686196871968819689196901969119692196931969419695196961969719698196991970019701197021970319704197051970619707197081970919710197111971219713197141971519716197171971819719197201972119722197231972419725197261972719728197291973019731197321973319734197351973619737197381973919740197411974219743197441974519746197471974819749197501975119752197531975419755197561975719758197591976019761197621976319764197651976619767197681976919770197711977219773197741977519776197771977819779197801978119782197831978419785197861978719788197891979019791197921979319794197951979619797197981979919800198011980219803198041980519806198071980819809198101981119812198131981419815198161981719818198191982019821198221982319824198251982619827198281982919830198311983219833198341983519836198371983819839198401984119842198431984419845198461984719848198491985019851198521985319854198551985619857198581985919860198611986219863198641986519866198671986819869198701987119872198731987419875198761987719878198791988019881198821988319884198851988619887198881988919890198911989219893198941989519896198971989819899199001990119902199031990419905199061990719908199091991019911199121991319914199151991619917199181991919920199211992219923199241992519926199271992819929199301993119932199331993419935199361993719938199391994019941199421994319944199451994619947199481994919950199511995219953199541995519956199571995819959199601996119962199631996419965199661996719968199691997019971199721997319974199751997619977199781997919980199811998219983199841998519986199871998819989199901999119992199931999419995199961999719998199992000020001200022000320004200052000620007200082000920010200112001220013200142001520016200172001820019200202002120022200232002420025200262002720028200292003020031200322003320034200352003620037200382003920040200412004220043200442004520046200472004820049200502005120052200532005420055200562005720058200592006020061200622006320064200652006620067200682006920070200712007220073200742007520076200772007820079200802008120082200832008420085200862008720088200892009020091200922009320094200952009620097200982009920100201012010220103201042010520106201072010820109201102011120112201132011420115201162011720118201192012020121201222012320124201252012620127201282012920130201312013220133201342013520136201372013820139201402014120142201432014420145201462014720148201492015020151201522015320154201552015620157201582015920160201612016220163201642016520166201672016820169201702017120172201732017420175201762017720178201792018020181201822018320184201852018620187201882018920190201912019220193201942019520196201972019820199202002020120202202032020420205202062020720208202092021020211202122021320214202152021620217202182021920220202212022220223202242022520226202272022820229202302023120232202332023420235202362023720238202392024020241202422024320244202452024620247202482024920250202512025220253202542025520256202572025820259202602026120262202632026420265202662026720268202692027020271202722027320274202752027620277202782027920280202812028220283202842028520286202872028820289202902029120292202932029420295202962029720298202992030020301203022030320304203052030620307203082030920310203112031220313203142031520316203172031820319203202032120322203232032420325203262032720328203292033020331203322033320334203352033620337203382033920340203412034220343203442034520346203472034820349203502035120352203532035420355203562035720358203592036020361203622036320364203652036620367203682036920370203712037220373203742037520376203772037820379203802038120382203832038420385203862038720388203892039020391203922039320394203952039620397203982039920400204012040220403204042040520406204072040820409204102041120412204132041420415204162041720418204192042020421204222042320424204252042620427204282042920430204312043220433204342043520436204372043820439204402044120442204432044420445204462044720448204492045020451204522045320454204552045620457204582045920460204612046220463204642046520466204672046820469204702047120472204732047420475204762047720478204792048020481204822048320484204852048620487204882048920490204912049220493204942049520496204972049820499205002050120502205032050420505205062050720508205092051020511205122051320514205152051620517205182051920520205212052220523205242052520526205272052820529205302053120532205332053420535205362053720538205392054020541205422054320544205452054620547205482054920550205512055220553205542055520556205572055820559205602056120562205632056420565205662056720568205692057020571205722057320574205752057620577205782057920580205812058220583205842058520586205872058820589205902059120592205932059420595205962059720598205992060020601206022060320604206052060620607206082060920610206112061220613206142061520616206172061820619206202062120622206232062420625206262062720628206292063020631206322063320634206352063620637206382063920640206412064220643206442064520646206472064820649206502065120652206532065420655206562065720658206592066020661206622066320664206652066620667206682066920670206712067220673206742067520676206772067820679206802068120682206832068420685206862068720688206892069020691206922069320694206952069620697206982069920700207012070220703207042070520706207072070820709207102071120712207132071420715207162071720718207192072020721207222072320724207252072620727207282072920730207312073220733207342073520736207372073820739207402074120742207432074420745207462074720748207492075020751207522075320754207552075620757207582075920760207612076220763207642076520766207672076820769207702077120772207732077420775207762077720778207792078020781207822078320784207852078620787207882078920790207912079220793207942079520796207972079820799208002080120802208032080420805208062080720808208092081020811208122081320814208152081620817208182081920820208212082220823208242082520826208272082820829208302083120832208332083420835208362083720838208392084020841208422084320844208452084620847208482084920850208512085220853208542085520856208572085820859208602086120862208632086420865208662086720868208692087020871208722087320874208752087620877208782087920880208812088220883208842088520886208872088820889208902089120892208932089420895208962089720898208992090020901209022090320904209052090620907209082090920910209112091220913209142091520916209172091820919209202092120922209232092420925209262092720928209292093020931209322093320934209352093620937209382093920940209412094220943209442094520946209472094820949209502095120952209532095420955209562095720958209592096020961209622096320964209652096620967209682096920970209712097220973209742097520976209772097820979209802098120982209832098420985209862098720988209892099020991209922099320994209952099620997209982099921000210012100221003210042100521006210072100821009210102101121012210132101421015210162101721018210192102021021210222102321024210252102621027210282102921030210312103221033210342103521036210372103821039210402104121042210432104421045210462104721048210492105021051210522105321054210552105621057210582105921060210612106221063210642106521066210672106821069210702107121072210732107421075210762107721078210792108021081210822108321084210852108621087210882108921090210912109221093210942109521096210972109821099211002110121102211032110421105211062110721108211092111021111211122111321114211152111621117211182111921120211212112221123211242112521126211272112821129211302113121132211332113421135211362113721138211392114021141211422114321144211452114621147211482114921150211512115221153211542115521156211572115821159211602116121162211632116421165211662116721168211692117021171211722117321174211752117621177211782117921180211812118221183211842118521186211872118821189211902119121192211932119421195211962119721198211992120021201212022120321204212052120621207212082120921210212112121221213212142121521216212172121821219212202122121222212232122421225212262122721228212292123021231212322123321234212352123621237212382123921240212412124221243212442124521246212472124821249212502125121252212532125421255212562125721258212592126021261212622126321264212652126621267212682126921270212712127221273212742127521276212772127821279212802128121282212832128421285212862128721288212892129021291212922129321294212952129621297212982129921300213012130221303213042130521306213072130821309213102131121312213132131421315213162131721318213192132021321213222132321324213252132621327213282132921330213312133221333213342133521336213372133821339213402134121342213432134421345213462134721348213492135021351213522135321354213552135621357213582135921360213612136221363213642136521366213672136821369213702137121372213732137421375213762137721378213792138021381213822138321384213852138621387213882138921390213912139221393213942139521396213972139821399214002140121402214032140421405214062140721408214092141021411214122141321414214152141621417214182141921420214212142221423214242142521426214272142821429214302143121432214332143421435214362143721438214392144021441214422144321444214452144621447214482144921450214512145221453214542145521456214572145821459214602146121462214632146421465214662146721468214692147021471214722147321474214752147621477214782147921480214812148221483214842148521486214872148821489214902149121492214932149421495214962149721498214992150021501215022150321504215052150621507215082150921510215112151221513215142151521516215172151821519215202152121522215232152421525215262152721528215292153021531215322153321534215352153621537215382153921540215412154221543215442154521546215472154821549215502155121552215532155421555215562155721558215592156021561215622156321564215652156621567215682156921570215712157221573215742157521576215772157821579215802158121582215832158421585215862158721588215892159021591215922159321594215952159621597215982159921600216012160221603216042160521606216072160821609216102161121612216132161421615216162161721618216192162021621216222162321624216252162621627216282162921630216312163221633216342163521636216372163821639216402164121642216432164421645216462164721648216492165021651216522165321654216552165621657216582165921660216612166221663216642166521666216672166821669216702167121672216732167421675216762167721678216792168021681216822168321684216852168621687216882168921690216912169221693216942169521696216972169821699217002170121702217032170421705217062170721708217092171021711217122171321714217152171621717217182171921720217212172221723217242172521726217272172821729217302173121732217332173421735217362173721738217392174021741217422174321744217452174621747217482174921750217512175221753217542175521756217572175821759217602176121762217632176421765217662176721768217692177021771217722177321774217752177621777217782177921780217812178221783217842178521786217872178821789217902179121792217932179421795217962179721798217992180021801218022180321804218052180621807218082180921810218112181221813218142181521816218172181821819218202182121822218232182421825218262182721828218292183021831218322183321834218352183621837218382183921840218412184221843218442184521846218472184821849218502185121852218532185421855218562185721858218592186021861218622186321864218652186621867218682186921870218712187221873218742187521876218772187821879218802188121882218832188421885218862188721888218892189021891218922189321894218952189621897218982189921900219012190221903219042190521906219072190821909219102191121912219132191421915219162191721918219192192021921219222192321924219252192621927219282192921930219312193221933219342193521936219372193821939219402194121942219432194421945219462194721948219492195021951219522195321954219552195621957219582195921960219612196221963219642196521966219672196821969219702197121972219732197421975219762197721978219792198021981219822198321984219852198621987219882198921990219912199221993219942199521996219972199821999220002200122002220032200422005220062200722008220092201022011220122201322014220152201622017220182201922020220212202222023220242202522026220272202822029220302203122032220332203422035220362203722038220392204022041220422204322044220452204622047220482204922050220512205222053220542205522056220572205822059220602206122062220632206422065220662206722068220692207022071220722207322074220752207622077220782207922080220812208222083220842208522086220872208822089220902209122092220932209422095220962209722098220992210022101221022210322104221052210622107221082210922110221112211222113221142211522116221172211822119221202212122122221232212422125221262212722128221292213022131221322213322134221352213622137221382213922140221412214222143221442214522146221472214822149221502215122152221532215422155221562215722158221592216022161221622216322164221652216622167221682216922170221712217222173221742217522176221772217822179221802218122182221832218422185221862218722188221892219022191221922219322194221952219622197221982219922200222012220222203222042220522206222072220822209222102221122212222132221422215222162221722218222192222022221222222222322224222252222622227222282222922230222312223222233222342223522236222372223822239222402224122242222432224422245222462224722248222492225022251222522225322254222552225622257222582225922260222612226222263222642226522266222672226822269222702227122272222732227422275222762227722278222792228022281222822228322284222852228622287222882228922290222912229222293222942229522296222972229822299223002230122302223032230422305223062230722308223092231022311223122231322314223152231622317223182231922320223212232222323223242232522326223272232822329223302233122332223332233422335223362233722338223392234022341223422234322344223452234622347223482234922350223512235222353223542235522356223572235822359223602236122362223632236422365223662236722368223692237022371223722237322374223752237622377223782237922380223812238222383223842238522386223872238822389223902239122392223932239422395223962239722398223992240022401224022240322404224052240622407224082240922410224112241222413224142241522416224172241822419224202242122422224232242422425224262242722428224292243022431224322243322434224352243622437224382243922440224412244222443224442244522446224472244822449224502245122452224532245422455224562245722458224592246022461224622246322464224652246622467224682246922470224712247222473224742247522476224772247822479224802248122482224832248422485224862248722488224892249022491224922249322494224952249622497224982249922500225012250222503225042250522506225072250822509225102251122512225132251422515225162251722518225192252022521225222252322524225252252622527225282252922530225312253222533225342253522536225372253822539225402254122542225432254422545225462254722548225492255022551225522255322554225552255622557225582255922560225612256222563225642256522566225672256822569225702257122572225732257422575225762257722578225792258022581225822258322584225852258622587225882258922590225912259222593225942259522596225972259822599226002260122602226032260422605226062260722608226092261022611226122261322614226152261622617226182261922620226212262222623226242262522626226272262822629226302263122632226332263422635226362263722638226392264022641226422264322644226452264622647226482264922650226512265222653226542265522656226572265822659226602266122662226632266422665226662266722668226692267022671226722267322674226752267622677226782267922680226812268222683226842268522686226872268822689226902269122692226932269422695226962269722698226992270022701227022270322704227052270622707227082270922710227112271222713227142271522716227172271822719227202272122722227232272422725227262272722728227292273022731227322273322734227352273622737227382273922740227412274222743227442274522746227472274822749227502275122752227532275422755227562275722758227592276022761227622276322764227652276622767227682276922770227712277222773227742277522776227772277822779227802278122782227832278422785227862278722788227892279022791227922279322794227952279622797227982279922800228012280222803228042280522806228072280822809228102281122812228132281422815228162281722818228192282022821228222282322824228252282622827228282282922830228312283222833228342283522836228372283822839228402284122842228432284422845228462284722848228492285022851228522285322854228552285622857228582285922860228612286222863228642286522866228672286822869228702287122872228732287422875228762287722878228792288022881228822288322884228852288622887228882288922890228912289222893228942289522896228972289822899229002290122902229032290422905229062290722908229092291022911229122291322914229152291622917229182291922920229212292222923229242292522926229272292822929229302293122932229332293422935229362293722938229392294022941229422294322944229452294622947229482294922950229512295222953229542295522956229572295822959229602296122962229632296422965229662296722968229692297022971229722297322974229752297622977229782297922980229812298222983229842298522986229872298822989229902299122992229932299422995229962299722998229992300023001230022300323004230052300623007230082300923010230112301223013230142301523016230172301823019230202302123022230232302423025230262302723028230292303023031230322303323034230352303623037230382303923040230412304223043230442304523046230472304823049230502305123052230532305423055230562305723058230592306023061230622306323064230652306623067230682306923070230712307223073230742307523076230772307823079230802308123082230832308423085230862308723088230892309023091230922309323094230952309623097230982309923100231012310223103231042310523106231072310823109231102311123112231132311423115231162311723118231192312023121231222312323124231252312623127231282312923130231312313223133231342313523136231372313823139231402314123142231432314423145231462314723148231492315023151231522315323154231552315623157231582315923160231612316223163231642316523166231672316823169231702317123172231732317423175231762317723178231792318023181231822318323184231852318623187231882318923190231912319223193231942319523196231972319823199232002320123202232032320423205232062320723208232092321023211232122321323214232152321623217232182321923220232212322223223232242322523226232272322823229232302323123232232332323423235232362323723238232392324023241232422324323244232452324623247232482324923250232512325223253232542325523256232572325823259232602326123262232632326423265232662326723268232692327023271232722327323274232752327623277232782327923280232812328223283232842328523286232872328823289232902329123292232932329423295232962329723298232992330023301233022330323304233052330623307233082330923310233112331223313233142331523316233172331823319233202332123322233232332423325233262332723328233292333023331233322333323334233352333623337233382333923340233412334223343233442334523346233472334823349233502335123352233532335423355233562335723358233592336023361233622336323364233652336623367233682336923370233712337223373233742337523376233772337823379233802338123382233832338423385233862338723388233892339023391233922339323394233952339623397233982339923400234012340223403234042340523406234072340823409234102341123412234132341423415234162341723418234192342023421234222342323424234252342623427234282342923430234312343223433234342343523436234372343823439234402344123442234432344423445234462344723448234492345023451234522345323454234552345623457234582345923460234612346223463234642346523466234672346823469234702347123472234732347423475234762347723478234792348023481234822348323484234852348623487234882348923490234912349223493234942349523496234972349823499235002350123502235032350423505235062350723508235092351023511235122351323514235152351623517235182351923520235212352223523235242352523526235272352823529235302353123532235332353423535235362353723538235392354023541235422354323544235452354623547235482354923550235512355223553235542355523556235572355823559235602356123562235632356423565235662356723568235692357023571235722357323574235752357623577235782357923580235812358223583235842358523586235872358823589235902359123592235932359423595235962359723598235992360023601236022360323604236052360623607236082360923610236112361223613236142361523616236172361823619236202362123622236232362423625236262362723628236292363023631236322363323634236352363623637236382363923640236412364223643236442364523646236472364823649236502365123652236532365423655236562365723658236592366023661236622366323664236652366623667236682366923670236712367223673236742367523676236772367823679236802368123682236832368423685236862368723688236892369023691236922369323694236952369623697236982369923700237012370223703237042370523706237072370823709237102371123712237132371423715237162371723718237192372023721237222372323724237252372623727237282372923730237312373223733237342373523736237372373823739237402374123742237432374423745237462374723748237492375023751237522375323754237552375623757237582375923760237612376223763237642376523766237672376823769237702377123772237732377423775237762377723778237792378023781237822378323784237852378623787237882378923790237912379223793237942379523796237972379823799238002380123802238032380423805238062380723808238092381023811238122381323814238152381623817238182381923820238212382223823238242382523826238272382823829238302383123832238332383423835238362383723838238392384023841238422384323844238452384623847238482384923850238512385223853238542385523856238572385823859238602386123862238632386423865238662386723868238692387023871238722387323874238752387623877238782387923880238812388223883238842388523886238872388823889238902389123892238932389423895238962389723898238992390023901239022390323904239052390623907239082390923910239112391223913239142391523916239172391823919239202392123922239232392423925239262392723928239292393023931239322393323934239352393623937239382393923940239412394223943239442394523946239472394823949239502395123952239532395423955239562395723958239592396023961239622396323964239652396623967239682396923970239712397223973239742397523976239772397823979239802398123982239832398423985239862398723988239892399023991239922399323994239952399623997239982399924000240012400224003240042400524006240072400824009240102401124012240132401424015240162401724018240192402024021240222402324024240252402624027240282402924030240312403224033240342403524036240372403824039240402404124042240432404424045240462404724048240492405024051240522405324054240552405624057240582405924060240612406224063240642406524066240672406824069240702407124072240732407424075240762407724078240792408024081240822408324084240852408624087240882408924090240912409224093240942409524096240972409824099241002410124102241032410424105241062410724108241092411024111241122411324114241152411624117241182411924120241212412224123241242412524126241272412824129241302413124132241332413424135241362413724138241392414024141241422414324144241452414624147241482414924150241512415224153241542415524156241572415824159241602416124162241632416424165241662416724168241692417024171241722417324174241752417624177241782417924180241812418224183241842418524186241872418824189241902419124192241932419424195241962419724198241992420024201242022420324204242052420624207242082420924210242112421224213242142421524216242172421824219242202422124222242232422424225242262422724228242292423024231242322423324234242352423624237242382423924240242412424224243242442424524246242472424824249242502425124252242532425424255242562425724258242592426024261242622426324264242652426624267242682426924270242712427224273242742427524276242772427824279242802428124282242832428424285242862428724288242892429024291242922429324294242952429624297242982429924300243012430224303243042430524306243072430824309243102431124312243132431424315243162431724318243192432024321243222432324324243252432624327243282432924330243312433224333243342433524336243372433824339243402434124342243432434424345243462434724348243492435024351243522435324354243552435624357243582435924360243612436224363243642436524366243672436824369243702437124372243732437424375243762437724378243792438024381243822438324384243852438624387243882438924390243912439224393243942439524396243972439824399244002440124402244032440424405244062440724408244092441024411244122441324414244152441624417244182441924420244212442224423244242442524426244272442824429244302443124432244332443424435244362443724438244392444024441244422444324444244452444624447244482444924450244512445224453244542445524456244572445824459244602446124462244632446424465244662446724468244692447024471244722447324474244752447624477244782447924480244812448224483244842448524486244872448824489244902449124492244932449424495244962449724498244992450024501245022450324504245052450624507245082450924510245112451224513245142451524516245172451824519245202452124522245232452424525245262452724528245292453024531245322453324534245352453624537245382453924540245412454224543245442454524546245472454824549245502455124552245532455424555245562455724558245592456024561245622456324564245652456624567245682456924570245712457224573245742457524576245772457824579245802458124582245832458424585245862458724588245892459024591245922459324594245952459624597245982459924600246012460224603246042460524606246072460824609246102461124612246132461424615246162461724618246192462024621246222462324624246252462624627246282462924630246312463224633246342463524636246372463824639246402464124642246432464424645246462464724648246492465024651246522465324654246552465624657246582465924660246612466224663246642466524666246672466824669246702467124672246732467424675246762467724678246792468024681246822468324684246852468624687246882468924690246912469224693246942469524696246972469824699247002470124702247032470424705247062470724708247092471024711247122471324714247152471624717247182471924720247212472224723247242472524726247272472824729247302473124732247332473424735247362473724738247392474024741247422474324744247452474624747247482474924750247512475224753247542475524756247572475824759247602476124762247632476424765247662476724768247692477024771247722477324774247752477624777247782477924780247812478224783247842478524786247872478824789247902479124792247932479424795247962479724798247992480024801248022480324804248052480624807248082480924810248112481224813248142481524816248172481824819248202482124822248232482424825248262482724828248292483024831248322483324834248352483624837248382483924840248412484224843248442484524846248472484824849248502485124852248532485424855248562485724858248592486024861248622486324864248652486624867248682486924870248712487224873248742487524876248772487824879248802488124882248832488424885248862488724888248892489024891248922489324894248952489624897248982489924900249012490224903249042490524906249072490824909249102491124912249132491424915249162491724918249192492024921249222492324924249252492624927249282492924930249312493224933249342493524936249372493824939249402494124942249432494424945249462494724948249492495024951249522495324954249552495624957249582495924960249612496224963249642496524966249672496824969249702497124972249732497424975249762497724978249792498024981249822498324984249852498624987249882498924990249912499224993249942499524996249972499824999250002500125002250032500425005250062500725008250092501025011250122501325014250152501625017250182501925020250212502225023250242502525026250272502825029250302503125032250332503425035250362503725038250392504025041250422504325044250452504625047250482504925050250512505225053250542505525056250572505825059250602506125062250632506425065250662506725068250692507025071250722507325074250752507625077250782507925080250812508225083250842508525086250872508825089250902509125092250932509425095250962509725098250992510025101251022510325104251052510625107251082510925110251112511225113251142511525116251172511825119251202512125122251232512425125251262512725128251292513025131251322513325134251352513625137251382513925140251412514225143251442514525146251472514825149251502515125152251532515425155251562515725158251592516025161251622516325164251652516625167251682516925170251712517225173251742517525176251772517825179251802518125182251832518425185251862518725188251892519025191251922519325194251952519625197251982519925200252012520225203252042520525206252072520825209252102521125212252132521425215252162521725218252192522025221252222522325224252252522625227252282522925230252312523225233252342523525236252372523825239252402524125242252432524425245252462524725248252492525025251252522525325254252552525625257252582525925260252612526225263252642526525266252672526825269252702527125272252732527425275252762527725278252792528025281252822528325284252852528625287252882528925290252912529225293252942529525296252972529825299253002530125302253032530425305253062530725308253092531025311253122531325314253152531625317253182531925320253212532225323253242532525326253272532825329253302533125332253332533425335253362533725338253392534025341253422534325344253452534625347253482534925350253512535225353253542535525356253572535825359253602536125362253632536425365253662536725368253692537025371253722537325374253752537625377253782537925380253812538225383253842538525386253872538825389253902539125392253932539425395253962539725398253992540025401254022540325404254052540625407254082540925410254112541225413254142541525416254172541825419254202542125422254232542425425254262542725428254292543025431254322543325434254352543625437254382543925440254412544225443254442544525446254472544825449254502545125452254532545425455254562545725458254592546025461254622546325464254652546625467254682546925470254712547225473254742547525476254772547825479254802548125482254832548425485254862548725488254892549025491254922549325494254952549625497254982549925500255012550225503255042550525506255072550825509255102551125512255132551425515255162551725518255192552025521255222552325524255252552625527255282552925530255312553225533255342553525536255372553825539255402554125542255432554425545255462554725548255492555025551255522555325554255552555625557255582555925560255612556225563255642556525566255672556825569255702557125572255732557425575255762557725578255792558025581255822558325584255852558625587255882558925590255912559225593255942559525596255972559825599256002560125602256032560425605256062560725608256092561025611256122561325614256152561625617256182561925620256212562225623256242562525626256272562825629256302563125632256332563425635256362563725638256392564025641256422564325644256452564625647256482564925650256512565225653256542565525656256572565825659256602566125662256632566425665256662566725668256692567025671256722567325674256752567625677256782567925680256812568225683256842568525686256872568825689256902569125692256932569425695256962569725698256992570025701257022570325704257052570625707257082570925710257112571225713257142571525716257172571825719257202572125722257232572425725257262572725728257292573025731257322573325734257352573625737257382573925740257412574225743257442574525746257472574825749257502575125752257532575425755257562575725758257592576025761257622576325764257652576625767257682576925770257712577225773257742577525776257772577825779257802578125782257832578425785257862578725788257892579025791257922579325794257952579625797257982579925800258012580225803258042580525806258072580825809258102581125812258132581425815258162581725818258192582025821258222582325824258252582625827258282582925830258312583225833258342583525836258372583825839258402584125842258432584425845258462584725848258492585025851258522585325854258552585625857258582585925860258612586225863258642586525866258672586825869258702587125872258732587425875258762587725878258792588025881258822588325884258852588625887258882588925890258912589225893258942589525896258972589825899259002590125902259032590425905259062590725908259092591025911259122591325914259152591625917259182591925920259212592225923259242592525926259272592825929259302593125932259332593425935259362593725938259392594025941259422594325944259452594625947259482594925950259512595225953259542595525956259572595825959259602596125962259632596425965259662596725968259692597025971259722597325974259752597625977259782597925980259812598225983259842598525986259872598825989259902599125992259932599425995259962599725998259992600026001260022600326004260052600626007260082600926010260112601226013260142601526016260172601826019260202602126022260232602426025260262602726028260292603026031260322603326034260352603626037260382603926040260412604226043260442604526046260472604826049260502605126052260532605426055260562605726058260592606026061260622606326064260652606626067260682606926070260712607226073260742607526076260772607826079260802608126082260832608426085260862608726088260892609026091260922609326094260952609626097260982609926100261012610226103261042610526106261072610826109261102611126112261132611426115261162611726118261192612026121261222612326124261252612626127261282612926130261312613226133261342613526136261372613826139261402614126142261432614426145261462614726148261492615026151261522615326154261552615626157261582615926160261612616226163261642616526166261672616826169261702617126172261732617426175261762617726178261792618026181261822618326184261852618626187261882618926190261912619226193261942619526196261972619826199262002620126202262032620426205262062620726208262092621026211262122621326214262152621626217262182621926220262212622226223262242622526226262272622826229262302623126232262332623426235262362623726238262392624026241262422624326244262452624626247262482624926250262512625226253262542625526256262572625826259262602626126262262632626426265262662626726268262692627026271262722627326274262752627626277262782627926280262812628226283262842628526286262872628826289262902629126292262932629426295262962629726298262992630026301263022630326304263052630626307263082630926310263112631226313263142631526316263172631826319263202632126322263232632426325263262632726328263292633026331263322633326334263352633626337263382633926340263412634226343263442634526346263472634826349263502635126352263532635426355263562635726358263592636026361263622636326364263652636626367263682636926370263712637226373263742637526376263772637826379263802638126382263832638426385263862638726388263892639026391263922639326394263952639626397263982639926400264012640226403264042640526406264072640826409264102641126412264132641426415264162641726418264192642026421264222642326424264252642626427264282642926430264312643226433264342643526436264372643826439264402644126442264432644426445264462644726448264492645026451264522645326454264552645626457264582645926460264612646226463264642646526466264672646826469264702647126472264732647426475264762647726478264792648026481264822648326484264852648626487264882648926490264912649226493264942649526496264972649826499265002650126502265032650426505265062650726508265092651026511265122651326514265152651626517265182651926520265212652226523265242652526526265272652826529265302653126532265332653426535265362653726538265392654026541265422654326544265452654626547265482654926550265512655226553265542655526556265572655826559265602656126562265632656426565265662656726568265692657026571265722657326574265752657626577265782657926580265812658226583265842658526586265872658826589265902659126592265932659426595265962659726598265992660026601266022660326604266052660626607266082660926610266112661226613266142661526616266172661826619266202662126622266232662426625266262662726628266292663026631266322663326634266352663626637266382663926640266412664226643266442664526646266472664826649266502665126652266532665426655266562665726658266592666026661266622666326664266652666626667266682666926670266712667226673266742667526676266772667826679266802668126682266832668426685266862668726688266892669026691266922669326694266952669626697266982669926700267012670226703267042670526706267072670826709267102671126712267132671426715267162671726718267192672026721267222672326724267252672626727267282672926730267312673226733267342673526736267372673826739267402674126742267432674426745267462674726748267492675026751267522675326754267552675626757267582675926760267612676226763267642676526766267672676826769267702677126772267732677426775267762677726778267792678026781267822678326784267852678626787267882678926790267912679226793267942679526796267972679826799268002680126802268032680426805268062680726808268092681026811268122681326814268152681626817268182681926820268212682226823268242682526826268272682826829268302683126832268332683426835268362683726838268392684026841268422684326844268452684626847268482684926850268512685226853268542685526856268572685826859268602686126862268632686426865268662686726868268692687026871268722687326874268752687626877268782687926880268812688226883268842688526886268872688826889268902689126892268932689426895268962689726898268992690026901269022690326904269052690626907269082690926910269112691226913269142691526916269172691826919269202692126922269232692426925269262692726928269292693026931269322693326934269352693626937269382693926940269412694226943269442694526946269472694826949269502695126952269532695426955269562695726958269592696026961269622696326964269652696626967269682696926970269712697226973269742697526976269772697826979269802698126982269832698426985269862698726988269892699026991269922699326994269952699626997269982699927000270012700227003270042700527006270072700827009270102701127012270132701427015270162701727018270192702027021270222702327024270252702627027270282702927030270312703227033270342703527036270372703827039270402704127042270432704427045270462704727048270492705027051270522705327054270552705627057270582705927060270612706227063270642706527066270672706827069270702707127072270732707427075270762707727078270792708027081270822708327084270852708627087270882708927090270912709227093270942709527096270972709827099271002710127102271032710427105271062710727108271092711027111271122711327114271152711627117271182711927120271212712227123271242712527126271272712827129271302713127132271332713427135271362713727138271392714027141271422714327144271452714627147271482714927150271512715227153271542715527156271572715827159271602716127162271632716427165271662716727168271692717027171271722717327174271752717627177271782717927180271812718227183271842718527186271872718827189271902719127192271932719427195271962719727198271992720027201272022720327204272052720627207272082720927210272112721227213272142721527216272172721827219272202722127222272232722427225272262722727228272292723027231272322723327234272352723627237272382723927240272412724227243272442724527246272472724827249272502725127252272532725427255272562725727258272592726027261272622726327264272652726627267272682726927270272712727227273272742727527276272772727827279272802728127282272832728427285272862728727288272892729027291272922729327294272952729627297272982729927300273012730227303273042730527306273072730827309273102731127312273132731427315273162731727318273192732027321273222732327324273252732627327273282732927330273312733227333273342733527336273372733827339273402734127342273432734427345273462734727348273492735027351273522735327354273552735627357273582735927360273612736227363273642736527366273672736827369273702737127372273732737427375273762737727378273792738027381273822738327384273852738627387273882738927390273912739227393273942739527396273972739827399274002740127402274032740427405274062740727408274092741027411274122741327414274152741627417274182741927420274212742227423274242742527426274272742827429274302743127432274332743427435274362743727438274392744027441274422744327444274452744627447274482744927450274512745227453274542745527456274572745827459274602746127462274632746427465274662746727468274692747027471274722747327474274752747627477274782747927480274812748227483274842748527486274872748827489274902749127492274932749427495274962749727498274992750027501275022750327504275052750627507275082750927510275112751227513275142751527516275172751827519275202752127522275232752427525275262752727528275292753027531275322753327534275352753627537275382753927540275412754227543275442754527546275472754827549275502755127552275532755427555275562755727558275592756027561275622756327564275652756627567275682756927570275712757227573275742757527576275772757827579275802758127582275832758427585275862758727588275892759027591275922759327594275952759627597275982759927600276012760227603276042760527606276072760827609276102761127612276132761427615276162761727618276192762027621276222762327624276252762627627276282762927630276312763227633276342763527636276372763827639276402764127642276432764427645276462764727648276492765027651276522765327654276552765627657276582765927660276612766227663276642766527666276672766827669276702767127672276732767427675276762767727678276792768027681276822768327684276852768627687276882768927690276912769227693276942769527696276972769827699277002770127702277032770427705277062770727708277092771027711277122771327714277152771627717277182771927720277212772227723277242772527726277272772827729277302773127732277332773427735277362773727738277392774027741277422774327744277452774627747277482774927750277512775227753277542775527756277572775827759277602776127762277632776427765277662776727768277692777027771277722777327774277752777627777277782777927780277812778227783277842778527786277872778827789277902779127792277932779427795277962779727798277992780027801278022780327804278052780627807278082780927810278112781227813278142781527816278172781827819278202782127822278232782427825278262782727828278292783027831278322783327834278352783627837278382783927840278412784227843278442784527846278472784827849278502785127852278532785427855278562785727858278592786027861278622786327864278652786627867278682786927870278712787227873278742787527876278772787827879278802788127882278832788427885278862788727888278892789027891278922789327894278952789627897278982789927900279012790227903279042790527906279072790827909279102791127912279132791427915279162791727918279192792027921279222792327924279252792627927279282792927930279312793227933279342793527936279372793827939279402794127942279432794427945279462794727948279492795027951279522795327954279552795627957279582795927960279612796227963279642796527966279672796827969279702797127972279732797427975279762797727978279792798027981279822798327984279852798627987279882798927990279912799227993279942799527996279972799827999280002800128002280032800428005280062800728008280092801028011280122801328014280152801628017280182801928020280212802228023280242802528026280272802828029280302803128032280332803428035280362803728038280392804028041280422804328044280452804628047280482804928050280512805228053280542805528056280572805828059280602806128062280632806428065280662806728068280692807028071280722807328074280752807628077280782807928080280812808228083280842808528086280872808828089280902809128092280932809428095280962809728098280992810028101281022810328104281052810628107281082810928110281112811228113281142811528116281172811828119281202812128122281232812428125281262812728128281292813028131281322813328134281352813628137281382813928140281412814228143281442814528146281472814828149281502815128152281532815428155281562815728158281592816028161281622816328164281652816628167281682816928170281712817228173281742817528176281772817828179281802818128182281832818428185281862818728188281892819028191281922819328194281952819628197281982819928200282012820228203282042820528206282072820828209282102821128212282132821428215282162821728218282192822028221282222822328224282252822628227282282822928230282312823228233282342823528236282372823828239282402824128242282432824428245282462824728248282492825028251282522825328254282552825628257282582825928260282612826228263282642826528266282672826828269282702827128272282732827428275282762827728278282792828028281282822828328284282852828628287282882828928290282912829228293282942829528296282972829828299283002830128302283032830428305283062830728308283092831028311283122831328314283152831628317283182831928320283212832228323283242832528326283272832828329283302833128332283332833428335283362833728338283392834028341283422834328344283452834628347283482834928350283512835228353283542835528356283572835828359283602836128362283632836428365283662836728368283692837028371283722837328374283752837628377283782837928380283812838228383283842838528386283872838828389283902839128392283932839428395283962839728398283992840028401284022840328404284052840628407284082840928410284112841228413284142841528416284172841828419284202842128422284232842428425284262842728428284292843028431284322843328434284352843628437284382843928440284412844228443284442844528446284472844828449284502845128452284532845428455284562845728458284592846028461284622846328464284652846628467284682846928470284712847228473284742847528476284772847828479284802848128482284832848428485284862848728488284892849028491284922849328494284952849628497284982849928500285012850228503285042850528506285072850828509285102851128512285132851428515285162851728518285192852028521285222852328524285252852628527285282852928530285312853228533285342853528536285372853828539285402854128542285432854428545285462854728548285492855028551285522855328554285552855628557285582855928560285612856228563285642856528566285672856828569285702857128572285732857428575285762857728578285792858028581285822858328584285852858628587285882858928590285912859228593285942859528596285972859828599286002860128602286032860428605286062860728608286092861028611286122861328614286152861628617286182861928620286212862228623286242862528626286272862828629286302863128632286332863428635286362863728638286392864028641286422864328644286452864628647286482864928650286512865228653286542865528656286572865828659286602866128662286632866428665286662866728668286692867028671286722867328674286752867628677286782867928680286812868228683286842868528686286872868828689286902869128692286932869428695286962869728698286992870028701287022870328704287052870628707287082870928710287112871228713287142871528716287172871828719287202872128722287232872428725287262872728728287292873028731287322873328734287352873628737287382873928740287412874228743287442874528746287472874828749287502875128752287532875428755287562875728758287592876028761287622876328764287652876628767287682876928770287712877228773287742877528776287772877828779287802878128782287832878428785287862878728788287892879028791287922879328794287952879628797287982879928800288012880228803288042880528806288072880828809288102881128812288132881428815288162881728818288192882028821288222882328824288252882628827288282882928830288312883228833288342883528836288372883828839288402884128842288432884428845288462884728848288492885028851288522885328854288552885628857288582885928860288612886228863288642886528866288672886828869288702887128872288732887428875288762887728878288792888028881288822888328884288852888628887288882888928890288912889228893288942889528896288972889828899289002890128902289032890428905289062890728908289092891028911289122891328914289152891628917289182891928920289212892228923289242892528926289272892828929289302893128932289332893428935289362893728938289392894028941289422894328944289452894628947289482894928950289512895228953289542895528956289572895828959289602896128962289632896428965289662896728968289692897028971289722897328974289752897628977289782897928980289812898228983289842898528986289872898828989289902899128992289932899428995289962899728998289992900029001290022900329004290052900629007290082900929010290112901229013290142901529016290172901829019290202902129022290232902429025290262902729028290292903029031290322903329034290352903629037290382903929040290412904229043290442904529046290472904829049290502905129052290532905429055290562905729058290592906029061290622906329064290652906629067290682906929070290712907229073290742907529076290772907829079290802908129082290832908429085290862908729088290892909029091290922909329094290952909629097290982909929100291012910229103291042910529106291072910829109291102911129112291132911429115291162911729118291192912029121291222912329124291252912629127291282912929130291312913229133291342913529136291372913829139291402914129142291432914429145291462914729148291492915029151291522915329154291552915629157291582915929160291612916229163291642916529166291672916829169291702917129172291732917429175291762917729178291792918029181291822918329184291852918629187291882918929190291912919229193291942919529196291972919829199292002920129202292032920429205292062920729208292092921029211292122921329214292152921629217292182921929220292212922229223292242922529226292272922829229292302923129232292332923429235292362923729238292392924029241292422924329244292452924629247292482924929250292512925229253292542925529256292572925829259292602926129262292632926429265292662926729268292692927029271292722927329274292752927629277292782927929280292812928229283292842928529286292872928829289292902929129292292932929429295292962929729298292992930029301293022930329304293052930629307293082930929310293112931229313293142931529316293172931829319293202932129322293232932429325293262932729328293292933029331293322933329334293352933629337293382933929340293412934229343293442934529346293472934829349293502935129352293532935429355293562935729358293592936029361293622936329364293652936629367293682936929370293712937229373293742937529376293772937829379293802938129382293832938429385293862938729388293892939029391293922939329394293952939629397293982939929400294012940229403294042940529406294072940829409294102941129412294132941429415294162941729418294192942029421294222942329424294252942629427294282942929430294312943229433294342943529436294372943829439294402944129442294432944429445294462944729448294492945029451294522945329454294552945629457294582945929460294612946229463294642946529466294672946829469294702947129472294732947429475294762947729478294792948029481294822948329484294852948629487294882948929490294912949229493294942949529496294972949829499295002950129502295032950429505295062950729508295092951029511295122951329514295152951629517295182951929520295212952229523295242952529526295272952829529295302953129532295332953429535295362953729538295392954029541295422954329544295452954629547295482954929550295512955229553295542955529556295572955829559295602956129562295632956429565295662956729568295692957029571295722957329574295752957629577295782957929580295812958229583295842958529586295872958829589295902959129592295932959429595295962959729598295992960029601296022960329604296052960629607296082960929610296112961229613296142961529616296172961829619296202962129622296232962429625296262962729628296292963029631296322963329634296352963629637296382963929640296412964229643296442964529646296472964829649296502965129652296532965429655296562965729658296592966029661296622966329664296652966629667296682966929670296712967229673296742967529676296772967829679296802968129682296832968429685296862968729688296892969029691296922969329694296952969629697296982969929700297012970229703297042970529706297072970829709297102971129712297132971429715297162971729718297192972029721297222972329724297252972629727297282972929730297312973229733297342973529736297372973829739297402974129742297432974429745297462974729748297492975029751297522975329754297552975629757297582975929760297612976229763297642976529766297672976829769297702977129772297732977429775297762977729778297792978029781297822978329784297852978629787297882978929790297912979229793297942979529796297972979829799298002980129802298032980429805298062980729808298092981029811298122981329814298152981629817298182981929820298212982229823298242982529826298272982829829298302983129832298332983429835298362983729838298392984029841298422984329844298452984629847298482984929850298512985229853298542985529856298572985829859298602986129862298632986429865298662986729868298692987029871298722987329874298752987629877298782987929880298812988229883298842988529886298872988829889298902989129892298932989429895298962989729898298992990029901299022990329904299052990629907299082990929910299112991229913299142991529916299172991829919299202992129922299232992429925299262992729928299292993029931299322993329934299352993629937299382993929940299412994229943299442994529946299472994829949299502995129952299532995429955299562995729958299592996029961299622996329964299652996629967299682996929970299712997229973299742997529976299772997829979299802998129982299832998429985299862998729988299892999029991299922999329994299952999629997299982999930000300013000230003300043000530006300073000830009300103001130012300133001430015300163001730018300193002030021300223002330024300253002630027300283002930030300313003230033300343003530036300373003830039300403004130042300433004430045300463004730048300493005030051300523005330054300553005630057300583005930060300613006230063300643006530066300673006830069300703007130072300733007430075300763007730078300793008030081300823008330084300853008630087300883008930090300913009230093300943009530096300973009830099301003010130102301033010430105301063010730108301093011030111301123011330114301153011630117301183011930120301213012230123301243012530126301273012830129301303013130132301333013430135301363013730138301393014030141301423014330144301453014630147301483014930150301513015230153301543015530156301573015830159301603016130162301633016430165301663016730168301693017030171301723017330174301753017630177301783017930180301813018230183301843018530186301873018830189301903019130192301933019430195301963019730198301993020030201302023020330204302053020630207302083020930210302113021230213302143021530216302173021830219302203022130222302233022430225302263022730228302293023030231302323023330234302353023630237302383023930240302413024230243302443024530246302473024830249302503025130252302533025430255302563025730258302593026030261302623026330264302653026630267302683026930270302713027230273302743027530276302773027830279302803028130282302833028430285302863028730288302893029030291302923029330294302953029630297302983029930300303013030230303303043030530306303073030830309303103031130312303133031430315303163031730318303193032030321303223032330324303253032630327303283032930330303313033230333303343033530336303373033830339303403034130342303433034430345303463034730348303493035030351303523035330354303553035630357303583035930360303613036230363303643036530366303673036830369303703037130372303733037430375303763037730378303793038030381303823038330384303853038630387303883038930390303913039230393303943039530396303973039830399304003040130402304033040430405304063040730408304093041030411304123041330414304153041630417304183041930420304213042230423304243042530426304273042830429304303043130432304333043430435304363043730438304393044030441304423044330444304453044630447304483044930450304513045230453304543045530456304573045830459304603046130462304633046430465304663046730468304693047030471304723047330474304753047630477304783047930480304813048230483304843048530486304873048830489304903049130492304933049430495304963049730498304993050030501305023050330504305053050630507305083050930510305113051230513305143051530516305173051830519305203052130522305233052430525305263052730528305293053030531305323053330534305353053630537305383053930540305413054230543305443054530546305473054830549305503055130552305533055430555305563055730558305593056030561305623056330564305653056630567305683056930570305713057230573305743057530576305773057830579305803058130582305833058430585305863058730588305893059030591305923059330594305953059630597305983059930600306013060230603306043060530606306073060830609306103061130612306133061430615306163061730618306193062030621306223062330624306253062630627306283062930630306313063230633306343063530636306373063830639306403064130642306433064430645306463064730648306493065030651306523065330654306553065630657306583065930660306613066230663306643066530666306673066830669306703067130672306733067430675306763067730678306793068030681306823068330684306853068630687306883068930690306913069230693306943069530696306973069830699307003070130702307033070430705307063070730708307093071030711307123071330714307153071630717307183071930720307213072230723307243072530726307273072830729307303073130732307333073430735307363073730738307393074030741307423074330744307453074630747307483074930750307513075230753307543075530756307573075830759307603076130762307633076430765307663076730768307693077030771307723077330774307753077630777307783077930780307813078230783307843078530786307873078830789307903079130792307933079430795307963079730798307993080030801308023080330804308053080630807308083080930810308113081230813308143081530816308173081830819308203082130822308233082430825308263082730828308293083030831308323083330834308353083630837308383083930840308413084230843308443084530846308473084830849308503085130852308533085430855308563085730858308593086030861308623086330864308653086630867308683086930870308713087230873308743087530876308773087830879308803088130882308833088430885308863088730888308893089030891308923089330894308953089630897308983089930900309013090230903309043090530906309073090830909309103091130912309133091430915309163091730918309193092030921309223092330924309253092630927309283092930930309313093230933309343093530936309373093830939309403094130942309433094430945309463094730948309493095030951309523095330954309553095630957309583095930960309613096230963309643096530966309673096830969309703097130972309733097430975309763097730978309793098030981309823098330984309853098630987309883098930990309913099230993309943099530996309973099830999310003100131002310033100431005310063100731008310093101031011310123101331014310153101631017310183101931020310213102231023310243102531026310273102831029310303103131032310333103431035310363103731038310393104031041310423104331044310453104631047310483104931050310513105231053310543105531056310573105831059310603106131062310633106431065310663106731068310693107031071310723107331074310753107631077310783107931080310813108231083310843108531086310873108831089310903109131092310933109431095310963109731098310993110031101311023110331104311053110631107311083110931110311113111231113311143111531116311173111831119311203112131122311233112431125311263112731128311293113031131311323113331134311353113631137311383113931140311413114231143311443114531146311473114831149311503115131152311533115431155311563115731158311593116031161311623116331164311653116631167311683116931170311713117231173311743117531176311773117831179311803118131182311833118431185311863118731188311893119031191311923119331194311953119631197311983119931200312013120231203312043120531206312073120831209312103121131212312133121431215312163121731218312193122031221312223122331224312253122631227312283122931230312313123231233312343123531236312373123831239312403124131242312433124431245312463124731248312493125031251312523125331254312553125631257312583125931260312613126231263312643126531266312673126831269312703127131272312733127431275312763127731278312793128031281312823128331284312853128631287312883128931290312913129231293312943129531296312973129831299313003130131302313033130431305313063130731308313093131031311313123131331314313153131631317313183131931320313213132231323313243132531326313273132831329313303133131332313333133431335313363133731338313393134031341313423134331344313453134631347313483134931350313513135231353313543135531356313573135831359313603136131362313633136431365313663136731368313693137031371313723137331374313753137631377313783137931380313813138231383313843138531386313873138831389313903139131392313933139431395313963139731398313993140031401314023140331404314053140631407314083140931410314113141231413314143141531416314173141831419314203142131422314233142431425314263142731428314293143031431314323143331434314353143631437314383143931440314413144231443314443144531446314473144831449314503145131452314533145431455314563145731458314593146031461314623146331464314653146631467314683146931470314713147231473314743147531476314773147831479314803148131482314833148431485314863148731488314893149031491314923149331494314953149631497314983149931500315013150231503315043150531506315073150831509315103151131512315133151431515315163151731518315193152031521315223152331524315253152631527315283152931530315313153231533315343153531536315373153831539315403154131542315433154431545315463154731548315493155031551315523155331554315553155631557315583155931560315613156231563315643156531566315673156831569315703157131572315733157431575315763157731578315793158031581315823158331584315853158631587315883158931590315913159231593315943159531596315973159831599316003160131602316033160431605316063160731608316093161031611316123161331614316153161631617316183161931620316213162231623316243162531626316273162831629316303163131632316333163431635316363163731638316393164031641316423164331644316453164631647316483164931650316513165231653316543165531656316573165831659316603166131662316633166431665316663166731668316693167031671316723167331674316753167631677316783167931680316813168231683316843168531686316873168831689316903169131692316933169431695316963169731698316993170031701317023170331704317053170631707317083170931710317113171231713317143171531716317173171831719317203172131722317233172431725317263172731728317293173031731317323173331734317353173631737317383173931740317413174231743317443174531746317473174831749317503175131752317533175431755317563175731758317593176031761317623176331764317653176631767317683176931770317713177231773317743177531776317773177831779317803178131782317833178431785317863178731788317893179031791317923179331794317953179631797317983179931800318013180231803318043180531806318073180831809318103181131812318133181431815318163181731818318193182031821318223182331824318253182631827318283182931830318313183231833318343183531836318373183831839318403184131842318433184431845318463184731848318493185031851318523185331854318553185631857318583185931860318613186231863318643186531866318673186831869318703187131872318733187431875318763187731878318793188031881318823188331884318853188631887318883188931890318913189231893318943189531896318973189831899319003190131902319033190431905319063190731908319093191031911319123191331914319153191631917319183191931920319213192231923319243192531926319273192831929319303193131932319333193431935319363193731938319393194031941319423194331944319453194631947319483194931950319513195231953319543195531956319573195831959319603196131962319633196431965319663196731968319693197031971319723197331974319753197631977319783197931980319813198231983319843198531986319873198831989319903199131992319933199431995319963199731998319993200032001320023200332004320053200632007320083200932010320113201232013320143201532016320173201832019320203202132022320233202432025320263202732028320293203032031320323203332034320353203632037320383203932040320413204232043320443204532046320473204832049320503205132052320533205432055320563205732058320593206032061320623206332064320653206632067320683206932070320713207232073320743207532076320773207832079320803208132082320833208432085320863208732088320893209032091320923209332094320953209632097320983209932100321013210232103321043210532106321073210832109321103211132112321133211432115321163211732118321193212032121321223212332124321253212632127321283212932130321313213232133321343213532136321373213832139321403214132142321433214432145321463214732148321493215032151321523215332154321553215632157321583215932160321613216232163321643216532166321673216832169321703217132172321733217432175321763217732178321793218032181321823218332184321853218632187321883218932190321913219232193321943219532196321973219832199322003220132202322033220432205322063220732208322093221032211322123221332214322153221632217322183221932220322213222232223322243222532226322273222832229322303223132232322333223432235322363223732238322393224032241322423224332244322453224632247322483224932250322513225232253322543225532256322573225832259322603226132262322633226432265322663226732268322693227032271322723227332274322753227632277322783227932280322813228232283322843228532286322873228832289322903229132292322933229432295322963229732298322993230032301323023230332304323053230632307323083230932310323113231232313323143231532316323173231832319323203232132322323233232432325323263232732328323293233032331323323233332334323353233632337323383233932340323413234232343323443234532346323473234832349323503235132352323533235432355323563235732358323593236032361323623236332364323653236632367323683236932370323713237232373323743237532376323773237832379323803238132382323833238432385323863238732388323893239032391323923239332394323953239632397323983239932400324013240232403324043240532406324073240832409324103241132412324133241432415324163241732418324193242032421324223242332424324253242632427324283242932430324313243232433324343243532436324373243832439324403244132442324433244432445324463244732448324493245032451324523245332454324553245632457324583245932460324613246232463324643246532466324673246832469324703247132472324733247432475324763247732478324793248032481324823248332484324853248632487324883248932490324913249232493324943249532496324973249832499325003250132502325033250432505325063250732508325093251032511325123251332514325153251632517325183251932520325213252232523325243252532526325273252832529325303253132532325333253432535325363253732538325393254032541325423254332544325453254632547325483254932550325513255232553325543255532556325573255832559325603256132562325633256432565325663256732568325693257032571325723257332574325753257632577325783257932580325813258232583325843258532586325873258832589325903259132592325933259432595325963259732598325993260032601326023260332604326053260632607326083260932610326113261232613326143261532616326173261832619326203262132622326233262432625326263262732628326293263032631326323263332634326353263632637326383263932640326413264232643326443264532646326473264832649326503265132652326533265432655326563265732658326593266032661326623266332664326653266632667326683266932670326713267232673326743267532676326773267832679326803268132682326833268432685326863268732688326893269032691326923269332694326953269632697326983269932700327013270232703327043270532706327073270832709327103271132712327133271432715327163271732718327193272032721327223272332724327253272632727327283272932730327313273232733327343273532736327373273832739327403274132742327433274432745327463274732748327493275032751327523275332754327553275632757327583275932760327613276232763327643276532766327673276832769327703277132772327733277432775327763277732778327793278032781327823278332784327853278632787327883278932790327913279232793327943279532796327973279832799328003280132802328033280432805328063280732808328093281032811328123281332814328153281632817328183281932820328213282232823328243282532826328273282832829328303283132832328333283432835328363283732838328393284032841328423284332844328453284632847328483284932850328513285232853328543285532856328573285832859328603286132862328633286432865328663286732868328693287032871328723287332874328753287632877328783287932880328813288232883328843288532886328873288832889328903289132892328933289432895328963289732898328993290032901329023290332904329053290632907329083290932910329113291232913329143291532916329173291832919329203292132922329233292432925329263292732928329293293032931329323293332934329353293632937329383293932940329413294232943329443294532946329473294832949329503295132952329533295432955329563295732958329593296032961329623296332964329653296632967329683296932970329713297232973329743297532976329773297832979329803298132982329833298432985329863298732988329893299032991329923299332994329953299632997329983299933000330013300233003330043300533006330073300833009330103301133012330133301433015330163301733018330193302033021330223302333024330253302633027330283302933030330313303233033330343303533036330373303833039330403304133042330433304433045330463304733048330493305033051330523305333054330553305633057330583305933060330613306233063330643306533066330673306833069330703307133072330733307433075330763307733078330793308033081330823308333084330853308633087330883308933090330913309233093330943309533096330973309833099331003310133102331033310433105331063310733108331093311033111331123311333114331153311633117331183311933120331213312233123331243312533126331273312833129331303313133132331333313433135331363313733138331393314033141331423314333144331453314633147331483314933150331513315233153331543315533156331573315833159331603316133162331633316433165331663316733168331693317033171331723317333174331753317633177331783317933180331813318233183331843318533186331873318833189331903319133192331933319433195331963319733198331993320033201332023320333204332053320633207332083320933210332113321233213332143321533216332173321833219332203322133222332233322433225332263322733228332293323033231332323323333234332353323633237332383323933240332413324233243332443324533246332473324833249332503325133252332533325433255332563325733258332593326033261332623326333264332653326633267332683326933270332713327233273332743327533276332773327833279332803328133282332833328433285332863328733288332893329033291332923329333294332953329633297332983329933300333013330233303333043330533306333073330833309333103331133312333133331433315333163331733318333193332033321333223332333324333253332633327333283332933330333313333233333333343333533336333373333833339333403334133342333433334433345333463334733348333493335033351333523335333354333553335633357333583335933360333613336233363333643336533366333673336833369333703337133372333733337433375333763337733378333793338033381333823338333384333853338633387333883338933390333913339233393333943339533396333973339833399334003340133402334033340433405334063340733408334093341033411334123341333414334153341633417334183341933420334213342233423334243342533426334273342833429334303343133432334333343433435334363343733438334393344033441334423344333444334453344633447334483344933450334513345233453334543345533456334573345833459334603346133462334633346433465334663346733468334693347033471334723347333474334753347633477334783347933480334813348233483334843348533486334873348833489334903349133492334933349433495334963349733498334993350033501335023350333504335053350633507335083350933510335113351233513335143351533516335173351833519335203352133522335233352433525335263352733528335293353033531335323353333534335353353633537335383353933540335413354233543335443354533546335473354833549335503355133552335533355433555335563355733558335593356033561335623356333564335653356633567335683356933570335713357233573335743357533576335773357833579335803358133582335833358433585335863358733588335893359033591335923359333594335953359633597335983359933600336013360233603336043360533606336073360833609336103361133612336133361433615336163361733618336193362033621336223362333624336253362633627336283362933630336313363233633336343363533636336373363833639336403364133642336433364433645336463364733648336493365033651336523365333654336553365633657336583365933660336613366233663336643366533666336673366833669336703367133672336733367433675336763367733678336793368033681336823368333684336853368633687336883368933690336913369233693336943369533696336973369833699337003370133702337033370433705337063370733708337093371033711337123371333714337153371633717337183371933720337213372233723337243372533726337273372833729337303373133732337333373433735337363373733738337393374033741337423374333744337453374633747337483374933750337513375233753337543375533756337573375833759337603376133762337633376433765337663376733768337693377033771337723377333774337753377633777337783377933780337813378233783337843378533786337873378833789337903379133792337933379433795337963379733798337993380033801338023380333804338053380633807338083380933810338113381233813338143381533816338173381833819338203382133822338233382433825338263382733828338293383033831338323383333834338353383633837338383383933840338413384233843338443384533846338473384833849338503385133852338533385433855338563385733858338593386033861338623386333864338653386633867338683386933870338713387233873338743387533876338773387833879338803388133882338833388433885338863388733888338893389033891338923389333894338953389633897338983389933900339013390233903339043390533906339073390833909339103391133912339133391433915339163391733918339193392033921339223392333924339253392633927339283392933930339313393233933339343393533936339373393833939339403394133942339433394433945339463394733948339493395033951339523395333954339553395633957339583395933960339613396233963339643396533966339673396833969339703397133972339733397433975339763397733978339793398033981339823398333984339853398633987339883398933990339913399233993339943399533996339973399833999340003400134002340033400434005340063400734008340093401034011340123401334014340153401634017340183401934020340213402234023340243402534026340273402834029340303403134032340333403434035340363403734038340393404034041340423404334044340453404634047340483404934050340513405234053340543405534056340573405834059340603406134062340633406434065340663406734068340693407034071340723407334074340753407634077340783407934080340813408234083340843408534086340873408834089340903409134092340933409434095340963409734098340993410034101341023410334104341053410634107341083410934110341113411234113341143411534116341173411834119341203412134122341233412434125341263412734128341293413034131341323413334134341353413634137341383413934140341413414234143341443414534146341473414834149341503415134152341533415434155341563415734158341593416034161341623416334164341653416634167341683416934170341713417234173341743417534176341773417834179341803418134182341833418434185341863418734188341893419034191341923419334194341953419634197341983419934200342013420234203342043420534206342073420834209342103421134212342133421434215342163421734218342193422034221342223422334224342253422634227342283422934230342313423234233342343423534236342373423834239342403424134242342433424434245342463424734248342493425034251342523425334254342553425634257342583425934260342613426234263342643426534266342673426834269342703427134272342733427434275342763427734278342793428034281342823428334284342853428634287342883428934290342913429234293342943429534296342973429834299343003430134302343033430434305343063430734308343093431034311343123431334314343153431634317343183431934320343213432234323343243432534326343273432834329343303433134332343333433434335343363433734338343393434034341343423434334344343453434634347343483434934350343513435234353343543435534356343573435834359343603436134362343633436434365343663436734368343693437034371343723437334374343753437634377343783437934380343813438234383343843438534386343873438834389343903439134392343933439434395343963439734398343993440034401344023440334404344053440634407344083440934410344113441234413344143441534416344173441834419344203442134422344233442434425344263442734428344293443034431344323443334434344353443634437344383443934440344413444234443344443444534446344473444834449344503445134452344533445434455344563445734458344593446034461344623446334464344653446634467344683446934470344713447234473344743447534476344773447834479344803448134482344833448434485344863448734488344893449034491344923449334494344953449634497344983449934500345013450234503345043450534506345073450834509345103451134512345133451434515345163451734518345193452034521345223452334524345253452634527345283452934530345313453234533345343453534536345373453834539345403454134542345433454434545345463454734548345493455034551345523455334554345553455634557345583455934560345613456234563345643456534566345673456834569345703457134572345733457434575345763457734578345793458034581345823458334584345853458634587345883458934590345913459234593345943459534596345973459834599346003460134602346033460434605346063460734608346093461034611346123461334614346153461634617346183461934620346213462234623346243462534626346273462834629346303463134632346333463434635346363463734638346393464034641346423464334644346453464634647346483464934650346513465234653346543465534656346573465834659346603466134662346633466434665346663466734668346693467034671346723467334674346753467634677346783467934680346813468234683346843468534686346873468834689346903469134692346933469434695346963469734698346993470034701347023470334704347053470634707347083470934710347113471234713347143471534716347173471834719347203472134722347233472434725347263472734728347293473034731347323473334734347353473634737347383473934740347413474234743347443474534746347473474834749347503475134752347533475434755347563475734758347593476034761347623476334764347653476634767347683476934770347713477234773347743477534776347773477834779347803478134782347833478434785347863478734788347893479034791347923479334794347953479634797347983479934800348013480234803348043480534806348073480834809348103481134812348133481434815348163481734818348193482034821348223482334824348253482634827348283482934830348313483234833348343483534836348373483834839348403484134842348433484434845348463484734848348493485034851348523485334854348553485634857348583485934860348613486234863348643486534866348673486834869348703487134872348733487434875348763487734878348793488034881348823488334884348853488634887348883488934890348913489234893348943489534896348973489834899349003490134902349033490434905349063490734908349093491034911349123491334914349153491634917349183491934920349213492234923349243492534926349273492834929349303493134932349333493434935349363493734938349393494034941349423494334944349453494634947349483494934950349513495234953349543495534956349573495834959349603496134962349633496434965349663496734968349693497034971349723497334974349753497634977349783497934980349813498234983349843498534986349873498834989349903499134992349933499434995349963499734998349993500035001350023500335004350053500635007350083500935010350113501235013350143501535016350173501835019350203502135022350233502435025350263502735028350293503035031350323503335034350353503635037350383503935040350413504235043350443504535046350473504835049350503505135052350533505435055350563505735058350593506035061350623506335064350653506635067350683506935070350713507235073350743507535076350773507835079350803508135082350833508435085350863508735088350893509035091350923509335094350953509635097350983509935100351013510235103351043510535106351073510835109351103511135112351133511435115351163511735118351193512035121351223512335124351253512635127351283512935130351313513235133351343513535136351373513835139351403514135142351433514435145351463514735148351493515035151351523515335154351553515635157351583515935160351613516235163351643516535166351673516835169351703517135172351733517435175351763517735178351793518035181351823518335184351853518635187351883518935190351913519235193351943519535196351973519835199352003520135202352033520435205352063520735208352093521035211352123521335214352153521635217352183521935220352213522235223352243522535226352273522835229352303523135232352333523435235352363523735238352393524035241352423524335244352453524635247352483524935250352513525235253352543525535256352573525835259352603526135262352633526435265352663526735268352693527035271352723527335274352753527635277352783527935280352813528235283352843528535286352873528835289352903529135292352933529435295352963529735298352993530035301353023530335304353053530635307353083530935310353113531235313353143531535316353173531835319353203532135322353233532435325353263532735328353293533035331353323533335334353353533635337353383533935340353413534235343353443534535346353473534835349353503535135352353533535435355353563535735358353593536035361353623536335364353653536635367353683536935370353713537235373353743537535376353773537835379353803538135382353833538435385353863538735388353893539035391353923539335394353953539635397353983539935400354013540235403354043540535406354073540835409354103541135412354133541435415354163541735418354193542035421354223542335424354253542635427354283542935430354313543235433354343543535436354373543835439354403544135442354433544435445354463544735448354493545035451354523545335454354553545635457354583545935460354613546235463354643546535466354673546835469354703547135472354733547435475354763547735478354793548035481354823548335484354853548635487354883548935490354913549235493354943549535496354973549835499355003550135502355033550435505355063550735508355093551035511355123551335514355153551635517355183551935520355213552235523355243552535526355273552835529355303553135532355333553435535355363553735538355393554035541355423554335544355453554635547355483554935550355513555235553355543555535556355573555835559355603556135562355633556435565355663556735568355693557035571355723557335574355753557635577355783557935580355813558235583355843558535586355873558835589355903559135592355933559435595355963559735598355993560035601356023560335604356053560635607356083560935610356113561235613356143561535616356173561835619356203562135622356233562435625356263562735628356293563035631356323563335634356353563635637356383563935640356413564235643356443564535646356473564835649356503565135652356533565435655356563565735658356593566035661356623566335664356653566635667356683566935670356713567235673356743567535676356773567835679356803568135682356833568435685356863568735688356893569035691356923569335694356953569635697356983569935700357013570235703357043570535706357073570835709357103571135712357133571435715357163571735718357193572035721357223572335724357253572635727357283572935730357313573235733357343573535736357373573835739357403574135742357433574435745357463574735748357493575035751357523575335754357553575635757357583575935760357613576235763357643576535766357673576835769357703577135772357733577435775357763577735778357793578035781357823578335784357853578635787357883578935790357913579235793357943579535796357973579835799358003580135802358033580435805358063580735808358093581035811358123581335814358153581635817358183581935820358213582235823358243582535826358273582835829358303583135832358333583435835358363583735838358393584035841358423584335844358453584635847358483584935850358513585235853358543585535856358573585835859358603586135862358633586435865358663586735868358693587035871358723587335874358753587635877358783587935880358813588235883358843588535886358873588835889358903589135892358933589435895358963589735898358993590035901359023590335904359053590635907359083590935910359113591235913359143591535916359173591835919359203592135922359233592435925359263592735928359293593035931359323593335934359353593635937359383593935940359413594235943359443594535946359473594835949359503595135952359533595435955359563595735958359593596035961359623596335964359653596635967359683596935970359713597235973359743597535976359773597835979359803598135982359833598435985359863598735988359893599035991359923599335994359953599635997359983599936000360013600236003360043600536006360073600836009360103601136012360133601436015360163601736018360193602036021360223602336024360253602636027360283602936030360313603236033360343603536036360373603836039360403604136042360433604436045360463604736048360493605036051360523605336054360553605636057360583605936060360613606236063360643606536066360673606836069360703607136072360733607436075360763607736078360793608036081360823608336084360853608636087360883608936090360913609236093360943609536096360973609836099361003610136102361033610436105361063610736108361093611036111361123611336114361153611636117361183611936120361213612236123361243612536126361273612836129361303613136132361333613436135361363613736138361393614036141361423614336144361453614636147361483614936150361513615236153361543615536156361573615836159361603616136162361633616436165361663616736168361693617036171361723617336174361753617636177361783617936180361813618236183361843618536186361873618836189361903619136192361933619436195361963619736198361993620036201362023620336204362053620636207362083620936210362113621236213362143621536216362173621836219362203622136222362233622436225362263622736228362293623036231362323623336234362353623636237362383623936240362413624236243362443624536246362473624836249362503625136252362533625436255362563625736258362593626036261362623626336264362653626636267362683626936270362713627236273362743627536276362773627836279362803628136282362833628436285362863628736288362893629036291362923629336294362953629636297362983629936300363013630236303363043630536306363073630836309363103631136312363133631436315363163631736318363193632036321363223632336324363253632636327363283632936330363313633236333363343633536336363373633836339363403634136342363433634436345363463634736348363493635036351363523635336354363553635636357363583635936360363613636236363363643636536366363673636836369363703637136372363733637436375363763637736378363793638036381363823638336384363853638636387363883638936390363913639236393363943639536396363973639836399364003640136402364033640436405364063640736408364093641036411364123641336414364153641636417364183641936420364213642236423364243642536426364273642836429364303643136432364333643436435364363643736438364393644036441364423644336444364453644636447364483644936450364513645236453364543645536456364573645836459364603646136462364633646436465364663646736468364693647036471364723647336474364753647636477364783647936480364813648236483364843648536486364873648836489364903649136492364933649436495364963649736498364993650036501365023650336504365053650636507365083650936510365113651236513365143651536516365173651836519365203652136522365233652436525365263652736528365293653036531365323653336534365353653636537365383653936540365413654236543365443654536546365473654836549365503655136552365533655436555365563655736558365593656036561365623656336564365653656636567365683656936570365713657236573365743657536576365773657836579365803658136582365833658436585365863658736588365893659036591365923659336594365953659636597365983659936600366013660236603366043660536606366073660836609366103661136612366133661436615366163661736618366193662036621366223662336624366253662636627366283662936630366313663236633366343663536636366373663836639366403664136642366433664436645366463664736648366493665036651366523665336654366553665636657366583665936660366613666236663366643666536666366673666836669366703667136672366733667436675366763667736678366793668036681366823668336684366853668636687366883668936690366913669236693366943669536696366973669836699367003670136702367033670436705367063670736708367093671036711367123671336714367153671636717367183671936720367213672236723367243672536726367273672836729367303673136732367333673436735367363673736738367393674036741367423674336744367453674636747367483674936750367513675236753367543675536756367573675836759367603676136762367633676436765367663676736768367693677036771367723677336774367753677636777367783677936780367813678236783367843678536786367873678836789367903679136792367933679436795367963679736798367993680036801368023680336804368053680636807368083680936810368113681236813368143681536816368173681836819368203682136822368233682436825368263682736828368293683036831368323683336834368353683636837368383683936840368413684236843368443684536846368473684836849368503685136852368533685436855368563685736858368593686036861368623686336864368653686636867368683686936870368713687236873368743687536876368773687836879368803688136882368833688436885368863688736888368893689036891368923689336894368953689636897368983689936900369013690236903369043690536906369073690836909369103691136912369133691436915369163691736918369193692036921369223692336924369253692636927369283692936930369313693236933369343693536936369373693836939369403694136942369433694436945369463694736948369493695036951369523695336954369553695636957369583695936960369613696236963369643696536966369673696836969369703697136972369733697436975369763697736978369793698036981369823698336984369853698636987369883698936990369913699236993369943699536996369973699836999370003700137002370033700437005370063700737008370093701037011370123701337014370153701637017370183701937020370213702237023370243702537026370273702837029370303703137032370333703437035370363703737038370393704037041370423704337044370453704637047370483704937050370513705237053370543705537056370573705837059370603706137062370633706437065370663706737068370693707037071370723707337074370753707637077370783707937080370813708237083370843708537086370873708837089370903709137092370933709437095370963709737098370993710037101371023710337104371053710637107371083710937110371113711237113371143711537116371173711837119371203712137122371233712437125371263712737128371293713037131371323713337134371353713637137371383713937140371413714237143371443714537146371473714837149371503715137152371533715437155371563715737158371593716037161371623716337164371653716637167371683716937170371713717237173371743717537176371773717837179371803718137182371833718437185371863718737188371893719037191371923719337194371953719637197371983719937200372013720237203372043720537206372073720837209372103721137212372133721437215372163721737218372193722037221372223722337224372253722637227372283722937230372313723237233372343723537236372373723837239372403724137242372433724437245372463724737248372493725037251372523725337254372553725637257372583725937260372613726237263372643726537266372673726837269372703727137272372733727437275372763727737278372793728037281372823728337284372853728637287372883728937290372913729237293372943729537296372973729837299373003730137302373033730437305373063730737308373093731037311373123731337314373153731637317373183731937320373213732237323373243732537326373273732837329373303733137332373333733437335373363733737338373393734037341373423734337344373453734637347373483734937350373513735237353373543735537356373573735837359373603736137362373633736437365373663736737368373693737037371373723737337374373753737637377373783737937380373813738237383373843738537386373873738837389373903739137392373933739437395373963739737398373993740037401374023740337404374053740637407374083740937410374113741237413374143741537416374173741837419374203742137422374233742437425374263742737428374293743037431374323743337434374353743637437374383743937440374413744237443374443744537446374473744837449374503745137452374533745437455374563745737458374593746037461374623746337464374653746637467374683746937470374713747237473374743747537476374773747837479374803748137482374833748437485374863748737488374893749037491374923749337494374953749637497374983749937500375013750237503375043750537506375073750837509375103751137512375133751437515375163751737518375193752037521375223752337524375253752637527375283752937530375313753237533375343753537536375373753837539375403754137542375433754437545375463754737548375493755037551375523755337554375553755637557375583755937560375613756237563375643756537566375673756837569375703757137572375733757437575375763757737578375793758037581375823758337584375853758637587375883758937590375913759237593375943759537596375973759837599376003760137602376033760437605376063760737608376093761037611376123761337614376153761637617376183761937620376213762237623376243762537626376273762837629376303763137632376333763437635376363763737638376393764037641376423764337644376453764637647376483764937650376513765237653376543765537656376573765837659376603766137662376633766437665376663766737668376693767037671376723767337674376753767637677376783767937680376813768237683376843768537686376873768837689376903769137692376933769437695376963769737698376993770037701377023770337704377053770637707377083770937710377113771237713377143771537716377173771837719377203772137722377233772437725377263772737728377293773037731377323773337734377353773637737377383773937740377413774237743377443774537746377473774837749377503775137752377533775437755377563775737758377593776037761377623776337764377653776637767377683776937770377713777237773377743777537776377773777837779377803778137782377833778437785377863778737788377893779037791377923779337794377953779637797377983779937800378013780237803378043780537806378073780837809378103781137812378133781437815378163781737818378193782037821378223782337824378253782637827378283782937830378313783237833378343783537836378373783837839378403784137842378433784437845378463784737848378493785037851378523785337854378553785637857378583785937860378613786237863378643786537866378673786837869378703787137872378733787437875378763787737878378793788037881378823788337884378853788637887378883788937890378913789237893378943789537896378973789837899379003790137902379033790437905379063790737908379093791037911379123791337914379153791637917379183791937920379213792237923379243792537926379273792837929379303793137932379333793437935379363793737938379393794037941379423794337944379453794637947379483794937950379513795237953379543795537956379573795837959379603796137962379633796437965379663796737968379693797037971379723797337974379753797637977379783797937980379813798237983379843798537986379873798837989379903799137992379933799437995379963799737998379993800038001380023800338004380053800638007380083800938010380113801238013380143801538016380173801838019380203802138022380233802438025380263802738028380293803038031380323803338034380353803638037380383803938040380413804238043380443804538046380473804838049380503805138052380533805438055380563805738058380593806038061380623806338064380653806638067380683806938070380713807238073380743807538076380773807838079380803808138082380833808438085380863808738088380893809038091380923809338094380953809638097380983809938100381013810238103381043810538106381073810838109381103811138112381133811438115381163811738118381193812038121381223812338124381253812638127381283812938130381313813238133381343813538136381373813838139381403814138142381433814438145381463814738148381493815038151381523815338154381553815638157381583815938160381613816238163381643816538166381673816838169381703817138172381733817438175381763817738178381793818038181381823818338184381853818638187381883818938190381913819238193381943819538196381973819838199382003820138202382033820438205382063820738208382093821038211382123821338214382153821638217382183821938220382213822238223382243822538226382273822838229382303823138232382333823438235382363823738238382393824038241382423824338244382453824638247382483824938250382513825238253382543825538256382573825838259382603826138262382633826438265382663826738268382693827038271382723827338274382753827638277382783827938280382813828238283382843828538286382873828838289382903829138292382933829438295382963829738298382993830038301383023830338304383053830638307383083830938310383113831238313383143831538316383173831838319383203832138322383233832438325383263832738328383293833038331383323833338334383353833638337383383833938340383413834238343383443834538346383473834838349383503835138352383533835438355383563835738358383593836038361383623836338364383653836638367383683836938370383713837238373383743837538376383773837838379383803838138382383833838438385383863838738388383893839038391383923839338394383953839638397383983839938400384013840238403384043840538406384073840838409384103841138412384133841438415384163841738418384193842038421384223842338424384253842638427384283842938430384313843238433384343843538436384373843838439384403844138442384433844438445384463844738448384493845038451384523845338454384553845638457384583845938460384613846238463384643846538466384673846838469384703847138472384733847438475384763847738478384793848038481384823848338484384853848638487384883848938490384913849238493384943849538496384973849838499385003850138502385033850438505385063850738508385093851038511385123851338514385153851638517385183851938520385213852238523385243852538526385273852838529385303853138532385333853438535385363853738538385393854038541385423854338544385453854638547385483854938550385513855238553385543855538556385573855838559385603856138562385633856438565385663856738568385693857038571385723857338574385753857638577385783857938580385813858238583385843858538586385873858838589385903859138592385933859438595385963859738598385993860038601386023860338604386053860638607386083860938610386113861238613386143861538616386173861838619386203862138622386233862438625386263862738628386293863038631386323863338634386353863638637386383863938640386413864238643386443864538646386473864838649386503865138652386533865438655386563865738658386593866038661386623866338664386653866638667386683866938670386713867238673386743867538676386773867838679386803868138682386833868438685386863868738688386893869038691386923869338694386953869638697386983869938700387013870238703387043870538706387073870838709387103871138712387133871438715387163871738718387193872038721387223872338724387253872638727387283872938730387313873238733387343873538736387373873838739387403874138742387433874438745387463874738748387493875038751387523875338754387553875638757387583875938760387613876238763387643876538766387673876838769387703877138772387733877438775387763877738778387793878038781387823878338784387853878638787387883878938790387913879238793387943879538796387973879838799388003880138802388033880438805388063880738808388093881038811388123881338814388153881638817388183881938820388213882238823388243882538826388273882838829388303883138832388333883438835388363883738838388393884038841388423884338844388453884638847388483884938850388513885238853388543885538856388573885838859388603886138862388633886438865388663886738868388693887038871388723887338874388753887638877388783887938880388813888238883388843888538886388873888838889388903889138892388933889438895388963889738898388993890038901389023890338904389053890638907389083890938910389113891238913389143891538916389173891838919389203892138922389233892438925389263892738928389293893038931389323893338934389353893638937389383893938940389413894238943389443894538946389473894838949389503895138952389533895438955389563895738958389593896038961389623896338964389653896638967389683896938970389713897238973389743897538976389773897838979389803898138982389833898438985389863898738988389893899038991389923899338994389953899638997389983899939000390013900239003390043900539006390073900839009390103901139012390133901439015390163901739018390193902039021390223902339024390253902639027390283902939030390313903239033390343903539036390373903839039390403904139042390433904439045390463904739048390493905039051390523905339054390553905639057390583905939060390613906239063390643906539066390673906839069390703907139072390733907439075390763907739078390793908039081390823908339084390853908639087390883908939090390913909239093390943909539096390973909839099391003910139102391033910439105391063910739108391093911039111391123911339114391153911639117391183911939120391213912239123391243912539126391273912839129391303913139132391333913439135391363913739138391393914039141391423914339144391453914639147391483914939150391513915239153391543915539156391573915839159391603916139162391633916439165391663916739168391693917039171391723917339174391753917639177391783917939180391813918239183391843918539186391873918839189391903919139192391933919439195391963919739198391993920039201392023920339204392053920639207392083920939210392113921239213392143921539216392173921839219392203922139222392233922439225392263922739228392293923039231392323923339234392353923639237392383923939240392413924239243392443924539246392473924839249392503925139252392533925439255392563925739258392593926039261392623926339264392653926639267392683926939270392713927239273392743927539276392773927839279392803928139282392833928439285392863928739288392893929039291392923929339294392953929639297392983929939300393013930239303393043930539306393073930839309393103931139312393133931439315393163931739318393193932039321393223932339324393253932639327393283932939330393313933239333393343933539336393373933839339393403934139342393433934439345393463934739348393493935039351393523935339354393553935639357393583935939360393613936239363393643936539366393673936839369393703937139372393733937439375393763937739378393793938039381393823938339384393853938639387393883938939390393913939239393393943939539396393973939839399394003940139402394033940439405394063940739408394093941039411394123941339414394153941639417394183941939420394213942239423394243942539426394273942839429394303943139432394333943439435394363943739438394393944039441394423944339444394453944639447394483944939450394513945239453394543945539456394573945839459394603946139462394633946439465394663946739468394693947039471394723947339474394753947639477394783947939480394813948239483394843948539486394873948839489394903949139492394933949439495394963949739498394993950039501395023950339504395053950639507395083950939510395113951239513395143951539516395173951839519395203952139522395233952439525395263952739528395293953039531395323953339534395353953639537395383953939540395413954239543395443954539546395473954839549395503955139552395533955439555395563955739558395593956039561395623956339564395653956639567395683956939570395713957239573395743957539576395773957839579395803958139582395833958439585395863958739588395893959039591395923959339594395953959639597395983959939600396013960239603396043960539606396073960839609396103961139612396133961439615396163961739618396193962039621396223962339624396253962639627396283962939630396313963239633396343963539636396373963839639396403964139642396433964439645396463964739648396493965039651396523965339654396553965639657396583965939660396613966239663396643966539666396673966839669396703967139672396733967439675396763967739678396793968039681396823968339684396853968639687396883968939690396913969239693396943969539696396973969839699397003970139702397033970439705397063970739708397093971039711397123971339714397153971639717397183971939720397213972239723397243972539726397273972839729397303973139732397333973439735397363973739738397393974039741397423974339744397453974639747397483974939750397513975239753397543975539756397573975839759397603976139762397633976439765397663976739768397693977039771397723977339774397753977639777397783977939780397813978239783397843978539786397873978839789397903979139792397933979439795397963979739798397993980039801398023980339804398053980639807398083980939810398113981239813398143981539816398173981839819398203982139822398233982439825398263982739828398293983039831398323983339834398353983639837398383983939840398413984239843398443984539846398473984839849398503985139852398533985439855398563985739858398593986039861398623986339864398653986639867398683986939870398713987239873398743987539876398773987839879398803988139882398833988439885398863988739888398893989039891398923989339894398953989639897398983989939900399013990239903399043990539906399073990839909399103991139912399133991439915399163991739918399193992039921399223992339924399253992639927399283992939930399313993239933399343993539936399373993839939399403994139942399433994439945399463994739948399493995039951399523995339954399553995639957399583995939960399613996239963399643996539966399673996839969399703997139972399733997439975399763997739978399793998039981399823998339984399853998639987399883998939990399913999239993399943999539996399973999839999400004000140002400034000440005400064000740008400094001040011400124001340014400154001640017400184001940020400214002240023400244002540026400274002840029400304003140032400334003440035400364003740038400394004040041400424004340044400454004640047400484004940050400514005240053400544005540056400574005840059400604006140062400634006440065400664006740068400694007040071400724007340074400754007640077400784007940080400814008240083400844008540086400874008840089400904009140092400934009440095400964009740098400994010040101401024010340104401054010640107401084010940110401114011240113401144011540116401174011840119401204012140122401234012440125401264012740128401294013040131401324013340134401354013640137401384013940140401414014240143401444014540146401474014840149401504015140152401534015440155401564015740158401594016040161401624016340164401654016640167401684016940170401714017240173401744017540176401774017840179401804018140182401834018440185401864018740188401894019040191401924019340194401954019640197401984019940200402014020240203402044020540206402074020840209402104021140212402134021440215402164021740218402194022040221402224022340224402254022640227402284022940230402314023240233402344023540236402374023840239402404024140242402434024440245402464024740248402494025040251402524025340254402554025640257402584025940260402614026240263402644026540266402674026840269402704027140272402734027440275402764027740278402794028040281402824028340284402854028640287402884028940290402914029240293402944029540296402974029840299403004030140302403034030440305403064030740308403094031040311403124031340314403154031640317403184031940320403214032240323403244032540326403274032840329403304033140332403334033440335403364033740338403394034040341403424034340344403454034640347403484034940350403514035240353403544035540356403574035840359403604036140362403634036440365403664036740368403694037040371403724037340374403754037640377403784037940380403814038240383403844038540386403874038840389403904039140392403934039440395403964039740398403994040040401404024040340404404054040640407404084040940410404114041240413404144041540416404174041840419404204042140422404234042440425404264042740428404294043040431404324043340434404354043640437404384043940440404414044240443404444044540446404474044840449404504045140452404534045440455404564045740458404594046040461404624046340464404654046640467404684046940470404714047240473404744047540476404774047840479404804048140482404834048440485404864048740488404894049040491404924049340494404954049640497404984049940500405014050240503405044050540506405074050840509405104051140512405134051440515405164051740518405194052040521405224052340524405254052640527405284052940530405314053240533405344053540536405374053840539405404054140542405434054440545405464054740548405494055040551405524055340554405554055640557405584055940560405614056240563405644056540566405674056840569405704057140572405734057440575405764057740578405794058040581405824058340584405854058640587405884058940590405914059240593405944059540596405974059840599406004060140602406034060440605406064060740608406094061040611406124061340614406154061640617406184061940620406214062240623406244062540626406274062840629406304063140632406334063440635406364063740638406394064040641406424064340644406454064640647406484064940650406514065240653406544065540656406574065840659406604066140662406634066440665406664066740668406694067040671406724067340674406754067640677406784067940680406814068240683406844068540686406874068840689406904069140692406934069440695406964069740698406994070040701407024070340704407054070640707407084070940710407114071240713407144071540716407174071840719407204072140722407234072440725407264072740728407294073040731407324073340734407354073640737407384073940740407414074240743407444074540746407474074840749407504075140752407534075440755407564075740758407594076040761407624076340764407654076640767407684076940770407714077240773407744077540776407774077840779407804078140782407834078440785407864078740788407894079040791407924079340794407954079640797407984079940800408014080240803408044080540806408074080840809408104081140812408134081440815408164081740818408194082040821408224082340824408254082640827408284082940830408314083240833408344083540836408374083840839408404084140842408434084440845408464084740848408494085040851408524085340854408554085640857408584085940860408614086240863408644086540866408674086840869408704087140872408734087440875408764087740878408794088040881408824088340884408854088640887408884088940890408914089240893408944089540896408974089840899409004090140902409034090440905409064090740908409094091040911409124091340914409154091640917409184091940920409214092240923409244092540926409274092840929409304093140932409334093440935409364093740938409394094040941409424094340944409454094640947409484094940950409514095240953409544095540956409574095840959409604096140962409634096440965409664096740968409694097040971409724097340974409754097640977409784097940980409814098240983409844098540986409874098840989409904099140992409934099440995409964099740998409994100041001410024100341004410054100641007410084100941010410114101241013410144101541016410174101841019410204102141022410234102441025410264102741028410294103041031410324103341034410354103641037410384103941040410414104241043410444104541046410474104841049410504105141052410534105441055410564105741058410594106041061410624106341064410654106641067410684106941070410714107241073410744107541076410774107841079410804108141082410834108441085410864108741088410894109041091410924109341094410954109641097410984109941100411014110241103411044110541106411074110841109411104111141112411134111441115411164111741118411194112041121411224112341124411254112641127411284112941130411314113241133411344113541136411374113841139411404114141142411434114441145411464114741148411494115041151411524115341154411554115641157411584115941160411614116241163411644116541166411674116841169411704117141172411734117441175411764117741178411794118041181411824118341184411854118641187411884118941190411914119241193411944119541196411974119841199412004120141202412034120441205412064120741208412094121041211412124121341214412154121641217412184121941220412214122241223412244122541226412274122841229412304123141232412334123441235412364123741238412394124041241412424124341244412454124641247412484124941250412514125241253412544125541256412574125841259412604126141262412634126441265412664126741268412694127041271412724127341274412754127641277412784127941280412814128241283412844128541286412874128841289412904129141292412934129441295412964129741298412994130041301413024130341304413054130641307413084130941310413114131241313413144131541316413174131841319413204132141322413234132441325413264132741328413294133041331413324133341334413354133641337413384133941340413414134241343413444134541346413474134841349413504135141352413534135441355413564135741358413594136041361413624136341364413654136641367413684136941370413714137241373413744137541376413774137841379413804138141382413834138441385413864138741388413894139041391413924139341394413954139641397413984139941400414014140241403414044140541406414074140841409414104141141412414134141441415414164141741418414194142041421414224142341424414254142641427414284142941430414314143241433414344143541436414374143841439414404144141442414434144441445414464144741448414494145041451414524145341454414554145641457414584145941460414614146241463414644146541466414674146841469414704147141472414734147441475414764147741478414794148041481414824148341484414854148641487414884148941490414914149241493414944149541496414974149841499415004150141502415034150441505415064150741508415094151041511415124151341514415154151641517415184151941520415214152241523415244152541526415274152841529415304153141532415334153441535415364153741538415394154041541415424154341544415454154641547415484154941550415514155241553415544155541556415574155841559415604156141562415634156441565415664156741568415694157041571415724157341574415754157641577415784157941580415814158241583415844158541586415874158841589415904159141592415934159441595415964159741598415994160041601416024160341604416054160641607416084160941610416114161241613416144161541616416174161841619416204162141622416234162441625416264162741628416294163041631416324163341634416354163641637416384163941640416414164241643416444164541646416474164841649416504165141652416534165441655416564165741658416594166041661416624166341664416654166641667416684166941670416714167241673416744167541676416774167841679416804168141682416834168441685416864168741688416894169041691416924169341694416954169641697416984169941700417014170241703417044170541706417074170841709417104171141712417134171441715417164171741718417194172041721417224172341724417254172641727417284172941730417314173241733417344173541736417374173841739417404174141742417434174441745417464174741748417494175041751417524175341754417554175641757417584175941760417614176241763417644176541766417674176841769417704177141772417734177441775417764177741778417794178041781417824178341784417854178641787417884178941790417914179241793417944179541796417974179841799418004180141802418034180441805418064180741808418094181041811418124181341814418154181641817418184181941820418214182241823418244182541826418274182841829418304183141832418334183441835418364183741838418394184041841418424184341844418454184641847418484184941850418514185241853418544185541856418574185841859418604186141862418634186441865418664186741868418694187041871418724187341874418754187641877418784187941880418814188241883418844188541886418874188841889418904189141892418934189441895418964189741898418994190041901419024190341904419054190641907419084190941910419114191241913419144191541916419174191841919419204192141922419234192441925419264192741928419294193041931419324193341934419354193641937419384193941940419414194241943419444194541946419474194841949419504195141952419534195441955419564195741958419594196041961419624196341964419654196641967419684196941970419714197241973419744197541976419774197841979419804198141982419834198441985419864198741988419894199041991419924199341994419954199641997419984199942000420014200242003420044200542006420074200842009420104201142012420134201442015420164201742018420194202042021420224202342024420254202642027420284202942030420314203242033420344203542036420374203842039420404204142042420434204442045420464204742048420494205042051420524205342054420554205642057420584205942060420614206242063420644206542066420674206842069420704207142072420734207442075420764207742078420794208042081420824208342084420854208642087420884208942090420914209242093420944209542096420974209842099421004210142102421034210442105421064210742108421094211042111421124211342114421154211642117421184211942120421214212242123421244212542126421274212842129421304213142132421334213442135421364213742138421394214042141421424214342144421454214642147421484214942150421514215242153421544215542156421574215842159421604216142162421634216442165421664216742168421694217042171421724217342174421754217642177421784217942180421814218242183421844218542186421874218842189421904219142192421934219442195421964219742198421994220042201422024220342204422054220642207422084220942210422114221242213422144221542216422174221842219422204222142222422234222442225422264222742228422294223042231422324223342234422354223642237422384223942240422414224242243422444224542246422474224842249422504225142252422534225442255422564225742258422594226042261422624226342264422654226642267422684226942270422714227242273422744227542276422774227842279422804228142282422834228442285422864228742288422894229042291422924229342294422954229642297422984229942300423014230242303423044230542306423074230842309423104231142312423134231442315423164231742318423194232042321423224232342324423254232642327423284232942330423314233242333423344233542336423374233842339423404234142342423434234442345423464234742348423494235042351423524235342354423554235642357423584235942360423614236242363423644236542366423674236842369423704237142372423734237442375423764237742378423794238042381423824238342384423854238642387423884238942390423914239242393423944239542396423974239842399424004240142402424034240442405424064240742408424094241042411424124241342414424154241642417424184241942420424214242242423424244242542426424274242842429424304243142432424334243442435424364243742438424394244042441424424244342444424454244642447424484244942450424514245242453424544245542456424574245842459424604246142462424634246442465424664246742468424694247042471424724247342474424754247642477424784247942480424814248242483424844248542486424874248842489424904249142492424934249442495424964249742498424994250042501425024250342504425054250642507425084250942510425114251242513425144251542516425174251842519425204252142522425234252442525425264252742528425294253042531425324253342534425354253642537425384253942540425414254242543425444254542546425474254842549425504255142552425534255442555425564255742558425594256042561425624256342564425654256642567425684256942570425714257242573425744257542576425774257842579425804258142582425834258442585425864258742588425894259042591425924259342594425954259642597425984259942600426014260242603426044260542606426074260842609426104261142612426134261442615426164261742618426194262042621426224262342624426254262642627426284262942630426314263242633426344263542636426374263842639426404264142642426434264442645426464264742648426494265042651426524265342654426554265642657426584265942660426614266242663426644266542666426674266842669426704267142672426734267442675426764267742678426794268042681426824268342684426854268642687426884268942690426914269242693426944269542696426974269842699427004270142702427034270442705427064270742708427094271042711427124271342714427154271642717427184271942720427214272242723427244272542726427274272842729427304273142732427334273442735427364273742738427394274042741427424274342744427454274642747427484274942750427514275242753427544275542756427574275842759427604276142762427634276442765427664276742768427694277042771427724277342774427754277642777427784277942780427814278242783427844278542786427874278842789427904279142792427934279442795427964279742798427994280042801428024280342804428054280642807428084280942810428114281242813428144281542816428174281842819428204282142822428234282442825428264282742828428294283042831428324283342834428354283642837428384283942840428414284242843428444284542846428474284842849428504285142852428534285442855428564285742858428594286042861428624286342864428654286642867428684286942870428714287242873428744287542876428774287842879428804288142882428834288442885428864288742888428894289042891428924289342894428954289642897428984289942900429014290242903429044290542906429074290842909429104291142912429134291442915429164291742918429194292042921429224292342924429254292642927429284292942930429314293242933429344293542936429374293842939429404294142942429434294442945429464294742948429494295042951429524295342954429554295642957429584295942960429614296242963429644296542966429674296842969429704297142972429734297442975429764297742978429794298042981429824298342984429854298642987429884298942990429914299242993429944299542996429974299842999430004300143002430034300443005430064300743008430094301043011430124301343014430154301643017430184301943020430214302243023430244302543026430274302843029430304303143032430334303443035430364303743038430394304043041430424304343044430454304643047430484304943050430514305243053430544305543056430574305843059430604306143062430634306443065430664306743068430694307043071430724307343074430754307643077430784307943080430814308243083430844308543086430874308843089430904309143092430934309443095430964309743098430994310043101431024310343104431054310643107431084310943110431114311243113431144311543116431174311843119431204312143122431234312443125431264312743128431294313043131431324313343134431354313643137431384313943140431414314243143431444314543146431474314843149431504315143152431534315443155431564315743158431594316043161431624316343164431654316643167431684316943170431714317243173431744317543176431774317843179431804318143182431834318443185431864318743188431894319043191431924319343194431954319643197431984319943200432014320243203432044320543206432074320843209432104321143212432134321443215432164321743218432194322043221432224322343224432254322643227432284322943230432314323243233432344323543236432374323843239432404324143242432434324443245432464324743248432494325043251432524325343254432554325643257432584325943260432614326243263432644326543266432674326843269432704327143272432734327443275432764327743278432794328043281432824328343284432854328643287432884328943290432914329243293432944329543296432974329843299433004330143302433034330443305433064330743308433094331043311433124331343314433154331643317433184331943320433214332243323433244332543326433274332843329433304333143332433334333443335433364333743338433394334043341433424334343344433454334643347433484334943350433514335243353433544335543356433574335843359433604336143362433634336443365433664336743368433694337043371433724337343374433754337643377433784337943380433814338243383433844338543386433874338843389433904339143392433934339443395433964339743398433994340043401434024340343404434054340643407434084340943410434114341243413434144341543416434174341843419434204342143422434234342443425434264342743428434294343043431434324343343434434354343643437434384343943440434414344243443434444344543446434474344843449434504345143452434534345443455434564345743458434594346043461434624346343464434654346643467434684346943470434714347243473434744347543476434774347843479434804348143482434834348443485434864348743488434894349043491434924349343494434954349643497434984349943500435014350243503435044350543506435074350843509435104351143512435134351443515435164351743518435194352043521435224352343524435254352643527435284352943530435314353243533435344353543536435374353843539435404354143542435434354443545435464354743548435494355043551435524355343554435554355643557435584355943560435614356243563435644356543566435674356843569435704357143572435734357443575435764357743578435794358043581435824358343584435854358643587435884358943590435914359243593435944359543596435974359843599436004360143602436034360443605436064360743608436094361043611436124361343614436154361643617436184361943620436214362243623436244362543626436274362843629436304363143632436334363443635436364363743638436394364043641436424364343644436454364643647436484364943650436514365243653436544365543656436574365843659436604366143662436634366443665436664366743668436694367043671436724367343674436754367643677436784367943680436814368243683436844368543686436874368843689436904369143692436934369443695436964369743698436994370043701437024370343704437054370643707437084370943710437114371243713437144371543716437174371843719437204372143722437234372443725437264372743728437294373043731437324373343734437354373643737437384373943740437414374243743437444374543746437474374843749437504375143752437534375443755437564375743758437594376043761437624376343764437654376643767437684376943770437714377243773437744377543776437774377843779437804378143782437834378443785437864378743788437894379043791437924379343794437954379643797437984379943800438014380243803438044380543806438074380843809438104381143812438134381443815438164381743818438194382043821438224382343824438254382643827438284382943830438314383243833438344383543836438374383843839438404384143842438434384443845438464384743848438494385043851438524385343854438554385643857438584385943860438614386243863438644386543866438674386843869438704387143872438734387443875438764387743878438794388043881438824388343884438854388643887438884388943890438914389243893438944389543896438974389843899439004390143902439034390443905439064390743908439094391043911439124391343914439154391643917439184391943920439214392243923439244392543926439274392843929439304393143932439334393443935439364393743938439394394043941439424394343944439454394643947439484394943950439514395243953439544395543956439574395843959439604396143962439634396443965439664396743968439694397043971439724397343974439754397643977439784397943980439814398243983439844398543986439874398843989439904399143992439934399443995439964399743998439994400044001440024400344004440054400644007440084400944010440114401244013440144401544016440174401844019440204402144022440234402444025440264402744028440294403044031440324403344034440354403644037440384403944040440414404244043440444404544046440474404844049440504405144052440534405444055440564405744058440594406044061440624406344064440654406644067440684406944070440714407244073440744407544076440774407844079440804408144082440834408444085440864408744088440894409044091440924409344094440954409644097440984409944100441014410244103441044410544106441074410844109441104411144112441134411444115441164411744118441194412044121441224412344124441254412644127441284412944130441314413244133441344413544136441374413844139441404414144142441434414444145441464414744148441494415044151441524415344154441554415644157441584415944160441614416244163441644416544166441674416844169441704417144172441734417444175441764417744178441794418044181441824418344184441854418644187441884418944190441914419244193441944419544196441974419844199442004420144202442034420444205442064420744208442094421044211442124421344214442154421644217442184421944220442214422244223442244422544226442274422844229442304423144232442334423444235442364423744238442394424044241442424424344244442454424644247442484424944250442514425244253442544425544256442574425844259442604426144262442634426444265442664426744268442694427044271442724427344274442754427644277442784427944280442814428244283442844428544286442874428844289442904429144292442934429444295442964429744298442994430044301443024430344304443054430644307443084430944310443114431244313443144431544316443174431844319443204432144322443234432444325443264432744328443294433044331443324433344334443354433644337443384433944340443414434244343443444434544346443474434844349443504435144352443534435444355443564435744358443594436044361443624436344364443654436644367443684436944370443714437244373443744437544376443774437844379443804438144382443834438444385443864438744388443894439044391443924439344394443954439644397443984439944400444014440244403444044440544406444074440844409444104441144412444134441444415444164441744418444194442044421444224442344424444254442644427444284442944430444314443244433444344443544436444374443844439444404444144442444434444444445444464444744448444494445044451444524445344454444554445644457444584445944460444614446244463444644446544466444674446844469444704447144472444734447444475444764447744478444794448044481444824448344484444854448644487444884448944490444914449244493444944449544496444974449844499445004450144502445034450444505445064450744508445094451044511445124451344514445154451644517445184451944520445214452244523445244452544526445274452844529445304453144532445334453444535445364453744538445394454044541445424454344544445454454644547445484454944550445514455244553445544455544556445574455844559445604456144562445634456444565445664456744568445694457044571445724457344574445754457644577445784457944580445814458244583445844458544586445874458844589445904459144592445934459444595445964459744598445994460044601446024460344604446054460644607446084460944610446114461244613446144461544616446174461844619446204462144622446234462444625446264462744628446294463044631446324463344634446354463644637446384463944640446414464244643446444464544646446474464844649446504465144652446534465444655446564465744658446594466044661446624466344664446654466644667446684466944670446714467244673446744467544676446774467844679446804468144682446834468444685446864468744688446894469044691446924469344694446954469644697446984469944700447014470244703447044470544706447074470844709447104471144712447134471444715447164471744718447194472044721447224472344724447254472644727447284472944730447314473244733447344473544736447374473844739447404474144742447434474444745447464474744748447494475044751447524475344754447554475644757447584475944760447614476244763447644476544766447674476844769447704477144772447734477444775447764477744778447794478044781447824478344784447854478644787447884478944790447914479244793447944479544796447974479844799448004480144802448034480444805448064480744808448094481044811448124481344814448154481644817448184481944820448214482244823448244482544826448274482844829448304483144832448334483444835448364483744838448394484044841448424484344844448454484644847448484484944850448514485244853448544485544856448574485844859448604486144862448634486444865448664486744868448694487044871448724487344874448754487644877448784487944880448814488244883448844488544886448874488844889448904489144892448934489444895448964489744898448994490044901449024490344904449054490644907449084490944910449114491244913449144491544916449174491844919449204492144922449234492444925449264492744928449294493044931449324493344934449354493644937449384493944940449414494244943449444494544946449474494844949449504495144952449534495444955449564495744958449594496044961449624496344964449654496644967449684496944970449714497244973449744497544976449774497844979449804498144982449834498444985449864498744988449894499044991449924499344994449954499644997449984499945000450014500245003450044500545006450074500845009450104501145012450134501445015450164501745018450194502045021450224502345024450254502645027450284502945030450314503245033450344503545036450374503845039450404504145042450434504445045450464504745048450494505045051450524505345054450554505645057450584505945060450614506245063450644506545066450674506845069450704507145072450734507445075450764507745078450794508045081450824508345084450854508645087450884508945090450914509245093450944509545096450974509845099451004510145102451034510445105451064510745108451094511045111451124511345114451154511645117451184511945120451214512245123451244512545126451274512845129451304513145132451334513445135451364513745138451394514045141451424514345144451454514645147451484514945150451514515245153451544515545156451574515845159451604516145162451634516445165451664516745168451694517045171451724517345174451754517645177451784517945180451814518245183451844518545186451874518845189451904519145192451934519445195451964519745198451994520045201452024520345204452054520645207452084520945210452114521245213452144521545216452174521845219452204522145222452234522445225452264522745228452294523045231452324523345234452354523645237452384523945240452414524245243452444524545246452474524845249452504525145252452534525445255452564525745258452594526045261452624526345264452654526645267452684526945270452714527245273452744527545276452774527845279452804528145282452834528445285452864528745288452894529045291452924529345294452954529645297452984529945300453014530245303453044530545306453074530845309453104531145312453134531445315453164531745318453194532045321453224532345324453254532645327453284532945330453314533245333453344533545336453374533845339453404534145342453434534445345453464534745348453494535045351453524535345354453554535645357453584535945360453614536245363453644536545366453674536845369453704537145372453734537445375453764537745378453794538045381453824538345384453854538645387453884538945390453914539245393453944539545396453974539845399454004540145402454034540445405454064540745408454094541045411454124541345414454154541645417454184541945420454214542245423454244542545426454274542845429454304543145432454334543445435454364543745438454394544045441454424544345444454454544645447454484544945450454514545245453454544545545456454574545845459454604546145462454634546445465454664546745468454694547045471454724547345474454754547645477454784547945480454814548245483454844548545486454874548845489454904549145492454934549445495454964549745498454994550045501455024550345504455054550645507455084550945510455114551245513455144551545516455174551845519455204552145522455234552445525455264552745528455294553045531455324553345534455354553645537455384553945540455414554245543455444554545546455474554845549455504555145552455534555445555455564555745558455594556045561455624556345564455654556645567455684556945570455714557245573455744557545576455774557845579455804558145582455834558445585455864558745588455894559045591455924559345594455954559645597455984559945600456014560245603456044560545606456074560845609456104561145612456134561445615456164561745618456194562045621456224562345624456254562645627456284562945630456314563245633456344563545636456374563845639456404564145642456434564445645456464564745648456494565045651456524565345654456554565645657456584565945660456614566245663456644566545666456674566845669456704567145672456734567445675456764567745678456794568045681456824568345684456854568645687456884568945690456914569245693456944569545696456974569845699457004570145702457034570445705457064570745708457094571045711457124571345714457154571645717457184571945720457214572245723457244572545726457274572845729457304573145732457334573445735457364573745738457394574045741457424574345744457454574645747457484574945750457514575245753457544575545756457574575845759457604576145762457634576445765457664576745768457694577045771457724577345774457754577645777457784577945780457814578245783457844578545786457874578845789457904579145792457934579445795457964579745798457994580045801458024580345804458054580645807458084580945810458114581245813458144581545816458174581845819458204582145822458234582445825458264582745828458294583045831458324583345834458354583645837458384583945840458414584245843458444584545846458474584845849458504585145852458534585445855458564585745858458594586045861458624586345864458654586645867458684586945870458714587245873458744587545876458774587845879458804588145882458834588445885458864588745888458894589045891458924589345894458954589645897458984589945900459014590245903459044590545906459074590845909459104591145912459134591445915459164591745918459194592045921459224592345924459254592645927459284592945930459314593245933459344593545936459374593845939459404594145942459434594445945459464594745948459494595045951459524595345954459554595645957459584595945960459614596245963459644596545966459674596845969459704597145972459734597445975459764597745978459794598045981459824598345984459854598645987459884598945990459914599245993459944599545996459974599845999460004600146002460034600446005460064600746008460094601046011460124601346014460154601646017460184601946020460214602246023460244602546026460274602846029460304603146032460334603446035460364603746038460394604046041460424604346044460454604646047460484604946050460514605246053460544605546056460574605846059460604606146062460634606446065460664606746068460694607046071460724607346074460754607646077460784607946080460814608246083460844608546086460874608846089460904609146092460934609446095460964609746098460994610046101461024610346104461054610646107461084610946110461114611246113461144611546116461174611846119461204612146122461234612446125461264612746128461294613046131461324613346134461354613646137461384613946140461414614246143461444614546146461474614846149461504615146152461534615446155461564615746158461594616046161461624616346164461654616646167461684616946170461714617246173461744617546176461774617846179461804618146182461834618446185461864618746188461894619046191461924619346194461954619646197461984619946200462014620246203462044620546206462074620846209462104621146212462134621446215462164621746218462194622046221462224622346224462254622646227462284622946230462314623246233462344623546236462374623846239462404624146242462434624446245462464624746248462494625046251462524625346254462554625646257462584625946260462614626246263462644626546266462674626846269462704627146272462734627446275462764627746278462794628046281462824628346284462854628646287462884628946290462914629246293462944629546296462974629846299463004630146302463034630446305463064630746308463094631046311463124631346314463154631646317463184631946320463214632246323463244632546326463274632846329463304633146332463334633446335463364633746338463394634046341463424634346344463454634646347463484634946350463514635246353463544635546356463574635846359463604636146362463634636446365463664636746368463694637046371463724637346374463754637646377463784637946380463814638246383463844638546386463874638846389463904639146392463934639446395463964639746398463994640046401464024640346404464054640646407464084640946410464114641246413464144641546416464174641846419464204642146422464234642446425464264642746428464294643046431464324643346434464354643646437464384643946440464414644246443464444644546446464474644846449464504645146452464534645446455464564645746458464594646046461464624646346464464654646646467464684646946470464714647246473464744647546476464774647846479464804648146482464834648446485464864648746488464894649046491464924649346494464954649646497464984649946500465014650246503465044650546506465074650846509465104651146512465134651446515465164651746518465194652046521465224652346524465254652646527465284652946530465314653246533465344653546536465374653846539465404654146542465434654446545465464654746548465494655046551465524655346554465554655646557465584655946560465614656246563465644656546566465674656846569465704657146572465734657446575465764657746578465794658046581465824658346584465854658646587465884658946590465914659246593465944659546596465974659846599466004660146602466034660446605466064660746608466094661046611466124661346614466154661646617466184661946620466214662246623466244662546626466274662846629466304663146632466334663446635466364663746638466394664046641466424664346644466454664646647466484664946650466514665246653466544665546656466574665846659466604666146662466634666446665466664666746668466694667046671466724667346674466754667646677466784667946680466814668246683466844668546686466874668846689466904669146692466934669446695466964669746698466994670046701467024670346704467054670646707467084670946710467114671246713467144671546716467174671846719467204672146722467234672446725467264672746728467294673046731467324673346734467354673646737467384673946740467414674246743467444674546746467474674846749467504675146752467534675446755467564675746758467594676046761467624676346764467654676646767467684676946770467714677246773467744677546776467774677846779467804678146782467834678446785467864678746788467894679046791467924679346794467954679646797467984679946800468014680246803468044680546806468074680846809468104681146812468134681446815468164681746818468194682046821468224682346824468254682646827468284682946830468314683246833468344683546836468374683846839468404684146842468434684446845468464684746848468494685046851468524685346854468554685646857468584685946860468614686246863468644686546866468674686846869468704687146872468734687446875468764687746878468794688046881468824688346884468854688646887468884688946890468914689246893468944689546896468974689846899469004690146902469034690446905469064690746908469094691046911469124691346914469154691646917469184691946920469214692246923469244692546926469274692846929469304693146932469334693446935469364693746938469394694046941469424694346944469454694646947469484694946950469514695246953469544695546956469574695846959469604696146962469634696446965469664696746968469694697046971469724697346974469754697646977469784697946980469814698246983469844698546986469874698846989469904699146992469934699446995469964699746998469994700047001470024700347004470054700647007470084700947010470114701247013470144701547016470174701847019470204702147022470234702447025470264702747028470294703047031470324703347034470354703647037470384703947040470414704247043470444704547046470474704847049470504705147052470534705447055470564705747058470594706047061470624706347064470654706647067470684706947070470714707247073470744707547076470774707847079470804708147082470834708447085470864708747088470894709047091470924709347094470954709647097470984709947100471014710247103471044710547106471074710847109471104711147112471134711447115471164711747118471194712047121471224712347124471254712647127471284712947130471314713247133471344713547136471374713847139471404714147142471434714447145471464714747148471494715047151471524715347154471554715647157471584715947160471614716247163471644716547166471674716847169471704717147172471734717447175471764717747178471794718047181471824718347184471854718647187471884718947190471914719247193471944719547196471974719847199472004720147202472034720447205472064720747208472094721047211472124721347214472154721647217472184721947220472214722247223472244722547226472274722847229472304723147232472334723447235472364723747238472394724047241472424724347244472454724647247472484724947250472514725247253472544725547256472574725847259472604726147262472634726447265472664726747268472694727047271472724727347274472754727647277472784727947280472814728247283472844728547286472874728847289472904729147292472934729447295472964729747298472994730047301473024730347304473054730647307473084730947310473114731247313473144731547316473174731847319473204732147322473234732447325473264732747328473294733047331473324733347334473354733647337473384733947340473414734247343473444734547346473474734847349473504735147352473534735447355473564735747358473594736047361473624736347364473654736647367473684736947370473714737247373473744737547376473774737847379473804738147382473834738447385473864738747388473894739047391473924739347394473954739647397473984739947400474014740247403474044740547406474074740847409474104741147412474134741447415474164741747418474194742047421474224742347424474254742647427474284742947430474314743247433474344743547436474374743847439474404744147442474434744447445474464744747448474494745047451474524745347454474554745647457474584745947460474614746247463474644746547466474674746847469474704747147472474734747447475474764747747478474794748047481474824748347484474854748647487474884748947490474914749247493474944749547496474974749847499475004750147502475034750447505475064750747508475094751047511475124751347514475154751647517475184751947520475214752247523475244752547526475274752847529475304753147532475334753447535475364753747538475394754047541475424754347544475454754647547475484754947550475514755247553475544755547556475574755847559475604756147562475634756447565475664756747568475694757047571475724757347574475754757647577475784757947580475814758247583475844758547586475874758847589475904759147592475934759447595475964759747598475994760047601476024760347604476054760647607476084760947610476114761247613476144761547616476174761847619476204762147622476234762447625476264762747628476294763047631476324763347634476354763647637476384763947640476414764247643476444764547646476474764847649476504765147652476534765447655476564765747658476594766047661476624766347664476654766647667476684766947670476714767247673476744767547676476774767847679476804768147682476834768447685476864768747688476894769047691476924769347694476954769647697476984769947700477014770247703477044770547706477074770847709477104771147712477134771447715477164771747718477194772047721477224772347724477254772647727477284772947730477314773247733477344773547736477374773847739477404774147742477434774447745477464774747748477494775047751477524775347754477554775647757477584775947760477614776247763477644776547766477674776847769477704777147772477734777447775477764777747778477794778047781477824778347784477854778647787477884778947790477914779247793477944779547796477974779847799478004780147802478034780447805478064780747808478094781047811478124781347814478154781647817478184781947820478214782247823478244782547826478274782847829478304783147832478334783447835478364783747838478394784047841478424784347844478454784647847478484784947850478514785247853478544785547856478574785847859478604786147862478634786447865478664786747868478694787047871478724787347874478754787647877478784787947880478814788247883478844788547886478874788847889478904789147892478934789447895478964789747898478994790047901479024790347904479054790647907479084790947910479114791247913479144791547916479174791847919479204792147922479234792447925479264792747928479294793047931479324793347934479354793647937479384793947940479414794247943479444794547946479474794847949479504795147952479534795447955479564795747958479594796047961479624796347964479654796647967479684796947970479714797247973479744797547976479774797847979479804798147982479834798447985479864798747988479894799047991479924799347994479954799647997479984799948000480014800248003480044800548006480074800848009480104801148012480134801448015480164801748018480194802048021480224802348024480254802648027480284802948030480314803248033480344803548036480374803848039480404804148042480434804448045480464804748048480494805048051480524805348054480554805648057480584805948060480614806248063480644806548066480674806848069480704807148072480734807448075480764807748078480794808048081480824808348084480854808648087480884808948090480914809248093480944809548096480974809848099481004810148102481034810448105481064810748108481094811048111481124811348114481154811648117481184811948120481214812248123481244812548126481274812848129481304813148132481334813448135481364813748138481394814048141481424814348144481454814648147481484814948150481514815248153481544815548156481574815848159481604816148162481634816448165481664816748168481694817048171481724817348174481754817648177481784817948180481814818248183481844818548186481874818848189481904819148192481934819448195481964819748198481994820048201482024820348204482054820648207482084820948210482114821248213482144821548216482174821848219482204822148222482234822448225482264822748228482294823048231482324823348234482354823648237482384823948240482414824248243482444824548246482474824848249482504825148252482534825448255482564825748258482594826048261482624826348264482654826648267482684826948270482714827248273482744827548276482774827848279482804828148282482834828448285482864828748288482894829048291482924829348294482954829648297482984829948300483014830248303483044830548306483074830848309483104831148312483134831448315483164831748318483194832048321483224832348324483254832648327483284832948330483314833248333483344833548336483374833848339483404834148342483434834448345483464834748348483494835048351483524835348354483554835648357483584835948360483614836248363483644836548366483674836848369483704837148372483734837448375483764837748378483794838048381483824838348384483854838648387483884838948390483914839248393483944839548396483974839848399484004840148402484034840448405484064840748408484094841048411484124841348414484154841648417484184841948420484214842248423484244842548426484274842848429484304843148432484334843448435484364843748438484394844048441484424844348444484454844648447484484844948450484514845248453484544845548456484574845848459484604846148462484634846448465484664846748468484694847048471484724847348474484754847648477484784847948480484814848248483484844848548486484874848848489484904849148492484934849448495484964849748498484994850048501485024850348504485054850648507485084850948510485114851248513485144851548516485174851848519485204852148522485234852448525485264852748528485294853048531485324853348534485354853648537485384853948540485414854248543485444854548546485474854848549485504855148552485534855448555485564855748558485594856048561485624856348564485654856648567485684856948570485714857248573485744857548576485774857848579485804858148582485834858448585485864858748588485894859048591485924859348594485954859648597485984859948600486014860248603486044860548606486074860848609486104861148612486134861448615486164861748618486194862048621486224862348624486254862648627486284862948630486314863248633486344863548636486374863848639486404864148642486434864448645486464864748648486494865048651486524865348654486554865648657486584865948660486614866248663486644866548666486674866848669486704867148672486734867448675486764867748678486794868048681486824868348684486854868648687486884868948690486914869248693486944869548696486974869848699487004870148702487034870448705487064870748708487094871048711487124871348714487154871648717487184871948720487214872248723487244872548726487274872848729487304873148732487334873448735487364873748738487394874048741487424874348744487454874648747487484874948750487514875248753487544875548756487574875848759487604876148762487634876448765487664876748768487694877048771487724877348774487754877648777487784877948780487814878248783487844878548786487874878848789487904879148792487934879448795487964879748798487994880048801488024880348804488054880648807488084880948810488114881248813488144881548816488174881848819488204882148822488234882448825488264882748828488294883048831488324883348834488354883648837488384883948840488414884248843488444884548846488474884848849488504885148852488534885448855488564885748858488594886048861488624886348864488654886648867488684886948870488714887248873488744887548876488774887848879488804888148882488834888448885488864888748888488894889048891488924889348894488954889648897488984889948900489014890248903489044890548906489074890848909489104891148912489134891448915489164891748918489194892048921489224892348924489254892648927489284892948930489314893248933489344893548936489374893848939489404894148942489434894448945489464894748948489494895048951489524895348954489554895648957489584895948960489614896248963489644896548966489674896848969489704897148972489734897448975489764897748978489794898048981489824898348984489854898648987489884898948990489914899248993489944899548996489974899848999490004900149002490034900449005490064900749008490094901049011490124901349014490154901649017490184901949020490214902249023490244902549026490274902849029490304903149032490334903449035490364903749038490394904049041490424904349044490454904649047490484904949050490514905249053490544905549056490574905849059490604906149062490634906449065490664906749068490694907049071490724907349074490754907649077490784907949080490814908249083490844908549086490874908849089490904909149092490934909449095490964909749098490994910049101491024910349104491054910649107491084910949110491114911249113491144911549116491174911849119491204912149122491234912449125491264912749128491294913049131491324913349134491354913649137491384913949140491414914249143491444914549146491474914849149491504915149152491534915449155491564915749158491594916049161491624916349164491654916649167491684916949170491714917249173491744917549176491774917849179491804918149182491834918449185491864918749188491894919049191491924919349194491954919649197491984919949200492014920249203492044920549206492074920849209492104921149212492134921449215492164921749218492194922049221492224922349224492254922649227492284922949230492314923249233492344923549236492374923849239492404924149242492434924449245492464924749248492494925049251492524925349254492554925649257492584925949260492614926249263492644926549266492674926849269492704927149272492734927449275492764927749278492794928049281492824928349284492854928649287492884928949290492914929249293492944929549296492974929849299493004930149302493034930449305493064930749308493094931049311493124931349314493154931649317493184931949320493214932249323493244932549326493274932849329493304933149332493334933449335493364933749338493394934049341493424934349344493454934649347493484934949350493514935249353493544935549356493574935849359493604936149362493634936449365493664936749368493694937049371493724937349374493754937649377493784937949380493814938249383493844938549386493874938849389493904939149392493934939449395493964939749398493994940049401494024940349404494054940649407494084940949410494114941249413494144941549416494174941849419494204942149422494234942449425494264942749428494294943049431494324943349434494354943649437494384943949440494414944249443494444944549446494474944849449494504945149452494534945449455494564945749458494594946049461494624946349464494654946649467494684946949470494714947249473494744947549476494774947849479494804948149482494834948449485494864948749488494894949049491494924949349494494954949649497494984949949500495014950249503495044950549506495074950849509495104951149512495134951449515495164951749518495194952049521495224952349524495254952649527495284952949530495314953249533495344953549536495374953849539495404954149542495434954449545495464954749548495494955049551495524955349554495554955649557495584955949560495614956249563495644956549566495674956849569495704957149572495734957449575495764957749578495794958049581495824958349584495854958649587495884958949590495914959249593495944959549596495974959849599496004960149602496034960449605496064960749608496094961049611496124961349614496154961649617496184961949620496214962249623496244962549626496274962849629496304963149632496334963449635496364963749638496394964049641496424964349644496454964649647496484964949650496514965249653496544965549656496574965849659496604966149662496634966449665496664966749668496694967049671496724967349674496754967649677496784967949680496814968249683496844968549686496874968849689496904969149692496934969449695496964969749698496994970049701497024970349704497054970649707497084970949710497114971249713497144971549716497174971849719497204972149722497234972449725497264972749728497294973049731497324973349734497354973649737497384973949740497414974249743497444974549746497474974849749497504975149752497534975449755497564975749758497594976049761497624976349764497654976649767497684976949770497714977249773497744977549776497774977849779497804978149782497834978449785497864978749788497894979049791497924979349794497954979649797497984979949800498014980249803498044980549806498074980849809498104981149812498134981449815498164981749818498194982049821498224982349824498254982649827498284982949830498314983249833498344983549836498374983849839498404984149842498434984449845498464984749848498494985049851498524985349854498554985649857498584985949860498614986249863498644986549866498674986849869498704987149872498734987449875498764987749878498794988049881498824988349884498854988649887498884988949890498914989249893498944989549896498974989849899499004990149902499034990449905499064990749908499094991049911499124991349914499154991649917499184991949920499214992249923499244992549926499274992849929499304993149932499334993449935499364993749938499394994049941499424994349944499454994649947499484994949950499514995249953499544995549956499574995849959499604996149962499634996449965499664996749968499694997049971499724997349974499754997649977499784997949980499814998249983499844998549986499874998849989499904999149992499934999449995499964999749998499995000050001500025000350004500055000650007500085000950010500115001250013500145001550016500175001850019500205002150022500235002450025500265002750028500295003050031500325003350034500355003650037500385003950040500415004250043500445004550046500475004850049500505005150052500535005450055500565005750058500595006050061500625006350064500655006650067500685006950070500715007250073500745007550076500775007850079500805008150082500835008450085500865008750088500895009050091500925009350094500955009650097500985009950100501015010250103501045010550106501075010850109501105011150112501135011450115501165011750118501195012050121501225012350124501255012650127501285012950130501315013250133501345013550136501375013850139501405014150142501435014450145501465014750148501495015050151501525015350154501555015650157501585015950160501615016250163501645016550166501675016850169501705017150172501735017450175501765017750178501795018050181501825018350184501855018650187501885018950190501915019250193501945019550196501975019850199502005020150202502035020450205502065020750208502095021050211502125021350214502155021650217502185021950220502215022250223502245022550226502275022850229502305023150232502335023450235502365023750238502395024050241502425024350244502455024650247502485024950250502515025250253502545025550256502575025850259502605026150262502635026450265502665026750268502695027050271502725027350274502755027650277502785027950280502815028250283502845028550286502875028850289502905029150292502935029450295502965029750298502995030050301503025030350304503055030650307503085030950310503115031250313503145031550316503175031850319503205032150322503235032450325503265032750328503295033050331503325033350334503355033650337503385033950340503415034250343503445034550346503475034850349503505035150352503535035450355503565035750358503595036050361503625036350364503655036650367503685036950370503715037250373503745037550376503775037850379503805038150382503835038450385503865038750388503895039050391503925039350394503955039650397503985039950400504015040250403504045040550406504075040850409504105041150412504135041450415504165041750418504195042050421504225042350424504255042650427504285042950430504315043250433504345043550436504375043850439504405044150442504435044450445504465044750448504495045050451504525045350454504555045650457504585045950460504615046250463504645046550466504675046850469504705047150472504735047450475504765047750478504795048050481504825048350484504855048650487504885048950490504915049250493504945049550496504975049850499505005050150502505035050450505505065050750508505095051050511505125051350514505155051650517505185051950520505215052250523505245052550526505275052850529505305053150532505335053450535505365053750538505395054050541505425054350544505455054650547505485054950550505515055250553505545055550556505575055850559505605056150562505635056450565505665056750568505695057050571505725057350574505755057650577505785057950580505815058250583505845058550586505875058850589505905059150592505935059450595505965059750598505995060050601506025060350604506055060650607506085060950610506115061250613506145061550616506175061850619506205062150622506235062450625506265062750628506295063050631506325063350634506355063650637506385063950640506415064250643506445064550646506475064850649506505065150652506535065450655506565065750658506595066050661506625066350664506655066650667506685066950670506715067250673506745067550676506775067850679506805068150682506835068450685506865068750688506895069050691506925069350694506955069650697506985069950700507015070250703507045070550706507075070850709507105071150712507135071450715507165071750718507195072050721507225072350724507255072650727507285072950730507315073250733507345073550736507375073850739507405074150742507435074450745507465074750748507495075050751507525075350754507555075650757507585075950760507615076250763507645076550766507675076850769507705077150772507735077450775507765077750778507795078050781507825078350784507855078650787507885078950790507915079250793507945079550796507975079850799508005080150802508035080450805508065080750808508095081050811508125081350814508155081650817508185081950820508215082250823508245082550826508275082850829508305083150832508335083450835508365083750838508395084050841508425084350844508455084650847508485084950850508515085250853508545085550856508575085850859508605086150862508635086450865508665086750868508695087050871508725087350874508755087650877508785087950880508815088250883508845088550886508875088850889508905089150892508935089450895508965089750898508995090050901509025090350904509055090650907509085090950910509115091250913509145091550916509175091850919509205092150922509235092450925509265092750928509295093050931509325093350934509355093650937509385093950940509415094250943509445094550946509475094850949509505095150952509535095450955509565095750958509595096050961509625096350964509655096650967509685096950970509715097250973509745097550976509775097850979509805098150982509835098450985509865098750988509895099050991509925099350994509955099650997509985099951000510015100251003510045100551006510075100851009510105101151012510135101451015510165101751018510195102051021510225102351024510255102651027510285102951030510315103251033510345103551036510375103851039510405104151042510435104451045510465104751048510495105051051510525105351054510555105651057510585105951060510615106251063510645106551066510675106851069510705107151072510735107451075510765107751078510795108051081510825108351084510855108651087510885108951090510915109251093510945109551096510975109851099511005110151102511035110451105511065110751108511095111051111511125111351114511155111651117511185111951120511215112251123511245112551126511275112851129511305113151132511335113451135511365113751138511395114051141511425114351144511455114651147511485114951150511515115251153511545115551156511575115851159511605116151162511635116451165511665116751168511695117051171511725117351174511755117651177511785117951180511815118251183511845118551186511875118851189511905119151192511935119451195511965119751198511995120051201512025120351204512055120651207512085120951210512115121251213512145121551216512175121851219512205122151222512235122451225512265122751228512295123051231512325123351234512355123651237512385123951240512415124251243512445124551246512475124851249512505125151252512535125451255512565125751258512595126051261512625126351264512655126651267512685126951270512715127251273512745127551276512775127851279512805128151282512835128451285512865128751288512895129051291512925129351294512955129651297512985129951300513015130251303513045130551306513075130851309513105131151312513135131451315513165131751318513195132051321513225132351324513255132651327513285132951330513315133251333513345133551336513375133851339513405134151342513435134451345513465134751348513495135051351513525135351354513555135651357513585135951360513615136251363513645136551366513675136851369513705137151372513735137451375513765137751378513795138051381513825138351384513855138651387513885138951390513915139251393513945139551396513975139851399514005140151402514035140451405514065140751408514095141051411514125141351414514155141651417514185141951420514215142251423514245142551426514275142851429514305143151432514335143451435514365143751438514395144051441514425144351444514455144651447514485144951450514515145251453514545145551456514575145851459514605146151462514635146451465514665146751468514695147051471514725147351474514755147651477514785147951480514815148251483514845148551486514875148851489514905149151492514935149451495514965149751498514995150051501515025150351504515055150651507515085150951510515115151251513515145151551516515175151851519515205152151522515235152451525515265152751528515295153051531515325153351534515355153651537515385153951540515415154251543515445154551546515475154851549515505155151552515535155451555515565155751558515595156051561515625156351564515655156651567515685156951570515715157251573515745157551576515775157851579515805158151582515835158451585515865158751588515895159051591515925159351594515955159651597515985159951600516015160251603516045160551606516075160851609516105161151612516135161451615516165161751618516195162051621516225162351624516255162651627516285162951630516315163251633516345163551636516375163851639516405164151642516435164451645516465164751648516495165051651516525165351654516555165651657516585165951660516615166251663516645166551666516675166851669516705167151672516735167451675516765167751678516795168051681516825168351684516855168651687516885168951690516915169251693516945169551696516975169851699517005170151702517035170451705517065170751708517095171051711517125171351714517155171651717517185171951720517215172251723517245172551726517275172851729517305173151732517335173451735517365173751738517395174051741517425174351744517455174651747517485174951750517515175251753517545175551756517575175851759517605176151762517635176451765517665176751768517695177051771517725177351774517755177651777517785177951780517815178251783517845178551786517875178851789517905179151792517935179451795517965179751798517995180051801518025180351804518055180651807518085180951810518115181251813518145181551816518175181851819518205182151822518235182451825518265182751828518295183051831518325183351834518355183651837518385183951840518415184251843518445184551846518475184851849518505185151852518535185451855518565185751858518595186051861518625186351864518655186651867518685186951870518715187251873518745187551876518775187851879518805188151882518835188451885518865188751888518895189051891518925189351894518955189651897518985189951900519015190251903519045190551906519075190851909519105191151912519135191451915519165191751918519195192051921519225192351924519255192651927519285192951930519315193251933519345193551936519375193851939519405194151942519435194451945519465194751948519495195051951519525195351954519555195651957519585195951960519615196251963519645196551966519675196851969519705197151972519735197451975519765197751978519795198051981519825198351984519855198651987519885198951990519915199251993519945199551996519975199851999520005200152002520035200452005520065200752008520095201052011520125201352014520155201652017520185201952020520215202252023520245202552026520275202852029520305203152032520335203452035520365203752038520395204052041520425204352044520455204652047520485204952050520515205252053520545205552056520575205852059520605206152062520635206452065520665206752068520695207052071520725207352074520755207652077520785207952080520815208252083520845208552086520875208852089520905209152092520935209452095520965209752098520995210052101521025210352104521055210652107521085210952110521115211252113521145211552116521175211852119521205212152122521235212452125521265212752128521295213052131521325213352134521355213652137521385213952140521415214252143521445214552146521475214852149521505215152152521535215452155521565215752158521595216052161521625216352164521655216652167521685216952170521715217252173521745217552176521775217852179521805218152182521835218452185521865218752188521895219052191521925219352194521955219652197521985219952200522015220252203522045220552206522075220852209522105221152212522135221452215522165221752218522195222052221522225222352224522255222652227522285222952230522315223252233522345223552236522375223852239522405224152242522435224452245522465224752248522495225052251522525225352254522555225652257522585225952260522615226252263522645226552266522675226852269522705227152272522735227452275522765227752278522795228052281522825228352284522855228652287522885228952290522915229252293522945229552296522975229852299523005230152302523035230452305523065230752308523095231052311523125231352314523155231652317523185231952320523215232252323523245232552326523275232852329523305233152332523335233452335523365233752338523395234052341523425234352344523455234652347523485234952350523515235252353523545235552356523575235852359523605236152362523635236452365523665236752368523695237052371523725237352374523755237652377523785237952380523815238252383523845238552386523875238852389523905239152392523935239452395523965239752398523995240052401524025240352404524055240652407524085240952410524115241252413524145241552416524175241852419524205242152422524235242452425524265242752428524295243052431524325243352434524355243652437524385243952440524415244252443524445244552446524475244852449524505245152452524535245452455524565245752458524595246052461524625246352464524655246652467524685246952470524715247252473524745247552476524775247852479524805248152482524835248452485524865248752488524895249052491524925249352494524955249652497524985249952500525015250252503525045250552506525075250852509525105251152512525135251452515525165251752518525195252052521525225252352524525255252652527525285252952530525315253252533525345253552536525375253852539525405254152542525435254452545525465254752548525495255052551525525255352554525555255652557525585255952560525615256252563525645256552566525675256852569525705257152572525735257452575525765257752578525795258052581525825258352584525855258652587525885258952590525915259252593525945259552596525975259852599526005260152602526035260452605526065260752608526095261052611526125261352614526155261652617526185261952620526215262252623526245262552626526275262852629526305263152632526335263452635526365263752638526395264052641526425264352644526455264652647526485264952650526515265252653526545265552656526575265852659526605266152662526635266452665526665266752668526695267052671526725267352674526755267652677526785267952680526815268252683526845268552686526875268852689526905269152692526935269452695526965269752698526995270052701527025270352704527055270652707527085270952710527115271252713527145271552716527175271852719527205272152722527235272452725527265272752728527295273052731527325273352734527355273652737527385273952740527415274252743527445274552746527475274852749527505275152752527535275452755527565275752758527595276052761527625276352764527655276652767527685276952770527715277252773527745277552776527775277852779527805278152782527835278452785527865278752788527895279052791527925279352794527955279652797527985279952800528015280252803528045280552806528075280852809528105281152812528135281452815528165281752818528195282052821528225282352824528255282652827528285282952830528315283252833528345283552836528375283852839528405284152842528435284452845528465284752848528495285052851528525285352854528555285652857528585285952860528615286252863528645286552866528675286852869528705287152872528735287452875528765287752878528795288052881528825288352884528855288652887528885288952890528915289252893528945289552896528975289852899529005290152902529035290452905529065290752908529095291052911529125291352914529155291652917529185291952920529215292252923529245292552926529275292852929529305293152932529335293452935529365293752938529395294052941529425294352944529455294652947529485294952950529515295252953529545295552956529575295852959529605296152962529635296452965529665296752968529695297052971529725297352974529755297652977529785297952980529815298252983529845298552986529875298852989529905299152992529935299452995529965299752998529995300053001530025300353004530055300653007530085300953010530115301253013530145301553016530175301853019530205302153022530235302453025530265302753028530295303053031530325303353034530355303653037530385303953040530415304253043530445304553046530475304853049530505305153052530535305453055530565305753058530595306053061530625306353064530655306653067530685306953070530715307253073530745307553076530775307853079530805308153082530835308453085530865308753088530895309053091530925309353094530955309653097530985309953100531015310253103531045310553106531075310853109531105311153112531135311453115531165311753118531195312053121531225312353124531255312653127531285312953130531315313253133531345313553136531375313853139531405314153142531435314453145531465314753148531495315053151531525315353154531555315653157531585315953160531615316253163531645316553166531675316853169531705317153172531735317453175531765317753178531795318053181531825318353184531855318653187531885318953190531915319253193531945319553196531975319853199532005320153202532035320453205532065320753208532095321053211532125321353214532155321653217532185321953220532215322253223532245322553226532275322853229532305323153232532335323453235532365323753238532395324053241532425324353244532455324653247532485324953250532515325253253532545325553256532575325853259532605326153262532635326453265532665326753268532695327053271532725327353274532755327653277532785327953280532815328253283532845328553286532875328853289532905329153292532935329453295532965329753298532995330053301533025330353304533055330653307533085330953310533115331253313533145331553316533175331853319533205332153322533235332453325533265332753328533295333053331533325333353334533355333653337533385333953340533415334253343533445334553346533475334853349533505335153352533535335453355533565335753358533595336053361533625336353364533655336653367533685336953370533715337253373533745337553376533775337853379533805338153382533835338453385533865338753388533895339053391533925339353394533955339653397533985339953400534015340253403534045340553406534075340853409534105341153412534135341453415534165341753418534195342053421534225342353424534255342653427534285342953430534315343253433534345343553436534375343853439534405344153442534435344453445534465344753448534495345053451534525345353454534555345653457534585345953460534615346253463534645346553466534675346853469534705347153472534735347453475534765347753478534795348053481534825348353484534855348653487534885348953490534915349253493534945349553496534975349853499535005350153502535035350453505535065350753508535095351053511535125351353514535155351653517535185351953520535215352253523535245352553526535275352853529535305353153532535335353453535535365353753538535395354053541535425354353544535455354653547535485354953550535515355253553535545355553556535575355853559535605356153562535635356453565535665356753568535695357053571535725357353574535755357653577535785357953580535815358253583535845358553586535875358853589535905359153592535935359453595535965359753598535995360053601536025360353604536055360653607536085360953610536115361253613536145361553616536175361853619536205362153622536235362453625536265362753628536295363053631536325363353634536355363653637536385363953640536415364253643536445364553646536475364853649536505365153652536535365453655536565365753658536595366053661536625366353664536655366653667536685366953670536715367253673536745367553676536775367853679536805368153682536835368453685536865368753688536895369053691536925369353694536955369653697536985369953700537015370253703537045370553706537075370853709537105371153712537135371453715537165371753718537195372053721537225372353724537255372653727537285372953730537315373253733537345373553736537375373853739537405374153742537435374453745537465374753748537495375053751537525375353754537555375653757537585375953760537615376253763537645376553766537675376853769537705377153772537735377453775537765377753778537795378053781537825378353784537855378653787537885378953790537915379253793537945379553796537975379853799538005380153802538035380453805538065380753808538095381053811538125381353814538155381653817538185381953820538215382253823538245382553826538275382853829538305383153832538335383453835538365383753838538395384053841538425384353844538455384653847538485384953850538515385253853538545385553856538575385853859538605386153862538635386453865538665386753868538695387053871538725387353874538755387653877538785387953880538815388253883538845388553886538875388853889538905389153892538935389453895538965389753898538995390053901539025390353904539055390653907539085390953910539115391253913539145391553916539175391853919539205392153922539235392453925539265392753928539295393053931539325393353934539355393653937539385393953940539415394253943539445394553946539475394853949539505395153952539535395453955539565395753958539595396053961539625396353964539655396653967539685396953970539715397253973539745397553976539775397853979539805398153982539835398453985539865398753988539895399053991539925399353994539955399653997539985399954000540015400254003540045400554006540075400854009540105401154012540135401454015540165401754018540195402054021540225402354024540255402654027540285402954030540315403254033540345403554036540375403854039540405404154042540435404454045540465404754048540495405054051540525405354054540555405654057540585405954060540615406254063540645406554066540675406854069540705407154072540735407454075540765407754078540795408054081540825408354084540855408654087540885408954090540915409254093540945409554096540975409854099541005410154102541035410454105541065410754108541095411054111541125411354114541155411654117541185411954120541215412254123541245412554126541275412854129541305413154132541335413454135541365413754138541395414054141541425414354144541455414654147541485414954150541515415254153541545415554156541575415854159541605416154162541635416454165541665416754168541695417054171541725417354174541755417654177541785417954180541815418254183541845418554186541875418854189541905419154192541935419454195541965419754198541995420054201542025420354204542055420654207542085420954210542115421254213542145421554216542175421854219542205422154222542235422454225542265422754228542295423054231542325423354234542355423654237542385423954240542415424254243542445424554246542475424854249542505425154252542535425454255542565425754258542595426054261542625426354264542655426654267542685426954270542715427254273542745427554276542775427854279542805428154282542835428454285542865428754288542895429054291542925429354294542955429654297542985429954300543015430254303543045430554306543075430854309543105431154312543135431454315543165431754318543195432054321543225432354324543255432654327543285432954330543315433254333543345433554336543375433854339543405434154342543435434454345543465434754348543495435054351543525435354354543555435654357543585435954360543615436254363543645436554366543675436854369543705437154372543735437454375543765437754378543795438054381543825438354384543855438654387543885438954390543915439254393543945439554396543975439854399544005440154402544035440454405544065440754408544095441054411544125441354414544155441654417544185441954420544215442254423544245442554426544275442854429544305443154432544335443454435544365443754438544395444054441544425444354444544455444654447544485444954450544515445254453544545445554456544575445854459544605446154462544635446454465544665446754468544695447054471544725447354474544755447654477544785447954480544815448254483544845448554486544875448854489544905449154492544935449454495544965449754498544995450054501545025450354504545055450654507545085450954510545115451254513545145451554516545175451854519545205452154522545235452454525545265452754528545295453054531545325453354534545355453654537545385453954540545415454254543545445454554546545475454854549545505455154552545535455454555545565455754558545595456054561545625456354564545655456654567545685456954570545715457254573545745457554576545775457854579545805458154582545835458454585545865458754588545895459054591545925459354594545955459654597545985459954600546015460254603546045460554606546075460854609546105461154612546135461454615546165461754618546195462054621546225462354624546255462654627546285462954630546315463254633546345463554636546375463854639546405464154642546435464454645546465464754648546495465054651546525465354654546555465654657546585465954660546615466254663546645466554666546675466854669546705467154672546735467454675546765467754678546795468054681546825468354684546855468654687546885468954690546915469254693546945469554696546975469854699547005470154702547035470454705547065470754708547095471054711547125471354714547155471654717547185471954720547215472254723547245472554726547275472854729547305473154732547335473454735547365473754738547395474054741547425474354744547455474654747547485474954750547515475254753547545475554756547575475854759547605476154762547635476454765547665476754768547695477054771547725477354774547755477654777547785477954780547815478254783547845478554786547875478854789547905479154792547935479454795547965479754798547995480054801548025480354804548055480654807548085480954810548115481254813548145481554816548175481854819548205482154822548235482454825548265482754828548295483054831548325483354834548355483654837548385483954840548415484254843548445484554846548475484854849548505485154852548535485454855548565485754858548595486054861548625486354864548655486654867548685486954870548715487254873548745487554876548775487854879548805488154882548835488454885548865488754888548895489054891548925489354894548955489654897548985489954900549015490254903549045490554906549075490854909549105491154912549135491454915549165491754918549195492054921549225492354924549255492654927549285492954930549315493254933549345493554936549375493854939549405494154942549435494454945549465494754948549495495054951549525495354954549555495654957549585495954960549615496254963549645496554966549675496854969549705497154972549735497454975549765497754978549795498054981549825498354984549855498654987549885498954990549915499254993549945499554996549975499854999550005500155002550035500455005550065500755008550095501055011550125501355014550155501655017550185501955020550215502255023550245502555026550275502855029550305503155032550335503455035550365503755038550395504055041550425504355044550455504655047550485504955050550515505255053550545505555056550575505855059550605506155062550635506455065550665506755068550695507055071550725507355074550755507655077550785507955080550815508255083550845508555086550875508855089550905509155092550935509455095550965509755098550995510055101551025510355104551055510655107551085510955110551115511255113551145511555116551175511855119551205512155122551235512455125551265512755128551295513055131551325513355134551355513655137551385513955140551415514255143551445514555146551475514855149551505515155152551535515455155551565515755158551595516055161551625516355164551655516655167551685516955170551715517255173551745517555176551775517855179551805518155182551835518455185551865518755188551895519055191551925519355194551955519655197551985519955200552015520255203552045520555206552075520855209552105521155212552135521455215552165521755218552195522055221552225522355224552255522655227552285522955230552315523255233552345523555236552375523855239552405524155242552435524455245552465524755248552495525055251552525525355254552555525655257552585525955260552615526255263552645526555266552675526855269552705527155272552735527455275552765527755278552795528055281552825528355284552855528655287552885528955290552915529255293552945529555296552975529855299553005530155302553035530455305553065530755308553095531055311553125531355314553155531655317553185531955320553215532255323553245532555326553275532855329553305533155332553335533455335553365533755338553395534055341553425534355344553455534655347553485534955350553515535255353553545535555356553575535855359553605536155362553635536455365553665536755368553695537055371553725537355374553755537655377553785537955380553815538255383553845538555386553875538855389553905539155392553935539455395553965539755398553995540055401554025540355404554055540655407554085540955410554115541255413554145541555416554175541855419554205542155422554235542455425554265542755428554295543055431554325543355434554355543655437554385543955440554415544255443554445544555446554475544855449554505545155452554535545455455554565545755458554595546055461554625546355464554655546655467554685546955470554715547255473554745547555476554775547855479554805548155482554835548455485554865548755488554895549055491554925549355494554955549655497554985549955500555015550255503555045550555506555075550855509555105551155512555135551455515555165551755518555195552055521555225552355524555255552655527555285552955530555315553255533555345553555536555375553855539555405554155542555435554455545555465554755548555495555055551555525555355554555555555655557555585555955560555615556255563555645556555566555675556855569555705557155572555735557455575555765557755578555795558055581555825558355584555855558655587555885558955590555915559255593555945559555596555975559855599556005560155602556035560455605556065560755608556095561055611556125561355614556155561655617556185561955620556215562255623556245562555626556275562855629556305563155632556335563455635556365563755638556395564055641556425564355644556455564655647556485564955650556515565255653556545565555656556575565855659556605566155662556635566455665556665566755668556695567055671556725567355674556755567655677556785567955680556815568255683556845568555686556875568855689556905569155692556935569455695556965569755698556995570055701557025570355704557055570655707557085570955710557115571255713557145571555716557175571855719557205572155722557235572455725557265572755728557295573055731557325573355734557355573655737557385573955740557415574255743557445574555746557475574855749557505575155752557535575455755557565575755758557595576055761557625576355764557655576655767557685576955770557715577255773557745577555776557775577855779557805578155782557835578455785557865578755788557895579055791557925579355794557955579655797557985579955800558015580255803558045580555806558075580855809558105581155812558135581455815558165581755818558195582055821558225582355824558255582655827558285582955830558315583255833558345583555836558375583855839558405584155842558435584455845558465584755848558495585055851558525585355854558555585655857558585585955860558615586255863558645586555866558675586855869558705587155872558735587455875558765587755878558795588055881558825588355884558855588655887558885588955890558915589255893558945589555896558975589855899559005590155902559035590455905559065590755908559095591055911559125591355914559155591655917559185591955920559215592255923559245592555926559275592855929559305593155932559335593455935559365593755938559395594055941559425594355944559455594655947559485594955950559515595255953559545595555956559575595855959559605596155962559635596455965559665596755968559695597055971559725597355974559755597655977559785597955980559815598255983559845598555986559875598855989559905599155992559935599455995559965599755998559995600056001560025600356004560055600656007560085600956010560115601256013560145601556016560175601856019560205602156022560235602456025560265602756028560295603056031560325603356034560355603656037560385603956040560415604256043560445604556046560475604856049560505605156052560535605456055560565605756058560595606056061560625606356064560655606656067560685606956070560715607256073560745607556076560775607856079560805608156082560835608456085560865608756088560895609056091560925609356094560955609656097560985609956100561015610256103561045610556106561075610856109561105611156112561135611456115561165611756118561195612056121561225612356124561255612656127561285612956130561315613256133561345613556136561375613856139561405614156142561435614456145561465614756148561495615056151561525615356154561555615656157561585615956160561615616256163561645616556166561675616856169561705617156172561735617456175561765617756178561795618056181561825618356184561855618656187561885618956190561915619256193561945619556196561975619856199562005620156202562035620456205562065620756208562095621056211562125621356214562155621656217562185621956220562215622256223562245622556226562275622856229562305623156232562335623456235562365623756238562395624056241562425624356244562455624656247562485624956250562515625256253562545625556256562575625856259562605626156262562635626456265562665626756268562695627056271562725627356274562755627656277562785627956280562815628256283562845628556286562875628856289562905629156292562935629456295562965629756298562995630056301563025630356304563055630656307563085630956310563115631256313563145631556316563175631856319563205632156322563235632456325563265632756328563295633056331563325633356334563355633656337563385633956340563415634256343563445634556346563475634856349563505635156352563535635456355563565635756358563595636056361563625636356364563655636656367563685636956370563715637256373563745637556376563775637856379563805638156382563835638456385563865638756388563895639056391563925639356394563955639656397563985639956400564015640256403564045640556406564075640856409564105641156412564135641456415564165641756418564195642056421564225642356424564255642656427564285642956430564315643256433564345643556436564375643856439564405644156442564435644456445564465644756448564495645056451564525645356454564555645656457564585645956460564615646256463564645646556466564675646856469564705647156472564735647456475564765647756478564795648056481564825648356484564855648656487564885648956490564915649256493564945649556496564975649856499565005650156502565035650456505565065650756508565095651056511565125651356514565155651656517565185651956520565215652256523565245652556526565275652856529565305653156532565335653456535565365653756538565395654056541565425654356544565455654656547565485654956550565515655256553565545655556556565575655856559565605656156562565635656456565565665656756568565695657056571565725657356574565755657656577565785657956580565815658256583565845658556586565875658856589565905659156592565935659456595565965659756598565995660056601566025660356604566055660656607566085660956610566115661256613566145661556616566175661856619566205662156622566235662456625566265662756628566295663056631566325663356634566355663656637566385663956640566415664256643566445664556646566475664856649566505665156652566535665456655566565665756658566595666056661566625666356664566655666656667566685666956670566715667256673566745667556676566775667856679566805668156682566835668456685566865668756688566895669056691566925669356694566955669656697566985669956700567015670256703567045670556706567075670856709567105671156712567135671456715567165671756718567195672056721567225672356724567255672656727567285672956730567315673256733567345673556736567375673856739567405674156742567435674456745567465674756748567495675056751567525675356754567555675656757567585675956760567615676256763567645676556766567675676856769567705677156772567735677456775567765677756778567795678056781567825678356784567855678656787567885678956790567915679256793567945679556796567975679856799568005680156802568035680456805568065680756808568095681056811568125681356814568155681656817568185681956820568215682256823568245682556826568275682856829568305683156832568335683456835568365683756838568395684056841568425684356844568455684656847568485684956850568515685256853568545685556856568575685856859568605686156862568635686456865568665686756868568695687056871568725687356874568755687656877568785687956880568815688256883568845688556886568875688856889568905689156892568935689456895568965689756898568995690056901569025690356904569055690656907569085690956910569115691256913569145691556916569175691856919569205692156922569235692456925569265692756928569295693056931569325693356934569355693656937569385693956940569415694256943569445694556946569475694856949569505695156952569535695456955569565695756958569595696056961569625696356964569655696656967569685696956970569715697256973569745697556976569775697856979569805698156982569835698456985569865698756988569895699056991569925699356994569955699656997569985699957000570015700257003570045700557006570075700857009570105701157012570135701457015570165701757018570195702057021570225702357024570255702657027570285702957030570315703257033570345703557036570375703857039570405704157042570435704457045570465704757048570495705057051570525705357054570555705657057570585705957060570615706257063570645706557066570675706857069570705707157072570735707457075570765707757078570795708057081570825708357084570855708657087570885708957090570915709257093570945709557096570975709857099571005710157102571035710457105571065710757108571095711057111571125711357114571155711657117571185711957120571215712257123571245712557126571275712857129571305713157132571335713457135571365713757138571395714057141571425714357144571455714657147571485714957150571515715257153571545715557156571575715857159571605716157162571635716457165571665716757168571695717057171571725717357174571755717657177571785717957180571815718257183571845718557186571875718857189571905719157192571935719457195571965719757198571995720057201572025720357204572055720657207572085720957210572115721257213572145721557216572175721857219572205722157222572235722457225572265722757228572295723057231572325723357234572355723657237572385723957240572415724257243572445724557246572475724857249572505725157252572535725457255572565725757258572595726057261572625726357264572655726657267572685726957270572715727257273572745727557276572775727857279572805728157282572835728457285572865728757288572895729057291572925729357294572955729657297572985729957300573015730257303573045730557306573075730857309573105731157312573135731457315573165731757318573195732057321573225732357324573255732657327573285732957330573315733257333573345733557336573375733857339573405734157342573435734457345573465734757348573495735057351573525735357354573555735657357573585735957360573615736257363573645736557366573675736857369573705737157372573735737457375573765737757378573795738057381573825738357384573855738657387573885738957390573915739257393573945739557396573975739857399574005740157402574035740457405574065740757408574095741057411574125741357414574155741657417574185741957420574215742257423574245742557426574275742857429574305743157432574335743457435574365743757438574395744057441574425744357444574455744657447574485744957450574515745257453574545745557456574575745857459574605746157462574635746457465574665746757468574695747057471574725747357474574755747657477574785747957480574815748257483574845748557486574875748857489574905749157492574935749457495574965749757498574995750057501575025750357504575055750657507575085750957510575115751257513575145751557516575175751857519575205752157522575235752457525575265752757528575295753057531575325753357534575355753657537575385753957540575415754257543575445754557546575475754857549575505755157552575535755457555575565755757558575595756057561575625756357564575655756657567575685756957570575715757257573575745757557576575775757857579575805758157582575835758457585575865758757588575895759057591575925759357594575955759657597575985759957600576015760257603576045760557606576075760857609576105761157612576135761457615576165761757618576195762057621576225762357624576255762657627576285762957630576315763257633576345763557636576375763857639576405764157642576435764457645576465764757648576495765057651576525765357654576555765657657576585765957660576615766257663576645766557666576675766857669576705767157672576735767457675576765767757678576795768057681576825768357684576855768657687576885768957690576915769257693576945769557696576975769857699577005770157702577035770457705577065770757708577095771057711577125771357714577155771657717577185771957720577215772257723577245772557726577275772857729577305773157732577335773457735577365773757738577395774057741577425774357744577455774657747577485774957750577515775257753577545775557756577575775857759577605776157762577635776457765577665776757768577695777057771577725777357774577755777657777577785777957780577815778257783577845778557786577875778857789577905779157792577935779457795577965779757798577995780057801578025780357804578055780657807578085780957810578115781257813578145781557816578175781857819578205782157822578235782457825578265782757828578295783057831578325783357834578355783657837578385783957840578415784257843578445784557846578475784857849578505785157852578535785457855578565785757858578595786057861578625786357864578655786657867578685786957870578715787257873578745787557876578775787857879578805788157882578835788457885578865788757888578895789057891578925789357894578955789657897578985789957900579015790257903579045790557906579075790857909579105791157912579135791457915579165791757918579195792057921579225792357924579255792657927579285792957930579315793257933579345793557936579375793857939579405794157942579435794457945579465794757948579495795057951579525795357954579555795657957579585795957960579615796257963579645796557966579675796857969579705797157972579735797457975579765797757978579795798057981579825798357984579855798657987579885798957990579915799257993579945799557996579975799857999580005800158002580035800458005580065800758008580095801058011580125801358014580155801658017580185801958020580215802258023580245802558026580275802858029580305803158032580335803458035580365803758038580395804058041580425804358044580455804658047580485804958050580515805258053580545805558056580575805858059580605806158062580635806458065580665806758068580695807058071580725807358074580755807658077580785807958080580815808258083580845808558086580875808858089580905809158092580935809458095580965809758098580995810058101581025810358104581055810658107581085810958110581115811258113581145811558116581175811858119581205812158122581235812458125581265812758128581295813058131581325813358134581355813658137581385813958140581415814258143581445814558146581475814858149581505815158152581535815458155581565815758158581595816058161581625816358164581655816658167581685816958170581715817258173581745817558176581775817858179581805818158182581835818458185581865818758188581895819058191581925819358194581955819658197581985819958200582015820258203582045820558206582075820858209582105821158212582135821458215582165821758218582195822058221582225822358224582255822658227582285822958230582315823258233582345823558236582375823858239582405824158242582435824458245582465824758248582495825058251582525825358254582555825658257582585825958260582615826258263582645826558266582675826858269582705827158272582735827458275582765827758278582795828058281582825828358284582855828658287582885828958290582915829258293582945829558296582975829858299583005830158302583035830458305583065830758308583095831058311583125831358314583155831658317583185831958320583215832258323583245832558326583275832858329583305833158332583335833458335583365833758338583395834058341583425834358344583455834658347583485834958350583515835258353583545835558356583575835858359583605836158362583635836458365583665836758368583695837058371583725837358374583755837658377583785837958380583815838258383583845838558386583875838858389583905839158392583935839458395583965839758398583995840058401584025840358404584055840658407584085840958410584115841258413584145841558416584175841858419584205842158422584235842458425584265842758428584295843058431584325843358434584355843658437584385843958440584415844258443584445844558446584475844858449584505845158452584535845458455584565845758458584595846058461584625846358464584655846658467584685846958470584715847258473584745847558476584775847858479584805848158482584835848458485584865848758488584895849058491584925849358494584955849658497584985849958500585015850258503585045850558506585075850858509585105851158512585135851458515585165851758518585195852058521585225852358524585255852658527585285852958530585315853258533585345853558536585375853858539585405854158542585435854458545585465854758548585495855058551585525855358554585555855658557585585855958560585615856258563585645856558566585675856858569585705857158572585735857458575585765857758578585795858058581585825858358584585855858658587585885858958590585915859258593585945859558596585975859858599586005860158602586035860458605586065860758608586095861058611586125861358614586155861658617586185861958620586215862258623586245862558626586275862858629586305863158632586335863458635586365863758638586395864058641586425864358644586455864658647586485864958650586515865258653586545865558656586575865858659586605866158662586635866458665586665866758668586695867058671586725867358674586755867658677586785867958680586815868258683586845868558686586875868858689586905869158692586935869458695586965869758698586995870058701587025870358704587055870658707587085870958710587115871258713587145871558716587175871858719587205872158722587235872458725587265872758728587295873058731587325873358734587355873658737587385873958740587415874258743587445874558746587475874858749587505875158752587535875458755587565875758758587595876058761587625876358764587655876658767587685876958770587715877258773587745877558776587775877858779587805878158782587835878458785587865878758788587895879058791587925879358794587955879658797587985879958800588015880258803588045880558806588075880858809588105881158812588135881458815588165881758818588195882058821588225882358824588255882658827588285882958830588315883258833588345883558836588375883858839588405884158842588435884458845588465884758848588495885058851588525885358854588555885658857588585885958860588615886258863588645886558866588675886858869588705887158872588735887458875588765887758878588795888058881588825888358884588855888658887588885888958890588915889258893588945889558896588975889858899589005890158902589035890458905589065890758908589095891058911589125891358914589155891658917589185891958920589215892258923589245892558926589275892858929589305893158932589335893458935589365893758938589395894058941589425894358944589455894658947589485894958950589515895258953589545895558956589575895858959589605896158962589635896458965589665896758968589695897058971589725897358974589755897658977589785897958980589815898258983589845898558986589875898858989589905899158992589935899458995589965899758998589995900059001590025900359004590055900659007590085900959010590115901259013590145901559016590175901859019590205902159022590235902459025590265902759028590295903059031590325903359034590355903659037590385903959040590415904259043590445904559046590475904859049590505905159052590535905459055590565905759058590595906059061590625906359064590655906659067590685906959070590715907259073590745907559076590775907859079590805908159082590835908459085590865908759088590895909059091590925909359094590955909659097590985909959100591015910259103591045910559106591075910859109591105911159112591135911459115591165911759118591195912059121591225912359124591255912659127591285912959130591315913259133591345913559136591375913859139591405914159142591435914459145591465914759148591495915059151591525915359154591555915659157591585915959160591615916259163591645916559166591675916859169591705917159172591735917459175591765917759178591795918059181591825918359184591855918659187591885918959190591915919259193591945919559196591975919859199592005920159202592035920459205592065920759208592095921059211592125921359214592155921659217592185921959220592215922259223592245922559226592275922859229592305923159232592335923459235592365923759238592395924059241592425924359244592455924659247592485924959250592515925259253592545925559256592575925859259592605926159262592635926459265592665926759268592695927059271592725927359274592755927659277592785927959280592815928259283592845928559286592875928859289592905929159292592935929459295592965929759298592995930059301593025930359304593055930659307593085930959310593115931259313593145931559316593175931859319593205932159322593235932459325593265932759328593295933059331593325933359334593355933659337593385933959340593415934259343593445934559346593475934859349593505935159352593535935459355593565935759358593595936059361593625936359364593655936659367593685936959370593715937259373593745937559376593775937859379593805938159382593835938459385593865938759388593895939059391593925939359394593955939659397593985939959400594015940259403594045940559406594075940859409594105941159412594135941459415594165941759418594195942059421594225942359424594255942659427594285942959430594315943259433594345943559436594375943859439594405944159442594435944459445594465944759448594495945059451594525945359454594555945659457594585945959460594615946259463594645946559466594675946859469594705947159472594735947459475594765947759478594795948059481594825948359484594855948659487594885948959490594915949259493594945949559496594975949859499595005950159502595035950459505595065950759508595095951059511595125951359514595155951659517595185951959520595215952259523595245952559526595275952859529595305953159532595335953459535595365953759538595395954059541595425954359544595455954659547595485954959550595515955259553595545955559556595575955859559595605956159562595635956459565595665956759568595695957059571595725957359574595755957659577595785957959580595815958259583595845958559586595875958859589595905959159592595935959459595595965959759598595995960059601596025960359604596055960659607596085960959610596115961259613596145961559616596175961859619596205962159622596235962459625596265962759628596295963059631596325963359634596355963659637596385963959640596415964259643596445964559646596475964859649596505965159652596535965459655596565965759658596595966059661596625966359664596655966659667596685966959670596715967259673596745967559676596775967859679596805968159682596835968459685596865968759688596895969059691596925969359694596955969659697596985969959700597015970259703597045970559706597075970859709597105971159712597135971459715597165971759718597195972059721597225972359724597255972659727597285972959730597315973259733597345973559736597375973859739597405974159742597435974459745597465974759748597495975059751597525975359754597555975659757597585975959760597615976259763597645976559766597675976859769597705977159772597735977459775597765977759778597795978059781597825978359784597855978659787597885978959790597915979259793597945979559796597975979859799598005980159802598035980459805598065980759808598095981059811598125981359814598155981659817598185981959820598215982259823598245982559826598275982859829598305983159832598335983459835598365983759838598395984059841598425984359844598455984659847598485984959850598515985259853598545985559856598575985859859598605986159862598635986459865598665986759868598695987059871598725987359874598755987659877598785987959880598815988259883598845988559886598875988859889598905989159892598935989459895598965989759898598995990059901599025990359904599055990659907599085990959910599115991259913599145991559916599175991859919599205992159922599235992459925599265992759928599295993059931599325993359934599355993659937599385993959940599415994259943599445994559946599475994859949599505995159952599535995459955599565995759958599595996059961599625996359964599655996659967599685996959970599715997259973599745997559976599775997859979599805998159982599835998459985599865998759988599895999059991599925999359994599955999659997599985999960000600016000260003600046000560006600076000860009600106001160012600136001460015600166001760018600196002060021600226002360024600256002660027600286002960030600316003260033600346003560036600376003860039600406004160042600436004460045600466004760048600496005060051600526005360054600556005660057600586005960060600616006260063600646006560066600676006860069600706007160072600736007460075600766007760078600796008060081600826008360084600856008660087600886008960090600916009260093600946009560096600976009860099601006010160102601036010460105601066010760108601096011060111601126011360114601156011660117601186011960120601216012260123601246012560126601276012860129601306013160132601336013460135601366013760138601396014060141601426014360144601456014660147601486014960150601516015260153601546015560156601576015860159601606016160162601636016460165601666016760168601696017060171601726017360174601756017660177601786017960180601816018260183601846018560186601876018860189601906019160192601936019460195601966019760198601996020060201602026020360204602056020660207602086020960210602116021260213602146021560216602176021860219602206022160222602236022460225602266022760228602296023060231602326023360234602356023660237602386023960240602416024260243602446024560246602476024860249602506025160252602536025460255602566025760258602596026060261602626026360264602656026660267602686026960270602716027260273602746027560276602776027860279602806028160282602836028460285602866028760288602896029060291602926029360294602956029660297602986029960300603016030260303603046030560306603076030860309603106031160312603136031460315603166031760318603196032060321603226032360324603256032660327603286032960330603316033260333603346033560336603376033860339603406034160342603436034460345603466034760348603496035060351603526035360354603556035660357603586035960360603616036260363603646036560366603676036860369603706037160372603736037460375603766037760378603796038060381603826038360384603856038660387603886038960390603916039260393603946039560396603976039860399604006040160402604036040460405604066040760408604096041060411604126041360414604156041660417604186041960420604216042260423604246042560426604276042860429604306043160432604336043460435604366043760438604396044060441604426044360444604456044660447604486044960450604516045260453604546045560456604576045860459604606046160462604636046460465604666046760468604696047060471604726047360474604756047660477604786047960480604816048260483604846048560486604876048860489604906049160492604936049460495604966049760498604996050060501605026050360504605056050660507605086050960510605116051260513605146051560516605176051860519605206052160522605236052460525605266052760528605296053060531605326053360534605356053660537605386053960540605416054260543605446054560546605476054860549605506055160552605536055460555605566055760558605596056060561605626056360564605656056660567605686056960570605716057260573605746057560576605776057860579605806058160582605836058460585605866058760588605896059060591605926059360594605956059660597605986059960600606016060260603606046060560606606076060860609606106061160612606136061460615606166061760618606196062060621606226062360624606256062660627606286062960630606316063260633606346063560636606376063860639606406064160642606436064460645606466064760648606496065060651606526065360654606556065660657606586065960660606616066260663606646066560666606676066860669606706067160672606736067460675606766067760678606796068060681606826068360684606856068660687606886068960690606916069260693606946069560696606976069860699607006070160702607036070460705607066070760708607096071060711607126071360714607156071660717607186071960720607216072260723607246072560726607276072860729607306073160732607336073460735607366073760738607396074060741607426074360744607456074660747607486074960750607516075260753607546075560756607576075860759607606076160762607636076460765607666076760768607696077060771607726077360774607756077660777607786077960780607816078260783607846078560786607876078860789607906079160792607936079460795607966079760798607996080060801608026080360804608056080660807608086080960810608116081260813608146081560816608176081860819608206082160822608236082460825608266082760828608296083060831608326083360834608356083660837608386083960840608416084260843608446084560846608476084860849608506085160852608536085460855608566085760858608596086060861608626086360864608656086660867608686086960870608716087260873608746087560876608776087860879608806088160882608836088460885608866088760888608896089060891608926089360894608956089660897608986089960900609016090260903609046090560906609076090860909609106091160912609136091460915609166091760918609196092060921609226092360924609256092660927609286092960930609316093260933609346093560936609376093860939609406094160942609436094460945609466094760948609496095060951609526095360954609556095660957609586095960960609616096260963609646096560966609676096860969609706097160972609736097460975609766097760978609796098060981609826098360984609856098660987609886098960990609916099260993609946099560996609976099860999610006100161002610036100461005610066100761008610096101061011610126101361014610156101661017610186101961020610216102261023610246102561026610276102861029610306103161032610336103461035610366103761038610396104061041610426104361044610456104661047610486104961050610516105261053610546105561056610576105861059610606106161062610636106461065610666106761068610696107061071610726107361074610756107661077610786107961080610816108261083610846108561086610876108861089610906109161092610936109461095610966109761098610996110061101611026110361104611056110661107611086110961110611116111261113611146111561116611176111861119611206112161122611236112461125611266112761128611296113061131611326113361134611356113661137611386113961140611416114261143611446114561146611476114861149611506115161152611536115461155611566115761158611596116061161611626116361164611656116661167611686116961170611716117261173611746117561176611776117861179611806118161182611836118461185611866118761188611896119061191611926119361194611956119661197611986119961200612016120261203612046120561206612076120861209612106121161212612136121461215612166121761218612196122061221612226122361224612256122661227612286122961230612316123261233612346123561236612376123861239612406124161242612436124461245612466124761248612496125061251612526125361254612556125661257612586125961260612616126261263612646126561266612676126861269612706127161272612736127461275612766127761278612796128061281612826128361284612856128661287612886128961290612916129261293612946129561296612976129861299613006130161302613036130461305613066130761308613096131061311613126131361314613156131661317613186131961320613216132261323613246132561326613276132861329613306133161332613336133461335613366133761338613396134061341613426134361344613456134661347613486134961350613516135261353613546135561356613576135861359613606136161362613636136461365613666136761368613696137061371613726137361374613756137661377613786137961380613816138261383613846138561386613876138861389613906139161392613936139461395613966139761398613996140061401614026140361404614056140661407614086140961410614116141261413614146141561416614176141861419614206142161422614236142461425614266142761428614296143061431614326143361434614356143661437614386143961440614416144261443614446144561446614476144861449614506145161452614536145461455614566145761458614596146061461614626146361464614656146661467614686146961470614716147261473614746147561476614776147861479614806148161482614836148461485614866148761488614896149061491614926149361494614956149661497614986149961500615016150261503615046150561506615076150861509615106151161512615136151461515615166151761518615196152061521615226152361524615256152661527615286152961530615316153261533615346153561536615376153861539615406154161542615436154461545615466154761548615496155061551615526155361554615556155661557615586155961560615616156261563615646156561566615676156861569615706157161572615736157461575615766157761578615796158061581615826158361584615856158661587615886158961590615916159261593615946159561596615976159861599616006160161602616036160461605616066160761608616096161061611616126161361614616156161661617616186161961620616216162261623616246162561626616276162861629616306163161632616336163461635616366163761638616396164061641616426164361644616456164661647616486164961650616516165261653616546165561656616576165861659616606166161662616636166461665616666166761668616696167061671616726167361674616756167661677616786167961680616816168261683616846168561686616876168861689616906169161692616936169461695616966169761698616996170061701617026170361704617056170661707617086170961710617116171261713617146171561716617176171861719617206172161722617236172461725617266172761728617296173061731617326173361734617356173661737617386173961740617416174261743617446174561746617476174861749617506175161752617536175461755617566175761758617596176061761617626176361764617656176661767617686176961770617716177261773617746177561776617776177861779617806178161782617836178461785617866178761788617896179061791617926179361794617956179661797617986179961800618016180261803618046180561806618076180861809618106181161812618136181461815618166181761818618196182061821618226182361824618256182661827618286182961830618316183261833618346183561836618376183861839618406184161842618436184461845618466184761848618496185061851618526185361854618556185661857618586185961860618616186261863618646186561866618676186861869618706187161872618736187461875618766187761878618796188061881618826188361884618856188661887618886188961890618916189261893618946189561896618976189861899619006190161902619036190461905619066190761908619096191061911619126191361914619156191661917619186191961920619216192261923619246192561926619276192861929619306193161932619336193461935619366193761938619396194061941619426194361944619456194661947619486194961950619516195261953619546195561956619576195861959619606196161962619636196461965619666196761968619696197061971619726197361974619756197661977619786197961980619816198261983619846198561986619876198861989619906199161992619936199461995619966199761998619996200062001620026200362004620056200662007620086200962010620116201262013620146201562016620176201862019620206202162022620236202462025620266202762028620296203062031620326203362034620356203662037620386203962040620416204262043620446204562046620476204862049620506205162052620536205462055620566205762058620596206062061620626206362064620656206662067620686206962070620716207262073620746207562076620776207862079620806208162082620836208462085620866208762088620896209062091620926209362094620956209662097620986209962100621016210262103621046210562106621076210862109621106211162112621136211462115621166211762118621196212062121621226212362124621256212662127621286212962130621316213262133621346213562136621376213862139621406214162142621436214462145621466214762148621496215062151621526215362154621556215662157621586215962160621616216262163621646216562166621676216862169621706217162172621736217462175621766217762178621796218062181621826218362184621856218662187621886218962190621916219262193621946219562196621976219862199622006220162202622036220462205622066220762208622096221062211622126221362214622156221662217622186221962220622216222262223622246222562226622276222862229622306223162232622336223462235622366223762238622396224062241622426224362244622456224662247622486224962250622516225262253622546225562256622576225862259622606226162262622636226462265622666226762268622696227062271622726227362274622756227662277622786227962280622816228262283622846228562286622876228862289622906229162292622936229462295622966229762298622996230062301623026230362304623056230662307623086230962310623116231262313623146231562316623176231862319623206232162322623236232462325623266232762328623296233062331623326233362334623356233662337623386233962340623416234262343623446234562346623476234862349623506235162352623536235462355623566235762358623596236062361623626236362364623656236662367623686236962370623716237262373623746237562376623776237862379623806238162382623836238462385623866238762388623896239062391623926239362394623956239662397623986239962400624016240262403624046240562406624076240862409624106241162412624136241462415624166241762418624196242062421624226242362424624256242662427624286242962430624316243262433624346243562436624376243862439624406244162442624436244462445624466244762448624496245062451624526245362454624556245662457624586245962460624616246262463624646246562466624676246862469624706247162472624736247462475624766247762478624796248062481624826248362484624856248662487624886248962490624916249262493624946249562496624976249862499625006250162502625036250462505625066250762508625096251062511625126251362514625156251662517625186251962520625216252262523625246252562526625276252862529625306253162532625336253462535625366253762538625396254062541625426254362544625456254662547625486254962550625516255262553625546255562556625576255862559625606256162562625636256462565625666256762568625696257062571625726257362574625756257662577625786257962580625816258262583625846258562586625876258862589625906259162592625936259462595625966259762598625996260062601626026260362604626056260662607626086260962610626116261262613626146261562616626176261862619626206262162622626236262462625626266262762628626296263062631626326263362634626356263662637626386263962640626416264262643626446264562646626476264862649626506265162652626536265462655626566265762658626596266062661626626266362664626656266662667626686266962670626716267262673626746267562676626776267862679626806268162682626836268462685626866268762688626896269062691626926269362694626956269662697626986269962700627016270262703627046270562706627076270862709627106271162712627136271462715627166271762718627196272062721627226272362724627256272662727627286272962730627316273262733627346273562736627376273862739627406274162742627436274462745627466274762748627496275062751627526275362754627556275662757627586275962760627616276262763627646276562766627676276862769627706277162772627736277462775627766277762778627796278062781627826278362784627856278662787627886278962790627916279262793627946279562796627976279862799628006280162802628036280462805628066280762808628096281062811628126281362814628156281662817628186281962820628216282262823628246282562826628276282862829628306283162832628336283462835628366283762838628396284062841628426284362844628456284662847628486284962850628516285262853628546285562856628576285862859628606286162862628636286462865628666286762868628696287062871628726287362874628756287662877628786287962880628816288262883628846288562886628876288862889628906289162892628936289462895628966289762898628996290062901629026290362904629056290662907629086290962910629116291262913629146291562916629176291862919629206292162922629236292462925629266292762928629296293062931629326293362934629356293662937629386293962940629416294262943629446294562946629476294862949629506295162952629536295462955629566295762958629596296062961629626296362964629656296662967629686296962970629716297262973629746297562976629776297862979629806298162982629836298462985629866298762988629896299062991629926299362994629956299662997629986299963000630016300263003630046300563006630076300863009630106301163012630136301463015630166301763018630196302063021630226302363024630256302663027630286302963030630316303263033630346303563036630376303863039630406304163042630436304463045630466304763048630496305063051630526305363054630556305663057630586305963060630616306263063630646306563066630676306863069630706307163072630736307463075630766307763078630796308063081630826308363084630856308663087630886308963090630916309263093630946309563096630976309863099631006310163102631036310463105631066310763108631096311063111631126311363114631156311663117631186311963120631216312263123631246312563126631276312863129631306313163132631336313463135631366313763138631396314063141631426314363144631456314663147631486314963150631516315263153631546315563156631576315863159631606316163162631636316463165631666316763168631696317063171631726317363174631756317663177631786317963180631816318263183631846318563186631876318863189631906319163192631936319463195631966319763198631996320063201632026320363204632056320663207632086320963210632116321263213632146321563216632176321863219632206322163222632236322463225632266322763228632296323063231632326323363234632356323663237632386323963240632416324263243632446324563246632476324863249632506325163252632536325463255632566325763258632596326063261632626326363264632656326663267632686326963270632716327263273632746327563276632776327863279632806328163282632836328463285632866328763288632896329063291632926329363294632956329663297632986329963300633016330263303633046330563306633076330863309633106331163312633136331463315633166331763318633196332063321633226332363324633256332663327633286332963330633316333263333633346333563336633376333863339633406334163342633436334463345633466334763348633496335063351633526335363354633556335663357633586335963360633616336263363633646336563366633676336863369633706337163372633736337463375633766337763378633796338063381633826338363384633856338663387633886338963390633916339263393633946339563396633976339863399634006340163402634036340463405634066340763408634096341063411634126341363414634156341663417634186341963420634216342263423634246342563426634276342863429634306343163432634336343463435634366343763438634396344063441634426344363444634456344663447634486344963450634516345263453634546345563456634576345863459634606346163462634636346463465634666346763468634696347063471634726347363474634756347663477634786347963480634816348263483634846348563486634876348863489634906349163492634936349463495634966349763498634996350063501635026350363504635056350663507635086350963510635116351263513635146351563516635176351863519635206352163522635236352463525635266352763528635296353063531635326353363534635356353663537635386353963540635416354263543635446354563546635476354863549635506355163552635536355463555635566355763558635596356063561635626356363564635656356663567635686356963570635716357263573635746357563576635776357863579635806358163582635836358463585635866358763588635896359063591635926359363594635956359663597635986359963600636016360263603636046360563606636076360863609636106361163612636136361463615636166361763618636196362063621636226362363624636256362663627636286362963630636316363263633636346363563636636376363863639636406364163642636436364463645636466364763648636496365063651636526365363654636556365663657636586365963660636616366263663636646366563666636676366863669636706367163672636736367463675636766367763678636796368063681636826368363684636856368663687636886368963690636916369263693636946369563696636976369863699637006370163702637036370463705637066370763708637096371063711637126371363714637156371663717637186371963720637216372263723637246372563726637276372863729637306373163732637336373463735637366373763738637396374063741637426374363744637456374663747637486374963750637516375263753637546375563756637576375863759637606376163762637636376463765637666376763768637696377063771637726377363774637756377663777637786377963780637816378263783637846378563786637876378863789637906379163792637936379463795637966379763798637996380063801638026380363804638056380663807638086380963810638116381263813638146381563816638176381863819638206382163822638236382463825638266382763828638296383063831638326383363834638356383663837638386383963840638416384263843638446384563846638476384863849638506385163852638536385463855638566385763858638596386063861638626386363864638656386663867638686386963870638716387263873638746387563876638776387863879638806388163882638836388463885638866388763888638896389063891638926389363894638956389663897638986389963900639016390263903639046390563906639076390863909639106391163912639136391463915639166391763918639196392063921639226392363924639256392663927639286392963930639316393263933639346393563936639376393863939639406394163942639436394463945639466394763948639496395063951639526395363954639556395663957639586395963960639616396263963639646396563966639676396863969639706397163972639736397463975639766397763978639796398063981639826398363984639856398663987639886398963990639916399263993639946399563996639976399863999640006400164002640036400464005640066400764008640096401064011640126401364014640156401664017640186401964020640216402264023640246402564026640276402864029640306403164032640336403464035640366403764038640396404064041640426404364044640456404664047640486404964050640516405264053640546405564056640576405864059640606406164062640636406464065640666406764068640696407064071640726407364074640756407664077640786407964080640816408264083640846408564086640876408864089640906409164092640936409464095640966409764098640996410064101641026410364104641056410664107641086410964110641116411264113641146411564116641176411864119641206412164122641236412464125641266412764128641296413064131641326413364134641356413664137641386413964140641416414264143641446414564146641476414864149641506415164152641536415464155641566415764158641596416064161641626416364164641656416664167641686416964170641716417264173641746417564176641776417864179641806418164182641836418464185641866418764188641896419064191641926419364194641956419664197641986419964200642016420264203642046420564206642076420864209642106421164212642136421464215642166421764218642196422064221642226422364224642256422664227642286422964230642316423264233642346423564236642376423864239642406424164242642436424464245642466424764248642496425064251642526425364254642556425664257642586425964260642616426264263642646426564266642676426864269642706427164272642736427464275642766427764278642796428064281642826428364284642856428664287642886428964290642916429264293642946429564296642976429864299643006430164302643036430464305643066430764308643096431064311643126431364314643156431664317643186431964320643216432264323643246432564326643276432864329643306433164332643336433464335643366433764338643396434064341643426434364344643456434664347643486434964350643516435264353643546435564356643576435864359643606436164362643636436464365643666436764368643696437064371643726437364374643756437664377643786437964380643816438264383643846438564386643876438864389643906439164392643936439464395643966439764398643996440064401644026440364404644056440664407644086440964410644116441264413644146441564416644176441864419644206442164422644236442464425644266442764428644296443064431644326443364434644356443664437644386443964440644416444264443644446444564446644476444864449644506445164452644536445464455644566445764458644596446064461644626446364464644656446664467644686446964470644716447264473644746447564476644776447864479644806448164482644836448464485644866448764488644896449064491644926449364494644956449664497644986449964500645016450264503645046450564506645076450864509645106451164512645136451464515645166451764518645196452064521645226452364524645256452664527645286452964530645316453264533645346453564536645376453864539645406454164542645436454464545645466454764548645496455064551645526455364554645556455664557645586455964560645616456264563645646456564566645676456864569645706457164572645736457464575645766457764578645796458064581645826458364584645856458664587645886458964590645916459264593645946459564596645976459864599646006460164602646036460464605646066460764608646096461064611646126461364614646156461664617646186461964620646216462264623646246462564626646276462864629646306463164632646336463464635646366463764638646396464064641646426464364644646456464664647646486464964650646516465264653646546465564656646576465864659646606466164662646636466464665646666466764668646696467064671646726467364674646756467664677646786467964680646816468264683646846468564686646876468864689646906469164692646936469464695646966469764698646996470064701647026470364704647056470664707647086470964710647116471264713647146471564716647176471864719647206472164722647236472464725647266472764728647296473064731647326473364734647356473664737647386473964740647416474264743647446474564746647476474864749647506475164752647536475464755647566475764758647596476064761647626476364764647656476664767647686476964770647716477264773647746477564776647776477864779647806478164782647836478464785647866478764788647896479064791647926479364794647956479664797647986479964800648016480264803648046480564806648076480864809648106481164812648136481464815648166481764818648196482064821648226482364824648256482664827648286482964830648316483264833648346483564836648376483864839648406484164842648436484464845648466484764848648496485064851648526485364854648556485664857648586485964860648616486264863648646486564866648676486864869648706487164872648736487464875648766487764878648796488064881648826488364884648856488664887648886488964890648916489264893648946489564896648976489864899649006490164902649036490464905649066490764908649096491064911649126491364914649156491664917649186491964920649216492264923649246492564926649276492864929649306493164932649336493464935649366493764938649396494064941649426494364944649456494664947649486494964950649516495264953649546495564956649576495864959649606496164962649636496464965649666496764968649696497064971649726497364974649756497664977649786497964980649816498264983649846498564986649876498864989649906499164992649936499464995649966499764998649996500065001650026500365004650056500665007650086500965010650116501265013650146501565016650176501865019650206502165022650236502465025650266502765028650296503065031650326503365034650356503665037650386503965040650416504265043650446504565046650476504865049650506505165052650536505465055650566505765058650596506065061650626506365064650656506665067650686506965070650716507265073650746507565076650776507865079650806508165082650836508465085650866508765088650896509065091650926509365094650956509665097650986509965100651016510265103651046510565106651076510865109651106511165112651136511465115651166511765118651196512065121651226512365124651256512665127651286512965130651316513265133651346513565136651376513865139651406514165142651436514465145651466514765148651496515065151651526515365154651556515665157651586515965160651616516265163651646516565166651676516865169651706517165172651736517465175651766517765178651796518065181651826518365184651856518665187651886518965190651916519265193651946519565196651976519865199652006520165202652036520465205652066520765208652096521065211652126521365214652156521665217652186521965220652216522265223652246522565226652276522865229652306523165232652336523465235652366523765238652396524065241652426524365244652456524665247652486524965250652516525265253652546525565256652576525865259652606526165262652636526465265652666526765268652696527065271652726527365274652756527665277652786527965280652816528265283652846528565286652876528865289652906529165292652936529465295652966529765298652996530065301653026530365304653056530665307653086530965310653116531265313653146531565316653176531865319653206532165322653236532465325653266532765328653296533065331653326533365334653356533665337653386533965340653416534265343653446534565346653476534865349653506535165352653536535465355653566535765358653596536065361653626536365364653656536665367653686536965370653716537265373653746537565376653776537865379653806538165382653836538465385653866538765388653896539065391653926539365394653956539665397653986539965400654016540265403654046540565406654076540865409654106541165412654136541465415654166541765418654196542065421654226542365424654256542665427654286542965430654316543265433654346543565436654376543865439654406544165442654436544465445654466544765448654496545065451654526545365454654556545665457654586545965460654616546265463654646546565466654676546865469654706547165472654736547465475654766547765478654796548065481654826548365484654856548665487654886548965490654916549265493654946549565496654976549865499655006550165502655036550465505655066550765508655096551065511655126551365514655156551665517655186551965520655216552265523655246552565526655276552865529655306553165532655336553465535655366553765538655396554065541655426554365544655456554665547655486554965550655516555265553655546555565556655576555865559655606556165562655636556465565655666556765568655696557065571655726557365574655756557665577655786557965580655816558265583655846558565586655876558865589655906559165592655936559465595655966559765598655996560065601656026560365604656056560665607656086560965610656116561265613656146561565616656176561865619656206562165622656236562465625656266562765628656296563065631656326563365634656356563665637656386563965640656416564265643656446564565646656476564865649656506565165652656536565465655656566565765658656596566065661656626566365664656656566665667656686566965670656716567265673656746567565676656776567865679656806568165682656836568465685656866568765688656896569065691656926569365694656956569665697656986569965700657016570265703657046570565706657076570865709657106571165712657136571465715657166571765718657196572065721657226572365724657256572665727657286572965730657316573265733657346573565736657376573865739657406574165742657436574465745657466574765748657496575065751657526575365754657556575665757657586575965760657616576265763657646576565766657676576865769657706577165772657736577465775657766577765778657796578065781657826578365784657856578665787657886578965790657916579265793657946579565796657976579865799658006580165802658036580465805658066580765808658096581065811658126581365814658156581665817658186581965820658216582265823658246582565826658276582865829658306583165832658336583465835658366583765838658396584065841658426584365844658456584665847658486584965850658516585265853658546585565856658576585865859658606586165862658636586465865658666586765868658696587065871658726587365874658756587665877658786587965880658816588265883658846588565886658876588865889658906589165892658936589465895658966589765898658996590065901659026590365904659056590665907659086590965910659116591265913659146591565916659176591865919659206592165922659236592465925659266592765928659296593065931659326593365934659356593665937659386593965940659416594265943659446594565946659476594865949659506595165952659536595465955659566595765958659596596065961659626596365964659656596665967659686596965970659716597265973659746597565976659776597865979659806598165982659836598465985659866598765988659896599065991659926599365994659956599665997659986599966000660016600266003660046600566006660076600866009660106601166012660136601466015660166601766018660196602066021660226602366024660256602666027660286602966030660316603266033660346603566036660376603866039660406604166042660436604466045660466604766048660496605066051660526605366054660556605666057660586605966060660616606266063660646606566066660676606866069660706607166072660736607466075660766607766078660796608066081660826608366084660856608666087660886608966090660916609266093660946609566096660976609866099661006610166102661036610466105661066610766108661096611066111661126611366114661156611666117661186611966120661216612266123661246612566126661276612866129661306613166132661336613466135661366613766138661396614066141661426614366144661456614666147661486614966150661516615266153661546615566156661576615866159661606616166162661636616466165661666616766168661696617066171661726617366174661756617666177661786617966180661816618266183661846618566186661876618866189661906619166192661936619466195661966619766198661996620066201662026620366204662056620666207662086620966210662116621266213662146621566216662176621866219662206622166222662236622466225662266622766228662296623066231662326623366234662356623666237662386623966240662416624266243662446624566246662476624866249662506625166252662536625466255662566625766258662596626066261662626626366264662656626666267662686626966270662716627266273662746627566276662776627866279662806628166282662836628466285662866628766288662896629066291662926629366294662956629666297662986629966300663016630266303663046630566306663076630866309663106631166312663136631466315663166631766318663196632066321663226632366324663256632666327663286632966330663316633266333663346633566336663376633866339663406634166342663436634466345663466634766348663496635066351663526635366354663556635666357663586635966360663616636266363663646636566366663676636866369663706637166372663736637466375663766637766378663796638066381663826638366384663856638666387663886638966390663916639266393663946639566396663976639866399664006640166402664036640466405664066640766408664096641066411664126641366414664156641666417664186641966420664216642266423664246642566426664276642866429664306643166432664336643466435664366643766438664396644066441664426644366444664456644666447664486644966450664516645266453664546645566456664576645866459664606646166462664636646466465664666646766468664696647066471664726647366474664756647666477664786647966480664816648266483664846648566486664876648866489664906649166492664936649466495664966649766498664996650066501665026650366504665056650666507665086650966510665116651266513665146651566516665176651866519665206652166522665236652466525665266652766528665296653066531665326653366534665356653666537665386653966540665416654266543665446654566546665476654866549665506655166552665536655466555665566655766558665596656066561665626656366564665656656666567665686656966570665716657266573665746657566576665776657866579665806658166582665836658466585665866658766588665896659066591665926659366594665956659666597665986659966600666016660266603666046660566606666076660866609666106661166612666136661466615666166661766618666196662066621666226662366624666256662666627666286662966630666316663266633666346663566636666376663866639666406664166642666436664466645666466664766648666496665066651666526665366654666556665666657666586665966660666616666266663666646666566666666676666866669666706667166672666736667466675666766667766678666796668066681666826668366684666856668666687666886668966690666916669266693666946669566696666976669866699667006670166702667036670466705667066670766708667096671066711667126671366714667156671666717667186671966720667216672266723667246672566726667276672866729667306673166732667336673466735667366673766738667396674066741667426674366744667456674666747667486674966750667516675266753667546675566756667576675866759667606676166762667636676466765667666676766768667696677066771667726677366774667756677666777667786677966780667816678266783667846678566786667876678866789667906679166792667936679466795667966679766798667996680066801668026680366804668056680666807668086680966810668116681266813668146681566816668176681866819668206682166822668236682466825668266682766828668296683066831668326683366834668356683666837668386683966840668416684266843668446684566846668476684866849668506685166852668536685466855668566685766858668596686066861668626686366864668656686666867668686686966870668716687266873668746687566876668776687866879668806688166882668836688466885668866688766888668896689066891668926689366894668956689666897668986689966900669016690266903669046690566906669076690866909669106691166912669136691466915669166691766918669196692066921669226692366924669256692666927669286692966930669316693266933669346693566936669376693866939669406694166942669436694466945669466694766948669496695066951669526695366954669556695666957669586695966960669616696266963669646696566966669676696866969669706697166972669736697466975669766697766978669796698066981669826698366984669856698666987669886698966990669916699266993669946699566996669976699866999670006700167002670036700467005670066700767008670096701067011670126701367014670156701667017670186701967020670216702267023670246702567026670276702867029670306703167032670336703467035670366703767038670396704067041670426704367044670456704667047670486704967050670516705267053670546705567056670576705867059670606706167062670636706467065670666706767068670696707067071670726707367074670756707667077670786707967080670816708267083670846708567086670876708867089670906709167092670936709467095670966709767098670996710067101671026710367104671056710667107671086710967110671116711267113671146711567116671176711867119671206712167122671236712467125671266712767128671296713067131671326713367134671356713667137671386713967140671416714267143671446714567146671476714867149671506715167152671536715467155671566715767158671596716067161671626716367164671656716667167671686716967170671716717267173671746717567176671776717867179671806718167182671836718467185671866718767188671896719067191671926719367194671956719667197671986719967200672016720267203672046720567206672076720867209672106721167212672136721467215672166721767218672196722067221672226722367224672256722667227672286722967230672316723267233672346723567236672376723867239672406724167242672436724467245672466724767248672496725067251672526725367254672556725667257672586725967260672616726267263672646726567266672676726867269672706727167272672736727467275672766727767278672796728067281672826728367284672856728667287672886728967290672916729267293672946729567296672976729867299673006730167302673036730467305673066730767308673096731067311673126731367314673156731667317673186731967320673216732267323673246732567326673276732867329673306733167332673336733467335673366733767338673396734067341673426734367344673456734667347673486734967350673516735267353673546735567356673576735867359673606736167362673636736467365673666736767368673696737067371673726737367374673756737667377673786737967380673816738267383673846738567386673876738867389673906739167392673936739467395673966739767398673996740067401674026740367404674056740667407674086740967410674116741267413674146741567416674176741867419674206742167422674236742467425674266742767428674296743067431674326743367434674356743667437674386743967440674416744267443674446744567446674476744867449674506745167452674536745467455674566745767458674596746067461674626746367464674656746667467674686746967470674716747267473674746747567476674776747867479674806748167482674836748467485674866748767488674896749067491674926749367494674956749667497674986749967500675016750267503675046750567506675076750867509675106751167512675136751467515675166751767518675196752067521675226752367524675256752667527675286752967530675316753267533675346753567536675376753867539675406754167542675436754467545675466754767548675496755067551675526755367554675556755667557675586755967560675616756267563675646756567566675676756867569675706757167572675736757467575675766757767578675796758067581675826758367584675856758667587675886758967590675916759267593675946759567596675976759867599676006760167602676036760467605676066760767608676096761067611676126761367614676156761667617676186761967620676216762267623676246762567626676276762867629676306763167632676336763467635676366763767638676396764067641676426764367644676456764667647676486764967650676516765267653676546765567656676576765867659676606766167662676636766467665676666766767668676696767067671676726767367674676756767667677676786767967680676816768267683676846768567686676876768867689676906769167692676936769467695676966769767698676996770067701677026770367704677056770667707677086770967710677116771267713677146771567716677176771867719677206772167722677236772467725677266772767728677296773067731677326773367734677356773667737677386773967740677416774267743677446774567746677476774867749677506775167752677536775467755677566775767758677596776067761677626776367764677656776667767677686776967770677716777267773677746777567776677776777867779677806778167782677836778467785677866778767788677896779067791677926779367794677956779667797677986779967800678016780267803678046780567806678076780867809678106781167812678136781467815678166781767818678196782067821678226782367824678256782667827678286782967830678316783267833678346783567836678376783867839678406784167842678436784467845678466784767848678496785067851678526785367854678556785667857678586785967860678616786267863678646786567866678676786867869678706787167872678736787467875678766787767878678796788067881678826788367884678856788667887678886788967890678916789267893678946789567896678976789867899679006790167902679036790467905679066790767908679096791067911679126791367914679156791667917679186791967920679216792267923679246792567926679276792867929679306793167932679336793467935679366793767938679396794067941679426794367944679456794667947679486794967950679516795267953679546795567956679576795867959679606796167962679636796467965679666796767968679696797067971679726797367974679756797667977679786797967980679816798267983679846798567986679876798867989679906799167992679936799467995679966799767998679996800068001680026800368004680056800668007680086800968010680116801268013680146801568016680176801868019680206802168022680236802468025680266802768028680296803068031680326803368034680356803668037680386803968040680416804268043680446804568046680476804868049680506805168052680536805468055680566805768058680596806068061680626806368064680656806668067680686806968070680716807268073680746807568076680776807868079680806808168082680836808468085680866808768088680896809068091680926809368094680956809668097680986809968100681016810268103681046810568106681076810868109681106811168112681136811468115681166811768118681196812068121681226812368124681256812668127681286812968130681316813268133681346813568136681376813868139681406814168142681436814468145681466814768148681496815068151681526815368154681556815668157681586815968160681616816268163681646816568166681676816868169681706817168172681736817468175681766817768178681796818068181681826818368184681856818668187681886818968190681916819268193681946819568196681976819868199682006820168202682036820468205682066820768208682096821068211682126821368214682156821668217682186821968220682216822268223682246822568226682276822868229682306823168232682336823468235682366823768238682396824068241682426824368244682456824668247682486824968250682516825268253682546825568256682576825868259682606826168262682636826468265682666826768268682696827068271682726827368274682756827668277682786827968280682816828268283682846828568286682876828868289682906829168292682936829468295682966829768298682996830068301683026830368304683056830668307683086830968310683116831268313683146831568316683176831868319683206832168322683236832468325683266832768328683296833068331683326833368334683356833668337683386833968340683416834268343683446834568346683476834868349683506835168352683536835468355683566835768358683596836068361683626836368364683656836668367683686836968370683716837268373683746837568376683776837868379683806838168382683836838468385683866838768388683896839068391683926839368394683956839668397683986839968400684016840268403684046840568406684076840868409684106841168412684136841468415684166841768418684196842068421684226842368424684256842668427684286842968430684316843268433684346843568436684376843868439684406844168442684436844468445684466844768448684496845068451684526845368454684556845668457684586845968460684616846268463684646846568466684676846868469684706847168472684736847468475684766847768478684796848068481684826848368484684856848668487684886848968490684916849268493684946849568496684976849868499685006850168502685036850468505685066850768508685096851068511685126851368514685156851668517685186851968520685216852268523685246852568526685276852868529685306853168532685336853468535685366853768538685396854068541685426854368544685456854668547685486854968550685516855268553685546855568556685576855868559685606856168562685636856468565685666856768568685696857068571685726857368574685756857668577685786857968580685816858268583685846858568586685876858868589685906859168592685936859468595685966859768598685996860068601686026860368604686056860668607686086860968610686116861268613686146861568616686176861868619686206862168622686236862468625686266862768628686296863068631686326863368634686356863668637686386863968640686416864268643686446864568646686476864868649686506865168652686536865468655686566865768658686596866068661686626866368664686656866668667686686866968670686716867268673686746867568676686776867868679686806868168682686836868468685686866868768688686896869068691686926869368694686956869668697686986869968700687016870268703687046870568706687076870868709687106871168712687136871468715687166871768718687196872068721687226872368724687256872668727687286872968730687316873268733687346873568736687376873868739687406874168742687436874468745687466874768748687496875068751687526875368754687556875668757687586875968760687616876268763687646876568766687676876868769687706877168772687736877468775687766877768778687796878068781687826878368784687856878668787687886878968790687916879268793687946879568796687976879868799688006880168802688036880468805688066880768808688096881068811688126881368814688156881668817688186881968820688216882268823688246882568826688276882868829688306883168832688336883468835688366883768838688396884068841688426884368844688456884668847688486884968850688516885268853688546885568856688576885868859688606886168862688636886468865688666886768868688696887068871688726887368874688756887668877688786887968880688816888268883688846888568886688876888868889688906889168892688936889468895688966889768898688996890068901689026890368904689056890668907689086890968910689116891268913689146891568916689176891868919689206892168922689236892468925689266892768928689296893068931689326893368934689356893668937689386893968940689416894268943689446894568946689476894868949689506895168952689536895468955689566895768958689596896068961689626896368964689656896668967689686896968970689716897268973689746897568976689776897868979689806898168982689836898468985689866898768988689896899068991689926899368994689956899668997689986899969000690016900269003690046900569006690076900869009690106901169012690136901469015690166901769018690196902069021690226902369024690256902669027690286902969030690316903269033690346903569036690376903869039690406904169042690436904469045690466904769048690496905069051690526905369054690556905669057690586905969060690616906269063690646906569066690676906869069690706907169072690736907469075690766907769078690796908069081690826908369084690856908669087690886908969090690916909269093690946909569096690976909869099691006910169102691036910469105691066910769108691096911069111691126911369114691156911669117691186911969120691216912269123691246912569126691276912869129691306913169132691336913469135691366913769138691396914069141691426914369144691456914669147691486914969150691516915269153691546915569156691576915869159691606916169162691636916469165691666916769168691696917069171691726917369174691756917669177691786917969180691816918269183691846918569186691876918869189691906919169192691936919469195691966919769198691996920069201692026920369204692056920669207692086920969210692116921269213692146921569216692176921869219692206922169222692236922469225692266922769228692296923069231692326923369234692356923669237692386923969240692416924269243692446924569246692476924869249692506925169252692536925469255692566925769258692596926069261692626926369264692656926669267692686926969270692716927269273692746927569276692776927869279692806928169282692836928469285692866928769288692896929069291692926929369294692956929669297692986929969300693016930269303693046930569306693076930869309693106931169312693136931469315693166931769318693196932069321693226932369324693256932669327693286932969330693316933269333693346933569336693376933869339693406934169342693436934469345693466934769348693496935069351693526935369354693556935669357693586935969360693616936269363693646936569366693676936869369693706937169372693736937469375693766937769378693796938069381693826938369384693856938669387693886938969390693916939269393693946939569396693976939869399694006940169402694036940469405694066940769408694096941069411694126941369414694156941669417694186941969420694216942269423694246942569426694276942869429694306943169432694336943469435694366943769438694396944069441694426944369444694456944669447694486944969450694516945269453694546945569456694576945869459694606946169462694636946469465694666946769468694696947069471694726947369474694756947669477694786947969480694816948269483694846948569486694876948869489694906949169492694936949469495694966949769498694996950069501695026950369504695056950669507695086950969510695116951269513695146951569516695176951869519695206952169522695236952469525695266952769528695296953069531695326953369534695356953669537695386953969540695416954269543695446954569546695476954869549695506955169552695536955469555695566955769558695596956069561695626956369564695656956669567695686956969570695716957269573695746957569576695776957869579695806958169582695836958469585695866958769588695896959069591695926959369594695956959669597695986959969600696016960269603696046960569606696076960869609696106961169612696136961469615696166961769618696196962069621696226962369624696256962669627696286962969630696316963269633696346963569636696376963869639696406964169642696436964469645696466964769648696496965069651696526965369654696556965669657696586965969660696616966269663696646966569666696676966869669696706967169672696736967469675696766967769678696796968069681696826968369684696856968669687696886968969690696916969269693696946969569696696976969869699697006970169702697036970469705697066970769708697096971069711697126971369714697156971669717697186971969720697216972269723697246972569726697276972869729697306973169732697336973469735697366973769738697396974069741697426974369744697456974669747697486974969750697516975269753697546975569756697576975869759697606976169762697636976469765697666976769768697696977069771697726977369774697756977669777697786977969780697816978269783697846978569786697876978869789697906979169792697936979469795697966979769798697996980069801698026980369804698056980669807698086980969810698116981269813698146981569816698176981869819698206982169822698236982469825698266982769828698296983069831698326983369834698356983669837698386983969840698416984269843698446984569846698476984869849698506985169852698536985469855698566985769858698596986069861698626986369864698656986669867698686986969870698716987269873698746987569876698776987869879698806988169882698836988469885698866988769888698896989069891698926989369894698956989669897698986989969900699016990269903699046990569906699076990869909699106991169912699136991469915699166991769918699196992069921699226992369924699256992669927699286992969930699316993269933699346993569936699376993869939699406994169942699436994469945699466994769948699496995069951699526995369954699556995669957699586995969960699616996269963699646996569966699676996869969699706997169972699736997469975699766997769978699796998069981699826998369984699856998669987699886998969990699916999269993699946999569996699976999869999700007000170002700037000470005700067000770008700097001070011700127001370014700157001670017700187001970020700217002270023700247002570026700277002870029700307003170032700337003470035700367003770038700397004070041700427004370044700457004670047700487004970050700517005270053700547005570056700577005870059700607006170062700637006470065700667006770068700697007070071700727007370074700757007670077700787007970080700817008270083700847008570086700877008870089700907009170092700937009470095700967009770098700997010070101701027010370104701057010670107701087010970110701117011270113701147011570116701177011870119701207012170122701237012470125701267012770128701297013070131701327013370134701357013670137701387013970140701417014270143701447014570146701477014870149701507015170152701537015470155701567015770158701597016070161701627016370164701657016670167701687016970170701717017270173701747017570176701777017870179701807018170182701837018470185701867018770188701897019070191701927019370194701957019670197701987019970200702017020270203702047020570206702077020870209702107021170212702137021470215702167021770218702197022070221702227022370224702257022670227702287022970230702317023270233702347023570236702377023870239702407024170242702437024470245702467024770248702497025070251702527025370254702557025670257702587025970260702617026270263702647026570266702677026870269702707027170272702737027470275702767027770278702797028070281702827028370284702857028670287702887028970290702917029270293702947029570296702977029870299703007030170302703037030470305703067030770308703097031070311703127031370314703157031670317703187031970320703217032270323703247032570326703277032870329703307033170332703337033470335703367033770338703397034070341703427034370344703457034670347703487034970350703517035270353703547035570356703577035870359703607036170362703637036470365703667036770368703697037070371703727037370374703757037670377703787037970380703817038270383703847038570386703877038870389703907039170392703937039470395703967039770398703997040070401704027040370404704057040670407704087040970410704117041270413704147041570416704177041870419704207042170422704237042470425704267042770428704297043070431704327043370434704357043670437704387043970440704417044270443704447044570446704477044870449704507045170452704537045470455704567045770458704597046070461704627046370464704657046670467704687046970470704717047270473704747047570476704777047870479704807048170482704837048470485704867048770488704897049070491704927049370494704957049670497704987049970500705017050270503705047050570506705077050870509705107051170512705137051470515705167051770518705197052070521705227052370524705257052670527705287052970530705317053270533705347053570536705377053870539705407054170542705437054470545705467054770548705497055070551705527055370554705557055670557705587055970560705617056270563705647056570566705677056870569705707057170572705737057470575705767057770578705797058070581705827058370584705857058670587705887058970590705917059270593705947059570596705977059870599706007060170602706037060470605706067060770608706097061070611706127061370614706157061670617706187061970620706217062270623706247062570626706277062870629706307063170632706337063470635706367063770638706397064070641706427064370644706457064670647706487064970650706517065270653706547065570656706577065870659706607066170662706637066470665706667066770668706697067070671706727067370674706757067670677706787067970680706817068270683706847068570686706877068870689706907069170692706937069470695706967069770698706997070070701707027070370704707057070670707707087070970710707117071270713707147071570716707177071870719707207072170722707237072470725707267072770728707297073070731707327073370734707357073670737707387073970740707417074270743707447074570746707477074870749707507075170752707537075470755707567075770758707597076070761707627076370764707657076670767707687076970770707717077270773707747077570776707777077870779707807078170782707837078470785707867078770788707897079070791707927079370794707957079670797707987079970800708017080270803708047080570806708077080870809708107081170812708137081470815708167081770818708197082070821708227082370824708257082670827708287082970830708317083270833708347083570836708377083870839708407084170842708437084470845708467084770848708497085070851708527085370854708557085670857708587085970860708617086270863708647086570866708677086870869708707087170872708737087470875708767087770878708797088070881708827088370884708857088670887708887088970890708917089270893708947089570896708977089870899709007090170902709037090470905709067090770908709097091070911709127091370914709157091670917709187091970920709217092270923709247092570926709277092870929709307093170932709337093470935709367093770938709397094070941709427094370944709457094670947709487094970950709517095270953709547095570956709577095870959709607096170962709637096470965709667096770968709697097070971709727097370974709757097670977709787097970980709817098270983709847098570986709877098870989709907099170992709937099470995709967099770998709997100071001710027100371004710057100671007710087100971010710117101271013710147101571016710177101871019710207102171022710237102471025710267102771028710297103071031710327103371034710357103671037710387103971040710417104271043710447104571046710477104871049710507105171052710537105471055710567105771058710597106071061710627106371064710657106671067710687106971070710717107271073710747107571076710777107871079710807108171082710837108471085710867108771088710897109071091710927109371094710957109671097710987109971100711017110271103711047110571106711077110871109711107111171112711137111471115711167111771118711197112071121711227112371124711257112671127711287112971130711317113271133711347113571136711377113871139711407114171142711437114471145711467114771148711497115071151711527115371154711557115671157711587115971160711617116271163711647116571166711677116871169711707117171172711737117471175711767117771178711797118071181711827118371184711857118671187711887118971190711917119271193711947119571196711977119871199712007120171202712037120471205712067120771208712097121071211712127121371214712157121671217712187121971220712217122271223712247122571226712277122871229712307123171232712337123471235712367123771238712397124071241712427124371244712457124671247712487124971250712517125271253712547125571256712577125871259712607126171262712637126471265712667126771268712697127071271712727127371274712757127671277712787127971280712817128271283712847128571286712877128871289712907129171292712937129471295712967129771298712997130071301713027130371304713057130671307713087130971310713117131271313713147131571316713177131871319713207132171322713237132471325713267132771328713297133071331713327133371334713357133671337713387133971340713417134271343713447134571346713477134871349713507135171352713537135471355713567135771358713597136071361713627136371364713657136671367713687136971370713717137271373713747137571376713777137871379713807138171382713837138471385713867138771388713897139071391713927139371394713957139671397713987139971400714017140271403714047140571406714077140871409714107141171412714137141471415714167141771418714197142071421714227142371424714257142671427714287142971430714317143271433714347143571436714377143871439714407144171442714437144471445714467144771448714497145071451714527145371454714557145671457714587145971460714617146271463714647146571466714677146871469714707147171472714737147471475714767147771478714797148071481714827148371484714857148671487714887148971490714917149271493714947149571496714977149871499715007150171502715037150471505715067150771508715097151071511715127151371514715157151671517715187151971520715217152271523715247152571526715277152871529715307153171532715337153471535715367153771538715397154071541715427154371544715457154671547715487154971550715517155271553715547155571556715577155871559715607156171562715637156471565715667156771568715697157071571715727157371574715757157671577715787157971580715817158271583715847158571586715877158871589715907159171592715937159471595715967159771598715997160071601716027160371604716057160671607716087160971610716117161271613716147161571616716177161871619716207162171622716237162471625716267162771628716297163071631716327163371634716357163671637716387163971640716417164271643716447164571646716477164871649716507165171652716537165471655716567165771658716597166071661716627166371664716657166671667716687166971670716717167271673716747167571676716777167871679716807168171682716837168471685716867168771688716897169071691716927169371694716957169671697716987169971700717017170271703717047170571706717077170871709717107171171712717137171471715717167171771718717197172071721717227172371724717257172671727717287172971730717317173271733717347173571736717377173871739717407174171742717437174471745717467174771748717497175071751717527175371754717557175671757717587175971760717617176271763717647176571766717677176871769717707177171772717737177471775717767177771778717797178071781717827178371784717857178671787717887178971790717917179271793717947179571796717977179871799718007180171802718037180471805718067180771808718097181071811718127181371814718157181671817718187181971820718217182271823718247182571826718277182871829718307183171832718337183471835718367183771838718397184071841718427184371844718457184671847718487184971850718517185271853718547185571856718577185871859718607186171862718637186471865718667186771868718697187071871718727187371874718757187671877718787187971880718817188271883718847188571886718877188871889718907189171892718937189471895718967189771898718997190071901719027190371904719057190671907719087190971910719117191271913719147191571916719177191871919719207192171922719237192471925719267192771928719297193071931719327193371934719357193671937719387193971940719417194271943719447194571946719477194871949719507195171952719537195471955719567195771958719597196071961719627196371964719657196671967719687196971970719717197271973719747197571976719777197871979719807198171982719837198471985719867198771988719897199071991719927199371994719957199671997719987199972000720017200272003720047200572006720077200872009720107201172012720137201472015720167201772018720197202072021720227202372024720257202672027720287202972030720317203272033720347203572036720377203872039720407204172042720437204472045720467204772048720497205072051720527205372054720557205672057720587205972060720617206272063720647206572066720677206872069720707207172072720737207472075720767207772078720797208072081720827208372084720857208672087720887208972090720917209272093720947209572096720977209872099721007210172102721037210472105721067210772108721097211072111721127211372114721157211672117721187211972120721217212272123721247212572126721277212872129721307213172132721337213472135721367213772138721397214072141721427214372144721457214672147721487214972150721517215272153721547215572156721577215872159721607216172162721637216472165721667216772168721697217072171721727217372174721757217672177721787217972180721817218272183721847218572186721877218872189721907219172192721937219472195721967219772198721997220072201722027220372204722057220672207722087220972210722117221272213722147221572216722177221872219722207222172222722237222472225722267222772228722297223072231722327223372234722357223672237722387223972240722417224272243722447224572246722477224872249722507225172252722537225472255722567225772258722597226072261722627226372264722657226672267722687226972270722717227272273722747227572276722777227872279722807228172282722837228472285722867228772288722897229072291722927229372294722957229672297722987229972300723017230272303723047230572306723077230872309723107231172312723137231472315723167231772318723197232072321723227232372324723257232672327723287232972330723317233272333723347233572336723377233872339723407234172342723437234472345723467234772348723497235072351723527235372354723557235672357723587235972360723617236272363723647236572366723677236872369723707237172372723737237472375723767237772378723797238072381723827238372384723857238672387723887238972390723917239272393723947239572396723977239872399724007240172402724037240472405724067240772408724097241072411724127241372414724157241672417724187241972420724217242272423724247242572426724277242872429724307243172432724337243472435724367243772438724397244072441724427244372444724457244672447724487244972450724517245272453724547245572456724577245872459724607246172462724637246472465724667246772468724697247072471724727247372474724757247672477724787247972480724817248272483724847248572486724877248872489724907249172492724937249472495724967249772498724997250072501725027250372504725057250672507725087250972510725117251272513725147251572516725177251872519725207252172522725237252472525725267252772528725297253072531725327253372534725357253672537725387253972540725417254272543725447254572546725477254872549725507255172552725537255472555725567255772558725597256072561725627256372564725657256672567725687256972570725717257272573725747257572576725777257872579725807258172582725837258472585725867258772588725897259072591725927259372594725957259672597725987259972600726017260272603726047260572606726077260872609726107261172612726137261472615726167261772618726197262072621726227262372624726257262672627726287262972630726317263272633726347263572636726377263872639726407264172642726437264472645726467264772648726497265072651726527265372654726557265672657726587265972660726617266272663726647266572666726677266872669726707267172672726737267472675726767267772678726797268072681726827268372684726857268672687726887268972690726917269272693726947269572696726977269872699727007270172702727037270472705727067270772708727097271072711727127271372714727157271672717727187271972720727217272272723727247272572726727277272872729727307273172732727337273472735727367273772738727397274072741727427274372744727457274672747727487274972750727517275272753727547275572756727577275872759727607276172762727637276472765727667276772768727697277072771727727277372774727757277672777727787277972780727817278272783727847278572786727877278872789727907279172792727937279472795727967279772798727997280072801728027280372804728057280672807728087280972810728117281272813728147281572816728177281872819728207282172822728237282472825728267282772828728297283072831728327283372834728357283672837728387283972840728417284272843728447284572846728477284872849728507285172852728537285472855728567285772858728597286072861728627286372864728657286672867728687286972870728717287272873728747287572876728777287872879728807288172882728837288472885728867288772888728897289072891728927289372894728957289672897728987289972900729017290272903729047290572906729077290872909729107291172912729137291472915729167291772918729197292072921729227292372924729257292672927729287292972930729317293272933729347293572936729377293872939729407294172942729437294472945729467294772948729497295072951729527295372954729557295672957729587295972960729617296272963729647296572966729677296872969729707297172972729737297472975729767297772978729797298072981729827298372984729857298672987729887298972990729917299272993729947299572996729977299872999730007300173002730037300473005730067300773008730097301073011730127301373014730157301673017730187301973020730217302273023730247302573026730277302873029730307303173032730337303473035730367303773038730397304073041730427304373044730457304673047730487304973050730517305273053730547305573056730577305873059730607306173062730637306473065730667306773068730697307073071730727307373074730757307673077730787307973080730817308273083730847308573086730877308873089730907309173092730937309473095730967309773098730997310073101731027310373104731057310673107731087310973110731117311273113731147311573116731177311873119731207312173122731237312473125731267312773128731297313073131731327313373134731357313673137731387313973140731417314273143731447314573146731477314873149731507315173152731537315473155731567315773158731597316073161731627316373164731657316673167731687316973170731717317273173731747317573176731777317873179731807318173182731837318473185731867318773188731897319073191731927319373194731957319673197731987319973200732017320273203732047320573206732077320873209732107321173212732137321473215732167321773218732197322073221732227322373224732257322673227732287322973230732317323273233732347323573236732377323873239732407324173242732437324473245732467324773248732497325073251732527325373254732557325673257732587325973260732617326273263732647326573266732677326873269732707327173272732737327473275732767327773278732797328073281732827328373284732857328673287732887328973290732917329273293732947329573296732977329873299733007330173302733037330473305733067330773308733097331073311733127331373314733157331673317733187331973320733217332273323733247332573326733277332873329733307333173332733337333473335733367333773338733397334073341733427334373344733457334673347733487334973350733517335273353733547335573356733577335873359733607336173362733637336473365733667336773368733697337073371733727337373374733757337673377733787337973380733817338273383733847338573386733877338873389733907339173392733937339473395733967339773398733997340073401734027340373404734057340673407734087340973410734117341273413734147341573416734177341873419734207342173422734237342473425734267342773428734297343073431734327343373434734357343673437734387343973440734417344273443734447344573446734477344873449734507345173452734537345473455734567345773458734597346073461734627346373464734657346673467734687346973470734717347273473734747347573476734777347873479734807348173482734837348473485734867348773488734897349073491734927349373494734957349673497734987349973500735017350273503735047350573506735077350873509735107351173512735137351473515735167351773518735197352073521735227352373524735257352673527735287352973530735317353273533735347353573536735377353873539735407354173542735437354473545735467354773548735497355073551735527355373554735557355673557735587355973560735617356273563735647356573566735677356873569735707357173572735737357473575735767357773578735797358073581735827358373584735857358673587735887358973590735917359273593735947359573596735977359873599736007360173602736037360473605736067360773608736097361073611736127361373614736157361673617736187361973620736217362273623736247362573626736277362873629736307363173632736337363473635736367363773638736397364073641736427364373644736457364673647736487364973650736517365273653736547365573656736577365873659736607366173662736637366473665736667366773668736697367073671736727367373674736757367673677736787367973680736817368273683736847368573686736877368873689736907369173692736937369473695736967369773698736997370073701737027370373704737057370673707737087370973710737117371273713737147371573716737177371873719737207372173722737237372473725737267372773728737297373073731737327373373734737357373673737737387373973740737417374273743737447374573746737477374873749737507375173752737537375473755737567375773758737597376073761737627376373764737657376673767737687376973770737717377273773737747377573776737777377873779737807378173782737837378473785737867378773788737897379073791737927379373794737957379673797737987379973800738017380273803738047380573806738077380873809738107381173812738137381473815738167381773818738197382073821738227382373824738257382673827738287382973830738317383273833738347383573836738377383873839738407384173842738437384473845738467384773848738497385073851738527385373854738557385673857738587385973860738617386273863738647386573866738677386873869738707387173872738737387473875738767387773878738797388073881738827388373884738857388673887738887388973890738917389273893738947389573896738977389873899739007390173902739037390473905739067390773908739097391073911739127391373914739157391673917739187391973920739217392273923739247392573926739277392873929739307393173932739337393473935739367393773938739397394073941739427394373944739457394673947739487394973950739517395273953739547395573956739577395873959739607396173962739637396473965739667396773968739697397073971739727397373974739757397673977739787397973980739817398273983739847398573986739877398873989739907399173992739937399473995739967399773998739997400074001740027400374004740057400674007740087400974010740117401274013740147401574016740177401874019740207402174022740237402474025740267402774028740297403074031740327403374034740357403674037740387403974040740417404274043740447404574046740477404874049740507405174052740537405474055740567405774058740597406074061740627406374064740657406674067740687406974070740717407274073740747407574076740777407874079740807408174082740837408474085740867408774088740897409074091740927409374094740957409674097740987409974100741017410274103741047410574106741077410874109741107411174112741137411474115741167411774118741197412074121741227412374124741257412674127741287412974130741317413274133741347413574136741377413874139741407414174142741437414474145741467414774148741497415074151741527415374154741557415674157741587415974160741617416274163741647416574166741677416874169741707417174172741737417474175741767417774178741797418074181741827418374184741857418674187741887418974190741917419274193741947419574196741977419874199742007420174202742037420474205742067420774208742097421074211742127421374214742157421674217742187421974220742217422274223742247422574226742277422874229742307423174232742337423474235742367423774238742397424074241742427424374244742457424674247742487424974250742517425274253742547425574256742577425874259742607426174262742637426474265742667426774268742697427074271742727427374274742757427674277742787427974280742817428274283742847428574286742877428874289742907429174292742937429474295742967429774298742997430074301743027430374304743057430674307743087430974310743117431274313743147431574316743177431874319743207432174322743237432474325743267432774328743297433074331743327433374334743357433674337743387433974340743417434274343743447434574346743477434874349743507435174352743537435474355743567435774358743597436074361743627436374364743657436674367743687436974370743717437274373743747437574376743777437874379743807438174382743837438474385743867438774388743897439074391743927439374394743957439674397743987439974400744017440274403744047440574406744077440874409744107441174412744137441474415744167441774418744197442074421744227442374424744257442674427744287442974430744317443274433744347443574436744377443874439744407444174442744437444474445744467444774448744497445074451744527445374454744557445674457744587445974460744617446274463744647446574466744677446874469744707447174472744737447474475744767447774478744797448074481744827448374484744857448674487744887448974490744917449274493744947449574496744977449874499745007450174502745037450474505745067450774508745097451074511745127451374514745157451674517745187451974520745217452274523745247452574526745277452874529745307453174532745337453474535745367453774538745397454074541745427454374544745457454674547745487454974550745517455274553745547455574556745577455874559745607456174562745637456474565745667456774568745697457074571745727457374574745757457674577745787457974580745817458274583745847458574586745877458874589745907459174592745937459474595745967459774598745997460074601746027460374604746057460674607746087460974610746117461274613746147461574616746177461874619746207462174622746237462474625746267462774628746297463074631746327463374634746357463674637746387463974640746417464274643746447464574646746477464874649746507465174652746537465474655746567465774658746597466074661746627466374664746657466674667746687466974670746717467274673746747467574676746777467874679746807468174682746837468474685746867468774688746897469074691746927469374694746957469674697746987469974700747017470274703747047470574706747077470874709747107471174712747137471474715747167471774718747197472074721747227472374724747257472674727747287472974730747317473274733747347473574736747377473874739747407474174742747437474474745747467474774748747497475074751747527475374754747557475674757747587475974760747617476274763747647476574766747677476874769747707477174772747737477474775747767477774778747797478074781747827478374784747857478674787747887478974790747917479274793747947479574796747977479874799748007480174802748037480474805748067480774808748097481074811748127481374814748157481674817748187481974820748217482274823748247482574826748277482874829748307483174832748337483474835748367483774838748397484074841748427484374844748457484674847748487484974850748517485274853748547485574856748577485874859748607486174862748637486474865748667486774868748697487074871748727487374874748757487674877748787487974880748817488274883748847488574886748877488874889748907489174892748937489474895748967489774898748997490074901749027490374904749057490674907749087490974910749117491274913749147491574916749177491874919749207492174922749237492474925749267492774928749297493074931749327493374934749357493674937749387493974940749417494274943749447494574946749477494874949749507495174952749537495474955749567495774958749597496074961749627496374964749657496674967749687496974970749717497274973749747497574976749777497874979749807498174982749837498474985749867498774988749897499074991749927499374994749957499674997749987499975000750017500275003750047500575006750077500875009750107501175012750137501475015750167501775018750197502075021750227502375024750257502675027750287502975030750317503275033750347503575036750377503875039750407504175042750437504475045750467504775048750497505075051750527505375054750557505675057750587505975060750617506275063750647506575066750677506875069750707507175072750737507475075750767507775078750797508075081750827508375084750857508675087750887508975090750917509275093750947509575096750977509875099751007510175102751037510475105751067510775108751097511075111751127511375114751157511675117751187511975120751217512275123751247512575126751277512875129751307513175132751337513475135751367513775138751397514075141751427514375144751457514675147751487514975150751517515275153751547515575156751577515875159751607516175162751637516475165751667516775168751697517075171751727517375174751757517675177751787517975180751817518275183751847518575186751877518875189751907519175192751937519475195751967519775198751997520075201752027520375204752057520675207752087520975210752117521275213752147521575216752177521875219752207522175222752237522475225752267522775228752297523075231752327523375234752357523675237752387523975240752417524275243752447524575246752477524875249752507525175252752537525475255752567525775258752597526075261752627526375264752657526675267752687526975270752717527275273752747527575276752777527875279752807528175282752837528475285752867528775288752897529075291752927529375294752957529675297752987529975300753017530275303753047530575306753077530875309753107531175312753137531475315753167531775318753197532075321753227532375324753257532675327753287532975330753317533275333753347533575336753377533875339753407534175342753437534475345753467534775348753497535075351753527535375354753557535675357753587535975360753617536275363753647536575366753677536875369753707537175372753737537475375753767537775378753797538075381753827538375384753857538675387753887538975390753917539275393753947539575396753977539875399754007540175402754037540475405754067540775408754097541075411754127541375414754157541675417754187541975420754217542275423754247542575426754277542875429754307543175432754337543475435754367543775438754397544075441754427544375444754457544675447754487544975450754517545275453754547545575456754577545875459754607546175462754637546475465754667546775468754697547075471754727547375474754757547675477754787547975480754817548275483754847548575486754877548875489754907549175492754937549475495754967549775498754997550075501755027550375504755057550675507755087550975510755117551275513755147551575516755177551875519755207552175522755237552475525755267552775528755297553075531755327553375534755357553675537755387553975540755417554275543755447554575546755477554875549755507555175552755537555475555755567555775558755597556075561755627556375564755657556675567755687556975570755717557275573755747557575576755777557875579755807558175582755837558475585755867558775588755897559075591755927559375594755957559675597755987559975600756017560275603756047560575606756077560875609756107561175612756137561475615756167561775618756197562075621756227562375624756257562675627756287562975630756317563275633756347563575636756377563875639756407564175642756437564475645756467564775648756497565075651756527565375654756557565675657756587565975660756617566275663756647566575666756677566875669756707567175672756737567475675756767567775678756797568075681756827568375684756857568675687756887568975690756917569275693756947569575696756977569875699757007570175702757037570475705757067570775708757097571075711757127571375714757157571675717757187571975720757217572275723757247572575726757277572875729757307573175732757337573475735757367573775738757397574075741757427574375744757457574675747757487574975750757517575275753757547575575756757577575875759757607576175762757637576475765757667576775768757697577075771757727577375774757757577675777757787577975780757817578275783757847578575786757877578875789757907579175792757937579475795757967579775798757997580075801758027580375804758057580675807758087580975810758117581275813758147581575816758177581875819758207582175822758237582475825758267582775828758297583075831758327583375834758357583675837758387583975840758417584275843758447584575846758477584875849758507585175852758537585475855758567585775858758597586075861758627586375864758657586675867758687586975870758717587275873758747587575876758777587875879758807588175882758837588475885758867588775888758897589075891758927589375894758957589675897758987589975900759017590275903759047590575906759077590875909759107591175912759137591475915759167591775918759197592075921759227592375924759257592675927759287592975930759317593275933759347593575936759377593875939759407594175942759437594475945759467594775948759497595075951759527595375954759557595675957759587595975960759617596275963759647596575966759677596875969759707597175972759737597475975759767597775978759797598075981759827598375984759857598675987759887598975990759917599275993759947599575996759977599875999760007600176002760037600476005760067600776008760097601076011760127601376014760157601676017760187601976020760217602276023760247602576026760277602876029760307603176032760337603476035760367603776038760397604076041760427604376044760457604676047760487604976050760517605276053760547605576056760577605876059760607606176062760637606476065760667606776068760697607076071760727607376074760757607676077760787607976080760817608276083760847608576086760877608876089760907609176092760937609476095760967609776098760997610076101761027610376104761057610676107761087610976110761117611276113761147611576116761177611876119761207612176122761237612476125761267612776128761297613076131761327613376134761357613676137761387613976140761417614276143761447614576146761477614876149761507615176152761537615476155761567615776158761597616076161761627616376164761657616676167761687616976170761717617276173761747617576176761777617876179761807618176182761837618476185761867618776188761897619076191761927619376194761957619676197761987619976200762017620276203762047620576206762077620876209762107621176212762137621476215762167621776218762197622076221762227622376224762257622676227762287622976230762317623276233762347623576236762377623876239762407624176242762437624476245762467624776248762497625076251762527625376254762557625676257762587625976260762617626276263762647626576266762677626876269762707627176272762737627476275762767627776278762797628076281762827628376284762857628676287762887628976290762917629276293762947629576296762977629876299763007630176302763037630476305763067630776308763097631076311763127631376314763157631676317763187631976320763217632276323763247632576326763277632876329763307633176332763337633476335763367633776338763397634076341763427634376344763457634676347763487634976350763517635276353763547635576356763577635876359763607636176362763637636476365763667636776368763697637076371763727637376374763757637676377763787637976380763817638276383763847638576386763877638876389763907639176392763937639476395763967639776398763997640076401764027640376404764057640676407764087640976410764117641276413764147641576416764177641876419764207642176422764237642476425764267642776428764297643076431764327643376434764357643676437764387643976440764417644276443764447644576446764477644876449764507645176452764537645476455764567645776458764597646076461764627646376464764657646676467764687646976470764717647276473764747647576476764777647876479764807648176482764837648476485764867648776488764897649076491764927649376494764957649676497764987649976500765017650276503765047650576506765077650876509765107651176512765137651476515765167651776518765197652076521765227652376524765257652676527765287652976530765317653276533765347653576536765377653876539765407654176542765437654476545765467654776548765497655076551765527655376554765557655676557765587655976560765617656276563765647656576566765677656876569765707657176572765737657476575765767657776578765797658076581765827658376584765857658676587765887658976590765917659276593765947659576596765977659876599766007660176602766037660476605766067660776608766097661076611766127661376614766157661676617766187661976620766217662276623766247662576626766277662876629766307663176632766337663476635766367663776638766397664076641766427664376644766457664676647766487664976650766517665276653766547665576656766577665876659766607666176662766637666476665766667666776668766697667076671766727667376674766757667676677766787667976680766817668276683766847668576686766877668876689766907669176692766937669476695766967669776698766997670076701767027670376704767057670676707767087670976710767117671276713767147671576716767177671876719767207672176722767237672476725767267672776728767297673076731767327673376734767357673676737767387673976740767417674276743767447674576746767477674876749767507675176752767537675476755767567675776758767597676076761767627676376764767657676676767767687676976770767717677276773767747677576776767777677876779767807678176782767837678476785767867678776788767897679076791767927679376794767957679676797767987679976800768017680276803768047680576806768077680876809768107681176812768137681476815768167681776818768197682076821768227682376824768257682676827768287682976830768317683276833768347683576836768377683876839768407684176842768437684476845768467684776848768497685076851768527685376854768557685676857768587685976860768617686276863768647686576866768677686876869768707687176872768737687476875768767687776878768797688076881768827688376884768857688676887768887688976890768917689276893768947689576896768977689876899769007690176902769037690476905769067690776908769097691076911769127691376914769157691676917769187691976920769217692276923769247692576926769277692876929769307693176932769337693476935769367693776938769397694076941769427694376944769457694676947769487694976950769517695276953769547695576956769577695876959769607696176962769637696476965769667696776968769697697076971769727697376974769757697676977769787697976980769817698276983769847698576986769877698876989769907699176992769937699476995769967699776998769997700077001770027700377004770057700677007770087700977010770117701277013770147701577016770177701877019770207702177022770237702477025770267702777028770297703077031770327703377034770357703677037770387703977040770417704277043770447704577046770477704877049770507705177052770537705477055770567705777058770597706077061770627706377064770657706677067770687706977070770717707277073770747707577076770777707877079770807708177082770837708477085770867708777088770897709077091770927709377094770957709677097770987709977100771017710277103771047710577106771077710877109771107711177112771137711477115771167711777118771197712077121771227712377124771257712677127771287712977130771317713277133771347713577136771377713877139771407714177142771437714477145771467714777148771497715077151771527715377154771557715677157771587715977160771617716277163771647716577166771677716877169771707717177172771737717477175771767717777178771797718077181771827718377184771857718677187771887718977190771917719277193771947719577196771977719877199772007720177202772037720477205772067720777208772097721077211772127721377214772157721677217772187721977220772217722277223772247722577226772277722877229772307723177232772337723477235772367723777238772397724077241772427724377244772457724677247772487724977250772517725277253772547725577256772577725877259772607726177262772637726477265772667726777268772697727077271772727727377274772757727677277772787727977280772817728277283772847728577286772877728877289772907729177292772937729477295772967729777298772997730077301773027730377304773057730677307773087730977310773117731277313773147731577316773177731877319773207732177322773237732477325773267732777328773297733077331773327733377334773357733677337773387733977340773417734277343773447734577346773477734877349773507735177352773537735477355773567735777358773597736077361773627736377364773657736677367773687736977370773717737277373773747737577376773777737877379773807738177382773837738477385773867738777388773897739077391773927739377394773957739677397773987739977400774017740277403774047740577406774077740877409774107741177412774137741477415774167741777418774197742077421774227742377424774257742677427774287742977430774317743277433774347743577436774377743877439774407744177442774437744477445774467744777448774497745077451774527745377454774557745677457774587745977460774617746277463774647746577466774677746877469774707747177472774737747477475774767747777478774797748077481774827748377484774857748677487774887748977490774917749277493774947749577496774977749877499775007750177502775037750477505775067750777508775097751077511775127751377514775157751677517775187751977520775217752277523775247752577526775277752877529775307753177532775337753477535775367753777538775397754077541775427754377544775457754677547775487754977550775517755277553775547755577556775577755877559775607756177562775637756477565775667756777568775697757077571775727757377574775757757677577775787757977580775817758277583775847758577586775877758877589775907759177592775937759477595775967759777598775997760077601776027760377604776057760677607776087760977610776117761277613776147761577616776177761877619776207762177622776237762477625776267762777628776297763077631776327763377634776357763677637776387763977640776417764277643776447764577646776477764877649776507765177652776537765477655776567765777658776597766077661776627766377664776657766677667776687766977670776717767277673776747767577676776777767877679776807768177682776837768477685776867768777688776897769077691776927769377694776957769677697776987769977700777017770277703777047770577706777077770877709777107771177712777137771477715777167771777718777197772077721777227772377724777257772677727777287772977730777317773277733777347773577736777377773877739777407774177742777437774477745777467774777748777497775077751777527775377754777557775677757777587775977760777617776277763777647776577766777677776877769777707777177772777737777477775777767777777778777797778077781777827778377784777857778677787777887778977790777917779277793777947779577796777977779877799778007780177802778037780477805778067780777808778097781077811778127781377814778157781677817778187781977820778217782277823778247782577826778277782877829778307783177832778337783477835778367783777838778397784077841778427784377844778457784677847778487784977850778517785277853778547785577856778577785877859778607786177862778637786477865778667786777868778697787077871778727787377874778757787677877778787787977880778817788277883778847788577886778877788877889778907789177892778937789477895778967789777898778997790077901779027790377904779057790677907779087790977910779117791277913779147791577916779177791877919779207792177922779237792477925779267792777928779297793077931779327793377934779357793677937779387793977940779417794277943779447794577946779477794877949779507795177952779537795477955779567795777958779597796077961779627796377964779657796677967779687796977970779717797277973779747797577976779777797877979779807798177982779837798477985779867798777988779897799077991779927799377994779957799677997779987799978000780017800278003780047800578006780077800878009780107801178012780137801478015780167801778018780197802078021780227802378024780257802678027780287802978030780317803278033780347803578036780377803878039780407804178042780437804478045780467804778048780497805078051780527805378054780557805678057780587805978060780617806278063780647806578066780677806878069780707807178072780737807478075780767807778078780797808078081780827808378084780857808678087780887808978090780917809278093780947809578096780977809878099781007810178102781037810478105781067810778108781097811078111781127811378114781157811678117781187811978120781217812278123781247812578126781277812878129781307813178132781337813478135781367813778138781397814078141781427814378144781457814678147781487814978150781517815278153781547815578156781577815878159781607816178162781637816478165781667816778168781697817078171781727817378174781757817678177781787817978180781817818278183781847818578186781877818878189781907819178192781937819478195781967819778198781997820078201782027820378204782057820678207782087820978210782117821278213782147821578216782177821878219782207822178222782237822478225782267822778228782297823078231782327823378234782357823678237782387823978240782417824278243782447824578246782477824878249782507825178252782537825478255782567825778258782597826078261782627826378264782657826678267782687826978270782717827278273782747827578276782777827878279782807828178282782837828478285782867828778288782897829078291782927829378294782957829678297782987829978300783017830278303783047830578306783077830878309783107831178312783137831478315783167831778318783197832078321783227832378324783257832678327783287832978330783317833278333783347833578336783377833878339783407834178342783437834478345783467834778348783497835078351783527835378354783557835678357783587835978360783617836278363783647836578366783677836878369783707837178372783737837478375783767837778378783797838078381783827838378384783857838678387783887838978390783917839278393783947839578396783977839878399784007840178402784037840478405784067840778408784097841078411784127841378414784157841678417784187841978420784217842278423784247842578426784277842878429784307843178432784337843478435784367843778438784397844078441784427844378444784457844678447784487844978450784517845278453784547845578456784577845878459784607846178462784637846478465784667846778468784697847078471784727847378474784757847678477784787847978480784817848278483784847848578486784877848878489784907849178492784937849478495784967849778498784997850078501785027850378504785057850678507785087850978510785117851278513785147851578516785177851878519785207852178522785237852478525785267852778528785297853078531785327853378534785357853678537785387853978540785417854278543785447854578546785477854878549785507855178552785537855478555785567855778558785597856078561785627856378564785657856678567785687856978570785717857278573785747857578576785777857878579785807858178582785837858478585785867858778588785897859078591785927859378594785957859678597785987859978600786017860278603786047860578606786077860878609786107861178612786137861478615786167861778618786197862078621786227862378624786257862678627786287862978630786317863278633786347863578636786377863878639786407864178642786437864478645786467864778648786497865078651786527865378654786557865678657786587865978660786617866278663786647866578666786677866878669786707867178672786737867478675786767867778678786797868078681786827868378684786857868678687786887868978690786917869278693786947869578696786977869878699787007870178702787037870478705787067870778708787097871078711787127871378714787157871678717787187871978720787217872278723787247872578726787277872878729787307873178732787337873478735787367873778738787397874078741787427874378744787457874678747787487874978750787517875278753787547875578756787577875878759787607876178762787637876478765787667876778768787697877078771787727877378774787757877678777787787877978780787817878278783787847878578786787877878878789787907879178792787937879478795787967879778798787997880078801788027880378804788057880678807788087880978810788117881278813788147881578816788177881878819788207882178822788237882478825788267882778828788297883078831788327883378834788357883678837788387883978840788417884278843788447884578846788477884878849788507885178852788537885478855788567885778858788597886078861788627886378864788657886678867788687886978870788717887278873788747887578876788777887878879788807888178882788837888478885788867888778888788897889078891788927889378894788957889678897788987889978900789017890278903789047890578906789077890878909789107891178912789137891478915789167891778918789197892078921789227892378924789257892678927789287892978930789317893278933789347893578936789377893878939789407894178942789437894478945789467894778948789497895078951789527895378954789557895678957789587895978960789617896278963789647896578966789677896878969789707897178972789737897478975789767897778978789797898078981789827898378984789857898678987789887898978990789917899278993789947899578996789977899878999790007900179002790037900479005790067900779008790097901079011790127901379014790157901679017790187901979020790217902279023790247902579026790277902879029790307903179032790337903479035790367903779038790397904079041790427904379044790457904679047790487904979050790517905279053790547905579056790577905879059790607906179062790637906479065790667906779068790697907079071790727907379074790757907679077790787907979080790817908279083790847908579086790877908879089790907909179092790937909479095790967909779098790997910079101791027910379104791057910679107791087910979110791117911279113791147911579116791177911879119791207912179122791237912479125791267912779128791297913079131791327913379134791357913679137791387913979140791417914279143791447914579146791477914879149791507915179152791537915479155791567915779158791597916079161791627916379164791657916679167791687916979170791717917279173791747917579176791777917879179791807918179182791837918479185791867918779188791897919079191791927919379194791957919679197791987919979200792017920279203792047920579206792077920879209792107921179212792137921479215792167921779218792197922079221792227922379224792257922679227792287922979230792317923279233792347923579236792377923879239792407924179242792437924479245792467924779248792497925079251792527925379254792557925679257792587925979260792617926279263792647926579266792677926879269792707927179272792737927479275792767927779278792797928079281792827928379284792857928679287792887928979290792917929279293792947929579296792977929879299793007930179302793037930479305793067930779308793097931079311793127931379314793157931679317793187931979320793217932279323793247932579326793277932879329793307933179332793337933479335793367933779338793397934079341793427934379344793457934679347793487934979350793517935279353793547935579356793577935879359793607936179362793637936479365793667936779368793697937079371793727937379374793757937679377793787937979380793817938279383793847938579386793877938879389793907939179392793937939479395793967939779398793997940079401794027940379404794057940679407794087940979410794117941279413794147941579416794177941879419794207942179422794237942479425794267942779428794297943079431794327943379434794357943679437794387943979440794417944279443794447944579446794477944879449794507945179452794537945479455794567945779458794597946079461794627946379464794657946679467794687946979470794717947279473794747947579476794777947879479794807948179482794837948479485794867948779488794897949079491794927949379494794957949679497794987949979500795017950279503795047950579506795077950879509795107951179512795137951479515795167951779518795197952079521795227952379524795257952679527795287952979530795317953279533795347953579536795377953879539795407954179542795437954479545795467954779548795497955079551795527955379554795557955679557795587955979560795617956279563795647956579566795677956879569795707957179572795737957479575795767957779578795797958079581795827958379584795857958679587795887958979590795917959279593795947959579596795977959879599796007960179602796037960479605796067960779608796097961079611796127961379614796157961679617796187961979620796217962279623796247962579626796277962879629796307963179632796337963479635796367963779638796397964079641796427964379644796457964679647796487964979650796517965279653796547965579656796577965879659796607966179662796637966479665796667966779668796697967079671796727967379674796757967679677796787967979680796817968279683796847968579686796877968879689796907969179692796937969479695796967969779698796997970079701797027970379704797057970679707797087970979710797117971279713797147971579716797177971879719797207972179722797237972479725797267972779728797297973079731797327973379734797357973679737797387973979740797417974279743797447974579746797477974879749797507975179752797537975479755797567975779758797597976079761797627976379764797657976679767797687976979770797717977279773797747977579776797777977879779797807978179782797837978479785797867978779788797897979079791797927979379794797957979679797797987979979800798017980279803798047980579806798077980879809798107981179812798137981479815798167981779818798197982079821798227982379824798257982679827798287982979830798317983279833798347983579836798377983879839798407984179842798437984479845798467984779848798497985079851798527985379854798557985679857798587985979860798617986279863798647986579866798677986879869798707987179872798737987479875798767987779878798797988079881798827988379884798857988679887798887988979890798917989279893798947989579896798977989879899799007990179902799037990479905799067990779908799097991079911799127991379914799157991679917799187991979920799217992279923799247992579926799277992879929799307993179932799337993479935799367993779938799397994079941799427994379944799457994679947799487994979950799517995279953799547995579956799577995879959799607996179962799637996479965799667996779968799697997079971799727997379974799757997679977799787997979980799817998279983799847998579986799877998879989799907999179992799937999479995799967999779998799998000080001800028000380004800058000680007800088000980010800118001280013800148001580016800178001880019800208002180022800238002480025800268002780028800298003080031800328003380034800358003680037800388003980040800418004280043800448004580046800478004880049800508005180052800538005480055800568005780058800598006080061800628006380064800658006680067800688006980070800718007280073800748007580076800778007880079800808008180082800838008480085800868008780088800898009080091800928009380094800958009680097800988009980100801018010280103801048010580106801078010880109801108011180112801138011480115801168011780118801198012080121801228012380124801258012680127801288012980130801318013280133801348013580136801378013880139801408014180142801438014480145801468014780148801498015080151801528015380154801558015680157801588015980160801618016280163801648016580166801678016880169801708017180172801738017480175801768017780178801798018080181801828018380184801858018680187801888018980190801918019280193801948019580196801978019880199802008020180202802038020480205802068020780208802098021080211802128021380214802158021680217802188021980220802218022280223802248022580226802278022880229802308023180232802338023480235802368023780238802398024080241802428024380244802458024680247802488024980250802518025280253802548025580256802578025880259802608026180262802638026480265802668026780268802698027080271802728027380274802758027680277802788027980280802818028280283802848028580286802878028880289802908029180292802938029480295802968029780298802998030080301803028030380304803058030680307803088030980310803118031280313803148031580316803178031880319803208032180322803238032480325803268032780328803298033080331803328033380334803358033680337803388033980340803418034280343803448034580346803478034880349803508035180352803538035480355803568035780358803598036080361803628036380364803658036680367803688036980370803718037280373803748037580376803778037880379803808038180382803838038480385803868038780388803898039080391803928039380394803958039680397803988039980400804018040280403804048040580406804078040880409804108041180412804138041480415804168041780418804198042080421804228042380424804258042680427804288042980430804318043280433804348043580436804378043880439804408044180442804438044480445804468044780448804498045080451804528045380454804558045680457804588045980460804618046280463804648046580466804678046880469804708047180472804738047480475804768047780478804798048080481804828048380484804858048680487804888048980490804918049280493804948049580496804978049880499805008050180502805038050480505805068050780508805098051080511805128051380514805158051680517805188051980520805218052280523805248052580526805278052880529805308053180532805338053480535805368053780538805398054080541805428054380544805458054680547805488054980550805518055280553805548055580556805578055880559805608056180562805638056480565805668056780568805698057080571805728057380574805758057680577805788057980580805818058280583805848058580586805878058880589805908059180592805938059480595805968059780598805998060080601806028060380604806058060680607806088060980610806118061280613806148061580616806178061880619806208062180622806238062480625806268062780628806298063080631806328063380634806358063680637806388063980640806418064280643806448064580646806478064880649806508065180652806538065480655806568065780658806598066080661806628066380664806658066680667806688066980670806718067280673806748067580676806778067880679806808068180682806838068480685806868068780688806898069080691806928069380694806958069680697806988069980700807018070280703807048070580706807078070880709807108071180712807138071480715807168071780718807198072080721807228072380724807258072680727807288072980730807318073280733807348073580736807378073880739807408074180742807438074480745807468074780748807498075080751807528075380754807558075680757807588075980760807618076280763807648076580766807678076880769807708077180772807738077480775807768077780778807798078080781807828078380784807858078680787807888078980790807918079280793807948079580796807978079880799808008080180802808038080480805808068080780808808098081080811808128081380814808158081680817808188081980820808218082280823808248082580826808278082880829808308083180832808338083480835808368083780838808398084080841808428084380844808458084680847808488084980850808518085280853808548085580856808578085880859808608086180862808638086480865808668086780868808698087080871808728087380874808758087680877808788087980880808818088280883808848088580886808878088880889808908089180892808938089480895808968089780898808998090080901809028090380904809058090680907809088090980910809118091280913809148091580916809178091880919809208092180922809238092480925809268092780928809298093080931809328093380934809358093680937809388093980940809418094280943809448094580946809478094880949809508095180952809538095480955809568095780958809598096080961809628096380964809658096680967809688096980970809718097280973809748097580976809778097880979809808098180982809838098480985809868098780988809898099080991809928099380994809958099680997809988099981000810018100281003810048100581006810078100881009810108101181012810138101481015810168101781018810198102081021810228102381024810258102681027810288102981030810318103281033810348103581036810378103881039810408104181042810438104481045810468104781048810498105081051810528105381054810558105681057810588105981060810618106281063810648106581066810678106881069810708107181072810738107481075810768107781078810798108081081810828108381084810858108681087810888108981090810918109281093810948109581096810978109881099811008110181102811038110481105811068110781108811098111081111811128111381114811158111681117811188111981120811218112281123811248112581126811278112881129811308113181132811338113481135811368113781138811398114081141811428114381144811458114681147811488114981150811518115281153811548115581156811578115881159811608116181162811638116481165811668116781168811698117081171811728117381174811758117681177811788117981180811818118281183811848118581186811878118881189811908119181192811938119481195811968119781198811998120081201812028120381204812058120681207812088120981210812118121281213812148121581216812178121881219812208122181222812238122481225812268122781228812298123081231812328123381234812358123681237812388123981240812418124281243812448124581246812478124881249812508125181252812538125481255812568125781258812598126081261812628126381264812658126681267812688126981270812718127281273812748127581276812778127881279812808128181282812838128481285812868128781288812898129081291812928129381294812958129681297812988129981300813018130281303813048130581306813078130881309813108131181312813138131481315813168131781318813198132081321813228132381324813258132681327813288132981330813318133281333813348133581336813378133881339813408134181342813438134481345813468134781348813498135081351813528135381354813558135681357813588135981360813618136281363813648136581366813678136881369813708137181372813738137481375813768137781378813798138081381813828138381384813858138681387813888138981390813918139281393813948139581396813978139881399814008140181402814038140481405814068140781408814098141081411814128141381414814158141681417814188141981420814218142281423814248142581426814278142881429814308143181432814338143481435814368143781438814398144081441814428144381444814458144681447814488144981450814518145281453814548145581456814578145881459814608146181462814638146481465814668146781468814698147081471814728147381474814758147681477814788147981480814818148281483814848148581486814878148881489814908149181492814938149481495814968149781498814998150081501815028150381504815058150681507815088150981510815118151281513815148151581516815178151881519815208152181522815238152481525815268152781528815298153081531815328153381534815358153681537815388153981540815418154281543815448154581546815478154881549815508155181552815538155481555815568155781558815598156081561815628156381564815658156681567815688156981570815718157281573815748157581576815778157881579815808158181582815838158481585815868158781588815898159081591815928159381594815958159681597815988159981600816018160281603816048160581606816078160881609816108161181612816138161481615816168161781618816198162081621816228162381624816258162681627816288162981630816318163281633816348163581636816378163881639816408164181642816438164481645816468164781648816498165081651816528165381654816558165681657816588165981660816618166281663816648166581666816678166881669816708167181672816738167481675816768167781678816798168081681816828168381684816858168681687816888168981690816918169281693816948169581696816978169881699817008170181702817038170481705817068170781708817098171081711817128171381714817158171681717817188171981720817218172281723817248172581726817278172881729817308173181732817338173481735817368173781738817398174081741817428174381744817458174681747817488174981750817518175281753817548175581756817578175881759817608176181762817638176481765817668176781768817698177081771817728177381774817758177681777817788177981780817818178281783817848178581786817878178881789817908179181792817938179481795817968179781798817998180081801818028180381804818058180681807818088180981810818118181281813818148181581816818178181881819818208182181822818238182481825818268182781828818298183081831818328183381834818358183681837818388183981840818418184281843818448184581846818478184881849818508185181852818538185481855818568185781858818598186081861818628186381864818658186681867818688186981870818718187281873818748187581876818778187881879818808188181882818838188481885818868188781888818898189081891818928189381894818958189681897818988189981900819018190281903819048190581906819078190881909819108191181912819138191481915819168191781918819198192081921819228192381924819258192681927819288192981930819318193281933819348193581936819378193881939819408194181942819438194481945819468194781948819498195081951819528195381954819558195681957819588195981960819618196281963819648196581966819678196881969819708197181972819738197481975819768197781978819798198081981819828198381984819858198681987819888198981990819918199281993819948199581996819978199881999820008200182002820038200482005820068200782008820098201082011820128201382014820158201682017820188201982020820218202282023820248202582026820278202882029820308203182032820338203482035820368203782038820398204082041820428204382044820458204682047820488204982050820518205282053820548205582056820578205882059820608206182062820638206482065820668206782068820698207082071820728207382074820758207682077820788207982080820818208282083820848208582086820878208882089820908209182092820938209482095820968209782098820998210082101821028210382104821058210682107821088210982110821118211282113821148211582116821178211882119821208212182122821238212482125821268212782128821298213082131821328213382134821358213682137821388213982140821418214282143821448214582146821478214882149821508215182152821538215482155821568215782158821598216082161821628216382164821658216682167821688216982170821718217282173821748217582176821778217882179821808218182182821838218482185821868218782188821898219082191821928219382194821958219682197821988219982200822018220282203822048220582206822078220882209822108221182212822138221482215822168221782218822198222082221822228222382224822258222682227822288222982230822318223282233822348223582236822378223882239822408224182242822438224482245822468224782248822498225082251822528225382254822558225682257822588225982260822618226282263822648226582266822678226882269822708227182272822738227482275822768227782278822798228082281822828228382284822858228682287822888228982290822918229282293822948229582296822978229882299823008230182302823038230482305823068230782308823098231082311823128231382314823158231682317823188231982320823218232282323823248232582326823278232882329823308233182332823338233482335823368233782338823398234082341823428234382344823458234682347823488234982350823518235282353823548235582356823578235882359823608236182362823638236482365823668236782368823698237082371823728237382374823758237682377823788237982380823818238282383823848238582386823878238882389823908239182392823938239482395823968239782398823998240082401824028240382404824058240682407824088240982410824118241282413824148241582416824178241882419824208242182422824238242482425824268242782428824298243082431824328243382434824358243682437824388243982440824418244282443824448244582446824478244882449824508245182452824538245482455824568245782458824598246082461824628246382464824658246682467824688246982470824718247282473824748247582476824778247882479824808248182482824838248482485824868248782488824898249082491824928249382494824958249682497824988249982500825018250282503825048250582506825078250882509825108251182512825138251482515825168251782518825198252082521825228252382524825258252682527825288252982530825318253282533825348253582536825378253882539825408254182542825438254482545825468254782548825498255082551825528255382554825558255682557825588255982560825618256282563825648256582566825678256882569825708257182572825738257482575825768257782578825798258082581825828258382584825858258682587825888258982590825918259282593825948259582596825978259882599826008260182602826038260482605826068260782608826098261082611826128261382614826158261682617826188261982620826218262282623826248262582626826278262882629826308263182632826338263482635826368263782638826398264082641826428264382644826458264682647826488264982650826518265282653826548265582656826578265882659826608266182662826638266482665826668266782668826698267082671826728267382674826758267682677826788267982680826818268282683826848268582686826878268882689826908269182692826938269482695826968269782698826998270082701827028270382704827058270682707827088270982710827118271282713827148271582716827178271882719827208272182722827238272482725827268272782728827298273082731827328273382734827358273682737827388273982740827418274282743827448274582746827478274882749827508275182752827538275482755827568275782758827598276082761827628276382764827658276682767827688276982770827718277282773827748277582776827778277882779827808278182782827838278482785827868278782788827898279082791827928279382794827958279682797827988279982800828018280282803828048280582806828078280882809828108281182812828138281482815828168281782818828198282082821828228282382824828258282682827828288282982830828318283282833828348283582836828378283882839828408284182842828438284482845828468284782848828498285082851828528285382854828558285682857828588285982860828618286282863828648286582866828678286882869828708287182872828738287482875828768287782878828798288082881828828288382884828858288682887828888288982890828918289282893828948289582896828978289882899829008290182902829038290482905829068290782908829098291082911829128291382914829158291682917829188291982920829218292282923829248292582926829278292882929829308293182932829338293482935829368293782938829398294082941829428294382944829458294682947829488294982950829518295282953829548295582956829578295882959829608296182962829638296482965829668296782968829698297082971829728297382974829758297682977829788297982980829818298282983829848298582986829878298882989829908299182992829938299482995829968299782998829998300083001830028300383004830058300683007830088300983010830118301283013830148301583016830178301883019830208302183022830238302483025830268302783028830298303083031830328303383034830358303683037830388303983040830418304283043830448304583046830478304883049830508305183052830538305483055830568305783058830598306083061830628306383064830658306683067830688306983070830718307283073830748307583076830778307883079830808308183082830838308483085830868308783088830898309083091830928309383094830958309683097830988309983100831018310283103831048310583106831078310883109831108311183112831138311483115831168311783118831198312083121831228312383124831258312683127831288312983130831318313283133831348313583136831378313883139831408314183142831438314483145831468314783148831498315083151831528315383154831558315683157831588315983160831618316283163831648316583166831678316883169831708317183172831738317483175831768317783178831798318083181831828318383184831858318683187831888318983190831918319283193831948319583196831978319883199832008320183202832038320483205832068320783208832098321083211832128321383214832158321683217832188321983220832218322283223832248322583226832278322883229832308323183232832338323483235832368323783238832398324083241832428324383244832458324683247832488324983250832518325283253832548325583256832578325883259832608326183262832638326483265832668326783268832698327083271832728327383274832758327683277832788327983280832818328283283832848328583286832878328883289832908329183292832938329483295832968329783298832998330083301833028330383304833058330683307833088330983310833118331283313833148331583316833178331883319833208332183322833238332483325833268332783328833298333083331833328333383334833358333683337833388333983340833418334283343833448334583346833478334883349833508335183352833538335483355833568335783358833598336083361833628336383364833658336683367833688336983370833718337283373833748337583376833778337883379833808338183382833838338483385833868338783388833898339083391833928339383394833958339683397833988339983400834018340283403834048340583406834078340883409834108341183412834138341483415834168341783418834198342083421834228342383424834258342683427834288342983430834318343283433834348343583436834378343883439834408344183442834438344483445834468344783448834498345083451834528345383454834558345683457834588345983460834618346283463834648346583466834678346883469834708347183472834738347483475834768347783478834798348083481834828348383484834858348683487834888348983490834918349283493834948349583496834978349883499835008350183502835038350483505835068350783508835098351083511835128351383514835158351683517835188351983520835218352283523835248352583526835278352883529835308353183532835338353483535835368353783538835398354083541835428354383544835458354683547835488354983550835518355283553835548355583556835578355883559835608356183562835638356483565835668356783568835698357083571835728357383574835758357683577835788357983580835818358283583835848358583586835878358883589835908359183592835938359483595835968359783598835998360083601836028360383604836058360683607836088360983610836118361283613836148361583616836178361883619836208362183622836238362483625836268362783628836298363083631836328363383634836358363683637836388363983640836418364283643836448364583646836478364883649836508365183652836538365483655836568365783658836598366083661836628366383664836658366683667836688366983670836718367283673836748367583676836778367883679836808368183682836838368483685836868368783688836898369083691836928369383694836958369683697836988369983700837018370283703837048370583706837078370883709837108371183712837138371483715837168371783718837198372083721837228372383724837258372683727837288372983730837318373283733837348373583736837378373883739837408374183742837438374483745837468374783748837498375083751837528375383754837558375683757837588375983760837618376283763837648376583766837678376883769837708377183772837738377483775837768377783778837798378083781837828378383784837858378683787837888378983790837918379283793837948379583796837978379883799838008380183802838038380483805838068380783808838098381083811838128381383814838158381683817838188381983820838218382283823838248382583826838278382883829838308383183832838338383483835838368383783838838398384083841838428384383844838458384683847838488384983850838518385283853838548385583856838578385883859838608386183862838638386483865838668386783868838698387083871838728387383874838758387683877838788387983880838818388283883838848388583886838878388883889838908389183892838938389483895838968389783898838998390083901839028390383904839058390683907839088390983910839118391283913839148391583916839178391883919839208392183922839238392483925839268392783928839298393083931839328393383934839358393683937839388393983940839418394283943839448394583946839478394883949839508395183952839538395483955839568395783958839598396083961839628396383964839658396683967839688396983970839718397283973839748397583976839778397883979839808398183982839838398483985839868398783988839898399083991839928399383994839958399683997839988399984000840018400284003840048400584006840078400884009840108401184012840138401484015840168401784018840198402084021840228402384024840258402684027840288402984030840318403284033840348403584036840378403884039840408404184042840438404484045840468404784048840498405084051840528405384054840558405684057840588405984060840618406284063840648406584066840678406884069840708407184072840738407484075840768407784078840798408084081840828408384084840858408684087840888408984090840918409284093840948409584096840978409884099841008410184102841038410484105841068410784108841098411084111841128411384114841158411684117841188411984120841218412284123841248412584126841278412884129841308413184132841338413484135841368413784138841398414084141841428414384144841458414684147841488414984150841518415284153841548415584156841578415884159841608416184162841638416484165841668416784168841698417084171841728417384174841758417684177841788417984180841818418284183841848418584186841878418884189841908419184192841938419484195841968419784198841998420084201842028420384204842058420684207842088420984210842118421284213842148421584216842178421884219842208422184222842238422484225842268422784228842298423084231842328423384234842358423684237842388423984240842418424284243842448424584246842478424884249842508425184252842538425484255842568425784258842598426084261842628426384264842658426684267842688426984270842718427284273842748427584276842778427884279842808428184282842838428484285842868428784288842898429084291842928429384294842958429684297842988429984300843018430284303843048430584306843078430884309843108431184312843138431484315843168431784318843198432084321843228432384324843258432684327843288432984330843318433284333843348433584336843378433884339843408434184342843438434484345843468434784348843498435084351843528435384354843558435684357843588435984360843618436284363843648436584366843678436884369843708437184372843738437484375843768437784378843798438084381843828438384384843858438684387843888438984390843918439284393843948439584396843978439884399844008440184402844038440484405844068440784408844098441084411844128441384414844158441684417844188441984420844218442284423844248442584426844278442884429844308443184432844338443484435844368443784438844398444084441844428444384444844458444684447844488444984450844518445284453844548445584456844578445884459844608446184462844638446484465844668446784468844698447084471844728447384474844758447684477844788447984480844818448284483844848448584486844878448884489844908449184492844938449484495844968449784498844998450084501845028450384504845058450684507845088450984510845118451284513845148451584516845178451884519845208452184522845238452484525845268452784528845298453084531845328453384534845358453684537845388453984540845418454284543845448454584546845478454884549845508455184552845538455484555845568455784558845598456084561845628456384564845658456684567845688456984570845718457284573845748457584576845778457884579845808458184582845838458484585845868458784588845898459084591845928459384594845958459684597845988459984600846018460284603846048460584606846078460884609846108461184612846138461484615846168461784618846198462084621846228462384624846258462684627846288462984630846318463284633846348463584636846378463884639846408464184642846438464484645846468464784648846498465084651846528465384654846558465684657846588465984660846618466284663846648466584666846678466884669846708467184672846738467484675846768467784678846798468084681846828468384684846858468684687846888468984690846918469284693846948469584696846978469884699847008470184702847038470484705847068470784708847098471084711847128471384714847158471684717847188471984720847218472284723847248472584726847278472884729847308473184732847338473484735847368473784738847398474084741847428474384744847458474684747847488474984750847518475284753847548475584756847578475884759847608476184762847638476484765847668476784768847698477084771847728477384774847758477684777847788477984780847818478284783847848478584786847878478884789847908479184792847938479484795847968479784798847998480084801848028480384804848058480684807848088480984810848118481284813848148481584816848178481884819848208482184822848238482484825848268482784828848298483084831848328483384834848358483684837848388483984840848418484284843848448484584846848478484884849848508485184852848538485484855848568485784858848598486084861848628486384864848658486684867848688486984870848718487284873848748487584876848778487884879848808488184882848838488484885848868488784888848898489084891848928489384894848958489684897848988489984900849018490284903849048490584906849078490884909849108491184912849138491484915849168491784918849198492084921849228492384924849258492684927849288492984930849318493284933849348493584936849378493884939849408494184942849438494484945849468494784948849498495084951849528495384954849558495684957849588495984960849618496284963849648496584966849678496884969849708497184972849738497484975849768497784978849798498084981849828498384984849858498684987849888498984990849918499284993849948499584996849978499884999850008500185002850038500485005850068500785008850098501085011850128501385014850158501685017850188501985020850218502285023850248502585026850278502885029850308503185032850338503485035850368503785038850398504085041850428504385044850458504685047850488504985050850518505285053850548505585056850578505885059850608506185062850638506485065850668506785068850698507085071850728507385074850758507685077850788507985080850818508285083850848508585086850878508885089850908509185092850938509485095850968509785098850998510085101851028510385104851058510685107851088510985110851118511285113851148511585116851178511885119851208512185122851238512485125851268512785128851298513085131851328513385134851358513685137851388513985140851418514285143851448514585146851478514885149851508515185152851538515485155851568515785158851598516085161851628516385164851658516685167851688516985170851718517285173851748517585176851778517885179851808518185182851838518485185851868518785188851898519085191851928519385194851958519685197851988519985200852018520285203852048520585206852078520885209852108521185212852138521485215852168521785218852198522085221852228522385224852258522685227852288522985230852318523285233852348523585236852378523885239852408524185242852438524485245852468524785248852498525085251852528525385254852558525685257852588525985260852618526285263852648526585266852678526885269852708527185272852738527485275852768527785278852798528085281852828528385284852858528685287852888528985290852918529285293852948529585296852978529885299853008530185302853038530485305853068530785308853098531085311853128531385314853158531685317853188531985320853218532285323853248532585326853278532885329853308533185332853338533485335853368533785338853398534085341853428534385344853458534685347853488534985350853518535285353853548535585356853578535885359853608536185362853638536485365853668536785368853698537085371853728537385374853758537685377853788537985380853818538285383853848538585386853878538885389853908539185392853938539485395853968539785398853998540085401854028540385404854058540685407854088540985410854118541285413854148541585416854178541885419854208542185422854238542485425854268542785428854298543085431854328543385434854358543685437854388543985440854418544285443854448544585446854478544885449854508545185452854538545485455854568545785458854598546085461854628546385464854658546685467854688546985470854718547285473854748547585476854778547885479854808548185482854838548485485854868548785488854898549085491854928549385494854958549685497854988549985500855018550285503855048550585506855078550885509855108551185512855138551485515855168551785518855198552085521855228552385524855258552685527855288552985530855318553285533855348553585536855378553885539855408554185542855438554485545855468554785548855498555085551855528555385554855558555685557855588555985560855618556285563855648556585566855678556885569855708557185572855738557485575855768557785578855798558085581855828558385584855858558685587855888558985590855918559285593855948559585596855978559885599856008560185602856038560485605856068560785608856098561085611856128561385614856158561685617856188561985620856218562285623856248562585626856278562885629856308563185632856338563485635856368563785638856398564085641856428564385644856458564685647856488564985650856518565285653856548565585656856578565885659856608566185662856638566485665856668566785668856698567085671856728567385674856758567685677856788567985680856818568285683856848568585686856878568885689856908569185692856938569485695856968569785698856998570085701857028570385704857058570685707857088570985710857118571285713857148571585716857178571885719857208572185722857238572485725857268572785728857298573085731857328573385734857358573685737857388573985740857418574285743857448574585746857478574885749857508575185752857538575485755857568575785758857598576085761857628576385764857658576685767857688576985770857718577285773857748577585776857778577885779857808578185782857838578485785857868578785788857898579085791857928579385794857958579685797857988579985800858018580285803858048580585806858078580885809858108581185812858138581485815858168581785818858198582085821858228582385824858258582685827858288582985830858318583285833858348583585836858378583885839858408584185842858438584485845858468584785848858498585085851858528585385854858558585685857858588585985860858618586285863858648586585866858678586885869858708587185872858738587485875858768587785878858798588085881858828588385884858858588685887858888588985890858918589285893858948589585896858978589885899859008590185902859038590485905859068590785908859098591085911859128591385914859158591685917859188591985920859218592285923859248592585926859278592885929859308593185932859338593485935859368593785938859398594085941859428594385944859458594685947859488594985950859518595285953859548595585956859578595885959859608596185962859638596485965859668596785968859698597085971859728597385974859758597685977859788597985980859818598285983859848598585986859878598885989859908599185992859938599485995859968599785998859998600086001860028600386004860058600686007860088600986010860118601286013860148601586016860178601886019860208602186022860238602486025860268602786028860298603086031860328603386034860358603686037860388603986040860418604286043860448604586046860478604886049860508605186052860538605486055860568605786058860598606086061860628606386064860658606686067860688606986070860718607286073860748607586076860778607886079860808608186082860838608486085860868608786088860898609086091860928609386094860958609686097860988609986100861018610286103861048610586106861078610886109861108611186112861138611486115861168611786118861198612086121861228612386124861258612686127861288612986130861318613286133861348613586136861378613886139861408614186142861438614486145861468614786148861498615086151861528615386154861558615686157861588615986160861618616286163861648616586166861678616886169861708617186172861738617486175861768617786178861798618086181861828618386184861858618686187861888618986190861918619286193861948619586196861978619886199862008620186202862038620486205862068620786208862098621086211862128621386214862158621686217862188621986220862218622286223862248622586226862278622886229862308623186232862338623486235862368623786238862398624086241862428624386244862458624686247862488624986250862518625286253862548625586256862578625886259862608626186262862638626486265862668626786268862698627086271862728627386274862758627686277862788627986280862818628286283862848628586286862878628886289862908629186292862938629486295862968629786298862998630086301863028630386304863058630686307863088630986310863118631286313863148631586316863178631886319863208632186322863238632486325863268632786328863298633086331863328633386334863358633686337863388633986340863418634286343863448634586346863478634886349863508635186352863538635486355863568635786358863598636086361863628636386364863658636686367863688636986370863718637286373863748637586376863778637886379863808638186382863838638486385863868638786388863898639086391863928639386394863958639686397863988639986400864018640286403864048640586406864078640886409864108641186412864138641486415864168641786418864198642086421864228642386424864258642686427864288642986430864318643286433864348643586436864378643886439864408644186442864438644486445864468644786448864498645086451864528645386454864558645686457864588645986460864618646286463864648646586466864678646886469864708647186472864738647486475864768647786478864798648086481864828648386484864858648686487864888648986490864918649286493864948649586496864978649886499865008650186502865038650486505865068650786508865098651086511865128651386514865158651686517865188651986520865218652286523865248652586526865278652886529865308653186532865338653486535865368653786538865398654086541865428654386544865458654686547865488654986550865518655286553865548655586556865578655886559865608656186562865638656486565865668656786568865698657086571865728657386574865758657686577865788657986580865818658286583865848658586586865878658886589865908659186592865938659486595865968659786598865998660086601866028660386604866058660686607866088660986610866118661286613866148661586616866178661886619866208662186622866238662486625866268662786628866298663086631866328663386634866358663686637866388663986640866418664286643866448664586646866478664886649866508665186652866538665486655866568665786658866598666086661866628666386664866658666686667866688666986670866718667286673866748667586676866778667886679866808668186682866838668486685866868668786688866898669086691866928669386694866958669686697866988669986700867018670286703867048670586706867078670886709867108671186712867138671486715867168671786718867198672086721867228672386724867258672686727867288672986730867318673286733867348673586736867378673886739867408674186742867438674486745867468674786748867498675086751867528675386754867558675686757867588675986760867618676286763867648676586766867678676886769867708677186772867738677486775867768677786778867798678086781867828678386784867858678686787867888678986790867918679286793867948679586796867978679886799868008680186802868038680486805868068680786808868098681086811868128681386814868158681686817868188681986820868218682286823868248682586826868278682886829868308683186832868338683486835868368683786838868398684086841868428684386844868458684686847868488684986850868518685286853868548685586856868578685886859868608686186862868638686486865868668686786868868698687086871868728687386874868758687686877868788687986880868818688286883868848688586886868878688886889868908689186892868938689486895868968689786898868998690086901869028690386904869058690686907869088690986910869118691286913869148691586916869178691886919869208692186922869238692486925869268692786928869298693086931869328693386934869358693686937869388693986940869418694286943869448694586946869478694886949869508695186952869538695486955869568695786958869598696086961869628696386964869658696686967869688696986970869718697286973869748697586976869778697886979869808698186982869838698486985869868698786988869898699086991869928699386994869958699686997869988699987000870018700287003870048700587006870078700887009870108701187012870138701487015870168701787018870198702087021870228702387024870258702687027870288702987030870318703287033870348703587036870378703887039870408704187042870438704487045870468704787048870498705087051870528705387054870558705687057870588705987060870618706287063870648706587066870678706887069870708707187072870738707487075870768707787078870798708087081870828708387084870858708687087870888708987090870918709287093870948709587096870978709887099871008710187102871038710487105871068710787108871098711087111871128711387114871158711687117871188711987120871218712287123871248712587126871278712887129871308713187132871338713487135871368713787138871398714087141871428714387144871458714687147871488714987150871518715287153871548715587156871578715887159871608716187162871638716487165871668716787168871698717087171871728717387174871758717687177871788717987180871818718287183871848718587186871878718887189871908719187192871938719487195871968719787198871998720087201872028720387204872058720687207872088720987210872118721287213872148721587216872178721887219872208722187222872238722487225872268722787228872298723087231872328723387234872358723687237872388723987240872418724287243872448724587246872478724887249872508725187252872538725487255872568725787258872598726087261872628726387264872658726687267872688726987270872718727287273872748727587276872778727887279872808728187282872838728487285872868728787288872898729087291872928729387294872958729687297872988729987300873018730287303873048730587306873078730887309873108731187312873138731487315873168731787318873198732087321873228732387324873258732687327873288732987330873318733287333873348733587336873378733887339873408734187342873438734487345873468734787348873498735087351873528735387354873558735687357873588735987360873618736287363873648736587366873678736887369873708737187372873738737487375873768737787378873798738087381873828738387384873858738687387873888738987390873918739287393873948739587396873978739887399874008740187402874038740487405874068740787408874098741087411874128741387414874158741687417874188741987420874218742287423874248742587426874278742887429874308743187432874338743487435874368743787438874398744087441874428744387444874458744687447874488744987450874518745287453874548745587456874578745887459874608746187462874638746487465874668746787468874698747087471874728747387474874758747687477874788747987480874818748287483874848748587486874878748887489874908749187492874938749487495874968749787498874998750087501875028750387504875058750687507875088750987510875118751287513875148751587516875178751887519875208752187522875238752487525875268752787528875298753087531875328753387534875358753687537875388753987540875418754287543875448754587546875478754887549875508755187552875538755487555875568755787558875598756087561875628756387564875658756687567875688756987570875718757287573875748757587576875778757887579875808758187582875838758487585875868758787588875898759087591875928759387594875958759687597875988759987600876018760287603876048760587606876078760887609876108761187612876138761487615876168761787618876198762087621876228762387624876258762687627876288762987630876318763287633876348763587636876378763887639876408764187642876438764487645876468764787648876498765087651876528765387654876558765687657876588765987660876618766287663876648766587666876678766887669876708767187672876738767487675876768767787678876798768087681876828768387684876858768687687876888768987690876918769287693876948769587696876978769887699877008770187702877038770487705877068770787708877098771087711877128771387714877158771687717877188771987720877218772287723877248772587726877278772887729877308773187732877338773487735877368773787738877398774087741877428774387744877458774687747877488774987750877518775287753877548775587756877578775887759877608776187762877638776487765877668776787768877698777087771877728777387774877758777687777877788777987780877818778287783877848778587786877878778887789877908779187792877938779487795877968779787798877998780087801878028780387804878058780687807878088780987810878118781287813878148781587816878178781887819878208782187822878238782487825878268782787828878298783087831878328783387834878358783687837878388783987840878418784287843878448784587846878478784887849878508785187852878538785487855878568785787858878598786087861878628786387864878658786687867878688786987870878718787287873878748787587876878778787887879878808788187882878838788487885878868788787888878898789087891878928789387894878958789687897878988789987900879018790287903879048790587906879078790887909879108791187912879138791487915879168791787918879198792087921879228792387924879258792687927879288792987930879318793287933879348793587936879378793887939879408794187942879438794487945879468794787948879498795087951879528795387954879558795687957879588795987960879618796287963879648796587966879678796887969879708797187972879738797487975879768797787978879798798087981879828798387984879858798687987879888798987990879918799287993879948799587996879978799887999880008800188002880038800488005880068800788008880098801088011880128801388014880158801688017880188801988020880218802288023880248802588026880278802888029880308803188032880338803488035880368803788038880398804088041880428804388044880458804688047880488804988050880518805288053880548805588056880578805888059880608806188062880638806488065880668806788068880698807088071880728807388074880758807688077880788807988080880818808288083880848808588086880878808888089880908809188092880938809488095880968809788098880998810088101881028810388104881058810688107881088810988110881118811288113881148811588116881178811888119881208812188122881238812488125881268812788128881298813088131881328813388134881358813688137881388813988140881418814288143881448814588146881478814888149881508815188152881538815488155881568815788158881598816088161881628816388164881658816688167881688816988170881718817288173881748817588176881778817888179881808818188182881838818488185881868818788188881898819088191881928819388194881958819688197881988819988200882018820288203882048820588206882078820888209882108821188212882138821488215882168821788218882198822088221882228822388224882258822688227882288822988230882318823288233882348823588236882378823888239882408824188242882438824488245882468824788248882498825088251882528825388254882558825688257882588825988260882618826288263882648826588266882678826888269882708827188272882738827488275882768827788278882798828088281882828828388284882858828688287882888828988290882918829288293882948829588296882978829888299883008830188302883038830488305883068830788308883098831088311883128831388314883158831688317883188831988320883218832288323883248832588326883278832888329883308833188332883338833488335883368833788338883398834088341883428834388344883458834688347883488834988350883518835288353883548835588356883578835888359883608836188362883638836488365883668836788368883698837088371883728837388374883758837688377883788837988380883818838288383883848838588386883878838888389883908839188392883938839488395883968839788398883998840088401884028840388404884058840688407884088840988410884118841288413884148841588416884178841888419884208842188422884238842488425884268842788428884298843088431884328843388434884358843688437884388843988440884418844288443884448844588446884478844888449884508845188452884538845488455884568845788458884598846088461884628846388464884658846688467884688846988470884718847288473884748847588476884778847888479884808848188482884838848488485884868848788488884898849088491884928849388494884958849688497884988849988500885018850288503885048850588506885078850888509885108851188512885138851488515885168851788518885198852088521885228852388524885258852688527885288852988530885318853288533885348853588536885378853888539885408854188542885438854488545885468854788548885498855088551885528855388554885558855688557885588855988560885618856288563885648856588566885678856888569885708857188572885738857488575885768857788578885798858088581885828858388584885858858688587885888858988590885918859288593885948859588596885978859888599886008860188602886038860488605886068860788608886098861088611886128861388614886158861688617886188861988620886218862288623886248862588626886278862888629886308863188632886338863488635886368863788638886398864088641886428864388644886458864688647886488864988650886518865288653886548865588656886578865888659886608866188662886638866488665886668866788668886698867088671886728867388674886758867688677886788867988680886818868288683886848868588686886878868888689886908869188692886938869488695886968869788698886998870088701887028870388704887058870688707887088870988710887118871288713887148871588716887178871888719887208872188722887238872488725887268872788728887298873088731887328873388734887358873688737887388873988740887418874288743887448874588746887478874888749887508875188752887538875488755887568875788758887598876088761887628876388764887658876688767887688876988770887718877288773887748877588776887778877888779887808878188782887838878488785887868878788788887898879088791887928879388794887958879688797887988879988800888018880288803888048880588806888078880888809888108881188812888138881488815888168881788818888198882088821888228882388824888258882688827888288882988830888318883288833888348883588836888378883888839888408884188842888438884488845888468884788848888498885088851888528885388854888558885688857888588885988860888618886288863888648886588866888678886888869888708887188872888738887488875888768887788878888798888088881888828888388884888858888688887888888888988890888918889288893888948889588896888978889888899889008890188902889038890488905889068890788908889098891088911889128891388914889158891688917889188891988920889218892288923889248892588926889278892888929889308893188932889338893488935889368893788938889398894088941889428894388944889458894688947889488894988950889518895288953889548895588956889578895888959889608896188962889638896488965889668896788968889698897088971889728897388974889758897688977889788897988980889818898288983889848898588986889878898888989889908899188992889938899488995889968899788998889998900089001890028900389004890058900689007890088900989010890118901289013890148901589016890178901889019890208902189022890238902489025890268902789028890298903089031890328903389034890358903689037890388903989040890418904289043890448904589046890478904889049890508905189052890538905489055890568905789058890598906089061890628906389064890658906689067890688906989070890718907289073890748907589076890778907889079890808908189082890838908489085890868908789088890898909089091890928909389094890958909689097890988909989100891018910289103891048910589106891078910889109891108911189112891138911489115891168911789118891198912089121891228912389124891258912689127891288912989130891318913289133891348913589136891378913889139891408914189142891438914489145891468914789148891498915089151891528915389154891558915689157891588915989160891618916289163891648916589166891678916889169891708917189172891738917489175891768917789178891798918089181891828918389184891858918689187891888918989190891918919289193891948919589196891978919889199892008920189202892038920489205892068920789208892098921089211892128921389214892158921689217892188921989220892218922289223892248922589226892278922889229892308923189232892338923489235892368923789238892398924089241892428924389244892458924689247892488924989250892518925289253892548925589256892578925889259892608926189262892638926489265892668926789268892698927089271892728927389274892758927689277892788927989280892818928289283892848928589286892878928889289892908929189292892938929489295892968929789298892998930089301893028930389304893058930689307893088930989310893118931289313893148931589316893178931889319893208932189322893238932489325893268932789328893298933089331893328933389334893358933689337893388933989340893418934289343893448934589346893478934889349893508935189352893538935489355893568935789358893598936089361893628936389364893658936689367893688936989370893718937289373893748937589376893778937889379893808938189382893838938489385893868938789388893898939089391893928939389394893958939689397893988939989400894018940289403894048940589406894078940889409894108941189412894138941489415894168941789418894198942089421894228942389424894258942689427894288942989430894318943289433894348943589436894378943889439894408944189442894438944489445894468944789448894498945089451894528945389454894558945689457894588945989460894618946289463894648946589466894678946889469894708947189472894738947489475894768947789478894798948089481894828948389484894858948689487894888948989490894918949289493894948949589496894978949889499895008950189502895038950489505895068950789508895098951089511895128951389514895158951689517895188951989520895218952289523895248952589526895278952889529895308953189532895338953489535895368953789538895398954089541895428954389544895458954689547895488954989550895518955289553895548955589556895578955889559895608956189562895638956489565895668956789568895698957089571895728957389574895758957689577895788957989580895818958289583895848958589586895878958889589895908959189592895938959489595895968959789598895998960089601896028960389604896058960689607896088960989610896118961289613896148961589616896178961889619896208962189622896238962489625896268962789628896298963089631896328963389634896358963689637896388963989640896418964289643896448964589646896478964889649896508965189652896538965489655896568965789658896598966089661896628966389664896658966689667896688966989670896718967289673896748967589676896778967889679896808968189682896838968489685896868968789688896898969089691896928969389694896958969689697896988969989700897018970289703897048970589706897078970889709897108971189712897138971489715897168971789718897198972089721897228972389724897258972689727897288972989730897318973289733897348973589736897378973889739897408974189742897438974489745897468974789748897498975089751897528975389754897558975689757897588975989760897618976289763897648976589766897678976889769897708977189772897738977489775897768977789778897798978089781897828978389784897858978689787897888978989790897918979289793897948979589796897978979889799898008980189802898038980489805898068980789808898098981089811898128981389814898158981689817898188981989820898218982289823898248982589826898278982889829898308983189832898338983489835898368983789838898398984089841898428984389844898458984689847898488984989850898518985289853898548985589856898578985889859898608986189862898638986489865898668986789868898698987089871898728987389874898758987689877898788987989880898818988289883898848988589886898878988889889898908989189892898938989489895898968989789898898998990089901899028990389904899058990689907899088990989910899118991289913899148991589916899178991889919899208992189922899238992489925899268992789928899298993089931899328993389934899358993689937899388993989940899418994289943899448994589946899478994889949899508995189952899538995489955899568995789958899598996089961899628996389964899658996689967899688996989970899718997289973899748997589976899778997889979899808998189982899838998489985899868998789988899898999089991899928999389994899958999689997899988999990000900019000290003900049000590006900079000890009900109001190012900139001490015900169001790018900199002090021900229002390024900259002690027900289002990030900319003290033900349003590036900379003890039900409004190042900439004490045900469004790048900499005090051900529005390054900559005690057900589005990060900619006290063900649006590066900679006890069900709007190072900739007490075900769007790078900799008090081900829008390084900859008690087900889008990090900919009290093900949009590096900979009890099901009010190102901039010490105901069010790108901099011090111901129011390114901159011690117901189011990120901219012290123901249012590126901279012890129901309013190132901339013490135901369013790138901399014090141901429014390144901459014690147901489014990150901519015290153901549015590156901579015890159901609016190162901639016490165901669016790168901699017090171901729017390174901759017690177901789017990180901819018290183901849018590186901879018890189901909019190192901939019490195901969019790198901999020090201902029020390204902059020690207902089020990210902119021290213902149021590216902179021890219902209022190222902239022490225902269022790228902299023090231902329023390234902359023690237902389023990240902419024290243902449024590246902479024890249902509025190252902539025490255902569025790258902599026090261902629026390264902659026690267902689026990270902719027290273902749027590276902779027890279902809028190282902839028490285902869028790288902899029090291902929029390294902959029690297902989029990300903019030290303903049030590306903079030890309903109031190312903139031490315903169031790318903199032090321903229032390324903259032690327903289032990330903319033290333903349033590336903379033890339903409034190342903439034490345903469034790348903499035090351903529035390354903559035690357903589035990360903619036290363903649036590366903679036890369903709037190372903739037490375903769037790378903799038090381903829038390384903859038690387903889038990390903919039290393903949039590396903979039890399904009040190402904039040490405904069040790408904099041090411904129041390414904159041690417904189041990420904219042290423904249042590426904279042890429904309043190432904339043490435904369043790438904399044090441904429044390444904459044690447904489044990450904519045290453904549045590456904579045890459904609046190462904639046490465904669046790468904699047090471904729047390474904759047690477904789047990480904819048290483904849048590486904879048890489904909049190492904939049490495904969049790498904999050090501905029050390504905059050690507905089050990510905119051290513905149051590516905179051890519905209052190522905239052490525905269052790528905299053090531905329053390534905359053690537905389053990540905419054290543905449054590546905479054890549905509055190552905539055490555905569055790558905599056090561905629056390564905659056690567905689056990570905719057290573905749057590576905779057890579905809058190582905839058490585905869058790588905899059090591905929059390594905959059690597905989059990600906019060290603906049060590606906079060890609906109061190612906139061490615906169061790618906199062090621906229062390624906259062690627906289062990630906319063290633906349063590636906379063890639906409064190642906439064490645906469064790648906499065090651906529065390654906559065690657906589065990660906619066290663906649066590666906679066890669906709067190672906739067490675906769067790678906799068090681906829068390684906859068690687906889068990690906919069290693906949069590696906979069890699907009070190702907039070490705907069070790708907099071090711907129071390714907159071690717907189071990720907219072290723907249072590726907279072890729907309073190732907339073490735907369073790738907399074090741907429074390744907459074690747907489074990750907519075290753907549075590756907579075890759907609076190762907639076490765907669076790768907699077090771907729077390774907759077690777907789077990780907819078290783907849078590786907879078890789907909079190792907939079490795907969079790798907999080090801908029080390804908059080690807908089080990810908119081290813908149081590816908179081890819908209082190822908239082490825908269082790828908299083090831908329083390834908359083690837908389083990840908419084290843908449084590846908479084890849908509085190852908539085490855908569085790858908599086090861908629086390864908659086690867908689086990870908719087290873908749087590876908779087890879908809088190882908839088490885908869088790888908899089090891908929089390894908959089690897908989089990900909019090290903909049090590906909079090890909909109091190912909139091490915909169091790918909199092090921909229092390924909259092690927909289092990930909319093290933909349093590936909379093890939909409094190942909439094490945909469094790948909499095090951909529095390954909559095690957909589095990960909619096290963909649096590966909679096890969909709097190972909739097490975909769097790978909799098090981909829098390984909859098690987909889098990990909919099290993909949099590996909979099890999910009100191002910039100491005910069100791008910099101091011910129101391014910159101691017910189101991020910219102291023910249102591026910279102891029910309103191032910339103491035910369103791038910399104091041910429104391044910459104691047910489104991050910519105291053910549105591056910579105891059910609106191062910639106491065910669106791068910699107091071910729107391074910759107691077910789107991080910819108291083910849108591086910879108891089910909109191092910939109491095910969109791098910999110091101911029110391104911059110691107911089110991110911119111291113911149111591116911179111891119911209112191122911239112491125911269112791128911299113091131911329113391134911359113691137911389113991140911419114291143911449114591146911479114891149911509115191152911539115491155911569115791158911599116091161911629116391164911659116691167911689116991170911719117291173911749117591176911779117891179911809118191182911839118491185911869118791188911899119091191911929119391194911959119691197911989119991200912019120291203912049120591206912079120891209912109121191212912139121491215912169121791218912199122091221912229122391224912259122691227912289122991230912319123291233912349123591236912379123891239912409124191242912439124491245912469124791248912499125091251912529125391254912559125691257912589125991260912619126291263912649126591266912679126891269912709127191272912739127491275912769127791278912799128091281912829128391284912859128691287912889128991290912919129291293912949129591296912979129891299913009130191302913039130491305913069130791308913099131091311913129131391314913159131691317913189131991320913219132291323913249132591326913279132891329913309133191332913339133491335913369133791338913399134091341913429134391344913459134691347913489134991350913519135291353913549135591356913579135891359913609136191362913639136491365913669136791368913699137091371913729137391374913759137691377913789137991380913819138291383913849138591386913879138891389913909139191392913939139491395913969139791398913999140091401914029140391404914059140691407914089140991410914119141291413914149141591416914179141891419914209142191422914239142491425914269142791428914299143091431914329143391434914359143691437914389143991440914419144291443914449144591446914479144891449914509145191452914539145491455914569145791458914599146091461914629146391464914659146691467914689146991470914719147291473914749147591476914779147891479914809148191482914839148491485914869148791488914899149091491914929149391494914959149691497914989149991500915019150291503915049150591506915079150891509915109151191512915139151491515915169151791518915199152091521915229152391524915259152691527915289152991530915319153291533915349153591536915379153891539915409154191542915439154491545915469154791548915499155091551915529155391554915559155691557915589155991560915619156291563915649156591566915679156891569915709157191572915739157491575915769157791578915799158091581915829158391584915859158691587915889158991590915919159291593915949159591596915979159891599916009160191602916039160491605916069160791608916099161091611916129161391614916159161691617916189161991620916219162291623916249162591626916279162891629916309163191632916339163491635916369163791638916399164091641916429164391644916459164691647916489164991650916519165291653916549165591656916579165891659916609166191662916639166491665916669166791668916699167091671916729167391674916759167691677916789167991680916819168291683916849168591686916879168891689916909169191692916939169491695916969169791698916999170091701917029170391704917059170691707917089170991710917119171291713917149171591716917179171891719917209172191722917239172491725917269172791728917299173091731917329173391734917359173691737917389173991740917419174291743917449174591746917479174891749917509175191752917539175491755917569175791758917599176091761917629176391764917659176691767917689176991770917719177291773917749177591776917779177891779917809178191782917839178491785917869178791788917899179091791917929179391794917959179691797917989179991800918019180291803918049180591806918079180891809918109181191812918139181491815918169181791818918199182091821918229182391824918259182691827918289182991830918319183291833918349183591836918379183891839918409184191842918439184491845918469184791848918499185091851918529185391854918559185691857918589185991860918619186291863918649186591866918679186891869918709187191872918739187491875918769187791878918799188091881918829188391884918859188691887918889188991890918919189291893918949189591896918979189891899919009190191902919039190491905919069190791908919099191091911919129191391914919159191691917919189191991920919219192291923919249192591926919279192891929919309193191932919339193491935919369193791938919399194091941919429194391944919459194691947919489194991950919519195291953919549195591956919579195891959919609196191962919639196491965919669196791968919699197091971919729197391974919759197691977919789197991980919819198291983919849198591986919879198891989919909199191992919939199491995919969199791998919999200092001920029200392004920059200692007920089200992010920119201292013920149201592016920179201892019920209202192022920239202492025920269202792028920299203092031920329203392034920359203692037920389203992040920419204292043920449204592046920479204892049920509205192052920539205492055920569205792058920599206092061920629206392064920659206692067920689206992070920719207292073920749207592076920779207892079920809208192082920839208492085920869208792088920899209092091920929209392094920959209692097920989209992100921019210292103921049210592106921079210892109921109211192112921139211492115921169211792118921199212092121921229212392124921259212692127921289212992130921319213292133921349213592136921379213892139921409214192142921439214492145921469214792148921499215092151921529215392154921559215692157921589215992160921619216292163921649216592166921679216892169921709217192172921739217492175921769217792178921799218092181921829218392184921859218692187921889218992190921919219292193921949219592196921979219892199922009220192202922039220492205922069220792208922099221092211922129221392214922159221692217922189221992220922219222292223922249222592226922279222892229922309223192232922339223492235922369223792238922399224092241922429224392244922459224692247922489224992250922519225292253922549225592256922579225892259922609226192262922639226492265922669226792268922699227092271922729227392274922759227692277922789227992280922819228292283922849228592286922879228892289922909229192292922939229492295922969229792298922999230092301923029230392304923059230692307923089230992310923119231292313923149231592316923179231892319923209232192322923239232492325923269232792328923299233092331923329233392334923359233692337923389233992340923419234292343923449234592346923479234892349923509235192352923539235492355923569235792358923599236092361923629236392364923659236692367923689236992370923719237292373923749237592376923779237892379923809238192382923839238492385923869238792388923899239092391923929239392394923959239692397923989239992400924019240292403924049240592406924079240892409924109241192412924139241492415924169241792418924199242092421924229242392424924259242692427924289242992430924319243292433924349243592436924379243892439924409244192442924439244492445924469244792448924499245092451924529245392454924559245692457924589245992460924619246292463924649246592466924679246892469924709247192472924739247492475924769247792478924799248092481924829248392484924859248692487924889248992490924919249292493924949249592496924979249892499925009250192502925039250492505925069250792508925099251092511925129251392514925159251692517925189251992520925219252292523925249252592526925279252892529925309253192532925339253492535925369253792538925399254092541925429254392544925459254692547925489254992550925519255292553925549255592556925579255892559925609256192562925639256492565925669256792568925699257092571925729257392574925759257692577925789257992580925819258292583925849258592586925879258892589925909259192592925939259492595925969259792598925999260092601926029260392604926059260692607926089260992610926119261292613926149261592616926179261892619926209262192622926239262492625926269262792628926299263092631926329263392634926359263692637926389263992640926419264292643926449264592646926479264892649926509265192652926539265492655926569265792658926599266092661926629266392664926659266692667926689266992670926719267292673926749267592676926779267892679926809268192682926839268492685926869268792688926899269092691926929269392694926959269692697926989269992700927019270292703927049270592706927079270892709927109271192712927139271492715927169271792718927199272092721927229272392724927259272692727927289272992730927319273292733927349273592736927379273892739927409274192742927439274492745927469274792748927499275092751927529275392754927559275692757927589275992760927619276292763927649276592766927679276892769927709277192772927739277492775927769277792778927799278092781927829278392784927859278692787927889278992790927919279292793927949279592796927979279892799928009280192802928039280492805928069280792808928099281092811928129281392814928159281692817928189281992820928219282292823928249282592826928279282892829928309283192832928339283492835928369283792838928399284092841928429284392844928459284692847928489284992850928519285292853928549285592856928579285892859928609286192862928639286492865928669286792868928699287092871928729287392874928759287692877928789287992880928819288292883928849288592886928879288892889928909289192892928939289492895928969289792898928999290092901929029290392904929059290692907929089290992910929119291292913929149291592916929179291892919929209292192922929239292492925929269292792928929299293092931929329293392934929359293692937929389293992940929419294292943929449294592946929479294892949929509295192952929539295492955929569295792958929599296092961929629296392964929659296692967929689296992970929719297292973929749297592976929779297892979929809298192982929839298492985929869298792988929899299092991929929299392994929959299692997929989299993000930019300293003930049300593006930079300893009930109301193012930139301493015930169301793018930199302093021930229302393024930259302693027930289302993030930319303293033930349303593036930379303893039930409304193042930439304493045930469304793048930499305093051930529305393054930559305693057930589305993060930619306293063930649306593066930679306893069930709307193072930739307493075930769307793078930799308093081930829308393084930859308693087930889308993090930919309293093930949309593096930979309893099931009310193102931039310493105931069310793108931099311093111931129311393114931159311693117931189311993120931219312293123931249312593126931279312893129931309313193132931339313493135931369313793138931399314093141931429314393144931459314693147931489314993150931519315293153931549315593156931579315893159931609316193162931639316493165931669316793168931699317093171931729317393174931759317693177931789317993180931819318293183931849318593186931879318893189931909319193192931939319493195931969319793198931999320093201932029320393204932059320693207932089320993210932119321293213932149321593216932179321893219932209322193222932239322493225932269322793228932299323093231932329323393234932359323693237932389323993240932419324293243932449324593246932479324893249932509325193252932539325493255932569325793258932599326093261932629326393264932659326693267932689326993270932719327293273932749327593276932779327893279932809328193282932839328493285932869328793288932899329093291932929329393294932959329693297932989329993300933019330293303933049330593306933079330893309933109331193312933139331493315933169331793318933199332093321933229332393324933259332693327933289332993330933319333293333933349333593336933379333893339933409334193342933439334493345933469334793348933499335093351933529335393354933559335693357933589335993360933619336293363933649336593366933679336893369933709337193372933739337493375933769337793378933799338093381933829338393384933859338693387933889338993390933919339293393933949339593396933979339893399934009340193402934039340493405934069340793408934099341093411934129341393414934159341693417934189341993420934219342293423934249342593426934279342893429934309343193432934339343493435934369343793438934399344093441934429344393444934459344693447934489344993450934519345293453934549345593456934579345893459934609346193462934639346493465934669346793468934699347093471934729347393474934759347693477934789347993480934819348293483934849348593486934879348893489934909349193492934939349493495934969349793498934999350093501935029350393504935059350693507935089350993510935119351293513935149351593516935179351893519935209352193522935239352493525935269352793528935299353093531935329353393534935359353693537935389353993540935419354293543935449354593546935479354893549935509355193552935539355493555935569355793558935599356093561935629356393564935659356693567935689356993570935719357293573935749357593576935779357893579935809358193582935839358493585935869358793588935899359093591935929359393594935959359693597935989359993600936019360293603936049360593606936079360893609936109361193612936139361493615936169361793618936199362093621936229362393624936259362693627936289362993630936319363293633936349363593636936379363893639936409364193642936439364493645936469364793648936499365093651936529365393654936559365693657936589365993660936619366293663936649366593666936679366893669936709367193672936739367493675936769367793678936799368093681936829368393684936859368693687936889368993690936919369293693936949369593696936979369893699937009370193702937039370493705937069370793708937099371093711937129371393714937159371693717937189371993720937219372293723937249372593726937279372893729937309373193732937339373493735937369373793738937399374093741937429374393744937459374693747937489374993750937519375293753937549375593756937579375893759937609376193762937639376493765937669376793768937699377093771937729377393774937759377693777937789377993780937819378293783937849378593786937879378893789937909379193792937939379493795937969379793798937999380093801938029380393804938059380693807938089380993810938119381293813938149381593816938179381893819938209382193822938239382493825938269382793828938299383093831938329383393834938359383693837938389383993840938419384293843938449384593846938479384893849938509385193852938539385493855938569385793858938599386093861938629386393864938659386693867938689386993870938719387293873938749387593876938779387893879938809388193882938839388493885938869388793888938899389093891938929389393894938959389693897938989389993900939019390293903939049390593906939079390893909939109391193912939139391493915939169391793918939199392093921939229392393924939259392693927939289392993930939319393293933939349393593936939379393893939939409394193942939439394493945939469394793948939499395093951939529395393954939559395693957939589395993960939619396293963939649396593966939679396893969939709397193972939739397493975939769397793978939799398093981939829398393984939859398693987939889398993990939919399293993939949399593996939979399893999940009400194002940039400494005940069400794008940099401094011940129401394014940159401694017940189401994020940219402294023940249402594026940279402894029940309403194032940339403494035940369403794038940399404094041940429404394044940459404694047940489404994050940519405294053940549405594056940579405894059940609406194062940639406494065940669406794068940699407094071940729407394074940759407694077940789407994080940819408294083940849408594086940879408894089940909409194092940939409494095940969409794098940999410094101941029410394104941059410694107941089410994110941119411294113941149411594116941179411894119941209412194122941239412494125941269412794128941299413094131941329413394134941359413694137941389413994140941419414294143941449414594146941479414894149941509415194152941539415494155941569415794158941599416094161941629416394164941659416694167941689416994170941719417294173941749417594176941779417894179941809418194182941839418494185941869418794188941899419094191941929419394194941959419694197941989419994200942019420294203942049420594206942079420894209942109421194212942139421494215942169421794218942199422094221942229422394224942259422694227942289422994230942319423294233942349423594236942379423894239942409424194242942439424494245942469424794248942499425094251942529425394254942559425694257942589425994260942619426294263942649426594266942679426894269942709427194272942739427494275942769427794278942799428094281942829428394284942859428694287942889428994290942919429294293942949429594296942979429894299943009430194302943039430494305943069430794308943099431094311943129431394314943159431694317943189431994320943219432294323943249432594326943279432894329943309433194332943339433494335943369433794338943399434094341943429434394344943459434694347943489434994350943519435294353943549435594356943579435894359943609436194362943639436494365943669436794368943699437094371943729437394374943759437694377943789437994380943819438294383943849438594386943879438894389943909439194392943939439494395943969439794398943999440094401944029440394404944059440694407944089440994410944119441294413944149441594416944179441894419944209442194422944239442494425944269442794428944299443094431944329443394434944359443694437944389443994440944419444294443944449444594446944479444894449944509445194452944539445494455944569445794458944599446094461944629446394464944659446694467944689446994470944719447294473944749447594476944779447894479944809448194482944839448494485944869448794488944899449094491944929449394494944959449694497944989449994500945019450294503945049450594506945079450894509945109451194512945139451494515945169451794518945199452094521945229452394524945259452694527945289452994530945319453294533945349453594536945379453894539945409454194542945439454494545945469454794548945499455094551945529455394554945559455694557945589455994560945619456294563945649456594566945679456894569945709457194572945739457494575945769457794578945799458094581945829458394584945859458694587945889458994590945919459294593945949459594596945979459894599946009460194602946039460494605946069460794608946099461094611946129461394614946159461694617946189461994620946219462294623946249462594626946279462894629946309463194632946339463494635946369463794638946399464094641946429464394644946459464694647946489464994650946519465294653946549465594656946579465894659946609466194662946639466494665946669466794668946699467094671946729467394674946759467694677946789467994680946819468294683946849468594686946879468894689946909469194692946939469494695946969469794698946999470094701947029470394704947059470694707947089470994710947119471294713947149471594716947179471894719947209472194722947239472494725947269472794728947299473094731947329473394734947359473694737947389473994740947419474294743947449474594746947479474894749947509475194752947539475494755947569475794758947599476094761947629476394764947659476694767947689476994770947719477294773947749477594776947779477894779947809478194782947839478494785947869478794788947899479094791947929479394794947959479694797947989479994800948019480294803948049480594806948079480894809948109481194812948139481494815948169481794818948199482094821948229482394824948259482694827948289482994830948319483294833948349483594836948379483894839948409484194842948439484494845948469484794848948499485094851948529485394854948559485694857948589485994860948619486294863948649486594866948679486894869948709487194872948739487494875948769487794878948799488094881948829488394884948859488694887948889488994890948919489294893948949489594896948979489894899949009490194902949039490494905949069490794908949099491094911949129491394914949159491694917949189491994920949219492294923949249492594926949279492894929949309493194932949339493494935949369493794938949399494094941949429494394944949459494694947949489494994950949519495294953949549495594956949579495894959949609496194962949639496494965949669496794968949699497094971949729497394974949759497694977949789497994980949819498294983949849498594986949879498894989949909499194992949939499494995949969499794998949999500095001950029500395004950059500695007950089500995010950119501295013950149501595016950179501895019950209502195022950239502495025950269502795028950299503095031950329503395034950359503695037950389503995040950419504295043950449504595046950479504895049950509505195052950539505495055950569505795058950599506095061950629506395064950659506695067950689506995070950719507295073950749507595076950779507895079950809508195082950839508495085950869508795088950899509095091950929509395094950959509695097950989509995100951019510295103951049510595106951079510895109951109511195112951139511495115951169511795118951199512095121951229512395124951259512695127951289512995130951319513295133951349513595136951379513895139951409514195142951439514495145951469514795148951499515095151951529515395154951559515695157951589515995160951619516295163951649516595166951679516895169951709517195172951739517495175951769517795178951799518095181951829518395184951859518695187951889518995190951919519295193951949519595196951979519895199952009520195202952039520495205952069520795208952099521095211952129521395214952159521695217952189521995220952219522295223952249522595226952279522895229952309523195232952339523495235952369523795238952399524095241952429524395244952459524695247952489524995250952519525295253952549525595256952579525895259952609526195262952639526495265952669526795268952699527095271952729527395274952759527695277952789527995280952819528295283952849528595286952879528895289952909529195292952939529495295952969529795298952999530095301953029530395304953059530695307953089530995310953119531295313953149531595316953179531895319953209532195322953239532495325953269532795328953299533095331953329533395334953359533695337953389533995340953419534295343953449534595346953479534895349953509535195352953539535495355953569535795358953599536095361953629536395364953659536695367953689536995370953719537295373953749537595376953779537895379953809538195382953839538495385953869538795388953899539095391953929539395394953959539695397953989539995400954019540295403954049540595406954079540895409954109541195412954139541495415954169541795418954199542095421954229542395424954259542695427954289542995430954319543295433954349543595436954379543895439954409544195442954439544495445954469544795448954499545095451954529545395454954559545695457954589545995460954619546295463954649546595466954679546895469954709547195472954739547495475954769547795478954799548095481954829548395484954859548695487954889548995490954919549295493954949549595496954979549895499955009550195502955039550495505955069550795508955099551095511955129551395514955159551695517955189551995520955219552295523955249552595526955279552895529955309553195532955339553495535955369553795538955399554095541955429554395544955459554695547955489554995550955519555295553955549555595556955579555895559955609556195562955639556495565955669556795568955699557095571955729557395574955759557695577955789557995580955819558295583955849558595586955879558895589955909559195592955939559495595955969559795598955999560095601956029560395604956059560695607956089560995610956119561295613956149561595616956179561895619956209562195622956239562495625956269562795628956299563095631956329563395634956359563695637956389563995640956419564295643956449564595646956479564895649956509565195652956539565495655956569565795658956599566095661956629566395664956659566695667956689566995670956719567295673956749567595676956779567895679956809568195682956839568495685956869568795688956899569095691956929569395694956959569695697956989569995700957019570295703957049570595706957079570895709957109571195712957139571495715957169571795718957199572095721957229572395724957259572695727957289572995730957319573295733957349573595736957379573895739957409574195742957439574495745957469574795748957499575095751957529575395754957559575695757957589575995760957619576295763957649576595766957679576895769957709577195772957739577495775957769577795778957799578095781957829578395784957859578695787957889578995790957919579295793957949579595796957979579895799958009580195802958039580495805958069580795808958099581095811958129581395814958159581695817958189581995820958219582295823958249582595826958279582895829958309583195832958339583495835958369583795838958399584095841958429584395844958459584695847958489584995850958519585295853958549585595856958579585895859958609586195862958639586495865958669586795868958699587095871958729587395874958759587695877958789587995880958819588295883958849588595886958879588895889958909589195892958939589495895958969589795898958999590095901959029590395904959059590695907959089590995910959119591295913959149591595916959179591895919959209592195922959239592495925959269592795928959299593095931959329593395934959359593695937959389593995940959419594295943959449594595946959479594895949959509595195952959539595495955959569595795958959599596095961959629596395964959659596695967959689596995970959719597295973959749597595976959779597895979959809598195982959839598495985959869598795988959899599095991959929599395994959959599695997959989599996000960019600296003960049600596006960079600896009960109601196012960139601496015960169601796018960199602096021960229602396024960259602696027960289602996030960319603296033960349603596036960379603896039960409604196042960439604496045960469604796048960499605096051960529605396054960559605696057960589605996060960619606296063960649606596066960679606896069960709607196072960739607496075960769607796078960799608096081960829608396084960859608696087960889608996090960919609296093960949609596096960979609896099961009610196102961039610496105961069610796108961099611096111961129611396114961159611696117961189611996120961219612296123961249612596126961279612896129961309613196132961339613496135961369613796138961399614096141961429614396144961459614696147961489614996150961519615296153961549615596156961579615896159961609616196162961639616496165961669616796168961699617096171961729617396174961759617696177961789617996180961819618296183961849618596186961879618896189961909619196192961939619496195961969619796198961999620096201962029620396204962059620696207962089620996210962119621296213962149621596216962179621896219962209622196222962239622496225962269622796228962299623096231962329623396234962359623696237962389623996240962419624296243962449624596246962479624896249962509625196252962539625496255962569625796258962599626096261962629626396264962659626696267962689626996270962719627296273962749627596276962779627896279962809628196282962839628496285962869628796288962899629096291962929629396294962959629696297962989629996300963019630296303963049630596306963079630896309963109631196312963139631496315963169631796318963199632096321963229632396324963259632696327963289632996330963319633296333963349633596336963379633896339963409634196342963439634496345963469634796348963499635096351963529635396354963559635696357963589635996360963619636296363963649636596366963679636896369963709637196372963739637496375963769637796378963799638096381963829638396384963859638696387963889638996390963919639296393963949639596396963979639896399964009640196402964039640496405964069640796408964099641096411964129641396414964159641696417964189641996420964219642296423964249642596426964279642896429964309643196432964339643496435964369643796438964399644096441964429644396444964459644696447964489644996450964519645296453964549645596456964579645896459964609646196462964639646496465964669646796468964699647096471964729647396474964759647696477964789647996480964819648296483964849648596486964879648896489964909649196492964939649496495964969649796498964999650096501965029650396504965059650696507965089650996510965119651296513965149651596516965179651896519965209652196522965239652496525965269652796528965299653096531965329653396534965359653696537965389653996540965419654296543965449654596546965479654896549965509655196552965539655496555965569655796558965599656096561965629656396564965659656696567965689656996570965719657296573965749657596576965779657896579965809658196582965839658496585965869658796588965899659096591965929659396594965959659696597965989659996600966019660296603966049660596606966079660896609966109661196612966139661496615966169661796618966199662096621966229662396624966259662696627966289662996630966319663296633966349663596636966379663896639966409664196642966439664496645966469664796648966499665096651966529665396654966559665696657966589665996660966619666296663966649666596666966679666896669966709667196672966739667496675966769667796678966799668096681966829668396684966859668696687966889668996690966919669296693966949669596696966979669896699967009670196702967039670496705967069670796708967099671096711967129671396714967159671696717967189671996720967219672296723967249672596726967279672896729967309673196732967339673496735967369673796738967399674096741967429674396744967459674696747967489674996750967519675296753967549675596756967579675896759967609676196762967639676496765967669676796768967699677096771967729677396774967759677696777967789677996780967819678296783967849678596786967879678896789967909679196792967939679496795967969679796798967999680096801968029680396804968059680696807968089680996810968119681296813968149681596816968179681896819968209682196822968239682496825968269682796828968299683096831968329683396834968359683696837968389683996840968419684296843968449684596846968479684896849968509685196852968539685496855968569685796858968599686096861968629686396864968659686696867968689686996870968719687296873968749687596876968779687896879968809688196882968839688496885968869688796888968899689096891968929689396894968959689696897968989689996900969019690296903969049690596906969079690896909969109691196912969139691496915969169691796918969199692096921969229692396924969259692696927969289692996930969319693296933969349693596936969379693896939969409694196942969439694496945969469694796948969499695096951969529695396954969559695696957969589695996960969619696296963969649696596966969679696896969969709697196972969739697496975969769697796978969799698096981969829698396984969859698696987969889698996990969919699296993969949699596996969979699896999970009700197002970039700497005970069700797008970099701097011970129701397014970159701697017970189701997020970219702297023970249702597026970279702897029970309703197032970339703497035970369703797038970399704097041970429704397044970459704697047970489704997050970519705297053970549705597056970579705897059970609706197062970639706497065970669706797068970699707097071970729707397074970759707697077970789707997080970819708297083970849708597086970879708897089970909709197092970939709497095970969709797098970999710097101971029710397104971059710697107971089710997110971119711297113971149711597116971179711897119971209712197122971239712497125971269712797128971299713097131971329713397134971359713697137971389713997140971419714297143971449714597146971479714897149971509715197152971539715497155971569715797158971599716097161971629716397164971659716697167971689716997170971719717297173971749717597176971779717897179971809718197182971839718497185971869718797188971899719097191971929719397194971959719697197971989719997200972019720297203972049720597206972079720897209972109721197212972139721497215972169721797218972199722097221972229722397224972259722697227972289722997230972319723297233972349723597236972379723897239972409724197242972439724497245972469724797248972499725097251972529725397254972559725697257972589725997260972619726297263972649726597266972679726897269972709727197272972739727497275972769727797278972799728097281972829728397284972859728697287972889728997290972919729297293972949729597296972979729897299973009730197302973039730497305973069730797308973099731097311973129731397314973159731697317973189731997320973219732297323973249732597326973279732897329973309733197332973339733497335973369733797338973399734097341973429734397344973459734697347973489734997350973519735297353973549735597356973579735897359973609736197362973639736497365973669736797368973699737097371973729737397374973759737697377973789737997380973819738297383973849738597386973879738897389973909739197392973939739497395973969739797398973999740097401974029740397404974059740697407974089740997410974119741297413974149741597416974179741897419974209742197422974239742497425974269742797428974299743097431974329743397434974359743697437974389743997440974419744297443974449744597446974479744897449974509745197452974539745497455974569745797458974599746097461974629746397464974659746697467974689746997470974719747297473974749747597476974779747897479974809748197482974839748497485974869748797488974899749097491974929749397494974959749697497974989749997500975019750297503975049750597506975079750897509975109751197512975139751497515975169751797518975199752097521975229752397524975259752697527975289752997530975319753297533975349753597536975379753897539975409754197542975439754497545975469754797548975499755097551975529755397554975559755697557975589755997560975619756297563975649756597566975679756897569975709757197572975739757497575975769757797578975799758097581975829758397584975859758697587975889758997590975919759297593975949759597596975979759897599976009760197602976039760497605976069760797608976099761097611976129761397614976159761697617976189761997620976219762297623976249762597626976279762897629976309763197632976339763497635976369763797638976399764097641976429764397644976459764697647976489764997650976519765297653976549765597656976579765897659976609766197662976639766497665976669766797668976699767097671976729767397674976759767697677976789767997680976819768297683976849768597686976879768897689976909769197692976939769497695976969769797698976999770097701977029770397704977059770697707977089770997710977119771297713977149771597716977179771897719977209772197722977239772497725977269772797728977299773097731977329773397734977359773697737977389773997740977419774297743977449774597746977479774897749977509775197752977539775497755977569775797758977599776097761977629776397764977659776697767977689776997770977719777297773977749777597776977779777897779977809778197782977839778497785977869778797788977899779097791977929779397794977959779697797977989779997800978019780297803978049780597806978079780897809978109781197812978139781497815978169781797818978199782097821978229782397824978259782697827978289782997830978319783297833978349783597836978379783897839978409784197842978439784497845978469784797848978499785097851978529785397854978559785697857978589785997860978619786297863978649786597866978679786897869978709787197872978739787497875978769787797878978799788097881978829788397884978859788697887978889788997890978919789297893978949789597896978979789897899979009790197902979039790497905979069790797908979099791097911979129791397914979159791697917979189791997920979219792297923979249792597926979279792897929979309793197932979339793497935979369793797938979399794097941979429794397944979459794697947979489794997950979519795297953979549795597956979579795897959979609796197962979639796497965979669796797968979699797097971979729797397974979759797697977979789797997980979819798297983979849798597986979879798897989979909799197992979939799497995979969799797998979999800098001980029800398004980059800698007980089800998010980119801298013980149801598016980179801898019980209802198022980239802498025980269802798028980299803098031980329803398034980359803698037980389803998040980419804298043980449804598046980479804898049980509805198052980539805498055980569805798058980599806098061980629806398064980659806698067980689806998070980719807298073980749807598076980779807898079980809808198082980839808498085980869808798088980899809098091980929809398094980959809698097980989809998100981019810298103981049810598106981079810898109981109811198112981139811498115981169811798118981199812098121981229812398124981259812698127981289812998130981319813298133981349813598136981379813898139981409814198142981439814498145981469814798148981499815098151981529815398154981559815698157981589815998160981619816298163981649816598166981679816898169981709817198172981739817498175981769817798178981799818098181981829818398184981859818698187981889818998190981919819298193981949819598196981979819898199982009820198202982039820498205982069820798208982099821098211982129821398214982159821698217982189821998220982219822298223982249822598226982279822898229982309823198232982339823498235982369823798238982399824098241982429824398244982459824698247982489824998250982519825298253982549825598256982579825898259982609826198262982639826498265982669826798268982699827098271982729827398274982759827698277982789827998280982819828298283982849828598286982879828898289982909829198292982939829498295982969829798298982999830098301983029830398304983059830698307983089830998310983119831298313983149831598316983179831898319983209832198322983239832498325983269832798328983299833098331983329833398334983359833698337983389833998340983419834298343983449834598346983479834898349983509835198352983539835498355983569835798358983599836098361983629836398364983659836698367983689836998370983719837298373983749837598376983779837898379983809838198382983839838498385983869838798388983899839098391983929839398394983959839698397983989839998400984019840298403984049840598406984079840898409984109841198412984139841498415984169841798418984199842098421984229842398424984259842698427984289842998430984319843298433984349843598436984379843898439984409844198442984439844498445984469844798448984499845098451984529845398454984559845698457984589845998460984619846298463984649846598466984679846898469984709847198472984739847498475984769847798478984799848098481984829848398484984859848698487984889848998490984919849298493984949849598496984979849898499985009850198502985039850498505985069850798508985099851098511985129851398514985159851698517985189851998520985219852298523985249852598526985279852898529985309853198532985339853498535985369853798538985399854098541985429854398544985459854698547985489854998550985519855298553985549855598556985579855898559985609856198562985639856498565985669856798568985699857098571985729857398574985759857698577985789857998580985819858298583985849858598586985879858898589985909859198592985939859498595985969859798598985999860098601986029860398604986059860698607986089860998610986119861298613986149861598616986179861898619986209862198622986239862498625986269862798628986299863098631986329863398634986359863698637986389863998640986419864298643986449864598646986479864898649986509865198652986539865498655986569865798658986599866098661986629866398664986659866698667986689866998670986719867298673986749867598676986779867898679986809868198682986839868498685986869868798688986899869098691986929869398694986959869698697986989869998700987019870298703987049870598706987079870898709987109871198712987139871498715987169871798718987199872098721987229872398724987259872698727987289872998730987319873298733987349873598736987379873898739987409874198742987439874498745987469874798748987499875098751987529875398754987559875698757987589875998760987619876298763987649876598766987679876898769987709877198772987739877498775987769877798778987799878098781987829878398784987859878698787987889878998790987919879298793987949879598796987979879898799988009880198802988039880498805988069880798808988099881098811988129881398814988159881698817988189881998820988219882298823988249882598826988279882898829988309883198832988339883498835988369883798838988399884098841988429884398844988459884698847988489884998850988519885298853988549885598856988579885898859988609886198862988639886498865988669886798868988699887098871988729887398874988759887698877988789887998880988819888298883988849888598886988879888898889988909889198892988939889498895988969889798898988999890098901989029890398904989059890698907989089890998910989119891298913989149891598916989179891898919989209892198922989239892498925989269892798928989299893098931989329893398934989359893698937989389893998940989419894298943989449894598946989479894898949989509895198952989539895498955989569895798958989599896098961989629896398964989659896698967989689896998970989719897298973989749897598976989779897898979989809898198982989839898498985989869898798988989899899098991989929899398994989959899698997989989899999000990019900299003990049900599006990079900899009990109901199012990139901499015990169901799018990199902099021990229902399024990259902699027990289902999030990319903299033990349903599036990379903899039990409904199042990439904499045990469904799048990499905099051990529905399054990559905699057990589905999060990619906299063990649906599066990679906899069990709907199072990739907499075990769907799078990799908099081990829908399084990859908699087990889908999090990919909299093990949909599096990979909899099991009910199102991039910499105991069910799108991099911099111991129911399114991159911699117991189911999120991219912299123991249912599126991279912899129991309913199132991339913499135991369913799138991399914099141991429914399144991459914699147991489914999150991519915299153991549915599156991579915899159991609916199162991639916499165991669916799168991699917099171991729917399174991759917699177991789917999180991819918299183991849918599186991879918899189991909919199192991939919499195991969919799198991999920099201992029920399204992059920699207992089920999210992119921299213992149921599216992179921899219992209922199222992239922499225992269922799228992299923099231992329923399234992359923699237992389923999240992419924299243992449924599246992479924899249992509925199252992539925499255992569925799258992599926099261992629926399264992659926699267992689926999270992719927299273992749927599276992779927899279992809928199282992839928499285992869928799288992899929099291992929929399294992959929699297992989929999300993019930299303993049930599306993079930899309993109931199312993139931499315993169931799318993199932099321993229932399324993259932699327993289932999330993319933299333993349933599336993379933899339993409934199342993439934499345993469934799348993499935099351993529935399354993559935699357993589935999360993619936299363993649936599366993679936899369993709937199372993739937499375993769937799378993799938099381993829938399384993859938699387993889938999390993919939299393993949939599396993979939899399994009940199402994039940499405994069940799408994099941099411994129941399414994159941699417994189941999420994219942299423994249942599426994279942899429994309943199432994339943499435994369943799438994399944099441994429944399444994459944699447994489944999450994519945299453994549945599456994579945899459994609946199462994639946499465994669946799468994699947099471994729947399474994759947699477994789947999480994819948299483994849948599486994879948899489994909949199492994939949499495994969949799498994999950099501995029950399504995059950699507995089950999510995119951299513995149951599516995179951899519995209952199522995239952499525995269952799528995299953099531995329953399534995359953699537995389953999540995419954299543995449954599546995479954899549995509955199552995539955499555995569955799558995599956099561995629956399564995659956699567995689956999570995719957299573995749957599576995779957899579995809958199582995839958499585995869958799588995899959099591995929959399594995959959699597995989959999600996019960299603996049960599606996079960899609996109961199612996139961499615996169961799618996199962099621996229962399624996259962699627996289962999630996319963299633996349963599636996379963899639996409964199642996439964499645996469964799648996499965099651996529965399654996559965699657996589965999660996619966299663996649966599666996679966899669996709967199672996739967499675996769967799678996799968099681996829968399684996859968699687996889968999690996919969299693996949969599696996979969899699997009970199702997039970499705997069970799708997099971099711997129971399714997159971699717997189971999720997219972299723997249972599726997279972899729997309973199732997339973499735997369973799738997399974099741997429974399744997459974699747997489974999750997519975299753997549975599756997579975899759997609976199762997639976499765997669976799768997699977099771997729977399774997759977699777997789977999780997819978299783997849978599786997879978899789997909979199792997939979499795997969979799798997999980099801998029980399804998059980699807998089980999810998119981299813998149981599816998179981899819998209982199822998239982499825998269982799828998299983099831998329983399834998359983699837998389983999840998419984299843998449984599846998479984899849998509985199852998539985499855998569985799858998599986099861998629986399864998659986699867998689986999870998719987299873998749987599876998779987899879998809988199882998839988499885998869988799888998899989099891998929989399894998959989699897998989989999900999019990299903999049990599906999079990899909999109991199912999139991499915999169991799918999199992099921999229992399924999259992699927999289992999930999319993299933999349993599936999379993899939999409994199942999439994499945999469994799948999499995099951999529995399954999559995699957999589995999960999619996299963999649996599966999679996899969999709997199972999739997499975999769997799978999799998099981999829998399984999859998699987999889998999990999919999299993999949999599996999979999899999100000100001100002100003100004100005100006100007100008100009100010100011100012100013100014100015100016100017100018100019100020100021100022100023100024100025100026100027100028100029100030100031100032100033100034100035100036100037100038100039100040100041100042100043100044100045100046100047100048100049100050100051100052100053100054100055100056100057100058100059100060100061100062100063100064100065100066100067100068100069100070100071100072100073100074100075100076100077100078100079100080100081100082100083100084100085100086100087100088100089100090100091100092100093100094100095100096100097100098100099100100100101100102100103100104100105100106100107100108100109100110100111100112100113100114100115100116100117100118100119100120100121100122100123100124100125100126100127100128100129100130100131100132100133100134100135100136100137100138100139100140100141100142100143100144100145100146100147100148100149100150100151100152100153100154100155100156100157100158100159100160100161100162100163100164100165100166100167100168100169100170100171100172100173100174100175100176100177100178100179100180100181100182100183100184100185100186100187100188100189100190100191100192100193100194100195100196100197100198100199100200100201100202100203100204100205100206100207100208100209100210100211100212100213100214100215100216100217100218100219100220100221100222100223100224100225100226100227100228100229100230100231100232100233100234100235100236100237100238100239100240100241100242100243100244100245100246100247100248100249100250100251100252100253100254100255100256100257100258100259100260100261100262100263100264100265100266100267100268100269100270100271100272100273100274100275100276100277100278100279100280100281100282100283100284100285100286100287100288100289100290100291100292100293100294100295100296100297100298100299100300100301100302100303100304100305100306100307100308100309100310100311100312100313100314100315100316100317100318100319100320100321100322100323100324100325100326100327100328100329100330100331100332100333100334100335100336100337100338100339100340100341100342100343100344100345100346100347100348100349100350100351100352100353100354100355100356100357100358100359100360100361100362100363100364100365100366100367100368100369100370100371100372100373100374100375100376100377100378100379100380100381100382100383100384100385100386100387100388100389100390100391100392100393100394100395100396100397100398100399100400100401100402100403100404100405100406100407100408100409100410100411100412100413100414100415100416100417100418100419100420100421100422100423100424100425100426100427100428100429100430100431100432100433100434100435100436100437100438100439100440100441100442100443100444100445100446100447100448100449100450100451100452100453100454100455100456100457100458100459100460100461100462100463100464100465100466100467100468100469100470100471100472100473100474100475100476100477100478100479100480100481100482100483100484100485100486100487100488100489100490100491100492100493100494100495100496100497100498100499100500100501100502100503100504100505100506100507100508100509100510100511100512100513100514100515100516100517100518100519100520100521100522100523100524100525100526100527100528100529100530100531100532100533100534100535100536100537100538100539100540100541100542100543100544100545100546100547100548100549100550100551100552100553100554100555100556100557100558100559100560100561100562100563100564100565100566100567100568100569100570100571100572100573100574100575100576100577100578100579100580100581100582100583100584100585100586100587100588100589100590100591100592100593100594100595100596100597100598100599100600100601100602100603100604100605100606100607100608100609100610100611100612100613100614100615100616100617100618100619100620100621100622100623100624100625100626100627100628100629100630100631100632100633100634100635100636100637100638100639100640100641100642100643100644100645100646100647100648100649100650100651100652100653100654100655100656100657100658100659100660100661100662100663100664100665100666100667100668100669100670100671100672100673100674100675100676100677100678100679100680100681100682100683100684100685100686100687100688100689100690100691100692100693100694100695100696100697100698100699100700100701100702100703100704100705100706100707100708100709100710100711100712100713100714100715100716100717100718100719100720100721100722100723100724100725100726100727100728100729100730100731100732100733100734100735100736100737100738100739100740100741100742100743100744100745100746100747100748100749100750100751100752100753100754100755100756100757100758100759100760100761100762100763100764100765100766100767100768100769100770100771100772100773100774100775100776100777100778100779100780100781100782100783100784100785100786100787100788100789100790100791100792100793100794100795100796100797100798100799100800100801100802100803100804100805100806100807100808100809100810100811100812100813100814100815100816100817100818100819100820100821100822100823100824100825100826100827100828100829100830100831100832100833100834100835100836100837100838100839100840100841100842100843100844100845100846100847100848100849100850100851100852100853100854100855100856100857100858100859100860100861100862100863100864100865100866100867100868100869100870100871100872100873100874100875100876100877100878100879100880100881100882100883100884100885100886100887100888100889100890100891100892100893100894100895100896100897100898100899100900100901100902100903100904100905100906100907100908100909100910100911100912100913100914100915100916100917100918100919100920100921100922100923100924100925100926100927100928100929100930100931100932100933100934100935100936100937100938100939100940100941100942100943100944100945100946100947100948100949100950100951100952100953100954100955100956100957100958100959100960100961100962100963100964100965100966100967100968100969100970100971100972100973100974100975100976100977100978100979100980100981100982100983100984100985100986100987100988100989100990100991100992100993100994100995100996100997100998100999101000101001101002101003101004101005101006101007101008101009101010101011101012101013101014101015101016101017101018101019101020101021101022101023101024101025101026101027101028101029101030101031101032101033101034101035101036101037101038101039101040101041101042101043101044101045101046101047101048101049101050101051101052101053101054101055101056101057101058101059101060101061101062101063101064101065101066101067101068101069101070101071101072101073101074101075101076101077101078101079101080101081101082101083101084101085101086101087101088101089101090101091101092101093101094101095101096101097101098101099101100101101101102101103101104101105101106101107101108101109101110101111101112101113101114101115101116101117101118101119101120101121101122101123101124101125101126101127101128101129101130101131101132101133101134101135101136101137101138101139101140101141101142101143101144101145101146101147101148101149101150101151101152101153101154101155101156101157101158101159101160101161101162101163101164101165101166101167101168101169101170101171101172101173101174101175101176101177101178101179101180101181101182101183101184101185101186101187101188101189101190101191101192101193101194101195101196101197101198101199101200101201101202101203101204101205101206101207101208101209101210101211101212101213101214101215101216101217101218101219101220101221101222101223101224101225101226101227101228101229101230101231101232101233101234101235101236101237101238101239101240101241101242101243101244101245101246101247101248101249101250101251101252101253101254101255101256101257101258101259101260101261101262101263101264101265101266101267101268101269101270101271101272101273101274101275101276101277101278101279101280101281101282101283101284101285101286101287101288101289101290101291101292101293101294101295101296101297101298101299101300101301101302101303101304101305101306101307101308101309101310101311101312101313101314101315101316101317101318101319101320101321101322101323101324101325101326101327101328101329101330101331101332101333101334101335101336101337101338101339101340101341101342101343101344101345101346101347101348101349101350101351101352101353101354101355101356101357101358101359101360101361101362101363101364101365101366101367101368101369101370101371101372101373101374101375101376101377101378101379101380101381101382101383101384101385101386101387101388101389101390101391101392101393101394101395101396101397101398101399101400101401101402101403101404101405101406101407101408101409101410101411101412101413101414101415101416101417101418101419101420101421101422101423101424101425101426101427101428101429101430101431101432101433101434101435101436101437101438101439101440101441101442101443101444101445101446101447101448101449101450101451101452101453101454101455101456101457101458101459101460101461101462101463101464101465101466101467101468101469101470101471101472101473101474101475101476101477101478101479101480101481101482101483101484101485101486101487101488101489101490101491101492101493101494101495101496101497101498101499101500101501101502101503101504101505101506101507101508101509101510101511101512101513101514101515101516101517101518101519101520101521101522101523101524101525101526101527101528101529101530101531101532101533101534101535101536101537101538101539101540101541101542101543101544101545101546101547101548101549101550101551101552101553101554101555101556101557101558101559101560101561101562101563101564101565101566101567101568101569101570101571101572101573101574101575101576101577101578101579101580101581101582101583101584101585101586101587101588101589101590101591101592101593101594101595101596101597101598101599101600101601101602101603101604101605101606101607101608101609101610101611101612101613101614101615101616101617101618101619101620101621101622101623101624101625101626101627101628101629101630101631101632101633101634101635101636101637101638101639101640101641101642101643101644101645101646101647101648101649101650101651101652101653101654101655101656101657101658101659101660101661101662101663101664101665101666101667101668101669101670101671101672101673101674101675101676101677101678101679101680101681101682101683101684101685101686101687101688101689101690101691101692101693101694101695101696101697101698101699101700101701101702101703101704101705101706101707101708101709101710101711101712101713101714101715101716101717101718101719101720101721101722101723101724101725101726101727101728101729101730101731101732101733101734101735101736101737101738101739101740101741101742101743101744101745101746101747101748101749101750101751101752101753101754101755101756101757101758101759101760101761101762101763101764101765101766101767101768101769101770101771101772101773101774101775101776101777101778101779101780101781101782101783101784101785101786101787101788101789101790101791101792101793101794101795101796101797101798101799101800101801101802101803101804101805101806101807101808101809101810101811101812101813101814101815101816101817101818101819101820101821101822101823101824101825101826101827101828101829101830101831101832101833101834101835101836101837101838101839101840101841101842101843101844101845101846101847101848101849101850101851101852101853101854101855101856101857101858101859101860101861101862101863101864101865101866101867101868101869101870101871101872101873101874101875101876101877101878101879101880101881101882101883101884101885101886101887101888101889101890101891101892101893101894101895101896101897101898101899101900101901101902101903101904101905101906101907101908101909101910101911101912101913101914101915101916101917101918101919101920101921101922101923101924101925101926101927101928101929101930101931101932101933101934101935101936101937101938101939101940101941101942101943101944101945101946101947101948101949101950101951101952101953101954101955101956101957101958101959101960101961101962101963101964101965101966101967101968101969101970101971101972101973101974101975101976101977101978101979101980101981101982101983101984101985101986101987101988101989101990101991101992101993101994101995101996101997101998101999102000102001102002102003102004102005102006102007102008102009102010102011102012102013102014102015102016102017102018102019102020102021102022102023102024102025102026102027102028102029102030102031102032102033102034102035102036102037102038102039102040102041102042102043102044102045102046102047102048102049102050102051102052102053102054102055102056102057102058102059102060102061102062102063102064102065102066102067102068102069102070102071102072102073102074102075102076102077102078102079102080102081102082102083102084102085102086102087102088102089102090102091102092102093102094102095102096102097102098102099102100102101102102102103102104102105102106102107102108102109102110102111102112102113102114102115102116102117102118102119102120102121102122102123102124102125102126102127102128102129102130102131102132102133102134102135102136102137102138102139102140102141102142102143102144102145102146102147102148102149102150102151102152102153102154102155102156102157102158102159102160102161102162102163102164102165102166102167102168102169102170102171102172102173102174102175102176102177102178102179102180102181102182102183102184102185102186102187102188102189102190102191102192102193102194102195102196102197102198102199102200102201102202102203102204102205102206102207102208102209102210102211102212102213102214102215102216102217102218102219102220102221102222102223102224102225102226102227102228102229102230102231102232102233102234102235102236102237102238102239102240102241102242102243102244102245102246102247102248102249102250102251102252102253102254102255102256102257102258102259102260102261102262102263102264102265102266102267102268102269102270102271102272102273102274102275102276102277102278102279102280102281102282102283102284102285102286102287102288102289102290102291102292102293102294102295102296102297102298102299102300102301102302102303102304102305102306102307102308102309102310102311102312102313102314102315102316102317102318102319102320102321102322102323102324102325102326102327102328102329102330102331102332102333102334102335102336102337102338102339102340102341102342102343102344102345102346102347102348102349102350102351102352102353102354102355102356102357102358102359102360102361102362102363102364102365102366102367102368102369102370102371102372102373102374102375102376102377102378102379102380102381102382102383102384102385102386102387102388102389102390102391102392102393102394102395102396102397102398102399102400102401102402102403102404102405102406102407102408102409102410102411102412102413102414102415102416102417102418102419102420102421102422102423102424102425102426102427102428102429102430102431102432102433102434102435102436102437102438102439102440102441102442102443102444102445102446102447102448102449102450102451102452102453102454102455102456102457102458102459102460102461102462102463102464102465102466102467102468102469102470102471102472102473102474102475102476102477102478102479102480102481102482102483102484102485102486102487102488102489102490102491102492102493102494102495102496102497102498102499102500102501102502102503102504102505102506102507102508102509102510102511102512102513102514102515102516102517102518102519102520102521102522102523102524102525102526102527102528102529102530102531102532102533102534102535102536102537102538102539102540102541102542102543102544102545102546102547102548102549102550102551102552102553102554102555102556102557102558102559102560102561102562102563102564102565102566102567102568102569102570102571102572102573102574102575102576102577102578102579102580102581102582102583102584102585102586102587102588102589102590102591102592102593102594102595102596102597102598102599102600102601102602102603102604102605102606102607102608102609102610102611102612102613102614102615102616102617102618102619102620102621102622102623102624102625102626102627102628102629102630102631102632102633102634102635102636102637102638102639102640102641102642102643102644102645102646102647102648102649102650102651102652102653102654102655102656102657102658102659102660102661102662102663102664102665102666102667102668102669102670102671102672102673102674102675102676102677102678102679102680102681102682102683102684102685102686102687102688102689102690102691102692102693102694102695102696102697102698102699102700102701102702102703102704102705102706102707102708102709102710102711102712102713102714102715102716102717102718102719102720102721102722102723102724102725102726102727102728102729102730102731102732102733102734102735102736102737102738102739102740102741102742102743102744102745102746102747102748102749102750102751102752102753102754102755102756102757102758102759102760102761102762102763102764102765102766102767102768102769102770102771102772102773102774102775102776102777102778102779102780102781102782102783102784102785102786102787102788102789102790102791102792102793102794102795102796102797102798102799102800102801102802102803102804102805102806102807102808102809102810102811102812102813102814102815102816102817102818102819102820102821102822102823102824102825102826102827102828102829102830102831102832102833102834102835102836102837102838102839102840102841102842102843102844102845102846102847102848102849102850102851102852102853102854102855102856102857102858102859102860102861102862102863102864102865102866102867102868102869102870102871102872102873102874102875102876102877102878102879102880102881102882102883102884102885102886102887102888102889102890102891102892102893102894102895102896102897102898102899102900102901102902102903102904102905102906102907102908102909102910102911102912102913102914102915102916102917102918102919102920102921102922102923102924102925102926102927102928102929102930102931102932102933102934102935102936102937102938102939102940102941102942102943102944102945102946102947102948102949102950102951102952102953102954102955102956102957102958102959102960102961102962102963102964102965102966102967102968102969102970102971102972102973102974102975102976102977102978102979102980102981102982102983102984102985102986102987102988102989102990102991102992102993102994102995102996102997102998102999103000103001103002103003103004103005103006103007103008103009103010103011103012103013103014103015103016103017103018103019103020103021103022103023103024103025103026103027103028103029103030103031103032103033103034103035103036103037103038103039103040103041103042103043103044103045103046103047103048103049103050103051103052103053103054103055103056103057103058103059103060103061103062103063103064103065103066103067103068103069103070103071103072103073103074103075103076103077103078103079103080103081103082103083103084103085103086103087103088103089103090103091103092103093103094103095103096103097103098103099103100103101103102103103103104103105103106103107103108103109103110103111103112103113103114103115103116103117103118103119103120103121103122103123103124103125103126103127103128103129103130103131103132103133103134103135103136103137103138103139103140103141103142103143103144103145103146103147103148103149103150103151103152103153103154103155103156103157103158103159103160103161103162103163103164103165103166103167103168103169103170103171103172103173103174103175103176103177103178103179103180103181103182103183103184103185103186103187103188103189103190103191103192103193103194103195103196103197103198103199103200103201103202103203103204103205103206103207103208103209103210103211103212103213103214103215103216103217103218103219103220103221103222103223103224103225103226103227103228103229103230103231103232103233103234103235103236103237103238103239103240103241103242103243103244103245103246103247103248103249103250103251103252103253103254103255103256103257103258103259103260103261103262103263103264103265103266103267103268103269103270103271103272103273103274103275103276103277103278103279103280103281103282103283103284103285103286103287103288103289103290103291103292103293103294103295103296103297103298103299103300103301103302103303103304103305103306103307103308103309103310103311103312103313103314103315103316103317103318103319103320103321103322103323103324103325103326103327103328103329103330103331103332103333103334103335103336103337103338103339103340103341103342103343103344103345103346103347103348103349103350103351103352103353103354103355103356103357103358103359103360103361103362103363103364103365103366103367103368103369103370103371103372103373103374103375103376103377103378103379103380103381103382103383103384103385103386103387103388103389103390103391103392103393103394103395103396103397103398103399103400103401103402103403103404103405103406103407103408103409103410103411103412103413103414103415103416103417103418103419103420103421103422103423103424103425103426103427103428103429103430103431103432103433103434103435103436103437103438103439103440103441103442103443103444103445103446103447103448103449103450103451103452103453103454103455103456103457103458103459103460103461103462103463103464103465103466103467103468103469103470103471103472103473103474103475103476103477103478103479103480103481103482103483103484103485103486103487103488103489103490103491103492103493103494103495103496103497103498103499103500103501103502103503103504103505103506103507103508103509103510103511103512103513103514103515103516103517103518103519103520103521103522103523103524103525103526103527103528103529103530103531103532103533103534103535103536103537103538103539103540103541103542103543103544103545103546103547103548103549103550103551103552103553103554103555103556103557103558103559103560103561103562103563103564103565103566103567103568103569103570103571103572103573103574103575103576103577103578103579103580103581103582103583103584103585103586103587103588103589103590103591103592103593103594103595103596103597103598103599103600103601103602103603103604103605103606103607103608103609103610103611103612103613103614103615103616103617103618103619103620103621103622103623103624103625103626103627103628103629103630103631103632103633103634103635103636103637103638103639103640103641103642103643103644103645103646103647103648103649103650103651103652103653103654103655103656103657103658103659103660103661103662103663103664103665103666103667103668103669103670103671103672103673103674103675103676103677103678103679103680103681103682103683103684103685103686103687103688103689103690103691103692103693103694103695103696103697103698103699103700103701103702103703103704103705103706103707103708103709103710103711103712103713103714103715103716103717103718103719103720103721103722103723103724103725103726103727103728103729103730103731103732103733103734103735103736103737103738103739103740103741103742103743103744103745103746103747103748103749103750103751103752103753103754103755103756103757103758103759103760103761103762103763103764103765103766103767103768103769103770103771103772103773103774103775103776103777103778103779103780103781103782103783103784103785103786103787103788103789103790103791103792103793103794103795103796103797103798103799103800103801103802103803103804103805103806103807103808103809103810103811103812103813103814103815103816103817103818103819103820103821103822103823103824103825103826103827103828103829103830103831103832103833103834103835103836103837103838103839103840103841103842103843103844103845103846103847103848103849103850103851103852103853103854103855103856103857103858103859103860103861103862103863103864103865103866103867103868103869103870103871103872103873103874103875103876103877103878103879103880103881103882103883103884103885103886103887103888103889103890103891103892103893103894103895103896103897103898103899103900103901103902103903103904103905103906103907103908103909103910103911103912103913103914103915103916103917103918103919103920103921103922103923103924103925103926103927103928103929103930103931103932103933103934103935103936103937103938103939103940103941103942103943103944103945103946103947103948103949103950103951103952103953103954103955103956103957103958103959103960103961103962103963103964103965103966103967103968103969103970103971103972103973103974103975103976103977103978103979103980103981103982103983103984103985103986103987103988103989103990103991103992103993103994103995103996103997103998103999104000104001104002104003104004104005104006104007104008104009104010104011104012104013104014104015104016104017104018104019104020104021104022104023104024104025104026104027104028104029104030104031104032104033104034104035104036104037104038104039104040104041104042104043104044104045104046104047104048104049104050104051104052104053104054104055104056104057104058104059104060104061104062104063104064104065104066104067104068104069104070104071104072104073104074104075104076104077104078104079104080104081104082104083104084104085104086104087104088104089104090104091104092104093104094104095104096104097104098104099104100104101104102104103104104104105104106104107104108104109104110104111104112104113104114104115104116104117104118104119104120104121104122104123104124104125104126104127104128104129104130104131104132104133104134104135104136104137104138104139104140104141104142104143104144104145104146104147104148104149104150104151104152104153104154104155104156104157104158104159104160104161104162104163104164104165104166104167104168104169104170104171104172104173104174104175104176104177104178104179104180104181104182104183104184104185104186104187104188104189104190104191104192104193104194104195104196104197104198104199104200104201104202104203104204104205104206104207104208104209104210104211104212104213104214104215104216104217104218104219104220104221104222104223104224104225104226104227104228104229104230104231104232104233104234104235104236104237104238104239104240104241104242104243104244104245104246104247104248104249104250104251104252104253104254104255104256104257104258104259104260104261104262104263104264104265104266104267104268104269104270104271104272104273104274104275104276104277104278104279104280104281104282104283104284104285104286104287104288104289104290104291104292104293104294104295104296104297104298104299104300104301104302104303104304104305104306104307104308104309104310104311104312104313104314104315104316104317104318104319104320104321104322104323104324104325104326104327104328104329104330104331104332104333104334104335104336104337104338104339104340104341104342104343104344104345104346104347104348104349104350104351104352104353104354104355104356104357104358104359104360104361104362104363104364104365104366104367104368104369104370104371104372104373104374104375104376104377104378104379104380104381104382104383104384104385104386104387104388104389104390104391104392104393104394104395104396104397104398104399104400104401104402104403104404104405104406104407104408104409104410104411104412104413104414104415104416104417104418104419104420104421104422104423104424104425104426104427104428104429104430104431104432104433104434104435104436104437104438104439104440104441104442104443104444104445104446104447104448104449104450104451104452104453104454104455104456104457104458104459104460104461104462104463104464104465104466104467104468104469104470104471104472104473104474104475104476104477104478104479104480104481104482104483104484104485104486104487104488104489104490104491104492104493104494104495104496104497104498104499104500104501104502104503104504104505104506104507104508104509104510104511104512104513104514104515104516104517104518104519104520104521104522104523104524104525104526104527104528104529104530104531104532104533104534104535104536104537104538104539104540104541104542104543104544104545104546104547104548104549104550104551104552104553104554104555104556104557104558104559104560104561104562104563104564104565104566104567104568104569104570104571104572104573104574104575104576104577104578104579104580104581104582104583104584104585104586104587104588104589104590104591104592104593104594104595104596104597104598104599104600104601104602104603104604104605104606104607104608104609104610104611104612104613104614104615104616104617104618104619104620104621104622104623104624104625104626104627104628104629104630104631104632104633104634104635104636104637104638104639104640104641104642104643104644104645104646104647104648104649104650104651104652104653104654104655104656104657104658104659104660104661104662104663104664104665104666104667104668104669104670104671104672104673104674104675104676104677104678104679104680104681104682104683104684104685104686104687104688104689104690104691104692104693104694104695104696104697104698104699104700104701104702104703104704104705104706104707104708104709104710104711104712104713104714104715104716104717104718104719104720104721104722104723104724104725104726104727104728104729104730104731104732104733104734104735104736104737104738104739104740104741104742104743104744104745104746104747104748104749104750104751104752104753104754104755104756104757104758104759104760104761104762104763104764104765104766104767104768104769104770104771104772104773104774104775104776104777104778104779104780104781104782104783104784104785104786104787104788104789104790104791104792104793104794104795104796104797104798104799104800104801104802104803104804104805104806104807104808104809104810104811104812104813104814104815104816104817104818104819104820104821104822104823104824104825104826104827104828104829104830104831104832104833104834104835104836104837104838104839104840104841104842104843104844104845104846104847104848104849104850104851104852104853104854104855104856104857104858104859104860104861104862104863104864104865104866104867104868104869104870104871104872104873104874104875104876104877104878104879104880104881104882104883104884104885104886104887104888104889104890104891104892104893104894104895104896104897104898104899104900104901104902104903104904104905104906104907104908104909104910104911104912104913104914104915104916104917104918104919104920104921104922104923104924104925104926104927104928104929104930104931104932104933104934104935104936104937104938104939104940104941104942104943104944104945104946104947104948104949104950104951104952104953104954104955104956104957104958104959104960104961104962104963104964104965104966104967104968104969104970104971104972104973104974104975104976104977104978104979104980104981104982104983104984104985104986104987104988104989104990104991104992104993104994104995104996104997104998104999105000105001105002105003105004105005105006105007105008105009105010105011105012105013105014105015105016105017105018105019105020105021105022105023105024105025105026105027105028105029105030105031105032105033105034105035105036105037105038105039105040105041105042105043105044105045105046105047105048105049105050105051105052105053105054105055105056105057105058105059105060105061105062105063105064105065105066105067105068105069105070105071105072105073105074105075105076105077105078105079105080105081105082105083105084105085105086105087105088105089105090105091105092105093105094105095105096105097105098105099105100105101105102105103105104105105105106105107105108105109105110105111105112105113105114105115105116105117105118105119105120105121105122105123105124105125105126105127105128105129105130105131105132105133105134105135105136105137105138105139105140105141105142105143105144105145105146105147105148105149105150105151105152105153105154105155105156105157105158105159105160105161105162105163105164105165105166105167105168105169105170105171105172105173105174105175105176105177105178105179105180105181105182105183105184105185105186105187105188105189105190105191105192105193105194105195105196105197105198105199105200105201105202105203105204105205105206105207105208105209105210105211105212105213105214105215105216105217105218105219105220105221105222105223105224105225105226105227105228105229105230105231105232105233105234105235105236105237105238105239105240105241105242105243105244105245105246105247105248105249105250105251105252105253105254105255105256105257105258105259105260105261105262105263105264105265105266105267105268105269105270105271105272105273105274105275105276105277105278105279105280105281105282105283105284105285105286105287105288105289105290105291105292105293105294105295105296105297105298105299105300105301105302105303105304105305105306105307105308105309105310105311105312105313105314105315105316105317105318105319105320105321105322105323105324105325105326105327105328105329105330105331105332105333105334105335105336105337105338105339105340105341105342105343105344105345105346105347105348105349105350105351105352105353105354105355105356105357105358105359105360105361105362105363105364105365105366105367105368105369105370105371105372105373105374105375105376105377105378105379105380105381105382105383105384105385105386105387105388105389105390105391105392105393105394105395105396105397105398105399105400105401105402105403105404105405105406105407105408105409105410105411105412105413105414105415105416105417105418105419105420105421105422105423105424105425105426105427105428105429105430105431105432105433105434105435105436105437105438105439105440105441105442105443105444105445105446105447105448105449105450105451105452105453105454105455105456105457105458105459105460105461105462105463105464105465105466105467105468105469105470105471105472105473105474105475105476105477105478105479105480105481105482105483105484105485105486105487105488105489105490105491105492105493105494105495105496105497105498105499105500105501105502105503105504105505105506105507105508105509105510105511105512105513105514105515105516105517105518105519105520105521105522105523105524105525105526105527105528105529105530105531105532105533105534105535105536105537105538105539105540105541105542105543105544105545105546105547105548105549105550105551105552105553105554105555105556105557105558105559105560105561105562105563105564105565105566105567105568105569105570105571105572105573105574105575105576105577105578105579105580105581105582105583105584105585105586105587105588105589105590105591105592105593105594105595105596105597105598105599105600105601105602105603105604105605105606105607105608105609105610105611105612105613105614105615105616105617105618105619105620105621105622105623105624105625105626105627105628105629105630105631105632105633105634105635105636105637105638105639105640105641105642105643105644105645105646105647105648105649105650105651105652105653105654105655105656105657105658105659105660105661105662105663105664105665105666105667105668105669105670105671105672105673105674105675105676105677105678105679105680105681105682105683105684105685105686105687105688105689105690105691105692105693105694105695105696105697105698105699105700105701105702105703105704105705105706105707105708105709105710105711105712105713105714105715105716105717105718105719105720105721105722105723105724105725105726105727105728105729105730105731105732105733105734105735105736105737105738105739105740105741105742105743105744105745105746105747105748105749105750105751105752105753105754105755105756105757105758105759105760105761105762105763105764105765105766105767105768105769105770105771105772105773105774105775105776105777105778105779105780105781105782105783105784105785105786105787105788105789105790105791105792105793105794105795105796105797105798105799105800105801105802105803105804105805105806105807105808105809105810105811105812105813105814105815105816105817105818105819105820105821105822105823105824105825105826105827105828105829105830105831105832105833105834105835105836105837105838105839105840105841105842105843105844105845105846105847105848105849105850105851105852105853105854105855105856105857105858105859105860105861105862105863105864105865105866105867105868105869105870105871105872105873105874105875105876105877105878105879105880105881105882105883105884105885105886105887105888105889105890105891105892105893105894105895105896105897105898105899105900105901105902105903105904105905105906105907105908105909105910105911105912105913105914105915105916105917105918105919105920105921105922105923105924105925105926105927105928105929105930105931105932105933105934105935105936105937105938105939105940105941105942105943105944105945105946105947105948105949105950105951105952105953105954105955105956105957105958105959105960105961105962105963105964105965105966105967105968105969105970105971105972105973105974105975105976105977105978105979105980105981105982105983105984105985105986105987105988105989105990105991105992105993105994105995105996105997105998105999106000106001106002106003106004106005106006106007106008106009106010106011106012106013106014106015106016106017106018106019106020106021106022106023106024106025106026106027106028106029106030106031106032106033106034106035106036106037106038106039106040106041106042106043106044106045106046106047106048106049106050106051106052106053106054106055106056106057106058106059106060106061106062106063106064106065106066106067106068106069106070106071106072106073106074106075106076106077106078106079106080106081106082106083106084106085106086106087106088106089106090106091106092106093106094106095106096106097106098106099106100106101106102106103106104106105106106106107106108106109106110106111106112106113106114106115106116106117106118106119106120106121106122106123106124106125106126106127106128106129106130106131106132106133106134106135106136106137106138106139106140106141106142106143106144106145106146106147106148106149106150106151106152106153106154106155106156106157106158106159106160106161106162106163106164106165106166106167106168106169106170106171106172106173106174106175106176106177106178106179106180106181106182106183106184106185106186106187106188106189106190106191106192106193106194106195106196106197106198106199106200106201106202106203106204106205106206106207106208106209106210106211106212106213106214106215106216106217106218106219106220106221106222106223106224106225106226106227106228106229106230106231106232106233106234106235106236106237106238106239106240106241106242106243106244106245106246106247106248106249106250106251106252106253106254106255106256106257106258106259106260106261106262106263106264106265106266106267106268106269106270106271106272106273106274106275106276106277106278106279106280106281106282106283106284106285106286106287106288106289106290106291106292106293106294106295106296106297106298106299106300106301106302106303106304106305106306106307106308106309106310106311106312106313106314106315106316106317106318106319106320106321106322106323106324106325106326106327106328106329106330106331106332106333106334106335106336106337106338106339106340106341106342106343106344106345106346106347106348106349106350106351106352106353106354106355106356106357106358106359106360106361106362106363106364106365106366106367106368106369106370106371106372106373106374106375106376106377106378106379106380106381106382106383106384106385106386106387106388106389106390106391106392106393106394106395106396106397106398106399106400106401106402106403106404106405106406106407106408106409106410106411106412106413106414106415106416106417106418106419106420106421106422106423106424106425106426106427106428106429106430106431106432106433106434106435106436106437106438106439106440106441106442106443106444106445106446106447106448106449106450106451106452106453106454106455106456106457106458106459106460106461106462106463106464106465106466106467106468106469106470106471106472106473106474106475106476106477106478106479106480106481106482106483106484106485106486106487106488106489106490106491106492106493106494106495106496106497106498106499106500106501106502106503106504106505106506106507106508106509106510106511106512106513106514106515106516106517106518106519106520106521106522106523106524106525106526106527106528106529106530106531106532106533106534106535106536106537106538106539106540106541106542106543106544106545106546106547106548106549106550106551106552106553106554106555106556106557106558106559106560106561106562106563106564106565106566106567106568106569106570106571106572106573106574106575106576106577106578106579106580106581106582106583106584106585106586106587106588106589106590106591106592106593106594106595106596106597106598106599106600106601106602106603106604106605106606106607106608106609106610106611106612106613106614106615106616106617106618106619106620106621106622106623106624106625106626106627106628106629106630106631106632106633106634106635106636106637106638106639106640106641106642106643106644106645106646106647106648106649106650106651106652106653106654106655106656106657106658106659106660106661106662106663106664106665106666106667106668106669106670106671106672106673106674106675106676106677106678106679106680106681106682106683106684106685106686106687106688106689106690106691106692106693106694106695106696106697106698106699106700106701106702106703106704106705106706106707106708106709106710106711106712106713106714106715106716106717106718106719106720106721106722106723106724106725106726106727106728106729106730106731106732106733106734106735106736106737106738106739106740106741106742106743106744106745106746106747106748106749106750106751106752106753106754106755106756106757106758106759106760106761106762106763106764106765106766106767106768106769106770106771106772106773106774106775106776106777106778106779106780106781106782106783106784106785106786106787106788106789106790106791106792106793106794106795106796106797106798106799106800106801106802106803106804106805106806106807106808106809106810106811106812106813106814106815106816106817106818106819106820106821106822106823106824106825106826106827106828106829106830106831106832106833106834106835106836106837106838106839106840106841106842106843106844106845106846106847106848106849106850106851106852106853106854106855106856106857106858106859106860106861106862106863106864106865106866106867106868106869106870106871106872106873106874106875106876106877106878106879106880106881106882106883106884106885106886106887106888106889106890106891106892106893106894106895106896106897106898106899106900106901106902106903106904106905106906106907106908106909106910106911106912106913106914106915106916106917106918106919106920106921106922106923106924106925106926106927106928106929106930106931106932106933106934106935106936106937106938106939106940106941106942106943106944106945106946106947106948106949106950106951106952106953106954106955106956106957106958106959106960106961106962106963106964106965106966106967106968106969106970106971106972106973106974106975106976106977106978106979106980106981106982106983106984106985106986106987106988106989106990106991106992106993106994106995106996106997106998106999107000107001107002107003107004107005107006107007107008107009107010107011107012107013107014107015107016107017107018107019107020107021107022107023107024107025107026107027107028107029107030107031107032107033107034107035107036107037107038107039107040107041107042107043107044107045107046107047107048107049107050107051107052107053107054107055107056107057107058107059107060107061107062107063107064107065107066107067107068107069107070107071107072107073107074107075107076107077107078107079107080107081107082107083107084107085107086107087107088107089107090107091107092107093107094107095107096107097107098107099107100107101107102107103107104107105107106107107107108107109107110107111107112107113107114107115107116107117107118107119107120107121107122107123107124107125107126107127107128107129107130107131107132107133107134107135107136107137107138107139107140107141107142107143107144107145107146107147107148107149107150107151107152107153107154107155107156107157107158107159107160107161107162107163107164107165107166107167107168107169107170107171107172107173107174107175107176107177107178107179107180107181107182107183107184107185107186107187107188107189107190107191107192107193107194107195107196107197107198107199107200107201107202107203107204107205107206107207107208107209107210107211107212107213107214107215107216107217107218107219107220107221107222107223107224107225107226107227107228107229107230107231107232107233107234107235107236107237107238107239107240107241107242107243107244107245107246107247107248107249107250107251107252107253107254107255107256107257107258107259107260107261107262107263107264107265107266107267107268107269107270107271107272107273107274107275107276107277107278107279107280107281107282107283107284107285107286107287107288107289107290107291107292107293107294107295107296107297107298107299107300107301107302107303107304107305107306107307107308107309107310107311107312107313107314107315107316107317107318107319107320107321107322107323107324107325107326107327107328107329107330107331107332107333107334107335107336107337107338107339107340107341107342107343107344107345107346107347107348107349107350107351107352107353107354107355107356107357107358107359107360107361107362107363107364107365107366107367107368107369107370107371107372107373107374107375107376107377107378107379107380107381107382107383107384107385107386107387107388107389107390107391107392107393107394107395107396107397107398107399107400107401107402107403107404107405107406107407107408107409107410107411107412107413107414107415107416107417107418107419107420107421107422107423107424107425107426107427107428107429107430107431107432107433107434107435107436107437107438107439107440107441107442107443107444107445107446107447107448107449107450107451107452107453107454107455107456107457107458107459107460107461107462107463107464107465107466107467107468107469107470107471107472107473107474107475107476107477107478107479107480107481107482107483107484107485107486107487107488107489107490107491107492107493107494107495107496107497107498107499107500107501107502107503107504107505107506107507107508107509107510107511107512107513107514107515107516107517107518107519107520107521107522107523107524107525107526107527107528107529107530107531107532107533107534107535107536107537107538107539107540107541107542107543107544107545107546107547107548107549107550107551107552107553107554107555107556107557107558107559107560107561107562107563107564107565107566107567107568107569107570107571107572107573107574107575107576107577107578107579107580107581107582107583107584107585107586107587107588107589107590107591107592107593107594107595107596107597107598107599107600107601107602107603107604107605107606107607107608107609107610107611107612107613107614107615107616107617107618107619107620107621107622107623107624107625107626107627107628107629107630107631107632107633107634107635107636107637107638107639107640107641107642107643107644107645107646107647107648107649107650107651107652107653107654107655107656107657107658107659107660107661107662107663107664107665107666107667107668107669107670107671107672107673107674107675107676107677107678107679107680107681107682107683107684107685107686107687107688107689107690107691107692107693107694107695107696107697107698107699107700107701107702107703107704107705107706107707107708107709107710107711107712107713107714107715107716107717107718107719107720107721107722107723107724107725107726107727107728107729107730107731107732107733107734107735107736107737107738107739107740107741107742107743107744107745107746107747107748107749107750107751107752107753107754107755107756107757107758107759107760107761107762107763107764107765107766107767107768107769107770107771107772107773107774107775107776107777107778107779107780107781107782107783107784107785107786107787107788107789107790107791107792107793107794107795107796107797107798107799107800107801107802107803107804107805107806107807107808107809107810107811107812107813107814107815107816107817107818107819107820107821107822107823107824107825107826107827107828107829107830107831107832107833107834107835107836107837107838107839107840107841107842107843107844107845107846107847107848107849107850107851107852107853107854107855107856107857107858107859107860107861107862107863107864107865107866107867107868107869107870107871107872107873107874107875107876107877107878107879107880107881107882107883107884107885107886107887107888107889107890107891107892107893107894107895107896107897107898107899107900107901107902107903107904107905107906107907107908107909107910107911107912107913107914107915107916107917107918107919107920107921107922107923107924107925107926107927107928107929107930107931107932107933107934107935107936107937107938107939107940107941107942107943107944107945107946107947107948107949107950107951107952107953107954107955107956107957107958107959107960107961107962107963107964107965107966107967107968107969107970107971107972107973107974107975107976107977107978107979107980107981107982107983107984107985107986107987107988107989107990107991107992107993107994107995107996107997107998107999108000108001108002108003108004108005108006108007108008108009108010108011108012108013108014108015108016108017108018108019108020108021108022108023108024108025108026108027108028108029108030108031108032108033108034108035108036108037108038108039108040108041108042108043108044108045108046108047108048108049108050108051108052108053108054108055108056108057108058108059108060108061108062108063108064108065108066108067108068108069108070108071108072108073108074108075108076108077108078108079108080108081108082108083108084108085108086108087108088108089108090108091108092108093108094108095108096108097108098108099108100108101108102108103108104108105108106108107108108108109108110108111108112108113108114108115108116108117108118108119108120108121108122108123108124108125108126108127108128108129108130108131108132108133108134108135108136108137108138108139108140108141108142108143108144108145108146108147108148108149108150108151108152108153108154108155108156108157108158108159108160108161108162108163108164108165108166108167108168108169108170108171108172108173108174108175108176108177108178108179108180108181108182108183108184108185108186108187108188108189108190108191108192108193108194108195108196108197108198108199108200108201108202108203108204108205108206108207108208108209108210108211108212108213108214108215108216108217108218108219108220108221108222108223108224108225108226108227108228108229108230108231108232108233108234108235108236108237108238108239108240108241108242108243108244108245108246108247108248108249108250108251108252108253108254108255108256108257108258108259108260108261108262108263108264108265108266108267108268108269108270108271108272108273108274108275108276108277108278108279108280108281108282108283108284108285108286108287108288108289108290108291108292108293108294108295108296108297108298108299108300108301108302108303108304108305108306108307108308108309108310108311108312108313108314108315108316108317108318108319108320108321108322108323108324108325108326108327108328108329108330108331108332108333108334108335108336108337108338108339108340108341108342108343108344108345108346108347108348108349108350108351108352108353108354108355108356108357108358108359108360108361108362108363108364108365108366108367108368108369108370108371108372108373108374108375108376108377108378108379108380108381108382108383108384108385108386108387108388108389108390108391108392108393108394108395108396108397108398108399108400108401108402108403108404108405108406108407108408108409108410108411108412108413108414108415108416108417108418108419108420108421108422108423108424108425108426108427108428108429108430108431108432108433108434108435108436108437108438108439108440108441108442108443108444108445108446108447108448108449108450108451108452108453108454108455108456108457108458108459108460108461108462108463108464108465108466108467108468108469108470108471108472108473108474108475108476108477108478108479108480108481108482108483108484108485108486108487108488108489108490108491108492108493108494108495108496108497108498108499108500108501108502108503108504108505108506108507108508108509108510108511108512108513108514108515108516108517108518108519108520108521108522108523108524108525108526108527108528108529108530108531108532108533108534108535108536108537108538108539108540108541108542108543108544108545108546108547108548108549108550108551108552108553108554108555108556108557108558108559108560108561108562108563108564108565108566108567108568108569108570108571108572108573108574108575108576108577108578108579108580108581108582108583108584108585108586108587108588108589108590108591108592108593108594108595108596108597108598108599108600108601108602108603108604108605108606108607108608108609108610108611108612108613108614108615108616108617108618108619108620108621108622108623108624108625108626108627108628108629108630108631108632108633108634108635108636108637108638108639108640108641108642108643108644108645108646108647108648108649108650108651108652108653108654108655108656108657108658108659108660108661108662108663108664108665108666108667108668108669108670108671108672108673108674108675108676108677108678108679108680108681108682108683108684108685108686108687108688108689108690108691108692108693108694108695108696108697108698108699108700108701108702108703108704108705108706108707108708108709108710108711108712108713108714108715108716108717108718108719108720108721108722108723108724108725108726108727108728108729108730108731108732108733108734108735108736108737108738108739108740108741108742108743108744108745108746108747108748108749108750108751108752108753108754108755108756108757108758108759108760108761108762108763108764108765108766108767108768108769108770108771108772108773108774108775108776108777108778108779108780108781108782108783108784108785108786108787108788108789108790108791108792108793108794108795108796108797108798108799108800108801108802108803108804108805108806108807108808108809108810108811108812108813108814108815108816108817108818108819108820108821108822108823108824108825108826108827108828108829108830108831108832108833108834108835108836108837108838108839108840108841108842108843108844108845108846108847108848108849108850108851108852108853108854108855108856108857108858108859108860108861108862108863108864108865108866108867108868108869108870108871108872108873108874108875108876108877108878108879108880108881108882108883108884108885108886108887108888108889108890108891108892108893108894108895108896108897108898108899108900108901108902108903108904108905108906108907108908108909108910108911108912108913108914108915108916108917108918108919108920108921108922108923108924108925108926108927108928108929108930108931108932108933108934108935108936108937108938108939108940108941108942108943108944108945108946108947108948108949108950108951108952108953108954108955108956108957108958108959108960108961108962108963108964108965108966108967108968108969108970108971108972108973108974108975108976108977108978108979108980108981108982108983108984108985108986108987108988108989108990108991108992108993108994108995108996108997108998108999109000109001109002109003109004109005109006109007109008109009109010109011109012109013109014109015109016109017109018109019109020109021109022109023109024109025109026109027109028109029109030109031109032109033109034109035109036109037109038109039109040109041109042109043109044109045109046109047109048109049109050109051109052109053109054109055109056109057109058109059109060109061109062109063109064109065109066109067109068109069109070109071109072109073109074109075109076109077109078109079109080109081109082109083109084109085109086109087109088109089109090109091109092109093109094109095109096109097109098109099109100109101109102109103109104109105109106109107109108109109109110109111109112109113109114109115109116109117109118109119109120109121109122109123109124109125109126109127109128109129109130109131109132109133109134109135109136109137109138109139109140109141109142109143109144109145109146109147109148109149109150109151109152109153109154109155109156109157109158109159109160109161109162109163109164109165109166109167109168109169109170109171109172109173109174109175109176109177109178109179109180109181109182109183109184109185109186109187109188109189109190109191109192109193109194109195109196109197109198109199109200109201109202109203109204109205109206109207109208109209109210109211109212109213109214109215109216109217109218109219109220109221109222109223109224109225109226109227109228109229109230109231109232109233109234109235109236109237109238109239109240109241109242109243109244109245109246109247109248109249109250109251109252109253109254109255109256109257109258109259109260109261109262109263109264109265109266109267109268109269109270109271109272109273109274109275109276109277109278109279109280109281109282109283109284109285109286109287109288109289109290109291109292109293109294109295109296109297109298109299109300109301109302109303109304109305109306109307109308109309109310109311109312109313109314109315109316109317109318109319109320109321109322109323109324109325109326109327109328109329109330109331109332109333109334109335109336109337109338109339109340109341109342109343109344109345109346109347109348109349109350109351109352109353109354109355109356109357109358109359109360109361109362109363109364109365109366109367109368109369109370109371109372109373109374109375109376109377109378109379109380109381109382109383109384109385109386109387109388109389109390109391109392109393109394109395109396109397109398109399109400109401109402109403109404109405109406109407109408109409109410109411109412109413109414109415109416109417109418109419109420109421109422109423109424109425109426109427109428109429109430109431109432109433109434109435109436109437109438109439109440109441109442109443109444109445109446109447109448109449109450109451109452109453109454109455109456109457109458109459109460109461109462109463109464109465109466109467109468109469109470109471109472109473109474109475109476109477109478109479109480109481109482109483109484109485109486109487109488109489109490109491109492109493109494109495109496109497109498109499109500109501109502109503109504109505109506109507109508109509109510109511109512109513109514109515109516109517109518109519109520109521109522109523109524109525109526109527109528109529109530109531109532109533109534109535109536109537109538109539109540109541109542109543109544109545109546109547109548109549109550109551109552109553109554109555109556109557109558109559109560109561109562109563109564109565109566109567109568109569109570109571109572109573109574109575109576109577109578109579109580109581109582109583109584109585109586109587109588109589109590109591109592109593109594109595109596109597109598109599109600109601109602109603109604109605109606109607109608109609109610109611109612109613109614109615109616109617109618109619109620109621109622109623109624109625109626109627109628109629109630109631109632109633109634109635109636109637109638109639109640109641109642109643109644109645109646109647109648109649109650109651109652109653109654109655109656109657109658109659109660109661109662109663109664109665109666109667109668109669109670109671109672109673109674109675109676109677109678109679109680109681109682109683109684109685109686109687109688109689109690109691109692109693109694109695109696109697109698109699109700109701109702109703109704109705109706109707109708109709109710109711109712109713109714109715109716109717109718109719109720109721109722109723109724109725109726109727109728109729109730109731109732109733109734109735109736109737109738109739109740109741109742109743109744109745109746109747109748109749109750109751109752109753109754109755109756109757109758109759109760109761109762109763109764109765109766109767109768109769109770109771109772109773109774109775109776109777109778109779109780109781109782109783109784109785109786109787109788109789109790109791109792109793109794109795109796109797109798109799109800109801109802109803109804109805109806109807109808109809109810109811109812109813109814109815109816109817109818109819109820109821109822109823109824109825109826109827109828109829109830109831109832109833109834109835109836109837109838109839109840109841109842109843109844109845109846109847109848109849109850109851109852109853109854109855109856109857109858109859109860109861109862109863109864109865109866109867109868109869109870109871109872109873109874109875109876109877109878109879109880109881109882109883109884109885109886109887109888109889109890109891109892109893109894109895109896109897109898109899109900109901109902109903109904109905109906109907109908109909109910109911109912109913109914109915109916109917109918109919109920109921109922109923109924109925109926109927109928109929109930109931109932109933109934109935109936109937109938109939109940109941109942109943109944109945109946109947109948109949109950109951109952109953109954109955109956109957109958109959109960109961109962109963109964109965109966109967109968109969109970109971109972109973109974109975109976109977109978109979109980109981109982109983109984109985109986109987109988109989109990109991109992109993109994109995109996109997109998109999110000110001110002110003110004110005110006110007110008110009110010110011110012110013110014110015110016110017110018110019110020110021110022110023110024110025110026110027110028110029110030110031110032110033110034110035110036110037110038110039110040110041110042110043110044110045110046110047110048110049110050110051110052110053110054110055110056110057110058110059110060110061110062110063110064110065110066110067110068110069110070110071110072110073110074110075110076110077110078110079110080110081110082110083110084110085110086110087110088110089110090110091110092110093110094110095110096110097110098110099110100110101110102110103110104110105110106110107110108110109110110110111110112110113110114110115110116110117110118110119110120110121110122110123110124110125110126110127110128110129110130110131110132110133110134110135110136110137110138110139110140110141110142110143110144110145110146110147110148110149110150110151110152110153110154110155110156110157110158110159110160110161110162110163110164110165110166110167110168110169110170110171110172110173110174110175110176110177110178110179110180110181110182110183110184110185110186110187110188110189110190110191110192110193110194110195110196110197110198110199110200110201110202110203110204110205110206110207110208110209110210110211110212110213110214110215110216110217110218110219110220110221110222110223110224110225110226110227110228110229110230110231110232110233110234110235110236110237110238110239110240110241110242110243110244110245110246110247110248110249110250110251110252110253110254110255110256110257110258110259110260110261110262110263110264110265110266110267110268110269110270110271110272110273110274110275110276110277110278110279110280110281110282110283110284110285110286110287110288110289110290110291110292110293110294110295110296110297110298110299110300110301110302110303110304110305110306110307110308110309110310110311110312110313110314110315110316110317110318110319110320110321110322110323110324110325110326110327110328110329110330110331110332110333110334110335110336110337110338110339110340110341110342110343110344110345110346110347110348110349110350110351110352110353110354110355110356110357110358110359110360110361110362110363110364110365110366110367110368110369110370110371110372110373110374110375110376110377110378110379110380110381110382110383110384110385110386110387110388110389110390110391110392110393110394110395110396110397110398110399110400110401110402110403110404110405110406110407110408110409110410110411110412110413110414110415110416110417110418110419110420110421110422110423110424110425110426110427110428110429110430110431110432110433110434110435110436110437110438110439110440110441110442110443110444110445110446110447110448110449110450110451110452110453110454110455110456110457110458110459110460110461110462110463110464110465110466110467110468110469110470110471110472110473110474110475110476110477110478110479110480110481110482110483110484110485110486110487110488110489110490110491110492110493110494110495110496110497110498110499110500110501110502110503110504110505110506110507110508110509110510110511110512110513110514110515110516110517110518110519110520110521110522110523110524110525110526110527110528110529110530110531110532110533110534110535110536110537110538110539110540110541110542110543110544110545110546110547110548110549110550110551110552110553110554110555110556110557110558110559110560110561110562110563110564110565110566110567110568110569110570110571110572110573110574110575110576110577110578110579110580110581110582110583110584110585110586110587110588110589110590110591110592110593110594110595110596110597110598110599110600110601110602110603110604110605110606110607110608110609110610110611110612110613110614110615110616110617110618110619110620110621110622110623110624110625110626110627110628110629110630110631110632110633110634110635110636110637110638110639110640110641110642110643110644110645110646110647110648110649110650110651110652110653110654110655110656110657110658110659110660110661110662110663110664110665110666110667110668110669110670110671110672110673110674110675110676110677110678110679110680110681110682110683110684110685110686110687110688110689110690110691110692110693110694110695110696110697110698110699110700110701110702110703110704110705110706110707110708110709110710110711110712110713110714110715110716110717110718110719110720110721110722110723110724110725110726110727110728110729110730110731110732110733110734110735110736110737110738110739110740110741110742110743110744110745110746110747110748110749110750110751110752110753110754110755110756110757110758110759110760110761110762110763110764110765110766110767110768110769110770110771110772110773110774110775110776110777110778110779110780110781110782110783110784110785110786110787110788110789110790110791110792110793110794110795110796110797110798110799110800110801110802110803110804110805110806110807110808110809110810110811110812110813110814110815110816110817110818110819110820110821110822110823110824110825110826110827110828110829110830110831110832110833110834110835110836110837110838110839110840110841110842110843110844110845110846110847110848110849110850110851110852110853110854110855110856110857110858110859110860110861110862110863110864110865110866110867110868110869110870110871110872110873110874110875110876110877110878110879110880110881110882110883110884110885110886110887110888110889110890110891110892110893110894110895110896110897110898110899110900110901110902110903110904110905110906110907110908110909110910110911110912110913110914110915110916110917110918110919110920110921110922110923110924110925110926110927110928110929110930110931110932110933110934110935110936110937110938110939110940110941110942110943110944110945110946110947110948110949110950110951110952110953110954110955110956110957110958110959110960110961110962110963110964110965110966110967110968110969110970110971110972110973110974110975110976110977110978110979110980110981110982110983110984110985110986110987110988110989110990110991110992110993110994110995110996110997110998110999111000111001111002111003111004111005111006111007111008111009111010111011111012111013111014111015111016111017111018111019111020111021111022111023111024111025111026111027111028111029111030111031111032111033111034111035111036111037111038111039111040111041111042111043111044111045111046111047111048111049111050111051111052111053111054111055111056111057111058111059111060111061111062111063111064111065111066111067111068111069111070111071111072111073111074111075111076111077111078111079111080111081111082111083111084111085111086111087111088111089111090111091111092111093111094111095111096111097111098111099111100111101111102111103111104111105111106111107111108111109111110111111111112111113111114111115111116111117111118111119111120111121111122111123111124111125111126111127111128111129111130111131111132111133111134111135111136111137111138111139111140111141111142111143111144111145111146111147111148111149111150111151111152111153111154111155111156111157111158111159111160111161111162111163111164111165111166111167111168111169111170111171111172111173111174111175111176111177111178111179111180111181111182111183111184111185111186111187111188111189111190111191111192111193111194111195111196111197111198111199111200111201111202111203111204111205111206111207111208111209111210111211111212111213111214111215111216111217111218111219111220111221111222111223111224111225111226111227111228111229111230111231111232111233111234111235111236111237111238111239111240111241111242111243111244111245111246111247111248111249111250111251111252111253111254111255111256111257111258111259111260111261111262111263111264111265111266111267111268111269111270111271111272111273111274111275111276111277111278111279111280111281111282111283111284111285111286111287111288111289111290111291111292111293111294111295111296111297111298111299111300111301111302111303111304111305111306111307111308111309111310111311111312111313111314111315111316111317111318111319111320111321111322111323111324111325111326111327111328111329111330111331111332111333111334111335111336111337111338111339111340111341111342111343111344111345111346111347111348111349111350111351111352111353111354111355111356111357111358111359111360111361111362111363111364111365111366111367111368111369111370111371111372111373111374111375111376111377111378111379111380111381111382111383111384111385111386111387111388111389111390111391111392111393111394111395111396111397111398111399111400111401111402111403111404111405111406111407111408111409111410111411111412111413111414111415111416111417111418111419111420111421111422111423111424111425111426111427111428111429111430111431111432111433111434111435111436111437111438111439111440111441111442111443111444111445111446111447111448111449111450111451111452111453111454111455111456111457111458111459111460111461111462111463111464111465111466111467111468111469111470111471111472111473111474111475111476111477111478111479111480111481111482111483111484111485111486111487111488111489111490111491111492111493111494111495111496111497111498111499111500111501111502111503111504111505111506111507111508111509111510111511111512111513111514111515111516111517111518111519111520111521111522111523111524111525111526111527111528111529111530111531111532111533111534111535111536111537111538111539111540111541111542111543111544111545111546111547111548111549111550111551111552111553111554111555111556111557111558111559111560111561111562111563111564111565111566111567111568111569111570111571111572111573111574111575111576111577111578111579111580111581111582111583111584111585111586111587111588111589111590111591111592111593111594111595111596111597111598111599111600111601111602111603111604111605111606111607111608111609111610111611111612111613111614111615111616111617111618111619111620111621111622111623111624111625111626111627111628111629111630111631111632111633111634111635111636111637111638111639111640111641111642111643111644111645111646111647111648111649111650111651111652111653111654111655111656111657111658111659111660111661111662111663111664111665111666111667111668111669111670111671111672111673111674111675111676111677111678111679111680111681111682111683111684111685111686111687111688111689111690111691111692111693111694111695111696111697111698111699111700111701111702111703111704111705111706111707111708111709111710111711111712111713111714111715111716111717111718111719111720111721111722111723111724111725111726111727111728111729111730111731111732111733111734111735111736111737111738111739111740111741111742111743111744111745111746111747111748111749111750111751111752111753111754111755111756111757111758111759111760111761111762111763111764111765111766111767111768111769111770111771111772111773111774111775111776111777111778111779111780111781111782111783111784111785111786111787111788111789111790111791111792111793111794111795111796111797111798111799111800111801111802111803111804111805111806111807111808111809111810111811111812111813111814111815111816111817111818111819111820111821111822111823111824111825111826111827111828111829111830111831111832111833111834111835111836111837111838111839111840111841111842111843111844111845111846111847111848111849111850111851111852111853111854111855111856111857111858111859111860111861111862111863111864111865111866111867111868111869111870111871111872111873111874111875111876111877111878111879111880111881111882111883111884111885111886111887111888111889111890111891111892111893111894111895111896111897111898111899111900111901111902111903111904111905111906111907111908111909111910111911111912111913111914111915111916111917111918111919111920111921111922111923111924111925111926111927111928111929111930111931111932111933111934111935111936111937111938111939111940111941111942111943111944111945111946111947111948111949111950111951111952111953111954111955111956111957111958111959111960111961111962111963111964111965111966111967111968111969111970111971111972111973111974111975111976111977111978111979111980111981111982111983111984111985111986111987111988111989111990111991111992111993111994111995111996111997111998111999112000112001112002112003112004112005112006112007112008112009112010112011112012112013112014112015112016112017112018112019112020112021112022112023112024112025112026112027112028112029112030112031112032112033112034112035112036112037112038112039112040112041112042112043112044112045112046112047112048112049112050112051112052112053112054112055112056112057112058112059112060112061112062112063112064112065112066112067112068112069112070112071112072112073112074112075112076112077112078112079112080112081112082112083112084112085112086112087112088112089112090112091112092112093112094112095112096112097112098112099112100112101112102112103112104112105112106112107112108112109112110112111112112112113112114112115112116112117112118112119112120112121112122112123112124112125112126112127112128112129112130112131112132112133112134112135112136112137112138112139112140112141112142112143112144112145112146112147112148112149112150112151112152112153112154112155112156112157112158112159112160112161112162112163112164112165112166112167112168112169112170112171112172112173112174112175112176112177112178112179112180112181112182112183112184112185112186112187112188112189112190112191112192112193112194112195112196112197112198112199112200112201112202112203112204112205112206112207112208112209112210112211112212112213112214112215112216112217112218112219112220112221112222112223112224112225112226112227112228112229112230112231112232112233112234112235112236112237112238112239112240112241112242112243112244112245112246112247112248112249112250112251112252112253112254112255112256112257112258112259112260112261112262112263112264112265112266112267112268112269112270112271112272112273112274112275112276112277112278112279112280112281112282112283112284112285112286112287112288112289112290112291112292112293112294112295112296112297112298112299112300112301112302112303112304112305112306112307112308112309112310112311112312112313112314112315112316112317112318112319112320112321112322112323112324112325112326112327112328112329112330112331112332112333112334112335112336112337112338112339112340112341112342112343112344112345112346112347112348112349112350112351112352112353112354112355112356112357112358112359112360112361112362112363112364112365112366112367112368112369112370112371112372112373112374112375112376112377112378112379112380112381112382112383112384112385112386112387112388112389112390112391112392112393112394112395112396112397112398112399112400112401112402112403112404112405112406112407112408112409112410112411112412112413112414112415112416112417112418112419112420112421112422112423112424112425112426112427112428112429112430112431112432112433112434112435112436112437112438112439112440112441112442112443112444112445112446112447112448112449112450112451112452112453112454112455112456112457112458112459112460112461112462112463112464112465112466112467112468112469112470112471112472112473112474112475112476112477112478112479112480112481112482112483112484112485112486112487112488112489112490112491112492112493112494112495112496112497112498112499112500112501112502112503112504112505112506112507112508112509112510112511112512112513112514112515112516112517112518112519112520112521112522112523112524112525112526112527112528112529112530112531112532112533112534112535112536112537112538112539112540112541112542112543112544112545112546112547112548112549112550112551112552112553112554112555112556112557112558112559112560112561112562112563112564112565112566112567112568112569112570112571112572112573112574112575112576112577112578112579112580112581112582112583112584112585112586112587112588112589112590112591112592112593112594112595112596112597112598112599112600112601112602112603112604112605112606112607112608112609112610112611112612112613112614112615112616112617112618112619112620112621112622112623112624112625112626112627112628112629112630112631112632112633112634112635112636112637112638112639112640112641112642112643112644112645112646112647112648112649112650112651112652112653112654112655112656112657112658112659112660112661112662112663112664112665112666112667112668112669112670112671112672112673112674112675112676112677112678112679112680112681112682112683112684112685112686112687112688112689112690112691112692112693112694112695112696112697112698112699112700112701112702112703112704112705112706112707112708112709112710112711112712112713112714112715112716112717112718112719112720112721112722112723112724112725112726112727112728112729112730112731112732112733112734112735112736112737112738112739112740112741112742112743112744112745112746112747112748112749112750112751112752112753112754112755112756112757112758112759112760112761112762112763112764112765112766112767112768112769112770112771112772112773112774112775112776112777112778112779112780112781112782112783112784112785112786112787112788112789112790112791112792112793112794112795112796112797112798112799112800112801112802112803112804112805112806112807112808112809112810112811112812112813112814112815112816112817112818112819112820112821112822112823112824112825112826112827112828112829112830112831112832112833112834112835112836112837112838112839112840112841112842112843112844112845112846112847112848112849112850112851112852112853112854112855112856112857112858112859112860112861112862112863112864112865112866112867112868112869112870112871112872112873112874112875112876112877112878112879112880112881112882112883112884112885112886112887112888112889112890112891112892112893112894112895112896112897112898112899112900112901112902112903112904112905112906112907112908112909112910112911112912112913112914112915112916112917112918112919112920112921112922112923112924112925112926112927112928112929112930112931112932112933112934112935112936112937112938112939112940112941112942112943112944112945112946112947112948112949112950112951112952112953112954112955112956112957112958112959112960112961112962112963112964112965112966112967112968112969112970112971112972112973112974112975112976112977112978112979112980112981112982112983112984112985112986112987112988112989112990112991112992112993112994112995112996112997112998112999113000113001113002113003113004113005113006113007113008113009113010113011113012113013113014113015113016113017113018113019113020113021113022113023113024113025113026113027113028113029113030113031113032113033113034113035113036113037113038113039113040113041113042113043113044113045113046113047113048113049113050113051113052113053113054113055113056113057113058113059113060113061113062113063113064113065113066113067113068113069113070113071113072113073113074113075113076113077113078113079113080113081113082113083113084113085113086113087113088113089113090113091113092113093113094113095113096113097113098113099113100113101113102113103113104113105113106113107113108113109113110113111113112113113113114113115113116113117113118113119113120113121113122113123113124113125113126113127113128113129113130113131113132113133113134113135113136113137113138113139113140113141113142113143113144113145113146113147113148113149113150113151113152113153113154113155113156113157113158113159113160113161113162113163113164113165113166113167113168113169113170113171113172113173113174113175113176113177113178113179113180113181113182113183113184113185113186113187113188113189113190113191113192113193113194113195113196113197113198113199113200113201113202113203113204113205113206113207113208113209113210113211113212113213113214113215113216113217113218113219113220113221113222113223113224113225113226113227113228113229113230113231113232113233113234113235113236113237113238113239113240113241113242113243113244113245113246113247113248113249113250113251113252113253113254113255113256113257113258113259113260113261113262113263113264113265113266113267113268113269113270113271113272113273113274113275113276113277113278113279113280113281113282113283113284113285113286113287113288113289113290113291113292113293113294113295113296113297113298113299113300113301113302113303113304113305113306113307113308113309113310113311113312113313113314113315113316113317113318113319113320113321113322113323113324113325113326113327113328113329113330113331113332113333113334113335113336113337113338113339113340113341113342113343113344113345113346113347113348113349113350113351113352113353113354113355113356113357113358113359113360113361113362113363113364113365113366113367113368113369113370113371113372113373113374113375113376113377113378113379113380113381113382113383113384113385113386113387113388113389113390113391113392113393113394113395113396113397113398113399113400113401113402113403113404113405113406113407113408113409113410113411113412113413113414113415113416113417113418113419113420113421113422113423113424113425113426113427113428113429113430113431113432113433113434113435113436113437113438113439113440113441113442113443113444113445113446113447113448113449113450113451113452113453113454113455113456113457113458113459113460113461113462113463113464113465113466113467113468113469113470113471113472113473113474113475113476113477113478113479113480113481113482113483113484113485113486113487113488113489113490113491113492113493113494113495113496113497113498113499113500113501113502113503113504113505113506113507113508113509113510113511113512113513113514113515113516113517113518113519113520113521113522113523113524113525113526113527113528113529113530113531113532113533113534113535113536113537113538113539113540113541113542113543113544113545113546113547113548113549113550113551113552113553113554113555113556113557113558113559113560113561113562113563113564113565113566113567113568113569113570113571113572113573113574113575113576113577113578113579113580113581113582113583113584113585113586113587113588113589113590113591113592113593113594113595113596113597113598113599113600113601113602113603113604113605113606113607113608113609113610113611113612113613113614113615113616113617113618113619113620113621113622113623113624113625113626113627113628113629113630113631113632113633113634113635113636113637113638113639113640113641113642113643113644113645113646113647113648113649113650113651113652113653113654113655113656113657113658113659113660113661113662113663113664113665113666113667113668113669113670113671113672113673113674113675113676113677113678113679113680113681113682113683113684113685113686113687113688113689113690113691113692113693113694113695113696113697113698113699113700113701113702113703113704113705113706113707113708113709113710113711113712113713113714113715113716113717113718113719113720113721113722113723113724113725113726113727113728113729113730113731113732113733113734113735113736113737113738113739113740113741113742113743113744113745113746113747113748113749113750113751113752113753113754113755113756113757113758113759113760113761113762113763113764113765113766113767113768113769113770113771113772113773113774113775113776113777113778113779113780113781113782113783113784113785113786113787113788113789113790113791113792113793113794113795113796113797113798113799113800113801113802113803113804113805113806113807113808113809113810113811113812113813113814113815113816113817113818113819113820113821113822113823113824113825113826113827113828113829113830113831113832113833113834113835113836113837113838113839113840113841113842113843113844113845113846113847113848113849113850113851113852113853113854113855113856113857113858113859113860113861113862113863113864113865113866113867113868113869113870113871113872113873113874113875113876113877113878113879113880113881113882113883113884113885113886113887113888113889113890113891113892113893113894113895113896113897113898113899113900113901113902113903113904113905113906113907113908113909113910113911113912113913113914113915113916113917113918113919113920113921113922113923113924113925113926113927113928113929113930113931113932113933113934113935113936113937113938113939113940113941113942113943113944113945113946113947113948113949113950113951113952113953113954113955113956113957113958113959113960113961113962113963113964113965113966113967113968113969113970113971113972113973113974113975113976113977113978113979113980113981113982113983113984113985113986113987113988113989113990113991113992113993113994113995113996113997113998113999114000114001114002114003114004114005114006114007114008114009114010114011114012114013114014114015114016114017114018114019114020114021114022114023114024114025114026114027114028114029114030114031114032114033114034114035114036114037114038114039114040114041114042114043114044114045114046114047114048114049114050114051114052114053114054114055114056114057114058114059114060114061114062114063114064114065114066114067114068114069114070114071114072114073114074114075114076114077114078114079114080114081114082114083114084114085114086114087114088114089114090114091114092114093114094114095114096114097114098114099114100114101114102114103114104114105114106114107114108114109114110114111114112114113114114114115114116114117114118114119114120114121114122114123114124114125114126114127114128114129114130114131114132114133114134114135114136114137114138114139114140114141114142114143114144114145114146114147114148114149114150114151114152114153114154114155114156114157114158114159114160114161114162114163114164114165114166114167114168114169114170114171114172114173114174114175114176114177114178114179114180114181114182114183114184114185114186114187114188114189114190114191114192114193114194114195114196114197114198114199114200114201114202114203114204114205114206114207114208114209114210114211114212114213114214114215114216114217114218114219114220114221114222114223114224114225114226114227114228114229114230114231114232114233114234114235114236114237114238114239114240114241114242114243114244114245114246114247114248114249114250114251114252114253114254114255114256114257114258114259114260114261114262114263114264114265114266114267114268114269114270114271114272114273114274114275114276114277114278114279114280114281114282114283114284114285114286114287114288114289114290114291114292114293114294114295114296114297114298114299114300114301114302114303114304114305114306114307114308114309114310114311114312114313114314114315114316114317114318114319114320114321114322114323114324114325114326114327114328114329114330114331114332114333114334114335114336114337114338114339114340114341114342114343114344114345114346114347114348114349114350114351114352114353114354114355114356114357114358114359114360114361114362114363114364114365114366114367114368114369114370114371114372114373114374114375114376114377114378114379114380114381114382114383114384114385114386114387114388114389114390114391114392114393114394114395114396114397114398114399114400114401114402114403114404114405114406114407114408114409114410114411114412114413114414114415114416114417114418114419114420114421114422114423114424114425114426114427114428114429114430114431114432114433114434114435114436114437114438114439114440114441114442114443114444114445114446114447114448114449114450114451114452114453114454114455114456114457114458114459114460114461114462114463114464114465114466114467114468114469114470114471114472114473114474114475114476114477114478114479114480114481114482114483114484114485114486114487114488114489114490114491114492114493114494114495114496114497114498114499114500114501114502114503114504114505114506114507114508114509114510114511114512114513114514114515114516114517114518114519114520114521114522114523114524114525114526114527114528114529114530114531114532114533114534114535114536114537114538114539114540114541114542114543114544114545114546114547114548114549114550114551114552114553114554114555114556114557114558114559114560114561114562114563114564114565114566114567114568114569114570114571114572114573114574114575114576114577114578114579114580114581114582114583114584114585114586114587114588114589114590114591114592114593114594114595114596114597114598114599114600114601114602114603114604114605114606114607114608114609114610114611114612114613114614114615114616114617114618114619114620114621114622114623114624114625114626114627114628114629114630114631114632114633114634114635114636114637114638114639114640114641114642114643114644114645114646114647114648114649114650114651114652114653114654114655114656114657114658114659114660114661114662114663114664114665114666114667114668114669114670114671114672114673114674114675114676114677114678114679114680114681114682114683114684114685114686114687114688114689114690114691114692114693114694114695114696114697114698114699114700114701114702114703114704114705114706114707114708114709114710114711114712114713114714114715114716114717114718114719114720114721114722114723114724114725114726114727114728114729114730114731114732114733114734114735114736114737114738114739114740114741114742114743114744114745114746114747114748114749114750114751114752114753114754114755114756114757114758114759114760114761114762114763114764114765114766114767114768114769114770114771114772114773114774114775114776114777114778114779114780114781114782114783114784114785114786114787114788114789114790114791114792114793114794114795114796114797114798114799114800114801114802114803114804114805114806114807114808114809114810114811114812114813114814114815114816114817114818114819114820114821114822114823114824114825114826114827114828114829114830114831114832114833114834114835114836114837114838114839114840114841114842114843114844114845114846114847114848114849114850114851114852114853114854114855114856114857114858114859114860114861114862114863114864114865114866114867114868114869114870114871114872114873114874114875114876114877114878114879114880114881114882114883114884114885114886114887114888114889114890114891114892114893114894114895114896114897114898114899114900114901114902114903114904114905114906114907114908114909114910114911114912114913114914114915114916114917114918114919114920114921114922114923114924114925114926114927114928114929114930114931114932114933114934114935114936114937114938114939114940114941114942114943114944114945114946114947114948114949114950114951114952114953114954114955114956114957114958114959114960114961114962114963114964114965114966114967114968114969114970114971114972114973114974114975114976114977114978114979114980114981114982114983114984114985114986114987114988114989114990114991114992114993114994114995114996114997114998114999115000115001115002115003115004115005115006115007115008115009115010115011115012115013115014115015115016115017115018115019115020115021115022115023115024115025115026115027115028115029115030115031115032115033115034115035115036115037115038115039115040115041115042115043115044115045115046115047115048115049115050115051115052115053115054115055115056115057115058115059115060115061115062115063115064115065115066115067115068115069115070115071115072115073115074115075115076115077115078115079115080115081115082115083115084115085115086115087115088115089115090115091115092115093115094115095115096115097115098115099115100115101115102115103115104115105115106115107115108115109115110115111115112115113115114115115115116115117115118115119115120115121115122115123115124115125115126115127115128115129115130115131115132115133115134115135115136115137115138115139115140115141115142115143115144115145115146115147115148115149115150115151115152115153115154115155115156115157115158115159115160115161115162115163115164115165115166115167115168115169115170115171115172115173115174115175115176115177115178115179115180115181115182115183115184115185115186115187115188115189115190115191115192115193115194115195115196115197115198115199115200115201115202115203115204115205115206115207115208115209115210115211115212115213115214115215115216115217115218115219115220115221115222115223115224115225115226115227115228115229115230115231115232115233115234115235115236115237115238115239115240115241115242115243115244115245115246115247115248115249115250115251115252115253115254115255115256115257115258115259115260115261115262115263115264115265115266115267115268115269115270115271115272115273115274115275115276115277115278115279115280115281115282115283115284115285115286115287115288115289115290115291115292115293115294115295115296115297115298115299115300115301115302115303115304115305115306115307115308115309115310115311115312115313115314115315115316115317115318115319115320115321115322115323115324115325115326115327115328115329115330115331115332115333115334115335115336115337115338115339115340115341115342115343115344115345115346115347115348115349115350115351115352115353115354115355115356115357115358115359115360115361115362115363115364115365115366115367115368115369115370115371115372115373115374115375115376115377115378115379115380115381115382115383115384115385115386115387115388115389115390115391115392115393115394115395115396115397115398115399115400115401115402115403115404115405115406115407115408115409115410115411115412115413115414115415115416115417115418115419115420115421115422115423115424115425115426115427115428115429115430115431115432115433115434115435115436115437115438115439115440115441115442115443115444115445115446115447115448115449115450115451115452115453115454115455115456115457115458115459115460115461115462115463115464115465115466115467115468115469115470115471115472115473115474115475115476115477115478115479115480115481115482115483115484115485115486115487115488115489115490115491115492115493115494115495115496115497115498115499115500115501115502115503115504115505115506115507115508115509115510115511115512115513115514115515115516115517115518115519115520115521115522115523115524115525115526115527115528115529115530115531115532115533115534115535115536115537115538115539115540115541115542115543115544115545115546115547115548115549115550115551115552115553115554115555115556115557115558115559115560115561115562115563115564115565115566115567115568115569115570115571115572115573115574115575115576115577115578115579115580115581115582115583115584115585115586115587115588115589115590115591115592115593115594115595115596115597115598115599115600115601115602115603115604115605115606115607115608115609115610115611115612115613115614115615115616115617115618115619115620115621115622115623115624115625115626115627115628115629115630115631115632115633115634115635115636115637115638115639115640115641115642115643115644115645115646115647115648115649115650115651115652115653115654115655115656115657115658115659115660115661115662115663115664115665115666115667115668115669115670115671115672115673115674115675115676115677115678115679115680115681115682115683115684115685115686115687115688115689115690115691115692115693115694115695115696115697115698115699115700115701115702115703115704115705115706115707115708115709115710115711115712115713115714115715115716115717115718115719115720115721115722115723115724115725115726115727115728115729115730115731115732115733115734115735115736115737115738115739115740115741115742115743115744115745115746115747115748115749115750115751115752115753115754115755115756115757115758115759115760115761115762115763115764115765115766115767115768115769115770115771115772115773115774115775115776115777115778115779115780115781115782115783115784115785115786115787115788115789115790115791115792115793115794115795115796115797115798115799115800115801115802115803115804115805115806115807115808115809115810115811115812115813115814115815115816115817115818115819115820115821115822115823115824115825115826115827115828115829115830115831115832115833115834115835115836115837115838115839115840115841115842115843115844115845115846115847115848115849115850115851115852115853115854115855115856115857115858115859115860115861115862115863115864115865115866115867115868115869115870115871115872115873115874115875115876115877115878115879115880115881115882115883115884115885115886115887115888115889115890115891115892115893115894115895115896115897115898115899115900115901115902115903115904115905115906115907115908115909115910115911115912115913115914115915115916115917115918115919115920115921115922115923115924115925115926115927115928115929115930115931115932115933115934115935115936115937115938115939115940115941115942115943115944115945115946115947115948115949115950115951115952115953115954115955115956115957115958115959115960115961115962115963115964115965115966115967115968115969115970115971115972115973115974115975115976115977115978115979115980115981115982115983115984115985115986115987115988115989115990115991115992115993115994115995115996115997115998115999116000116001116002116003116004116005116006116007116008116009116010116011116012116013116014116015116016116017116018116019116020116021116022116023116024116025116026116027116028116029116030116031116032116033116034116035116036116037116038116039116040116041116042116043116044116045116046116047116048116049116050116051116052116053116054116055116056116057116058116059116060116061116062116063116064116065116066116067116068116069116070116071116072116073116074116075116076116077116078116079116080116081116082116083116084116085116086116087116088116089116090116091116092116093116094116095116096116097116098116099116100116101116102116103116104116105116106116107116108116109116110116111116112116113116114116115116116116117116118116119116120116121116122116123116124116125116126116127116128116129116130116131116132116133116134116135116136116137116138116139116140116141116142116143116144116145116146116147116148116149116150116151116152116153116154116155116156116157116158116159116160116161116162116163116164116165116166116167116168116169116170116171116172116173116174116175116176116177116178116179116180116181116182116183116184116185116186116187116188116189116190116191116192116193116194116195116196116197116198116199116200116201116202116203116204116205116206116207116208116209116210116211116212116213116214116215116216116217116218116219116220116221116222116223116224116225116226116227116228116229116230116231116232116233116234116235116236116237116238116239116240116241116242116243116244116245116246116247116248116249116250116251116252116253116254116255116256116257116258116259116260116261116262116263116264116265116266116267116268116269116270116271116272116273116274116275116276116277116278116279116280116281116282116283116284116285116286116287116288116289116290116291116292116293116294116295116296116297116298116299116300116301116302116303116304116305116306116307116308116309116310116311116312116313116314116315116316116317116318116319116320116321116322116323116324116325116326116327116328116329116330116331116332116333116334116335116336116337116338116339116340116341116342116343116344116345116346116347116348116349116350116351116352116353116354116355116356116357116358116359116360116361116362116363116364116365116366116367116368116369116370116371116372116373116374116375116376116377116378116379116380116381116382116383116384116385116386116387116388116389116390116391116392116393116394116395116396116397116398116399116400116401116402116403116404116405116406116407116408116409116410116411116412116413116414116415116416116417116418116419116420116421116422116423116424116425116426116427116428116429116430116431116432116433116434116435116436116437116438116439116440116441116442116443116444116445116446116447116448116449116450116451116452116453116454116455116456116457116458116459116460116461116462116463116464116465116466116467116468116469116470116471116472116473116474116475116476116477116478116479116480116481116482116483116484116485116486116487116488116489116490116491116492116493116494116495116496116497116498116499116500116501116502116503116504116505116506116507116508116509116510116511116512116513116514116515116516116517116518116519116520116521116522116523116524116525116526116527116528116529116530116531116532116533116534116535116536116537116538116539116540116541116542116543116544116545116546116547116548116549116550116551116552116553116554116555116556116557116558116559116560116561116562116563116564116565116566116567116568116569116570116571116572116573116574116575116576116577116578116579116580116581116582116583116584116585116586116587116588116589116590116591116592116593116594116595116596116597116598116599116600116601116602116603116604116605116606116607116608116609116610116611116612116613116614116615116616116617116618116619116620116621116622116623116624116625116626116627116628116629116630116631116632116633116634116635116636116637116638116639116640116641116642116643116644116645116646116647116648116649116650116651116652116653116654116655116656116657116658116659116660116661116662116663116664116665116666116667116668116669116670116671116672116673116674116675116676116677116678116679116680116681116682116683116684116685116686116687116688116689116690116691116692116693116694116695116696116697116698116699116700116701116702116703116704116705116706116707116708116709116710116711116712116713116714116715116716116717116718116719116720116721116722116723116724116725116726116727116728116729116730116731116732116733116734116735116736116737116738116739116740116741116742116743116744116745116746116747116748116749116750116751116752116753116754116755116756116757116758116759116760116761116762116763116764116765116766116767116768116769116770116771116772116773116774116775116776116777116778116779116780116781116782116783116784116785116786116787116788116789116790116791116792116793116794116795116796116797116798116799116800116801116802116803116804116805116806116807116808116809116810116811116812116813116814116815116816116817116818116819116820116821116822116823116824116825116826116827116828116829116830116831116832116833116834116835116836116837116838116839116840116841116842116843116844116845116846116847116848116849116850116851116852116853116854116855116856116857116858116859116860116861116862116863116864116865116866116867116868116869116870116871116872116873116874116875116876116877116878116879116880116881116882116883116884116885116886116887116888116889116890116891116892116893116894116895116896116897116898116899116900116901116902116903116904116905116906116907116908116909116910116911116912116913116914116915116916116917116918116919116920116921116922116923116924116925116926116927116928116929116930116931116932116933116934116935116936116937116938116939116940116941116942116943116944116945116946116947116948116949116950116951116952116953116954116955116956116957116958116959116960116961116962116963116964116965116966116967116968116969116970116971116972116973116974116975116976116977116978116979116980116981116982116983116984116985116986116987116988116989116990116991116992116993116994116995116996116997116998116999117000117001117002117003117004117005117006117007117008117009117010117011117012117013117014117015117016117017117018117019117020117021117022117023117024117025117026117027117028117029117030117031117032117033117034117035117036117037117038117039117040117041117042117043117044117045117046117047117048117049117050117051117052117053117054117055117056117057117058117059117060117061117062117063117064117065117066117067117068117069117070117071117072117073117074117075117076117077117078117079117080117081117082117083117084117085117086117087117088117089117090117091117092117093117094117095117096117097117098117099117100117101117102117103117104117105117106117107117108117109117110117111117112117113117114117115117116117117117118117119117120117121117122117123117124117125117126117127117128117129117130117131117132117133117134117135117136117137117138117139117140117141117142117143117144117145117146117147117148117149117150117151117152117153117154117155117156117157117158117159117160117161117162117163117164117165117166117167117168117169117170117171117172117173117174117175117176117177117178117179117180117181117182117183117184117185117186117187117188117189117190117191117192117193117194117195117196117197117198117199117200117201117202117203117204117205117206117207117208117209117210117211117212117213117214117215117216117217117218117219117220117221117222117223117224117225117226117227117228117229117230117231117232117233117234117235117236117237117238117239117240117241117242117243117244117245117246117247117248117249117250117251117252117253117254117255117256117257117258117259117260117261117262117263117264117265117266117267117268117269117270117271117272117273117274117275117276117277117278117279117280117281117282117283117284117285117286117287117288117289117290117291117292117293117294117295117296117297117298117299117300117301117302117303117304117305117306117307117308117309117310117311117312117313117314117315117316117317117318117319117320117321117322117323117324117325117326117327117328117329117330117331117332117333117334117335117336117337117338117339117340117341117342117343117344117345117346117347117348117349117350117351117352117353117354117355117356117357117358117359117360117361117362117363117364117365117366117367117368117369117370117371117372117373117374117375117376117377117378117379117380117381117382117383117384117385117386117387117388117389117390117391117392117393117394117395117396117397117398117399117400117401117402117403117404117405117406117407117408117409117410117411117412117413117414117415117416117417117418117419117420117421117422117423117424117425117426117427117428117429117430117431117432117433117434117435117436117437117438117439117440117441117442117443117444117445117446117447117448117449117450117451117452117453117454117455117456117457117458117459117460117461117462117463117464117465117466117467117468117469117470117471117472117473117474117475117476117477117478117479117480117481117482117483117484117485117486117487117488117489117490117491117492117493117494117495117496117497117498117499117500117501117502117503117504117505117506117507117508117509117510117511117512117513117514117515117516117517117518117519117520117521117522117523117524117525117526117527117528117529117530117531117532117533117534117535117536117537117538117539117540117541117542117543117544117545117546117547117548117549117550117551117552117553117554117555117556117557117558117559117560117561117562117563117564117565117566117567117568117569117570117571117572117573117574117575117576117577117578117579117580117581117582117583117584117585117586117587117588117589117590117591117592117593117594117595117596117597117598117599117600117601117602117603117604117605117606117607117608117609117610117611117612117613117614117615117616117617117618117619117620117621117622117623117624117625117626117627117628117629117630117631117632117633117634117635117636117637117638117639117640117641117642117643117644117645117646117647117648117649117650117651117652117653117654117655117656117657117658117659117660117661117662117663117664117665117666117667117668117669117670117671117672117673117674117675117676117677117678117679117680117681117682117683117684117685117686117687117688117689117690117691117692117693117694117695117696117697117698117699117700117701117702117703117704117705117706117707117708117709117710117711117712117713117714117715117716117717117718117719117720117721117722117723117724117725117726117727117728117729117730117731117732117733117734117735117736117737117738117739117740117741117742117743117744117745117746117747117748117749117750117751117752117753117754117755117756117757117758117759117760117761117762117763117764117765117766117767117768117769117770117771117772117773117774117775117776117777117778117779117780117781117782117783117784117785117786117787117788117789117790117791117792117793117794117795117796117797117798117799117800117801117802117803117804117805117806117807117808117809117810117811117812117813117814117815117816117817117818117819117820117821117822117823117824117825117826117827117828117829117830117831117832117833117834117835117836117837117838117839117840117841117842117843117844117845117846117847117848117849117850117851117852117853117854117855117856117857117858117859117860117861117862117863117864117865117866117867117868117869117870117871117872117873117874117875117876117877117878117879117880117881117882117883117884117885117886117887117888117889117890117891117892117893117894117895117896117897117898117899117900117901117902117903117904117905117906117907117908117909117910117911117912117913117914117915117916117917117918117919117920117921117922117923117924117925117926117927117928117929117930117931117932117933117934117935117936117937117938117939117940117941117942117943117944117945117946117947117948117949117950117951117952117953117954117955117956117957117958117959117960117961117962117963117964117965117966117967117968117969117970117971117972117973117974117975117976117977117978117979117980117981117982117983117984117985117986117987117988117989117990117991117992117993117994117995117996117997117998117999118000118001118002118003118004118005118006118007118008118009118010118011118012118013118014118015118016118017118018118019118020118021118022118023118024118025118026118027118028118029118030118031118032118033118034118035118036118037118038118039118040118041118042118043118044118045118046118047118048118049118050118051118052118053118054118055118056118057118058118059118060118061118062118063118064118065118066118067118068118069118070118071118072118073118074118075118076118077118078118079118080118081118082118083118084118085118086118087118088118089118090118091118092118093118094118095118096118097118098118099118100118101118102118103118104118105118106118107118108118109118110118111118112118113118114118115118116118117118118118119118120118121118122118123118124118125118126118127118128118129118130118131118132118133118134118135118136118137118138118139118140118141118142118143118144118145118146118147118148118149118150118151118152118153118154118155118156118157118158118159118160118161118162118163118164118165118166118167118168118169118170118171118172118173118174118175118176118177118178118179118180118181118182118183118184118185118186118187118188118189118190118191118192118193118194118195118196118197118198118199118200118201118202118203118204118205118206118207118208118209118210118211118212118213118214118215118216118217118218118219118220118221118222118223118224118225118226118227118228118229118230118231118232118233118234118235118236118237118238118239118240118241118242118243118244118245118246118247118248118249118250118251118252118253118254118255118256118257118258118259118260118261118262118263118264118265118266118267118268118269118270118271118272118273118274118275118276118277118278118279118280118281118282118283118284118285118286118287118288118289118290118291118292118293118294118295118296118297118298118299118300118301118302118303118304118305118306118307118308118309118310118311118312118313118314118315118316118317118318118319118320118321118322118323118324118325118326118327118328118329118330118331118332118333118334118335118336118337118338118339118340118341118342118343118344118345118346118347118348118349118350118351118352118353118354118355118356118357118358118359118360118361118362118363118364118365118366118367118368118369118370118371118372118373118374118375118376118377118378118379118380118381118382118383118384118385118386118387118388118389118390118391118392118393118394118395118396118397118398118399118400118401118402118403118404118405118406118407118408118409118410118411118412118413118414118415118416118417118418118419118420118421118422118423118424118425118426118427118428118429118430118431118432118433118434118435118436118437118438118439118440118441118442118443118444118445118446118447118448118449118450118451118452118453118454118455118456118457118458118459118460118461118462118463118464118465118466118467118468118469118470118471118472118473118474118475118476118477118478118479118480118481118482118483118484118485118486118487118488118489118490118491118492118493118494118495118496118497118498118499118500118501118502118503118504118505118506118507118508118509118510118511118512118513118514118515118516118517118518118519118520118521118522118523118524118525118526118527118528118529118530118531118532118533118534118535118536118537118538118539118540118541118542118543118544118545118546118547118548118549118550118551118552118553118554118555118556118557118558118559118560118561118562118563118564118565118566118567118568118569118570118571118572118573118574118575118576118577118578118579118580118581118582118583118584118585118586118587118588118589118590118591118592118593118594118595118596118597118598118599118600118601118602118603118604118605118606118607118608118609118610118611118612118613118614118615118616118617118618118619118620118621118622118623118624118625118626118627118628118629118630118631118632118633118634118635118636118637118638118639118640118641118642118643118644118645118646118647118648118649118650118651118652118653118654118655118656118657118658118659118660118661118662118663118664118665118666118667118668118669118670118671118672118673118674118675118676118677118678118679118680118681118682118683118684118685118686118687118688118689118690118691118692118693118694118695118696118697118698118699118700118701118702118703118704118705118706118707118708118709118710118711118712118713118714118715118716118717118718118719118720118721118722118723118724118725118726118727118728118729118730118731118732118733118734118735118736118737118738118739118740118741118742118743118744118745118746118747118748118749118750118751118752118753118754118755118756118757118758118759118760118761118762118763118764118765118766118767118768118769118770118771118772118773118774118775118776118777118778118779118780118781118782118783118784118785118786118787118788118789118790118791118792118793118794118795118796118797118798118799118800118801118802118803118804118805118806118807118808118809118810118811118812118813118814118815118816118817118818118819118820118821118822118823118824118825118826118827118828118829118830118831118832118833118834118835118836118837118838118839118840118841118842118843118844118845118846118847118848118849118850118851118852118853118854118855118856118857118858118859118860118861118862118863118864118865118866118867118868118869118870118871118872118873118874118875118876118877118878118879118880118881118882118883118884118885118886118887118888118889118890118891118892118893118894118895118896118897118898118899118900118901118902118903118904118905118906118907118908118909118910118911118912118913118914118915118916118917118918118919118920118921118922118923118924118925118926118927118928118929118930118931118932118933118934118935118936118937118938118939118940118941118942118943118944118945118946118947118948118949118950118951118952118953118954118955118956118957118958118959118960118961118962118963118964118965118966118967118968118969118970118971118972118973118974118975118976118977118978118979118980118981118982118983118984118985118986118987118988118989118990118991118992118993118994118995118996118997118998118999119000119001119002119003119004119005119006119007119008119009119010119011119012119013119014119015119016119017119018119019119020119021119022119023119024119025119026119027119028119029119030119031119032119033119034119035119036119037119038119039119040119041119042119043119044119045119046119047119048119049119050119051119052119053119054119055119056119057119058119059119060119061119062119063119064119065119066119067119068119069119070119071119072119073119074119075119076119077119078119079119080119081119082119083119084119085119086119087119088119089119090119091119092119093119094119095119096119097119098119099119100119101119102119103119104119105119106119107119108119109119110119111119112119113119114119115119116119117119118119119119120119121119122119123119124119125119126119127119128119129119130119131119132119133119134119135119136119137119138119139119140119141119142119143119144119145119146119147119148119149119150119151119152119153119154119155119156119157119158119159119160119161119162119163119164119165119166119167119168119169119170119171119172119173119174119175119176119177119178119179119180119181119182119183119184119185119186119187119188119189119190119191119192119193119194119195119196119197119198119199119200119201119202119203119204119205119206119207119208119209119210119211119212119213119214119215119216119217119218119219119220119221119222119223119224119225119226119227119228119229119230119231119232119233119234119235119236119237119238119239119240119241119242119243119244119245119246119247119248119249119250119251119252119253119254119255119256119257119258119259119260119261119262119263119264119265119266119267119268119269119270119271119272119273119274119275119276119277119278119279119280119281119282119283119284119285119286119287119288119289119290119291119292119293119294119295119296119297119298119299119300119301119302119303119304119305119306119307119308119309119310119311119312119313119314119315119316119317119318119319119320119321119322119323119324119325119326119327119328119329119330119331119332119333119334119335119336119337119338119339119340119341119342119343119344119345119346119347119348119349119350119351119352119353119354119355119356119357119358119359119360119361119362119363119364119365119366119367119368119369119370119371119372119373119374119375119376119377119378119379119380119381119382119383119384119385119386119387119388119389119390119391119392119393119394119395119396119397119398119399119400119401119402119403119404119405119406119407119408119409119410119411119412119413119414119415119416119417119418119419119420119421119422119423119424119425119426119427119428119429119430119431119432119433119434119435119436119437119438119439119440119441119442119443119444119445119446119447119448119449119450119451119452119453119454119455119456119457119458119459119460119461119462119463119464119465119466119467119468119469119470119471119472119473119474119475119476119477119478119479119480119481119482119483119484119485119486119487119488119489119490119491119492119493119494119495119496119497119498119499119500119501119502119503119504119505119506119507119508119509119510119511119512119513119514119515119516119517119518119519119520119521119522119523119524119525119526119527119528119529119530119531119532119533119534119535119536119537119538119539119540119541119542119543119544119545119546119547119548119549119550119551119552119553119554119555119556119557119558119559119560119561119562119563119564119565119566119567119568119569119570119571119572119573119574119575119576119577119578119579119580119581119582119583119584119585119586119587119588119589119590119591119592119593119594119595119596119597119598119599119600119601119602119603119604119605119606119607119608119609119610119611119612119613119614119615119616119617119618119619119620119621119622119623119624119625119626119627119628119629119630119631119632119633119634119635119636119637119638119639119640119641119642119643119644119645119646119647119648119649119650119651119652119653119654119655119656119657119658119659119660119661119662119663119664119665119666119667119668119669119670119671119672119673119674119675119676119677119678119679119680119681119682119683119684119685119686119687119688119689119690119691119692119693119694119695119696119697119698119699119700119701119702119703119704119705119706119707119708119709119710119711119712119713119714119715119716119717119718119719119720119721119722119723119724119725119726119727119728119729119730119731119732119733119734119735119736119737119738119739119740119741119742119743119744119745119746119747119748119749119750119751119752119753119754119755119756119757119758119759119760119761119762119763119764119765119766119767119768119769119770119771119772119773119774119775119776119777119778119779119780119781119782119783119784119785119786119787119788119789119790119791119792119793119794119795119796119797119798119799119800119801119802119803119804119805119806119807119808119809119810119811119812119813119814119815119816119817119818119819119820119821119822119823119824119825119826119827119828119829119830119831119832119833119834119835119836119837119838119839119840119841119842119843119844119845119846119847119848119849119850119851119852119853119854119855119856119857119858119859119860119861119862119863119864119865119866119867119868119869119870119871119872119873119874119875119876119877119878119879119880119881119882119883119884119885119886119887119888119889119890119891119892119893119894119895119896119897119898119899119900119901119902119903119904119905119906119907119908119909119910119911119912119913119914119915119916119917119918119919119920119921119922119923119924119925119926119927119928119929119930119931119932119933119934119935119936119937119938119939119940119941119942119943119944119945119946119947119948119949119950119951119952119953119954119955119956119957119958119959119960119961119962119963119964119965119966119967119968119969119970119971119972119973119974119975119976119977119978119979119980119981119982119983119984119985119986119987119988119989119990119991119992119993119994119995119996119997119998119999120000120001120002120003120004120005120006120007120008120009120010120011120012120013120014120015120016120017120018120019120020120021120022120023120024120025120026120027120028120029120030120031120032120033120034120035120036120037120038120039120040120041120042120043120044120045120046120047120048120049120050120051120052120053120054120055120056120057120058120059120060120061120062120063120064120065120066120067120068120069120070120071120072120073120074120075120076120077120078120079120080120081120082120083120084120085120086120087120088120089120090120091120092120093120094120095120096120097120098120099120100120101120102120103120104120105120106120107120108120109120110120111120112120113120114120115120116120117120118120119120120120121120122120123120124120125120126120127120128120129120130120131120132120133120134120135120136120137120138120139120140120141120142120143120144120145120146120147120148120149120150120151120152120153120154120155120156120157120158120159120160120161120162120163120164120165120166120167120168120169120170120171120172120173120174120175120176120177120178120179120180120181120182120183120184120185120186120187120188120189120190120191120192120193120194120195120196120197120198120199120200120201120202120203120204120205120206120207120208120209120210120211120212120213120214120215120216120217120218120219120220120221120222120223120224120225120226120227120228120229120230120231120232120233120234120235120236120237120238120239120240120241120242120243120244120245120246120247120248120249120250120251120252120253120254120255120256120257120258120259120260120261120262120263120264120265120266120267120268120269120270120271120272120273120274120275120276120277120278120279120280120281120282120283120284120285120286120287120288120289120290120291120292120293120294120295120296120297120298120299120300120301120302120303120304120305120306120307120308120309120310120311120312120313120314120315120316120317120318120319120320120321120322120323120324120325120326120327120328120329120330120331120332120333120334120335120336120337120338120339120340120341120342120343120344120345120346120347120348120349120350120351120352120353120354120355120356120357120358120359120360120361120362120363120364120365120366120367120368120369120370120371120372120373120374120375120376120377120378120379120380120381120382120383120384120385120386120387120388120389120390120391120392120393120394120395120396120397120398120399120400120401120402120403120404120405120406120407120408120409120410120411120412120413120414120415120416120417120418120419120420120421120422120423120424120425120426120427120428120429120430120431120432120433120434120435120436120437120438120439120440120441120442120443120444120445120446120447120448120449120450120451120452120453120454120455120456120457120458120459120460120461120462120463120464120465120466120467120468120469120470120471120472120473120474120475120476120477120478120479120480120481120482120483120484120485120486120487120488120489120490120491120492120493120494120495120496120497120498120499120500120501120502120503120504120505120506120507120508120509120510120511120512120513120514120515120516120517120518120519120520120521120522120523120524120525120526120527120528120529120530120531120532120533120534120535120536120537120538120539120540120541120542120543120544120545120546120547120548120549120550120551120552120553120554120555120556120557120558120559120560120561120562120563120564120565120566120567120568120569120570120571120572120573120574120575120576120577120578120579120580120581120582120583120584120585120586120587120588120589120590120591120592120593120594120595120596120597120598120599120600120601120602120603120604120605120606120607120608120609120610120611120612120613120614120615120616120617120618120619120620120621120622120623120624120625120626120627120628120629120630120631120632120633120634120635120636120637120638120639120640120641120642120643120644120645120646120647120648120649120650120651120652120653120654120655120656120657120658120659120660120661120662120663120664120665120666120667120668120669120670120671120672120673120674120675120676120677120678120679120680120681120682120683120684120685120686120687120688120689120690120691120692120693120694120695120696120697120698120699120700120701120702120703120704120705120706120707120708120709120710120711120712120713120714120715120716120717120718120719120720120721120722120723120724120725120726120727120728120729120730120731120732120733120734120735120736120737120738120739120740120741120742120743120744120745120746120747120748120749120750120751120752120753120754120755120756120757120758120759120760120761120762120763120764120765120766120767120768120769120770120771120772120773120774120775120776120777120778120779120780120781120782120783120784120785120786120787120788120789120790120791120792120793120794120795120796120797120798120799120800120801120802120803120804120805120806120807120808120809120810120811120812120813120814120815120816120817120818120819120820120821120822120823120824120825120826120827120828120829120830120831120832120833120834120835120836120837120838120839120840120841120842120843120844120845120846120847120848120849120850120851120852120853120854120855120856120857120858120859120860120861120862120863120864120865120866120867120868120869120870120871120872120873120874120875120876120877120878120879120880120881120882120883120884120885120886120887120888120889120890120891120892120893120894120895120896120897120898120899120900120901120902120903120904120905120906120907120908120909120910120911120912120913120914120915120916120917120918120919120920120921120922120923120924120925120926120927120928120929120930120931120932120933120934120935120936120937120938120939120940120941120942120943120944120945120946120947120948120949120950120951120952120953120954120955120956120957120958120959120960120961120962120963120964120965120966120967120968120969120970120971120972120973120974120975120976120977120978120979120980120981120982120983120984120985120986120987120988120989120990120991120992120993120994120995120996120997120998120999121000121001121002121003121004121005121006121007121008121009121010121011121012121013121014121015121016121017121018121019121020121021121022121023121024121025121026121027121028121029121030121031121032121033121034121035121036121037121038121039121040121041121042121043121044121045121046121047121048121049121050121051121052121053121054121055121056121057121058121059121060121061121062121063121064121065121066121067121068121069121070121071121072121073121074121075121076121077121078121079121080121081121082121083121084121085121086121087121088121089121090121091121092121093121094121095121096121097121098121099121100121101121102121103121104121105121106121107121108121109121110121111121112121113121114121115121116121117121118121119121120121121121122121123121124121125121126121127121128121129121130121131121132121133121134121135121136121137121138121139121140121141121142121143121144121145121146121147121148121149121150121151121152121153121154121155121156121157121158121159121160121161121162121163121164121165121166121167121168121169121170121171121172121173121174121175121176121177121178121179121180121181121182121183121184121185121186121187121188121189121190121191121192121193121194121195121196121197121198121199121200121201121202121203121204121205121206121207121208121209121210121211121212121213121214121215121216121217121218121219121220121221121222121223121224121225121226121227121228121229121230121231121232121233121234121235121236121237121238121239121240121241121242121243121244121245121246121247121248121249121250121251121252121253121254121255121256121257121258121259121260121261121262121263121264121265121266121267121268121269121270121271121272121273121274121275121276121277121278121279121280121281121282121283121284121285121286121287121288121289121290121291121292121293121294121295121296121297121298121299121300121301121302121303121304121305121306121307121308121309121310121311121312121313121314121315121316121317121318121319121320121321121322121323121324121325121326121327121328121329121330121331121332121333121334121335121336121337121338121339121340121341121342121343121344121345121346121347121348121349121350121351121352121353121354121355121356121357121358121359121360121361121362121363121364121365121366121367121368121369121370121371121372121373121374121375121376121377121378121379121380121381121382121383121384121385121386121387121388121389121390121391121392121393121394121395121396121397121398121399121400121401121402121403121404121405121406121407121408121409121410121411121412121413121414121415121416121417121418121419121420121421121422121423121424121425121426121427121428121429121430121431121432121433121434121435121436121437121438121439121440121441121442121443121444121445121446121447121448121449121450121451121452121453121454121455121456121457121458121459121460121461121462121463121464121465121466121467121468121469121470121471121472121473121474121475121476121477121478121479121480121481121482121483121484121485121486121487121488121489121490121491121492121493121494121495121496121497121498121499121500121501121502121503121504121505121506121507121508121509121510121511121512121513121514121515121516121517121518121519121520121521121522121523121524121525121526121527121528121529121530121531121532121533121534121535121536121537121538121539121540121541121542121543121544121545121546121547121548121549121550121551121552121553121554121555121556121557121558121559121560121561121562121563121564121565121566121567121568121569121570121571121572121573121574121575121576121577121578121579121580121581121582121583121584121585121586121587121588121589121590121591121592121593121594121595121596121597121598121599121600121601121602121603121604121605121606121607121608121609121610121611121612121613121614121615121616121617121618121619121620121621121622121623121624121625121626121627121628121629121630121631121632121633121634121635121636121637121638121639121640121641121642121643121644121645121646121647121648121649121650121651121652121653121654121655121656121657121658121659121660121661121662121663121664121665121666121667121668121669121670121671121672121673121674121675121676121677121678121679121680121681121682121683121684121685121686121687121688121689121690121691121692121693121694121695121696121697121698121699121700121701121702121703121704121705121706121707121708121709121710121711121712121713121714121715121716121717121718121719121720121721121722121723121724121725121726121727121728121729121730121731121732121733121734121735121736121737121738121739121740121741121742121743121744121745121746121747121748121749121750121751121752121753121754121755121756121757121758121759121760121761121762121763121764121765121766121767121768121769121770121771121772121773121774121775121776121777121778121779121780121781121782121783121784121785121786121787121788121789121790121791121792121793121794121795121796121797121798121799121800121801121802121803121804121805121806121807121808121809121810121811121812121813121814121815121816121817121818121819121820121821121822121823121824121825121826121827121828121829121830121831121832121833121834121835121836121837121838121839121840121841121842121843121844121845121846121847121848121849121850121851121852121853121854121855121856121857121858121859121860121861121862121863121864121865121866121867121868121869121870121871121872121873121874121875121876121877121878121879121880121881121882121883121884121885121886121887121888121889121890121891121892121893121894121895121896121897121898121899121900121901121902121903121904121905121906121907121908121909121910121911121912121913121914121915121916121917121918121919121920121921121922121923121924121925121926121927121928121929121930121931121932121933121934121935121936121937121938121939121940121941121942121943121944121945121946121947121948121949121950121951121952121953121954121955121956121957121958121959121960121961121962121963121964121965121966121967121968121969121970121971121972121973121974121975121976121977121978121979121980121981121982121983121984121985121986121987121988121989121990121991121992121993121994121995121996121997121998121999122000122001122002122003122004122005122006122007122008122009122010122011122012122013122014122015122016122017122018122019122020122021122022122023122024122025122026122027122028122029122030122031122032122033122034122035122036122037122038122039122040122041122042122043122044122045122046122047122048122049122050122051122052122053122054122055122056122057122058122059122060122061122062122063122064122065122066122067122068122069122070122071122072122073122074122075122076122077122078122079122080122081122082122083122084122085122086122087122088122089122090122091122092122093122094122095122096122097122098122099122100122101122102122103122104122105122106122107122108122109122110122111122112122113122114122115122116122117122118122119122120122121122122122123122124122125122126122127122128122129122130122131122132122133122134122135122136122137122138122139122140122141122142122143122144122145122146122147122148122149122150122151122152122153122154122155122156122157122158122159122160122161122162122163122164122165122166122167122168122169122170122171122172122173122174122175122176122177122178122179122180122181122182122183122184122185122186122187122188122189122190122191122192122193122194122195122196122197122198122199122200122201122202122203122204122205122206122207122208122209122210122211122212122213122214122215122216122217122218122219122220122221122222122223122224122225122226122227122228122229122230122231122232122233122234122235122236122237122238122239122240122241122242122243122244122245122246122247122248122249122250122251122252122253122254122255122256122257122258122259122260122261122262122263122264122265122266122267122268122269122270122271122272122273122274122275122276122277122278122279122280122281122282122283122284122285122286122287122288122289122290122291122292122293122294122295122296122297122298122299122300122301122302122303122304122305122306122307122308122309122310122311122312122313122314122315122316122317122318122319122320122321122322122323122324122325122326122327122328122329122330122331122332122333122334122335122336122337122338122339122340122341122342122343122344122345122346122347122348122349122350122351122352122353122354122355122356122357122358122359122360122361122362122363122364122365122366122367122368122369122370122371122372122373122374122375122376122377122378122379122380122381122382122383122384122385122386122387122388122389122390122391122392122393122394122395122396122397122398122399122400122401122402122403122404122405122406122407122408122409122410122411122412122413122414122415122416122417122418122419122420122421122422122423122424122425122426122427122428122429122430122431122432122433122434122435122436122437122438122439122440122441122442122443122444122445122446122447122448122449122450122451122452122453122454122455122456122457122458122459122460122461122462122463122464122465122466122467122468122469122470122471122472122473122474122475122476122477122478122479122480122481122482122483122484122485122486122487122488122489122490122491122492122493122494122495122496122497122498122499122500122501122502122503122504122505122506122507122508122509122510122511122512122513122514122515122516122517122518122519122520122521122522122523122524122525122526122527122528122529122530122531122532122533122534122535122536122537122538122539122540122541122542122543122544122545122546122547122548122549122550122551122552122553122554122555122556122557122558122559122560122561122562122563122564122565122566122567122568122569122570122571122572122573122574122575122576122577122578122579122580122581122582122583122584122585122586122587122588122589122590122591122592122593122594122595122596122597122598122599122600122601122602122603122604122605122606122607122608122609122610122611122612122613122614122615122616122617122618122619122620122621122622122623122624122625122626122627122628122629122630122631122632122633122634122635122636122637122638122639122640122641122642122643122644122645122646122647122648122649122650122651122652122653122654122655122656122657122658122659122660122661122662122663122664122665122666122667122668122669122670122671122672122673122674122675122676122677122678122679122680122681122682122683122684122685122686122687122688122689122690122691122692122693122694122695122696122697122698122699122700122701122702122703122704122705122706122707122708122709122710122711122712122713122714122715122716122717122718122719122720122721122722122723122724122725122726122727122728122729122730122731122732122733122734122735122736122737122738122739122740122741122742122743122744122745122746122747122748122749122750122751122752122753122754122755122756122757122758122759122760122761122762122763122764122765122766122767122768122769122770122771122772122773122774122775122776122777122778122779122780122781122782122783122784122785122786122787122788122789122790122791122792122793122794122795122796122797122798122799122800122801122802122803122804122805122806122807122808122809122810122811122812122813122814122815122816122817122818122819122820122821122822122823122824122825122826122827122828122829122830122831122832122833122834122835122836122837122838122839122840122841122842122843122844122845122846122847122848122849122850122851122852122853122854122855122856122857122858122859122860122861122862122863122864122865122866122867122868122869122870122871122872122873122874122875122876122877122878122879122880122881122882122883122884122885122886122887122888122889122890122891122892122893122894122895122896122897122898122899122900122901122902122903122904122905122906122907122908122909122910122911122912122913122914122915122916122917122918122919122920122921122922122923122924122925122926122927122928122929122930122931122932122933122934122935122936122937122938122939122940122941122942122943122944122945122946122947122948122949122950122951122952122953122954122955122956122957122958122959122960122961122962122963122964122965122966122967122968122969122970122971122972122973122974122975122976122977122978122979122980122981122982122983122984122985122986122987122988122989122990122991122992122993122994122995122996122997122998122999123000123001123002123003123004123005123006123007123008123009123010123011123012123013123014123015123016123017123018123019123020123021123022123023123024123025123026123027123028123029123030123031123032123033123034123035123036123037123038123039123040123041123042123043123044123045123046123047123048123049123050123051123052123053123054123055123056123057123058123059123060123061123062123063123064123065123066123067123068123069123070123071123072123073123074123075123076123077123078123079123080123081123082123083123084123085123086123087123088123089123090123091123092123093123094123095123096123097123098123099123100123101123102123103123104123105123106123107123108123109123110123111123112123113123114123115123116123117123118123119123120123121123122123123123124123125123126123127123128123129123130123131123132123133123134123135123136123137123138123139123140123141123142123143123144123145123146123147123148123149123150123151123152123153123154123155123156123157123158123159123160123161123162123163123164123165123166123167123168123169123170123171123172123173123174123175123176123177123178123179123180123181123182123183123184123185123186123187123188123189123190123191123192123193123194123195123196123197123198123199123200123201123202123203123204123205123206123207123208123209123210123211123212123213123214123215123216123217123218123219123220123221123222123223123224123225123226123227123228123229123230123231123232123233123234123235123236123237123238123239123240123241123242123243123244123245123246123247123248123249123250123251123252123253123254123255123256123257123258123259123260123261123262123263123264123265123266123267123268123269123270123271123272123273123274123275123276123277123278123279123280123281123282123283123284123285123286123287123288123289123290123291123292123293123294123295123296123297123298123299123300123301123302123303123304123305123306123307123308123309123310123311123312123313123314123315123316123317123318123319123320123321123322123323123324123325123326123327123328123329123330123331123332123333123334123335123336123337123338123339123340123341123342123343123344123345123346123347123348123349123350123351123352123353123354123355123356123357123358123359123360123361123362123363123364123365123366123367123368123369123370123371123372123373123374123375123376123377123378123379123380123381123382123383123384123385123386123387123388123389123390123391123392123393123394123395123396123397123398123399123400123401123402123403123404123405123406123407123408123409123410123411123412123413123414123415123416123417123418123419123420123421123422123423123424123425123426123427123428123429123430123431123432123433123434123435123436123437123438123439123440123441123442123443123444123445123446123447123448123449123450123451123452123453123454123455123456123457123458123459123460123461123462123463123464123465123466123467123468123469123470123471123472123473123474123475123476123477123478123479123480123481123482123483123484123485123486123487123488123489123490123491123492123493123494123495123496123497123498123499123500123501123502123503123504123505123506123507123508123509123510123511123512123513123514123515123516123517123518123519123520123521123522123523123524123525123526123527123528123529123530123531123532123533123534123535123536123537123538123539123540123541123542123543123544123545123546123547123548123549123550123551123552123553123554123555123556123557123558123559123560123561123562123563123564123565123566123567123568123569123570123571123572123573123574123575123576123577123578123579123580123581123582123583123584123585123586123587123588123589123590123591123592123593123594123595123596123597123598123599123600123601123602123603123604123605123606123607123608123609123610123611123612123613123614123615123616123617123618123619123620123621123622123623123624123625123626123627123628123629123630123631123632123633123634123635123636123637123638123639123640123641123642123643123644123645123646123647123648123649123650123651123652123653123654123655123656123657123658123659123660123661123662123663123664123665123666123667123668123669123670123671123672123673123674123675123676123677123678123679123680123681123682123683123684123685123686123687123688123689123690123691123692123693123694123695123696123697123698123699123700123701123702123703123704123705123706123707123708123709123710123711123712123713123714123715123716123717123718123719123720123721123722123723123724123725123726123727123728123729123730123731123732123733123734123735123736123737123738123739123740123741123742123743123744123745123746123747123748123749123750123751123752123753123754123755123756123757123758123759123760123761123762123763123764123765123766123767123768123769123770123771123772123773123774123775123776123777123778123779123780123781123782123783123784123785123786123787123788123789123790123791123792123793123794123795123796123797123798123799123800123801123802123803123804123805123806123807123808123809123810123811123812123813123814123815123816123817123818123819123820123821123822123823123824123825123826123827123828123829123830123831123832123833123834123835123836123837123838123839123840123841123842123843123844123845123846123847123848123849123850123851123852123853123854123855123856123857123858123859123860123861123862123863123864123865123866123867123868123869123870123871123872123873123874123875123876123877123878123879123880123881123882123883123884123885123886123887123888123889123890123891123892123893123894123895123896123897123898123899123900123901123902123903123904123905123906123907123908123909123910123911123912123913123914123915123916123917123918123919123920123921123922123923123924123925123926123927123928123929123930123931123932123933123934123935123936123937123938123939123940123941123942123943123944123945123946123947123948123949123950123951123952123953123954123955123956123957123958123959123960123961123962123963123964123965123966123967123968123969123970123971123972123973123974123975123976123977123978123979123980123981123982123983123984123985123986123987123988123989123990123991123992123993123994123995123996123997123998123999124000124001124002124003124004124005124006124007124008124009124010124011124012124013124014124015124016124017124018124019124020124021124022124023124024124025124026124027124028124029124030124031124032124033124034124035124036124037124038124039124040124041124042124043124044124045124046124047124048124049124050124051124052124053124054124055124056124057124058124059124060124061124062124063124064124065124066124067124068124069124070124071124072124073124074124075124076124077124078124079124080124081124082124083124084124085124086124087124088124089124090124091124092124093124094124095124096124097124098124099124100124101124102124103124104124105124106124107124108124109124110124111124112124113124114124115124116124117124118124119124120124121124122124123124124124125124126124127124128124129124130124131124132124133124134124135124136124137124138124139124140124141124142124143124144124145124146124147124148124149124150124151124152124153124154124155124156124157124158124159124160124161124162124163124164124165124166124167124168124169124170124171124172124173124174124175124176124177124178124179124180124181124182124183124184124185124186124187124188124189124190124191124192124193124194124195124196124197124198124199124200124201124202124203124204124205124206124207124208124209124210124211124212124213124214124215124216124217124218124219124220124221124222124223124224124225124226124227124228124229124230124231124232124233124234124235124236124237124238124239124240124241124242124243124244124245124246124247124248124249124250124251124252124253124254124255124256124257124258124259124260124261124262124263124264124265124266124267124268124269124270124271124272124273124274124275124276124277124278124279124280124281124282124283124284124285124286124287124288124289124290124291124292124293124294124295124296124297124298124299124300124301124302124303124304124305124306124307124308124309124310124311124312124313124314124315124316124317124318124319124320124321124322124323124324124325124326124327124328124329124330124331124332124333124334124335124336124337124338124339124340124341124342124343124344124345124346124347124348124349124350124351124352124353124354124355124356124357124358124359124360124361124362124363124364124365124366124367124368124369124370124371124372124373124374124375124376124377124378124379124380124381124382124383124384124385124386124387124388124389124390124391124392124393124394124395124396124397124398124399124400124401124402124403124404124405124406124407124408124409124410124411124412124413124414124415124416124417124418124419124420124421124422124423124424124425124426124427124428124429124430124431124432124433124434124435124436124437124438124439124440124441124442124443124444124445124446124447124448124449124450124451124452124453124454124455124456124457124458124459124460124461124462124463124464124465124466124467124468124469124470124471124472124473124474124475124476124477124478124479124480124481124482124483124484124485124486124487124488124489124490124491124492124493124494124495124496124497124498124499124500124501124502124503124504124505124506124507124508124509124510124511124512124513124514124515124516124517124518124519124520124521124522124523124524124525124526124527124528124529124530124531124532124533124534124535124536124537124538124539124540124541124542124543124544124545124546124547124548124549124550124551124552124553124554124555124556124557124558124559124560124561124562124563124564124565124566124567124568124569124570124571124572124573124574124575124576124577124578124579124580124581124582124583124584124585124586124587124588124589124590124591124592124593124594124595124596124597124598124599124600124601124602124603124604124605124606124607124608124609124610124611124612124613124614124615124616124617124618124619124620124621124622124623124624124625124626124627124628124629124630124631124632124633124634124635124636124637124638124639124640124641124642124643124644124645124646124647124648124649124650124651124652124653124654124655124656124657124658124659124660124661124662124663124664124665124666124667124668124669124670124671124672124673124674124675124676124677124678124679124680124681124682124683124684124685124686124687124688124689124690124691124692124693124694124695124696124697124698124699124700124701124702124703124704124705124706124707124708124709124710124711124712124713124714124715124716124717124718124719124720124721124722124723124724124725124726124727124728124729124730124731124732124733124734124735124736124737124738124739124740124741124742124743124744124745124746124747124748124749124750124751124752124753124754124755124756124757124758124759124760124761124762124763124764124765124766124767124768124769124770124771124772124773124774124775124776124777124778124779124780124781124782124783124784124785124786124787124788124789124790124791124792124793124794124795124796124797124798124799124800124801124802124803124804124805124806124807124808124809124810124811124812124813124814124815124816124817124818124819124820124821124822124823124824124825124826124827124828124829124830124831124832124833124834124835124836124837124838124839124840124841124842124843124844124845124846124847124848124849124850124851124852124853124854124855124856124857124858124859124860124861124862124863124864124865124866124867124868124869124870124871124872124873124874124875124876124877124878124879124880124881124882124883124884124885124886124887124888124889124890124891124892124893124894124895124896124897124898124899124900124901124902124903124904124905124906124907124908124909124910124911124912124913124914124915124916124917124918124919124920124921124922124923124924124925124926124927124928124929124930124931124932124933124934124935124936124937124938124939124940124941124942124943124944124945124946124947124948124949124950124951124952124953124954124955124956124957124958124959124960124961124962124963124964124965124966124967124968124969124970124971124972124973124974124975124976124977124978124979124980124981124982124983124984124985124986124987124988124989124990124991124992124993124994124995124996124997124998124999125000125001125002125003125004125005125006125007125008125009125010125011125012125013125014125015125016125017125018125019125020125021125022125023125024125025125026125027125028125029125030125031125032125033125034125035125036125037125038125039125040125041125042125043125044125045125046125047125048125049125050125051125052125053125054125055125056125057125058125059125060125061125062125063125064125065125066125067125068125069125070125071125072125073125074125075125076125077125078125079125080125081125082125083125084125085125086125087125088125089125090125091125092125093125094125095125096125097125098125099125100125101125102125103125104125105125106125107125108125109125110125111125112125113125114125115125116125117125118125119125120125121125122125123125124125125125126125127125128125129125130125131125132125133125134125135125136125137125138125139125140125141125142125143125144125145125146125147125148125149125150125151125152125153125154125155125156125157125158125159125160125161125162125163125164125165125166125167125168125169125170125171125172125173125174125175125176125177125178125179125180125181125182125183125184125185125186125187125188125189125190125191125192125193125194125195125196125197125198125199125200125201125202125203125204125205125206125207125208125209125210125211125212125213125214125215125216125217125218125219125220125221125222125223125224125225125226125227125228125229125230125231125232125233125234125235125236125237125238125239125240125241125242125243125244125245125246125247125248125249125250125251125252125253125254125255125256125257125258125259125260125261125262125263125264125265125266125267125268125269125270125271125272125273125274125275125276125277125278125279125280125281125282125283125284125285125286125287125288125289125290125291125292125293125294125295125296125297125298125299125300125301125302125303125304125305125306125307125308125309125310125311125312125313125314125315125316125317125318125319125320125321125322125323125324125325125326125327125328125329125330125331125332125333125334125335125336125337125338125339125340125341125342125343125344125345125346125347125348125349125350125351125352125353125354125355125356125357125358125359125360125361125362125363125364125365125366125367125368125369125370125371125372125373125374125375125376125377125378125379125380125381125382125383125384125385125386125387125388125389125390125391125392125393125394125395125396125397125398125399125400125401125402125403125404125405125406125407125408125409125410125411125412125413125414125415125416125417125418125419125420125421125422125423125424125425125426125427125428125429125430125431125432125433125434125435125436125437125438125439125440125441125442125443125444125445125446125447125448125449125450125451125452125453125454125455125456125457125458125459125460125461125462125463125464125465125466125467125468125469125470125471125472125473125474125475125476125477125478125479125480125481125482125483125484125485125486125487125488125489125490125491125492125493125494125495125496125497125498125499125500125501125502125503125504125505125506125507125508125509125510125511125512125513125514125515125516125517125518125519125520125521125522125523125524125525125526125527125528125529125530125531125532125533125534125535125536125537125538125539125540125541125542125543125544125545125546125547125548125549125550125551125552125553125554125555125556125557125558125559125560125561125562125563125564125565125566125567125568125569125570125571125572125573125574125575125576125577125578125579125580125581125582125583125584125585125586125587125588125589125590125591125592125593125594125595125596125597125598125599125600125601125602125603125604125605125606125607125608125609125610125611125612125613125614125615125616125617125618125619125620125621125622125623125624125625125626125627125628125629125630125631125632125633125634125635125636125637125638125639125640125641125642125643125644125645125646125647125648125649125650125651125652125653125654125655125656125657125658125659125660125661125662125663125664125665125666125667125668125669125670125671125672125673125674125675125676125677125678125679125680125681125682125683125684125685125686125687125688125689125690125691125692125693125694125695125696125697125698125699125700125701125702125703125704125705125706125707125708125709125710125711125712125713125714125715125716125717125718125719125720125721125722125723125724125725125726125727125728125729125730125731125732125733125734125735125736125737125738125739125740125741125742125743125744125745125746125747125748125749125750125751125752125753125754125755125756125757125758125759125760125761125762125763125764125765125766125767125768125769125770125771125772125773125774125775125776125777125778125779125780125781125782125783125784125785125786125787125788125789125790125791125792125793125794125795125796125797125798125799125800125801125802125803125804125805125806125807125808125809125810125811125812125813125814125815125816125817125818125819125820125821125822125823125824125825125826125827125828125829125830125831125832125833125834125835125836125837125838125839125840125841125842125843125844125845125846125847125848125849125850125851125852125853125854125855125856125857125858125859125860125861125862125863125864125865125866125867125868125869125870125871125872125873125874125875125876125877125878125879125880125881125882125883125884125885125886125887125888125889125890125891125892125893125894125895125896125897125898125899125900125901125902125903125904125905125906125907125908125909125910125911125912125913125914125915125916125917125918125919125920125921125922125923125924125925125926125927125928125929125930125931125932125933125934125935125936125937125938125939125940125941125942125943125944125945125946125947125948125949125950125951125952125953125954125955125956125957125958125959125960125961125962125963125964125965125966125967125968125969125970125971125972125973125974125975125976125977125978125979125980125981125982125983125984125985125986125987125988125989125990125991125992125993125994125995125996125997125998125999126000126001126002126003126004126005126006126007126008126009126010126011126012126013126014126015126016126017126018126019126020126021126022126023126024126025126026126027126028126029126030126031126032126033126034126035126036126037126038126039126040126041126042126043126044126045126046126047126048126049126050126051126052126053126054126055126056126057126058126059126060126061126062126063126064126065126066126067126068126069126070126071126072126073126074126075126076126077126078126079126080126081126082126083126084126085126086126087126088126089126090126091126092126093126094126095126096126097126098126099126100126101126102126103126104126105126106126107126108126109126110126111126112126113126114126115126116126117126118126119126120126121126122126123126124126125126126126127126128126129126130126131126132126133126134126135126136126137126138126139126140126141126142126143126144126145126146126147126148126149126150126151126152126153126154126155126156126157126158126159126160126161126162126163126164126165126166126167126168126169126170126171126172126173126174126175126176126177126178126179126180126181126182126183126184126185126186126187126188126189126190126191126192126193126194126195126196126197126198126199126200126201126202126203126204126205126206126207126208126209126210126211126212126213126214126215126216126217126218126219126220126221126222126223126224126225126226126227126228126229126230126231126232126233126234126235126236126237126238126239126240126241126242126243126244126245126246126247126248126249126250126251126252126253126254126255126256126257126258126259126260126261126262126263126264126265126266126267126268126269126270126271126272126273126274126275126276126277126278126279126280126281126282126283126284126285126286126287126288126289126290126291126292126293126294126295126296126297126298126299126300126301126302126303126304126305126306126307126308126309126310126311126312126313126314126315126316126317126318126319126320126321126322126323126324126325126326126327126328126329126330126331126332126333126334126335126336126337126338126339126340126341126342126343126344126345126346126347126348126349126350126351126352126353126354126355126356126357126358126359126360126361126362126363126364126365126366126367126368126369126370126371126372126373126374126375126376126377126378126379126380126381126382126383126384126385126386126387126388126389126390126391126392126393126394126395126396126397126398126399126400126401126402126403126404126405126406126407126408126409126410126411126412126413126414126415126416126417126418126419126420126421126422126423126424126425126426126427126428126429126430126431126432126433126434126435126436126437126438126439126440126441126442126443126444126445126446126447126448126449126450126451126452126453126454126455126456126457126458126459126460126461126462126463126464126465126466126467126468126469126470126471126472126473126474126475126476126477126478126479126480126481126482126483126484126485126486126487126488126489126490126491126492126493126494126495126496126497126498126499126500126501126502126503126504126505126506126507126508126509126510126511126512126513126514126515126516126517126518126519126520126521126522126523126524126525126526126527126528126529126530126531126532126533126534126535126536126537126538126539126540126541126542126543126544126545126546126547126548126549126550126551126552126553126554126555126556126557126558126559126560126561126562126563126564126565126566126567126568126569126570126571126572126573126574126575126576126577126578126579126580126581126582126583126584126585126586126587126588126589126590126591126592126593126594126595126596126597126598126599126600126601126602126603126604126605126606126607126608126609126610126611126612126613126614126615126616126617126618126619126620126621126622126623126624126625126626126627126628126629126630126631126632126633126634126635126636126637126638126639126640126641126642126643126644126645126646126647126648126649126650126651126652126653126654126655126656126657126658126659126660126661126662126663126664126665126666126667126668126669126670126671126672126673126674126675126676126677126678126679126680126681126682126683126684126685126686126687126688126689126690126691126692126693126694126695126696126697126698126699126700126701126702126703126704126705126706126707126708126709126710126711126712126713126714126715126716126717126718126719126720126721126722126723126724126725126726126727126728126729126730126731126732126733126734126735126736126737126738126739126740126741126742126743126744126745126746126747126748126749126750126751126752126753126754126755126756126757126758126759126760126761126762126763126764126765126766126767126768126769126770126771126772126773126774126775126776126777126778126779126780126781126782126783126784126785126786126787126788126789126790126791126792126793126794126795126796126797126798126799126800126801126802126803126804126805126806126807126808126809126810126811126812126813126814126815126816126817126818126819126820126821126822126823126824126825126826126827126828126829126830126831126832126833126834126835126836126837126838126839126840126841126842126843126844126845126846126847126848126849126850126851126852126853126854126855126856126857126858126859126860126861126862126863126864126865126866126867126868126869126870126871126872126873126874126875126876126877126878126879126880126881126882126883126884126885126886126887126888126889126890126891126892126893126894126895126896126897126898126899126900126901126902126903126904126905126906126907126908126909126910126911126912126913126914126915126916126917126918126919126920126921126922126923126924126925126926126927126928126929126930126931126932126933126934126935126936126937126938126939126940126941126942126943126944126945126946126947126948126949126950126951126952126953126954126955126956126957126958126959126960126961126962126963126964126965126966126967126968126969126970126971126972126973126974126975126976126977126978126979126980126981126982126983126984126985126986126987126988126989126990126991126992126993126994126995126996126997126998126999127000127001127002127003127004127005127006127007127008127009127010127011127012127013127014127015127016127017127018127019127020127021127022127023127024127025127026127027127028127029127030127031127032127033127034127035127036127037127038127039127040127041127042127043127044127045127046127047127048127049127050127051127052127053127054127055127056127057127058127059127060127061127062127063127064127065127066127067127068127069127070127071127072127073127074127075127076127077127078127079127080127081127082127083127084127085127086127087127088127089127090127091127092127093127094127095127096127097127098127099127100127101127102127103127104127105127106127107127108127109127110127111127112127113127114127115127116127117127118127119127120127121127122127123127124127125127126127127127128127129127130127131127132127133127134127135127136127137127138127139127140127141127142127143127144127145127146127147127148127149127150127151127152127153127154127155127156127157127158127159127160127161127162127163127164127165127166127167127168127169127170127171127172127173127174127175127176127177127178127179127180127181127182127183127184127185127186127187127188127189127190127191127192127193127194127195127196127197127198127199127200127201127202127203127204127205127206127207127208127209127210127211127212127213127214127215127216127217127218127219127220127221127222127223127224127225127226127227127228127229127230127231127232127233127234127235127236127237127238127239127240127241127242127243127244127245127246127247127248127249127250127251127252127253127254127255127256127257127258127259127260127261127262127263127264127265127266127267127268127269127270127271127272127273127274127275127276127277127278127279127280127281127282127283127284127285127286127287127288127289127290127291127292127293127294127295127296127297127298127299127300127301127302127303127304127305127306127307127308127309127310127311127312127313127314127315127316127317127318127319127320127321127322127323127324127325127326127327127328127329127330127331127332127333127334127335127336127337127338127339127340127341127342127343127344127345127346127347127348127349127350127351127352127353127354127355127356127357127358127359127360127361127362127363127364127365127366127367127368127369127370127371127372127373127374127375127376127377127378127379127380127381127382127383127384127385127386127387127388127389127390127391127392127393127394127395127396127397127398127399127400127401127402127403127404127405127406127407127408127409127410127411127412127413127414127415127416127417127418127419127420127421127422127423127424127425127426127427127428127429127430127431127432127433127434127435127436127437127438127439127440127441127442127443127444127445127446127447127448127449127450127451127452127453127454127455127456127457127458127459127460127461127462127463127464127465127466127467127468127469127470127471127472127473127474127475127476127477127478127479127480127481127482127483127484127485127486127487127488127489127490127491127492127493127494127495127496127497127498127499127500127501127502127503127504127505127506127507127508127509127510127511127512127513127514127515127516127517127518127519127520127521127522127523127524127525127526127527127528127529127530127531127532127533127534127535127536127537127538127539127540127541127542127543127544127545127546127547127548127549127550127551127552127553127554127555127556127557127558127559127560127561127562127563127564127565127566127567127568127569127570127571127572127573127574127575127576127577127578127579127580127581127582127583127584127585127586127587127588127589127590127591127592127593127594127595127596127597127598127599127600127601127602127603127604127605127606127607127608127609127610127611127612127613127614127615127616127617127618127619127620127621127622127623127624127625127626127627127628127629127630127631127632127633127634127635127636127637127638127639127640127641127642127643127644127645127646127647127648127649127650127651127652127653127654127655127656127657127658127659127660127661127662127663127664127665127666127667127668127669127670127671127672127673127674127675127676127677127678127679127680127681127682127683127684127685127686127687127688127689127690127691127692127693127694127695127696127697127698127699127700127701127702127703127704127705127706127707127708127709127710127711127712127713127714127715127716127717127718127719127720127721127722127723127724127725127726127727127728127729127730127731127732127733127734127735127736127737127738127739127740127741127742127743127744127745127746127747127748127749127750127751127752127753127754127755127756127757127758127759127760127761127762127763127764127765127766127767127768127769127770127771127772127773127774127775127776127777127778127779127780127781127782127783127784127785127786127787127788127789127790127791127792127793127794127795127796127797127798127799127800127801127802127803127804127805127806127807127808127809127810127811127812127813127814127815127816127817127818127819127820127821127822127823127824127825127826127827127828127829127830127831127832127833127834127835127836127837127838127839127840127841127842127843127844127845127846127847127848127849127850127851127852127853127854127855127856127857127858127859127860127861127862127863127864127865127866127867127868127869127870127871127872127873127874127875127876127877127878127879127880127881127882127883127884127885127886127887127888127889127890127891127892127893127894127895127896127897127898127899127900127901127902127903127904127905127906127907127908127909127910127911127912127913127914127915127916127917127918127919127920127921127922127923127924127925127926127927127928127929127930127931127932127933127934127935127936127937127938127939127940127941127942127943127944127945127946127947127948127949127950127951127952127953127954127955127956127957127958127959127960127961127962127963127964127965127966127967127968127969127970127971127972127973127974127975127976127977127978127979127980127981127982127983127984127985127986127987127988127989127990127991127992127993127994127995127996127997127998127999128000128001128002128003128004128005128006128007128008128009128010128011128012128013128014128015128016128017128018128019128020128021128022128023128024128025128026128027128028128029128030128031128032128033128034128035128036128037128038128039128040128041128042128043128044128045128046128047128048128049128050128051128052128053128054128055128056128057128058128059128060128061128062128063128064128065128066128067128068128069128070128071128072128073128074128075128076128077128078128079128080128081128082128083128084128085128086128087128088128089128090128091128092128093128094128095128096128097128098128099128100128101128102128103128104128105128106128107128108128109128110128111128112128113128114128115128116128117128118128119128120128121128122128123128124128125128126128127128128128129128130128131128132128133128134128135128136128137128138128139128140128141128142128143128144128145128146128147128148128149128150128151128152128153128154128155128156128157128158128159128160128161128162128163128164128165128166128167128168128169128170128171128172128173128174128175128176128177128178128179128180128181128182128183128184128185128186128187128188128189128190128191128192128193128194128195128196128197128198128199128200128201128202128203128204128205128206128207128208128209128210128211128212128213128214128215128216128217128218128219128220128221128222128223128224128225128226128227128228128229128230128231128232128233128234128235128236128237128238128239128240128241128242128243128244128245128246128247128248128249128250128251128252128253128254128255128256128257128258128259128260128261128262128263128264128265128266128267128268128269128270128271128272128273128274128275128276128277128278128279128280128281128282128283128284128285128286128287128288128289128290128291128292128293128294128295128296128297128298128299128300128301128302128303128304128305128306128307128308128309128310128311128312128313128314128315128316128317128318128319128320128321128322128323128324128325128326128327128328128329128330128331128332128333128334128335128336128337128338128339128340128341128342128343128344128345128346128347128348128349128350128351128352128353128354128355128356128357128358128359128360128361128362128363128364128365128366128367128368128369128370128371128372128373128374128375128376128377128378128379128380128381128382128383128384128385128386128387128388128389128390128391128392128393128394128395128396128397128398128399128400128401128402128403128404128405128406128407128408128409128410128411128412128413128414128415128416128417128418128419128420128421128422128423128424128425128426128427128428128429128430128431128432128433128434128435128436128437128438128439128440128441128442128443128444128445128446128447128448128449128450128451128452128453128454128455128456128457128458128459128460128461128462128463128464128465128466128467128468128469128470128471128472128473128474128475128476128477128478128479128480128481128482128483128484128485128486128487128488128489128490128491128492128493128494128495128496128497128498128499128500128501128502128503128504128505128506128507128508128509128510128511128512128513128514128515128516128517128518128519128520128521128522128523128524128525128526128527128528128529128530128531128532128533128534128535128536128537128538128539128540128541128542128543128544128545128546128547128548128549128550128551128552128553128554128555128556128557128558128559128560128561128562128563128564128565128566128567128568128569128570128571128572128573128574128575128576128577128578128579128580128581128582128583128584128585128586128587128588128589128590128591128592128593128594128595128596128597128598128599128600128601128602128603128604128605128606128607128608128609128610128611128612128613128614128615128616128617128618128619128620128621128622128623128624128625128626128627128628128629128630128631128632128633128634128635128636128637128638128639128640128641128642128643128644128645128646128647128648128649128650128651128652128653128654128655128656128657128658128659128660128661128662128663128664128665128666128667128668128669128670128671128672128673128674128675128676128677128678128679128680128681128682128683128684128685128686128687128688128689128690128691128692128693128694128695128696128697128698128699128700128701128702128703128704128705128706128707128708128709128710128711128712128713128714128715128716128717128718128719128720128721128722128723128724128725128726128727128728128729128730128731128732128733128734128735128736128737128738128739128740128741128742128743128744128745128746128747128748128749128750128751128752128753128754128755128756128757128758128759128760128761128762128763128764128765128766128767128768128769128770128771128772128773128774128775128776128777128778128779128780128781128782128783128784128785128786128787128788128789128790128791128792128793128794128795128796128797128798128799128800128801128802128803128804128805128806128807128808128809128810128811128812128813128814128815128816128817128818128819128820128821128822128823128824128825128826128827128828128829128830128831128832128833128834128835128836128837128838128839128840128841128842128843128844128845128846128847128848128849128850128851128852128853128854128855128856128857128858128859128860128861128862128863128864128865128866128867128868128869128870128871128872128873128874128875128876128877128878128879128880128881128882128883128884128885128886128887128888128889128890128891128892128893128894128895128896128897128898128899128900128901128902128903128904128905128906128907128908128909128910128911128912128913128914128915128916128917128918128919128920128921128922128923128924128925128926128927128928128929128930128931128932128933128934128935128936128937128938128939128940128941128942128943128944128945128946128947128948128949128950128951128952128953128954128955128956128957128958128959128960128961128962128963128964128965128966128967128968128969128970128971128972128973128974128975128976128977128978128979128980128981128982128983128984128985128986128987128988128989128990128991128992128993128994128995128996128997128998128999129000129001129002129003129004129005129006129007129008129009129010129011129012129013129014129015129016129017129018129019129020129021129022129023129024129025129026129027129028129029129030129031129032129033129034129035129036129037129038129039129040129041129042129043129044129045129046129047129048129049129050129051129052129053129054129055129056129057129058129059129060129061129062129063129064129065129066129067129068129069129070129071129072129073129074129075129076129077129078129079129080129081129082129083129084129085129086129087129088129089129090129091129092129093129094129095129096129097129098129099129100129101129102129103129104129105129106129107129108129109129110129111129112129113129114129115129116129117129118129119129120129121129122129123129124129125129126129127129128129129129130129131129132129133129134129135129136129137129138129139129140129141129142129143129144129145129146129147129148129149129150129151129152129153129154129155129156129157129158129159129160129161129162129163129164129165129166129167129168129169129170129171129172129173129174129175129176129177129178129179129180129181129182129183129184129185129186129187129188129189129190129191129192129193129194129195129196129197129198129199129200129201129202129203129204129205129206129207129208129209129210129211129212129213129214129215129216129217129218129219129220129221129222129223129224129225129226129227129228129229129230129231129232129233129234129235129236129237129238129239129240129241129242129243129244129245129246129247129248129249129250129251129252129253129254129255129256129257129258129259129260129261129262129263129264129265129266129267129268129269129270129271129272129273129274129275129276129277129278129279129280129281129282129283129284129285129286129287129288129289129290129291129292129293129294129295129296129297129298129299129300129301129302129303129304129305129306129307129308129309129310129311129312129313129314129315129316129317129318129319129320129321129322129323129324129325129326129327129328129329129330129331129332129333129334129335129336129337129338129339129340129341129342129343129344129345129346129347129348129349129350129351129352129353129354129355129356129357129358129359129360129361129362129363129364129365129366129367129368129369129370129371129372129373129374129375129376129377129378129379129380129381129382129383129384129385129386129387129388129389129390129391129392129393129394129395129396129397129398129399129400129401129402129403129404129405129406129407129408129409129410129411129412129413129414129415129416129417129418129419129420129421129422129423129424129425129426129427129428129429129430129431129432129433129434129435129436129437129438129439129440129441129442129443129444129445129446129447129448129449129450129451129452129453129454129455129456129457129458129459129460129461129462129463129464129465129466129467129468129469129470129471129472129473129474129475129476129477129478129479129480129481129482129483129484129485129486129487129488129489129490129491129492129493129494129495129496129497129498129499129500129501129502129503129504129505129506129507129508129509129510129511129512129513129514129515129516129517129518129519129520129521129522129523129524129525129526129527129528129529129530129531129532129533129534129535129536129537129538129539129540129541129542129543129544129545129546129547129548129549129550129551129552129553129554129555129556129557129558129559129560129561129562129563129564129565129566129567129568129569129570129571129572129573129574129575129576129577129578129579129580129581129582129583129584129585129586129587129588129589129590129591129592129593129594129595129596129597129598129599129600129601129602129603129604129605129606129607129608129609129610129611129612129613129614129615129616129617129618129619129620129621129622129623129624129625129626129627129628129629129630129631129632129633129634129635129636129637129638129639129640129641129642129643129644129645129646129647129648129649129650129651129652129653129654129655129656129657129658129659129660129661129662129663129664129665129666129667129668129669129670129671129672129673129674129675129676129677129678129679129680129681129682129683129684129685129686129687129688129689129690129691129692129693129694129695129696129697129698129699129700129701129702129703129704129705129706129707129708129709129710129711129712129713129714129715129716129717129718129719129720129721129722129723129724129725129726129727129728129729129730129731129732129733129734129735129736129737129738129739129740129741129742129743129744129745129746129747129748129749129750129751129752129753129754129755129756129757129758129759129760129761129762129763129764129765129766129767129768129769129770129771129772129773129774129775129776129777129778129779129780129781129782129783129784129785129786129787129788129789129790129791129792129793129794129795129796129797129798129799129800129801129802129803129804129805129806129807129808129809129810129811129812129813129814129815129816129817129818129819129820129821129822129823129824129825129826129827129828129829129830129831129832129833129834129835129836129837129838129839129840129841129842129843129844129845129846129847129848129849129850129851129852129853129854129855129856129857129858129859129860129861129862129863129864129865129866129867129868129869129870129871129872129873129874129875129876129877129878129879129880129881129882129883129884129885129886129887129888129889129890129891129892129893129894129895129896129897129898129899129900129901129902129903129904129905129906129907129908129909129910129911129912129913129914129915129916129917129918129919129920129921129922129923129924129925129926129927129928129929129930129931129932129933129934129935129936129937129938129939129940129941129942129943129944129945129946129947129948129949129950129951129952129953129954129955129956129957129958129959129960129961129962129963129964129965129966129967129968129969129970129971129972129973129974129975129976129977129978129979129980129981129982129983129984129985129986129987129988129989129990129991129992129993129994129995129996129997129998129999130000130001130002130003130004130005130006130007130008130009130010130011130012130013130014130015130016130017130018130019130020130021130022130023130024130025130026130027130028130029130030130031130032130033130034130035130036130037130038130039130040130041130042130043130044130045130046130047130048130049130050130051130052130053130054130055130056130057130058130059130060130061130062130063130064130065130066130067130068130069130070130071130072130073130074130075130076130077130078130079130080130081130082130083130084130085130086130087130088130089130090130091130092130093130094130095130096130097130098130099130100130101130102130103130104130105130106130107130108130109130110130111130112130113130114130115130116130117130118130119130120130121130122130123130124130125130126130127130128130129130130130131130132130133130134130135130136130137130138130139130140130141130142130143130144130145130146130147130148130149130150130151130152130153130154130155130156130157130158130159130160130161130162130163130164130165130166130167130168130169130170130171130172130173130174130175130176130177130178130179130180130181130182130183130184130185130186130187130188130189130190130191130192130193130194130195130196130197130198130199130200130201130202130203130204130205130206130207130208130209130210130211130212130213130214130215130216130217130218130219130220130221130222130223130224130225130226130227130228130229130230130231130232130233130234130235130236130237130238130239130240130241130242130243130244130245130246130247130248130249130250130251130252130253130254130255130256130257130258130259130260130261130262130263130264130265130266130267130268130269130270130271130272130273130274130275130276130277130278130279130280130281130282130283130284130285130286130287130288130289130290130291130292130293130294130295130296130297130298130299130300130301130302130303130304130305130306130307130308130309130310130311130312130313130314130315130316130317130318130319130320130321130322130323130324130325130326130327130328130329130330130331130332130333130334130335130336130337130338130339130340130341130342130343130344130345130346130347130348130349130350130351130352130353130354130355130356130357130358130359130360130361130362130363130364130365130366130367130368130369130370130371130372130373130374130375130376130377130378130379130380130381130382130383130384130385130386130387130388130389130390130391130392130393130394130395130396130397130398130399130400130401130402130403130404130405130406130407130408130409130410130411130412130413130414130415130416130417130418130419130420130421130422130423130424130425130426130427130428130429130430130431130432130433130434130435130436130437130438130439130440130441130442130443130444130445130446130447130448130449130450130451130452130453130454130455130456130457130458130459130460130461130462130463130464130465130466130467130468130469130470130471130472130473130474130475130476130477130478130479130480130481130482130483130484130485130486130487130488130489130490130491130492130493130494130495130496130497130498130499130500130501130502130503130504130505130506130507130508130509130510130511130512130513130514130515130516130517130518130519130520130521130522130523130524130525130526130527130528130529130530130531130532130533130534130535130536130537130538130539130540130541130542130543130544130545130546130547130548130549130550130551130552130553130554130555130556130557130558130559130560130561130562130563130564130565130566130567130568130569130570130571130572130573130574130575130576130577130578130579130580130581130582130583130584130585130586130587130588130589130590130591130592130593130594130595130596130597130598130599130600130601130602130603130604130605130606130607130608130609130610130611130612130613130614130615130616130617130618130619130620130621130622130623130624130625130626130627130628130629130630130631130632130633130634130635130636130637130638130639130640130641130642130643130644130645130646130647130648130649130650130651130652130653130654130655130656130657130658130659130660130661130662130663130664130665130666130667130668130669130670130671130672130673130674130675130676130677130678130679130680130681130682130683130684130685130686130687130688130689130690130691130692130693130694130695130696130697130698130699130700130701130702130703130704130705130706130707130708130709130710130711130712130713130714130715130716130717130718130719130720130721130722130723130724130725130726130727130728130729130730130731130732130733130734130735130736130737130738130739130740130741130742130743130744130745130746130747130748130749130750130751130752130753130754130755130756130757130758130759130760130761130762130763130764130765130766130767130768130769130770130771130772130773130774130775130776130777130778130779130780130781130782130783130784130785130786130787130788130789130790130791130792130793130794130795130796130797130798130799130800130801130802130803130804130805130806130807130808130809130810130811130812130813130814130815130816130817130818130819130820130821130822130823130824130825130826130827130828130829130830130831130832130833130834130835130836130837130838130839130840130841130842130843130844130845130846130847130848130849130850130851130852130853130854130855130856130857130858130859130860130861130862130863130864130865130866130867130868130869130870130871130872130873130874130875130876130877130878130879130880130881130882130883130884130885130886130887130888130889130890130891130892130893130894130895130896130897130898130899130900130901130902130903130904130905130906130907130908130909130910130911130912130913130914130915130916130917130918130919130920130921130922130923130924130925130926130927130928130929130930130931130932130933130934130935130936130937130938130939130940130941130942130943130944130945130946130947130948130949130950130951130952130953130954130955130956130957130958130959130960130961130962130963130964130965130966130967130968130969130970130971130972130973130974130975130976130977130978130979130980130981130982130983130984130985130986130987130988130989130990130991130992130993130994130995130996130997130998130999131000131001131002131003131004131005131006131007131008131009131010131011131012131013131014131015131016131017131018131019131020131021131022131023131024131025131026131027131028131029131030131031131032131033131034131035131036131037131038131039131040131041131042131043131044131045131046131047131048131049131050131051131052131053131054131055131056131057131058131059131060131061131062131063131064131065131066131067131068131069131070131071131072131073131074131075131076131077131078131079131080131081131082131083131084131085131086131087131088131089131090131091131092131093131094131095131096131097131098131099131100131101131102131103131104131105131106131107131108131109131110131111131112131113131114131115131116131117131118131119131120131121131122131123131124131125131126131127131128131129131130131131131132131133131134131135131136131137131138131139131140131141131142131143131144131145131146131147131148131149131150131151131152131153131154131155131156131157131158131159131160131161131162131163131164131165131166131167131168131169131170131171131172131173131174131175131176131177131178131179131180131181131182131183131184131185131186131187131188131189131190131191131192131193131194131195131196131197131198131199131200131201131202131203131204131205131206131207131208131209131210131211131212131213131214131215131216131217131218131219131220131221131222131223131224131225131226131227131228131229131230131231131232131233131234131235131236131237131238131239131240131241131242131243131244131245131246131247131248131249131250131251131252131253131254131255131256131257131258131259131260131261131262131263131264131265131266131267131268131269131270131271131272131273131274131275131276131277131278131279131280131281131282131283131284131285131286131287131288131289131290131291131292131293131294131295131296131297131298131299131300131301131302131303131304131305131306131307131308131309131310131311131312131313131314131315131316131317131318131319131320131321131322131323131324131325131326131327131328131329131330131331131332131333131334131335131336131337131338131339131340131341131342131343131344131345131346131347131348131349131350131351131352131353131354131355131356131357131358131359131360131361131362131363131364131365131366131367131368131369131370131371131372131373131374131375131376131377131378131379131380131381131382131383131384131385131386131387131388131389131390131391131392131393131394131395131396131397131398131399131400131401131402131403131404131405131406131407131408131409131410131411131412131413131414131415131416131417131418131419131420131421131422131423131424131425131426131427131428131429131430131431131432131433131434131435131436131437131438131439131440131441131442131443131444131445131446131447131448131449131450131451131452131453131454131455131456131457131458131459131460131461131462131463131464131465131466131467131468131469131470131471131472131473131474131475131476131477131478131479131480131481131482131483131484131485131486131487131488131489131490131491131492131493131494131495131496131497131498131499131500131501131502131503131504131505131506131507131508131509131510131511131512131513131514131515131516131517131518131519131520131521131522131523131524131525131526131527131528131529131530131531131532131533131534131535131536131537131538131539131540131541131542131543131544131545131546131547131548131549131550131551131552131553131554131555131556131557131558131559131560131561131562131563131564131565131566131567131568131569131570131571131572131573131574131575131576131577131578131579131580131581131582131583131584131585131586131587131588131589131590131591131592131593131594131595131596131597131598131599131600131601131602131603131604131605131606131607131608131609131610131611131612131613131614131615131616131617131618131619131620131621131622131623131624131625131626131627131628131629131630131631131632131633131634131635131636131637131638131639131640131641131642131643131644131645131646131647131648131649131650131651131652131653131654131655131656131657131658131659131660131661131662131663131664131665131666131667131668131669131670131671131672131673131674131675131676131677131678131679131680131681131682131683131684131685131686131687131688131689131690131691131692131693131694131695131696131697131698131699131700131701131702131703131704131705131706131707131708131709131710131711131712131713131714131715131716131717131718131719131720131721131722131723131724131725131726131727131728131729131730131731131732131733131734131735131736131737131738131739131740131741131742131743131744131745131746131747131748131749131750131751131752131753131754131755131756131757131758131759131760131761131762131763131764131765131766131767131768131769131770131771131772131773131774131775131776131777131778131779131780131781131782131783131784131785131786131787131788131789131790131791131792131793131794131795131796131797131798131799131800131801131802131803131804131805131806131807131808131809131810131811131812131813131814131815131816131817131818131819131820131821131822131823131824131825131826131827131828131829131830131831131832131833131834131835131836131837131838131839131840131841131842131843131844131845131846131847131848131849131850131851131852131853131854131855131856131857131858131859131860131861131862131863131864131865131866131867131868131869131870131871131872131873131874131875131876131877131878131879131880131881131882131883131884131885131886131887131888131889131890131891131892131893131894131895131896131897131898131899131900131901131902131903131904131905131906131907131908131909131910131911131912131913131914131915131916131917131918131919131920131921131922131923131924131925131926131927131928131929131930131931131932131933131934131935131936131937131938131939131940131941131942131943131944131945131946131947131948131949131950131951131952131953131954131955131956131957131958131959131960131961131962131963131964131965131966131967131968131969131970131971131972131973131974131975131976131977131978131979131980131981131982131983131984131985131986131987131988131989131990131991131992131993131994131995131996131997131998131999132000132001132002132003132004132005132006132007132008132009132010132011132012132013132014132015132016132017132018132019132020132021132022132023132024132025132026132027132028132029132030132031132032132033132034132035132036132037132038132039132040132041132042132043132044132045132046132047132048132049132050132051132052132053132054132055132056132057132058132059132060132061132062132063132064132065132066132067132068132069132070132071132072132073132074132075132076132077132078132079132080132081132082132083132084132085132086132087132088132089132090132091132092132093132094132095132096132097132098132099132100132101132102132103132104132105132106132107132108132109132110132111132112132113132114132115132116132117132118132119132120132121132122132123132124132125132126132127132128132129132130132131132132132133132134132135132136132137132138132139132140132141132142132143132144132145132146132147132148132149132150132151132152132153132154132155132156132157132158132159132160132161132162132163132164132165132166132167132168132169132170132171132172132173132174132175132176132177132178132179132180132181132182132183132184132185132186132187132188132189132190132191132192132193132194132195132196132197132198132199132200132201132202132203132204132205132206132207132208132209132210132211132212132213132214132215132216132217132218132219132220132221132222132223132224132225132226132227132228132229132230132231132232132233132234132235132236132237132238132239132240132241132242132243132244132245132246132247132248132249132250132251132252132253132254132255132256132257132258132259132260132261132262132263132264132265132266132267132268132269132270132271132272132273132274132275132276132277132278132279132280132281132282132283132284132285132286132287132288132289132290132291132292132293132294132295132296132297132298132299132300132301132302132303132304132305132306132307132308132309132310132311132312132313132314132315132316132317132318132319132320132321132322132323132324132325132326132327132328132329132330132331132332132333132334132335132336132337132338132339132340132341132342132343132344132345132346132347132348132349132350132351132352132353132354132355132356132357132358132359132360132361132362132363132364132365132366132367132368132369132370132371132372132373132374132375132376132377132378132379132380132381132382132383132384132385132386132387132388132389132390132391132392132393132394132395132396132397132398132399132400132401132402132403132404132405132406132407132408132409132410132411132412132413132414132415132416132417132418132419132420132421132422132423132424132425132426132427132428132429132430132431132432132433132434132435132436132437132438132439132440132441132442132443132444132445132446132447132448132449132450132451132452132453132454132455132456132457132458132459132460132461132462132463132464132465132466132467132468132469132470132471132472132473132474132475132476132477132478132479132480132481132482132483132484132485132486132487132488132489132490132491132492132493132494132495132496132497132498132499132500132501132502132503132504132505132506132507132508132509132510132511132512132513132514132515132516132517132518132519132520132521132522132523132524132525132526132527132528132529132530132531132532132533132534132535132536132537132538132539132540132541132542132543132544132545132546132547132548132549132550132551132552132553132554132555132556132557132558132559132560132561132562132563132564132565132566132567132568132569132570132571132572132573132574132575132576132577132578132579132580132581132582132583132584132585132586132587132588132589132590132591132592132593132594132595132596132597132598132599132600132601132602132603132604132605132606132607132608132609132610132611132612132613132614132615132616132617132618132619132620132621132622132623132624132625132626132627132628132629132630132631132632132633132634132635132636132637132638132639132640132641132642132643132644132645132646132647132648132649132650132651132652132653132654132655132656132657132658132659132660132661132662132663132664132665132666132667132668132669132670132671132672132673132674132675132676132677132678132679132680132681132682132683132684132685132686132687132688132689132690132691132692132693132694132695132696132697132698132699132700132701132702132703132704132705132706132707132708132709132710132711132712132713132714132715132716132717132718132719132720132721132722132723132724132725132726132727132728132729132730132731132732132733132734132735132736132737132738132739132740132741132742132743132744132745132746132747132748132749132750132751132752132753132754132755132756132757132758132759132760132761132762132763132764132765132766132767132768132769132770132771132772132773132774132775132776132777132778132779132780132781132782132783132784132785132786132787132788132789132790132791132792132793132794132795132796132797132798132799132800132801132802132803132804132805132806132807132808132809132810132811132812132813132814132815132816132817132818132819132820132821132822132823132824132825132826132827132828132829132830132831132832132833132834132835132836132837132838132839132840132841132842132843132844132845132846132847132848132849132850132851132852132853132854132855132856132857132858132859132860132861132862132863132864132865132866132867132868132869132870132871132872132873132874132875132876132877132878132879132880132881132882132883132884132885132886132887132888132889132890132891132892132893132894132895132896132897132898132899132900132901132902132903132904132905132906132907132908132909132910132911132912132913132914132915132916132917132918132919132920132921132922132923132924132925132926132927132928132929132930132931132932132933132934132935132936132937132938132939132940132941132942132943132944132945132946132947132948132949132950132951132952132953132954132955132956132957132958132959132960132961132962132963132964132965132966132967132968132969132970132971132972132973132974132975132976132977132978132979132980132981132982132983132984132985132986132987132988132989132990132991132992132993132994132995132996132997132998132999133000133001133002133003133004133005133006133007133008133009133010133011133012133013133014133015133016133017133018133019133020133021133022133023133024133025133026133027133028133029133030133031133032133033133034133035133036133037133038133039133040133041133042133043133044133045133046133047133048133049133050133051133052133053133054133055133056133057133058133059133060133061133062133063133064133065133066133067133068133069133070133071133072133073133074133075133076133077133078133079133080133081133082133083133084133085133086133087133088133089133090133091133092133093133094133095133096133097133098133099133100133101133102133103133104133105133106133107133108133109133110133111133112133113133114133115133116133117133118133119133120133121133122133123133124133125133126133127133128133129133130133131133132133133133134133135133136133137133138133139133140133141133142133143133144133145133146133147133148133149133150133151133152133153133154133155133156133157133158133159133160133161133162133163133164133165133166133167133168133169133170133171133172133173133174133175133176133177133178133179133180133181133182133183133184133185133186133187133188133189133190133191133192133193133194133195133196133197133198133199133200133201133202133203133204133205133206133207133208133209133210133211133212133213133214133215133216133217133218133219133220133221133222133223133224133225133226133227133228133229133230133231133232133233133234133235133236133237133238133239133240133241133242133243133244133245133246133247133248133249133250133251133252133253133254133255133256133257133258133259133260133261133262133263133264133265133266133267133268133269133270133271133272133273133274133275133276133277133278133279133280133281133282133283133284133285133286133287133288133289133290133291133292133293133294133295133296133297133298133299133300133301133302133303133304133305133306133307133308133309133310133311133312133313133314133315133316133317133318133319133320133321133322133323133324133325133326133327133328133329133330133331133332133333133334133335133336133337133338133339133340133341133342133343133344133345133346133347133348133349133350133351133352133353133354133355133356133357133358133359133360133361133362133363133364133365133366133367133368133369133370133371133372133373133374133375133376133377133378133379133380133381133382133383133384133385133386133387133388133389133390133391133392133393133394133395133396133397133398133399133400133401133402133403133404133405133406133407133408133409133410133411133412133413133414133415133416133417133418133419133420133421133422133423133424133425133426133427133428133429133430133431133432133433133434133435133436133437133438133439133440133441133442133443133444133445133446133447133448133449133450133451133452133453133454133455133456133457133458133459133460133461133462133463133464133465133466133467133468133469133470133471133472133473133474133475133476133477133478133479133480133481133482133483133484133485133486133487133488133489133490133491133492133493133494133495133496133497133498133499133500133501133502133503133504133505133506133507133508133509133510133511133512133513133514133515133516133517133518133519133520133521133522133523133524133525133526133527133528133529133530133531133532133533133534133535133536133537133538133539133540133541133542133543133544133545133546133547133548133549133550133551133552133553133554133555133556133557133558133559133560133561133562133563133564133565133566133567133568133569133570133571133572133573133574133575133576133577133578133579133580133581133582133583133584133585133586133587133588133589133590133591133592133593133594133595133596133597133598133599133600133601133602133603133604133605133606133607133608133609133610133611133612133613133614133615133616133617133618133619133620133621133622133623133624133625133626133627133628133629133630133631133632133633133634133635133636133637133638133639133640133641133642133643133644133645133646133647133648133649133650133651133652133653133654133655133656133657133658133659133660133661133662133663133664133665133666133667133668133669133670133671133672133673133674133675133676133677133678133679133680133681133682133683133684133685133686133687133688133689133690133691133692133693133694133695133696133697133698133699133700133701133702133703133704133705133706133707133708133709133710133711133712133713133714133715133716133717133718133719133720133721133722133723133724133725133726133727133728133729133730133731133732133733133734133735133736133737133738133739133740133741133742133743133744133745133746133747133748133749133750133751133752133753133754133755133756133757133758133759133760133761133762133763133764133765133766133767133768133769133770133771133772133773133774133775133776133777133778133779133780133781133782133783133784133785133786133787133788133789133790133791133792133793133794133795133796133797133798133799133800133801133802133803133804133805133806133807133808133809133810133811133812133813133814133815133816133817133818133819133820133821133822133823133824133825133826133827133828133829133830133831133832133833133834133835133836133837133838133839133840133841133842133843133844133845133846133847133848133849133850133851133852133853133854133855133856133857133858133859133860133861133862133863133864133865133866133867133868133869133870133871133872133873133874133875133876133877133878133879133880133881133882133883133884133885133886133887133888133889133890133891133892133893133894133895133896133897133898133899133900133901133902133903133904133905133906133907133908133909133910133911133912133913133914133915133916133917133918133919133920133921133922133923133924133925133926133927133928133929133930133931133932133933133934133935133936133937133938133939133940133941133942133943133944133945133946133947133948133949133950133951133952133953133954133955133956133957133958133959133960133961133962133963133964133965133966133967133968133969133970133971133972133973133974133975133976133977133978133979133980133981133982133983133984133985133986133987133988133989133990133991133992133993133994133995133996133997133998133999134000134001134002134003134004134005134006134007134008134009134010134011134012134013134014134015134016134017134018134019134020134021134022134023134024134025134026134027134028134029134030134031134032134033134034134035134036134037134038134039134040134041134042134043134044134045134046134047134048134049134050134051134052134053134054134055134056134057134058134059134060134061134062134063134064134065134066134067134068134069134070134071134072134073134074134075134076134077134078134079134080134081134082134083134084134085134086134087134088134089134090134091134092134093134094134095134096134097134098134099134100134101134102134103134104134105134106134107134108134109134110134111134112134113134114134115134116134117134118134119134120134121134122134123134124134125134126134127134128134129134130134131134132134133134134134135134136134137134138134139134140134141134142134143134144134145134146134147134148134149134150134151134152134153134154134155134156134157134158134159134160134161134162134163134164134165134166134167134168134169134170134171134172134173134174134175134176134177134178134179134180134181134182134183134184134185134186134187134188134189134190134191134192134193134194134195134196134197134198134199134200134201134202134203134204134205134206134207134208134209134210134211134212134213134214134215134216134217134218134219134220134221134222134223134224134225134226134227134228134229134230134231134232134233134234134235134236134237134238134239134240134241134242134243134244134245134246134247134248134249134250134251134252134253134254134255134256134257134258134259134260134261134262134263134264134265134266134267134268134269134270134271134272134273134274134275134276134277134278134279134280134281134282134283134284134285134286134287134288134289134290134291134292134293134294134295134296134297134298134299134300134301134302134303134304134305134306134307134308134309134310134311134312134313134314134315134316134317134318134319134320134321134322134323134324134325134326134327134328134329134330134331134332134333134334134335134336134337134338134339134340134341134342134343134344134345134346134347134348134349134350134351134352134353134354134355134356134357134358134359134360134361134362134363134364134365134366134367134368134369134370134371134372134373134374134375134376134377134378134379134380134381134382134383134384134385134386134387134388134389134390134391134392134393134394134395134396134397134398134399134400134401134402134403134404134405134406134407134408134409134410134411134412134413134414134415134416134417134418134419134420134421134422134423134424134425134426134427134428134429134430134431134432134433134434134435134436134437134438134439134440134441134442134443134444134445134446134447134448134449134450134451134452134453134454134455134456134457134458134459134460134461134462134463134464134465134466134467134468134469134470134471134472134473134474134475134476134477134478134479134480134481134482134483134484134485134486134487134488134489134490134491134492134493134494134495134496134497134498134499134500134501134502134503134504134505134506134507134508134509134510134511134512134513134514134515134516134517134518134519134520134521134522134523134524134525134526134527134528134529134530134531134532134533134534134535134536134537134538134539134540134541134542134543134544134545134546134547134548134549134550134551134552134553134554134555134556134557134558134559134560134561134562134563134564134565134566134567134568134569134570134571134572134573134574134575134576134577134578134579134580134581134582134583134584134585134586134587134588134589134590134591134592134593134594134595134596134597134598134599134600134601134602134603134604134605134606134607134608134609134610134611134612134613134614134615134616134617134618134619134620134621134622134623134624134625134626134627134628134629134630134631134632134633134634134635134636134637134638134639134640134641134642134643134644134645134646134647134648134649134650134651134652134653134654134655134656134657134658134659134660134661134662134663134664134665134666134667134668134669134670134671134672134673134674134675134676134677134678134679134680134681134682134683134684134685134686134687134688134689134690134691134692134693134694134695134696134697134698134699134700134701134702134703134704134705134706134707134708134709134710134711134712134713134714134715134716134717134718134719134720134721134722134723134724134725134726134727134728134729134730134731134732134733134734134735134736134737134738134739134740134741134742134743134744134745134746134747134748134749134750134751134752134753134754134755134756134757134758134759134760134761134762134763134764134765134766134767134768134769134770134771134772134773134774134775134776134777134778134779134780134781134782134783134784134785134786134787134788134789134790134791134792134793134794134795134796134797134798134799134800134801134802134803134804134805134806134807134808134809134810134811134812134813134814134815134816134817134818134819134820134821134822134823134824134825134826134827134828134829134830134831134832134833134834134835134836134837134838134839134840134841134842134843134844134845134846134847134848134849134850134851134852134853134854134855134856134857134858134859134860134861134862134863134864134865134866134867134868134869134870134871134872134873134874134875134876134877134878134879134880134881134882134883134884134885134886134887134888134889134890134891134892134893134894134895134896134897134898134899134900134901134902134903134904134905134906134907134908134909134910134911134912134913134914134915134916134917134918134919134920134921134922134923134924134925134926134927134928134929134930134931134932134933134934134935134936134937134938134939134940134941134942134943134944134945134946134947134948134949134950134951134952134953134954134955134956134957134958134959134960134961134962134963134964134965134966134967134968134969134970134971134972134973134974134975134976134977134978134979134980134981134982134983134984134985134986134987134988134989134990134991134992134993134994134995134996134997134998134999135000135001135002135003135004135005135006135007135008135009135010135011135012135013135014135015135016135017135018135019135020135021135022135023135024135025135026135027135028135029135030135031135032135033135034135035135036135037135038135039135040135041135042135043135044135045135046135047135048135049135050135051135052135053135054135055135056135057135058135059135060135061135062135063135064135065135066135067135068135069135070135071135072135073135074135075135076135077135078135079135080135081135082135083135084135085135086135087135088135089135090135091135092135093135094135095135096135097135098135099135100135101135102135103135104135105135106135107135108135109135110135111135112135113135114135115135116135117135118135119135120135121135122135123135124135125135126135127135128135129135130135131135132135133135134135135135136135137135138135139135140135141135142135143135144135145135146135147135148135149135150135151135152135153135154135155135156135157135158135159135160135161135162135163135164135165135166135167135168135169135170135171135172135173135174135175135176135177135178135179135180135181135182135183135184135185135186135187135188135189135190135191135192135193135194135195135196135197135198135199135200135201135202135203135204135205135206135207135208135209135210135211135212135213135214135215135216135217135218135219135220135221135222135223135224135225135226135227135228135229135230135231135232135233135234135235135236135237135238135239135240135241135242135243135244135245135246135247135248135249135250135251135252135253135254135255135256135257135258135259135260135261135262135263135264135265135266135267135268135269135270135271135272135273135274135275135276135277135278135279135280135281135282135283135284135285135286135287135288135289135290135291135292135293135294135295135296135297135298135299135300135301135302135303135304135305135306135307135308135309135310135311135312135313135314135315135316135317135318135319135320135321135322135323135324135325135326135327135328135329135330135331135332135333135334135335135336135337135338135339135340135341135342135343135344135345135346135347135348135349135350135351135352135353135354135355135356135357135358135359135360135361135362135363135364135365135366135367135368135369135370135371135372135373135374135375135376135377135378135379135380135381135382135383135384135385135386135387135388135389135390135391135392135393135394135395135396135397135398135399135400135401135402135403135404135405135406135407135408135409135410135411135412135413135414135415135416135417135418135419135420135421135422135423135424135425135426135427135428135429135430135431135432135433135434135435135436135437135438135439135440135441135442135443135444135445135446135447135448135449135450135451135452135453135454135455135456135457135458135459135460135461135462135463135464135465135466135467135468135469135470135471135472135473135474135475135476135477135478135479135480135481135482135483135484135485135486135487135488135489135490135491135492135493135494135495135496135497135498135499135500135501135502135503135504135505135506135507135508135509135510135511135512135513135514135515135516135517135518135519135520135521135522135523135524135525135526135527135528135529135530135531135532135533135534135535135536135537135538135539135540135541135542135543135544135545135546135547135548135549135550135551135552135553135554135555135556135557135558135559135560135561135562135563135564135565135566135567135568135569135570135571135572135573135574135575135576135577135578135579135580135581135582135583135584135585135586135587135588135589135590135591135592135593135594135595135596135597135598135599135600135601135602135603135604135605135606135607135608135609135610135611135612135613135614135615135616135617135618135619135620135621135622135623135624135625135626135627135628135629135630135631135632135633135634135635135636135637135638135639135640135641135642135643135644135645135646135647135648135649135650135651135652135653135654135655135656135657135658135659135660135661135662135663135664135665135666135667135668135669135670135671135672135673135674135675135676135677135678135679135680135681135682135683135684135685135686135687135688135689135690135691135692135693135694135695135696135697135698135699135700135701135702135703135704135705135706135707135708135709135710135711135712135713135714135715135716135717135718135719135720135721135722135723135724135725135726135727135728135729135730135731135732135733135734135735135736135737135738135739135740135741135742135743135744135745135746135747135748135749135750135751135752135753135754135755135756135757135758135759135760135761135762135763135764135765135766135767135768135769135770135771135772135773135774135775135776135777135778135779135780135781135782135783135784135785135786135787135788135789135790135791135792135793135794135795135796135797135798135799135800135801135802135803135804135805135806135807135808135809135810135811135812135813135814135815135816135817135818135819135820135821135822135823135824135825135826135827135828135829135830135831135832135833135834135835135836135837135838135839135840135841135842135843135844135845135846135847135848135849135850135851135852135853135854135855135856135857135858135859135860135861135862135863135864135865135866135867135868135869135870135871135872135873135874135875135876135877135878135879135880135881135882135883135884135885135886135887135888135889135890135891135892135893135894135895135896135897135898135899135900135901135902135903135904135905135906135907135908135909135910135911135912135913135914135915135916135917135918135919135920135921135922135923135924135925135926135927135928135929135930135931135932135933135934135935135936135937135938135939135940135941135942135943135944135945135946135947135948135949135950135951135952135953135954135955135956135957135958135959135960135961135962135963135964135965135966135967135968135969135970135971135972135973135974135975135976135977135978135979135980135981135982135983135984135985135986135987135988135989135990135991135992135993135994135995135996135997135998135999136000136001136002136003136004136005136006136007136008136009136010136011136012136013136014136015136016136017136018136019136020136021136022136023136024136025136026136027136028136029136030136031136032136033136034136035136036136037136038136039136040136041136042136043136044136045136046136047136048136049136050136051136052136053136054136055136056136057136058136059136060136061136062136063136064136065136066136067136068136069136070136071136072136073136074136075136076136077136078136079136080136081136082136083136084136085136086136087136088136089136090136091136092136093136094136095136096136097136098136099136100136101136102136103136104136105136106136107136108136109136110136111136112136113136114136115136116136117136118136119136120136121136122136123136124136125136126136127136128136129136130136131136132136133136134136135136136136137136138136139136140136141136142136143136144136145136146136147136148136149136150136151136152136153136154136155136156136157136158136159136160136161136162136163136164136165136166136167136168136169136170136171136172136173136174136175136176136177136178136179136180136181136182136183136184136185136186136187136188136189136190136191136192136193136194136195136196136197136198136199136200136201136202136203136204136205136206136207136208136209136210136211136212136213136214136215136216136217136218136219136220136221136222136223136224136225136226136227136228136229136230136231136232136233136234136235136236136237136238136239136240136241136242136243136244136245136246136247136248136249136250136251136252136253136254136255136256136257136258136259136260136261136262136263136264136265136266136267136268136269136270136271136272136273136274136275136276136277136278136279136280136281136282136283136284136285136286136287136288136289136290136291136292136293136294136295136296136297136298136299136300136301136302136303136304136305136306136307136308136309136310136311136312136313136314136315136316136317136318136319136320136321136322136323136324136325136326136327136328136329136330136331136332136333136334136335136336136337136338136339136340136341136342136343136344136345136346136347136348136349136350136351136352136353136354136355136356136357136358136359136360136361136362136363136364136365136366136367136368136369136370136371136372136373136374136375136376136377136378136379136380136381136382136383136384136385136386136387136388136389136390136391136392136393136394136395136396136397136398136399136400136401136402136403136404136405136406136407136408136409136410136411136412136413136414136415136416136417136418136419136420136421136422136423136424136425136426136427136428136429136430136431136432136433136434136435136436136437136438136439136440136441136442136443136444136445136446136447136448136449136450136451136452136453136454136455136456136457136458136459136460136461136462136463136464136465136466136467136468136469136470136471136472136473136474136475136476136477136478136479136480136481136482136483136484136485136486136487136488136489136490136491136492136493136494136495136496136497136498136499136500136501136502136503136504136505136506136507136508136509136510136511136512136513136514136515136516136517136518136519136520136521136522136523136524136525136526136527136528136529136530136531136532136533136534136535136536136537136538136539136540136541136542136543136544136545136546136547136548136549136550136551136552136553136554136555136556136557136558136559136560136561136562136563136564136565136566136567136568136569136570136571136572136573136574136575136576136577136578136579136580136581136582136583136584136585136586136587136588136589136590136591136592136593136594136595136596136597136598136599136600136601136602136603136604136605136606136607136608136609136610136611136612136613136614136615136616136617136618136619136620136621136622136623136624136625136626136627136628136629136630136631136632136633136634136635136636136637136638136639136640136641136642136643136644136645136646136647136648136649136650136651136652136653136654136655136656136657136658136659136660136661136662136663136664136665136666136667136668136669136670136671136672136673136674136675136676136677136678136679136680136681136682136683136684136685136686136687136688136689136690136691136692136693136694136695136696136697136698136699136700136701136702136703136704136705136706136707136708136709136710136711136712136713136714136715136716136717136718136719136720136721136722136723136724136725136726136727136728136729136730136731136732136733136734136735136736136737136738136739136740136741136742136743136744136745136746136747136748136749136750136751136752136753136754136755136756136757136758136759136760136761136762136763136764136765136766136767136768136769136770136771136772136773136774136775136776136777136778136779136780136781136782136783136784136785136786136787136788136789136790136791136792136793136794136795136796136797136798136799136800136801136802136803136804136805136806136807136808136809136810136811136812136813136814136815136816136817136818136819136820136821136822136823136824136825136826136827136828136829136830136831136832136833136834136835136836136837136838136839136840136841136842136843136844136845136846136847136848136849136850136851136852136853136854136855136856136857136858136859136860136861136862136863136864136865136866136867136868136869136870136871136872136873136874136875136876136877136878136879136880136881136882136883136884136885136886136887136888136889136890136891136892136893136894136895136896136897136898136899136900136901136902136903136904136905136906136907136908136909136910136911136912136913136914136915136916136917136918136919136920136921136922136923136924136925136926136927136928136929136930136931136932136933136934136935136936136937136938136939136940136941136942136943136944136945136946136947136948136949136950136951136952136953136954136955136956136957136958136959136960136961136962136963136964136965136966136967136968136969136970136971136972136973136974136975136976136977136978136979136980136981136982136983136984136985136986136987136988136989136990136991136992136993136994136995136996136997136998136999137000137001137002137003137004137005137006137007137008137009137010137011137012137013137014137015137016137017137018137019137020137021137022137023137024137025137026137027137028137029137030137031137032137033137034137035137036137037137038137039137040137041137042137043137044137045137046137047137048137049137050137051137052137053137054137055137056137057137058137059137060137061137062137063137064137065137066137067137068137069137070137071137072137073137074137075137076137077137078137079137080137081137082137083137084137085137086137087137088137089137090137091137092137093137094137095137096137097137098137099137100137101137102137103137104137105137106137107137108137109137110137111137112137113137114137115137116137117137118137119137120137121137122137123137124137125137126137127137128137129137130137131137132137133137134137135137136137137137138137139137140137141137142137143137144137145137146137147137148137149137150137151137152137153137154137155137156137157137158137159137160137161137162137163137164137165137166137167137168137169137170137171137172137173137174137175137176137177137178137179137180137181137182137183137184137185137186137187137188137189137190137191137192137193137194137195137196137197137198137199137200137201137202137203137204137205137206137207137208137209137210137211137212137213137214137215137216137217137218137219137220137221137222137223137224137225137226137227137228137229137230137231137232137233137234137235137236137237137238137239137240137241137242137243137244137245137246137247137248137249137250137251137252137253137254137255137256137257137258137259137260137261137262137263137264137265137266137267137268137269137270137271137272137273137274137275137276137277137278137279137280137281137282137283137284137285137286137287137288137289137290137291137292137293137294137295137296137297137298137299137300137301137302137303137304137305137306137307137308137309137310137311137312137313137314137315137316137317137318137319137320137321137322137323137324137325137326137327137328137329137330137331137332137333137334137335137336137337137338137339137340137341137342137343137344137345137346137347137348137349137350137351137352137353137354137355137356137357137358137359137360137361137362137363137364137365137366137367137368137369137370137371137372137373137374137375137376137377137378137379137380137381137382137383137384137385137386137387137388137389137390137391137392137393137394137395137396137397137398137399137400137401137402137403137404137405137406137407137408137409137410137411137412137413137414137415137416137417137418137419137420137421137422137423137424137425137426137427137428137429137430137431137432137433137434137435137436137437137438137439137440137441137442137443137444137445137446137447137448137449137450137451137452137453137454137455137456137457137458137459137460137461137462137463137464137465137466137467137468137469137470137471137472137473137474137475137476137477137478137479137480137481137482137483137484137485137486137487137488137489137490137491137492137493137494137495137496137497137498137499137500137501137502137503137504137505137506137507137508137509137510137511137512137513137514137515137516137517137518137519137520137521137522137523137524137525137526137527137528137529137530137531137532137533137534137535137536137537137538137539137540137541137542137543137544137545137546137547137548137549137550137551137552137553137554137555137556137557137558137559137560137561137562137563137564137565137566137567137568137569137570137571137572137573137574137575137576137577137578137579137580137581137582137583137584137585137586137587137588137589137590137591137592137593137594137595137596137597137598137599137600137601137602137603137604137605137606137607137608137609137610137611137612137613137614137615137616137617137618137619137620137621137622137623137624137625137626137627137628137629137630137631137632137633137634137635137636137637137638137639137640137641137642137643137644137645137646137647137648137649137650137651137652137653137654137655137656137657137658137659137660137661137662137663137664137665137666137667137668137669137670137671137672137673137674137675137676137677137678137679137680137681137682137683137684137685137686137687137688137689137690137691137692137693137694137695137696137697137698137699137700137701137702137703137704137705137706137707137708137709137710137711137712137713137714137715137716137717137718137719137720137721137722137723137724137725137726137727137728137729137730137731137732137733137734137735137736137737137738137739137740137741137742137743137744137745137746137747137748137749137750137751137752137753137754137755137756137757137758137759137760137761137762137763137764137765137766137767137768137769137770137771137772137773137774137775137776137777137778137779137780137781137782137783137784137785137786137787137788137789137790137791137792137793137794137795137796137797137798137799137800137801137802137803137804137805137806137807137808137809137810137811137812137813137814137815137816137817137818137819137820137821137822137823137824137825137826137827137828137829137830137831137832137833137834137835137836137837137838137839137840137841137842137843137844137845137846137847137848137849137850137851137852137853137854137855137856137857137858137859137860137861137862137863137864137865137866137867137868137869137870137871137872137873137874137875137876137877137878137879137880137881137882137883137884137885137886137887137888137889137890137891137892137893137894137895137896137897137898137899137900137901137902137903137904137905137906137907137908137909137910137911137912137913137914137915137916137917137918137919137920137921137922137923137924137925137926137927137928137929137930137931137932137933137934137935137936137937137938137939137940137941137942137943137944137945137946137947137948137949137950137951137952137953137954137955137956137957137958137959137960137961137962137963137964137965137966137967137968137969137970137971137972137973137974137975137976137977137978137979137980137981137982137983137984137985137986137987137988137989137990137991137992137993137994137995137996137997137998137999138000138001138002138003138004138005138006138007138008138009138010138011138012138013138014138015138016138017138018138019138020138021138022138023138024138025138026138027138028138029138030138031138032138033138034138035138036138037138038138039138040138041138042138043138044138045138046138047138048138049138050138051138052138053138054138055138056138057138058138059138060138061138062138063138064138065138066138067138068138069138070138071138072138073138074138075138076138077138078138079138080138081138082138083138084138085138086138087138088138089138090138091138092138093138094138095138096138097138098138099138100138101138102138103138104138105138106138107138108138109138110138111138112138113138114138115138116138117138118138119138120138121138122138123138124138125138126138127138128138129138130138131138132138133138134138135138136138137138138138139138140138141138142138143138144138145138146138147138148138149138150138151138152138153138154138155138156138157138158138159138160138161138162138163138164138165138166138167138168138169138170138171138172138173138174138175138176138177138178138179138180138181138182138183138184138185138186138187138188138189138190138191138192138193138194138195138196138197138198138199138200138201138202138203138204138205138206138207138208138209138210138211138212138213138214138215138216138217138218138219138220138221138222138223138224138225138226138227138228138229138230138231138232138233138234138235138236138237138238138239138240138241138242138243138244138245138246138247138248138249138250138251138252138253138254138255138256138257138258138259138260138261138262138263138264138265138266138267138268138269138270138271138272138273138274138275138276138277138278138279138280138281138282138283138284138285138286138287138288138289138290138291138292138293138294138295138296138297138298138299138300138301138302138303138304138305138306138307138308138309138310138311138312138313138314138315138316138317138318138319138320138321138322138323138324138325138326138327138328138329138330138331138332138333138334138335138336138337138338138339138340138341138342138343138344138345138346138347138348138349138350138351138352138353138354138355138356138357138358138359138360138361138362138363138364138365138366138367138368138369138370138371138372138373138374138375138376138377138378138379138380138381138382138383138384138385138386138387138388138389138390138391138392138393138394138395138396138397138398138399138400138401138402138403138404138405138406138407138408138409138410138411138412138413138414138415138416138417138418138419138420138421138422138423138424138425138426138427138428138429138430138431138432138433138434138435138436138437138438138439138440138441138442138443138444138445138446138447138448138449138450138451138452138453138454138455138456138457138458138459138460138461138462138463138464138465138466138467138468138469138470138471138472138473138474138475138476138477138478138479138480138481138482138483138484138485138486138487138488138489138490138491138492138493138494138495138496138497138498138499138500138501138502138503138504138505138506138507138508138509138510138511138512138513138514138515138516138517138518138519138520138521138522138523138524138525138526138527138528138529138530138531138532138533138534138535138536138537138538138539138540138541138542138543138544138545138546138547138548138549138550138551138552138553138554138555138556138557138558138559138560138561138562138563138564138565138566138567138568138569138570138571138572138573138574138575138576138577138578138579138580138581138582138583138584138585138586138587138588138589138590138591138592138593138594138595138596138597138598138599138600138601138602138603138604138605138606138607138608138609138610138611138612138613138614138615138616138617138618138619138620138621138622138623138624138625138626138627138628138629138630138631138632138633138634138635138636138637138638138639138640138641138642138643138644138645138646138647138648138649138650138651138652138653138654138655138656138657138658138659138660138661138662138663138664138665138666138667138668138669138670138671138672138673138674138675138676138677138678138679138680138681138682138683138684138685138686138687138688138689138690138691138692138693138694138695138696138697138698138699138700138701138702138703138704138705138706138707138708138709138710138711138712138713138714138715138716138717138718138719138720138721138722138723138724138725138726138727138728138729138730138731138732138733138734138735138736138737138738138739138740138741138742138743138744138745138746138747138748138749138750138751138752138753138754138755138756138757138758138759138760138761138762138763138764138765138766138767138768138769138770138771138772138773138774138775138776138777138778138779138780138781138782138783138784138785138786138787138788138789138790138791138792138793138794138795138796138797138798138799138800138801138802138803138804138805138806138807138808138809138810138811138812138813138814138815138816138817138818138819138820138821138822138823138824138825138826138827138828138829138830138831138832138833138834138835138836138837138838138839138840138841138842138843138844138845138846138847138848138849138850138851138852138853138854138855138856138857138858138859138860138861138862138863138864138865138866138867138868138869138870138871138872138873138874138875138876138877138878138879138880138881138882138883138884138885138886138887138888138889138890138891138892138893138894138895138896138897138898138899138900138901138902138903138904138905138906138907138908138909138910138911138912138913138914138915138916138917138918138919138920138921138922138923138924138925138926138927138928138929138930138931138932138933138934138935138936138937138938138939138940138941138942138943138944138945138946138947138948138949138950138951138952138953138954138955138956138957138958138959138960138961138962138963138964138965138966138967138968138969138970138971138972138973138974138975138976138977138978138979138980138981138982138983138984138985138986138987138988138989138990138991138992138993138994138995138996138997138998138999139000139001139002139003139004139005139006139007139008139009139010139011139012139013139014139015139016139017139018139019139020139021139022139023139024139025139026139027139028139029139030139031139032139033139034139035139036139037139038139039139040139041139042139043139044139045139046139047139048139049139050139051139052139053139054139055139056139057139058139059139060139061139062139063139064139065139066139067139068139069139070139071139072139073139074139075139076139077139078139079139080139081139082139083139084139085139086139087139088139089139090139091139092139093139094139095139096139097139098139099139100139101139102139103139104139105139106139107139108139109139110139111139112139113139114139115139116139117139118139119139120139121139122139123139124139125139126139127139128139129139130139131139132139133139134139135139136139137139138139139139140139141139142139143139144139145139146139147139148139149139150139151139152139153139154139155139156139157139158139159139160139161139162139163139164139165139166139167139168139169139170139171139172139173139174139175139176139177139178139179139180139181139182139183139184139185139186139187139188139189139190139191139192139193139194139195139196139197139198139199139200139201139202139203139204139205139206139207139208139209139210139211139212139213139214139215139216139217139218139219139220139221139222139223139224139225139226139227139228139229139230139231139232139233139234139235139236139237139238139239139240139241139242139243139244139245139246139247139248139249139250139251139252139253139254139255139256139257139258139259139260139261139262139263139264139265139266139267139268139269139270139271139272139273139274139275139276139277139278139279139280139281139282139283139284139285139286139287139288139289139290139291139292139293139294139295139296139297139298139299139300139301139302139303139304139305139306139307139308139309139310139311139312139313139314139315139316139317139318139319139320139321139322139323139324139325139326139327139328139329139330139331139332139333139334139335139336139337139338139339139340139341139342139343139344139345139346139347139348139349139350139351139352139353139354139355139356139357139358139359139360139361139362139363139364139365139366139367139368139369139370139371139372139373139374139375139376139377139378139379139380139381139382139383139384139385139386139387139388139389139390139391139392139393139394139395139396139397139398139399139400139401139402139403139404139405139406139407139408139409139410139411139412139413139414139415139416139417139418139419139420139421139422139423139424139425139426139427139428139429139430139431139432139433139434139435139436139437139438139439139440139441139442139443139444139445139446139447139448139449139450139451139452139453139454139455139456139457139458139459139460139461139462139463139464139465139466139467139468139469139470139471139472139473139474139475139476139477139478139479139480139481139482139483139484139485139486139487139488139489139490139491139492139493139494139495139496139497139498139499139500139501139502139503139504139505139506139507139508139509139510139511139512139513139514139515139516139517139518139519139520139521139522139523139524139525139526139527139528139529139530139531139532139533139534139535139536139537139538139539139540139541139542139543139544139545139546139547139548139549139550139551139552139553139554139555139556139557139558139559139560139561139562139563139564139565139566139567139568139569139570139571139572139573139574139575139576139577139578139579139580139581139582139583139584139585139586139587139588139589139590139591139592139593139594139595139596139597139598139599139600139601139602139603139604139605139606139607139608139609139610139611139612139613139614139615139616139617139618139619139620139621139622139623139624139625139626139627139628139629139630139631139632139633139634139635139636139637139638139639139640139641139642139643139644139645139646139647139648139649139650139651139652139653139654139655139656139657139658139659139660139661139662139663139664139665139666139667139668139669139670139671139672139673139674139675139676139677139678139679139680139681139682139683139684139685139686139687139688139689139690139691139692139693139694139695139696139697139698139699139700139701139702139703139704139705139706139707139708139709139710139711139712139713139714139715139716139717139718139719139720139721139722139723139724139725139726139727139728139729139730139731139732139733139734139735139736139737139738139739139740139741139742139743139744139745139746139747139748139749139750139751139752139753139754139755139756139757139758139759139760139761139762139763139764139765139766139767139768139769139770139771139772139773139774139775139776139777139778139779139780139781139782139783139784139785139786139787139788139789139790139791139792139793139794139795139796139797139798139799139800139801139802139803139804139805139806139807139808139809139810139811139812139813139814139815139816139817139818139819139820139821139822139823139824139825139826139827139828139829139830139831139832139833139834139835139836139837139838139839139840139841139842139843139844139845139846139847139848139849139850139851139852139853139854139855139856139857139858139859139860139861139862139863139864139865139866139867139868139869139870139871139872139873139874139875139876139877139878139879139880139881139882139883139884139885139886139887139888139889139890139891139892139893139894139895139896139897139898139899139900139901139902139903139904139905139906139907139908139909139910139911139912139913139914139915139916139917139918139919139920139921139922139923139924139925139926139927139928139929139930139931139932139933139934139935139936139937139938139939139940139941139942139943139944139945139946139947139948139949139950139951139952139953139954139955139956139957139958139959139960139961139962139963139964139965139966139967139968139969139970139971139972139973139974139975139976139977139978139979139980139981139982139983139984139985139986139987139988139989139990139991139992139993139994139995139996139997139998139999140000140001140002140003140004140005140006140007140008140009140010140011140012140013140014140015140016140017140018140019140020140021140022140023140024140025140026140027140028140029140030140031140032140033140034140035140036140037140038140039140040140041140042140043140044140045140046140047140048140049140050140051140052140053140054140055140056140057140058140059140060140061140062140063140064140065140066140067140068140069140070140071140072140073140074140075140076140077140078140079140080140081140082140083140084140085140086140087140088140089140090140091140092140093140094140095140096140097140098140099140100140101140102140103140104140105140106140107140108140109140110140111140112140113140114140115140116140117140118140119140120140121140122140123140124140125140126140127140128140129140130140131140132140133140134140135140136140137140138140139140140140141140142140143140144140145140146140147140148140149140150140151140152140153140154140155140156140157140158140159140160140161140162140163140164140165140166140167140168140169140170140171140172140173140174140175140176140177140178140179140180140181140182140183140184140185140186140187140188140189140190140191140192140193140194140195140196140197140198140199140200140201140202140203140204140205140206140207140208140209140210140211140212140213140214140215140216140217140218140219140220140221140222140223140224140225140226140227140228140229140230140231140232140233140234140235140236140237140238140239140240140241140242140243140244140245140246140247140248140249140250140251140252140253140254140255140256140257140258140259140260140261140262140263140264140265140266140267140268140269140270140271140272140273140274140275140276140277140278140279140280140281140282140283140284140285140286140287140288140289140290140291140292140293140294140295140296140297140298140299140300140301140302140303140304140305140306140307140308140309140310140311140312140313140314140315140316140317140318140319140320140321140322140323140324140325140326140327140328140329140330140331140332140333140334140335140336140337140338140339140340140341140342140343140344140345140346140347140348140349140350140351140352140353140354140355140356140357140358140359140360140361140362140363140364140365140366140367140368140369140370140371140372140373140374140375140376140377140378140379140380140381140382140383140384140385140386140387140388140389140390140391140392140393140394140395140396140397140398140399140400140401140402140403140404140405140406140407140408140409140410140411140412140413140414140415140416140417140418140419140420140421140422140423140424140425140426140427140428140429140430140431140432140433140434140435140436140437140438140439140440140441140442140443140444140445140446140447140448140449140450140451140452140453140454140455140456140457140458140459140460140461140462140463140464140465140466140467140468140469140470140471140472140473140474140475140476140477140478140479140480140481140482140483140484140485140486140487140488140489140490140491140492140493140494140495140496140497140498140499140500140501140502140503140504140505140506140507140508140509140510140511140512140513140514140515140516140517140518140519140520140521140522140523140524140525140526140527140528140529140530140531140532140533140534140535140536140537140538140539140540140541140542140543140544140545140546140547140548140549140550140551140552140553140554140555140556140557140558140559140560140561140562140563140564140565140566140567140568140569140570140571140572140573140574140575140576140577140578140579140580140581140582140583140584140585140586140587140588140589140590140591140592140593140594140595140596140597140598140599140600140601140602140603140604140605140606140607140608140609140610140611140612140613140614140615140616140617140618140619140620140621140622140623140624140625140626140627140628140629140630140631140632140633140634140635140636140637140638140639140640140641140642140643140644140645140646140647140648140649140650140651140652140653140654140655140656140657140658140659140660140661140662140663140664140665140666140667140668140669140670140671140672140673140674140675140676140677140678140679140680140681140682140683140684140685140686140687140688140689140690140691140692140693140694140695140696140697140698140699140700140701140702140703140704140705140706140707140708140709140710140711140712140713140714140715140716140717140718140719140720140721140722140723140724140725140726140727140728140729140730140731140732140733140734140735140736140737140738140739140740140741140742140743140744140745140746140747140748140749140750140751140752140753140754140755140756140757140758140759140760140761140762140763140764140765140766140767140768140769140770140771140772140773140774140775140776140777140778140779140780140781140782140783140784140785140786140787140788140789140790140791140792140793140794140795140796140797140798140799140800140801140802140803140804140805140806140807140808140809140810140811140812140813140814140815140816140817140818140819140820140821140822140823140824140825140826140827140828140829140830140831140832140833140834140835140836140837140838140839140840140841140842140843140844140845140846140847140848140849140850140851140852140853140854140855140856140857140858140859140860140861140862140863140864140865140866140867140868140869140870140871140872140873140874140875140876140877140878140879140880140881140882140883140884140885140886140887140888140889140890140891140892140893140894140895140896140897140898140899140900140901140902140903140904140905140906140907140908140909140910140911140912140913140914140915140916140917140918140919140920140921140922140923140924140925140926140927140928140929140930140931140932140933140934140935140936140937140938140939140940140941140942140943140944140945140946140947140948140949140950140951140952140953140954140955140956140957140958140959140960140961140962140963140964140965140966140967140968140969140970140971140972140973140974140975140976140977140978140979140980140981140982140983140984140985140986140987140988140989140990140991140992140993140994140995140996140997140998140999141000141001141002141003141004141005141006141007141008141009141010141011141012141013141014141015141016141017141018141019141020141021141022141023141024141025141026141027141028141029141030141031141032141033141034141035141036141037141038141039141040141041141042141043141044141045141046141047141048141049141050141051141052141053141054141055141056141057141058141059141060141061141062141063141064141065141066141067141068141069141070141071141072141073141074141075141076141077141078141079141080141081141082141083141084141085141086141087141088141089141090141091141092141093141094141095141096141097141098141099141100141101141102141103141104141105141106141107141108141109141110141111141112141113141114141115141116141117141118141119141120141121141122141123141124141125141126141127141128141129141130141131141132141133141134141135141136141137141138141139141140141141141142141143141144141145141146141147141148141149141150141151141152141153141154141155141156141157141158141159141160141161141162141163141164141165141166141167141168141169141170141171141172141173141174141175141176141177141178141179141180141181141182141183141184141185141186141187141188141189141190141191141192141193141194141195141196141197141198141199141200141201141202141203141204141205141206141207141208141209141210141211141212141213141214141215141216141217141218141219141220141221141222141223141224141225141226141227141228141229141230141231141232141233141234141235141236141237141238141239141240141241141242141243141244141245141246141247141248141249141250141251141252141253141254141255141256141257141258141259141260141261141262141263141264141265141266141267141268141269141270141271141272141273141274141275141276141277141278141279141280141281141282141283141284141285141286141287141288141289141290141291141292141293141294141295141296141297141298141299141300141301141302141303141304141305141306141307141308141309141310141311141312141313141314141315141316141317141318141319141320141321141322141323141324141325141326141327141328141329141330141331141332141333141334141335141336141337141338141339141340141341141342141343141344141345141346141347141348141349141350141351141352141353141354141355141356141357141358141359141360141361141362141363141364141365141366141367141368141369141370141371141372141373141374141375141376141377141378141379141380141381141382141383141384141385141386141387141388141389141390141391141392141393141394141395141396141397141398141399141400141401141402141403141404141405141406141407141408141409141410141411141412141413141414141415141416141417141418141419141420141421141422141423141424141425141426141427141428141429141430141431141432141433141434141435141436141437141438141439141440141441141442141443141444141445141446141447141448141449141450141451141452141453141454141455141456141457141458141459141460141461141462141463141464141465141466141467141468141469141470141471141472141473141474141475141476141477141478141479141480141481141482141483141484141485141486141487141488141489141490141491141492141493141494141495141496141497141498141499141500141501141502141503141504141505141506141507141508141509141510141511141512141513141514141515141516141517141518141519141520141521141522141523141524141525141526141527141528141529141530141531141532141533141534141535141536141537141538141539141540141541141542141543141544141545141546141547141548141549141550141551141552141553141554141555141556141557141558141559141560141561141562141563141564141565141566141567141568141569141570141571141572141573141574141575141576141577141578141579141580141581141582141583141584141585141586141587141588141589141590141591141592141593141594141595141596141597141598141599141600141601141602141603141604141605141606141607141608141609141610141611141612141613141614141615141616141617141618141619141620141621141622141623141624141625141626141627141628141629141630141631141632141633141634141635141636141637141638141639141640141641141642141643141644141645141646141647141648141649141650141651141652141653141654141655141656141657141658141659141660141661141662141663141664141665141666141667141668141669141670141671141672141673141674141675141676141677141678141679141680141681141682141683141684141685141686141687141688141689141690141691141692141693141694141695141696141697141698141699141700141701141702141703141704141705141706141707141708141709141710141711141712141713141714141715141716141717141718141719141720141721141722141723141724141725141726141727141728141729141730141731141732141733141734141735141736141737141738141739141740141741141742141743141744141745141746141747141748141749141750141751141752141753141754141755141756141757141758141759141760141761141762141763141764141765141766141767141768141769141770141771141772141773141774141775141776141777141778141779141780141781141782141783141784141785141786141787141788141789141790141791141792141793141794141795141796141797141798141799141800141801141802141803141804141805141806141807141808141809141810141811141812141813141814141815141816141817141818141819141820141821141822141823141824141825141826141827141828141829141830141831141832141833141834141835141836141837141838141839141840141841141842141843141844141845141846141847141848141849141850141851141852141853141854141855141856141857141858141859141860141861141862141863141864141865141866141867141868141869141870141871141872141873141874141875141876141877141878141879141880141881141882141883141884141885141886141887141888141889141890141891141892141893141894141895141896141897141898141899141900141901141902141903141904141905141906141907141908141909141910141911141912141913141914141915141916141917141918141919141920141921141922141923141924141925141926141927141928141929141930141931141932141933141934141935141936141937141938141939141940141941141942141943141944141945141946141947141948141949141950141951141952141953141954141955141956141957141958141959141960141961141962141963141964141965141966141967141968141969141970141971141972141973141974141975141976141977141978141979141980141981141982141983141984141985141986141987141988141989141990141991141992141993141994141995141996141997141998141999142000142001142002142003142004142005142006142007142008142009142010142011142012142013142014142015142016142017142018142019142020142021142022142023142024142025142026142027142028142029142030142031142032142033142034142035142036142037142038142039142040142041142042142043142044142045142046142047142048142049142050142051142052142053142054142055142056142057142058142059142060142061142062142063142064142065142066142067142068142069142070142071142072142073142074142075142076142077142078142079142080142081142082142083142084142085142086142087142088142089142090142091142092142093142094142095142096142097142098142099142100142101142102142103142104142105142106142107142108142109142110142111142112142113142114142115142116142117142118142119142120142121142122142123142124142125142126142127142128142129142130142131142132142133142134142135142136142137142138142139142140142141142142142143142144142145142146142147142148142149142150142151142152142153142154142155142156142157142158142159142160142161142162142163142164142165142166142167142168142169142170142171142172142173142174142175142176142177142178142179142180142181142182142183142184142185142186142187142188142189142190142191142192142193142194142195142196142197142198142199142200142201142202142203142204142205142206142207142208142209142210142211142212142213142214142215142216142217142218142219142220142221142222142223142224142225142226142227142228142229142230142231142232142233142234142235142236142237142238142239142240142241142242142243142244142245142246142247142248142249142250142251142252142253142254142255142256142257142258142259142260142261142262142263142264142265142266142267142268142269142270142271142272142273142274142275142276142277142278142279142280142281142282142283142284142285142286142287142288142289142290142291142292142293142294142295142296142297142298142299142300142301142302142303142304142305142306142307142308142309142310142311142312142313142314142315142316142317142318142319142320142321142322142323142324142325142326142327142328142329142330142331142332142333142334142335142336142337142338142339142340142341142342142343142344142345142346142347142348142349142350142351142352142353142354142355142356142357142358142359142360142361142362142363142364142365142366142367142368142369142370142371142372142373142374142375142376142377142378142379142380142381142382142383142384142385142386142387142388142389142390142391142392142393142394142395142396142397142398142399142400142401142402142403142404142405142406142407142408142409142410142411142412142413142414142415142416142417142418142419142420142421142422142423142424142425142426142427142428142429142430142431142432142433142434142435142436142437142438142439142440142441142442142443142444142445142446142447142448142449142450142451142452142453142454142455142456142457142458142459142460142461142462142463142464142465142466142467142468142469142470142471142472142473142474142475142476142477142478142479142480142481142482142483142484142485142486142487142488142489142490142491142492142493142494142495142496142497142498142499142500142501142502142503142504142505142506142507142508142509142510142511142512142513142514142515142516142517142518142519142520142521142522142523142524142525142526142527142528142529142530142531142532142533142534142535142536142537142538142539142540142541142542142543142544142545142546142547142548142549142550142551142552142553142554142555142556142557142558142559142560142561142562142563142564142565142566142567142568142569142570142571142572142573142574142575142576142577142578142579142580142581142582142583142584142585142586142587142588142589142590142591142592142593142594142595142596142597142598142599142600142601142602142603142604142605142606142607142608142609142610142611142612142613142614142615142616142617142618142619142620142621142622142623142624142625142626142627142628142629142630142631142632142633142634142635142636142637142638142639142640142641142642142643142644142645142646142647142648142649142650142651142652142653142654142655142656142657142658142659142660142661142662142663142664142665142666142667142668142669142670142671142672142673142674142675142676142677142678142679142680142681142682142683142684142685142686142687142688142689142690142691142692142693142694142695142696142697142698142699142700142701142702142703142704142705142706142707142708142709142710142711142712142713142714142715142716142717142718142719142720142721142722142723142724142725142726142727142728142729142730142731142732142733142734142735142736142737142738142739142740142741142742142743142744142745142746142747142748142749142750142751142752142753142754142755142756142757142758142759142760142761142762142763142764142765142766142767142768142769142770142771142772142773142774142775142776142777142778142779142780142781142782142783142784142785142786142787142788142789142790142791142792142793142794142795142796142797142798142799142800142801142802142803142804142805142806142807142808142809142810142811142812142813142814142815142816142817142818142819142820142821142822142823142824142825142826142827142828142829142830142831142832142833142834142835142836142837142838142839142840142841142842142843142844142845142846142847142848142849142850142851142852142853142854142855142856142857142858142859142860142861142862142863142864142865142866142867142868142869142870142871142872142873142874142875142876142877142878142879142880142881142882142883142884142885142886142887142888142889142890142891142892142893142894142895142896142897142898142899142900142901142902142903142904142905142906142907142908142909142910142911142912142913142914142915142916142917142918142919142920142921142922142923142924142925142926142927142928142929142930142931142932142933142934142935142936142937142938142939142940142941142942142943142944142945142946142947142948142949142950142951142952142953142954142955142956142957142958142959142960142961142962142963142964142965142966142967142968142969142970142971142972142973142974142975142976142977142978142979142980142981142982142983142984142985142986142987142988142989142990142991142992142993142994142995142996142997142998142999143000143001143002143003143004143005143006143007143008143009143010143011143012143013143014143015143016143017143018143019143020143021143022143023143024143025143026143027143028143029143030143031143032143033143034143035143036143037143038143039143040143041143042143043143044143045143046143047143048143049143050143051143052143053143054143055143056143057143058143059143060143061143062143063143064143065143066143067143068143069143070143071143072143073143074143075143076143077143078143079143080143081143082143083143084143085143086143087143088143089143090143091143092143093143094143095143096143097143098143099143100143101143102143103143104143105143106143107143108143109143110143111143112143113143114143115143116143117143118143119143120143121143122143123143124143125143126143127143128143129143130143131143132143133143134143135143136143137143138143139143140143141143142143143143144143145143146143147143148143149143150143151143152143153143154143155143156143157143158143159143160143161143162143163143164143165143166143167143168143169143170143171143172143173143174143175143176143177143178143179143180143181143182143183143184143185143186143187143188143189143190143191143192143193143194143195143196143197143198143199143200143201143202143203143204143205143206143207143208143209143210143211143212143213143214143215143216143217143218143219143220143221143222143223143224143225143226143227143228143229143230143231143232143233143234143235143236143237143238143239143240143241143242143243143244143245143246143247143248143249143250143251143252143253143254143255143256143257143258143259143260143261143262143263143264143265143266143267143268143269143270143271143272143273143274143275143276143277143278143279143280143281143282143283143284143285143286143287143288143289143290143291143292143293143294143295143296143297143298143299143300143301143302143303143304143305143306143307143308143309143310143311143312143313143314143315143316143317143318143319143320143321143322143323143324143325143326143327143328143329143330143331143332143333143334143335143336143337143338143339143340143341143342143343143344143345143346143347143348143349143350143351143352143353143354143355143356143357143358143359143360143361143362143363143364143365143366143367143368143369143370143371143372143373143374143375143376143377143378143379143380143381143382143383143384143385143386143387143388143389143390143391143392143393143394143395143396143397143398143399143400143401143402143403143404143405143406143407143408143409143410143411143412143413143414143415143416143417143418143419143420143421143422143423143424143425143426143427143428143429143430143431143432143433143434143435143436143437143438143439143440143441143442143443143444143445143446143447143448143449143450143451143452143453143454143455143456143457143458143459143460143461143462143463143464143465143466143467143468143469143470143471143472143473143474143475143476143477143478143479143480143481143482143483143484143485143486143487143488143489143490143491143492143493143494143495143496143497143498143499143500143501143502143503143504143505143506143507143508143509143510143511143512143513143514143515143516143517143518143519143520143521143522143523143524143525143526143527143528143529143530143531143532143533143534143535143536143537143538143539143540143541143542143543143544143545143546143547143548143549143550143551143552143553143554143555143556143557143558143559143560143561143562143563143564143565143566143567143568143569143570143571143572143573143574143575143576143577143578143579143580143581143582143583143584143585143586143587143588143589143590143591143592143593143594143595143596143597143598143599143600143601143602143603143604143605143606143607143608143609143610143611143612143613143614143615143616143617143618143619143620143621143622143623143624143625143626143627143628143629143630143631143632143633143634143635143636143637143638143639143640143641143642143643143644143645143646143647143648143649143650143651143652143653143654143655143656143657143658143659143660143661143662143663143664143665143666143667143668143669143670143671143672143673143674143675143676143677143678143679143680143681143682143683143684143685143686143687143688143689143690143691143692143693143694143695143696143697143698143699143700143701143702143703143704143705143706143707143708143709143710143711143712143713143714143715143716143717143718143719143720143721143722143723143724143725143726143727143728143729143730143731143732143733143734143735143736143737143738143739143740143741143742143743143744143745143746143747143748143749143750143751143752143753143754143755143756143757143758143759143760143761143762143763143764143765143766143767143768143769143770143771143772143773143774143775143776143777143778143779143780143781143782143783143784143785143786143787143788143789143790143791143792143793143794143795143796143797143798143799143800143801143802143803143804143805143806143807143808143809143810143811143812143813143814143815143816143817143818143819143820143821143822143823143824143825143826143827143828143829143830143831143832143833143834143835143836143837143838143839143840143841143842143843143844143845143846143847143848143849143850143851143852143853143854143855143856143857143858143859143860143861143862143863143864143865143866143867143868143869143870143871143872143873143874143875143876143877143878143879143880143881143882143883143884143885143886143887143888143889143890143891143892143893143894143895143896143897143898143899143900143901143902143903143904143905143906143907143908143909143910143911143912143913143914143915143916143917143918143919143920143921143922143923143924143925143926143927143928143929143930143931143932143933143934143935143936143937143938143939143940143941143942143943143944143945143946143947143948143949143950143951143952143953143954143955143956143957143958143959143960143961143962143963143964143965143966143967143968143969143970143971143972143973143974143975143976143977143978143979143980143981143982143983143984143985143986143987143988143989143990143991143992143993143994143995143996143997143998143999144000144001144002144003144004144005144006144007144008144009144010144011144012144013144014144015144016144017144018144019144020144021144022144023144024144025144026144027144028144029144030144031144032144033144034144035144036144037144038144039144040144041144042144043144044144045144046144047144048144049144050144051144052144053144054144055144056144057144058144059144060144061144062144063144064144065144066144067144068144069144070144071144072144073144074144075144076144077144078144079144080144081144082144083144084144085144086144087144088144089144090144091144092144093144094144095144096144097144098144099144100144101144102144103144104144105144106144107144108144109144110144111144112144113144114144115144116144117144118144119144120144121144122144123144124144125144126144127144128144129144130144131144132144133144134144135144136144137144138144139144140144141144142144143144144144145144146144147144148144149144150144151144152144153144154144155144156144157144158144159144160144161144162144163144164144165144166144167144168144169144170144171144172144173144174144175144176144177144178144179144180144181144182144183144184144185144186144187144188144189144190144191144192144193144194144195144196144197144198144199144200144201144202144203144204144205144206144207144208144209144210144211144212144213144214144215144216144217144218144219144220144221144222144223144224144225144226144227144228144229144230144231144232144233144234144235144236144237144238144239144240144241144242144243144244144245144246144247144248144249144250144251144252144253144254144255144256144257144258144259144260144261144262144263144264144265144266144267144268144269144270144271144272144273144274144275144276144277144278144279144280144281144282144283144284144285144286144287144288144289144290144291144292144293144294144295144296144297144298144299144300144301144302144303144304144305144306144307144308144309144310144311144312144313144314144315144316144317144318144319144320144321144322144323144324144325144326144327144328144329144330144331144332144333144334144335144336144337144338144339144340144341144342144343144344144345144346144347144348144349144350144351144352144353144354144355144356144357144358144359144360144361144362144363144364144365144366144367144368144369144370144371144372144373144374144375144376144377144378144379144380144381144382144383144384144385144386144387144388144389144390144391144392144393144394144395144396144397144398144399144400144401144402144403144404144405144406144407144408144409144410144411144412144413144414144415144416144417144418144419144420144421144422144423144424144425144426144427144428144429144430144431144432144433144434144435144436144437144438144439144440144441144442144443144444144445144446144447144448144449144450144451144452144453144454144455144456144457144458144459144460144461144462144463144464144465144466144467144468144469144470144471144472144473144474144475144476144477144478144479144480144481144482144483144484144485144486144487144488144489144490144491144492144493144494144495144496144497144498144499144500144501144502144503144504144505144506144507144508144509144510144511144512144513144514144515144516144517144518144519144520144521144522144523144524144525144526144527144528144529144530144531144532144533144534144535144536144537144538144539144540144541144542144543144544144545144546144547144548144549144550144551144552144553144554144555144556144557144558144559144560144561144562144563144564144565144566144567144568144569144570144571144572144573144574144575144576144577144578144579144580144581144582144583144584144585144586144587144588144589144590144591144592144593144594144595144596144597144598144599144600144601144602144603144604144605144606144607144608144609144610144611144612144613144614144615144616144617144618144619144620144621144622144623144624144625144626144627144628144629144630144631144632144633144634144635144636144637144638144639144640144641144642144643144644144645144646144647144648144649144650144651144652144653144654144655144656144657144658144659144660144661144662144663144664144665144666144667144668144669144670144671144672144673144674144675144676144677144678144679144680144681144682144683144684144685144686144687144688144689144690144691144692144693144694144695144696144697144698144699144700144701144702144703144704144705144706144707144708144709144710144711144712144713144714144715144716144717144718144719144720144721144722144723144724144725144726144727144728144729144730144731144732144733144734144735144736144737144738144739144740144741144742144743144744144745144746144747144748144749144750144751144752144753144754144755144756144757144758144759144760144761144762144763144764144765144766144767144768144769144770144771144772144773144774144775144776144777144778144779144780144781144782144783144784144785144786144787144788144789144790144791144792144793144794144795144796144797144798144799144800144801144802144803144804144805144806144807144808144809144810144811144812144813144814144815144816144817144818144819144820144821144822144823144824144825144826144827144828144829144830144831144832144833144834144835144836144837144838144839144840144841144842144843144844144845144846144847144848144849144850144851144852144853144854144855144856144857144858144859144860144861144862144863144864144865144866144867144868144869144870144871144872144873144874144875144876144877144878144879144880144881144882144883144884144885144886144887144888144889144890144891144892144893144894144895144896144897144898144899144900144901144902144903144904144905144906144907144908144909144910144911144912144913144914144915144916144917144918144919144920144921144922144923144924144925144926144927144928144929144930144931144932144933144934144935144936144937144938144939144940144941144942144943144944144945144946144947144948144949144950144951144952144953144954144955144956144957144958144959144960144961144962144963144964144965144966144967144968144969144970144971144972144973144974144975144976144977144978144979144980144981144982144983144984144985144986144987144988144989144990144991144992144993144994144995144996144997144998144999145000145001145002145003145004145005145006145007145008145009145010145011145012145013145014145015145016145017145018145019145020145021145022145023145024145025145026145027145028145029145030145031145032145033145034145035145036145037145038145039145040145041145042145043145044145045145046145047145048145049145050145051145052145053145054145055145056145057145058145059145060145061145062145063145064145065145066145067145068145069145070145071145072145073145074145075145076145077145078145079145080145081145082145083145084145085145086145087145088145089145090145091145092145093145094145095145096145097145098145099145100145101145102145103145104145105145106145107145108145109145110145111145112145113145114145115145116145117145118145119145120145121145122145123145124145125145126145127145128145129145130145131145132145133145134145135145136145137145138145139145140145141145142145143145144145145145146145147145148145149145150145151145152145153145154145155145156145157145158145159145160145161145162145163145164145165145166145167145168145169145170145171145172145173145174145175145176145177145178145179145180145181145182145183145184145185145186145187145188145189145190145191145192145193145194145195145196145197145198145199145200145201145202145203145204145205145206145207145208145209145210145211145212145213145214145215145216145217145218145219145220145221145222145223145224145225145226145227145228145229145230145231145232145233145234145235145236145237145238145239145240145241145242145243145244145245145246145247145248145249145250145251145252145253145254145255145256145257145258145259145260145261145262145263145264145265145266145267145268145269145270145271145272145273145274145275145276145277145278145279145280145281145282145283145284145285145286145287145288145289145290145291145292145293145294145295145296145297145298145299145300145301145302145303145304145305145306145307145308145309145310145311145312145313145314145315145316145317145318145319145320145321145322145323145324145325145326145327145328145329145330145331145332145333145334145335145336145337145338145339145340145341145342145343145344145345145346145347145348145349145350145351145352145353145354145355145356145357145358145359145360145361145362145363145364145365145366145367145368145369145370145371145372145373145374145375145376145377145378145379145380145381145382145383145384145385145386145387145388145389145390145391145392145393145394145395145396145397145398145399145400145401145402145403145404145405145406145407145408145409145410145411145412145413145414145415145416145417145418145419145420145421145422145423145424145425145426145427145428145429145430145431145432145433145434145435145436145437145438145439145440145441145442145443145444145445145446145447145448145449145450145451145452145453145454145455145456145457145458145459145460145461145462145463145464145465145466145467145468145469145470145471145472145473145474145475145476145477145478145479145480145481145482145483145484145485145486145487145488145489145490145491145492145493145494145495145496145497145498145499145500145501145502145503145504145505145506145507145508145509145510145511145512145513145514145515145516145517145518145519145520145521145522145523145524145525145526145527145528145529145530145531145532145533145534145535145536145537145538145539145540145541145542145543145544145545145546145547145548145549145550145551145552145553145554145555145556145557145558145559145560145561145562145563145564145565145566145567145568145569145570145571145572145573145574145575145576145577145578145579145580145581145582145583145584145585145586145587145588145589145590145591145592145593145594145595145596145597145598145599145600145601145602145603145604145605145606145607145608145609145610145611145612145613145614145615145616145617145618145619145620145621145622145623145624145625145626145627145628145629145630145631145632145633145634145635145636145637145638145639145640145641145642145643145644145645145646145647145648145649145650145651145652145653145654145655145656145657145658145659145660145661145662145663145664145665145666145667145668145669145670145671145672145673145674145675145676145677145678145679145680145681145682145683145684145685145686145687145688145689145690145691145692145693145694145695145696145697145698145699145700145701145702145703145704145705145706145707145708145709145710145711145712145713145714145715145716145717145718145719145720145721145722145723145724145725145726145727145728145729145730145731145732145733145734145735145736145737145738145739145740145741145742145743145744145745145746145747145748145749145750145751145752145753145754145755145756145757145758145759145760145761145762145763145764145765145766145767145768145769145770145771145772145773145774145775145776145777145778145779145780145781145782145783145784145785145786145787145788145789145790145791145792145793145794145795145796145797145798145799145800145801145802145803145804145805145806145807145808145809145810145811145812145813145814145815145816145817145818145819145820145821145822145823145824145825145826145827145828145829145830145831145832145833145834145835145836145837145838145839145840145841145842145843145844145845145846145847145848145849145850145851145852145853145854145855145856145857145858145859145860145861145862145863145864145865145866145867145868145869145870145871145872145873145874145875145876145877145878145879145880145881145882145883145884145885145886145887145888145889145890145891145892145893145894145895145896145897145898145899145900145901145902145903145904145905145906145907145908145909145910145911145912145913145914145915145916145917145918145919145920145921145922145923145924145925145926145927145928145929145930145931145932145933145934145935145936145937145938145939145940145941145942145943145944145945145946145947145948145949145950145951145952145953145954145955145956145957145958145959145960145961145962145963145964145965145966145967145968145969145970145971145972145973145974145975145976145977145978145979145980145981145982145983145984145985145986145987145988145989145990145991145992145993145994145995145996145997145998145999146000146001146002146003146004146005146006146007146008146009146010146011146012146013146014146015146016146017146018146019146020146021146022146023146024146025146026146027146028146029146030146031146032146033146034146035146036146037146038146039146040146041146042146043146044146045146046146047146048146049146050146051146052146053146054146055146056146057146058146059146060146061146062146063146064146065146066146067146068146069146070146071146072146073146074146075146076146077146078146079146080146081146082146083146084146085146086146087146088146089146090146091146092146093146094146095146096146097146098146099146100146101146102146103146104146105146106146107146108146109146110146111146112146113146114146115146116146117146118146119146120146121146122146123146124146125146126146127146128146129146130146131146132146133146134146135146136146137146138146139146140146141146142146143146144146145146146146147146148146149146150146151146152146153146154146155146156146157146158146159146160146161146162146163146164146165146166146167146168146169146170146171146172146173146174146175146176146177146178146179146180146181146182146183146184146185146186146187146188146189146190146191146192146193146194146195146196146197146198146199146200146201146202146203146204146205146206146207146208146209146210146211146212146213146214146215146216146217146218146219146220146221146222146223146224146225146226146227146228146229146230146231146232146233146234146235146236146237146238146239146240146241146242146243146244146245146246146247146248146249146250146251146252146253146254146255146256146257146258146259146260146261146262146263146264146265146266146267146268146269146270146271146272146273146274146275146276146277146278146279146280146281146282146283146284146285146286146287146288146289146290146291146292146293146294146295146296146297146298146299146300146301146302146303146304146305146306146307146308146309146310146311146312146313146314146315146316146317146318146319146320146321146322146323146324146325146326146327146328146329146330146331146332146333146334146335146336146337146338146339146340146341146342146343146344146345146346146347146348146349146350146351146352146353146354146355146356146357146358146359146360146361146362146363146364146365146366146367146368146369146370146371146372146373146374146375146376146377146378146379146380146381146382146383146384146385146386146387146388146389146390146391146392146393146394146395146396146397146398146399146400146401146402146403146404146405146406146407146408146409146410146411146412146413146414146415146416146417146418146419146420146421146422146423146424146425146426146427146428146429146430146431146432146433146434146435146436146437146438146439146440146441146442146443146444146445146446146447146448146449146450146451146452146453146454146455146456146457146458146459146460146461146462146463146464146465146466146467146468146469146470146471146472146473146474146475146476146477146478146479146480146481146482146483146484146485146486146487146488146489146490146491146492146493146494146495146496146497146498146499146500146501146502146503146504146505146506146507146508146509146510146511146512146513146514146515146516146517146518146519146520146521146522146523146524146525146526146527146528146529146530146531146532146533146534146535146536146537146538146539146540146541146542146543146544146545146546146547146548146549146550146551146552146553146554146555146556146557146558146559146560146561146562146563146564146565146566146567146568146569146570146571146572146573146574146575146576146577146578146579146580146581146582146583146584146585146586146587146588146589146590146591146592146593146594146595146596146597146598146599146600146601146602146603146604146605146606146607146608146609146610146611146612146613146614146615146616146617146618146619146620146621146622146623146624146625146626146627146628146629146630146631146632146633146634146635146636146637146638146639146640146641146642146643146644146645146646146647146648146649146650146651146652146653146654146655146656146657146658146659146660146661146662146663146664146665146666146667146668146669146670146671146672146673146674146675146676146677146678146679146680146681146682146683146684146685146686146687146688146689146690146691146692146693146694146695146696146697146698146699146700146701146702146703146704146705146706146707146708146709146710146711146712146713146714146715146716146717146718146719146720146721146722146723146724146725146726146727146728146729146730146731146732146733146734146735146736146737146738146739146740146741146742146743146744146745146746146747146748146749146750146751146752146753146754146755146756146757146758146759146760146761146762146763146764146765146766146767146768146769146770146771146772146773146774146775146776146777146778146779146780146781146782146783146784146785146786146787146788146789146790146791146792146793146794146795146796146797146798146799146800146801146802146803146804146805146806146807146808146809146810146811146812146813146814146815146816146817146818146819146820146821146822146823146824146825146826146827146828146829146830146831146832146833146834146835146836146837146838146839146840146841146842146843146844146845146846146847146848146849146850146851146852146853146854146855146856146857146858146859146860146861146862146863146864146865146866146867146868146869146870146871146872146873146874146875146876146877146878146879146880146881146882146883146884146885146886146887146888146889146890146891146892146893146894146895146896146897146898146899146900146901146902146903146904146905146906146907146908146909146910146911146912146913146914146915146916146917146918146919146920146921146922146923146924146925146926146927146928146929146930146931146932146933146934146935146936146937146938146939146940146941146942146943146944146945146946146947146948146949146950146951146952146953146954146955146956146957146958146959146960146961146962146963146964146965146966146967146968146969146970146971146972146973146974146975146976146977146978146979146980146981146982146983146984146985146986146987146988146989146990146991146992146993146994146995146996146997146998146999147000147001147002147003147004147005147006147007147008147009147010147011147012147013147014147015147016147017147018147019147020147021147022147023147024147025147026147027147028147029147030147031147032147033147034147035147036147037147038147039147040147041147042147043147044147045147046147047147048147049147050147051147052147053147054147055147056147057147058147059147060147061147062147063147064147065147066147067147068147069147070147071147072147073147074147075147076147077147078147079147080147081147082147083147084147085147086147087147088147089147090147091147092147093147094147095147096147097147098147099147100147101147102147103147104147105147106147107147108147109147110147111147112147113147114147115147116147117147118147119147120147121147122147123147124147125147126147127147128147129147130147131147132147133147134147135147136147137147138147139147140147141147142147143147144147145147146147147147148147149147150147151147152147153147154147155147156147157147158147159147160147161147162147163147164147165147166147167147168147169147170147171147172147173147174147175147176147177147178147179147180147181147182147183147184147185147186147187147188147189147190147191147192147193147194147195147196147197147198147199147200147201147202147203147204147205147206147207147208147209147210147211147212147213147214147215147216147217147218147219147220147221147222147223147224147225147226147227147228147229147230147231147232147233147234147235147236147237147238147239147240147241147242147243147244147245147246147247147248147249147250147251147252147253147254147255147256147257147258147259147260147261147262147263147264147265147266147267147268147269147270147271147272147273147274147275147276147277147278147279147280147281147282147283147284147285147286147287147288147289147290147291147292147293147294147295147296147297147298147299147300147301147302147303147304147305147306147307147308147309147310147311147312147313147314147315147316147317147318147319147320147321147322147323147324147325147326147327147328147329147330147331147332147333147334147335147336147337147338147339147340147341147342147343147344147345147346147347147348147349147350147351147352147353147354147355147356147357147358147359147360147361147362147363147364147365147366147367147368147369147370147371147372147373147374147375147376147377147378147379147380147381147382147383147384147385147386147387147388147389147390147391147392147393147394147395147396147397147398147399147400147401147402147403147404147405147406147407147408147409147410147411147412147413147414147415147416147417147418147419147420147421147422147423147424147425147426147427147428147429147430147431147432147433147434147435147436147437147438147439147440147441147442147443147444147445147446147447147448147449147450147451147452147453147454147455147456147457147458147459147460147461147462147463147464147465147466147467147468147469147470147471147472147473147474147475147476147477147478147479147480147481147482147483147484147485147486147487147488147489147490147491147492147493147494147495147496147497147498147499147500147501147502147503147504147505147506147507147508147509147510147511147512147513147514147515147516147517147518147519147520147521147522147523147524147525147526147527147528147529147530147531147532147533147534147535147536147537147538147539147540147541147542147543147544147545147546147547147548147549147550147551147552147553147554147555147556147557147558147559147560147561147562147563147564147565147566147567147568147569147570147571147572147573147574147575147576147577147578147579147580147581147582147583147584147585147586147587147588147589147590147591147592147593147594147595147596147597147598147599147600147601147602147603147604147605147606147607147608147609147610147611147612147613147614147615147616147617147618147619147620147621147622147623147624147625147626147627147628147629147630147631147632147633147634147635147636147637147638147639147640147641147642147643147644147645147646147647147648147649147650147651147652147653147654147655147656147657147658147659147660147661147662147663147664147665147666147667147668147669147670147671147672147673147674147675147676147677147678147679147680147681147682147683147684147685147686147687147688147689147690147691147692147693147694147695147696147697147698147699147700147701147702147703147704147705147706147707147708147709147710147711147712147713147714147715147716147717147718147719147720147721147722147723147724147725147726147727147728147729147730147731147732147733147734147735147736147737147738147739147740147741147742147743147744147745147746147747147748147749147750147751147752147753147754147755147756147757147758147759147760147761147762147763147764147765147766147767147768147769147770147771147772147773147774147775147776147777147778147779147780147781147782147783147784147785147786147787147788147789147790147791147792147793147794147795147796147797147798147799147800147801147802147803147804147805147806147807147808147809147810147811147812147813147814147815147816147817147818147819147820147821147822147823147824147825147826147827147828147829147830147831147832147833147834147835147836147837147838147839147840147841147842147843147844147845147846147847147848147849147850147851147852147853147854147855147856147857147858147859147860147861147862147863147864147865147866147867147868147869147870147871147872147873147874147875147876147877147878147879147880147881147882147883147884147885147886147887147888147889147890147891147892147893147894147895147896147897147898147899147900147901147902147903147904147905147906147907147908147909147910147911147912147913147914147915147916147917147918147919147920147921147922147923147924147925147926147927147928147929147930147931147932147933147934147935147936147937147938147939147940147941147942147943147944147945147946147947147948147949147950147951147952147953147954147955147956147957147958147959147960147961147962147963147964147965147966147967147968147969147970147971147972147973147974147975147976147977147978147979147980147981147982147983147984147985147986147987147988147989147990147991147992147993147994147995147996147997147998147999148000148001148002148003148004148005148006148007148008148009148010148011148012148013148014148015148016148017148018148019148020148021148022148023148024148025148026148027148028148029148030148031148032148033148034148035148036148037148038148039148040148041148042148043148044148045148046148047148048148049148050148051148052148053148054148055148056148057148058148059148060148061148062148063148064148065148066148067148068148069148070148071148072148073148074148075148076148077148078148079148080148081148082148083148084148085148086148087148088148089148090148091148092148093148094148095148096148097148098148099148100148101148102148103148104148105148106148107148108148109148110148111148112148113148114148115148116148117148118148119148120148121148122148123148124148125148126148127148128148129148130148131148132148133148134148135148136148137148138148139148140148141148142148143148144148145148146148147148148148149148150148151148152148153148154148155148156148157148158148159148160148161148162148163148164148165148166148167148168148169148170148171148172148173148174148175148176148177148178148179148180148181148182148183148184148185148186148187148188148189148190148191148192148193148194148195148196148197148198148199148200148201148202148203148204148205148206148207148208148209148210148211148212148213148214148215148216148217148218148219148220148221148222148223148224148225148226148227148228148229148230148231148232148233148234148235148236148237148238148239148240148241148242148243148244148245148246148247148248148249148250148251148252148253148254148255148256148257148258148259148260148261148262148263148264148265148266148267148268148269148270148271148272148273148274148275148276148277148278148279148280148281148282148283148284148285148286148287148288148289148290148291148292148293148294148295148296148297148298148299148300148301148302148303148304148305148306148307148308148309148310148311148312148313148314148315148316148317148318148319148320148321148322148323148324148325148326148327148328148329148330148331148332148333148334148335148336148337148338148339148340148341148342148343148344148345148346148347148348148349148350148351148352148353148354148355148356148357148358148359148360148361148362148363148364148365148366148367148368148369148370148371148372148373148374148375148376148377148378148379148380148381148382148383148384148385148386148387148388148389148390148391148392148393148394148395148396148397148398148399148400148401148402148403148404148405148406148407148408148409148410148411148412148413148414148415148416148417148418148419148420148421148422148423148424148425148426148427148428148429148430148431148432148433148434148435148436148437148438148439148440148441148442148443148444148445148446148447148448148449148450148451148452148453148454148455148456148457148458148459148460148461148462148463148464148465148466148467148468148469148470148471148472148473148474148475148476148477148478148479148480148481148482148483148484148485148486148487148488148489148490148491148492148493148494148495148496148497148498148499148500148501148502148503148504148505148506148507148508148509148510148511148512148513148514148515148516148517148518148519148520148521148522148523148524148525148526148527148528148529148530148531148532148533148534148535148536148537148538148539148540148541148542148543148544148545148546148547148548148549148550148551148552148553148554148555148556148557148558148559148560148561148562148563148564148565148566148567148568148569148570148571148572148573148574148575148576148577148578148579148580148581148582148583148584148585148586148587148588148589148590148591148592148593148594148595148596148597148598148599148600148601148602148603148604148605148606148607148608148609148610148611148612148613148614148615148616148617148618148619148620148621148622148623148624148625148626148627148628148629148630148631148632148633148634148635148636148637148638148639148640148641148642148643148644148645148646148647148648148649148650148651148652148653148654148655148656148657148658148659148660148661148662148663148664148665148666148667148668148669148670148671148672148673148674148675148676148677148678148679148680148681148682148683148684148685148686148687148688148689148690148691148692148693148694148695148696148697148698148699148700148701148702148703148704148705148706148707148708148709148710148711148712148713148714148715148716148717148718148719148720148721148722148723148724148725148726148727148728148729148730148731148732148733148734148735148736148737148738148739148740148741148742148743148744148745148746148747148748148749148750148751148752148753148754148755148756148757148758148759148760148761148762148763148764148765148766148767148768148769148770148771148772148773148774148775148776148777148778148779148780148781148782148783148784148785148786148787148788148789148790148791148792148793148794148795148796148797148798148799148800148801148802148803148804148805148806148807148808148809148810148811148812148813148814148815148816148817148818148819148820148821148822148823148824148825148826148827148828148829148830148831148832148833148834148835148836148837148838148839148840148841148842148843148844148845148846148847148848148849148850148851148852148853148854148855148856148857148858148859148860148861148862148863148864148865148866148867148868148869148870148871148872148873148874148875148876148877148878148879148880148881148882148883148884148885148886148887148888148889148890148891148892148893148894148895148896148897148898148899148900148901148902148903148904148905148906148907148908148909148910148911148912148913148914148915148916148917148918148919148920148921148922148923148924148925148926148927148928148929148930148931148932148933148934148935148936148937148938148939148940148941148942148943148944148945148946148947148948148949148950148951148952148953148954148955148956148957148958148959148960148961148962148963148964148965148966148967148968148969148970148971148972148973148974148975148976148977148978148979148980148981148982148983148984148985148986148987148988148989148990148991148992148993148994148995148996148997148998148999149000149001149002149003149004149005149006149007149008149009149010149011149012149013149014149015149016149017149018149019149020149021149022149023149024149025149026149027149028149029149030149031149032149033149034149035149036149037149038149039149040149041149042149043149044149045149046149047149048149049149050149051149052149053149054149055149056149057149058149059149060149061149062149063149064149065149066149067149068149069149070149071149072149073149074149075149076149077149078149079149080149081149082149083149084149085149086149087149088149089149090149091149092149093149094149095149096149097149098149099149100149101149102149103149104149105149106149107149108149109149110149111149112149113149114149115149116149117149118149119149120149121149122149123149124149125149126149127149128149129149130149131149132149133149134149135149136149137149138149139149140149141149142149143149144149145149146149147149148149149149150149151149152149153149154149155149156149157149158149159149160149161149162149163149164149165149166149167149168149169149170149171149172149173149174149175149176149177149178149179149180149181149182149183149184149185149186149187149188149189149190149191149192149193149194149195149196149197149198149199149200149201149202149203149204149205149206149207149208149209149210149211149212149213149214149215149216149217149218149219149220149221149222149223149224149225149226149227149228149229149230149231149232149233149234149235149236149237149238149239149240149241149242149243149244149245149246149247149248149249149250149251149252149253149254149255149256149257149258149259149260149261149262149263149264149265149266149267149268149269149270149271149272149273149274149275149276149277149278149279149280149281149282149283149284149285149286149287149288149289149290149291149292149293149294149295149296149297149298149299149300149301149302149303149304149305149306149307149308149309149310149311149312149313149314149315149316149317149318149319149320149321149322149323149324149325149326149327149328149329149330149331149332149333149334149335149336149337149338149339149340149341149342149343149344149345149346149347149348149349149350149351149352149353149354149355149356149357149358149359149360149361149362149363149364149365149366149367149368149369149370149371149372149373149374149375149376149377149378149379149380149381149382149383149384149385149386149387149388149389149390149391149392149393149394149395149396149397149398149399149400149401149402149403149404149405149406149407149408149409149410149411149412149413149414149415149416149417149418149419149420149421149422149423149424149425149426149427149428149429149430149431149432149433149434149435149436149437149438149439149440149441149442149443149444149445149446149447149448149449149450149451149452149453149454149455149456149457149458149459149460149461149462149463149464149465149466149467149468149469149470149471149472149473149474149475149476149477149478149479149480149481149482149483149484149485149486149487149488149489149490149491149492149493149494149495149496149497149498149499149500149501149502149503149504149505149506149507149508149509149510149511149512149513149514149515149516149517149518149519149520149521149522149523149524149525149526149527149528149529149530149531149532149533149534149535149536149537149538149539149540149541149542149543149544149545149546149547149548149549149550149551149552149553149554149555149556149557149558149559149560149561149562149563149564149565149566149567149568149569149570149571149572149573149574149575149576149577149578149579149580149581149582149583149584149585149586149587149588149589149590149591149592149593149594149595149596149597149598149599149600149601149602149603149604149605149606149607149608149609149610149611149612149613149614149615149616149617149618149619149620149621149622149623149624149625149626149627149628149629149630149631149632149633149634149635149636149637149638149639149640149641149642149643149644149645149646149647149648149649149650149651149652149653149654149655149656149657149658149659149660149661149662149663149664149665149666149667149668149669149670149671149672149673149674149675149676149677149678149679149680149681149682149683149684149685149686149687149688149689149690149691149692149693149694149695149696149697149698149699149700149701149702149703149704149705149706149707149708149709149710149711149712149713149714149715149716149717149718149719149720149721149722149723149724149725149726149727149728149729149730149731149732149733149734149735149736149737149738149739149740149741149742149743149744149745149746149747149748149749149750149751149752149753149754149755149756149757149758149759149760149761149762149763149764149765149766149767149768149769149770149771149772149773149774149775149776149777149778149779149780149781149782149783149784149785149786149787149788149789149790149791149792149793149794149795149796149797149798149799149800149801149802149803149804149805149806149807149808149809149810149811149812149813149814149815149816149817149818149819149820149821149822149823149824149825149826149827149828149829149830149831149832149833149834149835149836149837149838149839149840149841149842149843149844149845149846149847149848149849149850149851149852149853149854149855149856149857149858149859149860149861149862149863149864149865149866149867149868149869149870149871149872149873149874149875149876149877149878149879149880149881149882149883149884149885149886149887149888149889149890149891149892149893149894149895149896149897149898149899149900149901149902149903149904149905149906149907149908149909149910149911149912149913149914149915149916149917149918149919149920149921149922149923149924149925149926149927149928149929149930149931149932149933149934149935149936149937149938149939149940149941149942149943149944149945149946149947149948149949149950149951149952149953149954149955149956149957149958149959149960149961149962149963149964149965149966149967149968149969149970149971149972149973149974149975149976149977149978149979149980149981149982149983149984149985149986149987149988149989149990149991149992149993149994149995149996149997149998149999150000150001150002150003150004150005150006150007150008150009150010150011150012150013150014150015150016150017150018150019150020150021150022150023150024150025150026150027150028150029150030150031150032150033150034150035150036150037150038150039150040150041150042150043150044150045150046150047150048150049150050150051150052150053150054150055150056150057150058150059150060150061150062150063150064150065150066150067150068150069150070150071150072150073150074150075150076150077150078150079150080150081150082150083150084150085150086150087150088150089150090150091150092150093150094150095150096150097150098150099150100150101150102150103150104150105150106150107150108150109150110150111150112150113150114150115150116150117150118150119150120150121150122150123150124150125150126150127150128150129150130150131150132150133150134150135150136150137150138150139150140150141150142150143150144150145150146150147150148150149150150150151150152150153150154150155150156150157150158150159150160150161150162150163150164150165150166150167150168150169150170150171150172150173150174150175150176150177150178150179150180150181150182150183150184150185150186150187150188150189150190150191150192150193150194150195150196150197150198150199150200150201150202150203150204150205150206150207150208150209150210150211150212150213150214150215150216150217150218150219150220150221150222150223150224150225150226150227150228150229150230150231150232150233150234150235150236150237150238150239150240150241150242150243150244150245150246150247150248150249150250150251150252150253150254150255150256150257150258150259150260150261150262150263150264150265150266150267150268150269150270150271150272150273150274150275150276150277150278150279150280150281150282150283150284150285150286150287150288150289150290150291150292150293150294150295150296150297150298150299150300150301150302150303150304150305150306150307150308150309150310150311150312150313150314150315150316150317150318150319150320150321150322150323150324150325150326150327150328150329150330150331150332150333150334150335150336150337150338150339150340150341150342150343150344150345150346150347150348150349150350150351150352150353150354150355150356150357150358150359150360150361150362150363150364150365150366150367150368150369150370150371150372150373150374150375150376150377150378150379150380150381150382150383150384150385150386150387150388150389150390150391150392150393150394150395150396150397150398150399150400150401150402150403150404150405150406150407150408150409150410150411150412150413150414150415150416150417150418150419150420150421150422150423150424150425150426150427150428150429150430150431150432150433150434150435150436150437150438150439150440150441150442150443150444150445150446150447150448150449150450150451150452150453150454150455150456150457150458150459150460150461150462150463150464150465150466150467150468150469150470150471150472150473150474150475150476150477150478150479150480150481150482150483150484150485150486150487150488150489150490150491150492150493150494150495150496150497150498150499150500150501150502150503150504150505150506150507150508150509150510150511150512150513150514150515150516150517150518150519150520150521150522150523150524150525150526150527150528150529150530150531150532150533150534150535150536150537150538150539150540150541150542150543150544150545150546150547150548150549150550150551150552150553150554150555150556150557150558150559150560150561150562150563150564150565150566150567150568150569150570150571150572150573150574150575150576150577150578150579150580150581150582150583150584150585150586150587150588150589150590150591150592150593150594150595150596150597150598150599150600150601150602150603150604150605150606150607150608150609150610150611150612150613150614150615150616150617150618150619150620150621150622150623150624150625150626150627150628150629150630150631150632150633150634150635150636150637150638150639150640150641150642150643150644150645150646150647150648150649150650150651150652150653150654150655150656150657150658150659150660150661150662150663150664150665150666150667150668150669150670150671150672150673150674150675150676150677150678150679150680150681150682150683150684150685150686150687150688150689150690150691150692150693150694150695150696150697150698150699150700150701150702150703150704150705150706150707150708150709150710150711150712150713150714150715150716150717150718150719150720150721150722150723150724150725150726150727150728150729150730150731150732150733150734150735150736150737150738150739150740150741150742150743150744150745150746150747150748150749150750150751150752150753150754150755150756150757150758150759150760150761150762150763150764150765150766150767150768150769150770150771150772150773150774150775150776150777150778150779150780150781150782150783150784150785150786150787150788150789150790150791150792150793150794150795150796150797150798150799150800150801150802150803150804150805150806150807150808150809150810150811150812150813150814150815150816150817150818150819150820150821150822150823150824150825150826150827150828150829150830150831150832150833150834150835150836150837150838150839150840150841150842150843150844150845150846150847150848150849150850150851150852150853150854150855150856150857150858150859150860150861150862150863150864150865150866150867150868150869150870150871150872150873150874150875150876150877150878150879150880150881150882150883150884150885150886150887150888150889150890150891150892150893150894150895150896150897150898150899150900150901150902150903150904150905150906150907150908150909150910150911150912150913150914150915150916150917150918150919150920150921150922150923150924150925150926150927150928150929150930150931150932150933150934150935150936150937150938150939150940150941150942150943150944150945150946150947150948150949150950150951150952150953150954150955150956150957150958150959150960150961150962150963150964150965150966150967150968150969150970150971150972150973150974150975150976150977150978150979150980150981150982150983150984150985150986150987150988150989150990150991150992150993150994150995150996150997150998150999151000151001151002151003151004151005151006151007151008151009151010151011151012151013151014151015151016151017151018151019151020151021151022151023151024151025151026151027151028151029151030151031151032151033151034151035151036151037151038151039151040151041151042151043151044151045151046151047151048151049151050151051151052151053151054151055151056151057151058151059151060151061151062151063151064151065151066151067151068151069151070151071151072151073151074151075151076151077151078151079151080151081151082151083151084151085151086151087151088151089151090151091151092151093151094151095151096151097151098151099151100151101151102151103151104151105151106151107151108151109151110151111151112151113151114151115151116151117151118151119151120151121151122151123151124151125151126151127151128151129151130151131151132151133151134151135151136151137151138151139151140151141151142151143151144151145151146151147151148151149151150151151151152151153151154151155151156151157151158151159151160151161151162151163151164151165151166151167151168151169151170151171151172151173151174151175151176151177151178151179151180151181151182151183151184151185151186151187151188151189151190151191151192151193151194151195151196151197151198151199151200151201151202151203151204151205151206151207151208151209151210151211151212151213151214151215151216151217151218151219151220151221151222151223151224151225151226151227151228151229151230151231151232151233151234151235151236151237151238151239151240151241151242151243151244151245151246151247151248151249151250151251151252151253151254151255151256151257151258151259151260151261151262151263151264151265151266151267151268151269151270151271151272151273151274151275151276151277151278151279151280151281151282151283151284151285151286151287151288151289151290151291151292151293151294151295151296151297151298151299151300151301151302151303151304151305151306151307151308151309151310151311151312151313151314151315151316151317151318151319151320151321151322151323151324151325151326151327151328151329151330151331151332151333151334151335151336151337151338151339151340151341151342151343151344151345151346151347151348151349151350151351151352151353151354151355151356151357151358151359151360151361151362151363151364151365151366151367151368151369151370151371151372151373151374151375151376151377151378151379151380151381151382151383151384151385151386151387151388151389151390151391151392151393151394151395151396151397151398151399151400151401151402151403151404151405151406151407151408151409151410151411151412151413151414151415151416151417151418151419151420151421151422151423151424151425151426151427151428151429151430151431151432151433151434151435151436151437151438151439151440151441151442151443151444151445151446151447151448151449151450151451151452151453151454151455151456151457151458151459151460151461151462151463151464151465151466151467151468151469151470151471151472151473151474151475151476151477151478151479151480151481151482151483151484151485151486151487151488151489151490151491151492151493151494151495151496151497151498151499151500151501151502151503151504151505151506151507151508151509151510151511151512151513151514151515151516151517151518151519151520151521151522151523151524151525151526151527151528151529151530151531151532151533151534151535151536151537151538151539151540151541151542151543151544151545151546151547151548151549151550151551151552151553151554151555151556151557151558151559151560151561151562151563151564151565151566151567151568151569151570151571151572151573151574151575151576151577151578151579151580151581151582151583151584151585151586151587151588151589151590151591151592151593151594151595151596151597151598151599151600151601151602151603151604151605151606151607151608151609151610151611151612151613151614151615151616151617151618151619151620151621151622151623151624151625151626151627151628151629151630151631151632151633151634151635151636151637151638151639151640151641151642151643151644151645151646151647151648151649151650151651151652151653151654151655151656151657151658151659151660151661151662151663151664151665151666151667151668151669151670151671151672151673151674151675151676151677151678151679151680151681151682151683151684151685151686151687151688151689151690151691151692151693151694151695151696151697151698151699151700151701151702151703151704151705151706151707151708151709151710151711151712151713151714151715151716151717151718151719151720151721151722151723151724151725151726151727151728151729151730151731151732151733151734151735151736151737151738151739151740151741151742151743151744151745151746151747151748151749151750151751151752151753151754151755151756151757151758151759151760151761151762151763151764151765151766151767151768151769151770151771151772151773151774151775151776151777151778151779151780151781151782151783151784151785151786151787151788151789151790151791151792151793151794151795151796151797151798151799151800151801151802151803151804151805151806151807151808151809151810151811151812151813151814151815151816151817151818151819151820151821151822151823151824151825151826151827151828151829151830151831151832151833151834151835151836151837151838151839151840151841151842151843151844151845151846151847151848151849151850151851151852151853151854151855151856151857151858151859151860151861151862151863151864151865151866151867151868151869151870151871151872151873151874151875151876151877151878151879151880151881151882151883151884151885151886151887151888151889151890151891151892151893151894151895151896151897151898151899151900151901151902151903151904151905151906151907151908151909151910151911151912151913151914151915151916151917151918151919151920151921151922151923151924151925151926151927151928151929151930151931151932151933151934151935151936151937151938151939151940151941151942151943151944151945151946151947151948151949151950151951151952151953151954151955151956151957151958151959151960151961151962151963151964151965151966151967151968151969151970151971151972151973151974151975151976151977151978151979151980151981151982151983151984151985151986151987151988151989151990151991151992151993151994151995151996151997151998151999152000152001152002152003152004152005152006152007152008152009152010152011152012152013152014152015152016152017152018152019152020152021152022152023152024152025152026152027152028152029152030152031152032152033152034152035152036152037152038152039152040152041152042152043152044152045152046152047152048152049152050152051152052152053152054152055152056152057152058152059152060152061152062152063152064152065152066152067152068152069152070152071152072152073152074152075152076152077152078152079152080152081152082152083152084152085152086152087152088152089152090152091152092152093152094152095152096152097152098152099152100152101152102152103152104152105152106152107152108152109152110152111152112152113152114152115152116152117152118152119152120152121152122152123152124152125152126152127152128152129152130152131152132152133152134152135152136152137152138152139152140152141152142152143152144152145152146152147152148152149152150152151152152152153152154152155152156152157152158152159152160152161152162152163152164152165152166152167152168152169152170152171152172152173152174152175152176152177152178152179152180152181152182152183152184152185152186152187152188152189152190152191152192152193152194152195152196152197152198152199152200152201152202152203152204152205152206152207152208152209152210152211152212152213152214152215152216152217152218152219152220152221152222152223152224152225152226152227152228152229152230152231152232152233152234152235152236152237152238152239152240152241152242152243152244152245152246152247152248152249152250152251152252152253152254152255152256152257152258152259152260152261152262152263152264152265152266152267152268152269152270152271152272152273152274152275152276152277152278152279152280152281152282152283152284152285152286152287152288152289152290152291152292152293152294152295152296152297152298152299152300152301152302152303152304152305152306152307152308152309152310152311152312152313152314152315152316152317152318152319152320152321152322152323152324152325152326152327152328152329152330152331152332152333152334152335152336152337152338152339152340152341152342152343152344152345152346152347152348152349152350152351152352152353152354152355152356152357152358152359152360152361152362152363152364152365152366152367152368152369152370152371152372152373152374152375152376152377152378152379152380152381152382152383152384152385152386152387152388152389152390152391152392152393152394152395152396152397152398152399152400152401152402152403152404152405152406152407152408152409152410152411152412152413152414152415152416152417152418152419152420152421152422152423152424152425152426152427152428152429152430152431152432152433152434152435152436152437152438152439152440152441152442152443152444152445152446152447152448152449152450152451152452152453152454152455152456152457152458152459152460152461152462152463152464152465152466152467152468152469152470152471152472152473152474152475152476152477152478152479152480152481152482152483152484152485152486152487152488152489152490152491152492152493152494152495152496152497152498152499152500152501152502152503152504152505152506152507152508152509152510152511152512152513152514152515152516152517152518152519152520152521152522152523152524152525152526152527152528152529152530152531152532152533152534152535152536152537152538152539152540152541152542152543152544152545152546152547152548152549152550152551152552152553152554152555152556152557152558152559152560152561152562152563152564152565152566152567152568152569152570152571152572152573152574152575152576152577152578152579152580152581152582152583152584152585152586152587152588152589152590152591152592152593152594152595152596152597152598152599152600152601152602152603152604152605152606152607152608152609152610152611152612152613152614152615152616152617152618152619152620152621152622152623152624152625152626152627152628152629152630152631152632152633152634152635152636152637152638152639152640152641152642152643152644152645152646152647152648152649152650152651152652152653152654152655152656152657152658152659152660152661152662152663152664152665152666152667152668152669152670152671152672152673152674152675152676152677152678152679152680152681152682152683152684152685152686152687152688152689152690152691152692152693152694152695152696152697152698152699152700152701152702152703152704152705152706152707152708152709152710152711152712152713152714152715152716152717152718152719152720152721152722152723152724152725152726152727152728152729152730152731152732152733152734152735152736152737152738152739152740152741152742152743152744152745152746152747152748152749152750152751152752152753152754152755152756152757152758152759152760152761152762152763152764152765152766152767152768152769152770152771152772152773152774152775152776152777152778152779152780152781152782152783152784152785152786152787152788152789152790152791152792152793152794152795152796152797152798152799152800152801152802152803152804152805152806152807152808152809152810152811152812152813152814152815152816152817152818152819152820152821152822152823152824152825152826152827152828152829152830152831152832152833152834152835152836152837152838152839152840152841152842152843152844152845152846152847152848152849152850152851152852152853152854152855152856152857152858152859152860152861152862152863152864152865152866152867152868152869152870152871152872152873152874152875152876152877152878152879152880152881152882152883152884152885152886152887152888152889152890152891152892152893152894152895152896152897152898152899152900152901152902152903152904152905152906152907152908152909152910152911152912152913152914152915152916152917152918152919152920152921152922152923152924152925152926152927152928152929152930152931152932152933152934152935152936152937152938152939152940152941152942152943152944152945152946152947152948152949152950152951152952152953152954152955152956152957152958152959152960152961152962152963152964152965152966152967152968152969152970152971152972152973152974152975152976152977152978152979152980152981152982152983152984152985152986152987152988152989152990152991152992152993152994152995152996152997152998152999153000153001153002153003153004153005153006153007153008153009153010153011153012153013153014153015153016153017153018153019153020153021153022153023153024153025153026153027153028153029153030153031153032153033153034153035153036153037153038153039153040153041153042153043153044153045153046153047153048153049153050153051153052153053153054153055153056153057153058153059153060153061153062153063153064153065153066153067153068153069153070153071153072153073153074153075153076153077153078153079153080153081153082153083153084153085153086153087153088153089153090153091153092153093153094153095153096153097153098153099153100153101153102153103153104153105153106153107153108153109153110153111153112153113153114153115153116153117153118153119153120153121153122153123153124153125153126153127153128153129153130153131153132153133153134153135153136153137153138153139153140153141153142153143153144153145153146153147153148153149153150153151153152153153153154153155153156153157153158153159153160153161153162153163153164153165153166153167153168153169153170153171153172153173153174153175153176153177153178153179153180153181153182153183153184153185153186153187153188153189153190153191153192153193153194153195153196153197153198153199153200153201153202153203153204153205153206153207153208153209153210153211153212153213153214153215153216153217153218153219153220153221153222153223153224153225153226153227153228153229153230153231153232153233153234153235153236153237153238153239153240153241153242153243153244153245153246153247153248153249153250153251153252153253153254153255153256153257153258153259153260153261153262153263153264153265153266153267153268153269153270153271153272153273153274153275153276153277153278153279153280153281153282153283153284153285153286153287153288153289153290153291153292153293153294153295153296153297153298153299153300153301153302153303153304153305153306153307153308153309153310153311153312153313153314153315153316153317153318153319153320153321153322153323153324153325153326153327153328153329153330153331153332153333153334153335153336153337153338153339153340153341153342153343153344153345153346153347153348153349153350153351153352153353153354153355153356153357153358153359153360153361153362153363153364153365153366153367153368153369153370153371153372153373153374153375153376153377153378153379153380153381153382153383153384153385153386153387153388153389153390153391153392153393153394153395153396153397153398153399153400153401153402153403153404153405153406153407153408153409153410153411153412153413153414153415153416153417153418153419153420153421153422153423153424153425153426153427153428153429153430153431153432153433153434153435153436153437153438153439153440153441153442153443153444153445153446153447153448153449153450153451153452153453153454153455153456153457153458153459153460153461153462153463153464153465153466153467153468153469153470153471153472153473153474153475153476153477153478153479153480153481153482153483153484153485153486153487153488153489153490153491153492153493153494153495153496153497153498153499153500153501153502153503153504153505153506153507153508153509153510153511153512153513153514153515153516153517153518153519153520153521153522153523153524153525153526153527153528153529153530153531153532153533153534153535153536153537153538153539153540153541153542153543153544153545153546153547153548153549153550153551153552153553153554153555153556153557153558153559153560153561153562153563153564153565153566153567153568153569153570153571153572153573153574153575153576153577153578153579153580153581153582153583153584153585153586153587153588153589153590153591153592153593153594153595153596153597153598153599153600153601153602153603153604153605153606153607153608153609153610153611153612153613153614153615153616153617153618153619153620153621153622153623153624153625153626153627153628153629153630153631153632153633153634153635153636153637153638153639153640153641153642153643153644153645153646153647153648153649153650153651153652153653153654153655153656153657153658153659153660153661153662153663153664153665153666153667153668153669153670153671153672153673153674153675153676153677153678153679153680153681153682153683153684153685153686153687153688153689153690153691153692153693153694153695153696153697153698153699153700153701153702153703153704153705153706153707153708153709153710153711153712153713153714153715153716153717153718153719153720153721153722153723153724153725153726153727153728153729153730153731153732153733153734153735153736153737153738153739153740153741153742153743153744153745153746153747153748153749153750153751153752153753153754153755153756153757153758153759153760153761153762153763153764153765153766153767153768153769153770153771153772153773153774153775153776153777153778153779153780153781153782153783153784153785153786153787153788153789153790153791153792153793153794153795153796153797153798153799153800153801153802153803153804153805153806153807153808153809153810153811153812153813153814153815153816153817153818153819153820153821153822153823153824153825153826153827153828153829153830153831153832153833153834153835153836153837153838153839153840153841153842153843153844153845153846153847153848153849153850153851153852153853153854153855153856153857153858153859153860153861153862153863153864153865153866153867153868153869153870153871153872153873153874153875153876153877153878153879153880153881153882153883153884153885153886153887153888153889153890153891153892153893153894153895153896153897153898153899153900153901153902153903153904153905153906153907153908153909153910153911153912153913153914153915153916153917153918153919153920153921153922153923153924153925153926153927153928153929153930153931153932153933153934153935153936153937153938153939153940153941153942153943153944153945153946153947153948153949153950153951153952153953153954153955153956153957153958153959153960153961153962153963153964153965153966153967153968153969153970153971153972153973153974153975153976153977153978153979153980153981153982153983153984153985153986153987153988153989153990153991153992153993153994153995153996153997153998153999154000154001154002154003154004154005154006154007154008154009154010154011154012154013154014154015154016154017154018154019154020154021154022154023154024154025154026154027154028154029154030154031154032154033154034154035154036154037154038154039154040154041154042154043154044154045154046154047154048154049154050154051154052154053154054154055154056154057154058154059154060154061154062154063154064154065154066154067154068154069154070154071154072154073154074154075154076154077154078154079154080154081154082154083154084154085154086154087154088154089154090154091154092154093154094154095154096154097154098154099154100154101154102154103154104154105154106154107154108154109154110154111154112154113154114154115154116154117154118154119154120154121154122154123154124154125154126154127154128154129154130154131154132154133154134154135154136154137154138154139154140154141154142154143154144154145154146154147154148154149154150154151154152154153154154154155154156154157154158154159154160154161154162154163154164154165154166154167154168154169154170154171154172154173154174154175154176154177154178154179154180154181154182154183154184154185154186154187154188154189154190154191154192154193154194154195154196154197154198154199154200154201154202154203154204154205154206154207154208154209154210154211154212154213154214154215154216154217154218154219154220154221154222154223154224154225154226154227154228154229154230154231154232154233154234154235154236154237154238154239154240154241154242154243154244154245154246154247154248154249154250154251154252154253154254154255154256154257154258154259154260154261154262154263154264154265154266154267154268154269154270154271154272154273154274154275154276154277154278154279154280154281154282154283154284154285154286154287154288154289154290154291154292154293154294154295154296154297154298154299154300154301154302154303154304154305154306154307154308154309154310154311154312154313154314154315154316154317154318154319154320154321154322154323154324154325154326154327154328154329154330154331154332154333154334154335154336154337154338154339154340154341154342154343154344154345154346154347154348154349154350154351154352154353154354154355154356154357154358154359154360154361154362154363154364154365154366154367154368154369154370154371154372154373154374154375154376154377154378154379154380154381154382154383154384154385154386154387154388154389154390154391154392154393154394154395154396154397154398154399154400154401154402154403154404154405154406154407154408154409154410154411154412154413154414154415154416154417154418154419154420154421154422154423154424154425154426154427154428154429154430154431154432154433154434154435154436154437154438154439154440154441154442154443154444154445154446154447154448154449154450154451154452154453154454154455154456154457154458154459154460154461154462154463154464154465154466154467154468154469154470154471154472154473154474154475154476154477154478154479154480154481154482154483154484154485154486154487154488154489154490154491154492154493154494154495154496154497154498154499154500154501154502154503154504154505154506154507154508154509154510154511154512154513154514154515154516154517154518154519154520154521154522154523154524154525154526154527154528154529154530154531154532154533154534154535154536154537154538154539154540154541154542154543154544154545154546154547154548154549154550154551154552154553154554154555154556154557154558154559154560154561154562154563154564154565154566154567154568154569154570154571154572154573154574154575154576154577154578154579154580154581154582154583154584154585154586154587154588154589154590154591154592154593154594154595154596154597154598154599154600154601154602154603154604154605154606154607154608154609154610154611154612154613154614154615154616154617154618154619154620154621154622154623154624154625154626154627154628154629154630154631154632154633154634154635154636154637154638154639154640154641154642154643154644154645154646154647154648154649154650154651154652154653154654154655154656154657154658154659154660154661154662154663154664154665154666154667154668154669154670154671154672154673154674154675154676154677154678154679154680154681154682154683154684154685154686154687154688154689154690154691154692154693154694154695154696154697154698154699154700154701154702154703154704154705154706154707154708154709154710154711154712154713154714154715154716154717154718154719154720154721154722154723154724154725154726154727154728154729154730154731154732154733154734154735154736154737154738154739154740154741154742154743154744154745154746154747154748154749154750154751154752154753154754154755154756154757154758154759154760154761154762154763154764154765154766154767154768154769154770154771154772154773154774154775154776154777154778154779154780154781154782154783154784154785154786154787154788154789154790154791154792154793154794154795154796154797154798154799154800154801154802154803154804154805154806154807154808154809154810154811154812154813154814154815154816154817154818154819154820154821154822154823154824154825154826154827154828154829154830154831154832154833154834154835154836154837154838154839154840154841154842154843154844154845154846154847154848154849154850154851154852154853154854154855154856154857154858154859154860154861154862154863154864154865154866154867154868154869154870154871154872154873154874154875154876154877154878154879154880154881154882154883154884154885154886154887154888154889154890154891154892154893154894154895154896154897154898154899154900154901154902154903154904154905154906154907154908154909154910154911154912154913154914154915154916154917154918154919154920154921154922154923154924154925154926154927154928154929154930154931154932154933154934154935154936154937154938154939154940154941154942154943154944154945154946154947154948154949154950154951154952154953154954154955154956154957154958154959154960154961154962154963154964154965154966154967154968154969154970154971154972154973154974154975154976154977154978154979154980154981154982154983154984154985154986154987154988154989154990154991154992154993154994154995154996154997154998154999155000155001155002155003155004155005155006155007155008155009155010155011155012155013155014155015155016155017155018155019155020155021155022155023155024155025155026155027155028155029155030155031155032155033155034155035155036155037155038155039155040155041155042155043155044155045155046155047155048155049155050155051155052155053155054155055155056155057155058155059155060155061155062155063155064155065155066155067155068155069155070155071155072155073155074155075155076155077155078155079155080155081155082155083155084155085155086155087155088155089155090155091155092155093155094155095155096155097155098155099155100155101155102155103155104155105155106155107155108155109155110155111155112155113155114155115155116155117155118155119155120155121155122155123155124155125155126155127155128155129155130155131155132155133155134155135155136155137155138155139155140155141155142155143155144155145155146155147155148155149155150155151155152155153155154155155155156155157155158155159155160155161155162155163155164155165155166155167155168155169155170155171155172155173155174155175155176155177155178155179155180155181155182155183155184155185155186155187155188155189155190155191155192155193155194155195155196155197155198155199155200155201155202155203155204155205155206155207155208155209155210155211155212155213155214155215155216155217155218155219155220155221155222155223155224155225155226155227155228155229155230155231155232155233155234155235155236155237155238155239155240155241155242155243155244155245155246155247155248155249155250155251155252155253155254155255155256155257155258155259155260155261155262155263155264155265155266155267155268155269155270155271155272155273155274155275155276155277155278155279155280155281155282155283155284155285155286155287155288155289155290155291155292155293155294155295155296155297155298155299155300155301155302155303155304155305155306155307155308155309155310155311155312155313155314155315155316155317155318155319155320155321155322155323155324155325155326155327155328155329155330155331155332155333155334155335155336155337155338155339155340155341155342155343155344155345155346155347155348155349155350155351155352155353155354155355155356155357155358155359155360155361155362155363155364155365155366155367155368155369155370155371155372155373155374155375155376155377155378155379155380155381155382155383155384155385155386155387155388155389155390155391155392155393155394155395155396155397155398155399155400155401155402155403155404155405155406155407155408155409155410155411155412155413155414155415155416155417155418155419155420155421155422155423155424155425155426155427155428155429155430155431155432155433155434155435155436155437155438155439155440155441155442155443155444155445155446155447155448155449155450155451155452155453155454155455155456155457155458155459155460155461155462155463155464155465155466155467155468155469155470155471155472155473155474155475155476155477155478155479155480155481155482155483155484155485155486155487155488155489155490155491155492155493155494155495155496155497155498155499155500155501155502155503155504155505155506155507155508155509155510155511155512155513155514155515155516155517155518155519155520155521155522155523155524155525155526155527155528155529155530155531155532155533155534155535155536155537155538155539155540155541155542155543155544155545155546155547155548155549155550155551155552155553155554155555155556155557155558155559155560155561155562155563155564155565155566155567155568155569155570155571155572155573155574155575155576155577155578155579155580155581155582155583155584155585155586155587155588155589155590155591155592155593155594155595155596155597155598155599155600155601155602155603155604155605155606155607155608155609155610155611155612155613155614155615155616155617155618155619155620155621155622155623155624155625155626155627155628155629155630155631155632155633155634155635155636155637155638155639155640155641155642155643155644155645155646155647155648155649155650155651155652155653155654155655155656155657155658155659155660155661155662155663155664155665155666155667155668155669155670155671155672155673155674155675155676155677155678155679155680155681155682155683155684155685155686155687155688155689155690155691155692155693155694155695155696155697155698155699155700155701155702155703155704155705155706155707155708155709155710155711155712155713155714155715155716155717155718155719155720155721155722155723155724155725155726155727155728155729155730155731155732155733155734155735155736155737155738155739155740155741155742155743155744155745155746155747155748155749155750155751155752155753155754155755155756155757155758155759155760155761155762155763155764155765155766155767155768155769155770155771155772155773155774155775155776155777155778155779155780155781155782155783155784155785155786155787155788155789155790155791155792155793155794155795155796155797155798155799155800155801155802155803155804155805155806155807155808155809155810155811155812155813155814155815155816155817155818155819155820155821155822155823155824155825155826155827155828155829155830155831155832155833155834155835155836155837155838155839155840155841155842155843155844155845155846155847155848155849155850155851155852155853155854155855155856155857155858155859155860155861155862155863155864155865155866155867155868155869155870155871155872155873155874155875155876155877155878155879155880155881155882155883155884155885155886155887155888155889155890155891155892155893155894155895155896155897155898155899155900155901155902155903155904155905155906155907155908155909155910155911155912155913155914155915155916155917155918155919155920155921155922155923155924155925155926155927155928155929155930155931155932155933155934155935155936155937155938155939155940155941155942155943155944155945155946155947155948155949155950155951155952155953155954155955155956155957155958155959155960155961155962155963155964155965155966155967155968155969155970155971155972155973155974155975155976155977155978155979155980155981155982155983155984155985155986155987155988155989155990155991155992155993155994155995155996155997155998155999156000156001156002156003156004156005156006156007156008156009156010156011156012156013156014156015156016156017156018156019156020156021156022156023156024156025156026156027156028156029156030156031156032156033156034156035156036156037156038156039156040156041156042156043156044156045156046156047156048156049156050156051156052156053156054156055156056156057156058156059156060156061156062156063156064156065156066156067156068156069156070156071156072156073156074156075156076156077156078156079156080156081156082156083156084156085156086156087156088156089156090156091156092156093156094156095156096156097156098156099156100156101156102156103156104156105156106156107156108156109156110156111156112156113156114156115156116156117156118156119156120156121156122156123156124156125156126156127156128156129156130156131156132156133156134156135156136156137156138156139156140156141156142156143156144156145156146156147156148156149156150156151156152156153156154156155156156156157156158156159156160156161156162156163156164156165156166156167156168156169156170156171156172156173156174156175156176156177156178156179156180156181156182156183156184156185156186156187156188156189156190156191156192156193156194156195156196156197156198156199156200156201156202156203156204156205156206156207156208156209156210156211156212156213156214156215156216156217156218156219156220156221156222156223156224156225156226156227156228156229156230156231156232156233156234156235156236156237156238156239156240156241156242156243156244156245156246156247156248156249156250156251156252156253156254156255156256156257156258156259156260156261156262156263156264156265156266156267156268156269156270156271156272156273156274156275156276156277156278156279156280156281156282156283156284156285156286156287156288156289156290156291156292156293156294156295156296156297156298156299156300156301156302156303156304156305156306156307156308156309156310156311156312156313156314156315156316156317156318156319156320156321156322156323156324156325156326156327156328156329156330156331156332156333156334156335156336156337156338156339156340156341156342156343156344156345156346156347156348156349156350156351156352156353156354156355156356156357156358156359156360156361156362156363156364156365156366156367156368156369156370156371156372156373156374156375156376156377156378156379156380156381156382156383156384156385156386156387156388156389156390156391156392156393156394156395156396156397156398156399156400156401156402156403156404156405156406156407156408156409156410156411156412156413156414156415156416156417156418156419156420156421156422156423156424156425156426156427156428156429156430156431156432156433156434156435156436156437156438156439156440156441156442156443156444156445156446156447156448156449156450156451156452156453156454156455156456156457156458156459156460156461156462156463156464156465156466156467156468156469156470156471156472156473156474156475156476156477156478156479156480156481156482156483156484156485156486156487156488156489156490156491156492156493156494156495156496156497156498156499156500156501156502156503156504156505156506156507156508156509156510156511156512156513156514156515156516156517156518156519156520156521156522156523156524156525156526156527156528156529156530156531156532156533156534156535156536156537156538156539156540156541156542156543156544156545156546156547156548156549156550156551156552156553156554156555156556156557156558156559156560156561156562156563156564156565156566156567156568156569156570156571156572156573156574156575156576156577156578156579156580156581156582156583156584156585156586156587156588156589156590156591156592156593156594156595156596156597156598156599156600156601156602156603156604156605156606156607156608156609156610156611156612156613156614156615156616156617156618156619156620156621156622156623156624156625156626156627156628156629156630156631156632156633156634156635156636156637156638156639156640156641156642156643156644156645156646156647156648156649156650156651156652156653156654156655156656156657156658156659156660156661156662156663156664156665156666156667156668156669156670156671156672156673156674156675156676156677156678156679156680156681156682156683156684156685156686156687156688156689156690156691156692156693156694156695156696156697156698156699156700156701156702156703156704156705156706156707156708156709156710156711156712156713156714156715156716156717156718156719156720156721156722156723156724156725156726156727156728156729156730156731156732156733156734156735156736156737156738156739156740156741156742156743156744156745156746156747156748156749156750156751156752156753156754156755156756156757156758156759156760156761156762156763156764156765156766156767156768156769156770156771156772156773156774156775156776156777156778156779156780156781156782156783156784156785156786156787156788156789156790156791156792156793156794156795156796156797156798156799156800156801156802156803156804156805156806156807156808
  1. /* sp.c
  2. *
  3. * Copyright (C) 2006-2023 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. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  42. #undef WOLFSSL_SP_SMALL_STACK
  43. #define WOLFSSL_SP_SMALL_STACK
  44. #endif
  45. #include <wolfssl/wolfcrypt/sp.h>
  46. #ifdef __IAR_SYSTEMS_ICC__
  47. #define __asm__ asm
  48. #define __volatile__ volatile
  49. #define WOLFSSL_NO_VAR_ASSIGN_REG
  50. #endif /* __IAR_SYSTEMS_ICC__ */
  51. #ifdef __KEIL__
  52. #define __asm__ __asm
  53. #define __volatile__ volatile
  54. #endif
  55. #ifdef WOLFSSL_SP_ARM32_ASM
  56. #define SP_PRINT_NUM(var, name, total, words, bits) \
  57. do { \
  58. int ii; \
  59. fprintf(stderr, name "=0x"); \
  60. for (ii = ((bits + 31) / 32) - 1; ii >= 0; ii--) \
  61. fprintf(stderr, SP_PRINT_FMT, (var)[ii]); \
  62. fprintf(stderr, "\n"); \
  63. } while (0)
  64. #define SP_PRINT_VAL(var, name) \
  65. fprintf(stderr, name "=0x" SP_PRINT_FMT "\n", var)
  66. #define SP_PRINT_INT(var, name) \
  67. fprintf(stderr, name "=%d\n", var)
  68. #if defined(WOLFSSL_HAVE_SP_RSA) || defined(WOLFSSL_HAVE_SP_DH)
  69. #ifndef WOLFSSL_SP_NO_2048
  70. /* Read big endian unsigned byte array into r.
  71. *
  72. * r A single precision integer.
  73. * size Maximum number of bytes to convert
  74. * a Byte array.
  75. * n Number of bytes in array to read.
  76. */
  77. static void sp_2048_from_bin(sp_digit* r, int size, const byte* a, int n)
  78. {
  79. int i;
  80. int j;
  81. byte* d;
  82. for (i = n - 1,j = 0; i >= 3; i -= 4) {
  83. r[j] = ((sp_digit)a[i - 0] << 0) |
  84. ((sp_digit)a[i - 1] << 8) |
  85. ((sp_digit)a[i - 2] << 16) |
  86. ((sp_digit)a[i - 3] << 24);
  87. j++;
  88. }
  89. if (i >= 0) {
  90. r[j] = 0;
  91. d = (byte*)r;
  92. switch (i) {
  93. case 2: d[n - 1 - 2] = a[2]; //fallthrough
  94. case 1: d[n - 1 - 1] = a[1]; //fallthrough
  95. case 0: d[n - 1 - 0] = a[0]; //fallthrough
  96. }
  97. j++;
  98. }
  99. for (; j < size; j++) {
  100. r[j] = 0;
  101. }
  102. }
  103. /* Convert an mp_int to an array of sp_digit.
  104. *
  105. * r A single precision integer.
  106. * size Maximum number of bytes to convert
  107. * a A multi-precision integer.
  108. */
  109. static void sp_2048_from_mp(sp_digit* r, int size, const mp_int* a)
  110. {
  111. #if DIGIT_BIT == 32
  112. int i;
  113. sp_digit j = (sp_digit)0 - (sp_digit)a->used;
  114. int o = 0;
  115. for (i = 0; i < size; i++) {
  116. sp_digit mask = (sp_digit)0 - (j >> 31);
  117. r[i] = a->dp[o] & mask;
  118. j++;
  119. o += (int)(j >> 31);
  120. }
  121. #elif DIGIT_BIT > 32
  122. unsigned int i;
  123. int j = 0;
  124. word32 s = 0;
  125. r[0] = 0;
  126. for (i = 0; i < (unsigned int)a->used && j < size; i++) {
  127. r[j] |= ((sp_digit)a->dp[i] << s);
  128. r[j] &= 0xffffffff;
  129. s = 32U - s;
  130. if (j + 1 >= size) {
  131. break;
  132. }
  133. /* lint allow cast of mismatch word32 and mp_digit */
  134. r[++j] = (sp_digit)(a->dp[i] >> s); /*lint !e9033*/
  135. while ((s + 32U) <= (word32)DIGIT_BIT) {
  136. s += 32U;
  137. r[j] &= 0xffffffff;
  138. if (j + 1 >= size) {
  139. break;
  140. }
  141. if (s < (word32)DIGIT_BIT) {
  142. /* lint allow cast of mismatch word32 and mp_digit */
  143. r[++j] = (sp_digit)(a->dp[i] >> s); /*lint !e9033*/
  144. }
  145. else {
  146. r[++j] = (sp_digit)0;
  147. }
  148. }
  149. s = (word32)DIGIT_BIT - s;
  150. }
  151. for (j++; j < size; j++) {
  152. r[j] = 0;
  153. }
  154. #else
  155. unsigned int i;
  156. int j = 0;
  157. int s = 0;
  158. r[0] = 0;
  159. for (i = 0; i < (unsigned int)a->used && j < size; i++) {
  160. r[j] |= ((sp_digit)a->dp[i]) << s;
  161. if (s + DIGIT_BIT >= 32) {
  162. r[j] &= 0xffffffff;
  163. if (j + 1 >= size) {
  164. break;
  165. }
  166. s = 32 - s;
  167. if (s == DIGIT_BIT) {
  168. r[++j] = 0;
  169. s = 0;
  170. }
  171. else {
  172. r[++j] = a->dp[i] >> s;
  173. s = DIGIT_BIT - s;
  174. }
  175. }
  176. else {
  177. s += DIGIT_BIT;
  178. }
  179. }
  180. for (j++; j < size; j++) {
  181. r[j] = 0;
  182. }
  183. #endif
  184. }
  185. /* Write r as big endian to byte array.
  186. * Fixed length number of bytes written: 256
  187. *
  188. * r A single precision integer.
  189. * a Byte array.
  190. */
  191. static void sp_2048_to_bin_64(sp_digit* r, byte* a)
  192. {
  193. int i;
  194. int j = 0;
  195. for (i = 63; i >= 0; i--) {
  196. a[j++] = r[i] >> 24;
  197. a[j++] = r[i] >> 16;
  198. a[j++] = r[i] >> 8;
  199. a[j++] = r[i] >> 0;
  200. }
  201. }
  202. #if (defined(WOLFSSL_HAVE_SP_RSA) && (!defined(WOLFSSL_RSA_PUBLIC_ONLY) || !defined(WOLFSSL_SP_SMALL))) || defined(WOLFSSL_HAVE_SP_DH)
  203. /* Normalize the values in each word to 32.
  204. *
  205. * a Array of sp_digit to normalize.
  206. */
  207. #define sp_2048_norm_64(a)
  208. #endif /* (WOLFSSL_HAVE_SP_RSA && (!WOLFSSL_RSA_PUBLIC_ONLY || !WOLFSSL_SP_SMALL)) || WOLFSSL_HAVE_SP_DH */
  209. /* Normalize the values in each word to 32.
  210. *
  211. * a Array of sp_digit to normalize.
  212. */
  213. #define sp_2048_norm_64(a)
  214. #ifndef WOLFSSL_SP_SMALL
  215. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  216. /* Multiply a and b into r. (r = a * b)
  217. *
  218. * r A single precision integer.
  219. * a A single precision integer.
  220. * b A single precision integer.
  221. */
  222. static void sp_2048_mul_8(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p)
  223. {
  224. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  225. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  226. register const sp_digit* b asm ("r2") = (const sp_digit*)b_p;
  227. __asm__ __volatile__ (
  228. "sub sp, sp, #32\n\t"
  229. /* A[0] * B[0] */
  230. "ldr r11, [%[a]]\n\t"
  231. "ldr r12, [%[b]]\n\t"
  232. "lsl r6, r11, #16\n\t"
  233. "lsl r3, r12, #16\n\t"
  234. "lsr r6, r6, #16\n\t"
  235. "lsr r3, r3, #16\n\t"
  236. "mul r3, r6, r3\n\t"
  237. "lsr r7, r12, #16\n\t"
  238. "mul r6, r7, r6\n\t"
  239. "lsr r4, r6, #16\n\t"
  240. "lsl r6, r6, #16\n\t"
  241. "adds r3, r3, r6\n\t"
  242. "adc r4, r4, #0\n\t"
  243. "lsr r6, r11, #16\n\t"
  244. "mul r7, r6, r7\n\t"
  245. "add r4, r4, r7\n\t"
  246. "lsl r7, r12, #16\n\t"
  247. "lsr r7, r7, #16\n\t"
  248. "mul r6, r7, r6\n\t"
  249. "lsr r7, r6, #16\n\t"
  250. "lsl r6, r6, #16\n\t"
  251. "adds r3, r3, r6\n\t"
  252. "adc r4, r4, r7\n\t"
  253. "mov r5, #0\n\t"
  254. "str r3, [sp]\n\t"
  255. /* A[0] * B[1] */
  256. "ldr r9, [%[b], #4]\n\t"
  257. "lsl r6, r11, #16\n\t"
  258. "lsl r7, r9, #16\n\t"
  259. "lsr r6, r6, #16\n\t"
  260. "lsr r7, r7, #16\n\t"
  261. "mul r7, r6, r7\n\t"
  262. "adds r4, r4, r7\n\t"
  263. "adcs r5, r5, #0\n\t"
  264. "mov r3, #0\n\t"
  265. "adc r3, r3, #0\n\t"
  266. "lsr r7, r9, #16\n\t"
  267. "mul r6, r7, r6\n\t"
  268. "lsr r7, r6, #16\n\t"
  269. "lsl r6, r6, #16\n\t"
  270. "adds r4, r4, r6\n\t"
  271. "adcs r5, r5, r7\n\t"
  272. "adc r3, r3, #0\n\t"
  273. "lsr r6, r11, #16\n\t"
  274. "lsr r7, r9, #16\n\t"
  275. "mul r7, r6, r7\n\t"
  276. "adds r5, r5, r7\n\t"
  277. "adc r3, r3, #0\n\t"
  278. "lsl r7, r9, #16\n\t"
  279. "lsr r7, r7, #16\n\t"
  280. "mul r6, r7, r6\n\t"
  281. "lsr r7, r6, #16\n\t"
  282. "lsl r6, r6, #16\n\t"
  283. "adds r4, r4, r6\n\t"
  284. "adcs r5, r5, r7\n\t"
  285. "adc r3, r3, #0\n\t"
  286. /* A[1] * B[0] */
  287. "ldr r8, [%[a], #4]\n\t"
  288. "lsl r6, r8, #16\n\t"
  289. "lsl r7, r12, #16\n\t"
  290. "lsr r6, r6, #16\n\t"
  291. "lsr r7, r7, #16\n\t"
  292. "mul r7, r6, r7\n\t"
  293. "adds r4, r4, r7\n\t"
  294. "adcs r5, r5, #0\n\t"
  295. "adc r3, r3, #0\n\t"
  296. "lsr r7, r12, #16\n\t"
  297. "mul r6, r7, r6\n\t"
  298. "lsr r7, r6, #16\n\t"
  299. "lsl r6, r6, #16\n\t"
  300. "adds r4, r4, r6\n\t"
  301. "adcs r5, r5, r7\n\t"
  302. "adc r3, r3, #0\n\t"
  303. "lsr r6, r8, #16\n\t"
  304. "lsr r7, r12, #16\n\t"
  305. "mul r7, r6, r7\n\t"
  306. "adds r5, r5, r7\n\t"
  307. "adc r3, r3, #0\n\t"
  308. "lsl r7, r12, #16\n\t"
  309. "lsr r7, r7, #16\n\t"
  310. "mul r6, r7, r6\n\t"
  311. "lsr r7, r6, #16\n\t"
  312. "lsl r6, r6, #16\n\t"
  313. "adds r4, r4, r6\n\t"
  314. "adcs r5, r5, r7\n\t"
  315. "adc r3, r3, #0\n\t"
  316. "str r4, [sp, #4]\n\t"
  317. /* A[2] * B[0] */
  318. "ldr r8, [%[a], #8]\n\t"
  319. "lsl r6, r8, #16\n\t"
  320. "lsl r7, r12, #16\n\t"
  321. "lsr r6, r6, #16\n\t"
  322. "lsr r7, r7, #16\n\t"
  323. "mul r7, r6, r7\n\t"
  324. "adds r5, r5, r7\n\t"
  325. "adcs r3, r3, #0\n\t"
  326. "mov r4, #0\n\t"
  327. "adc r4, r4, #0\n\t"
  328. "lsr r7, r12, #16\n\t"
  329. "mul r6, r7, r6\n\t"
  330. "lsr r7, r6, #16\n\t"
  331. "lsl r6, r6, #16\n\t"
  332. "adds r5, r5, r6\n\t"
  333. "adcs r3, r3, r7\n\t"
  334. "adc r4, r4, #0\n\t"
  335. "lsr r6, r8, #16\n\t"
  336. "lsr r7, r12, #16\n\t"
  337. "mul r7, r6, r7\n\t"
  338. "adds r3, r3, r7\n\t"
  339. "adc r4, r4, #0\n\t"
  340. "lsl r7, r12, #16\n\t"
  341. "lsr r7, r7, #16\n\t"
  342. "mul r6, r7, r6\n\t"
  343. "lsr r7, r6, #16\n\t"
  344. "lsl r6, r6, #16\n\t"
  345. "adds r5, r5, r6\n\t"
  346. "adcs r3, r3, r7\n\t"
  347. "adc r4, r4, #0\n\t"
  348. /* A[1] * B[1] */
  349. "ldr r11, [%[a], #4]\n\t"
  350. "ldr r12, [%[b], #4]\n\t"
  351. "lsl r6, r11, #16\n\t"
  352. "lsl r7, r12, #16\n\t"
  353. "lsr r6, r6, #16\n\t"
  354. "lsr r7, r7, #16\n\t"
  355. "mul r7, r6, r7\n\t"
  356. "adds r5, r5, r7\n\t"
  357. "adcs r3, r3, #0\n\t"
  358. "adc r4, r4, #0\n\t"
  359. "lsr r7, r12, #16\n\t"
  360. "mul r6, r7, r6\n\t"
  361. "lsr r7, r6, #16\n\t"
  362. "lsl r6, r6, #16\n\t"
  363. "adds r5, r5, r6\n\t"
  364. "adcs r3, r3, r7\n\t"
  365. "adc r4, r4, #0\n\t"
  366. "lsr r6, r11, #16\n\t"
  367. "lsr r7, r12, #16\n\t"
  368. "mul r7, r6, r7\n\t"
  369. "adds r3, r3, r7\n\t"
  370. "adc r4, r4, #0\n\t"
  371. "lsl r7, r12, #16\n\t"
  372. "lsr r7, r7, #16\n\t"
  373. "mul r6, r7, r6\n\t"
  374. "lsr r7, r6, #16\n\t"
  375. "lsl r6, r6, #16\n\t"
  376. "adds r5, r5, r6\n\t"
  377. "adcs r3, r3, r7\n\t"
  378. "adc r4, r4, #0\n\t"
  379. /* A[0] * B[2] */
  380. "ldr r8, [%[a]]\n\t"
  381. "ldr r9, [%[b], #8]\n\t"
  382. "lsl r6, r8, #16\n\t"
  383. "lsl r7, r9, #16\n\t"
  384. "lsr r6, r6, #16\n\t"
  385. "lsr r7, r7, #16\n\t"
  386. "mul r7, r6, r7\n\t"
  387. "adds r5, r5, r7\n\t"
  388. "adcs r3, r3, #0\n\t"
  389. "adc r4, r4, #0\n\t"
  390. "lsr r7, r9, #16\n\t"
  391. "mul r6, r7, r6\n\t"
  392. "lsr r7, r6, #16\n\t"
  393. "lsl r6, r6, #16\n\t"
  394. "adds r5, r5, r6\n\t"
  395. "adcs r3, r3, r7\n\t"
  396. "adc r4, r4, #0\n\t"
  397. "lsr r6, r8, #16\n\t"
  398. "lsr r7, r9, #16\n\t"
  399. "mul r7, r6, r7\n\t"
  400. "adds r3, r3, r7\n\t"
  401. "adc r4, r4, #0\n\t"
  402. "lsl r7, r9, #16\n\t"
  403. "lsr r7, r7, #16\n\t"
  404. "mul r6, r7, r6\n\t"
  405. "lsr r7, r6, #16\n\t"
  406. "lsl r6, r6, #16\n\t"
  407. "adds r5, r5, r6\n\t"
  408. "adcs r3, r3, r7\n\t"
  409. "adc r4, r4, #0\n\t"
  410. "str r5, [sp, #8]\n\t"
  411. /* A[0] * B[3] */
  412. "ldr r9, [%[b], #12]\n\t"
  413. "lsl r6, r8, #16\n\t"
  414. "lsl r7, r9, #16\n\t"
  415. "lsr r6, r6, #16\n\t"
  416. "lsr r7, r7, #16\n\t"
  417. "mul r7, r6, r7\n\t"
  418. "adds r3, r3, r7\n\t"
  419. "adcs r4, r4, #0\n\t"
  420. "mov r5, #0\n\t"
  421. "adc r5, r5, #0\n\t"
  422. "lsr r7, r9, #16\n\t"
  423. "mul r6, r7, r6\n\t"
  424. "lsr r7, r6, #16\n\t"
  425. "lsl r6, r6, #16\n\t"
  426. "adds r3, r3, r6\n\t"
  427. "adcs r4, r4, r7\n\t"
  428. "adc r5, r5, #0\n\t"
  429. "lsr r6, r8, #16\n\t"
  430. "lsr r7, r9, #16\n\t"
  431. "mul r7, r6, r7\n\t"
  432. "adds r4, r4, r7\n\t"
  433. "adc r5, r5, #0\n\t"
  434. "lsl r7, r9, #16\n\t"
  435. "lsr r7, r7, #16\n\t"
  436. "mul r6, r7, r6\n\t"
  437. "lsr r7, r6, #16\n\t"
  438. "lsl r6, r6, #16\n\t"
  439. "adds r3, r3, r6\n\t"
  440. "adcs r4, r4, r7\n\t"
  441. "adc r5, r5, #0\n\t"
  442. /* A[1] * B[2] */
  443. "ldr r9, [%[b], #8]\n\t"
  444. "lsl r6, r11, #16\n\t"
  445. "lsl r7, r9, #16\n\t"
  446. "lsr r6, r6, #16\n\t"
  447. "lsr r7, r7, #16\n\t"
  448. "mul r7, r6, r7\n\t"
  449. "adds r3, r3, r7\n\t"
  450. "adcs r4, r4, #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, r11, #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. /* A[2] * B[1] */
  473. "ldr r8, [%[a], #8]\n\t"
  474. "lsl r6, r8, #16\n\t"
  475. "lsl r7, r12, #16\n\t"
  476. "lsr r6, r6, #16\n\t"
  477. "lsr r7, r7, #16\n\t"
  478. "mul r7, r6, r7\n\t"
  479. "adds r3, r3, r7\n\t"
  480. "adcs r4, r4, #0\n\t"
  481. "adc r5, r5, #0\n\t"
  482. "lsr r7, r12, #16\n\t"
  483. "mul r6, r7, r6\n\t"
  484. "lsr r7, r6, #16\n\t"
  485. "lsl r6, r6, #16\n\t"
  486. "adds r3, r3, r6\n\t"
  487. "adcs r4, r4, r7\n\t"
  488. "adc r5, r5, #0\n\t"
  489. "lsr r6, r8, #16\n\t"
  490. "lsr r7, r12, #16\n\t"
  491. "mul r7, r6, r7\n\t"
  492. "adds r4, r4, r7\n\t"
  493. "adc r5, r5, #0\n\t"
  494. "lsl r7, r12, #16\n\t"
  495. "lsr r7, r7, #16\n\t"
  496. "mul r6, r7, r6\n\t"
  497. "lsr r7, r6, #16\n\t"
  498. "lsl r6, r6, #16\n\t"
  499. "adds r3, r3, r6\n\t"
  500. "adcs r4, r4, r7\n\t"
  501. "adc r5, r5, #0\n\t"
  502. /* A[3] * B[0] */
  503. "ldr r8, [%[a], #12]\n\t"
  504. "ldr r9, [%[b]]\n\t"
  505. "lsl r6, r8, #16\n\t"
  506. "lsl r7, r9, #16\n\t"
  507. "lsr r6, r6, #16\n\t"
  508. "lsr r7, r7, #16\n\t"
  509. "mul r7, r6, r7\n\t"
  510. "adds r3, r3, r7\n\t"
  511. "adcs r4, r4, #0\n\t"
  512. "adc r5, r5, #0\n\t"
  513. "lsr r7, r9, #16\n\t"
  514. "mul r6, r7, r6\n\t"
  515. "lsr r7, r6, #16\n\t"
  516. "lsl r6, r6, #16\n\t"
  517. "adds r3, r3, r6\n\t"
  518. "adcs r4, r4, r7\n\t"
  519. "adc r5, r5, #0\n\t"
  520. "lsr r6, r8, #16\n\t"
  521. "lsr r7, r9, #16\n\t"
  522. "mul r7, r6, r7\n\t"
  523. "adds r4, r4, r7\n\t"
  524. "adc r5, r5, #0\n\t"
  525. "lsl r7, r9, #16\n\t"
  526. "lsr r7, r7, #16\n\t"
  527. "mul r6, r7, r6\n\t"
  528. "lsr r7, r6, #16\n\t"
  529. "lsl r6, r6, #16\n\t"
  530. "adds r3, r3, r6\n\t"
  531. "adcs r4, r4, r7\n\t"
  532. "adc r5, r5, #0\n\t"
  533. "str r3, [sp, #12]\n\t"
  534. /* A[4] * B[0] */
  535. "ldr r8, [%[a], #16]\n\t"
  536. "lsl r6, r8, #16\n\t"
  537. "lsl r7, r9, #16\n\t"
  538. "lsr r6, r6, #16\n\t"
  539. "lsr r7, r7, #16\n\t"
  540. "mul r7, r6, r7\n\t"
  541. "adds r4, r4, r7\n\t"
  542. "adcs r5, r5, #0\n\t"
  543. "mov r3, #0\n\t"
  544. "adc r3, r3, #0\n\t"
  545. "lsr r7, r9, #16\n\t"
  546. "mul r6, r7, r6\n\t"
  547. "lsr r7, r6, #16\n\t"
  548. "lsl r6, r6, #16\n\t"
  549. "adds r4, r4, r6\n\t"
  550. "adcs r5, r5, r7\n\t"
  551. "adc r3, r3, #0\n\t"
  552. "lsr r6, r8, #16\n\t"
  553. "lsr r7, r9, #16\n\t"
  554. "mul r7, r6, r7\n\t"
  555. "adds r5, r5, r7\n\t"
  556. "adc r3, r3, #0\n\t"
  557. "lsl r7, r9, #16\n\t"
  558. "lsr r7, r7, #16\n\t"
  559. "mul r6, r7, r6\n\t"
  560. "lsr r7, r6, #16\n\t"
  561. "lsl r6, r6, #16\n\t"
  562. "adds r4, r4, r6\n\t"
  563. "adcs r5, r5, r7\n\t"
  564. "adc r3, r3, #0\n\t"
  565. /* A[3] * B[1] */
  566. "ldr r8, [%[a], #12]\n\t"
  567. "lsl r6, r8, #16\n\t"
  568. "lsl r7, r12, #16\n\t"
  569. "lsr r6, r6, #16\n\t"
  570. "lsr r7, r7, #16\n\t"
  571. "mul r7, r6, r7\n\t"
  572. "adds r4, r4, r7\n\t"
  573. "adcs r5, r5, #0\n\t"
  574. "adc r3, r3, #0\n\t"
  575. "lsr r7, r12, #16\n\t"
  576. "mul r6, r7, r6\n\t"
  577. "lsr r7, r6, #16\n\t"
  578. "lsl r6, r6, #16\n\t"
  579. "adds r4, r4, r6\n\t"
  580. "adcs r5, r5, r7\n\t"
  581. "adc r3, r3, #0\n\t"
  582. "lsr r6, r8, #16\n\t"
  583. "lsr r7, r12, #16\n\t"
  584. "mul r7, r6, r7\n\t"
  585. "adds r5, r5, r7\n\t"
  586. "adc r3, r3, #0\n\t"
  587. "lsl r7, r12, #16\n\t"
  588. "lsr r7, r7, #16\n\t"
  589. "mul r6, r7, r6\n\t"
  590. "lsr r7, r6, #16\n\t"
  591. "lsl r6, r6, #16\n\t"
  592. "adds r4, r4, r6\n\t"
  593. "adcs r5, r5, r7\n\t"
  594. "adc r3, r3, #0\n\t"
  595. /* A[2] * B[2] */
  596. "ldr r11, [%[a], #8]\n\t"
  597. "ldr r12, [%[b], #8]\n\t"
  598. "lsl r6, r11, #16\n\t"
  599. "lsl r7, r12, #16\n\t"
  600. "lsr r6, r6, #16\n\t"
  601. "lsr r7, r7, #16\n\t"
  602. "mul r7, r6, r7\n\t"
  603. "adds r4, r4, r7\n\t"
  604. "adcs r5, r5, #0\n\t"
  605. "adc r3, r3, #0\n\t"
  606. "lsr r7, r12, #16\n\t"
  607. "mul r6, r7, r6\n\t"
  608. "lsr r7, r6, #16\n\t"
  609. "lsl r6, r6, #16\n\t"
  610. "adds r4, r4, r6\n\t"
  611. "adcs r5, r5, r7\n\t"
  612. "adc r3, r3, #0\n\t"
  613. "lsr r6, r11, #16\n\t"
  614. "lsr r7, r12, #16\n\t"
  615. "mul r7, r6, r7\n\t"
  616. "adds r5, r5, r7\n\t"
  617. "adc r3, r3, #0\n\t"
  618. "lsl r7, r12, #16\n\t"
  619. "lsr r7, r7, #16\n\t"
  620. "mul r6, r7, r6\n\t"
  621. "lsr r7, r6, #16\n\t"
  622. "lsl r6, r6, #16\n\t"
  623. "adds r4, r4, r6\n\t"
  624. "adcs r5, r5, r7\n\t"
  625. "adc r3, r3, #0\n\t"
  626. /* A[1] * B[3] */
  627. "ldr r8, [%[a], #4]\n\t"
  628. "ldr r9, [%[b], #12]\n\t"
  629. "lsl r6, r8, #16\n\t"
  630. "lsl r7, r9, #16\n\t"
  631. "lsr r6, r6, #16\n\t"
  632. "lsr r7, r7, #16\n\t"
  633. "mul r7, r6, r7\n\t"
  634. "adds r4, r4, r7\n\t"
  635. "adcs r5, r5, #0\n\t"
  636. "adc r3, r3, #0\n\t"
  637. "lsr r7, r9, #16\n\t"
  638. "mul r6, r7, r6\n\t"
  639. "lsr r7, r6, #16\n\t"
  640. "lsl r6, r6, #16\n\t"
  641. "adds r4, r4, r6\n\t"
  642. "adcs r5, r5, r7\n\t"
  643. "adc r3, r3, #0\n\t"
  644. "lsr r6, r8, #16\n\t"
  645. "lsr r7, r9, #16\n\t"
  646. "mul r7, r6, r7\n\t"
  647. "adds r5, r5, r7\n\t"
  648. "adc r3, r3, #0\n\t"
  649. "lsl r7, r9, #16\n\t"
  650. "lsr r7, r7, #16\n\t"
  651. "mul r6, r7, r6\n\t"
  652. "lsr r7, r6, #16\n\t"
  653. "lsl r6, r6, #16\n\t"
  654. "adds r4, r4, r6\n\t"
  655. "adcs r5, r5, r7\n\t"
  656. "adc r3, r3, #0\n\t"
  657. /* A[0] * B[4] */
  658. "ldr r8, [%[a]]\n\t"
  659. "ldr r9, [%[b], #16]\n\t"
  660. "lsl r6, r8, #16\n\t"
  661. "lsl r7, r9, #16\n\t"
  662. "lsr r6, r6, #16\n\t"
  663. "lsr r7, r7, #16\n\t"
  664. "mul r7, r6, r7\n\t"
  665. "adds r4, r4, r7\n\t"
  666. "adcs r5, r5, #0\n\t"
  667. "adc r3, r3, #0\n\t"
  668. "lsr r7, r9, #16\n\t"
  669. "mul r6, r7, r6\n\t"
  670. "lsr r7, r6, #16\n\t"
  671. "lsl r6, r6, #16\n\t"
  672. "adds r4, r4, r6\n\t"
  673. "adcs r5, r5, r7\n\t"
  674. "adc r3, r3, #0\n\t"
  675. "lsr r6, r8, #16\n\t"
  676. "lsr r7, r9, #16\n\t"
  677. "mul r7, r6, r7\n\t"
  678. "adds r5, r5, r7\n\t"
  679. "adc r3, r3, #0\n\t"
  680. "lsl r7, r9, #16\n\t"
  681. "lsr r7, r7, #16\n\t"
  682. "mul r6, r7, r6\n\t"
  683. "lsr r7, r6, #16\n\t"
  684. "lsl r6, r6, #16\n\t"
  685. "adds r4, r4, r6\n\t"
  686. "adcs r5, r5, r7\n\t"
  687. "adc r3, r3, #0\n\t"
  688. "str r4, [sp, #16]\n\t"
  689. /* A[0] * B[5] */
  690. "ldr r9, [%[b], #20]\n\t"
  691. "lsl r6, r8, #16\n\t"
  692. "lsl r7, r9, #16\n\t"
  693. "lsr r6, r6, #16\n\t"
  694. "lsr r7, r7, #16\n\t"
  695. "mul r7, r6, r7\n\t"
  696. "adds r5, r5, r7\n\t"
  697. "adcs r3, r3, #0\n\t"
  698. "mov r4, #0\n\t"
  699. "adc r4, r4, #0\n\t"
  700. "lsr r7, r9, #16\n\t"
  701. "mul r6, r7, r6\n\t"
  702. "lsr r7, r6, #16\n\t"
  703. "lsl r6, r6, #16\n\t"
  704. "adds r5, r5, r6\n\t"
  705. "adcs r3, r3, r7\n\t"
  706. "adc r4, r4, #0\n\t"
  707. "lsr r6, r8, #16\n\t"
  708. "lsr r7, r9, #16\n\t"
  709. "mul r7, r6, r7\n\t"
  710. "adds r3, r3, r7\n\t"
  711. "adc r4, r4, #0\n\t"
  712. "lsl r7, r9, #16\n\t"
  713. "lsr r7, r7, #16\n\t"
  714. "mul r6, r7, r6\n\t"
  715. "lsr r7, r6, #16\n\t"
  716. "lsl r6, r6, #16\n\t"
  717. "adds r5, r5, r6\n\t"
  718. "adcs r3, r3, r7\n\t"
  719. "adc r4, r4, #0\n\t"
  720. /* A[1] * B[4] */
  721. "ldr r8, [%[a], #4]\n\t"
  722. "ldr r9, [%[b], #16]\n\t"
  723. "lsl r6, r8, #16\n\t"
  724. "lsl r7, r9, #16\n\t"
  725. "lsr r6, r6, #16\n\t"
  726. "lsr r7, r7, #16\n\t"
  727. "mul r7, r6, r7\n\t"
  728. "adds r5, r5, r7\n\t"
  729. "adcs r3, r3, #0\n\t"
  730. "adc r4, r4, #0\n\t"
  731. "lsr r7, r9, #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 r5, r5, r6\n\t"
  736. "adcs r3, r3, r7\n\t"
  737. "adc r4, r4, #0\n\t"
  738. "lsr r6, r8, #16\n\t"
  739. "lsr r7, r9, #16\n\t"
  740. "mul r7, r6, r7\n\t"
  741. "adds r3, r3, r7\n\t"
  742. "adc r4, r4, #0\n\t"
  743. "lsl r7, r9, #16\n\t"
  744. "lsr r7, r7, #16\n\t"
  745. "mul r6, r7, r6\n\t"
  746. "lsr r7, r6, #16\n\t"
  747. "lsl r6, r6, #16\n\t"
  748. "adds r5, r5, r6\n\t"
  749. "adcs r3, r3, r7\n\t"
  750. "adc r4, r4, #0\n\t"
  751. /* A[2] * B[3] */
  752. "ldr r9, [%[b], #12]\n\t"
  753. "lsl r6, r11, #16\n\t"
  754. "lsl r7, r9, #16\n\t"
  755. "lsr r6, r6, #16\n\t"
  756. "lsr r7, r7, #16\n\t"
  757. "mul r7, r6, r7\n\t"
  758. "adds r5, r5, r7\n\t"
  759. "adcs r3, r3, #0\n\t"
  760. "adc r4, r4, #0\n\t"
  761. "lsr r7, r9, #16\n\t"
  762. "mul r6, r7, r6\n\t"
  763. "lsr r7, r6, #16\n\t"
  764. "lsl r6, r6, #16\n\t"
  765. "adds r5, r5, r6\n\t"
  766. "adcs r3, r3, r7\n\t"
  767. "adc r4, r4, #0\n\t"
  768. "lsr r6, r11, #16\n\t"
  769. "lsr r7, r9, #16\n\t"
  770. "mul r7, r6, r7\n\t"
  771. "adds r3, r3, r7\n\t"
  772. "adc r4, r4, #0\n\t"
  773. "lsl r7, r9, #16\n\t"
  774. "lsr r7, r7, #16\n\t"
  775. "mul r6, r7, r6\n\t"
  776. "lsr r7, r6, #16\n\t"
  777. "lsl r6, r6, #16\n\t"
  778. "adds r5, r5, r6\n\t"
  779. "adcs r3, r3, r7\n\t"
  780. "adc r4, r4, #0\n\t"
  781. /* A[3] * B[2] */
  782. "ldr r8, [%[a], #12]\n\t"
  783. "lsl r6, r8, #16\n\t"
  784. "lsl r7, r12, #16\n\t"
  785. "lsr r6, r6, #16\n\t"
  786. "lsr r7, r7, #16\n\t"
  787. "mul r7, r6, r7\n\t"
  788. "adds r5, r5, r7\n\t"
  789. "adcs r3, r3, #0\n\t"
  790. "adc r4, r4, #0\n\t"
  791. "lsr r7, r12, #16\n\t"
  792. "mul r6, r7, r6\n\t"
  793. "lsr r7, r6, #16\n\t"
  794. "lsl r6, r6, #16\n\t"
  795. "adds r5, r5, r6\n\t"
  796. "adcs r3, r3, r7\n\t"
  797. "adc r4, r4, #0\n\t"
  798. "lsr r6, r8, #16\n\t"
  799. "lsr r7, r12, #16\n\t"
  800. "mul r7, r6, r7\n\t"
  801. "adds r3, r3, r7\n\t"
  802. "adc r4, r4, #0\n\t"
  803. "lsl r7, r12, #16\n\t"
  804. "lsr r7, r7, #16\n\t"
  805. "mul r6, r7, r6\n\t"
  806. "lsr r7, r6, #16\n\t"
  807. "lsl r6, r6, #16\n\t"
  808. "adds r5, r5, r6\n\t"
  809. "adcs r3, r3, r7\n\t"
  810. "adc r4, r4, #0\n\t"
  811. /* A[4] * B[1] */
  812. "ldr r8, [%[a], #16]\n\t"
  813. "ldr r9, [%[b], #4]\n\t"
  814. "lsl r6, r8, #16\n\t"
  815. "lsl r7, r9, #16\n\t"
  816. "lsr r6, r6, #16\n\t"
  817. "lsr r7, r7, #16\n\t"
  818. "mul r7, r6, r7\n\t"
  819. "adds r5, r5, r7\n\t"
  820. "adcs r3, r3, #0\n\t"
  821. "adc r4, r4, #0\n\t"
  822. "lsr r7, r9, #16\n\t"
  823. "mul r6, r7, r6\n\t"
  824. "lsr r7, r6, #16\n\t"
  825. "lsl r6, r6, #16\n\t"
  826. "adds r5, r5, r6\n\t"
  827. "adcs r3, r3, r7\n\t"
  828. "adc r4, r4, #0\n\t"
  829. "lsr r6, r8, #16\n\t"
  830. "lsr r7, r9, #16\n\t"
  831. "mul r7, r6, r7\n\t"
  832. "adds r3, r3, r7\n\t"
  833. "adc r4, r4, #0\n\t"
  834. "lsl r7, r9, #16\n\t"
  835. "lsr r7, r7, #16\n\t"
  836. "mul r6, r7, r6\n\t"
  837. "lsr r7, r6, #16\n\t"
  838. "lsl r6, r6, #16\n\t"
  839. "adds r5, r5, r6\n\t"
  840. "adcs r3, r3, r7\n\t"
  841. "adc r4, r4, #0\n\t"
  842. /* A[5] * B[0] */
  843. "ldr r8, [%[a], #20]\n\t"
  844. "ldr r9, [%[b]]\n\t"
  845. "lsl r6, r8, #16\n\t"
  846. "lsl r7, r9, #16\n\t"
  847. "lsr r6, r6, #16\n\t"
  848. "lsr r7, r7, #16\n\t"
  849. "mul r7, r6, r7\n\t"
  850. "adds r5, r5, r7\n\t"
  851. "adcs r3, r3, #0\n\t"
  852. "adc r4, r4, #0\n\t"
  853. "lsr r7, r9, #16\n\t"
  854. "mul r6, r7, r6\n\t"
  855. "lsr r7, r6, #16\n\t"
  856. "lsl r6, r6, #16\n\t"
  857. "adds r5, r5, r6\n\t"
  858. "adcs r3, r3, r7\n\t"
  859. "adc r4, r4, #0\n\t"
  860. "lsr r6, r8, #16\n\t"
  861. "lsr r7, r9, #16\n\t"
  862. "mul r7, r6, r7\n\t"
  863. "adds r3, r3, r7\n\t"
  864. "adc r4, r4, #0\n\t"
  865. "lsl r7, r9, #16\n\t"
  866. "lsr r7, r7, #16\n\t"
  867. "mul r6, r7, r6\n\t"
  868. "lsr r7, r6, #16\n\t"
  869. "lsl r6, r6, #16\n\t"
  870. "adds r5, r5, r6\n\t"
  871. "adcs r3, r3, r7\n\t"
  872. "adc r4, r4, #0\n\t"
  873. "str r5, [sp, #20]\n\t"
  874. /* A[6] * B[0] */
  875. "ldr r8, [%[a], #24]\n\t"
  876. "lsl r6, r8, #16\n\t"
  877. "lsl r7, r9, #16\n\t"
  878. "lsr r6, r6, #16\n\t"
  879. "lsr r7, r7, #16\n\t"
  880. "mul r7, r6, r7\n\t"
  881. "adds r3, r3, r7\n\t"
  882. "adcs r4, r4, #0\n\t"
  883. "mov r5, #0\n\t"
  884. "adc r5, r5, #0\n\t"
  885. "lsr r7, r9, #16\n\t"
  886. "mul r6, r7, r6\n\t"
  887. "lsr r7, r6, #16\n\t"
  888. "lsl r6, r6, #16\n\t"
  889. "adds r3, r3, r6\n\t"
  890. "adcs r4, r4, r7\n\t"
  891. "adc r5, r5, #0\n\t"
  892. "lsr r6, r8, #16\n\t"
  893. "lsr r7, r9, #16\n\t"
  894. "mul r7, r6, r7\n\t"
  895. "adds r4, r4, r7\n\t"
  896. "adc r5, r5, #0\n\t"
  897. "lsl r7, r9, #16\n\t"
  898. "lsr r7, r7, #16\n\t"
  899. "mul r6, r7, r6\n\t"
  900. "lsr r7, r6, #16\n\t"
  901. "lsl r6, r6, #16\n\t"
  902. "adds r3, r3, r6\n\t"
  903. "adcs r4, r4, r7\n\t"
  904. "adc r5, r5, #0\n\t"
  905. /* A[5] * B[1] */
  906. "ldr r8, [%[a], #20]\n\t"
  907. "ldr r9, [%[b], #4]\n\t"
  908. "lsl r6, r8, #16\n\t"
  909. "lsl r7, r9, #16\n\t"
  910. "lsr r6, r6, #16\n\t"
  911. "lsr r7, r7, #16\n\t"
  912. "mul r7, r6, r7\n\t"
  913. "adds r3, r3, r7\n\t"
  914. "adcs r4, r4, #0\n\t"
  915. "adc r5, r5, #0\n\t"
  916. "lsr r7, r9, #16\n\t"
  917. "mul r6, r7, r6\n\t"
  918. "lsr r7, r6, #16\n\t"
  919. "lsl r6, r6, #16\n\t"
  920. "adds r3, r3, r6\n\t"
  921. "adcs r4, r4, r7\n\t"
  922. "adc r5, r5, #0\n\t"
  923. "lsr r6, r8, #16\n\t"
  924. "lsr r7, r9, #16\n\t"
  925. "mul r7, r6, r7\n\t"
  926. "adds r4, r4, r7\n\t"
  927. "adc r5, r5, #0\n\t"
  928. "lsl r7, r9, #16\n\t"
  929. "lsr r7, r7, #16\n\t"
  930. "mul r6, r7, r6\n\t"
  931. "lsr r7, r6, #16\n\t"
  932. "lsl r6, r6, #16\n\t"
  933. "adds r3, r3, r6\n\t"
  934. "adcs r4, r4, r7\n\t"
  935. "adc r5, r5, #0\n\t"
  936. /* A[4] * B[2] */
  937. "ldr r8, [%[a], #16]\n\t"
  938. "lsl r6, r8, #16\n\t"
  939. "lsl r7, r12, #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 r3, r3, r7\n\t"
  944. "adcs r4, r4, #0\n\t"
  945. "adc r5, r5, #0\n\t"
  946. "lsr r7, r12, #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 r3, r3, r6\n\t"
  951. "adcs r4, r4, r7\n\t"
  952. "adc r5, r5, #0\n\t"
  953. "lsr r6, r8, #16\n\t"
  954. "lsr r7, r12, #16\n\t"
  955. "mul r7, r6, r7\n\t"
  956. "adds r4, r4, r7\n\t"
  957. "adc r5, r5, #0\n\t"
  958. "lsl r7, r12, #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 r3, r3, r6\n\t"
  964. "adcs r4, r4, r7\n\t"
  965. "adc r5, r5, #0\n\t"
  966. /* A[3] * B[3] */
  967. "ldr r11, [%[a], #12]\n\t"
  968. "ldr r12, [%[b], #12]\n\t"
  969. "lsl r6, r11, #16\n\t"
  970. "lsl r7, r12, #16\n\t"
  971. "lsr r6, r6, #16\n\t"
  972. "lsr r7, r7, #16\n\t"
  973. "mul r7, r6, r7\n\t"
  974. "adds r3, r3, r7\n\t"
  975. "adcs r4, r4, #0\n\t"
  976. "adc r5, r5, #0\n\t"
  977. "lsr r7, r12, #16\n\t"
  978. "mul r6, r7, r6\n\t"
  979. "lsr r7, r6, #16\n\t"
  980. "lsl r6, r6, #16\n\t"
  981. "adds r3, r3, r6\n\t"
  982. "adcs r4, r4, r7\n\t"
  983. "adc r5, r5, #0\n\t"
  984. "lsr r6, r11, #16\n\t"
  985. "lsr r7, r12, #16\n\t"
  986. "mul r7, r6, r7\n\t"
  987. "adds r4, r4, r7\n\t"
  988. "adc r5, r5, #0\n\t"
  989. "lsl r7, r12, #16\n\t"
  990. "lsr r7, r7, #16\n\t"
  991. "mul r6, r7, r6\n\t"
  992. "lsr r7, r6, #16\n\t"
  993. "lsl r6, r6, #16\n\t"
  994. "adds r3, r3, r6\n\t"
  995. "adcs r4, r4, r7\n\t"
  996. "adc r5, r5, #0\n\t"
  997. /* A[2] * B[4] */
  998. "ldr r8, [%[a], #8]\n\t"
  999. "ldr r9, [%[b], #16]\n\t"
  1000. "lsl r6, r8, #16\n\t"
  1001. "lsl r7, r9, #16\n\t"
  1002. "lsr r6, r6, #16\n\t"
  1003. "lsr r7, r7, #16\n\t"
  1004. "mul r7, r6, r7\n\t"
  1005. "adds r3, r3, r7\n\t"
  1006. "adcs r4, r4, #0\n\t"
  1007. "adc r5, r5, #0\n\t"
  1008. "lsr r7, r9, #16\n\t"
  1009. "mul r6, r7, r6\n\t"
  1010. "lsr r7, r6, #16\n\t"
  1011. "lsl r6, r6, #16\n\t"
  1012. "adds r3, r3, r6\n\t"
  1013. "adcs r4, r4, r7\n\t"
  1014. "adc r5, r5, #0\n\t"
  1015. "lsr r6, r8, #16\n\t"
  1016. "lsr r7, r9, #16\n\t"
  1017. "mul r7, r6, r7\n\t"
  1018. "adds r4, r4, r7\n\t"
  1019. "adc r5, r5, #0\n\t"
  1020. "lsl r7, r9, #16\n\t"
  1021. "lsr r7, r7, #16\n\t"
  1022. "mul r6, r7, r6\n\t"
  1023. "lsr r7, r6, #16\n\t"
  1024. "lsl r6, r6, #16\n\t"
  1025. "adds r3, r3, r6\n\t"
  1026. "adcs r4, r4, r7\n\t"
  1027. "adc r5, r5, #0\n\t"
  1028. /* A[1] * B[5] */
  1029. "ldr r8, [%[a], #4]\n\t"
  1030. "ldr r9, [%[b], #20]\n\t"
  1031. "lsl r6, r8, #16\n\t"
  1032. "lsl r7, r9, #16\n\t"
  1033. "lsr r6, r6, #16\n\t"
  1034. "lsr r7, r7, #16\n\t"
  1035. "mul r7, r6, r7\n\t"
  1036. "adds r3, r3, r7\n\t"
  1037. "adcs r4, r4, #0\n\t"
  1038. "adc r5, r5, #0\n\t"
  1039. "lsr r7, r9, #16\n\t"
  1040. "mul r6, r7, r6\n\t"
  1041. "lsr r7, r6, #16\n\t"
  1042. "lsl r6, r6, #16\n\t"
  1043. "adds r3, r3, r6\n\t"
  1044. "adcs r4, r4, r7\n\t"
  1045. "adc r5, r5, #0\n\t"
  1046. "lsr r6, r8, #16\n\t"
  1047. "lsr r7, r9, #16\n\t"
  1048. "mul r7, r6, r7\n\t"
  1049. "adds r4, r4, r7\n\t"
  1050. "adc r5, r5, #0\n\t"
  1051. "lsl r7, r9, #16\n\t"
  1052. "lsr r7, r7, #16\n\t"
  1053. "mul r6, r7, r6\n\t"
  1054. "lsr r7, r6, #16\n\t"
  1055. "lsl r6, r6, #16\n\t"
  1056. "adds r3, r3, r6\n\t"
  1057. "adcs r4, r4, r7\n\t"
  1058. "adc r5, r5, #0\n\t"
  1059. /* A[0] * B[6] */
  1060. "ldr r8, [%[a]]\n\t"
  1061. "ldr r9, [%[b], #24]\n\t"
  1062. "lsl r6, r8, #16\n\t"
  1063. "lsl r7, r9, #16\n\t"
  1064. "lsr r6, r6, #16\n\t"
  1065. "lsr r7, r7, #16\n\t"
  1066. "mul r7, r6, r7\n\t"
  1067. "adds r3, r3, r7\n\t"
  1068. "adcs r4, r4, #0\n\t"
  1069. "adc r5, r5, #0\n\t"
  1070. "lsr r7, r9, #16\n\t"
  1071. "mul r6, r7, r6\n\t"
  1072. "lsr r7, r6, #16\n\t"
  1073. "lsl r6, r6, #16\n\t"
  1074. "adds r3, r3, r6\n\t"
  1075. "adcs r4, r4, r7\n\t"
  1076. "adc r5, r5, #0\n\t"
  1077. "lsr r6, r8, #16\n\t"
  1078. "lsr r7, r9, #16\n\t"
  1079. "mul r7, r6, r7\n\t"
  1080. "adds r4, r4, r7\n\t"
  1081. "adc r5, r5, #0\n\t"
  1082. "lsl r7, r9, #16\n\t"
  1083. "lsr r7, r7, #16\n\t"
  1084. "mul r6, r7, r6\n\t"
  1085. "lsr r7, r6, #16\n\t"
  1086. "lsl r6, r6, #16\n\t"
  1087. "adds r3, r3, r6\n\t"
  1088. "adcs r4, r4, r7\n\t"
  1089. "adc r5, r5, #0\n\t"
  1090. "str r3, [sp, #24]\n\t"
  1091. /* A[0] * B[7] */
  1092. "ldr r9, [%[b], #28]\n\t"
  1093. "lsl r6, r8, #16\n\t"
  1094. "lsl r7, r9, #16\n\t"
  1095. "lsr r6, r6, #16\n\t"
  1096. "lsr r7, r7, #16\n\t"
  1097. "mul r7, r6, r7\n\t"
  1098. "adds r4, r4, r7\n\t"
  1099. "adcs r5, r5, #0\n\t"
  1100. "mov r3, #0\n\t"
  1101. "adc r3, r3, #0\n\t"
  1102. "lsr r7, r9, #16\n\t"
  1103. "mul r6, r7, r6\n\t"
  1104. "lsr r7, r6, #16\n\t"
  1105. "lsl r6, r6, #16\n\t"
  1106. "adds r4, r4, r6\n\t"
  1107. "adcs r5, r5, r7\n\t"
  1108. "adc r3, r3, #0\n\t"
  1109. "lsr r6, r8, #16\n\t"
  1110. "lsr r7, r9, #16\n\t"
  1111. "mul r7, r6, r7\n\t"
  1112. "adds r5, r5, r7\n\t"
  1113. "adc r3, r3, #0\n\t"
  1114. "lsl r7, r9, #16\n\t"
  1115. "lsr r7, r7, #16\n\t"
  1116. "mul r6, r7, r6\n\t"
  1117. "lsr r7, r6, #16\n\t"
  1118. "lsl r6, r6, #16\n\t"
  1119. "adds r4, r4, r6\n\t"
  1120. "adcs r5, r5, r7\n\t"
  1121. "adc r3, r3, #0\n\t"
  1122. /* A[1] * B[6] */
  1123. "ldr r8, [%[a], #4]\n\t"
  1124. "ldr r9, [%[b], #24]\n\t"
  1125. "lsl r6, r8, #16\n\t"
  1126. "lsl r7, r9, #16\n\t"
  1127. "lsr r6, r6, #16\n\t"
  1128. "lsr r7, r7, #16\n\t"
  1129. "mul r7, r6, r7\n\t"
  1130. "adds r4, r4, r7\n\t"
  1131. "adcs r5, r5, #0\n\t"
  1132. "adc r3, r3, #0\n\t"
  1133. "lsr r7, r9, #16\n\t"
  1134. "mul r6, r7, r6\n\t"
  1135. "lsr r7, r6, #16\n\t"
  1136. "lsl r6, r6, #16\n\t"
  1137. "adds r4, r4, r6\n\t"
  1138. "adcs r5, r5, r7\n\t"
  1139. "adc r3, r3, #0\n\t"
  1140. "lsr r6, r8, #16\n\t"
  1141. "lsr r7, r9, #16\n\t"
  1142. "mul r7, r6, r7\n\t"
  1143. "adds r5, r5, r7\n\t"
  1144. "adc r3, r3, #0\n\t"
  1145. "lsl r7, r9, #16\n\t"
  1146. "lsr r7, r7, #16\n\t"
  1147. "mul r6, r7, r6\n\t"
  1148. "lsr r7, r6, #16\n\t"
  1149. "lsl r6, r6, #16\n\t"
  1150. "adds r4, r4, r6\n\t"
  1151. "adcs r5, r5, r7\n\t"
  1152. "adc r3, r3, #0\n\t"
  1153. /* A[2] * B[5] */
  1154. "ldr r8, [%[a], #8]\n\t"
  1155. "ldr r9, [%[b], #20]\n\t"
  1156. "lsl r6, r8, #16\n\t"
  1157. "lsl r7, r9, #16\n\t"
  1158. "lsr r6, r6, #16\n\t"
  1159. "lsr r7, r7, #16\n\t"
  1160. "mul r7, r6, r7\n\t"
  1161. "adds r4, r4, r7\n\t"
  1162. "adcs r5, r5, #0\n\t"
  1163. "adc r3, r3, #0\n\t"
  1164. "lsr r7, r9, #16\n\t"
  1165. "mul r6, r7, r6\n\t"
  1166. "lsr r7, r6, #16\n\t"
  1167. "lsl r6, r6, #16\n\t"
  1168. "adds r4, r4, r6\n\t"
  1169. "adcs r5, r5, r7\n\t"
  1170. "adc r3, r3, #0\n\t"
  1171. "lsr r6, r8, #16\n\t"
  1172. "lsr r7, r9, #16\n\t"
  1173. "mul r7, r6, r7\n\t"
  1174. "adds r5, r5, r7\n\t"
  1175. "adc r3, r3, #0\n\t"
  1176. "lsl r7, r9, #16\n\t"
  1177. "lsr r7, r7, #16\n\t"
  1178. "mul r6, r7, r6\n\t"
  1179. "lsr r7, r6, #16\n\t"
  1180. "lsl r6, r6, #16\n\t"
  1181. "adds r4, r4, r6\n\t"
  1182. "adcs r5, r5, r7\n\t"
  1183. "adc r3, r3, #0\n\t"
  1184. /* A[3] * B[4] */
  1185. "ldr r9, [%[b], #16]\n\t"
  1186. "lsl r6, r11, #16\n\t"
  1187. "lsl r7, r9, #16\n\t"
  1188. "lsr r6, r6, #16\n\t"
  1189. "lsr r7, r7, #16\n\t"
  1190. "mul r7, r6, r7\n\t"
  1191. "adds r4, r4, r7\n\t"
  1192. "adcs r5, r5, #0\n\t"
  1193. "adc r3, r3, #0\n\t"
  1194. "lsr r7, r9, #16\n\t"
  1195. "mul r6, r7, r6\n\t"
  1196. "lsr r7, r6, #16\n\t"
  1197. "lsl r6, r6, #16\n\t"
  1198. "adds r4, r4, r6\n\t"
  1199. "adcs r5, r5, r7\n\t"
  1200. "adc r3, r3, #0\n\t"
  1201. "lsr r6, r11, #16\n\t"
  1202. "lsr r7, r9, #16\n\t"
  1203. "mul r7, r6, r7\n\t"
  1204. "adds r5, r5, r7\n\t"
  1205. "adc r3, r3, #0\n\t"
  1206. "lsl r7, r9, #16\n\t"
  1207. "lsr r7, r7, #16\n\t"
  1208. "mul r6, r7, r6\n\t"
  1209. "lsr r7, r6, #16\n\t"
  1210. "lsl r6, r6, #16\n\t"
  1211. "adds r4, r4, r6\n\t"
  1212. "adcs r5, r5, r7\n\t"
  1213. "adc r3, r3, #0\n\t"
  1214. /* A[4] * B[3] */
  1215. "ldr r8, [%[a], #16]\n\t"
  1216. "lsl r6, r8, #16\n\t"
  1217. "lsl r7, r12, #16\n\t"
  1218. "lsr r6, r6, #16\n\t"
  1219. "lsr r7, r7, #16\n\t"
  1220. "mul r7, r6, r7\n\t"
  1221. "adds r4, r4, r7\n\t"
  1222. "adcs r5, r5, #0\n\t"
  1223. "adc r3, r3, #0\n\t"
  1224. "lsr r7, r12, #16\n\t"
  1225. "mul r6, r7, r6\n\t"
  1226. "lsr r7, r6, #16\n\t"
  1227. "lsl r6, r6, #16\n\t"
  1228. "adds r4, r4, r6\n\t"
  1229. "adcs r5, r5, r7\n\t"
  1230. "adc r3, r3, #0\n\t"
  1231. "lsr r6, r8, #16\n\t"
  1232. "lsr r7, r12, #16\n\t"
  1233. "mul r7, r6, r7\n\t"
  1234. "adds r5, r5, r7\n\t"
  1235. "adc r3, r3, #0\n\t"
  1236. "lsl r7, r12, #16\n\t"
  1237. "lsr r7, r7, #16\n\t"
  1238. "mul r6, r7, r6\n\t"
  1239. "lsr r7, r6, #16\n\t"
  1240. "lsl r6, r6, #16\n\t"
  1241. "adds r4, r4, r6\n\t"
  1242. "adcs r5, r5, r7\n\t"
  1243. "adc r3, r3, #0\n\t"
  1244. /* A[5] * B[2] */
  1245. "ldr r8, [%[a], #20]\n\t"
  1246. "ldr r9, [%[b], #8]\n\t"
  1247. "lsl r6, r8, #16\n\t"
  1248. "lsl r7, r9, #16\n\t"
  1249. "lsr r6, r6, #16\n\t"
  1250. "lsr r7, r7, #16\n\t"
  1251. "mul r7, r6, r7\n\t"
  1252. "adds r4, r4, r7\n\t"
  1253. "adcs r5, r5, #0\n\t"
  1254. "adc r3, r3, #0\n\t"
  1255. "lsr r7, r9, #16\n\t"
  1256. "mul r6, r7, r6\n\t"
  1257. "lsr r7, r6, #16\n\t"
  1258. "lsl r6, r6, #16\n\t"
  1259. "adds r4, r4, r6\n\t"
  1260. "adcs r5, r5, r7\n\t"
  1261. "adc r3, r3, #0\n\t"
  1262. "lsr r6, r8, #16\n\t"
  1263. "lsr r7, r9, #16\n\t"
  1264. "mul r7, r6, r7\n\t"
  1265. "adds r5, r5, r7\n\t"
  1266. "adc r3, r3, #0\n\t"
  1267. "lsl r7, r9, #16\n\t"
  1268. "lsr r7, r7, #16\n\t"
  1269. "mul r6, r7, r6\n\t"
  1270. "lsr r7, r6, #16\n\t"
  1271. "lsl r6, r6, #16\n\t"
  1272. "adds r4, r4, r6\n\t"
  1273. "adcs r5, r5, r7\n\t"
  1274. "adc r3, r3, #0\n\t"
  1275. /* A[6] * B[1] */
  1276. "ldr r8, [%[a], #24]\n\t"
  1277. "ldr r9, [%[b], #4]\n\t"
  1278. "lsl r6, r8, #16\n\t"
  1279. "lsl r7, r9, #16\n\t"
  1280. "lsr r6, r6, #16\n\t"
  1281. "lsr r7, r7, #16\n\t"
  1282. "mul r7, r6, r7\n\t"
  1283. "adds r4, r4, r7\n\t"
  1284. "adcs r5, r5, #0\n\t"
  1285. "adc r3, r3, #0\n\t"
  1286. "lsr r7, r9, #16\n\t"
  1287. "mul r6, r7, r6\n\t"
  1288. "lsr r7, r6, #16\n\t"
  1289. "lsl r6, r6, #16\n\t"
  1290. "adds r4, r4, r6\n\t"
  1291. "adcs r5, r5, r7\n\t"
  1292. "adc r3, r3, #0\n\t"
  1293. "lsr r6, r8, #16\n\t"
  1294. "lsr r7, r9, #16\n\t"
  1295. "mul r7, r6, r7\n\t"
  1296. "adds r5, r5, r7\n\t"
  1297. "adc r3, r3, #0\n\t"
  1298. "lsl r7, r9, #16\n\t"
  1299. "lsr r7, r7, #16\n\t"
  1300. "mul r6, r7, r6\n\t"
  1301. "lsr r7, r6, #16\n\t"
  1302. "lsl r6, r6, #16\n\t"
  1303. "adds r4, r4, r6\n\t"
  1304. "adcs r5, r5, r7\n\t"
  1305. "adc r3, r3, #0\n\t"
  1306. /* A[7] * B[0] */
  1307. "ldr r8, [%[a], #28]\n\t"
  1308. "ldr r9, [%[b]]\n\t"
  1309. "lsl r6, r8, #16\n\t"
  1310. "lsl r7, r9, #16\n\t"
  1311. "lsr r6, r6, #16\n\t"
  1312. "lsr r7, r7, #16\n\t"
  1313. "mul r7, r6, r7\n\t"
  1314. "adds r4, r4, r7\n\t"
  1315. "adcs r5, r5, #0\n\t"
  1316. "adc r3, r3, #0\n\t"
  1317. "lsr r7, r9, #16\n\t"
  1318. "mul r6, r7, r6\n\t"
  1319. "lsr r7, r6, #16\n\t"
  1320. "lsl r6, r6, #16\n\t"
  1321. "adds r4, r4, r6\n\t"
  1322. "adcs r5, r5, r7\n\t"
  1323. "adc r3, r3, #0\n\t"
  1324. "lsr r6, r8, #16\n\t"
  1325. "lsr r7, r9, #16\n\t"
  1326. "mul r7, r6, r7\n\t"
  1327. "adds r5, r5, r7\n\t"
  1328. "adc r3, r3, #0\n\t"
  1329. "lsl r7, r9, #16\n\t"
  1330. "lsr r7, r7, #16\n\t"
  1331. "mul r6, r7, r6\n\t"
  1332. "lsr r7, r6, #16\n\t"
  1333. "lsl r6, r6, #16\n\t"
  1334. "adds r4, r4, r6\n\t"
  1335. "adcs r5, r5, r7\n\t"
  1336. "adc r3, r3, #0\n\t"
  1337. "str r4, [sp, #28]\n\t"
  1338. /* A[7] * B[1] */
  1339. "ldr r9, [%[b], #4]\n\t"
  1340. "lsl r6, r8, #16\n\t"
  1341. "lsl r7, r9, #16\n\t"
  1342. "lsr r6, r6, #16\n\t"
  1343. "lsr r7, r7, #16\n\t"
  1344. "mul r7, r6, r7\n\t"
  1345. "adds r5, r5, r7\n\t"
  1346. "adcs r3, r3, #0\n\t"
  1347. "mov r4, #0\n\t"
  1348. "adc r4, r4, #0\n\t"
  1349. "lsr r7, r9, #16\n\t"
  1350. "mul r6, r7, r6\n\t"
  1351. "lsr r7, r6, #16\n\t"
  1352. "lsl r6, r6, #16\n\t"
  1353. "adds r5, r5, r6\n\t"
  1354. "adcs r3, r3, r7\n\t"
  1355. "adc r4, r4, #0\n\t"
  1356. "lsr r6, r8, #16\n\t"
  1357. "lsr r7, r9, #16\n\t"
  1358. "mul r7, r6, r7\n\t"
  1359. "adds r3, r3, r7\n\t"
  1360. "adc r4, r4, #0\n\t"
  1361. "lsl r7, r9, #16\n\t"
  1362. "lsr r7, r7, #16\n\t"
  1363. "mul r6, r7, r6\n\t"
  1364. "lsr r7, r6, #16\n\t"
  1365. "lsl r6, r6, #16\n\t"
  1366. "adds r5, r5, r6\n\t"
  1367. "adcs r3, r3, r7\n\t"
  1368. "adc r4, r4, #0\n\t"
  1369. /* A[6] * B[2] */
  1370. "ldr r8, [%[a], #24]\n\t"
  1371. "ldr r9, [%[b], #8]\n\t"
  1372. "lsl r6, r8, #16\n\t"
  1373. "lsl r7, r9, #16\n\t"
  1374. "lsr r6, r6, #16\n\t"
  1375. "lsr r7, r7, #16\n\t"
  1376. "mul r7, r6, r7\n\t"
  1377. "adds r5, r5, r7\n\t"
  1378. "adcs r3, r3, #0\n\t"
  1379. "adc r4, r4, #0\n\t"
  1380. "lsr r7, r9, #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 r5, r5, r6\n\t"
  1385. "adcs r3, r3, r7\n\t"
  1386. "adc r4, r4, #0\n\t"
  1387. "lsr r6, r8, #16\n\t"
  1388. "lsr r7, r9, #16\n\t"
  1389. "mul r7, r6, r7\n\t"
  1390. "adds r3, r3, r7\n\t"
  1391. "adc r4, r4, #0\n\t"
  1392. "lsl r7, r9, #16\n\t"
  1393. "lsr r7, r7, #16\n\t"
  1394. "mul r6, r7, r6\n\t"
  1395. "lsr r7, r6, #16\n\t"
  1396. "lsl r6, r6, #16\n\t"
  1397. "adds r5, r5, r6\n\t"
  1398. "adcs r3, r3, r7\n\t"
  1399. "adc r4, r4, #0\n\t"
  1400. /* A[5] * B[3] */
  1401. "ldr r8, [%[a], #20]\n\t"
  1402. "lsl r6, r8, #16\n\t"
  1403. "lsl r7, r12, #16\n\t"
  1404. "lsr r6, r6, #16\n\t"
  1405. "lsr r7, r7, #16\n\t"
  1406. "mul r7, r6, r7\n\t"
  1407. "adds r5, r5, r7\n\t"
  1408. "adcs r3, r3, #0\n\t"
  1409. "adc r4, r4, #0\n\t"
  1410. "lsr r7, r12, #16\n\t"
  1411. "mul r6, r7, r6\n\t"
  1412. "lsr r7, r6, #16\n\t"
  1413. "lsl r6, r6, #16\n\t"
  1414. "adds r5, r5, r6\n\t"
  1415. "adcs r3, r3, r7\n\t"
  1416. "adc r4, r4, #0\n\t"
  1417. "lsr r6, r8, #16\n\t"
  1418. "lsr r7, r12, #16\n\t"
  1419. "mul r7, r6, r7\n\t"
  1420. "adds r3, r3, r7\n\t"
  1421. "adc r4, r4, #0\n\t"
  1422. "lsl r7, r12, #16\n\t"
  1423. "lsr r7, r7, #16\n\t"
  1424. "mul r6, r7, r6\n\t"
  1425. "lsr r7, r6, #16\n\t"
  1426. "lsl r6, r6, #16\n\t"
  1427. "adds r5, r5, r6\n\t"
  1428. "adcs r3, r3, r7\n\t"
  1429. "adc r4, r4, #0\n\t"
  1430. /* A[4] * B[4] */
  1431. "ldr r11, [%[a], #16]\n\t"
  1432. "ldr r12, [%[b], #16]\n\t"
  1433. "lsl r6, r11, #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 r5, r5, r7\n\t"
  1439. "adcs r3, r3, #0\n\t"
  1440. "adc r4, r4, #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 r5, r5, r6\n\t"
  1446. "adcs r3, r3, r7\n\t"
  1447. "adc r4, r4, #0\n\t"
  1448. "lsr r6, r11, #16\n\t"
  1449. "lsr r7, r12, #16\n\t"
  1450. "mul r7, r6, r7\n\t"
  1451. "adds r3, r3, r7\n\t"
  1452. "adc r4, r4, #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 r5, r5, r6\n\t"
  1459. "adcs r3, r3, r7\n\t"
  1460. "adc r4, r4, #0\n\t"
  1461. /* A[3] * B[5] */
  1462. "ldr r8, [%[a], #12]\n\t"
  1463. "ldr r9, [%[b], #20]\n\t"
  1464. "lsl r6, r8, #16\n\t"
  1465. "lsl r7, r9, #16\n\t"
  1466. "lsr r6, r6, #16\n\t"
  1467. "lsr r7, r7, #16\n\t"
  1468. "mul r7, r6, r7\n\t"
  1469. "adds r5, r5, r7\n\t"
  1470. "adcs r3, r3, #0\n\t"
  1471. "adc r4, r4, #0\n\t"
  1472. "lsr r7, r9, #16\n\t"
  1473. "mul r6, r7, r6\n\t"
  1474. "lsr r7, r6, #16\n\t"
  1475. "lsl r6, r6, #16\n\t"
  1476. "adds r5, r5, r6\n\t"
  1477. "adcs r3, r3, r7\n\t"
  1478. "adc r4, r4, #0\n\t"
  1479. "lsr r6, r8, #16\n\t"
  1480. "lsr r7, r9, #16\n\t"
  1481. "mul r7, r6, r7\n\t"
  1482. "adds r3, r3, r7\n\t"
  1483. "adc r4, r4, #0\n\t"
  1484. "lsl r7, r9, #16\n\t"
  1485. "lsr r7, r7, #16\n\t"
  1486. "mul r6, r7, r6\n\t"
  1487. "lsr r7, r6, #16\n\t"
  1488. "lsl r6, r6, #16\n\t"
  1489. "adds r5, r5, r6\n\t"
  1490. "adcs r3, r3, r7\n\t"
  1491. "adc r4, r4, #0\n\t"
  1492. /* A[2] * B[6] */
  1493. "ldr r8, [%[a], #8]\n\t"
  1494. "ldr r9, [%[b], #24]\n\t"
  1495. "lsl r6, r8, #16\n\t"
  1496. "lsl r7, r9, #16\n\t"
  1497. "lsr r6, r6, #16\n\t"
  1498. "lsr r7, r7, #16\n\t"
  1499. "mul r7, r6, r7\n\t"
  1500. "adds r5, r5, r7\n\t"
  1501. "adcs r3, r3, #0\n\t"
  1502. "adc r4, r4, #0\n\t"
  1503. "lsr r7, r9, #16\n\t"
  1504. "mul r6, r7, r6\n\t"
  1505. "lsr r7, r6, #16\n\t"
  1506. "lsl r6, r6, #16\n\t"
  1507. "adds r5, r5, r6\n\t"
  1508. "adcs r3, r3, r7\n\t"
  1509. "adc r4, r4, #0\n\t"
  1510. "lsr r6, r8, #16\n\t"
  1511. "lsr r7, r9, #16\n\t"
  1512. "mul r7, r6, r7\n\t"
  1513. "adds r3, r3, r7\n\t"
  1514. "adc r4, r4, #0\n\t"
  1515. "lsl r7, r9, #16\n\t"
  1516. "lsr r7, r7, #16\n\t"
  1517. "mul r6, r7, r6\n\t"
  1518. "lsr r7, r6, #16\n\t"
  1519. "lsl r6, r6, #16\n\t"
  1520. "adds r5, r5, r6\n\t"
  1521. "adcs r3, r3, r7\n\t"
  1522. "adc r4, r4, #0\n\t"
  1523. /* A[1] * B[7] */
  1524. "ldr r8, [%[a], #4]\n\t"
  1525. "ldr r9, [%[b], #28]\n\t"
  1526. "lsl r6, r8, #16\n\t"
  1527. "lsl r7, r9, #16\n\t"
  1528. "lsr r6, r6, #16\n\t"
  1529. "lsr r7, r7, #16\n\t"
  1530. "mul r7, r6, r7\n\t"
  1531. "adds r5, r5, r7\n\t"
  1532. "adcs r3, r3, #0\n\t"
  1533. "adc r4, r4, #0\n\t"
  1534. "lsr r7, r9, #16\n\t"
  1535. "mul r6, r7, r6\n\t"
  1536. "lsr r7, r6, #16\n\t"
  1537. "lsl r6, r6, #16\n\t"
  1538. "adds r5, r5, r6\n\t"
  1539. "adcs r3, r3, r7\n\t"
  1540. "adc r4, r4, #0\n\t"
  1541. "lsr r6, r8, #16\n\t"
  1542. "lsr r7, r9, #16\n\t"
  1543. "mul r7, r6, r7\n\t"
  1544. "adds r3, r3, r7\n\t"
  1545. "adc r4, r4, #0\n\t"
  1546. "lsl r7, r9, #16\n\t"
  1547. "lsr r7, r7, #16\n\t"
  1548. "mul r6, r7, r6\n\t"
  1549. "lsr r7, r6, #16\n\t"
  1550. "lsl r6, r6, #16\n\t"
  1551. "adds r5, r5, r6\n\t"
  1552. "adcs r3, r3, r7\n\t"
  1553. "adc r4, r4, #0\n\t"
  1554. "str r5, [%[r], #32]\n\t"
  1555. /* A[2] * B[7] */
  1556. "ldr r8, [%[a], #8]\n\t"
  1557. "lsl r6, r8, #16\n\t"
  1558. "lsl r7, r9, #16\n\t"
  1559. "lsr r6, r6, #16\n\t"
  1560. "lsr r7, r7, #16\n\t"
  1561. "mul r7, r6, r7\n\t"
  1562. "adds r3, r3, r7\n\t"
  1563. "adcs r4, r4, #0\n\t"
  1564. "mov r5, #0\n\t"
  1565. "adc r5, r5, #0\n\t"
  1566. "lsr r7, r9, #16\n\t"
  1567. "mul r6, r7, r6\n\t"
  1568. "lsr r7, r6, #16\n\t"
  1569. "lsl r6, r6, #16\n\t"
  1570. "adds r3, r3, r6\n\t"
  1571. "adcs r4, r4, r7\n\t"
  1572. "adc r5, r5, #0\n\t"
  1573. "lsr r6, r8, #16\n\t"
  1574. "lsr r7, r9, #16\n\t"
  1575. "mul r7, r6, r7\n\t"
  1576. "adds r4, r4, r7\n\t"
  1577. "adc r5, r5, #0\n\t"
  1578. "lsl r7, r9, #16\n\t"
  1579. "lsr r7, r7, #16\n\t"
  1580. "mul r6, r7, r6\n\t"
  1581. "lsr r7, r6, #16\n\t"
  1582. "lsl r6, r6, #16\n\t"
  1583. "adds r3, r3, r6\n\t"
  1584. "adcs r4, r4, r7\n\t"
  1585. "adc r5, r5, #0\n\t"
  1586. /* A[3] * B[6] */
  1587. "ldr r8, [%[a], #12]\n\t"
  1588. "ldr r9, [%[b], #24]\n\t"
  1589. "lsl r6, r8, #16\n\t"
  1590. "lsl r7, r9, #16\n\t"
  1591. "lsr r6, r6, #16\n\t"
  1592. "lsr r7, r7, #16\n\t"
  1593. "mul r7, r6, r7\n\t"
  1594. "adds r3, r3, r7\n\t"
  1595. "adcs r4, r4, #0\n\t"
  1596. "adc r5, r5, #0\n\t"
  1597. "lsr r7, r9, #16\n\t"
  1598. "mul r6, r7, r6\n\t"
  1599. "lsr r7, r6, #16\n\t"
  1600. "lsl r6, r6, #16\n\t"
  1601. "adds r3, r3, r6\n\t"
  1602. "adcs r4, r4, r7\n\t"
  1603. "adc r5, r5, #0\n\t"
  1604. "lsr r6, r8, #16\n\t"
  1605. "lsr r7, r9, #16\n\t"
  1606. "mul r7, r6, r7\n\t"
  1607. "adds r4, r4, r7\n\t"
  1608. "adc r5, r5, #0\n\t"
  1609. "lsl r7, r9, #16\n\t"
  1610. "lsr r7, r7, #16\n\t"
  1611. "mul r6, r7, r6\n\t"
  1612. "lsr r7, r6, #16\n\t"
  1613. "lsl r6, r6, #16\n\t"
  1614. "adds r3, r3, r6\n\t"
  1615. "adcs r4, r4, r7\n\t"
  1616. "adc r5, r5, #0\n\t"
  1617. /* A[4] * B[5] */
  1618. "ldr r9, [%[b], #20]\n\t"
  1619. "lsl r6, r11, #16\n\t"
  1620. "lsl r7, r9, #16\n\t"
  1621. "lsr r6, r6, #16\n\t"
  1622. "lsr r7, r7, #16\n\t"
  1623. "mul r7, r6, r7\n\t"
  1624. "adds r3, r3, r7\n\t"
  1625. "adcs r4, r4, #0\n\t"
  1626. "adc r5, r5, #0\n\t"
  1627. "lsr r7, r9, #16\n\t"
  1628. "mul r6, r7, r6\n\t"
  1629. "lsr r7, r6, #16\n\t"
  1630. "lsl r6, r6, #16\n\t"
  1631. "adds r3, r3, r6\n\t"
  1632. "adcs r4, r4, r7\n\t"
  1633. "adc r5, r5, #0\n\t"
  1634. "lsr r6, r11, #16\n\t"
  1635. "lsr r7, r9, #16\n\t"
  1636. "mul r7, r6, r7\n\t"
  1637. "adds r4, r4, r7\n\t"
  1638. "adc r5, r5, #0\n\t"
  1639. "lsl r7, r9, #16\n\t"
  1640. "lsr r7, r7, #16\n\t"
  1641. "mul r6, r7, r6\n\t"
  1642. "lsr r7, r6, #16\n\t"
  1643. "lsl r6, r6, #16\n\t"
  1644. "adds r3, r3, r6\n\t"
  1645. "adcs r4, r4, r7\n\t"
  1646. "adc r5, r5, #0\n\t"
  1647. /* A[5] * B[4] */
  1648. "ldr r8, [%[a], #20]\n\t"
  1649. "lsl r6, r8, #16\n\t"
  1650. "lsl r7, r12, #16\n\t"
  1651. "lsr r6, r6, #16\n\t"
  1652. "lsr r7, r7, #16\n\t"
  1653. "mul r7, r6, r7\n\t"
  1654. "adds r3, r3, r7\n\t"
  1655. "adcs r4, r4, #0\n\t"
  1656. "adc r5, r5, #0\n\t"
  1657. "lsr r7, r12, #16\n\t"
  1658. "mul r6, r7, r6\n\t"
  1659. "lsr r7, r6, #16\n\t"
  1660. "lsl r6, r6, #16\n\t"
  1661. "adds r3, r3, r6\n\t"
  1662. "adcs r4, r4, r7\n\t"
  1663. "adc r5, r5, #0\n\t"
  1664. "lsr r6, r8, #16\n\t"
  1665. "lsr r7, r12, #16\n\t"
  1666. "mul r7, r6, r7\n\t"
  1667. "adds r4, r4, r7\n\t"
  1668. "adc r5, r5, #0\n\t"
  1669. "lsl r7, r12, #16\n\t"
  1670. "lsr r7, r7, #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 r3, r3, r6\n\t"
  1675. "adcs r4, r4, r7\n\t"
  1676. "adc r5, r5, #0\n\t"
  1677. /* A[6] * B[3] */
  1678. "ldr r8, [%[a], #24]\n\t"
  1679. "ldr r9, [%[b], #12]\n\t"
  1680. "lsl r6, r8, #16\n\t"
  1681. "lsl r7, r9, #16\n\t"
  1682. "lsr r6, r6, #16\n\t"
  1683. "lsr r7, r7, #16\n\t"
  1684. "mul r7, r6, r7\n\t"
  1685. "adds r3, r3, r7\n\t"
  1686. "adcs r4, r4, #0\n\t"
  1687. "adc r5, r5, #0\n\t"
  1688. "lsr r7, r9, #16\n\t"
  1689. "mul r6, r7, r6\n\t"
  1690. "lsr r7, r6, #16\n\t"
  1691. "lsl r6, r6, #16\n\t"
  1692. "adds r3, r3, r6\n\t"
  1693. "adcs r4, r4, r7\n\t"
  1694. "adc r5, r5, #0\n\t"
  1695. "lsr r6, r8, #16\n\t"
  1696. "lsr r7, r9, #16\n\t"
  1697. "mul r7, r6, r7\n\t"
  1698. "adds r4, r4, r7\n\t"
  1699. "adc r5, r5, #0\n\t"
  1700. "lsl r7, r9, #16\n\t"
  1701. "lsr r7, r7, #16\n\t"
  1702. "mul r6, r7, r6\n\t"
  1703. "lsr r7, r6, #16\n\t"
  1704. "lsl r6, r6, #16\n\t"
  1705. "adds r3, r3, r6\n\t"
  1706. "adcs r4, r4, r7\n\t"
  1707. "adc r5, r5, #0\n\t"
  1708. /* A[7] * B[2] */
  1709. "ldr r8, [%[a], #28]\n\t"
  1710. "ldr r9, [%[b], #8]\n\t"
  1711. "lsl r6, r8, #16\n\t"
  1712. "lsl r7, r9, #16\n\t"
  1713. "lsr r6, r6, #16\n\t"
  1714. "lsr r7, r7, #16\n\t"
  1715. "mul r7, r6, r7\n\t"
  1716. "adds r3, r3, r7\n\t"
  1717. "adcs r4, r4, #0\n\t"
  1718. "adc r5, r5, #0\n\t"
  1719. "lsr r7, r9, #16\n\t"
  1720. "mul r6, r7, r6\n\t"
  1721. "lsr r7, r6, #16\n\t"
  1722. "lsl r6, r6, #16\n\t"
  1723. "adds r3, r3, r6\n\t"
  1724. "adcs r4, r4, r7\n\t"
  1725. "adc r5, r5, #0\n\t"
  1726. "lsr r6, r8, #16\n\t"
  1727. "lsr r7, r9, #16\n\t"
  1728. "mul r7, r6, r7\n\t"
  1729. "adds r4, r4, r7\n\t"
  1730. "adc r5, r5, #0\n\t"
  1731. "lsl r7, r9, #16\n\t"
  1732. "lsr r7, r7, #16\n\t"
  1733. "mul r6, r7, r6\n\t"
  1734. "lsr r7, r6, #16\n\t"
  1735. "lsl r6, r6, #16\n\t"
  1736. "adds r3, r3, r6\n\t"
  1737. "adcs r4, r4, r7\n\t"
  1738. "adc r5, r5, #0\n\t"
  1739. "str r3, [%[r], #36]\n\t"
  1740. /* A[7] * B[3] */
  1741. "ldr r9, [%[b], #12]\n\t"
  1742. "lsl r6, r8, #16\n\t"
  1743. "lsl r7, r9, #16\n\t"
  1744. "lsr r6, r6, #16\n\t"
  1745. "lsr r7, r7, #16\n\t"
  1746. "mul r7, r6, r7\n\t"
  1747. "adds r4, r4, r7\n\t"
  1748. "adcs r5, r5, #0\n\t"
  1749. "mov r3, #0\n\t"
  1750. "adc r3, r3, #0\n\t"
  1751. "lsr r7, r9, #16\n\t"
  1752. "mul r6, r7, r6\n\t"
  1753. "lsr r7, r6, #16\n\t"
  1754. "lsl r6, r6, #16\n\t"
  1755. "adds r4, r4, r6\n\t"
  1756. "adcs r5, r5, r7\n\t"
  1757. "adc r3, r3, #0\n\t"
  1758. "lsr r6, r8, #16\n\t"
  1759. "lsr r7, r9, #16\n\t"
  1760. "mul r7, r6, r7\n\t"
  1761. "adds r5, r5, r7\n\t"
  1762. "adc r3, r3, #0\n\t"
  1763. "lsl r7, r9, #16\n\t"
  1764. "lsr r7, r7, #16\n\t"
  1765. "mul r6, r7, r6\n\t"
  1766. "lsr r7, r6, #16\n\t"
  1767. "lsl r6, r6, #16\n\t"
  1768. "adds r4, r4, r6\n\t"
  1769. "adcs r5, r5, r7\n\t"
  1770. "adc r3, r3, #0\n\t"
  1771. /* A[6] * B[4] */
  1772. "ldr r8, [%[a], #24]\n\t"
  1773. "lsl r6, r8, #16\n\t"
  1774. "lsl r7, r12, #16\n\t"
  1775. "lsr r6, r6, #16\n\t"
  1776. "lsr r7, r7, #16\n\t"
  1777. "mul r7, r6, r7\n\t"
  1778. "adds r4, r4, r7\n\t"
  1779. "adcs r5, r5, #0\n\t"
  1780. "adc r3, r3, #0\n\t"
  1781. "lsr r7, r12, #16\n\t"
  1782. "mul r6, r7, r6\n\t"
  1783. "lsr r7, r6, #16\n\t"
  1784. "lsl r6, r6, #16\n\t"
  1785. "adds r4, r4, r6\n\t"
  1786. "adcs r5, r5, r7\n\t"
  1787. "adc r3, r3, #0\n\t"
  1788. "lsr r6, r8, #16\n\t"
  1789. "lsr r7, r12, #16\n\t"
  1790. "mul r7, r6, r7\n\t"
  1791. "adds r5, r5, r7\n\t"
  1792. "adc r3, r3, #0\n\t"
  1793. "lsl r7, r12, #16\n\t"
  1794. "lsr r7, r7, #16\n\t"
  1795. "mul r6, r7, r6\n\t"
  1796. "lsr r7, r6, #16\n\t"
  1797. "lsl r6, r6, #16\n\t"
  1798. "adds r4, r4, r6\n\t"
  1799. "adcs r5, r5, r7\n\t"
  1800. "adc r3, r3, #0\n\t"
  1801. /* A[5] * B[5] */
  1802. "ldr r11, [%[a], #20]\n\t"
  1803. "ldr r12, [%[b], #20]\n\t"
  1804. "lsl r6, r11, #16\n\t"
  1805. "lsl r7, r12, #16\n\t"
  1806. "lsr r6, r6, #16\n\t"
  1807. "lsr r7, r7, #16\n\t"
  1808. "mul r7, r6, r7\n\t"
  1809. "adds r4, r4, r7\n\t"
  1810. "adcs r5, r5, #0\n\t"
  1811. "adc r3, r3, #0\n\t"
  1812. "lsr r7, r12, #16\n\t"
  1813. "mul r6, r7, r6\n\t"
  1814. "lsr r7, r6, #16\n\t"
  1815. "lsl r6, r6, #16\n\t"
  1816. "adds r4, r4, r6\n\t"
  1817. "adcs r5, r5, r7\n\t"
  1818. "adc r3, r3, #0\n\t"
  1819. "lsr r6, r11, #16\n\t"
  1820. "lsr r7, r12, #16\n\t"
  1821. "mul r7, r6, r7\n\t"
  1822. "adds r5, r5, r7\n\t"
  1823. "adc r3, r3, #0\n\t"
  1824. "lsl r7, r12, #16\n\t"
  1825. "lsr r7, r7, #16\n\t"
  1826. "mul r6, r7, r6\n\t"
  1827. "lsr r7, r6, #16\n\t"
  1828. "lsl r6, r6, #16\n\t"
  1829. "adds r4, r4, r6\n\t"
  1830. "adcs r5, r5, r7\n\t"
  1831. "adc r3, r3, #0\n\t"
  1832. /* A[4] * B[6] */
  1833. "ldr r8, [%[a], #16]\n\t"
  1834. "ldr r9, [%[b], #24]\n\t"
  1835. "lsl r6, r8, #16\n\t"
  1836. "lsl r7, r9, #16\n\t"
  1837. "lsr r6, r6, #16\n\t"
  1838. "lsr r7, r7, #16\n\t"
  1839. "mul r7, r6, r7\n\t"
  1840. "adds r4, r4, r7\n\t"
  1841. "adcs r5, r5, #0\n\t"
  1842. "adc r3, r3, #0\n\t"
  1843. "lsr r7, r9, #16\n\t"
  1844. "mul r6, r7, r6\n\t"
  1845. "lsr r7, r6, #16\n\t"
  1846. "lsl r6, r6, #16\n\t"
  1847. "adds r4, r4, r6\n\t"
  1848. "adcs r5, r5, r7\n\t"
  1849. "adc r3, r3, #0\n\t"
  1850. "lsr r6, r8, #16\n\t"
  1851. "lsr r7, r9, #16\n\t"
  1852. "mul r7, r6, r7\n\t"
  1853. "adds r5, r5, r7\n\t"
  1854. "adc r3, r3, #0\n\t"
  1855. "lsl r7, r9, #16\n\t"
  1856. "lsr r7, r7, #16\n\t"
  1857. "mul r6, r7, r6\n\t"
  1858. "lsr r7, r6, #16\n\t"
  1859. "lsl r6, r6, #16\n\t"
  1860. "adds r4, r4, r6\n\t"
  1861. "adcs r5, r5, r7\n\t"
  1862. "adc r3, r3, #0\n\t"
  1863. /* A[3] * B[7] */
  1864. "ldr r8, [%[a], #12]\n\t"
  1865. "ldr r9, [%[b], #28]\n\t"
  1866. "lsl r6, r8, #16\n\t"
  1867. "lsl r7, r9, #16\n\t"
  1868. "lsr r6, r6, #16\n\t"
  1869. "lsr r7, r7, #16\n\t"
  1870. "mul r7, r6, r7\n\t"
  1871. "adds r4, r4, r7\n\t"
  1872. "adcs r5, r5, #0\n\t"
  1873. "adc r3, r3, #0\n\t"
  1874. "lsr r7, r9, #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 r4, r4, r6\n\t"
  1879. "adcs r5, r5, r7\n\t"
  1880. "adc r3, r3, #0\n\t"
  1881. "lsr r6, r8, #16\n\t"
  1882. "lsr r7, r9, #16\n\t"
  1883. "mul r7, r6, r7\n\t"
  1884. "adds r5, r5, r7\n\t"
  1885. "adc r3, r3, #0\n\t"
  1886. "lsl r7, r9, #16\n\t"
  1887. "lsr r7, r7, #16\n\t"
  1888. "mul r6, r7, r6\n\t"
  1889. "lsr r7, r6, #16\n\t"
  1890. "lsl r6, r6, #16\n\t"
  1891. "adds r4, r4, r6\n\t"
  1892. "adcs r5, r5, r7\n\t"
  1893. "adc r3, r3, #0\n\t"
  1894. "str r4, [%[r], #40]\n\t"
  1895. /* A[4] * B[7] */
  1896. "ldr r8, [%[a], #16]\n\t"
  1897. "lsl r6, r8, #16\n\t"
  1898. "lsl r7, r9, #16\n\t"
  1899. "lsr r6, r6, #16\n\t"
  1900. "lsr r7, r7, #16\n\t"
  1901. "mul r7, r6, r7\n\t"
  1902. "adds r5, r5, r7\n\t"
  1903. "adcs r3, r3, #0\n\t"
  1904. "mov r4, #0\n\t"
  1905. "adc r4, r4, #0\n\t"
  1906. "lsr r7, r9, #16\n\t"
  1907. "mul r6, r7, r6\n\t"
  1908. "lsr r7, r6, #16\n\t"
  1909. "lsl r6, r6, #16\n\t"
  1910. "adds r5, r5, r6\n\t"
  1911. "adcs r3, r3, r7\n\t"
  1912. "adc r4, r4, #0\n\t"
  1913. "lsr r6, r8, #16\n\t"
  1914. "lsr r7, r9, #16\n\t"
  1915. "mul r7, r6, r7\n\t"
  1916. "adds r3, r3, r7\n\t"
  1917. "adc r4, r4, #0\n\t"
  1918. "lsl r7, r9, #16\n\t"
  1919. "lsr r7, r7, #16\n\t"
  1920. "mul r6, r7, r6\n\t"
  1921. "lsr r7, r6, #16\n\t"
  1922. "lsl r6, r6, #16\n\t"
  1923. "adds r5, r5, r6\n\t"
  1924. "adcs r3, r3, r7\n\t"
  1925. "adc r4, r4, #0\n\t"
  1926. /* A[5] * B[6] */
  1927. "ldr r9, [%[b], #24]\n\t"
  1928. "lsl r6, r11, #16\n\t"
  1929. "lsl r7, r9, #16\n\t"
  1930. "lsr r6, r6, #16\n\t"
  1931. "lsr r7, r7, #16\n\t"
  1932. "mul r7, r6, r7\n\t"
  1933. "adds r5, r5, r7\n\t"
  1934. "adcs r3, r3, #0\n\t"
  1935. "adc r4, r4, #0\n\t"
  1936. "lsr r7, r9, #16\n\t"
  1937. "mul r6, r7, r6\n\t"
  1938. "lsr r7, r6, #16\n\t"
  1939. "lsl r6, r6, #16\n\t"
  1940. "adds r5, r5, r6\n\t"
  1941. "adcs r3, r3, r7\n\t"
  1942. "adc r4, r4, #0\n\t"
  1943. "lsr r6, r11, #16\n\t"
  1944. "lsr r7, r9, #16\n\t"
  1945. "mul r7, r6, r7\n\t"
  1946. "adds r3, r3, r7\n\t"
  1947. "adc r4, r4, #0\n\t"
  1948. "lsl r7, r9, #16\n\t"
  1949. "lsr r7, r7, #16\n\t"
  1950. "mul r6, r7, r6\n\t"
  1951. "lsr r7, r6, #16\n\t"
  1952. "lsl r6, r6, #16\n\t"
  1953. "adds r5, r5, r6\n\t"
  1954. "adcs r3, r3, r7\n\t"
  1955. "adc r4, r4, #0\n\t"
  1956. /* A[6] * B[5] */
  1957. "ldr r8, [%[a], #24]\n\t"
  1958. "lsl r6, r8, #16\n\t"
  1959. "lsl r7, r12, #16\n\t"
  1960. "lsr r6, r6, #16\n\t"
  1961. "lsr r7, r7, #16\n\t"
  1962. "mul r7, r6, r7\n\t"
  1963. "adds r5, r5, r7\n\t"
  1964. "adcs r3, r3, #0\n\t"
  1965. "adc r4, r4, #0\n\t"
  1966. "lsr r7, r12, #16\n\t"
  1967. "mul r6, r7, r6\n\t"
  1968. "lsr r7, r6, #16\n\t"
  1969. "lsl r6, r6, #16\n\t"
  1970. "adds r5, r5, r6\n\t"
  1971. "adcs r3, r3, r7\n\t"
  1972. "adc r4, r4, #0\n\t"
  1973. "lsr r6, r8, #16\n\t"
  1974. "lsr r7, r12, #16\n\t"
  1975. "mul r7, r6, r7\n\t"
  1976. "adds r3, r3, r7\n\t"
  1977. "adc r4, r4, #0\n\t"
  1978. "lsl r7, r12, #16\n\t"
  1979. "lsr r7, r7, #16\n\t"
  1980. "mul r6, r7, r6\n\t"
  1981. "lsr r7, r6, #16\n\t"
  1982. "lsl r6, r6, #16\n\t"
  1983. "adds r5, r5, r6\n\t"
  1984. "adcs r3, r3, r7\n\t"
  1985. "adc r4, r4, #0\n\t"
  1986. /* A[7] * B[4] */
  1987. "ldr r8, [%[a], #28]\n\t"
  1988. "ldr r9, [%[b], #16]\n\t"
  1989. "lsl r6, r8, #16\n\t"
  1990. "lsl r7, r9, #16\n\t"
  1991. "lsr r6, r6, #16\n\t"
  1992. "lsr r7, r7, #16\n\t"
  1993. "mul r7, r6, r7\n\t"
  1994. "adds r5, r5, r7\n\t"
  1995. "adcs r3, r3, #0\n\t"
  1996. "adc r4, r4, #0\n\t"
  1997. "lsr r7, r9, #16\n\t"
  1998. "mul r6, r7, r6\n\t"
  1999. "lsr r7, r6, #16\n\t"
  2000. "lsl r6, r6, #16\n\t"
  2001. "adds r5, r5, r6\n\t"
  2002. "adcs r3, r3, r7\n\t"
  2003. "adc r4, r4, #0\n\t"
  2004. "lsr r6, r8, #16\n\t"
  2005. "lsr r7, r9, #16\n\t"
  2006. "mul r7, r6, r7\n\t"
  2007. "adds r3, r3, r7\n\t"
  2008. "adc r4, r4, #0\n\t"
  2009. "lsl r7, r9, #16\n\t"
  2010. "lsr r7, r7, #16\n\t"
  2011. "mul r6, r7, r6\n\t"
  2012. "lsr r7, r6, #16\n\t"
  2013. "lsl r6, r6, #16\n\t"
  2014. "adds r5, r5, r6\n\t"
  2015. "adcs r3, r3, r7\n\t"
  2016. "adc r4, r4, #0\n\t"
  2017. "str r5, [%[r], #44]\n\t"
  2018. /* A[7] * B[5] */
  2019. "lsl r6, r8, #16\n\t"
  2020. "lsl r7, r12, #16\n\t"
  2021. "lsr r6, r6, #16\n\t"
  2022. "lsr r7, r7, #16\n\t"
  2023. "mul r7, r6, r7\n\t"
  2024. "adds r3, r3, r7\n\t"
  2025. "adcs r4, r4, #0\n\t"
  2026. "mov r5, #0\n\t"
  2027. "adc r5, r5, #0\n\t"
  2028. "lsr r7, r12, #16\n\t"
  2029. "mul r6, r7, r6\n\t"
  2030. "lsr r7, r6, #16\n\t"
  2031. "lsl r6, r6, #16\n\t"
  2032. "adds r3, r3, r6\n\t"
  2033. "adcs r4, r4, r7\n\t"
  2034. "adc r5, r5, #0\n\t"
  2035. "lsr r6, r8, #16\n\t"
  2036. "lsr r7, r12, #16\n\t"
  2037. "mul r7, r6, r7\n\t"
  2038. "adds r4, r4, r7\n\t"
  2039. "adc r5, r5, #0\n\t"
  2040. "lsl r7, r12, #16\n\t"
  2041. "lsr r7, r7, #16\n\t"
  2042. "mul r6, r7, r6\n\t"
  2043. "lsr r7, r6, #16\n\t"
  2044. "lsl r6, r6, #16\n\t"
  2045. "adds r3, r3, r6\n\t"
  2046. "adcs r4, r4, r7\n\t"
  2047. "adc r5, r5, #0\n\t"
  2048. /* A[6] * B[6] */
  2049. "ldr r11, [%[a], #24]\n\t"
  2050. "ldr r12, [%[b], #24]\n\t"
  2051. "lsl r6, r11, #16\n\t"
  2052. "lsl r7, r12, #16\n\t"
  2053. "lsr r6, r6, #16\n\t"
  2054. "lsr r7, r7, #16\n\t"
  2055. "mul r7, r6, r7\n\t"
  2056. "adds r3, r3, r7\n\t"
  2057. "adcs r4, r4, #0\n\t"
  2058. "adc r5, r5, #0\n\t"
  2059. "lsr r7, r12, #16\n\t"
  2060. "mul r6, r7, r6\n\t"
  2061. "lsr r7, r6, #16\n\t"
  2062. "lsl r6, r6, #16\n\t"
  2063. "adds r3, r3, r6\n\t"
  2064. "adcs r4, r4, r7\n\t"
  2065. "adc r5, r5, #0\n\t"
  2066. "lsr r6, r11, #16\n\t"
  2067. "lsr r7, r12, #16\n\t"
  2068. "mul r7, r6, r7\n\t"
  2069. "adds r4, r4, r7\n\t"
  2070. "adc r5, r5, #0\n\t"
  2071. "lsl r7, r12, #16\n\t"
  2072. "lsr r7, r7, #16\n\t"
  2073. "mul r6, r7, r6\n\t"
  2074. "lsr r7, r6, #16\n\t"
  2075. "lsl r6, r6, #16\n\t"
  2076. "adds r3, r3, r6\n\t"
  2077. "adcs r4, r4, r7\n\t"
  2078. "adc r5, r5, #0\n\t"
  2079. /* A[5] * B[7] */
  2080. "ldr r8, [%[a], #20]\n\t"
  2081. "ldr r9, [%[b], #28]\n\t"
  2082. "lsl r6, r8, #16\n\t"
  2083. "lsl r7, r9, #16\n\t"
  2084. "lsr r6, r6, #16\n\t"
  2085. "lsr r7, r7, #16\n\t"
  2086. "mul r7, r6, r7\n\t"
  2087. "adds r3, r3, r7\n\t"
  2088. "adcs r4, r4, #0\n\t"
  2089. "adc r5, r5, #0\n\t"
  2090. "lsr r7, r9, #16\n\t"
  2091. "mul r6, r7, r6\n\t"
  2092. "lsr r7, r6, #16\n\t"
  2093. "lsl r6, r6, #16\n\t"
  2094. "adds r3, r3, r6\n\t"
  2095. "adcs r4, r4, r7\n\t"
  2096. "adc r5, r5, #0\n\t"
  2097. "lsr r6, r8, #16\n\t"
  2098. "lsr r7, r9, #16\n\t"
  2099. "mul r7, r6, r7\n\t"
  2100. "adds r4, r4, r7\n\t"
  2101. "adc r5, r5, #0\n\t"
  2102. "lsl r7, r9, #16\n\t"
  2103. "lsr r7, r7, #16\n\t"
  2104. "mul r6, r7, r6\n\t"
  2105. "lsr r7, r6, #16\n\t"
  2106. "lsl r6, r6, #16\n\t"
  2107. "adds r3, r3, r6\n\t"
  2108. "adcs r4, r4, r7\n\t"
  2109. "adc r5, r5, #0\n\t"
  2110. "str r3, [%[r], #48]\n\t"
  2111. /* A[6] * B[7] */
  2112. "lsl r6, r11, #16\n\t"
  2113. "lsl r7, r9, #16\n\t"
  2114. "lsr r6, r6, #16\n\t"
  2115. "lsr r7, r7, #16\n\t"
  2116. "mul r7, r6, r7\n\t"
  2117. "adds r4, r4, r7\n\t"
  2118. "adcs r5, r5, #0\n\t"
  2119. "mov r3, #0\n\t"
  2120. "adc r3, r3, #0\n\t"
  2121. "lsr r7, r9, #16\n\t"
  2122. "mul r6, r7, r6\n\t"
  2123. "lsr r7, r6, #16\n\t"
  2124. "lsl r6, r6, #16\n\t"
  2125. "adds r4, r4, r6\n\t"
  2126. "adcs r5, r5, r7\n\t"
  2127. "adc r3, r3, #0\n\t"
  2128. "lsr r6, r11, #16\n\t"
  2129. "lsr r7, r9, #16\n\t"
  2130. "mul r7, r6, r7\n\t"
  2131. "adds r5, r5, r7\n\t"
  2132. "adc r3, r3, #0\n\t"
  2133. "lsl r7, r9, #16\n\t"
  2134. "lsr r7, r7, #16\n\t"
  2135. "mul r6, r7, r6\n\t"
  2136. "lsr r7, r6, #16\n\t"
  2137. "lsl r6, r6, #16\n\t"
  2138. "adds r4, r4, r6\n\t"
  2139. "adcs r5, r5, r7\n\t"
  2140. "adc r3, r3, #0\n\t"
  2141. /* A[7] * B[6] */
  2142. "ldr r8, [%[a], #28]\n\t"
  2143. "lsl r6, r8, #16\n\t"
  2144. "lsl r7, r12, #16\n\t"
  2145. "lsr r6, r6, #16\n\t"
  2146. "lsr r7, r7, #16\n\t"
  2147. "mul r7, r6, r7\n\t"
  2148. "adds r4, r4, r7\n\t"
  2149. "adcs r5, r5, #0\n\t"
  2150. "adc r3, r3, #0\n\t"
  2151. "lsr r7, r12, #16\n\t"
  2152. "mul r6, r7, r6\n\t"
  2153. "lsr r7, r6, #16\n\t"
  2154. "lsl r6, r6, #16\n\t"
  2155. "adds r4, r4, r6\n\t"
  2156. "adcs r5, r5, r7\n\t"
  2157. "adc r3, r3, #0\n\t"
  2158. "lsr r6, r8, #16\n\t"
  2159. "lsr r7, r12, #16\n\t"
  2160. "mul r7, r6, r7\n\t"
  2161. "adds r5, r5, r7\n\t"
  2162. "adc r3, r3, #0\n\t"
  2163. "lsl r7, r12, #16\n\t"
  2164. "lsr r7, r7, #16\n\t"
  2165. "mul r6, r7, r6\n\t"
  2166. "lsr r7, r6, #16\n\t"
  2167. "lsl r6, r6, #16\n\t"
  2168. "adds r4, r4, r6\n\t"
  2169. "adcs r5, r5, r7\n\t"
  2170. "adc r3, r3, #0\n\t"
  2171. "str r4, [%[r], #52]\n\t"
  2172. /* A[7] * B[7] */
  2173. "lsl r6, r8, #16\n\t"
  2174. "lsl r7, r9, #16\n\t"
  2175. "lsr r6, r6, #16\n\t"
  2176. "lsr r7, r7, #16\n\t"
  2177. "mul r7, r6, r7\n\t"
  2178. "adds r5, r5, r7\n\t"
  2179. "adc r3, r3, #0\n\t"
  2180. "lsr r7, r9, #16\n\t"
  2181. "mul r6, r7, r6\n\t"
  2182. "lsr r7, r6, #16\n\t"
  2183. "lsl r6, r6, #16\n\t"
  2184. "adds r5, r5, r6\n\t"
  2185. "adc r3, r3, r7\n\t"
  2186. "lsr r6, r8, #16\n\t"
  2187. "lsr r7, r9, #16\n\t"
  2188. "mul r7, r6, r7\n\t"
  2189. "add r3, r3, r7\n\t"
  2190. "lsl r7, r9, #16\n\t"
  2191. "lsr r7, r7, #16\n\t"
  2192. "mul r6, r7, r6\n\t"
  2193. "lsr r7, r6, #16\n\t"
  2194. "lsl r6, r6, #16\n\t"
  2195. "adds r5, r5, r6\n\t"
  2196. "adc r3, r3, r7\n\t"
  2197. "str r5, [%[r], #56]\n\t"
  2198. "str r3, [%[r], #60]\n\t"
  2199. "ldm sp!, {r3, r4, r5, r6}\n\t"
  2200. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  2201. "ldm sp!, {r3, r4, r5, r6}\n\t"
  2202. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  2203. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  2204. :
  2205. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r11", "r12", "cc"
  2206. );
  2207. }
  2208. #elif defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  2209. /* Multiply a and b into r. (r = a * b)
  2210. *
  2211. * r A single precision integer.
  2212. * a A single precision integer.
  2213. * b A single precision integer.
  2214. */
  2215. static void sp_2048_mul_8(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p)
  2216. {
  2217. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  2218. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  2219. register const sp_digit* b asm ("r2") = (const sp_digit*)b_p;
  2220. __asm__ __volatile__ (
  2221. "sub sp, sp, #36\n\t"
  2222. "str %[r], [sp, #32]\n\t"
  2223. "mov %[r], #0\n\t"
  2224. "ldr r12, [%[a]]\n\t"
  2225. /* A[0] * B[0] */
  2226. "ldr lr, [%[b]]\n\t"
  2227. "umull r3, r4, r12, lr\n\t"
  2228. /* A[0] * B[2] */
  2229. "ldr lr, [%[b], #8]\n\t"
  2230. "umull r5, r6, r12, lr\n\t"
  2231. /* A[0] * B[4] */
  2232. "ldr lr, [%[b], #16]\n\t"
  2233. "umull r7, r8, r12, lr\n\t"
  2234. /* A[0] * B[6] */
  2235. "ldr lr, [%[b], #24]\n\t"
  2236. "umull r9, r10, r12, lr\n\t"
  2237. "str r3, [sp]\n\t"
  2238. /* A[0] * B[1] */
  2239. "ldr lr, [%[b], #4]\n\t"
  2240. "mov r11, %[r]\n\t"
  2241. "umlal r4, r11, r12, lr\n\t"
  2242. "adds r5, r5, r11\n\t"
  2243. /* A[0] * B[3] */
  2244. "ldr lr, [%[b], #12]\n\t"
  2245. "adcs r6, r6, #0\n\t"
  2246. "adc r11, %[r], #0\n\t"
  2247. "umlal r6, r11, r12, lr\n\t"
  2248. "adds r7, r7, r11\n\t"
  2249. /* A[0] * B[5] */
  2250. "ldr lr, [%[b], #20]\n\t"
  2251. "adcs r8, r8, #0\n\t"
  2252. "adc r11, %[r], #0\n\t"
  2253. "umlal r8, r11, r12, lr\n\t"
  2254. "adds r9, r9, r11\n\t"
  2255. /* A[0] * B[7] */
  2256. "ldr lr, [%[b], #28]\n\t"
  2257. "adcs r10, r10, #0\n\t"
  2258. "adc r3, %[r], #0\n\t"
  2259. "umlal r10, r3, r12, lr\n\t"
  2260. /* A[1] * B[0] */
  2261. "ldr r12, [%[a], #4]\n\t"
  2262. "ldr lr, [%[b]]\n\t"
  2263. "mov r11, #0\n\t"
  2264. "umlal r4, r11, r12, lr\n\t"
  2265. "str r4, [sp, #4]\n\t"
  2266. "adds r5, r5, r11\n\t"
  2267. /* A[1] * B[1] */
  2268. "ldr lr, [%[b], #4]\n\t"
  2269. "adc r11, %[r], #0\n\t"
  2270. "umlal r5, r11, r12, lr\n\t"
  2271. "adds r6, r6, r11\n\t"
  2272. /* A[1] * B[2] */
  2273. "ldr lr, [%[b], #8]\n\t"
  2274. "adc r11, %[r], #0\n\t"
  2275. "umlal r6, r11, r12, lr\n\t"
  2276. "adds r7, r7, r11\n\t"
  2277. /* A[1] * B[3] */
  2278. "ldr lr, [%[b], #12]\n\t"
  2279. "adc r11, %[r], #0\n\t"
  2280. "umlal r7, r11, r12, lr\n\t"
  2281. "adds r8, r8, r11\n\t"
  2282. /* A[1] * B[4] */
  2283. "ldr lr, [%[b], #16]\n\t"
  2284. "adc r11, %[r], #0\n\t"
  2285. "umlal r8, r11, r12, lr\n\t"
  2286. "adds r9, r9, r11\n\t"
  2287. /* A[1] * B[5] */
  2288. "ldr lr, [%[b], #20]\n\t"
  2289. "adc r11, %[r], #0\n\t"
  2290. "umlal r9, r11, r12, lr\n\t"
  2291. "adds r10, r10, r11\n\t"
  2292. /* A[1] * B[6] */
  2293. "ldr lr, [%[b], #24]\n\t"
  2294. "adc r11, %[r], #0\n\t"
  2295. "umlal r10, r11, r12, lr\n\t"
  2296. "adds r3, r3, r11\n\t"
  2297. /* A[1] * B[7] */
  2298. "ldr lr, [%[b], #28]\n\t"
  2299. "adc r4, %[r], #0\n\t"
  2300. "umlal r3, r4, r12, lr\n\t"
  2301. /* A[2] * B[0] */
  2302. "ldr r12, [%[a], #8]\n\t"
  2303. "ldr lr, [%[b]]\n\t"
  2304. "mov r11, #0\n\t"
  2305. "umlal r5, r11, r12, lr\n\t"
  2306. "str r5, [sp, #8]\n\t"
  2307. "adds r6, r6, r11\n\t"
  2308. /* A[2] * B[1] */
  2309. "ldr lr, [%[b], #4]\n\t"
  2310. "adc r11, %[r], #0\n\t"
  2311. "umlal r6, r11, r12, lr\n\t"
  2312. "adds r7, r7, r11\n\t"
  2313. /* A[2] * B[2] */
  2314. "ldr lr, [%[b], #8]\n\t"
  2315. "adc r11, %[r], #0\n\t"
  2316. "umlal r7, r11, r12, lr\n\t"
  2317. "adds r8, r8, r11\n\t"
  2318. /* A[2] * B[3] */
  2319. "ldr lr, [%[b], #12]\n\t"
  2320. "adc r11, %[r], #0\n\t"
  2321. "umlal r8, r11, r12, lr\n\t"
  2322. "adds r9, r9, r11\n\t"
  2323. /* A[2] * B[4] */
  2324. "ldr lr, [%[b], #16]\n\t"
  2325. "adc r11, %[r], #0\n\t"
  2326. "umlal r9, r11, r12, lr\n\t"
  2327. "adds r10, r10, r11\n\t"
  2328. /* A[2] * B[5] */
  2329. "ldr lr, [%[b], #20]\n\t"
  2330. "adc r11, %[r], #0\n\t"
  2331. "umlal r10, r11, r12, lr\n\t"
  2332. "adds r3, r3, r11\n\t"
  2333. /* A[2] * B[6] */
  2334. "ldr lr, [%[b], #24]\n\t"
  2335. "adc r11, %[r], #0\n\t"
  2336. "umlal r3, r11, r12, lr\n\t"
  2337. "adds r4, r4, r11\n\t"
  2338. /* A[2] * B[7] */
  2339. "ldr lr, [%[b], #28]\n\t"
  2340. "adc r5, %[r], #0\n\t"
  2341. "umlal r4, r5, r12, lr\n\t"
  2342. /* A[3] * B[0] */
  2343. "ldr r12, [%[a], #12]\n\t"
  2344. "ldr lr, [%[b]]\n\t"
  2345. "mov r11, #0\n\t"
  2346. "umlal r6, r11, r12, lr\n\t"
  2347. "str r6, [sp, #12]\n\t"
  2348. "adds r7, r7, r11\n\t"
  2349. /* A[3] * B[1] */
  2350. "ldr lr, [%[b], #4]\n\t"
  2351. "adc r11, %[r], #0\n\t"
  2352. "umlal r7, r11, r12, lr\n\t"
  2353. "adds r8, r8, r11\n\t"
  2354. /* A[3] * B[2] */
  2355. "ldr lr, [%[b], #8]\n\t"
  2356. "adc r11, %[r], #0\n\t"
  2357. "umlal r8, r11, r12, lr\n\t"
  2358. "adds r9, r9, r11\n\t"
  2359. /* A[3] * B[3] */
  2360. "ldr lr, [%[b], #12]\n\t"
  2361. "adc r11, %[r], #0\n\t"
  2362. "umlal r9, r11, r12, lr\n\t"
  2363. "adds r10, r10, r11\n\t"
  2364. /* A[3] * B[4] */
  2365. "ldr lr, [%[b], #16]\n\t"
  2366. "adc r11, %[r], #0\n\t"
  2367. "umlal r10, r11, r12, lr\n\t"
  2368. "adds r3, r3, r11\n\t"
  2369. /* A[3] * B[5] */
  2370. "ldr lr, [%[b], #20]\n\t"
  2371. "adc r11, %[r], #0\n\t"
  2372. "umlal r3, r11, r12, lr\n\t"
  2373. "adds r4, r4, r11\n\t"
  2374. /* A[3] * B[6] */
  2375. "ldr lr, [%[b], #24]\n\t"
  2376. "adc r11, %[r], #0\n\t"
  2377. "umlal r4, r11, r12, lr\n\t"
  2378. "adds r5, r5, r11\n\t"
  2379. /* A[3] * B[7] */
  2380. "ldr lr, [%[b], #28]\n\t"
  2381. "adc r6, %[r], #0\n\t"
  2382. "umlal r5, r6, r12, lr\n\t"
  2383. /* A[4] * B[0] */
  2384. "ldr r12, [%[a], #16]\n\t"
  2385. "ldr lr, [%[b]]\n\t"
  2386. "mov r11, #0\n\t"
  2387. "umlal r7, r11, r12, lr\n\t"
  2388. "str r7, [sp, #16]\n\t"
  2389. "adds r8, r8, r11\n\t"
  2390. /* A[4] * B[1] */
  2391. "ldr lr, [%[b], #4]\n\t"
  2392. "adc r11, %[r], #0\n\t"
  2393. "umlal r8, r11, r12, lr\n\t"
  2394. "adds r9, r9, r11\n\t"
  2395. /* A[4] * B[2] */
  2396. "ldr lr, [%[b], #8]\n\t"
  2397. "adc r11, %[r], #0\n\t"
  2398. "umlal r9, r11, r12, lr\n\t"
  2399. "adds r10, r10, r11\n\t"
  2400. /* A[4] * B[3] */
  2401. "ldr lr, [%[b], #12]\n\t"
  2402. "adc r11, %[r], #0\n\t"
  2403. "umlal r10, r11, r12, lr\n\t"
  2404. "adds r3, r3, r11\n\t"
  2405. /* A[4] * B[4] */
  2406. "ldr lr, [%[b], #16]\n\t"
  2407. "adc r11, %[r], #0\n\t"
  2408. "umlal r3, r11, r12, lr\n\t"
  2409. "adds r4, r4, r11\n\t"
  2410. /* A[4] * B[5] */
  2411. "ldr lr, [%[b], #20]\n\t"
  2412. "adc r11, %[r], #0\n\t"
  2413. "umlal r4, r11, r12, lr\n\t"
  2414. "adds r5, r5, r11\n\t"
  2415. /* A[4] * B[6] */
  2416. "ldr lr, [%[b], #24]\n\t"
  2417. "adc r11, %[r], #0\n\t"
  2418. "umlal r5, r11, r12, lr\n\t"
  2419. "adds r6, r6, r11\n\t"
  2420. /* A[4] * B[7] */
  2421. "ldr lr, [%[b], #28]\n\t"
  2422. "adc r7, %[r], #0\n\t"
  2423. "umlal r6, r7, r12, lr\n\t"
  2424. /* A[5] * B[0] */
  2425. "ldr r12, [%[a], #20]\n\t"
  2426. "ldr lr, [%[b]]\n\t"
  2427. "mov r11, #0\n\t"
  2428. "umlal r8, r11, r12, lr\n\t"
  2429. "str r8, [sp, #20]\n\t"
  2430. "adds r9, r9, r11\n\t"
  2431. /* A[5] * B[1] */
  2432. "ldr lr, [%[b], #4]\n\t"
  2433. "adc r11, %[r], #0\n\t"
  2434. "umlal r9, r11, r12, lr\n\t"
  2435. "adds r10, r10, r11\n\t"
  2436. /* A[5] * B[2] */
  2437. "ldr lr, [%[b], #8]\n\t"
  2438. "adc r11, %[r], #0\n\t"
  2439. "umlal r10, r11, r12, lr\n\t"
  2440. "adds r3, r3, r11\n\t"
  2441. /* A[5] * B[3] */
  2442. "ldr lr, [%[b], #12]\n\t"
  2443. "adc r11, %[r], #0\n\t"
  2444. "umlal r3, r11, r12, lr\n\t"
  2445. "adds r4, r4, r11\n\t"
  2446. /* A[5] * B[4] */
  2447. "ldr lr, [%[b], #16]\n\t"
  2448. "adc r11, %[r], #0\n\t"
  2449. "umlal r4, r11, r12, lr\n\t"
  2450. "adds r5, r5, r11\n\t"
  2451. /* A[5] * B[5] */
  2452. "ldr lr, [%[b], #20]\n\t"
  2453. "adc r11, %[r], #0\n\t"
  2454. "umlal r5, r11, r12, lr\n\t"
  2455. "adds r6, r6, r11\n\t"
  2456. /* A[5] * B[6] */
  2457. "ldr lr, [%[b], #24]\n\t"
  2458. "adc r11, %[r], #0\n\t"
  2459. "umlal r6, r11, r12, lr\n\t"
  2460. "adds r7, r7, r11\n\t"
  2461. /* A[5] * B[7] */
  2462. "ldr lr, [%[b], #28]\n\t"
  2463. "adc r8, %[r], #0\n\t"
  2464. "umlal r7, r8, r12, lr\n\t"
  2465. /* A[6] * B[0] */
  2466. "ldr r12, [%[a], #24]\n\t"
  2467. "ldr lr, [%[b]]\n\t"
  2468. "mov r11, #0\n\t"
  2469. "umlal r9, r11, r12, lr\n\t"
  2470. "str r9, [sp, #24]\n\t"
  2471. "adds r10, r10, r11\n\t"
  2472. /* A[6] * B[1] */
  2473. "ldr lr, [%[b], #4]\n\t"
  2474. "adc r11, %[r], #0\n\t"
  2475. "umlal r10, r11, r12, lr\n\t"
  2476. "adds r3, r3, r11\n\t"
  2477. /* A[6] * B[2] */
  2478. "ldr lr, [%[b], #8]\n\t"
  2479. "adc r11, %[r], #0\n\t"
  2480. "umlal r3, r11, r12, lr\n\t"
  2481. "adds r4, r4, r11\n\t"
  2482. /* A[6] * B[3] */
  2483. "ldr lr, [%[b], #12]\n\t"
  2484. "adc r11, %[r], #0\n\t"
  2485. "umlal r4, r11, r12, lr\n\t"
  2486. "adds r5, r5, r11\n\t"
  2487. /* A[6] * B[4] */
  2488. "ldr lr, [%[b], #16]\n\t"
  2489. "adc r11, %[r], #0\n\t"
  2490. "umlal r5, r11, r12, lr\n\t"
  2491. "adds r6, r6, r11\n\t"
  2492. /* A[6] * B[5] */
  2493. "ldr lr, [%[b], #20]\n\t"
  2494. "adc r11, %[r], #0\n\t"
  2495. "umlal r6, r11, r12, lr\n\t"
  2496. "adds r7, r7, r11\n\t"
  2497. /* A[6] * B[6] */
  2498. "ldr lr, [%[b], #24]\n\t"
  2499. "adc r11, %[r], #0\n\t"
  2500. "umlal r7, r11, r12, lr\n\t"
  2501. "adds r8, r8, r11\n\t"
  2502. /* A[6] * B[7] */
  2503. "ldr lr, [%[b], #28]\n\t"
  2504. "adc r9, %[r], #0\n\t"
  2505. "umlal r8, r9, r12, lr\n\t"
  2506. /* A[7] * B[0] */
  2507. "ldr r12, [%[a], #28]\n\t"
  2508. "ldr lr, [%[b]]\n\t"
  2509. "mov r11, #0\n\t"
  2510. "umlal r10, r11, r12, lr\n\t"
  2511. "str r10, [sp, #28]\n\t"
  2512. "adds r3, r3, r11\n\t"
  2513. /* A[7] * B[1] */
  2514. "ldr lr, [%[b], #4]\n\t"
  2515. "adc r11, %[r], #0\n\t"
  2516. "umlal r3, r11, r12, lr\n\t"
  2517. "adds r4, r4, r11\n\t"
  2518. /* A[7] * B[2] */
  2519. "ldr lr, [%[b], #8]\n\t"
  2520. "adc r11, %[r], #0\n\t"
  2521. "umlal r4, r11, r12, lr\n\t"
  2522. "adds r5, r5, r11\n\t"
  2523. /* A[7] * B[3] */
  2524. "ldr lr, [%[b], #12]\n\t"
  2525. "adc r11, %[r], #0\n\t"
  2526. "umlal r5, r11, r12, lr\n\t"
  2527. "adds r6, r6, r11\n\t"
  2528. /* A[7] * B[4] */
  2529. "ldr lr, [%[b], #16]\n\t"
  2530. "adc r11, %[r], #0\n\t"
  2531. "umlal r6, r11, r12, lr\n\t"
  2532. "adds r7, r7, r11\n\t"
  2533. /* A[7] * B[5] */
  2534. "ldr lr, [%[b], #20]\n\t"
  2535. "adc r11, %[r], #0\n\t"
  2536. "umlal r7, r11, r12, lr\n\t"
  2537. "adds r8, r8, r11\n\t"
  2538. /* A[7] * B[6] */
  2539. "ldr lr, [%[b], #24]\n\t"
  2540. "adc r11, %[r], #0\n\t"
  2541. "umlal r8, r11, r12, lr\n\t"
  2542. "adds r9, r9, r11\n\t"
  2543. /* A[7] * B[7] */
  2544. "ldr lr, [%[b], #28]\n\t"
  2545. "adc r10, %[r], #0\n\t"
  2546. "umlal r9, r10, r12, lr\n\t"
  2547. "ldr %[r], [sp, #32]\n\t"
  2548. "add %[r], %[r], #32\n\t"
  2549. "stm %[r], {r3, r4, r5, r6, r7, r8, r9, r10}\n\t"
  2550. "ldm sp, {r3, r4, r5, r6, r7, r8, r9, r10}\n\t"
  2551. "sub %[r], %[r], #32\n\t"
  2552. "stm %[r], {r3, r4, r5, r6, r7, r8, r9, r10}\n\t"
  2553. "add sp, sp, #36\n\t"
  2554. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  2555. :
  2556. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "lr", "cc"
  2557. );
  2558. }
  2559. #else
  2560. /* Multiply a and b into r. (r = a * b)
  2561. *
  2562. * r A single precision integer.
  2563. * a A single precision integer.
  2564. * b A single precision integer.
  2565. */
  2566. static void sp_2048_mul_8(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p)
  2567. {
  2568. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  2569. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  2570. register const sp_digit* b asm ("r2") = (const sp_digit*)b_p;
  2571. __asm__ __volatile__ (
  2572. "sub sp, sp, #44\n\t"
  2573. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  2574. "str %[r], [sp, #36]\n\t"
  2575. "str %[a], [sp, #40]\n\t"
  2576. #else
  2577. "strd %[r], %[a], [sp, #36]\n\t"
  2578. #endif
  2579. "mov lr, %[b]\n\t"
  2580. "ldm %[a], {%[r], %[a], %[b], r3}\n\t"
  2581. "ldm lr!, {r4, r5, r6}\n\t"
  2582. "umull r10, r11, %[r], r4\n\t"
  2583. "umull r12, r7, %[a], r4\n\t"
  2584. "umaal r11, r12, %[r], r5\n\t"
  2585. "umull r8, r9, %[b], r4\n\t"
  2586. "umaal r12, r8, %[a], r5\n\t"
  2587. "umaal r12, r7, %[r], r6\n\t"
  2588. "umaal r8, r9, r3, r4\n\t"
  2589. "stm sp, {r10, r11, r12}\n\t"
  2590. "umaal r7, r8, %[b], r5\n\t"
  2591. "ldm lr!, {r4}\n\t"
  2592. "umull r10, r11, %[a], r6\n\t"
  2593. "umaal r8, r9, %[b], r6\n\t"
  2594. "umaal r7, r10, %[r], r4\n\t"
  2595. "umaal r8, r11, r3, r5\n\t"
  2596. "str r7, [sp, #12]\n\t"
  2597. "umaal r8, r10, %[a], r4\n\t"
  2598. "umaal r9, r11, r3, r6\n\t"
  2599. "umaal r9, r10, %[b], r4\n\t"
  2600. "umaal r10, r11, r3, r4\n\t"
  2601. "ldm lr, {r4, r5, r6, r7}\n\t"
  2602. "mov r12, #0\n\t"
  2603. "umlal r8, r12, %[r], r4\n\t"
  2604. "umaal r9, r12, %[a], r4\n\t"
  2605. "umaal r10, r12, %[b], r4\n\t"
  2606. "umaal r11, r12, r3, r4\n\t"
  2607. "mov r4, #0\n\t"
  2608. "umlal r9, r4, %[r], r5\n\t"
  2609. "umaal r10, r4, %[a], r5\n\t"
  2610. "umaal r11, r4, %[b], r5\n\t"
  2611. "umaal r12, r4, r3, r5\n\t"
  2612. "mov r5, #0\n\t"
  2613. "umlal r10, r5, %[r], r6\n\t"
  2614. "umaal r11, r5, %[a], r6\n\t"
  2615. "umaal r12, r5, %[b], r6\n\t"
  2616. "umaal r4, r5, r3, r6\n\t"
  2617. "mov r6, #0\n\t"
  2618. "umlal r11, r6, %[r], r7\n\t"
  2619. "ldr %[r], [sp, #40]\n\t"
  2620. "umaal r12, r6, %[a], r7\n\t"
  2621. "add %[r], %[r], #16\n\t"
  2622. "umaal r4, r6, %[b], r7\n\t"
  2623. "sub lr, lr, #16\n\t"
  2624. "umaal r5, r6, r3, r7\n\t"
  2625. "ldm %[r], {%[r], %[a], %[b], r3}\n\t"
  2626. "str r6, [sp, #32]\n\t"
  2627. "ldm lr!, {r6}\n\t"
  2628. "mov r7, #0\n\t"
  2629. "umlal r8, r7, %[r], r6\n\t"
  2630. "umaal r9, r7, %[a], r6\n\t"
  2631. "str r8, [sp, #16]\n\t"
  2632. "umaal r10, r7, %[b], r6\n\t"
  2633. "umaal r11, r7, r3, r6\n\t"
  2634. "ldm lr!, {r6}\n\t"
  2635. "mov r8, #0\n\t"
  2636. "umlal r9, r8, %[r], r6\n\t"
  2637. "umaal r10, r8, %[a], r6\n\t"
  2638. "str r9, [sp, #20]\n\t"
  2639. "umaal r11, r8, %[b], r6\n\t"
  2640. "umaal r12, r8, r3, r6\n\t"
  2641. "ldm lr!, {r6}\n\t"
  2642. "mov r9, #0\n\t"
  2643. "umlal r10, r9, %[r], r6\n\t"
  2644. "umaal r11, r9, %[a], r6\n\t"
  2645. "str r10, [sp, #24]\n\t"
  2646. "umaal r12, r9, %[b], r6\n\t"
  2647. "umaal r4, r9, r3, r6\n\t"
  2648. "ldm lr!, {r6}\n\t"
  2649. "mov r10, #0\n\t"
  2650. "umlal r11, r10, %[r], r6\n\t"
  2651. "umaal r12, r10, %[a], r6\n\t"
  2652. "str r11, [sp, #28]\n\t"
  2653. "umaal r4, r10, %[b], r6\n\t"
  2654. "umaal r5, r10, r3, r6\n\t"
  2655. "ldm lr!, {r11}\n\t"
  2656. "umaal r12, r7, %[r], r11\n\t"
  2657. "umaal r4, r7, %[a], r11\n\t"
  2658. "ldr r6, [sp, #32]\n\t"
  2659. "umaal r5, r7, %[b], r11\n\t"
  2660. "umaal r6, r7, r3, r11\n\t"
  2661. "ldm lr!, {r11}\n\t"
  2662. "umaal r4, r8, %[r], r11\n\t"
  2663. "umaal r5, r8, %[a], r11\n\t"
  2664. "umaal r6, r8, %[b], r11\n\t"
  2665. "umaal r7, r8, r3, r11\n\t"
  2666. "ldm lr, {r11, lr}\n\t"
  2667. "umaal r5, r9, %[r], r11\n\t"
  2668. "umaal r6, r10, %[r], lr\n\t"
  2669. "umaal r6, r9, %[a], r11\n\t"
  2670. "umaal r7, r10, %[a], lr\n\t"
  2671. "umaal r7, r9, %[b], r11\n\t"
  2672. "umaal r8, r10, %[b], lr\n\t"
  2673. "umaal r8, r9, r3, r11\n\t"
  2674. "umaal r9, r10, r3, lr\n\t"
  2675. "mov r3, r12\n\t"
  2676. "ldr lr, [sp, #36]\n\t"
  2677. "add lr, lr, #32\n\t"
  2678. "stm lr, {r3, r4, r5, r6, r7, r8, r9, r10}\n\t"
  2679. "sub lr, lr, #32\n\t"
  2680. "ldm sp, {r3, r4, r5, r6, r7, r8, r9, r10}\n\t"
  2681. "stm lr, {r3, r4, r5, r6, r7, r8, r9, r10}\n\t"
  2682. "add sp, sp, #44\n\t"
  2683. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  2684. :
  2685. : "memory", "r3", "r4", "r5", "r6", "r10", "r11", "r12", "r7", "r8", "r9", "lr", "cc"
  2686. );
  2687. }
  2688. #endif
  2689. /* Add b to a into r. (r = a + b)
  2690. *
  2691. * r A single precision integer.
  2692. * a A single precision integer.
  2693. * b A single precision integer.
  2694. */
  2695. static sp_digit sp_2048_add_8(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p)
  2696. {
  2697. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  2698. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  2699. register const sp_digit* b asm ("r2") = (const sp_digit*)b_p;
  2700. __asm__ __volatile__ (
  2701. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  2702. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  2703. "adds r3, r3, r7\n\t"
  2704. "adcs r4, r4, r8\n\t"
  2705. "adcs r5, r5, r9\n\t"
  2706. "adcs r6, r6, r10\n\t"
  2707. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  2708. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  2709. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  2710. "adcs r3, r3, r7\n\t"
  2711. "adcs r4, r4, r8\n\t"
  2712. "adcs r5, r5, r9\n\t"
  2713. "adcs r6, r6, r10\n\t"
  2714. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  2715. "mov %[r], #0\n\t"
  2716. "adc %[r], %[r], #0\n\t"
  2717. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  2718. :
  2719. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "cc"
  2720. );
  2721. return (uint32_t)(size_t)r;
  2722. }
  2723. /* Sub b from a into a. (a -= b)
  2724. *
  2725. * a A single precision integer and result.
  2726. * b A single precision integer.
  2727. */
  2728. static sp_digit sp_2048_sub_in_place_16(sp_digit* a_p, const sp_digit* b_p)
  2729. {
  2730. register sp_digit* a asm ("r0") = (sp_digit*)a_p;
  2731. register const sp_digit* b asm ("r1") = (const sp_digit*)b_p;
  2732. __asm__ __volatile__ (
  2733. "ldm %[a], {r2, r3, r4, r5}\n\t"
  2734. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  2735. "subs r2, r2, r6\n\t"
  2736. "sbcs r3, r3, r7\n\t"
  2737. "sbcs r4, r4, r8\n\t"
  2738. "sbcs r5, r5, r9\n\t"
  2739. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  2740. "ldm %[a], {r2, r3, r4, r5}\n\t"
  2741. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  2742. "sbcs r2, r2, r6\n\t"
  2743. "sbcs r3, r3, r7\n\t"
  2744. "sbcs r4, r4, r8\n\t"
  2745. "sbcs r5, r5, r9\n\t"
  2746. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  2747. "ldm %[a], {r2, r3, r4, r5}\n\t"
  2748. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  2749. "sbcs r2, r2, r6\n\t"
  2750. "sbcs r3, r3, r7\n\t"
  2751. "sbcs r4, r4, r8\n\t"
  2752. "sbcs r5, r5, r9\n\t"
  2753. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  2754. "ldm %[a], {r2, r3, r4, r5}\n\t"
  2755. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  2756. "sbcs r2, r2, r6\n\t"
  2757. "sbcs r3, r3, r7\n\t"
  2758. "sbcs r4, r4, r8\n\t"
  2759. "sbcs r5, r5, r9\n\t"
  2760. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  2761. "sbc %[a], r9, r9\n\t"
  2762. : [a] "+r" (a), [b] "+r" (b)
  2763. :
  2764. : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "cc"
  2765. );
  2766. return (uint32_t)(size_t)a;
  2767. }
  2768. /* Add b to a into r. (r = a + b)
  2769. *
  2770. * r A single precision integer.
  2771. * a A single precision integer.
  2772. * b A single precision integer.
  2773. */
  2774. static sp_digit sp_2048_add_16(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p)
  2775. {
  2776. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  2777. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  2778. register const sp_digit* b asm ("r2") = (const sp_digit*)b_p;
  2779. __asm__ __volatile__ (
  2780. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  2781. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  2782. "adds r3, r3, r7\n\t"
  2783. "adcs r4, r4, r8\n\t"
  2784. "adcs r5, r5, r9\n\t"
  2785. "adcs r6, r6, r10\n\t"
  2786. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  2787. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  2788. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  2789. "adcs r3, r3, r7\n\t"
  2790. "adcs r4, r4, r8\n\t"
  2791. "adcs r5, r5, r9\n\t"
  2792. "adcs r6, r6, r10\n\t"
  2793. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  2794. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  2795. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  2796. "adcs r3, r3, r7\n\t"
  2797. "adcs r4, r4, r8\n\t"
  2798. "adcs r5, r5, r9\n\t"
  2799. "adcs r6, r6, r10\n\t"
  2800. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  2801. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  2802. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  2803. "adcs r3, r3, r7\n\t"
  2804. "adcs r4, r4, r8\n\t"
  2805. "adcs r5, r5, r9\n\t"
  2806. "adcs r6, r6, r10\n\t"
  2807. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  2808. "mov %[r], #0\n\t"
  2809. "adc %[r], %[r], #0\n\t"
  2810. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  2811. :
  2812. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "cc"
  2813. );
  2814. return (uint32_t)(size_t)r;
  2815. }
  2816. /* AND m into each word of a and store in r.
  2817. *
  2818. * r A single precision integer.
  2819. * a A single precision integer.
  2820. * m Mask to AND against each digit.
  2821. */
  2822. static void sp_2048_mask_8(sp_digit* r, const sp_digit* a, sp_digit m)
  2823. {
  2824. #ifdef WOLFSSL_SP_SMALL
  2825. int i;
  2826. for (i=0; i<8; i++) {
  2827. r[i] = a[i] & m;
  2828. }
  2829. #else
  2830. r[0] = a[0] & m;
  2831. r[1] = a[1] & m;
  2832. r[2] = a[2] & m;
  2833. r[3] = a[3] & m;
  2834. r[4] = a[4] & m;
  2835. r[5] = a[5] & m;
  2836. r[6] = a[6] & m;
  2837. r[7] = a[7] & m;
  2838. #endif
  2839. }
  2840. /* Multiply a and b into r. (r = a * b)
  2841. *
  2842. * r A single precision integer.
  2843. * a A single precision integer.
  2844. * b A single precision integer.
  2845. */
  2846. SP_NOINLINE static void sp_2048_mul_16(sp_digit* r, const sp_digit* a,
  2847. const sp_digit* b)
  2848. {
  2849. sp_digit* z0 = r;
  2850. sp_digit z1[16];
  2851. sp_digit a1[8];
  2852. sp_digit b1[8];
  2853. sp_digit* z2 = r + 16;
  2854. sp_digit u;
  2855. sp_digit ca;
  2856. sp_digit cb;
  2857. ca = sp_2048_add_8(a1, a, &a[8]);
  2858. cb = sp_2048_add_8(b1, b, &b[8]);
  2859. u = ca & cb;
  2860. sp_2048_mul_8(z2, &a[8], &b[8]);
  2861. sp_2048_mul_8(z0, a, b);
  2862. sp_2048_mul_8(z1, a1, b1);
  2863. u += sp_2048_sub_in_place_16(z1, z0);
  2864. u += sp_2048_sub_in_place_16(z1, z2);
  2865. sp_2048_mask_8(a1, a1, 0 - cb);
  2866. u += sp_2048_add_8(z1 + 8, z1 + 8, a1);
  2867. sp_2048_mask_8(b1, b1, 0 - ca);
  2868. u += sp_2048_add_8(z1 + 8, z1 + 8, b1);
  2869. u += sp_2048_add_16(r + 8, r + 8, z1);
  2870. XMEMSET(a1 + 1, 0, sizeof(sp_digit) * (8 - 1));
  2871. a1[0] = u;
  2872. (void)sp_2048_add_8(r + 24, r + 24, a1);
  2873. }
  2874. /* Sub b from a into a. (a -= b)
  2875. *
  2876. * a A single precision integer and result.
  2877. * b A single precision integer.
  2878. */
  2879. static sp_digit sp_2048_sub_in_place_32(sp_digit* a_p, const sp_digit* b_p)
  2880. {
  2881. register sp_digit* a asm ("r0") = (sp_digit*)a_p;
  2882. register const sp_digit* b asm ("r1") = (const sp_digit*)b_p;
  2883. __asm__ __volatile__ (
  2884. "ldm %[a], {r2, r3, r4, r5}\n\t"
  2885. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  2886. "subs r2, r2, r6\n\t"
  2887. "sbcs r3, r3, r7\n\t"
  2888. "sbcs r4, r4, r8\n\t"
  2889. "sbcs r5, r5, r9\n\t"
  2890. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  2891. "ldm %[a], {r2, r3, r4, r5}\n\t"
  2892. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  2893. "sbcs r2, r2, r6\n\t"
  2894. "sbcs r3, r3, r7\n\t"
  2895. "sbcs r4, r4, r8\n\t"
  2896. "sbcs r5, r5, r9\n\t"
  2897. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  2898. "ldm %[a], {r2, r3, r4, r5}\n\t"
  2899. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  2900. "sbcs r2, r2, r6\n\t"
  2901. "sbcs r3, r3, r7\n\t"
  2902. "sbcs r4, r4, r8\n\t"
  2903. "sbcs r5, r5, r9\n\t"
  2904. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  2905. "ldm %[a], {r2, r3, r4, r5}\n\t"
  2906. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  2907. "sbcs r2, r2, r6\n\t"
  2908. "sbcs r3, r3, r7\n\t"
  2909. "sbcs r4, r4, r8\n\t"
  2910. "sbcs r5, r5, r9\n\t"
  2911. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  2912. "ldm %[a], {r2, r3, r4, r5}\n\t"
  2913. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  2914. "sbcs r2, r2, r6\n\t"
  2915. "sbcs r3, r3, r7\n\t"
  2916. "sbcs r4, r4, r8\n\t"
  2917. "sbcs r5, r5, r9\n\t"
  2918. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  2919. "ldm %[a], {r2, r3, r4, r5}\n\t"
  2920. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  2921. "sbcs r2, r2, r6\n\t"
  2922. "sbcs r3, r3, r7\n\t"
  2923. "sbcs r4, r4, r8\n\t"
  2924. "sbcs r5, r5, r9\n\t"
  2925. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  2926. "ldm %[a], {r2, r3, r4, r5}\n\t"
  2927. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  2928. "sbcs r2, r2, r6\n\t"
  2929. "sbcs r3, r3, r7\n\t"
  2930. "sbcs r4, r4, r8\n\t"
  2931. "sbcs r5, r5, r9\n\t"
  2932. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  2933. "ldm %[a], {r2, r3, r4, r5}\n\t"
  2934. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  2935. "sbcs r2, r2, r6\n\t"
  2936. "sbcs r3, r3, r7\n\t"
  2937. "sbcs r4, r4, r8\n\t"
  2938. "sbcs r5, r5, r9\n\t"
  2939. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  2940. "sbc %[a], r9, r9\n\t"
  2941. : [a] "+r" (a), [b] "+r" (b)
  2942. :
  2943. : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "cc"
  2944. );
  2945. return (uint32_t)(size_t)a;
  2946. }
  2947. /* Add b to a into r. (r = a + b)
  2948. *
  2949. * r A single precision integer.
  2950. * a A single precision integer.
  2951. * b A single precision integer.
  2952. */
  2953. static sp_digit sp_2048_add_32(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p)
  2954. {
  2955. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  2956. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  2957. register const sp_digit* b asm ("r2") = (const sp_digit*)b_p;
  2958. __asm__ __volatile__ (
  2959. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  2960. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  2961. "adds 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. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  2981. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  2982. "adcs r3, r3, r7\n\t"
  2983. "adcs r4, r4, r8\n\t"
  2984. "adcs r5, r5, r9\n\t"
  2985. "adcs r6, r6, r10\n\t"
  2986. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  2987. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  2988. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  2989. "adcs r3, r3, r7\n\t"
  2990. "adcs r4, r4, r8\n\t"
  2991. "adcs r5, r5, r9\n\t"
  2992. "adcs r6, r6, r10\n\t"
  2993. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  2994. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  2995. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  2996. "adcs r3, r3, r7\n\t"
  2997. "adcs r4, r4, r8\n\t"
  2998. "adcs r5, r5, r9\n\t"
  2999. "adcs r6, r6, r10\n\t"
  3000. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  3001. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  3002. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  3003. "adcs r3, r3, r7\n\t"
  3004. "adcs r4, r4, r8\n\t"
  3005. "adcs r5, r5, r9\n\t"
  3006. "adcs r6, r6, r10\n\t"
  3007. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  3008. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  3009. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  3010. "adcs r3, r3, r7\n\t"
  3011. "adcs r4, r4, r8\n\t"
  3012. "adcs r5, r5, r9\n\t"
  3013. "adcs r6, r6, r10\n\t"
  3014. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  3015. "mov %[r], #0\n\t"
  3016. "adc %[r], %[r], #0\n\t"
  3017. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  3018. :
  3019. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "cc"
  3020. );
  3021. return (uint32_t)(size_t)r;
  3022. }
  3023. /* AND m into each word of a and store in r.
  3024. *
  3025. * r A single precision integer.
  3026. * a A single precision integer.
  3027. * m Mask to AND against each digit.
  3028. */
  3029. static void sp_2048_mask_16(sp_digit* r, const sp_digit* a, sp_digit m)
  3030. {
  3031. #ifdef WOLFSSL_SP_SMALL
  3032. int i;
  3033. for (i=0; i<16; i++) {
  3034. r[i] = a[i] & m;
  3035. }
  3036. #else
  3037. int i;
  3038. for (i = 0; i < 16; i += 8) {
  3039. r[i+0] = a[i+0] & m;
  3040. r[i+1] = a[i+1] & m;
  3041. r[i+2] = a[i+2] & m;
  3042. r[i+3] = a[i+3] & m;
  3043. r[i+4] = a[i+4] & m;
  3044. r[i+5] = a[i+5] & m;
  3045. r[i+6] = a[i+6] & m;
  3046. r[i+7] = a[i+7] & m;
  3047. }
  3048. #endif
  3049. }
  3050. /* Multiply a and b into r. (r = a * b)
  3051. *
  3052. * r A single precision integer.
  3053. * a A single precision integer.
  3054. * b A single precision integer.
  3055. */
  3056. SP_NOINLINE static void sp_2048_mul_32(sp_digit* r, const sp_digit* a,
  3057. const sp_digit* b)
  3058. {
  3059. sp_digit* z0 = r;
  3060. sp_digit z1[32];
  3061. sp_digit a1[16];
  3062. sp_digit b1[16];
  3063. sp_digit* z2 = r + 32;
  3064. sp_digit u;
  3065. sp_digit ca;
  3066. sp_digit cb;
  3067. ca = sp_2048_add_16(a1, a, &a[16]);
  3068. cb = sp_2048_add_16(b1, b, &b[16]);
  3069. u = ca & cb;
  3070. sp_2048_mul_16(z2, &a[16], &b[16]);
  3071. sp_2048_mul_16(z0, a, b);
  3072. sp_2048_mul_16(z1, a1, b1);
  3073. u += sp_2048_sub_in_place_32(z1, z0);
  3074. u += sp_2048_sub_in_place_32(z1, z2);
  3075. sp_2048_mask_16(a1, a1, 0 - cb);
  3076. u += sp_2048_add_16(z1 + 16, z1 + 16, a1);
  3077. sp_2048_mask_16(b1, b1, 0 - ca);
  3078. u += sp_2048_add_16(z1 + 16, z1 + 16, b1);
  3079. u += sp_2048_add_32(r + 16, r + 16, z1);
  3080. XMEMSET(a1 + 1, 0, sizeof(sp_digit) * (16 - 1));
  3081. a1[0] = u;
  3082. (void)sp_2048_add_16(r + 48, r + 48, a1);
  3083. }
  3084. /* Sub b from a into a. (a -= b)
  3085. *
  3086. * a A single precision integer and result.
  3087. * b A single precision integer.
  3088. */
  3089. static sp_digit sp_2048_sub_in_place_64(sp_digit* a_p, const sp_digit* b_p)
  3090. {
  3091. register sp_digit* a asm ("r0") = (sp_digit*)a_p;
  3092. register const sp_digit* b asm ("r1") = (const sp_digit*)b_p;
  3093. __asm__ __volatile__ (
  3094. "ldm %[a], {r2, r3, r4, r5}\n\t"
  3095. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  3096. "subs r2, r2, r6\n\t"
  3097. "sbcs r3, r3, r7\n\t"
  3098. "sbcs r4, r4, r8\n\t"
  3099. "sbcs r5, r5, r9\n\t"
  3100. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  3101. "ldm %[a], {r2, r3, r4, r5}\n\t"
  3102. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  3103. "sbcs r2, r2, r6\n\t"
  3104. "sbcs r3, r3, r7\n\t"
  3105. "sbcs r4, r4, r8\n\t"
  3106. "sbcs r5, r5, r9\n\t"
  3107. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  3108. "ldm %[a], {r2, r3, r4, r5}\n\t"
  3109. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  3110. "sbcs r2, r2, r6\n\t"
  3111. "sbcs r3, r3, r7\n\t"
  3112. "sbcs r4, r4, r8\n\t"
  3113. "sbcs r5, r5, r9\n\t"
  3114. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  3115. "ldm %[a], {r2, r3, r4, r5}\n\t"
  3116. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  3117. "sbcs r2, r2, r6\n\t"
  3118. "sbcs r3, r3, r7\n\t"
  3119. "sbcs r4, r4, r8\n\t"
  3120. "sbcs r5, r5, r9\n\t"
  3121. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  3122. "ldm %[a], {r2, r3, r4, r5}\n\t"
  3123. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  3124. "sbcs r2, r2, r6\n\t"
  3125. "sbcs r3, r3, r7\n\t"
  3126. "sbcs r4, r4, r8\n\t"
  3127. "sbcs r5, r5, r9\n\t"
  3128. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  3129. "ldm %[a], {r2, r3, r4, r5}\n\t"
  3130. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  3131. "sbcs r2, r2, r6\n\t"
  3132. "sbcs r3, r3, r7\n\t"
  3133. "sbcs r4, r4, r8\n\t"
  3134. "sbcs r5, r5, r9\n\t"
  3135. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  3136. "ldm %[a], {r2, r3, r4, r5}\n\t"
  3137. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  3138. "sbcs r2, r2, r6\n\t"
  3139. "sbcs r3, r3, r7\n\t"
  3140. "sbcs r4, r4, r8\n\t"
  3141. "sbcs r5, r5, r9\n\t"
  3142. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  3143. "ldm %[a], {r2, r3, r4, r5}\n\t"
  3144. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  3145. "sbcs r2, r2, r6\n\t"
  3146. "sbcs r3, r3, r7\n\t"
  3147. "sbcs r4, r4, r8\n\t"
  3148. "sbcs r5, r5, r9\n\t"
  3149. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  3150. "ldm %[a], {r2, r3, r4, r5}\n\t"
  3151. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  3152. "sbcs r2, r2, r6\n\t"
  3153. "sbcs r3, r3, r7\n\t"
  3154. "sbcs r4, r4, r8\n\t"
  3155. "sbcs r5, r5, r9\n\t"
  3156. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  3157. "ldm %[a], {r2, r3, r4, r5}\n\t"
  3158. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  3159. "sbcs r2, r2, r6\n\t"
  3160. "sbcs r3, r3, r7\n\t"
  3161. "sbcs r4, r4, r8\n\t"
  3162. "sbcs r5, r5, r9\n\t"
  3163. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  3164. "ldm %[a], {r2, r3, r4, r5}\n\t"
  3165. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  3166. "sbcs r2, r2, r6\n\t"
  3167. "sbcs r3, r3, r7\n\t"
  3168. "sbcs r4, r4, r8\n\t"
  3169. "sbcs r5, r5, r9\n\t"
  3170. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  3171. "ldm %[a], {r2, r3, r4, r5}\n\t"
  3172. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  3173. "sbcs r2, r2, r6\n\t"
  3174. "sbcs r3, r3, r7\n\t"
  3175. "sbcs r4, r4, r8\n\t"
  3176. "sbcs r5, r5, r9\n\t"
  3177. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  3178. "ldm %[a], {r2, r3, r4, r5}\n\t"
  3179. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  3180. "sbcs r2, r2, r6\n\t"
  3181. "sbcs r3, r3, r7\n\t"
  3182. "sbcs r4, r4, r8\n\t"
  3183. "sbcs r5, r5, r9\n\t"
  3184. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  3185. "ldm %[a], {r2, r3, r4, r5}\n\t"
  3186. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  3187. "sbcs r2, r2, r6\n\t"
  3188. "sbcs r3, r3, r7\n\t"
  3189. "sbcs r4, r4, r8\n\t"
  3190. "sbcs r5, r5, r9\n\t"
  3191. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  3192. "ldm %[a], {r2, r3, r4, r5}\n\t"
  3193. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  3194. "sbcs r2, r2, r6\n\t"
  3195. "sbcs r3, r3, r7\n\t"
  3196. "sbcs r4, r4, r8\n\t"
  3197. "sbcs r5, r5, r9\n\t"
  3198. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  3199. "ldm %[a], {r2, r3, r4, r5}\n\t"
  3200. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  3201. "sbcs r2, r2, r6\n\t"
  3202. "sbcs r3, r3, r7\n\t"
  3203. "sbcs r4, r4, r8\n\t"
  3204. "sbcs r5, r5, r9\n\t"
  3205. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  3206. "sbc %[a], r9, r9\n\t"
  3207. : [a] "+r" (a), [b] "+r" (b)
  3208. :
  3209. : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "cc"
  3210. );
  3211. return (uint32_t)(size_t)a;
  3212. }
  3213. /* Add b to a into r. (r = a + b)
  3214. *
  3215. * r A single precision integer.
  3216. * a A single precision integer.
  3217. * b A single precision integer.
  3218. */
  3219. static sp_digit sp_2048_add_64(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p)
  3220. {
  3221. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  3222. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  3223. register const sp_digit* b asm ("r2") = (const sp_digit*)b_p;
  3224. __asm__ __volatile__ (
  3225. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  3226. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  3227. "adds 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. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  3303. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  3304. "adcs r3, r3, r7\n\t"
  3305. "adcs r4, r4, r8\n\t"
  3306. "adcs r5, r5, r9\n\t"
  3307. "adcs r6, r6, r10\n\t"
  3308. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  3309. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  3310. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  3311. "adcs r3, r3, r7\n\t"
  3312. "adcs r4, r4, r8\n\t"
  3313. "adcs r5, r5, r9\n\t"
  3314. "adcs r6, r6, r10\n\t"
  3315. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  3316. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  3317. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  3318. "adcs r3, r3, r7\n\t"
  3319. "adcs r4, r4, r8\n\t"
  3320. "adcs r5, r5, r9\n\t"
  3321. "adcs r6, r6, r10\n\t"
  3322. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  3323. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  3324. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  3325. "adcs r3, r3, r7\n\t"
  3326. "adcs r4, r4, r8\n\t"
  3327. "adcs r5, r5, r9\n\t"
  3328. "adcs r6, r6, r10\n\t"
  3329. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  3330. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  3331. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  3332. "adcs r3, r3, r7\n\t"
  3333. "adcs r4, r4, r8\n\t"
  3334. "adcs r5, r5, r9\n\t"
  3335. "adcs r6, r6, r10\n\t"
  3336. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  3337. "mov %[r], #0\n\t"
  3338. "adc %[r], %[r], #0\n\t"
  3339. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  3340. :
  3341. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "cc"
  3342. );
  3343. return (uint32_t)(size_t)r;
  3344. }
  3345. /* AND m into each word of a and store in r.
  3346. *
  3347. * r A single precision integer.
  3348. * a A single precision integer.
  3349. * m Mask to AND against each digit.
  3350. */
  3351. static void sp_2048_mask_32(sp_digit* r, const sp_digit* a, sp_digit m)
  3352. {
  3353. #ifdef WOLFSSL_SP_SMALL
  3354. int i;
  3355. for (i=0; i<32; i++) {
  3356. r[i] = a[i] & m;
  3357. }
  3358. #else
  3359. int i;
  3360. for (i = 0; i < 32; i += 8) {
  3361. r[i+0] = a[i+0] & m;
  3362. r[i+1] = a[i+1] & m;
  3363. r[i+2] = a[i+2] & m;
  3364. r[i+3] = a[i+3] & m;
  3365. r[i+4] = a[i+4] & m;
  3366. r[i+5] = a[i+5] & m;
  3367. r[i+6] = a[i+6] & m;
  3368. r[i+7] = a[i+7] & m;
  3369. }
  3370. #endif
  3371. }
  3372. /* Multiply a and b into r. (r = a * b)
  3373. *
  3374. * r A single precision integer.
  3375. * a A single precision integer.
  3376. * b A single precision integer.
  3377. */
  3378. SP_NOINLINE static void sp_2048_mul_64(sp_digit* r, const sp_digit* a,
  3379. const sp_digit* b)
  3380. {
  3381. sp_digit* z0 = r;
  3382. sp_digit z1[64];
  3383. sp_digit a1[32];
  3384. sp_digit b1[32];
  3385. sp_digit* z2 = r + 64;
  3386. sp_digit u;
  3387. sp_digit ca;
  3388. sp_digit cb;
  3389. ca = sp_2048_add_32(a1, a, &a[32]);
  3390. cb = sp_2048_add_32(b1, b, &b[32]);
  3391. u = ca & cb;
  3392. sp_2048_mul_32(z2, &a[32], &b[32]);
  3393. sp_2048_mul_32(z0, a, b);
  3394. sp_2048_mul_32(z1, a1, b1);
  3395. u += sp_2048_sub_in_place_64(z1, z0);
  3396. u += sp_2048_sub_in_place_64(z1, z2);
  3397. sp_2048_mask_32(a1, a1, 0 - cb);
  3398. u += sp_2048_add_32(z1 + 32, z1 + 32, a1);
  3399. sp_2048_mask_32(b1, b1, 0 - ca);
  3400. u += sp_2048_add_32(z1 + 32, z1 + 32, b1);
  3401. u += sp_2048_add_64(r + 32, r + 32, z1);
  3402. XMEMSET(a1 + 1, 0, sizeof(sp_digit) * (32 - 1));
  3403. a1[0] = u;
  3404. (void)sp_2048_add_32(r + 96, r + 96, a1);
  3405. }
  3406. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  3407. /* Square a and put result in r. (r = a * a)
  3408. *
  3409. * r A single precision integer.
  3410. * a A single precision integer.
  3411. */
  3412. static void sp_2048_sqr_8(sp_digit* r_p, const sp_digit* a_p)
  3413. {
  3414. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  3415. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  3416. __asm__ __volatile__ (
  3417. "sub sp, sp, #32\n\t"
  3418. /* A[0] * A[0] */
  3419. "ldr r10, [%[a]]\n\t"
  3420. "lsr r9, r10, #16\n\t"
  3421. "lsl r2, r10, #16\n\t"
  3422. "lsr r2, r2, #16\n\t"
  3423. "mul r8, r2, r2\n\t"
  3424. "mul r3, r9, r9\n\t"
  3425. "mul r2, r9, r2\n\t"
  3426. "lsr r9, r2, #15\n\t"
  3427. "lsl r2, r2, #17\n\t"
  3428. "adds r8, r8, r2\n\t"
  3429. "adc r3, r3, r9\n\t"
  3430. "mov r4, #0\n\t"
  3431. "str r8, [sp]\n\t"
  3432. /* A[0] * A[1] */
  3433. "ldr r10, [%[a], #4]\n\t"
  3434. "ldr r12, [%[a]]\n\t"
  3435. "lsl r8, r10, #16\n\t"
  3436. "lsl r9, r12, #16\n\t"
  3437. "lsr r8, r8, #16\n\t"
  3438. "lsr r9, r9, #16\n\t"
  3439. "mul r9, r8, r9\n\t"
  3440. "adds r3, r3, r9\n\t"
  3441. "adcs r4, r4, #0\n\t"
  3442. "mov r2, #0\n\t"
  3443. "adc r2, r2, #0\n\t"
  3444. "adds r3, r3, r9\n\t"
  3445. "adcs r4, r4, #0\n\t"
  3446. "adc r2, r2, #0\n\t"
  3447. "lsr r9, r12, #16\n\t"
  3448. "mul r8, r9, r8\n\t"
  3449. "lsr r9, r8, #16\n\t"
  3450. "lsl r8, r8, #16\n\t"
  3451. "adds r3, r3, r8\n\t"
  3452. "adcs r4, r4, r9\n\t"
  3453. "adc r2, r2, #0\n\t"
  3454. "adds r3, r3, r8\n\t"
  3455. "adcs r4, r4, r9\n\t"
  3456. "adc r2, r2, #0\n\t"
  3457. "lsr r8, r10, #16\n\t"
  3458. "lsr r9, r12, #16\n\t"
  3459. "mul r9, r8, r9\n\t"
  3460. "adds r4, r4, r9\n\t"
  3461. "adc r2, r2, #0\n\t"
  3462. "adds r4, r4, r9\n\t"
  3463. "adc r2, r2, #0\n\t"
  3464. "lsl r9, r12, #16\n\t"
  3465. "lsr r9, r9, #16\n\t"
  3466. "mul r8, r9, r8\n\t"
  3467. "lsr r9, r8, #16\n\t"
  3468. "lsl r8, r8, #16\n\t"
  3469. "adds r3, r3, r8\n\t"
  3470. "adcs r4, r4, r9\n\t"
  3471. "adc r2, r2, #0\n\t"
  3472. "adds r3, r3, r8\n\t"
  3473. "adcs r4, r4, r9\n\t"
  3474. "adc r2, r2, #0\n\t"
  3475. "str r3, [sp, #4]\n\t"
  3476. /* A[0] * A[2] */
  3477. "ldr r10, [%[a], #8]\n\t"
  3478. "ldr r12, [%[a]]\n\t"
  3479. "lsl r8, r10, #16\n\t"
  3480. "lsl r9, r12, #16\n\t"
  3481. "lsr r8, r8, #16\n\t"
  3482. "lsr r9, r9, #16\n\t"
  3483. "mul r9, r8, r9\n\t"
  3484. "adds r4, r4, r9\n\t"
  3485. "adcs r2, r2, #0\n\t"
  3486. "mov r3, #0\n\t"
  3487. "adc r3, r3, #0\n\t"
  3488. "adds r4, r4, r9\n\t"
  3489. "adcs r2, r2, #0\n\t"
  3490. "adc r3, r3, #0\n\t"
  3491. "lsr r9, r12, #16\n\t"
  3492. "mul r8, r9, r8\n\t"
  3493. "lsr r9, r8, #16\n\t"
  3494. "lsl r8, r8, #16\n\t"
  3495. "adds r4, r4, r8\n\t"
  3496. "adcs r2, r2, r9\n\t"
  3497. "adc r3, r3, #0\n\t"
  3498. "adds r4, r4, r8\n\t"
  3499. "adcs r2, r2, r9\n\t"
  3500. "adc r3, r3, #0\n\t"
  3501. "lsr r8, r10, #16\n\t"
  3502. "lsr r9, r12, #16\n\t"
  3503. "mul r9, r8, r9\n\t"
  3504. "adds r2, r2, r9\n\t"
  3505. "adc r3, r3, #0\n\t"
  3506. "adds r2, r2, r9\n\t"
  3507. "adc r3, r3, #0\n\t"
  3508. "lsl r9, r12, #16\n\t"
  3509. "lsr r9, r9, #16\n\t"
  3510. "mul r8, r9, r8\n\t"
  3511. "lsr r9, r8, #16\n\t"
  3512. "lsl r8, r8, #16\n\t"
  3513. "adds r4, r4, r8\n\t"
  3514. "adcs r2, r2, r9\n\t"
  3515. "adc r3, r3, #0\n\t"
  3516. "adds r4, r4, r8\n\t"
  3517. "adcs r2, r2, r9\n\t"
  3518. "adc r3, r3, #0\n\t"
  3519. /* A[1] * A[1] */
  3520. "ldr r10, [%[a], #4]\n\t"
  3521. "lsl r8, r10, #16\n\t"
  3522. "lsr r9, r10, #16\n\t"
  3523. "lsr r8, r8, #16\n\t"
  3524. "mov r12, r8\n\t"
  3525. "mul r8, r12, r8\n\t"
  3526. "mov r12, r9\n\t"
  3527. "mul r9, r12, r9\n\t"
  3528. "adds r4, r4, r8\n\t"
  3529. "adcs r2, r2, r9\n\t"
  3530. "adc r3, r3, #0\n\t"
  3531. "lsr r9, r10, #16\n\t"
  3532. "lsl r8, r10, #16\n\t"
  3533. "lsr r8, r8, #16\n\t"
  3534. "mul r8, r9, r8\n\t"
  3535. "lsr r9, r8, #15\n\t"
  3536. "lsl r8, r8, #17\n\t"
  3537. "adds r4, r4, r8\n\t"
  3538. "adcs r2, r2, r9\n\t"
  3539. "adc r3, r3, #0\n\t"
  3540. "str r4, [sp, #8]\n\t"
  3541. /* A[0] * A[3] */
  3542. "ldr r10, [%[a], #12]\n\t"
  3543. "ldr r12, [%[a]]\n\t"
  3544. "lsl r8, r10, #16\n\t"
  3545. "lsl r9, r12, #16\n\t"
  3546. "lsr r8, r8, #16\n\t"
  3547. "lsr r9, r9, #16\n\t"
  3548. "mul r9, r8, r9\n\t"
  3549. "adds r2, r2, r9\n\t"
  3550. "adcs r3, r3, #0\n\t"
  3551. "mov r4, #0\n\t"
  3552. "adc r4, r4, #0\n\t"
  3553. "adds r2, r2, r9\n\t"
  3554. "adcs r3, r3, #0\n\t"
  3555. "adc r4, r4, #0\n\t"
  3556. "lsr r9, r12, #16\n\t"
  3557. "mul r8, r9, r8\n\t"
  3558. "lsr r9, r8, #16\n\t"
  3559. "lsl r8, r8, #16\n\t"
  3560. "adds r2, r2, r8\n\t"
  3561. "adcs r3, r3, r9\n\t"
  3562. "adc r4, r4, #0\n\t"
  3563. "adds r2, r2, r8\n\t"
  3564. "adcs r3, r3, r9\n\t"
  3565. "adc r4, r4, #0\n\t"
  3566. "lsr r8, r10, #16\n\t"
  3567. "lsr r9, r12, #16\n\t"
  3568. "mul r9, r8, r9\n\t"
  3569. "adds r3, r3, r9\n\t"
  3570. "adc r4, r4, #0\n\t"
  3571. "adds r3, r3, r9\n\t"
  3572. "adc r4, r4, #0\n\t"
  3573. "lsl r9, r12, #16\n\t"
  3574. "lsr r9, r9, #16\n\t"
  3575. "mul r8, r9, r8\n\t"
  3576. "lsr r9, r8, #16\n\t"
  3577. "lsl r8, r8, #16\n\t"
  3578. "adds r2, r2, r8\n\t"
  3579. "adcs r3, r3, r9\n\t"
  3580. "adc r4, r4, #0\n\t"
  3581. "adds r2, r2, r8\n\t"
  3582. "adcs r3, r3, r9\n\t"
  3583. "adc r4, r4, #0\n\t"
  3584. /* A[1] * A[2] */
  3585. "ldr r10, [%[a], #8]\n\t"
  3586. "ldr r12, [%[a], #4]\n\t"
  3587. "lsl r8, r10, #16\n\t"
  3588. "lsl r9, r12, #16\n\t"
  3589. "lsr r8, r8, #16\n\t"
  3590. "lsr r9, r9, #16\n\t"
  3591. "mul r9, r8, r9\n\t"
  3592. "adds r2, r2, r9\n\t"
  3593. "adcs r3, r3, #0\n\t"
  3594. "adc r4, r4, #0\n\t"
  3595. "adds r2, r2, r9\n\t"
  3596. "adcs r3, r3, #0\n\t"
  3597. "adc r4, r4, #0\n\t"
  3598. "lsr r9, r12, #16\n\t"
  3599. "mul r8, r9, r8\n\t"
  3600. "lsr r9, r8, #16\n\t"
  3601. "lsl r8, r8, #16\n\t"
  3602. "adds r2, r2, r8\n\t"
  3603. "adcs r3, r3, r9\n\t"
  3604. "adc r4, r4, #0\n\t"
  3605. "adds r2, r2, r8\n\t"
  3606. "adcs r3, r3, r9\n\t"
  3607. "adc r4, r4, #0\n\t"
  3608. "lsr r8, r10, #16\n\t"
  3609. "lsr r9, r12, #16\n\t"
  3610. "mul r9, r8, r9\n\t"
  3611. "adds r3, r3, r9\n\t"
  3612. "adc r4, r4, #0\n\t"
  3613. "adds r3, r3, r9\n\t"
  3614. "adc r4, r4, #0\n\t"
  3615. "lsl r9, r12, #16\n\t"
  3616. "lsr r9, r9, #16\n\t"
  3617. "mul r8, r9, r8\n\t"
  3618. "lsr r9, r8, #16\n\t"
  3619. "lsl r8, r8, #16\n\t"
  3620. "adds r2, r2, r8\n\t"
  3621. "adcs r3, r3, r9\n\t"
  3622. "adc r4, r4, #0\n\t"
  3623. "adds r2, r2, r8\n\t"
  3624. "adcs r3, r3, r9\n\t"
  3625. "adc r4, r4, #0\n\t"
  3626. "str r2, [sp, #12]\n\t"
  3627. /* A[0] * A[4] */
  3628. "ldr r10, [%[a], #16]\n\t"
  3629. "ldr r12, [%[a]]\n\t"
  3630. "lsl r8, r10, #16\n\t"
  3631. "lsl r9, r12, #16\n\t"
  3632. "lsr r8, r8, #16\n\t"
  3633. "lsr r9, r9, #16\n\t"
  3634. "mul r9, r8, r9\n\t"
  3635. "adds r3, r3, r9\n\t"
  3636. "adcs r4, r4, #0\n\t"
  3637. "mov r2, #0\n\t"
  3638. "adc r2, r2, #0\n\t"
  3639. "adds r3, r3, r9\n\t"
  3640. "adcs r4, r4, #0\n\t"
  3641. "adc r2, r2, #0\n\t"
  3642. "lsr r9, r12, #16\n\t"
  3643. "mul r8, r9, r8\n\t"
  3644. "lsr r9, r8, #16\n\t"
  3645. "lsl r8, r8, #16\n\t"
  3646. "adds r3, r3, r8\n\t"
  3647. "adcs r4, r4, r9\n\t"
  3648. "adc r2, r2, #0\n\t"
  3649. "adds r3, r3, r8\n\t"
  3650. "adcs r4, r4, r9\n\t"
  3651. "adc r2, r2, #0\n\t"
  3652. "lsr r8, r10, #16\n\t"
  3653. "lsr r9, r12, #16\n\t"
  3654. "mul r9, r8, r9\n\t"
  3655. "adds r4, r4, r9\n\t"
  3656. "adc r2, r2, #0\n\t"
  3657. "adds r4, r4, r9\n\t"
  3658. "adc r2, r2, #0\n\t"
  3659. "lsl r9, r12, #16\n\t"
  3660. "lsr r9, r9, #16\n\t"
  3661. "mul r8, r9, r8\n\t"
  3662. "lsr r9, r8, #16\n\t"
  3663. "lsl r8, r8, #16\n\t"
  3664. "adds r3, r3, r8\n\t"
  3665. "adcs r4, r4, r9\n\t"
  3666. "adc r2, r2, #0\n\t"
  3667. "adds r3, r3, r8\n\t"
  3668. "adcs r4, r4, r9\n\t"
  3669. "adc r2, r2, #0\n\t"
  3670. /* A[1] * A[3] */
  3671. "ldr r10, [%[a], #12]\n\t"
  3672. "ldr r12, [%[a], #4]\n\t"
  3673. "lsl r8, r10, #16\n\t"
  3674. "lsl r9, r12, #16\n\t"
  3675. "lsr r8, r8, #16\n\t"
  3676. "lsr r9, r9, #16\n\t"
  3677. "mul r9, r8, r9\n\t"
  3678. "adds r3, r3, r9\n\t"
  3679. "adcs r4, r4, #0\n\t"
  3680. "adc r2, r2, #0\n\t"
  3681. "adds r3, r3, r9\n\t"
  3682. "adcs r4, r4, #0\n\t"
  3683. "adc r2, r2, #0\n\t"
  3684. "lsr r9, r12, #16\n\t"
  3685. "mul r8, r9, r8\n\t"
  3686. "lsr r9, r8, #16\n\t"
  3687. "lsl r8, r8, #16\n\t"
  3688. "adds r3, r3, r8\n\t"
  3689. "adcs r4, r4, r9\n\t"
  3690. "adc r2, r2, #0\n\t"
  3691. "adds r3, r3, r8\n\t"
  3692. "adcs r4, r4, r9\n\t"
  3693. "adc r2, r2, #0\n\t"
  3694. "lsr r8, r10, #16\n\t"
  3695. "lsr r9, r12, #16\n\t"
  3696. "mul r9, r8, r9\n\t"
  3697. "adds r4, r4, r9\n\t"
  3698. "adc r2, r2, #0\n\t"
  3699. "adds r4, r4, r9\n\t"
  3700. "adc r2, r2, #0\n\t"
  3701. "lsl r9, r12, #16\n\t"
  3702. "lsr r9, r9, #16\n\t"
  3703. "mul r8, r9, r8\n\t"
  3704. "lsr r9, r8, #16\n\t"
  3705. "lsl r8, r8, #16\n\t"
  3706. "adds r3, r3, r8\n\t"
  3707. "adcs r4, r4, r9\n\t"
  3708. "adc r2, r2, #0\n\t"
  3709. "adds r3, r3, r8\n\t"
  3710. "adcs r4, r4, r9\n\t"
  3711. "adc r2, r2, #0\n\t"
  3712. /* A[2] * A[2] */
  3713. "ldr r10, [%[a], #8]\n\t"
  3714. "lsl r8, r10, #16\n\t"
  3715. "lsr r9, r10, #16\n\t"
  3716. "lsr r8, r8, #16\n\t"
  3717. "mov r12, r8\n\t"
  3718. "mul r8, r12, r8\n\t"
  3719. "mov r12, r9\n\t"
  3720. "mul r9, r12, r9\n\t"
  3721. "adds r3, r3, r8\n\t"
  3722. "adcs r4, r4, r9\n\t"
  3723. "adc r2, r2, #0\n\t"
  3724. "lsr r9, r10, #16\n\t"
  3725. "lsl r8, r10, #16\n\t"
  3726. "lsr r8, r8, #16\n\t"
  3727. "mul r8, r9, r8\n\t"
  3728. "lsr r9, r8, #15\n\t"
  3729. "lsl r8, r8, #17\n\t"
  3730. "adds r3, r3, r8\n\t"
  3731. "adcs r4, r4, r9\n\t"
  3732. "adc r2, r2, #0\n\t"
  3733. "str r3, [sp, #16]\n\t"
  3734. /* A[0] * A[5] */
  3735. "ldr r10, [%[a], #20]\n\t"
  3736. "ldr r12, [%[a]]\n\t"
  3737. "lsl r8, r10, #16\n\t"
  3738. "lsl r5, r12, #16\n\t"
  3739. "lsr r8, r8, #16\n\t"
  3740. "lsr r5, r5, #16\n\t"
  3741. "mul r5, r8, r5\n\t"
  3742. "lsr r9, r12, #16\n\t"
  3743. "mul r8, r9, r8\n\t"
  3744. "lsr r6, r8, #16\n\t"
  3745. "lsl r8, r8, #16\n\t"
  3746. "adds r5, r5, r8\n\t"
  3747. "adc r6, r6, #0\n\t"
  3748. "lsr r8, r10, #16\n\t"
  3749. "mul r9, r8, r9\n\t"
  3750. "add r6, r6, r9\n\t"
  3751. "lsl r9, r12, #16\n\t"
  3752. "lsr r9, r9, #16\n\t"
  3753. "mul r8, r9, r8\n\t"
  3754. "lsr r9, r8, #16\n\t"
  3755. "lsl r8, r8, #16\n\t"
  3756. "adds r5, r5, r8\n\t"
  3757. "adc r6, r6, r9\n\t"
  3758. "mov r3, #0\n\t"
  3759. "mov r7, #0\n\t"
  3760. /* A[1] * A[4] */
  3761. "ldr r10, [%[a], #16]\n\t"
  3762. "ldr r12, [%[a], #4]\n\t"
  3763. "lsl r8, r10, #16\n\t"
  3764. "lsl r9, r12, #16\n\t"
  3765. "lsr r8, r8, #16\n\t"
  3766. "lsr r9, r9, #16\n\t"
  3767. "mul r9, r8, r9\n\t"
  3768. "adds r5, r5, r9\n\t"
  3769. "adcs r6, r6, #0\n\t"
  3770. "adc r7, r7, #0\n\t"
  3771. "lsr r9, r12, #16\n\t"
  3772. "mul r8, r9, r8\n\t"
  3773. "lsr r9, r8, #16\n\t"
  3774. "lsl r8, r8, #16\n\t"
  3775. "adds r5, r5, r8\n\t"
  3776. "adcs r6, r6, r9\n\t"
  3777. "adc r7, r7, #0\n\t"
  3778. "lsr r8, r10, #16\n\t"
  3779. "lsr r9, r12, #16\n\t"
  3780. "mul r9, r8, r9\n\t"
  3781. "adds r6, r6, r9\n\t"
  3782. "adc r7, r7, #0\n\t"
  3783. "lsl r9, r12, #16\n\t"
  3784. "lsr r9, r9, #16\n\t"
  3785. "mul r8, r9, r8\n\t"
  3786. "lsr r9, r8, #16\n\t"
  3787. "lsl r8, r8, #16\n\t"
  3788. "adds r5, r5, r8\n\t"
  3789. "adcs r6, r6, r9\n\t"
  3790. "adc r7, r7, #0\n\t"
  3791. /* A[2] * A[3] */
  3792. "ldr r10, [%[a], #12]\n\t"
  3793. "ldr r12, [%[a], #8]\n\t"
  3794. "lsl r8, r10, #16\n\t"
  3795. "lsl r9, r12, #16\n\t"
  3796. "lsr r8, r8, #16\n\t"
  3797. "lsr r9, r9, #16\n\t"
  3798. "mul r9, r8, r9\n\t"
  3799. "adds r5, r5, r9\n\t"
  3800. "adcs r6, r6, #0\n\t"
  3801. "adc r7, r7, #0\n\t"
  3802. "lsr r9, r12, #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. "adcs r6, r6, r9\n\t"
  3808. "adc r7, r7, #0\n\t"
  3809. "lsr r8, r10, #16\n\t"
  3810. "lsr r9, r12, #16\n\t"
  3811. "mul r9, r8, r9\n\t"
  3812. "adds r6, r6, r9\n\t"
  3813. "adc r7, r7, #0\n\t"
  3814. "lsl r9, r12, #16\n\t"
  3815. "lsr r9, r9, #16\n\t"
  3816. "mul r8, r9, r8\n\t"
  3817. "lsr r9, r8, #16\n\t"
  3818. "lsl r8, r8, #16\n\t"
  3819. "adds r5, r5, r8\n\t"
  3820. "adcs r6, r6, r9\n\t"
  3821. "adc r7, r7, #0\n\t"
  3822. "adds r5, r5, r5\n\t"
  3823. "adcs r6, r6, r6\n\t"
  3824. "adc r7, r7, r7\n\t"
  3825. "adds r4, r4, r5\n\t"
  3826. "adcs r2, r2, r6\n\t"
  3827. "adc r3, r3, r7\n\t"
  3828. "str r4, [sp, #20]\n\t"
  3829. /* A[0] * A[6] */
  3830. "ldr r10, [%[a], #24]\n\t"
  3831. "ldr r12, [%[a]]\n\t"
  3832. "lsl r8, r10, #16\n\t"
  3833. "lsl r5, r12, #16\n\t"
  3834. "lsr r8, r8, #16\n\t"
  3835. "lsr r5, r5, #16\n\t"
  3836. "mul r5, r8, r5\n\t"
  3837. "lsr r9, r12, #16\n\t"
  3838. "mul r8, r9, r8\n\t"
  3839. "lsr r6, r8, #16\n\t"
  3840. "lsl r8, r8, #16\n\t"
  3841. "adds r5, r5, r8\n\t"
  3842. "adc r6, r6, #0\n\t"
  3843. "lsr r8, r10, #16\n\t"
  3844. "mul r9, r8, r9\n\t"
  3845. "add r6, r6, r9\n\t"
  3846. "lsl r9, r12, #16\n\t"
  3847. "lsr r9, r9, #16\n\t"
  3848. "mul r8, r9, r8\n\t"
  3849. "lsr r9, r8, #16\n\t"
  3850. "lsl r8, r8, #16\n\t"
  3851. "adds r5, r5, r8\n\t"
  3852. "adc r6, r6, r9\n\t"
  3853. "mov r4, #0\n\t"
  3854. "mov r7, #0\n\t"
  3855. /* A[1] * A[5] */
  3856. "ldr r10, [%[a], #20]\n\t"
  3857. "ldr r12, [%[a], #4]\n\t"
  3858. "lsl r8, r10, #16\n\t"
  3859. "lsl r9, r12, #16\n\t"
  3860. "lsr r8, r8, #16\n\t"
  3861. "lsr r9, r9, #16\n\t"
  3862. "mul r9, r8, r9\n\t"
  3863. "adds r5, r5, r9\n\t"
  3864. "adcs r6, r6, #0\n\t"
  3865. "adc r7, r7, #0\n\t"
  3866. "lsr r9, r12, #16\n\t"
  3867. "mul r8, r9, r8\n\t"
  3868. "lsr r9, r8, #16\n\t"
  3869. "lsl r8, r8, #16\n\t"
  3870. "adds r5, r5, r8\n\t"
  3871. "adcs r6, r6, r9\n\t"
  3872. "adc r7, r7, #0\n\t"
  3873. "lsr r8, r10, #16\n\t"
  3874. "lsr r9, r12, #16\n\t"
  3875. "mul r9, r8, r9\n\t"
  3876. "adds r6, r6, r9\n\t"
  3877. "adc r7, r7, #0\n\t"
  3878. "lsl r9, r12, #16\n\t"
  3879. "lsr r9, r9, #16\n\t"
  3880. "mul r8, r9, r8\n\t"
  3881. "lsr r9, r8, #16\n\t"
  3882. "lsl r8, r8, #16\n\t"
  3883. "adds r5, r5, r8\n\t"
  3884. "adcs r6, r6, r9\n\t"
  3885. "adc r7, r7, #0\n\t"
  3886. /* A[2] * A[4] */
  3887. "ldr r10, [%[a], #16]\n\t"
  3888. "ldr r12, [%[a], #8]\n\t"
  3889. "lsl r8, r10, #16\n\t"
  3890. "lsl r9, r12, #16\n\t"
  3891. "lsr r8, r8, #16\n\t"
  3892. "lsr r9, r9, #16\n\t"
  3893. "mul r9, r8, r9\n\t"
  3894. "adds r5, r5, r9\n\t"
  3895. "adcs r6, r6, #0\n\t"
  3896. "adc r7, r7, #0\n\t"
  3897. "lsr r9, r12, #16\n\t"
  3898. "mul r8, r9, r8\n\t"
  3899. "lsr r9, r8, #16\n\t"
  3900. "lsl r8, r8, #16\n\t"
  3901. "adds r5, r5, r8\n\t"
  3902. "adcs r6, r6, r9\n\t"
  3903. "adc r7, r7, #0\n\t"
  3904. "lsr r8, r10, #16\n\t"
  3905. "lsr r9, r12, #16\n\t"
  3906. "mul r9, r8, r9\n\t"
  3907. "adds r6, r6, r9\n\t"
  3908. "adc r7, r7, #0\n\t"
  3909. "lsl r9, r12, #16\n\t"
  3910. "lsr r9, r9, #16\n\t"
  3911. "mul r8, r9, r8\n\t"
  3912. "lsr r9, r8, #16\n\t"
  3913. "lsl r8, r8, #16\n\t"
  3914. "adds r5, r5, r8\n\t"
  3915. "adcs r6, r6, r9\n\t"
  3916. "adc r7, r7, #0\n\t"
  3917. /* A[3] * A[3] */
  3918. "ldr r10, [%[a], #12]\n\t"
  3919. "lsl r8, r10, #16\n\t"
  3920. "lsr r9, r10, #16\n\t"
  3921. "lsr r8, r8, #16\n\t"
  3922. "mov r12, r8\n\t"
  3923. "mul r8, r12, r8\n\t"
  3924. "mov r12, r9\n\t"
  3925. "mul r9, r12, r9\n\t"
  3926. "adds r2, r2, r8\n\t"
  3927. "adcs r3, r3, r9\n\t"
  3928. "adc r4, r4, #0\n\t"
  3929. "lsr r9, r10, #16\n\t"
  3930. "lsl r8, r10, #16\n\t"
  3931. "lsr r8, r8, #16\n\t"
  3932. "mul r8, r9, r8\n\t"
  3933. "lsr r9, r8, #15\n\t"
  3934. "lsl r8, r8, #17\n\t"
  3935. "adds r2, r2, r8\n\t"
  3936. "adcs r3, r3, r9\n\t"
  3937. "adc r4, r4, #0\n\t"
  3938. "adds r5, r5, r5\n\t"
  3939. "adcs r6, r6, r6\n\t"
  3940. "adc r7, r7, r7\n\t"
  3941. "adds r2, r2, r5\n\t"
  3942. "adcs r3, r3, r6\n\t"
  3943. "adc r4, r4, r7\n\t"
  3944. "str r2, [sp, #24]\n\t"
  3945. /* A[0] * A[7] */
  3946. "ldr r10, [%[a], #28]\n\t"
  3947. "ldr r12, [%[a]]\n\t"
  3948. "lsl r8, r10, #16\n\t"
  3949. "lsl r5, r12, #16\n\t"
  3950. "lsr r8, r8, #16\n\t"
  3951. "lsr r5, r5, #16\n\t"
  3952. "mul r5, r8, r5\n\t"
  3953. "lsr r9, r12, #16\n\t"
  3954. "mul r8, r9, r8\n\t"
  3955. "lsr r6, r8, #16\n\t"
  3956. "lsl r8, r8, #16\n\t"
  3957. "adds r5, r5, r8\n\t"
  3958. "adc r6, r6, #0\n\t"
  3959. "lsr r8, r10, #16\n\t"
  3960. "mul r9, r8, r9\n\t"
  3961. "add r6, r6, r9\n\t"
  3962. "lsl r9, r12, #16\n\t"
  3963. "lsr r9, r9, #16\n\t"
  3964. "mul r8, r9, r8\n\t"
  3965. "lsr r9, r8, #16\n\t"
  3966. "lsl r8, r8, #16\n\t"
  3967. "adds r5, r5, r8\n\t"
  3968. "adc r6, r6, r9\n\t"
  3969. "mov r2, #0\n\t"
  3970. "mov r7, #0\n\t"
  3971. /* A[1] * A[6] */
  3972. "ldr r10, [%[a], #24]\n\t"
  3973. "ldr r12, [%[a], #4]\n\t"
  3974. "lsl r8, r10, #16\n\t"
  3975. "lsl r9, r12, #16\n\t"
  3976. "lsr r8, r8, #16\n\t"
  3977. "lsr r9, r9, #16\n\t"
  3978. "mul r9, r8, r9\n\t"
  3979. "adds r5, r5, r9\n\t"
  3980. "adcs r6, r6, #0\n\t"
  3981. "adc r7, r7, #0\n\t"
  3982. "lsr r9, r12, #16\n\t"
  3983. "mul r8, r9, r8\n\t"
  3984. "lsr r9, r8, #16\n\t"
  3985. "lsl r8, r8, #16\n\t"
  3986. "adds r5, r5, r8\n\t"
  3987. "adcs r6, r6, r9\n\t"
  3988. "adc r7, r7, #0\n\t"
  3989. "lsr r8, r10, #16\n\t"
  3990. "lsr r9, r12, #16\n\t"
  3991. "mul r9, r8, r9\n\t"
  3992. "adds r6, r6, r9\n\t"
  3993. "adc r7, r7, #0\n\t"
  3994. "lsl r9, r12, #16\n\t"
  3995. "lsr r9, r9, #16\n\t"
  3996. "mul r8, r9, r8\n\t"
  3997. "lsr r9, r8, #16\n\t"
  3998. "lsl r8, r8, #16\n\t"
  3999. "adds r5, r5, r8\n\t"
  4000. "adcs r6, r6, r9\n\t"
  4001. "adc r7, r7, #0\n\t"
  4002. /* A[2] * A[5] */
  4003. "ldr r10, [%[a], #20]\n\t"
  4004. "ldr r12, [%[a], #8]\n\t"
  4005. "lsl r8, r10, #16\n\t"
  4006. "lsl r9, r12, #16\n\t"
  4007. "lsr r8, r8, #16\n\t"
  4008. "lsr r9, r9, #16\n\t"
  4009. "mul r9, r8, r9\n\t"
  4010. "adds r5, r5, r9\n\t"
  4011. "adcs r6, r6, #0\n\t"
  4012. "adc r7, r7, #0\n\t"
  4013. "lsr r9, r12, #16\n\t"
  4014. "mul r8, r9, r8\n\t"
  4015. "lsr r9, r8, #16\n\t"
  4016. "lsl r8, r8, #16\n\t"
  4017. "adds r5, r5, r8\n\t"
  4018. "adcs r6, r6, r9\n\t"
  4019. "adc r7, r7, #0\n\t"
  4020. "lsr r8, r10, #16\n\t"
  4021. "lsr r9, r12, #16\n\t"
  4022. "mul r9, r8, r9\n\t"
  4023. "adds r6, r6, r9\n\t"
  4024. "adc r7, r7, #0\n\t"
  4025. "lsl r9, r12, #16\n\t"
  4026. "lsr r9, r9, #16\n\t"
  4027. "mul r8, r9, r8\n\t"
  4028. "lsr r9, r8, #16\n\t"
  4029. "lsl r8, r8, #16\n\t"
  4030. "adds r5, r5, r8\n\t"
  4031. "adcs r6, r6, r9\n\t"
  4032. "adc r7, r7, #0\n\t"
  4033. /* A[3] * A[4] */
  4034. "ldr r10, [%[a], #16]\n\t"
  4035. "ldr r12, [%[a], #12]\n\t"
  4036. "lsl r8, r10, #16\n\t"
  4037. "lsl r9, r12, #16\n\t"
  4038. "lsr r8, r8, #16\n\t"
  4039. "lsr r9, r9, #16\n\t"
  4040. "mul r9, r8, r9\n\t"
  4041. "adds r5, r5, r9\n\t"
  4042. "adcs r6, r6, #0\n\t"
  4043. "adc r7, r7, #0\n\t"
  4044. "lsr r9, r12, #16\n\t"
  4045. "mul r8, r9, r8\n\t"
  4046. "lsr r9, r8, #16\n\t"
  4047. "lsl r8, r8, #16\n\t"
  4048. "adds r5, r5, r8\n\t"
  4049. "adcs r6, r6, r9\n\t"
  4050. "adc r7, r7, #0\n\t"
  4051. "lsr r8, r10, #16\n\t"
  4052. "lsr r9, r12, #16\n\t"
  4053. "mul r9, r8, r9\n\t"
  4054. "adds r6, r6, r9\n\t"
  4055. "adc r7, r7, #0\n\t"
  4056. "lsl r9, r12, #16\n\t"
  4057. "lsr r9, r9, #16\n\t"
  4058. "mul r8, r9, r8\n\t"
  4059. "lsr r9, r8, #16\n\t"
  4060. "lsl r8, r8, #16\n\t"
  4061. "adds r5, r5, r8\n\t"
  4062. "adcs r6, r6, r9\n\t"
  4063. "adc r7, r7, #0\n\t"
  4064. "adds r5, r5, r5\n\t"
  4065. "adcs r6, r6, r6\n\t"
  4066. "adc r7, r7, r7\n\t"
  4067. "adds r3, r3, r5\n\t"
  4068. "adcs r4, r4, r6\n\t"
  4069. "adc r2, r2, r7\n\t"
  4070. "str r3, [sp, #28]\n\t"
  4071. /* A[1] * A[7] */
  4072. "ldr r10, [%[a], #28]\n\t"
  4073. "ldr r12, [%[a], #4]\n\t"
  4074. "lsl r8, r10, #16\n\t"
  4075. "lsl r5, r12, #16\n\t"
  4076. "lsr r8, r8, #16\n\t"
  4077. "lsr r5, r5, #16\n\t"
  4078. "mul r5, r8, r5\n\t"
  4079. "lsr r9, r12, #16\n\t"
  4080. "mul r8, r9, r8\n\t"
  4081. "lsr r6, r8, #16\n\t"
  4082. "lsl r8, r8, #16\n\t"
  4083. "adds r5, r5, r8\n\t"
  4084. "adc r6, r6, #0\n\t"
  4085. "lsr r8, r10, #16\n\t"
  4086. "mul r9, r8, r9\n\t"
  4087. "add r6, r6, r9\n\t"
  4088. "lsl r9, r12, #16\n\t"
  4089. "lsr r9, r9, #16\n\t"
  4090. "mul r8, r9, r8\n\t"
  4091. "lsr r9, r8, #16\n\t"
  4092. "lsl r8, r8, #16\n\t"
  4093. "adds r5, r5, r8\n\t"
  4094. "adc r6, r6, r9\n\t"
  4095. "mov r3, #0\n\t"
  4096. "mov r7, #0\n\t"
  4097. /* A[2] * A[6] */
  4098. "ldr r10, [%[a], #24]\n\t"
  4099. "ldr r12, [%[a], #8]\n\t"
  4100. "lsl r8, r10, #16\n\t"
  4101. "lsl r9, r12, #16\n\t"
  4102. "lsr r8, r8, #16\n\t"
  4103. "lsr r9, r9, #16\n\t"
  4104. "mul r9, r8, r9\n\t"
  4105. "adds r5, r5, r9\n\t"
  4106. "adcs r6, r6, #0\n\t"
  4107. "adc r7, r7, #0\n\t"
  4108. "lsr r9, r12, #16\n\t"
  4109. "mul r8, r9, r8\n\t"
  4110. "lsr r9, r8, #16\n\t"
  4111. "lsl r8, r8, #16\n\t"
  4112. "adds r5, r5, r8\n\t"
  4113. "adcs r6, r6, r9\n\t"
  4114. "adc r7, r7, #0\n\t"
  4115. "lsr r8, r10, #16\n\t"
  4116. "lsr r9, r12, #16\n\t"
  4117. "mul r9, r8, r9\n\t"
  4118. "adds r6, r6, r9\n\t"
  4119. "adc r7, r7, #0\n\t"
  4120. "lsl r9, r12, #16\n\t"
  4121. "lsr r9, r9, #16\n\t"
  4122. "mul r8, r9, r8\n\t"
  4123. "lsr r9, r8, #16\n\t"
  4124. "lsl r8, r8, #16\n\t"
  4125. "adds r5, r5, r8\n\t"
  4126. "adcs r6, r6, r9\n\t"
  4127. "adc r7, r7, #0\n\t"
  4128. /* A[3] * A[5] */
  4129. "ldr r10, [%[a], #20]\n\t"
  4130. "ldr r12, [%[a], #12]\n\t"
  4131. "lsl r8, r10, #16\n\t"
  4132. "lsl r9, r12, #16\n\t"
  4133. "lsr r8, r8, #16\n\t"
  4134. "lsr r9, r9, #16\n\t"
  4135. "mul r9, r8, r9\n\t"
  4136. "adds r5, r5, r9\n\t"
  4137. "adcs r6, r6, #0\n\t"
  4138. "adc r7, r7, #0\n\t"
  4139. "lsr r9, r12, #16\n\t"
  4140. "mul r8, r9, r8\n\t"
  4141. "lsr r9, r8, #16\n\t"
  4142. "lsl r8, r8, #16\n\t"
  4143. "adds r5, r5, r8\n\t"
  4144. "adcs r6, r6, r9\n\t"
  4145. "adc r7, r7, #0\n\t"
  4146. "lsr r8, r10, #16\n\t"
  4147. "lsr r9, r12, #16\n\t"
  4148. "mul r9, r8, r9\n\t"
  4149. "adds r6, r6, r9\n\t"
  4150. "adc r7, r7, #0\n\t"
  4151. "lsl r9, r12, #16\n\t"
  4152. "lsr r9, r9, #16\n\t"
  4153. "mul r8, r9, r8\n\t"
  4154. "lsr r9, r8, #16\n\t"
  4155. "lsl r8, r8, #16\n\t"
  4156. "adds r5, r5, r8\n\t"
  4157. "adcs r6, r6, r9\n\t"
  4158. "adc r7, r7, #0\n\t"
  4159. /* A[4] * A[4] */
  4160. "ldr r10, [%[a], #16]\n\t"
  4161. "lsl r8, r10, #16\n\t"
  4162. "lsr r9, r10, #16\n\t"
  4163. "lsr r8, r8, #16\n\t"
  4164. "mov r12, r8\n\t"
  4165. "mul r8, r12, r8\n\t"
  4166. "mov r12, r9\n\t"
  4167. "mul r9, r12, r9\n\t"
  4168. "adds r4, r4, r8\n\t"
  4169. "adcs r2, r2, r9\n\t"
  4170. "adc r3, r3, #0\n\t"
  4171. "lsr r9, r10, #16\n\t"
  4172. "lsl r8, r10, #16\n\t"
  4173. "lsr r8, r8, #16\n\t"
  4174. "mul r8, r9, r8\n\t"
  4175. "lsr r9, r8, #15\n\t"
  4176. "lsl r8, r8, #17\n\t"
  4177. "adds r4, r4, r8\n\t"
  4178. "adcs r2, r2, r9\n\t"
  4179. "adc r3, r3, #0\n\t"
  4180. "adds r5, r5, r5\n\t"
  4181. "adcs r6, r6, r6\n\t"
  4182. "adc r7, r7, r7\n\t"
  4183. "adds r4, r4, r5\n\t"
  4184. "adcs r2, r2, r6\n\t"
  4185. "adc r3, r3, r7\n\t"
  4186. "str r4, [%[r], #32]\n\t"
  4187. /* A[2] * A[7] */
  4188. "ldr r10, [%[a], #28]\n\t"
  4189. "ldr r12, [%[a], #8]\n\t"
  4190. "lsl r8, r10, #16\n\t"
  4191. "lsl r5, r12, #16\n\t"
  4192. "lsr r8, r8, #16\n\t"
  4193. "lsr r5, r5, #16\n\t"
  4194. "mul r5, r8, r5\n\t"
  4195. "lsr r9, r12, #16\n\t"
  4196. "mul r8, r9, r8\n\t"
  4197. "lsr r6, r8, #16\n\t"
  4198. "lsl r8, r8, #16\n\t"
  4199. "adds r5, r5, r8\n\t"
  4200. "adc r6, r6, #0\n\t"
  4201. "lsr r8, r10, #16\n\t"
  4202. "mul r9, r8, r9\n\t"
  4203. "add r6, r6, r9\n\t"
  4204. "lsl r9, r12, #16\n\t"
  4205. "lsr r9, r9, #16\n\t"
  4206. "mul r8, r9, r8\n\t"
  4207. "lsr r9, r8, #16\n\t"
  4208. "lsl r8, r8, #16\n\t"
  4209. "adds r5, r5, r8\n\t"
  4210. "adc r6, r6, r9\n\t"
  4211. "mov r4, #0\n\t"
  4212. "mov r7, #0\n\t"
  4213. /* A[3] * A[6] */
  4214. "ldr r10, [%[a], #24]\n\t"
  4215. "ldr r12, [%[a], #12]\n\t"
  4216. "lsl r8, r10, #16\n\t"
  4217. "lsl r9, r12, #16\n\t"
  4218. "lsr r8, r8, #16\n\t"
  4219. "lsr r9, r9, #16\n\t"
  4220. "mul r9, r8, r9\n\t"
  4221. "adds r5, r5, r9\n\t"
  4222. "adcs r6, r6, #0\n\t"
  4223. "adc r7, r7, #0\n\t"
  4224. "lsr r9, r12, #16\n\t"
  4225. "mul r8, r9, r8\n\t"
  4226. "lsr r9, r8, #16\n\t"
  4227. "lsl r8, r8, #16\n\t"
  4228. "adds r5, r5, r8\n\t"
  4229. "adcs r6, r6, r9\n\t"
  4230. "adc r7, r7, #0\n\t"
  4231. "lsr r8, r10, #16\n\t"
  4232. "lsr r9, r12, #16\n\t"
  4233. "mul r9, r8, r9\n\t"
  4234. "adds r6, r6, r9\n\t"
  4235. "adc r7, r7, #0\n\t"
  4236. "lsl r9, r12, #16\n\t"
  4237. "lsr r9, r9, #16\n\t"
  4238. "mul r8, r9, r8\n\t"
  4239. "lsr r9, r8, #16\n\t"
  4240. "lsl r8, r8, #16\n\t"
  4241. "adds r5, r5, r8\n\t"
  4242. "adcs r6, r6, r9\n\t"
  4243. "adc r7, r7, #0\n\t"
  4244. /* A[4] * A[5] */
  4245. "ldr r10, [%[a], #20]\n\t"
  4246. "ldr r12, [%[a], #16]\n\t"
  4247. "lsl r8, r10, #16\n\t"
  4248. "lsl r9, r12, #16\n\t"
  4249. "lsr r8, r8, #16\n\t"
  4250. "lsr r9, r9, #16\n\t"
  4251. "mul r9, r8, r9\n\t"
  4252. "adds r5, r5, r9\n\t"
  4253. "adcs r6, r6, #0\n\t"
  4254. "adc r7, r7, #0\n\t"
  4255. "lsr r9, r12, #16\n\t"
  4256. "mul r8, r9, r8\n\t"
  4257. "lsr r9, r8, #16\n\t"
  4258. "lsl r8, r8, #16\n\t"
  4259. "adds r5, r5, r8\n\t"
  4260. "adcs r6, r6, r9\n\t"
  4261. "adc r7, r7, #0\n\t"
  4262. "lsr r8, r10, #16\n\t"
  4263. "lsr r9, r12, #16\n\t"
  4264. "mul r9, r8, r9\n\t"
  4265. "adds r6, r6, r9\n\t"
  4266. "adc r7, r7, #0\n\t"
  4267. "lsl r9, r12, #16\n\t"
  4268. "lsr r9, r9, #16\n\t"
  4269. "mul r8, r9, r8\n\t"
  4270. "lsr r9, r8, #16\n\t"
  4271. "lsl r8, r8, #16\n\t"
  4272. "adds r5, r5, r8\n\t"
  4273. "adcs r6, r6, r9\n\t"
  4274. "adc r7, r7, #0\n\t"
  4275. "adds r5, r5, r5\n\t"
  4276. "adcs r6, r6, r6\n\t"
  4277. "adc r7, r7, r7\n\t"
  4278. "adds r2, r2, r5\n\t"
  4279. "adcs r3, r3, r6\n\t"
  4280. "adc r4, r4, r7\n\t"
  4281. "str r2, [%[r], #36]\n\t"
  4282. /* A[3] * A[7] */
  4283. "ldr r10, [%[a], #28]\n\t"
  4284. "ldr r12, [%[a], #12]\n\t"
  4285. "lsl r8, r10, #16\n\t"
  4286. "lsl r9, r12, #16\n\t"
  4287. "lsr r8, r8, #16\n\t"
  4288. "lsr r9, r9, #16\n\t"
  4289. "mul r9, r8, r9\n\t"
  4290. "adds r3, r3, r9\n\t"
  4291. "adcs r4, r4, #0\n\t"
  4292. "mov r2, #0\n\t"
  4293. "adc r2, r2, #0\n\t"
  4294. "adds r3, r3, r9\n\t"
  4295. "adcs r4, r4, #0\n\t"
  4296. "adc r2, r2, #0\n\t"
  4297. "lsr r9, r12, #16\n\t"
  4298. "mul r8, r9, r8\n\t"
  4299. "lsr r9, r8, #16\n\t"
  4300. "lsl r8, r8, #16\n\t"
  4301. "adds r3, r3, r8\n\t"
  4302. "adcs r4, r4, r9\n\t"
  4303. "adc r2, r2, #0\n\t"
  4304. "adds r3, r3, r8\n\t"
  4305. "adcs r4, r4, r9\n\t"
  4306. "adc r2, r2, #0\n\t"
  4307. "lsr r8, r10, #16\n\t"
  4308. "lsr r9, r12, #16\n\t"
  4309. "mul r9, r8, r9\n\t"
  4310. "adds r4, r4, r9\n\t"
  4311. "adc r2, r2, #0\n\t"
  4312. "adds r4, r4, r9\n\t"
  4313. "adc r2, r2, #0\n\t"
  4314. "lsl r9, r12, #16\n\t"
  4315. "lsr r9, r9, #16\n\t"
  4316. "mul r8, r9, r8\n\t"
  4317. "lsr r9, r8, #16\n\t"
  4318. "lsl r8, r8, #16\n\t"
  4319. "adds r3, r3, r8\n\t"
  4320. "adcs r4, r4, r9\n\t"
  4321. "adc r2, r2, #0\n\t"
  4322. "adds r3, r3, r8\n\t"
  4323. "adcs r4, r4, r9\n\t"
  4324. "adc r2, r2, #0\n\t"
  4325. /* A[4] * A[6] */
  4326. "ldr r10, [%[a], #24]\n\t"
  4327. "ldr r12, [%[a], #16]\n\t"
  4328. "lsl r8, r10, #16\n\t"
  4329. "lsl r9, r12, #16\n\t"
  4330. "lsr r8, r8, #16\n\t"
  4331. "lsr r9, r9, #16\n\t"
  4332. "mul r9, r8, r9\n\t"
  4333. "adds r3, r3, r9\n\t"
  4334. "adcs r4, r4, #0\n\t"
  4335. "adc r2, r2, #0\n\t"
  4336. "adds r3, r3, r9\n\t"
  4337. "adcs r4, r4, #0\n\t"
  4338. "adc r2, r2, #0\n\t"
  4339. "lsr r9, r12, #16\n\t"
  4340. "mul r8, r9, r8\n\t"
  4341. "lsr r9, r8, #16\n\t"
  4342. "lsl r8, r8, #16\n\t"
  4343. "adds r3, r3, r8\n\t"
  4344. "adcs r4, r4, r9\n\t"
  4345. "adc r2, r2, #0\n\t"
  4346. "adds r3, r3, r8\n\t"
  4347. "adcs r4, r4, r9\n\t"
  4348. "adc r2, r2, #0\n\t"
  4349. "lsr r8, r10, #16\n\t"
  4350. "lsr r9, r12, #16\n\t"
  4351. "mul r9, r8, r9\n\t"
  4352. "adds r4, r4, r9\n\t"
  4353. "adc r2, r2, #0\n\t"
  4354. "adds r4, r4, r9\n\t"
  4355. "adc r2, r2, #0\n\t"
  4356. "lsl r9, r12, #16\n\t"
  4357. "lsr r9, r9, #16\n\t"
  4358. "mul r8, r9, r8\n\t"
  4359. "lsr r9, r8, #16\n\t"
  4360. "lsl r8, r8, #16\n\t"
  4361. "adds r3, r3, r8\n\t"
  4362. "adcs r4, r4, r9\n\t"
  4363. "adc r2, r2, #0\n\t"
  4364. "adds r3, r3, r8\n\t"
  4365. "adcs r4, r4, r9\n\t"
  4366. "adc r2, r2, #0\n\t"
  4367. /* A[5] * A[5] */
  4368. "ldr r10, [%[a], #20]\n\t"
  4369. "lsl r8, r10, #16\n\t"
  4370. "lsr r9, r10, #16\n\t"
  4371. "lsr r8, r8, #16\n\t"
  4372. "mov r12, r8\n\t"
  4373. "mul r8, r12, r8\n\t"
  4374. "mov r12, r9\n\t"
  4375. "mul r9, r12, r9\n\t"
  4376. "adds r3, r3, r8\n\t"
  4377. "adcs r4, r4, r9\n\t"
  4378. "adc r2, r2, #0\n\t"
  4379. "lsr r9, r10, #16\n\t"
  4380. "lsl r8, r10, #16\n\t"
  4381. "lsr r8, r8, #16\n\t"
  4382. "mul r8, r9, r8\n\t"
  4383. "lsr r9, r8, #15\n\t"
  4384. "lsl r8, r8, #17\n\t"
  4385. "adds r3, r3, r8\n\t"
  4386. "adcs r4, r4, r9\n\t"
  4387. "adc r2, r2, #0\n\t"
  4388. "str r3, [%[r], #40]\n\t"
  4389. /* A[4] * A[7] */
  4390. "ldr r10, [%[a], #28]\n\t"
  4391. "ldr r12, [%[a], #16]\n\t"
  4392. "lsl r8, r10, #16\n\t"
  4393. "lsl r9, r12, #16\n\t"
  4394. "lsr r8, r8, #16\n\t"
  4395. "lsr r9, r9, #16\n\t"
  4396. "mul r9, r8, r9\n\t"
  4397. "adds r4, r4, r9\n\t"
  4398. "adcs r2, r2, #0\n\t"
  4399. "mov r3, #0\n\t"
  4400. "adc r3, r3, #0\n\t"
  4401. "adds r4, r4, r9\n\t"
  4402. "adcs r2, r2, #0\n\t"
  4403. "adc r3, r3, #0\n\t"
  4404. "lsr r9, r12, #16\n\t"
  4405. "mul r8, r9, r8\n\t"
  4406. "lsr r9, r8, #16\n\t"
  4407. "lsl r8, r8, #16\n\t"
  4408. "adds r4, r4, r8\n\t"
  4409. "adcs r2, r2, r9\n\t"
  4410. "adc r3, r3, #0\n\t"
  4411. "adds r4, r4, r8\n\t"
  4412. "adcs r2, r2, r9\n\t"
  4413. "adc r3, r3, #0\n\t"
  4414. "lsr r8, r10, #16\n\t"
  4415. "lsr r9, r12, #16\n\t"
  4416. "mul r9, r8, r9\n\t"
  4417. "adds r2, r2, r9\n\t"
  4418. "adc r3, r3, #0\n\t"
  4419. "adds r2, r2, r9\n\t"
  4420. "adc r3, r3, #0\n\t"
  4421. "lsl r9, r12, #16\n\t"
  4422. "lsr r9, r9, #16\n\t"
  4423. "mul r8, r9, r8\n\t"
  4424. "lsr r9, r8, #16\n\t"
  4425. "lsl r8, r8, #16\n\t"
  4426. "adds r4, r4, r8\n\t"
  4427. "adcs r2, r2, r9\n\t"
  4428. "adc r3, r3, #0\n\t"
  4429. "adds r4, r4, r8\n\t"
  4430. "adcs r2, r2, r9\n\t"
  4431. "adc r3, r3, #0\n\t"
  4432. /* A[5] * A[6] */
  4433. "ldr r10, [%[a], #24]\n\t"
  4434. "ldr r12, [%[a], #20]\n\t"
  4435. "lsl r8, r10, #16\n\t"
  4436. "lsl r9, r12, #16\n\t"
  4437. "lsr r8, r8, #16\n\t"
  4438. "lsr r9, r9, #16\n\t"
  4439. "mul r9, r8, r9\n\t"
  4440. "adds r4, r4, r9\n\t"
  4441. "adcs r2, r2, #0\n\t"
  4442. "adc r3, r3, #0\n\t"
  4443. "adds r4, r4, r9\n\t"
  4444. "adcs r2, r2, #0\n\t"
  4445. "adc r3, r3, #0\n\t"
  4446. "lsr r9, r12, #16\n\t"
  4447. "mul r8, r9, r8\n\t"
  4448. "lsr r9, r8, #16\n\t"
  4449. "lsl r8, r8, #16\n\t"
  4450. "adds r4, r4, r8\n\t"
  4451. "adcs r2, r2, r9\n\t"
  4452. "adc r3, r3, #0\n\t"
  4453. "adds r4, r4, r8\n\t"
  4454. "adcs r2, r2, r9\n\t"
  4455. "adc r3, r3, #0\n\t"
  4456. "lsr r8, r10, #16\n\t"
  4457. "lsr r9, r12, #16\n\t"
  4458. "mul r9, r8, r9\n\t"
  4459. "adds r2, r2, r9\n\t"
  4460. "adc r3, r3, #0\n\t"
  4461. "adds r2, r2, r9\n\t"
  4462. "adc r3, r3, #0\n\t"
  4463. "lsl r9, r12, #16\n\t"
  4464. "lsr r9, r9, #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 r4, r4, r8\n\t"
  4469. "adcs r2, r2, r9\n\t"
  4470. "adc r3, r3, #0\n\t"
  4471. "adds r4, r4, r8\n\t"
  4472. "adcs r2, r2, r9\n\t"
  4473. "adc r3, r3, #0\n\t"
  4474. "str r4, [%[r], #44]\n\t"
  4475. /* A[5] * A[7] */
  4476. "ldr r10, [%[a], #28]\n\t"
  4477. "ldr r12, [%[a], #20]\n\t"
  4478. "lsl r8, r10, #16\n\t"
  4479. "lsl r9, r12, #16\n\t"
  4480. "lsr r8, r8, #16\n\t"
  4481. "lsr r9, r9, #16\n\t"
  4482. "mul r9, r8, r9\n\t"
  4483. "adds r2, r2, r9\n\t"
  4484. "adcs r3, r3, #0\n\t"
  4485. "mov r4, #0\n\t"
  4486. "adc r4, r4, #0\n\t"
  4487. "adds r2, r2, r9\n\t"
  4488. "adcs r3, r3, #0\n\t"
  4489. "adc r4, r4, #0\n\t"
  4490. "lsr r9, r12, #16\n\t"
  4491. "mul r8, r9, r8\n\t"
  4492. "lsr r9, r8, #16\n\t"
  4493. "lsl r8, r8, #16\n\t"
  4494. "adds r2, r2, r8\n\t"
  4495. "adcs r3, r3, r9\n\t"
  4496. "adc r4, r4, #0\n\t"
  4497. "adds r2, r2, r8\n\t"
  4498. "adcs r3, r3, r9\n\t"
  4499. "adc r4, r4, #0\n\t"
  4500. "lsr r8, r10, #16\n\t"
  4501. "lsr r9, r12, #16\n\t"
  4502. "mul r9, r8, r9\n\t"
  4503. "adds r3, r3, r9\n\t"
  4504. "adc r4, r4, #0\n\t"
  4505. "adds r3, r3, r9\n\t"
  4506. "adc r4, r4, #0\n\t"
  4507. "lsl r9, r12, #16\n\t"
  4508. "lsr r9, r9, #16\n\t"
  4509. "mul r8, r9, r8\n\t"
  4510. "lsr r9, r8, #16\n\t"
  4511. "lsl r8, r8, #16\n\t"
  4512. "adds r2, r2, r8\n\t"
  4513. "adcs r3, r3, r9\n\t"
  4514. "adc r4, r4, #0\n\t"
  4515. "adds r2, r2, r8\n\t"
  4516. "adcs r3, r3, r9\n\t"
  4517. "adc r4, r4, #0\n\t"
  4518. /* A[6] * A[6] */
  4519. "ldr r10, [%[a], #24]\n\t"
  4520. "lsl r8, r10, #16\n\t"
  4521. "lsr r9, r10, #16\n\t"
  4522. "lsr r8, r8, #16\n\t"
  4523. "mov r12, r8\n\t"
  4524. "mul r8, r12, r8\n\t"
  4525. "mov r12, r9\n\t"
  4526. "mul r9, r12, r9\n\t"
  4527. "adds r2, r2, r8\n\t"
  4528. "adcs r3, r3, r9\n\t"
  4529. "adc r4, r4, #0\n\t"
  4530. "lsr r9, r10, #16\n\t"
  4531. "lsl r8, r10, #16\n\t"
  4532. "lsr r8, r8, #16\n\t"
  4533. "mul r8, r9, r8\n\t"
  4534. "lsr r9, r8, #15\n\t"
  4535. "lsl r8, r8, #17\n\t"
  4536. "adds r2, r2, r8\n\t"
  4537. "adcs r3, r3, r9\n\t"
  4538. "adc r4, r4, #0\n\t"
  4539. "str r2, [%[r], #48]\n\t"
  4540. /* A[6] * A[7] */
  4541. "ldr r10, [%[a], #28]\n\t"
  4542. "ldr r12, [%[a], #24]\n\t"
  4543. "lsl r8, r10, #16\n\t"
  4544. "lsl r9, r12, #16\n\t"
  4545. "lsr r8, r8, #16\n\t"
  4546. "lsr r9, r9, #16\n\t"
  4547. "mul r9, r8, r9\n\t"
  4548. "adds r3, r3, r9\n\t"
  4549. "adcs r4, r4, #0\n\t"
  4550. "mov r2, #0\n\t"
  4551. "adc r2, r2, #0\n\t"
  4552. "adds r3, r3, r9\n\t"
  4553. "adcs r4, r4, #0\n\t"
  4554. "adc r2, r2, #0\n\t"
  4555. "lsr r9, r12, #16\n\t"
  4556. "mul r8, r9, r8\n\t"
  4557. "lsr r9, r8, #16\n\t"
  4558. "lsl r8, r8, #16\n\t"
  4559. "adds r3, r3, r8\n\t"
  4560. "adcs r4, r4, r9\n\t"
  4561. "adc r2, r2, #0\n\t"
  4562. "adds r3, r3, r8\n\t"
  4563. "adcs r4, r4, r9\n\t"
  4564. "adc r2, r2, #0\n\t"
  4565. "lsr r8, r10, #16\n\t"
  4566. "lsr r9, r12, #16\n\t"
  4567. "mul r9, r8, r9\n\t"
  4568. "adds r4, r4, r9\n\t"
  4569. "adc r2, r2, #0\n\t"
  4570. "adds r4, r4, r9\n\t"
  4571. "adc r2, r2, #0\n\t"
  4572. "lsl r9, r12, #16\n\t"
  4573. "lsr r9, r9, #16\n\t"
  4574. "mul r8, r9, r8\n\t"
  4575. "lsr r9, r8, #16\n\t"
  4576. "lsl r8, r8, #16\n\t"
  4577. "adds r3, r3, r8\n\t"
  4578. "adcs r4, r4, r9\n\t"
  4579. "adc r2, r2, #0\n\t"
  4580. "adds r3, r3, r8\n\t"
  4581. "adcs r4, r4, r9\n\t"
  4582. "adc r2, r2, #0\n\t"
  4583. "str r3, [%[r], #52]\n\t"
  4584. /* A[7] * A[7] */
  4585. "ldr r10, [%[a], #28]\n\t"
  4586. "lsl r8, r10, #16\n\t"
  4587. "lsr r9, r10, #16\n\t"
  4588. "lsr r8, r8, #16\n\t"
  4589. "mov r12, r8\n\t"
  4590. "mul r8, r12, r8\n\t"
  4591. "mov r12, r9\n\t"
  4592. "mul r9, r12, r9\n\t"
  4593. "adds r4, r4, r8\n\t"
  4594. "adc r2, r2, r9\n\t"
  4595. "lsr r9, r10, #16\n\t"
  4596. "lsl r8, r10, #16\n\t"
  4597. "lsr r8, r8, #16\n\t"
  4598. "mul r8, r9, r8\n\t"
  4599. "lsr r9, r8, #15\n\t"
  4600. "lsl r8, r8, #17\n\t"
  4601. "adds r4, r4, r8\n\t"
  4602. "adc r2, r2, r9\n\t"
  4603. "str r4, [%[r], #56]\n\t"
  4604. "str r2, [%[r], #60]\n\t"
  4605. "ldm sp!, {r2, r3, r4, r8}\n\t"
  4606. "stm %[r]!, {r2, r3, r4, r8}\n\t"
  4607. "ldm sp!, {r2, r3, r4, r8}\n\t"
  4608. "stm %[r]!, {r2, r3, r4, r8}\n\t"
  4609. : [r] "+r" (r), [a] "+r" (a)
  4610. :
  4611. : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r12", "cc"
  4612. );
  4613. }
  4614. #elif defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  4615. /* Square a and put result in r. (r = a * a)
  4616. *
  4617. * r A single precision integer.
  4618. * a A single precision integer.
  4619. */
  4620. static void sp_2048_sqr_8(sp_digit* r_p, const sp_digit* a_p)
  4621. {
  4622. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  4623. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  4624. __asm__ __volatile__ (
  4625. "sub sp, sp, #0x44\n\t"
  4626. "str %[r], [sp, #64]\n\t"
  4627. "mov %[r], #0\n\t"
  4628. "ldr r12, [%[a]]\n\t"
  4629. /* A[0] * A[1] */
  4630. "ldr lr, [%[a], #4]\n\t"
  4631. "umull r4, r5, r12, lr\n\t"
  4632. /* A[0] * A[3] */
  4633. "ldr lr, [%[a], #12]\n\t"
  4634. "umull r6, r7, r12, lr\n\t"
  4635. /* A[0] * A[5] */
  4636. "ldr lr, [%[a], #20]\n\t"
  4637. "umull r8, r9, r12, lr\n\t"
  4638. /* A[0] * A[7] */
  4639. "ldr lr, [%[a], #28]\n\t"
  4640. "umull r10, r3, r12, lr\n\t"
  4641. /* A[0] * A[2] */
  4642. "ldr lr, [%[a], #8]\n\t"
  4643. "mov r11, #0\n\t"
  4644. "umlal r5, r11, r12, lr\n\t"
  4645. "adds r6, r6, r11\n\t"
  4646. /* A[0] * A[4] */
  4647. "ldr lr, [%[a], #16]\n\t"
  4648. "adcs r7, r7, #0\n\t"
  4649. "adc r11, %[r], #0\n\t"
  4650. "umlal r7, r11, r12, lr\n\t"
  4651. "adds r8, r8, r11\n\t"
  4652. /* A[0] * A[6] */
  4653. "ldr lr, [%[a], #24]\n\t"
  4654. "adcs r9, r9, #0\n\t"
  4655. "adc r11, %[r], #0\n\t"
  4656. "umlal r9, r11, r12, lr\n\t"
  4657. "adds r10, r10, r11\n\t"
  4658. "adcs r3, r3, #0\n\t"
  4659. "str r4, [sp, #4]\n\t"
  4660. "str r5, [sp, #8]\n\t"
  4661. /* A[1] * A[2] */
  4662. "ldr r12, [%[a], #4]\n\t"
  4663. "ldr lr, [%[a], #8]\n\t"
  4664. "mov r11, #0\n\t"
  4665. "umlal r6, r11, r12, lr\n\t"
  4666. "str r6, [sp, #12]\n\t"
  4667. "adds r7, r7, r11\n\t"
  4668. /* A[1] * A[3] */
  4669. "ldr lr, [%[a], #12]\n\t"
  4670. "adc r11, %[r], #0\n\t"
  4671. "umlal r7, r11, r12, lr\n\t"
  4672. "str r7, [sp, #16]\n\t"
  4673. "adds r8, r8, r11\n\t"
  4674. /* A[1] * A[4] */
  4675. "ldr lr, [%[a], #16]\n\t"
  4676. "adc r11, %[r], #0\n\t"
  4677. "umlal r8, r11, r12, lr\n\t"
  4678. "adds r9, r9, r11\n\t"
  4679. /* A[1] * A[5] */
  4680. "ldr lr, [%[a], #20]\n\t"
  4681. "adc r11, %[r], #0\n\t"
  4682. "umlal r9, r11, r12, lr\n\t"
  4683. "adds r10, r10, r11\n\t"
  4684. /* A[1] * A[6] */
  4685. "ldr lr, [%[a], #24]\n\t"
  4686. "adc r11, %[r], #0\n\t"
  4687. "umlal r10, r11, r12, lr\n\t"
  4688. "adds r3, r3, r11\n\t"
  4689. /* A[1] * A[7] */
  4690. "ldr lr, [%[a], #28]\n\t"
  4691. "adc r4, %[r], #0\n\t"
  4692. "umlal r3, r4, r12, lr\n\t"
  4693. /* A[2] * A[3] */
  4694. "ldr r12, [%[a], #8]\n\t"
  4695. "ldr lr, [%[a], #12]\n\t"
  4696. "mov r11, #0\n\t"
  4697. "umlal r8, r11, r12, lr\n\t"
  4698. "str r8, [sp, #20]\n\t"
  4699. "adds r9, r9, r11\n\t"
  4700. /* A[2] * A[4] */
  4701. "ldr lr, [%[a], #16]\n\t"
  4702. "adc r11, %[r], #0\n\t"
  4703. "umlal r9, r11, r12, lr\n\t"
  4704. "str r9, [sp, #24]\n\t"
  4705. "adds r10, r10, r11\n\t"
  4706. /* A[2] * A[5] */
  4707. "ldr lr, [%[a], #20]\n\t"
  4708. "adc r11, %[r], #0\n\t"
  4709. "umlal r10, r11, r12, lr\n\t"
  4710. "adds r3, r3, r11\n\t"
  4711. /* A[2] * A[6] */
  4712. "ldr lr, [%[a], #24]\n\t"
  4713. "adc r11, %[r], #0\n\t"
  4714. "umlal r3, r11, r12, lr\n\t"
  4715. "adds r4, r4, r11\n\t"
  4716. /* A[2] * A[7] */
  4717. "ldr lr, [%[a], #28]\n\t"
  4718. "adc r5, %[r], #0\n\t"
  4719. "umlal r4, r5, r12, lr\n\t"
  4720. /* A[3] * A[4] */
  4721. "ldr r12, [%[a], #12]\n\t"
  4722. "ldr lr, [%[a], #16]\n\t"
  4723. "mov r11, #0\n\t"
  4724. "umlal r10, r11, r12, lr\n\t"
  4725. "str r10, [sp, #28]\n\t"
  4726. "adds r3, r3, r11\n\t"
  4727. /* A[3] * A[5] */
  4728. "ldr lr, [%[a], #20]\n\t"
  4729. "adc r11, %[r], #0\n\t"
  4730. "umlal r3, r11, r12, lr\n\t"
  4731. "adds r4, r4, r11\n\t"
  4732. /* A[3] * A[6] */
  4733. "ldr lr, [%[a], #24]\n\t"
  4734. "adc r11, %[r], #0\n\t"
  4735. "umlal r4, r11, r12, lr\n\t"
  4736. "adds r5, r5, r11\n\t"
  4737. /* A[3] * A[7] */
  4738. "ldr lr, [%[a], #28]\n\t"
  4739. "adc r6, %[r], #0\n\t"
  4740. "umlal r5, r6, r12, lr\n\t"
  4741. /* A[4] * A[5] */
  4742. "ldr r12, [%[a], #16]\n\t"
  4743. "ldr lr, [%[a], #20]\n\t"
  4744. "mov r11, #0\n\t"
  4745. "umlal r4, r11, r12, lr\n\t"
  4746. "adds r5, r5, r11\n\t"
  4747. /* A[4] * A[6] */
  4748. "ldr lr, [%[a], #24]\n\t"
  4749. "adc r11, %[r], #0\n\t"
  4750. "umlal r5, r11, r12, lr\n\t"
  4751. "adds r6, r6, r11\n\t"
  4752. /* A[4] * A[7] */
  4753. "ldr lr, [%[a], #28]\n\t"
  4754. "adc r7, %[r], #0\n\t"
  4755. "umlal r6, r7, r12, lr\n\t"
  4756. /* A[5] * A[6] */
  4757. "ldr r12, [%[a], #20]\n\t"
  4758. "ldr lr, [%[a], #24]\n\t"
  4759. "mov r11, #0\n\t"
  4760. "umlal r6, r11, r12, lr\n\t"
  4761. "adds r7, r7, r11\n\t"
  4762. /* A[5] * A[7] */
  4763. "ldr lr, [%[a], #28]\n\t"
  4764. "adc r8, %[r], #0\n\t"
  4765. "umlal r7, r8, r12, lr\n\t"
  4766. /* A[6] * A[7] */
  4767. "ldr r12, [%[a], #24]\n\t"
  4768. "ldr lr, [%[a], #28]\n\t"
  4769. "mov r9, #0\n\t"
  4770. "umlal r8, r9, r12, lr\n\t"
  4771. "add lr, sp, #32\n\t"
  4772. "stm lr, {r3, r4, r5, r6, r7, r8, r9}\n\t"
  4773. "add lr, sp, #4\n\t"
  4774. "ldm lr, {r4, r5, r6, r7, r8, r9, r10}\n\t"
  4775. "adds r4, r4, r4\n\t"
  4776. "adcs r5, r5, r5\n\t"
  4777. "adcs r6, r6, r6\n\t"
  4778. "adcs r7, r7, r7\n\t"
  4779. "adcs r8, r8, r8\n\t"
  4780. "adcs r9, r9, r9\n\t"
  4781. "adcs r10, r10, r10\n\t"
  4782. "stm lr!, {r4, r5, r6, r7, r8, r9, r10}\n\t"
  4783. "ldm lr, {r3, r4, r5, r6, r7, r8, r9}\n\t"
  4784. "adcs r3, r3, r3\n\t"
  4785. "adcs r4, r4, r4\n\t"
  4786. "adcs r5, r5, r5\n\t"
  4787. "adcs r6, r6, r6\n\t"
  4788. "adcs r7, r7, r7\n\t"
  4789. "adcs r8, r8, r8\n\t"
  4790. "adcs r9, r9, r9\n\t"
  4791. "adc r10, %[r], #0\n\t"
  4792. "stm lr, {r3, r4, r5, r6, r7, r8, r9, r10}\n\t"
  4793. "add lr, sp, #4\n\t"
  4794. "ldm lr, {r4, r5, r6, r7, r8, r9, r10}\n\t"
  4795. "mov lr, sp\n\t"
  4796. /* A[0] * A[0] */
  4797. "ldr r12, [%[a]]\n\t"
  4798. "umull r3, r11, r12, r12\n\t"
  4799. "adds r4, r4, r11\n\t"
  4800. /* A[1] * A[1] */
  4801. "ldr r12, [%[a], #4]\n\t"
  4802. "adcs r5, r5, #0\n\t"
  4803. "adc r11, %[r], #0\n\t"
  4804. "umlal r5, r11, r12, r12\n\t"
  4805. "adds r6, r6, r11\n\t"
  4806. /* A[2] * A[2] */
  4807. "ldr r12, [%[a], #8]\n\t"
  4808. "adcs r7, r7, #0\n\t"
  4809. "adc r11, %[r], #0\n\t"
  4810. "umlal r7, r11, r12, r12\n\t"
  4811. "adds r8, r8, r11\n\t"
  4812. /* A[3] * A[3] */
  4813. "ldr r12, [%[a], #12]\n\t"
  4814. "adcs r9, r9, #0\n\t"
  4815. "adc r11, %[r], #0\n\t"
  4816. "umlal r9, r11, r12, r12\n\t"
  4817. "adds r10, r10, r11\n\t"
  4818. "stm lr!, {r3, r4, r5, r6, r7, r8, r9, r10}\n\t"
  4819. "ldm lr, {r3, r4, r5, r6, r7, r8, r9, r10}\n\t"
  4820. /* A[4] * A[4] */
  4821. "ldr r12, [%[a], #16]\n\t"
  4822. "adcs r3, r3, #0\n\t"
  4823. "adc r11, %[r], #0\n\t"
  4824. "umlal r3, r11, r12, r12\n\t"
  4825. "adds r4, r4, r11\n\t"
  4826. /* A[5] * A[5] */
  4827. "ldr r12, [%[a], #20]\n\t"
  4828. "adcs r5, r5, #0\n\t"
  4829. "adc r11, %[r], #0\n\t"
  4830. "umlal r5, r11, r12, r12\n\t"
  4831. "adds r6, r6, r11\n\t"
  4832. /* A[6] * A[6] */
  4833. "ldr r12, [%[a], #24]\n\t"
  4834. "adcs r7, r7, #0\n\t"
  4835. "adc r11, %[r], #0\n\t"
  4836. "umlal r7, r11, r12, r12\n\t"
  4837. "adds r8, r8, r11\n\t"
  4838. /* A[7] * A[7] */
  4839. "ldr r12, [%[a], #28]\n\t"
  4840. "adcs r9, r9, #0\n\t"
  4841. "adc r10, r10, #0\n\t"
  4842. "umlal r9, r10, r12, r12\n\t"
  4843. "ldr %[r], [sp, #64]\n\t"
  4844. "add %[r], %[r], #32\n\t"
  4845. "stm %[r], {r3, r4, r5, r6, r7, r8, r9, r10}\n\t"
  4846. "ldm sp, {r3, r4, r5, r6, r7, r8, r9, r10}\n\t"
  4847. "sub %[r], %[r], #32\n\t"
  4848. "stm %[r], {r3, r4, r5, r6, r7, r8, r9, r10}\n\t"
  4849. "add sp, sp, #0x44\n\t"
  4850. : [r] "+r" (r), [a] "+r" (a)
  4851. :
  4852. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "lr", "cc"
  4853. );
  4854. }
  4855. #else
  4856. /* Square a and put result in r. (r = a * a)
  4857. *
  4858. * r A single precision integer.
  4859. * a A single precision integer.
  4860. */
  4861. static void sp_2048_sqr_8(sp_digit* r_p, const sp_digit* a_p)
  4862. {
  4863. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  4864. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  4865. __asm__ __volatile__ (
  4866. "sub sp, sp, #32\n\t"
  4867. "str %[r], [sp, #28]\n\t"
  4868. "ldm %[a], {%[r], %[a], r2, r3, r4, r5, r6, r7}\n\t"
  4869. "umull r9, r10, %[r], %[r]\n\t"
  4870. "umull r11, r12, %[r], %[a]\n\t"
  4871. "adds r11, r11, r11\n\t"
  4872. "mov lr, #0\n\t"
  4873. "umaal r10, r11, lr, lr\n\t"
  4874. "stm sp, {r9, r10}\n\t"
  4875. "mov r8, lr\n\t"
  4876. "umaal r8, r12, %[r], r2\n\t"
  4877. "adcs r8, r8, r8\n\t"
  4878. "umaal r8, r11, %[a], %[a]\n\t"
  4879. "umull r9, r10, %[r], r3\n\t"
  4880. "umaal r9, r12, %[a], r2\n\t"
  4881. "adcs r9, r9, r9\n\t"
  4882. "umaal r9, r11, lr, lr\n\t"
  4883. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  4884. "str r8, [sp, #8]\n\t"
  4885. "str r9, [sp, #12]\n\t"
  4886. #else
  4887. "strd r8, r9, [sp, #8]\n\t"
  4888. #endif
  4889. "mov r9, lr\n\t"
  4890. "umaal r9, r10, %[r], r4\n\t"
  4891. "umaal r9, r12, %[a], r3\n\t"
  4892. "adcs r9, r9, r9\n\t"
  4893. "umaal r9, r11, r2, r2\n\t"
  4894. "str r9, [sp, #16]\n\t"
  4895. "umull r9, r8, %[r], r5\n\t"
  4896. "umaal r9, r12, %[a], r4\n\t"
  4897. "umaal r9, r10, r2, r3\n\t"
  4898. "adcs r9, r9, r9\n\t"
  4899. "umaal r9, r11, lr, lr\n\t"
  4900. "str r9, [sp, #20]\n\t"
  4901. "mov r9, lr\n\t"
  4902. "umaal r9, r8, %[r], r6\n\t"
  4903. "umaal r9, r12, %[a], r5\n\t"
  4904. "umaal r9, r10, r2, r4\n\t"
  4905. "adcs r9, r9, r9\n\t"
  4906. "umaal r9, r11, r3, r3\n\t"
  4907. "str r9, [sp, #24]\n\t"
  4908. "umull %[r], r9, %[r], r7\n\t"
  4909. "umaal %[r], r8, %[a], r6\n\t"
  4910. "umaal %[r], r12, r2, r5\n\t"
  4911. "umaal %[r], r10, r3, r4\n\t"
  4912. "adcs %[r], %[r], %[r]\n\t"
  4913. "umaal %[r], r11, lr, lr\n\t"
  4914. /* R[7] = r0 */
  4915. "umaal r9, r8, %[a], r7\n\t"
  4916. "umaal r9, r10, r2, r6\n\t"
  4917. "umaal r12, r9, r3, r5\n\t"
  4918. "adcs r12, r12, r12\n\t"
  4919. "umaal r12, r11, r4, r4\n\t"
  4920. /* R[8] = r12 */
  4921. "umaal r9, r8, r2, r7\n\t"
  4922. "umaal r10, r9, r3, r6\n\t"
  4923. "mov r2, lr\n\t"
  4924. "umaal r10, r2, r4, r5\n\t"
  4925. "adcs r10, r10, r10\n\t"
  4926. "umaal r11, r10, lr, lr\n\t"
  4927. /* R[9] = r11 */
  4928. "umaal r2, r8, r3, r7\n\t"
  4929. "umaal r2, r9, r4, r6\n\t"
  4930. "adcs r3, r2, r2\n\t"
  4931. "umaal r10, r3, r5, r5\n\t"
  4932. /* R[10] = r10 */
  4933. "mov %[a], lr\n\t"
  4934. "umaal %[a], r8, r4, r7\n\t"
  4935. "umaal %[a], r9, r5, r6\n\t"
  4936. "adcs r4, %[a], %[a]\n\t"
  4937. "umaal r3, r4, lr, lr\n\t"
  4938. /* R[11] = r3 */
  4939. "umaal r8, r9, r5, r7\n\t"
  4940. "adcs r8, r8, r8\n\t"
  4941. "umaal r4, r8, r6, r6\n\t"
  4942. /* R[12] = r4 */
  4943. "mov r5, lr\n\t"
  4944. "umaal r5, r9, r6, r7\n\t"
  4945. "adcs r5, r5, r5\n\t"
  4946. "umaal r8, r5, lr, lr\n\t"
  4947. /* R[13] = r8 */
  4948. "adcs r9, r9, r9\n\t"
  4949. "umaal r9, r5, r7, r7\n\t"
  4950. "adcs r7, r5, lr\n\t"
  4951. /* R[14] = r9 */
  4952. /* R[15] = r7 */
  4953. "ldr lr, [sp, #28]\n\t"
  4954. "add lr, lr, #28\n\t"
  4955. "stm lr!, {%[r], r12}\n\t"
  4956. "stm lr!, {r11}\n\t"
  4957. "stm lr!, {r10}\n\t"
  4958. "stm lr!, {r3, r4, r8, r9}\n\t"
  4959. "stm lr!, {r7}\n\t"
  4960. "sub lr, lr, #0x40\n\t"
  4961. "ldm sp, {%[r], %[a], r2, r3, r4, r5, r6}\n\t"
  4962. "stm lr, {%[r], %[a], r2, r3, r4, r5, r6}\n\t"
  4963. "add sp, sp, #32\n\t"
  4964. : [r] "+r" (r), [a] "+r" (a)
  4965. :
  4966. : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "lr", "cc"
  4967. );
  4968. }
  4969. #endif
  4970. /* Sub b from a into r. (r = a - b)
  4971. *
  4972. * r A single precision integer.
  4973. * a A single precision integer.
  4974. * b A single precision integer.
  4975. */
  4976. static sp_digit sp_2048_sub_8(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p)
  4977. {
  4978. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  4979. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  4980. register const sp_digit* b asm ("r2") = (const sp_digit*)b_p;
  4981. __asm__ __volatile__ (
  4982. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  4983. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  4984. "subs r3, r3, r7\n\t"
  4985. "sbcs r4, r4, r8\n\t"
  4986. "sbcs r5, r5, r9\n\t"
  4987. "sbcs r6, r6, r10\n\t"
  4988. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  4989. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  4990. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  4991. "sbcs r3, r3, r7\n\t"
  4992. "sbcs r4, r4, r8\n\t"
  4993. "sbcs r5, r5, r9\n\t"
  4994. "sbcs r6, r6, r10\n\t"
  4995. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  4996. "sbc %[r], r6, r6\n\t"
  4997. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  4998. :
  4999. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "cc"
  5000. );
  5001. return (uint32_t)(size_t)r;
  5002. }
  5003. /* Square a and put result in r. (r = a * a)
  5004. *
  5005. * r A single precision integer.
  5006. * a A single precision integer.
  5007. */
  5008. SP_NOINLINE static void sp_2048_sqr_16(sp_digit* r, const sp_digit* a)
  5009. {
  5010. sp_digit* z0 = r;
  5011. sp_digit* z2 = r + 16;
  5012. sp_digit z1[16];
  5013. sp_digit* a1 = z1;
  5014. sp_digit zero[8];
  5015. sp_digit u;
  5016. sp_digit mask;
  5017. sp_digit* p1;
  5018. sp_digit* p2;
  5019. XMEMSET(zero, 0, sizeof(sp_digit) * 8);
  5020. mask = sp_2048_sub_8(a1, a, &a[8]);
  5021. p1 = (sp_digit*)(((sp_digit)zero & mask ) | ((sp_digit)a1 & (~mask)));
  5022. p2 = (sp_digit*)(((sp_digit)zero & (~mask)) | ((sp_digit)a1 & mask ));
  5023. (void)sp_2048_sub_8(a1, p1, p2);
  5024. sp_2048_sqr_8(z2, &a[8]);
  5025. sp_2048_sqr_8(z0, a);
  5026. sp_2048_sqr_8(z1, a1);
  5027. u = 0;
  5028. u -= sp_2048_sub_in_place_16(z1, z2);
  5029. u -= sp_2048_sub_in_place_16(z1, z0);
  5030. u += sp_2048_sub_in_place_16(r + 8, z1);
  5031. zero[0] = u;
  5032. (void)sp_2048_add_8(r + 24, r + 24, zero);
  5033. }
  5034. /* Sub b from a into r. (r = a - b)
  5035. *
  5036. * r A single precision integer.
  5037. * a A single precision integer.
  5038. * b A single precision integer.
  5039. */
  5040. static sp_digit sp_2048_sub_16(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p)
  5041. {
  5042. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  5043. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  5044. register const sp_digit* b asm ("r2") = (const sp_digit*)b_p;
  5045. __asm__ __volatile__ (
  5046. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  5047. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  5048. "subs r3, r3, r7\n\t"
  5049. "sbcs r4, r4, r8\n\t"
  5050. "sbcs r5, r5, r9\n\t"
  5051. "sbcs r6, r6, r10\n\t"
  5052. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  5053. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  5054. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  5055. "sbcs r3, r3, r7\n\t"
  5056. "sbcs r4, r4, r8\n\t"
  5057. "sbcs r5, r5, r9\n\t"
  5058. "sbcs r6, r6, r10\n\t"
  5059. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  5060. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  5061. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  5062. "sbcs r3, r3, r7\n\t"
  5063. "sbcs r4, r4, r8\n\t"
  5064. "sbcs r5, r5, r9\n\t"
  5065. "sbcs r6, r6, r10\n\t"
  5066. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  5067. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  5068. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  5069. "sbcs r3, r3, r7\n\t"
  5070. "sbcs r4, r4, r8\n\t"
  5071. "sbcs r5, r5, r9\n\t"
  5072. "sbcs r6, r6, r10\n\t"
  5073. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  5074. "sbc %[r], r6, r6\n\t"
  5075. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  5076. :
  5077. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "cc"
  5078. );
  5079. return (uint32_t)(size_t)r;
  5080. }
  5081. /* Square a and put result in r. (r = a * a)
  5082. *
  5083. * r A single precision integer.
  5084. * a A single precision integer.
  5085. */
  5086. SP_NOINLINE static void sp_2048_sqr_32(sp_digit* r, const sp_digit* a)
  5087. {
  5088. sp_digit* z0 = r;
  5089. sp_digit* z2 = r + 32;
  5090. sp_digit z1[32];
  5091. sp_digit* a1 = z1;
  5092. sp_digit zero[16];
  5093. sp_digit u;
  5094. sp_digit mask;
  5095. sp_digit* p1;
  5096. sp_digit* p2;
  5097. XMEMSET(zero, 0, sizeof(sp_digit) * 16);
  5098. mask = sp_2048_sub_16(a1, a, &a[16]);
  5099. p1 = (sp_digit*)(((sp_digit)zero & mask ) | ((sp_digit)a1 & (~mask)));
  5100. p2 = (sp_digit*)(((sp_digit)zero & (~mask)) | ((sp_digit)a1 & mask ));
  5101. (void)sp_2048_sub_16(a1, p1, p2);
  5102. sp_2048_sqr_16(z2, &a[16]);
  5103. sp_2048_sqr_16(z0, a);
  5104. sp_2048_sqr_16(z1, a1);
  5105. u = 0;
  5106. u -= sp_2048_sub_in_place_32(z1, z2);
  5107. u -= sp_2048_sub_in_place_32(z1, z0);
  5108. u += sp_2048_sub_in_place_32(r + 16, z1);
  5109. zero[0] = u;
  5110. (void)sp_2048_add_16(r + 48, r + 48, zero);
  5111. }
  5112. /* Sub b from a into r. (r = a - b)
  5113. *
  5114. * r A single precision integer.
  5115. * a A single precision integer.
  5116. * b A single precision integer.
  5117. */
  5118. static sp_digit sp_2048_sub_32(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p)
  5119. {
  5120. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  5121. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  5122. register const sp_digit* b asm ("r2") = (const sp_digit*)b_p;
  5123. __asm__ __volatile__ (
  5124. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  5125. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  5126. "subs r3, r3, r7\n\t"
  5127. "sbcs r4, r4, r8\n\t"
  5128. "sbcs r5, r5, r9\n\t"
  5129. "sbcs r6, r6, r10\n\t"
  5130. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  5131. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  5132. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  5133. "sbcs r3, r3, r7\n\t"
  5134. "sbcs r4, r4, r8\n\t"
  5135. "sbcs r5, r5, r9\n\t"
  5136. "sbcs r6, r6, r10\n\t"
  5137. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  5138. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  5139. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  5140. "sbcs r3, r3, r7\n\t"
  5141. "sbcs r4, r4, r8\n\t"
  5142. "sbcs r5, r5, r9\n\t"
  5143. "sbcs r6, r6, r10\n\t"
  5144. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  5145. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  5146. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  5147. "sbcs r3, r3, r7\n\t"
  5148. "sbcs r4, r4, r8\n\t"
  5149. "sbcs r5, r5, r9\n\t"
  5150. "sbcs r6, r6, r10\n\t"
  5151. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  5152. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  5153. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  5154. "sbcs r3, r3, r7\n\t"
  5155. "sbcs r4, r4, r8\n\t"
  5156. "sbcs r5, r5, r9\n\t"
  5157. "sbcs r6, r6, r10\n\t"
  5158. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  5159. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  5160. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  5161. "sbcs r3, r3, r7\n\t"
  5162. "sbcs r4, r4, r8\n\t"
  5163. "sbcs r5, r5, r9\n\t"
  5164. "sbcs r6, r6, r10\n\t"
  5165. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  5166. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  5167. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  5168. "sbcs r3, r3, r7\n\t"
  5169. "sbcs r4, r4, r8\n\t"
  5170. "sbcs r5, r5, r9\n\t"
  5171. "sbcs r6, r6, r10\n\t"
  5172. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  5173. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  5174. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  5175. "sbcs r3, r3, r7\n\t"
  5176. "sbcs r4, r4, r8\n\t"
  5177. "sbcs r5, r5, r9\n\t"
  5178. "sbcs r6, r6, r10\n\t"
  5179. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  5180. "sbc %[r], r6, r6\n\t"
  5181. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  5182. :
  5183. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "cc"
  5184. );
  5185. return (uint32_t)(size_t)r;
  5186. }
  5187. /* Square a and put result in r. (r = a * a)
  5188. *
  5189. * r A single precision integer.
  5190. * a A single precision integer.
  5191. */
  5192. SP_NOINLINE static void sp_2048_sqr_64(sp_digit* r, const sp_digit* a)
  5193. {
  5194. sp_digit* z0 = r;
  5195. sp_digit* z2 = r + 64;
  5196. sp_digit z1[64];
  5197. sp_digit* a1 = z1;
  5198. sp_digit zero[32];
  5199. sp_digit u;
  5200. sp_digit mask;
  5201. sp_digit* p1;
  5202. sp_digit* p2;
  5203. XMEMSET(zero, 0, sizeof(sp_digit) * 32);
  5204. mask = sp_2048_sub_32(a1, a, &a[32]);
  5205. p1 = (sp_digit*)(((sp_digit)zero & mask ) | ((sp_digit)a1 & (~mask)));
  5206. p2 = (sp_digit*)(((sp_digit)zero & (~mask)) | ((sp_digit)a1 & mask ));
  5207. (void)sp_2048_sub_32(a1, p1, p2);
  5208. sp_2048_sqr_32(z2, &a[32]);
  5209. sp_2048_sqr_32(z0, a);
  5210. sp_2048_sqr_32(z1, a1);
  5211. u = 0;
  5212. u -= sp_2048_sub_in_place_64(z1, z2);
  5213. u -= sp_2048_sub_in_place_64(z1, z0);
  5214. u += sp_2048_sub_in_place_64(r + 32, z1);
  5215. zero[0] = u;
  5216. (void)sp_2048_add_32(r + 96, r + 96, zero);
  5217. }
  5218. #endif /* !WOLFSSL_SP_SMALL */
  5219. #ifdef WOLFSSL_SP_SMALL
  5220. /* Add b to a into r. (r = a + b)
  5221. *
  5222. * r A single precision integer.
  5223. * a A single precision integer.
  5224. * b A single precision integer.
  5225. */
  5226. static sp_digit sp_2048_add_64(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p)
  5227. {
  5228. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  5229. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  5230. register const sp_digit* b asm ("r2") = (const sp_digit*)b_p;
  5231. __asm__ __volatile__ (
  5232. "mov r3, #0\n\t"
  5233. "add r12, %[a], #0x100\n\t"
  5234. "\n"
  5235. "L_sp_2048_add_64_word_%=: \n\t"
  5236. "adds r3, r3, #-1\n\t"
  5237. "ldm %[a]!, {r4, r5, r6, r7}\n\t"
  5238. "ldm %[b]!, {r8, r9, r10, r11}\n\t"
  5239. "adcs r4, r4, r8\n\t"
  5240. "adcs r5, r5, r9\n\t"
  5241. "adcs r6, r6, r10\n\t"
  5242. "adcs r7, r7, r11\n\t"
  5243. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  5244. "mov r4, #0\n\t"
  5245. "adc r3, r4, #0\n\t"
  5246. "cmp %[a], r12\n\t"
  5247. "bne L_sp_2048_add_64_word_%=\n\t"
  5248. "mov %[r], r3\n\t"
  5249. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  5250. :
  5251. : "memory", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r3", "r12", "cc"
  5252. );
  5253. return (uint32_t)(size_t)r;
  5254. }
  5255. #endif /* WOLFSSL_SP_SMALL */
  5256. #ifdef WOLFSSL_SP_SMALL
  5257. /* Sub b from a into a. (a -= b)
  5258. *
  5259. * a A single precision integer.
  5260. * b A single precision integer.
  5261. */
  5262. static sp_digit sp_2048_sub_in_place_64(sp_digit* a_p, const sp_digit* b_p)
  5263. {
  5264. register sp_digit* a asm ("r0") = (sp_digit*)a_p;
  5265. register const sp_digit* b asm ("r1") = (const sp_digit*)b_p;
  5266. __asm__ __volatile__ (
  5267. "mov r12, #0\n\t"
  5268. "add lr, %[a], #0x100\n\t"
  5269. "\n"
  5270. "L_sp_2048_sub_in_pkace_64_word_%=: \n\t"
  5271. "rsbs r12, r12, #0\n\t"
  5272. "ldm %[a], {r2, r3, r4, r5}\n\t"
  5273. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  5274. "sbcs r2, r2, r6\n\t"
  5275. "sbcs r3, r3, r7\n\t"
  5276. "sbcs r4, r4, r8\n\t"
  5277. "sbcs r5, r5, r9\n\t"
  5278. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  5279. "sbc r12, r12, r12\n\t"
  5280. "cmp %[a], lr\n\t"
  5281. "bne L_sp_2048_sub_in_pkace_64_word_%=\n\t"
  5282. "mov %[a], r12\n\t"
  5283. : [a] "+r" (a), [b] "+r" (b)
  5284. :
  5285. : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r12", "lr", "cc"
  5286. );
  5287. return (uint32_t)(size_t)a;
  5288. }
  5289. #endif /* WOLFSSL_SP_SMALL */
  5290. #ifdef WOLFSSL_SP_SMALL
  5291. /* Multiply a and b into r. (r = a * b)
  5292. *
  5293. * r A single precision integer.
  5294. * a A single precision integer.
  5295. * b A single precision integer.
  5296. */
  5297. static void sp_2048_mul_64(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p)
  5298. {
  5299. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  5300. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  5301. register const sp_digit* b asm ("r2") = (const sp_digit*)b_p;
  5302. __asm__ __volatile__ (
  5303. "sub sp, sp, #0x200\n\t"
  5304. "ldr lr, [%[a]]\n\t"
  5305. "ldr r11, [%[b]]\n\t"
  5306. "umull r8, r6, lr, r11\n\t"
  5307. "str r8, [sp]\n\t"
  5308. "mov r7, #0\n\t"
  5309. "mov r8, #0\n\t"
  5310. "mov r5, #4\n\t"
  5311. "\n"
  5312. "L_sp_2048_mul_64_outer_%=: \n\t"
  5313. "subs r3, r5, #0xfc\n\t"
  5314. "it cc\n\t"
  5315. "movcc r3, #0\n\t"
  5316. "sub r4, r5, r3\n\t"
  5317. "\n"
  5318. "L_sp_2048_mul_64_inner_%=: \n\t"
  5319. "ldr lr, [%[a], r3]\n\t"
  5320. "ldr r11, [%[b], r4]\n\t"
  5321. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  5322. "lsl r9, lr, #16\n\t"
  5323. "lsl r10, r11, #16\n\t"
  5324. "lsr r9, r9, #16\n\t"
  5325. "lsr r10, r10, #16\n\t"
  5326. "mul r10, r9, r10\n\t"
  5327. "adds r6, r6, r10\n\t"
  5328. "adcs r7, r7, #0\n\t"
  5329. "adc r8, r8, #0\n\t"
  5330. "lsr r10, r11, #16\n\t"
  5331. "mul r9, r10, r9\n\t"
  5332. "lsr r10, r9, #16\n\t"
  5333. "lsl r9, r9, #16\n\t"
  5334. "adds r6, r6, r9\n\t"
  5335. "adcs r7, r7, r10\n\t"
  5336. "adc r8, r8, #0\n\t"
  5337. "lsr r9, lr, #16\n\t"
  5338. "lsr r10, r11, #16\n\t"
  5339. "mul r10, r9, r10\n\t"
  5340. "adds r7, r7, r10\n\t"
  5341. "adc r8, r8, #0\n\t"
  5342. "lsl r10, r11, #16\n\t"
  5343. "lsr r10, r10, #16\n\t"
  5344. "mul r9, r10, r9\n\t"
  5345. "lsr r10, r9, #16\n\t"
  5346. "lsl r9, r9, #16\n\t"
  5347. "adds r6, r6, r9\n\t"
  5348. "adcs r7, r7, r10\n\t"
  5349. "adc r8, r8, #0\n\t"
  5350. #else
  5351. "umull r9, r10, lr, r11\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. "ldr lr, [%[a], r4]\n\t"
  5357. "ldr r11, [%[b], r3]\n\t"
  5358. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  5359. "lsl r9, lr, #16\n\t"
  5360. "lsl r10, r11, #16\n\t"
  5361. "lsr r9, r9, #16\n\t"
  5362. "lsr r10, r10, #16\n\t"
  5363. "mul r10, r9, r10\n\t"
  5364. "adds r6, r6, r10\n\t"
  5365. "adcs r7, r7, #0\n\t"
  5366. "adc r8, r8, #0\n\t"
  5367. "lsr r10, r11, #16\n\t"
  5368. "mul r9, r10, r9\n\t"
  5369. "lsr r10, r9, #16\n\t"
  5370. "lsl r9, r9, #16\n\t"
  5371. "adds r6, r6, r9\n\t"
  5372. "adcs r7, r7, r10\n\t"
  5373. "adc r8, r8, #0\n\t"
  5374. "lsr r9, lr, #16\n\t"
  5375. "lsr r10, r11, #16\n\t"
  5376. "mul r10, r9, r10\n\t"
  5377. "adds r7, r7, r10\n\t"
  5378. "adc r8, r8, #0\n\t"
  5379. "lsl r10, r11, #16\n\t"
  5380. "lsr r10, r10, #16\n\t"
  5381. "mul r9, r10, r9\n\t"
  5382. "lsr r10, r9, #16\n\t"
  5383. "lsl r9, r9, #16\n\t"
  5384. "adds r6, r6, r9\n\t"
  5385. "adcs r7, r7, r10\n\t"
  5386. "adc r8, r8, #0\n\t"
  5387. #else
  5388. "umull r9, r10, lr, r11\n\t"
  5389. "adds r6, r6, r9\n\t"
  5390. "adcs r7, r7, r10\n\t"
  5391. "adc r8, r8, #0\n\t"
  5392. #endif
  5393. "add r3, r3, #4\n\t"
  5394. "sub r4, r4, #4\n\t"
  5395. "cmp r3, r4\n\t"
  5396. "bgt L_sp_2048_mul_64_inner_done_%=\n\t"
  5397. "blt L_sp_2048_mul_64_inner_%=\n\t"
  5398. "ldr lr, [%[a], r3]\n\t"
  5399. "ldr r11, [%[b], r3]\n\t"
  5400. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  5401. "lsl r9, lr, #16\n\t"
  5402. "lsl r10, r11, #16\n\t"
  5403. "lsr r9, r9, #16\n\t"
  5404. "lsr r10, r10, #16\n\t"
  5405. "mul r10, r9, r10\n\t"
  5406. "adds r6, r6, r10\n\t"
  5407. "adcs r7, r7, #0\n\t"
  5408. "adc r8, r8, #0\n\t"
  5409. "lsr r10, r11, #16\n\t"
  5410. "mul r9, r10, r9\n\t"
  5411. "lsr r10, r9, #16\n\t"
  5412. "lsl r9, r9, #16\n\t"
  5413. "adds r6, r6, r9\n\t"
  5414. "adcs r7, r7, r10\n\t"
  5415. "adc r8, r8, #0\n\t"
  5416. "lsr r9, lr, #16\n\t"
  5417. "lsr r10, r11, #16\n\t"
  5418. "mul r10, r9, r10\n\t"
  5419. "adds r7, r7, r10\n\t"
  5420. "adc r8, r8, #0\n\t"
  5421. "lsl r10, r11, #16\n\t"
  5422. "lsr r10, r10, #16\n\t"
  5423. "mul r9, r10, r9\n\t"
  5424. "lsr r10, r9, #16\n\t"
  5425. "lsl r9, r9, #16\n\t"
  5426. "adds r6, r6, r9\n\t"
  5427. "adcs r7, r7, r10\n\t"
  5428. "adc r8, r8, #0\n\t"
  5429. #else
  5430. "umull r9, r10, lr, r11\n\t"
  5431. "adds r6, r6, r9\n\t"
  5432. "adcs r7, r7, r10\n\t"
  5433. "adc r8, r8, #0\n\t"
  5434. #endif
  5435. "\n"
  5436. "L_sp_2048_mul_64_inner_done_%=: \n\t"
  5437. "str r6, [sp, r5]\n\t"
  5438. "mov r6, r7\n\t"
  5439. "mov r7, r8\n\t"
  5440. "mov r8, #0\n\t"
  5441. "add r5, r5, #4\n\t"
  5442. "cmp r5, #0x1f4\n\t"
  5443. "ble L_sp_2048_mul_64_outer_%=\n\t"
  5444. "ldr lr, [%[a], #252]\n\t"
  5445. "ldr r11, [%[b], #252]\n\t"
  5446. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  5447. "lsl r9, lr, #16\n\t"
  5448. "lsl r10, r11, #16\n\t"
  5449. "lsr r9, r9, #16\n\t"
  5450. "lsr r10, r10, #16\n\t"
  5451. "mul r10, r9, r10\n\t"
  5452. "adds r6, r6, r10\n\t"
  5453. "adc r7, r7, #0\n\t"
  5454. "lsr r10, r11, #16\n\t"
  5455. "mul r9, r10, r9\n\t"
  5456. "lsr r10, r9, #16\n\t"
  5457. "lsl r9, r9, #16\n\t"
  5458. "adds r6, r6, r9\n\t"
  5459. "adc r7, r7, r10\n\t"
  5460. "lsr r9, lr, #16\n\t"
  5461. "lsr r10, r11, #16\n\t"
  5462. "mul r10, r9, r10\n\t"
  5463. "add r7, r7, r10\n\t"
  5464. "lsl r10, r11, #16\n\t"
  5465. "lsr r10, r10, #16\n\t"
  5466. "mul r9, r10, r9\n\t"
  5467. "lsr r10, r9, #16\n\t"
  5468. "lsl r9, r9, #16\n\t"
  5469. "adds r6, r6, r9\n\t"
  5470. "adc r7, r7, r10\n\t"
  5471. #else
  5472. "umlal r6, r7, lr, r11\n\t"
  5473. #endif
  5474. "str r6, [sp, r5]\n\t"
  5475. "add r5, r5, #4\n\t"
  5476. "str r7, [sp, r5]\n\t"
  5477. "\n"
  5478. "L_sp_2048_mul_64_store_%=: \n\t"
  5479. "ldm sp!, {r3, r4, r6, r7, r8, r9, r10, r11}\n\t"
  5480. "stm %[r]!, {r3, r4, r6, r7, r8, r9, r10, r11}\n\t"
  5481. "subs r5, r5, #32\n\t"
  5482. "bgt L_sp_2048_mul_64_store_%=\n\t"
  5483. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  5484. :
  5485. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "lr", "r11", "cc"
  5486. );
  5487. }
  5488. /* Square a and put result in r. (r = a * a)
  5489. *
  5490. * r A single precision integer.
  5491. * a A single precision integer.
  5492. */
  5493. static void sp_2048_sqr_64(sp_digit* r_p, const sp_digit* a_p)
  5494. {
  5495. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  5496. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  5497. __asm__ __volatile__ (
  5498. "sub sp, sp, #0x200\n\t"
  5499. "ldr lr, [%[a]]\n\t"
  5500. "umull r8, r6, lr, lr\n\t"
  5501. "str r8, [sp]\n\t"
  5502. "mov r7, #0\n\t"
  5503. "mov r8, #0\n\t"
  5504. "mov r5, #4\n\t"
  5505. "\n"
  5506. "L_sp_2048_sqr_64_outer_%=: \n\t"
  5507. "subs r3, r5, #0xfc\n\t"
  5508. "it cc\n\t"
  5509. "movcc r3, #0\n\t"
  5510. "sub r4, r5, r3\n\t"
  5511. "\n"
  5512. "L_sp_2048_sqr_64_inner_%=: \n\t"
  5513. "ldr lr, [%[a], r3]\n\t"
  5514. "ldr r11, [%[a], r4]\n\t"
  5515. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  5516. "lsl r9, lr, #16\n\t"
  5517. "lsl r10, r11, #16\n\t"
  5518. "lsr r9, r9, #16\n\t"
  5519. "lsr r10, r10, #16\n\t"
  5520. "mul r10, r9, r10\n\t"
  5521. "adds r6, r6, r10\n\t"
  5522. "adcs r7, r7, #0\n\t"
  5523. "adc r8, r8, #0\n\t"
  5524. "adds r6, r6, r10\n\t"
  5525. "adcs r7, r7, #0\n\t"
  5526. "adc r8, r8, #0\n\t"
  5527. "lsr r10, r11, #16\n\t"
  5528. "mul r9, r10, r9\n\t"
  5529. "lsr r10, r9, #16\n\t"
  5530. "lsl r9, r9, #16\n\t"
  5531. "adds r6, r6, r9\n\t"
  5532. "adcs r7, r7, r10\n\t"
  5533. "adc r8, r8, #0\n\t"
  5534. "adds r6, r6, r9\n\t"
  5535. "adcs r7, r7, r10\n\t"
  5536. "adc r8, r8, #0\n\t"
  5537. "lsr r9, lr, #16\n\t"
  5538. "lsr r10, r11, #16\n\t"
  5539. "mul r10, r9, r10\n\t"
  5540. "adds r7, r7, r10\n\t"
  5541. "adc r8, r8, #0\n\t"
  5542. "adds r7, r7, r10\n\t"
  5543. "adc r8, r8, #0\n\t"
  5544. "lsl r10, r11, #16\n\t"
  5545. "lsr r10, r10, #16\n\t"
  5546. "mul r9, r10, r9\n\t"
  5547. "lsr r10, r9, #16\n\t"
  5548. "lsl r9, r9, #16\n\t"
  5549. "adds r6, r6, r9\n\t"
  5550. "adcs r7, r7, r10\n\t"
  5551. "adc r8, r8, #0\n\t"
  5552. "adds r6, r6, r9\n\t"
  5553. "adcs r7, r7, r10\n\t"
  5554. "adc r8, r8, #0\n\t"
  5555. #else
  5556. "umull r9, r10, lr, r11\n\t"
  5557. "adds r6, r6, r9\n\t"
  5558. "adcs r7, r7, r10\n\t"
  5559. "adc r8, r8, #0\n\t"
  5560. "adds r6, r6, r9\n\t"
  5561. "adcs r7, r7, r10\n\t"
  5562. "adc r8, r8, #0\n\t"
  5563. #endif
  5564. "add r3, r3, #4\n\t"
  5565. "sub r4, r4, #4\n\t"
  5566. "cmp r3, r4\n\t"
  5567. "bgt L_sp_2048_sqr_64_inner_done_%=\n\t"
  5568. "blt L_sp_2048_sqr_64_inner_%=\n\t"
  5569. "ldr lr, [%[a], r3]\n\t"
  5570. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  5571. "lsl r9, lr, #16\n\t"
  5572. "lsr r10, lr, #16\n\t"
  5573. "lsr r9, r9, #16\n\t"
  5574. "mov r11, r9\n\t"
  5575. "mul r9, r11, r9\n\t"
  5576. "mov r11, r10\n\t"
  5577. "mul r10, r11, r10\n\t"
  5578. "adds r6, r6, r9\n\t"
  5579. "adcs r7, r7, r10\n\t"
  5580. "adc r8, r8, #0\n\t"
  5581. "lsr r10, lr, #16\n\t"
  5582. "lsl r9, lr, #16\n\t"
  5583. "lsr r9, r9, #16\n\t"
  5584. "mul r9, r10, r9\n\t"
  5585. "lsr r10, r9, #15\n\t"
  5586. "lsl r9, r9, #17\n\t"
  5587. "adds r6, r6, r9\n\t"
  5588. "adcs r7, r7, r10\n\t"
  5589. "adc r8, r8, #0\n\t"
  5590. #else
  5591. "umull r9, r10, lr, lr\n\t"
  5592. "adds r6, r6, r9\n\t"
  5593. "adcs r7, r7, r10\n\t"
  5594. "adc r8, r8, #0\n\t"
  5595. #endif
  5596. "\n"
  5597. "L_sp_2048_sqr_64_inner_done_%=: \n\t"
  5598. "str r6, [sp, r5]\n\t"
  5599. "mov r6, r7\n\t"
  5600. "mov r7, r8\n\t"
  5601. "mov r8, #0\n\t"
  5602. "add r5, r5, #4\n\t"
  5603. "cmp r5, #0x1f4\n\t"
  5604. "ble L_sp_2048_sqr_64_outer_%=\n\t"
  5605. "ldr lr, [%[a], #252]\n\t"
  5606. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  5607. "lsl r9, lr, #16\n\t"
  5608. "lsr r10, lr, #16\n\t"
  5609. "lsr r9, r9, #16\n\t"
  5610. "mov r11, r9\n\t"
  5611. "mul r9, r11, r9\n\t"
  5612. "mov r11, r10\n\t"
  5613. "mul r10, r11, r10\n\t"
  5614. "adds r6, r6, r9\n\t"
  5615. "adc r7, r7, r10\n\t"
  5616. "lsr r10, lr, #16\n\t"
  5617. "lsl r9, lr, #16\n\t"
  5618. "lsr r9, r9, #16\n\t"
  5619. "mul r9, r10, r9\n\t"
  5620. "lsr r10, r9, #15\n\t"
  5621. "lsl r9, r9, #17\n\t"
  5622. "adds r6, r6, r9\n\t"
  5623. "adc r7, r7, r10\n\t"
  5624. #else
  5625. "umull r9, r10, lr, lr\n\t"
  5626. "adds r6, r6, r9\n\t"
  5627. "adc r7, r7, r10\n\t"
  5628. #endif
  5629. "str r6, [sp, r5]\n\t"
  5630. "add r5, r5, #4\n\t"
  5631. "str r7, [sp, r5]\n\t"
  5632. "\n"
  5633. "L_sp_2048_sqr_64_store_%=: \n\t"
  5634. "ldm sp!, {r3, r4, r6, r7, r8, r9, r10, r11}\n\t"
  5635. "stm %[r]!, {r3, r4, r6, r7, r8, r9, r10, r11}\n\t"
  5636. "subs r5, r5, #32\n\t"
  5637. "bgt L_sp_2048_sqr_64_store_%=\n\t"
  5638. : [r] "+r" (r), [a] "+r" (a)
  5639. :
  5640. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "lr", "r11", "cc"
  5641. );
  5642. }
  5643. #endif /* WOLFSSL_SP_SMALL */
  5644. #if (defined(WOLFSSL_HAVE_SP_RSA) && !defined(WOLFSSL_RSA_PUBLIC_ONLY)) || defined(WOLFSSL_HAVE_SP_DH)
  5645. #ifdef WOLFSSL_SP_SMALL
  5646. /* AND m into each word of a and store in r.
  5647. *
  5648. * r A single precision integer.
  5649. * a A single precision integer.
  5650. * m Mask to AND against each digit.
  5651. */
  5652. static void sp_2048_mask_32(sp_digit* r, const sp_digit* a, sp_digit m)
  5653. {
  5654. int i;
  5655. for (i=0; i<32; i++) {
  5656. r[i] = a[i] & m;
  5657. }
  5658. }
  5659. #endif /* WOLFSSL_SP_SMALL */
  5660. #ifdef WOLFSSL_SP_SMALL
  5661. /* Add b to a into r. (r = a + b)
  5662. *
  5663. * r A single precision integer.
  5664. * a A single precision integer.
  5665. * b A single precision integer.
  5666. */
  5667. static sp_digit sp_2048_add_32(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p)
  5668. {
  5669. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  5670. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  5671. register const sp_digit* b asm ("r2") = (const sp_digit*)b_p;
  5672. __asm__ __volatile__ (
  5673. "mov r3, #0\n\t"
  5674. "add r12, %[a], #0x80\n\t"
  5675. "\n"
  5676. "L_sp_2048_add_32_word_%=: \n\t"
  5677. "adds r3, r3, #-1\n\t"
  5678. "ldm %[a]!, {r4, r5, r6, r7}\n\t"
  5679. "ldm %[b]!, {r8, r9, r10, r11}\n\t"
  5680. "adcs r4, r4, r8\n\t"
  5681. "adcs r5, r5, r9\n\t"
  5682. "adcs r6, r6, r10\n\t"
  5683. "adcs r7, r7, r11\n\t"
  5684. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  5685. "mov r4, #0\n\t"
  5686. "adc r3, r4, #0\n\t"
  5687. "cmp %[a], r12\n\t"
  5688. "bne L_sp_2048_add_32_word_%=\n\t"
  5689. "mov %[r], r3\n\t"
  5690. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  5691. :
  5692. : "memory", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r3", "r12", "cc"
  5693. );
  5694. return (uint32_t)(size_t)r;
  5695. }
  5696. #endif /* WOLFSSL_SP_SMALL */
  5697. #ifdef WOLFSSL_SP_SMALL
  5698. /* Sub b from a into a. (a -= b)
  5699. *
  5700. * a A single precision integer.
  5701. * b A single precision integer.
  5702. */
  5703. static sp_digit sp_2048_sub_in_place_32(sp_digit* a_p, const sp_digit* b_p)
  5704. {
  5705. register sp_digit* a asm ("r0") = (sp_digit*)a_p;
  5706. register const sp_digit* b asm ("r1") = (const sp_digit*)b_p;
  5707. __asm__ __volatile__ (
  5708. "mov r12, #0\n\t"
  5709. "add lr, %[a], #0x80\n\t"
  5710. "\n"
  5711. "L_sp_2048_sub_in_pkace_32_word_%=: \n\t"
  5712. "rsbs r12, r12, #0\n\t"
  5713. "ldm %[a], {r2, r3, r4, r5}\n\t"
  5714. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  5715. "sbcs r2, r2, r6\n\t"
  5716. "sbcs r3, r3, r7\n\t"
  5717. "sbcs r4, r4, r8\n\t"
  5718. "sbcs r5, r5, r9\n\t"
  5719. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  5720. "sbc r12, r12, r12\n\t"
  5721. "cmp %[a], lr\n\t"
  5722. "bne L_sp_2048_sub_in_pkace_32_word_%=\n\t"
  5723. "mov %[a], r12\n\t"
  5724. : [a] "+r" (a), [b] "+r" (b)
  5725. :
  5726. : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r12", "lr", "cc"
  5727. );
  5728. return (uint32_t)(size_t)a;
  5729. }
  5730. #endif /* WOLFSSL_SP_SMALL */
  5731. #ifdef WOLFSSL_SP_SMALL
  5732. /* Multiply a and b into r. (r = a * b)
  5733. *
  5734. * r A single precision integer.
  5735. * a A single precision integer.
  5736. * b A single precision integer.
  5737. */
  5738. static void sp_2048_mul_32(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p)
  5739. {
  5740. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  5741. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  5742. register const sp_digit* b asm ("r2") = (const sp_digit*)b_p;
  5743. __asm__ __volatile__ (
  5744. "sub sp, sp, #0x100\n\t"
  5745. "ldr lr, [%[a]]\n\t"
  5746. "ldr r11, [%[b]]\n\t"
  5747. "umull r8, r6, lr, r11\n\t"
  5748. "str r8, [sp]\n\t"
  5749. "mov r7, #0\n\t"
  5750. "mov r8, #0\n\t"
  5751. "mov r5, #4\n\t"
  5752. "\n"
  5753. "L_sp_2048_mul_32_outer_%=: \n\t"
  5754. "subs r3, r5, #0x7c\n\t"
  5755. "it cc\n\t"
  5756. "movcc r3, #0\n\t"
  5757. "sub r4, r5, r3\n\t"
  5758. "\n"
  5759. "L_sp_2048_mul_32_inner_%=: \n\t"
  5760. "ldr lr, [%[a], r3]\n\t"
  5761. "ldr r11, [%[b], r4]\n\t"
  5762. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  5763. "lsl r9, lr, #16\n\t"
  5764. "lsl r10, r11, #16\n\t"
  5765. "lsr r9, r9, #16\n\t"
  5766. "lsr r10, r10, #16\n\t"
  5767. "mul r10, r9, r10\n\t"
  5768. "adds r6, r6, r10\n\t"
  5769. "adcs r7, r7, #0\n\t"
  5770. "adc r8, r8, #0\n\t"
  5771. "lsr r10, r11, #16\n\t"
  5772. "mul r9, r10, r9\n\t"
  5773. "lsr r10, r9, #16\n\t"
  5774. "lsl r9, r9, #16\n\t"
  5775. "adds r6, r6, r9\n\t"
  5776. "adcs r7, r7, r10\n\t"
  5777. "adc r8, r8, #0\n\t"
  5778. "lsr r9, lr, #16\n\t"
  5779. "lsr r10, r11, #16\n\t"
  5780. "mul r10, r9, r10\n\t"
  5781. "adds r7, r7, r10\n\t"
  5782. "adc r8, r8, #0\n\t"
  5783. "lsl r10, r11, #16\n\t"
  5784. "lsr r10, r10, #16\n\t"
  5785. "mul r9, r10, r9\n\t"
  5786. "lsr r10, r9, #16\n\t"
  5787. "lsl r9, r9, #16\n\t"
  5788. "adds r6, r6, r9\n\t"
  5789. "adcs r7, r7, r10\n\t"
  5790. "adc r8, r8, #0\n\t"
  5791. #else
  5792. "umull r9, r10, lr, r11\n\t"
  5793. "adds r6, r6, r9\n\t"
  5794. "adcs r7, r7, r10\n\t"
  5795. "adc r8, r8, #0\n\t"
  5796. #endif
  5797. "ldr lr, [%[a], r4]\n\t"
  5798. "ldr r11, [%[b], r3]\n\t"
  5799. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  5800. "lsl r9, lr, #16\n\t"
  5801. "lsl r10, r11, #16\n\t"
  5802. "lsr r9, r9, #16\n\t"
  5803. "lsr r10, r10, #16\n\t"
  5804. "mul r10, r9, r10\n\t"
  5805. "adds r6, r6, r10\n\t"
  5806. "adcs r7, r7, #0\n\t"
  5807. "adc r8, r8, #0\n\t"
  5808. "lsr r10, r11, #16\n\t"
  5809. "mul r9, r10, r9\n\t"
  5810. "lsr r10, r9, #16\n\t"
  5811. "lsl r9, r9, #16\n\t"
  5812. "adds r6, r6, r9\n\t"
  5813. "adcs r7, r7, r10\n\t"
  5814. "adc r8, r8, #0\n\t"
  5815. "lsr r9, lr, #16\n\t"
  5816. "lsr r10, r11, #16\n\t"
  5817. "mul r10, r9, r10\n\t"
  5818. "adds r7, r7, r10\n\t"
  5819. "adc r8, r8, #0\n\t"
  5820. "lsl r10, r11, #16\n\t"
  5821. "lsr r10, r10, #16\n\t"
  5822. "mul r9, r10, r9\n\t"
  5823. "lsr r10, r9, #16\n\t"
  5824. "lsl r9, r9, #16\n\t"
  5825. "adds r6, r6, r9\n\t"
  5826. "adcs r7, r7, r10\n\t"
  5827. "adc r8, r8, #0\n\t"
  5828. #else
  5829. "umull r9, r10, lr, r11\n\t"
  5830. "adds r6, r6, r9\n\t"
  5831. "adcs r7, r7, r10\n\t"
  5832. "adc r8, r8, #0\n\t"
  5833. #endif
  5834. "add r3, r3, #4\n\t"
  5835. "sub r4, r4, #4\n\t"
  5836. "cmp r3, r4\n\t"
  5837. "bgt L_sp_2048_mul_32_inner_done_%=\n\t"
  5838. "blt L_sp_2048_mul_32_inner_%=\n\t"
  5839. "ldr lr, [%[a], r3]\n\t"
  5840. "ldr r11, [%[b], r3]\n\t"
  5841. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  5842. "lsl r9, lr, #16\n\t"
  5843. "lsl r10, r11, #16\n\t"
  5844. "lsr r9, r9, #16\n\t"
  5845. "lsr r10, r10, #16\n\t"
  5846. "mul r10, r9, r10\n\t"
  5847. "adds r6, r6, r10\n\t"
  5848. "adcs r7, r7, #0\n\t"
  5849. "adc r8, r8, #0\n\t"
  5850. "lsr r10, r11, #16\n\t"
  5851. "mul r9, r10, r9\n\t"
  5852. "lsr r10, r9, #16\n\t"
  5853. "lsl r9, r9, #16\n\t"
  5854. "adds r6, r6, r9\n\t"
  5855. "adcs r7, r7, r10\n\t"
  5856. "adc r8, r8, #0\n\t"
  5857. "lsr r9, lr, #16\n\t"
  5858. "lsr r10, r11, #16\n\t"
  5859. "mul r10, r9, r10\n\t"
  5860. "adds r7, r7, r10\n\t"
  5861. "adc r8, r8, #0\n\t"
  5862. "lsl r10, r11, #16\n\t"
  5863. "lsr r10, r10, #16\n\t"
  5864. "mul r9, r10, r9\n\t"
  5865. "lsr r10, r9, #16\n\t"
  5866. "lsl r9, r9, #16\n\t"
  5867. "adds r6, r6, r9\n\t"
  5868. "adcs r7, r7, r10\n\t"
  5869. "adc r8, r8, #0\n\t"
  5870. #else
  5871. "umull r9, r10, lr, r11\n\t"
  5872. "adds r6, r6, r9\n\t"
  5873. "adcs r7, r7, r10\n\t"
  5874. "adc r8, r8, #0\n\t"
  5875. #endif
  5876. "\n"
  5877. "L_sp_2048_mul_32_inner_done_%=: \n\t"
  5878. "str r6, [sp, r5]\n\t"
  5879. "mov r6, r7\n\t"
  5880. "mov r7, r8\n\t"
  5881. "mov r8, #0\n\t"
  5882. "add r5, r5, #4\n\t"
  5883. "cmp r5, #0xf4\n\t"
  5884. "ble L_sp_2048_mul_32_outer_%=\n\t"
  5885. "ldr lr, [%[a], #124]\n\t"
  5886. "ldr r11, [%[b], #124]\n\t"
  5887. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  5888. "lsl r9, lr, #16\n\t"
  5889. "lsl r10, r11, #16\n\t"
  5890. "lsr r9, r9, #16\n\t"
  5891. "lsr r10, r10, #16\n\t"
  5892. "mul r10, r9, r10\n\t"
  5893. "adds r6, r6, r10\n\t"
  5894. "adc r7, r7, #0\n\t"
  5895. "lsr r10, r11, #16\n\t"
  5896. "mul r9, r10, r9\n\t"
  5897. "lsr r10, r9, #16\n\t"
  5898. "lsl r9, r9, #16\n\t"
  5899. "adds r6, r6, r9\n\t"
  5900. "adc r7, r7, r10\n\t"
  5901. "lsr r9, lr, #16\n\t"
  5902. "lsr r10, r11, #16\n\t"
  5903. "mul r10, r9, r10\n\t"
  5904. "add r7, r7, r10\n\t"
  5905. "lsl r10, r11, #16\n\t"
  5906. "lsr r10, r10, #16\n\t"
  5907. "mul r9, r10, r9\n\t"
  5908. "lsr r10, r9, #16\n\t"
  5909. "lsl r9, r9, #16\n\t"
  5910. "adds r6, r6, r9\n\t"
  5911. "adc r7, r7, r10\n\t"
  5912. #else
  5913. "umlal r6, r7, lr, r11\n\t"
  5914. #endif
  5915. "str r6, [sp, r5]\n\t"
  5916. "add r5, r5, #4\n\t"
  5917. "str r7, [sp, r5]\n\t"
  5918. "\n"
  5919. "L_sp_2048_mul_32_store_%=: \n\t"
  5920. "ldm sp!, {r3, r4, r6, r7, r8, r9, r10, r11}\n\t"
  5921. "stm %[r]!, {r3, r4, r6, r7, r8, r9, r10, r11}\n\t"
  5922. "subs r5, r5, #32\n\t"
  5923. "bgt L_sp_2048_mul_32_store_%=\n\t"
  5924. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  5925. :
  5926. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "lr", "r11", "cc"
  5927. );
  5928. }
  5929. /* Square a and put result in r. (r = a * a)
  5930. *
  5931. * r A single precision integer.
  5932. * a A single precision integer.
  5933. */
  5934. static void sp_2048_sqr_32(sp_digit* r_p, const sp_digit* a_p)
  5935. {
  5936. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  5937. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  5938. __asm__ __volatile__ (
  5939. "sub sp, sp, #0x100\n\t"
  5940. "ldr lr, [%[a]]\n\t"
  5941. "umull r8, r6, lr, lr\n\t"
  5942. "str r8, [sp]\n\t"
  5943. "mov r7, #0\n\t"
  5944. "mov r8, #0\n\t"
  5945. "mov r5, #4\n\t"
  5946. "\n"
  5947. "L_sp_2048_sqr_32_outer_%=: \n\t"
  5948. "subs r3, r5, #0x7c\n\t"
  5949. "it cc\n\t"
  5950. "movcc r3, #0\n\t"
  5951. "sub r4, r5, r3\n\t"
  5952. "\n"
  5953. "L_sp_2048_sqr_32_inner_%=: \n\t"
  5954. "ldr lr, [%[a], r3]\n\t"
  5955. "ldr r11, [%[a], r4]\n\t"
  5956. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  5957. "lsl r9, lr, #16\n\t"
  5958. "lsl r10, r11, #16\n\t"
  5959. "lsr r9, r9, #16\n\t"
  5960. "lsr r10, r10, #16\n\t"
  5961. "mul r10, r9, r10\n\t"
  5962. "adds r6, r6, r10\n\t"
  5963. "adcs r7, r7, #0\n\t"
  5964. "adc r8, r8, #0\n\t"
  5965. "adds r6, r6, r10\n\t"
  5966. "adcs r7, r7, #0\n\t"
  5967. "adc r8, r8, #0\n\t"
  5968. "lsr r10, r11, #16\n\t"
  5969. "mul r9, r10, r9\n\t"
  5970. "lsr r10, r9, #16\n\t"
  5971. "lsl r9, r9, #16\n\t"
  5972. "adds r6, r6, r9\n\t"
  5973. "adcs r7, r7, r10\n\t"
  5974. "adc r8, r8, #0\n\t"
  5975. "adds r6, r6, r9\n\t"
  5976. "adcs r7, r7, r10\n\t"
  5977. "adc r8, r8, #0\n\t"
  5978. "lsr r9, lr, #16\n\t"
  5979. "lsr r10, r11, #16\n\t"
  5980. "mul r10, r9, r10\n\t"
  5981. "adds r7, r7, r10\n\t"
  5982. "adc r8, r8, #0\n\t"
  5983. "adds r7, r7, r10\n\t"
  5984. "adc r8, r8, #0\n\t"
  5985. "lsl r10, r11, #16\n\t"
  5986. "lsr r10, r10, #16\n\t"
  5987. "mul r9, r10, r9\n\t"
  5988. "lsr r10, r9, #16\n\t"
  5989. "lsl r9, r9, #16\n\t"
  5990. "adds r6, r6, r9\n\t"
  5991. "adcs r7, r7, r10\n\t"
  5992. "adc r8, r8, #0\n\t"
  5993. "adds r6, r6, r9\n\t"
  5994. "adcs r7, r7, r10\n\t"
  5995. "adc r8, r8, #0\n\t"
  5996. #else
  5997. "umull r9, r10, lr, r11\n\t"
  5998. "adds r6, r6, r9\n\t"
  5999. "adcs r7, r7, r10\n\t"
  6000. "adc r8, r8, #0\n\t"
  6001. "adds r6, r6, r9\n\t"
  6002. "adcs r7, r7, r10\n\t"
  6003. "adc r8, r8, #0\n\t"
  6004. #endif
  6005. "add r3, r3, #4\n\t"
  6006. "sub r4, r4, #4\n\t"
  6007. "cmp r3, r4\n\t"
  6008. "bgt L_sp_2048_sqr_32_inner_done_%=\n\t"
  6009. "blt L_sp_2048_sqr_32_inner_%=\n\t"
  6010. "ldr lr, [%[a], r3]\n\t"
  6011. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  6012. "lsl r9, lr, #16\n\t"
  6013. "lsr r10, lr, #16\n\t"
  6014. "lsr r9, r9, #16\n\t"
  6015. "mov r11, r9\n\t"
  6016. "mul r9, r11, r9\n\t"
  6017. "mov r11, r10\n\t"
  6018. "mul r10, r11, r10\n\t"
  6019. "adds r6, r6, r9\n\t"
  6020. "adcs r7, r7, r10\n\t"
  6021. "adc r8, r8, #0\n\t"
  6022. "lsr r10, lr, #16\n\t"
  6023. "lsl r9, lr, #16\n\t"
  6024. "lsr r9, r9, #16\n\t"
  6025. "mul r9, r10, r9\n\t"
  6026. "lsr r10, r9, #15\n\t"
  6027. "lsl r9, r9, #17\n\t"
  6028. "adds r6, r6, r9\n\t"
  6029. "adcs r7, r7, r10\n\t"
  6030. "adc r8, r8, #0\n\t"
  6031. #else
  6032. "umull r9, r10, lr, lr\n\t"
  6033. "adds r6, r6, r9\n\t"
  6034. "adcs r7, r7, r10\n\t"
  6035. "adc r8, r8, #0\n\t"
  6036. #endif
  6037. "\n"
  6038. "L_sp_2048_sqr_32_inner_done_%=: \n\t"
  6039. "str r6, [sp, r5]\n\t"
  6040. "mov r6, r7\n\t"
  6041. "mov r7, r8\n\t"
  6042. "mov r8, #0\n\t"
  6043. "add r5, r5, #4\n\t"
  6044. "cmp r5, #0xf4\n\t"
  6045. "ble L_sp_2048_sqr_32_outer_%=\n\t"
  6046. "ldr lr, [%[a], #124]\n\t"
  6047. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  6048. "lsl r9, lr, #16\n\t"
  6049. "lsr r10, lr, #16\n\t"
  6050. "lsr r9, r9, #16\n\t"
  6051. "mov r11, r9\n\t"
  6052. "mul r9, r11, r9\n\t"
  6053. "mov r11, r10\n\t"
  6054. "mul r10, r11, r10\n\t"
  6055. "adds r6, r6, r9\n\t"
  6056. "adc r7, r7, r10\n\t"
  6057. "lsr r10, lr, #16\n\t"
  6058. "lsl r9, lr, #16\n\t"
  6059. "lsr r9, r9, #16\n\t"
  6060. "mul r9, r10, r9\n\t"
  6061. "lsr r10, r9, #15\n\t"
  6062. "lsl r9, r9, #17\n\t"
  6063. "adds r6, r6, r9\n\t"
  6064. "adc r7, r7, r10\n\t"
  6065. #else
  6066. "umull r9, r10, lr, lr\n\t"
  6067. "adds r6, r6, r9\n\t"
  6068. "adc r7, r7, r10\n\t"
  6069. #endif
  6070. "str r6, [sp, r5]\n\t"
  6071. "add r5, r5, #4\n\t"
  6072. "str r7, [sp, r5]\n\t"
  6073. "\n"
  6074. "L_sp_2048_sqr_32_store_%=: \n\t"
  6075. "ldm sp!, {r3, r4, r6, r7, r8, r9, r10, r11}\n\t"
  6076. "stm %[r]!, {r3, r4, r6, r7, r8, r9, r10, r11}\n\t"
  6077. "subs r5, r5, #32\n\t"
  6078. "bgt L_sp_2048_sqr_32_store_%=\n\t"
  6079. : [r] "+r" (r), [a] "+r" (a)
  6080. :
  6081. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "lr", "r11", "cc"
  6082. );
  6083. }
  6084. #endif /* WOLFSSL_SP_SMALL */
  6085. #endif /* (WOLFSSL_HAVE_SP_RSA & !WOLFSSL_RSA_PUBLIC_ONLY) | WOLFSSL_HAVE_SP_DH */
  6086. /* Calculate the bottom digit of -1/a mod 2^n.
  6087. *
  6088. * a A single precision number.
  6089. * rho Bottom word of inverse.
  6090. */
  6091. static void sp_2048_mont_setup(const sp_digit* a, sp_digit* rho)
  6092. {
  6093. sp_digit x;
  6094. sp_digit b;
  6095. b = a[0];
  6096. x = (((b + 2) & 4) << 1) + b; /* here x*a==1 mod 2**4 */
  6097. x *= 2 - b * x; /* here x*a==1 mod 2**8 */
  6098. x *= 2 - b * x; /* here x*a==1 mod 2**16 */
  6099. x *= 2 - b * x; /* here x*a==1 mod 2**32 */
  6100. /* rho = -1/m mod b */
  6101. *rho = (sp_digit)0 - x;
  6102. }
  6103. #ifdef WOLFSSL_SP_SMALL
  6104. /* Mul a by digit b into r. (r = a * b)
  6105. *
  6106. * r A single precision integer.
  6107. * a A single precision integer.
  6108. * b A single precision digit.
  6109. */
  6110. static void sp_2048_mul_d_64(sp_digit* r_p, const sp_digit* a_p, sp_digit b_p)
  6111. {
  6112. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  6113. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  6114. register sp_digit b asm ("r2") = (sp_digit)b_p;
  6115. __asm__ __volatile__ (
  6116. /* A[0] * B */
  6117. "ldr r8, [%[a]]\n\t"
  6118. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  6119. "lsl r6, %[b], #16\n\t"
  6120. "lsl r5, r8, #16\n\t"
  6121. "lsr r6, r6, #16\n\t"
  6122. "lsr r5, r5, #16\n\t"
  6123. "mul r5, r6, r5\n\t"
  6124. "lsr r7, r8, #16\n\t"
  6125. "mul r6, r7, r6\n\t"
  6126. "lsr r3, r6, #16\n\t"
  6127. "lsl r6, r6, #16\n\t"
  6128. "adds r5, r5, r6\n\t"
  6129. "adc r3, r3, #0\n\t"
  6130. "lsr r6, %[b], #16\n\t"
  6131. "mul r7, r6, r7\n\t"
  6132. "add r3, r3, r7\n\t"
  6133. "lsl r7, r8, #16\n\t"
  6134. "lsr r7, r7, #16\n\t"
  6135. "mul r6, r7, r6\n\t"
  6136. "lsr r7, r6, #16\n\t"
  6137. "lsl r6, r6, #16\n\t"
  6138. "adds r5, r5, r6\n\t"
  6139. "adc r3, r3, r7\n\t"
  6140. #else
  6141. "umull r5, r3, %[b], r8\n\t"
  6142. #endif
  6143. "mov r4, #0\n\t"
  6144. "str r5, [%[r]]\n\t"
  6145. "mov r5, #0\n\t"
  6146. "mov r9, #4\n\t"
  6147. "\n"
  6148. "L_sp_2048_mul_d_64_word_%=: \n\t"
  6149. /* A[i] * B */
  6150. "ldr r8, [%[a], r9]\n\t"
  6151. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  6152. "lsl r6, %[b], #16\n\t"
  6153. "lsl r7, r8, #16\n\t"
  6154. "lsr r6, r6, #16\n\t"
  6155. "lsr r7, r7, #16\n\t"
  6156. "mul r7, r6, r7\n\t"
  6157. "adds r3, r3, r7\n\t"
  6158. "adcs r4, r4, #0\n\t"
  6159. "adc r5, r5, #0\n\t"
  6160. "lsr r7, r8, #16\n\t"
  6161. "mul r6, r7, r6\n\t"
  6162. "lsr r7, r6, #16\n\t"
  6163. "lsl r6, r6, #16\n\t"
  6164. "adds r3, r3, r6\n\t"
  6165. "adcs r4, r4, r7\n\t"
  6166. "adc r5, r5, #0\n\t"
  6167. "lsr r6, %[b], #16\n\t"
  6168. "lsr r7, r8, #16\n\t"
  6169. "mul r7, r6, r7\n\t"
  6170. "adds r4, r4, r7\n\t"
  6171. "adc r5, r5, #0\n\t"
  6172. "lsl r7, r8, #16\n\t"
  6173. "lsr r7, r7, #16\n\t"
  6174. "mul r6, r7, r6\n\t"
  6175. "lsr r7, r6, #16\n\t"
  6176. "lsl r6, r6, #16\n\t"
  6177. "adds r3, r3, r6\n\t"
  6178. "adcs r4, r4, r7\n\t"
  6179. "adc r5, r5, #0\n\t"
  6180. #else
  6181. "umull r6, r7, %[b], r8\n\t"
  6182. "adds r3, r3, r6\n\t"
  6183. "adcs r4, r4, r7\n\t"
  6184. "adc r5, r5, #0\n\t"
  6185. #endif
  6186. "str r3, [%[r], r9]\n\t"
  6187. "mov r3, r4\n\t"
  6188. "mov r4, r5\n\t"
  6189. "mov r5, #0\n\t"
  6190. "add r9, r9, #4\n\t"
  6191. "cmp r9, #0x100\n\t"
  6192. "blt L_sp_2048_mul_d_64_word_%=\n\t"
  6193. "str r3, [%[r], #256]\n\t"
  6194. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  6195. :
  6196. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "cc"
  6197. );
  6198. }
  6199. #else
  6200. /* Mul a by digit b into r. (r = a * b)
  6201. *
  6202. * r A single precision integer.
  6203. * a A single precision integer.
  6204. * b A single precision digit.
  6205. */
  6206. static void sp_2048_mul_d_64(sp_digit* r_p, const sp_digit* a_p, sp_digit b_p)
  6207. {
  6208. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  6209. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  6210. register sp_digit b asm ("r2") = (sp_digit)b_p;
  6211. __asm__ __volatile__ (
  6212. /* A[0] * B */
  6213. "ldm %[a]!, {r8}\n\t"
  6214. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  6215. "lsl r6, %[b], #16\n\t"
  6216. "lsl r3, r8, #16\n\t"
  6217. "lsr r6, r6, #16\n\t"
  6218. "lsr r3, r3, #16\n\t"
  6219. "mul r3, r6, r3\n\t"
  6220. "lsr r7, r8, #16\n\t"
  6221. "mul r6, r7, r6\n\t"
  6222. "lsr r4, r6, #16\n\t"
  6223. "lsl r6, r6, #16\n\t"
  6224. "adds r3, r3, r6\n\t"
  6225. "adc r4, r4, #0\n\t"
  6226. "lsr r6, %[b], #16\n\t"
  6227. "mul r7, r6, r7\n\t"
  6228. "add r4, r4, r7\n\t"
  6229. "lsl r7, r8, #16\n\t"
  6230. "lsr r7, r7, #16\n\t"
  6231. "mul r6, r7, r6\n\t"
  6232. "lsr r7, r6, #16\n\t"
  6233. "lsl r6, r6, #16\n\t"
  6234. "adds r3, r3, r6\n\t"
  6235. "adc r4, r4, r7\n\t"
  6236. #else
  6237. "umull r3, r4, %[b], r8\n\t"
  6238. #endif
  6239. "stm %[r]!, {r3}\n\t"
  6240. "mov r5, #0\n\t"
  6241. /* A[1] * B */
  6242. "ldm %[a]!, {r8}\n\t"
  6243. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  6244. "lsl r6, %[b], #16\n\t"
  6245. "lsl r7, r8, #16\n\t"
  6246. "lsr r6, r6, #16\n\t"
  6247. "lsr r7, r7, #16\n\t"
  6248. "mul r7, r6, r7\n\t"
  6249. "adds r4, r4, r7\n\t"
  6250. "adc r5, r5, #0\n\t"
  6251. "lsr r7, r8, #16\n\t"
  6252. "mul r6, r7, r6\n\t"
  6253. "lsr r7, r6, #16\n\t"
  6254. "lsl r6, r6, #16\n\t"
  6255. "adds r4, r4, r6\n\t"
  6256. "adc r5, r5, r7\n\t"
  6257. "lsr r6, %[b], #16\n\t"
  6258. "lsr r7, r8, #16\n\t"
  6259. "mul r7, r6, r7\n\t"
  6260. "add r5, r5, r7\n\t"
  6261. "lsl r7, r8, #16\n\t"
  6262. "lsr r7, r7, #16\n\t"
  6263. "mul r6, r7, r6\n\t"
  6264. "lsr r7, r6, #16\n\t"
  6265. "lsl r6, r6, #16\n\t"
  6266. "adds r4, r4, r6\n\t"
  6267. "adc r5, r5, r7\n\t"
  6268. #else
  6269. "umlal r4, r5, %[b], r8\n\t"
  6270. #endif
  6271. "stm %[r]!, {r4}\n\t"
  6272. "mov r3, #0\n\t"
  6273. /* A[2] * B */
  6274. "ldm %[a]!, {r8}\n\t"
  6275. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  6276. "lsl r6, %[b], #16\n\t"
  6277. "lsl r7, r8, #16\n\t"
  6278. "lsr r6, r6, #16\n\t"
  6279. "lsr r7, r7, #16\n\t"
  6280. "mul r7, r6, r7\n\t"
  6281. "adds r5, r5, r7\n\t"
  6282. "adc r3, r3, #0\n\t"
  6283. "lsr r7, r8, #16\n\t"
  6284. "mul r6, r7, r6\n\t"
  6285. "lsr r7, r6, #16\n\t"
  6286. "lsl r6, r6, #16\n\t"
  6287. "adds r5, r5, r6\n\t"
  6288. "adc r3, r3, r7\n\t"
  6289. "lsr r6, %[b], #16\n\t"
  6290. "lsr r7, r8, #16\n\t"
  6291. "mul r7, r6, r7\n\t"
  6292. "add r3, r3, r7\n\t"
  6293. "lsl r7, r8, #16\n\t"
  6294. "lsr r7, r7, #16\n\t"
  6295. "mul r6, r7, r6\n\t"
  6296. "lsr r7, r6, #16\n\t"
  6297. "lsl r6, r6, #16\n\t"
  6298. "adds r5, r5, r6\n\t"
  6299. "adc r3, r3, r7\n\t"
  6300. #else
  6301. "umlal r5, r3, %[b], r8\n\t"
  6302. #endif
  6303. "stm %[r]!, {r5}\n\t"
  6304. "mov r4, #0\n\t"
  6305. /* A[3] * B */
  6306. "ldm %[a]!, {r8}\n\t"
  6307. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  6308. "lsl r6, %[b], #16\n\t"
  6309. "lsl r7, r8, #16\n\t"
  6310. "lsr r6, r6, #16\n\t"
  6311. "lsr r7, r7, #16\n\t"
  6312. "mul r7, r6, r7\n\t"
  6313. "adds r3, r3, r7\n\t"
  6314. "adc r4, r4, #0\n\t"
  6315. "lsr r7, r8, #16\n\t"
  6316. "mul r6, r7, r6\n\t"
  6317. "lsr r7, r6, #16\n\t"
  6318. "lsl r6, r6, #16\n\t"
  6319. "adds r3, r3, r6\n\t"
  6320. "adc r4, r4, r7\n\t"
  6321. "lsr r6, %[b], #16\n\t"
  6322. "lsr r7, r8, #16\n\t"
  6323. "mul r7, r6, r7\n\t"
  6324. "add r4, r4, r7\n\t"
  6325. "lsl r7, r8, #16\n\t"
  6326. "lsr r7, r7, #16\n\t"
  6327. "mul r6, r7, r6\n\t"
  6328. "lsr r7, r6, #16\n\t"
  6329. "lsl r6, r6, #16\n\t"
  6330. "adds r3, r3, r6\n\t"
  6331. "adc r4, r4, r7\n\t"
  6332. #else
  6333. "umlal r3, r4, %[b], r8\n\t"
  6334. #endif
  6335. "stm %[r]!, {r3}\n\t"
  6336. "mov r5, #0\n\t"
  6337. /* A[4] * B */
  6338. "ldm %[a]!, {r8}\n\t"
  6339. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  6340. "lsl r6, %[b], #16\n\t"
  6341. "lsl r7, r8, #16\n\t"
  6342. "lsr r6, r6, #16\n\t"
  6343. "lsr r7, r7, #16\n\t"
  6344. "mul r7, r6, r7\n\t"
  6345. "adds r4, r4, r7\n\t"
  6346. "adc r5, r5, #0\n\t"
  6347. "lsr r7, r8, #16\n\t"
  6348. "mul r6, r7, r6\n\t"
  6349. "lsr r7, r6, #16\n\t"
  6350. "lsl r6, r6, #16\n\t"
  6351. "adds r4, r4, r6\n\t"
  6352. "adc r5, r5, r7\n\t"
  6353. "lsr r6, %[b], #16\n\t"
  6354. "lsr r7, r8, #16\n\t"
  6355. "mul r7, r6, r7\n\t"
  6356. "add r5, r5, r7\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 r4, r4, r6\n\t"
  6363. "adc r5, r5, r7\n\t"
  6364. #else
  6365. "umlal r4, r5, %[b], r8\n\t"
  6366. #endif
  6367. "stm %[r]!, {r4}\n\t"
  6368. "mov r3, #0\n\t"
  6369. /* A[5] * B */
  6370. "ldm %[a]!, {r8}\n\t"
  6371. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  6372. "lsl r6, %[b], #16\n\t"
  6373. "lsl r7, r8, #16\n\t"
  6374. "lsr r6, r6, #16\n\t"
  6375. "lsr r7, r7, #16\n\t"
  6376. "mul r7, r6, r7\n\t"
  6377. "adds r5, r5, r7\n\t"
  6378. "adc r3, r3, #0\n\t"
  6379. "lsr r7, r8, #16\n\t"
  6380. "mul r6, r7, r6\n\t"
  6381. "lsr r7, r6, #16\n\t"
  6382. "lsl r6, r6, #16\n\t"
  6383. "adds r5, r5, r6\n\t"
  6384. "adc r3, r3, r7\n\t"
  6385. "lsr r6, %[b], #16\n\t"
  6386. "lsr r7, r8, #16\n\t"
  6387. "mul r7, r6, r7\n\t"
  6388. "add r3, r3, r7\n\t"
  6389. "lsl r7, r8, #16\n\t"
  6390. "lsr r7, r7, #16\n\t"
  6391. "mul r6, r7, r6\n\t"
  6392. "lsr r7, r6, #16\n\t"
  6393. "lsl r6, r6, #16\n\t"
  6394. "adds r5, r5, r6\n\t"
  6395. "adc r3, r3, r7\n\t"
  6396. #else
  6397. "umlal r5, r3, %[b], r8\n\t"
  6398. #endif
  6399. "stm %[r]!, {r5}\n\t"
  6400. "mov r4, #0\n\t"
  6401. /* A[6] * B */
  6402. "ldm %[a]!, {r8}\n\t"
  6403. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  6404. "lsl r6, %[b], #16\n\t"
  6405. "lsl r7, r8, #16\n\t"
  6406. "lsr r6, r6, #16\n\t"
  6407. "lsr r7, r7, #16\n\t"
  6408. "mul r7, r6, r7\n\t"
  6409. "adds r3, r3, r7\n\t"
  6410. "adc r4, r4, #0\n\t"
  6411. "lsr r7, r8, #16\n\t"
  6412. "mul r6, r7, r6\n\t"
  6413. "lsr r7, r6, #16\n\t"
  6414. "lsl r6, r6, #16\n\t"
  6415. "adds r3, r3, r6\n\t"
  6416. "adc r4, r4, r7\n\t"
  6417. "lsr r6, %[b], #16\n\t"
  6418. "lsr r7, r8, #16\n\t"
  6419. "mul r7, r6, r7\n\t"
  6420. "add r4, r4, r7\n\t"
  6421. "lsl r7, r8, #16\n\t"
  6422. "lsr r7, r7, #16\n\t"
  6423. "mul r6, r7, r6\n\t"
  6424. "lsr r7, r6, #16\n\t"
  6425. "lsl r6, r6, #16\n\t"
  6426. "adds r3, r3, r6\n\t"
  6427. "adc r4, r4, r7\n\t"
  6428. #else
  6429. "umlal r3, r4, %[b], r8\n\t"
  6430. #endif
  6431. "stm %[r]!, {r3}\n\t"
  6432. "mov r5, #0\n\t"
  6433. /* A[7] * B */
  6434. "ldm %[a]!, {r8}\n\t"
  6435. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  6436. "lsl r6, %[b], #16\n\t"
  6437. "lsl r7, r8, #16\n\t"
  6438. "lsr r6, r6, #16\n\t"
  6439. "lsr r7, r7, #16\n\t"
  6440. "mul r7, r6, r7\n\t"
  6441. "adds r4, r4, r7\n\t"
  6442. "adc r5, r5, #0\n\t"
  6443. "lsr r7, r8, #16\n\t"
  6444. "mul r6, r7, r6\n\t"
  6445. "lsr r7, r6, #16\n\t"
  6446. "lsl r6, r6, #16\n\t"
  6447. "adds r4, r4, r6\n\t"
  6448. "adc r5, r5, r7\n\t"
  6449. "lsr r6, %[b], #16\n\t"
  6450. "lsr r7, r8, #16\n\t"
  6451. "mul r7, r6, r7\n\t"
  6452. "add r5, r5, r7\n\t"
  6453. "lsl r7, r8, #16\n\t"
  6454. "lsr r7, r7, #16\n\t"
  6455. "mul r6, r7, r6\n\t"
  6456. "lsr r7, r6, #16\n\t"
  6457. "lsl r6, r6, #16\n\t"
  6458. "adds r4, r4, r6\n\t"
  6459. "adc r5, r5, r7\n\t"
  6460. #else
  6461. "umlal r4, r5, %[b], r8\n\t"
  6462. #endif
  6463. "stm %[r]!, {r4}\n\t"
  6464. "mov r3, #0\n\t"
  6465. /* A[8] * B */
  6466. "ldm %[a]!, {r8}\n\t"
  6467. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  6468. "lsl r6, %[b], #16\n\t"
  6469. "lsl r7, r8, #16\n\t"
  6470. "lsr r6, r6, #16\n\t"
  6471. "lsr r7, r7, #16\n\t"
  6472. "mul r7, r6, r7\n\t"
  6473. "adds r5, r5, r7\n\t"
  6474. "adc r3, r3, #0\n\t"
  6475. "lsr r7, r8, #16\n\t"
  6476. "mul r6, r7, r6\n\t"
  6477. "lsr r7, r6, #16\n\t"
  6478. "lsl r6, r6, #16\n\t"
  6479. "adds r5, r5, r6\n\t"
  6480. "adc r3, r3, r7\n\t"
  6481. "lsr r6, %[b], #16\n\t"
  6482. "lsr r7, r8, #16\n\t"
  6483. "mul r7, r6, r7\n\t"
  6484. "add r3, r3, r7\n\t"
  6485. "lsl r7, r8, #16\n\t"
  6486. "lsr r7, r7, #16\n\t"
  6487. "mul r6, r7, r6\n\t"
  6488. "lsr r7, r6, #16\n\t"
  6489. "lsl r6, r6, #16\n\t"
  6490. "adds r5, r5, r6\n\t"
  6491. "adc r3, r3, r7\n\t"
  6492. #else
  6493. "umlal r5, r3, %[b], r8\n\t"
  6494. #endif
  6495. "stm %[r]!, {r5}\n\t"
  6496. "mov r4, #0\n\t"
  6497. /* A[9] * B */
  6498. "ldm %[a]!, {r8}\n\t"
  6499. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  6500. "lsl r6, %[b], #16\n\t"
  6501. "lsl r7, r8, #16\n\t"
  6502. "lsr r6, r6, #16\n\t"
  6503. "lsr r7, r7, #16\n\t"
  6504. "mul r7, r6, r7\n\t"
  6505. "adds r3, r3, r7\n\t"
  6506. "adc r4, r4, #0\n\t"
  6507. "lsr r7, r8, #16\n\t"
  6508. "mul r6, r7, r6\n\t"
  6509. "lsr r7, r6, #16\n\t"
  6510. "lsl r6, r6, #16\n\t"
  6511. "adds r3, r3, r6\n\t"
  6512. "adc r4, r4, r7\n\t"
  6513. "lsr r6, %[b], #16\n\t"
  6514. "lsr r7, r8, #16\n\t"
  6515. "mul r7, r6, r7\n\t"
  6516. "add r4, r4, r7\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 r3, r3, r6\n\t"
  6523. "adc r4, r4, r7\n\t"
  6524. #else
  6525. "umlal r3, r4, %[b], r8\n\t"
  6526. #endif
  6527. "stm %[r]!, {r3}\n\t"
  6528. "mov r5, #0\n\t"
  6529. /* A[10] * B */
  6530. "ldm %[a]!, {r8}\n\t"
  6531. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  6532. "lsl r6, %[b], #16\n\t"
  6533. "lsl r7, r8, #16\n\t"
  6534. "lsr r6, r6, #16\n\t"
  6535. "lsr r7, r7, #16\n\t"
  6536. "mul r7, r6, r7\n\t"
  6537. "adds r4, r4, r7\n\t"
  6538. "adc r5, r5, #0\n\t"
  6539. "lsr r7, r8, #16\n\t"
  6540. "mul r6, r7, r6\n\t"
  6541. "lsr r7, r6, #16\n\t"
  6542. "lsl r6, r6, #16\n\t"
  6543. "adds r4, r4, r6\n\t"
  6544. "adc r5, r5, r7\n\t"
  6545. "lsr r6, %[b], #16\n\t"
  6546. "lsr r7, r8, #16\n\t"
  6547. "mul r7, r6, r7\n\t"
  6548. "add r5, r5, r7\n\t"
  6549. "lsl r7, r8, #16\n\t"
  6550. "lsr r7, r7, #16\n\t"
  6551. "mul r6, r7, r6\n\t"
  6552. "lsr r7, r6, #16\n\t"
  6553. "lsl r6, r6, #16\n\t"
  6554. "adds r4, r4, r6\n\t"
  6555. "adc r5, r5, r7\n\t"
  6556. #else
  6557. "umlal r4, r5, %[b], r8\n\t"
  6558. #endif
  6559. "stm %[r]!, {r4}\n\t"
  6560. "mov r3, #0\n\t"
  6561. /* A[11] * B */
  6562. "ldm %[a]!, {r8}\n\t"
  6563. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  6564. "lsl r6, %[b], #16\n\t"
  6565. "lsl r7, r8, #16\n\t"
  6566. "lsr r6, r6, #16\n\t"
  6567. "lsr r7, r7, #16\n\t"
  6568. "mul r7, r6, r7\n\t"
  6569. "adds r5, r5, r7\n\t"
  6570. "adc r3, r3, #0\n\t"
  6571. "lsr r7, r8, #16\n\t"
  6572. "mul r6, r7, r6\n\t"
  6573. "lsr r7, r6, #16\n\t"
  6574. "lsl r6, r6, #16\n\t"
  6575. "adds r5, r5, r6\n\t"
  6576. "adc r3, r3, r7\n\t"
  6577. "lsr r6, %[b], #16\n\t"
  6578. "lsr r7, r8, #16\n\t"
  6579. "mul r7, r6, r7\n\t"
  6580. "add r3, r3, r7\n\t"
  6581. "lsl r7, r8, #16\n\t"
  6582. "lsr r7, r7, #16\n\t"
  6583. "mul r6, r7, r6\n\t"
  6584. "lsr r7, r6, #16\n\t"
  6585. "lsl r6, r6, #16\n\t"
  6586. "adds r5, r5, r6\n\t"
  6587. "adc r3, r3, r7\n\t"
  6588. #else
  6589. "umlal r5, r3, %[b], r8\n\t"
  6590. #endif
  6591. "stm %[r]!, {r5}\n\t"
  6592. "mov r4, #0\n\t"
  6593. /* A[12] * B */
  6594. "ldm %[a]!, {r8}\n\t"
  6595. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  6596. "lsl r6, %[b], #16\n\t"
  6597. "lsl r7, r8, #16\n\t"
  6598. "lsr r6, r6, #16\n\t"
  6599. "lsr r7, r7, #16\n\t"
  6600. "mul r7, r6, r7\n\t"
  6601. "adds r3, r3, r7\n\t"
  6602. "adc r4, r4, #0\n\t"
  6603. "lsr r7, r8, #16\n\t"
  6604. "mul r6, r7, r6\n\t"
  6605. "lsr r7, r6, #16\n\t"
  6606. "lsl r6, r6, #16\n\t"
  6607. "adds r3, r3, r6\n\t"
  6608. "adc r4, r4, r7\n\t"
  6609. "lsr r6, %[b], #16\n\t"
  6610. "lsr r7, r8, #16\n\t"
  6611. "mul r7, r6, r7\n\t"
  6612. "add r4, r4, r7\n\t"
  6613. "lsl r7, r8, #16\n\t"
  6614. "lsr r7, r7, #16\n\t"
  6615. "mul r6, r7, r6\n\t"
  6616. "lsr r7, r6, #16\n\t"
  6617. "lsl r6, r6, #16\n\t"
  6618. "adds r3, r3, r6\n\t"
  6619. "adc r4, r4, r7\n\t"
  6620. #else
  6621. "umlal r3, r4, %[b], r8\n\t"
  6622. #endif
  6623. "stm %[r]!, {r3}\n\t"
  6624. "mov r5, #0\n\t"
  6625. /* A[13] * B */
  6626. "ldm %[a]!, {r8}\n\t"
  6627. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  6628. "lsl r6, %[b], #16\n\t"
  6629. "lsl r7, r8, #16\n\t"
  6630. "lsr r6, r6, #16\n\t"
  6631. "lsr r7, r7, #16\n\t"
  6632. "mul r7, r6, r7\n\t"
  6633. "adds r4, r4, r7\n\t"
  6634. "adc r5, r5, #0\n\t"
  6635. "lsr r7, r8, #16\n\t"
  6636. "mul r6, r7, r6\n\t"
  6637. "lsr r7, r6, #16\n\t"
  6638. "lsl r6, r6, #16\n\t"
  6639. "adds r4, r4, r6\n\t"
  6640. "adc r5, r5, r7\n\t"
  6641. "lsr r6, %[b], #16\n\t"
  6642. "lsr r7, r8, #16\n\t"
  6643. "mul r7, r6, r7\n\t"
  6644. "add r5, r5, r7\n\t"
  6645. "lsl r7, r8, #16\n\t"
  6646. "lsr r7, r7, #16\n\t"
  6647. "mul r6, r7, r6\n\t"
  6648. "lsr r7, r6, #16\n\t"
  6649. "lsl r6, r6, #16\n\t"
  6650. "adds r4, r4, r6\n\t"
  6651. "adc r5, r5, r7\n\t"
  6652. #else
  6653. "umlal r4, r5, %[b], r8\n\t"
  6654. #endif
  6655. "stm %[r]!, {r4}\n\t"
  6656. "mov r3, #0\n\t"
  6657. /* A[14] * B */
  6658. "ldm %[a]!, {r8}\n\t"
  6659. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  6660. "lsl r6, %[b], #16\n\t"
  6661. "lsl r7, r8, #16\n\t"
  6662. "lsr r6, r6, #16\n\t"
  6663. "lsr r7, r7, #16\n\t"
  6664. "mul r7, r6, r7\n\t"
  6665. "adds r5, r5, r7\n\t"
  6666. "adc r3, r3, #0\n\t"
  6667. "lsr r7, r8, #16\n\t"
  6668. "mul r6, r7, r6\n\t"
  6669. "lsr r7, r6, #16\n\t"
  6670. "lsl r6, r6, #16\n\t"
  6671. "adds r5, r5, r6\n\t"
  6672. "adc r3, r3, r7\n\t"
  6673. "lsr r6, %[b], #16\n\t"
  6674. "lsr r7, r8, #16\n\t"
  6675. "mul r7, r6, r7\n\t"
  6676. "add r3, r3, r7\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. "adc r3, r3, r7\n\t"
  6684. #else
  6685. "umlal r5, r3, %[b], r8\n\t"
  6686. #endif
  6687. "stm %[r]!, {r5}\n\t"
  6688. "mov r4, #0\n\t"
  6689. /* A[15] * B */
  6690. "ldm %[a]!, {r8}\n\t"
  6691. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  6692. "lsl r6, %[b], #16\n\t"
  6693. "lsl r7, r8, #16\n\t"
  6694. "lsr r6, r6, #16\n\t"
  6695. "lsr r7, r7, #16\n\t"
  6696. "mul r7, r6, r7\n\t"
  6697. "adds r3, r3, r7\n\t"
  6698. "adc r4, r4, #0\n\t"
  6699. "lsr r7, r8, #16\n\t"
  6700. "mul r6, r7, r6\n\t"
  6701. "lsr r7, r6, #16\n\t"
  6702. "lsl r6, r6, #16\n\t"
  6703. "adds r3, r3, r6\n\t"
  6704. "adc r4, r4, r7\n\t"
  6705. "lsr r6, %[b], #16\n\t"
  6706. "lsr r7, r8, #16\n\t"
  6707. "mul r7, r6, r7\n\t"
  6708. "add r4, r4, r7\n\t"
  6709. "lsl r7, r8, #16\n\t"
  6710. "lsr r7, r7, #16\n\t"
  6711. "mul r6, r7, r6\n\t"
  6712. "lsr r7, r6, #16\n\t"
  6713. "lsl r6, r6, #16\n\t"
  6714. "adds r3, r3, r6\n\t"
  6715. "adc r4, r4, r7\n\t"
  6716. #else
  6717. "umlal r3, r4, %[b], r8\n\t"
  6718. #endif
  6719. "stm %[r]!, {r3}\n\t"
  6720. "mov r5, #0\n\t"
  6721. /* A[16] * B */
  6722. "ldm %[a]!, {r8}\n\t"
  6723. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  6724. "lsl r6, %[b], #16\n\t"
  6725. "lsl r7, r8, #16\n\t"
  6726. "lsr r6, r6, #16\n\t"
  6727. "lsr r7, r7, #16\n\t"
  6728. "mul r7, r6, r7\n\t"
  6729. "adds r4, r4, r7\n\t"
  6730. "adc r5, r5, #0\n\t"
  6731. "lsr r7, r8, #16\n\t"
  6732. "mul r6, r7, r6\n\t"
  6733. "lsr r7, r6, #16\n\t"
  6734. "lsl r6, r6, #16\n\t"
  6735. "adds r4, r4, r6\n\t"
  6736. "adc r5, r5, r7\n\t"
  6737. "lsr r6, %[b], #16\n\t"
  6738. "lsr r7, r8, #16\n\t"
  6739. "mul r7, r6, r7\n\t"
  6740. "add r5, r5, r7\n\t"
  6741. "lsl r7, r8, #16\n\t"
  6742. "lsr r7, r7, #16\n\t"
  6743. "mul r6, r7, r6\n\t"
  6744. "lsr r7, r6, #16\n\t"
  6745. "lsl r6, r6, #16\n\t"
  6746. "adds r4, r4, r6\n\t"
  6747. "adc r5, r5, r7\n\t"
  6748. #else
  6749. "umlal r4, r5, %[b], r8\n\t"
  6750. #endif
  6751. "stm %[r]!, {r4}\n\t"
  6752. "mov r3, #0\n\t"
  6753. /* A[17] * B */
  6754. "ldm %[a]!, {r8}\n\t"
  6755. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  6756. "lsl r6, %[b], #16\n\t"
  6757. "lsl r7, r8, #16\n\t"
  6758. "lsr r6, r6, #16\n\t"
  6759. "lsr r7, r7, #16\n\t"
  6760. "mul r7, r6, r7\n\t"
  6761. "adds r5, r5, r7\n\t"
  6762. "adc r3, r3, #0\n\t"
  6763. "lsr r7, r8, #16\n\t"
  6764. "mul r6, r7, r6\n\t"
  6765. "lsr r7, r6, #16\n\t"
  6766. "lsl r6, r6, #16\n\t"
  6767. "adds r5, r5, r6\n\t"
  6768. "adc r3, r3, r7\n\t"
  6769. "lsr r6, %[b], #16\n\t"
  6770. "lsr r7, r8, #16\n\t"
  6771. "mul r7, r6, r7\n\t"
  6772. "add r3, r3, r7\n\t"
  6773. "lsl r7, r8, #16\n\t"
  6774. "lsr r7, r7, #16\n\t"
  6775. "mul r6, r7, r6\n\t"
  6776. "lsr r7, r6, #16\n\t"
  6777. "lsl r6, r6, #16\n\t"
  6778. "adds r5, r5, r6\n\t"
  6779. "adc r3, r3, r7\n\t"
  6780. #else
  6781. "umlal r5, r3, %[b], r8\n\t"
  6782. #endif
  6783. "stm %[r]!, {r5}\n\t"
  6784. "mov r4, #0\n\t"
  6785. /* A[18] * B */
  6786. "ldm %[a]!, {r8}\n\t"
  6787. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  6788. "lsl r6, %[b], #16\n\t"
  6789. "lsl r7, r8, #16\n\t"
  6790. "lsr r6, r6, #16\n\t"
  6791. "lsr r7, r7, #16\n\t"
  6792. "mul r7, r6, r7\n\t"
  6793. "adds r3, r3, r7\n\t"
  6794. "adc r4, r4, #0\n\t"
  6795. "lsr r7, r8, #16\n\t"
  6796. "mul r6, r7, r6\n\t"
  6797. "lsr r7, r6, #16\n\t"
  6798. "lsl r6, r6, #16\n\t"
  6799. "adds r3, r3, r6\n\t"
  6800. "adc r4, r4, r7\n\t"
  6801. "lsr r6, %[b], #16\n\t"
  6802. "lsr r7, r8, #16\n\t"
  6803. "mul r7, r6, r7\n\t"
  6804. "add r4, r4, r7\n\t"
  6805. "lsl r7, r8, #16\n\t"
  6806. "lsr r7, r7, #16\n\t"
  6807. "mul r6, r7, r6\n\t"
  6808. "lsr r7, r6, #16\n\t"
  6809. "lsl r6, r6, #16\n\t"
  6810. "adds r3, r3, r6\n\t"
  6811. "adc r4, r4, r7\n\t"
  6812. #else
  6813. "umlal r3, r4, %[b], r8\n\t"
  6814. #endif
  6815. "stm %[r]!, {r3}\n\t"
  6816. "mov r5, #0\n\t"
  6817. /* A[19] * B */
  6818. "ldm %[a]!, {r8}\n\t"
  6819. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  6820. "lsl r6, %[b], #16\n\t"
  6821. "lsl r7, r8, #16\n\t"
  6822. "lsr r6, r6, #16\n\t"
  6823. "lsr r7, r7, #16\n\t"
  6824. "mul r7, r6, r7\n\t"
  6825. "adds r4, r4, r7\n\t"
  6826. "adc r5, r5, #0\n\t"
  6827. "lsr r7, r8, #16\n\t"
  6828. "mul r6, r7, r6\n\t"
  6829. "lsr r7, r6, #16\n\t"
  6830. "lsl r6, r6, #16\n\t"
  6831. "adds r4, r4, r6\n\t"
  6832. "adc r5, r5, r7\n\t"
  6833. "lsr r6, %[b], #16\n\t"
  6834. "lsr r7, r8, #16\n\t"
  6835. "mul r7, r6, r7\n\t"
  6836. "add r5, r5, r7\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 r4, r4, r6\n\t"
  6843. "adc r5, r5, r7\n\t"
  6844. #else
  6845. "umlal r4, r5, %[b], r8\n\t"
  6846. #endif
  6847. "stm %[r]!, {r4}\n\t"
  6848. "mov r3, #0\n\t"
  6849. /* A[20] * B */
  6850. "ldm %[a]!, {r8}\n\t"
  6851. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  6852. "lsl r6, %[b], #16\n\t"
  6853. "lsl r7, r8, #16\n\t"
  6854. "lsr r6, r6, #16\n\t"
  6855. "lsr r7, r7, #16\n\t"
  6856. "mul r7, r6, r7\n\t"
  6857. "adds r5, r5, r7\n\t"
  6858. "adc r3, r3, #0\n\t"
  6859. "lsr r7, r8, #16\n\t"
  6860. "mul r6, r7, r6\n\t"
  6861. "lsr r7, r6, #16\n\t"
  6862. "lsl r6, r6, #16\n\t"
  6863. "adds r5, r5, r6\n\t"
  6864. "adc r3, r3, r7\n\t"
  6865. "lsr r6, %[b], #16\n\t"
  6866. "lsr r7, r8, #16\n\t"
  6867. "mul r7, r6, r7\n\t"
  6868. "add r3, r3, r7\n\t"
  6869. "lsl r7, r8, #16\n\t"
  6870. "lsr r7, r7, #16\n\t"
  6871. "mul r6, r7, r6\n\t"
  6872. "lsr r7, r6, #16\n\t"
  6873. "lsl r6, r6, #16\n\t"
  6874. "adds r5, r5, r6\n\t"
  6875. "adc r3, r3, r7\n\t"
  6876. #else
  6877. "umlal r5, r3, %[b], r8\n\t"
  6878. #endif
  6879. "stm %[r]!, {r5}\n\t"
  6880. "mov r4, #0\n\t"
  6881. /* A[21] * B */
  6882. "ldm %[a]!, {r8}\n\t"
  6883. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  6884. "lsl r6, %[b], #16\n\t"
  6885. "lsl r7, r8, #16\n\t"
  6886. "lsr r6, r6, #16\n\t"
  6887. "lsr r7, r7, #16\n\t"
  6888. "mul r7, r6, r7\n\t"
  6889. "adds r3, r3, r7\n\t"
  6890. "adc r4, r4, #0\n\t"
  6891. "lsr r7, r8, #16\n\t"
  6892. "mul r6, r7, r6\n\t"
  6893. "lsr r7, r6, #16\n\t"
  6894. "lsl r6, r6, #16\n\t"
  6895. "adds r3, r3, r6\n\t"
  6896. "adc r4, r4, r7\n\t"
  6897. "lsr r6, %[b], #16\n\t"
  6898. "lsr r7, r8, #16\n\t"
  6899. "mul r7, r6, r7\n\t"
  6900. "add r4, r4, r7\n\t"
  6901. "lsl r7, r8, #16\n\t"
  6902. "lsr r7, r7, #16\n\t"
  6903. "mul r6, r7, r6\n\t"
  6904. "lsr r7, r6, #16\n\t"
  6905. "lsl r6, r6, #16\n\t"
  6906. "adds r3, r3, r6\n\t"
  6907. "adc r4, r4, r7\n\t"
  6908. #else
  6909. "umlal r3, r4, %[b], r8\n\t"
  6910. #endif
  6911. "stm %[r]!, {r3}\n\t"
  6912. "mov r5, #0\n\t"
  6913. /* A[22] * B */
  6914. "ldm %[a]!, {r8}\n\t"
  6915. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  6916. "lsl r6, %[b], #16\n\t"
  6917. "lsl r7, r8, #16\n\t"
  6918. "lsr r6, r6, #16\n\t"
  6919. "lsr r7, r7, #16\n\t"
  6920. "mul r7, r6, r7\n\t"
  6921. "adds r4, r4, r7\n\t"
  6922. "adc r5, r5, #0\n\t"
  6923. "lsr r7, r8, #16\n\t"
  6924. "mul r6, r7, r6\n\t"
  6925. "lsr r7, r6, #16\n\t"
  6926. "lsl r6, r6, #16\n\t"
  6927. "adds r4, r4, r6\n\t"
  6928. "adc r5, r5, r7\n\t"
  6929. "lsr r6, %[b], #16\n\t"
  6930. "lsr r7, r8, #16\n\t"
  6931. "mul r7, r6, r7\n\t"
  6932. "add r5, r5, r7\n\t"
  6933. "lsl r7, r8, #16\n\t"
  6934. "lsr r7, r7, #16\n\t"
  6935. "mul r6, r7, r6\n\t"
  6936. "lsr r7, r6, #16\n\t"
  6937. "lsl r6, r6, #16\n\t"
  6938. "adds r4, r4, r6\n\t"
  6939. "adc r5, r5, r7\n\t"
  6940. #else
  6941. "umlal r4, r5, %[b], r8\n\t"
  6942. #endif
  6943. "stm %[r]!, {r4}\n\t"
  6944. "mov r3, #0\n\t"
  6945. /* A[23] * B */
  6946. "ldm %[a]!, {r8}\n\t"
  6947. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  6948. "lsl r6, %[b], #16\n\t"
  6949. "lsl r7, r8, #16\n\t"
  6950. "lsr r6, r6, #16\n\t"
  6951. "lsr r7, r7, #16\n\t"
  6952. "mul r7, r6, r7\n\t"
  6953. "adds r5, r5, r7\n\t"
  6954. "adc r3, r3, #0\n\t"
  6955. "lsr r7, r8, #16\n\t"
  6956. "mul r6, r7, r6\n\t"
  6957. "lsr r7, r6, #16\n\t"
  6958. "lsl r6, r6, #16\n\t"
  6959. "adds r5, r5, r6\n\t"
  6960. "adc r3, r3, r7\n\t"
  6961. "lsr r6, %[b], #16\n\t"
  6962. "lsr r7, r8, #16\n\t"
  6963. "mul r7, r6, r7\n\t"
  6964. "add r3, r3, r7\n\t"
  6965. "lsl r7, r8, #16\n\t"
  6966. "lsr r7, r7, #16\n\t"
  6967. "mul r6, r7, r6\n\t"
  6968. "lsr r7, r6, #16\n\t"
  6969. "lsl r6, r6, #16\n\t"
  6970. "adds r5, r5, r6\n\t"
  6971. "adc r3, r3, r7\n\t"
  6972. #else
  6973. "umlal r5, r3, %[b], r8\n\t"
  6974. #endif
  6975. "stm %[r]!, {r5}\n\t"
  6976. "mov r4, #0\n\t"
  6977. /* A[24] * B */
  6978. "ldm %[a]!, {r8}\n\t"
  6979. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  6980. "lsl r6, %[b], #16\n\t"
  6981. "lsl r7, r8, #16\n\t"
  6982. "lsr r6, r6, #16\n\t"
  6983. "lsr r7, r7, #16\n\t"
  6984. "mul r7, r6, r7\n\t"
  6985. "adds r3, r3, r7\n\t"
  6986. "adc r4, r4, #0\n\t"
  6987. "lsr r7, r8, #16\n\t"
  6988. "mul r6, r7, r6\n\t"
  6989. "lsr r7, r6, #16\n\t"
  6990. "lsl r6, r6, #16\n\t"
  6991. "adds r3, r3, r6\n\t"
  6992. "adc r4, r4, r7\n\t"
  6993. "lsr r6, %[b], #16\n\t"
  6994. "lsr r7, r8, #16\n\t"
  6995. "mul r7, r6, r7\n\t"
  6996. "add r4, r4, r7\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 r3, r3, r6\n\t"
  7003. "adc r4, r4, r7\n\t"
  7004. #else
  7005. "umlal r3, r4, %[b], r8\n\t"
  7006. #endif
  7007. "stm %[r]!, {r3}\n\t"
  7008. "mov r5, #0\n\t"
  7009. /* A[25] * B */
  7010. "ldm %[a]!, {r8}\n\t"
  7011. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  7012. "lsl r6, %[b], #16\n\t"
  7013. "lsl r7, r8, #16\n\t"
  7014. "lsr r6, r6, #16\n\t"
  7015. "lsr r7, r7, #16\n\t"
  7016. "mul r7, r6, r7\n\t"
  7017. "adds r4, r4, r7\n\t"
  7018. "adc r5, r5, #0\n\t"
  7019. "lsr r7, r8, #16\n\t"
  7020. "mul r6, r7, r6\n\t"
  7021. "lsr r7, r6, #16\n\t"
  7022. "lsl r6, r6, #16\n\t"
  7023. "adds r4, r4, r6\n\t"
  7024. "adc r5, r5, r7\n\t"
  7025. "lsr r6, %[b], #16\n\t"
  7026. "lsr r7, r8, #16\n\t"
  7027. "mul r7, r6, r7\n\t"
  7028. "add r5, r5, r7\n\t"
  7029. "lsl r7, r8, #16\n\t"
  7030. "lsr r7, r7, #16\n\t"
  7031. "mul r6, r7, r6\n\t"
  7032. "lsr r7, r6, #16\n\t"
  7033. "lsl r6, r6, #16\n\t"
  7034. "adds r4, r4, r6\n\t"
  7035. "adc r5, r5, r7\n\t"
  7036. #else
  7037. "umlal r4, r5, %[b], r8\n\t"
  7038. #endif
  7039. "stm %[r]!, {r4}\n\t"
  7040. "mov r3, #0\n\t"
  7041. /* A[26] * B */
  7042. "ldm %[a]!, {r8}\n\t"
  7043. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  7044. "lsl r6, %[b], #16\n\t"
  7045. "lsl r7, r8, #16\n\t"
  7046. "lsr r6, r6, #16\n\t"
  7047. "lsr r7, r7, #16\n\t"
  7048. "mul r7, r6, r7\n\t"
  7049. "adds r5, r5, r7\n\t"
  7050. "adc r3, r3, #0\n\t"
  7051. "lsr r7, r8, #16\n\t"
  7052. "mul r6, r7, r6\n\t"
  7053. "lsr r7, r6, #16\n\t"
  7054. "lsl r6, r6, #16\n\t"
  7055. "adds r5, r5, r6\n\t"
  7056. "adc r3, r3, r7\n\t"
  7057. "lsr r6, %[b], #16\n\t"
  7058. "lsr r7, r8, #16\n\t"
  7059. "mul r7, r6, r7\n\t"
  7060. "add r3, r3, r7\n\t"
  7061. "lsl r7, r8, #16\n\t"
  7062. "lsr r7, r7, #16\n\t"
  7063. "mul r6, r7, r6\n\t"
  7064. "lsr r7, r6, #16\n\t"
  7065. "lsl r6, r6, #16\n\t"
  7066. "adds r5, r5, r6\n\t"
  7067. "adc r3, r3, r7\n\t"
  7068. #else
  7069. "umlal r5, r3, %[b], r8\n\t"
  7070. #endif
  7071. "stm %[r]!, {r5}\n\t"
  7072. "mov r4, #0\n\t"
  7073. /* A[27] * B */
  7074. "ldm %[a]!, {r8}\n\t"
  7075. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  7076. "lsl r6, %[b], #16\n\t"
  7077. "lsl r7, r8, #16\n\t"
  7078. "lsr r6, r6, #16\n\t"
  7079. "lsr r7, r7, #16\n\t"
  7080. "mul r7, r6, r7\n\t"
  7081. "adds r3, r3, r7\n\t"
  7082. "adc r4, r4, #0\n\t"
  7083. "lsr r7, r8, #16\n\t"
  7084. "mul r6, r7, r6\n\t"
  7085. "lsr r7, r6, #16\n\t"
  7086. "lsl r6, r6, #16\n\t"
  7087. "adds r3, r3, r6\n\t"
  7088. "adc r4, r4, r7\n\t"
  7089. "lsr r6, %[b], #16\n\t"
  7090. "lsr r7, r8, #16\n\t"
  7091. "mul r7, r6, r7\n\t"
  7092. "add r4, r4, r7\n\t"
  7093. "lsl r7, r8, #16\n\t"
  7094. "lsr r7, r7, #16\n\t"
  7095. "mul r6, r7, r6\n\t"
  7096. "lsr r7, r6, #16\n\t"
  7097. "lsl r6, r6, #16\n\t"
  7098. "adds r3, r3, r6\n\t"
  7099. "adc r4, r4, r7\n\t"
  7100. #else
  7101. "umlal r3, r4, %[b], r8\n\t"
  7102. #endif
  7103. "stm %[r]!, {r3}\n\t"
  7104. "mov r5, #0\n\t"
  7105. /* A[28] * B */
  7106. "ldm %[a]!, {r8}\n\t"
  7107. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  7108. "lsl r6, %[b], #16\n\t"
  7109. "lsl r7, r8, #16\n\t"
  7110. "lsr r6, r6, #16\n\t"
  7111. "lsr r7, r7, #16\n\t"
  7112. "mul r7, r6, r7\n\t"
  7113. "adds r4, r4, r7\n\t"
  7114. "adc r5, r5, #0\n\t"
  7115. "lsr r7, r8, #16\n\t"
  7116. "mul r6, r7, r6\n\t"
  7117. "lsr r7, r6, #16\n\t"
  7118. "lsl r6, r6, #16\n\t"
  7119. "adds r4, r4, r6\n\t"
  7120. "adc r5, r5, r7\n\t"
  7121. "lsr r6, %[b], #16\n\t"
  7122. "lsr r7, r8, #16\n\t"
  7123. "mul r7, r6, r7\n\t"
  7124. "add r5, r5, r7\n\t"
  7125. "lsl r7, r8, #16\n\t"
  7126. "lsr r7, r7, #16\n\t"
  7127. "mul r6, r7, r6\n\t"
  7128. "lsr r7, r6, #16\n\t"
  7129. "lsl r6, r6, #16\n\t"
  7130. "adds r4, r4, r6\n\t"
  7131. "adc r5, r5, r7\n\t"
  7132. #else
  7133. "umlal r4, r5, %[b], r8\n\t"
  7134. #endif
  7135. "stm %[r]!, {r4}\n\t"
  7136. "mov r3, #0\n\t"
  7137. /* A[29] * B */
  7138. "ldm %[a]!, {r8}\n\t"
  7139. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  7140. "lsl r6, %[b], #16\n\t"
  7141. "lsl r7, r8, #16\n\t"
  7142. "lsr r6, r6, #16\n\t"
  7143. "lsr r7, r7, #16\n\t"
  7144. "mul r7, r6, r7\n\t"
  7145. "adds r5, r5, r7\n\t"
  7146. "adc r3, r3, #0\n\t"
  7147. "lsr r7, r8, #16\n\t"
  7148. "mul r6, r7, r6\n\t"
  7149. "lsr r7, r6, #16\n\t"
  7150. "lsl r6, r6, #16\n\t"
  7151. "adds r5, r5, r6\n\t"
  7152. "adc r3, r3, r7\n\t"
  7153. "lsr r6, %[b], #16\n\t"
  7154. "lsr r7, r8, #16\n\t"
  7155. "mul r7, r6, r7\n\t"
  7156. "add r3, r3, r7\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. "adc r3, r3, r7\n\t"
  7164. #else
  7165. "umlal r5, r3, %[b], r8\n\t"
  7166. #endif
  7167. "stm %[r]!, {r5}\n\t"
  7168. "mov r4, #0\n\t"
  7169. /* A[30] * B */
  7170. "ldm %[a]!, {r8}\n\t"
  7171. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  7172. "lsl r6, %[b], #16\n\t"
  7173. "lsl r7, r8, #16\n\t"
  7174. "lsr r6, r6, #16\n\t"
  7175. "lsr r7, r7, #16\n\t"
  7176. "mul r7, r6, r7\n\t"
  7177. "adds r3, r3, r7\n\t"
  7178. "adc r4, r4, #0\n\t"
  7179. "lsr r7, r8, #16\n\t"
  7180. "mul r6, r7, r6\n\t"
  7181. "lsr r7, r6, #16\n\t"
  7182. "lsl r6, r6, #16\n\t"
  7183. "adds r3, r3, r6\n\t"
  7184. "adc r4, r4, r7\n\t"
  7185. "lsr r6, %[b], #16\n\t"
  7186. "lsr r7, r8, #16\n\t"
  7187. "mul r7, r6, r7\n\t"
  7188. "add r4, r4, r7\n\t"
  7189. "lsl r7, r8, #16\n\t"
  7190. "lsr r7, r7, #16\n\t"
  7191. "mul r6, r7, r6\n\t"
  7192. "lsr r7, r6, #16\n\t"
  7193. "lsl r6, r6, #16\n\t"
  7194. "adds r3, r3, r6\n\t"
  7195. "adc r4, r4, r7\n\t"
  7196. #else
  7197. "umlal r3, r4, %[b], r8\n\t"
  7198. #endif
  7199. "stm %[r]!, {r3}\n\t"
  7200. "mov r5, #0\n\t"
  7201. /* A[31] * B */
  7202. "ldm %[a]!, {r8}\n\t"
  7203. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  7204. "lsl r6, %[b], #16\n\t"
  7205. "lsl r7, r8, #16\n\t"
  7206. "lsr r6, r6, #16\n\t"
  7207. "lsr r7, r7, #16\n\t"
  7208. "mul r7, r6, r7\n\t"
  7209. "adds r4, r4, r7\n\t"
  7210. "adc r5, r5, #0\n\t"
  7211. "lsr r7, r8, #16\n\t"
  7212. "mul r6, r7, r6\n\t"
  7213. "lsr r7, r6, #16\n\t"
  7214. "lsl r6, r6, #16\n\t"
  7215. "adds r4, r4, r6\n\t"
  7216. "adc r5, r5, r7\n\t"
  7217. "lsr r6, %[b], #16\n\t"
  7218. "lsr r7, r8, #16\n\t"
  7219. "mul r7, r6, r7\n\t"
  7220. "add r5, r5, r7\n\t"
  7221. "lsl r7, r8, #16\n\t"
  7222. "lsr r7, r7, #16\n\t"
  7223. "mul r6, r7, r6\n\t"
  7224. "lsr r7, r6, #16\n\t"
  7225. "lsl r6, r6, #16\n\t"
  7226. "adds r4, r4, r6\n\t"
  7227. "adc r5, r5, r7\n\t"
  7228. #else
  7229. "umlal r4, r5, %[b], r8\n\t"
  7230. #endif
  7231. "stm %[r]!, {r4}\n\t"
  7232. "mov r3, #0\n\t"
  7233. /* A[32] * B */
  7234. "ldm %[a]!, {r8}\n\t"
  7235. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  7236. "lsl r6, %[b], #16\n\t"
  7237. "lsl r7, r8, #16\n\t"
  7238. "lsr r6, r6, #16\n\t"
  7239. "lsr r7, r7, #16\n\t"
  7240. "mul r7, r6, r7\n\t"
  7241. "adds r5, r5, r7\n\t"
  7242. "adc r3, r3, #0\n\t"
  7243. "lsr r7, r8, #16\n\t"
  7244. "mul r6, r7, r6\n\t"
  7245. "lsr r7, r6, #16\n\t"
  7246. "lsl r6, r6, #16\n\t"
  7247. "adds r5, r5, r6\n\t"
  7248. "adc r3, r3, r7\n\t"
  7249. "lsr r6, %[b], #16\n\t"
  7250. "lsr r7, r8, #16\n\t"
  7251. "mul r7, r6, r7\n\t"
  7252. "add r3, r3, r7\n\t"
  7253. "lsl r7, r8, #16\n\t"
  7254. "lsr r7, r7, #16\n\t"
  7255. "mul r6, r7, r6\n\t"
  7256. "lsr r7, r6, #16\n\t"
  7257. "lsl r6, r6, #16\n\t"
  7258. "adds r5, r5, r6\n\t"
  7259. "adc r3, r3, r7\n\t"
  7260. #else
  7261. "umlal r5, r3, %[b], r8\n\t"
  7262. #endif
  7263. "stm %[r]!, {r5}\n\t"
  7264. "mov r4, #0\n\t"
  7265. /* A[33] * B */
  7266. "ldm %[a]!, {r8}\n\t"
  7267. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  7268. "lsl r6, %[b], #16\n\t"
  7269. "lsl r7, r8, #16\n\t"
  7270. "lsr r6, r6, #16\n\t"
  7271. "lsr r7, r7, #16\n\t"
  7272. "mul r7, r6, r7\n\t"
  7273. "adds r3, r3, r7\n\t"
  7274. "adc r4, r4, #0\n\t"
  7275. "lsr r7, r8, #16\n\t"
  7276. "mul r6, r7, r6\n\t"
  7277. "lsr r7, r6, #16\n\t"
  7278. "lsl r6, r6, #16\n\t"
  7279. "adds r3, r3, r6\n\t"
  7280. "adc r4, r4, r7\n\t"
  7281. "lsr r6, %[b], #16\n\t"
  7282. "lsr r7, r8, #16\n\t"
  7283. "mul r7, r6, r7\n\t"
  7284. "add r4, r4, r7\n\t"
  7285. "lsl r7, r8, #16\n\t"
  7286. "lsr r7, r7, #16\n\t"
  7287. "mul r6, r7, r6\n\t"
  7288. "lsr r7, r6, #16\n\t"
  7289. "lsl r6, r6, #16\n\t"
  7290. "adds r3, r3, r6\n\t"
  7291. "adc r4, r4, r7\n\t"
  7292. #else
  7293. "umlal r3, r4, %[b], r8\n\t"
  7294. #endif
  7295. "stm %[r]!, {r3}\n\t"
  7296. "mov r5, #0\n\t"
  7297. /* A[34] * B */
  7298. "ldm %[a]!, {r8}\n\t"
  7299. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  7300. "lsl r6, %[b], #16\n\t"
  7301. "lsl r7, r8, #16\n\t"
  7302. "lsr r6, r6, #16\n\t"
  7303. "lsr r7, r7, #16\n\t"
  7304. "mul r7, r6, r7\n\t"
  7305. "adds r4, r4, r7\n\t"
  7306. "adc r5, r5, #0\n\t"
  7307. "lsr r7, r8, #16\n\t"
  7308. "mul r6, r7, r6\n\t"
  7309. "lsr r7, r6, #16\n\t"
  7310. "lsl r6, r6, #16\n\t"
  7311. "adds r4, r4, r6\n\t"
  7312. "adc r5, r5, r7\n\t"
  7313. "lsr r6, %[b], #16\n\t"
  7314. "lsr r7, r8, #16\n\t"
  7315. "mul r7, r6, r7\n\t"
  7316. "add r5, r5, r7\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 r4, r4, r6\n\t"
  7323. "adc r5, r5, r7\n\t"
  7324. #else
  7325. "umlal r4, r5, %[b], r8\n\t"
  7326. #endif
  7327. "stm %[r]!, {r4}\n\t"
  7328. "mov r3, #0\n\t"
  7329. /* A[35] * B */
  7330. "ldm %[a]!, {r8}\n\t"
  7331. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  7332. "lsl r6, %[b], #16\n\t"
  7333. "lsl r7, r8, #16\n\t"
  7334. "lsr r6, r6, #16\n\t"
  7335. "lsr r7, r7, #16\n\t"
  7336. "mul r7, r6, r7\n\t"
  7337. "adds r5, r5, r7\n\t"
  7338. "adc r3, r3, #0\n\t"
  7339. "lsr r7, r8, #16\n\t"
  7340. "mul r6, r7, r6\n\t"
  7341. "lsr r7, r6, #16\n\t"
  7342. "lsl r6, r6, #16\n\t"
  7343. "adds r5, r5, r6\n\t"
  7344. "adc r3, r3, r7\n\t"
  7345. "lsr r6, %[b], #16\n\t"
  7346. "lsr r7, r8, #16\n\t"
  7347. "mul r7, r6, r7\n\t"
  7348. "add r3, r3, r7\n\t"
  7349. "lsl r7, r8, #16\n\t"
  7350. "lsr r7, r7, #16\n\t"
  7351. "mul r6, r7, r6\n\t"
  7352. "lsr r7, r6, #16\n\t"
  7353. "lsl r6, r6, #16\n\t"
  7354. "adds r5, r5, r6\n\t"
  7355. "adc r3, r3, r7\n\t"
  7356. #else
  7357. "umlal r5, r3, %[b], r8\n\t"
  7358. #endif
  7359. "stm %[r]!, {r5}\n\t"
  7360. "mov r4, #0\n\t"
  7361. /* A[36] * B */
  7362. "ldm %[a]!, {r8}\n\t"
  7363. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  7364. "lsl r6, %[b], #16\n\t"
  7365. "lsl r7, r8, #16\n\t"
  7366. "lsr r6, r6, #16\n\t"
  7367. "lsr r7, r7, #16\n\t"
  7368. "mul r7, r6, r7\n\t"
  7369. "adds r3, r3, r7\n\t"
  7370. "adc r4, r4, #0\n\t"
  7371. "lsr r7, r8, #16\n\t"
  7372. "mul r6, r7, r6\n\t"
  7373. "lsr r7, r6, #16\n\t"
  7374. "lsl r6, r6, #16\n\t"
  7375. "adds r3, r3, r6\n\t"
  7376. "adc r4, r4, r7\n\t"
  7377. "lsr r6, %[b], #16\n\t"
  7378. "lsr r7, r8, #16\n\t"
  7379. "mul r7, r6, r7\n\t"
  7380. "add r4, r4, r7\n\t"
  7381. "lsl r7, r8, #16\n\t"
  7382. "lsr r7, r7, #16\n\t"
  7383. "mul r6, r7, r6\n\t"
  7384. "lsr r7, r6, #16\n\t"
  7385. "lsl r6, r6, #16\n\t"
  7386. "adds r3, r3, r6\n\t"
  7387. "adc r4, r4, r7\n\t"
  7388. #else
  7389. "umlal r3, r4, %[b], r8\n\t"
  7390. #endif
  7391. "stm %[r]!, {r3}\n\t"
  7392. "mov r5, #0\n\t"
  7393. /* A[37] * B */
  7394. "ldm %[a]!, {r8}\n\t"
  7395. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  7396. "lsl r6, %[b], #16\n\t"
  7397. "lsl r7, r8, #16\n\t"
  7398. "lsr r6, r6, #16\n\t"
  7399. "lsr r7, r7, #16\n\t"
  7400. "mul r7, r6, r7\n\t"
  7401. "adds r4, r4, r7\n\t"
  7402. "adc r5, r5, #0\n\t"
  7403. "lsr r7, r8, #16\n\t"
  7404. "mul r6, r7, r6\n\t"
  7405. "lsr r7, r6, #16\n\t"
  7406. "lsl r6, r6, #16\n\t"
  7407. "adds r4, r4, r6\n\t"
  7408. "adc r5, r5, r7\n\t"
  7409. "lsr r6, %[b], #16\n\t"
  7410. "lsr r7, r8, #16\n\t"
  7411. "mul r7, r6, r7\n\t"
  7412. "add r5, r5, r7\n\t"
  7413. "lsl r7, r8, #16\n\t"
  7414. "lsr r7, r7, #16\n\t"
  7415. "mul r6, r7, r6\n\t"
  7416. "lsr r7, r6, #16\n\t"
  7417. "lsl r6, r6, #16\n\t"
  7418. "adds r4, r4, r6\n\t"
  7419. "adc r5, r5, r7\n\t"
  7420. #else
  7421. "umlal r4, r5, %[b], r8\n\t"
  7422. #endif
  7423. "stm %[r]!, {r4}\n\t"
  7424. "mov r3, #0\n\t"
  7425. /* A[38] * B */
  7426. "ldm %[a]!, {r8}\n\t"
  7427. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  7428. "lsl r6, %[b], #16\n\t"
  7429. "lsl r7, r8, #16\n\t"
  7430. "lsr r6, r6, #16\n\t"
  7431. "lsr r7, r7, #16\n\t"
  7432. "mul r7, r6, r7\n\t"
  7433. "adds r5, r5, r7\n\t"
  7434. "adc r3, r3, #0\n\t"
  7435. "lsr r7, r8, #16\n\t"
  7436. "mul r6, r7, r6\n\t"
  7437. "lsr r7, r6, #16\n\t"
  7438. "lsl r6, r6, #16\n\t"
  7439. "adds r5, r5, r6\n\t"
  7440. "adc r3, r3, r7\n\t"
  7441. "lsr r6, %[b], #16\n\t"
  7442. "lsr r7, r8, #16\n\t"
  7443. "mul r7, r6, r7\n\t"
  7444. "add r3, r3, r7\n\t"
  7445. "lsl r7, r8, #16\n\t"
  7446. "lsr r7, r7, #16\n\t"
  7447. "mul r6, r7, r6\n\t"
  7448. "lsr r7, r6, #16\n\t"
  7449. "lsl r6, r6, #16\n\t"
  7450. "adds r5, r5, r6\n\t"
  7451. "adc r3, r3, r7\n\t"
  7452. #else
  7453. "umlal r5, r3, %[b], r8\n\t"
  7454. #endif
  7455. "stm %[r]!, {r5}\n\t"
  7456. "mov r4, #0\n\t"
  7457. /* A[39] * B */
  7458. "ldm %[a]!, {r8}\n\t"
  7459. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  7460. "lsl r6, %[b], #16\n\t"
  7461. "lsl r7, r8, #16\n\t"
  7462. "lsr r6, r6, #16\n\t"
  7463. "lsr r7, r7, #16\n\t"
  7464. "mul r7, r6, r7\n\t"
  7465. "adds r3, r3, r7\n\t"
  7466. "adc r4, r4, #0\n\t"
  7467. "lsr r7, r8, #16\n\t"
  7468. "mul r6, r7, r6\n\t"
  7469. "lsr r7, r6, #16\n\t"
  7470. "lsl r6, r6, #16\n\t"
  7471. "adds r3, r3, r6\n\t"
  7472. "adc r4, r4, r7\n\t"
  7473. "lsr r6, %[b], #16\n\t"
  7474. "lsr r7, r8, #16\n\t"
  7475. "mul r7, r6, r7\n\t"
  7476. "add r4, r4, r7\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 r3, r3, r6\n\t"
  7483. "adc r4, r4, r7\n\t"
  7484. #else
  7485. "umlal r3, r4, %[b], r8\n\t"
  7486. #endif
  7487. "stm %[r]!, {r3}\n\t"
  7488. "mov r5, #0\n\t"
  7489. /* A[40] * B */
  7490. "ldm %[a]!, {r8}\n\t"
  7491. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  7492. "lsl r6, %[b], #16\n\t"
  7493. "lsl r7, r8, #16\n\t"
  7494. "lsr r6, r6, #16\n\t"
  7495. "lsr r7, r7, #16\n\t"
  7496. "mul r7, r6, r7\n\t"
  7497. "adds r4, r4, r7\n\t"
  7498. "adc r5, r5, #0\n\t"
  7499. "lsr r7, r8, #16\n\t"
  7500. "mul r6, r7, r6\n\t"
  7501. "lsr r7, r6, #16\n\t"
  7502. "lsl r6, r6, #16\n\t"
  7503. "adds r4, r4, r6\n\t"
  7504. "adc r5, r5, r7\n\t"
  7505. "lsr r6, %[b], #16\n\t"
  7506. "lsr r7, r8, #16\n\t"
  7507. "mul r7, r6, r7\n\t"
  7508. "add r5, r5, r7\n\t"
  7509. "lsl r7, r8, #16\n\t"
  7510. "lsr r7, r7, #16\n\t"
  7511. "mul r6, r7, r6\n\t"
  7512. "lsr r7, r6, #16\n\t"
  7513. "lsl r6, r6, #16\n\t"
  7514. "adds r4, r4, r6\n\t"
  7515. "adc r5, r5, r7\n\t"
  7516. #else
  7517. "umlal r4, r5, %[b], r8\n\t"
  7518. #endif
  7519. "stm %[r]!, {r4}\n\t"
  7520. "mov r3, #0\n\t"
  7521. /* A[41] * B */
  7522. "ldm %[a]!, {r8}\n\t"
  7523. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  7524. "lsl r6, %[b], #16\n\t"
  7525. "lsl r7, r8, #16\n\t"
  7526. "lsr r6, r6, #16\n\t"
  7527. "lsr r7, r7, #16\n\t"
  7528. "mul r7, r6, r7\n\t"
  7529. "adds r5, r5, r7\n\t"
  7530. "adc r3, r3, #0\n\t"
  7531. "lsr r7, r8, #16\n\t"
  7532. "mul r6, r7, r6\n\t"
  7533. "lsr r7, r6, #16\n\t"
  7534. "lsl r6, r6, #16\n\t"
  7535. "adds r5, r5, r6\n\t"
  7536. "adc r3, r3, r7\n\t"
  7537. "lsr r6, %[b], #16\n\t"
  7538. "lsr r7, r8, #16\n\t"
  7539. "mul r7, r6, r7\n\t"
  7540. "add r3, r3, r7\n\t"
  7541. "lsl r7, r8, #16\n\t"
  7542. "lsr r7, r7, #16\n\t"
  7543. "mul r6, r7, r6\n\t"
  7544. "lsr r7, r6, #16\n\t"
  7545. "lsl r6, r6, #16\n\t"
  7546. "adds r5, r5, r6\n\t"
  7547. "adc r3, r3, r7\n\t"
  7548. #else
  7549. "umlal r5, r3, %[b], r8\n\t"
  7550. #endif
  7551. "stm %[r]!, {r5}\n\t"
  7552. "mov r4, #0\n\t"
  7553. /* A[42] * B */
  7554. "ldm %[a]!, {r8}\n\t"
  7555. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  7556. "lsl r6, %[b], #16\n\t"
  7557. "lsl r7, r8, #16\n\t"
  7558. "lsr r6, r6, #16\n\t"
  7559. "lsr r7, r7, #16\n\t"
  7560. "mul r7, r6, r7\n\t"
  7561. "adds r3, r3, r7\n\t"
  7562. "adc r4, r4, #0\n\t"
  7563. "lsr r7, r8, #16\n\t"
  7564. "mul r6, r7, r6\n\t"
  7565. "lsr r7, r6, #16\n\t"
  7566. "lsl r6, r6, #16\n\t"
  7567. "adds r3, r3, r6\n\t"
  7568. "adc r4, r4, r7\n\t"
  7569. "lsr r6, %[b], #16\n\t"
  7570. "lsr r7, r8, #16\n\t"
  7571. "mul r7, r6, r7\n\t"
  7572. "add r4, r4, r7\n\t"
  7573. "lsl r7, r8, #16\n\t"
  7574. "lsr r7, r7, #16\n\t"
  7575. "mul r6, r7, r6\n\t"
  7576. "lsr r7, r6, #16\n\t"
  7577. "lsl r6, r6, #16\n\t"
  7578. "adds r3, r3, r6\n\t"
  7579. "adc r4, r4, r7\n\t"
  7580. #else
  7581. "umlal r3, r4, %[b], r8\n\t"
  7582. #endif
  7583. "stm %[r]!, {r3}\n\t"
  7584. "mov r5, #0\n\t"
  7585. /* A[43] * B */
  7586. "ldm %[a]!, {r8}\n\t"
  7587. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  7588. "lsl r6, %[b], #16\n\t"
  7589. "lsl r7, r8, #16\n\t"
  7590. "lsr r6, r6, #16\n\t"
  7591. "lsr r7, r7, #16\n\t"
  7592. "mul r7, r6, r7\n\t"
  7593. "adds r4, r4, r7\n\t"
  7594. "adc r5, r5, #0\n\t"
  7595. "lsr r7, r8, #16\n\t"
  7596. "mul r6, r7, r6\n\t"
  7597. "lsr r7, r6, #16\n\t"
  7598. "lsl r6, r6, #16\n\t"
  7599. "adds r4, r4, r6\n\t"
  7600. "adc r5, r5, r7\n\t"
  7601. "lsr r6, %[b], #16\n\t"
  7602. "lsr r7, r8, #16\n\t"
  7603. "mul r7, r6, r7\n\t"
  7604. "add r5, r5, r7\n\t"
  7605. "lsl r7, r8, #16\n\t"
  7606. "lsr r7, r7, #16\n\t"
  7607. "mul r6, r7, r6\n\t"
  7608. "lsr r7, r6, #16\n\t"
  7609. "lsl r6, r6, #16\n\t"
  7610. "adds r4, r4, r6\n\t"
  7611. "adc r5, r5, r7\n\t"
  7612. #else
  7613. "umlal r4, r5, %[b], r8\n\t"
  7614. #endif
  7615. "stm %[r]!, {r4}\n\t"
  7616. "mov r3, #0\n\t"
  7617. /* A[44] * B */
  7618. "ldm %[a]!, {r8}\n\t"
  7619. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  7620. "lsl r6, %[b], #16\n\t"
  7621. "lsl r7, r8, #16\n\t"
  7622. "lsr r6, r6, #16\n\t"
  7623. "lsr r7, r7, #16\n\t"
  7624. "mul r7, r6, r7\n\t"
  7625. "adds r5, r5, r7\n\t"
  7626. "adc r3, r3, #0\n\t"
  7627. "lsr r7, r8, #16\n\t"
  7628. "mul r6, r7, r6\n\t"
  7629. "lsr r7, r6, #16\n\t"
  7630. "lsl r6, r6, #16\n\t"
  7631. "adds r5, r5, r6\n\t"
  7632. "adc r3, r3, r7\n\t"
  7633. "lsr r6, %[b], #16\n\t"
  7634. "lsr r7, r8, #16\n\t"
  7635. "mul r7, r6, r7\n\t"
  7636. "add r3, r3, r7\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. "adc r3, r3, r7\n\t"
  7644. #else
  7645. "umlal r5, r3, %[b], r8\n\t"
  7646. #endif
  7647. "stm %[r]!, {r5}\n\t"
  7648. "mov r4, #0\n\t"
  7649. /* A[45] * B */
  7650. "ldm %[a]!, {r8}\n\t"
  7651. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  7652. "lsl r6, %[b], #16\n\t"
  7653. "lsl r7, r8, #16\n\t"
  7654. "lsr r6, r6, #16\n\t"
  7655. "lsr r7, r7, #16\n\t"
  7656. "mul r7, r6, r7\n\t"
  7657. "adds r3, r3, r7\n\t"
  7658. "adc r4, r4, #0\n\t"
  7659. "lsr r7, r8, #16\n\t"
  7660. "mul r6, r7, r6\n\t"
  7661. "lsr r7, r6, #16\n\t"
  7662. "lsl r6, r6, #16\n\t"
  7663. "adds r3, r3, r6\n\t"
  7664. "adc r4, r4, r7\n\t"
  7665. "lsr r6, %[b], #16\n\t"
  7666. "lsr r7, r8, #16\n\t"
  7667. "mul r7, r6, r7\n\t"
  7668. "add r4, r4, r7\n\t"
  7669. "lsl r7, r8, #16\n\t"
  7670. "lsr r7, r7, #16\n\t"
  7671. "mul r6, r7, r6\n\t"
  7672. "lsr r7, r6, #16\n\t"
  7673. "lsl r6, r6, #16\n\t"
  7674. "adds r3, r3, r6\n\t"
  7675. "adc r4, r4, r7\n\t"
  7676. #else
  7677. "umlal r3, r4, %[b], r8\n\t"
  7678. #endif
  7679. "stm %[r]!, {r3}\n\t"
  7680. "mov r5, #0\n\t"
  7681. /* A[46] * B */
  7682. "ldm %[a]!, {r8}\n\t"
  7683. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  7684. "lsl r6, %[b], #16\n\t"
  7685. "lsl r7, r8, #16\n\t"
  7686. "lsr r6, r6, #16\n\t"
  7687. "lsr r7, r7, #16\n\t"
  7688. "mul r7, r6, r7\n\t"
  7689. "adds r4, r4, r7\n\t"
  7690. "adc r5, r5, #0\n\t"
  7691. "lsr r7, r8, #16\n\t"
  7692. "mul r6, r7, r6\n\t"
  7693. "lsr r7, r6, #16\n\t"
  7694. "lsl r6, r6, #16\n\t"
  7695. "adds r4, r4, r6\n\t"
  7696. "adc r5, r5, r7\n\t"
  7697. "lsr r6, %[b], #16\n\t"
  7698. "lsr r7, r8, #16\n\t"
  7699. "mul r7, r6, r7\n\t"
  7700. "add r5, r5, r7\n\t"
  7701. "lsl r7, r8, #16\n\t"
  7702. "lsr r7, r7, #16\n\t"
  7703. "mul r6, r7, r6\n\t"
  7704. "lsr r7, r6, #16\n\t"
  7705. "lsl r6, r6, #16\n\t"
  7706. "adds r4, r4, r6\n\t"
  7707. "adc r5, r5, r7\n\t"
  7708. #else
  7709. "umlal r4, r5, %[b], r8\n\t"
  7710. #endif
  7711. "stm %[r]!, {r4}\n\t"
  7712. "mov r3, #0\n\t"
  7713. /* A[47] * B */
  7714. "ldm %[a]!, {r8}\n\t"
  7715. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  7716. "lsl r6, %[b], #16\n\t"
  7717. "lsl r7, r8, #16\n\t"
  7718. "lsr r6, r6, #16\n\t"
  7719. "lsr r7, r7, #16\n\t"
  7720. "mul r7, r6, r7\n\t"
  7721. "adds r5, r5, r7\n\t"
  7722. "adc r3, r3, #0\n\t"
  7723. "lsr r7, r8, #16\n\t"
  7724. "mul r6, r7, r6\n\t"
  7725. "lsr r7, r6, #16\n\t"
  7726. "lsl r6, r6, #16\n\t"
  7727. "adds r5, r5, r6\n\t"
  7728. "adc r3, r3, r7\n\t"
  7729. "lsr r6, %[b], #16\n\t"
  7730. "lsr r7, r8, #16\n\t"
  7731. "mul r7, r6, r7\n\t"
  7732. "add r3, r3, r7\n\t"
  7733. "lsl r7, r8, #16\n\t"
  7734. "lsr r7, r7, #16\n\t"
  7735. "mul r6, r7, r6\n\t"
  7736. "lsr r7, r6, #16\n\t"
  7737. "lsl r6, r6, #16\n\t"
  7738. "adds r5, r5, r6\n\t"
  7739. "adc r3, r3, r7\n\t"
  7740. #else
  7741. "umlal r5, r3, %[b], r8\n\t"
  7742. #endif
  7743. "stm %[r]!, {r5}\n\t"
  7744. "mov r4, #0\n\t"
  7745. /* A[48] * B */
  7746. "ldm %[a]!, {r8}\n\t"
  7747. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  7748. "lsl r6, %[b], #16\n\t"
  7749. "lsl r7, r8, #16\n\t"
  7750. "lsr r6, r6, #16\n\t"
  7751. "lsr r7, r7, #16\n\t"
  7752. "mul r7, r6, r7\n\t"
  7753. "adds r3, r3, r7\n\t"
  7754. "adc r4, r4, #0\n\t"
  7755. "lsr r7, r8, #16\n\t"
  7756. "mul r6, r7, r6\n\t"
  7757. "lsr r7, r6, #16\n\t"
  7758. "lsl r6, r6, #16\n\t"
  7759. "adds r3, r3, r6\n\t"
  7760. "adc r4, r4, r7\n\t"
  7761. "lsr r6, %[b], #16\n\t"
  7762. "lsr r7, r8, #16\n\t"
  7763. "mul r7, r6, r7\n\t"
  7764. "add r4, r4, r7\n\t"
  7765. "lsl r7, r8, #16\n\t"
  7766. "lsr r7, r7, #16\n\t"
  7767. "mul r6, r7, r6\n\t"
  7768. "lsr r7, r6, #16\n\t"
  7769. "lsl r6, r6, #16\n\t"
  7770. "adds r3, r3, r6\n\t"
  7771. "adc r4, r4, r7\n\t"
  7772. #else
  7773. "umlal r3, r4, %[b], r8\n\t"
  7774. #endif
  7775. "stm %[r]!, {r3}\n\t"
  7776. "mov r5, #0\n\t"
  7777. /* A[49] * B */
  7778. "ldm %[a]!, {r8}\n\t"
  7779. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  7780. "lsl r6, %[b], #16\n\t"
  7781. "lsl r7, r8, #16\n\t"
  7782. "lsr r6, r6, #16\n\t"
  7783. "lsr r7, r7, #16\n\t"
  7784. "mul r7, r6, r7\n\t"
  7785. "adds r4, r4, r7\n\t"
  7786. "adc r5, r5, #0\n\t"
  7787. "lsr r7, r8, #16\n\t"
  7788. "mul r6, r7, r6\n\t"
  7789. "lsr r7, r6, #16\n\t"
  7790. "lsl r6, r6, #16\n\t"
  7791. "adds r4, r4, r6\n\t"
  7792. "adc r5, r5, r7\n\t"
  7793. "lsr r6, %[b], #16\n\t"
  7794. "lsr r7, r8, #16\n\t"
  7795. "mul r7, r6, r7\n\t"
  7796. "add r5, r5, r7\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 r4, r4, r6\n\t"
  7803. "adc r5, r5, r7\n\t"
  7804. #else
  7805. "umlal r4, r5, %[b], r8\n\t"
  7806. #endif
  7807. "stm %[r]!, {r4}\n\t"
  7808. "mov r3, #0\n\t"
  7809. /* A[50] * B */
  7810. "ldm %[a]!, {r8}\n\t"
  7811. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  7812. "lsl r6, %[b], #16\n\t"
  7813. "lsl r7, r8, #16\n\t"
  7814. "lsr r6, r6, #16\n\t"
  7815. "lsr r7, r7, #16\n\t"
  7816. "mul r7, r6, r7\n\t"
  7817. "adds r5, r5, r7\n\t"
  7818. "adc r3, r3, #0\n\t"
  7819. "lsr r7, r8, #16\n\t"
  7820. "mul r6, r7, r6\n\t"
  7821. "lsr r7, r6, #16\n\t"
  7822. "lsl r6, r6, #16\n\t"
  7823. "adds r5, r5, r6\n\t"
  7824. "adc r3, r3, r7\n\t"
  7825. "lsr r6, %[b], #16\n\t"
  7826. "lsr r7, r8, #16\n\t"
  7827. "mul r7, r6, r7\n\t"
  7828. "add r3, r3, r7\n\t"
  7829. "lsl r7, r8, #16\n\t"
  7830. "lsr r7, r7, #16\n\t"
  7831. "mul r6, r7, r6\n\t"
  7832. "lsr r7, r6, #16\n\t"
  7833. "lsl r6, r6, #16\n\t"
  7834. "adds r5, r5, r6\n\t"
  7835. "adc r3, r3, r7\n\t"
  7836. #else
  7837. "umlal r5, r3, %[b], r8\n\t"
  7838. #endif
  7839. "stm %[r]!, {r5}\n\t"
  7840. "mov r4, #0\n\t"
  7841. /* A[51] * B */
  7842. "ldm %[a]!, {r8}\n\t"
  7843. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  7844. "lsl r6, %[b], #16\n\t"
  7845. "lsl r7, r8, #16\n\t"
  7846. "lsr r6, r6, #16\n\t"
  7847. "lsr r7, r7, #16\n\t"
  7848. "mul r7, r6, r7\n\t"
  7849. "adds r3, r3, r7\n\t"
  7850. "adc r4, r4, #0\n\t"
  7851. "lsr r7, r8, #16\n\t"
  7852. "mul r6, r7, r6\n\t"
  7853. "lsr r7, r6, #16\n\t"
  7854. "lsl r6, r6, #16\n\t"
  7855. "adds r3, r3, r6\n\t"
  7856. "adc r4, r4, r7\n\t"
  7857. "lsr r6, %[b], #16\n\t"
  7858. "lsr r7, r8, #16\n\t"
  7859. "mul r7, r6, r7\n\t"
  7860. "add r4, r4, r7\n\t"
  7861. "lsl r7, r8, #16\n\t"
  7862. "lsr r7, r7, #16\n\t"
  7863. "mul r6, r7, r6\n\t"
  7864. "lsr r7, r6, #16\n\t"
  7865. "lsl r6, r6, #16\n\t"
  7866. "adds r3, r3, r6\n\t"
  7867. "adc r4, r4, r7\n\t"
  7868. #else
  7869. "umlal r3, r4, %[b], r8\n\t"
  7870. #endif
  7871. "stm %[r]!, {r3}\n\t"
  7872. "mov r5, #0\n\t"
  7873. /* A[52] * B */
  7874. "ldm %[a]!, {r8}\n\t"
  7875. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  7876. "lsl r6, %[b], #16\n\t"
  7877. "lsl r7, r8, #16\n\t"
  7878. "lsr r6, r6, #16\n\t"
  7879. "lsr r7, r7, #16\n\t"
  7880. "mul r7, r6, r7\n\t"
  7881. "adds r4, r4, r7\n\t"
  7882. "adc r5, r5, #0\n\t"
  7883. "lsr r7, r8, #16\n\t"
  7884. "mul r6, r7, r6\n\t"
  7885. "lsr r7, r6, #16\n\t"
  7886. "lsl r6, r6, #16\n\t"
  7887. "adds r4, r4, r6\n\t"
  7888. "adc r5, r5, r7\n\t"
  7889. "lsr r6, %[b], #16\n\t"
  7890. "lsr r7, r8, #16\n\t"
  7891. "mul r7, r6, r7\n\t"
  7892. "add r5, r5, r7\n\t"
  7893. "lsl r7, r8, #16\n\t"
  7894. "lsr r7, r7, #16\n\t"
  7895. "mul r6, r7, r6\n\t"
  7896. "lsr r7, r6, #16\n\t"
  7897. "lsl r6, r6, #16\n\t"
  7898. "adds r4, r4, r6\n\t"
  7899. "adc r5, r5, r7\n\t"
  7900. #else
  7901. "umlal r4, r5, %[b], r8\n\t"
  7902. #endif
  7903. "stm %[r]!, {r4}\n\t"
  7904. "mov r3, #0\n\t"
  7905. /* A[53] * B */
  7906. "ldm %[a]!, {r8}\n\t"
  7907. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  7908. "lsl r6, %[b], #16\n\t"
  7909. "lsl r7, r8, #16\n\t"
  7910. "lsr r6, r6, #16\n\t"
  7911. "lsr r7, r7, #16\n\t"
  7912. "mul r7, r6, r7\n\t"
  7913. "adds r5, r5, r7\n\t"
  7914. "adc r3, r3, #0\n\t"
  7915. "lsr r7, r8, #16\n\t"
  7916. "mul r6, r7, r6\n\t"
  7917. "lsr r7, r6, #16\n\t"
  7918. "lsl r6, r6, #16\n\t"
  7919. "adds r5, r5, r6\n\t"
  7920. "adc r3, r3, r7\n\t"
  7921. "lsr r6, %[b], #16\n\t"
  7922. "lsr r7, r8, #16\n\t"
  7923. "mul r7, r6, r7\n\t"
  7924. "add r3, r3, r7\n\t"
  7925. "lsl r7, r8, #16\n\t"
  7926. "lsr r7, r7, #16\n\t"
  7927. "mul r6, r7, r6\n\t"
  7928. "lsr r7, r6, #16\n\t"
  7929. "lsl r6, r6, #16\n\t"
  7930. "adds r5, r5, r6\n\t"
  7931. "adc r3, r3, r7\n\t"
  7932. #else
  7933. "umlal r5, r3, %[b], r8\n\t"
  7934. #endif
  7935. "stm %[r]!, {r5}\n\t"
  7936. "mov r4, #0\n\t"
  7937. /* A[54] * B */
  7938. "ldm %[a]!, {r8}\n\t"
  7939. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  7940. "lsl r6, %[b], #16\n\t"
  7941. "lsl r7, r8, #16\n\t"
  7942. "lsr r6, r6, #16\n\t"
  7943. "lsr r7, r7, #16\n\t"
  7944. "mul r7, r6, r7\n\t"
  7945. "adds r3, r3, r7\n\t"
  7946. "adc r4, r4, #0\n\t"
  7947. "lsr r7, r8, #16\n\t"
  7948. "mul r6, r7, r6\n\t"
  7949. "lsr r7, r6, #16\n\t"
  7950. "lsl r6, r6, #16\n\t"
  7951. "adds r3, r3, r6\n\t"
  7952. "adc r4, r4, r7\n\t"
  7953. "lsr r6, %[b], #16\n\t"
  7954. "lsr r7, r8, #16\n\t"
  7955. "mul r7, r6, r7\n\t"
  7956. "add r4, r4, r7\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 r3, r3, r6\n\t"
  7963. "adc r4, r4, r7\n\t"
  7964. #else
  7965. "umlal r3, r4, %[b], r8\n\t"
  7966. #endif
  7967. "stm %[r]!, {r3}\n\t"
  7968. "mov r5, #0\n\t"
  7969. /* A[55] * B */
  7970. "ldm %[a]!, {r8}\n\t"
  7971. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  7972. "lsl r6, %[b], #16\n\t"
  7973. "lsl r7, r8, #16\n\t"
  7974. "lsr r6, r6, #16\n\t"
  7975. "lsr r7, r7, #16\n\t"
  7976. "mul r7, r6, r7\n\t"
  7977. "adds r4, r4, r7\n\t"
  7978. "adc r5, r5, #0\n\t"
  7979. "lsr r7, r8, #16\n\t"
  7980. "mul r6, r7, r6\n\t"
  7981. "lsr r7, r6, #16\n\t"
  7982. "lsl r6, r6, #16\n\t"
  7983. "adds r4, r4, r6\n\t"
  7984. "adc r5, r5, r7\n\t"
  7985. "lsr r6, %[b], #16\n\t"
  7986. "lsr r7, r8, #16\n\t"
  7987. "mul r7, r6, r7\n\t"
  7988. "add r5, r5, r7\n\t"
  7989. "lsl r7, r8, #16\n\t"
  7990. "lsr r7, r7, #16\n\t"
  7991. "mul r6, r7, r6\n\t"
  7992. "lsr r7, r6, #16\n\t"
  7993. "lsl r6, r6, #16\n\t"
  7994. "adds r4, r4, r6\n\t"
  7995. "adc r5, r5, r7\n\t"
  7996. #else
  7997. "umlal r4, r5, %[b], r8\n\t"
  7998. #endif
  7999. "stm %[r]!, {r4}\n\t"
  8000. "mov r3, #0\n\t"
  8001. /* A[56] * B */
  8002. "ldm %[a]!, {r8}\n\t"
  8003. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  8004. "lsl r6, %[b], #16\n\t"
  8005. "lsl r7, r8, #16\n\t"
  8006. "lsr r6, r6, #16\n\t"
  8007. "lsr r7, r7, #16\n\t"
  8008. "mul r7, r6, r7\n\t"
  8009. "adds r5, r5, r7\n\t"
  8010. "adc r3, r3, #0\n\t"
  8011. "lsr r7, r8, #16\n\t"
  8012. "mul r6, r7, r6\n\t"
  8013. "lsr r7, r6, #16\n\t"
  8014. "lsl r6, r6, #16\n\t"
  8015. "adds r5, r5, r6\n\t"
  8016. "adc r3, r3, r7\n\t"
  8017. "lsr r6, %[b], #16\n\t"
  8018. "lsr r7, r8, #16\n\t"
  8019. "mul r7, r6, r7\n\t"
  8020. "add r3, r3, r7\n\t"
  8021. "lsl r7, r8, #16\n\t"
  8022. "lsr r7, r7, #16\n\t"
  8023. "mul r6, r7, r6\n\t"
  8024. "lsr r7, r6, #16\n\t"
  8025. "lsl r6, r6, #16\n\t"
  8026. "adds r5, r5, r6\n\t"
  8027. "adc r3, r3, r7\n\t"
  8028. #else
  8029. "umlal r5, r3, %[b], r8\n\t"
  8030. #endif
  8031. "stm %[r]!, {r5}\n\t"
  8032. "mov r4, #0\n\t"
  8033. /* A[57] * B */
  8034. "ldm %[a]!, {r8}\n\t"
  8035. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  8036. "lsl r6, %[b], #16\n\t"
  8037. "lsl r7, r8, #16\n\t"
  8038. "lsr r6, r6, #16\n\t"
  8039. "lsr r7, r7, #16\n\t"
  8040. "mul r7, r6, r7\n\t"
  8041. "adds r3, r3, r7\n\t"
  8042. "adc r4, r4, #0\n\t"
  8043. "lsr r7, r8, #16\n\t"
  8044. "mul r6, r7, r6\n\t"
  8045. "lsr r7, r6, #16\n\t"
  8046. "lsl r6, r6, #16\n\t"
  8047. "adds r3, r3, r6\n\t"
  8048. "adc r4, r4, r7\n\t"
  8049. "lsr r6, %[b], #16\n\t"
  8050. "lsr r7, r8, #16\n\t"
  8051. "mul r7, r6, r7\n\t"
  8052. "add r4, r4, r7\n\t"
  8053. "lsl r7, r8, #16\n\t"
  8054. "lsr r7, r7, #16\n\t"
  8055. "mul r6, r7, r6\n\t"
  8056. "lsr r7, r6, #16\n\t"
  8057. "lsl r6, r6, #16\n\t"
  8058. "adds r3, r3, r6\n\t"
  8059. "adc r4, r4, r7\n\t"
  8060. #else
  8061. "umlal r3, r4, %[b], r8\n\t"
  8062. #endif
  8063. "stm %[r]!, {r3}\n\t"
  8064. "mov r5, #0\n\t"
  8065. /* A[58] * B */
  8066. "ldm %[a]!, {r8}\n\t"
  8067. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  8068. "lsl r6, %[b], #16\n\t"
  8069. "lsl r7, r8, #16\n\t"
  8070. "lsr r6, r6, #16\n\t"
  8071. "lsr r7, r7, #16\n\t"
  8072. "mul r7, r6, r7\n\t"
  8073. "adds r4, r4, r7\n\t"
  8074. "adc r5, r5, #0\n\t"
  8075. "lsr r7, r8, #16\n\t"
  8076. "mul r6, r7, r6\n\t"
  8077. "lsr r7, r6, #16\n\t"
  8078. "lsl r6, r6, #16\n\t"
  8079. "adds r4, r4, r6\n\t"
  8080. "adc r5, r5, r7\n\t"
  8081. "lsr r6, %[b], #16\n\t"
  8082. "lsr r7, r8, #16\n\t"
  8083. "mul r7, r6, r7\n\t"
  8084. "add r5, r5, r7\n\t"
  8085. "lsl r7, r8, #16\n\t"
  8086. "lsr r7, r7, #16\n\t"
  8087. "mul r6, r7, r6\n\t"
  8088. "lsr r7, r6, #16\n\t"
  8089. "lsl r6, r6, #16\n\t"
  8090. "adds r4, r4, r6\n\t"
  8091. "adc r5, r5, r7\n\t"
  8092. #else
  8093. "umlal r4, r5, %[b], r8\n\t"
  8094. #endif
  8095. "stm %[r]!, {r4}\n\t"
  8096. "mov r3, #0\n\t"
  8097. /* A[59] * B */
  8098. "ldm %[a]!, {r8}\n\t"
  8099. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  8100. "lsl r6, %[b], #16\n\t"
  8101. "lsl r7, r8, #16\n\t"
  8102. "lsr r6, r6, #16\n\t"
  8103. "lsr r7, r7, #16\n\t"
  8104. "mul r7, r6, r7\n\t"
  8105. "adds r5, r5, r7\n\t"
  8106. "adc r3, r3, #0\n\t"
  8107. "lsr r7, r8, #16\n\t"
  8108. "mul r6, r7, r6\n\t"
  8109. "lsr r7, r6, #16\n\t"
  8110. "lsl r6, r6, #16\n\t"
  8111. "adds r5, r5, r6\n\t"
  8112. "adc r3, r3, r7\n\t"
  8113. "lsr r6, %[b], #16\n\t"
  8114. "lsr r7, r8, #16\n\t"
  8115. "mul r7, r6, r7\n\t"
  8116. "add r3, r3, r7\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. "adc r3, r3, r7\n\t"
  8124. #else
  8125. "umlal r5, r3, %[b], r8\n\t"
  8126. #endif
  8127. "stm %[r]!, {r5}\n\t"
  8128. "mov r4, #0\n\t"
  8129. /* A[60] * B */
  8130. "ldm %[a]!, {r8}\n\t"
  8131. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  8132. "lsl r6, %[b], #16\n\t"
  8133. "lsl r7, r8, #16\n\t"
  8134. "lsr r6, r6, #16\n\t"
  8135. "lsr r7, r7, #16\n\t"
  8136. "mul r7, r6, r7\n\t"
  8137. "adds r3, r3, r7\n\t"
  8138. "adc r4, r4, #0\n\t"
  8139. "lsr r7, r8, #16\n\t"
  8140. "mul r6, r7, r6\n\t"
  8141. "lsr r7, r6, #16\n\t"
  8142. "lsl r6, r6, #16\n\t"
  8143. "adds r3, r3, r6\n\t"
  8144. "adc r4, r4, r7\n\t"
  8145. "lsr r6, %[b], #16\n\t"
  8146. "lsr r7, r8, #16\n\t"
  8147. "mul r7, r6, r7\n\t"
  8148. "add r4, r4, r7\n\t"
  8149. "lsl r7, r8, #16\n\t"
  8150. "lsr r7, r7, #16\n\t"
  8151. "mul r6, r7, r6\n\t"
  8152. "lsr r7, r6, #16\n\t"
  8153. "lsl r6, r6, #16\n\t"
  8154. "adds r3, r3, r6\n\t"
  8155. "adc r4, r4, r7\n\t"
  8156. #else
  8157. "umlal r3, r4, %[b], r8\n\t"
  8158. #endif
  8159. "stm %[r]!, {r3}\n\t"
  8160. "mov r5, #0\n\t"
  8161. /* A[61] * B */
  8162. "ldm %[a]!, {r8}\n\t"
  8163. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  8164. "lsl r6, %[b], #16\n\t"
  8165. "lsl r7, r8, #16\n\t"
  8166. "lsr r6, r6, #16\n\t"
  8167. "lsr r7, r7, #16\n\t"
  8168. "mul r7, r6, r7\n\t"
  8169. "adds r4, r4, r7\n\t"
  8170. "adc r5, r5, #0\n\t"
  8171. "lsr r7, r8, #16\n\t"
  8172. "mul r6, r7, r6\n\t"
  8173. "lsr r7, r6, #16\n\t"
  8174. "lsl r6, r6, #16\n\t"
  8175. "adds r4, r4, r6\n\t"
  8176. "adc r5, r5, r7\n\t"
  8177. "lsr r6, %[b], #16\n\t"
  8178. "lsr r7, r8, #16\n\t"
  8179. "mul r7, r6, r7\n\t"
  8180. "add r5, r5, r7\n\t"
  8181. "lsl r7, r8, #16\n\t"
  8182. "lsr r7, r7, #16\n\t"
  8183. "mul r6, r7, r6\n\t"
  8184. "lsr r7, r6, #16\n\t"
  8185. "lsl r6, r6, #16\n\t"
  8186. "adds r4, r4, r6\n\t"
  8187. "adc r5, r5, r7\n\t"
  8188. #else
  8189. "umlal r4, r5, %[b], r8\n\t"
  8190. #endif
  8191. "stm %[r]!, {r4}\n\t"
  8192. "mov r3, #0\n\t"
  8193. /* A[62] * B */
  8194. "ldm %[a]!, {r8}\n\t"
  8195. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  8196. "lsl r6, %[b], #16\n\t"
  8197. "lsl r7, r8, #16\n\t"
  8198. "lsr r6, r6, #16\n\t"
  8199. "lsr r7, r7, #16\n\t"
  8200. "mul r7, r6, r7\n\t"
  8201. "adds r5, r5, r7\n\t"
  8202. "adc r3, r3, #0\n\t"
  8203. "lsr r7, r8, #16\n\t"
  8204. "mul r6, r7, r6\n\t"
  8205. "lsr r7, r6, #16\n\t"
  8206. "lsl r6, r6, #16\n\t"
  8207. "adds r5, r5, r6\n\t"
  8208. "adc r3, r3, r7\n\t"
  8209. "lsr r6, %[b], #16\n\t"
  8210. "lsr r7, r8, #16\n\t"
  8211. "mul r7, r6, r7\n\t"
  8212. "add r3, r3, r7\n\t"
  8213. "lsl r7, r8, #16\n\t"
  8214. "lsr r7, r7, #16\n\t"
  8215. "mul r6, r7, r6\n\t"
  8216. "lsr r7, r6, #16\n\t"
  8217. "lsl r6, r6, #16\n\t"
  8218. "adds r5, r5, r6\n\t"
  8219. "adc r3, r3, r7\n\t"
  8220. #else
  8221. "umlal r5, r3, %[b], r8\n\t"
  8222. #endif
  8223. "stm %[r]!, {r5}\n\t"
  8224. "mov r4, #0\n\t"
  8225. /* A[63] * B */
  8226. "ldm %[a]!, {r8}\n\t"
  8227. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  8228. "lsl r6, %[b], #16\n\t"
  8229. "lsl r7, r8, #16\n\t"
  8230. "lsr r6, r6, #16\n\t"
  8231. "lsr r7, r7, #16\n\t"
  8232. "mul r7, r6, r7\n\t"
  8233. "adds r3, r3, r7\n\t"
  8234. "adc r4, r4, #0\n\t"
  8235. "lsr r7, r8, #16\n\t"
  8236. "mul r6, r7, r6\n\t"
  8237. "lsr r7, r6, #16\n\t"
  8238. "lsl r6, r6, #16\n\t"
  8239. "adds r3, r3, r6\n\t"
  8240. "adc r4, r4, r7\n\t"
  8241. "lsr r6, %[b], #16\n\t"
  8242. "lsr r7, r8, #16\n\t"
  8243. "mul r7, r6, r7\n\t"
  8244. "add r4, r4, r7\n\t"
  8245. "lsl r7, r8, #16\n\t"
  8246. "lsr r7, r7, #16\n\t"
  8247. "mul r6, r7, r6\n\t"
  8248. "lsr r7, r6, #16\n\t"
  8249. "lsl r6, r6, #16\n\t"
  8250. "adds r3, r3, r6\n\t"
  8251. "adc r4, r4, r7\n\t"
  8252. #else
  8253. "umlal r3, r4, %[b], r8\n\t"
  8254. #endif
  8255. "stm %[r]!, {r3}\n\t"
  8256. "str r4, [%[r]]\n\t"
  8257. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  8258. :
  8259. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "cc"
  8260. );
  8261. }
  8262. #endif /* WOLFSSL_SP_SMALL */
  8263. #if (defined(WOLFSSL_HAVE_SP_RSA) && !defined(WOLFSSL_RSA_PUBLIC_ONLY)) || defined(WOLFSSL_HAVE_SP_DH)
  8264. /* r = 2^n mod m where n is the number of bits to reduce by.
  8265. * Given m must be 2048 bits, just need to subtract.
  8266. *
  8267. * r A single precision number.
  8268. * m A single precision number.
  8269. */
  8270. static void sp_2048_mont_norm_32(sp_digit* r, const sp_digit* m)
  8271. {
  8272. XMEMSET(r, 0, sizeof(sp_digit) * 32);
  8273. /* r = 2^n mod m */
  8274. sp_2048_sub_in_place_32(r, m);
  8275. }
  8276. #ifdef WOLFSSL_SP_SMALL
  8277. /* Conditionally subtract b from a using the mask m.
  8278. * m is -1 to subtract and 0 when not copying.
  8279. *
  8280. * r A single precision number representing condition subtract result.
  8281. * a A single precision number to subtract from.
  8282. * b A single precision number to subtract.
  8283. * m Mask value to apply.
  8284. */
  8285. 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)
  8286. {
  8287. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  8288. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  8289. register const sp_digit* b asm ("r2") = (const sp_digit*)b_p;
  8290. register sp_digit m asm ("r3") = (sp_digit)m_p;
  8291. __asm__ __volatile__ (
  8292. "mov r6, #0\n\t"
  8293. "mov r12, #0\n\t"
  8294. "mov lr, #0\n\t"
  8295. "\n"
  8296. "L_sp_2048_cond_sub_32_words_%=: \n\t"
  8297. "subs r12, r6, r12\n\t"
  8298. "ldr r4, [%[a], lr]\n\t"
  8299. "ldr r5, [%[b], lr]\n\t"
  8300. "and r5, r5, %[m]\n\t"
  8301. "sbcs r4, r4, r5\n\t"
  8302. "sbc r12, r6, r6\n\t"
  8303. "str r4, [%[r], lr]\n\t"
  8304. "add lr, lr, #4\n\t"
  8305. "cmp lr, #0x80\n\t"
  8306. "blt L_sp_2048_cond_sub_32_words_%=\n\t"
  8307. "mov %[r], r12\n\t"
  8308. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b), [m] "+r" (m)
  8309. :
  8310. : "memory", "r12", "lr", "r4", "r5", "r6", "cc"
  8311. );
  8312. return (uint32_t)(size_t)r;
  8313. }
  8314. #else
  8315. /* Conditionally subtract b from a using the mask m.
  8316. * m is -1 to subtract and 0 when not copying.
  8317. *
  8318. * r A single precision number representing condition subtract result.
  8319. * a A single precision number to subtract from.
  8320. * b A single precision number to subtract.
  8321. * m Mask value to apply.
  8322. */
  8323. 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)
  8324. {
  8325. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  8326. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  8327. register const sp_digit* b asm ("r2") = (const sp_digit*)b_p;
  8328. register sp_digit m asm ("r3") = (sp_digit)m_p;
  8329. __asm__ __volatile__ (
  8330. "mov lr, #0\n\t"
  8331. "ldm %[a]!, {r4, r5}\n\t"
  8332. "ldm %[b]!, {r6, r7}\n\t"
  8333. "and r6, r6, %[m]\n\t"
  8334. "and r7, r7, %[m]\n\t"
  8335. "subs r4, r4, r6\n\t"
  8336. "sbcs r5, r5, r7\n\t"
  8337. "stm %[r]!, {r4, r5}\n\t"
  8338. "ldm %[a]!, {r4, r5}\n\t"
  8339. "ldm %[b]!, {r6, r7}\n\t"
  8340. "and r6, r6, %[m]\n\t"
  8341. "and r7, r7, %[m]\n\t"
  8342. "sbcs r4, r4, r6\n\t"
  8343. "sbcs r5, r5, r7\n\t"
  8344. "stm %[r]!, {r4, r5}\n\t"
  8345. "ldm %[a]!, {r4, r5}\n\t"
  8346. "ldm %[b]!, {r6, r7}\n\t"
  8347. "and r6, r6, %[m]\n\t"
  8348. "and r7, r7, %[m]\n\t"
  8349. "sbcs r4, r4, r6\n\t"
  8350. "sbcs r5, r5, r7\n\t"
  8351. "stm %[r]!, {r4, r5}\n\t"
  8352. "ldm %[a]!, {r4, r5}\n\t"
  8353. "ldm %[b]!, {r6, r7}\n\t"
  8354. "and r6, r6, %[m]\n\t"
  8355. "and r7, r7, %[m]\n\t"
  8356. "sbcs r4, r4, r6\n\t"
  8357. "sbcs r5, r5, r7\n\t"
  8358. "stm %[r]!, {r4, r5}\n\t"
  8359. "ldm %[a]!, {r4, r5}\n\t"
  8360. "ldm %[b]!, {r6, r7}\n\t"
  8361. "and r6, r6, %[m]\n\t"
  8362. "and r7, r7, %[m]\n\t"
  8363. "sbcs r4, r4, r6\n\t"
  8364. "sbcs r5, r5, r7\n\t"
  8365. "stm %[r]!, {r4, r5}\n\t"
  8366. "ldm %[a]!, {r4, r5}\n\t"
  8367. "ldm %[b]!, {r6, r7}\n\t"
  8368. "and r6, r6, %[m]\n\t"
  8369. "and r7, r7, %[m]\n\t"
  8370. "sbcs r4, r4, r6\n\t"
  8371. "sbcs r5, r5, r7\n\t"
  8372. "stm %[r]!, {r4, r5}\n\t"
  8373. "ldm %[a]!, {r4, r5}\n\t"
  8374. "ldm %[b]!, {r6, r7}\n\t"
  8375. "and r6, r6, %[m]\n\t"
  8376. "and r7, r7, %[m]\n\t"
  8377. "sbcs r4, r4, r6\n\t"
  8378. "sbcs r5, r5, r7\n\t"
  8379. "stm %[r]!, {r4, r5}\n\t"
  8380. "ldm %[a]!, {r4, r5}\n\t"
  8381. "ldm %[b]!, {r6, r7}\n\t"
  8382. "and r6, r6, %[m]\n\t"
  8383. "and r7, r7, %[m]\n\t"
  8384. "sbcs r4, r4, r6\n\t"
  8385. "sbcs r5, r5, r7\n\t"
  8386. "stm %[r]!, {r4, r5}\n\t"
  8387. "ldm %[a]!, {r4, r5}\n\t"
  8388. "ldm %[b]!, {r6, r7}\n\t"
  8389. "and r6, r6, %[m]\n\t"
  8390. "and r7, r7, %[m]\n\t"
  8391. "sbcs r4, r4, r6\n\t"
  8392. "sbcs r5, r5, r7\n\t"
  8393. "stm %[r]!, {r4, r5}\n\t"
  8394. "ldm %[a]!, {r4, r5}\n\t"
  8395. "ldm %[b]!, {r6, r7}\n\t"
  8396. "and r6, r6, %[m]\n\t"
  8397. "and r7, r7, %[m]\n\t"
  8398. "sbcs r4, r4, r6\n\t"
  8399. "sbcs r5, r5, r7\n\t"
  8400. "stm %[r]!, {r4, r5}\n\t"
  8401. "ldm %[a]!, {r4, r5}\n\t"
  8402. "ldm %[b]!, {r6, r7}\n\t"
  8403. "and r6, r6, %[m]\n\t"
  8404. "and r7, r7, %[m]\n\t"
  8405. "sbcs r4, r4, r6\n\t"
  8406. "sbcs r5, r5, r7\n\t"
  8407. "stm %[r]!, {r4, r5}\n\t"
  8408. "ldm %[a]!, {r4, r5}\n\t"
  8409. "ldm %[b]!, {r6, r7}\n\t"
  8410. "and r6, r6, %[m]\n\t"
  8411. "and r7, r7, %[m]\n\t"
  8412. "sbcs r4, r4, r6\n\t"
  8413. "sbcs r5, r5, r7\n\t"
  8414. "stm %[r]!, {r4, r5}\n\t"
  8415. "ldm %[a]!, {r4, r5}\n\t"
  8416. "ldm %[b]!, {r6, r7}\n\t"
  8417. "and r6, r6, %[m]\n\t"
  8418. "and r7, r7, %[m]\n\t"
  8419. "sbcs r4, r4, r6\n\t"
  8420. "sbcs r5, r5, r7\n\t"
  8421. "stm %[r]!, {r4, r5}\n\t"
  8422. "ldm %[a]!, {r4, r5}\n\t"
  8423. "ldm %[b]!, {r6, r7}\n\t"
  8424. "and r6, r6, %[m]\n\t"
  8425. "and r7, r7, %[m]\n\t"
  8426. "sbcs r4, r4, r6\n\t"
  8427. "sbcs r5, r5, r7\n\t"
  8428. "stm %[r]!, {r4, r5}\n\t"
  8429. "ldm %[a]!, {r4, r5}\n\t"
  8430. "ldm %[b]!, {r6, r7}\n\t"
  8431. "and r6, r6, %[m]\n\t"
  8432. "and r7, r7, %[m]\n\t"
  8433. "sbcs r4, r4, r6\n\t"
  8434. "sbcs r5, r5, r7\n\t"
  8435. "stm %[r]!, {r4, r5}\n\t"
  8436. "ldm %[a]!, {r4, r5}\n\t"
  8437. "ldm %[b]!, {r6, r7}\n\t"
  8438. "and r6, r6, %[m]\n\t"
  8439. "and r7, r7, %[m]\n\t"
  8440. "sbcs r4, r4, r6\n\t"
  8441. "sbcs r5, r5, r7\n\t"
  8442. "stm %[r]!, {r4, r5}\n\t"
  8443. "sbc %[r], lr, lr\n\t"
  8444. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b), [m] "+r" (m)
  8445. :
  8446. : "memory", "r12", "lr", "r4", "r5", "r6", "r7", "cc"
  8447. );
  8448. return (uint32_t)(size_t)r;
  8449. }
  8450. #endif /* WOLFSSL_SP_SMALL */
  8451. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  8452. /* Reduce the number back to 2048 bits using Montgomery reduction.
  8453. *
  8454. * a A single precision number to reduce in place.
  8455. * m The single precision number representing the modulus.
  8456. * mp The digit representing the negative inverse of m mod 2^n.
  8457. */
  8458. static SP_NOINLINE void sp_2048_mont_reduce_32(sp_digit* a_p, const sp_digit* m_p, sp_digit mp_p)
  8459. {
  8460. register sp_digit* a asm ("r0") = (sp_digit*)a_p;
  8461. register const sp_digit* m asm ("r1") = (const sp_digit*)m_p;
  8462. register sp_digit mp asm ("r2") = (sp_digit)mp_p;
  8463. __asm__ __volatile__ (
  8464. #if !(defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4))
  8465. "ldr r11, [%[m]]\n\t"
  8466. #endif
  8467. /* i = 0 */
  8468. "mov r9, #0\n\t"
  8469. "mov r3, #0\n\t"
  8470. "ldr r12, [%[a]]\n\t"
  8471. "ldr lr, [%[a], #4]\n\t"
  8472. "\n"
  8473. "L_sp_2048_mont_reduce_32_word_%=: \n\t"
  8474. /* mu = a[i] * mp */
  8475. "mul r8, %[mp], r12\n\t"
  8476. /* a[i+0] += m[0] * mu */
  8477. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  8478. "ldr r11, [%[m]]\n\t"
  8479. #endif
  8480. "lsr r7, r11, #16\n\t"
  8481. "lsr r6, r8, #16\n\t"
  8482. "mul r5, r6, r7\n\t"
  8483. "lsl r7, r11, #16\n\t"
  8484. "lsr r7, r7, #16\n\t"
  8485. "mul r6, r7, r6\n\t"
  8486. "lsr r7, r6, #16\n\t"
  8487. "lsl r6, r6, #16\n\t"
  8488. "adds r12, r12, r6\n\t"
  8489. "adc r5, r5, r7\n\t"
  8490. "lsl r6, r8, #16\n\t"
  8491. "lsl r7, r11, #16\n\t"
  8492. "lsr r6, r6, #16\n\t"
  8493. "lsr r7, r7, #16\n\t"
  8494. "mul r7, r6, r7\n\t"
  8495. "adds r12, r12, r7\n\t"
  8496. "adc r5, r5, #0\n\t"
  8497. "lsr r7, r11, #16\n\t"
  8498. "mul r6, r7, r6\n\t"
  8499. "lsr r7, r6, #16\n\t"
  8500. "lsl r6, r6, #16\n\t"
  8501. "adds r12, r12, r6\n\t"
  8502. "adc r5, r5, r7\n\t"
  8503. /* a[i+1] += m[1] * mu */
  8504. "ldr r7, [%[m], #4]\n\t"
  8505. "lsr r10, r7, #16\n\t"
  8506. "lsr r6, r8, #16\n\t"
  8507. "mul r4, r6, r10\n\t"
  8508. "lsl r10, r7, #16\n\t"
  8509. "lsr r10, r10, #16\n\t"
  8510. "mul r6, r10, r6\n\t"
  8511. "lsr r10, r6, #16\n\t"
  8512. "lsl r6, r6, #16\n\t"
  8513. "adds lr, lr, r6\n\t"
  8514. "adc r4, r4, r10\n\t"
  8515. "lsl r6, r8, #16\n\t"
  8516. "lsl r10, r7, #16\n\t"
  8517. "lsr r6, r6, #16\n\t"
  8518. "lsr r10, r10, #16\n\t"
  8519. "mul r10, r6, r10\n\t"
  8520. "adds lr, lr, r10\n\t"
  8521. "adc r4, r4, #0\n\t"
  8522. "lsr r10, r7, #16\n\t"
  8523. "mul r6, r10, r6\n\t"
  8524. "lsr r10, r6, #16\n\t"
  8525. "lsl r6, r6, #16\n\t"
  8526. "adds lr, lr, r6\n\t"
  8527. "adc r4, r4, r10\n\t"
  8528. "mov r12, lr\n\t"
  8529. "adds r12, r12, r5\n\t"
  8530. "adc r4, r4, #0\n\t"
  8531. /* a[i+2] += m[2] * mu */
  8532. "ldr r7, [%[m], #8]\n\t"
  8533. "ldr lr, [%[a], #8]\n\t"
  8534. "lsr r10, r7, #16\n\t"
  8535. "lsr r6, r8, #16\n\t"
  8536. "mul r5, r6, r10\n\t"
  8537. "lsl r10, r7, #16\n\t"
  8538. "lsr r10, r10, #16\n\t"
  8539. "mul r6, r10, r6\n\t"
  8540. "lsr r10, r6, #16\n\t"
  8541. "lsl r6, r6, #16\n\t"
  8542. "adds lr, lr, r6\n\t"
  8543. "adc r5, r5, r10\n\t"
  8544. "lsl r6, r8, #16\n\t"
  8545. "lsl r10, r7, #16\n\t"
  8546. "lsr r6, r6, #16\n\t"
  8547. "lsr r10, r10, #16\n\t"
  8548. "mul r10, r6, r10\n\t"
  8549. "adds lr, lr, r10\n\t"
  8550. "adc r5, r5, #0\n\t"
  8551. "lsr r10, r7, #16\n\t"
  8552. "mul r6, r10, r6\n\t"
  8553. "lsr r10, r6, #16\n\t"
  8554. "lsl r6, r6, #16\n\t"
  8555. "adds lr, lr, r6\n\t"
  8556. "adc r5, r5, r10\n\t"
  8557. "adds lr, lr, r4\n\t"
  8558. "adc r5, r5, #0\n\t"
  8559. /* a[i+3] += m[3] * mu */
  8560. "ldr r7, [%[m], #12]\n\t"
  8561. "ldr r10, [%[a], #12]\n\t"
  8562. "lsr r11, r7, #16\n\t"
  8563. "lsr r6, r8, #16\n\t"
  8564. "mul r4, r6, r11\n\t"
  8565. "lsl r11, r7, #16\n\t"
  8566. "lsr r11, r11, #16\n\t"
  8567. "mul r6, r11, r6\n\t"
  8568. "lsr r11, r6, #16\n\t"
  8569. "lsl r6, r6, #16\n\t"
  8570. "adds r10, r10, r6\n\t"
  8571. "adc r4, r4, r11\n\t"
  8572. "lsl r6, r8, #16\n\t"
  8573. "lsl r11, r7, #16\n\t"
  8574. "lsr r6, r6, #16\n\t"
  8575. "lsr r11, r11, #16\n\t"
  8576. "mul r11, r6, r11\n\t"
  8577. "adds r10, r10, r11\n\t"
  8578. "adc r4, r4, #0\n\t"
  8579. "lsr r11, r7, #16\n\t"
  8580. "mul r6, r11, r6\n\t"
  8581. "lsr r11, r6, #16\n\t"
  8582. "lsl r6, r6, #16\n\t"
  8583. "adds r10, r10, r6\n\t"
  8584. "adc r4, r4, r11\n\t"
  8585. "adds r10, r10, r5\n\t"
  8586. "str r10, [%[a], #12]\n\t"
  8587. "adc r4, r4, #0\n\t"
  8588. /* a[i+4] += m[4] * mu */
  8589. "ldr r7, [%[m], #16]\n\t"
  8590. "ldr r10, [%[a], #16]\n\t"
  8591. "lsr r11, r7, #16\n\t"
  8592. "lsr r6, r8, #16\n\t"
  8593. "mul r5, r6, r11\n\t"
  8594. "lsl r11, r7, #16\n\t"
  8595. "lsr r11, r11, #16\n\t"
  8596. "mul r6, r11, r6\n\t"
  8597. "lsr r11, r6, #16\n\t"
  8598. "lsl r6, r6, #16\n\t"
  8599. "adds r10, r10, r6\n\t"
  8600. "adc r5, r5, r11\n\t"
  8601. "lsl r6, r8, #16\n\t"
  8602. "lsl r11, r7, #16\n\t"
  8603. "lsr r6, r6, #16\n\t"
  8604. "lsr r11, r11, #16\n\t"
  8605. "mul r11, r6, r11\n\t"
  8606. "adds r10, r10, r11\n\t"
  8607. "adc r5, r5, #0\n\t"
  8608. "lsr r11, r7, #16\n\t"
  8609. "mul r6, r11, r6\n\t"
  8610. "lsr r11, r6, #16\n\t"
  8611. "lsl r6, r6, #16\n\t"
  8612. "adds r10, r10, r6\n\t"
  8613. "adc r5, r5, r11\n\t"
  8614. "adds r10, r10, r4\n\t"
  8615. "str r10, [%[a], #16]\n\t"
  8616. "adc r5, r5, #0\n\t"
  8617. /* a[i+5] += m[5] * mu */
  8618. "ldr r7, [%[m], #20]\n\t"
  8619. "ldr r10, [%[a], #20]\n\t"
  8620. "lsr r11, r7, #16\n\t"
  8621. "lsr r6, r8, #16\n\t"
  8622. "mul r4, r6, r11\n\t"
  8623. "lsl r11, r7, #16\n\t"
  8624. "lsr r11, r11, #16\n\t"
  8625. "mul r6, r11, r6\n\t"
  8626. "lsr r11, r6, #16\n\t"
  8627. "lsl r6, r6, #16\n\t"
  8628. "adds r10, r10, r6\n\t"
  8629. "adc r4, r4, r11\n\t"
  8630. "lsl r6, r8, #16\n\t"
  8631. "lsl r11, r7, #16\n\t"
  8632. "lsr r6, r6, #16\n\t"
  8633. "lsr r11, r11, #16\n\t"
  8634. "mul r11, r6, r11\n\t"
  8635. "adds r10, r10, r11\n\t"
  8636. "adc r4, r4, #0\n\t"
  8637. "lsr r11, r7, #16\n\t"
  8638. "mul r6, r11, r6\n\t"
  8639. "lsr r11, r6, #16\n\t"
  8640. "lsl r6, r6, #16\n\t"
  8641. "adds r10, r10, r6\n\t"
  8642. "adc r4, r4, r11\n\t"
  8643. "adds r10, r10, r5\n\t"
  8644. "str r10, [%[a], #20]\n\t"
  8645. "adc r4, r4, #0\n\t"
  8646. /* a[i+6] += m[6] * mu */
  8647. "ldr r7, [%[m], #24]\n\t"
  8648. "ldr r10, [%[a], #24]\n\t"
  8649. "lsr r11, r7, #16\n\t"
  8650. "lsr r6, r8, #16\n\t"
  8651. "mul r5, r6, r11\n\t"
  8652. "lsl r11, r7, #16\n\t"
  8653. "lsr r11, r11, #16\n\t"
  8654. "mul r6, r11, r6\n\t"
  8655. "lsr r11, r6, #16\n\t"
  8656. "lsl r6, r6, #16\n\t"
  8657. "adds r10, r10, r6\n\t"
  8658. "adc r5, r5, r11\n\t"
  8659. "lsl r6, r8, #16\n\t"
  8660. "lsl r11, r7, #16\n\t"
  8661. "lsr r6, r6, #16\n\t"
  8662. "lsr r11, r11, #16\n\t"
  8663. "mul r11, r6, r11\n\t"
  8664. "adds r10, r10, r11\n\t"
  8665. "adc r5, r5, #0\n\t"
  8666. "lsr r11, r7, #16\n\t"
  8667. "mul r6, r11, r6\n\t"
  8668. "lsr r11, r6, #16\n\t"
  8669. "lsl r6, r6, #16\n\t"
  8670. "adds r10, r10, r6\n\t"
  8671. "adc r5, r5, r11\n\t"
  8672. "adds r10, r10, r4\n\t"
  8673. "str r10, [%[a], #24]\n\t"
  8674. "adc r5, r5, #0\n\t"
  8675. /* a[i+7] += m[7] * mu */
  8676. "ldr r7, [%[m], #28]\n\t"
  8677. "ldr r10, [%[a], #28]\n\t"
  8678. "lsr r11, r7, #16\n\t"
  8679. "lsr r6, r8, #16\n\t"
  8680. "mul r4, r6, r11\n\t"
  8681. "lsl r11, r7, #16\n\t"
  8682. "lsr r11, r11, #16\n\t"
  8683. "mul r6, r11, r6\n\t"
  8684. "lsr r11, r6, #16\n\t"
  8685. "lsl r6, r6, #16\n\t"
  8686. "adds r10, r10, r6\n\t"
  8687. "adc r4, r4, r11\n\t"
  8688. "lsl r6, r8, #16\n\t"
  8689. "lsl r11, r7, #16\n\t"
  8690. "lsr r6, r6, #16\n\t"
  8691. "lsr r11, r11, #16\n\t"
  8692. "mul r11, r6, r11\n\t"
  8693. "adds r10, r10, r11\n\t"
  8694. "adc r4, r4, #0\n\t"
  8695. "lsr r11, r7, #16\n\t"
  8696. "mul r6, r11, r6\n\t"
  8697. "lsr r11, r6, #16\n\t"
  8698. "lsl r6, r6, #16\n\t"
  8699. "adds r10, r10, r6\n\t"
  8700. "adc r4, r4, r11\n\t"
  8701. "adds r10, r10, r5\n\t"
  8702. "str r10, [%[a], #28]\n\t"
  8703. "adc r4, r4, #0\n\t"
  8704. /* a[i+8] += m[8] * mu */
  8705. "ldr r7, [%[m], #32]\n\t"
  8706. "ldr r10, [%[a], #32]\n\t"
  8707. "lsr r11, r7, #16\n\t"
  8708. "lsr r6, r8, #16\n\t"
  8709. "mul r5, r6, r11\n\t"
  8710. "lsl r11, r7, #16\n\t"
  8711. "lsr r11, r11, #16\n\t"
  8712. "mul r6, r11, r6\n\t"
  8713. "lsr r11, r6, #16\n\t"
  8714. "lsl r6, r6, #16\n\t"
  8715. "adds r10, r10, r6\n\t"
  8716. "adc r5, r5, r11\n\t"
  8717. "lsl r6, r8, #16\n\t"
  8718. "lsl r11, r7, #16\n\t"
  8719. "lsr r6, r6, #16\n\t"
  8720. "lsr r11, r11, #16\n\t"
  8721. "mul r11, r6, r11\n\t"
  8722. "adds r10, r10, r11\n\t"
  8723. "adc r5, r5, #0\n\t"
  8724. "lsr r11, r7, #16\n\t"
  8725. "mul r6, r11, r6\n\t"
  8726. "lsr r11, r6, #16\n\t"
  8727. "lsl r6, r6, #16\n\t"
  8728. "adds r10, r10, r6\n\t"
  8729. "adc r5, r5, r11\n\t"
  8730. "adds r10, r10, r4\n\t"
  8731. "str r10, [%[a], #32]\n\t"
  8732. "adc r5, r5, #0\n\t"
  8733. /* a[i+9] += m[9] * mu */
  8734. "ldr r7, [%[m], #36]\n\t"
  8735. "ldr r10, [%[a], #36]\n\t"
  8736. "lsr r11, r7, #16\n\t"
  8737. "lsr r6, r8, #16\n\t"
  8738. "mul r4, r6, r11\n\t"
  8739. "lsl r11, r7, #16\n\t"
  8740. "lsr r11, r11, #16\n\t"
  8741. "mul r6, r11, r6\n\t"
  8742. "lsr r11, r6, #16\n\t"
  8743. "lsl r6, r6, #16\n\t"
  8744. "adds r10, r10, r6\n\t"
  8745. "adc r4, r4, r11\n\t"
  8746. "lsl r6, r8, #16\n\t"
  8747. "lsl r11, r7, #16\n\t"
  8748. "lsr r6, r6, #16\n\t"
  8749. "lsr r11, r11, #16\n\t"
  8750. "mul r11, r6, r11\n\t"
  8751. "adds r10, r10, r11\n\t"
  8752. "adc r4, r4, #0\n\t"
  8753. "lsr r11, r7, #16\n\t"
  8754. "mul r6, r11, r6\n\t"
  8755. "lsr r11, r6, #16\n\t"
  8756. "lsl r6, r6, #16\n\t"
  8757. "adds r10, r10, r6\n\t"
  8758. "adc r4, r4, r11\n\t"
  8759. "adds r10, r10, r5\n\t"
  8760. "str r10, [%[a], #36]\n\t"
  8761. "adc r4, r4, #0\n\t"
  8762. /* a[i+10] += m[10] * mu */
  8763. "ldr r7, [%[m], #40]\n\t"
  8764. "ldr r10, [%[a], #40]\n\t"
  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. "adds r10, r10, r4\n\t"
  8789. "str r10, [%[a], #40]\n\t"
  8790. "adc r5, r5, #0\n\t"
  8791. /* a[i+11] += m[11] * mu */
  8792. "ldr r7, [%[m], #44]\n\t"
  8793. "ldr r10, [%[a], #44]\n\t"
  8794. "lsr r11, r7, #16\n\t"
  8795. "lsr r6, r8, #16\n\t"
  8796. "mul r4, r6, r11\n\t"
  8797. "lsl r11, r7, #16\n\t"
  8798. "lsr r11, r11, #16\n\t"
  8799. "mul r6, r11, r6\n\t"
  8800. "lsr r11, r6, #16\n\t"
  8801. "lsl r6, r6, #16\n\t"
  8802. "adds r10, r10, r6\n\t"
  8803. "adc r4, r4, r11\n\t"
  8804. "lsl r6, r8, #16\n\t"
  8805. "lsl r11, r7, #16\n\t"
  8806. "lsr r6, r6, #16\n\t"
  8807. "lsr r11, r11, #16\n\t"
  8808. "mul r11, r6, r11\n\t"
  8809. "adds r10, r10, r11\n\t"
  8810. "adc r4, r4, #0\n\t"
  8811. "lsr r11, r7, #16\n\t"
  8812. "mul r6, r11, r6\n\t"
  8813. "lsr r11, r6, #16\n\t"
  8814. "lsl r6, r6, #16\n\t"
  8815. "adds r10, r10, r6\n\t"
  8816. "adc r4, r4, r11\n\t"
  8817. "adds r10, r10, r5\n\t"
  8818. "str r10, [%[a], #44]\n\t"
  8819. "adc r4, r4, #0\n\t"
  8820. /* a[i+12] += m[12] * mu */
  8821. "ldr r7, [%[m], #48]\n\t"
  8822. "ldr r10, [%[a], #48]\n\t"
  8823. "lsr r11, r7, #16\n\t"
  8824. "lsr r6, r8, #16\n\t"
  8825. "mul r5, r6, r11\n\t"
  8826. "lsl r11, r7, #16\n\t"
  8827. "lsr r11, r11, #16\n\t"
  8828. "mul r6, r11, r6\n\t"
  8829. "lsr r11, r6, #16\n\t"
  8830. "lsl r6, r6, #16\n\t"
  8831. "adds r10, r10, r6\n\t"
  8832. "adc r5, r5, r11\n\t"
  8833. "lsl r6, r8, #16\n\t"
  8834. "lsl r11, r7, #16\n\t"
  8835. "lsr r6, r6, #16\n\t"
  8836. "lsr r11, r11, #16\n\t"
  8837. "mul r11, r6, r11\n\t"
  8838. "adds r10, r10, r11\n\t"
  8839. "adc r5, r5, #0\n\t"
  8840. "lsr r11, r7, #16\n\t"
  8841. "mul r6, r11, r6\n\t"
  8842. "lsr r11, r6, #16\n\t"
  8843. "lsl r6, r6, #16\n\t"
  8844. "adds r10, r10, r6\n\t"
  8845. "adc r5, r5, r11\n\t"
  8846. "adds r10, r10, r4\n\t"
  8847. "str r10, [%[a], #48]\n\t"
  8848. "adc r5, r5, #0\n\t"
  8849. /* a[i+13] += m[13] * mu */
  8850. "ldr r7, [%[m], #52]\n\t"
  8851. "ldr r10, [%[a], #52]\n\t"
  8852. "lsr r11, r7, #16\n\t"
  8853. "lsr r6, r8, #16\n\t"
  8854. "mul r4, r6, r11\n\t"
  8855. "lsl r11, r7, #16\n\t"
  8856. "lsr r11, r11, #16\n\t"
  8857. "mul r6, r11, r6\n\t"
  8858. "lsr r11, r6, #16\n\t"
  8859. "lsl r6, r6, #16\n\t"
  8860. "adds r10, r10, r6\n\t"
  8861. "adc r4, r4, r11\n\t"
  8862. "lsl r6, r8, #16\n\t"
  8863. "lsl r11, r7, #16\n\t"
  8864. "lsr r6, r6, #16\n\t"
  8865. "lsr r11, r11, #16\n\t"
  8866. "mul r11, r6, r11\n\t"
  8867. "adds r10, r10, r11\n\t"
  8868. "adc r4, r4, #0\n\t"
  8869. "lsr r11, r7, #16\n\t"
  8870. "mul r6, r11, r6\n\t"
  8871. "lsr r11, r6, #16\n\t"
  8872. "lsl r6, r6, #16\n\t"
  8873. "adds r10, r10, r6\n\t"
  8874. "adc r4, r4, r11\n\t"
  8875. "adds r10, r10, r5\n\t"
  8876. "str r10, [%[a], #52]\n\t"
  8877. "adc r4, r4, #0\n\t"
  8878. /* a[i+14] += m[14] * mu */
  8879. "ldr r7, [%[m], #56]\n\t"
  8880. "ldr r10, [%[a], #56]\n\t"
  8881. "lsr r11, r7, #16\n\t"
  8882. "lsr r6, r8, #16\n\t"
  8883. "mul r5, r6, r11\n\t"
  8884. "lsl r11, r7, #16\n\t"
  8885. "lsr r11, r11, #16\n\t"
  8886. "mul r6, r11, r6\n\t"
  8887. "lsr r11, r6, #16\n\t"
  8888. "lsl r6, r6, #16\n\t"
  8889. "adds r10, r10, r6\n\t"
  8890. "adc r5, r5, r11\n\t"
  8891. "lsl r6, r8, #16\n\t"
  8892. "lsl r11, r7, #16\n\t"
  8893. "lsr r6, r6, #16\n\t"
  8894. "lsr r11, r11, #16\n\t"
  8895. "mul r11, r6, r11\n\t"
  8896. "adds r10, r10, r11\n\t"
  8897. "adc r5, r5, #0\n\t"
  8898. "lsr r11, r7, #16\n\t"
  8899. "mul r6, r11, r6\n\t"
  8900. "lsr r11, r6, #16\n\t"
  8901. "lsl r6, r6, #16\n\t"
  8902. "adds r10, r10, r6\n\t"
  8903. "adc r5, r5, r11\n\t"
  8904. "adds r10, r10, r4\n\t"
  8905. "str r10, [%[a], #56]\n\t"
  8906. "adc r5, r5, #0\n\t"
  8907. /* a[i+15] += m[15] * mu */
  8908. "ldr r7, [%[m], #60]\n\t"
  8909. "ldr r10, [%[a], #60]\n\t"
  8910. "lsr r11, r7, #16\n\t"
  8911. "lsr r6, r8, #16\n\t"
  8912. "mul r4, r6, r11\n\t"
  8913. "lsl r11, r7, #16\n\t"
  8914. "lsr r11, r11, #16\n\t"
  8915. "mul r6, r11, r6\n\t"
  8916. "lsr r11, r6, #16\n\t"
  8917. "lsl r6, r6, #16\n\t"
  8918. "adds r10, r10, r6\n\t"
  8919. "adc r4, r4, r11\n\t"
  8920. "lsl r6, r8, #16\n\t"
  8921. "lsl r11, r7, #16\n\t"
  8922. "lsr r6, r6, #16\n\t"
  8923. "lsr r11, r11, #16\n\t"
  8924. "mul r11, r6, r11\n\t"
  8925. "adds r10, r10, r11\n\t"
  8926. "adc r4, r4, #0\n\t"
  8927. "lsr r11, r7, #16\n\t"
  8928. "mul r6, r11, r6\n\t"
  8929. "lsr r11, r6, #16\n\t"
  8930. "lsl r6, r6, #16\n\t"
  8931. "adds r10, r10, r6\n\t"
  8932. "adc r4, r4, r11\n\t"
  8933. "adds r10, r10, r5\n\t"
  8934. "str r10, [%[a], #60]\n\t"
  8935. "adc r4, r4, #0\n\t"
  8936. /* a[i+16] += m[16] * mu */
  8937. "ldr r7, [%[m], #64]\n\t"
  8938. "ldr r10, [%[a], #64]\n\t"
  8939. "lsr r11, r7, #16\n\t"
  8940. "lsr r6, r8, #16\n\t"
  8941. "mul r5, r6, r11\n\t"
  8942. "lsl r11, r7, #16\n\t"
  8943. "lsr r11, r11, #16\n\t"
  8944. "mul r6, r11, r6\n\t"
  8945. "lsr r11, r6, #16\n\t"
  8946. "lsl r6, r6, #16\n\t"
  8947. "adds r10, r10, r6\n\t"
  8948. "adc r5, r5, r11\n\t"
  8949. "lsl r6, r8, #16\n\t"
  8950. "lsl r11, r7, #16\n\t"
  8951. "lsr r6, r6, #16\n\t"
  8952. "lsr r11, r11, #16\n\t"
  8953. "mul r11, r6, r11\n\t"
  8954. "adds r10, r10, r11\n\t"
  8955. "adc r5, r5, #0\n\t"
  8956. "lsr r11, r7, #16\n\t"
  8957. "mul r6, r11, r6\n\t"
  8958. "lsr r11, r6, #16\n\t"
  8959. "lsl r6, r6, #16\n\t"
  8960. "adds r10, r10, r6\n\t"
  8961. "adc r5, r5, r11\n\t"
  8962. "adds r10, r10, r4\n\t"
  8963. "str r10, [%[a], #64]\n\t"
  8964. "adc r5, r5, #0\n\t"
  8965. /* a[i+17] += m[17] * mu */
  8966. "ldr r7, [%[m], #68]\n\t"
  8967. "ldr r10, [%[a], #68]\n\t"
  8968. "lsr r11, r7, #16\n\t"
  8969. "lsr r6, r8, #16\n\t"
  8970. "mul r4, r6, r11\n\t"
  8971. "lsl r11, r7, #16\n\t"
  8972. "lsr r11, r11, #16\n\t"
  8973. "mul r6, r11, r6\n\t"
  8974. "lsr r11, r6, #16\n\t"
  8975. "lsl r6, r6, #16\n\t"
  8976. "adds r10, r10, r6\n\t"
  8977. "adc r4, r4, r11\n\t"
  8978. "lsl r6, r8, #16\n\t"
  8979. "lsl r11, r7, #16\n\t"
  8980. "lsr r6, r6, #16\n\t"
  8981. "lsr r11, r11, #16\n\t"
  8982. "mul r11, r6, r11\n\t"
  8983. "adds r10, r10, r11\n\t"
  8984. "adc r4, r4, #0\n\t"
  8985. "lsr r11, r7, #16\n\t"
  8986. "mul r6, r11, r6\n\t"
  8987. "lsr r11, r6, #16\n\t"
  8988. "lsl r6, r6, #16\n\t"
  8989. "adds r10, r10, r6\n\t"
  8990. "adc r4, r4, r11\n\t"
  8991. "adds r10, r10, r5\n\t"
  8992. "str r10, [%[a], #68]\n\t"
  8993. "adc r4, r4, #0\n\t"
  8994. /* a[i+18] += m[18] * mu */
  8995. "ldr r7, [%[m], #72]\n\t"
  8996. "ldr r10, [%[a], #72]\n\t"
  8997. "lsr r11, r7, #16\n\t"
  8998. "lsr r6, r8, #16\n\t"
  8999. "mul r5, r6, r11\n\t"
  9000. "lsl r11, r7, #16\n\t"
  9001. "lsr r11, r11, #16\n\t"
  9002. "mul r6, r11, r6\n\t"
  9003. "lsr r11, r6, #16\n\t"
  9004. "lsl r6, r6, #16\n\t"
  9005. "adds r10, r10, r6\n\t"
  9006. "adc r5, r5, r11\n\t"
  9007. "lsl r6, r8, #16\n\t"
  9008. "lsl r11, r7, #16\n\t"
  9009. "lsr r6, r6, #16\n\t"
  9010. "lsr r11, r11, #16\n\t"
  9011. "mul r11, r6, r11\n\t"
  9012. "adds r10, r10, r11\n\t"
  9013. "adc r5, r5, #0\n\t"
  9014. "lsr r11, r7, #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 r5, r5, r11\n\t"
  9020. "adds r10, r10, r4\n\t"
  9021. "str r10, [%[a], #72]\n\t"
  9022. "adc r5, r5, #0\n\t"
  9023. /* a[i+19] += m[19] * mu */
  9024. "ldr r7, [%[m], #76]\n\t"
  9025. "ldr r10, [%[a], #76]\n\t"
  9026. "lsr r11, r7, #16\n\t"
  9027. "lsr r6, r8, #16\n\t"
  9028. "mul r4, r6, r11\n\t"
  9029. "lsl r11, r7, #16\n\t"
  9030. "lsr r11, r11, #16\n\t"
  9031. "mul r6, r11, r6\n\t"
  9032. "lsr r11, r6, #16\n\t"
  9033. "lsl r6, r6, #16\n\t"
  9034. "adds r10, r10, r6\n\t"
  9035. "adc r4, r4, r11\n\t"
  9036. "lsl r6, r8, #16\n\t"
  9037. "lsl r11, r7, #16\n\t"
  9038. "lsr r6, r6, #16\n\t"
  9039. "lsr r11, r11, #16\n\t"
  9040. "mul r11, r6, r11\n\t"
  9041. "adds r10, r10, r11\n\t"
  9042. "adc r4, r4, #0\n\t"
  9043. "lsr r11, r7, #16\n\t"
  9044. "mul r6, r11, r6\n\t"
  9045. "lsr r11, r6, #16\n\t"
  9046. "lsl r6, r6, #16\n\t"
  9047. "adds r10, r10, r6\n\t"
  9048. "adc r4, r4, r11\n\t"
  9049. "adds r10, r10, r5\n\t"
  9050. "str r10, [%[a], #76]\n\t"
  9051. "adc r4, r4, #0\n\t"
  9052. /* a[i+20] += m[20] * mu */
  9053. "ldr r7, [%[m], #80]\n\t"
  9054. "ldr r10, [%[a], #80]\n\t"
  9055. "lsr r11, r7, #16\n\t"
  9056. "lsr r6, r8, #16\n\t"
  9057. "mul r5, r6, r11\n\t"
  9058. "lsl r11, r7, #16\n\t"
  9059. "lsr r11, r11, #16\n\t"
  9060. "mul r6, r11, r6\n\t"
  9061. "lsr r11, r6, #16\n\t"
  9062. "lsl r6, r6, #16\n\t"
  9063. "adds r10, r10, r6\n\t"
  9064. "adc r5, r5, r11\n\t"
  9065. "lsl r6, r8, #16\n\t"
  9066. "lsl r11, r7, #16\n\t"
  9067. "lsr r6, r6, #16\n\t"
  9068. "lsr r11, r11, #16\n\t"
  9069. "mul r11, r6, r11\n\t"
  9070. "adds r10, r10, r11\n\t"
  9071. "adc r5, r5, #0\n\t"
  9072. "lsr r11, r7, #16\n\t"
  9073. "mul r6, r11, r6\n\t"
  9074. "lsr r11, r6, #16\n\t"
  9075. "lsl r6, r6, #16\n\t"
  9076. "adds r10, r10, r6\n\t"
  9077. "adc r5, r5, r11\n\t"
  9078. "adds r10, r10, r4\n\t"
  9079. "str r10, [%[a], #80]\n\t"
  9080. "adc r5, r5, #0\n\t"
  9081. /* a[i+21] += m[21] * mu */
  9082. "ldr r7, [%[m], #84]\n\t"
  9083. "ldr r10, [%[a], #84]\n\t"
  9084. "lsr r11, r7, #16\n\t"
  9085. "lsr r6, r8, #16\n\t"
  9086. "mul r4, r6, r11\n\t"
  9087. "lsl r11, r7, #16\n\t"
  9088. "lsr r11, r11, #16\n\t"
  9089. "mul r6, r11, r6\n\t"
  9090. "lsr r11, r6, #16\n\t"
  9091. "lsl r6, r6, #16\n\t"
  9092. "adds r10, r10, r6\n\t"
  9093. "adc r4, r4, r11\n\t"
  9094. "lsl r6, r8, #16\n\t"
  9095. "lsl r11, r7, #16\n\t"
  9096. "lsr r6, r6, #16\n\t"
  9097. "lsr r11, r11, #16\n\t"
  9098. "mul r11, r6, r11\n\t"
  9099. "adds r10, r10, r11\n\t"
  9100. "adc r4, r4, #0\n\t"
  9101. "lsr r11, r7, #16\n\t"
  9102. "mul r6, r11, r6\n\t"
  9103. "lsr r11, r6, #16\n\t"
  9104. "lsl r6, r6, #16\n\t"
  9105. "adds r10, r10, r6\n\t"
  9106. "adc r4, r4, r11\n\t"
  9107. "adds r10, r10, r5\n\t"
  9108. "str r10, [%[a], #84]\n\t"
  9109. "adc r4, r4, #0\n\t"
  9110. /* a[i+22] += m[22] * mu */
  9111. "ldr r7, [%[m], #88]\n\t"
  9112. "ldr r10, [%[a], #88]\n\t"
  9113. "lsr r11, r7, #16\n\t"
  9114. "lsr r6, r8, #16\n\t"
  9115. "mul r5, r6, r11\n\t"
  9116. "lsl r11, r7, #16\n\t"
  9117. "lsr r11, r11, #16\n\t"
  9118. "mul r6, r11, r6\n\t"
  9119. "lsr r11, r6, #16\n\t"
  9120. "lsl r6, r6, #16\n\t"
  9121. "adds r10, r10, r6\n\t"
  9122. "adc r5, r5, r11\n\t"
  9123. "lsl r6, r8, #16\n\t"
  9124. "lsl r11, r7, #16\n\t"
  9125. "lsr r6, r6, #16\n\t"
  9126. "lsr r11, r11, #16\n\t"
  9127. "mul r11, r6, r11\n\t"
  9128. "adds r10, r10, r11\n\t"
  9129. "adc r5, r5, #0\n\t"
  9130. "lsr r11, r7, #16\n\t"
  9131. "mul r6, r11, r6\n\t"
  9132. "lsr r11, r6, #16\n\t"
  9133. "lsl r6, r6, #16\n\t"
  9134. "adds r10, r10, r6\n\t"
  9135. "adc r5, r5, r11\n\t"
  9136. "adds r10, r10, r4\n\t"
  9137. "str r10, [%[a], #88]\n\t"
  9138. "adc r5, r5, #0\n\t"
  9139. /* a[i+23] += m[23] * mu */
  9140. "ldr r7, [%[m], #92]\n\t"
  9141. "ldr r10, [%[a], #92]\n\t"
  9142. "lsr r11, r7, #16\n\t"
  9143. "lsr r6, r8, #16\n\t"
  9144. "mul r4, r6, r11\n\t"
  9145. "lsl r11, r7, #16\n\t"
  9146. "lsr r11, r11, #16\n\t"
  9147. "mul r6, r11, r6\n\t"
  9148. "lsr r11, r6, #16\n\t"
  9149. "lsl r6, r6, #16\n\t"
  9150. "adds r10, r10, r6\n\t"
  9151. "adc r4, r4, r11\n\t"
  9152. "lsl r6, r8, #16\n\t"
  9153. "lsl r11, r7, #16\n\t"
  9154. "lsr r6, r6, #16\n\t"
  9155. "lsr r11, r11, #16\n\t"
  9156. "mul r11, r6, r11\n\t"
  9157. "adds r10, r10, r11\n\t"
  9158. "adc r4, r4, #0\n\t"
  9159. "lsr r11, r7, #16\n\t"
  9160. "mul r6, r11, r6\n\t"
  9161. "lsr r11, r6, #16\n\t"
  9162. "lsl r6, r6, #16\n\t"
  9163. "adds r10, r10, r6\n\t"
  9164. "adc r4, r4, r11\n\t"
  9165. "adds r10, r10, r5\n\t"
  9166. "str r10, [%[a], #92]\n\t"
  9167. "adc r4, r4, #0\n\t"
  9168. /* a[i+24] += m[24] * mu */
  9169. "ldr r7, [%[m], #96]\n\t"
  9170. "ldr r10, [%[a], #96]\n\t"
  9171. "lsr r11, r7, #16\n\t"
  9172. "lsr r6, r8, #16\n\t"
  9173. "mul r5, r6, r11\n\t"
  9174. "lsl r11, r7, #16\n\t"
  9175. "lsr r11, r11, #16\n\t"
  9176. "mul r6, r11, r6\n\t"
  9177. "lsr r11, r6, #16\n\t"
  9178. "lsl r6, r6, #16\n\t"
  9179. "adds r10, r10, r6\n\t"
  9180. "adc r5, r5, r11\n\t"
  9181. "lsl r6, r8, #16\n\t"
  9182. "lsl r11, r7, #16\n\t"
  9183. "lsr r6, r6, #16\n\t"
  9184. "lsr r11, r11, #16\n\t"
  9185. "mul r11, r6, r11\n\t"
  9186. "adds r10, r10, r11\n\t"
  9187. "adc r5, r5, #0\n\t"
  9188. "lsr r11, r7, #16\n\t"
  9189. "mul r6, r11, r6\n\t"
  9190. "lsr r11, r6, #16\n\t"
  9191. "lsl r6, r6, #16\n\t"
  9192. "adds r10, r10, r6\n\t"
  9193. "adc r5, r5, r11\n\t"
  9194. "adds r10, r10, r4\n\t"
  9195. "str r10, [%[a], #96]\n\t"
  9196. "adc r5, r5, #0\n\t"
  9197. /* a[i+25] += m[25] * mu */
  9198. "ldr r7, [%[m], #100]\n\t"
  9199. "ldr r10, [%[a], #100]\n\t"
  9200. "lsr r11, r7, #16\n\t"
  9201. "lsr r6, r8, #16\n\t"
  9202. "mul r4, r6, r11\n\t"
  9203. "lsl r11, r7, #16\n\t"
  9204. "lsr r11, r11, #16\n\t"
  9205. "mul r6, r11, r6\n\t"
  9206. "lsr r11, r6, #16\n\t"
  9207. "lsl r6, r6, #16\n\t"
  9208. "adds r10, r10, r6\n\t"
  9209. "adc r4, r4, r11\n\t"
  9210. "lsl r6, r8, #16\n\t"
  9211. "lsl r11, r7, #16\n\t"
  9212. "lsr r6, r6, #16\n\t"
  9213. "lsr r11, r11, #16\n\t"
  9214. "mul r11, r6, r11\n\t"
  9215. "adds r10, r10, r11\n\t"
  9216. "adc r4, r4, #0\n\t"
  9217. "lsr r11, r7, #16\n\t"
  9218. "mul r6, r11, r6\n\t"
  9219. "lsr r11, r6, #16\n\t"
  9220. "lsl r6, r6, #16\n\t"
  9221. "adds r10, r10, r6\n\t"
  9222. "adc r4, r4, r11\n\t"
  9223. "adds r10, r10, r5\n\t"
  9224. "str r10, [%[a], #100]\n\t"
  9225. "adc r4, r4, #0\n\t"
  9226. /* a[i+26] += m[26] * mu */
  9227. "ldr r7, [%[m], #104]\n\t"
  9228. "ldr r10, [%[a], #104]\n\t"
  9229. "lsr r11, r7, #16\n\t"
  9230. "lsr r6, r8, #16\n\t"
  9231. "mul r5, r6, r11\n\t"
  9232. "lsl r11, r7, #16\n\t"
  9233. "lsr r11, r11, #16\n\t"
  9234. "mul r6, r11, r6\n\t"
  9235. "lsr r11, r6, #16\n\t"
  9236. "lsl r6, r6, #16\n\t"
  9237. "adds r10, r10, r6\n\t"
  9238. "adc r5, r5, r11\n\t"
  9239. "lsl r6, r8, #16\n\t"
  9240. "lsl r11, r7, #16\n\t"
  9241. "lsr r6, r6, #16\n\t"
  9242. "lsr r11, r11, #16\n\t"
  9243. "mul r11, r6, r11\n\t"
  9244. "adds r10, r10, r11\n\t"
  9245. "adc r5, r5, #0\n\t"
  9246. "lsr r11, r7, #16\n\t"
  9247. "mul r6, r11, r6\n\t"
  9248. "lsr r11, r6, #16\n\t"
  9249. "lsl r6, r6, #16\n\t"
  9250. "adds r10, r10, r6\n\t"
  9251. "adc r5, r5, r11\n\t"
  9252. "adds r10, r10, r4\n\t"
  9253. "str r10, [%[a], #104]\n\t"
  9254. "adc r5, r5, #0\n\t"
  9255. /* a[i+27] += m[27] * mu */
  9256. "ldr r7, [%[m], #108]\n\t"
  9257. "ldr r10, [%[a], #108]\n\t"
  9258. "lsr r11, r7, #16\n\t"
  9259. "lsr r6, r8, #16\n\t"
  9260. "mul r4, r6, r11\n\t"
  9261. "lsl r11, r7, #16\n\t"
  9262. "lsr r11, r11, #16\n\t"
  9263. "mul r6, r11, r6\n\t"
  9264. "lsr r11, r6, #16\n\t"
  9265. "lsl r6, r6, #16\n\t"
  9266. "adds r10, r10, r6\n\t"
  9267. "adc r4, r4, r11\n\t"
  9268. "lsl r6, r8, #16\n\t"
  9269. "lsl r11, r7, #16\n\t"
  9270. "lsr r6, r6, #16\n\t"
  9271. "lsr r11, r11, #16\n\t"
  9272. "mul r11, r6, r11\n\t"
  9273. "adds r10, r10, r11\n\t"
  9274. "adc r4, r4, #0\n\t"
  9275. "lsr r11, r7, #16\n\t"
  9276. "mul r6, r11, r6\n\t"
  9277. "lsr r11, r6, #16\n\t"
  9278. "lsl r6, r6, #16\n\t"
  9279. "adds r10, r10, r6\n\t"
  9280. "adc r4, r4, r11\n\t"
  9281. "adds r10, r10, r5\n\t"
  9282. "str r10, [%[a], #108]\n\t"
  9283. "adc r4, r4, #0\n\t"
  9284. /* a[i+28] += m[28] * mu */
  9285. "ldr r7, [%[m], #112]\n\t"
  9286. "ldr r10, [%[a], #112]\n\t"
  9287. "lsr r11, r7, #16\n\t"
  9288. "lsr r6, r8, #16\n\t"
  9289. "mul r5, r6, r11\n\t"
  9290. "lsl r11, r7, #16\n\t"
  9291. "lsr r11, r11, #16\n\t"
  9292. "mul r6, r11, r6\n\t"
  9293. "lsr r11, r6, #16\n\t"
  9294. "lsl r6, r6, #16\n\t"
  9295. "adds r10, r10, r6\n\t"
  9296. "adc r5, r5, r11\n\t"
  9297. "lsl r6, r8, #16\n\t"
  9298. "lsl r11, r7, #16\n\t"
  9299. "lsr r6, r6, #16\n\t"
  9300. "lsr r11, r11, #16\n\t"
  9301. "mul r11, r6, r11\n\t"
  9302. "adds r10, r10, r11\n\t"
  9303. "adc r5, r5, #0\n\t"
  9304. "lsr r11, r7, #16\n\t"
  9305. "mul r6, r11, r6\n\t"
  9306. "lsr r11, r6, #16\n\t"
  9307. "lsl r6, r6, #16\n\t"
  9308. "adds r10, r10, r6\n\t"
  9309. "adc r5, r5, r11\n\t"
  9310. "adds r10, r10, r4\n\t"
  9311. "str r10, [%[a], #112]\n\t"
  9312. "adc r5, r5, #0\n\t"
  9313. /* a[i+29] += m[29] * mu */
  9314. "ldr r7, [%[m], #116]\n\t"
  9315. "ldr r10, [%[a], #116]\n\t"
  9316. "lsr r11, r7, #16\n\t"
  9317. "lsr r6, r8, #16\n\t"
  9318. "mul r4, r6, r11\n\t"
  9319. "lsl r11, r7, #16\n\t"
  9320. "lsr r11, r11, #16\n\t"
  9321. "mul r6, r11, r6\n\t"
  9322. "lsr r11, r6, #16\n\t"
  9323. "lsl r6, r6, #16\n\t"
  9324. "adds r10, r10, r6\n\t"
  9325. "adc r4, r4, r11\n\t"
  9326. "lsl r6, r8, #16\n\t"
  9327. "lsl r11, r7, #16\n\t"
  9328. "lsr r6, r6, #16\n\t"
  9329. "lsr r11, r11, #16\n\t"
  9330. "mul r11, r6, r11\n\t"
  9331. "adds r10, r10, r11\n\t"
  9332. "adc r4, r4, #0\n\t"
  9333. "lsr r11, r7, #16\n\t"
  9334. "mul r6, r11, r6\n\t"
  9335. "lsr r11, r6, #16\n\t"
  9336. "lsl r6, r6, #16\n\t"
  9337. "adds r10, r10, r6\n\t"
  9338. "adc r4, r4, r11\n\t"
  9339. "adds r10, r10, r5\n\t"
  9340. "str r10, [%[a], #116]\n\t"
  9341. "adc r4, r4, #0\n\t"
  9342. /* a[i+30] += m[30] * mu */
  9343. "ldr r7, [%[m], #120]\n\t"
  9344. "ldr r10, [%[a], #120]\n\t"
  9345. "lsr r11, r7, #16\n\t"
  9346. "lsr r6, r8, #16\n\t"
  9347. "mul r5, r6, r11\n\t"
  9348. "lsl r11, r7, #16\n\t"
  9349. "lsr r11, r11, #16\n\t"
  9350. "mul r6, r11, r6\n\t"
  9351. "lsr r11, r6, #16\n\t"
  9352. "lsl r6, r6, #16\n\t"
  9353. "adds r10, r10, r6\n\t"
  9354. "adc r5, r5, r11\n\t"
  9355. "lsl r6, r8, #16\n\t"
  9356. "lsl r11, r7, #16\n\t"
  9357. "lsr r6, r6, #16\n\t"
  9358. "lsr r11, r11, #16\n\t"
  9359. "mul r11, r6, r11\n\t"
  9360. "adds r10, r10, r11\n\t"
  9361. "adc r5, r5, #0\n\t"
  9362. "lsr r11, r7, #16\n\t"
  9363. "mul r6, r11, r6\n\t"
  9364. "lsr r11, r6, #16\n\t"
  9365. "lsl r6, r6, #16\n\t"
  9366. "adds r10, r10, r6\n\t"
  9367. "adc r5, r5, r11\n\t"
  9368. "adds r10, r10, r4\n\t"
  9369. "str r10, [%[a], #120]\n\t"
  9370. "adc r5, r5, #0\n\t"
  9371. /* a[i+31] += m[31] * mu */
  9372. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  9373. "ldr r11, [%[m], #124]\n\t"
  9374. #else
  9375. "ldr r7, [%[m], #124]\n\t"
  9376. #endif
  9377. "ldr r10, [%[a], #124]\n\t"
  9378. "lsl r6, r8, #16\n\t"
  9379. "lsl r7, r11, #16\n\t"
  9380. "lsr r6, r6, #16\n\t"
  9381. "lsr r7, r7, #16\n\t"
  9382. "mul r7, r6, r7\n\t"
  9383. "adds r5, r5, r7\n\t"
  9384. "adcs r4, r3, #0\n\t"
  9385. "mov r3, #0\n\t"
  9386. "adc r3, r3, r3\n\t"
  9387. "lsr r7, r11, #16\n\t"
  9388. "mul r6, r7, r6\n\t"
  9389. "lsr r7, r6, #16\n\t"
  9390. "lsl r6, r6, #16\n\t"
  9391. "adds r5, r5, r6\n\t"
  9392. "adcs r4, r4, r7\n\t"
  9393. "adc r3, r3, #0\n\t"
  9394. "mov r6, r8\n\t"
  9395. "lsr r7, r11, #16\n\t"
  9396. "lsr r6, r6, #16\n\t"
  9397. "mul r7, r6, r7\n\t"
  9398. "adds r4, r4, r7\n\t"
  9399. "lsl r7, r11, #16\n\t"
  9400. "adc r3, r3, #0\n\t"
  9401. "lsr r7, r7, #16\n\t"
  9402. "mul r6, r7, r6\n\t"
  9403. "lsr r7, r6, #16\n\t"
  9404. "lsl r6, r6, #16\n\t"
  9405. "adds r5, r5, r6\n\t"
  9406. "adcs r4, r4, r7\n\t"
  9407. "adc r3, r3, #0\n\t"
  9408. "adds r10, r10, r5\n\t"
  9409. "str r10, [%[a], #124]\n\t"
  9410. "ldr r10, [%[a], #128]\n\t"
  9411. "adcs r10, r10, r4\n\t"
  9412. "str r10, [%[a], #128]\n\t"
  9413. "adc r3, r3, #0\n\t"
  9414. /* i += 1 */
  9415. "add r9, r9, #4\n\t"
  9416. "add %[a], %[a], #4\n\t"
  9417. "cmp r9, #0x80\n\t"
  9418. "blt L_sp_2048_mont_reduce_32_word_%=\n\t"
  9419. /* Loop Done */
  9420. "str r12, [%[a]]\n\t"
  9421. "str lr, [%[a], #4]\n\t"
  9422. "mov %[mp], r3\n\t"
  9423. : [a] "+r" (a), [m] "+r" (m), [mp] "+r" (mp)
  9424. :
  9425. : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "cc"
  9426. );
  9427. sp_2048_cond_sub_32(a - 32, a, m, (sp_digit)0 - mp);
  9428. }
  9429. #elif defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  9430. /* Reduce the number back to 2048 bits using Montgomery reduction.
  9431. *
  9432. * a A single precision number to reduce in place.
  9433. * m The single precision number representing the modulus.
  9434. * mp The digit representing the negative inverse of m mod 2^n.
  9435. */
  9436. static SP_NOINLINE void sp_2048_mont_reduce_32(sp_digit* a_p, const sp_digit* m_p, sp_digit mp_p)
  9437. {
  9438. register sp_digit* a asm ("r0") = (sp_digit*)a_p;
  9439. register const sp_digit* m asm ("r1") = (const sp_digit*)m_p;
  9440. register sp_digit mp asm ("r2") = (sp_digit)mp_p;
  9441. __asm__ __volatile__ (
  9442. "ldr r11, [%[m]]\n\t"
  9443. /* i = 0 */
  9444. "mov r9, #0\n\t"
  9445. "mov r3, #0\n\t"
  9446. "ldr r12, [%[a]]\n\t"
  9447. "ldr lr, [%[a], #4]\n\t"
  9448. "\n"
  9449. "L_sp_2048_mont_reduce_32_word_%=: \n\t"
  9450. /* mu = a[i] * mp */
  9451. "mul r8, %[mp], r12\n\t"
  9452. /* a[i+0] += m[0] * mu */
  9453. "mov r5, #0\n\t"
  9454. "umlal r12, r5, r8, r11\n\t"
  9455. /* a[i+1] += m[1] * mu */
  9456. "ldr r7, [%[m], #4]\n\t"
  9457. "mov r4, #0\n\t"
  9458. "umlal lr, r4, r8, r7\n\t"
  9459. "mov r12, lr\n\t"
  9460. "adds r12, r12, r5\n\t"
  9461. "adc r4, r4, #0\n\t"
  9462. /* a[i+2] += m[2] * mu */
  9463. "ldr r7, [%[m], #8]\n\t"
  9464. "ldr lr, [%[a], #8]\n\t"
  9465. "mov r5, #0\n\t"
  9466. "umlal lr, r5, r8, r7\n\t"
  9467. "adds lr, lr, r4\n\t"
  9468. "adc r5, r5, #0\n\t"
  9469. /* a[i+3] += m[3] * mu */
  9470. "ldr r7, [%[m], #12]\n\t"
  9471. "ldr r10, [%[a], #12]\n\t"
  9472. "mov r4, #0\n\t"
  9473. "umlal r10, r4, r8, r7\n\t"
  9474. "adds r10, r10, r5\n\t"
  9475. "str r10, [%[a], #12]\n\t"
  9476. "adc r4, r4, #0\n\t"
  9477. /* a[i+4] += m[4] * mu */
  9478. "ldr r7, [%[m], #16]\n\t"
  9479. "ldr r10, [%[a], #16]\n\t"
  9480. "mov r5, #0\n\t"
  9481. "umlal r10, r5, r8, r7\n\t"
  9482. "adds r10, r10, r4\n\t"
  9483. "str r10, [%[a], #16]\n\t"
  9484. "adc r5, r5, #0\n\t"
  9485. /* a[i+5] += m[5] * mu */
  9486. "ldr r7, [%[m], #20]\n\t"
  9487. "ldr r10, [%[a], #20]\n\t"
  9488. "mov r4, #0\n\t"
  9489. "umlal r10, r4, r8, r7\n\t"
  9490. "adds r10, r10, r5\n\t"
  9491. "str r10, [%[a], #20]\n\t"
  9492. "adc r4, r4, #0\n\t"
  9493. /* a[i+6] += m[6] * mu */
  9494. "ldr r7, [%[m], #24]\n\t"
  9495. "ldr r10, [%[a], #24]\n\t"
  9496. "mov r5, #0\n\t"
  9497. "umlal r10, r5, r8, r7\n\t"
  9498. "adds r10, r10, r4\n\t"
  9499. "str r10, [%[a], #24]\n\t"
  9500. "adc r5, r5, #0\n\t"
  9501. /* a[i+7] += m[7] * mu */
  9502. "ldr r7, [%[m], #28]\n\t"
  9503. "ldr r10, [%[a], #28]\n\t"
  9504. "mov r4, #0\n\t"
  9505. "umlal r10, r4, r8, r7\n\t"
  9506. "adds r10, r10, r5\n\t"
  9507. "str r10, [%[a], #28]\n\t"
  9508. "adc r4, r4, #0\n\t"
  9509. /* a[i+8] += m[8] * mu */
  9510. "ldr r7, [%[m], #32]\n\t"
  9511. "ldr r10, [%[a], #32]\n\t"
  9512. "mov r5, #0\n\t"
  9513. "umlal r10, r5, r8, r7\n\t"
  9514. "adds r10, r10, r4\n\t"
  9515. "str r10, [%[a], #32]\n\t"
  9516. "adc r5, r5, #0\n\t"
  9517. /* a[i+9] += m[9] * mu */
  9518. "ldr r7, [%[m], #36]\n\t"
  9519. "ldr r10, [%[a], #36]\n\t"
  9520. "mov r4, #0\n\t"
  9521. "umlal r10, r4, r8, r7\n\t"
  9522. "adds r10, r10, r5\n\t"
  9523. "str r10, [%[a], #36]\n\t"
  9524. "adc r4, r4, #0\n\t"
  9525. /* a[i+10] += m[10] * mu */
  9526. "ldr r7, [%[m], #40]\n\t"
  9527. "ldr r10, [%[a], #40]\n\t"
  9528. "mov r5, #0\n\t"
  9529. "umlal r10, r5, r8, r7\n\t"
  9530. "adds r10, r10, r4\n\t"
  9531. "str r10, [%[a], #40]\n\t"
  9532. "adc r5, r5, #0\n\t"
  9533. /* a[i+11] += m[11] * mu */
  9534. "ldr r7, [%[m], #44]\n\t"
  9535. "ldr r10, [%[a], #44]\n\t"
  9536. "mov r4, #0\n\t"
  9537. "umlal r10, r4, r8, r7\n\t"
  9538. "adds r10, r10, r5\n\t"
  9539. "str r10, [%[a], #44]\n\t"
  9540. "adc r4, r4, #0\n\t"
  9541. /* a[i+12] += m[12] * mu */
  9542. "ldr r7, [%[m], #48]\n\t"
  9543. "ldr r10, [%[a], #48]\n\t"
  9544. "mov r5, #0\n\t"
  9545. "umlal r10, r5, r8, r7\n\t"
  9546. "adds r10, r10, r4\n\t"
  9547. "str r10, [%[a], #48]\n\t"
  9548. "adc r5, r5, #0\n\t"
  9549. /* a[i+13] += m[13] * mu */
  9550. "ldr r7, [%[m], #52]\n\t"
  9551. "ldr r10, [%[a], #52]\n\t"
  9552. "mov r4, #0\n\t"
  9553. "umlal r10, r4, r8, r7\n\t"
  9554. "adds r10, r10, r5\n\t"
  9555. "str r10, [%[a], #52]\n\t"
  9556. "adc r4, r4, #0\n\t"
  9557. /* a[i+14] += m[14] * mu */
  9558. "ldr r7, [%[m], #56]\n\t"
  9559. "ldr r10, [%[a], #56]\n\t"
  9560. "mov r5, #0\n\t"
  9561. "umlal r10, r5, r8, r7\n\t"
  9562. "adds r10, r10, r4\n\t"
  9563. "str r10, [%[a], #56]\n\t"
  9564. "adc r5, r5, #0\n\t"
  9565. /* a[i+15] += m[15] * mu */
  9566. "ldr r7, [%[m], #60]\n\t"
  9567. "ldr r10, [%[a], #60]\n\t"
  9568. "mov r4, #0\n\t"
  9569. "umlal r10, r4, r8, r7\n\t"
  9570. "adds r10, r10, r5\n\t"
  9571. "str r10, [%[a], #60]\n\t"
  9572. "adc r4, r4, #0\n\t"
  9573. /* a[i+16] += m[16] * mu */
  9574. "ldr r7, [%[m], #64]\n\t"
  9575. "ldr r10, [%[a], #64]\n\t"
  9576. "mov r5, #0\n\t"
  9577. "umlal r10, r5, r8, r7\n\t"
  9578. "adds r10, r10, r4\n\t"
  9579. "str r10, [%[a], #64]\n\t"
  9580. "adc r5, r5, #0\n\t"
  9581. /* a[i+17] += m[17] * mu */
  9582. "ldr r7, [%[m], #68]\n\t"
  9583. "ldr r10, [%[a], #68]\n\t"
  9584. "mov r4, #0\n\t"
  9585. "umlal r10, r4, r8, r7\n\t"
  9586. "adds r10, r10, r5\n\t"
  9587. "str r10, [%[a], #68]\n\t"
  9588. "adc r4, r4, #0\n\t"
  9589. /* a[i+18] += m[18] * mu */
  9590. "ldr r7, [%[m], #72]\n\t"
  9591. "ldr r10, [%[a], #72]\n\t"
  9592. "mov r5, #0\n\t"
  9593. "umlal r10, r5, r8, r7\n\t"
  9594. "adds r10, r10, r4\n\t"
  9595. "str r10, [%[a], #72]\n\t"
  9596. "adc r5, r5, #0\n\t"
  9597. /* a[i+19] += m[19] * mu */
  9598. "ldr r7, [%[m], #76]\n\t"
  9599. "ldr r10, [%[a], #76]\n\t"
  9600. "mov r4, #0\n\t"
  9601. "umlal r10, r4, r8, r7\n\t"
  9602. "adds r10, r10, r5\n\t"
  9603. "str r10, [%[a], #76]\n\t"
  9604. "adc r4, r4, #0\n\t"
  9605. /* a[i+20] += m[20] * mu */
  9606. "ldr r7, [%[m], #80]\n\t"
  9607. "ldr r10, [%[a], #80]\n\t"
  9608. "mov r5, #0\n\t"
  9609. "umlal r10, r5, r8, r7\n\t"
  9610. "adds r10, r10, r4\n\t"
  9611. "str r10, [%[a], #80]\n\t"
  9612. "adc r5, r5, #0\n\t"
  9613. /* a[i+21] += m[21] * mu */
  9614. "ldr r7, [%[m], #84]\n\t"
  9615. "ldr r10, [%[a], #84]\n\t"
  9616. "mov r4, #0\n\t"
  9617. "umlal r10, r4, r8, r7\n\t"
  9618. "adds r10, r10, r5\n\t"
  9619. "str r10, [%[a], #84]\n\t"
  9620. "adc r4, r4, #0\n\t"
  9621. /* a[i+22] += m[22] * mu */
  9622. "ldr r7, [%[m], #88]\n\t"
  9623. "ldr r10, [%[a], #88]\n\t"
  9624. "mov r5, #0\n\t"
  9625. "umlal r10, r5, r8, r7\n\t"
  9626. "adds r10, r10, r4\n\t"
  9627. "str r10, [%[a], #88]\n\t"
  9628. "adc r5, r5, #0\n\t"
  9629. /* a[i+23] += m[23] * mu */
  9630. "ldr r7, [%[m], #92]\n\t"
  9631. "ldr r10, [%[a], #92]\n\t"
  9632. "mov r4, #0\n\t"
  9633. "umlal r10, r4, r8, r7\n\t"
  9634. "adds r10, r10, r5\n\t"
  9635. "str r10, [%[a], #92]\n\t"
  9636. "adc r4, r4, #0\n\t"
  9637. /* a[i+24] += m[24] * mu */
  9638. "ldr r7, [%[m], #96]\n\t"
  9639. "ldr r10, [%[a], #96]\n\t"
  9640. "mov r5, #0\n\t"
  9641. "umlal r10, r5, r8, r7\n\t"
  9642. "adds r10, r10, r4\n\t"
  9643. "str r10, [%[a], #96]\n\t"
  9644. "adc r5, r5, #0\n\t"
  9645. /* a[i+25] += m[25] * mu */
  9646. "ldr r7, [%[m], #100]\n\t"
  9647. "ldr r10, [%[a], #100]\n\t"
  9648. "mov r4, #0\n\t"
  9649. "umlal r10, r4, r8, r7\n\t"
  9650. "adds r10, r10, r5\n\t"
  9651. "str r10, [%[a], #100]\n\t"
  9652. "adc r4, r4, #0\n\t"
  9653. /* a[i+26] += m[26] * mu */
  9654. "ldr r7, [%[m], #104]\n\t"
  9655. "ldr r10, [%[a], #104]\n\t"
  9656. "mov r5, #0\n\t"
  9657. "umlal r10, r5, r8, r7\n\t"
  9658. "adds r10, r10, r4\n\t"
  9659. "str r10, [%[a], #104]\n\t"
  9660. "adc r5, r5, #0\n\t"
  9661. /* a[i+27] += m[27] * mu */
  9662. "ldr r7, [%[m], #108]\n\t"
  9663. "ldr r10, [%[a], #108]\n\t"
  9664. "mov r4, #0\n\t"
  9665. "umlal r10, r4, r8, r7\n\t"
  9666. "adds r10, r10, r5\n\t"
  9667. "str r10, [%[a], #108]\n\t"
  9668. "adc r4, r4, #0\n\t"
  9669. /* a[i+28] += m[28] * mu */
  9670. "ldr r7, [%[m], #112]\n\t"
  9671. "ldr r10, [%[a], #112]\n\t"
  9672. "mov r5, #0\n\t"
  9673. "umlal r10, r5, r8, r7\n\t"
  9674. "adds r10, r10, r4\n\t"
  9675. "str r10, [%[a], #112]\n\t"
  9676. "adc r5, r5, #0\n\t"
  9677. /* a[i+29] += m[29] * mu */
  9678. "ldr r7, [%[m], #116]\n\t"
  9679. "ldr r10, [%[a], #116]\n\t"
  9680. "mov r4, #0\n\t"
  9681. "umlal r10, r4, r8, r7\n\t"
  9682. "adds r10, r10, r5\n\t"
  9683. "str r10, [%[a], #116]\n\t"
  9684. "adc r4, r4, #0\n\t"
  9685. /* a[i+30] += m[30] * mu */
  9686. "ldr r7, [%[m], #120]\n\t"
  9687. "ldr r10, [%[a], #120]\n\t"
  9688. "mov r5, #0\n\t"
  9689. "umlal r10, r5, r8, r7\n\t"
  9690. "adds r10, r10, r4\n\t"
  9691. "str r10, [%[a], #120]\n\t"
  9692. "adc r5, r5, #0\n\t"
  9693. /* a[i+31] += m[31] * mu */
  9694. "ldr r7, [%[m], #124]\n\t"
  9695. "ldr r10, [%[a], #124]\n\t"
  9696. "umull r6, r7, r8, r7\n\t"
  9697. "adds r5, r5, r6\n\t"
  9698. "adcs r4, r7, r3\n\t"
  9699. "mov r3, #0\n\t"
  9700. "adc r3, r3, r3\n\t"
  9701. "adds r10, r10, r5\n\t"
  9702. "str r10, [%[a], #124]\n\t"
  9703. "ldr r10, [%[a], #128]\n\t"
  9704. "adcs r10, r10, r4\n\t"
  9705. "str r10, [%[a], #128]\n\t"
  9706. "adc r3, r3, #0\n\t"
  9707. /* i += 1 */
  9708. "add r9, r9, #4\n\t"
  9709. "add %[a], %[a], #4\n\t"
  9710. "cmp r9, #0x80\n\t"
  9711. "blt L_sp_2048_mont_reduce_32_word_%=\n\t"
  9712. /* Loop Done */
  9713. "str r12, [%[a]]\n\t"
  9714. "str lr, [%[a], #4]\n\t"
  9715. "mov %[mp], r3\n\t"
  9716. : [a] "+r" (a), [m] "+r" (m), [mp] "+r" (mp)
  9717. :
  9718. : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "cc"
  9719. );
  9720. sp_2048_cond_sub_32(a - 32, a, m, (sp_digit)0 - mp);
  9721. }
  9722. #else
  9723. /* Reduce the number back to 2048 bits using Montgomery reduction.
  9724. *
  9725. * a A single precision number to reduce in place.
  9726. * m The single precision number representing the modulus.
  9727. * mp The digit representing the negative inverse of m mod 2^n.
  9728. */
  9729. static SP_NOINLINE void sp_2048_mont_reduce_32(sp_digit* a_p, const sp_digit* m_p, sp_digit mp_p)
  9730. {
  9731. register sp_digit* a asm ("r0") = (sp_digit*)a_p;
  9732. register const sp_digit* m asm ("r1") = (const sp_digit*)m_p;
  9733. register sp_digit mp asm ("r2") = (sp_digit)mp_p;
  9734. __asm__ __volatile__ (
  9735. /* i = 0 */
  9736. "mov r12, #0\n\t"
  9737. "mov lr, #0\n\t"
  9738. "ldr r4, [%[a]]\n\t"
  9739. "ldr r5, [%[a], #4]\n\t"
  9740. "ldr r6, [%[a], #8]\n\t"
  9741. "ldr r7, [%[a], #12]\n\t"
  9742. "ldr r8, [%[a], #16]\n\t"
  9743. "\n"
  9744. "L_sp_2048_mont_reduce_32_word_%=: \n\t"
  9745. /* mu = a[i] * mp */
  9746. "mul r11, %[mp], r4\n\t"
  9747. /* a[i+0] += m[0] * mu */
  9748. "ldr r10, [%[m]]\n\t"
  9749. "mov r3, #0\n\t"
  9750. "umaal r4, r3, r11, r10\n\t"
  9751. /* a[i+1] += m[1] * mu */
  9752. "ldr r10, [%[m], #4]\n\t"
  9753. "mov r4, r5\n\t"
  9754. "umaal r4, r3, r11, r10\n\t"
  9755. /* a[i+2] += m[2] * mu */
  9756. "ldr r10, [%[m], #8]\n\t"
  9757. "mov r5, r6\n\t"
  9758. "umaal r5, r3, r11, r10\n\t"
  9759. /* a[i+3] += m[3] * mu */
  9760. "ldr r10, [%[m], #12]\n\t"
  9761. "mov r6, r7\n\t"
  9762. "umaal r6, r3, r11, r10\n\t"
  9763. /* a[i+4] += m[4] * mu */
  9764. "ldr r10, [%[m], #16]\n\t"
  9765. "mov r7, r8\n\t"
  9766. "umaal r7, r3, r11, r10\n\t"
  9767. /* a[i+5] += m[5] * mu */
  9768. "ldr r10, [%[m], #20]\n\t"
  9769. "ldr r8, [%[a], #20]\n\t"
  9770. "umaal r8, r3, r11, r10\n\t"
  9771. /* a[i+6] += m[6] * mu */
  9772. "ldr r10, [%[m], #24]\n\t"
  9773. "ldr r9, [%[a], #24]\n\t"
  9774. "umaal r9, r3, r11, r10\n\t"
  9775. "str r9, [%[a], #24]\n\t"
  9776. /* a[i+7] += m[7] * mu */
  9777. "ldr r10, [%[m], #28]\n\t"
  9778. "ldr r9, [%[a], #28]\n\t"
  9779. "umaal r9, r3, r11, r10\n\t"
  9780. "str r9, [%[a], #28]\n\t"
  9781. /* a[i+8] += m[8] * mu */
  9782. "ldr r10, [%[m], #32]\n\t"
  9783. "ldr r9, [%[a], #32]\n\t"
  9784. "umaal r9, r3, r11, r10\n\t"
  9785. "str r9, [%[a], #32]\n\t"
  9786. /* a[i+9] += m[9] * mu */
  9787. "ldr r10, [%[m], #36]\n\t"
  9788. "ldr r9, [%[a], #36]\n\t"
  9789. "umaal r9, r3, r11, r10\n\t"
  9790. "str r9, [%[a], #36]\n\t"
  9791. /* a[i+10] += m[10] * mu */
  9792. "ldr r10, [%[m], #40]\n\t"
  9793. "ldr r9, [%[a], #40]\n\t"
  9794. "umaal r9, r3, r11, r10\n\t"
  9795. "str r9, [%[a], #40]\n\t"
  9796. /* a[i+11] += m[11] * mu */
  9797. "ldr r10, [%[m], #44]\n\t"
  9798. "ldr r9, [%[a], #44]\n\t"
  9799. "umaal r9, r3, r11, r10\n\t"
  9800. "str r9, [%[a], #44]\n\t"
  9801. /* a[i+12] += m[12] * mu */
  9802. "ldr r10, [%[m], #48]\n\t"
  9803. "ldr r9, [%[a], #48]\n\t"
  9804. "umaal r9, r3, r11, r10\n\t"
  9805. "str r9, [%[a], #48]\n\t"
  9806. /* a[i+13] += m[13] * mu */
  9807. "ldr r10, [%[m], #52]\n\t"
  9808. "ldr r9, [%[a], #52]\n\t"
  9809. "umaal r9, r3, r11, r10\n\t"
  9810. "str r9, [%[a], #52]\n\t"
  9811. /* a[i+14] += m[14] * mu */
  9812. "ldr r10, [%[m], #56]\n\t"
  9813. "ldr r9, [%[a], #56]\n\t"
  9814. "umaal r9, r3, r11, r10\n\t"
  9815. "str r9, [%[a], #56]\n\t"
  9816. /* a[i+15] += m[15] * mu */
  9817. "ldr r10, [%[m], #60]\n\t"
  9818. "ldr r9, [%[a], #60]\n\t"
  9819. "umaal r9, r3, r11, r10\n\t"
  9820. "str r9, [%[a], #60]\n\t"
  9821. /* a[i+16] += m[16] * mu */
  9822. "ldr r10, [%[m], #64]\n\t"
  9823. "ldr r9, [%[a], #64]\n\t"
  9824. "umaal r9, r3, r11, r10\n\t"
  9825. "str r9, [%[a], #64]\n\t"
  9826. /* a[i+17] += m[17] * mu */
  9827. "ldr r10, [%[m], #68]\n\t"
  9828. "ldr r9, [%[a], #68]\n\t"
  9829. "umaal r9, r3, r11, r10\n\t"
  9830. "str r9, [%[a], #68]\n\t"
  9831. /* a[i+18] += m[18] * mu */
  9832. "ldr r10, [%[m], #72]\n\t"
  9833. "ldr r9, [%[a], #72]\n\t"
  9834. "umaal r9, r3, r11, r10\n\t"
  9835. "str r9, [%[a], #72]\n\t"
  9836. /* a[i+19] += m[19] * mu */
  9837. "ldr r10, [%[m], #76]\n\t"
  9838. "ldr r9, [%[a], #76]\n\t"
  9839. "umaal r9, r3, r11, r10\n\t"
  9840. "str r9, [%[a], #76]\n\t"
  9841. /* a[i+20] += m[20] * mu */
  9842. "ldr r10, [%[m], #80]\n\t"
  9843. "ldr r9, [%[a], #80]\n\t"
  9844. "umaal r9, r3, r11, r10\n\t"
  9845. "str r9, [%[a], #80]\n\t"
  9846. /* a[i+21] += m[21] * mu */
  9847. "ldr r10, [%[m], #84]\n\t"
  9848. "ldr r9, [%[a], #84]\n\t"
  9849. "umaal r9, r3, r11, r10\n\t"
  9850. "str r9, [%[a], #84]\n\t"
  9851. /* a[i+22] += m[22] * mu */
  9852. "ldr r10, [%[m], #88]\n\t"
  9853. "ldr r9, [%[a], #88]\n\t"
  9854. "umaal r9, r3, r11, r10\n\t"
  9855. "str r9, [%[a], #88]\n\t"
  9856. /* a[i+23] += m[23] * mu */
  9857. "ldr r10, [%[m], #92]\n\t"
  9858. "ldr r9, [%[a], #92]\n\t"
  9859. "umaal r9, r3, r11, r10\n\t"
  9860. "str r9, [%[a], #92]\n\t"
  9861. /* a[i+24] += m[24] * mu */
  9862. "ldr r10, [%[m], #96]\n\t"
  9863. "ldr r9, [%[a], #96]\n\t"
  9864. "umaal r9, r3, r11, r10\n\t"
  9865. "str r9, [%[a], #96]\n\t"
  9866. /* a[i+25] += m[25] * mu */
  9867. "ldr r10, [%[m], #100]\n\t"
  9868. "ldr r9, [%[a], #100]\n\t"
  9869. "umaal r9, r3, r11, r10\n\t"
  9870. "str r9, [%[a], #100]\n\t"
  9871. /* a[i+26] += m[26] * mu */
  9872. "ldr r10, [%[m], #104]\n\t"
  9873. "ldr r9, [%[a], #104]\n\t"
  9874. "umaal r9, r3, r11, r10\n\t"
  9875. "str r9, [%[a], #104]\n\t"
  9876. /* a[i+27] += m[27] * mu */
  9877. "ldr r10, [%[m], #108]\n\t"
  9878. "ldr r9, [%[a], #108]\n\t"
  9879. "umaal r9, r3, r11, r10\n\t"
  9880. "str r9, [%[a], #108]\n\t"
  9881. /* a[i+28] += m[28] * mu */
  9882. "ldr r10, [%[m], #112]\n\t"
  9883. "ldr r9, [%[a], #112]\n\t"
  9884. "umaal r9, r3, r11, r10\n\t"
  9885. "str r9, [%[a], #112]\n\t"
  9886. /* a[i+29] += m[29] * mu */
  9887. "ldr r10, [%[m], #116]\n\t"
  9888. "ldr r9, [%[a], #116]\n\t"
  9889. "umaal r9, r3, r11, r10\n\t"
  9890. "str r9, [%[a], #116]\n\t"
  9891. /* a[i+30] += m[30] * mu */
  9892. "ldr r10, [%[m], #120]\n\t"
  9893. "ldr r9, [%[a], #120]\n\t"
  9894. "umaal r9, r3, r11, r10\n\t"
  9895. "str r9, [%[a], #120]\n\t"
  9896. /* a[i+31] += m[31] * mu */
  9897. "ldr r10, [%[m], #124]\n\t"
  9898. "ldr r9, [%[a], #124]\n\t"
  9899. "umaal r9, r3, r11, r10\n\t"
  9900. "ldr r11, [%[a], #128]\n\t"
  9901. "mov r10, #0\n\t"
  9902. "umaal r3, r11, r10, r10\n\t"
  9903. "str r9, [%[a], #124]\n\t"
  9904. "adds r3, r3, lr\n\t"
  9905. "adc lr, r11, #0\n\t"
  9906. "str r3, [%[a], #128]\n\t"
  9907. /* i += 1 */
  9908. "add r12, r12, #4\n\t"
  9909. "add %[a], %[a], #4\n\t"
  9910. "cmp r12, #0x80\n\t"
  9911. "blt L_sp_2048_mont_reduce_32_word_%=\n\t"
  9912. /* Loop Done */
  9913. "str r4, [%[a]]\n\t"
  9914. "str r5, [%[a], #4]\n\t"
  9915. "str r6, [%[a], #8]\n\t"
  9916. "str r7, [%[a], #12]\n\t"
  9917. "str r8, [%[a], #16]\n\t"
  9918. "mov %[mp], lr\n\t"
  9919. : [a] "+r" (a), [m] "+r" (m), [mp] "+r" (mp)
  9920. :
  9921. : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "cc"
  9922. );
  9923. sp_2048_cond_sub_32(a - 32, a, m, (sp_digit)0 - mp);
  9924. }
  9925. #endif
  9926. /* Multiply two Montgomery form numbers mod the modulus (prime).
  9927. * (r = a * b mod m)
  9928. *
  9929. * r Result of multiplication.
  9930. * a First number to multiply in Montgomery form.
  9931. * b Second number to multiply in Montgomery form.
  9932. * m Modulus (prime).
  9933. * mp Montgomery multiplier.
  9934. */
  9935. SP_NOINLINE static void sp_2048_mont_mul_32(sp_digit* r, const sp_digit* a,
  9936. const sp_digit* b, const sp_digit* m, sp_digit mp)
  9937. {
  9938. sp_2048_mul_32(r, a, b);
  9939. sp_2048_mont_reduce_32(r, m, mp);
  9940. }
  9941. /* Square the Montgomery form number. (r = a * a mod m)
  9942. *
  9943. * r Result of squaring.
  9944. * a Number to square in Montgomery form.
  9945. * m Modulus (prime).
  9946. * mp Montgomery multiplier.
  9947. */
  9948. SP_NOINLINE static void sp_2048_mont_sqr_32(sp_digit* r, const sp_digit* a,
  9949. const sp_digit* m, sp_digit mp)
  9950. {
  9951. sp_2048_sqr_32(r, a);
  9952. sp_2048_mont_reduce_32(r, m, mp);
  9953. }
  9954. #ifdef WOLFSSL_SP_SMALL
  9955. /* Mul a by digit b into r. (r = a * b)
  9956. *
  9957. * r A single precision integer.
  9958. * a A single precision integer.
  9959. * b A single precision digit.
  9960. */
  9961. static void sp_2048_mul_d_32(sp_digit* r_p, const sp_digit* a_p, sp_digit b_p)
  9962. {
  9963. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  9964. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  9965. register sp_digit b asm ("r2") = (sp_digit)b_p;
  9966. __asm__ __volatile__ (
  9967. /* A[0] * B */
  9968. "ldr r8, [%[a]]\n\t"
  9969. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  9970. "lsl r6, %[b], #16\n\t"
  9971. "lsl r5, r8, #16\n\t"
  9972. "lsr r6, r6, #16\n\t"
  9973. "lsr r5, r5, #16\n\t"
  9974. "mul r5, r6, r5\n\t"
  9975. "lsr r7, r8, #16\n\t"
  9976. "mul r6, r7, r6\n\t"
  9977. "lsr r3, r6, #16\n\t"
  9978. "lsl r6, r6, #16\n\t"
  9979. "adds r5, r5, r6\n\t"
  9980. "adc r3, r3, #0\n\t"
  9981. "lsr r6, %[b], #16\n\t"
  9982. "mul r7, r6, r7\n\t"
  9983. "add r3, r3, r7\n\t"
  9984. "lsl r7, r8, #16\n\t"
  9985. "lsr r7, r7, #16\n\t"
  9986. "mul r6, r7, r6\n\t"
  9987. "lsr r7, r6, #16\n\t"
  9988. "lsl r6, r6, #16\n\t"
  9989. "adds r5, r5, r6\n\t"
  9990. "adc r3, r3, r7\n\t"
  9991. #else
  9992. "umull r5, r3, %[b], r8\n\t"
  9993. #endif
  9994. "mov r4, #0\n\t"
  9995. "str r5, [%[r]]\n\t"
  9996. "mov r5, #0\n\t"
  9997. "mov r9, #4\n\t"
  9998. "\n"
  9999. "L_sp_2048_mul_d_32_word_%=: \n\t"
  10000. /* A[i] * B */
  10001. "ldr r8, [%[a], r9]\n\t"
  10002. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  10003. "lsl r6, %[b], #16\n\t"
  10004. "lsl r7, r8, #16\n\t"
  10005. "lsr r6, r6, #16\n\t"
  10006. "lsr r7, r7, #16\n\t"
  10007. "mul r7, r6, r7\n\t"
  10008. "adds r3, r3, r7\n\t"
  10009. "adcs r4, r4, #0\n\t"
  10010. "adc r5, r5, #0\n\t"
  10011. "lsr r7, r8, #16\n\t"
  10012. "mul r6, r7, r6\n\t"
  10013. "lsr r7, r6, #16\n\t"
  10014. "lsl r6, r6, #16\n\t"
  10015. "adds r3, r3, r6\n\t"
  10016. "adcs r4, r4, r7\n\t"
  10017. "adc r5, r5, #0\n\t"
  10018. "lsr r6, %[b], #16\n\t"
  10019. "lsr r7, r8, #16\n\t"
  10020. "mul r7, r6, r7\n\t"
  10021. "adds r4, r4, r7\n\t"
  10022. "adc r5, r5, #0\n\t"
  10023. "lsl r7, r8, #16\n\t"
  10024. "lsr r7, r7, #16\n\t"
  10025. "mul r6, r7, r6\n\t"
  10026. "lsr r7, r6, #16\n\t"
  10027. "lsl r6, r6, #16\n\t"
  10028. "adds r3, r3, r6\n\t"
  10029. "adcs r4, r4, r7\n\t"
  10030. "adc r5, r5, #0\n\t"
  10031. #else
  10032. "umull r6, r7, %[b], r8\n\t"
  10033. "adds r3, r3, r6\n\t"
  10034. "adcs r4, r4, r7\n\t"
  10035. "adc r5, r5, #0\n\t"
  10036. #endif
  10037. "str r3, [%[r], r9]\n\t"
  10038. "mov r3, r4\n\t"
  10039. "mov r4, r5\n\t"
  10040. "mov r5, #0\n\t"
  10041. "add r9, r9, #4\n\t"
  10042. "cmp r9, #0x80\n\t"
  10043. "blt L_sp_2048_mul_d_32_word_%=\n\t"
  10044. "str r3, [%[r], #128]\n\t"
  10045. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  10046. :
  10047. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "cc"
  10048. );
  10049. }
  10050. #else
  10051. /* Mul a by digit b into r. (r = a * b)
  10052. *
  10053. * r A single precision integer.
  10054. * a A single precision integer.
  10055. * b A single precision digit.
  10056. */
  10057. static void sp_2048_mul_d_32(sp_digit* r_p, const sp_digit* a_p, sp_digit b_p)
  10058. {
  10059. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  10060. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  10061. register sp_digit b asm ("r2") = (sp_digit)b_p;
  10062. __asm__ __volatile__ (
  10063. /* A[0] * B */
  10064. "ldm %[a]!, {r8}\n\t"
  10065. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  10066. "lsl r6, %[b], #16\n\t"
  10067. "lsl r3, r8, #16\n\t"
  10068. "lsr r6, r6, #16\n\t"
  10069. "lsr r3, r3, #16\n\t"
  10070. "mul r3, r6, r3\n\t"
  10071. "lsr r7, r8, #16\n\t"
  10072. "mul r6, r7, r6\n\t"
  10073. "lsr r4, r6, #16\n\t"
  10074. "lsl r6, r6, #16\n\t"
  10075. "adds r3, r3, r6\n\t"
  10076. "adc r4, r4, #0\n\t"
  10077. "lsr r6, %[b], #16\n\t"
  10078. "mul r7, r6, r7\n\t"
  10079. "add r4, r4, r7\n\t"
  10080. "lsl r7, r8, #16\n\t"
  10081. "lsr r7, r7, #16\n\t"
  10082. "mul r6, r7, r6\n\t"
  10083. "lsr r7, r6, #16\n\t"
  10084. "lsl r6, r6, #16\n\t"
  10085. "adds r3, r3, r6\n\t"
  10086. "adc r4, r4, r7\n\t"
  10087. #else
  10088. "umull r3, r4, %[b], r8\n\t"
  10089. #endif
  10090. "stm %[r]!, {r3}\n\t"
  10091. "mov r5, #0\n\t"
  10092. /* A[1] * B */
  10093. "ldm %[a]!, {r8}\n\t"
  10094. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  10095. "lsl r6, %[b], #16\n\t"
  10096. "lsl r7, r8, #16\n\t"
  10097. "lsr r6, r6, #16\n\t"
  10098. "lsr r7, r7, #16\n\t"
  10099. "mul r7, r6, r7\n\t"
  10100. "adds r4, r4, r7\n\t"
  10101. "adc r5, r5, #0\n\t"
  10102. "lsr r7, r8, #16\n\t"
  10103. "mul r6, r7, r6\n\t"
  10104. "lsr r7, r6, #16\n\t"
  10105. "lsl r6, r6, #16\n\t"
  10106. "adds r4, r4, r6\n\t"
  10107. "adc r5, r5, r7\n\t"
  10108. "lsr r6, %[b], #16\n\t"
  10109. "lsr r7, r8, #16\n\t"
  10110. "mul r7, r6, r7\n\t"
  10111. "add r5, r5, r7\n\t"
  10112. "lsl r7, r8, #16\n\t"
  10113. "lsr r7, r7, #16\n\t"
  10114. "mul r6, r7, r6\n\t"
  10115. "lsr r7, r6, #16\n\t"
  10116. "lsl r6, r6, #16\n\t"
  10117. "adds r4, r4, r6\n\t"
  10118. "adc r5, r5, r7\n\t"
  10119. #else
  10120. "umlal r4, r5, %[b], r8\n\t"
  10121. #endif
  10122. "stm %[r]!, {r4}\n\t"
  10123. "mov r3, #0\n\t"
  10124. /* A[2] * B */
  10125. "ldm %[a]!, {r8}\n\t"
  10126. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  10127. "lsl r6, %[b], #16\n\t"
  10128. "lsl r7, r8, #16\n\t"
  10129. "lsr r6, r6, #16\n\t"
  10130. "lsr r7, r7, #16\n\t"
  10131. "mul r7, r6, r7\n\t"
  10132. "adds r5, r5, r7\n\t"
  10133. "adc r3, r3, #0\n\t"
  10134. "lsr r7, r8, #16\n\t"
  10135. "mul r6, r7, r6\n\t"
  10136. "lsr r7, r6, #16\n\t"
  10137. "lsl r6, r6, #16\n\t"
  10138. "adds r5, r5, r6\n\t"
  10139. "adc r3, r3, r7\n\t"
  10140. "lsr r6, %[b], #16\n\t"
  10141. "lsr r7, r8, #16\n\t"
  10142. "mul r7, r6, r7\n\t"
  10143. "add r3, r3, r7\n\t"
  10144. "lsl r7, r8, #16\n\t"
  10145. "lsr r7, r7, #16\n\t"
  10146. "mul r6, r7, r6\n\t"
  10147. "lsr r7, r6, #16\n\t"
  10148. "lsl r6, r6, #16\n\t"
  10149. "adds r5, r5, r6\n\t"
  10150. "adc r3, r3, r7\n\t"
  10151. #else
  10152. "umlal r5, r3, %[b], r8\n\t"
  10153. #endif
  10154. "stm %[r]!, {r5}\n\t"
  10155. "mov r4, #0\n\t"
  10156. /* A[3] * B */
  10157. "ldm %[a]!, {r8}\n\t"
  10158. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  10159. "lsl r6, %[b], #16\n\t"
  10160. "lsl r7, r8, #16\n\t"
  10161. "lsr r6, r6, #16\n\t"
  10162. "lsr r7, r7, #16\n\t"
  10163. "mul r7, r6, r7\n\t"
  10164. "adds r3, r3, r7\n\t"
  10165. "adc r4, r4, #0\n\t"
  10166. "lsr r7, r8, #16\n\t"
  10167. "mul r6, r7, r6\n\t"
  10168. "lsr r7, r6, #16\n\t"
  10169. "lsl r6, r6, #16\n\t"
  10170. "adds r3, r3, r6\n\t"
  10171. "adc r4, r4, r7\n\t"
  10172. "lsr r6, %[b], #16\n\t"
  10173. "lsr r7, r8, #16\n\t"
  10174. "mul r7, r6, r7\n\t"
  10175. "add r4, r4, r7\n\t"
  10176. "lsl r7, r8, #16\n\t"
  10177. "lsr r7, r7, #16\n\t"
  10178. "mul r6, r7, r6\n\t"
  10179. "lsr r7, r6, #16\n\t"
  10180. "lsl r6, r6, #16\n\t"
  10181. "adds r3, r3, r6\n\t"
  10182. "adc r4, r4, r7\n\t"
  10183. #else
  10184. "umlal r3, r4, %[b], r8\n\t"
  10185. #endif
  10186. "stm %[r]!, {r3}\n\t"
  10187. "mov r5, #0\n\t"
  10188. /* A[4] * B */
  10189. "ldm %[a]!, {r8}\n\t"
  10190. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  10191. "lsl r6, %[b], #16\n\t"
  10192. "lsl r7, r8, #16\n\t"
  10193. "lsr r6, r6, #16\n\t"
  10194. "lsr r7, r7, #16\n\t"
  10195. "mul r7, r6, r7\n\t"
  10196. "adds r4, r4, r7\n\t"
  10197. "adc r5, r5, #0\n\t"
  10198. "lsr r7, r8, #16\n\t"
  10199. "mul r6, r7, r6\n\t"
  10200. "lsr r7, r6, #16\n\t"
  10201. "lsl r6, r6, #16\n\t"
  10202. "adds r4, r4, r6\n\t"
  10203. "adc r5, r5, r7\n\t"
  10204. "lsr r6, %[b], #16\n\t"
  10205. "lsr r7, r8, #16\n\t"
  10206. "mul r7, r6, r7\n\t"
  10207. "add r5, r5, r7\n\t"
  10208. "lsl r7, r8, #16\n\t"
  10209. "lsr r7, r7, #16\n\t"
  10210. "mul r6, r7, r6\n\t"
  10211. "lsr r7, r6, #16\n\t"
  10212. "lsl r6, r6, #16\n\t"
  10213. "adds r4, r4, r6\n\t"
  10214. "adc r5, r5, r7\n\t"
  10215. #else
  10216. "umlal r4, r5, %[b], r8\n\t"
  10217. #endif
  10218. "stm %[r]!, {r4}\n\t"
  10219. "mov r3, #0\n\t"
  10220. /* A[5] * B */
  10221. "ldm %[a]!, {r8}\n\t"
  10222. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  10223. "lsl r6, %[b], #16\n\t"
  10224. "lsl r7, r8, #16\n\t"
  10225. "lsr r6, r6, #16\n\t"
  10226. "lsr r7, r7, #16\n\t"
  10227. "mul r7, r6, r7\n\t"
  10228. "adds r5, r5, r7\n\t"
  10229. "adc r3, r3, #0\n\t"
  10230. "lsr r7, r8, #16\n\t"
  10231. "mul r6, r7, r6\n\t"
  10232. "lsr r7, r6, #16\n\t"
  10233. "lsl r6, r6, #16\n\t"
  10234. "adds r5, r5, r6\n\t"
  10235. "adc r3, r3, r7\n\t"
  10236. "lsr r6, %[b], #16\n\t"
  10237. "lsr r7, r8, #16\n\t"
  10238. "mul r7, r6, r7\n\t"
  10239. "add r3, r3, r7\n\t"
  10240. "lsl r7, r8, #16\n\t"
  10241. "lsr r7, r7, #16\n\t"
  10242. "mul r6, r7, r6\n\t"
  10243. "lsr r7, r6, #16\n\t"
  10244. "lsl r6, r6, #16\n\t"
  10245. "adds r5, r5, r6\n\t"
  10246. "adc r3, r3, r7\n\t"
  10247. #else
  10248. "umlal r5, r3, %[b], r8\n\t"
  10249. #endif
  10250. "stm %[r]!, {r5}\n\t"
  10251. "mov r4, #0\n\t"
  10252. /* A[6] * B */
  10253. "ldm %[a]!, {r8}\n\t"
  10254. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  10255. "lsl r6, %[b], #16\n\t"
  10256. "lsl r7, r8, #16\n\t"
  10257. "lsr r6, r6, #16\n\t"
  10258. "lsr r7, r7, #16\n\t"
  10259. "mul r7, r6, r7\n\t"
  10260. "adds r3, r3, r7\n\t"
  10261. "adc r4, r4, #0\n\t"
  10262. "lsr r7, r8, #16\n\t"
  10263. "mul r6, r7, r6\n\t"
  10264. "lsr r7, r6, #16\n\t"
  10265. "lsl r6, r6, #16\n\t"
  10266. "adds r3, r3, r6\n\t"
  10267. "adc r4, r4, r7\n\t"
  10268. "lsr r6, %[b], #16\n\t"
  10269. "lsr r7, r8, #16\n\t"
  10270. "mul r7, r6, r7\n\t"
  10271. "add r4, r4, r7\n\t"
  10272. "lsl r7, r8, #16\n\t"
  10273. "lsr r7, r7, #16\n\t"
  10274. "mul r6, r7, r6\n\t"
  10275. "lsr r7, r6, #16\n\t"
  10276. "lsl r6, r6, #16\n\t"
  10277. "adds r3, r3, r6\n\t"
  10278. "adc r4, r4, r7\n\t"
  10279. #else
  10280. "umlal r3, r4, %[b], r8\n\t"
  10281. #endif
  10282. "stm %[r]!, {r3}\n\t"
  10283. "mov r5, #0\n\t"
  10284. /* A[7] * B */
  10285. "ldm %[a]!, {r8}\n\t"
  10286. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  10287. "lsl r6, %[b], #16\n\t"
  10288. "lsl r7, r8, #16\n\t"
  10289. "lsr r6, r6, #16\n\t"
  10290. "lsr r7, r7, #16\n\t"
  10291. "mul r7, r6, r7\n\t"
  10292. "adds r4, r4, r7\n\t"
  10293. "adc r5, r5, #0\n\t"
  10294. "lsr r7, r8, #16\n\t"
  10295. "mul r6, r7, r6\n\t"
  10296. "lsr r7, r6, #16\n\t"
  10297. "lsl r6, r6, #16\n\t"
  10298. "adds r4, r4, r6\n\t"
  10299. "adc r5, r5, r7\n\t"
  10300. "lsr r6, %[b], #16\n\t"
  10301. "lsr r7, r8, #16\n\t"
  10302. "mul r7, r6, r7\n\t"
  10303. "add r5, r5, r7\n\t"
  10304. "lsl r7, r8, #16\n\t"
  10305. "lsr r7, r7, #16\n\t"
  10306. "mul r6, r7, r6\n\t"
  10307. "lsr r7, r6, #16\n\t"
  10308. "lsl r6, r6, #16\n\t"
  10309. "adds r4, r4, r6\n\t"
  10310. "adc r5, r5, r7\n\t"
  10311. #else
  10312. "umlal r4, r5, %[b], r8\n\t"
  10313. #endif
  10314. "stm %[r]!, {r4}\n\t"
  10315. "mov r3, #0\n\t"
  10316. /* A[8] * B */
  10317. "ldm %[a]!, {r8}\n\t"
  10318. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  10319. "lsl r6, %[b], #16\n\t"
  10320. "lsl r7, r8, #16\n\t"
  10321. "lsr r6, r6, #16\n\t"
  10322. "lsr r7, r7, #16\n\t"
  10323. "mul r7, r6, r7\n\t"
  10324. "adds r5, r5, r7\n\t"
  10325. "adc r3, r3, #0\n\t"
  10326. "lsr r7, r8, #16\n\t"
  10327. "mul r6, r7, r6\n\t"
  10328. "lsr r7, r6, #16\n\t"
  10329. "lsl r6, r6, #16\n\t"
  10330. "adds r5, r5, r6\n\t"
  10331. "adc r3, r3, r7\n\t"
  10332. "lsr r6, %[b], #16\n\t"
  10333. "lsr r7, r8, #16\n\t"
  10334. "mul r7, r6, r7\n\t"
  10335. "add r3, r3, r7\n\t"
  10336. "lsl r7, r8, #16\n\t"
  10337. "lsr r7, r7, #16\n\t"
  10338. "mul r6, r7, r6\n\t"
  10339. "lsr r7, r6, #16\n\t"
  10340. "lsl r6, r6, #16\n\t"
  10341. "adds r5, r5, r6\n\t"
  10342. "adc r3, r3, r7\n\t"
  10343. #else
  10344. "umlal r5, r3, %[b], r8\n\t"
  10345. #endif
  10346. "stm %[r]!, {r5}\n\t"
  10347. "mov r4, #0\n\t"
  10348. /* A[9] * B */
  10349. "ldm %[a]!, {r8}\n\t"
  10350. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  10351. "lsl r6, %[b], #16\n\t"
  10352. "lsl r7, r8, #16\n\t"
  10353. "lsr r6, r6, #16\n\t"
  10354. "lsr r7, r7, #16\n\t"
  10355. "mul r7, r6, r7\n\t"
  10356. "adds r3, r3, r7\n\t"
  10357. "adc r4, r4, #0\n\t"
  10358. "lsr r7, r8, #16\n\t"
  10359. "mul r6, r7, r6\n\t"
  10360. "lsr r7, r6, #16\n\t"
  10361. "lsl r6, r6, #16\n\t"
  10362. "adds r3, r3, r6\n\t"
  10363. "adc r4, r4, r7\n\t"
  10364. "lsr r6, %[b], #16\n\t"
  10365. "lsr r7, r8, #16\n\t"
  10366. "mul r7, r6, r7\n\t"
  10367. "add r4, r4, r7\n\t"
  10368. "lsl r7, r8, #16\n\t"
  10369. "lsr r7, r7, #16\n\t"
  10370. "mul r6, r7, r6\n\t"
  10371. "lsr r7, r6, #16\n\t"
  10372. "lsl r6, r6, #16\n\t"
  10373. "adds r3, r3, r6\n\t"
  10374. "adc r4, r4, r7\n\t"
  10375. #else
  10376. "umlal r3, r4, %[b], r8\n\t"
  10377. #endif
  10378. "stm %[r]!, {r3}\n\t"
  10379. "mov r5, #0\n\t"
  10380. /* A[10] * B */
  10381. "ldm %[a]!, {r8}\n\t"
  10382. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  10383. "lsl r6, %[b], #16\n\t"
  10384. "lsl r7, r8, #16\n\t"
  10385. "lsr r6, r6, #16\n\t"
  10386. "lsr r7, r7, #16\n\t"
  10387. "mul r7, r6, r7\n\t"
  10388. "adds r4, r4, r7\n\t"
  10389. "adc r5, r5, #0\n\t"
  10390. "lsr r7, r8, #16\n\t"
  10391. "mul r6, r7, r6\n\t"
  10392. "lsr r7, r6, #16\n\t"
  10393. "lsl r6, r6, #16\n\t"
  10394. "adds r4, r4, r6\n\t"
  10395. "adc r5, r5, r7\n\t"
  10396. "lsr r6, %[b], #16\n\t"
  10397. "lsr r7, r8, #16\n\t"
  10398. "mul r7, r6, r7\n\t"
  10399. "add r5, r5, r7\n\t"
  10400. "lsl r7, r8, #16\n\t"
  10401. "lsr r7, r7, #16\n\t"
  10402. "mul r6, r7, r6\n\t"
  10403. "lsr r7, r6, #16\n\t"
  10404. "lsl r6, r6, #16\n\t"
  10405. "adds r4, r4, r6\n\t"
  10406. "adc r5, r5, r7\n\t"
  10407. #else
  10408. "umlal r4, r5, %[b], r8\n\t"
  10409. #endif
  10410. "stm %[r]!, {r4}\n\t"
  10411. "mov r3, #0\n\t"
  10412. /* A[11] * B */
  10413. "ldm %[a]!, {r8}\n\t"
  10414. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  10415. "lsl r6, %[b], #16\n\t"
  10416. "lsl r7, r8, #16\n\t"
  10417. "lsr r6, r6, #16\n\t"
  10418. "lsr r7, r7, #16\n\t"
  10419. "mul r7, r6, r7\n\t"
  10420. "adds r5, r5, r7\n\t"
  10421. "adc r3, r3, #0\n\t"
  10422. "lsr r7, r8, #16\n\t"
  10423. "mul r6, r7, r6\n\t"
  10424. "lsr r7, r6, #16\n\t"
  10425. "lsl r6, r6, #16\n\t"
  10426. "adds r5, r5, r6\n\t"
  10427. "adc r3, r3, r7\n\t"
  10428. "lsr r6, %[b], #16\n\t"
  10429. "lsr r7, r8, #16\n\t"
  10430. "mul r7, r6, r7\n\t"
  10431. "add r3, r3, r7\n\t"
  10432. "lsl r7, r8, #16\n\t"
  10433. "lsr r7, r7, #16\n\t"
  10434. "mul r6, r7, r6\n\t"
  10435. "lsr r7, r6, #16\n\t"
  10436. "lsl r6, r6, #16\n\t"
  10437. "adds r5, r5, r6\n\t"
  10438. "adc r3, r3, r7\n\t"
  10439. #else
  10440. "umlal r5, r3, %[b], r8\n\t"
  10441. #endif
  10442. "stm %[r]!, {r5}\n\t"
  10443. "mov r4, #0\n\t"
  10444. /* A[12] * B */
  10445. "ldm %[a]!, {r8}\n\t"
  10446. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  10447. "lsl r6, %[b], #16\n\t"
  10448. "lsl r7, r8, #16\n\t"
  10449. "lsr r6, r6, #16\n\t"
  10450. "lsr r7, r7, #16\n\t"
  10451. "mul r7, r6, r7\n\t"
  10452. "adds r3, r3, r7\n\t"
  10453. "adc r4, r4, #0\n\t"
  10454. "lsr r7, r8, #16\n\t"
  10455. "mul r6, r7, r6\n\t"
  10456. "lsr r7, r6, #16\n\t"
  10457. "lsl r6, r6, #16\n\t"
  10458. "adds r3, r3, r6\n\t"
  10459. "adc r4, r4, r7\n\t"
  10460. "lsr r6, %[b], #16\n\t"
  10461. "lsr r7, r8, #16\n\t"
  10462. "mul r7, r6, r7\n\t"
  10463. "add r4, r4, r7\n\t"
  10464. "lsl r7, r8, #16\n\t"
  10465. "lsr r7, r7, #16\n\t"
  10466. "mul r6, r7, r6\n\t"
  10467. "lsr r7, r6, #16\n\t"
  10468. "lsl r6, r6, #16\n\t"
  10469. "adds r3, r3, r6\n\t"
  10470. "adc r4, r4, r7\n\t"
  10471. #else
  10472. "umlal r3, r4, %[b], r8\n\t"
  10473. #endif
  10474. "stm %[r]!, {r3}\n\t"
  10475. "mov r5, #0\n\t"
  10476. /* A[13] * B */
  10477. "ldm %[a]!, {r8}\n\t"
  10478. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  10479. "lsl r6, %[b], #16\n\t"
  10480. "lsl r7, r8, #16\n\t"
  10481. "lsr r6, r6, #16\n\t"
  10482. "lsr r7, r7, #16\n\t"
  10483. "mul r7, r6, r7\n\t"
  10484. "adds r4, r4, r7\n\t"
  10485. "adc r5, r5, #0\n\t"
  10486. "lsr r7, r8, #16\n\t"
  10487. "mul r6, r7, r6\n\t"
  10488. "lsr r7, r6, #16\n\t"
  10489. "lsl r6, r6, #16\n\t"
  10490. "adds r4, r4, r6\n\t"
  10491. "adc r5, r5, r7\n\t"
  10492. "lsr r6, %[b], #16\n\t"
  10493. "lsr r7, r8, #16\n\t"
  10494. "mul r7, r6, r7\n\t"
  10495. "add r5, r5, r7\n\t"
  10496. "lsl r7, r8, #16\n\t"
  10497. "lsr r7, r7, #16\n\t"
  10498. "mul r6, r7, r6\n\t"
  10499. "lsr r7, r6, #16\n\t"
  10500. "lsl r6, r6, #16\n\t"
  10501. "adds r4, r4, r6\n\t"
  10502. "adc r5, r5, r7\n\t"
  10503. #else
  10504. "umlal r4, r5, %[b], r8\n\t"
  10505. #endif
  10506. "stm %[r]!, {r4}\n\t"
  10507. "mov r3, #0\n\t"
  10508. /* A[14] * B */
  10509. "ldm %[a]!, {r8}\n\t"
  10510. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  10511. "lsl r6, %[b], #16\n\t"
  10512. "lsl r7, r8, #16\n\t"
  10513. "lsr r6, r6, #16\n\t"
  10514. "lsr r7, r7, #16\n\t"
  10515. "mul r7, r6, r7\n\t"
  10516. "adds r5, r5, r7\n\t"
  10517. "adc r3, r3, #0\n\t"
  10518. "lsr r7, r8, #16\n\t"
  10519. "mul r6, r7, r6\n\t"
  10520. "lsr r7, r6, #16\n\t"
  10521. "lsl r6, r6, #16\n\t"
  10522. "adds r5, r5, r6\n\t"
  10523. "adc r3, r3, r7\n\t"
  10524. "lsr r6, %[b], #16\n\t"
  10525. "lsr r7, r8, #16\n\t"
  10526. "mul r7, r6, r7\n\t"
  10527. "add r3, r3, r7\n\t"
  10528. "lsl r7, r8, #16\n\t"
  10529. "lsr r7, r7, #16\n\t"
  10530. "mul r6, r7, r6\n\t"
  10531. "lsr r7, r6, #16\n\t"
  10532. "lsl r6, r6, #16\n\t"
  10533. "adds r5, r5, r6\n\t"
  10534. "adc r3, r3, r7\n\t"
  10535. #else
  10536. "umlal r5, r3, %[b], r8\n\t"
  10537. #endif
  10538. "stm %[r]!, {r5}\n\t"
  10539. "mov r4, #0\n\t"
  10540. /* A[15] * B */
  10541. "ldm %[a]!, {r8}\n\t"
  10542. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  10543. "lsl r6, %[b], #16\n\t"
  10544. "lsl r7, r8, #16\n\t"
  10545. "lsr r6, r6, #16\n\t"
  10546. "lsr r7, r7, #16\n\t"
  10547. "mul r7, r6, r7\n\t"
  10548. "adds r3, r3, r7\n\t"
  10549. "adc r4, r4, #0\n\t"
  10550. "lsr r7, r8, #16\n\t"
  10551. "mul r6, r7, r6\n\t"
  10552. "lsr r7, r6, #16\n\t"
  10553. "lsl r6, r6, #16\n\t"
  10554. "adds r3, r3, r6\n\t"
  10555. "adc r4, r4, r7\n\t"
  10556. "lsr r6, %[b], #16\n\t"
  10557. "lsr r7, r8, #16\n\t"
  10558. "mul r7, r6, r7\n\t"
  10559. "add r4, r4, r7\n\t"
  10560. "lsl r7, r8, #16\n\t"
  10561. "lsr r7, r7, #16\n\t"
  10562. "mul r6, r7, r6\n\t"
  10563. "lsr r7, r6, #16\n\t"
  10564. "lsl r6, r6, #16\n\t"
  10565. "adds r3, r3, r6\n\t"
  10566. "adc r4, r4, r7\n\t"
  10567. #else
  10568. "umlal r3, r4, %[b], r8\n\t"
  10569. #endif
  10570. "stm %[r]!, {r3}\n\t"
  10571. "mov r5, #0\n\t"
  10572. /* A[16] * B */
  10573. "ldm %[a]!, {r8}\n\t"
  10574. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  10575. "lsl r6, %[b], #16\n\t"
  10576. "lsl r7, r8, #16\n\t"
  10577. "lsr r6, r6, #16\n\t"
  10578. "lsr r7, r7, #16\n\t"
  10579. "mul r7, r6, r7\n\t"
  10580. "adds r4, r4, r7\n\t"
  10581. "adc r5, r5, #0\n\t"
  10582. "lsr r7, r8, #16\n\t"
  10583. "mul r6, r7, r6\n\t"
  10584. "lsr r7, r6, #16\n\t"
  10585. "lsl r6, r6, #16\n\t"
  10586. "adds r4, r4, r6\n\t"
  10587. "adc r5, r5, r7\n\t"
  10588. "lsr r6, %[b], #16\n\t"
  10589. "lsr r7, r8, #16\n\t"
  10590. "mul r7, r6, r7\n\t"
  10591. "add r5, r5, r7\n\t"
  10592. "lsl r7, r8, #16\n\t"
  10593. "lsr r7, r7, #16\n\t"
  10594. "mul r6, r7, r6\n\t"
  10595. "lsr r7, r6, #16\n\t"
  10596. "lsl r6, r6, #16\n\t"
  10597. "adds r4, r4, r6\n\t"
  10598. "adc r5, r5, r7\n\t"
  10599. #else
  10600. "umlal r4, r5, %[b], r8\n\t"
  10601. #endif
  10602. "stm %[r]!, {r4}\n\t"
  10603. "mov r3, #0\n\t"
  10604. /* A[17] * B */
  10605. "ldm %[a]!, {r8}\n\t"
  10606. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  10607. "lsl r6, %[b], #16\n\t"
  10608. "lsl r7, r8, #16\n\t"
  10609. "lsr r6, r6, #16\n\t"
  10610. "lsr r7, r7, #16\n\t"
  10611. "mul r7, r6, r7\n\t"
  10612. "adds r5, r5, r7\n\t"
  10613. "adc r3, r3, #0\n\t"
  10614. "lsr r7, r8, #16\n\t"
  10615. "mul r6, r7, r6\n\t"
  10616. "lsr r7, r6, #16\n\t"
  10617. "lsl r6, r6, #16\n\t"
  10618. "adds r5, r5, r6\n\t"
  10619. "adc r3, r3, r7\n\t"
  10620. "lsr r6, %[b], #16\n\t"
  10621. "lsr r7, r8, #16\n\t"
  10622. "mul r7, r6, r7\n\t"
  10623. "add r3, r3, r7\n\t"
  10624. "lsl r7, r8, #16\n\t"
  10625. "lsr r7, r7, #16\n\t"
  10626. "mul r6, r7, r6\n\t"
  10627. "lsr r7, r6, #16\n\t"
  10628. "lsl r6, r6, #16\n\t"
  10629. "adds r5, r5, r6\n\t"
  10630. "adc r3, r3, r7\n\t"
  10631. #else
  10632. "umlal r5, r3, %[b], r8\n\t"
  10633. #endif
  10634. "stm %[r]!, {r5}\n\t"
  10635. "mov r4, #0\n\t"
  10636. /* A[18] * B */
  10637. "ldm %[a]!, {r8}\n\t"
  10638. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  10639. "lsl r6, %[b], #16\n\t"
  10640. "lsl r7, r8, #16\n\t"
  10641. "lsr r6, r6, #16\n\t"
  10642. "lsr r7, r7, #16\n\t"
  10643. "mul r7, r6, r7\n\t"
  10644. "adds r3, r3, r7\n\t"
  10645. "adc r4, r4, #0\n\t"
  10646. "lsr r7, r8, #16\n\t"
  10647. "mul r6, r7, r6\n\t"
  10648. "lsr r7, r6, #16\n\t"
  10649. "lsl r6, r6, #16\n\t"
  10650. "adds r3, r3, r6\n\t"
  10651. "adc r4, r4, r7\n\t"
  10652. "lsr r6, %[b], #16\n\t"
  10653. "lsr r7, r8, #16\n\t"
  10654. "mul r7, r6, r7\n\t"
  10655. "add r4, r4, r7\n\t"
  10656. "lsl r7, r8, #16\n\t"
  10657. "lsr r7, r7, #16\n\t"
  10658. "mul r6, r7, r6\n\t"
  10659. "lsr r7, r6, #16\n\t"
  10660. "lsl r6, r6, #16\n\t"
  10661. "adds r3, r3, r6\n\t"
  10662. "adc r4, r4, r7\n\t"
  10663. #else
  10664. "umlal r3, r4, %[b], r8\n\t"
  10665. #endif
  10666. "stm %[r]!, {r3}\n\t"
  10667. "mov r5, #0\n\t"
  10668. /* A[19] * B */
  10669. "ldm %[a]!, {r8}\n\t"
  10670. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  10671. "lsl r6, %[b], #16\n\t"
  10672. "lsl r7, r8, #16\n\t"
  10673. "lsr r6, r6, #16\n\t"
  10674. "lsr r7, r7, #16\n\t"
  10675. "mul r7, r6, r7\n\t"
  10676. "adds r4, r4, r7\n\t"
  10677. "adc r5, r5, #0\n\t"
  10678. "lsr r7, r8, #16\n\t"
  10679. "mul r6, r7, r6\n\t"
  10680. "lsr r7, r6, #16\n\t"
  10681. "lsl r6, r6, #16\n\t"
  10682. "adds r4, r4, r6\n\t"
  10683. "adc r5, r5, r7\n\t"
  10684. "lsr r6, %[b], #16\n\t"
  10685. "lsr r7, r8, #16\n\t"
  10686. "mul r7, r6, r7\n\t"
  10687. "add r5, r5, r7\n\t"
  10688. "lsl r7, r8, #16\n\t"
  10689. "lsr r7, r7, #16\n\t"
  10690. "mul r6, r7, r6\n\t"
  10691. "lsr r7, r6, #16\n\t"
  10692. "lsl r6, r6, #16\n\t"
  10693. "adds r4, r4, r6\n\t"
  10694. "adc r5, r5, r7\n\t"
  10695. #else
  10696. "umlal r4, r5, %[b], r8\n\t"
  10697. #endif
  10698. "stm %[r]!, {r4}\n\t"
  10699. "mov r3, #0\n\t"
  10700. /* A[20] * B */
  10701. "ldm %[a]!, {r8}\n\t"
  10702. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  10703. "lsl r6, %[b], #16\n\t"
  10704. "lsl r7, r8, #16\n\t"
  10705. "lsr r6, r6, #16\n\t"
  10706. "lsr r7, r7, #16\n\t"
  10707. "mul r7, r6, r7\n\t"
  10708. "adds r5, r5, r7\n\t"
  10709. "adc r3, r3, #0\n\t"
  10710. "lsr r7, r8, #16\n\t"
  10711. "mul r6, r7, r6\n\t"
  10712. "lsr r7, r6, #16\n\t"
  10713. "lsl r6, r6, #16\n\t"
  10714. "adds r5, r5, r6\n\t"
  10715. "adc r3, r3, r7\n\t"
  10716. "lsr r6, %[b], #16\n\t"
  10717. "lsr r7, r8, #16\n\t"
  10718. "mul r7, r6, r7\n\t"
  10719. "add r3, r3, r7\n\t"
  10720. "lsl r7, r8, #16\n\t"
  10721. "lsr r7, r7, #16\n\t"
  10722. "mul r6, r7, r6\n\t"
  10723. "lsr r7, r6, #16\n\t"
  10724. "lsl r6, r6, #16\n\t"
  10725. "adds r5, r5, r6\n\t"
  10726. "adc r3, r3, r7\n\t"
  10727. #else
  10728. "umlal r5, r3, %[b], r8\n\t"
  10729. #endif
  10730. "stm %[r]!, {r5}\n\t"
  10731. "mov r4, #0\n\t"
  10732. /* A[21] * B */
  10733. "ldm %[a]!, {r8}\n\t"
  10734. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  10735. "lsl r6, %[b], #16\n\t"
  10736. "lsl r7, r8, #16\n\t"
  10737. "lsr r6, r6, #16\n\t"
  10738. "lsr r7, r7, #16\n\t"
  10739. "mul r7, r6, r7\n\t"
  10740. "adds r3, r3, r7\n\t"
  10741. "adc r4, r4, #0\n\t"
  10742. "lsr r7, r8, #16\n\t"
  10743. "mul r6, r7, r6\n\t"
  10744. "lsr r7, r6, #16\n\t"
  10745. "lsl r6, r6, #16\n\t"
  10746. "adds r3, r3, r6\n\t"
  10747. "adc r4, r4, r7\n\t"
  10748. "lsr r6, %[b], #16\n\t"
  10749. "lsr r7, r8, #16\n\t"
  10750. "mul r7, r6, r7\n\t"
  10751. "add r4, r4, r7\n\t"
  10752. "lsl r7, r8, #16\n\t"
  10753. "lsr r7, r7, #16\n\t"
  10754. "mul r6, r7, r6\n\t"
  10755. "lsr r7, r6, #16\n\t"
  10756. "lsl r6, r6, #16\n\t"
  10757. "adds r3, r3, r6\n\t"
  10758. "adc r4, r4, r7\n\t"
  10759. #else
  10760. "umlal r3, r4, %[b], r8\n\t"
  10761. #endif
  10762. "stm %[r]!, {r3}\n\t"
  10763. "mov r5, #0\n\t"
  10764. /* A[22] * B */
  10765. "ldm %[a]!, {r8}\n\t"
  10766. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  10767. "lsl r6, %[b], #16\n\t"
  10768. "lsl r7, r8, #16\n\t"
  10769. "lsr r6, r6, #16\n\t"
  10770. "lsr r7, r7, #16\n\t"
  10771. "mul r7, r6, r7\n\t"
  10772. "adds r4, r4, r7\n\t"
  10773. "adc r5, r5, #0\n\t"
  10774. "lsr r7, r8, #16\n\t"
  10775. "mul r6, r7, r6\n\t"
  10776. "lsr r7, r6, #16\n\t"
  10777. "lsl r6, r6, #16\n\t"
  10778. "adds r4, r4, r6\n\t"
  10779. "adc r5, r5, r7\n\t"
  10780. "lsr r6, %[b], #16\n\t"
  10781. "lsr r7, r8, #16\n\t"
  10782. "mul r7, r6, r7\n\t"
  10783. "add r5, r5, r7\n\t"
  10784. "lsl r7, r8, #16\n\t"
  10785. "lsr r7, r7, #16\n\t"
  10786. "mul r6, r7, r6\n\t"
  10787. "lsr r7, r6, #16\n\t"
  10788. "lsl r6, r6, #16\n\t"
  10789. "adds r4, r4, r6\n\t"
  10790. "adc r5, r5, r7\n\t"
  10791. #else
  10792. "umlal r4, r5, %[b], r8\n\t"
  10793. #endif
  10794. "stm %[r]!, {r4}\n\t"
  10795. "mov r3, #0\n\t"
  10796. /* A[23] * B */
  10797. "ldm %[a]!, {r8}\n\t"
  10798. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  10799. "lsl r6, %[b], #16\n\t"
  10800. "lsl r7, r8, #16\n\t"
  10801. "lsr r6, r6, #16\n\t"
  10802. "lsr r7, r7, #16\n\t"
  10803. "mul r7, r6, r7\n\t"
  10804. "adds r5, r5, r7\n\t"
  10805. "adc r3, r3, #0\n\t"
  10806. "lsr r7, r8, #16\n\t"
  10807. "mul r6, r7, r6\n\t"
  10808. "lsr r7, r6, #16\n\t"
  10809. "lsl r6, r6, #16\n\t"
  10810. "adds r5, r5, r6\n\t"
  10811. "adc r3, r3, r7\n\t"
  10812. "lsr r6, %[b], #16\n\t"
  10813. "lsr r7, r8, #16\n\t"
  10814. "mul r7, r6, r7\n\t"
  10815. "add r3, r3, r7\n\t"
  10816. "lsl r7, r8, #16\n\t"
  10817. "lsr r7, r7, #16\n\t"
  10818. "mul r6, r7, r6\n\t"
  10819. "lsr r7, r6, #16\n\t"
  10820. "lsl r6, r6, #16\n\t"
  10821. "adds r5, r5, r6\n\t"
  10822. "adc r3, r3, r7\n\t"
  10823. #else
  10824. "umlal r5, r3, %[b], r8\n\t"
  10825. #endif
  10826. "stm %[r]!, {r5}\n\t"
  10827. "mov r4, #0\n\t"
  10828. /* A[24] * B */
  10829. "ldm %[a]!, {r8}\n\t"
  10830. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  10831. "lsl r6, %[b], #16\n\t"
  10832. "lsl r7, r8, #16\n\t"
  10833. "lsr r6, r6, #16\n\t"
  10834. "lsr r7, r7, #16\n\t"
  10835. "mul r7, r6, r7\n\t"
  10836. "adds r3, r3, r7\n\t"
  10837. "adc r4, r4, #0\n\t"
  10838. "lsr r7, r8, #16\n\t"
  10839. "mul r6, r7, r6\n\t"
  10840. "lsr r7, r6, #16\n\t"
  10841. "lsl r6, r6, #16\n\t"
  10842. "adds r3, r3, r6\n\t"
  10843. "adc r4, r4, r7\n\t"
  10844. "lsr r6, %[b], #16\n\t"
  10845. "lsr r7, r8, #16\n\t"
  10846. "mul r7, r6, r7\n\t"
  10847. "add r4, r4, r7\n\t"
  10848. "lsl r7, r8, #16\n\t"
  10849. "lsr r7, r7, #16\n\t"
  10850. "mul r6, r7, r6\n\t"
  10851. "lsr r7, r6, #16\n\t"
  10852. "lsl r6, r6, #16\n\t"
  10853. "adds r3, r3, r6\n\t"
  10854. "adc r4, r4, r7\n\t"
  10855. #else
  10856. "umlal r3, r4, %[b], r8\n\t"
  10857. #endif
  10858. "stm %[r]!, {r3}\n\t"
  10859. "mov r5, #0\n\t"
  10860. /* A[25] * B */
  10861. "ldm %[a]!, {r8}\n\t"
  10862. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  10863. "lsl r6, %[b], #16\n\t"
  10864. "lsl r7, r8, #16\n\t"
  10865. "lsr r6, r6, #16\n\t"
  10866. "lsr r7, r7, #16\n\t"
  10867. "mul r7, r6, r7\n\t"
  10868. "adds r4, r4, r7\n\t"
  10869. "adc r5, r5, #0\n\t"
  10870. "lsr r7, r8, #16\n\t"
  10871. "mul r6, r7, r6\n\t"
  10872. "lsr r7, r6, #16\n\t"
  10873. "lsl r6, r6, #16\n\t"
  10874. "adds r4, r4, r6\n\t"
  10875. "adc r5, r5, r7\n\t"
  10876. "lsr r6, %[b], #16\n\t"
  10877. "lsr r7, r8, #16\n\t"
  10878. "mul r7, r6, r7\n\t"
  10879. "add r5, r5, r7\n\t"
  10880. "lsl r7, r8, #16\n\t"
  10881. "lsr r7, r7, #16\n\t"
  10882. "mul r6, r7, r6\n\t"
  10883. "lsr r7, r6, #16\n\t"
  10884. "lsl r6, r6, #16\n\t"
  10885. "adds r4, r4, r6\n\t"
  10886. "adc r5, r5, r7\n\t"
  10887. #else
  10888. "umlal r4, r5, %[b], r8\n\t"
  10889. #endif
  10890. "stm %[r]!, {r4}\n\t"
  10891. "mov r3, #0\n\t"
  10892. /* A[26] * B */
  10893. "ldm %[a]!, {r8}\n\t"
  10894. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  10895. "lsl r6, %[b], #16\n\t"
  10896. "lsl r7, r8, #16\n\t"
  10897. "lsr r6, r6, #16\n\t"
  10898. "lsr r7, r7, #16\n\t"
  10899. "mul r7, r6, r7\n\t"
  10900. "adds r5, r5, r7\n\t"
  10901. "adc r3, r3, #0\n\t"
  10902. "lsr r7, r8, #16\n\t"
  10903. "mul r6, r7, r6\n\t"
  10904. "lsr r7, r6, #16\n\t"
  10905. "lsl r6, r6, #16\n\t"
  10906. "adds r5, r5, r6\n\t"
  10907. "adc r3, r3, r7\n\t"
  10908. "lsr r6, %[b], #16\n\t"
  10909. "lsr r7, r8, #16\n\t"
  10910. "mul r7, r6, r7\n\t"
  10911. "add r3, r3, r7\n\t"
  10912. "lsl r7, r8, #16\n\t"
  10913. "lsr r7, r7, #16\n\t"
  10914. "mul r6, r7, r6\n\t"
  10915. "lsr r7, r6, #16\n\t"
  10916. "lsl r6, r6, #16\n\t"
  10917. "adds r5, r5, r6\n\t"
  10918. "adc r3, r3, r7\n\t"
  10919. #else
  10920. "umlal r5, r3, %[b], r8\n\t"
  10921. #endif
  10922. "stm %[r]!, {r5}\n\t"
  10923. "mov r4, #0\n\t"
  10924. /* A[27] * B */
  10925. "ldm %[a]!, {r8}\n\t"
  10926. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  10927. "lsl r6, %[b], #16\n\t"
  10928. "lsl r7, r8, #16\n\t"
  10929. "lsr r6, r6, #16\n\t"
  10930. "lsr r7, r7, #16\n\t"
  10931. "mul r7, r6, r7\n\t"
  10932. "adds r3, r3, r7\n\t"
  10933. "adc r4, r4, #0\n\t"
  10934. "lsr r7, r8, #16\n\t"
  10935. "mul r6, r7, r6\n\t"
  10936. "lsr r7, r6, #16\n\t"
  10937. "lsl r6, r6, #16\n\t"
  10938. "adds r3, r3, r6\n\t"
  10939. "adc r4, r4, r7\n\t"
  10940. "lsr r6, %[b], #16\n\t"
  10941. "lsr r7, r8, #16\n\t"
  10942. "mul r7, r6, r7\n\t"
  10943. "add r4, r4, r7\n\t"
  10944. "lsl r7, r8, #16\n\t"
  10945. "lsr r7, r7, #16\n\t"
  10946. "mul r6, r7, r6\n\t"
  10947. "lsr r7, r6, #16\n\t"
  10948. "lsl r6, r6, #16\n\t"
  10949. "adds r3, r3, r6\n\t"
  10950. "adc r4, r4, r7\n\t"
  10951. #else
  10952. "umlal r3, r4, %[b], r8\n\t"
  10953. #endif
  10954. "stm %[r]!, {r3}\n\t"
  10955. "mov r5, #0\n\t"
  10956. /* A[28] * B */
  10957. "ldm %[a]!, {r8}\n\t"
  10958. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  10959. "lsl r6, %[b], #16\n\t"
  10960. "lsl r7, r8, #16\n\t"
  10961. "lsr r6, r6, #16\n\t"
  10962. "lsr r7, r7, #16\n\t"
  10963. "mul r7, r6, r7\n\t"
  10964. "adds r4, r4, r7\n\t"
  10965. "adc r5, r5, #0\n\t"
  10966. "lsr r7, r8, #16\n\t"
  10967. "mul r6, r7, r6\n\t"
  10968. "lsr r7, r6, #16\n\t"
  10969. "lsl r6, r6, #16\n\t"
  10970. "adds r4, r4, r6\n\t"
  10971. "adc r5, r5, r7\n\t"
  10972. "lsr r6, %[b], #16\n\t"
  10973. "lsr r7, r8, #16\n\t"
  10974. "mul r7, r6, r7\n\t"
  10975. "add r5, r5, r7\n\t"
  10976. "lsl r7, r8, #16\n\t"
  10977. "lsr r7, r7, #16\n\t"
  10978. "mul r6, r7, r6\n\t"
  10979. "lsr r7, r6, #16\n\t"
  10980. "lsl r6, r6, #16\n\t"
  10981. "adds r4, r4, r6\n\t"
  10982. "adc r5, r5, r7\n\t"
  10983. #else
  10984. "umlal r4, r5, %[b], r8\n\t"
  10985. #endif
  10986. "stm %[r]!, {r4}\n\t"
  10987. "mov r3, #0\n\t"
  10988. /* A[29] * B */
  10989. "ldm %[a]!, {r8}\n\t"
  10990. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  10991. "lsl r6, %[b], #16\n\t"
  10992. "lsl r7, r8, #16\n\t"
  10993. "lsr r6, r6, #16\n\t"
  10994. "lsr r7, r7, #16\n\t"
  10995. "mul r7, r6, r7\n\t"
  10996. "adds r5, r5, r7\n\t"
  10997. "adc r3, r3, #0\n\t"
  10998. "lsr r7, r8, #16\n\t"
  10999. "mul r6, r7, r6\n\t"
  11000. "lsr r7, r6, #16\n\t"
  11001. "lsl r6, r6, #16\n\t"
  11002. "adds r5, r5, r6\n\t"
  11003. "adc r3, r3, r7\n\t"
  11004. "lsr r6, %[b], #16\n\t"
  11005. "lsr r7, r8, #16\n\t"
  11006. "mul r7, r6, r7\n\t"
  11007. "add r3, r3, r7\n\t"
  11008. "lsl r7, r8, #16\n\t"
  11009. "lsr r7, r7, #16\n\t"
  11010. "mul r6, r7, r6\n\t"
  11011. "lsr r7, r6, #16\n\t"
  11012. "lsl r6, r6, #16\n\t"
  11013. "adds r5, r5, r6\n\t"
  11014. "adc r3, r3, r7\n\t"
  11015. #else
  11016. "umlal r5, r3, %[b], r8\n\t"
  11017. #endif
  11018. "stm %[r]!, {r5}\n\t"
  11019. "mov r4, #0\n\t"
  11020. /* A[30] * B */
  11021. "ldm %[a]!, {r8}\n\t"
  11022. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  11023. "lsl r6, %[b], #16\n\t"
  11024. "lsl r7, r8, #16\n\t"
  11025. "lsr r6, r6, #16\n\t"
  11026. "lsr r7, r7, #16\n\t"
  11027. "mul r7, r6, r7\n\t"
  11028. "adds r3, r3, r7\n\t"
  11029. "adc r4, r4, #0\n\t"
  11030. "lsr r7, r8, #16\n\t"
  11031. "mul r6, r7, r6\n\t"
  11032. "lsr r7, r6, #16\n\t"
  11033. "lsl r6, r6, #16\n\t"
  11034. "adds r3, r3, r6\n\t"
  11035. "adc r4, r4, r7\n\t"
  11036. "lsr r6, %[b], #16\n\t"
  11037. "lsr r7, r8, #16\n\t"
  11038. "mul r7, r6, r7\n\t"
  11039. "add r4, r4, r7\n\t"
  11040. "lsl r7, r8, #16\n\t"
  11041. "lsr r7, r7, #16\n\t"
  11042. "mul r6, r7, r6\n\t"
  11043. "lsr r7, r6, #16\n\t"
  11044. "lsl r6, r6, #16\n\t"
  11045. "adds r3, r3, r6\n\t"
  11046. "adc r4, r4, r7\n\t"
  11047. #else
  11048. "umlal r3, r4, %[b], r8\n\t"
  11049. #endif
  11050. "stm %[r]!, {r3}\n\t"
  11051. "mov r5, #0\n\t"
  11052. /* A[31] * B */
  11053. "ldm %[a]!, {r8}\n\t"
  11054. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  11055. "lsl r6, %[b], #16\n\t"
  11056. "lsl r7, r8, #16\n\t"
  11057. "lsr r6, r6, #16\n\t"
  11058. "lsr r7, r7, #16\n\t"
  11059. "mul r7, r6, r7\n\t"
  11060. "adds r4, r4, r7\n\t"
  11061. "adc r5, r5, #0\n\t"
  11062. "lsr r7, r8, #16\n\t"
  11063. "mul r6, r7, r6\n\t"
  11064. "lsr r7, r6, #16\n\t"
  11065. "lsl r6, r6, #16\n\t"
  11066. "adds r4, r4, r6\n\t"
  11067. "adc r5, r5, r7\n\t"
  11068. "lsr r6, %[b], #16\n\t"
  11069. "lsr r7, r8, #16\n\t"
  11070. "mul r7, r6, r7\n\t"
  11071. "add r5, r5, r7\n\t"
  11072. "lsl r7, r8, #16\n\t"
  11073. "lsr r7, r7, #16\n\t"
  11074. "mul r6, r7, r6\n\t"
  11075. "lsr r7, r6, #16\n\t"
  11076. "lsl r6, r6, #16\n\t"
  11077. "adds r4, r4, r6\n\t"
  11078. "adc r5, r5, r7\n\t"
  11079. #else
  11080. "umlal r4, r5, %[b], r8\n\t"
  11081. #endif
  11082. "stm %[r]!, {r4}\n\t"
  11083. "str r5, [%[r]]\n\t"
  11084. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  11085. :
  11086. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "cc"
  11087. );
  11088. }
  11089. #endif /* WOLFSSL_SP_SMALL */
  11090. #ifdef WOLFSSL_SP_USE_UDIV
  11091. /* Divide the double width number (d1|d0) by the divisor. (d1|d0 / div)
  11092. *
  11093. * d1 The high order half of the number to divide.
  11094. * d0 The low order half of the number to divide.
  11095. * div The divisor.
  11096. * returns the result of the division.
  11097. *
  11098. * Note that this is an approximate div. It may give an answer 1 larger.
  11099. */
  11100. static sp_digit div_2048_word_32(sp_digit d1_p, sp_digit d0_p, sp_digit div_p)
  11101. {
  11102. register sp_digit d1 asm ("r0") = (sp_digit)d1_p;
  11103. register sp_digit d0 asm ("r1") = (sp_digit)d0_p;
  11104. register sp_digit div asm ("r2") = (sp_digit)div_p;
  11105. __asm__ __volatile__ (
  11106. "lsr r6, %[div], #16\n\t"
  11107. "add lr, r6, #1\n\t"
  11108. "udiv r4, %[d1], lr\n\t"
  11109. "lsl r5, %[div], #16\n\t"
  11110. "lsl r4, r4, #16\n\t"
  11111. "umull r3, r12, %[div], r4\n\t"
  11112. "subs %[d0], %[d0], r3\n\t"
  11113. "sbc %[d1], %[d1], r12\n\t"
  11114. "subs r3, %[d1], lr\n\t"
  11115. "sbc r7, r7, r7\n\t"
  11116. "add r7, r7, #1\n\t"
  11117. "rsb r8, r7, #0\n\t"
  11118. "lsl r7, r7, #16\n\t"
  11119. "and r5, r5, r8\n\t"
  11120. "and r6, r6, r8\n\t"
  11121. "subs %[d0], %[d0], r5\n\t"
  11122. "add r4, r4, r7\n\t"
  11123. "sbc %[d1], %[d1], r6\n\t"
  11124. "lsl r12, %[d1], #16\n\t"
  11125. "lsr r3, %[d0], #16\n\t"
  11126. "orr r3, r3, r12\n\t"
  11127. "udiv r3, r3, lr\n\t"
  11128. "add r4, r4, r3\n\t"
  11129. "umull r3, r12, %[div], r3\n\t"
  11130. "subs %[d0], %[d0], r3\n\t"
  11131. "sbc %[d1], %[d1], r12\n\t"
  11132. "lsl r12, %[d1], #16\n\t"
  11133. "lsr r3, %[d0], #16\n\t"
  11134. "orr r3, r3, r12\n\t"
  11135. "udiv r3, r3, lr\n\t"
  11136. "add r4, r4, r3\n\t"
  11137. "mul r3, %[div], r3\n\t"
  11138. "sub %[d0], %[d0], r3\n\t"
  11139. "udiv r3, %[d0], %[div]\n\t"
  11140. "add %[d1], r4, r3\n\t"
  11141. : [d1] "+r" (d1), [d0] "+r" (d0), [div] "+r" (div)
  11142. :
  11143. : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8", "cc"
  11144. );
  11145. return (uint32_t)(size_t)d1;
  11146. }
  11147. #else
  11148. /* Divide the double width number (d1|d0) by the divisor. (d1|d0 / div)
  11149. *
  11150. * d1 The high order half of the number to divide.
  11151. * d0 The low order half of the number to divide.
  11152. * div The divisor.
  11153. * returns the result of the division.
  11154. *
  11155. * Note that this is an approximate div. It may give an answer 1 larger.
  11156. */
  11157. static sp_digit div_2048_word_32(sp_digit d1_p, sp_digit d0_p, sp_digit div_p)
  11158. {
  11159. register sp_digit d1 asm ("r0") = (sp_digit)d1_p;
  11160. register sp_digit d0 asm ("r1") = (sp_digit)d0_p;
  11161. register sp_digit div asm ("r2") = (sp_digit)div_p;
  11162. __asm__ __volatile__ (
  11163. "lsr lr, %[div], #1\n\t"
  11164. "add lr, lr, #1\n\t"
  11165. "mov r4, %[d0]\n\t"
  11166. "mov r5, %[d1]\n\t"
  11167. /* Do top 32 */
  11168. "subs r6, lr, r5\n\t"
  11169. "sbc r6, r6, r6\n\t"
  11170. "mov r3, #0\n\t"
  11171. "sub r3, r3, r6\n\t"
  11172. "and r6, r6, lr\n\t"
  11173. "subs r5, r5, r6\n\t"
  11174. /* Next 30 bits */
  11175. "mov r12, #29\n\t"
  11176. "\n"
  11177. "L_div_2048_word_32_bit_%=: \n\t"
  11178. "lsls r4, r4, #1\n\t"
  11179. "adc r5, r5, r5\n\t"
  11180. "subs r6, lr, r5\n\t"
  11181. "sbc r6, r6, r6\n\t"
  11182. "add r3, r3, r3\n\t"
  11183. "sub r3, r3, r6\n\t"
  11184. "and r6, r6, lr\n\t"
  11185. "subs r5, r5, r6\n\t"
  11186. "subs r12, r12, #1\n\t"
  11187. "bpl L_div_2048_word_32_bit_%=\n\t"
  11188. "add r3, r3, r3\n\t"
  11189. "add r3, r3, #1\n\t"
  11190. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  11191. "lsl r7, r3, #16\n\t"
  11192. "lsl r4, %[div], #16\n\t"
  11193. "lsr r7, r7, #16\n\t"
  11194. "lsr r4, r4, #16\n\t"
  11195. "mul r4, r7, r4\n\t"
  11196. "lsr r8, %[div], #16\n\t"
  11197. "mul r7, r8, r7\n\t"
  11198. "lsr r5, r7, #16\n\t"
  11199. "lsl r7, r7, #16\n\t"
  11200. "adds r4, r4, r7\n\t"
  11201. "adc r5, r5, #0\n\t"
  11202. "lsr r7, r3, #16\n\t"
  11203. "mul r8, r7, r8\n\t"
  11204. "add r5, r5, r8\n\t"
  11205. "lsl r8, %[div], #16\n\t"
  11206. "lsr r8, r8, #16\n\t"
  11207. "mul r7, r8, r7\n\t"
  11208. "lsr r8, r7, #16\n\t"
  11209. "lsl r7, r7, #16\n\t"
  11210. "adds r4, r4, r7\n\t"
  11211. "adc r5, r5, r8\n\t"
  11212. #else
  11213. "umull r4, r5, r3, %[div]\n\t"
  11214. #endif
  11215. "subs r7, %[d0], r4\n\t"
  11216. "sbc r8, %[d1], r5\n\t"
  11217. "add r3, r3, r8\n\t"
  11218. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  11219. "lsl r7, r3, #16\n\t"
  11220. "lsl r4, %[div], #16\n\t"
  11221. "lsr r7, r7, #16\n\t"
  11222. "lsr r4, r4, #16\n\t"
  11223. "mul r4, r7, r4\n\t"
  11224. "lsr r8, %[div], #16\n\t"
  11225. "mul r7, r8, r7\n\t"
  11226. "lsr r5, r7, #16\n\t"
  11227. "lsl r7, r7, #16\n\t"
  11228. "adds r4, r4, r7\n\t"
  11229. "adc r5, r5, #0\n\t"
  11230. "lsr r7, r3, #16\n\t"
  11231. "mul r8, r7, r8\n\t"
  11232. "add r5, r5, r8\n\t"
  11233. "lsl r8, %[div], #16\n\t"
  11234. "lsr r8, r8, #16\n\t"
  11235. "mul r7, r8, r7\n\t"
  11236. "lsr r8, r7, #16\n\t"
  11237. "lsl r7, r7, #16\n\t"
  11238. "adds r4, r4, r7\n\t"
  11239. "adc r5, r5, r8\n\t"
  11240. #else
  11241. "umull r4, r5, r3, %[div]\n\t"
  11242. #endif
  11243. "subs r7, %[d0], r4\n\t"
  11244. "sbc r8, %[d1], r5\n\t"
  11245. "add r3, r3, r8\n\t"
  11246. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  11247. "lsl r7, r3, #16\n\t"
  11248. "lsl r4, %[div], #16\n\t"
  11249. "lsr r7, r7, #16\n\t"
  11250. "lsr r4, r4, #16\n\t"
  11251. "mul r4, r7, r4\n\t"
  11252. "lsr r8, %[div], #16\n\t"
  11253. "mul r7, r8, r7\n\t"
  11254. "lsr r5, r7, #16\n\t"
  11255. "lsl r7, r7, #16\n\t"
  11256. "adds r4, r4, r7\n\t"
  11257. "adc r5, r5, #0\n\t"
  11258. "lsr r7, r3, #16\n\t"
  11259. "mul r8, r7, r8\n\t"
  11260. "add r5, r5, r8\n\t"
  11261. "lsl r8, %[div], #16\n\t"
  11262. "lsr r8, r8, #16\n\t"
  11263. "mul r7, r8, r7\n\t"
  11264. "lsr r8, r7, #16\n\t"
  11265. "lsl r7, r7, #16\n\t"
  11266. "adds r4, r4, r7\n\t"
  11267. "adc r5, r5, r8\n\t"
  11268. #else
  11269. "umull r4, r5, r3, %[div]\n\t"
  11270. #endif
  11271. "subs r7, %[d0], r4\n\t"
  11272. "sbc r8, %[d1], r5\n\t"
  11273. "add r3, r3, r8\n\t"
  11274. "subs r6, %[div], r7\n\t"
  11275. "sbc r6, r6, r6\n\t"
  11276. "sub %[d1], r3, r6\n\t"
  11277. : [d1] "+r" (d1), [d0] "+r" (d0), [div] "+r" (div)
  11278. :
  11279. : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8", "cc"
  11280. );
  11281. return (uint32_t)(size_t)d1;
  11282. }
  11283. #endif
  11284. /* Compare a with b in constant time.
  11285. *
  11286. * a A single precision integer.
  11287. * b A single precision integer.
  11288. * return -ve, 0 or +ve if a is less than, equal to or greater than b
  11289. * respectively.
  11290. */
  11291. static sp_int32 sp_2048_cmp_32(const sp_digit* a_p, const sp_digit* b_p)
  11292. {
  11293. register const sp_digit* a asm ("r0") = (const sp_digit*)a_p;
  11294. register const sp_digit* b asm ("r1") = (const sp_digit*)b_p;
  11295. __asm__ __volatile__ (
  11296. "mov r2, #-1\n\t"
  11297. "mov r6, #1\n\t"
  11298. "mov r5, #0\n\t"
  11299. "mov r3, #-1\n\t"
  11300. #ifdef WOLFSSL_SP_SMALL
  11301. "mov r4, #0x7c\n\t"
  11302. "\n"
  11303. "L_sp_2048_cmp_32_words_%=: \n\t"
  11304. "ldr r12, [%[a], r4]\n\t"
  11305. "ldr lr, [%[b], r4]\n\t"
  11306. "and r12, r12, r3\n\t"
  11307. "and lr, lr, r3\n\t"
  11308. "subs r12, r12, lr\n\t"
  11309. "it hi\n\t"
  11310. "movhi r2, r6\n\t"
  11311. "it lo\n\t"
  11312. "movlo r2, r3\n\t"
  11313. "it ne\n\t"
  11314. "movne r3, r5\n\t"
  11315. "subs r4, r4, #4\n\t"
  11316. "bcs L_sp_2048_cmp_32_words_%=\n\t"
  11317. "eor r2, r2, r3\n\t"
  11318. #else
  11319. "ldr r12, [%[a], #124]\n\t"
  11320. "ldr lr, [%[b], #124]\n\t"
  11321. "and r12, r12, r3\n\t"
  11322. "and lr, lr, r3\n\t"
  11323. "subs r12, r12, lr\n\t"
  11324. "it hi\n\t"
  11325. "movhi r2, r6\n\t"
  11326. "it lo\n\t"
  11327. "movlo r2, r3\n\t"
  11328. "it ne\n\t"
  11329. "movne r3, r5\n\t"
  11330. "ldr r12, [%[a], #120]\n\t"
  11331. "ldr lr, [%[b], #120]\n\t"
  11332. "and r12, r12, r3\n\t"
  11333. "and lr, lr, r3\n\t"
  11334. "subs r12, r12, lr\n\t"
  11335. "it hi\n\t"
  11336. "movhi r2, r6\n\t"
  11337. "it lo\n\t"
  11338. "movlo r2, r3\n\t"
  11339. "it ne\n\t"
  11340. "movne r3, r5\n\t"
  11341. "ldr r12, [%[a], #116]\n\t"
  11342. "ldr lr, [%[b], #116]\n\t"
  11343. "and r12, r12, r3\n\t"
  11344. "and lr, lr, r3\n\t"
  11345. "subs r12, r12, lr\n\t"
  11346. "it hi\n\t"
  11347. "movhi r2, r6\n\t"
  11348. "it lo\n\t"
  11349. "movlo r2, r3\n\t"
  11350. "it ne\n\t"
  11351. "movne r3, r5\n\t"
  11352. "ldr r12, [%[a], #112]\n\t"
  11353. "ldr lr, [%[b], #112]\n\t"
  11354. "and r12, r12, r3\n\t"
  11355. "and lr, lr, r3\n\t"
  11356. "subs r12, r12, lr\n\t"
  11357. "it hi\n\t"
  11358. "movhi r2, r6\n\t"
  11359. "it lo\n\t"
  11360. "movlo r2, r3\n\t"
  11361. "it ne\n\t"
  11362. "movne r3, r5\n\t"
  11363. "ldr r12, [%[a], #108]\n\t"
  11364. "ldr lr, [%[b], #108]\n\t"
  11365. "and r12, r12, r3\n\t"
  11366. "and lr, lr, r3\n\t"
  11367. "subs r12, r12, lr\n\t"
  11368. "it hi\n\t"
  11369. "movhi r2, r6\n\t"
  11370. "it lo\n\t"
  11371. "movlo r2, r3\n\t"
  11372. "it ne\n\t"
  11373. "movne r3, r5\n\t"
  11374. "ldr r12, [%[a], #104]\n\t"
  11375. "ldr lr, [%[b], #104]\n\t"
  11376. "and r12, r12, r3\n\t"
  11377. "and lr, lr, r3\n\t"
  11378. "subs r12, r12, lr\n\t"
  11379. "it hi\n\t"
  11380. "movhi r2, r6\n\t"
  11381. "it lo\n\t"
  11382. "movlo r2, r3\n\t"
  11383. "it ne\n\t"
  11384. "movne r3, r5\n\t"
  11385. "ldr r12, [%[a], #100]\n\t"
  11386. "ldr lr, [%[b], #100]\n\t"
  11387. "and r12, r12, r3\n\t"
  11388. "and lr, lr, r3\n\t"
  11389. "subs r12, r12, lr\n\t"
  11390. "it hi\n\t"
  11391. "movhi r2, r6\n\t"
  11392. "it lo\n\t"
  11393. "movlo r2, r3\n\t"
  11394. "it ne\n\t"
  11395. "movne r3, r5\n\t"
  11396. "ldr r12, [%[a], #96]\n\t"
  11397. "ldr lr, [%[b], #96]\n\t"
  11398. "and r12, r12, r3\n\t"
  11399. "and lr, lr, r3\n\t"
  11400. "subs r12, r12, lr\n\t"
  11401. "it hi\n\t"
  11402. "movhi r2, r6\n\t"
  11403. "it lo\n\t"
  11404. "movlo r2, r3\n\t"
  11405. "it ne\n\t"
  11406. "movne r3, r5\n\t"
  11407. "ldr r12, [%[a], #92]\n\t"
  11408. "ldr lr, [%[b], #92]\n\t"
  11409. "and r12, r12, r3\n\t"
  11410. "and lr, lr, r3\n\t"
  11411. "subs r12, r12, lr\n\t"
  11412. "it hi\n\t"
  11413. "movhi r2, r6\n\t"
  11414. "it lo\n\t"
  11415. "movlo r2, r3\n\t"
  11416. "it ne\n\t"
  11417. "movne r3, r5\n\t"
  11418. "ldr r12, [%[a], #88]\n\t"
  11419. "ldr lr, [%[b], #88]\n\t"
  11420. "and r12, r12, r3\n\t"
  11421. "and lr, lr, r3\n\t"
  11422. "subs r12, r12, lr\n\t"
  11423. "it hi\n\t"
  11424. "movhi r2, r6\n\t"
  11425. "it lo\n\t"
  11426. "movlo r2, r3\n\t"
  11427. "it ne\n\t"
  11428. "movne r3, r5\n\t"
  11429. "ldr r12, [%[a], #84]\n\t"
  11430. "ldr lr, [%[b], #84]\n\t"
  11431. "and r12, r12, r3\n\t"
  11432. "and lr, lr, r3\n\t"
  11433. "subs r12, r12, lr\n\t"
  11434. "it hi\n\t"
  11435. "movhi r2, r6\n\t"
  11436. "it lo\n\t"
  11437. "movlo r2, r3\n\t"
  11438. "it ne\n\t"
  11439. "movne r3, r5\n\t"
  11440. "ldr r12, [%[a], #80]\n\t"
  11441. "ldr lr, [%[b], #80]\n\t"
  11442. "and r12, r12, r3\n\t"
  11443. "and lr, lr, r3\n\t"
  11444. "subs r12, r12, lr\n\t"
  11445. "it hi\n\t"
  11446. "movhi r2, r6\n\t"
  11447. "it lo\n\t"
  11448. "movlo r2, r3\n\t"
  11449. "it ne\n\t"
  11450. "movne r3, r5\n\t"
  11451. "ldr r12, [%[a], #76]\n\t"
  11452. "ldr lr, [%[b], #76]\n\t"
  11453. "and r12, r12, r3\n\t"
  11454. "and lr, lr, r3\n\t"
  11455. "subs r12, r12, lr\n\t"
  11456. "it hi\n\t"
  11457. "movhi r2, r6\n\t"
  11458. "it lo\n\t"
  11459. "movlo r2, r3\n\t"
  11460. "it ne\n\t"
  11461. "movne r3, r5\n\t"
  11462. "ldr r12, [%[a], #72]\n\t"
  11463. "ldr lr, [%[b], #72]\n\t"
  11464. "and r12, r12, r3\n\t"
  11465. "and lr, lr, r3\n\t"
  11466. "subs r12, r12, lr\n\t"
  11467. "it hi\n\t"
  11468. "movhi r2, r6\n\t"
  11469. "it lo\n\t"
  11470. "movlo r2, r3\n\t"
  11471. "it ne\n\t"
  11472. "movne r3, r5\n\t"
  11473. "ldr r12, [%[a], #68]\n\t"
  11474. "ldr lr, [%[b], #68]\n\t"
  11475. "and r12, r12, r3\n\t"
  11476. "and lr, lr, r3\n\t"
  11477. "subs r12, r12, lr\n\t"
  11478. "it hi\n\t"
  11479. "movhi r2, r6\n\t"
  11480. "it lo\n\t"
  11481. "movlo r2, r3\n\t"
  11482. "it ne\n\t"
  11483. "movne r3, r5\n\t"
  11484. "ldr r12, [%[a], #64]\n\t"
  11485. "ldr lr, [%[b], #64]\n\t"
  11486. "and r12, r12, r3\n\t"
  11487. "and lr, lr, r3\n\t"
  11488. "subs r12, r12, lr\n\t"
  11489. "it hi\n\t"
  11490. "movhi r2, r6\n\t"
  11491. "it lo\n\t"
  11492. "movlo r2, r3\n\t"
  11493. "it ne\n\t"
  11494. "movne r3, r5\n\t"
  11495. "ldr r12, [%[a], #60]\n\t"
  11496. "ldr lr, [%[b], #60]\n\t"
  11497. "and r12, r12, r3\n\t"
  11498. "and lr, lr, r3\n\t"
  11499. "subs r12, r12, lr\n\t"
  11500. "it hi\n\t"
  11501. "movhi r2, r6\n\t"
  11502. "it lo\n\t"
  11503. "movlo r2, r3\n\t"
  11504. "it ne\n\t"
  11505. "movne r3, r5\n\t"
  11506. "ldr r12, [%[a], #56]\n\t"
  11507. "ldr lr, [%[b], #56]\n\t"
  11508. "and r12, r12, r3\n\t"
  11509. "and lr, lr, r3\n\t"
  11510. "subs r12, r12, lr\n\t"
  11511. "it hi\n\t"
  11512. "movhi r2, r6\n\t"
  11513. "it lo\n\t"
  11514. "movlo r2, r3\n\t"
  11515. "it ne\n\t"
  11516. "movne r3, r5\n\t"
  11517. "ldr r12, [%[a], #52]\n\t"
  11518. "ldr lr, [%[b], #52]\n\t"
  11519. "and r12, r12, r3\n\t"
  11520. "and lr, lr, r3\n\t"
  11521. "subs r12, r12, lr\n\t"
  11522. "it hi\n\t"
  11523. "movhi r2, r6\n\t"
  11524. "it lo\n\t"
  11525. "movlo r2, r3\n\t"
  11526. "it ne\n\t"
  11527. "movne r3, r5\n\t"
  11528. "ldr r12, [%[a], #48]\n\t"
  11529. "ldr lr, [%[b], #48]\n\t"
  11530. "and r12, r12, r3\n\t"
  11531. "and lr, lr, r3\n\t"
  11532. "subs r12, r12, lr\n\t"
  11533. "it hi\n\t"
  11534. "movhi r2, r6\n\t"
  11535. "it lo\n\t"
  11536. "movlo r2, r3\n\t"
  11537. "it ne\n\t"
  11538. "movne r3, r5\n\t"
  11539. "ldr r12, [%[a], #44]\n\t"
  11540. "ldr lr, [%[b], #44]\n\t"
  11541. "and r12, r12, r3\n\t"
  11542. "and lr, lr, r3\n\t"
  11543. "subs r12, r12, lr\n\t"
  11544. "it hi\n\t"
  11545. "movhi r2, r6\n\t"
  11546. "it lo\n\t"
  11547. "movlo r2, r3\n\t"
  11548. "it ne\n\t"
  11549. "movne r3, r5\n\t"
  11550. "ldr r12, [%[a], #40]\n\t"
  11551. "ldr lr, [%[b], #40]\n\t"
  11552. "and r12, r12, r3\n\t"
  11553. "and lr, lr, r3\n\t"
  11554. "subs r12, r12, lr\n\t"
  11555. "it hi\n\t"
  11556. "movhi r2, r6\n\t"
  11557. "it lo\n\t"
  11558. "movlo r2, r3\n\t"
  11559. "it ne\n\t"
  11560. "movne r3, r5\n\t"
  11561. "ldr r12, [%[a], #36]\n\t"
  11562. "ldr lr, [%[b], #36]\n\t"
  11563. "and r12, r12, r3\n\t"
  11564. "and lr, lr, r3\n\t"
  11565. "subs r12, r12, lr\n\t"
  11566. "it hi\n\t"
  11567. "movhi r2, r6\n\t"
  11568. "it lo\n\t"
  11569. "movlo r2, r3\n\t"
  11570. "it ne\n\t"
  11571. "movne r3, r5\n\t"
  11572. "ldr r12, [%[a], #32]\n\t"
  11573. "ldr lr, [%[b], #32]\n\t"
  11574. "and r12, r12, r3\n\t"
  11575. "and lr, lr, r3\n\t"
  11576. "subs r12, r12, lr\n\t"
  11577. "it hi\n\t"
  11578. "movhi r2, r6\n\t"
  11579. "it lo\n\t"
  11580. "movlo r2, r3\n\t"
  11581. "it ne\n\t"
  11582. "movne r3, r5\n\t"
  11583. "ldr r12, [%[a], #28]\n\t"
  11584. "ldr lr, [%[b], #28]\n\t"
  11585. "and r12, r12, r3\n\t"
  11586. "and lr, lr, r3\n\t"
  11587. "subs r12, r12, lr\n\t"
  11588. "it hi\n\t"
  11589. "movhi r2, r6\n\t"
  11590. "it lo\n\t"
  11591. "movlo r2, r3\n\t"
  11592. "it ne\n\t"
  11593. "movne r3, r5\n\t"
  11594. "ldr r12, [%[a], #24]\n\t"
  11595. "ldr lr, [%[b], #24]\n\t"
  11596. "and r12, r12, r3\n\t"
  11597. "and lr, lr, r3\n\t"
  11598. "subs r12, r12, lr\n\t"
  11599. "it hi\n\t"
  11600. "movhi r2, r6\n\t"
  11601. "it lo\n\t"
  11602. "movlo r2, r3\n\t"
  11603. "it ne\n\t"
  11604. "movne r3, r5\n\t"
  11605. "ldr r12, [%[a], #20]\n\t"
  11606. "ldr lr, [%[b], #20]\n\t"
  11607. "and r12, r12, r3\n\t"
  11608. "and lr, lr, r3\n\t"
  11609. "subs r12, r12, lr\n\t"
  11610. "it hi\n\t"
  11611. "movhi r2, r6\n\t"
  11612. "it lo\n\t"
  11613. "movlo r2, r3\n\t"
  11614. "it ne\n\t"
  11615. "movne r3, r5\n\t"
  11616. "ldr r12, [%[a], #16]\n\t"
  11617. "ldr lr, [%[b], #16]\n\t"
  11618. "and r12, r12, r3\n\t"
  11619. "and lr, lr, r3\n\t"
  11620. "subs r12, r12, lr\n\t"
  11621. "it hi\n\t"
  11622. "movhi r2, r6\n\t"
  11623. "it lo\n\t"
  11624. "movlo r2, r3\n\t"
  11625. "it ne\n\t"
  11626. "movne r3, r5\n\t"
  11627. "ldr r12, [%[a], #12]\n\t"
  11628. "ldr lr, [%[b], #12]\n\t"
  11629. "and r12, r12, r3\n\t"
  11630. "and lr, lr, r3\n\t"
  11631. "subs r12, r12, lr\n\t"
  11632. "it hi\n\t"
  11633. "movhi r2, r6\n\t"
  11634. "it lo\n\t"
  11635. "movlo r2, r3\n\t"
  11636. "it ne\n\t"
  11637. "movne r3, r5\n\t"
  11638. "ldr r12, [%[a], #8]\n\t"
  11639. "ldr lr, [%[b], #8]\n\t"
  11640. "and r12, r12, r3\n\t"
  11641. "and lr, lr, r3\n\t"
  11642. "subs r12, r12, lr\n\t"
  11643. "it hi\n\t"
  11644. "movhi r2, r6\n\t"
  11645. "it lo\n\t"
  11646. "movlo r2, r3\n\t"
  11647. "it ne\n\t"
  11648. "movne r3, r5\n\t"
  11649. "ldr r12, [%[a], #4]\n\t"
  11650. "ldr lr, [%[b], #4]\n\t"
  11651. "and r12, r12, r3\n\t"
  11652. "and lr, lr, r3\n\t"
  11653. "subs r12, r12, lr\n\t"
  11654. "it hi\n\t"
  11655. "movhi r2, r6\n\t"
  11656. "it lo\n\t"
  11657. "movlo r2, r3\n\t"
  11658. "it ne\n\t"
  11659. "movne r3, r5\n\t"
  11660. "ldr r12, [%[a]]\n\t"
  11661. "ldr lr, [%[b]]\n\t"
  11662. "and r12, r12, r3\n\t"
  11663. "and lr, lr, r3\n\t"
  11664. "subs r12, r12, lr\n\t"
  11665. "it hi\n\t"
  11666. "movhi r2, r6\n\t"
  11667. "it lo\n\t"
  11668. "movlo r2, r3\n\t"
  11669. "it ne\n\t"
  11670. "movne r3, r5\n\t"
  11671. "eor r2, r2, r3\n\t"
  11672. #endif /*WOLFSSL_SP_SMALL */
  11673. "mov %[a], r2\n\t"
  11674. : [a] "+r" (a), [b] "+r" (b)
  11675. :
  11676. : "memory", "r2", "r3", "r12", "lr", "r4", "r5", "r6", "cc"
  11677. );
  11678. return (uint32_t)(size_t)a;
  11679. }
  11680. /* Divide d in a and put remainder into r (m*d + r = a)
  11681. * m is not calculated as it is not needed at this time.
  11682. *
  11683. * a Number to be divided.
  11684. * d Number to divide with.
  11685. * m Multiplier result.
  11686. * r Remainder from the division.
  11687. * returns MP_OKAY indicating success.
  11688. */
  11689. static WC_INLINE int sp_2048_div_32(const sp_digit* a, const sp_digit* d,
  11690. sp_digit* m, sp_digit* r)
  11691. {
  11692. sp_digit t1[64], t2[33];
  11693. sp_digit div, r1;
  11694. int i;
  11695. (void)m;
  11696. div = d[31];
  11697. XMEMCPY(t1, a, sizeof(*t1) * 2 * 32);
  11698. r1 = sp_2048_cmp_32(&t1[32], d) >= 0;
  11699. sp_2048_cond_sub_32(&t1[32], &t1[32], d, (sp_digit)0 - r1);
  11700. for (i = 31; i >= 0; i--) {
  11701. volatile sp_digit mask = (sp_digit)0 - (t1[32 + i] == div);
  11702. sp_digit hi = t1[32 + i] + mask;
  11703. r1 = div_2048_word_32(hi, t1[32 + i - 1], div);
  11704. r1 |= mask;
  11705. sp_2048_mul_d_32(t2, d, r1);
  11706. t1[32 + i] += sp_2048_sub_in_place_32(&t1[i], t2);
  11707. t1[32 + i] -= t2[32];
  11708. sp_2048_mask_32(t2, d, t1[32 + i]);
  11709. t1[32 + i] += sp_2048_add_32(&t1[i], &t1[i], t2);
  11710. sp_2048_mask_32(t2, d, t1[32 + i]);
  11711. t1[32 + i] += sp_2048_add_32(&t1[i], &t1[i], t2);
  11712. }
  11713. r1 = sp_2048_cmp_32(t1, d) >= 0;
  11714. sp_2048_cond_sub_32(r, t1, d, (sp_digit)0 - r1);
  11715. return MP_OKAY;
  11716. }
  11717. /* Reduce a modulo m into r. (r = a mod m)
  11718. *
  11719. * r A single precision number that is the reduced result.
  11720. * a A single precision number that is to be reduced.
  11721. * m A single precision number that is the modulus to reduce with.
  11722. * returns MP_OKAY indicating success.
  11723. */
  11724. static WC_INLINE int sp_2048_mod_32(sp_digit* r, const sp_digit* a,
  11725. const sp_digit* m)
  11726. {
  11727. return sp_2048_div_32(a, m, NULL, r);
  11728. }
  11729. #ifdef WOLFSSL_SP_SMALL
  11730. /* Modular exponentiate a to the e mod m. (r = a^e mod m)
  11731. *
  11732. * r A single precision number that is the result of the operation.
  11733. * a A single precision number being exponentiated.
  11734. * e A single precision number that is the exponent.
  11735. * bits The number of bits in the exponent.
  11736. * m A single precision number that is the modulus.
  11737. * returns 0 on success.
  11738. * returns MEMORY_E on dynamic memory allocation failure.
  11739. * returns MP_VAL when base is even or exponent is 0.
  11740. */
  11741. static int sp_2048_mod_exp_32(sp_digit* r, const sp_digit* a, const sp_digit* e,
  11742. int bits, const sp_digit* m, int reduceA)
  11743. {
  11744. #ifdef WOLFSSL_SP_SMALL_STACK
  11745. sp_digit* td = NULL;
  11746. #else
  11747. sp_digit td[16 * 64];
  11748. #endif
  11749. sp_digit* t[16];
  11750. sp_digit* norm = NULL;
  11751. sp_digit mp = 1;
  11752. sp_digit n;
  11753. sp_digit mask;
  11754. int i;
  11755. int c;
  11756. byte y;
  11757. int err = MP_OKAY;
  11758. if (bits == 0) {
  11759. err = MP_VAL;
  11760. }
  11761. #ifdef WOLFSSL_SP_SMALL_STACK
  11762. if (err == MP_OKAY) {
  11763. td = (sp_digit*)XMALLOC(sizeof(sp_digit) * (16 * 64), NULL,
  11764. DYNAMIC_TYPE_TMP_BUFFER);
  11765. if (td == NULL)
  11766. err = MEMORY_E;
  11767. }
  11768. #endif
  11769. if (err == MP_OKAY) {
  11770. norm = td;
  11771. for (i=0; i<16; i++) {
  11772. t[i] = td + i * 64;
  11773. }
  11774. sp_2048_mont_setup(m, &mp);
  11775. sp_2048_mont_norm_32(norm, m);
  11776. XMEMSET(t[1], 0, sizeof(sp_digit) * 32U);
  11777. if (reduceA != 0) {
  11778. err = sp_2048_mod_32(t[1] + 32, a, m);
  11779. if (err == MP_OKAY) {
  11780. err = sp_2048_mod_32(t[1], t[1], m);
  11781. }
  11782. }
  11783. else {
  11784. XMEMCPY(t[1] + 32, a, sizeof(sp_digit) * 32);
  11785. err = sp_2048_mod_32(t[1], t[1], m);
  11786. }
  11787. }
  11788. if (err == MP_OKAY) {
  11789. sp_2048_mont_sqr_32(t[ 2], t[ 1], m, mp);
  11790. sp_2048_mont_mul_32(t[ 3], t[ 2], t[ 1], m, mp);
  11791. sp_2048_mont_sqr_32(t[ 4], t[ 2], m, mp);
  11792. sp_2048_mont_mul_32(t[ 5], t[ 3], t[ 2], m, mp);
  11793. sp_2048_mont_sqr_32(t[ 6], t[ 3], m, mp);
  11794. sp_2048_mont_mul_32(t[ 7], t[ 4], t[ 3], m, mp);
  11795. sp_2048_mont_sqr_32(t[ 8], t[ 4], m, mp);
  11796. sp_2048_mont_mul_32(t[ 9], t[ 5], t[ 4], m, mp);
  11797. sp_2048_mont_sqr_32(t[10], t[ 5], m, mp);
  11798. sp_2048_mont_mul_32(t[11], t[ 6], t[ 5], m, mp);
  11799. sp_2048_mont_sqr_32(t[12], t[ 6], m, mp);
  11800. sp_2048_mont_mul_32(t[13], t[ 7], t[ 6], m, mp);
  11801. sp_2048_mont_sqr_32(t[14], t[ 7], m, mp);
  11802. sp_2048_mont_mul_32(t[15], t[ 8], t[ 7], m, mp);
  11803. i = (bits - 1) / 32;
  11804. n = e[i--];
  11805. c = bits & 31;
  11806. if (c == 0) {
  11807. c = 32;
  11808. }
  11809. c -= bits % 4;
  11810. if (c == 32) {
  11811. c = 28;
  11812. }
  11813. if (c < 0) {
  11814. /* Number of bits in top word is less than number needed. */
  11815. c = -c;
  11816. y = (byte)(n << c);
  11817. n = e[i--];
  11818. y |= (byte)(n >> (64 - c));
  11819. n <<= c;
  11820. c = 64 - c;
  11821. }
  11822. else if (c == 0) {
  11823. /* All bits in top word used. */
  11824. y = (byte)n;
  11825. }
  11826. else {
  11827. y = (byte)(n >> c);
  11828. n <<= 32 - c;
  11829. }
  11830. XMEMCPY(r, t[y], sizeof(sp_digit) * 32);
  11831. for (; i>=0 || c>=4; ) {
  11832. if (c == 0) {
  11833. n = e[i--];
  11834. y = (byte)(n >> 28);
  11835. n <<= 4;
  11836. c = 28;
  11837. }
  11838. else if (c < 4) {
  11839. y = (byte)(n >> 28);
  11840. n = e[i--];
  11841. c = 4 - c;
  11842. y |= (byte)(n >> (32 - c));
  11843. n <<= c;
  11844. c = 32 - c;
  11845. }
  11846. else {
  11847. y = (byte)((n >> 28) & 0xf);
  11848. n <<= 4;
  11849. c -= 4;
  11850. }
  11851. sp_2048_mont_sqr_32(r, r, m, mp);
  11852. sp_2048_mont_sqr_32(r, r, m, mp);
  11853. sp_2048_mont_sqr_32(r, r, m, mp);
  11854. sp_2048_mont_sqr_32(r, r, m, mp);
  11855. sp_2048_mont_mul_32(r, r, t[y], m, mp);
  11856. }
  11857. XMEMSET(&r[32], 0, sizeof(sp_digit) * 32U);
  11858. sp_2048_mont_reduce_32(r, m, mp);
  11859. mask = 0 - (sp_2048_cmp_32(r, m) >= 0);
  11860. sp_2048_cond_sub_32(r, r, m, mask);
  11861. }
  11862. #ifdef WOLFSSL_SP_SMALL_STACK
  11863. if (td != NULL)
  11864. XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  11865. #endif
  11866. return err;
  11867. }
  11868. #else
  11869. /* Modular exponentiate a to the e mod m. (r = a^e mod m)
  11870. *
  11871. * r A single precision number that is the result of the operation.
  11872. * a A single precision number being exponentiated.
  11873. * e A single precision number that is the exponent.
  11874. * bits The number of bits in the exponent.
  11875. * m A single precision number that is the modulus.
  11876. * returns 0 on success.
  11877. * returns MEMORY_E on dynamic memory allocation failure.
  11878. * returns MP_VAL when base is even or exponent is 0.
  11879. */
  11880. static int sp_2048_mod_exp_32(sp_digit* r, const sp_digit* a, const sp_digit* e,
  11881. int bits, const sp_digit* m, int reduceA)
  11882. {
  11883. #ifdef WOLFSSL_SP_SMALL_STACK
  11884. sp_digit* td = NULL;
  11885. #else
  11886. sp_digit td[32 * 64];
  11887. #endif
  11888. sp_digit* t[32];
  11889. sp_digit* norm = NULL;
  11890. sp_digit mp = 1;
  11891. sp_digit n;
  11892. sp_digit mask;
  11893. int i;
  11894. int c;
  11895. byte y;
  11896. int err = MP_OKAY;
  11897. if (bits == 0) {
  11898. err = MP_VAL;
  11899. }
  11900. #ifdef WOLFSSL_SP_SMALL_STACK
  11901. if (err == MP_OKAY) {
  11902. td = (sp_digit*)XMALLOC(sizeof(sp_digit) * (32 * 64), NULL,
  11903. DYNAMIC_TYPE_TMP_BUFFER);
  11904. if (td == NULL)
  11905. err = MEMORY_E;
  11906. }
  11907. #endif
  11908. if (err == MP_OKAY) {
  11909. norm = td;
  11910. for (i=0; i<32; i++) {
  11911. t[i] = td + i * 64;
  11912. }
  11913. sp_2048_mont_setup(m, &mp);
  11914. sp_2048_mont_norm_32(norm, m);
  11915. XMEMSET(t[1], 0, sizeof(sp_digit) * 32U);
  11916. if (reduceA != 0) {
  11917. err = sp_2048_mod_32(t[1] + 32, a, m);
  11918. if (err == MP_OKAY) {
  11919. err = sp_2048_mod_32(t[1], t[1], m);
  11920. }
  11921. }
  11922. else {
  11923. XMEMCPY(t[1] + 32, a, sizeof(sp_digit) * 32);
  11924. err = sp_2048_mod_32(t[1], t[1], m);
  11925. }
  11926. }
  11927. if (err == MP_OKAY) {
  11928. sp_2048_mont_sqr_32(t[ 2], t[ 1], m, mp);
  11929. sp_2048_mont_mul_32(t[ 3], t[ 2], t[ 1], m, mp);
  11930. sp_2048_mont_sqr_32(t[ 4], t[ 2], m, mp);
  11931. sp_2048_mont_mul_32(t[ 5], t[ 3], t[ 2], m, mp);
  11932. sp_2048_mont_sqr_32(t[ 6], t[ 3], m, mp);
  11933. sp_2048_mont_mul_32(t[ 7], t[ 4], t[ 3], m, mp);
  11934. sp_2048_mont_sqr_32(t[ 8], t[ 4], m, mp);
  11935. sp_2048_mont_mul_32(t[ 9], t[ 5], t[ 4], m, mp);
  11936. sp_2048_mont_sqr_32(t[10], t[ 5], m, mp);
  11937. sp_2048_mont_mul_32(t[11], t[ 6], t[ 5], m, mp);
  11938. sp_2048_mont_sqr_32(t[12], t[ 6], m, mp);
  11939. sp_2048_mont_mul_32(t[13], t[ 7], t[ 6], m, mp);
  11940. sp_2048_mont_sqr_32(t[14], t[ 7], m, mp);
  11941. sp_2048_mont_mul_32(t[15], t[ 8], t[ 7], m, mp);
  11942. sp_2048_mont_sqr_32(t[16], t[ 8], m, mp);
  11943. sp_2048_mont_mul_32(t[17], t[ 9], t[ 8], m, mp);
  11944. sp_2048_mont_sqr_32(t[18], t[ 9], m, mp);
  11945. sp_2048_mont_mul_32(t[19], t[10], t[ 9], m, mp);
  11946. sp_2048_mont_sqr_32(t[20], t[10], m, mp);
  11947. sp_2048_mont_mul_32(t[21], t[11], t[10], m, mp);
  11948. sp_2048_mont_sqr_32(t[22], t[11], m, mp);
  11949. sp_2048_mont_mul_32(t[23], t[12], t[11], m, mp);
  11950. sp_2048_mont_sqr_32(t[24], t[12], m, mp);
  11951. sp_2048_mont_mul_32(t[25], t[13], t[12], m, mp);
  11952. sp_2048_mont_sqr_32(t[26], t[13], m, mp);
  11953. sp_2048_mont_mul_32(t[27], t[14], t[13], m, mp);
  11954. sp_2048_mont_sqr_32(t[28], t[14], m, mp);
  11955. sp_2048_mont_mul_32(t[29], t[15], t[14], m, mp);
  11956. sp_2048_mont_sqr_32(t[30], t[15], m, mp);
  11957. sp_2048_mont_mul_32(t[31], t[16], t[15], m, mp);
  11958. i = (bits - 1) / 32;
  11959. n = e[i--];
  11960. c = bits & 31;
  11961. if (c == 0) {
  11962. c = 32;
  11963. }
  11964. c -= bits % 5;
  11965. if (c == 32) {
  11966. c = 27;
  11967. }
  11968. if (c < 0) {
  11969. /* Number of bits in top word is less than number needed. */
  11970. c = -c;
  11971. y = (byte)(n << c);
  11972. n = e[i--];
  11973. y |= (byte)(n >> (64 - c));
  11974. n <<= c;
  11975. c = 64 - c;
  11976. }
  11977. else if (c == 0) {
  11978. /* All bits in top word used. */
  11979. y = (byte)n;
  11980. }
  11981. else {
  11982. y = (byte)(n >> c);
  11983. n <<= 32 - c;
  11984. }
  11985. XMEMCPY(r, t[y], sizeof(sp_digit) * 32);
  11986. for (; i>=0 || c>=5; ) {
  11987. if (c == 0) {
  11988. n = e[i--];
  11989. y = (byte)(n >> 27);
  11990. n <<= 5;
  11991. c = 27;
  11992. }
  11993. else if (c < 5) {
  11994. y = (byte)(n >> 27);
  11995. n = e[i--];
  11996. c = 5 - c;
  11997. y |= (byte)(n >> (32 - c));
  11998. n <<= c;
  11999. c = 32 - c;
  12000. }
  12001. else {
  12002. y = (byte)((n >> 27) & 0x1f);
  12003. n <<= 5;
  12004. c -= 5;
  12005. }
  12006. sp_2048_mont_sqr_32(r, r, m, mp);
  12007. sp_2048_mont_sqr_32(r, r, m, mp);
  12008. sp_2048_mont_sqr_32(r, r, m, mp);
  12009. sp_2048_mont_sqr_32(r, r, m, mp);
  12010. sp_2048_mont_sqr_32(r, r, m, mp);
  12011. sp_2048_mont_mul_32(r, r, t[y], m, mp);
  12012. }
  12013. XMEMSET(&r[32], 0, sizeof(sp_digit) * 32U);
  12014. sp_2048_mont_reduce_32(r, m, mp);
  12015. mask = 0 - (sp_2048_cmp_32(r, m) >= 0);
  12016. sp_2048_cond_sub_32(r, r, m, mask);
  12017. }
  12018. #ifdef WOLFSSL_SP_SMALL_STACK
  12019. if (td != NULL)
  12020. XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  12021. #endif
  12022. return err;
  12023. }
  12024. #endif /* WOLFSSL_SP_SMALL */
  12025. #endif /* (WOLFSSL_HAVE_SP_RSA & !WOLFSSL_RSA_PUBLIC_ONLY) | WOLFSSL_HAVE_SP_DH */
  12026. #if (defined(WOLFSSL_HAVE_SP_RSA) && !defined(WOLFSSL_RSA_PUBLIC_ONLY)) || defined(WOLFSSL_HAVE_SP_DH)
  12027. /* r = 2^n mod m where n is the number of bits to reduce by.
  12028. * Given m must be 2048 bits, just need to subtract.
  12029. *
  12030. * r A single precision number.
  12031. * m A single precision number.
  12032. */
  12033. static void sp_2048_mont_norm_64(sp_digit* r, const sp_digit* m)
  12034. {
  12035. XMEMSET(r, 0, sizeof(sp_digit) * 64);
  12036. /* r = 2^n mod m */
  12037. sp_2048_sub_in_place_64(r, m);
  12038. }
  12039. #endif /* (WOLFSSL_HAVE_SP_RSA & !WOLFSSL_RSA_PUBLIC_ONLY) | WOLFSSL_HAVE_SP_DH */
  12040. #ifdef WOLFSSL_SP_SMALL
  12041. /* Conditionally subtract b from a using the mask m.
  12042. * m is -1 to subtract and 0 when not copying.
  12043. *
  12044. * r A single precision number representing condition subtract result.
  12045. * a A single precision number to subtract from.
  12046. * b A single precision number to subtract.
  12047. * m Mask value to apply.
  12048. */
  12049. 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)
  12050. {
  12051. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  12052. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  12053. register const sp_digit* b asm ("r2") = (const sp_digit*)b_p;
  12054. register sp_digit m asm ("r3") = (sp_digit)m_p;
  12055. __asm__ __volatile__ (
  12056. "mov r6, #0\n\t"
  12057. "mov r12, #0\n\t"
  12058. "mov lr, #0\n\t"
  12059. "\n"
  12060. "L_sp_2048_cond_sub_64_words_%=: \n\t"
  12061. "subs r12, r6, r12\n\t"
  12062. "ldr r4, [%[a], lr]\n\t"
  12063. "ldr r5, [%[b], lr]\n\t"
  12064. "and r5, r5, %[m]\n\t"
  12065. "sbcs r4, r4, r5\n\t"
  12066. "sbc r12, r6, r6\n\t"
  12067. "str r4, [%[r], lr]\n\t"
  12068. "add lr, lr, #4\n\t"
  12069. "cmp lr, #0x100\n\t"
  12070. "blt L_sp_2048_cond_sub_64_words_%=\n\t"
  12071. "mov %[r], r12\n\t"
  12072. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b), [m] "+r" (m)
  12073. :
  12074. : "memory", "r12", "lr", "r4", "r5", "r6", "cc"
  12075. );
  12076. return (uint32_t)(size_t)r;
  12077. }
  12078. #else
  12079. /* Conditionally subtract b from a using the mask m.
  12080. * m is -1 to subtract and 0 when not copying.
  12081. *
  12082. * r A single precision number representing condition subtract result.
  12083. * a A single precision number to subtract from.
  12084. * b A single precision number to subtract.
  12085. * m Mask value to apply.
  12086. */
  12087. 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)
  12088. {
  12089. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  12090. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  12091. register const sp_digit* b asm ("r2") = (const sp_digit*)b_p;
  12092. register sp_digit m asm ("r3") = (sp_digit)m_p;
  12093. __asm__ __volatile__ (
  12094. "mov lr, #0\n\t"
  12095. "ldm %[a]!, {r4, r5}\n\t"
  12096. "ldm %[b]!, {r6, r7}\n\t"
  12097. "and r6, r6, %[m]\n\t"
  12098. "and r7, r7, %[m]\n\t"
  12099. "subs r4, r4, r6\n\t"
  12100. "sbcs r5, r5, r7\n\t"
  12101. "stm %[r]!, {r4, r5}\n\t"
  12102. "ldm %[a]!, {r4, r5}\n\t"
  12103. "ldm %[b]!, {r6, r7}\n\t"
  12104. "and r6, r6, %[m]\n\t"
  12105. "and r7, r7, %[m]\n\t"
  12106. "sbcs r4, r4, r6\n\t"
  12107. "sbcs r5, r5, r7\n\t"
  12108. "stm %[r]!, {r4, r5}\n\t"
  12109. "ldm %[a]!, {r4, r5}\n\t"
  12110. "ldm %[b]!, {r6, r7}\n\t"
  12111. "and r6, r6, %[m]\n\t"
  12112. "and r7, r7, %[m]\n\t"
  12113. "sbcs r4, r4, r6\n\t"
  12114. "sbcs r5, r5, r7\n\t"
  12115. "stm %[r]!, {r4, r5}\n\t"
  12116. "ldm %[a]!, {r4, r5}\n\t"
  12117. "ldm %[b]!, {r6, r7}\n\t"
  12118. "and r6, r6, %[m]\n\t"
  12119. "and r7, r7, %[m]\n\t"
  12120. "sbcs r4, r4, r6\n\t"
  12121. "sbcs r5, r5, r7\n\t"
  12122. "stm %[r]!, {r4, r5}\n\t"
  12123. "ldm %[a]!, {r4, r5}\n\t"
  12124. "ldm %[b]!, {r6, r7}\n\t"
  12125. "and r6, r6, %[m]\n\t"
  12126. "and r7, r7, %[m]\n\t"
  12127. "sbcs r4, r4, r6\n\t"
  12128. "sbcs r5, r5, r7\n\t"
  12129. "stm %[r]!, {r4, r5}\n\t"
  12130. "ldm %[a]!, {r4, r5}\n\t"
  12131. "ldm %[b]!, {r6, r7}\n\t"
  12132. "and r6, r6, %[m]\n\t"
  12133. "and r7, r7, %[m]\n\t"
  12134. "sbcs r4, r4, r6\n\t"
  12135. "sbcs r5, r5, r7\n\t"
  12136. "stm %[r]!, {r4, r5}\n\t"
  12137. "ldm %[a]!, {r4, r5}\n\t"
  12138. "ldm %[b]!, {r6, r7}\n\t"
  12139. "and r6, r6, %[m]\n\t"
  12140. "and r7, r7, %[m]\n\t"
  12141. "sbcs r4, r4, r6\n\t"
  12142. "sbcs r5, r5, r7\n\t"
  12143. "stm %[r]!, {r4, r5}\n\t"
  12144. "ldm %[a]!, {r4, r5}\n\t"
  12145. "ldm %[b]!, {r6, r7}\n\t"
  12146. "and r6, r6, %[m]\n\t"
  12147. "and r7, r7, %[m]\n\t"
  12148. "sbcs r4, r4, r6\n\t"
  12149. "sbcs r5, r5, r7\n\t"
  12150. "stm %[r]!, {r4, r5}\n\t"
  12151. "ldm %[a]!, {r4, r5}\n\t"
  12152. "ldm %[b]!, {r6, r7}\n\t"
  12153. "and r6, r6, %[m]\n\t"
  12154. "and r7, r7, %[m]\n\t"
  12155. "sbcs r4, r4, r6\n\t"
  12156. "sbcs r5, r5, r7\n\t"
  12157. "stm %[r]!, {r4, r5}\n\t"
  12158. "ldm %[a]!, {r4, r5}\n\t"
  12159. "ldm %[b]!, {r6, r7}\n\t"
  12160. "and r6, r6, %[m]\n\t"
  12161. "and r7, r7, %[m]\n\t"
  12162. "sbcs r4, r4, r6\n\t"
  12163. "sbcs r5, r5, r7\n\t"
  12164. "stm %[r]!, {r4, r5}\n\t"
  12165. "ldm %[a]!, {r4, r5}\n\t"
  12166. "ldm %[b]!, {r6, r7}\n\t"
  12167. "and r6, r6, %[m]\n\t"
  12168. "and r7, r7, %[m]\n\t"
  12169. "sbcs r4, r4, r6\n\t"
  12170. "sbcs r5, r5, r7\n\t"
  12171. "stm %[r]!, {r4, r5}\n\t"
  12172. "ldm %[a]!, {r4, r5}\n\t"
  12173. "ldm %[b]!, {r6, r7}\n\t"
  12174. "and r6, r6, %[m]\n\t"
  12175. "and r7, r7, %[m]\n\t"
  12176. "sbcs r4, r4, r6\n\t"
  12177. "sbcs r5, r5, r7\n\t"
  12178. "stm %[r]!, {r4, r5}\n\t"
  12179. "ldm %[a]!, {r4, r5}\n\t"
  12180. "ldm %[b]!, {r6, r7}\n\t"
  12181. "and r6, r6, %[m]\n\t"
  12182. "and r7, r7, %[m]\n\t"
  12183. "sbcs r4, r4, r6\n\t"
  12184. "sbcs r5, r5, r7\n\t"
  12185. "stm %[r]!, {r4, r5}\n\t"
  12186. "ldm %[a]!, {r4, r5}\n\t"
  12187. "ldm %[b]!, {r6, r7}\n\t"
  12188. "and r6, r6, %[m]\n\t"
  12189. "and r7, r7, %[m]\n\t"
  12190. "sbcs r4, r4, r6\n\t"
  12191. "sbcs r5, r5, r7\n\t"
  12192. "stm %[r]!, {r4, r5}\n\t"
  12193. "ldm %[a]!, {r4, r5}\n\t"
  12194. "ldm %[b]!, {r6, r7}\n\t"
  12195. "and r6, r6, %[m]\n\t"
  12196. "and r7, r7, %[m]\n\t"
  12197. "sbcs r4, r4, r6\n\t"
  12198. "sbcs r5, r5, r7\n\t"
  12199. "stm %[r]!, {r4, r5}\n\t"
  12200. "ldm %[a]!, {r4, r5}\n\t"
  12201. "ldm %[b]!, {r6, r7}\n\t"
  12202. "and r6, r6, %[m]\n\t"
  12203. "and r7, r7, %[m]\n\t"
  12204. "sbcs r4, r4, r6\n\t"
  12205. "sbcs r5, r5, r7\n\t"
  12206. "stm %[r]!, {r4, r5}\n\t"
  12207. "ldm %[a]!, {r4, r5}\n\t"
  12208. "ldm %[b]!, {r6, r7}\n\t"
  12209. "and r6, r6, %[m]\n\t"
  12210. "and r7, r7, %[m]\n\t"
  12211. "sbcs r4, r4, r6\n\t"
  12212. "sbcs r5, r5, r7\n\t"
  12213. "stm %[r]!, {r4, r5}\n\t"
  12214. "ldm %[a]!, {r4, r5}\n\t"
  12215. "ldm %[b]!, {r6, r7}\n\t"
  12216. "and r6, r6, %[m]\n\t"
  12217. "and r7, r7, %[m]\n\t"
  12218. "sbcs r4, r4, r6\n\t"
  12219. "sbcs r5, r5, r7\n\t"
  12220. "stm %[r]!, {r4, r5}\n\t"
  12221. "ldm %[a]!, {r4, r5}\n\t"
  12222. "ldm %[b]!, {r6, r7}\n\t"
  12223. "and r6, r6, %[m]\n\t"
  12224. "and r7, r7, %[m]\n\t"
  12225. "sbcs r4, r4, r6\n\t"
  12226. "sbcs r5, r5, r7\n\t"
  12227. "stm %[r]!, {r4, r5}\n\t"
  12228. "ldm %[a]!, {r4, r5}\n\t"
  12229. "ldm %[b]!, {r6, r7}\n\t"
  12230. "and r6, r6, %[m]\n\t"
  12231. "and r7, r7, %[m]\n\t"
  12232. "sbcs r4, r4, r6\n\t"
  12233. "sbcs r5, r5, r7\n\t"
  12234. "stm %[r]!, {r4, r5}\n\t"
  12235. "ldm %[a]!, {r4, r5}\n\t"
  12236. "ldm %[b]!, {r6, r7}\n\t"
  12237. "and r6, r6, %[m]\n\t"
  12238. "and r7, r7, %[m]\n\t"
  12239. "sbcs r4, r4, r6\n\t"
  12240. "sbcs r5, r5, r7\n\t"
  12241. "stm %[r]!, {r4, r5}\n\t"
  12242. "ldm %[a]!, {r4, r5}\n\t"
  12243. "ldm %[b]!, {r6, r7}\n\t"
  12244. "and r6, r6, %[m]\n\t"
  12245. "and r7, r7, %[m]\n\t"
  12246. "sbcs r4, r4, r6\n\t"
  12247. "sbcs r5, r5, r7\n\t"
  12248. "stm %[r]!, {r4, r5}\n\t"
  12249. "ldm %[a]!, {r4, r5}\n\t"
  12250. "ldm %[b]!, {r6, r7}\n\t"
  12251. "and r6, r6, %[m]\n\t"
  12252. "and r7, r7, %[m]\n\t"
  12253. "sbcs r4, r4, r6\n\t"
  12254. "sbcs r5, r5, r7\n\t"
  12255. "stm %[r]!, {r4, r5}\n\t"
  12256. "ldm %[a]!, {r4, r5}\n\t"
  12257. "ldm %[b]!, {r6, r7}\n\t"
  12258. "and r6, r6, %[m]\n\t"
  12259. "and r7, r7, %[m]\n\t"
  12260. "sbcs r4, r4, r6\n\t"
  12261. "sbcs r5, r5, r7\n\t"
  12262. "stm %[r]!, {r4, r5}\n\t"
  12263. "ldm %[a]!, {r4, r5}\n\t"
  12264. "ldm %[b]!, {r6, r7}\n\t"
  12265. "and r6, r6, %[m]\n\t"
  12266. "and r7, r7, %[m]\n\t"
  12267. "sbcs r4, r4, r6\n\t"
  12268. "sbcs r5, r5, r7\n\t"
  12269. "stm %[r]!, {r4, r5}\n\t"
  12270. "ldm %[a]!, {r4, r5}\n\t"
  12271. "ldm %[b]!, {r6, r7}\n\t"
  12272. "and r6, r6, %[m]\n\t"
  12273. "and r7, r7, %[m]\n\t"
  12274. "sbcs r4, r4, r6\n\t"
  12275. "sbcs r5, r5, r7\n\t"
  12276. "stm %[r]!, {r4, r5}\n\t"
  12277. "ldm %[a]!, {r4, r5}\n\t"
  12278. "ldm %[b]!, {r6, r7}\n\t"
  12279. "and r6, r6, %[m]\n\t"
  12280. "and r7, r7, %[m]\n\t"
  12281. "sbcs r4, r4, r6\n\t"
  12282. "sbcs r5, r5, r7\n\t"
  12283. "stm %[r]!, {r4, r5}\n\t"
  12284. "ldm %[a]!, {r4, r5}\n\t"
  12285. "ldm %[b]!, {r6, r7}\n\t"
  12286. "and r6, r6, %[m]\n\t"
  12287. "and r7, r7, %[m]\n\t"
  12288. "sbcs r4, r4, r6\n\t"
  12289. "sbcs r5, r5, r7\n\t"
  12290. "stm %[r]!, {r4, r5}\n\t"
  12291. "ldm %[a]!, {r4, r5}\n\t"
  12292. "ldm %[b]!, {r6, r7}\n\t"
  12293. "and r6, r6, %[m]\n\t"
  12294. "and r7, r7, %[m]\n\t"
  12295. "sbcs r4, r4, r6\n\t"
  12296. "sbcs r5, r5, r7\n\t"
  12297. "stm %[r]!, {r4, r5}\n\t"
  12298. "ldm %[a]!, {r4, r5}\n\t"
  12299. "ldm %[b]!, {r6, r7}\n\t"
  12300. "and r6, r6, %[m]\n\t"
  12301. "and r7, r7, %[m]\n\t"
  12302. "sbcs r4, r4, r6\n\t"
  12303. "sbcs r5, r5, r7\n\t"
  12304. "stm %[r]!, {r4, r5}\n\t"
  12305. "ldm %[a]!, {r4, r5}\n\t"
  12306. "ldm %[b]!, {r6, r7}\n\t"
  12307. "and r6, r6, %[m]\n\t"
  12308. "and r7, r7, %[m]\n\t"
  12309. "sbcs r4, r4, r6\n\t"
  12310. "sbcs r5, r5, r7\n\t"
  12311. "stm %[r]!, {r4, r5}\n\t"
  12312. "ldm %[a]!, {r4, r5}\n\t"
  12313. "ldm %[b]!, {r6, r7}\n\t"
  12314. "and r6, r6, %[m]\n\t"
  12315. "and r7, r7, %[m]\n\t"
  12316. "sbcs r4, r4, r6\n\t"
  12317. "sbcs r5, r5, r7\n\t"
  12318. "stm %[r]!, {r4, r5}\n\t"
  12319. "sbc %[r], lr, lr\n\t"
  12320. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b), [m] "+r" (m)
  12321. :
  12322. : "memory", "r12", "lr", "r4", "r5", "r6", "r7", "cc"
  12323. );
  12324. return (uint32_t)(size_t)r;
  12325. }
  12326. #endif /* WOLFSSL_SP_SMALL */
  12327. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  12328. /* Reduce the number back to 2048 bits using Montgomery reduction.
  12329. *
  12330. * a A single precision number to reduce in place.
  12331. * m The single precision number representing the modulus.
  12332. * mp The digit representing the negative inverse of m mod 2^n.
  12333. */
  12334. static SP_NOINLINE void sp_2048_mont_reduce_64(sp_digit* a_p, const sp_digit* m_p, sp_digit mp_p)
  12335. {
  12336. register sp_digit* a asm ("r0") = (sp_digit*)a_p;
  12337. register const sp_digit* m asm ("r1") = (const sp_digit*)m_p;
  12338. register sp_digit mp asm ("r2") = (sp_digit)mp_p;
  12339. __asm__ __volatile__ (
  12340. #if !(defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4))
  12341. "ldr r11, [%[m]]\n\t"
  12342. #endif
  12343. /* i = 0 */
  12344. "mov r9, #0\n\t"
  12345. "mov r3, #0\n\t"
  12346. "ldr r12, [%[a]]\n\t"
  12347. "ldr lr, [%[a], #4]\n\t"
  12348. "\n"
  12349. "L_sp_2048_mont_reduce_64_word_%=: \n\t"
  12350. /* mu = a[i] * mp */
  12351. "mul r8, %[mp], r12\n\t"
  12352. /* a[i+0] += m[0] * mu */
  12353. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  12354. "ldr r11, [%[m]]\n\t"
  12355. #endif
  12356. "lsr r7, r11, #16\n\t"
  12357. "lsr r6, r8, #16\n\t"
  12358. "mul r5, r6, r7\n\t"
  12359. "lsl r7, r11, #16\n\t"
  12360. "lsr r7, r7, #16\n\t"
  12361. "mul r6, r7, r6\n\t"
  12362. "lsr r7, r6, #16\n\t"
  12363. "lsl r6, r6, #16\n\t"
  12364. "adds r12, r12, r6\n\t"
  12365. "adc r5, r5, r7\n\t"
  12366. "lsl r6, r8, #16\n\t"
  12367. "lsl r7, r11, #16\n\t"
  12368. "lsr r6, r6, #16\n\t"
  12369. "lsr r7, r7, #16\n\t"
  12370. "mul r7, r6, r7\n\t"
  12371. "adds r12, r12, r7\n\t"
  12372. "adc r5, r5, #0\n\t"
  12373. "lsr r7, r11, #16\n\t"
  12374. "mul r6, r7, r6\n\t"
  12375. "lsr r7, r6, #16\n\t"
  12376. "lsl r6, r6, #16\n\t"
  12377. "adds r12, r12, r6\n\t"
  12378. "adc r5, r5, r7\n\t"
  12379. /* a[i+1] += m[1] * mu */
  12380. "ldr r7, [%[m], #4]\n\t"
  12381. "lsr r10, r7, #16\n\t"
  12382. "lsr r6, r8, #16\n\t"
  12383. "mul r4, r6, r10\n\t"
  12384. "lsl r10, r7, #16\n\t"
  12385. "lsr r10, r10, #16\n\t"
  12386. "mul r6, r10, r6\n\t"
  12387. "lsr r10, r6, #16\n\t"
  12388. "lsl r6, r6, #16\n\t"
  12389. "adds lr, lr, r6\n\t"
  12390. "adc r4, r4, r10\n\t"
  12391. "lsl r6, r8, #16\n\t"
  12392. "lsl r10, r7, #16\n\t"
  12393. "lsr r6, r6, #16\n\t"
  12394. "lsr r10, r10, #16\n\t"
  12395. "mul r10, r6, r10\n\t"
  12396. "adds lr, lr, r10\n\t"
  12397. "adc r4, r4, #0\n\t"
  12398. "lsr r10, r7, #16\n\t"
  12399. "mul r6, r10, r6\n\t"
  12400. "lsr r10, r6, #16\n\t"
  12401. "lsl r6, r6, #16\n\t"
  12402. "adds lr, lr, r6\n\t"
  12403. "adc r4, r4, r10\n\t"
  12404. "mov r12, lr\n\t"
  12405. "adds r12, r12, r5\n\t"
  12406. "adc r4, r4, #0\n\t"
  12407. /* a[i+2] += m[2] * mu */
  12408. "ldr r7, [%[m], #8]\n\t"
  12409. "ldr lr, [%[a], #8]\n\t"
  12410. "lsr r10, r7, #16\n\t"
  12411. "lsr r6, r8, #16\n\t"
  12412. "mul r5, r6, r10\n\t"
  12413. "lsl r10, r7, #16\n\t"
  12414. "lsr r10, r10, #16\n\t"
  12415. "mul r6, r10, r6\n\t"
  12416. "lsr r10, r6, #16\n\t"
  12417. "lsl r6, r6, #16\n\t"
  12418. "adds lr, lr, r6\n\t"
  12419. "adc r5, r5, r10\n\t"
  12420. "lsl r6, r8, #16\n\t"
  12421. "lsl r10, r7, #16\n\t"
  12422. "lsr r6, r6, #16\n\t"
  12423. "lsr r10, r10, #16\n\t"
  12424. "mul r10, r6, r10\n\t"
  12425. "adds lr, lr, r10\n\t"
  12426. "adc r5, r5, #0\n\t"
  12427. "lsr r10, r7, #16\n\t"
  12428. "mul r6, r10, r6\n\t"
  12429. "lsr r10, r6, #16\n\t"
  12430. "lsl r6, r6, #16\n\t"
  12431. "adds lr, lr, r6\n\t"
  12432. "adc r5, r5, r10\n\t"
  12433. "adds lr, lr, r4\n\t"
  12434. "adc r5, r5, #0\n\t"
  12435. /* a[i+3] += m[3] * mu */
  12436. "ldr r7, [%[m], #12]\n\t"
  12437. "ldr r10, [%[a], #12]\n\t"
  12438. "lsr r11, r7, #16\n\t"
  12439. "lsr r6, r8, #16\n\t"
  12440. "mul r4, r6, r11\n\t"
  12441. "lsl r11, r7, #16\n\t"
  12442. "lsr r11, r11, #16\n\t"
  12443. "mul r6, r11, r6\n\t"
  12444. "lsr r11, r6, #16\n\t"
  12445. "lsl r6, r6, #16\n\t"
  12446. "adds r10, r10, r6\n\t"
  12447. "adc r4, r4, r11\n\t"
  12448. "lsl r6, r8, #16\n\t"
  12449. "lsl r11, r7, #16\n\t"
  12450. "lsr r6, r6, #16\n\t"
  12451. "lsr r11, r11, #16\n\t"
  12452. "mul r11, r6, r11\n\t"
  12453. "adds r10, r10, r11\n\t"
  12454. "adc r4, r4, #0\n\t"
  12455. "lsr r11, r7, #16\n\t"
  12456. "mul r6, r11, r6\n\t"
  12457. "lsr r11, r6, #16\n\t"
  12458. "lsl r6, r6, #16\n\t"
  12459. "adds r10, r10, r6\n\t"
  12460. "adc r4, r4, r11\n\t"
  12461. "adds r10, r10, r5\n\t"
  12462. "str r10, [%[a], #12]\n\t"
  12463. "adc r4, r4, #0\n\t"
  12464. /* a[i+4] += m[4] * mu */
  12465. "ldr r7, [%[m], #16]\n\t"
  12466. "ldr r10, [%[a], #16]\n\t"
  12467. "lsr r11, r7, #16\n\t"
  12468. "lsr r6, r8, #16\n\t"
  12469. "mul r5, r6, r11\n\t"
  12470. "lsl r11, r7, #16\n\t"
  12471. "lsr r11, r11, #16\n\t"
  12472. "mul r6, r11, r6\n\t"
  12473. "lsr r11, r6, #16\n\t"
  12474. "lsl r6, r6, #16\n\t"
  12475. "adds r10, r10, r6\n\t"
  12476. "adc r5, r5, r11\n\t"
  12477. "lsl r6, r8, #16\n\t"
  12478. "lsl r11, r7, #16\n\t"
  12479. "lsr r6, r6, #16\n\t"
  12480. "lsr r11, r11, #16\n\t"
  12481. "mul r11, r6, r11\n\t"
  12482. "adds r10, r10, r11\n\t"
  12483. "adc r5, r5, #0\n\t"
  12484. "lsr r11, r7, #16\n\t"
  12485. "mul r6, r11, r6\n\t"
  12486. "lsr r11, r6, #16\n\t"
  12487. "lsl r6, r6, #16\n\t"
  12488. "adds r10, r10, r6\n\t"
  12489. "adc r5, r5, r11\n\t"
  12490. "adds r10, r10, r4\n\t"
  12491. "str r10, [%[a], #16]\n\t"
  12492. "adc r5, r5, #0\n\t"
  12493. /* a[i+5] += m[5] * mu */
  12494. "ldr r7, [%[m], #20]\n\t"
  12495. "ldr r10, [%[a], #20]\n\t"
  12496. "lsr r11, r7, #16\n\t"
  12497. "lsr r6, r8, #16\n\t"
  12498. "mul r4, r6, r11\n\t"
  12499. "lsl r11, r7, #16\n\t"
  12500. "lsr r11, r11, #16\n\t"
  12501. "mul r6, r11, r6\n\t"
  12502. "lsr r11, r6, #16\n\t"
  12503. "lsl r6, r6, #16\n\t"
  12504. "adds r10, r10, r6\n\t"
  12505. "adc r4, r4, r11\n\t"
  12506. "lsl r6, r8, #16\n\t"
  12507. "lsl r11, r7, #16\n\t"
  12508. "lsr r6, r6, #16\n\t"
  12509. "lsr r11, r11, #16\n\t"
  12510. "mul r11, r6, r11\n\t"
  12511. "adds r10, r10, r11\n\t"
  12512. "adc r4, r4, #0\n\t"
  12513. "lsr r11, r7, #16\n\t"
  12514. "mul r6, r11, r6\n\t"
  12515. "lsr r11, r6, #16\n\t"
  12516. "lsl r6, r6, #16\n\t"
  12517. "adds r10, r10, r6\n\t"
  12518. "adc r4, r4, r11\n\t"
  12519. "adds r10, r10, r5\n\t"
  12520. "str r10, [%[a], #20]\n\t"
  12521. "adc r4, r4, #0\n\t"
  12522. /* a[i+6] += m[6] * mu */
  12523. "ldr r7, [%[m], #24]\n\t"
  12524. "ldr r10, [%[a], #24]\n\t"
  12525. "lsr r11, r7, #16\n\t"
  12526. "lsr r6, r8, #16\n\t"
  12527. "mul r5, r6, r11\n\t"
  12528. "lsl r11, r7, #16\n\t"
  12529. "lsr r11, r11, #16\n\t"
  12530. "mul r6, r11, r6\n\t"
  12531. "lsr r11, r6, #16\n\t"
  12532. "lsl r6, r6, #16\n\t"
  12533. "adds r10, r10, r6\n\t"
  12534. "adc r5, r5, r11\n\t"
  12535. "lsl r6, r8, #16\n\t"
  12536. "lsl r11, r7, #16\n\t"
  12537. "lsr r6, r6, #16\n\t"
  12538. "lsr r11, r11, #16\n\t"
  12539. "mul r11, r6, r11\n\t"
  12540. "adds r10, r10, r11\n\t"
  12541. "adc r5, r5, #0\n\t"
  12542. "lsr r11, r7, #16\n\t"
  12543. "mul r6, r11, r6\n\t"
  12544. "lsr r11, r6, #16\n\t"
  12545. "lsl r6, r6, #16\n\t"
  12546. "adds r10, r10, r6\n\t"
  12547. "adc r5, r5, r11\n\t"
  12548. "adds r10, r10, r4\n\t"
  12549. "str r10, [%[a], #24]\n\t"
  12550. "adc r5, r5, #0\n\t"
  12551. /* a[i+7] += m[7] * mu */
  12552. "ldr r7, [%[m], #28]\n\t"
  12553. "ldr r10, [%[a], #28]\n\t"
  12554. "lsr r11, r7, #16\n\t"
  12555. "lsr r6, r8, #16\n\t"
  12556. "mul r4, r6, r11\n\t"
  12557. "lsl r11, r7, #16\n\t"
  12558. "lsr r11, r11, #16\n\t"
  12559. "mul r6, r11, r6\n\t"
  12560. "lsr r11, r6, #16\n\t"
  12561. "lsl r6, r6, #16\n\t"
  12562. "adds r10, r10, r6\n\t"
  12563. "adc r4, r4, r11\n\t"
  12564. "lsl r6, r8, #16\n\t"
  12565. "lsl r11, r7, #16\n\t"
  12566. "lsr r6, r6, #16\n\t"
  12567. "lsr r11, r11, #16\n\t"
  12568. "mul r11, r6, r11\n\t"
  12569. "adds r10, r10, r11\n\t"
  12570. "adc r4, r4, #0\n\t"
  12571. "lsr r11, r7, #16\n\t"
  12572. "mul r6, r11, r6\n\t"
  12573. "lsr r11, r6, #16\n\t"
  12574. "lsl r6, r6, #16\n\t"
  12575. "adds r10, r10, r6\n\t"
  12576. "adc r4, r4, r11\n\t"
  12577. "adds r10, r10, r5\n\t"
  12578. "str r10, [%[a], #28]\n\t"
  12579. "adc r4, r4, #0\n\t"
  12580. /* a[i+8] += m[8] * mu */
  12581. "ldr r7, [%[m], #32]\n\t"
  12582. "ldr r10, [%[a], #32]\n\t"
  12583. "lsr r11, r7, #16\n\t"
  12584. "lsr r6, r8, #16\n\t"
  12585. "mul r5, r6, r11\n\t"
  12586. "lsl r11, r7, #16\n\t"
  12587. "lsr r11, r11, #16\n\t"
  12588. "mul r6, r11, r6\n\t"
  12589. "lsr r11, r6, #16\n\t"
  12590. "lsl r6, r6, #16\n\t"
  12591. "adds r10, r10, r6\n\t"
  12592. "adc r5, r5, r11\n\t"
  12593. "lsl r6, r8, #16\n\t"
  12594. "lsl r11, r7, #16\n\t"
  12595. "lsr r6, r6, #16\n\t"
  12596. "lsr r11, r11, #16\n\t"
  12597. "mul r11, r6, r11\n\t"
  12598. "adds r10, r10, r11\n\t"
  12599. "adc r5, r5, #0\n\t"
  12600. "lsr r11, r7, #16\n\t"
  12601. "mul r6, r11, r6\n\t"
  12602. "lsr r11, r6, #16\n\t"
  12603. "lsl r6, r6, #16\n\t"
  12604. "adds r10, r10, r6\n\t"
  12605. "adc r5, r5, r11\n\t"
  12606. "adds r10, r10, r4\n\t"
  12607. "str r10, [%[a], #32]\n\t"
  12608. "adc r5, r5, #0\n\t"
  12609. /* a[i+9] += m[9] * mu */
  12610. "ldr r7, [%[m], #36]\n\t"
  12611. "ldr r10, [%[a], #36]\n\t"
  12612. "lsr r11, r7, #16\n\t"
  12613. "lsr r6, r8, #16\n\t"
  12614. "mul r4, r6, r11\n\t"
  12615. "lsl r11, r7, #16\n\t"
  12616. "lsr r11, r11, #16\n\t"
  12617. "mul r6, r11, r6\n\t"
  12618. "lsr r11, r6, #16\n\t"
  12619. "lsl r6, r6, #16\n\t"
  12620. "adds r10, r10, r6\n\t"
  12621. "adc r4, r4, r11\n\t"
  12622. "lsl r6, r8, #16\n\t"
  12623. "lsl r11, r7, #16\n\t"
  12624. "lsr r6, r6, #16\n\t"
  12625. "lsr r11, r11, #16\n\t"
  12626. "mul r11, r6, r11\n\t"
  12627. "adds r10, r10, r11\n\t"
  12628. "adc r4, r4, #0\n\t"
  12629. "lsr r11, r7, #16\n\t"
  12630. "mul r6, r11, r6\n\t"
  12631. "lsr r11, r6, #16\n\t"
  12632. "lsl r6, r6, #16\n\t"
  12633. "adds r10, r10, r6\n\t"
  12634. "adc r4, r4, r11\n\t"
  12635. "adds r10, r10, r5\n\t"
  12636. "str r10, [%[a], #36]\n\t"
  12637. "adc r4, r4, #0\n\t"
  12638. /* a[i+10] += m[10] * mu */
  12639. "ldr r7, [%[m], #40]\n\t"
  12640. "ldr r10, [%[a], #40]\n\t"
  12641. "lsr r11, r7, #16\n\t"
  12642. "lsr r6, r8, #16\n\t"
  12643. "mul r5, r6, r11\n\t"
  12644. "lsl r11, r7, #16\n\t"
  12645. "lsr r11, r11, #16\n\t"
  12646. "mul r6, r11, r6\n\t"
  12647. "lsr r11, r6, #16\n\t"
  12648. "lsl r6, r6, #16\n\t"
  12649. "adds r10, r10, r6\n\t"
  12650. "adc r5, r5, r11\n\t"
  12651. "lsl r6, r8, #16\n\t"
  12652. "lsl r11, r7, #16\n\t"
  12653. "lsr r6, r6, #16\n\t"
  12654. "lsr r11, r11, #16\n\t"
  12655. "mul r11, r6, r11\n\t"
  12656. "adds r10, r10, r11\n\t"
  12657. "adc r5, r5, #0\n\t"
  12658. "lsr r11, r7, #16\n\t"
  12659. "mul r6, r11, r6\n\t"
  12660. "lsr r11, r6, #16\n\t"
  12661. "lsl r6, r6, #16\n\t"
  12662. "adds r10, r10, r6\n\t"
  12663. "adc r5, r5, r11\n\t"
  12664. "adds r10, r10, r4\n\t"
  12665. "str r10, [%[a], #40]\n\t"
  12666. "adc r5, r5, #0\n\t"
  12667. /* a[i+11] += m[11] * mu */
  12668. "ldr r7, [%[m], #44]\n\t"
  12669. "ldr r10, [%[a], #44]\n\t"
  12670. "lsr r11, r7, #16\n\t"
  12671. "lsr r6, r8, #16\n\t"
  12672. "mul r4, r6, r11\n\t"
  12673. "lsl r11, r7, #16\n\t"
  12674. "lsr r11, r11, #16\n\t"
  12675. "mul r6, r11, r6\n\t"
  12676. "lsr r11, r6, #16\n\t"
  12677. "lsl r6, r6, #16\n\t"
  12678. "adds r10, r10, r6\n\t"
  12679. "adc r4, r4, r11\n\t"
  12680. "lsl r6, r8, #16\n\t"
  12681. "lsl r11, r7, #16\n\t"
  12682. "lsr r6, r6, #16\n\t"
  12683. "lsr r11, r11, #16\n\t"
  12684. "mul r11, r6, r11\n\t"
  12685. "adds r10, r10, r11\n\t"
  12686. "adc r4, r4, #0\n\t"
  12687. "lsr r11, r7, #16\n\t"
  12688. "mul r6, r11, r6\n\t"
  12689. "lsr r11, r6, #16\n\t"
  12690. "lsl r6, r6, #16\n\t"
  12691. "adds r10, r10, r6\n\t"
  12692. "adc r4, r4, r11\n\t"
  12693. "adds r10, r10, r5\n\t"
  12694. "str r10, [%[a], #44]\n\t"
  12695. "adc r4, r4, #0\n\t"
  12696. /* a[i+12] += m[12] * mu */
  12697. "ldr r7, [%[m], #48]\n\t"
  12698. "ldr r10, [%[a], #48]\n\t"
  12699. "lsr r11, r7, #16\n\t"
  12700. "lsr r6, r8, #16\n\t"
  12701. "mul r5, r6, r11\n\t"
  12702. "lsl r11, r7, #16\n\t"
  12703. "lsr r11, r11, #16\n\t"
  12704. "mul r6, r11, r6\n\t"
  12705. "lsr r11, r6, #16\n\t"
  12706. "lsl r6, r6, #16\n\t"
  12707. "adds r10, r10, r6\n\t"
  12708. "adc r5, r5, r11\n\t"
  12709. "lsl r6, r8, #16\n\t"
  12710. "lsl r11, r7, #16\n\t"
  12711. "lsr r6, r6, #16\n\t"
  12712. "lsr r11, r11, #16\n\t"
  12713. "mul r11, r6, r11\n\t"
  12714. "adds r10, r10, r11\n\t"
  12715. "adc r5, r5, #0\n\t"
  12716. "lsr r11, r7, #16\n\t"
  12717. "mul r6, r11, r6\n\t"
  12718. "lsr r11, r6, #16\n\t"
  12719. "lsl r6, r6, #16\n\t"
  12720. "adds r10, r10, r6\n\t"
  12721. "adc r5, r5, r11\n\t"
  12722. "adds r10, r10, r4\n\t"
  12723. "str r10, [%[a], #48]\n\t"
  12724. "adc r5, r5, #0\n\t"
  12725. /* a[i+13] += m[13] * mu */
  12726. "ldr r7, [%[m], #52]\n\t"
  12727. "ldr r10, [%[a], #52]\n\t"
  12728. "lsr r11, r7, #16\n\t"
  12729. "lsr r6, r8, #16\n\t"
  12730. "mul r4, r6, r11\n\t"
  12731. "lsl r11, r7, #16\n\t"
  12732. "lsr r11, r11, #16\n\t"
  12733. "mul r6, r11, r6\n\t"
  12734. "lsr r11, r6, #16\n\t"
  12735. "lsl r6, r6, #16\n\t"
  12736. "adds r10, r10, r6\n\t"
  12737. "adc r4, r4, r11\n\t"
  12738. "lsl r6, r8, #16\n\t"
  12739. "lsl r11, r7, #16\n\t"
  12740. "lsr r6, r6, #16\n\t"
  12741. "lsr r11, r11, #16\n\t"
  12742. "mul r11, r6, r11\n\t"
  12743. "adds r10, r10, r11\n\t"
  12744. "adc r4, r4, #0\n\t"
  12745. "lsr r11, r7, #16\n\t"
  12746. "mul r6, r11, r6\n\t"
  12747. "lsr r11, r6, #16\n\t"
  12748. "lsl r6, r6, #16\n\t"
  12749. "adds r10, r10, r6\n\t"
  12750. "adc r4, r4, r11\n\t"
  12751. "adds r10, r10, r5\n\t"
  12752. "str r10, [%[a], #52]\n\t"
  12753. "adc r4, r4, #0\n\t"
  12754. /* a[i+14] += m[14] * mu */
  12755. "ldr r7, [%[m], #56]\n\t"
  12756. "ldr r10, [%[a], #56]\n\t"
  12757. "lsr r11, r7, #16\n\t"
  12758. "lsr r6, r8, #16\n\t"
  12759. "mul r5, r6, r11\n\t"
  12760. "lsl r11, r7, #16\n\t"
  12761. "lsr r11, r11, #16\n\t"
  12762. "mul r6, r11, r6\n\t"
  12763. "lsr r11, r6, #16\n\t"
  12764. "lsl r6, r6, #16\n\t"
  12765. "adds r10, r10, r6\n\t"
  12766. "adc r5, r5, r11\n\t"
  12767. "lsl r6, r8, #16\n\t"
  12768. "lsl r11, r7, #16\n\t"
  12769. "lsr r6, r6, #16\n\t"
  12770. "lsr r11, r11, #16\n\t"
  12771. "mul r11, r6, r11\n\t"
  12772. "adds r10, r10, r11\n\t"
  12773. "adc r5, r5, #0\n\t"
  12774. "lsr r11, r7, #16\n\t"
  12775. "mul r6, r11, r6\n\t"
  12776. "lsr r11, r6, #16\n\t"
  12777. "lsl r6, r6, #16\n\t"
  12778. "adds r10, r10, r6\n\t"
  12779. "adc r5, r5, r11\n\t"
  12780. "adds r10, r10, r4\n\t"
  12781. "str r10, [%[a], #56]\n\t"
  12782. "adc r5, r5, #0\n\t"
  12783. /* a[i+15] += m[15] * mu */
  12784. "ldr r7, [%[m], #60]\n\t"
  12785. "ldr r10, [%[a], #60]\n\t"
  12786. "lsr r11, r7, #16\n\t"
  12787. "lsr r6, r8, #16\n\t"
  12788. "mul r4, r6, r11\n\t"
  12789. "lsl r11, r7, #16\n\t"
  12790. "lsr r11, r11, #16\n\t"
  12791. "mul r6, r11, r6\n\t"
  12792. "lsr r11, r6, #16\n\t"
  12793. "lsl r6, r6, #16\n\t"
  12794. "adds r10, r10, r6\n\t"
  12795. "adc r4, r4, r11\n\t"
  12796. "lsl r6, r8, #16\n\t"
  12797. "lsl r11, r7, #16\n\t"
  12798. "lsr r6, r6, #16\n\t"
  12799. "lsr r11, r11, #16\n\t"
  12800. "mul r11, r6, r11\n\t"
  12801. "adds r10, r10, r11\n\t"
  12802. "adc r4, r4, #0\n\t"
  12803. "lsr r11, r7, #16\n\t"
  12804. "mul r6, r11, r6\n\t"
  12805. "lsr r11, r6, #16\n\t"
  12806. "lsl r6, r6, #16\n\t"
  12807. "adds r10, r10, r6\n\t"
  12808. "adc r4, r4, r11\n\t"
  12809. "adds r10, r10, r5\n\t"
  12810. "str r10, [%[a], #60]\n\t"
  12811. "adc r4, r4, #0\n\t"
  12812. /* a[i+16] += m[16] * mu */
  12813. "ldr r7, [%[m], #64]\n\t"
  12814. "ldr r10, [%[a], #64]\n\t"
  12815. "lsr r11, r7, #16\n\t"
  12816. "lsr r6, r8, #16\n\t"
  12817. "mul r5, r6, r11\n\t"
  12818. "lsl r11, r7, #16\n\t"
  12819. "lsr r11, r11, #16\n\t"
  12820. "mul r6, r11, r6\n\t"
  12821. "lsr r11, r6, #16\n\t"
  12822. "lsl r6, r6, #16\n\t"
  12823. "adds r10, r10, r6\n\t"
  12824. "adc r5, r5, r11\n\t"
  12825. "lsl r6, r8, #16\n\t"
  12826. "lsl r11, r7, #16\n\t"
  12827. "lsr r6, r6, #16\n\t"
  12828. "lsr r11, r11, #16\n\t"
  12829. "mul r11, r6, r11\n\t"
  12830. "adds r10, r10, r11\n\t"
  12831. "adc r5, r5, #0\n\t"
  12832. "lsr r11, r7, #16\n\t"
  12833. "mul r6, r11, r6\n\t"
  12834. "lsr r11, r6, #16\n\t"
  12835. "lsl r6, r6, #16\n\t"
  12836. "adds r10, r10, r6\n\t"
  12837. "adc r5, r5, r11\n\t"
  12838. "adds r10, r10, r4\n\t"
  12839. "str r10, [%[a], #64]\n\t"
  12840. "adc r5, r5, #0\n\t"
  12841. /* a[i+17] += m[17] * mu */
  12842. "ldr r7, [%[m], #68]\n\t"
  12843. "ldr r10, [%[a], #68]\n\t"
  12844. "lsr r11, r7, #16\n\t"
  12845. "lsr r6, r8, #16\n\t"
  12846. "mul r4, r6, r11\n\t"
  12847. "lsl r11, r7, #16\n\t"
  12848. "lsr r11, r11, #16\n\t"
  12849. "mul r6, r11, r6\n\t"
  12850. "lsr r11, r6, #16\n\t"
  12851. "lsl r6, r6, #16\n\t"
  12852. "adds r10, r10, r6\n\t"
  12853. "adc r4, r4, r11\n\t"
  12854. "lsl r6, r8, #16\n\t"
  12855. "lsl r11, r7, #16\n\t"
  12856. "lsr r6, r6, #16\n\t"
  12857. "lsr r11, r11, #16\n\t"
  12858. "mul r11, r6, r11\n\t"
  12859. "adds r10, r10, r11\n\t"
  12860. "adc r4, r4, #0\n\t"
  12861. "lsr r11, r7, #16\n\t"
  12862. "mul r6, r11, r6\n\t"
  12863. "lsr r11, r6, #16\n\t"
  12864. "lsl r6, r6, #16\n\t"
  12865. "adds r10, r10, r6\n\t"
  12866. "adc r4, r4, r11\n\t"
  12867. "adds r10, r10, r5\n\t"
  12868. "str r10, [%[a], #68]\n\t"
  12869. "adc r4, r4, #0\n\t"
  12870. /* a[i+18] += m[18] * mu */
  12871. "ldr r7, [%[m], #72]\n\t"
  12872. "ldr r10, [%[a], #72]\n\t"
  12873. "lsr r11, r7, #16\n\t"
  12874. "lsr r6, r8, #16\n\t"
  12875. "mul r5, r6, r11\n\t"
  12876. "lsl r11, r7, #16\n\t"
  12877. "lsr r11, r11, #16\n\t"
  12878. "mul r6, r11, r6\n\t"
  12879. "lsr r11, r6, #16\n\t"
  12880. "lsl r6, r6, #16\n\t"
  12881. "adds r10, r10, r6\n\t"
  12882. "adc r5, r5, r11\n\t"
  12883. "lsl r6, r8, #16\n\t"
  12884. "lsl r11, r7, #16\n\t"
  12885. "lsr r6, r6, #16\n\t"
  12886. "lsr r11, r11, #16\n\t"
  12887. "mul r11, r6, r11\n\t"
  12888. "adds r10, r10, r11\n\t"
  12889. "adc r5, r5, #0\n\t"
  12890. "lsr r11, r7, #16\n\t"
  12891. "mul r6, r11, r6\n\t"
  12892. "lsr r11, r6, #16\n\t"
  12893. "lsl r6, r6, #16\n\t"
  12894. "adds r10, r10, r6\n\t"
  12895. "adc r5, r5, r11\n\t"
  12896. "adds r10, r10, r4\n\t"
  12897. "str r10, [%[a], #72]\n\t"
  12898. "adc r5, r5, #0\n\t"
  12899. /* a[i+19] += m[19] * mu */
  12900. "ldr r7, [%[m], #76]\n\t"
  12901. "ldr r10, [%[a], #76]\n\t"
  12902. "lsr r11, r7, #16\n\t"
  12903. "lsr r6, r8, #16\n\t"
  12904. "mul r4, r6, r11\n\t"
  12905. "lsl r11, r7, #16\n\t"
  12906. "lsr r11, r11, #16\n\t"
  12907. "mul r6, r11, r6\n\t"
  12908. "lsr r11, r6, #16\n\t"
  12909. "lsl r6, r6, #16\n\t"
  12910. "adds r10, r10, r6\n\t"
  12911. "adc r4, r4, r11\n\t"
  12912. "lsl r6, r8, #16\n\t"
  12913. "lsl r11, r7, #16\n\t"
  12914. "lsr r6, r6, #16\n\t"
  12915. "lsr r11, r11, #16\n\t"
  12916. "mul r11, r6, r11\n\t"
  12917. "adds r10, r10, r11\n\t"
  12918. "adc r4, r4, #0\n\t"
  12919. "lsr r11, r7, #16\n\t"
  12920. "mul r6, r11, r6\n\t"
  12921. "lsr r11, r6, #16\n\t"
  12922. "lsl r6, r6, #16\n\t"
  12923. "adds r10, r10, r6\n\t"
  12924. "adc r4, r4, r11\n\t"
  12925. "adds r10, r10, r5\n\t"
  12926. "str r10, [%[a], #76]\n\t"
  12927. "adc r4, r4, #0\n\t"
  12928. /* a[i+20] += m[20] * mu */
  12929. "ldr r7, [%[m], #80]\n\t"
  12930. "ldr r10, [%[a], #80]\n\t"
  12931. "lsr r11, r7, #16\n\t"
  12932. "lsr r6, r8, #16\n\t"
  12933. "mul r5, r6, r11\n\t"
  12934. "lsl r11, r7, #16\n\t"
  12935. "lsr r11, r11, #16\n\t"
  12936. "mul r6, r11, r6\n\t"
  12937. "lsr r11, r6, #16\n\t"
  12938. "lsl r6, r6, #16\n\t"
  12939. "adds r10, r10, r6\n\t"
  12940. "adc r5, r5, r11\n\t"
  12941. "lsl r6, r8, #16\n\t"
  12942. "lsl r11, r7, #16\n\t"
  12943. "lsr r6, r6, #16\n\t"
  12944. "lsr r11, r11, #16\n\t"
  12945. "mul r11, r6, r11\n\t"
  12946. "adds r10, r10, r11\n\t"
  12947. "adc r5, r5, #0\n\t"
  12948. "lsr r11, r7, #16\n\t"
  12949. "mul r6, r11, r6\n\t"
  12950. "lsr r11, r6, #16\n\t"
  12951. "lsl r6, r6, #16\n\t"
  12952. "adds r10, r10, r6\n\t"
  12953. "adc r5, r5, r11\n\t"
  12954. "adds r10, r10, r4\n\t"
  12955. "str r10, [%[a], #80]\n\t"
  12956. "adc r5, r5, #0\n\t"
  12957. /* a[i+21] += m[21] * mu */
  12958. "ldr r7, [%[m], #84]\n\t"
  12959. "ldr r10, [%[a], #84]\n\t"
  12960. "lsr r11, r7, #16\n\t"
  12961. "lsr r6, r8, #16\n\t"
  12962. "mul r4, r6, r11\n\t"
  12963. "lsl r11, r7, #16\n\t"
  12964. "lsr r11, r11, #16\n\t"
  12965. "mul r6, r11, r6\n\t"
  12966. "lsr r11, r6, #16\n\t"
  12967. "lsl r6, r6, #16\n\t"
  12968. "adds r10, r10, r6\n\t"
  12969. "adc r4, r4, r11\n\t"
  12970. "lsl r6, r8, #16\n\t"
  12971. "lsl r11, r7, #16\n\t"
  12972. "lsr r6, r6, #16\n\t"
  12973. "lsr r11, r11, #16\n\t"
  12974. "mul r11, r6, r11\n\t"
  12975. "adds r10, r10, r11\n\t"
  12976. "adc r4, r4, #0\n\t"
  12977. "lsr r11, r7, #16\n\t"
  12978. "mul r6, r11, r6\n\t"
  12979. "lsr r11, r6, #16\n\t"
  12980. "lsl r6, r6, #16\n\t"
  12981. "adds r10, r10, r6\n\t"
  12982. "adc r4, r4, r11\n\t"
  12983. "adds r10, r10, r5\n\t"
  12984. "str r10, [%[a], #84]\n\t"
  12985. "adc r4, r4, #0\n\t"
  12986. /* a[i+22] += m[22] * mu */
  12987. "ldr r7, [%[m], #88]\n\t"
  12988. "ldr r10, [%[a], #88]\n\t"
  12989. "lsr r11, r7, #16\n\t"
  12990. "lsr r6, r8, #16\n\t"
  12991. "mul r5, r6, r11\n\t"
  12992. "lsl r11, r7, #16\n\t"
  12993. "lsr r11, r11, #16\n\t"
  12994. "mul r6, r11, r6\n\t"
  12995. "lsr r11, r6, #16\n\t"
  12996. "lsl r6, r6, #16\n\t"
  12997. "adds r10, r10, r6\n\t"
  12998. "adc r5, r5, r11\n\t"
  12999. "lsl r6, r8, #16\n\t"
  13000. "lsl r11, r7, #16\n\t"
  13001. "lsr r6, r6, #16\n\t"
  13002. "lsr r11, r11, #16\n\t"
  13003. "mul r11, r6, r11\n\t"
  13004. "adds r10, r10, r11\n\t"
  13005. "adc r5, r5, #0\n\t"
  13006. "lsr r11, r7, #16\n\t"
  13007. "mul r6, r11, r6\n\t"
  13008. "lsr r11, r6, #16\n\t"
  13009. "lsl r6, r6, #16\n\t"
  13010. "adds r10, r10, r6\n\t"
  13011. "adc r5, r5, r11\n\t"
  13012. "adds r10, r10, r4\n\t"
  13013. "str r10, [%[a], #88]\n\t"
  13014. "adc r5, r5, #0\n\t"
  13015. /* a[i+23] += m[23] * mu */
  13016. "ldr r7, [%[m], #92]\n\t"
  13017. "ldr r10, [%[a], #92]\n\t"
  13018. "lsr r11, r7, #16\n\t"
  13019. "lsr r6, r8, #16\n\t"
  13020. "mul r4, r6, r11\n\t"
  13021. "lsl r11, r7, #16\n\t"
  13022. "lsr r11, r11, #16\n\t"
  13023. "mul r6, r11, r6\n\t"
  13024. "lsr r11, r6, #16\n\t"
  13025. "lsl r6, r6, #16\n\t"
  13026. "adds r10, r10, r6\n\t"
  13027. "adc r4, r4, r11\n\t"
  13028. "lsl r6, r8, #16\n\t"
  13029. "lsl r11, r7, #16\n\t"
  13030. "lsr r6, r6, #16\n\t"
  13031. "lsr r11, r11, #16\n\t"
  13032. "mul r11, r6, r11\n\t"
  13033. "adds r10, r10, r11\n\t"
  13034. "adc r4, r4, #0\n\t"
  13035. "lsr r11, r7, #16\n\t"
  13036. "mul r6, r11, r6\n\t"
  13037. "lsr r11, r6, #16\n\t"
  13038. "lsl r6, r6, #16\n\t"
  13039. "adds r10, r10, r6\n\t"
  13040. "adc r4, r4, r11\n\t"
  13041. "adds r10, r10, r5\n\t"
  13042. "str r10, [%[a], #92]\n\t"
  13043. "adc r4, r4, #0\n\t"
  13044. /* a[i+24] += m[24] * mu */
  13045. "ldr r7, [%[m], #96]\n\t"
  13046. "ldr r10, [%[a], #96]\n\t"
  13047. "lsr r11, r7, #16\n\t"
  13048. "lsr r6, r8, #16\n\t"
  13049. "mul r5, r6, r11\n\t"
  13050. "lsl r11, r7, #16\n\t"
  13051. "lsr r11, r11, #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 r5, r5, r11\n\t"
  13057. "lsl r6, r8, #16\n\t"
  13058. "lsl r11, r7, #16\n\t"
  13059. "lsr r6, r6, #16\n\t"
  13060. "lsr r11, r11, #16\n\t"
  13061. "mul r11, r6, r11\n\t"
  13062. "adds r10, r10, r11\n\t"
  13063. "adc r5, r5, #0\n\t"
  13064. "lsr r11, r7, #16\n\t"
  13065. "mul r6, r11, r6\n\t"
  13066. "lsr r11, r6, #16\n\t"
  13067. "lsl r6, r6, #16\n\t"
  13068. "adds r10, r10, r6\n\t"
  13069. "adc r5, r5, r11\n\t"
  13070. "adds r10, r10, r4\n\t"
  13071. "str r10, [%[a], #96]\n\t"
  13072. "adc r5, r5, #0\n\t"
  13073. /* a[i+25] += m[25] * mu */
  13074. "ldr r7, [%[m], #100]\n\t"
  13075. "ldr r10, [%[a], #100]\n\t"
  13076. "lsr r11, r7, #16\n\t"
  13077. "lsr r6, r8, #16\n\t"
  13078. "mul r4, r6, r11\n\t"
  13079. "lsl r11, r7, #16\n\t"
  13080. "lsr r11, r11, #16\n\t"
  13081. "mul r6, r11, r6\n\t"
  13082. "lsr r11, r6, #16\n\t"
  13083. "lsl r6, r6, #16\n\t"
  13084. "adds r10, r10, r6\n\t"
  13085. "adc r4, r4, r11\n\t"
  13086. "lsl r6, r8, #16\n\t"
  13087. "lsl r11, r7, #16\n\t"
  13088. "lsr r6, r6, #16\n\t"
  13089. "lsr r11, r11, #16\n\t"
  13090. "mul r11, r6, r11\n\t"
  13091. "adds r10, r10, r11\n\t"
  13092. "adc r4, r4, #0\n\t"
  13093. "lsr r11, r7, #16\n\t"
  13094. "mul r6, r11, r6\n\t"
  13095. "lsr r11, r6, #16\n\t"
  13096. "lsl r6, r6, #16\n\t"
  13097. "adds r10, r10, r6\n\t"
  13098. "adc r4, r4, r11\n\t"
  13099. "adds r10, r10, r5\n\t"
  13100. "str r10, [%[a], #100]\n\t"
  13101. "adc r4, r4, #0\n\t"
  13102. /* a[i+26] += m[26] * mu */
  13103. "ldr r7, [%[m], #104]\n\t"
  13104. "ldr r10, [%[a], #104]\n\t"
  13105. "lsr r11, r7, #16\n\t"
  13106. "lsr r6, r8, #16\n\t"
  13107. "mul r5, r6, r11\n\t"
  13108. "lsl r11, r7, #16\n\t"
  13109. "lsr r11, r11, #16\n\t"
  13110. "mul r6, r11, r6\n\t"
  13111. "lsr r11, r6, #16\n\t"
  13112. "lsl r6, r6, #16\n\t"
  13113. "adds r10, r10, r6\n\t"
  13114. "adc r5, r5, r11\n\t"
  13115. "lsl r6, r8, #16\n\t"
  13116. "lsl r11, r7, #16\n\t"
  13117. "lsr r6, r6, #16\n\t"
  13118. "lsr r11, r11, #16\n\t"
  13119. "mul r11, r6, r11\n\t"
  13120. "adds r10, r10, r11\n\t"
  13121. "adc r5, r5, #0\n\t"
  13122. "lsr r11, r7, #16\n\t"
  13123. "mul r6, r11, r6\n\t"
  13124. "lsr r11, r6, #16\n\t"
  13125. "lsl r6, r6, #16\n\t"
  13126. "adds r10, r10, r6\n\t"
  13127. "adc r5, r5, r11\n\t"
  13128. "adds r10, r10, r4\n\t"
  13129. "str r10, [%[a], #104]\n\t"
  13130. "adc r5, r5, #0\n\t"
  13131. /* a[i+27] += m[27] * mu */
  13132. "ldr r7, [%[m], #108]\n\t"
  13133. "ldr r10, [%[a], #108]\n\t"
  13134. "lsr r11, r7, #16\n\t"
  13135. "lsr r6, r8, #16\n\t"
  13136. "mul r4, r6, r11\n\t"
  13137. "lsl r11, r7, #16\n\t"
  13138. "lsr r11, r11, #16\n\t"
  13139. "mul r6, r11, r6\n\t"
  13140. "lsr r11, r6, #16\n\t"
  13141. "lsl r6, r6, #16\n\t"
  13142. "adds r10, r10, r6\n\t"
  13143. "adc r4, r4, r11\n\t"
  13144. "lsl r6, r8, #16\n\t"
  13145. "lsl r11, r7, #16\n\t"
  13146. "lsr r6, r6, #16\n\t"
  13147. "lsr r11, r11, #16\n\t"
  13148. "mul r11, r6, r11\n\t"
  13149. "adds r10, r10, r11\n\t"
  13150. "adc r4, r4, #0\n\t"
  13151. "lsr r11, r7, #16\n\t"
  13152. "mul r6, r11, r6\n\t"
  13153. "lsr r11, r6, #16\n\t"
  13154. "lsl r6, r6, #16\n\t"
  13155. "adds r10, r10, r6\n\t"
  13156. "adc r4, r4, r11\n\t"
  13157. "adds r10, r10, r5\n\t"
  13158. "str r10, [%[a], #108]\n\t"
  13159. "adc r4, r4, #0\n\t"
  13160. /* a[i+28] += m[28] * mu */
  13161. "ldr r7, [%[m], #112]\n\t"
  13162. "ldr r10, [%[a], #112]\n\t"
  13163. "lsr r11, r7, #16\n\t"
  13164. "lsr r6, r8, #16\n\t"
  13165. "mul r5, r6, r11\n\t"
  13166. "lsl r11, r7, #16\n\t"
  13167. "lsr r11, r11, #16\n\t"
  13168. "mul r6, r11, r6\n\t"
  13169. "lsr r11, r6, #16\n\t"
  13170. "lsl r6, r6, #16\n\t"
  13171. "adds r10, r10, r6\n\t"
  13172. "adc r5, r5, r11\n\t"
  13173. "lsl r6, r8, #16\n\t"
  13174. "lsl r11, r7, #16\n\t"
  13175. "lsr r6, r6, #16\n\t"
  13176. "lsr r11, r11, #16\n\t"
  13177. "mul r11, r6, r11\n\t"
  13178. "adds r10, r10, r11\n\t"
  13179. "adc r5, r5, #0\n\t"
  13180. "lsr r11, r7, #16\n\t"
  13181. "mul r6, r11, r6\n\t"
  13182. "lsr r11, r6, #16\n\t"
  13183. "lsl r6, r6, #16\n\t"
  13184. "adds r10, r10, r6\n\t"
  13185. "adc r5, r5, r11\n\t"
  13186. "adds r10, r10, r4\n\t"
  13187. "str r10, [%[a], #112]\n\t"
  13188. "adc r5, r5, #0\n\t"
  13189. /* a[i+29] += m[29] * mu */
  13190. "ldr r7, [%[m], #116]\n\t"
  13191. "ldr r10, [%[a], #116]\n\t"
  13192. "lsr r11, r7, #16\n\t"
  13193. "lsr r6, r8, #16\n\t"
  13194. "mul r4, r6, r11\n\t"
  13195. "lsl r11, r7, #16\n\t"
  13196. "lsr r11, r11, #16\n\t"
  13197. "mul r6, r11, r6\n\t"
  13198. "lsr r11, r6, #16\n\t"
  13199. "lsl r6, r6, #16\n\t"
  13200. "adds r10, r10, r6\n\t"
  13201. "adc r4, r4, r11\n\t"
  13202. "lsl r6, r8, #16\n\t"
  13203. "lsl r11, r7, #16\n\t"
  13204. "lsr r6, r6, #16\n\t"
  13205. "lsr r11, r11, #16\n\t"
  13206. "mul r11, r6, r11\n\t"
  13207. "adds r10, r10, r11\n\t"
  13208. "adc r4, r4, #0\n\t"
  13209. "lsr r11, r7, #16\n\t"
  13210. "mul r6, r11, r6\n\t"
  13211. "lsr r11, r6, #16\n\t"
  13212. "lsl r6, r6, #16\n\t"
  13213. "adds r10, r10, r6\n\t"
  13214. "adc r4, r4, r11\n\t"
  13215. "adds r10, r10, r5\n\t"
  13216. "str r10, [%[a], #116]\n\t"
  13217. "adc r4, r4, #0\n\t"
  13218. /* a[i+30] += m[30] * mu */
  13219. "ldr r7, [%[m], #120]\n\t"
  13220. "ldr r10, [%[a], #120]\n\t"
  13221. "lsr r11, r7, #16\n\t"
  13222. "lsr r6, r8, #16\n\t"
  13223. "mul r5, r6, r11\n\t"
  13224. "lsl r11, r7, #16\n\t"
  13225. "lsr r11, r11, #16\n\t"
  13226. "mul r6, r11, r6\n\t"
  13227. "lsr r11, r6, #16\n\t"
  13228. "lsl r6, r6, #16\n\t"
  13229. "adds r10, r10, r6\n\t"
  13230. "adc r5, r5, r11\n\t"
  13231. "lsl r6, r8, #16\n\t"
  13232. "lsl r11, r7, #16\n\t"
  13233. "lsr r6, r6, #16\n\t"
  13234. "lsr r11, r11, #16\n\t"
  13235. "mul r11, r6, r11\n\t"
  13236. "adds r10, r10, r11\n\t"
  13237. "adc r5, r5, #0\n\t"
  13238. "lsr r11, r7, #16\n\t"
  13239. "mul r6, r11, r6\n\t"
  13240. "lsr r11, r6, #16\n\t"
  13241. "lsl r6, r6, #16\n\t"
  13242. "adds r10, r10, r6\n\t"
  13243. "adc r5, r5, r11\n\t"
  13244. "adds r10, r10, r4\n\t"
  13245. "str r10, [%[a], #120]\n\t"
  13246. "adc r5, r5, #0\n\t"
  13247. /* a[i+31] += m[31] * mu */
  13248. "ldr r7, [%[m], #124]\n\t"
  13249. "ldr r10, [%[a], #124]\n\t"
  13250. "lsr r11, r7, #16\n\t"
  13251. "lsr r6, r8, #16\n\t"
  13252. "mul r4, r6, r11\n\t"
  13253. "lsl r11, r7, #16\n\t"
  13254. "lsr r11, r11, #16\n\t"
  13255. "mul r6, r11, r6\n\t"
  13256. "lsr r11, r6, #16\n\t"
  13257. "lsl r6, r6, #16\n\t"
  13258. "adds r10, r10, r6\n\t"
  13259. "adc r4, r4, r11\n\t"
  13260. "lsl r6, r8, #16\n\t"
  13261. "lsl r11, r7, #16\n\t"
  13262. "lsr r6, r6, #16\n\t"
  13263. "lsr r11, r11, #16\n\t"
  13264. "mul r11, r6, r11\n\t"
  13265. "adds r10, r10, r11\n\t"
  13266. "adc r4, r4, #0\n\t"
  13267. "lsr r11, r7, #16\n\t"
  13268. "mul r6, r11, r6\n\t"
  13269. "lsr r11, r6, #16\n\t"
  13270. "lsl r6, r6, #16\n\t"
  13271. "adds r10, r10, r6\n\t"
  13272. "adc r4, r4, r11\n\t"
  13273. "adds r10, r10, r5\n\t"
  13274. "str r10, [%[a], #124]\n\t"
  13275. "adc r4, r4, #0\n\t"
  13276. /* a[i+32] += m[32] * mu */
  13277. "ldr r7, [%[m], #128]\n\t"
  13278. "ldr r10, [%[a], #128]\n\t"
  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. "adds r10, r10, r4\n\t"
  13303. "str r10, [%[a], #128]\n\t"
  13304. "adc r5, r5, #0\n\t"
  13305. /* a[i+33] += m[33] * mu */
  13306. "ldr r7, [%[m], #132]\n\t"
  13307. "ldr r10, [%[a], #132]\n\t"
  13308. "lsr r11, r7, #16\n\t"
  13309. "lsr r6, r8, #16\n\t"
  13310. "mul r4, r6, r11\n\t"
  13311. "lsl r11, r7, #16\n\t"
  13312. "lsr r11, r11, #16\n\t"
  13313. "mul r6, r11, r6\n\t"
  13314. "lsr r11, r6, #16\n\t"
  13315. "lsl r6, r6, #16\n\t"
  13316. "adds r10, r10, r6\n\t"
  13317. "adc r4, r4, r11\n\t"
  13318. "lsl r6, r8, #16\n\t"
  13319. "lsl r11, r7, #16\n\t"
  13320. "lsr r6, r6, #16\n\t"
  13321. "lsr r11, r11, #16\n\t"
  13322. "mul r11, r6, r11\n\t"
  13323. "adds r10, r10, r11\n\t"
  13324. "adc r4, r4, #0\n\t"
  13325. "lsr r11, r7, #16\n\t"
  13326. "mul r6, r11, r6\n\t"
  13327. "lsr r11, r6, #16\n\t"
  13328. "lsl r6, r6, #16\n\t"
  13329. "adds r10, r10, r6\n\t"
  13330. "adc r4, r4, r11\n\t"
  13331. "adds r10, r10, r5\n\t"
  13332. "str r10, [%[a], #132]\n\t"
  13333. "adc r4, r4, #0\n\t"
  13334. /* a[i+34] += m[34] * mu */
  13335. "ldr r7, [%[m], #136]\n\t"
  13336. "ldr r10, [%[a], #136]\n\t"
  13337. "lsr r11, r7, #16\n\t"
  13338. "lsr r6, r8, #16\n\t"
  13339. "mul r5, r6, r11\n\t"
  13340. "lsl r11, r7, #16\n\t"
  13341. "lsr r11, r11, #16\n\t"
  13342. "mul r6, r11, r6\n\t"
  13343. "lsr r11, r6, #16\n\t"
  13344. "lsl r6, r6, #16\n\t"
  13345. "adds r10, r10, r6\n\t"
  13346. "adc r5, r5, r11\n\t"
  13347. "lsl r6, r8, #16\n\t"
  13348. "lsl r11, r7, #16\n\t"
  13349. "lsr r6, r6, #16\n\t"
  13350. "lsr r11, r11, #16\n\t"
  13351. "mul r11, r6, r11\n\t"
  13352. "adds r10, r10, r11\n\t"
  13353. "adc r5, r5, #0\n\t"
  13354. "lsr r11, r7, #16\n\t"
  13355. "mul r6, r11, r6\n\t"
  13356. "lsr r11, r6, #16\n\t"
  13357. "lsl r6, r6, #16\n\t"
  13358. "adds r10, r10, r6\n\t"
  13359. "adc r5, r5, r11\n\t"
  13360. "adds r10, r10, r4\n\t"
  13361. "str r10, [%[a], #136]\n\t"
  13362. "adc r5, r5, #0\n\t"
  13363. /* a[i+35] += m[35] * mu */
  13364. "ldr r7, [%[m], #140]\n\t"
  13365. "ldr r10, [%[a], #140]\n\t"
  13366. "lsr r11, r7, #16\n\t"
  13367. "lsr r6, r8, #16\n\t"
  13368. "mul r4, r6, r11\n\t"
  13369. "lsl r11, r7, #16\n\t"
  13370. "lsr r11, r11, #16\n\t"
  13371. "mul r6, r11, r6\n\t"
  13372. "lsr r11, r6, #16\n\t"
  13373. "lsl r6, r6, #16\n\t"
  13374. "adds r10, r10, r6\n\t"
  13375. "adc r4, r4, r11\n\t"
  13376. "lsl r6, r8, #16\n\t"
  13377. "lsl r11, r7, #16\n\t"
  13378. "lsr r6, r6, #16\n\t"
  13379. "lsr r11, r11, #16\n\t"
  13380. "mul r11, r6, r11\n\t"
  13381. "adds r10, r10, r11\n\t"
  13382. "adc r4, r4, #0\n\t"
  13383. "lsr r11, r7, #16\n\t"
  13384. "mul r6, r11, r6\n\t"
  13385. "lsr r11, r6, #16\n\t"
  13386. "lsl r6, r6, #16\n\t"
  13387. "adds r10, r10, r6\n\t"
  13388. "adc r4, r4, r11\n\t"
  13389. "adds r10, r10, r5\n\t"
  13390. "str r10, [%[a], #140]\n\t"
  13391. "adc r4, r4, #0\n\t"
  13392. /* a[i+36] += m[36] * mu */
  13393. "ldr r7, [%[m], #144]\n\t"
  13394. "ldr r10, [%[a], #144]\n\t"
  13395. "lsr r11, r7, #16\n\t"
  13396. "lsr r6, r8, #16\n\t"
  13397. "mul r5, r6, r11\n\t"
  13398. "lsl r11, r7, #16\n\t"
  13399. "lsr r11, r11, #16\n\t"
  13400. "mul r6, r11, r6\n\t"
  13401. "lsr r11, r6, #16\n\t"
  13402. "lsl r6, r6, #16\n\t"
  13403. "adds r10, r10, r6\n\t"
  13404. "adc r5, r5, r11\n\t"
  13405. "lsl r6, r8, #16\n\t"
  13406. "lsl r11, r7, #16\n\t"
  13407. "lsr r6, r6, #16\n\t"
  13408. "lsr r11, r11, #16\n\t"
  13409. "mul r11, r6, r11\n\t"
  13410. "adds r10, r10, r11\n\t"
  13411. "adc r5, r5, #0\n\t"
  13412. "lsr r11, r7, #16\n\t"
  13413. "mul r6, r11, r6\n\t"
  13414. "lsr r11, r6, #16\n\t"
  13415. "lsl r6, r6, #16\n\t"
  13416. "adds r10, r10, r6\n\t"
  13417. "adc r5, r5, r11\n\t"
  13418. "adds r10, r10, r4\n\t"
  13419. "str r10, [%[a], #144]\n\t"
  13420. "adc r5, r5, #0\n\t"
  13421. /* a[i+37] += m[37] * mu */
  13422. "ldr r7, [%[m], #148]\n\t"
  13423. "ldr r10, [%[a], #148]\n\t"
  13424. "lsr r11, r7, #16\n\t"
  13425. "lsr r6, r8, #16\n\t"
  13426. "mul r4, r6, r11\n\t"
  13427. "lsl r11, r7, #16\n\t"
  13428. "lsr r11, r11, #16\n\t"
  13429. "mul r6, r11, r6\n\t"
  13430. "lsr r11, r6, #16\n\t"
  13431. "lsl r6, r6, #16\n\t"
  13432. "adds r10, r10, r6\n\t"
  13433. "adc r4, r4, r11\n\t"
  13434. "lsl r6, r8, #16\n\t"
  13435. "lsl r11, r7, #16\n\t"
  13436. "lsr r6, r6, #16\n\t"
  13437. "lsr r11, r11, #16\n\t"
  13438. "mul r11, r6, r11\n\t"
  13439. "adds r10, r10, r11\n\t"
  13440. "adc r4, r4, #0\n\t"
  13441. "lsr r11, r7, #16\n\t"
  13442. "mul r6, r11, r6\n\t"
  13443. "lsr r11, r6, #16\n\t"
  13444. "lsl r6, r6, #16\n\t"
  13445. "adds r10, r10, r6\n\t"
  13446. "adc r4, r4, r11\n\t"
  13447. "adds r10, r10, r5\n\t"
  13448. "str r10, [%[a], #148]\n\t"
  13449. "adc r4, r4, #0\n\t"
  13450. /* a[i+38] += m[38] * mu */
  13451. "ldr r7, [%[m], #152]\n\t"
  13452. "ldr r10, [%[a], #152]\n\t"
  13453. "lsr r11, r7, #16\n\t"
  13454. "lsr r6, r8, #16\n\t"
  13455. "mul r5, r6, r11\n\t"
  13456. "lsl r11, r7, #16\n\t"
  13457. "lsr r11, r11, #16\n\t"
  13458. "mul r6, r11, r6\n\t"
  13459. "lsr r11, r6, #16\n\t"
  13460. "lsl r6, r6, #16\n\t"
  13461. "adds r10, r10, r6\n\t"
  13462. "adc r5, r5, r11\n\t"
  13463. "lsl r6, r8, #16\n\t"
  13464. "lsl r11, r7, #16\n\t"
  13465. "lsr r6, r6, #16\n\t"
  13466. "lsr r11, r11, #16\n\t"
  13467. "mul r11, r6, r11\n\t"
  13468. "adds r10, r10, r11\n\t"
  13469. "adc r5, r5, #0\n\t"
  13470. "lsr r11, r7, #16\n\t"
  13471. "mul r6, r11, r6\n\t"
  13472. "lsr r11, r6, #16\n\t"
  13473. "lsl r6, r6, #16\n\t"
  13474. "adds r10, r10, r6\n\t"
  13475. "adc r5, r5, r11\n\t"
  13476. "adds r10, r10, r4\n\t"
  13477. "str r10, [%[a], #152]\n\t"
  13478. "adc r5, r5, #0\n\t"
  13479. /* a[i+39] += m[39] * mu */
  13480. "ldr r7, [%[m], #156]\n\t"
  13481. "ldr r10, [%[a], #156]\n\t"
  13482. "lsr r11, r7, #16\n\t"
  13483. "lsr r6, r8, #16\n\t"
  13484. "mul r4, r6, r11\n\t"
  13485. "lsl r11, r7, #16\n\t"
  13486. "lsr r11, r11, #16\n\t"
  13487. "mul r6, r11, r6\n\t"
  13488. "lsr r11, r6, #16\n\t"
  13489. "lsl r6, r6, #16\n\t"
  13490. "adds r10, r10, r6\n\t"
  13491. "adc r4, r4, r11\n\t"
  13492. "lsl r6, r8, #16\n\t"
  13493. "lsl r11, r7, #16\n\t"
  13494. "lsr r6, r6, #16\n\t"
  13495. "lsr r11, r11, #16\n\t"
  13496. "mul r11, r6, r11\n\t"
  13497. "adds r10, r10, r11\n\t"
  13498. "adc r4, r4, #0\n\t"
  13499. "lsr r11, r7, #16\n\t"
  13500. "mul r6, r11, r6\n\t"
  13501. "lsr r11, r6, #16\n\t"
  13502. "lsl r6, r6, #16\n\t"
  13503. "adds r10, r10, r6\n\t"
  13504. "adc r4, r4, r11\n\t"
  13505. "adds r10, r10, r5\n\t"
  13506. "str r10, [%[a], #156]\n\t"
  13507. "adc r4, r4, #0\n\t"
  13508. /* a[i+40] += m[40] * mu */
  13509. "ldr r7, [%[m], #160]\n\t"
  13510. "ldr r10, [%[a], #160]\n\t"
  13511. "lsr r11, r7, #16\n\t"
  13512. "lsr r6, r8, #16\n\t"
  13513. "mul r5, r6, r11\n\t"
  13514. "lsl r11, r7, #16\n\t"
  13515. "lsr r11, r11, #16\n\t"
  13516. "mul r6, r11, r6\n\t"
  13517. "lsr r11, r6, #16\n\t"
  13518. "lsl r6, r6, #16\n\t"
  13519. "adds r10, r10, r6\n\t"
  13520. "adc r5, r5, r11\n\t"
  13521. "lsl r6, r8, #16\n\t"
  13522. "lsl r11, r7, #16\n\t"
  13523. "lsr r6, r6, #16\n\t"
  13524. "lsr r11, r11, #16\n\t"
  13525. "mul r11, r6, r11\n\t"
  13526. "adds r10, r10, r11\n\t"
  13527. "adc r5, r5, #0\n\t"
  13528. "lsr r11, r7, #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 r5, r5, r11\n\t"
  13534. "adds r10, r10, r4\n\t"
  13535. "str r10, [%[a], #160]\n\t"
  13536. "adc r5, r5, #0\n\t"
  13537. /* a[i+41] += m[41] * mu */
  13538. "ldr r7, [%[m], #164]\n\t"
  13539. "ldr r10, [%[a], #164]\n\t"
  13540. "lsr r11, r7, #16\n\t"
  13541. "lsr r6, r8, #16\n\t"
  13542. "mul r4, r6, r11\n\t"
  13543. "lsl r11, r7, #16\n\t"
  13544. "lsr r11, r11, #16\n\t"
  13545. "mul r6, r11, r6\n\t"
  13546. "lsr r11, r6, #16\n\t"
  13547. "lsl r6, r6, #16\n\t"
  13548. "adds r10, r10, r6\n\t"
  13549. "adc r4, r4, r11\n\t"
  13550. "lsl r6, r8, #16\n\t"
  13551. "lsl r11, r7, #16\n\t"
  13552. "lsr r6, r6, #16\n\t"
  13553. "lsr r11, r11, #16\n\t"
  13554. "mul r11, r6, r11\n\t"
  13555. "adds r10, r10, r11\n\t"
  13556. "adc r4, r4, #0\n\t"
  13557. "lsr r11, r7, #16\n\t"
  13558. "mul r6, r11, r6\n\t"
  13559. "lsr r11, r6, #16\n\t"
  13560. "lsl r6, r6, #16\n\t"
  13561. "adds r10, r10, r6\n\t"
  13562. "adc r4, r4, r11\n\t"
  13563. "adds r10, r10, r5\n\t"
  13564. "str r10, [%[a], #164]\n\t"
  13565. "adc r4, r4, #0\n\t"
  13566. /* a[i+42] += m[42] * mu */
  13567. "ldr r7, [%[m], #168]\n\t"
  13568. "ldr r10, [%[a], #168]\n\t"
  13569. "lsr r11, r7, #16\n\t"
  13570. "lsr r6, r8, #16\n\t"
  13571. "mul r5, r6, r11\n\t"
  13572. "lsl r11, r7, #16\n\t"
  13573. "lsr r11, r11, #16\n\t"
  13574. "mul r6, r11, r6\n\t"
  13575. "lsr r11, r6, #16\n\t"
  13576. "lsl r6, r6, #16\n\t"
  13577. "adds r10, r10, r6\n\t"
  13578. "adc r5, r5, r11\n\t"
  13579. "lsl r6, r8, #16\n\t"
  13580. "lsl r11, r7, #16\n\t"
  13581. "lsr r6, r6, #16\n\t"
  13582. "lsr r11, r11, #16\n\t"
  13583. "mul r11, r6, r11\n\t"
  13584. "adds r10, r10, r11\n\t"
  13585. "adc r5, r5, #0\n\t"
  13586. "lsr r11, r7, #16\n\t"
  13587. "mul r6, r11, r6\n\t"
  13588. "lsr r11, r6, #16\n\t"
  13589. "lsl r6, r6, #16\n\t"
  13590. "adds r10, r10, r6\n\t"
  13591. "adc r5, r5, r11\n\t"
  13592. "adds r10, r10, r4\n\t"
  13593. "str r10, [%[a], #168]\n\t"
  13594. "adc r5, r5, #0\n\t"
  13595. /* a[i+43] += m[43] * mu */
  13596. "ldr r7, [%[m], #172]\n\t"
  13597. "ldr r10, [%[a], #172]\n\t"
  13598. "lsr r11, r7, #16\n\t"
  13599. "lsr r6, r8, #16\n\t"
  13600. "mul r4, r6, r11\n\t"
  13601. "lsl r11, r7, #16\n\t"
  13602. "lsr r11, r11, #16\n\t"
  13603. "mul r6, r11, r6\n\t"
  13604. "lsr r11, r6, #16\n\t"
  13605. "lsl r6, r6, #16\n\t"
  13606. "adds r10, r10, r6\n\t"
  13607. "adc r4, r4, r11\n\t"
  13608. "lsl r6, r8, #16\n\t"
  13609. "lsl r11, r7, #16\n\t"
  13610. "lsr r6, r6, #16\n\t"
  13611. "lsr r11, r11, #16\n\t"
  13612. "mul r11, r6, r11\n\t"
  13613. "adds r10, r10, r11\n\t"
  13614. "adc r4, r4, #0\n\t"
  13615. "lsr r11, r7, #16\n\t"
  13616. "mul r6, r11, r6\n\t"
  13617. "lsr r11, r6, #16\n\t"
  13618. "lsl r6, r6, #16\n\t"
  13619. "adds r10, r10, r6\n\t"
  13620. "adc r4, r4, r11\n\t"
  13621. "adds r10, r10, r5\n\t"
  13622. "str r10, [%[a], #172]\n\t"
  13623. "adc r4, r4, #0\n\t"
  13624. /* a[i+44] += m[44] * mu */
  13625. "ldr r7, [%[m], #176]\n\t"
  13626. "ldr r10, [%[a], #176]\n\t"
  13627. "lsr r11, r7, #16\n\t"
  13628. "lsr r6, r8, #16\n\t"
  13629. "mul r5, r6, r11\n\t"
  13630. "lsl r11, r7, #16\n\t"
  13631. "lsr r11, r11, #16\n\t"
  13632. "mul r6, r11, r6\n\t"
  13633. "lsr r11, r6, #16\n\t"
  13634. "lsl r6, r6, #16\n\t"
  13635. "adds r10, r10, r6\n\t"
  13636. "adc r5, r5, r11\n\t"
  13637. "lsl r6, r8, #16\n\t"
  13638. "lsl r11, r7, #16\n\t"
  13639. "lsr r6, r6, #16\n\t"
  13640. "lsr r11, r11, #16\n\t"
  13641. "mul r11, r6, r11\n\t"
  13642. "adds r10, r10, r11\n\t"
  13643. "adc r5, r5, #0\n\t"
  13644. "lsr r11, r7, #16\n\t"
  13645. "mul r6, r11, r6\n\t"
  13646. "lsr r11, r6, #16\n\t"
  13647. "lsl r6, r6, #16\n\t"
  13648. "adds r10, r10, r6\n\t"
  13649. "adc r5, r5, r11\n\t"
  13650. "adds r10, r10, r4\n\t"
  13651. "str r10, [%[a], #176]\n\t"
  13652. "adc r5, r5, #0\n\t"
  13653. /* a[i+45] += m[45] * mu */
  13654. "ldr r7, [%[m], #180]\n\t"
  13655. "ldr r10, [%[a], #180]\n\t"
  13656. "lsr r11, r7, #16\n\t"
  13657. "lsr r6, r8, #16\n\t"
  13658. "mul r4, r6, r11\n\t"
  13659. "lsl r11, r7, #16\n\t"
  13660. "lsr r11, r11, #16\n\t"
  13661. "mul r6, r11, r6\n\t"
  13662. "lsr r11, r6, #16\n\t"
  13663. "lsl r6, r6, #16\n\t"
  13664. "adds r10, r10, r6\n\t"
  13665. "adc r4, r4, r11\n\t"
  13666. "lsl r6, r8, #16\n\t"
  13667. "lsl r11, r7, #16\n\t"
  13668. "lsr r6, r6, #16\n\t"
  13669. "lsr r11, r11, #16\n\t"
  13670. "mul r11, r6, r11\n\t"
  13671. "adds r10, r10, r11\n\t"
  13672. "adc r4, r4, #0\n\t"
  13673. "lsr r11, r7, #16\n\t"
  13674. "mul r6, r11, r6\n\t"
  13675. "lsr r11, r6, #16\n\t"
  13676. "lsl r6, r6, #16\n\t"
  13677. "adds r10, r10, r6\n\t"
  13678. "adc r4, r4, r11\n\t"
  13679. "adds r10, r10, r5\n\t"
  13680. "str r10, [%[a], #180]\n\t"
  13681. "adc r4, r4, #0\n\t"
  13682. /* a[i+46] += m[46] * mu */
  13683. "ldr r7, [%[m], #184]\n\t"
  13684. "ldr r10, [%[a], #184]\n\t"
  13685. "lsr r11, r7, #16\n\t"
  13686. "lsr r6, r8, #16\n\t"
  13687. "mul r5, r6, r11\n\t"
  13688. "lsl r11, r7, #16\n\t"
  13689. "lsr r11, r11, #16\n\t"
  13690. "mul r6, r11, r6\n\t"
  13691. "lsr r11, r6, #16\n\t"
  13692. "lsl r6, r6, #16\n\t"
  13693. "adds r10, r10, r6\n\t"
  13694. "adc r5, r5, r11\n\t"
  13695. "lsl r6, r8, #16\n\t"
  13696. "lsl r11, r7, #16\n\t"
  13697. "lsr r6, r6, #16\n\t"
  13698. "lsr r11, r11, #16\n\t"
  13699. "mul r11, r6, r11\n\t"
  13700. "adds r10, r10, r11\n\t"
  13701. "adc r5, r5, #0\n\t"
  13702. "lsr r11, r7, #16\n\t"
  13703. "mul r6, r11, r6\n\t"
  13704. "lsr r11, r6, #16\n\t"
  13705. "lsl r6, r6, #16\n\t"
  13706. "adds r10, r10, r6\n\t"
  13707. "adc r5, r5, r11\n\t"
  13708. "adds r10, r10, r4\n\t"
  13709. "str r10, [%[a], #184]\n\t"
  13710. "adc r5, r5, #0\n\t"
  13711. /* a[i+47] += m[47] * mu */
  13712. "ldr r7, [%[m], #188]\n\t"
  13713. "ldr r10, [%[a], #188]\n\t"
  13714. "lsr r11, r7, #16\n\t"
  13715. "lsr r6, r8, #16\n\t"
  13716. "mul r4, r6, r11\n\t"
  13717. "lsl r11, r7, #16\n\t"
  13718. "lsr r11, r11, #16\n\t"
  13719. "mul r6, r11, r6\n\t"
  13720. "lsr r11, r6, #16\n\t"
  13721. "lsl r6, r6, #16\n\t"
  13722. "adds r10, r10, r6\n\t"
  13723. "adc r4, r4, r11\n\t"
  13724. "lsl r6, r8, #16\n\t"
  13725. "lsl r11, r7, #16\n\t"
  13726. "lsr r6, r6, #16\n\t"
  13727. "lsr r11, r11, #16\n\t"
  13728. "mul r11, r6, r11\n\t"
  13729. "adds r10, r10, r11\n\t"
  13730. "adc r4, r4, #0\n\t"
  13731. "lsr r11, r7, #16\n\t"
  13732. "mul r6, r11, r6\n\t"
  13733. "lsr r11, r6, #16\n\t"
  13734. "lsl r6, r6, #16\n\t"
  13735. "adds r10, r10, r6\n\t"
  13736. "adc r4, r4, r11\n\t"
  13737. "adds r10, r10, r5\n\t"
  13738. "str r10, [%[a], #188]\n\t"
  13739. "adc r4, r4, #0\n\t"
  13740. /* a[i+48] += m[48] * mu */
  13741. "ldr r7, [%[m], #192]\n\t"
  13742. "ldr r10, [%[a], #192]\n\t"
  13743. "lsr r11, r7, #16\n\t"
  13744. "lsr r6, r8, #16\n\t"
  13745. "mul r5, r6, r11\n\t"
  13746. "lsl r11, r7, #16\n\t"
  13747. "lsr r11, r11, #16\n\t"
  13748. "mul r6, r11, r6\n\t"
  13749. "lsr r11, r6, #16\n\t"
  13750. "lsl r6, r6, #16\n\t"
  13751. "adds r10, r10, r6\n\t"
  13752. "adc r5, r5, r11\n\t"
  13753. "lsl r6, r8, #16\n\t"
  13754. "lsl r11, r7, #16\n\t"
  13755. "lsr r6, r6, #16\n\t"
  13756. "lsr r11, r11, #16\n\t"
  13757. "mul r11, r6, r11\n\t"
  13758. "adds r10, r10, r11\n\t"
  13759. "adc r5, r5, #0\n\t"
  13760. "lsr r11, r7, #16\n\t"
  13761. "mul r6, r11, r6\n\t"
  13762. "lsr r11, r6, #16\n\t"
  13763. "lsl r6, r6, #16\n\t"
  13764. "adds r10, r10, r6\n\t"
  13765. "adc r5, r5, r11\n\t"
  13766. "adds r10, r10, r4\n\t"
  13767. "str r10, [%[a], #192]\n\t"
  13768. "adc r5, r5, #0\n\t"
  13769. /* a[i+49] += m[49] * mu */
  13770. "ldr r7, [%[m], #196]\n\t"
  13771. "ldr r10, [%[a], #196]\n\t"
  13772. "lsr r11, r7, #16\n\t"
  13773. "lsr r6, r8, #16\n\t"
  13774. "mul r4, r6, r11\n\t"
  13775. "lsl r11, r7, #16\n\t"
  13776. "lsr r11, r11, #16\n\t"
  13777. "mul r6, r11, r6\n\t"
  13778. "lsr r11, r6, #16\n\t"
  13779. "lsl r6, r6, #16\n\t"
  13780. "adds r10, r10, r6\n\t"
  13781. "adc r4, r4, r11\n\t"
  13782. "lsl r6, r8, #16\n\t"
  13783. "lsl r11, r7, #16\n\t"
  13784. "lsr r6, r6, #16\n\t"
  13785. "lsr r11, r11, #16\n\t"
  13786. "mul r11, r6, r11\n\t"
  13787. "adds r10, r10, r11\n\t"
  13788. "adc r4, r4, #0\n\t"
  13789. "lsr r11, r7, #16\n\t"
  13790. "mul r6, r11, r6\n\t"
  13791. "lsr r11, r6, #16\n\t"
  13792. "lsl r6, r6, #16\n\t"
  13793. "adds r10, r10, r6\n\t"
  13794. "adc r4, r4, r11\n\t"
  13795. "adds r10, r10, r5\n\t"
  13796. "str r10, [%[a], #196]\n\t"
  13797. "adc r4, r4, #0\n\t"
  13798. /* a[i+50] += m[50] * mu */
  13799. "ldr r7, [%[m], #200]\n\t"
  13800. "ldr r10, [%[a], #200]\n\t"
  13801. "lsr r11, r7, #16\n\t"
  13802. "lsr r6, r8, #16\n\t"
  13803. "mul r5, r6, r11\n\t"
  13804. "lsl r11, r7, #16\n\t"
  13805. "lsr r11, r11, #16\n\t"
  13806. "mul r6, r11, r6\n\t"
  13807. "lsr r11, r6, #16\n\t"
  13808. "lsl r6, r6, #16\n\t"
  13809. "adds r10, r10, r6\n\t"
  13810. "adc r5, r5, r11\n\t"
  13811. "lsl r6, r8, #16\n\t"
  13812. "lsl r11, r7, #16\n\t"
  13813. "lsr r6, r6, #16\n\t"
  13814. "lsr r11, r11, #16\n\t"
  13815. "mul r11, r6, r11\n\t"
  13816. "adds r10, r10, r11\n\t"
  13817. "adc r5, r5, #0\n\t"
  13818. "lsr r11, r7, #16\n\t"
  13819. "mul r6, r11, r6\n\t"
  13820. "lsr r11, r6, #16\n\t"
  13821. "lsl r6, r6, #16\n\t"
  13822. "adds r10, r10, r6\n\t"
  13823. "adc r5, r5, r11\n\t"
  13824. "adds r10, r10, r4\n\t"
  13825. "str r10, [%[a], #200]\n\t"
  13826. "adc r5, r5, #0\n\t"
  13827. /* a[i+51] += m[51] * mu */
  13828. "ldr r7, [%[m], #204]\n\t"
  13829. "ldr r10, [%[a], #204]\n\t"
  13830. "lsr r11, r7, #16\n\t"
  13831. "lsr r6, r8, #16\n\t"
  13832. "mul r4, r6, r11\n\t"
  13833. "lsl r11, r7, #16\n\t"
  13834. "lsr r11, r11, #16\n\t"
  13835. "mul r6, r11, r6\n\t"
  13836. "lsr r11, r6, #16\n\t"
  13837. "lsl r6, r6, #16\n\t"
  13838. "adds r10, r10, r6\n\t"
  13839. "adc r4, r4, r11\n\t"
  13840. "lsl r6, r8, #16\n\t"
  13841. "lsl r11, r7, #16\n\t"
  13842. "lsr r6, r6, #16\n\t"
  13843. "lsr r11, r11, #16\n\t"
  13844. "mul r11, r6, r11\n\t"
  13845. "adds r10, r10, r11\n\t"
  13846. "adc r4, r4, #0\n\t"
  13847. "lsr r11, r7, #16\n\t"
  13848. "mul r6, r11, r6\n\t"
  13849. "lsr r11, r6, #16\n\t"
  13850. "lsl r6, r6, #16\n\t"
  13851. "adds r10, r10, r6\n\t"
  13852. "adc r4, r4, r11\n\t"
  13853. "adds r10, r10, r5\n\t"
  13854. "str r10, [%[a], #204]\n\t"
  13855. "adc r4, r4, #0\n\t"
  13856. /* a[i+52] += m[52] * mu */
  13857. "ldr r7, [%[m], #208]\n\t"
  13858. "ldr r10, [%[a], #208]\n\t"
  13859. "lsr r11, r7, #16\n\t"
  13860. "lsr r6, r8, #16\n\t"
  13861. "mul r5, r6, r11\n\t"
  13862. "lsl r11, r7, #16\n\t"
  13863. "lsr r11, r11, #16\n\t"
  13864. "mul r6, r11, r6\n\t"
  13865. "lsr r11, r6, #16\n\t"
  13866. "lsl r6, r6, #16\n\t"
  13867. "adds r10, r10, r6\n\t"
  13868. "adc r5, r5, r11\n\t"
  13869. "lsl r6, r8, #16\n\t"
  13870. "lsl r11, r7, #16\n\t"
  13871. "lsr r6, r6, #16\n\t"
  13872. "lsr r11, r11, #16\n\t"
  13873. "mul r11, r6, r11\n\t"
  13874. "adds r10, r10, r11\n\t"
  13875. "adc r5, r5, #0\n\t"
  13876. "lsr r11, r7, #16\n\t"
  13877. "mul r6, r11, r6\n\t"
  13878. "lsr r11, r6, #16\n\t"
  13879. "lsl r6, r6, #16\n\t"
  13880. "adds r10, r10, r6\n\t"
  13881. "adc r5, r5, r11\n\t"
  13882. "adds r10, r10, r4\n\t"
  13883. "str r10, [%[a], #208]\n\t"
  13884. "adc r5, r5, #0\n\t"
  13885. /* a[i+53] += m[53] * mu */
  13886. "ldr r7, [%[m], #212]\n\t"
  13887. "ldr r10, [%[a], #212]\n\t"
  13888. "lsr r11, r7, #16\n\t"
  13889. "lsr r6, r8, #16\n\t"
  13890. "mul r4, r6, r11\n\t"
  13891. "lsl r11, r7, #16\n\t"
  13892. "lsr r11, r11, #16\n\t"
  13893. "mul r6, r11, r6\n\t"
  13894. "lsr r11, r6, #16\n\t"
  13895. "lsl r6, r6, #16\n\t"
  13896. "adds r10, r10, r6\n\t"
  13897. "adc r4, r4, r11\n\t"
  13898. "lsl r6, r8, #16\n\t"
  13899. "lsl r11, r7, #16\n\t"
  13900. "lsr r6, r6, #16\n\t"
  13901. "lsr r11, r11, #16\n\t"
  13902. "mul r11, r6, r11\n\t"
  13903. "adds r10, r10, r11\n\t"
  13904. "adc r4, r4, #0\n\t"
  13905. "lsr r11, r7, #16\n\t"
  13906. "mul r6, r11, r6\n\t"
  13907. "lsr r11, r6, #16\n\t"
  13908. "lsl r6, r6, #16\n\t"
  13909. "adds r10, r10, r6\n\t"
  13910. "adc r4, r4, r11\n\t"
  13911. "adds r10, r10, r5\n\t"
  13912. "str r10, [%[a], #212]\n\t"
  13913. "adc r4, r4, #0\n\t"
  13914. /* a[i+54] += m[54] * mu */
  13915. "ldr r7, [%[m], #216]\n\t"
  13916. "ldr r10, [%[a], #216]\n\t"
  13917. "lsr r11, r7, #16\n\t"
  13918. "lsr r6, r8, #16\n\t"
  13919. "mul r5, r6, r11\n\t"
  13920. "lsl r11, r7, #16\n\t"
  13921. "lsr r11, r11, #16\n\t"
  13922. "mul r6, r11, r6\n\t"
  13923. "lsr r11, r6, #16\n\t"
  13924. "lsl r6, r6, #16\n\t"
  13925. "adds r10, r10, r6\n\t"
  13926. "adc r5, r5, r11\n\t"
  13927. "lsl r6, r8, #16\n\t"
  13928. "lsl r11, r7, #16\n\t"
  13929. "lsr r6, r6, #16\n\t"
  13930. "lsr r11, r11, #16\n\t"
  13931. "mul r11, r6, r11\n\t"
  13932. "adds r10, r10, r11\n\t"
  13933. "adc r5, r5, #0\n\t"
  13934. "lsr r11, r7, #16\n\t"
  13935. "mul r6, r11, r6\n\t"
  13936. "lsr r11, r6, #16\n\t"
  13937. "lsl r6, r6, #16\n\t"
  13938. "adds r10, r10, r6\n\t"
  13939. "adc r5, r5, r11\n\t"
  13940. "adds r10, r10, r4\n\t"
  13941. "str r10, [%[a], #216]\n\t"
  13942. "adc r5, r5, #0\n\t"
  13943. /* a[i+55] += m[55] * mu */
  13944. "ldr r7, [%[m], #220]\n\t"
  13945. "ldr r10, [%[a], #220]\n\t"
  13946. "lsr r11, r7, #16\n\t"
  13947. "lsr r6, r8, #16\n\t"
  13948. "mul r4, r6, r11\n\t"
  13949. "lsl r11, r7, #16\n\t"
  13950. "lsr r11, r11, #16\n\t"
  13951. "mul r6, r11, r6\n\t"
  13952. "lsr r11, r6, #16\n\t"
  13953. "lsl r6, r6, #16\n\t"
  13954. "adds r10, r10, r6\n\t"
  13955. "adc r4, r4, r11\n\t"
  13956. "lsl r6, r8, #16\n\t"
  13957. "lsl r11, r7, #16\n\t"
  13958. "lsr r6, r6, #16\n\t"
  13959. "lsr r11, r11, #16\n\t"
  13960. "mul r11, r6, r11\n\t"
  13961. "adds r10, r10, r11\n\t"
  13962. "adc r4, r4, #0\n\t"
  13963. "lsr r11, r7, #16\n\t"
  13964. "mul r6, r11, r6\n\t"
  13965. "lsr r11, r6, #16\n\t"
  13966. "lsl r6, r6, #16\n\t"
  13967. "adds r10, r10, r6\n\t"
  13968. "adc r4, r4, r11\n\t"
  13969. "adds r10, r10, r5\n\t"
  13970. "str r10, [%[a], #220]\n\t"
  13971. "adc r4, r4, #0\n\t"
  13972. /* a[i+56] += m[56] * mu */
  13973. "ldr r7, [%[m], #224]\n\t"
  13974. "ldr r10, [%[a], #224]\n\t"
  13975. "lsr r11, r7, #16\n\t"
  13976. "lsr r6, r8, #16\n\t"
  13977. "mul r5, r6, r11\n\t"
  13978. "lsl r11, r7, #16\n\t"
  13979. "lsr r11, r11, #16\n\t"
  13980. "mul r6, r11, r6\n\t"
  13981. "lsr r11, r6, #16\n\t"
  13982. "lsl r6, r6, #16\n\t"
  13983. "adds r10, r10, r6\n\t"
  13984. "adc r5, r5, r11\n\t"
  13985. "lsl r6, r8, #16\n\t"
  13986. "lsl r11, r7, #16\n\t"
  13987. "lsr r6, r6, #16\n\t"
  13988. "lsr r11, r11, #16\n\t"
  13989. "mul r11, r6, r11\n\t"
  13990. "adds r10, r10, r11\n\t"
  13991. "adc r5, r5, #0\n\t"
  13992. "lsr r11, r7, #16\n\t"
  13993. "mul r6, r11, r6\n\t"
  13994. "lsr r11, r6, #16\n\t"
  13995. "lsl r6, r6, #16\n\t"
  13996. "adds r10, r10, r6\n\t"
  13997. "adc r5, r5, r11\n\t"
  13998. "adds r10, r10, r4\n\t"
  13999. "str r10, [%[a], #224]\n\t"
  14000. "adc r5, r5, #0\n\t"
  14001. /* a[i+57] += m[57] * mu */
  14002. "ldr r7, [%[m], #228]\n\t"
  14003. "ldr r10, [%[a], #228]\n\t"
  14004. "lsr r11, r7, #16\n\t"
  14005. "lsr r6, r8, #16\n\t"
  14006. "mul r4, r6, r11\n\t"
  14007. "lsl r11, r7, #16\n\t"
  14008. "lsr r11, r11, #16\n\t"
  14009. "mul r6, r11, r6\n\t"
  14010. "lsr r11, r6, #16\n\t"
  14011. "lsl r6, r6, #16\n\t"
  14012. "adds r10, r10, r6\n\t"
  14013. "adc r4, r4, r11\n\t"
  14014. "lsl r6, r8, #16\n\t"
  14015. "lsl r11, r7, #16\n\t"
  14016. "lsr r6, r6, #16\n\t"
  14017. "lsr r11, r11, #16\n\t"
  14018. "mul r11, r6, r11\n\t"
  14019. "adds r10, r10, r11\n\t"
  14020. "adc r4, r4, #0\n\t"
  14021. "lsr r11, r7, #16\n\t"
  14022. "mul r6, r11, r6\n\t"
  14023. "lsr r11, r6, #16\n\t"
  14024. "lsl r6, r6, #16\n\t"
  14025. "adds r10, r10, r6\n\t"
  14026. "adc r4, r4, r11\n\t"
  14027. "adds r10, r10, r5\n\t"
  14028. "str r10, [%[a], #228]\n\t"
  14029. "adc r4, r4, #0\n\t"
  14030. /* a[i+58] += m[58] * mu */
  14031. "ldr r7, [%[m], #232]\n\t"
  14032. "ldr r10, [%[a], #232]\n\t"
  14033. "lsr r11, r7, #16\n\t"
  14034. "lsr r6, r8, #16\n\t"
  14035. "mul r5, r6, r11\n\t"
  14036. "lsl r11, r7, #16\n\t"
  14037. "lsr r11, r11, #16\n\t"
  14038. "mul r6, r11, r6\n\t"
  14039. "lsr r11, r6, #16\n\t"
  14040. "lsl r6, r6, #16\n\t"
  14041. "adds r10, r10, r6\n\t"
  14042. "adc r5, r5, r11\n\t"
  14043. "lsl r6, r8, #16\n\t"
  14044. "lsl r11, r7, #16\n\t"
  14045. "lsr r6, r6, #16\n\t"
  14046. "lsr r11, r11, #16\n\t"
  14047. "mul r11, r6, r11\n\t"
  14048. "adds r10, r10, r11\n\t"
  14049. "adc r5, r5, #0\n\t"
  14050. "lsr r11, r7, #16\n\t"
  14051. "mul r6, r11, r6\n\t"
  14052. "lsr r11, r6, #16\n\t"
  14053. "lsl r6, r6, #16\n\t"
  14054. "adds r10, r10, r6\n\t"
  14055. "adc r5, r5, r11\n\t"
  14056. "adds r10, r10, r4\n\t"
  14057. "str r10, [%[a], #232]\n\t"
  14058. "adc r5, r5, #0\n\t"
  14059. /* a[i+59] += m[59] * mu */
  14060. "ldr r7, [%[m], #236]\n\t"
  14061. "ldr r10, [%[a], #236]\n\t"
  14062. "lsr r11, r7, #16\n\t"
  14063. "lsr r6, r8, #16\n\t"
  14064. "mul r4, r6, r11\n\t"
  14065. "lsl r11, r7, #16\n\t"
  14066. "lsr r11, r11, #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 r4, r4, r11\n\t"
  14072. "lsl r6, r8, #16\n\t"
  14073. "lsl r11, r7, #16\n\t"
  14074. "lsr r6, r6, #16\n\t"
  14075. "lsr r11, r11, #16\n\t"
  14076. "mul r11, r6, r11\n\t"
  14077. "adds r10, r10, r11\n\t"
  14078. "adc r4, r4, #0\n\t"
  14079. "lsr r11, r7, #16\n\t"
  14080. "mul r6, r11, r6\n\t"
  14081. "lsr r11, r6, #16\n\t"
  14082. "lsl r6, r6, #16\n\t"
  14083. "adds r10, r10, r6\n\t"
  14084. "adc r4, r4, r11\n\t"
  14085. "adds r10, r10, r5\n\t"
  14086. "str r10, [%[a], #236]\n\t"
  14087. "adc r4, r4, #0\n\t"
  14088. /* a[i+60] += m[60] * mu */
  14089. "ldr r7, [%[m], #240]\n\t"
  14090. "ldr r10, [%[a], #240]\n\t"
  14091. "lsr r11, r7, #16\n\t"
  14092. "lsr r6, r8, #16\n\t"
  14093. "mul r5, r6, r11\n\t"
  14094. "lsl r11, r7, #16\n\t"
  14095. "lsr r11, r11, #16\n\t"
  14096. "mul r6, r11, r6\n\t"
  14097. "lsr r11, r6, #16\n\t"
  14098. "lsl r6, r6, #16\n\t"
  14099. "adds r10, r10, r6\n\t"
  14100. "adc r5, r5, r11\n\t"
  14101. "lsl r6, r8, #16\n\t"
  14102. "lsl r11, r7, #16\n\t"
  14103. "lsr r6, r6, #16\n\t"
  14104. "lsr r11, r11, #16\n\t"
  14105. "mul r11, r6, r11\n\t"
  14106. "adds r10, r10, r11\n\t"
  14107. "adc r5, r5, #0\n\t"
  14108. "lsr r11, r7, #16\n\t"
  14109. "mul r6, r11, r6\n\t"
  14110. "lsr r11, r6, #16\n\t"
  14111. "lsl r6, r6, #16\n\t"
  14112. "adds r10, r10, r6\n\t"
  14113. "adc r5, r5, r11\n\t"
  14114. "adds r10, r10, r4\n\t"
  14115. "str r10, [%[a], #240]\n\t"
  14116. "adc r5, r5, #0\n\t"
  14117. /* a[i+61] += m[61] * mu */
  14118. "ldr r7, [%[m], #244]\n\t"
  14119. "ldr r10, [%[a], #244]\n\t"
  14120. "lsr r11, r7, #16\n\t"
  14121. "lsr r6, r8, #16\n\t"
  14122. "mul r4, r6, r11\n\t"
  14123. "lsl r11, r7, #16\n\t"
  14124. "lsr r11, r11, #16\n\t"
  14125. "mul r6, r11, r6\n\t"
  14126. "lsr r11, r6, #16\n\t"
  14127. "lsl r6, r6, #16\n\t"
  14128. "adds r10, r10, r6\n\t"
  14129. "adc r4, r4, r11\n\t"
  14130. "lsl r6, r8, #16\n\t"
  14131. "lsl r11, r7, #16\n\t"
  14132. "lsr r6, r6, #16\n\t"
  14133. "lsr r11, r11, #16\n\t"
  14134. "mul r11, r6, r11\n\t"
  14135. "adds r10, r10, r11\n\t"
  14136. "adc r4, r4, #0\n\t"
  14137. "lsr r11, r7, #16\n\t"
  14138. "mul r6, r11, r6\n\t"
  14139. "lsr r11, r6, #16\n\t"
  14140. "lsl r6, r6, #16\n\t"
  14141. "adds r10, r10, r6\n\t"
  14142. "adc r4, r4, r11\n\t"
  14143. "adds r10, r10, r5\n\t"
  14144. "str r10, [%[a], #244]\n\t"
  14145. "adc r4, r4, #0\n\t"
  14146. /* a[i+62] += m[62] * mu */
  14147. "ldr r7, [%[m], #248]\n\t"
  14148. "ldr r10, [%[a], #248]\n\t"
  14149. "lsr r11, r7, #16\n\t"
  14150. "lsr r6, r8, #16\n\t"
  14151. "mul r5, r6, r11\n\t"
  14152. "lsl r11, r7, #16\n\t"
  14153. "lsr r11, r11, #16\n\t"
  14154. "mul r6, r11, r6\n\t"
  14155. "lsr r11, r6, #16\n\t"
  14156. "lsl r6, r6, #16\n\t"
  14157. "adds r10, r10, r6\n\t"
  14158. "adc r5, r5, r11\n\t"
  14159. "lsl r6, r8, #16\n\t"
  14160. "lsl r11, r7, #16\n\t"
  14161. "lsr r6, r6, #16\n\t"
  14162. "lsr r11, r11, #16\n\t"
  14163. "mul r11, r6, r11\n\t"
  14164. "adds r10, r10, r11\n\t"
  14165. "adc r5, r5, #0\n\t"
  14166. "lsr r11, r7, #16\n\t"
  14167. "mul r6, r11, r6\n\t"
  14168. "lsr r11, r6, #16\n\t"
  14169. "lsl r6, r6, #16\n\t"
  14170. "adds r10, r10, r6\n\t"
  14171. "adc r5, r5, r11\n\t"
  14172. "adds r10, r10, r4\n\t"
  14173. "str r10, [%[a], #248]\n\t"
  14174. "adc r5, r5, #0\n\t"
  14175. /* a[i+63] += m[63] * mu */
  14176. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  14177. "ldr r11, [%[m], #252]\n\t"
  14178. #else
  14179. "ldr r7, [%[m], #252]\n\t"
  14180. #endif
  14181. "ldr r10, [%[a], #252]\n\t"
  14182. "lsl r6, r8, #16\n\t"
  14183. "lsl r7, r11, #16\n\t"
  14184. "lsr r6, r6, #16\n\t"
  14185. "lsr r7, r7, #16\n\t"
  14186. "mul r7, r6, r7\n\t"
  14187. "adds r5, r5, r7\n\t"
  14188. "adcs r4, r3, #0\n\t"
  14189. "mov r3, #0\n\t"
  14190. "adc r3, r3, r3\n\t"
  14191. "lsr r7, r11, #16\n\t"
  14192. "mul r6, r7, r6\n\t"
  14193. "lsr r7, r6, #16\n\t"
  14194. "lsl r6, r6, #16\n\t"
  14195. "adds r5, r5, r6\n\t"
  14196. "adcs r4, r4, r7\n\t"
  14197. "adc r3, r3, #0\n\t"
  14198. "mov r6, r8\n\t"
  14199. "lsr r7, r11, #16\n\t"
  14200. "lsr r6, r6, #16\n\t"
  14201. "mul r7, r6, r7\n\t"
  14202. "adds r4, r4, r7\n\t"
  14203. "lsl r7, r11, #16\n\t"
  14204. "adc r3, r3, #0\n\t"
  14205. "lsr r7, r7, #16\n\t"
  14206. "mul r6, r7, r6\n\t"
  14207. "lsr r7, r6, #16\n\t"
  14208. "lsl r6, r6, #16\n\t"
  14209. "adds r5, r5, r6\n\t"
  14210. "adcs r4, r4, r7\n\t"
  14211. "adc r3, r3, #0\n\t"
  14212. "adds r10, r10, r5\n\t"
  14213. "str r10, [%[a], #252]\n\t"
  14214. "ldr r10, [%[a], #256]\n\t"
  14215. "adcs r10, r10, r4\n\t"
  14216. "str r10, [%[a], #256]\n\t"
  14217. "adc r3, r3, #0\n\t"
  14218. /* i += 1 */
  14219. "add r9, r9, #4\n\t"
  14220. "add %[a], %[a], #4\n\t"
  14221. "cmp r9, #0x100\n\t"
  14222. "blt L_sp_2048_mont_reduce_64_word_%=\n\t"
  14223. /* Loop Done */
  14224. "str r12, [%[a]]\n\t"
  14225. "str lr, [%[a], #4]\n\t"
  14226. "mov %[mp], r3\n\t"
  14227. : [a] "+r" (a), [m] "+r" (m), [mp] "+r" (mp)
  14228. :
  14229. : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "cc"
  14230. );
  14231. sp_2048_cond_sub_64(a - 64, a, m, (sp_digit)0 - mp);
  14232. }
  14233. #elif defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  14234. /* Reduce the number back to 2048 bits using Montgomery reduction.
  14235. *
  14236. * a A single precision number to reduce in place.
  14237. * m The single precision number representing the modulus.
  14238. * mp The digit representing the negative inverse of m mod 2^n.
  14239. */
  14240. static SP_NOINLINE void sp_2048_mont_reduce_64(sp_digit* a_p, const sp_digit* m_p, sp_digit mp_p)
  14241. {
  14242. register sp_digit* a asm ("r0") = (sp_digit*)a_p;
  14243. register const sp_digit* m asm ("r1") = (const sp_digit*)m_p;
  14244. register sp_digit mp asm ("r2") = (sp_digit)mp_p;
  14245. __asm__ __volatile__ (
  14246. "ldr r11, [%[m]]\n\t"
  14247. /* i = 0 */
  14248. "mov r9, #0\n\t"
  14249. "mov r3, #0\n\t"
  14250. "ldr r12, [%[a]]\n\t"
  14251. "ldr lr, [%[a], #4]\n\t"
  14252. "\n"
  14253. "L_sp_2048_mont_reduce_64_word_%=: \n\t"
  14254. /* mu = a[i] * mp */
  14255. "mul r8, %[mp], r12\n\t"
  14256. /* a[i+0] += m[0] * mu */
  14257. "mov r5, #0\n\t"
  14258. "umlal r12, r5, r8, r11\n\t"
  14259. /* a[i+1] += m[1] * mu */
  14260. "ldr r7, [%[m], #4]\n\t"
  14261. "mov r4, #0\n\t"
  14262. "umlal lr, r4, r8, r7\n\t"
  14263. "mov r12, lr\n\t"
  14264. "adds r12, r12, r5\n\t"
  14265. "adc r4, r4, #0\n\t"
  14266. /* a[i+2] += m[2] * mu */
  14267. "ldr r7, [%[m], #8]\n\t"
  14268. "ldr lr, [%[a], #8]\n\t"
  14269. "mov r5, #0\n\t"
  14270. "umlal lr, r5, r8, r7\n\t"
  14271. "adds lr, lr, r4\n\t"
  14272. "adc r5, r5, #0\n\t"
  14273. /* a[i+3] += m[3] * mu */
  14274. "ldr r7, [%[m], #12]\n\t"
  14275. "ldr r10, [%[a], #12]\n\t"
  14276. "mov r4, #0\n\t"
  14277. "umlal r10, r4, r8, r7\n\t"
  14278. "adds r10, r10, r5\n\t"
  14279. "str r10, [%[a], #12]\n\t"
  14280. "adc r4, r4, #0\n\t"
  14281. /* a[i+4] += m[4] * mu */
  14282. "ldr r7, [%[m], #16]\n\t"
  14283. "ldr r10, [%[a], #16]\n\t"
  14284. "mov r5, #0\n\t"
  14285. "umlal r10, r5, r8, r7\n\t"
  14286. "adds r10, r10, r4\n\t"
  14287. "str r10, [%[a], #16]\n\t"
  14288. "adc r5, r5, #0\n\t"
  14289. /* a[i+5] += m[5] * mu */
  14290. "ldr r7, [%[m], #20]\n\t"
  14291. "ldr r10, [%[a], #20]\n\t"
  14292. "mov r4, #0\n\t"
  14293. "umlal r10, r4, r8, r7\n\t"
  14294. "adds r10, r10, r5\n\t"
  14295. "str r10, [%[a], #20]\n\t"
  14296. "adc r4, r4, #0\n\t"
  14297. /* a[i+6] += m[6] * mu */
  14298. "ldr r7, [%[m], #24]\n\t"
  14299. "ldr r10, [%[a], #24]\n\t"
  14300. "mov r5, #0\n\t"
  14301. "umlal r10, r5, r8, r7\n\t"
  14302. "adds r10, r10, r4\n\t"
  14303. "str r10, [%[a], #24]\n\t"
  14304. "adc r5, r5, #0\n\t"
  14305. /* a[i+7] += m[7] * mu */
  14306. "ldr r7, [%[m], #28]\n\t"
  14307. "ldr r10, [%[a], #28]\n\t"
  14308. "mov r4, #0\n\t"
  14309. "umlal r10, r4, r8, r7\n\t"
  14310. "adds r10, r10, r5\n\t"
  14311. "str r10, [%[a], #28]\n\t"
  14312. "adc r4, r4, #0\n\t"
  14313. /* a[i+8] += m[8] * mu */
  14314. "ldr r7, [%[m], #32]\n\t"
  14315. "ldr r10, [%[a], #32]\n\t"
  14316. "mov r5, #0\n\t"
  14317. "umlal r10, r5, r8, r7\n\t"
  14318. "adds r10, r10, r4\n\t"
  14319. "str r10, [%[a], #32]\n\t"
  14320. "adc r5, r5, #0\n\t"
  14321. /* a[i+9] += m[9] * mu */
  14322. "ldr r7, [%[m], #36]\n\t"
  14323. "ldr r10, [%[a], #36]\n\t"
  14324. "mov r4, #0\n\t"
  14325. "umlal r10, r4, r8, r7\n\t"
  14326. "adds r10, r10, r5\n\t"
  14327. "str r10, [%[a], #36]\n\t"
  14328. "adc r4, r4, #0\n\t"
  14329. /* a[i+10] += m[10] * mu */
  14330. "ldr r7, [%[m], #40]\n\t"
  14331. "ldr r10, [%[a], #40]\n\t"
  14332. "mov r5, #0\n\t"
  14333. "umlal r10, r5, r8, r7\n\t"
  14334. "adds r10, r10, r4\n\t"
  14335. "str r10, [%[a], #40]\n\t"
  14336. "adc r5, r5, #0\n\t"
  14337. /* a[i+11] += m[11] * mu */
  14338. "ldr r7, [%[m], #44]\n\t"
  14339. "ldr r10, [%[a], #44]\n\t"
  14340. "mov r4, #0\n\t"
  14341. "umlal r10, r4, r8, r7\n\t"
  14342. "adds r10, r10, r5\n\t"
  14343. "str r10, [%[a], #44]\n\t"
  14344. "adc r4, r4, #0\n\t"
  14345. /* a[i+12] += m[12] * mu */
  14346. "ldr r7, [%[m], #48]\n\t"
  14347. "ldr r10, [%[a], #48]\n\t"
  14348. "mov r5, #0\n\t"
  14349. "umlal r10, r5, r8, r7\n\t"
  14350. "adds r10, r10, r4\n\t"
  14351. "str r10, [%[a], #48]\n\t"
  14352. "adc r5, r5, #0\n\t"
  14353. /* a[i+13] += m[13] * mu */
  14354. "ldr r7, [%[m], #52]\n\t"
  14355. "ldr r10, [%[a], #52]\n\t"
  14356. "mov r4, #0\n\t"
  14357. "umlal r10, r4, r8, r7\n\t"
  14358. "adds r10, r10, r5\n\t"
  14359. "str r10, [%[a], #52]\n\t"
  14360. "adc r4, r4, #0\n\t"
  14361. /* a[i+14] += m[14] * mu */
  14362. "ldr r7, [%[m], #56]\n\t"
  14363. "ldr r10, [%[a], #56]\n\t"
  14364. "mov r5, #0\n\t"
  14365. "umlal r10, r5, r8, r7\n\t"
  14366. "adds r10, r10, r4\n\t"
  14367. "str r10, [%[a], #56]\n\t"
  14368. "adc r5, r5, #0\n\t"
  14369. /* a[i+15] += m[15] * mu */
  14370. "ldr r7, [%[m], #60]\n\t"
  14371. "ldr r10, [%[a], #60]\n\t"
  14372. "mov r4, #0\n\t"
  14373. "umlal r10, r4, r8, r7\n\t"
  14374. "adds r10, r10, r5\n\t"
  14375. "str r10, [%[a], #60]\n\t"
  14376. "adc r4, r4, #0\n\t"
  14377. /* a[i+16] += m[16] * mu */
  14378. "ldr r7, [%[m], #64]\n\t"
  14379. "ldr r10, [%[a], #64]\n\t"
  14380. "mov r5, #0\n\t"
  14381. "umlal r10, r5, r8, r7\n\t"
  14382. "adds r10, r10, r4\n\t"
  14383. "str r10, [%[a], #64]\n\t"
  14384. "adc r5, r5, #0\n\t"
  14385. /* a[i+17] += m[17] * mu */
  14386. "ldr r7, [%[m], #68]\n\t"
  14387. "ldr r10, [%[a], #68]\n\t"
  14388. "mov r4, #0\n\t"
  14389. "umlal r10, r4, r8, r7\n\t"
  14390. "adds r10, r10, r5\n\t"
  14391. "str r10, [%[a], #68]\n\t"
  14392. "adc r4, r4, #0\n\t"
  14393. /* a[i+18] += m[18] * mu */
  14394. "ldr r7, [%[m], #72]\n\t"
  14395. "ldr r10, [%[a], #72]\n\t"
  14396. "mov r5, #0\n\t"
  14397. "umlal r10, r5, r8, r7\n\t"
  14398. "adds r10, r10, r4\n\t"
  14399. "str r10, [%[a], #72]\n\t"
  14400. "adc r5, r5, #0\n\t"
  14401. /* a[i+19] += m[19] * mu */
  14402. "ldr r7, [%[m], #76]\n\t"
  14403. "ldr r10, [%[a], #76]\n\t"
  14404. "mov r4, #0\n\t"
  14405. "umlal r10, r4, r8, r7\n\t"
  14406. "adds r10, r10, r5\n\t"
  14407. "str r10, [%[a], #76]\n\t"
  14408. "adc r4, r4, #0\n\t"
  14409. /* a[i+20] += m[20] * mu */
  14410. "ldr r7, [%[m], #80]\n\t"
  14411. "ldr r10, [%[a], #80]\n\t"
  14412. "mov r5, #0\n\t"
  14413. "umlal r10, r5, r8, r7\n\t"
  14414. "adds r10, r10, r4\n\t"
  14415. "str r10, [%[a], #80]\n\t"
  14416. "adc r5, r5, #0\n\t"
  14417. /* a[i+21] += m[21] * mu */
  14418. "ldr r7, [%[m], #84]\n\t"
  14419. "ldr r10, [%[a], #84]\n\t"
  14420. "mov r4, #0\n\t"
  14421. "umlal r10, r4, r8, r7\n\t"
  14422. "adds r10, r10, r5\n\t"
  14423. "str r10, [%[a], #84]\n\t"
  14424. "adc r4, r4, #0\n\t"
  14425. /* a[i+22] += m[22] * mu */
  14426. "ldr r7, [%[m], #88]\n\t"
  14427. "ldr r10, [%[a], #88]\n\t"
  14428. "mov r5, #0\n\t"
  14429. "umlal r10, r5, r8, r7\n\t"
  14430. "adds r10, r10, r4\n\t"
  14431. "str r10, [%[a], #88]\n\t"
  14432. "adc r5, r5, #0\n\t"
  14433. /* a[i+23] += m[23] * mu */
  14434. "ldr r7, [%[m], #92]\n\t"
  14435. "ldr r10, [%[a], #92]\n\t"
  14436. "mov r4, #0\n\t"
  14437. "umlal r10, r4, r8, r7\n\t"
  14438. "adds r10, r10, r5\n\t"
  14439. "str r10, [%[a], #92]\n\t"
  14440. "adc r4, r4, #0\n\t"
  14441. /* a[i+24] += m[24] * mu */
  14442. "ldr r7, [%[m], #96]\n\t"
  14443. "ldr r10, [%[a], #96]\n\t"
  14444. "mov r5, #0\n\t"
  14445. "umlal r10, r5, r8, r7\n\t"
  14446. "adds r10, r10, r4\n\t"
  14447. "str r10, [%[a], #96]\n\t"
  14448. "adc r5, r5, #0\n\t"
  14449. /* a[i+25] += m[25] * mu */
  14450. "ldr r7, [%[m], #100]\n\t"
  14451. "ldr r10, [%[a], #100]\n\t"
  14452. "mov r4, #0\n\t"
  14453. "umlal r10, r4, r8, r7\n\t"
  14454. "adds r10, r10, r5\n\t"
  14455. "str r10, [%[a], #100]\n\t"
  14456. "adc r4, r4, #0\n\t"
  14457. /* a[i+26] += m[26] * mu */
  14458. "ldr r7, [%[m], #104]\n\t"
  14459. "ldr r10, [%[a], #104]\n\t"
  14460. "mov r5, #0\n\t"
  14461. "umlal r10, r5, r8, r7\n\t"
  14462. "adds r10, r10, r4\n\t"
  14463. "str r10, [%[a], #104]\n\t"
  14464. "adc r5, r5, #0\n\t"
  14465. /* a[i+27] += m[27] * mu */
  14466. "ldr r7, [%[m], #108]\n\t"
  14467. "ldr r10, [%[a], #108]\n\t"
  14468. "mov r4, #0\n\t"
  14469. "umlal r10, r4, r8, r7\n\t"
  14470. "adds r10, r10, r5\n\t"
  14471. "str r10, [%[a], #108]\n\t"
  14472. "adc r4, r4, #0\n\t"
  14473. /* a[i+28] += m[28] * mu */
  14474. "ldr r7, [%[m], #112]\n\t"
  14475. "ldr r10, [%[a], #112]\n\t"
  14476. "mov r5, #0\n\t"
  14477. "umlal r10, r5, r8, r7\n\t"
  14478. "adds r10, r10, r4\n\t"
  14479. "str r10, [%[a], #112]\n\t"
  14480. "adc r5, r5, #0\n\t"
  14481. /* a[i+29] += m[29] * mu */
  14482. "ldr r7, [%[m], #116]\n\t"
  14483. "ldr r10, [%[a], #116]\n\t"
  14484. "mov r4, #0\n\t"
  14485. "umlal r10, r4, r8, r7\n\t"
  14486. "adds r10, r10, r5\n\t"
  14487. "str r10, [%[a], #116]\n\t"
  14488. "adc r4, r4, #0\n\t"
  14489. /* a[i+30] += m[30] * mu */
  14490. "ldr r7, [%[m], #120]\n\t"
  14491. "ldr r10, [%[a], #120]\n\t"
  14492. "mov r5, #0\n\t"
  14493. "umlal r10, r5, r8, r7\n\t"
  14494. "adds r10, r10, r4\n\t"
  14495. "str r10, [%[a], #120]\n\t"
  14496. "adc r5, r5, #0\n\t"
  14497. /* a[i+31] += m[31] * mu */
  14498. "ldr r7, [%[m], #124]\n\t"
  14499. "ldr r10, [%[a], #124]\n\t"
  14500. "mov r4, #0\n\t"
  14501. "umlal r10, r4, r8, r7\n\t"
  14502. "adds r10, r10, r5\n\t"
  14503. "str r10, [%[a], #124]\n\t"
  14504. "adc r4, r4, #0\n\t"
  14505. /* a[i+32] += m[32] * mu */
  14506. "ldr r7, [%[m], #128]\n\t"
  14507. "ldr r10, [%[a], #128]\n\t"
  14508. "mov r5, #0\n\t"
  14509. "umlal r10, r5, r8, r7\n\t"
  14510. "adds r10, r10, r4\n\t"
  14511. "str r10, [%[a], #128]\n\t"
  14512. "adc r5, r5, #0\n\t"
  14513. /* a[i+33] += m[33] * mu */
  14514. "ldr r7, [%[m], #132]\n\t"
  14515. "ldr r10, [%[a], #132]\n\t"
  14516. "mov r4, #0\n\t"
  14517. "umlal r10, r4, r8, r7\n\t"
  14518. "adds r10, r10, r5\n\t"
  14519. "str r10, [%[a], #132]\n\t"
  14520. "adc r4, r4, #0\n\t"
  14521. /* a[i+34] += m[34] * mu */
  14522. "ldr r7, [%[m], #136]\n\t"
  14523. "ldr r10, [%[a], #136]\n\t"
  14524. "mov r5, #0\n\t"
  14525. "umlal r10, r5, r8, r7\n\t"
  14526. "adds r10, r10, r4\n\t"
  14527. "str r10, [%[a], #136]\n\t"
  14528. "adc r5, r5, #0\n\t"
  14529. /* a[i+35] += m[35] * mu */
  14530. "ldr r7, [%[m], #140]\n\t"
  14531. "ldr r10, [%[a], #140]\n\t"
  14532. "mov r4, #0\n\t"
  14533. "umlal r10, r4, r8, r7\n\t"
  14534. "adds r10, r10, r5\n\t"
  14535. "str r10, [%[a], #140]\n\t"
  14536. "adc r4, r4, #0\n\t"
  14537. /* a[i+36] += m[36] * mu */
  14538. "ldr r7, [%[m], #144]\n\t"
  14539. "ldr r10, [%[a], #144]\n\t"
  14540. "mov r5, #0\n\t"
  14541. "umlal r10, r5, r8, r7\n\t"
  14542. "adds r10, r10, r4\n\t"
  14543. "str r10, [%[a], #144]\n\t"
  14544. "adc r5, r5, #0\n\t"
  14545. /* a[i+37] += m[37] * mu */
  14546. "ldr r7, [%[m], #148]\n\t"
  14547. "ldr r10, [%[a], #148]\n\t"
  14548. "mov r4, #0\n\t"
  14549. "umlal r10, r4, r8, r7\n\t"
  14550. "adds r10, r10, r5\n\t"
  14551. "str r10, [%[a], #148]\n\t"
  14552. "adc r4, r4, #0\n\t"
  14553. /* a[i+38] += m[38] * mu */
  14554. "ldr r7, [%[m], #152]\n\t"
  14555. "ldr r10, [%[a], #152]\n\t"
  14556. "mov r5, #0\n\t"
  14557. "umlal r10, r5, r8, r7\n\t"
  14558. "adds r10, r10, r4\n\t"
  14559. "str r10, [%[a], #152]\n\t"
  14560. "adc r5, r5, #0\n\t"
  14561. /* a[i+39] += m[39] * mu */
  14562. "ldr r7, [%[m], #156]\n\t"
  14563. "ldr r10, [%[a], #156]\n\t"
  14564. "mov r4, #0\n\t"
  14565. "umlal r10, r4, r8, r7\n\t"
  14566. "adds r10, r10, r5\n\t"
  14567. "str r10, [%[a], #156]\n\t"
  14568. "adc r4, r4, #0\n\t"
  14569. /* a[i+40] += m[40] * mu */
  14570. "ldr r7, [%[m], #160]\n\t"
  14571. "ldr r10, [%[a], #160]\n\t"
  14572. "mov r5, #0\n\t"
  14573. "umlal r10, r5, r8, r7\n\t"
  14574. "adds r10, r10, r4\n\t"
  14575. "str r10, [%[a], #160]\n\t"
  14576. "adc r5, r5, #0\n\t"
  14577. /* a[i+41] += m[41] * mu */
  14578. "ldr r7, [%[m], #164]\n\t"
  14579. "ldr r10, [%[a], #164]\n\t"
  14580. "mov r4, #0\n\t"
  14581. "umlal r10, r4, r8, r7\n\t"
  14582. "adds r10, r10, r5\n\t"
  14583. "str r10, [%[a], #164]\n\t"
  14584. "adc r4, r4, #0\n\t"
  14585. /* a[i+42] += m[42] * mu */
  14586. "ldr r7, [%[m], #168]\n\t"
  14587. "ldr r10, [%[a], #168]\n\t"
  14588. "mov r5, #0\n\t"
  14589. "umlal r10, r5, r8, r7\n\t"
  14590. "adds r10, r10, r4\n\t"
  14591. "str r10, [%[a], #168]\n\t"
  14592. "adc r5, r5, #0\n\t"
  14593. /* a[i+43] += m[43] * mu */
  14594. "ldr r7, [%[m], #172]\n\t"
  14595. "ldr r10, [%[a], #172]\n\t"
  14596. "mov r4, #0\n\t"
  14597. "umlal r10, r4, r8, r7\n\t"
  14598. "adds r10, r10, r5\n\t"
  14599. "str r10, [%[a], #172]\n\t"
  14600. "adc r4, r4, #0\n\t"
  14601. /* a[i+44] += m[44] * mu */
  14602. "ldr r7, [%[m], #176]\n\t"
  14603. "ldr r10, [%[a], #176]\n\t"
  14604. "mov r5, #0\n\t"
  14605. "umlal r10, r5, r8, r7\n\t"
  14606. "adds r10, r10, r4\n\t"
  14607. "str r10, [%[a], #176]\n\t"
  14608. "adc r5, r5, #0\n\t"
  14609. /* a[i+45] += m[45] * mu */
  14610. "ldr r7, [%[m], #180]\n\t"
  14611. "ldr r10, [%[a], #180]\n\t"
  14612. "mov r4, #0\n\t"
  14613. "umlal r10, r4, r8, r7\n\t"
  14614. "adds r10, r10, r5\n\t"
  14615. "str r10, [%[a], #180]\n\t"
  14616. "adc r4, r4, #0\n\t"
  14617. /* a[i+46] += m[46] * mu */
  14618. "ldr r7, [%[m], #184]\n\t"
  14619. "ldr r10, [%[a], #184]\n\t"
  14620. "mov r5, #0\n\t"
  14621. "umlal r10, r5, r8, r7\n\t"
  14622. "adds r10, r10, r4\n\t"
  14623. "str r10, [%[a], #184]\n\t"
  14624. "adc r5, r5, #0\n\t"
  14625. /* a[i+47] += m[47] * mu */
  14626. "ldr r7, [%[m], #188]\n\t"
  14627. "ldr r10, [%[a], #188]\n\t"
  14628. "mov r4, #0\n\t"
  14629. "umlal r10, r4, r8, r7\n\t"
  14630. "adds r10, r10, r5\n\t"
  14631. "str r10, [%[a], #188]\n\t"
  14632. "adc r4, r4, #0\n\t"
  14633. /* a[i+48] += m[48] * mu */
  14634. "ldr r7, [%[m], #192]\n\t"
  14635. "ldr r10, [%[a], #192]\n\t"
  14636. "mov r5, #0\n\t"
  14637. "umlal r10, r5, r8, r7\n\t"
  14638. "adds r10, r10, r4\n\t"
  14639. "str r10, [%[a], #192]\n\t"
  14640. "adc r5, r5, #0\n\t"
  14641. /* a[i+49] += m[49] * mu */
  14642. "ldr r7, [%[m], #196]\n\t"
  14643. "ldr r10, [%[a], #196]\n\t"
  14644. "mov r4, #0\n\t"
  14645. "umlal r10, r4, r8, r7\n\t"
  14646. "adds r10, r10, r5\n\t"
  14647. "str r10, [%[a], #196]\n\t"
  14648. "adc r4, r4, #0\n\t"
  14649. /* a[i+50] += m[50] * mu */
  14650. "ldr r7, [%[m], #200]\n\t"
  14651. "ldr r10, [%[a], #200]\n\t"
  14652. "mov r5, #0\n\t"
  14653. "umlal r10, r5, r8, r7\n\t"
  14654. "adds r10, r10, r4\n\t"
  14655. "str r10, [%[a], #200]\n\t"
  14656. "adc r5, r5, #0\n\t"
  14657. /* a[i+51] += m[51] * mu */
  14658. "ldr r7, [%[m], #204]\n\t"
  14659. "ldr r10, [%[a], #204]\n\t"
  14660. "mov r4, #0\n\t"
  14661. "umlal r10, r4, r8, r7\n\t"
  14662. "adds r10, r10, r5\n\t"
  14663. "str r10, [%[a], #204]\n\t"
  14664. "adc r4, r4, #0\n\t"
  14665. /* a[i+52] += m[52] * mu */
  14666. "ldr r7, [%[m], #208]\n\t"
  14667. "ldr r10, [%[a], #208]\n\t"
  14668. "mov r5, #0\n\t"
  14669. "umlal r10, r5, r8, r7\n\t"
  14670. "adds r10, r10, r4\n\t"
  14671. "str r10, [%[a], #208]\n\t"
  14672. "adc r5, r5, #0\n\t"
  14673. /* a[i+53] += m[53] * mu */
  14674. "ldr r7, [%[m], #212]\n\t"
  14675. "ldr r10, [%[a], #212]\n\t"
  14676. "mov r4, #0\n\t"
  14677. "umlal r10, r4, r8, r7\n\t"
  14678. "adds r10, r10, r5\n\t"
  14679. "str r10, [%[a], #212]\n\t"
  14680. "adc r4, r4, #0\n\t"
  14681. /* a[i+54] += m[54] * mu */
  14682. "ldr r7, [%[m], #216]\n\t"
  14683. "ldr r10, [%[a], #216]\n\t"
  14684. "mov r5, #0\n\t"
  14685. "umlal r10, r5, r8, r7\n\t"
  14686. "adds r10, r10, r4\n\t"
  14687. "str r10, [%[a], #216]\n\t"
  14688. "adc r5, r5, #0\n\t"
  14689. /* a[i+55] += m[55] * mu */
  14690. "ldr r7, [%[m], #220]\n\t"
  14691. "ldr r10, [%[a], #220]\n\t"
  14692. "mov r4, #0\n\t"
  14693. "umlal r10, r4, r8, r7\n\t"
  14694. "adds r10, r10, r5\n\t"
  14695. "str r10, [%[a], #220]\n\t"
  14696. "adc r4, r4, #0\n\t"
  14697. /* a[i+56] += m[56] * mu */
  14698. "ldr r7, [%[m], #224]\n\t"
  14699. "ldr r10, [%[a], #224]\n\t"
  14700. "mov r5, #0\n\t"
  14701. "umlal r10, r5, r8, r7\n\t"
  14702. "adds r10, r10, r4\n\t"
  14703. "str r10, [%[a], #224]\n\t"
  14704. "adc r5, r5, #0\n\t"
  14705. /* a[i+57] += m[57] * mu */
  14706. "ldr r7, [%[m], #228]\n\t"
  14707. "ldr r10, [%[a], #228]\n\t"
  14708. "mov r4, #0\n\t"
  14709. "umlal r10, r4, r8, r7\n\t"
  14710. "adds r10, r10, r5\n\t"
  14711. "str r10, [%[a], #228]\n\t"
  14712. "adc r4, r4, #0\n\t"
  14713. /* a[i+58] += m[58] * mu */
  14714. "ldr r7, [%[m], #232]\n\t"
  14715. "ldr r10, [%[a], #232]\n\t"
  14716. "mov r5, #0\n\t"
  14717. "umlal r10, r5, r8, r7\n\t"
  14718. "adds r10, r10, r4\n\t"
  14719. "str r10, [%[a], #232]\n\t"
  14720. "adc r5, r5, #0\n\t"
  14721. /* a[i+59] += m[59] * mu */
  14722. "ldr r7, [%[m], #236]\n\t"
  14723. "ldr r10, [%[a], #236]\n\t"
  14724. "mov r4, #0\n\t"
  14725. "umlal r10, r4, r8, r7\n\t"
  14726. "adds r10, r10, r5\n\t"
  14727. "str r10, [%[a], #236]\n\t"
  14728. "adc r4, r4, #0\n\t"
  14729. /* a[i+60] += m[60] * mu */
  14730. "ldr r7, [%[m], #240]\n\t"
  14731. "ldr r10, [%[a], #240]\n\t"
  14732. "mov r5, #0\n\t"
  14733. "umlal r10, r5, r8, r7\n\t"
  14734. "adds r10, r10, r4\n\t"
  14735. "str r10, [%[a], #240]\n\t"
  14736. "adc r5, r5, #0\n\t"
  14737. /* a[i+61] += m[61] * mu */
  14738. "ldr r7, [%[m], #244]\n\t"
  14739. "ldr r10, [%[a], #244]\n\t"
  14740. "mov r4, #0\n\t"
  14741. "umlal r10, r4, r8, r7\n\t"
  14742. "adds r10, r10, r5\n\t"
  14743. "str r10, [%[a], #244]\n\t"
  14744. "adc r4, r4, #0\n\t"
  14745. /* a[i+62] += m[62] * mu */
  14746. "ldr r7, [%[m], #248]\n\t"
  14747. "ldr r10, [%[a], #248]\n\t"
  14748. "mov r5, #0\n\t"
  14749. "umlal r10, r5, r8, r7\n\t"
  14750. "adds r10, r10, r4\n\t"
  14751. "str r10, [%[a], #248]\n\t"
  14752. "adc r5, r5, #0\n\t"
  14753. /* a[i+63] += m[63] * mu */
  14754. "ldr r7, [%[m], #252]\n\t"
  14755. "ldr r10, [%[a], #252]\n\t"
  14756. "umull r6, r7, r8, r7\n\t"
  14757. "adds r5, r5, r6\n\t"
  14758. "adcs r4, r7, r3\n\t"
  14759. "mov r3, #0\n\t"
  14760. "adc r3, r3, r3\n\t"
  14761. "adds r10, r10, r5\n\t"
  14762. "str r10, [%[a], #252]\n\t"
  14763. "ldr r10, [%[a], #256]\n\t"
  14764. "adcs r10, r10, r4\n\t"
  14765. "str r10, [%[a], #256]\n\t"
  14766. "adc r3, r3, #0\n\t"
  14767. /* i += 1 */
  14768. "add r9, r9, #4\n\t"
  14769. "add %[a], %[a], #4\n\t"
  14770. "cmp r9, #0x100\n\t"
  14771. "blt L_sp_2048_mont_reduce_64_word_%=\n\t"
  14772. /* Loop Done */
  14773. "str r12, [%[a]]\n\t"
  14774. "str lr, [%[a], #4]\n\t"
  14775. "mov %[mp], r3\n\t"
  14776. : [a] "+r" (a), [m] "+r" (m), [mp] "+r" (mp)
  14777. :
  14778. : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "cc"
  14779. );
  14780. sp_2048_cond_sub_64(a - 64, a, m, (sp_digit)0 - mp);
  14781. }
  14782. #else
  14783. /* Reduce the number back to 2048 bits using Montgomery reduction.
  14784. *
  14785. * a A single precision number to reduce in place.
  14786. * m The single precision number representing the modulus.
  14787. * mp The digit representing the negative inverse of m mod 2^n.
  14788. */
  14789. static SP_NOINLINE void sp_2048_mont_reduce_64(sp_digit* a_p, const sp_digit* m_p, sp_digit mp_p)
  14790. {
  14791. register sp_digit* a asm ("r0") = (sp_digit*)a_p;
  14792. register const sp_digit* m asm ("r1") = (const sp_digit*)m_p;
  14793. register sp_digit mp asm ("r2") = (sp_digit)mp_p;
  14794. __asm__ __volatile__ (
  14795. /* i = 0 */
  14796. "mov r12, #0\n\t"
  14797. "mov lr, #0\n\t"
  14798. "ldr r4, [%[a]]\n\t"
  14799. "ldr r5, [%[a], #4]\n\t"
  14800. "ldr r6, [%[a], #8]\n\t"
  14801. "ldr r7, [%[a], #12]\n\t"
  14802. "ldr r8, [%[a], #16]\n\t"
  14803. "\n"
  14804. "L_sp_2048_mont_reduce_64_word_%=: \n\t"
  14805. /* mu = a[i] * mp */
  14806. "mul r11, %[mp], r4\n\t"
  14807. /* a[i+0] += m[0] * mu */
  14808. "ldr r10, [%[m]]\n\t"
  14809. "mov r3, #0\n\t"
  14810. "umaal r4, r3, r11, r10\n\t"
  14811. /* a[i+1] += m[1] * mu */
  14812. "ldr r10, [%[m], #4]\n\t"
  14813. "mov r4, r5\n\t"
  14814. "umaal r4, r3, r11, r10\n\t"
  14815. /* a[i+2] += m[2] * mu */
  14816. "ldr r10, [%[m], #8]\n\t"
  14817. "mov r5, r6\n\t"
  14818. "umaal r5, r3, r11, r10\n\t"
  14819. /* a[i+3] += m[3] * mu */
  14820. "ldr r10, [%[m], #12]\n\t"
  14821. "mov r6, r7\n\t"
  14822. "umaal r6, r3, r11, r10\n\t"
  14823. /* a[i+4] += m[4] * mu */
  14824. "ldr r10, [%[m], #16]\n\t"
  14825. "mov r7, r8\n\t"
  14826. "umaal r7, r3, r11, r10\n\t"
  14827. /* a[i+5] += m[5] * mu */
  14828. "ldr r10, [%[m], #20]\n\t"
  14829. "ldr r8, [%[a], #20]\n\t"
  14830. "umaal r8, r3, r11, r10\n\t"
  14831. /* a[i+6] += m[6] * mu */
  14832. "ldr r10, [%[m], #24]\n\t"
  14833. "ldr r9, [%[a], #24]\n\t"
  14834. "umaal r9, r3, r11, r10\n\t"
  14835. "str r9, [%[a], #24]\n\t"
  14836. /* a[i+7] += m[7] * mu */
  14837. "ldr r10, [%[m], #28]\n\t"
  14838. "ldr r9, [%[a], #28]\n\t"
  14839. "umaal r9, r3, r11, r10\n\t"
  14840. "str r9, [%[a], #28]\n\t"
  14841. /* a[i+8] += m[8] * mu */
  14842. "ldr r10, [%[m], #32]\n\t"
  14843. "ldr r9, [%[a], #32]\n\t"
  14844. "umaal r9, r3, r11, r10\n\t"
  14845. "str r9, [%[a], #32]\n\t"
  14846. /* a[i+9] += m[9] * mu */
  14847. "ldr r10, [%[m], #36]\n\t"
  14848. "ldr r9, [%[a], #36]\n\t"
  14849. "umaal r9, r3, r11, r10\n\t"
  14850. "str r9, [%[a], #36]\n\t"
  14851. /* a[i+10] += m[10] * mu */
  14852. "ldr r10, [%[m], #40]\n\t"
  14853. "ldr r9, [%[a], #40]\n\t"
  14854. "umaal r9, r3, r11, r10\n\t"
  14855. "str r9, [%[a], #40]\n\t"
  14856. /* a[i+11] += m[11] * mu */
  14857. "ldr r10, [%[m], #44]\n\t"
  14858. "ldr r9, [%[a], #44]\n\t"
  14859. "umaal r9, r3, r11, r10\n\t"
  14860. "str r9, [%[a], #44]\n\t"
  14861. /* a[i+12] += m[12] * mu */
  14862. "ldr r10, [%[m], #48]\n\t"
  14863. "ldr r9, [%[a], #48]\n\t"
  14864. "umaal r9, r3, r11, r10\n\t"
  14865. "str r9, [%[a], #48]\n\t"
  14866. /* a[i+13] += m[13] * mu */
  14867. "ldr r10, [%[m], #52]\n\t"
  14868. "ldr r9, [%[a], #52]\n\t"
  14869. "umaal r9, r3, r11, r10\n\t"
  14870. "str r9, [%[a], #52]\n\t"
  14871. /* a[i+14] += m[14] * mu */
  14872. "ldr r10, [%[m], #56]\n\t"
  14873. "ldr r9, [%[a], #56]\n\t"
  14874. "umaal r9, r3, r11, r10\n\t"
  14875. "str r9, [%[a], #56]\n\t"
  14876. /* a[i+15] += m[15] * mu */
  14877. "ldr r10, [%[m], #60]\n\t"
  14878. "ldr r9, [%[a], #60]\n\t"
  14879. "umaal r9, r3, r11, r10\n\t"
  14880. "str r9, [%[a], #60]\n\t"
  14881. /* a[i+16] += m[16] * mu */
  14882. "ldr r10, [%[m], #64]\n\t"
  14883. "ldr r9, [%[a], #64]\n\t"
  14884. "umaal r9, r3, r11, r10\n\t"
  14885. "str r9, [%[a], #64]\n\t"
  14886. /* a[i+17] += m[17] * mu */
  14887. "ldr r10, [%[m], #68]\n\t"
  14888. "ldr r9, [%[a], #68]\n\t"
  14889. "umaal r9, r3, r11, r10\n\t"
  14890. "str r9, [%[a], #68]\n\t"
  14891. /* a[i+18] += m[18] * mu */
  14892. "ldr r10, [%[m], #72]\n\t"
  14893. "ldr r9, [%[a], #72]\n\t"
  14894. "umaal r9, r3, r11, r10\n\t"
  14895. "str r9, [%[a], #72]\n\t"
  14896. /* a[i+19] += m[19] * mu */
  14897. "ldr r10, [%[m], #76]\n\t"
  14898. "ldr r9, [%[a], #76]\n\t"
  14899. "umaal r9, r3, r11, r10\n\t"
  14900. "str r9, [%[a], #76]\n\t"
  14901. /* a[i+20] += m[20] * mu */
  14902. "ldr r10, [%[m], #80]\n\t"
  14903. "ldr r9, [%[a], #80]\n\t"
  14904. "umaal r9, r3, r11, r10\n\t"
  14905. "str r9, [%[a], #80]\n\t"
  14906. /* a[i+21] += m[21] * mu */
  14907. "ldr r10, [%[m], #84]\n\t"
  14908. "ldr r9, [%[a], #84]\n\t"
  14909. "umaal r9, r3, r11, r10\n\t"
  14910. "str r9, [%[a], #84]\n\t"
  14911. /* a[i+22] += m[22] * mu */
  14912. "ldr r10, [%[m], #88]\n\t"
  14913. "ldr r9, [%[a], #88]\n\t"
  14914. "umaal r9, r3, r11, r10\n\t"
  14915. "str r9, [%[a], #88]\n\t"
  14916. /* a[i+23] += m[23] * mu */
  14917. "ldr r10, [%[m], #92]\n\t"
  14918. "ldr r9, [%[a], #92]\n\t"
  14919. "umaal r9, r3, r11, r10\n\t"
  14920. "str r9, [%[a], #92]\n\t"
  14921. /* a[i+24] += m[24] * mu */
  14922. "ldr r10, [%[m], #96]\n\t"
  14923. "ldr r9, [%[a], #96]\n\t"
  14924. "umaal r9, r3, r11, r10\n\t"
  14925. "str r9, [%[a], #96]\n\t"
  14926. /* a[i+25] += m[25] * mu */
  14927. "ldr r10, [%[m], #100]\n\t"
  14928. "ldr r9, [%[a], #100]\n\t"
  14929. "umaal r9, r3, r11, r10\n\t"
  14930. "str r9, [%[a], #100]\n\t"
  14931. /* a[i+26] += m[26] * mu */
  14932. "ldr r10, [%[m], #104]\n\t"
  14933. "ldr r9, [%[a], #104]\n\t"
  14934. "umaal r9, r3, r11, r10\n\t"
  14935. "str r9, [%[a], #104]\n\t"
  14936. /* a[i+27] += m[27] * mu */
  14937. "ldr r10, [%[m], #108]\n\t"
  14938. "ldr r9, [%[a], #108]\n\t"
  14939. "umaal r9, r3, r11, r10\n\t"
  14940. "str r9, [%[a], #108]\n\t"
  14941. /* a[i+28] += m[28] * mu */
  14942. "ldr r10, [%[m], #112]\n\t"
  14943. "ldr r9, [%[a], #112]\n\t"
  14944. "umaal r9, r3, r11, r10\n\t"
  14945. "str r9, [%[a], #112]\n\t"
  14946. /* a[i+29] += m[29] * mu */
  14947. "ldr r10, [%[m], #116]\n\t"
  14948. "ldr r9, [%[a], #116]\n\t"
  14949. "umaal r9, r3, r11, r10\n\t"
  14950. "str r9, [%[a], #116]\n\t"
  14951. /* a[i+30] += m[30] * mu */
  14952. "ldr r10, [%[m], #120]\n\t"
  14953. "ldr r9, [%[a], #120]\n\t"
  14954. "umaal r9, r3, r11, r10\n\t"
  14955. "str r9, [%[a], #120]\n\t"
  14956. /* a[i+31] += m[31] * mu */
  14957. "ldr r10, [%[m], #124]\n\t"
  14958. "ldr r9, [%[a], #124]\n\t"
  14959. "umaal r9, r3, r11, r10\n\t"
  14960. "str r9, [%[a], #124]\n\t"
  14961. /* a[i+32] += m[32] * mu */
  14962. "ldr r10, [%[m], #128]\n\t"
  14963. "ldr r9, [%[a], #128]\n\t"
  14964. "umaal r9, r3, r11, r10\n\t"
  14965. "str r9, [%[a], #128]\n\t"
  14966. /* a[i+33] += m[33] * mu */
  14967. "ldr r10, [%[m], #132]\n\t"
  14968. "ldr r9, [%[a], #132]\n\t"
  14969. "umaal r9, r3, r11, r10\n\t"
  14970. "str r9, [%[a], #132]\n\t"
  14971. /* a[i+34] += m[34] * mu */
  14972. "ldr r10, [%[m], #136]\n\t"
  14973. "ldr r9, [%[a], #136]\n\t"
  14974. "umaal r9, r3, r11, r10\n\t"
  14975. "str r9, [%[a], #136]\n\t"
  14976. /* a[i+35] += m[35] * mu */
  14977. "ldr r10, [%[m], #140]\n\t"
  14978. "ldr r9, [%[a], #140]\n\t"
  14979. "umaal r9, r3, r11, r10\n\t"
  14980. "str r9, [%[a], #140]\n\t"
  14981. /* a[i+36] += m[36] * mu */
  14982. "ldr r10, [%[m], #144]\n\t"
  14983. "ldr r9, [%[a], #144]\n\t"
  14984. "umaal r9, r3, r11, r10\n\t"
  14985. "str r9, [%[a], #144]\n\t"
  14986. /* a[i+37] += m[37] * mu */
  14987. "ldr r10, [%[m], #148]\n\t"
  14988. "ldr r9, [%[a], #148]\n\t"
  14989. "umaal r9, r3, r11, r10\n\t"
  14990. "str r9, [%[a], #148]\n\t"
  14991. /* a[i+38] += m[38] * mu */
  14992. "ldr r10, [%[m], #152]\n\t"
  14993. "ldr r9, [%[a], #152]\n\t"
  14994. "umaal r9, r3, r11, r10\n\t"
  14995. "str r9, [%[a], #152]\n\t"
  14996. /* a[i+39] += m[39] * mu */
  14997. "ldr r10, [%[m], #156]\n\t"
  14998. "ldr r9, [%[a], #156]\n\t"
  14999. "umaal r9, r3, r11, r10\n\t"
  15000. "str r9, [%[a], #156]\n\t"
  15001. /* a[i+40] += m[40] * mu */
  15002. "ldr r10, [%[m], #160]\n\t"
  15003. "ldr r9, [%[a], #160]\n\t"
  15004. "umaal r9, r3, r11, r10\n\t"
  15005. "str r9, [%[a], #160]\n\t"
  15006. /* a[i+41] += m[41] * mu */
  15007. "ldr r10, [%[m], #164]\n\t"
  15008. "ldr r9, [%[a], #164]\n\t"
  15009. "umaal r9, r3, r11, r10\n\t"
  15010. "str r9, [%[a], #164]\n\t"
  15011. /* a[i+42] += m[42] * mu */
  15012. "ldr r10, [%[m], #168]\n\t"
  15013. "ldr r9, [%[a], #168]\n\t"
  15014. "umaal r9, r3, r11, r10\n\t"
  15015. "str r9, [%[a], #168]\n\t"
  15016. /* a[i+43] += m[43] * mu */
  15017. "ldr r10, [%[m], #172]\n\t"
  15018. "ldr r9, [%[a], #172]\n\t"
  15019. "umaal r9, r3, r11, r10\n\t"
  15020. "str r9, [%[a], #172]\n\t"
  15021. /* a[i+44] += m[44] * mu */
  15022. "ldr r10, [%[m], #176]\n\t"
  15023. "ldr r9, [%[a], #176]\n\t"
  15024. "umaal r9, r3, r11, r10\n\t"
  15025. "str r9, [%[a], #176]\n\t"
  15026. /* a[i+45] += m[45] * mu */
  15027. "ldr r10, [%[m], #180]\n\t"
  15028. "ldr r9, [%[a], #180]\n\t"
  15029. "umaal r9, r3, r11, r10\n\t"
  15030. "str r9, [%[a], #180]\n\t"
  15031. /* a[i+46] += m[46] * mu */
  15032. "ldr r10, [%[m], #184]\n\t"
  15033. "ldr r9, [%[a], #184]\n\t"
  15034. "umaal r9, r3, r11, r10\n\t"
  15035. "str r9, [%[a], #184]\n\t"
  15036. /* a[i+47] += m[47] * mu */
  15037. "ldr r10, [%[m], #188]\n\t"
  15038. "ldr r9, [%[a], #188]\n\t"
  15039. "umaal r9, r3, r11, r10\n\t"
  15040. "str r9, [%[a], #188]\n\t"
  15041. /* a[i+48] += m[48] * mu */
  15042. "ldr r10, [%[m], #192]\n\t"
  15043. "ldr r9, [%[a], #192]\n\t"
  15044. "umaal r9, r3, r11, r10\n\t"
  15045. "str r9, [%[a], #192]\n\t"
  15046. /* a[i+49] += m[49] * mu */
  15047. "ldr r10, [%[m], #196]\n\t"
  15048. "ldr r9, [%[a], #196]\n\t"
  15049. "umaal r9, r3, r11, r10\n\t"
  15050. "str r9, [%[a], #196]\n\t"
  15051. /* a[i+50] += m[50] * mu */
  15052. "ldr r10, [%[m], #200]\n\t"
  15053. "ldr r9, [%[a], #200]\n\t"
  15054. "umaal r9, r3, r11, r10\n\t"
  15055. "str r9, [%[a], #200]\n\t"
  15056. /* a[i+51] += m[51] * mu */
  15057. "ldr r10, [%[m], #204]\n\t"
  15058. "ldr r9, [%[a], #204]\n\t"
  15059. "umaal r9, r3, r11, r10\n\t"
  15060. "str r9, [%[a], #204]\n\t"
  15061. /* a[i+52] += m[52] * mu */
  15062. "ldr r10, [%[m], #208]\n\t"
  15063. "ldr r9, [%[a], #208]\n\t"
  15064. "umaal r9, r3, r11, r10\n\t"
  15065. "str r9, [%[a], #208]\n\t"
  15066. /* a[i+53] += m[53] * mu */
  15067. "ldr r10, [%[m], #212]\n\t"
  15068. "ldr r9, [%[a], #212]\n\t"
  15069. "umaal r9, r3, r11, r10\n\t"
  15070. "str r9, [%[a], #212]\n\t"
  15071. /* a[i+54] += m[54] * mu */
  15072. "ldr r10, [%[m], #216]\n\t"
  15073. "ldr r9, [%[a], #216]\n\t"
  15074. "umaal r9, r3, r11, r10\n\t"
  15075. "str r9, [%[a], #216]\n\t"
  15076. /* a[i+55] += m[55] * mu */
  15077. "ldr r10, [%[m], #220]\n\t"
  15078. "ldr r9, [%[a], #220]\n\t"
  15079. "umaal r9, r3, r11, r10\n\t"
  15080. "str r9, [%[a], #220]\n\t"
  15081. /* a[i+56] += m[56] * mu */
  15082. "ldr r10, [%[m], #224]\n\t"
  15083. "ldr r9, [%[a], #224]\n\t"
  15084. "umaal r9, r3, r11, r10\n\t"
  15085. "str r9, [%[a], #224]\n\t"
  15086. /* a[i+57] += m[57] * mu */
  15087. "ldr r10, [%[m], #228]\n\t"
  15088. "ldr r9, [%[a], #228]\n\t"
  15089. "umaal r9, r3, r11, r10\n\t"
  15090. "str r9, [%[a], #228]\n\t"
  15091. /* a[i+58] += m[58] * mu */
  15092. "ldr r10, [%[m], #232]\n\t"
  15093. "ldr r9, [%[a], #232]\n\t"
  15094. "umaal r9, r3, r11, r10\n\t"
  15095. "str r9, [%[a], #232]\n\t"
  15096. /* a[i+59] += m[59] * mu */
  15097. "ldr r10, [%[m], #236]\n\t"
  15098. "ldr r9, [%[a], #236]\n\t"
  15099. "umaal r9, r3, r11, r10\n\t"
  15100. "str r9, [%[a], #236]\n\t"
  15101. /* a[i+60] += m[60] * mu */
  15102. "ldr r10, [%[m], #240]\n\t"
  15103. "ldr r9, [%[a], #240]\n\t"
  15104. "umaal r9, r3, r11, r10\n\t"
  15105. "str r9, [%[a], #240]\n\t"
  15106. /* a[i+61] += m[61] * mu */
  15107. "ldr r10, [%[m], #244]\n\t"
  15108. "ldr r9, [%[a], #244]\n\t"
  15109. "umaal r9, r3, r11, r10\n\t"
  15110. "str r9, [%[a], #244]\n\t"
  15111. /* a[i+62] += m[62] * mu */
  15112. "ldr r10, [%[m], #248]\n\t"
  15113. "ldr r9, [%[a], #248]\n\t"
  15114. "umaal r9, r3, r11, r10\n\t"
  15115. "str r9, [%[a], #248]\n\t"
  15116. /* a[i+63] += m[63] * mu */
  15117. "ldr r10, [%[m], #252]\n\t"
  15118. "ldr r9, [%[a], #252]\n\t"
  15119. "umaal r9, r3, r11, r10\n\t"
  15120. "ldr r11, [%[a], #256]\n\t"
  15121. "mov r10, #0\n\t"
  15122. "umaal r3, r11, r10, r10\n\t"
  15123. "str r9, [%[a], #252]\n\t"
  15124. "adds r3, r3, lr\n\t"
  15125. "adc lr, r11, #0\n\t"
  15126. "str r3, [%[a], #256]\n\t"
  15127. /* i += 1 */
  15128. "add r12, r12, #4\n\t"
  15129. "add %[a], %[a], #4\n\t"
  15130. "cmp r12, #0x100\n\t"
  15131. "blt L_sp_2048_mont_reduce_64_word_%=\n\t"
  15132. /* Loop Done */
  15133. "str r4, [%[a]]\n\t"
  15134. "str r5, [%[a], #4]\n\t"
  15135. "str r6, [%[a], #8]\n\t"
  15136. "str r7, [%[a], #12]\n\t"
  15137. "str r8, [%[a], #16]\n\t"
  15138. "mov %[mp], lr\n\t"
  15139. : [a] "+r" (a), [m] "+r" (m), [mp] "+r" (mp)
  15140. :
  15141. : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "cc"
  15142. );
  15143. sp_2048_cond_sub_64(a - 64, a, m, (sp_digit)0 - mp);
  15144. }
  15145. #endif
  15146. /* Multiply two Montgomery form numbers mod the modulus (prime).
  15147. * (r = a * b mod m)
  15148. *
  15149. * r Result of multiplication.
  15150. * a First number to multiply in Montgomery form.
  15151. * b Second number to multiply in Montgomery form.
  15152. * m Modulus (prime).
  15153. * mp Montgomery multiplier.
  15154. */
  15155. SP_NOINLINE static void sp_2048_mont_mul_64(sp_digit* r, const sp_digit* a,
  15156. const sp_digit* b, const sp_digit* m, sp_digit mp)
  15157. {
  15158. sp_2048_mul_64(r, a, b);
  15159. sp_2048_mont_reduce_64(r, m, mp);
  15160. }
  15161. /* Square the Montgomery form number. (r = a * a mod m)
  15162. *
  15163. * r Result of squaring.
  15164. * a Number to square in Montgomery form.
  15165. * m Modulus (prime).
  15166. * mp Montgomery multiplier.
  15167. */
  15168. SP_NOINLINE static void sp_2048_mont_sqr_64(sp_digit* r, const sp_digit* a,
  15169. const sp_digit* m, sp_digit mp)
  15170. {
  15171. sp_2048_sqr_64(r, a);
  15172. sp_2048_mont_reduce_64(r, m, mp);
  15173. }
  15174. #ifdef WOLFSSL_SP_SMALL
  15175. /* Sub b from a into r. (r = a - b)
  15176. *
  15177. * r A single precision integer.
  15178. * a A single precision integer.
  15179. * b A single precision integer.
  15180. */
  15181. static sp_digit sp_2048_sub_64(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p)
  15182. {
  15183. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  15184. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  15185. register const sp_digit* b asm ("r2") = (const sp_digit*)b_p;
  15186. __asm__ __volatile__ (
  15187. "mov r12, #0\n\t"
  15188. "add lr, %[a], #0x100\n\t"
  15189. "\n"
  15190. "L_sp_2048_sub_64_word_%=: \n\t"
  15191. "rsbs r12, r12, #0\n\t"
  15192. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  15193. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  15194. "sbcs r3, r3, r7\n\t"
  15195. "sbcs r4, r4, r8\n\t"
  15196. "sbcs r5, r5, r9\n\t"
  15197. "sbcs r6, r6, r10\n\t"
  15198. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  15199. "sbc r12, r3, r3\n\t"
  15200. "cmp %[a], lr\n\t"
  15201. "bne L_sp_2048_sub_64_word_%=\n\t"
  15202. "mov %[r], r12\n\t"
  15203. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  15204. :
  15205. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r12", "lr", "cc"
  15206. );
  15207. return (uint32_t)(size_t)r;
  15208. }
  15209. #else
  15210. /* Sub b from a into r. (r = a - b)
  15211. *
  15212. * r A single precision integer.
  15213. * a A single precision integer.
  15214. * b A single precision integer.
  15215. */
  15216. static sp_digit sp_2048_sub_64(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p)
  15217. {
  15218. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  15219. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  15220. register const sp_digit* b asm ("r2") = (const sp_digit*)b_p;
  15221. __asm__ __volatile__ (
  15222. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  15223. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  15224. "subs r3, r3, r7\n\t"
  15225. "sbcs r4, r4, r8\n\t"
  15226. "sbcs r5, r5, r9\n\t"
  15227. "sbcs r6, r6, r10\n\t"
  15228. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  15229. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  15230. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  15231. "sbcs r3, r3, r7\n\t"
  15232. "sbcs r4, r4, r8\n\t"
  15233. "sbcs r5, r5, r9\n\t"
  15234. "sbcs r6, r6, r10\n\t"
  15235. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  15236. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  15237. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  15238. "sbcs r3, r3, r7\n\t"
  15239. "sbcs r4, r4, r8\n\t"
  15240. "sbcs r5, r5, r9\n\t"
  15241. "sbcs r6, r6, r10\n\t"
  15242. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  15243. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  15244. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  15245. "sbcs r3, r3, r7\n\t"
  15246. "sbcs r4, r4, r8\n\t"
  15247. "sbcs r5, r5, r9\n\t"
  15248. "sbcs r6, r6, r10\n\t"
  15249. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  15250. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  15251. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  15252. "sbcs r3, r3, r7\n\t"
  15253. "sbcs r4, r4, r8\n\t"
  15254. "sbcs r5, r5, r9\n\t"
  15255. "sbcs r6, r6, r10\n\t"
  15256. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  15257. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  15258. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  15259. "sbcs r3, r3, r7\n\t"
  15260. "sbcs r4, r4, r8\n\t"
  15261. "sbcs r5, r5, r9\n\t"
  15262. "sbcs r6, r6, r10\n\t"
  15263. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  15264. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  15265. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  15266. "sbcs r3, r3, r7\n\t"
  15267. "sbcs r4, r4, r8\n\t"
  15268. "sbcs r5, r5, r9\n\t"
  15269. "sbcs r6, r6, r10\n\t"
  15270. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  15271. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  15272. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  15273. "sbcs r3, r3, r7\n\t"
  15274. "sbcs r4, r4, r8\n\t"
  15275. "sbcs r5, r5, r9\n\t"
  15276. "sbcs r6, r6, r10\n\t"
  15277. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  15278. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  15279. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  15280. "sbcs r3, r3, r7\n\t"
  15281. "sbcs r4, r4, r8\n\t"
  15282. "sbcs r5, r5, r9\n\t"
  15283. "sbcs r6, r6, r10\n\t"
  15284. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  15285. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  15286. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  15287. "sbcs r3, r3, r7\n\t"
  15288. "sbcs r4, r4, r8\n\t"
  15289. "sbcs r5, r5, r9\n\t"
  15290. "sbcs r6, r6, r10\n\t"
  15291. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  15292. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  15293. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  15294. "sbcs r3, r3, r7\n\t"
  15295. "sbcs r4, r4, r8\n\t"
  15296. "sbcs r5, r5, r9\n\t"
  15297. "sbcs r6, r6, r10\n\t"
  15298. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  15299. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  15300. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  15301. "sbcs r3, r3, r7\n\t"
  15302. "sbcs r4, r4, r8\n\t"
  15303. "sbcs r5, r5, r9\n\t"
  15304. "sbcs r6, r6, r10\n\t"
  15305. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  15306. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  15307. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  15308. "sbcs r3, r3, r7\n\t"
  15309. "sbcs r4, r4, r8\n\t"
  15310. "sbcs r5, r5, r9\n\t"
  15311. "sbcs r6, r6, r10\n\t"
  15312. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  15313. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  15314. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  15315. "sbcs r3, r3, r7\n\t"
  15316. "sbcs r4, r4, r8\n\t"
  15317. "sbcs r5, r5, r9\n\t"
  15318. "sbcs r6, r6, r10\n\t"
  15319. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  15320. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  15321. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  15322. "sbcs r3, r3, r7\n\t"
  15323. "sbcs r4, r4, r8\n\t"
  15324. "sbcs r5, r5, r9\n\t"
  15325. "sbcs r6, r6, r10\n\t"
  15326. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  15327. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  15328. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  15329. "sbcs r3, r3, r7\n\t"
  15330. "sbcs r4, r4, r8\n\t"
  15331. "sbcs r5, r5, r9\n\t"
  15332. "sbcs r6, r6, r10\n\t"
  15333. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  15334. "sbc %[r], r6, r6\n\t"
  15335. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  15336. :
  15337. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "cc"
  15338. );
  15339. return (uint32_t)(size_t)r;
  15340. }
  15341. #endif /* WOLFSSL_SP_SMALL */
  15342. #ifdef WOLFSSL_SP_USE_UDIV
  15343. /* Divide the double width number (d1|d0) by the divisor. (d1|d0 / div)
  15344. *
  15345. * d1 The high order half of the number to divide.
  15346. * d0 The low order half of the number to divide.
  15347. * div The divisor.
  15348. * returns the result of the division.
  15349. *
  15350. * Note that this is an approximate div. It may give an answer 1 larger.
  15351. */
  15352. static sp_digit div_2048_word_64(sp_digit d1_p, sp_digit d0_p, sp_digit div_p)
  15353. {
  15354. register sp_digit d1 asm ("r0") = (sp_digit)d1_p;
  15355. register sp_digit d0 asm ("r1") = (sp_digit)d0_p;
  15356. register sp_digit div asm ("r2") = (sp_digit)div_p;
  15357. __asm__ __volatile__ (
  15358. "lsr r6, %[div], #16\n\t"
  15359. "add lr, r6, #1\n\t"
  15360. "udiv r4, %[d1], lr\n\t"
  15361. "lsl r5, %[div], #16\n\t"
  15362. "lsl r4, r4, #16\n\t"
  15363. "umull r3, r12, %[div], r4\n\t"
  15364. "subs %[d0], %[d0], r3\n\t"
  15365. "sbc %[d1], %[d1], r12\n\t"
  15366. "subs r3, %[d1], lr\n\t"
  15367. "sbc r7, r7, r7\n\t"
  15368. "add r7, r7, #1\n\t"
  15369. "rsb r8, r7, #0\n\t"
  15370. "lsl r7, r7, #16\n\t"
  15371. "and r5, r5, r8\n\t"
  15372. "and r6, r6, r8\n\t"
  15373. "subs %[d0], %[d0], r5\n\t"
  15374. "add r4, r4, r7\n\t"
  15375. "sbc %[d1], %[d1], r6\n\t"
  15376. "lsl r12, %[d1], #16\n\t"
  15377. "lsr r3, %[d0], #16\n\t"
  15378. "orr r3, r3, r12\n\t"
  15379. "udiv r3, r3, lr\n\t"
  15380. "add r4, r4, r3\n\t"
  15381. "umull r3, r12, %[div], r3\n\t"
  15382. "subs %[d0], %[d0], r3\n\t"
  15383. "sbc %[d1], %[d1], r12\n\t"
  15384. "lsl r12, %[d1], #16\n\t"
  15385. "lsr r3, %[d0], #16\n\t"
  15386. "orr r3, r3, r12\n\t"
  15387. "udiv r3, r3, lr\n\t"
  15388. "add r4, r4, r3\n\t"
  15389. "mul r3, %[div], r3\n\t"
  15390. "sub %[d0], %[d0], r3\n\t"
  15391. "udiv r3, %[d0], %[div]\n\t"
  15392. "add %[d1], r4, r3\n\t"
  15393. : [d1] "+r" (d1), [d0] "+r" (d0), [div] "+r" (div)
  15394. :
  15395. : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8", "cc"
  15396. );
  15397. return (uint32_t)(size_t)d1;
  15398. }
  15399. #else
  15400. /* Divide the double width number (d1|d0) by the divisor. (d1|d0 / div)
  15401. *
  15402. * d1 The high order half of the number to divide.
  15403. * d0 The low order half of the number to divide.
  15404. * div The divisor.
  15405. * returns the result of the division.
  15406. *
  15407. * Note that this is an approximate div. It may give an answer 1 larger.
  15408. */
  15409. static sp_digit div_2048_word_64(sp_digit d1_p, sp_digit d0_p, sp_digit div_p)
  15410. {
  15411. register sp_digit d1 asm ("r0") = (sp_digit)d1_p;
  15412. register sp_digit d0 asm ("r1") = (sp_digit)d0_p;
  15413. register sp_digit div asm ("r2") = (sp_digit)div_p;
  15414. __asm__ __volatile__ (
  15415. "lsr lr, %[div], #1\n\t"
  15416. "add lr, lr, #1\n\t"
  15417. "mov r4, %[d0]\n\t"
  15418. "mov r5, %[d1]\n\t"
  15419. /* Do top 32 */
  15420. "subs r6, lr, r5\n\t"
  15421. "sbc r6, r6, r6\n\t"
  15422. "mov r3, #0\n\t"
  15423. "sub r3, r3, r6\n\t"
  15424. "and r6, r6, lr\n\t"
  15425. "subs r5, r5, r6\n\t"
  15426. /* Next 30 bits */
  15427. "mov r12, #29\n\t"
  15428. "\n"
  15429. "L_div_2048_word_64_bit_%=: \n\t"
  15430. "lsls r4, r4, #1\n\t"
  15431. "adc r5, r5, r5\n\t"
  15432. "subs r6, lr, r5\n\t"
  15433. "sbc r6, r6, r6\n\t"
  15434. "add r3, r3, r3\n\t"
  15435. "sub r3, r3, r6\n\t"
  15436. "and r6, r6, lr\n\t"
  15437. "subs r5, r5, r6\n\t"
  15438. "subs r12, r12, #1\n\t"
  15439. "bpl L_div_2048_word_64_bit_%=\n\t"
  15440. "add r3, r3, r3\n\t"
  15441. "add r3, r3, #1\n\t"
  15442. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  15443. "lsl r7, r3, #16\n\t"
  15444. "lsl r4, %[div], #16\n\t"
  15445. "lsr r7, r7, #16\n\t"
  15446. "lsr r4, r4, #16\n\t"
  15447. "mul r4, r7, r4\n\t"
  15448. "lsr r8, %[div], #16\n\t"
  15449. "mul r7, r8, r7\n\t"
  15450. "lsr r5, r7, #16\n\t"
  15451. "lsl r7, r7, #16\n\t"
  15452. "adds r4, r4, r7\n\t"
  15453. "adc r5, r5, #0\n\t"
  15454. "lsr r7, r3, #16\n\t"
  15455. "mul r8, r7, r8\n\t"
  15456. "add r5, r5, r8\n\t"
  15457. "lsl r8, %[div], #16\n\t"
  15458. "lsr r8, r8, #16\n\t"
  15459. "mul r7, r8, r7\n\t"
  15460. "lsr r8, r7, #16\n\t"
  15461. "lsl r7, r7, #16\n\t"
  15462. "adds r4, r4, r7\n\t"
  15463. "adc r5, r5, r8\n\t"
  15464. #else
  15465. "umull r4, r5, r3, %[div]\n\t"
  15466. #endif
  15467. "subs r7, %[d0], r4\n\t"
  15468. "sbc r8, %[d1], r5\n\t"
  15469. "add r3, r3, r8\n\t"
  15470. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  15471. "lsl r7, r3, #16\n\t"
  15472. "lsl r4, %[div], #16\n\t"
  15473. "lsr r7, r7, #16\n\t"
  15474. "lsr r4, r4, #16\n\t"
  15475. "mul r4, r7, r4\n\t"
  15476. "lsr r8, %[div], #16\n\t"
  15477. "mul r7, r8, r7\n\t"
  15478. "lsr r5, r7, #16\n\t"
  15479. "lsl r7, r7, #16\n\t"
  15480. "adds r4, r4, r7\n\t"
  15481. "adc r5, r5, #0\n\t"
  15482. "lsr r7, r3, #16\n\t"
  15483. "mul r8, r7, r8\n\t"
  15484. "add r5, r5, r8\n\t"
  15485. "lsl r8, %[div], #16\n\t"
  15486. "lsr r8, r8, #16\n\t"
  15487. "mul r7, r8, r7\n\t"
  15488. "lsr r8, r7, #16\n\t"
  15489. "lsl r7, r7, #16\n\t"
  15490. "adds r4, r4, r7\n\t"
  15491. "adc r5, r5, r8\n\t"
  15492. #else
  15493. "umull r4, r5, r3, %[div]\n\t"
  15494. #endif
  15495. "subs r7, %[d0], r4\n\t"
  15496. "sbc r8, %[d1], r5\n\t"
  15497. "add r3, r3, r8\n\t"
  15498. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  15499. "lsl r7, r3, #16\n\t"
  15500. "lsl r4, %[div], #16\n\t"
  15501. "lsr r7, r7, #16\n\t"
  15502. "lsr r4, r4, #16\n\t"
  15503. "mul r4, r7, r4\n\t"
  15504. "lsr r8, %[div], #16\n\t"
  15505. "mul r7, r8, r7\n\t"
  15506. "lsr r5, r7, #16\n\t"
  15507. "lsl r7, r7, #16\n\t"
  15508. "adds r4, r4, r7\n\t"
  15509. "adc r5, r5, #0\n\t"
  15510. "lsr r7, r3, #16\n\t"
  15511. "mul r8, r7, r8\n\t"
  15512. "add r5, r5, r8\n\t"
  15513. "lsl r8, %[div], #16\n\t"
  15514. "lsr r8, r8, #16\n\t"
  15515. "mul r7, r8, r7\n\t"
  15516. "lsr r8, r7, #16\n\t"
  15517. "lsl r7, r7, #16\n\t"
  15518. "adds r4, r4, r7\n\t"
  15519. "adc r5, r5, r8\n\t"
  15520. #else
  15521. "umull r4, r5, r3, %[div]\n\t"
  15522. #endif
  15523. "subs r7, %[d0], r4\n\t"
  15524. "sbc r8, %[d1], r5\n\t"
  15525. "add r3, r3, r8\n\t"
  15526. "subs r6, %[div], r7\n\t"
  15527. "sbc r6, r6, r6\n\t"
  15528. "sub %[d1], r3, r6\n\t"
  15529. : [d1] "+r" (d1), [d0] "+r" (d0), [div] "+r" (div)
  15530. :
  15531. : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8", "cc"
  15532. );
  15533. return (uint32_t)(size_t)d1;
  15534. }
  15535. #endif
  15536. /* Divide d in a and put remainder into r (m*d + r = a)
  15537. * m is not calculated as it is not needed at this time.
  15538. *
  15539. * a Number to be divided.
  15540. * d Number to divide with.
  15541. * m Multiplier result.
  15542. * r Remainder from the division.
  15543. * returns MP_OKAY indicating success.
  15544. */
  15545. static WC_INLINE int sp_2048_div_64_cond(const sp_digit* a, const sp_digit* d,
  15546. sp_digit* m, sp_digit* r)
  15547. {
  15548. sp_digit t1[128], t2[65];
  15549. sp_digit div, r1;
  15550. int i;
  15551. (void)m;
  15552. div = d[63];
  15553. XMEMCPY(t1, a, sizeof(*t1) * 2 * 64);
  15554. for (i = 63; i > 0; i--) {
  15555. if (t1[i + 64] != d[i])
  15556. break;
  15557. }
  15558. if (t1[i + 64] >= d[i]) {
  15559. sp_2048_sub_in_place_64(&t1[64], d);
  15560. }
  15561. for (i = 63; i >= 0; i--) {
  15562. if (t1[64 + i] == div) {
  15563. r1 = SP_DIGIT_MAX;
  15564. }
  15565. else {
  15566. r1 = div_2048_word_64(t1[64 + i], t1[64 + i - 1], div);
  15567. }
  15568. sp_2048_mul_d_64(t2, d, r1);
  15569. t1[64 + i] += sp_2048_sub_in_place_64(&t1[i], t2);
  15570. t1[64 + i] -= t2[64];
  15571. if (t1[64 + i] != 0) {
  15572. t1[64 + i] += sp_2048_add_64(&t1[i], &t1[i], d);
  15573. if (t1[64 + i] != 0)
  15574. t1[64 + i] += sp_2048_add_64(&t1[i], &t1[i], d);
  15575. }
  15576. }
  15577. for (i = 63; i > 0; i--) {
  15578. if (t1[i] != d[i])
  15579. break;
  15580. }
  15581. if (t1[i] >= d[i]) {
  15582. sp_2048_sub_64(r, t1, d);
  15583. }
  15584. else {
  15585. XMEMCPY(r, t1, sizeof(*t1) * 64);
  15586. }
  15587. return MP_OKAY;
  15588. }
  15589. /* Reduce a modulo m into r. (r = a mod m)
  15590. *
  15591. * r A single precision number that is the reduced result.
  15592. * a A single precision number that is to be reduced.
  15593. * m A single precision number that is the modulus to reduce with.
  15594. * returns MP_OKAY indicating success.
  15595. */
  15596. static WC_INLINE int sp_2048_mod_64_cond(sp_digit* r, const sp_digit* a,
  15597. const sp_digit* m)
  15598. {
  15599. return sp_2048_div_64_cond(a, m, NULL, r);
  15600. }
  15601. #if (defined(WOLFSSL_HAVE_SP_RSA) && !defined(WOLFSSL_RSA_PUBLIC_ONLY)) || defined(WOLFSSL_HAVE_SP_DH)
  15602. #if defined(WOLFSSL_HAVE_SP_DH) || !defined(WOLFSSL_RSA_PUBLIC_ONLY)
  15603. /* AND m into each word of a and store in r.
  15604. *
  15605. * r A single precision integer.
  15606. * a A single precision integer.
  15607. * m Mask to AND against each digit.
  15608. */
  15609. static void sp_2048_mask_64(sp_digit* r, const sp_digit* a, sp_digit m)
  15610. {
  15611. #ifdef WOLFSSL_SP_SMALL
  15612. int i;
  15613. for (i=0; i<64; i++) {
  15614. r[i] = a[i] & m;
  15615. }
  15616. #else
  15617. int i;
  15618. for (i = 0; i < 64; i += 8) {
  15619. r[i+0] = a[i+0] & m;
  15620. r[i+1] = a[i+1] & m;
  15621. r[i+2] = a[i+2] & m;
  15622. r[i+3] = a[i+3] & m;
  15623. r[i+4] = a[i+4] & m;
  15624. r[i+5] = a[i+5] & m;
  15625. r[i+6] = a[i+6] & m;
  15626. r[i+7] = a[i+7] & m;
  15627. }
  15628. #endif
  15629. }
  15630. /* Compare a with b in constant time.
  15631. *
  15632. * a A single precision integer.
  15633. * b A single precision integer.
  15634. * return -ve, 0 or +ve if a is less than, equal to or greater than b
  15635. * respectively.
  15636. */
  15637. static sp_int32 sp_2048_cmp_64(const sp_digit* a_p, const sp_digit* b_p)
  15638. {
  15639. register const sp_digit* a asm ("r0") = (const sp_digit*)a_p;
  15640. register const sp_digit* b asm ("r1") = (const sp_digit*)b_p;
  15641. __asm__ __volatile__ (
  15642. "mov r2, #-1\n\t"
  15643. "mov r6, #1\n\t"
  15644. "mov r5, #0\n\t"
  15645. "mov r3, #-1\n\t"
  15646. #ifdef WOLFSSL_SP_SMALL
  15647. "mov r4, #0xfc\n\t"
  15648. "\n"
  15649. "L_sp_2048_cmp_64_words_%=: \n\t"
  15650. "ldr r12, [%[a], r4]\n\t"
  15651. "ldr lr, [%[b], r4]\n\t"
  15652. "and r12, r12, r3\n\t"
  15653. "and lr, lr, r3\n\t"
  15654. "subs r12, r12, lr\n\t"
  15655. "it hi\n\t"
  15656. "movhi r2, r6\n\t"
  15657. "it lo\n\t"
  15658. "movlo r2, r3\n\t"
  15659. "it ne\n\t"
  15660. "movne r3, r5\n\t"
  15661. "subs r4, r4, #4\n\t"
  15662. "bcs L_sp_2048_cmp_64_words_%=\n\t"
  15663. "eor r2, r2, r3\n\t"
  15664. #else
  15665. "ldr r12, [%[a], #252]\n\t"
  15666. "ldr lr, [%[b], #252]\n\t"
  15667. "and r12, r12, r3\n\t"
  15668. "and lr, lr, r3\n\t"
  15669. "subs r12, r12, lr\n\t"
  15670. "it hi\n\t"
  15671. "movhi r2, r6\n\t"
  15672. "it lo\n\t"
  15673. "movlo r2, r3\n\t"
  15674. "it ne\n\t"
  15675. "movne r3, r5\n\t"
  15676. "ldr r12, [%[a], #248]\n\t"
  15677. "ldr lr, [%[b], #248]\n\t"
  15678. "and r12, r12, r3\n\t"
  15679. "and lr, lr, r3\n\t"
  15680. "subs r12, r12, lr\n\t"
  15681. "it hi\n\t"
  15682. "movhi r2, r6\n\t"
  15683. "it lo\n\t"
  15684. "movlo r2, r3\n\t"
  15685. "it ne\n\t"
  15686. "movne r3, r5\n\t"
  15687. "ldr r12, [%[a], #244]\n\t"
  15688. "ldr lr, [%[b], #244]\n\t"
  15689. "and r12, r12, r3\n\t"
  15690. "and lr, lr, r3\n\t"
  15691. "subs r12, r12, lr\n\t"
  15692. "it hi\n\t"
  15693. "movhi r2, r6\n\t"
  15694. "it lo\n\t"
  15695. "movlo r2, r3\n\t"
  15696. "it ne\n\t"
  15697. "movne r3, r5\n\t"
  15698. "ldr r12, [%[a], #240]\n\t"
  15699. "ldr lr, [%[b], #240]\n\t"
  15700. "and r12, r12, r3\n\t"
  15701. "and lr, lr, r3\n\t"
  15702. "subs r12, r12, lr\n\t"
  15703. "it hi\n\t"
  15704. "movhi r2, r6\n\t"
  15705. "it lo\n\t"
  15706. "movlo r2, r3\n\t"
  15707. "it ne\n\t"
  15708. "movne r3, r5\n\t"
  15709. "ldr r12, [%[a], #236]\n\t"
  15710. "ldr lr, [%[b], #236]\n\t"
  15711. "and r12, r12, r3\n\t"
  15712. "and lr, lr, r3\n\t"
  15713. "subs r12, r12, lr\n\t"
  15714. "it hi\n\t"
  15715. "movhi r2, r6\n\t"
  15716. "it lo\n\t"
  15717. "movlo r2, r3\n\t"
  15718. "it ne\n\t"
  15719. "movne r3, r5\n\t"
  15720. "ldr r12, [%[a], #232]\n\t"
  15721. "ldr lr, [%[b], #232]\n\t"
  15722. "and r12, r12, r3\n\t"
  15723. "and lr, lr, r3\n\t"
  15724. "subs r12, r12, lr\n\t"
  15725. "it hi\n\t"
  15726. "movhi r2, r6\n\t"
  15727. "it lo\n\t"
  15728. "movlo r2, r3\n\t"
  15729. "it ne\n\t"
  15730. "movne r3, r5\n\t"
  15731. "ldr r12, [%[a], #228]\n\t"
  15732. "ldr lr, [%[b], #228]\n\t"
  15733. "and r12, r12, r3\n\t"
  15734. "and lr, lr, r3\n\t"
  15735. "subs r12, r12, lr\n\t"
  15736. "it hi\n\t"
  15737. "movhi r2, r6\n\t"
  15738. "it lo\n\t"
  15739. "movlo r2, r3\n\t"
  15740. "it ne\n\t"
  15741. "movne r3, r5\n\t"
  15742. "ldr r12, [%[a], #224]\n\t"
  15743. "ldr lr, [%[b], #224]\n\t"
  15744. "and r12, r12, r3\n\t"
  15745. "and lr, lr, r3\n\t"
  15746. "subs r12, r12, lr\n\t"
  15747. "it hi\n\t"
  15748. "movhi r2, r6\n\t"
  15749. "it lo\n\t"
  15750. "movlo r2, r3\n\t"
  15751. "it ne\n\t"
  15752. "movne r3, r5\n\t"
  15753. "ldr r12, [%[a], #220]\n\t"
  15754. "ldr lr, [%[b], #220]\n\t"
  15755. "and r12, r12, r3\n\t"
  15756. "and lr, lr, r3\n\t"
  15757. "subs r12, r12, lr\n\t"
  15758. "it hi\n\t"
  15759. "movhi r2, r6\n\t"
  15760. "it lo\n\t"
  15761. "movlo r2, r3\n\t"
  15762. "it ne\n\t"
  15763. "movne r3, r5\n\t"
  15764. "ldr r12, [%[a], #216]\n\t"
  15765. "ldr lr, [%[b], #216]\n\t"
  15766. "and r12, r12, r3\n\t"
  15767. "and lr, lr, r3\n\t"
  15768. "subs r12, r12, lr\n\t"
  15769. "it hi\n\t"
  15770. "movhi r2, r6\n\t"
  15771. "it lo\n\t"
  15772. "movlo r2, r3\n\t"
  15773. "it ne\n\t"
  15774. "movne r3, r5\n\t"
  15775. "ldr r12, [%[a], #212]\n\t"
  15776. "ldr lr, [%[b], #212]\n\t"
  15777. "and r12, r12, r3\n\t"
  15778. "and lr, lr, r3\n\t"
  15779. "subs r12, r12, lr\n\t"
  15780. "it hi\n\t"
  15781. "movhi r2, r6\n\t"
  15782. "it lo\n\t"
  15783. "movlo r2, r3\n\t"
  15784. "it ne\n\t"
  15785. "movne r3, r5\n\t"
  15786. "ldr r12, [%[a], #208]\n\t"
  15787. "ldr lr, [%[b], #208]\n\t"
  15788. "and r12, r12, r3\n\t"
  15789. "and lr, lr, r3\n\t"
  15790. "subs r12, r12, lr\n\t"
  15791. "it hi\n\t"
  15792. "movhi r2, r6\n\t"
  15793. "it lo\n\t"
  15794. "movlo r2, r3\n\t"
  15795. "it ne\n\t"
  15796. "movne r3, r5\n\t"
  15797. "ldr r12, [%[a], #204]\n\t"
  15798. "ldr lr, [%[b], #204]\n\t"
  15799. "and r12, r12, r3\n\t"
  15800. "and lr, lr, r3\n\t"
  15801. "subs r12, r12, lr\n\t"
  15802. "it hi\n\t"
  15803. "movhi r2, r6\n\t"
  15804. "it lo\n\t"
  15805. "movlo r2, r3\n\t"
  15806. "it ne\n\t"
  15807. "movne r3, r5\n\t"
  15808. "ldr r12, [%[a], #200]\n\t"
  15809. "ldr lr, [%[b], #200]\n\t"
  15810. "and r12, r12, r3\n\t"
  15811. "and lr, lr, r3\n\t"
  15812. "subs r12, r12, lr\n\t"
  15813. "it hi\n\t"
  15814. "movhi r2, r6\n\t"
  15815. "it lo\n\t"
  15816. "movlo r2, r3\n\t"
  15817. "it ne\n\t"
  15818. "movne r3, r5\n\t"
  15819. "ldr r12, [%[a], #196]\n\t"
  15820. "ldr lr, [%[b], #196]\n\t"
  15821. "and r12, r12, r3\n\t"
  15822. "and lr, lr, r3\n\t"
  15823. "subs r12, r12, lr\n\t"
  15824. "it hi\n\t"
  15825. "movhi r2, r6\n\t"
  15826. "it lo\n\t"
  15827. "movlo r2, r3\n\t"
  15828. "it ne\n\t"
  15829. "movne r3, r5\n\t"
  15830. "ldr r12, [%[a], #192]\n\t"
  15831. "ldr lr, [%[b], #192]\n\t"
  15832. "and r12, r12, r3\n\t"
  15833. "and lr, lr, r3\n\t"
  15834. "subs r12, r12, lr\n\t"
  15835. "it hi\n\t"
  15836. "movhi r2, r6\n\t"
  15837. "it lo\n\t"
  15838. "movlo r2, r3\n\t"
  15839. "it ne\n\t"
  15840. "movne r3, r5\n\t"
  15841. "ldr r12, [%[a], #188]\n\t"
  15842. "ldr lr, [%[b], #188]\n\t"
  15843. "and r12, r12, r3\n\t"
  15844. "and lr, lr, r3\n\t"
  15845. "subs r12, r12, lr\n\t"
  15846. "it hi\n\t"
  15847. "movhi r2, r6\n\t"
  15848. "it lo\n\t"
  15849. "movlo r2, r3\n\t"
  15850. "it ne\n\t"
  15851. "movne r3, r5\n\t"
  15852. "ldr r12, [%[a], #184]\n\t"
  15853. "ldr lr, [%[b], #184]\n\t"
  15854. "and r12, r12, r3\n\t"
  15855. "and lr, lr, r3\n\t"
  15856. "subs r12, r12, lr\n\t"
  15857. "it hi\n\t"
  15858. "movhi r2, r6\n\t"
  15859. "it lo\n\t"
  15860. "movlo r2, r3\n\t"
  15861. "it ne\n\t"
  15862. "movne r3, r5\n\t"
  15863. "ldr r12, [%[a], #180]\n\t"
  15864. "ldr lr, [%[b], #180]\n\t"
  15865. "and r12, r12, r3\n\t"
  15866. "and lr, lr, r3\n\t"
  15867. "subs r12, r12, lr\n\t"
  15868. "it hi\n\t"
  15869. "movhi r2, r6\n\t"
  15870. "it lo\n\t"
  15871. "movlo r2, r3\n\t"
  15872. "it ne\n\t"
  15873. "movne r3, r5\n\t"
  15874. "ldr r12, [%[a], #176]\n\t"
  15875. "ldr lr, [%[b], #176]\n\t"
  15876. "and r12, r12, r3\n\t"
  15877. "and lr, lr, r3\n\t"
  15878. "subs r12, r12, lr\n\t"
  15879. "it hi\n\t"
  15880. "movhi r2, r6\n\t"
  15881. "it lo\n\t"
  15882. "movlo r2, r3\n\t"
  15883. "it ne\n\t"
  15884. "movne r3, r5\n\t"
  15885. "ldr r12, [%[a], #172]\n\t"
  15886. "ldr lr, [%[b], #172]\n\t"
  15887. "and r12, r12, r3\n\t"
  15888. "and lr, lr, r3\n\t"
  15889. "subs r12, r12, lr\n\t"
  15890. "it hi\n\t"
  15891. "movhi r2, r6\n\t"
  15892. "it lo\n\t"
  15893. "movlo r2, r3\n\t"
  15894. "it ne\n\t"
  15895. "movne r3, r5\n\t"
  15896. "ldr r12, [%[a], #168]\n\t"
  15897. "ldr lr, [%[b], #168]\n\t"
  15898. "and r12, r12, r3\n\t"
  15899. "and lr, lr, r3\n\t"
  15900. "subs r12, r12, lr\n\t"
  15901. "it hi\n\t"
  15902. "movhi r2, r6\n\t"
  15903. "it lo\n\t"
  15904. "movlo r2, r3\n\t"
  15905. "it ne\n\t"
  15906. "movne r3, r5\n\t"
  15907. "ldr r12, [%[a], #164]\n\t"
  15908. "ldr lr, [%[b], #164]\n\t"
  15909. "and r12, r12, r3\n\t"
  15910. "and lr, lr, r3\n\t"
  15911. "subs r12, r12, lr\n\t"
  15912. "it hi\n\t"
  15913. "movhi r2, r6\n\t"
  15914. "it lo\n\t"
  15915. "movlo r2, r3\n\t"
  15916. "it ne\n\t"
  15917. "movne r3, r5\n\t"
  15918. "ldr r12, [%[a], #160]\n\t"
  15919. "ldr lr, [%[b], #160]\n\t"
  15920. "and r12, r12, r3\n\t"
  15921. "and lr, lr, r3\n\t"
  15922. "subs r12, r12, lr\n\t"
  15923. "it hi\n\t"
  15924. "movhi r2, r6\n\t"
  15925. "it lo\n\t"
  15926. "movlo r2, r3\n\t"
  15927. "it ne\n\t"
  15928. "movne r3, r5\n\t"
  15929. "ldr r12, [%[a], #156]\n\t"
  15930. "ldr lr, [%[b], #156]\n\t"
  15931. "and r12, r12, r3\n\t"
  15932. "and lr, lr, r3\n\t"
  15933. "subs r12, r12, lr\n\t"
  15934. "it hi\n\t"
  15935. "movhi r2, r6\n\t"
  15936. "it lo\n\t"
  15937. "movlo r2, r3\n\t"
  15938. "it ne\n\t"
  15939. "movne r3, r5\n\t"
  15940. "ldr r12, [%[a], #152]\n\t"
  15941. "ldr lr, [%[b], #152]\n\t"
  15942. "and r12, r12, r3\n\t"
  15943. "and lr, lr, r3\n\t"
  15944. "subs r12, r12, lr\n\t"
  15945. "it hi\n\t"
  15946. "movhi r2, r6\n\t"
  15947. "it lo\n\t"
  15948. "movlo r2, r3\n\t"
  15949. "it ne\n\t"
  15950. "movne r3, r5\n\t"
  15951. "ldr r12, [%[a], #148]\n\t"
  15952. "ldr lr, [%[b], #148]\n\t"
  15953. "and r12, r12, r3\n\t"
  15954. "and lr, lr, r3\n\t"
  15955. "subs r12, r12, lr\n\t"
  15956. "it hi\n\t"
  15957. "movhi r2, r6\n\t"
  15958. "it lo\n\t"
  15959. "movlo r2, r3\n\t"
  15960. "it ne\n\t"
  15961. "movne r3, r5\n\t"
  15962. "ldr r12, [%[a], #144]\n\t"
  15963. "ldr lr, [%[b], #144]\n\t"
  15964. "and r12, r12, r3\n\t"
  15965. "and lr, lr, r3\n\t"
  15966. "subs r12, r12, lr\n\t"
  15967. "it hi\n\t"
  15968. "movhi r2, r6\n\t"
  15969. "it lo\n\t"
  15970. "movlo r2, r3\n\t"
  15971. "it ne\n\t"
  15972. "movne r3, r5\n\t"
  15973. "ldr r12, [%[a], #140]\n\t"
  15974. "ldr lr, [%[b], #140]\n\t"
  15975. "and r12, r12, r3\n\t"
  15976. "and lr, lr, r3\n\t"
  15977. "subs r12, r12, lr\n\t"
  15978. "it hi\n\t"
  15979. "movhi r2, r6\n\t"
  15980. "it lo\n\t"
  15981. "movlo r2, r3\n\t"
  15982. "it ne\n\t"
  15983. "movne r3, r5\n\t"
  15984. "ldr r12, [%[a], #136]\n\t"
  15985. "ldr lr, [%[b], #136]\n\t"
  15986. "and r12, r12, r3\n\t"
  15987. "and lr, lr, r3\n\t"
  15988. "subs r12, r12, lr\n\t"
  15989. "it hi\n\t"
  15990. "movhi r2, r6\n\t"
  15991. "it lo\n\t"
  15992. "movlo r2, r3\n\t"
  15993. "it ne\n\t"
  15994. "movne r3, r5\n\t"
  15995. "ldr r12, [%[a], #132]\n\t"
  15996. "ldr lr, [%[b], #132]\n\t"
  15997. "and r12, r12, r3\n\t"
  15998. "and lr, lr, r3\n\t"
  15999. "subs r12, r12, lr\n\t"
  16000. "it hi\n\t"
  16001. "movhi r2, r6\n\t"
  16002. "it lo\n\t"
  16003. "movlo r2, r3\n\t"
  16004. "it ne\n\t"
  16005. "movne r3, r5\n\t"
  16006. "ldr r12, [%[a], #128]\n\t"
  16007. "ldr lr, [%[b], #128]\n\t"
  16008. "and r12, r12, r3\n\t"
  16009. "and lr, lr, r3\n\t"
  16010. "subs r12, r12, lr\n\t"
  16011. "it hi\n\t"
  16012. "movhi r2, r6\n\t"
  16013. "it lo\n\t"
  16014. "movlo r2, r3\n\t"
  16015. "it ne\n\t"
  16016. "movne r3, r5\n\t"
  16017. "ldr r12, [%[a], #124]\n\t"
  16018. "ldr lr, [%[b], #124]\n\t"
  16019. "and r12, r12, r3\n\t"
  16020. "and lr, lr, r3\n\t"
  16021. "subs r12, r12, lr\n\t"
  16022. "it hi\n\t"
  16023. "movhi r2, r6\n\t"
  16024. "it lo\n\t"
  16025. "movlo r2, r3\n\t"
  16026. "it ne\n\t"
  16027. "movne r3, r5\n\t"
  16028. "ldr r12, [%[a], #120]\n\t"
  16029. "ldr lr, [%[b], #120]\n\t"
  16030. "and r12, r12, r3\n\t"
  16031. "and lr, lr, r3\n\t"
  16032. "subs r12, r12, lr\n\t"
  16033. "it hi\n\t"
  16034. "movhi r2, r6\n\t"
  16035. "it lo\n\t"
  16036. "movlo r2, r3\n\t"
  16037. "it ne\n\t"
  16038. "movne r3, r5\n\t"
  16039. "ldr r12, [%[a], #116]\n\t"
  16040. "ldr lr, [%[b], #116]\n\t"
  16041. "and r12, r12, r3\n\t"
  16042. "and lr, lr, r3\n\t"
  16043. "subs r12, r12, lr\n\t"
  16044. "it hi\n\t"
  16045. "movhi r2, r6\n\t"
  16046. "it lo\n\t"
  16047. "movlo r2, r3\n\t"
  16048. "it ne\n\t"
  16049. "movne r3, r5\n\t"
  16050. "ldr r12, [%[a], #112]\n\t"
  16051. "ldr lr, [%[b], #112]\n\t"
  16052. "and r12, r12, r3\n\t"
  16053. "and lr, lr, r3\n\t"
  16054. "subs r12, r12, lr\n\t"
  16055. "it hi\n\t"
  16056. "movhi r2, r6\n\t"
  16057. "it lo\n\t"
  16058. "movlo r2, r3\n\t"
  16059. "it ne\n\t"
  16060. "movne r3, r5\n\t"
  16061. "ldr r12, [%[a], #108]\n\t"
  16062. "ldr lr, [%[b], #108]\n\t"
  16063. "and r12, r12, r3\n\t"
  16064. "and lr, lr, r3\n\t"
  16065. "subs r12, r12, lr\n\t"
  16066. "it hi\n\t"
  16067. "movhi r2, r6\n\t"
  16068. "it lo\n\t"
  16069. "movlo r2, r3\n\t"
  16070. "it ne\n\t"
  16071. "movne r3, r5\n\t"
  16072. "ldr r12, [%[a], #104]\n\t"
  16073. "ldr lr, [%[b], #104]\n\t"
  16074. "and r12, r12, r3\n\t"
  16075. "and lr, lr, r3\n\t"
  16076. "subs r12, r12, lr\n\t"
  16077. "it hi\n\t"
  16078. "movhi r2, r6\n\t"
  16079. "it lo\n\t"
  16080. "movlo r2, r3\n\t"
  16081. "it ne\n\t"
  16082. "movne r3, r5\n\t"
  16083. "ldr r12, [%[a], #100]\n\t"
  16084. "ldr lr, [%[b], #100]\n\t"
  16085. "and r12, r12, r3\n\t"
  16086. "and lr, lr, r3\n\t"
  16087. "subs r12, r12, lr\n\t"
  16088. "it hi\n\t"
  16089. "movhi r2, r6\n\t"
  16090. "it lo\n\t"
  16091. "movlo r2, r3\n\t"
  16092. "it ne\n\t"
  16093. "movne r3, r5\n\t"
  16094. "ldr r12, [%[a], #96]\n\t"
  16095. "ldr lr, [%[b], #96]\n\t"
  16096. "and r12, r12, r3\n\t"
  16097. "and lr, lr, r3\n\t"
  16098. "subs r12, r12, lr\n\t"
  16099. "it hi\n\t"
  16100. "movhi r2, r6\n\t"
  16101. "it lo\n\t"
  16102. "movlo r2, r3\n\t"
  16103. "it ne\n\t"
  16104. "movne r3, r5\n\t"
  16105. "ldr r12, [%[a], #92]\n\t"
  16106. "ldr lr, [%[b], #92]\n\t"
  16107. "and r12, r12, r3\n\t"
  16108. "and lr, lr, r3\n\t"
  16109. "subs r12, r12, lr\n\t"
  16110. "it hi\n\t"
  16111. "movhi r2, r6\n\t"
  16112. "it lo\n\t"
  16113. "movlo r2, r3\n\t"
  16114. "it ne\n\t"
  16115. "movne r3, r5\n\t"
  16116. "ldr r12, [%[a], #88]\n\t"
  16117. "ldr lr, [%[b], #88]\n\t"
  16118. "and r12, r12, r3\n\t"
  16119. "and lr, lr, r3\n\t"
  16120. "subs r12, r12, lr\n\t"
  16121. "it hi\n\t"
  16122. "movhi r2, r6\n\t"
  16123. "it lo\n\t"
  16124. "movlo r2, r3\n\t"
  16125. "it ne\n\t"
  16126. "movne r3, r5\n\t"
  16127. "ldr r12, [%[a], #84]\n\t"
  16128. "ldr lr, [%[b], #84]\n\t"
  16129. "and r12, r12, r3\n\t"
  16130. "and lr, lr, r3\n\t"
  16131. "subs r12, r12, lr\n\t"
  16132. "it hi\n\t"
  16133. "movhi r2, r6\n\t"
  16134. "it lo\n\t"
  16135. "movlo r2, r3\n\t"
  16136. "it ne\n\t"
  16137. "movne r3, r5\n\t"
  16138. "ldr r12, [%[a], #80]\n\t"
  16139. "ldr lr, [%[b], #80]\n\t"
  16140. "and r12, r12, r3\n\t"
  16141. "and lr, lr, r3\n\t"
  16142. "subs r12, r12, lr\n\t"
  16143. "it hi\n\t"
  16144. "movhi r2, r6\n\t"
  16145. "it lo\n\t"
  16146. "movlo r2, r3\n\t"
  16147. "it ne\n\t"
  16148. "movne r3, r5\n\t"
  16149. "ldr r12, [%[a], #76]\n\t"
  16150. "ldr lr, [%[b], #76]\n\t"
  16151. "and r12, r12, r3\n\t"
  16152. "and lr, lr, r3\n\t"
  16153. "subs r12, r12, lr\n\t"
  16154. "it hi\n\t"
  16155. "movhi r2, r6\n\t"
  16156. "it lo\n\t"
  16157. "movlo r2, r3\n\t"
  16158. "it ne\n\t"
  16159. "movne r3, r5\n\t"
  16160. "ldr r12, [%[a], #72]\n\t"
  16161. "ldr lr, [%[b], #72]\n\t"
  16162. "and r12, r12, r3\n\t"
  16163. "and lr, lr, r3\n\t"
  16164. "subs r12, r12, lr\n\t"
  16165. "it hi\n\t"
  16166. "movhi r2, r6\n\t"
  16167. "it lo\n\t"
  16168. "movlo r2, r3\n\t"
  16169. "it ne\n\t"
  16170. "movne r3, r5\n\t"
  16171. "ldr r12, [%[a], #68]\n\t"
  16172. "ldr lr, [%[b], #68]\n\t"
  16173. "and r12, r12, r3\n\t"
  16174. "and lr, lr, r3\n\t"
  16175. "subs r12, r12, lr\n\t"
  16176. "it hi\n\t"
  16177. "movhi r2, r6\n\t"
  16178. "it lo\n\t"
  16179. "movlo r2, r3\n\t"
  16180. "it ne\n\t"
  16181. "movne r3, r5\n\t"
  16182. "ldr r12, [%[a], #64]\n\t"
  16183. "ldr lr, [%[b], #64]\n\t"
  16184. "and r12, r12, r3\n\t"
  16185. "and lr, lr, r3\n\t"
  16186. "subs r12, r12, lr\n\t"
  16187. "it hi\n\t"
  16188. "movhi r2, r6\n\t"
  16189. "it lo\n\t"
  16190. "movlo r2, r3\n\t"
  16191. "it ne\n\t"
  16192. "movne r3, r5\n\t"
  16193. "ldr r12, [%[a], #60]\n\t"
  16194. "ldr lr, [%[b], #60]\n\t"
  16195. "and r12, r12, r3\n\t"
  16196. "and lr, lr, r3\n\t"
  16197. "subs r12, r12, lr\n\t"
  16198. "it hi\n\t"
  16199. "movhi r2, r6\n\t"
  16200. "it lo\n\t"
  16201. "movlo r2, r3\n\t"
  16202. "it ne\n\t"
  16203. "movne r3, r5\n\t"
  16204. "ldr r12, [%[a], #56]\n\t"
  16205. "ldr lr, [%[b], #56]\n\t"
  16206. "and r12, r12, r3\n\t"
  16207. "and lr, lr, r3\n\t"
  16208. "subs r12, r12, lr\n\t"
  16209. "it hi\n\t"
  16210. "movhi r2, r6\n\t"
  16211. "it lo\n\t"
  16212. "movlo r2, r3\n\t"
  16213. "it ne\n\t"
  16214. "movne r3, r5\n\t"
  16215. "ldr r12, [%[a], #52]\n\t"
  16216. "ldr lr, [%[b], #52]\n\t"
  16217. "and r12, r12, r3\n\t"
  16218. "and lr, lr, r3\n\t"
  16219. "subs r12, r12, lr\n\t"
  16220. "it hi\n\t"
  16221. "movhi r2, r6\n\t"
  16222. "it lo\n\t"
  16223. "movlo r2, r3\n\t"
  16224. "it ne\n\t"
  16225. "movne r3, r5\n\t"
  16226. "ldr r12, [%[a], #48]\n\t"
  16227. "ldr lr, [%[b], #48]\n\t"
  16228. "and r12, r12, r3\n\t"
  16229. "and lr, lr, r3\n\t"
  16230. "subs r12, r12, lr\n\t"
  16231. "it hi\n\t"
  16232. "movhi r2, r6\n\t"
  16233. "it lo\n\t"
  16234. "movlo r2, r3\n\t"
  16235. "it ne\n\t"
  16236. "movne r3, r5\n\t"
  16237. "ldr r12, [%[a], #44]\n\t"
  16238. "ldr lr, [%[b], #44]\n\t"
  16239. "and r12, r12, r3\n\t"
  16240. "and lr, lr, r3\n\t"
  16241. "subs r12, r12, lr\n\t"
  16242. "it hi\n\t"
  16243. "movhi r2, r6\n\t"
  16244. "it lo\n\t"
  16245. "movlo r2, r3\n\t"
  16246. "it ne\n\t"
  16247. "movne r3, r5\n\t"
  16248. "ldr r12, [%[a], #40]\n\t"
  16249. "ldr lr, [%[b], #40]\n\t"
  16250. "and r12, r12, r3\n\t"
  16251. "and lr, lr, r3\n\t"
  16252. "subs r12, r12, lr\n\t"
  16253. "it hi\n\t"
  16254. "movhi r2, r6\n\t"
  16255. "it lo\n\t"
  16256. "movlo r2, r3\n\t"
  16257. "it ne\n\t"
  16258. "movne r3, r5\n\t"
  16259. "ldr r12, [%[a], #36]\n\t"
  16260. "ldr lr, [%[b], #36]\n\t"
  16261. "and r12, r12, r3\n\t"
  16262. "and lr, lr, r3\n\t"
  16263. "subs r12, r12, lr\n\t"
  16264. "it hi\n\t"
  16265. "movhi r2, r6\n\t"
  16266. "it lo\n\t"
  16267. "movlo r2, r3\n\t"
  16268. "it ne\n\t"
  16269. "movne r3, r5\n\t"
  16270. "ldr r12, [%[a], #32]\n\t"
  16271. "ldr lr, [%[b], #32]\n\t"
  16272. "and r12, r12, r3\n\t"
  16273. "and lr, lr, r3\n\t"
  16274. "subs r12, r12, lr\n\t"
  16275. "it hi\n\t"
  16276. "movhi r2, r6\n\t"
  16277. "it lo\n\t"
  16278. "movlo r2, r3\n\t"
  16279. "it ne\n\t"
  16280. "movne r3, r5\n\t"
  16281. "ldr r12, [%[a], #28]\n\t"
  16282. "ldr lr, [%[b], #28]\n\t"
  16283. "and r12, r12, r3\n\t"
  16284. "and lr, lr, r3\n\t"
  16285. "subs r12, r12, lr\n\t"
  16286. "it hi\n\t"
  16287. "movhi r2, r6\n\t"
  16288. "it lo\n\t"
  16289. "movlo r2, r3\n\t"
  16290. "it ne\n\t"
  16291. "movne r3, r5\n\t"
  16292. "ldr r12, [%[a], #24]\n\t"
  16293. "ldr lr, [%[b], #24]\n\t"
  16294. "and r12, r12, r3\n\t"
  16295. "and lr, lr, r3\n\t"
  16296. "subs r12, r12, lr\n\t"
  16297. "it hi\n\t"
  16298. "movhi r2, r6\n\t"
  16299. "it lo\n\t"
  16300. "movlo r2, r3\n\t"
  16301. "it ne\n\t"
  16302. "movne r3, r5\n\t"
  16303. "ldr r12, [%[a], #20]\n\t"
  16304. "ldr lr, [%[b], #20]\n\t"
  16305. "and r12, r12, r3\n\t"
  16306. "and lr, lr, r3\n\t"
  16307. "subs r12, r12, lr\n\t"
  16308. "it hi\n\t"
  16309. "movhi r2, r6\n\t"
  16310. "it lo\n\t"
  16311. "movlo r2, r3\n\t"
  16312. "it ne\n\t"
  16313. "movne r3, r5\n\t"
  16314. "ldr r12, [%[a], #16]\n\t"
  16315. "ldr lr, [%[b], #16]\n\t"
  16316. "and r12, r12, r3\n\t"
  16317. "and lr, lr, r3\n\t"
  16318. "subs r12, r12, lr\n\t"
  16319. "it hi\n\t"
  16320. "movhi r2, r6\n\t"
  16321. "it lo\n\t"
  16322. "movlo r2, r3\n\t"
  16323. "it ne\n\t"
  16324. "movne r3, r5\n\t"
  16325. "ldr r12, [%[a], #12]\n\t"
  16326. "ldr lr, [%[b], #12]\n\t"
  16327. "and r12, r12, r3\n\t"
  16328. "and lr, lr, r3\n\t"
  16329. "subs r12, r12, lr\n\t"
  16330. "it hi\n\t"
  16331. "movhi r2, r6\n\t"
  16332. "it lo\n\t"
  16333. "movlo r2, r3\n\t"
  16334. "it ne\n\t"
  16335. "movne r3, r5\n\t"
  16336. "ldr r12, [%[a], #8]\n\t"
  16337. "ldr lr, [%[b], #8]\n\t"
  16338. "and r12, r12, r3\n\t"
  16339. "and lr, lr, r3\n\t"
  16340. "subs r12, r12, lr\n\t"
  16341. "it hi\n\t"
  16342. "movhi r2, r6\n\t"
  16343. "it lo\n\t"
  16344. "movlo r2, r3\n\t"
  16345. "it ne\n\t"
  16346. "movne r3, r5\n\t"
  16347. "ldr r12, [%[a], #4]\n\t"
  16348. "ldr lr, [%[b], #4]\n\t"
  16349. "and r12, r12, r3\n\t"
  16350. "and lr, lr, r3\n\t"
  16351. "subs r12, r12, lr\n\t"
  16352. "it hi\n\t"
  16353. "movhi r2, r6\n\t"
  16354. "it lo\n\t"
  16355. "movlo r2, r3\n\t"
  16356. "it ne\n\t"
  16357. "movne r3, r5\n\t"
  16358. "ldr r12, [%[a]]\n\t"
  16359. "ldr lr, [%[b]]\n\t"
  16360. "and r12, r12, r3\n\t"
  16361. "and lr, lr, r3\n\t"
  16362. "subs r12, r12, lr\n\t"
  16363. "it hi\n\t"
  16364. "movhi r2, r6\n\t"
  16365. "it lo\n\t"
  16366. "movlo r2, r3\n\t"
  16367. "it ne\n\t"
  16368. "movne r3, r5\n\t"
  16369. "eor r2, r2, r3\n\t"
  16370. #endif /*WOLFSSL_SP_SMALL */
  16371. "mov %[a], r2\n\t"
  16372. : [a] "+r" (a), [b] "+r" (b)
  16373. :
  16374. : "memory", "r2", "r3", "r12", "lr", "r4", "r5", "r6", "cc"
  16375. );
  16376. return (uint32_t)(size_t)a;
  16377. }
  16378. /* Divide d in a and put remainder into r (m*d + r = a)
  16379. * m is not calculated as it is not needed at this time.
  16380. *
  16381. * a Number to be divided.
  16382. * d Number to divide with.
  16383. * m Multiplier result.
  16384. * r Remainder from the division.
  16385. * returns MP_OKAY indicating success.
  16386. */
  16387. static WC_INLINE int sp_2048_div_64(const sp_digit* a, const sp_digit* d,
  16388. sp_digit* m, sp_digit* r)
  16389. {
  16390. sp_digit t1[128], t2[65];
  16391. sp_digit div, r1;
  16392. int i;
  16393. (void)m;
  16394. div = d[63];
  16395. XMEMCPY(t1, a, sizeof(*t1) * 2 * 64);
  16396. r1 = sp_2048_cmp_64(&t1[64], d) >= 0;
  16397. sp_2048_cond_sub_64(&t1[64], &t1[64], d, (sp_digit)0 - r1);
  16398. for (i = 63; i >= 0; i--) {
  16399. volatile sp_digit mask = (sp_digit)0 - (t1[64 + i] == div);
  16400. sp_digit hi = t1[64 + i] + mask;
  16401. r1 = div_2048_word_64(hi, t1[64 + i - 1], div);
  16402. r1 |= mask;
  16403. sp_2048_mul_d_64(t2, d, r1);
  16404. t1[64 + i] += sp_2048_sub_in_place_64(&t1[i], t2);
  16405. t1[64 + i] -= t2[64];
  16406. sp_2048_mask_64(t2, d, t1[64 + i]);
  16407. t1[64 + i] += sp_2048_add_64(&t1[i], &t1[i], t2);
  16408. sp_2048_mask_64(t2, d, t1[64 + i]);
  16409. t1[64 + i] += sp_2048_add_64(&t1[i], &t1[i], t2);
  16410. }
  16411. r1 = sp_2048_cmp_64(t1, d) >= 0;
  16412. sp_2048_cond_sub_64(r, t1, d, (sp_digit)0 - r1);
  16413. return MP_OKAY;
  16414. }
  16415. /* Reduce a modulo m into r. (r = a mod m)
  16416. *
  16417. * r A single precision number that is the reduced result.
  16418. * a A single precision number that is to be reduced.
  16419. * m A single precision number that is the modulus to reduce with.
  16420. * returns MP_OKAY indicating success.
  16421. */
  16422. static WC_INLINE int sp_2048_mod_64(sp_digit* r, const sp_digit* a,
  16423. const sp_digit* m)
  16424. {
  16425. return sp_2048_div_64(a, m, NULL, r);
  16426. }
  16427. #endif /* WOLFSSL_HAVE_SP_DH || !WOLFSSL_RSA_PUBLIC_ONLY */
  16428. #if (defined(WOLFSSL_HAVE_SP_RSA) && !defined(WOLFSSL_RSA_PUBLIC_ONLY)) || \
  16429. defined(WOLFSSL_HAVE_SP_DH)
  16430. #ifdef WOLFSSL_SP_SMALL
  16431. /* Modular exponentiate a to the e mod m. (r = a^e mod m)
  16432. *
  16433. * r A single precision number that is the result of the operation.
  16434. * a A single precision number being exponentiated.
  16435. * e A single precision number that is the exponent.
  16436. * bits The number of bits in the exponent.
  16437. * m A single precision number that is the modulus.
  16438. * returns 0 on success.
  16439. * returns MEMORY_E on dynamic memory allocation failure.
  16440. * returns MP_VAL when base is even or exponent is 0.
  16441. */
  16442. static int sp_2048_mod_exp_64(sp_digit* r, const sp_digit* a, const sp_digit* e,
  16443. int bits, const sp_digit* m, int reduceA)
  16444. {
  16445. #ifdef WOLFSSL_SP_SMALL_STACK
  16446. sp_digit* td = NULL;
  16447. #else
  16448. sp_digit td[8 * 128];
  16449. #endif
  16450. sp_digit* t[8];
  16451. sp_digit* norm = NULL;
  16452. sp_digit mp = 1;
  16453. sp_digit n;
  16454. sp_digit mask;
  16455. int i;
  16456. int c;
  16457. byte y;
  16458. int err = MP_OKAY;
  16459. if (bits == 0) {
  16460. err = MP_VAL;
  16461. }
  16462. #ifdef WOLFSSL_SP_SMALL_STACK
  16463. if (err == MP_OKAY) {
  16464. td = (sp_digit*)XMALLOC(sizeof(sp_digit) * (8 * 128), NULL,
  16465. DYNAMIC_TYPE_TMP_BUFFER);
  16466. if (td == NULL)
  16467. err = MEMORY_E;
  16468. }
  16469. #endif
  16470. if (err == MP_OKAY) {
  16471. norm = td;
  16472. for (i=0; i<8; i++) {
  16473. t[i] = td + i * 128;
  16474. }
  16475. sp_2048_mont_setup(m, &mp);
  16476. sp_2048_mont_norm_64(norm, m);
  16477. XMEMSET(t[1], 0, sizeof(sp_digit) * 64U);
  16478. if (reduceA != 0) {
  16479. err = sp_2048_mod_64(t[1] + 64, a, m);
  16480. if (err == MP_OKAY) {
  16481. err = sp_2048_mod_64(t[1], t[1], m);
  16482. }
  16483. }
  16484. else {
  16485. XMEMCPY(t[1] + 64, a, sizeof(sp_digit) * 64);
  16486. err = sp_2048_mod_64(t[1], t[1], m);
  16487. }
  16488. }
  16489. if (err == MP_OKAY) {
  16490. sp_2048_mont_sqr_64(t[ 2], t[ 1], m, mp);
  16491. sp_2048_mont_mul_64(t[ 3], t[ 2], t[ 1], m, mp);
  16492. sp_2048_mont_sqr_64(t[ 4], t[ 2], m, mp);
  16493. sp_2048_mont_mul_64(t[ 5], t[ 3], t[ 2], m, mp);
  16494. sp_2048_mont_sqr_64(t[ 6], t[ 3], m, mp);
  16495. sp_2048_mont_mul_64(t[ 7], t[ 4], t[ 3], m, mp);
  16496. i = (bits - 1) / 32;
  16497. n = e[i--];
  16498. c = bits & 31;
  16499. if (c == 0) {
  16500. c = 32;
  16501. }
  16502. c -= bits % 3;
  16503. if (c == 32) {
  16504. c = 29;
  16505. }
  16506. if (c < 0) {
  16507. /* Number of bits in top word is less than number needed. */
  16508. c = -c;
  16509. y = (byte)(n << c);
  16510. n = e[i--];
  16511. y |= (byte)(n >> (64 - c));
  16512. n <<= c;
  16513. c = 64 - c;
  16514. }
  16515. else if (c == 0) {
  16516. /* All bits in top word used. */
  16517. y = (byte)n;
  16518. }
  16519. else {
  16520. y = (byte)(n >> c);
  16521. n <<= 32 - c;
  16522. }
  16523. XMEMCPY(r, t[y], sizeof(sp_digit) * 64);
  16524. for (; i>=0 || c>=3; ) {
  16525. if (c == 0) {
  16526. n = e[i--];
  16527. y = (byte)(n >> 29);
  16528. n <<= 3;
  16529. c = 29;
  16530. }
  16531. else if (c < 3) {
  16532. y = (byte)(n >> 29);
  16533. n = e[i--];
  16534. c = 3 - c;
  16535. y |= (byte)(n >> (32 - c));
  16536. n <<= c;
  16537. c = 32 - c;
  16538. }
  16539. else {
  16540. y = (byte)((n >> 29) & 0x7);
  16541. n <<= 3;
  16542. c -= 3;
  16543. }
  16544. sp_2048_mont_sqr_64(r, r, m, mp);
  16545. sp_2048_mont_sqr_64(r, r, m, mp);
  16546. sp_2048_mont_sqr_64(r, r, m, mp);
  16547. sp_2048_mont_mul_64(r, r, t[y], m, mp);
  16548. }
  16549. XMEMSET(&r[64], 0, sizeof(sp_digit) * 64U);
  16550. sp_2048_mont_reduce_64(r, m, mp);
  16551. mask = 0 - (sp_2048_cmp_64(r, m) >= 0);
  16552. sp_2048_cond_sub_64(r, r, m, mask);
  16553. }
  16554. #ifdef WOLFSSL_SP_SMALL_STACK
  16555. if (td != NULL)
  16556. XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  16557. #endif
  16558. return err;
  16559. }
  16560. #else
  16561. /* Modular exponentiate a to the e mod m. (r = a^e mod m)
  16562. *
  16563. * r A single precision number that is the result of the operation.
  16564. * a A single precision number being exponentiated.
  16565. * e A single precision number that is the exponent.
  16566. * bits The number of bits in the exponent.
  16567. * m A single precision number that is the modulus.
  16568. * returns 0 on success.
  16569. * returns MEMORY_E on dynamic memory allocation failure.
  16570. * returns MP_VAL when base is even or exponent is 0.
  16571. */
  16572. static int sp_2048_mod_exp_64(sp_digit* r, const sp_digit* a, const sp_digit* e,
  16573. int bits, const sp_digit* m, int reduceA)
  16574. {
  16575. #ifdef WOLFSSL_SP_SMALL_STACK
  16576. sp_digit* td = NULL;
  16577. #else
  16578. sp_digit td[16 * 128];
  16579. #endif
  16580. sp_digit* t[16];
  16581. sp_digit* norm = NULL;
  16582. sp_digit mp = 1;
  16583. sp_digit n;
  16584. sp_digit mask;
  16585. int i;
  16586. int c;
  16587. byte y;
  16588. int err = MP_OKAY;
  16589. if (bits == 0) {
  16590. err = MP_VAL;
  16591. }
  16592. #ifdef WOLFSSL_SP_SMALL_STACK
  16593. if (err == MP_OKAY) {
  16594. td = (sp_digit*)XMALLOC(sizeof(sp_digit) * (16 * 128), NULL,
  16595. DYNAMIC_TYPE_TMP_BUFFER);
  16596. if (td == NULL)
  16597. err = MEMORY_E;
  16598. }
  16599. #endif
  16600. if (err == MP_OKAY) {
  16601. norm = td;
  16602. for (i=0; i<16; i++) {
  16603. t[i] = td + i * 128;
  16604. }
  16605. sp_2048_mont_setup(m, &mp);
  16606. sp_2048_mont_norm_64(norm, m);
  16607. XMEMSET(t[1], 0, sizeof(sp_digit) * 64U);
  16608. if (reduceA != 0) {
  16609. err = sp_2048_mod_64(t[1] + 64, a, m);
  16610. if (err == MP_OKAY) {
  16611. err = sp_2048_mod_64(t[1], t[1], m);
  16612. }
  16613. }
  16614. else {
  16615. XMEMCPY(t[1] + 64, a, sizeof(sp_digit) * 64);
  16616. err = sp_2048_mod_64(t[1], t[1], m);
  16617. }
  16618. }
  16619. if (err == MP_OKAY) {
  16620. sp_2048_mont_sqr_64(t[ 2], t[ 1], m, mp);
  16621. sp_2048_mont_mul_64(t[ 3], t[ 2], t[ 1], m, mp);
  16622. sp_2048_mont_sqr_64(t[ 4], t[ 2], m, mp);
  16623. sp_2048_mont_mul_64(t[ 5], t[ 3], t[ 2], m, mp);
  16624. sp_2048_mont_sqr_64(t[ 6], t[ 3], m, mp);
  16625. sp_2048_mont_mul_64(t[ 7], t[ 4], t[ 3], m, mp);
  16626. sp_2048_mont_sqr_64(t[ 8], t[ 4], m, mp);
  16627. sp_2048_mont_mul_64(t[ 9], t[ 5], t[ 4], m, mp);
  16628. sp_2048_mont_sqr_64(t[10], t[ 5], m, mp);
  16629. sp_2048_mont_mul_64(t[11], t[ 6], t[ 5], m, mp);
  16630. sp_2048_mont_sqr_64(t[12], t[ 6], m, mp);
  16631. sp_2048_mont_mul_64(t[13], t[ 7], t[ 6], m, mp);
  16632. sp_2048_mont_sqr_64(t[14], t[ 7], m, mp);
  16633. sp_2048_mont_mul_64(t[15], t[ 8], t[ 7], m, mp);
  16634. i = (bits - 1) / 32;
  16635. n = e[i--];
  16636. c = bits & 31;
  16637. if (c == 0) {
  16638. c = 32;
  16639. }
  16640. c -= bits % 4;
  16641. if (c == 32) {
  16642. c = 28;
  16643. }
  16644. if (c < 0) {
  16645. /* Number of bits in top word is less than number needed. */
  16646. c = -c;
  16647. y = (byte)(n << c);
  16648. n = e[i--];
  16649. y |= (byte)(n >> (64 - c));
  16650. n <<= c;
  16651. c = 64 - c;
  16652. }
  16653. else if (c == 0) {
  16654. /* All bits in top word used. */
  16655. y = (byte)n;
  16656. }
  16657. else {
  16658. y = (byte)(n >> c);
  16659. n <<= 32 - c;
  16660. }
  16661. XMEMCPY(r, t[y], sizeof(sp_digit) * 64);
  16662. for (; i>=0 || c>=4; ) {
  16663. if (c == 0) {
  16664. n = e[i--];
  16665. y = (byte)(n >> 28);
  16666. n <<= 4;
  16667. c = 28;
  16668. }
  16669. else if (c < 4) {
  16670. y = (byte)(n >> 28);
  16671. n = e[i--];
  16672. c = 4 - c;
  16673. y |= (byte)(n >> (32 - c));
  16674. n <<= c;
  16675. c = 32 - c;
  16676. }
  16677. else {
  16678. y = (byte)((n >> 28) & 0xf);
  16679. n <<= 4;
  16680. c -= 4;
  16681. }
  16682. sp_2048_mont_sqr_64(r, r, m, mp);
  16683. sp_2048_mont_sqr_64(r, r, m, mp);
  16684. sp_2048_mont_sqr_64(r, r, m, mp);
  16685. sp_2048_mont_sqr_64(r, r, m, mp);
  16686. sp_2048_mont_mul_64(r, r, t[y], m, mp);
  16687. }
  16688. XMEMSET(&r[64], 0, sizeof(sp_digit) * 64U);
  16689. sp_2048_mont_reduce_64(r, m, mp);
  16690. mask = 0 - (sp_2048_cmp_64(r, m) >= 0);
  16691. sp_2048_cond_sub_64(r, r, m, mask);
  16692. }
  16693. #ifdef WOLFSSL_SP_SMALL_STACK
  16694. if (td != NULL)
  16695. XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  16696. #endif
  16697. return err;
  16698. }
  16699. #endif /* WOLFSSL_SP_SMALL */
  16700. #endif /* (WOLFSSL_HAVE_SP_RSA && !WOLFSSL_RSA_PUBLIC_ONLY) || WOLFSSL_HAVE_SP_DH */
  16701. #endif /* (WOLFSSL_HAVE_SP_RSA && !WOLFSSL_RSA_PUBLIC_ONLY) || WOLFSSL_HAVE_SP_DH */
  16702. #ifdef WOLFSSL_HAVE_SP_RSA
  16703. /* RSA public key operation.
  16704. *
  16705. * in Array of bytes representing the number to exponentiate, base.
  16706. * inLen Number of bytes in base.
  16707. * em Public exponent.
  16708. * mm Modulus.
  16709. * out Buffer to hold big-endian bytes of exponentiation result.
  16710. * Must be at least 256 bytes long.
  16711. * outLen Number of bytes in result.
  16712. * returns 0 on success, MP_TO_E when the outLen is too small, MP_READ_E when
  16713. * an array is too long and MEMORY_E when dynamic memory allocation fails.
  16714. */
  16715. int sp_RsaPublic_2048(const byte* in, word32 inLen, const mp_int* em,
  16716. const mp_int* mm, byte* out, word32* outLen)
  16717. {
  16718. #ifdef WOLFSSL_SP_SMALL_STACK
  16719. sp_digit* a = NULL;
  16720. #else
  16721. sp_digit a[64 * 5];
  16722. #endif
  16723. sp_digit* m = NULL;
  16724. sp_digit* r = NULL;
  16725. sp_digit *ah = NULL;
  16726. sp_digit e[1] = {0};
  16727. int err = MP_OKAY;
  16728. if (*outLen < 256) {
  16729. err = MP_TO_E;
  16730. }
  16731. else if (mp_count_bits(em) > 32 || inLen > 256 ||
  16732. mp_count_bits(mm) != 2048) {
  16733. err = MP_READ_E;
  16734. }
  16735. else if (mp_iseven(mm)) {
  16736. err = MP_VAL;
  16737. }
  16738. #ifdef WOLFSSL_SP_SMALL_STACK
  16739. if (err == MP_OKAY) {
  16740. a = (sp_digit*)XMALLOC(sizeof(sp_digit) * 64 * 5, NULL,
  16741. DYNAMIC_TYPE_RSA);
  16742. if (a == NULL)
  16743. err = MEMORY_E;
  16744. }
  16745. #endif
  16746. if (err == MP_OKAY) {
  16747. ah = a + 64;
  16748. r = a + 64 * 2;
  16749. m = r + 64 * 2;
  16750. sp_2048_from_bin(ah, 64, in, inLen);
  16751. #if DIGIT_BIT >= 32
  16752. e[0] = em->dp[0];
  16753. #else
  16754. e[0] = em->dp[0];
  16755. if (em->used > 1) {
  16756. e[0] |= ((sp_digit)em->dp[1]) << DIGIT_BIT;
  16757. }
  16758. #endif
  16759. if (e[0] == 0) {
  16760. err = MP_EXPTMOD_E;
  16761. }
  16762. }
  16763. if (err == MP_OKAY) {
  16764. sp_2048_from_mp(m, 64, mm);
  16765. if (e[0] == 0x10001) {
  16766. int i;
  16767. sp_digit mp;
  16768. sp_2048_mont_setup(m, &mp);
  16769. /* Convert to Montgomery form. */
  16770. XMEMSET(a, 0, sizeof(sp_digit) * 64);
  16771. err = sp_2048_mod_64_cond(r, a, m);
  16772. /* Montgomery form: r = a.R mod m */
  16773. if (err == MP_OKAY) {
  16774. /* r = a ^ 0x10000 => r = a squared 16 times */
  16775. for (i = 15; i >= 0; i--) {
  16776. sp_2048_mont_sqr_64(r, r, m, mp);
  16777. }
  16778. /* mont_red(r.R.R) = (r.R.R / R) mod m = r.R mod m
  16779. * mont_red(r.R * a) = (r.R.a / R) mod m = r.a mod m
  16780. */
  16781. sp_2048_mont_mul_64(r, r, ah, m, mp);
  16782. for (i = 63; i > 0; i--) {
  16783. if (r[i] != m[i]) {
  16784. break;
  16785. }
  16786. }
  16787. if (r[i] >= m[i]) {
  16788. sp_2048_sub_in_place_64(r, m);
  16789. }
  16790. }
  16791. }
  16792. else if (e[0] == 0x3) {
  16793. if (err == MP_OKAY) {
  16794. sp_2048_sqr_64(r, ah);
  16795. err = sp_2048_mod_64_cond(r, r, m);
  16796. }
  16797. if (err == MP_OKAY) {
  16798. sp_2048_mul_64(r, ah, r);
  16799. err = sp_2048_mod_64_cond(r, r, m);
  16800. }
  16801. }
  16802. else {
  16803. int i;
  16804. sp_digit mp;
  16805. sp_2048_mont_setup(m, &mp);
  16806. /* Convert to Montgomery form. */
  16807. XMEMSET(a, 0, sizeof(sp_digit) * 64);
  16808. err = sp_2048_mod_64_cond(a, a, m);
  16809. if (err == MP_OKAY) {
  16810. for (i = 31; i >= 0; i--) {
  16811. if (e[0] >> i) {
  16812. break;
  16813. }
  16814. }
  16815. XMEMCPY(r, a, sizeof(sp_digit) * 64);
  16816. for (i--; i >= 0; i--) {
  16817. sp_2048_mont_sqr_64(r, r, m, mp);
  16818. if (((e[0] >> i) & 1) == 1) {
  16819. sp_2048_mont_mul_64(r, r, a, m, mp);
  16820. }
  16821. }
  16822. XMEMSET(&r[64], 0, sizeof(sp_digit) * 64);
  16823. sp_2048_mont_reduce_64(r, m, mp);
  16824. for (i = 63; i > 0; i--) {
  16825. if (r[i] != m[i]) {
  16826. break;
  16827. }
  16828. }
  16829. if (r[i] >= m[i]) {
  16830. sp_2048_sub_in_place_64(r, m);
  16831. }
  16832. }
  16833. }
  16834. }
  16835. if (err == MP_OKAY) {
  16836. sp_2048_to_bin_64(r, out);
  16837. *outLen = 256;
  16838. }
  16839. #ifdef WOLFSSL_SP_SMALL_STACK
  16840. if (a != NULL)
  16841. XFREE(a, NULL, DYNAMIC_TYPE_RSA);
  16842. #endif
  16843. return err;
  16844. }
  16845. #ifndef WOLFSSL_RSA_PUBLIC_ONLY
  16846. #ifdef WOLFSSL_SP_SMALL
  16847. /* Conditionally add a and b using the mask m.
  16848. * m is -1 to add and 0 when not.
  16849. *
  16850. * r A single precision number representing conditional add result.
  16851. * a A single precision number to add with.
  16852. * b A single precision number to add.
  16853. * m Mask value to apply.
  16854. */
  16855. 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)
  16856. {
  16857. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  16858. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  16859. register const sp_digit* b asm ("r2") = (const sp_digit*)b_p;
  16860. register sp_digit m asm ("r3") = (sp_digit)m_p;
  16861. __asm__ __volatile__ (
  16862. "mov lr, #0\n\t"
  16863. "mov r6, #0\n\t"
  16864. "mov r12, #0\n\t"
  16865. "\n"
  16866. "L_sp_2048_cond_add_32_words_%=: \n\t"
  16867. "adds lr, lr, #-1\n\t"
  16868. "ldr r4, [%[a], r12]\n\t"
  16869. "ldr r5, [%[b], r12]\n\t"
  16870. "and r5, r5, %[m]\n\t"
  16871. "adcs r4, r4, r5\n\t"
  16872. "adc lr, r6, r6\n\t"
  16873. "str r4, [%[r], r12]\n\t"
  16874. "add r12, r12, #4\n\t"
  16875. "cmp r12, #0x80\n\t"
  16876. "blt L_sp_2048_cond_add_32_words_%=\n\t"
  16877. "mov %[r], lr\n\t"
  16878. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b), [m] "+r" (m)
  16879. :
  16880. : "memory", "r12", "lr", "r4", "r5", "r6", "cc"
  16881. );
  16882. return (uint32_t)(size_t)r;
  16883. }
  16884. #else
  16885. /* Conditionally add a and b using the mask m.
  16886. * m is -1 to add and 0 when not.
  16887. *
  16888. * r A single precision number representing conditional add result.
  16889. * a A single precision number to add with.
  16890. * b A single precision number to add.
  16891. * m Mask value to apply.
  16892. */
  16893. 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)
  16894. {
  16895. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  16896. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  16897. register const sp_digit* b asm ("r2") = (const sp_digit*)b_p;
  16898. register sp_digit m asm ("r3") = (sp_digit)m_p;
  16899. __asm__ __volatile__ (
  16900. "mov r8, #0\n\t"
  16901. "ldm %[a]!, {r4, r5}\n\t"
  16902. "ldm %[b]!, {r6, r7}\n\t"
  16903. "and r6, r6, %[m]\n\t"
  16904. "and r7, r7, %[m]\n\t"
  16905. "adds r4, r4, r6\n\t"
  16906. "adcs r5, r5, r7\n\t"
  16907. "stm %[r]!, {r4, r5}\n\t"
  16908. "ldm %[a]!, {r4, r5}\n\t"
  16909. "ldm %[b]!, {r6, r7}\n\t"
  16910. "and r6, r6, %[m]\n\t"
  16911. "and r7, r7, %[m]\n\t"
  16912. "adcs r4, r4, r6\n\t"
  16913. "adcs r5, r5, r7\n\t"
  16914. "stm %[r]!, {r4, r5}\n\t"
  16915. "ldm %[a]!, {r4, r5}\n\t"
  16916. "ldm %[b]!, {r6, r7}\n\t"
  16917. "and r6, r6, %[m]\n\t"
  16918. "and r7, r7, %[m]\n\t"
  16919. "adcs r4, r4, r6\n\t"
  16920. "adcs r5, r5, r7\n\t"
  16921. "stm %[r]!, {r4, r5}\n\t"
  16922. "ldm %[a]!, {r4, r5}\n\t"
  16923. "ldm %[b]!, {r6, r7}\n\t"
  16924. "and r6, r6, %[m]\n\t"
  16925. "and r7, r7, %[m]\n\t"
  16926. "adcs r4, r4, r6\n\t"
  16927. "adcs r5, r5, r7\n\t"
  16928. "stm %[r]!, {r4, r5}\n\t"
  16929. "ldm %[a]!, {r4, r5}\n\t"
  16930. "ldm %[b]!, {r6, r7}\n\t"
  16931. "and r6, r6, %[m]\n\t"
  16932. "and r7, r7, %[m]\n\t"
  16933. "adcs r4, r4, r6\n\t"
  16934. "adcs r5, r5, r7\n\t"
  16935. "stm %[r]!, {r4, r5}\n\t"
  16936. "ldm %[a]!, {r4, r5}\n\t"
  16937. "ldm %[b]!, {r6, r7}\n\t"
  16938. "and r6, r6, %[m]\n\t"
  16939. "and r7, r7, %[m]\n\t"
  16940. "adcs r4, r4, r6\n\t"
  16941. "adcs r5, r5, r7\n\t"
  16942. "stm %[r]!, {r4, r5}\n\t"
  16943. "ldm %[a]!, {r4, r5}\n\t"
  16944. "ldm %[b]!, {r6, r7}\n\t"
  16945. "and r6, r6, %[m]\n\t"
  16946. "and r7, r7, %[m]\n\t"
  16947. "adcs r4, r4, r6\n\t"
  16948. "adcs r5, r5, r7\n\t"
  16949. "stm %[r]!, {r4, r5}\n\t"
  16950. "ldm %[a]!, {r4, r5}\n\t"
  16951. "ldm %[b]!, {r6, r7}\n\t"
  16952. "and r6, r6, %[m]\n\t"
  16953. "and r7, r7, %[m]\n\t"
  16954. "adcs r4, r4, r6\n\t"
  16955. "adcs r5, r5, r7\n\t"
  16956. "stm %[r]!, {r4, r5}\n\t"
  16957. "ldm %[a]!, {r4, r5}\n\t"
  16958. "ldm %[b]!, {r6, r7}\n\t"
  16959. "and r6, r6, %[m]\n\t"
  16960. "and r7, r7, %[m]\n\t"
  16961. "adcs r4, r4, r6\n\t"
  16962. "adcs r5, r5, r7\n\t"
  16963. "stm %[r]!, {r4, r5}\n\t"
  16964. "ldm %[a]!, {r4, r5}\n\t"
  16965. "ldm %[b]!, {r6, r7}\n\t"
  16966. "and r6, r6, %[m]\n\t"
  16967. "and r7, r7, %[m]\n\t"
  16968. "adcs r4, r4, r6\n\t"
  16969. "adcs r5, r5, r7\n\t"
  16970. "stm %[r]!, {r4, r5}\n\t"
  16971. "ldm %[a]!, {r4, r5}\n\t"
  16972. "ldm %[b]!, {r6, r7}\n\t"
  16973. "and r6, r6, %[m]\n\t"
  16974. "and r7, r7, %[m]\n\t"
  16975. "adcs r4, r4, r6\n\t"
  16976. "adcs r5, r5, r7\n\t"
  16977. "stm %[r]!, {r4, r5}\n\t"
  16978. "ldm %[a]!, {r4, r5}\n\t"
  16979. "ldm %[b]!, {r6, r7}\n\t"
  16980. "and r6, r6, %[m]\n\t"
  16981. "and r7, r7, %[m]\n\t"
  16982. "adcs r4, r4, r6\n\t"
  16983. "adcs r5, r5, r7\n\t"
  16984. "stm %[r]!, {r4, r5}\n\t"
  16985. "ldm %[a]!, {r4, r5}\n\t"
  16986. "ldm %[b]!, {r6, r7}\n\t"
  16987. "and r6, r6, %[m]\n\t"
  16988. "and r7, r7, %[m]\n\t"
  16989. "adcs r4, r4, r6\n\t"
  16990. "adcs r5, r5, r7\n\t"
  16991. "stm %[r]!, {r4, r5}\n\t"
  16992. "ldm %[a]!, {r4, r5}\n\t"
  16993. "ldm %[b]!, {r6, r7}\n\t"
  16994. "and r6, r6, %[m]\n\t"
  16995. "and r7, r7, %[m]\n\t"
  16996. "adcs r4, r4, r6\n\t"
  16997. "adcs r5, r5, r7\n\t"
  16998. "stm %[r]!, {r4, r5}\n\t"
  16999. "ldm %[a]!, {r4, r5}\n\t"
  17000. "ldm %[b]!, {r6, r7}\n\t"
  17001. "and r6, r6, %[m]\n\t"
  17002. "and r7, r7, %[m]\n\t"
  17003. "adcs r4, r4, r6\n\t"
  17004. "adcs r5, r5, r7\n\t"
  17005. "stm %[r]!, {r4, r5}\n\t"
  17006. "ldm %[a]!, {r4, r5}\n\t"
  17007. "ldm %[b]!, {r6, r7}\n\t"
  17008. "and r6, r6, %[m]\n\t"
  17009. "and r7, r7, %[m]\n\t"
  17010. "adcs r4, r4, r6\n\t"
  17011. "adcs r5, r5, r7\n\t"
  17012. "stm %[r]!, {r4, r5}\n\t"
  17013. "adc %[r], r8, r8\n\t"
  17014. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b), [m] "+r" (m)
  17015. :
  17016. : "memory", "r12", "lr", "r4", "r5", "r6", "r7", "r8", "cc"
  17017. );
  17018. return (uint32_t)(size_t)r;
  17019. }
  17020. #endif /* WOLFSSL_SP_SMALL */
  17021. /* RSA private key operation.
  17022. *
  17023. * in Array of bytes representing the number to exponentiate, base.
  17024. * inLen Number of bytes in base.
  17025. * dm Private exponent.
  17026. * pm First prime.
  17027. * qm Second prime.
  17028. * dpm First prime's CRT exponent.
  17029. * dqm Second prime's CRT exponent.
  17030. * qim Inverse of second prime mod p.
  17031. * mm Modulus.
  17032. * out Buffer to hold big-endian bytes of exponentiation result.
  17033. * Must be at least 256 bytes long.
  17034. * outLen Number of bytes in result.
  17035. * returns 0 on success, MP_TO_E when the outLen is too small, MP_READ_E when
  17036. * an array is too long and MEMORY_E when dynamic memory allocation fails.
  17037. */
  17038. int sp_RsaPrivate_2048(const byte* in, word32 inLen, const mp_int* dm,
  17039. const mp_int* pm, const mp_int* qm, const mp_int* dpm, const mp_int* dqm,
  17040. const mp_int* qim, const mp_int* mm, byte* out, word32* outLen)
  17041. {
  17042. #if defined(SP_RSA_PRIVATE_EXP_D) || defined(RSA_LOW_MEM)
  17043. #ifdef WOLFSSL_SP_SMALL_STACK
  17044. sp_digit* d = NULL;
  17045. #else
  17046. sp_digit d[64 * 4];
  17047. #endif
  17048. sp_digit* a = NULL;
  17049. sp_digit* m = NULL;
  17050. sp_digit* r = NULL;
  17051. int err = MP_OKAY;
  17052. (void)pm;
  17053. (void)qm;
  17054. (void)dpm;
  17055. (void)dqm;
  17056. (void)qim;
  17057. if (*outLen < 256U) {
  17058. err = MP_TO_E;
  17059. }
  17060. if (err == MP_OKAY) {
  17061. if (mp_count_bits(dm) > 2048) {
  17062. err = MP_READ_E;
  17063. }
  17064. else if (inLen > 256) {
  17065. err = MP_READ_E;
  17066. }
  17067. else if (mp_count_bits(mm) != 2048) {
  17068. err = MP_READ_E;
  17069. }
  17070. else if (mp_iseven(mm)) {
  17071. err = MP_VAL;
  17072. }
  17073. }
  17074. #ifdef WOLFSSL_SP_SMALL_STACK
  17075. if (err == MP_OKAY) {
  17076. d = (sp_digit*)XMALLOC(sizeof(sp_digit) * 64 * 4, NULL,
  17077. DYNAMIC_TYPE_RSA);
  17078. if (d == NULL)
  17079. err = MEMORY_E;
  17080. }
  17081. #endif
  17082. if (err == MP_OKAY) {
  17083. a = d + 64;
  17084. m = a + 128;
  17085. r = a;
  17086. sp_2048_from_bin(a, 64, in, inLen);
  17087. sp_2048_from_mp(d, 64, dm);
  17088. sp_2048_from_mp(m, 64, mm);
  17089. err = sp_2048_mod_exp_64(r, a, d, 2048, m, 0);
  17090. }
  17091. if (err == MP_OKAY) {
  17092. sp_2048_to_bin_64(r, out);
  17093. *outLen = 256;
  17094. }
  17095. #ifdef WOLFSSL_SP_SMALL_STACK
  17096. if (d != NULL)
  17097. #endif
  17098. {
  17099. /* only "a" and "r" are sensitive and need zeroized (same pointer) */
  17100. if (a != NULL)
  17101. ForceZero(a, sizeof(sp_digit) * 64);
  17102. #ifdef WOLFSSL_SP_SMALL_STACK
  17103. XFREE(d, NULL, DYNAMIC_TYPE_RSA);
  17104. #endif
  17105. }
  17106. return err;
  17107. #else
  17108. #ifdef WOLFSSL_SP_SMALL_STACK
  17109. sp_digit* a = NULL;
  17110. #else
  17111. sp_digit a[32 * 11];
  17112. #endif
  17113. sp_digit* p = NULL;
  17114. sp_digit* q = NULL;
  17115. sp_digit* dp = NULL;
  17116. sp_digit* tmpa = NULL;
  17117. sp_digit* tmpb = NULL;
  17118. sp_digit* r = NULL;
  17119. sp_digit* qi = NULL;
  17120. sp_digit* dq = NULL;
  17121. sp_digit c;
  17122. int err = MP_OKAY;
  17123. (void)dm;
  17124. (void)mm;
  17125. if (*outLen < 256) {
  17126. err = MP_TO_E;
  17127. }
  17128. else if (inLen > 256 || mp_count_bits(mm) != 2048) {
  17129. err = MP_READ_E;
  17130. }
  17131. else if (mp_iseven(mm)) {
  17132. err = MP_VAL;
  17133. }
  17134. else if (mp_iseven(pm)) {
  17135. err = MP_VAL;
  17136. }
  17137. else if (mp_iseven(qm)) {
  17138. err = MP_VAL;
  17139. }
  17140. #ifdef WOLFSSL_SP_SMALL_STACK
  17141. if (err == MP_OKAY) {
  17142. a = (sp_digit*)XMALLOC(sizeof(sp_digit) * 32 * 11, NULL,
  17143. DYNAMIC_TYPE_RSA);
  17144. if (a == NULL)
  17145. err = MEMORY_E;
  17146. }
  17147. #endif
  17148. if (err == MP_OKAY) {
  17149. p = a + 64 * 2;
  17150. q = p + 32;
  17151. qi = dq = dp = q + 32;
  17152. tmpa = qi + 32;
  17153. tmpb = tmpa + 64;
  17154. r = a;
  17155. sp_2048_from_bin(a, 64, in, inLen);
  17156. sp_2048_from_mp(p, 32, pm);
  17157. sp_2048_from_mp(q, 32, qm);
  17158. sp_2048_from_mp(dp, 32, dpm);
  17159. err = sp_2048_mod_exp_32(tmpa, a, dp, 1024, p, 1);
  17160. }
  17161. if (err == MP_OKAY) {
  17162. sp_2048_from_mp(dq, 32, dqm);
  17163. err = sp_2048_mod_exp_32(tmpb, a, dq, 1024, q, 1);
  17164. }
  17165. if (err == MP_OKAY) {
  17166. c = sp_2048_sub_in_place_32(tmpa, tmpb);
  17167. c += sp_2048_cond_add_32(tmpa, tmpa, p, c);
  17168. sp_2048_cond_add_32(tmpa, tmpa, p, c);
  17169. sp_2048_from_mp(qi, 32, qim);
  17170. sp_2048_mul_32(tmpa, tmpa, qi);
  17171. err = sp_2048_mod_32(tmpa, tmpa, p);
  17172. }
  17173. if (err == MP_OKAY) {
  17174. sp_2048_mul_32(tmpa, q, tmpa);
  17175. XMEMSET(&tmpb[32], 0, sizeof(sp_digit) * 32);
  17176. sp_2048_add_64(r, tmpb, tmpa);
  17177. sp_2048_to_bin_64(r, out);
  17178. *outLen = 256;
  17179. }
  17180. #ifdef WOLFSSL_SP_SMALL_STACK
  17181. if (a != NULL)
  17182. #endif
  17183. {
  17184. ForceZero(a, sizeof(sp_digit) * 32 * 11);
  17185. #ifdef WOLFSSL_SP_SMALL_STACK
  17186. XFREE(a, NULL, DYNAMIC_TYPE_RSA);
  17187. #endif
  17188. }
  17189. #endif /* SP_RSA_PRIVATE_EXP_D || RSA_LOW_MEM */
  17190. return err;
  17191. }
  17192. #endif /* WOLFSSL_RSA_PUBLIC_ONLY */
  17193. #endif /* WOLFSSL_HAVE_SP_RSA */
  17194. #if defined(WOLFSSL_HAVE_SP_DH) || (defined(WOLFSSL_HAVE_SP_RSA) && \
  17195. !defined(WOLFSSL_RSA_PUBLIC_ONLY))
  17196. /* Convert an array of sp_digit to an mp_int.
  17197. *
  17198. * a A single precision integer.
  17199. * r A multi-precision integer.
  17200. */
  17201. static int sp_2048_to_mp(const sp_digit* a, mp_int* r)
  17202. {
  17203. int err;
  17204. err = mp_grow(r, (2048 + DIGIT_BIT - 1) / DIGIT_BIT);
  17205. if (err == MP_OKAY) { /*lint !e774 case where err is always MP_OKAY*/
  17206. #if DIGIT_BIT == 32
  17207. XMEMCPY(r->dp, a, sizeof(sp_digit) * 64);
  17208. r->used = 64;
  17209. mp_clamp(r);
  17210. #elif DIGIT_BIT < 32
  17211. int i;
  17212. int j = 0;
  17213. int s = 0;
  17214. r->dp[0] = 0;
  17215. for (i = 0; i < 64; i++) {
  17216. r->dp[j] |= (mp_digit)(a[i] << s);
  17217. r->dp[j] &= ((sp_digit)1 << DIGIT_BIT) - 1;
  17218. s = DIGIT_BIT - s;
  17219. r->dp[++j] = (mp_digit)(a[i] >> s);
  17220. while (s + DIGIT_BIT <= 32) {
  17221. s += DIGIT_BIT;
  17222. r->dp[j++] &= ((sp_digit)1 << DIGIT_BIT) - 1;
  17223. if (s == SP_WORD_SIZE) {
  17224. r->dp[j] = 0;
  17225. }
  17226. else {
  17227. r->dp[j] = (mp_digit)(a[i] >> s);
  17228. }
  17229. }
  17230. s = 32 - s;
  17231. }
  17232. r->used = (2048 + DIGIT_BIT - 1) / DIGIT_BIT;
  17233. mp_clamp(r);
  17234. #else
  17235. int i;
  17236. int j = 0;
  17237. int s = 0;
  17238. r->dp[0] = 0;
  17239. for (i = 0; i < 64; i++) {
  17240. r->dp[j] |= ((mp_digit)a[i]) << s;
  17241. if (s + 32 >= DIGIT_BIT) {
  17242. #if DIGIT_BIT != 32 && DIGIT_BIT != 64
  17243. r->dp[j] &= ((sp_digit)1 << DIGIT_BIT) - 1;
  17244. #endif
  17245. s = DIGIT_BIT - s;
  17246. r->dp[++j] = a[i] >> s;
  17247. s = 32 - s;
  17248. }
  17249. else {
  17250. s += 32;
  17251. }
  17252. }
  17253. r->used = (2048 + DIGIT_BIT - 1) / DIGIT_BIT;
  17254. mp_clamp(r);
  17255. #endif
  17256. }
  17257. return err;
  17258. }
  17259. /* Perform the modular exponentiation for Diffie-Hellman.
  17260. *
  17261. * base Base. MP integer.
  17262. * exp Exponent. MP integer.
  17263. * mod Modulus. MP integer.
  17264. * res Result. MP integer.
  17265. * returns 0 on success, MP_READ_E if there are too many bytes in an array
  17266. * and MEMORY_E if memory allocation fails.
  17267. */
  17268. int sp_ModExp_2048(const mp_int* base, const mp_int* exp, const mp_int* mod,
  17269. mp_int* res)
  17270. {
  17271. int err = MP_OKAY;
  17272. sp_digit b[128];
  17273. sp_digit e[64];
  17274. sp_digit m[64];
  17275. sp_digit* r = b;
  17276. int expBits = mp_count_bits(exp);
  17277. if (mp_count_bits(base) > 2048) {
  17278. err = MP_READ_E;
  17279. }
  17280. else if (expBits > 2048) {
  17281. err = MP_READ_E;
  17282. }
  17283. else if (mp_count_bits(mod) != 2048) {
  17284. err = MP_READ_E;
  17285. }
  17286. else if (mp_iseven(mod)) {
  17287. err = MP_VAL;
  17288. }
  17289. if (err == MP_OKAY) {
  17290. sp_2048_from_mp(b, 64, base);
  17291. sp_2048_from_mp(e, 64, exp);
  17292. sp_2048_from_mp(m, 64, mod);
  17293. err = sp_2048_mod_exp_64(r, b, e, expBits, m, 0);
  17294. }
  17295. if (err == MP_OKAY) {
  17296. err = sp_2048_to_mp(r, res);
  17297. }
  17298. XMEMSET(e, 0, sizeof(e));
  17299. return err;
  17300. }
  17301. #ifdef WOLFSSL_HAVE_SP_DH
  17302. #ifdef HAVE_FFDHE_2048
  17303. static void sp_2048_lshift_64(sp_digit* r_p, const sp_digit* a_p, byte n_p)
  17304. {
  17305. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  17306. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  17307. register byte n asm ("r2") = (byte)n_p;
  17308. __asm__ __volatile__ (
  17309. "rsb r12, %[n], #31\n\t"
  17310. "ldr r5, [%[a], #252]\n\t"
  17311. "lsr r6, r5, #1\n\t"
  17312. "lsl r5, r5, %[n]\n\t"
  17313. "lsr r6, r6, r12\n\t"
  17314. "ldr r4, [%[a], #248]\n\t"
  17315. "str r6, [%[r], #256]\n\t"
  17316. "lsr r3, r4, #1\n\t"
  17317. "lsl r4, r4, %[n]\n\t"
  17318. "lsr r3, r3, r12\n\t"
  17319. "orr r5, r5, r3\n\t"
  17320. "ldr r6, [%[a], #244]\n\t"
  17321. "str r5, [%[r], #252]\n\t"
  17322. "lsr r3, r6, #1\n\t"
  17323. "lsl r6, r6, %[n]\n\t"
  17324. "lsr r3, r3, r12\n\t"
  17325. "orr r4, r4, r3\n\t"
  17326. "ldr r5, [%[a], #240]\n\t"
  17327. "str r4, [%[r], #248]\n\t"
  17328. "lsr r3, r5, #1\n\t"
  17329. "lsl r5, r5, %[n]\n\t"
  17330. "lsr r3, r3, r12\n\t"
  17331. "orr r6, r6, r3\n\t"
  17332. "ldr r4, [%[a], #236]\n\t"
  17333. "str r6, [%[r], #244]\n\t"
  17334. "lsr r3, r4, #1\n\t"
  17335. "lsl r4, r4, %[n]\n\t"
  17336. "lsr r3, r3, r12\n\t"
  17337. "orr r5, r5, r3\n\t"
  17338. "ldr r6, [%[a], #232]\n\t"
  17339. "str r5, [%[r], #240]\n\t"
  17340. "lsr r3, r6, #1\n\t"
  17341. "lsl r6, r6, %[n]\n\t"
  17342. "lsr r3, r3, r12\n\t"
  17343. "orr r4, r4, r3\n\t"
  17344. "ldr r5, [%[a], #228]\n\t"
  17345. "str r4, [%[r], #236]\n\t"
  17346. "lsr r3, r5, #1\n\t"
  17347. "lsl r5, r5, %[n]\n\t"
  17348. "lsr r3, r3, r12\n\t"
  17349. "orr r6, r6, r3\n\t"
  17350. "ldr r4, [%[a], #224]\n\t"
  17351. "str r6, [%[r], #232]\n\t"
  17352. "lsr r3, r4, #1\n\t"
  17353. "lsl r4, r4, %[n]\n\t"
  17354. "lsr r3, r3, r12\n\t"
  17355. "orr r5, r5, r3\n\t"
  17356. "ldr r6, [%[a], #220]\n\t"
  17357. "str r5, [%[r], #228]\n\t"
  17358. "lsr r3, r6, #1\n\t"
  17359. "lsl r6, r6, %[n]\n\t"
  17360. "lsr r3, r3, r12\n\t"
  17361. "orr r4, r4, r3\n\t"
  17362. "ldr r5, [%[a], #216]\n\t"
  17363. "str r4, [%[r], #224]\n\t"
  17364. "lsr r3, r5, #1\n\t"
  17365. "lsl r5, r5, %[n]\n\t"
  17366. "lsr r3, r3, r12\n\t"
  17367. "orr r6, r6, r3\n\t"
  17368. "ldr r4, [%[a], #212]\n\t"
  17369. "str r6, [%[r], #220]\n\t"
  17370. "lsr r3, r4, #1\n\t"
  17371. "lsl r4, r4, %[n]\n\t"
  17372. "lsr r3, r3, r12\n\t"
  17373. "orr r5, r5, r3\n\t"
  17374. "ldr r6, [%[a], #208]\n\t"
  17375. "str r5, [%[r], #216]\n\t"
  17376. "lsr r3, r6, #1\n\t"
  17377. "lsl r6, r6, %[n]\n\t"
  17378. "lsr r3, r3, r12\n\t"
  17379. "orr r4, r4, r3\n\t"
  17380. "ldr r5, [%[a], #204]\n\t"
  17381. "str r4, [%[r], #212]\n\t"
  17382. "lsr r3, r5, #1\n\t"
  17383. "lsl r5, r5, %[n]\n\t"
  17384. "lsr r3, r3, r12\n\t"
  17385. "orr r6, r6, r3\n\t"
  17386. "ldr r4, [%[a], #200]\n\t"
  17387. "str r6, [%[r], #208]\n\t"
  17388. "lsr r3, r4, #1\n\t"
  17389. "lsl r4, r4, %[n]\n\t"
  17390. "lsr r3, r3, r12\n\t"
  17391. "orr r5, r5, r3\n\t"
  17392. "ldr r6, [%[a], #196]\n\t"
  17393. "str r5, [%[r], #204]\n\t"
  17394. "lsr r3, r6, #1\n\t"
  17395. "lsl r6, r6, %[n]\n\t"
  17396. "lsr r3, r3, r12\n\t"
  17397. "orr r4, r4, r3\n\t"
  17398. "ldr r5, [%[a], #192]\n\t"
  17399. "str r4, [%[r], #200]\n\t"
  17400. "lsr r3, r5, #1\n\t"
  17401. "lsl r5, r5, %[n]\n\t"
  17402. "lsr r3, r3, r12\n\t"
  17403. "orr r6, r6, r3\n\t"
  17404. "ldr r4, [%[a], #188]\n\t"
  17405. "str r6, [%[r], #196]\n\t"
  17406. "lsr r3, r4, #1\n\t"
  17407. "lsl r4, r4, %[n]\n\t"
  17408. "lsr r3, r3, r12\n\t"
  17409. "orr r5, r5, r3\n\t"
  17410. "ldr r6, [%[a], #184]\n\t"
  17411. "str r5, [%[r], #192]\n\t"
  17412. "lsr r3, r6, #1\n\t"
  17413. "lsl r6, r6, %[n]\n\t"
  17414. "lsr r3, r3, r12\n\t"
  17415. "orr r4, r4, r3\n\t"
  17416. "ldr r5, [%[a], #180]\n\t"
  17417. "str r4, [%[r], #188]\n\t"
  17418. "lsr r3, r5, #1\n\t"
  17419. "lsl r5, r5, %[n]\n\t"
  17420. "lsr r3, r3, r12\n\t"
  17421. "orr r6, r6, r3\n\t"
  17422. "ldr r4, [%[a], #176]\n\t"
  17423. "str r6, [%[r], #184]\n\t"
  17424. "lsr r3, r4, #1\n\t"
  17425. "lsl r4, r4, %[n]\n\t"
  17426. "lsr r3, r3, r12\n\t"
  17427. "orr r5, r5, r3\n\t"
  17428. "ldr r6, [%[a], #172]\n\t"
  17429. "str r5, [%[r], #180]\n\t"
  17430. "lsr r3, r6, #1\n\t"
  17431. "lsl r6, r6, %[n]\n\t"
  17432. "lsr r3, r3, r12\n\t"
  17433. "orr r4, r4, r3\n\t"
  17434. "ldr r5, [%[a], #168]\n\t"
  17435. "str r4, [%[r], #176]\n\t"
  17436. "lsr r3, r5, #1\n\t"
  17437. "lsl r5, r5, %[n]\n\t"
  17438. "lsr r3, r3, r12\n\t"
  17439. "orr r6, r6, r3\n\t"
  17440. "ldr r4, [%[a], #164]\n\t"
  17441. "str r6, [%[r], #172]\n\t"
  17442. "lsr r3, r4, #1\n\t"
  17443. "lsl r4, r4, %[n]\n\t"
  17444. "lsr r3, r3, r12\n\t"
  17445. "orr r5, r5, r3\n\t"
  17446. "ldr r6, [%[a], #160]\n\t"
  17447. "str r5, [%[r], #168]\n\t"
  17448. "lsr r3, r6, #1\n\t"
  17449. "lsl r6, r6, %[n]\n\t"
  17450. "lsr r3, r3, r12\n\t"
  17451. "orr r4, r4, r3\n\t"
  17452. "ldr r5, [%[a], #156]\n\t"
  17453. "str r4, [%[r], #164]\n\t"
  17454. "lsr r3, r5, #1\n\t"
  17455. "lsl r5, r5, %[n]\n\t"
  17456. "lsr r3, r3, r12\n\t"
  17457. "orr r6, r6, r3\n\t"
  17458. "ldr r4, [%[a], #152]\n\t"
  17459. "str r6, [%[r], #160]\n\t"
  17460. "lsr r3, r4, #1\n\t"
  17461. "lsl r4, r4, %[n]\n\t"
  17462. "lsr r3, r3, r12\n\t"
  17463. "orr r5, r5, r3\n\t"
  17464. "ldr r6, [%[a], #148]\n\t"
  17465. "str r5, [%[r], #156]\n\t"
  17466. "lsr r3, r6, #1\n\t"
  17467. "lsl r6, r6, %[n]\n\t"
  17468. "lsr r3, r3, r12\n\t"
  17469. "orr r4, r4, r3\n\t"
  17470. "ldr r5, [%[a], #144]\n\t"
  17471. "str r4, [%[r], #152]\n\t"
  17472. "lsr r3, r5, #1\n\t"
  17473. "lsl r5, r5, %[n]\n\t"
  17474. "lsr r3, r3, r12\n\t"
  17475. "orr r6, r6, r3\n\t"
  17476. "ldr r4, [%[a], #140]\n\t"
  17477. "str r6, [%[r], #148]\n\t"
  17478. "lsr r3, r4, #1\n\t"
  17479. "lsl r4, r4, %[n]\n\t"
  17480. "lsr r3, r3, r12\n\t"
  17481. "orr r5, r5, r3\n\t"
  17482. "ldr r6, [%[a], #136]\n\t"
  17483. "str r5, [%[r], #144]\n\t"
  17484. "lsr r3, r6, #1\n\t"
  17485. "lsl r6, r6, %[n]\n\t"
  17486. "lsr r3, r3, r12\n\t"
  17487. "orr r4, r4, r3\n\t"
  17488. "ldr r5, [%[a], #132]\n\t"
  17489. "str r4, [%[r], #140]\n\t"
  17490. "lsr r3, r5, #1\n\t"
  17491. "lsl r5, r5, %[n]\n\t"
  17492. "lsr r3, r3, r12\n\t"
  17493. "orr r6, r6, r3\n\t"
  17494. "ldr r4, [%[a], #128]\n\t"
  17495. "str r6, [%[r], #136]\n\t"
  17496. "lsr r3, r4, #1\n\t"
  17497. "lsl r4, r4, %[n]\n\t"
  17498. "lsr r3, r3, r12\n\t"
  17499. "orr r5, r5, r3\n\t"
  17500. "ldr r6, [%[a], #124]\n\t"
  17501. "str r5, [%[r], #132]\n\t"
  17502. "lsr r3, r6, #1\n\t"
  17503. "lsl r6, r6, %[n]\n\t"
  17504. "lsr r3, r3, r12\n\t"
  17505. "orr r4, r4, r3\n\t"
  17506. "ldr r5, [%[a], #120]\n\t"
  17507. "str r4, [%[r], #128]\n\t"
  17508. "lsr r3, r5, #1\n\t"
  17509. "lsl r5, r5, %[n]\n\t"
  17510. "lsr r3, r3, r12\n\t"
  17511. "orr r6, r6, r3\n\t"
  17512. "ldr r4, [%[a], #116]\n\t"
  17513. "str r6, [%[r], #124]\n\t"
  17514. "lsr r3, r4, #1\n\t"
  17515. "lsl r4, r4, %[n]\n\t"
  17516. "lsr r3, r3, r12\n\t"
  17517. "orr r5, r5, r3\n\t"
  17518. "ldr r6, [%[a], #112]\n\t"
  17519. "str r5, [%[r], #120]\n\t"
  17520. "lsr r3, r6, #1\n\t"
  17521. "lsl r6, r6, %[n]\n\t"
  17522. "lsr r3, r3, r12\n\t"
  17523. "orr r4, r4, r3\n\t"
  17524. "ldr r5, [%[a], #108]\n\t"
  17525. "str r4, [%[r], #116]\n\t"
  17526. "lsr r3, r5, #1\n\t"
  17527. "lsl r5, r5, %[n]\n\t"
  17528. "lsr r3, r3, r12\n\t"
  17529. "orr r6, r6, r3\n\t"
  17530. "ldr r4, [%[a], #104]\n\t"
  17531. "str r6, [%[r], #112]\n\t"
  17532. "lsr r3, r4, #1\n\t"
  17533. "lsl r4, r4, %[n]\n\t"
  17534. "lsr r3, r3, r12\n\t"
  17535. "orr r5, r5, r3\n\t"
  17536. "ldr r6, [%[a], #100]\n\t"
  17537. "str r5, [%[r], #108]\n\t"
  17538. "lsr r3, r6, #1\n\t"
  17539. "lsl r6, r6, %[n]\n\t"
  17540. "lsr r3, r3, r12\n\t"
  17541. "orr r4, r4, r3\n\t"
  17542. "ldr r5, [%[a], #96]\n\t"
  17543. "str r4, [%[r], #104]\n\t"
  17544. "lsr r3, r5, #1\n\t"
  17545. "lsl r5, r5, %[n]\n\t"
  17546. "lsr r3, r3, r12\n\t"
  17547. "orr r6, r6, r3\n\t"
  17548. "ldr r4, [%[a], #92]\n\t"
  17549. "str r6, [%[r], #100]\n\t"
  17550. "lsr r3, r4, #1\n\t"
  17551. "lsl r4, r4, %[n]\n\t"
  17552. "lsr r3, r3, r12\n\t"
  17553. "orr r5, r5, r3\n\t"
  17554. "ldr r6, [%[a], #88]\n\t"
  17555. "str r5, [%[r], #96]\n\t"
  17556. "lsr r3, r6, #1\n\t"
  17557. "lsl r6, r6, %[n]\n\t"
  17558. "lsr r3, r3, r12\n\t"
  17559. "orr r4, r4, r3\n\t"
  17560. "ldr r5, [%[a], #84]\n\t"
  17561. "str r4, [%[r], #92]\n\t"
  17562. "lsr r3, r5, #1\n\t"
  17563. "lsl r5, r5, %[n]\n\t"
  17564. "lsr r3, r3, r12\n\t"
  17565. "orr r6, r6, r3\n\t"
  17566. "ldr r4, [%[a], #80]\n\t"
  17567. "str r6, [%[r], #88]\n\t"
  17568. "lsr r3, r4, #1\n\t"
  17569. "lsl r4, r4, %[n]\n\t"
  17570. "lsr r3, r3, r12\n\t"
  17571. "orr r5, r5, r3\n\t"
  17572. "ldr r6, [%[a], #76]\n\t"
  17573. "str r5, [%[r], #84]\n\t"
  17574. "lsr r3, r6, #1\n\t"
  17575. "lsl r6, r6, %[n]\n\t"
  17576. "lsr r3, r3, r12\n\t"
  17577. "orr r4, r4, r3\n\t"
  17578. "ldr r5, [%[a], #72]\n\t"
  17579. "str r4, [%[r], #80]\n\t"
  17580. "lsr r3, r5, #1\n\t"
  17581. "lsl r5, r5, %[n]\n\t"
  17582. "lsr r3, r3, r12\n\t"
  17583. "orr r6, r6, r3\n\t"
  17584. "ldr r4, [%[a], #68]\n\t"
  17585. "str r6, [%[r], #76]\n\t"
  17586. "lsr r3, r4, #1\n\t"
  17587. "lsl r4, r4, %[n]\n\t"
  17588. "lsr r3, r3, r12\n\t"
  17589. "orr r5, r5, r3\n\t"
  17590. "ldr r6, [%[a], #64]\n\t"
  17591. "str r5, [%[r], #72]\n\t"
  17592. "lsr r3, r6, #1\n\t"
  17593. "lsl r6, r6, %[n]\n\t"
  17594. "lsr r3, r3, r12\n\t"
  17595. "orr r4, r4, r3\n\t"
  17596. "ldr r5, [%[a], #60]\n\t"
  17597. "str r4, [%[r], #68]\n\t"
  17598. "lsr r3, r5, #1\n\t"
  17599. "lsl r5, r5, %[n]\n\t"
  17600. "lsr r3, r3, r12\n\t"
  17601. "orr r6, r6, r3\n\t"
  17602. "ldr r4, [%[a], #56]\n\t"
  17603. "str r6, [%[r], #64]\n\t"
  17604. "lsr r3, r4, #1\n\t"
  17605. "lsl r4, r4, %[n]\n\t"
  17606. "lsr r3, r3, r12\n\t"
  17607. "orr r5, r5, r3\n\t"
  17608. "ldr r6, [%[a], #52]\n\t"
  17609. "str r5, [%[r], #60]\n\t"
  17610. "lsr r3, r6, #1\n\t"
  17611. "lsl r6, r6, %[n]\n\t"
  17612. "lsr r3, r3, r12\n\t"
  17613. "orr r4, r4, r3\n\t"
  17614. "ldr r5, [%[a], #48]\n\t"
  17615. "str r4, [%[r], #56]\n\t"
  17616. "lsr r3, r5, #1\n\t"
  17617. "lsl r5, r5, %[n]\n\t"
  17618. "lsr r3, r3, r12\n\t"
  17619. "orr r6, r6, r3\n\t"
  17620. "ldr r4, [%[a], #44]\n\t"
  17621. "str r6, [%[r], #52]\n\t"
  17622. "lsr r3, r4, #1\n\t"
  17623. "lsl r4, r4, %[n]\n\t"
  17624. "lsr r3, r3, r12\n\t"
  17625. "orr r5, r5, r3\n\t"
  17626. "ldr r6, [%[a], #40]\n\t"
  17627. "str r5, [%[r], #48]\n\t"
  17628. "lsr r3, r6, #1\n\t"
  17629. "lsl r6, r6, %[n]\n\t"
  17630. "lsr r3, r3, r12\n\t"
  17631. "orr r4, r4, r3\n\t"
  17632. "ldr r5, [%[a], #36]\n\t"
  17633. "str r4, [%[r], #44]\n\t"
  17634. "lsr r3, r5, #1\n\t"
  17635. "lsl r5, r5, %[n]\n\t"
  17636. "lsr r3, r3, r12\n\t"
  17637. "orr r6, r6, r3\n\t"
  17638. "ldr r4, [%[a], #32]\n\t"
  17639. "str r6, [%[r], #40]\n\t"
  17640. "lsr r3, r4, #1\n\t"
  17641. "lsl r4, r4, %[n]\n\t"
  17642. "lsr r3, r3, r12\n\t"
  17643. "orr r5, r5, r3\n\t"
  17644. "ldr r6, [%[a], #28]\n\t"
  17645. "str r5, [%[r], #36]\n\t"
  17646. "lsr r3, r6, #1\n\t"
  17647. "lsl r6, r6, %[n]\n\t"
  17648. "lsr r3, r3, r12\n\t"
  17649. "orr r4, r4, r3\n\t"
  17650. "ldr r5, [%[a], #24]\n\t"
  17651. "str r4, [%[r], #32]\n\t"
  17652. "lsr r3, r5, #1\n\t"
  17653. "lsl r5, r5, %[n]\n\t"
  17654. "lsr r3, r3, r12\n\t"
  17655. "orr r6, r6, r3\n\t"
  17656. "ldr r4, [%[a], #20]\n\t"
  17657. "str r6, [%[r], #28]\n\t"
  17658. "lsr r3, r4, #1\n\t"
  17659. "lsl r4, r4, %[n]\n\t"
  17660. "lsr r3, r3, r12\n\t"
  17661. "orr r5, r5, r3\n\t"
  17662. "ldr r6, [%[a], #16]\n\t"
  17663. "str r5, [%[r], #24]\n\t"
  17664. "lsr r3, r6, #1\n\t"
  17665. "lsl r6, r6, %[n]\n\t"
  17666. "lsr r3, r3, r12\n\t"
  17667. "orr r4, r4, r3\n\t"
  17668. "ldr r5, [%[a], #12]\n\t"
  17669. "str r4, [%[r], #20]\n\t"
  17670. "lsr r3, r5, #1\n\t"
  17671. "lsl r5, r5, %[n]\n\t"
  17672. "lsr r3, r3, r12\n\t"
  17673. "orr r6, r6, r3\n\t"
  17674. "ldr r4, [%[a], #8]\n\t"
  17675. "str r6, [%[r], #16]\n\t"
  17676. "lsr r3, r4, #1\n\t"
  17677. "lsl r4, r4, %[n]\n\t"
  17678. "lsr r3, r3, r12\n\t"
  17679. "orr r5, r5, r3\n\t"
  17680. "ldr r6, [%[a], #4]\n\t"
  17681. "str r5, [%[r], #12]\n\t"
  17682. "lsr r3, r6, #1\n\t"
  17683. "lsl r6, r6, %[n]\n\t"
  17684. "lsr r3, r3, r12\n\t"
  17685. "orr r4, r4, r3\n\t"
  17686. "ldr r5, [%[a]]\n\t"
  17687. "str r4, [%[r], #8]\n\t"
  17688. "lsr r3, r5, #1\n\t"
  17689. "lsl r5, r5, %[n]\n\t"
  17690. "lsr r3, r3, r12\n\t"
  17691. "orr r6, r6, r3\n\t"
  17692. "str r5, [%[r]]\n\t"
  17693. "str r6, [%[r], #4]\n\t"
  17694. : [r] "+r" (r), [a] "+r" (a), [n] "+r" (n)
  17695. :
  17696. : "memory", "r4", "r5", "r6", "r3", "r12", "cc"
  17697. );
  17698. }
  17699. /* Modular exponentiate 2 to the e mod m. (r = 2^e mod m)
  17700. *
  17701. * r A single precision number that is the result of the operation.
  17702. * e A single precision number that is the exponent.
  17703. * bits The number of bits in the exponent.
  17704. * m A single precision number that is the modulus.
  17705. * returns 0 on success.
  17706. * returns MEMORY_E on dynamic memory allocation failure.
  17707. * returns MP_VAL when base is even.
  17708. */
  17709. static int sp_2048_mod_exp_2_64(sp_digit* r, const sp_digit* e, int bits,
  17710. const sp_digit* m)
  17711. {
  17712. #ifdef WOLFSSL_SP_SMALL_STACK
  17713. sp_digit* td = NULL;
  17714. #else
  17715. sp_digit td[193];
  17716. #endif
  17717. sp_digit* norm = NULL;
  17718. sp_digit* tmp = NULL;
  17719. sp_digit mp = 1;
  17720. sp_digit n;
  17721. sp_digit o;
  17722. sp_digit mask;
  17723. int i;
  17724. int c;
  17725. byte y;
  17726. int err = MP_OKAY;
  17727. if (bits == 0) {
  17728. err = MP_VAL;
  17729. }
  17730. #ifdef WOLFSSL_SP_SMALL_STACK
  17731. if (err == MP_OKAY) {
  17732. td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 193, NULL,
  17733. DYNAMIC_TYPE_TMP_BUFFER);
  17734. if (td == NULL)
  17735. err = MEMORY_E;
  17736. }
  17737. #endif
  17738. if (err == MP_OKAY) {
  17739. norm = td;
  17740. tmp = td + 128;
  17741. sp_2048_mont_setup(m, &mp);
  17742. sp_2048_mont_norm_64(norm, m);
  17743. i = (bits - 1) / 32;
  17744. n = e[i--];
  17745. c = bits & 31;
  17746. if (c == 0) {
  17747. c = 32;
  17748. }
  17749. c -= bits % 5;
  17750. if (c == 32) {
  17751. c = 27;
  17752. }
  17753. if (c < 0) {
  17754. /* Number of bits in top word is less than number needed. */
  17755. c = -c;
  17756. y = (byte)(n << c);
  17757. n = e[i--];
  17758. y |= (byte)(n >> (64 - c));
  17759. n <<= c;
  17760. c = 64 - c;
  17761. }
  17762. else if (c == 0) {
  17763. /* All bits in top word used. */
  17764. y = (byte)n;
  17765. }
  17766. else {
  17767. y = (byte)(n >> c);
  17768. n <<= 32 - c;
  17769. }
  17770. sp_2048_lshift_64(r, norm, y);
  17771. for (; i>=0 || c>=5; ) {
  17772. if (c == 0) {
  17773. n = e[i--];
  17774. y = (byte)(n >> 27);
  17775. n <<= 5;
  17776. c = 27;
  17777. }
  17778. else if (c < 5) {
  17779. y = (byte)(n >> 27);
  17780. n = e[i--];
  17781. c = 5 - c;
  17782. y |= (byte)(n >> (32 - c));
  17783. n <<= c;
  17784. c = 32 - c;
  17785. }
  17786. else {
  17787. y = (byte)((n >> 27) & 0x1f);
  17788. n <<= 5;
  17789. c -= 5;
  17790. }
  17791. sp_2048_mont_sqr_64(r, r, m, mp);
  17792. sp_2048_mont_sqr_64(r, r, m, mp);
  17793. sp_2048_mont_sqr_64(r, r, m, mp);
  17794. sp_2048_mont_sqr_64(r, r, m, mp);
  17795. sp_2048_mont_sqr_64(r, r, m, mp);
  17796. sp_2048_lshift_64(r, r, y);
  17797. sp_2048_mul_d_64(tmp, norm, r[64]);
  17798. r[64] = 0;
  17799. o = sp_2048_add_64(r, r, tmp);
  17800. sp_2048_cond_sub_64(r, r, m, (sp_digit)0 - o);
  17801. }
  17802. XMEMSET(&r[64], 0, sizeof(sp_digit) * 64U);
  17803. sp_2048_mont_reduce_64(r, m, mp);
  17804. mask = 0 - (sp_2048_cmp_64(r, m) >= 0);
  17805. sp_2048_cond_sub_64(r, r, m, mask);
  17806. }
  17807. #ifdef WOLFSSL_SP_SMALL_STACK
  17808. if (td != NULL)
  17809. XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  17810. #endif
  17811. return err;
  17812. }
  17813. #endif /* HAVE_FFDHE_2048 */
  17814. /* Perform the modular exponentiation for Diffie-Hellman.
  17815. *
  17816. * base Base.
  17817. * exp Array of bytes that is the exponent.
  17818. * expLen Length of data, in bytes, in exponent.
  17819. * mod Modulus.
  17820. * out Buffer to hold big-endian bytes of exponentiation result.
  17821. * Must be at least 256 bytes long.
  17822. * outLen Length, in bytes, of exponentiation result.
  17823. * returns 0 on success, MP_READ_E if there are too many bytes in an array
  17824. * and MEMORY_E if memory allocation fails.
  17825. */
  17826. int sp_DhExp_2048(const mp_int* base, const byte* exp, word32 expLen,
  17827. const mp_int* mod, byte* out, word32* outLen)
  17828. {
  17829. int err = MP_OKAY;
  17830. sp_digit b[128];
  17831. sp_digit e[64];
  17832. sp_digit m[64];
  17833. sp_digit* r = b;
  17834. word32 i;
  17835. if (mp_count_bits(base) > 2048) {
  17836. err = MP_READ_E;
  17837. }
  17838. else if (expLen > 256) {
  17839. err = MP_READ_E;
  17840. }
  17841. else if (mp_count_bits(mod) != 2048) {
  17842. err = MP_READ_E;
  17843. }
  17844. else if (mp_iseven(mod)) {
  17845. err = MP_VAL;
  17846. }
  17847. if (err == MP_OKAY) {
  17848. sp_2048_from_mp(b, 64, base);
  17849. sp_2048_from_bin(e, 64, exp, expLen);
  17850. sp_2048_from_mp(m, 64, mod);
  17851. #ifdef HAVE_FFDHE_2048
  17852. if (base->used == 1 && base->dp[0] == 2 && m[63] == (sp_digit)-1)
  17853. err = sp_2048_mod_exp_2_64(r, e, expLen * 8, m);
  17854. else
  17855. #endif
  17856. err = sp_2048_mod_exp_64(r, b, e, expLen * 8, m, 0);
  17857. }
  17858. if (err == MP_OKAY) {
  17859. sp_2048_to_bin_64(r, out);
  17860. *outLen = 256;
  17861. for (i=0; i<256 && out[i] == 0; i++) {
  17862. /* Search for first non-zero. */
  17863. }
  17864. *outLen -= i;
  17865. XMEMMOVE(out, out + i, *outLen);
  17866. }
  17867. XMEMSET(e, 0, sizeof(e));
  17868. return err;
  17869. }
  17870. #endif /* WOLFSSL_HAVE_SP_DH */
  17871. /* Perform the modular exponentiation for Diffie-Hellman.
  17872. *
  17873. * base Base. MP integer.
  17874. * exp Exponent. MP integer.
  17875. * mod Modulus. MP integer.
  17876. * res Result. MP integer.
  17877. * returns 0 on success, MP_READ_E if there are too many bytes in an array
  17878. * and MEMORY_E if memory allocation fails.
  17879. */
  17880. int sp_ModExp_1024(const mp_int* base, const mp_int* exp, const mp_int* mod,
  17881. mp_int* res)
  17882. {
  17883. int err = MP_OKAY;
  17884. sp_digit b[64];
  17885. sp_digit e[32];
  17886. sp_digit m[32];
  17887. sp_digit* r = b;
  17888. int expBits = mp_count_bits(exp);
  17889. if (mp_count_bits(base) > 1024) {
  17890. err = MP_READ_E;
  17891. }
  17892. else if (expBits > 1024) {
  17893. err = MP_READ_E;
  17894. }
  17895. else if (mp_count_bits(mod) != 1024) {
  17896. err = MP_READ_E;
  17897. }
  17898. else if (mp_iseven(mod)) {
  17899. err = MP_VAL;
  17900. }
  17901. if (err == MP_OKAY) {
  17902. sp_2048_from_mp(b, 32, base);
  17903. sp_2048_from_mp(e, 32, exp);
  17904. sp_2048_from_mp(m, 32, mod);
  17905. err = sp_2048_mod_exp_32(r, b, e, expBits, m, 0);
  17906. }
  17907. if (err == MP_OKAY) {
  17908. XMEMSET(r + 32, 0, sizeof(*r) * 32U);
  17909. err = sp_2048_to_mp(r, res);
  17910. res->used = mod->used;
  17911. mp_clamp(res);
  17912. }
  17913. XMEMSET(e, 0, sizeof(e));
  17914. return err;
  17915. }
  17916. #endif /* WOLFSSL_HAVE_SP_DH | (WOLFSSL_HAVE_SP_RSA & !WOLFSSL_RSA_PUBLIC_ONLY) */
  17917. #endif /* !WOLFSSL_SP_NO_2048 */
  17918. #ifndef WOLFSSL_SP_NO_3072
  17919. /* Read big endian unsigned byte array into r.
  17920. *
  17921. * r A single precision integer.
  17922. * size Maximum number of bytes to convert
  17923. * a Byte array.
  17924. * n Number of bytes in array to read.
  17925. */
  17926. static void sp_3072_from_bin(sp_digit* r, int size, const byte* a, int n)
  17927. {
  17928. int i;
  17929. int j;
  17930. byte* d;
  17931. for (i = n - 1,j = 0; i >= 3; i -= 4) {
  17932. r[j] = ((sp_digit)a[i - 0] << 0) |
  17933. ((sp_digit)a[i - 1] << 8) |
  17934. ((sp_digit)a[i - 2] << 16) |
  17935. ((sp_digit)a[i - 3] << 24);
  17936. j++;
  17937. }
  17938. if (i >= 0) {
  17939. r[j] = 0;
  17940. d = (byte*)r;
  17941. switch (i) {
  17942. case 2: d[n - 1 - 2] = a[2]; //fallthrough
  17943. case 1: d[n - 1 - 1] = a[1]; //fallthrough
  17944. case 0: d[n - 1 - 0] = a[0]; //fallthrough
  17945. }
  17946. j++;
  17947. }
  17948. for (; j < size; j++) {
  17949. r[j] = 0;
  17950. }
  17951. }
  17952. /* Convert an mp_int to an array of sp_digit.
  17953. *
  17954. * r A single precision integer.
  17955. * size Maximum number of bytes to convert
  17956. * a A multi-precision integer.
  17957. */
  17958. static void sp_3072_from_mp(sp_digit* r, int size, const mp_int* a)
  17959. {
  17960. #if DIGIT_BIT == 32
  17961. int i;
  17962. sp_digit j = (sp_digit)0 - (sp_digit)a->used;
  17963. int o = 0;
  17964. for (i = 0; i < size; i++) {
  17965. sp_digit mask = (sp_digit)0 - (j >> 31);
  17966. r[i] = a->dp[o] & mask;
  17967. j++;
  17968. o += (int)(j >> 31);
  17969. }
  17970. #elif DIGIT_BIT > 32
  17971. unsigned int i;
  17972. int j = 0;
  17973. word32 s = 0;
  17974. r[0] = 0;
  17975. for (i = 0; i < (unsigned int)a->used && j < size; i++) {
  17976. r[j] |= ((sp_digit)a->dp[i] << s);
  17977. r[j] &= 0xffffffff;
  17978. s = 32U - s;
  17979. if (j + 1 >= size) {
  17980. break;
  17981. }
  17982. /* lint allow cast of mismatch word32 and mp_digit */
  17983. r[++j] = (sp_digit)(a->dp[i] >> s); /*lint !e9033*/
  17984. while ((s + 32U) <= (word32)DIGIT_BIT) {
  17985. s += 32U;
  17986. r[j] &= 0xffffffff;
  17987. if (j + 1 >= size) {
  17988. break;
  17989. }
  17990. if (s < (word32)DIGIT_BIT) {
  17991. /* lint allow cast of mismatch word32 and mp_digit */
  17992. r[++j] = (sp_digit)(a->dp[i] >> s); /*lint !e9033*/
  17993. }
  17994. else {
  17995. r[++j] = (sp_digit)0;
  17996. }
  17997. }
  17998. s = (word32)DIGIT_BIT - s;
  17999. }
  18000. for (j++; j < size; j++) {
  18001. r[j] = 0;
  18002. }
  18003. #else
  18004. unsigned int i;
  18005. int j = 0;
  18006. int s = 0;
  18007. r[0] = 0;
  18008. for (i = 0; i < (unsigned int)a->used && j < size; i++) {
  18009. r[j] |= ((sp_digit)a->dp[i]) << s;
  18010. if (s + DIGIT_BIT >= 32) {
  18011. r[j] &= 0xffffffff;
  18012. if (j + 1 >= size) {
  18013. break;
  18014. }
  18015. s = 32 - s;
  18016. if (s == DIGIT_BIT) {
  18017. r[++j] = 0;
  18018. s = 0;
  18019. }
  18020. else {
  18021. r[++j] = a->dp[i] >> s;
  18022. s = DIGIT_BIT - s;
  18023. }
  18024. }
  18025. else {
  18026. s += DIGIT_BIT;
  18027. }
  18028. }
  18029. for (j++; j < size; j++) {
  18030. r[j] = 0;
  18031. }
  18032. #endif
  18033. }
  18034. /* Write r as big endian to byte array.
  18035. * Fixed length number of bytes written: 384
  18036. *
  18037. * r A single precision integer.
  18038. * a Byte array.
  18039. */
  18040. static void sp_3072_to_bin_96(sp_digit* r, byte* a)
  18041. {
  18042. int i;
  18043. int j = 0;
  18044. for (i = 95; i >= 0; i--) {
  18045. a[j++] = r[i] >> 24;
  18046. a[j++] = r[i] >> 16;
  18047. a[j++] = r[i] >> 8;
  18048. a[j++] = r[i] >> 0;
  18049. }
  18050. }
  18051. #if (defined(WOLFSSL_HAVE_SP_RSA) && (!defined(WOLFSSL_RSA_PUBLIC_ONLY) || !defined(WOLFSSL_SP_SMALL))) || defined(WOLFSSL_HAVE_SP_DH)
  18052. /* Normalize the values in each word to 32.
  18053. *
  18054. * a Array of sp_digit to normalize.
  18055. */
  18056. #define sp_3072_norm_96(a)
  18057. #endif /* (WOLFSSL_HAVE_SP_RSA && (!WOLFSSL_RSA_PUBLIC_ONLY || !WOLFSSL_SP_SMALL)) || WOLFSSL_HAVE_SP_DH */
  18058. /* Normalize the values in each word to 32.
  18059. *
  18060. * a Array of sp_digit to normalize.
  18061. */
  18062. #define sp_3072_norm_96(a)
  18063. #ifndef WOLFSSL_SP_SMALL
  18064. /* Multiply a and b into r. (r = a * b)
  18065. *
  18066. * r A single precision integer.
  18067. * a A single precision integer.
  18068. * b A single precision integer.
  18069. */
  18070. static void sp_3072_mul_12(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p)
  18071. {
  18072. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  18073. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  18074. register const sp_digit* b asm ("r2") = (const sp_digit*)b_p;
  18075. __asm__ __volatile__ (
  18076. "sub sp, sp, #48\n\t"
  18077. /* A[0] * B[0] */
  18078. "ldr r11, [%[a]]\n\t"
  18079. "ldr r12, [%[b]]\n\t"
  18080. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  18081. "lsl r6, r11, #16\n\t"
  18082. "lsl r3, r12, #16\n\t"
  18083. "lsr r6, r6, #16\n\t"
  18084. "lsr r3, r3, #16\n\t"
  18085. "mul r3, r6, r3\n\t"
  18086. "lsr r7, r12, #16\n\t"
  18087. "mul r6, r7, r6\n\t"
  18088. "lsr r4, r6, #16\n\t"
  18089. "lsl r6, r6, #16\n\t"
  18090. "adds r3, r3, r6\n\t"
  18091. "adc r4, r4, #0\n\t"
  18092. "lsr r6, r11, #16\n\t"
  18093. "mul r7, r6, r7\n\t"
  18094. "add r4, r4, r7\n\t"
  18095. "lsl r7, r12, #16\n\t"
  18096. "lsr r7, r7, #16\n\t"
  18097. "mul r6, r7, r6\n\t"
  18098. "lsr r7, r6, #16\n\t"
  18099. "lsl r6, r6, #16\n\t"
  18100. "adds r3, r3, r6\n\t"
  18101. "adc r4, r4, r7\n\t"
  18102. "mov r5, #0\n\t"
  18103. #else
  18104. "umull r3, r4, r11, r12\n\t"
  18105. "mov r5, #0\n\t"
  18106. #endif
  18107. "str r3, [sp]\n\t"
  18108. /* A[0] * B[1] */
  18109. "ldr r9, [%[b], #4]\n\t"
  18110. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  18111. "lsl r6, r11, #16\n\t"
  18112. "lsl r7, r9, #16\n\t"
  18113. "lsr r6, r6, #16\n\t"
  18114. "lsr r7, r7, #16\n\t"
  18115. "mul r7, r6, r7\n\t"
  18116. "adds r4, r4, r7\n\t"
  18117. "adcs r5, r5, #0\n\t"
  18118. "mov r3, #0\n\t"
  18119. "adc r3, r3, #0\n\t"
  18120. "lsr r7, r9, #16\n\t"
  18121. "mul r6, r7, r6\n\t"
  18122. "lsr r7, r6, #16\n\t"
  18123. "lsl r6, r6, #16\n\t"
  18124. "adds r4, r4, r6\n\t"
  18125. "adcs r5, r5, r7\n\t"
  18126. "adc r3, r3, #0\n\t"
  18127. "lsr r6, r11, #16\n\t"
  18128. "lsr r7, r9, #16\n\t"
  18129. "mul r7, r6, r7\n\t"
  18130. "adds r5, r5, r7\n\t"
  18131. "adc r3, r3, #0\n\t"
  18132. "lsl r7, r9, #16\n\t"
  18133. "lsr r7, r7, #16\n\t"
  18134. "mul r6, r7, r6\n\t"
  18135. "lsr r7, r6, #16\n\t"
  18136. "lsl r6, r6, #16\n\t"
  18137. "adds r4, r4, r6\n\t"
  18138. "adcs r5, r5, r7\n\t"
  18139. "adc r3, r3, #0\n\t"
  18140. #else
  18141. "umull r6, r7, r11, r9\n\t"
  18142. "adds r4, r4, r6\n\t"
  18143. "adcs r5, r5, r7\n\t"
  18144. "mov r3, #0\n\t"
  18145. "adc r3, r3, #0\n\t"
  18146. #endif
  18147. /* A[1] * B[0] */
  18148. "ldr r8, [%[a], #4]\n\t"
  18149. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  18150. "lsl r6, r8, #16\n\t"
  18151. "lsl r7, r12, #16\n\t"
  18152. "lsr r6, r6, #16\n\t"
  18153. "lsr r7, r7, #16\n\t"
  18154. "mul r7, r6, r7\n\t"
  18155. "adds r4, r4, r7\n\t"
  18156. "adcs r5, r5, #0\n\t"
  18157. "adc r3, r3, #0\n\t"
  18158. "lsr r7, r12, #16\n\t"
  18159. "mul r6, r7, r6\n\t"
  18160. "lsr r7, r6, #16\n\t"
  18161. "lsl r6, r6, #16\n\t"
  18162. "adds r4, r4, r6\n\t"
  18163. "adcs r5, r5, r7\n\t"
  18164. "adc r3, r3, #0\n\t"
  18165. "lsr r6, r8, #16\n\t"
  18166. "lsr r7, r12, #16\n\t"
  18167. "mul r7, r6, r7\n\t"
  18168. "adds r5, r5, r7\n\t"
  18169. "adc r3, r3, #0\n\t"
  18170. "lsl r7, r12, #16\n\t"
  18171. "lsr r7, r7, #16\n\t"
  18172. "mul r6, r7, r6\n\t"
  18173. "lsr r7, r6, #16\n\t"
  18174. "lsl r6, r6, #16\n\t"
  18175. "adds r4, r4, r6\n\t"
  18176. "adcs r5, r5, r7\n\t"
  18177. "adc r3, r3, #0\n\t"
  18178. #else
  18179. "umull r6, r7, r8, r12\n\t"
  18180. "adds r4, r4, r6\n\t"
  18181. "adcs r5, r5, r7\n\t"
  18182. "adc r3, r3, #0\n\t"
  18183. #endif
  18184. "str r4, [sp, #4]\n\t"
  18185. /* A[2] * B[0] */
  18186. "ldr r8, [%[a], #8]\n\t"
  18187. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  18188. "lsl r6, r8, #16\n\t"
  18189. "lsl r7, r12, #16\n\t"
  18190. "lsr r6, r6, #16\n\t"
  18191. "lsr r7, r7, #16\n\t"
  18192. "mul r7, r6, r7\n\t"
  18193. "adds r5, r5, r7\n\t"
  18194. "adcs r3, r3, #0\n\t"
  18195. "mov r4, #0\n\t"
  18196. "adc r4, r4, #0\n\t"
  18197. "lsr r7, r12, #16\n\t"
  18198. "mul r6, r7, r6\n\t"
  18199. "lsr r7, r6, #16\n\t"
  18200. "lsl r6, r6, #16\n\t"
  18201. "adds r5, r5, r6\n\t"
  18202. "adcs r3, r3, r7\n\t"
  18203. "adc r4, r4, #0\n\t"
  18204. "lsr r6, r8, #16\n\t"
  18205. "lsr r7, r12, #16\n\t"
  18206. "mul r7, r6, r7\n\t"
  18207. "adds r3, r3, r7\n\t"
  18208. "adc r4, r4, #0\n\t"
  18209. "lsl r7, r12, #16\n\t"
  18210. "lsr r7, r7, #16\n\t"
  18211. "mul r6, r7, r6\n\t"
  18212. "lsr r7, r6, #16\n\t"
  18213. "lsl r6, r6, #16\n\t"
  18214. "adds r5, r5, r6\n\t"
  18215. "adcs r3, r3, r7\n\t"
  18216. "adc r4, r4, #0\n\t"
  18217. #else
  18218. "umull r6, r7, r8, r12\n\t"
  18219. "adds r5, r5, r6\n\t"
  18220. "adcs r3, r3, r7\n\t"
  18221. "mov r4, #0\n\t"
  18222. "adc r4, r4, #0\n\t"
  18223. #endif
  18224. /* A[1] * B[1] */
  18225. "ldr r11, [%[a], #4]\n\t"
  18226. "ldr r12, [%[b], #4]\n\t"
  18227. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  18228. "lsl r6, r11, #16\n\t"
  18229. "lsl r7, r12, #16\n\t"
  18230. "lsr r6, r6, #16\n\t"
  18231. "lsr r7, r7, #16\n\t"
  18232. "mul r7, r6, r7\n\t"
  18233. "adds r5, r5, r7\n\t"
  18234. "adcs r3, r3, #0\n\t"
  18235. "adc r4, r4, #0\n\t"
  18236. "lsr r7, r12, #16\n\t"
  18237. "mul r6, r7, r6\n\t"
  18238. "lsr r7, r6, #16\n\t"
  18239. "lsl r6, r6, #16\n\t"
  18240. "adds r5, r5, r6\n\t"
  18241. "adcs r3, r3, r7\n\t"
  18242. "adc r4, r4, #0\n\t"
  18243. "lsr r6, r11, #16\n\t"
  18244. "lsr r7, r12, #16\n\t"
  18245. "mul r7, r6, r7\n\t"
  18246. "adds r3, r3, r7\n\t"
  18247. "adc r4, r4, #0\n\t"
  18248. "lsl r7, r12, #16\n\t"
  18249. "lsr r7, r7, #16\n\t"
  18250. "mul r6, r7, r6\n\t"
  18251. "lsr r7, r6, #16\n\t"
  18252. "lsl r6, r6, #16\n\t"
  18253. "adds r5, r5, r6\n\t"
  18254. "adcs r3, r3, r7\n\t"
  18255. "adc r4, r4, #0\n\t"
  18256. #else
  18257. "umull r6, r7, r11, r12\n\t"
  18258. "adds r5, r5, r6\n\t"
  18259. "adcs r3, r3, r7\n\t"
  18260. "adc r4, r4, #0\n\t"
  18261. #endif
  18262. /* A[0] * B[2] */
  18263. "ldr r8, [%[a]]\n\t"
  18264. "ldr r9, [%[b], #8]\n\t"
  18265. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  18266. "lsl r6, r8, #16\n\t"
  18267. "lsl r7, r9, #16\n\t"
  18268. "lsr r6, r6, #16\n\t"
  18269. "lsr r7, r7, #16\n\t"
  18270. "mul r7, r6, r7\n\t"
  18271. "adds r5, r5, r7\n\t"
  18272. "adcs r3, r3, #0\n\t"
  18273. "adc r4, r4, #0\n\t"
  18274. "lsr r7, r9, #16\n\t"
  18275. "mul r6, r7, r6\n\t"
  18276. "lsr r7, r6, #16\n\t"
  18277. "lsl r6, r6, #16\n\t"
  18278. "adds r5, r5, r6\n\t"
  18279. "adcs r3, r3, r7\n\t"
  18280. "adc r4, r4, #0\n\t"
  18281. "lsr r6, r8, #16\n\t"
  18282. "lsr r7, r9, #16\n\t"
  18283. "mul r7, r6, r7\n\t"
  18284. "adds r3, r3, r7\n\t"
  18285. "adc r4, r4, #0\n\t"
  18286. "lsl r7, r9, #16\n\t"
  18287. "lsr r7, r7, #16\n\t"
  18288. "mul r6, r7, r6\n\t"
  18289. "lsr r7, r6, #16\n\t"
  18290. "lsl r6, r6, #16\n\t"
  18291. "adds r5, r5, r6\n\t"
  18292. "adcs r3, r3, r7\n\t"
  18293. "adc r4, r4, #0\n\t"
  18294. #else
  18295. "umull r6, r7, r8, r9\n\t"
  18296. "adds r5, r5, r6\n\t"
  18297. "adcs r3, r3, r7\n\t"
  18298. "adc r4, r4, #0\n\t"
  18299. #endif
  18300. "str r5, [sp, #8]\n\t"
  18301. /* A[0] * B[3] */
  18302. "ldr r9, [%[b], #12]\n\t"
  18303. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  18304. "lsl r6, r8, #16\n\t"
  18305. "lsl r7, r9, #16\n\t"
  18306. "lsr r6, r6, #16\n\t"
  18307. "lsr r7, r7, #16\n\t"
  18308. "mul r7, r6, r7\n\t"
  18309. "adds r3, r3, r7\n\t"
  18310. "adcs r4, r4, #0\n\t"
  18311. "mov r5, #0\n\t"
  18312. "adc r5, r5, #0\n\t"
  18313. "lsr r7, r9, #16\n\t"
  18314. "mul r6, r7, r6\n\t"
  18315. "lsr r7, r6, #16\n\t"
  18316. "lsl r6, r6, #16\n\t"
  18317. "adds r3, r3, r6\n\t"
  18318. "adcs r4, r4, r7\n\t"
  18319. "adc r5, r5, #0\n\t"
  18320. "lsr r6, r8, #16\n\t"
  18321. "lsr r7, r9, #16\n\t"
  18322. "mul r7, r6, r7\n\t"
  18323. "adds r4, r4, r7\n\t"
  18324. "adc r5, r5, #0\n\t"
  18325. "lsl r7, r9, #16\n\t"
  18326. "lsr r7, r7, #16\n\t"
  18327. "mul r6, r7, r6\n\t"
  18328. "lsr r7, r6, #16\n\t"
  18329. "lsl r6, r6, #16\n\t"
  18330. "adds r3, r3, r6\n\t"
  18331. "adcs r4, r4, r7\n\t"
  18332. "adc r5, r5, #0\n\t"
  18333. #else
  18334. "umull r6, r7, r8, r9\n\t"
  18335. "adds r3, r3, r6\n\t"
  18336. "adcs r4, r4, r7\n\t"
  18337. "mov r5, #0\n\t"
  18338. "adc r5, r5, #0\n\t"
  18339. #endif
  18340. /* A[1] * B[2] */
  18341. "ldr r9, [%[b], #8]\n\t"
  18342. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  18343. "lsl r6, r11, #16\n\t"
  18344. "lsl r7, r9, #16\n\t"
  18345. "lsr r6, r6, #16\n\t"
  18346. "lsr r7, r7, #16\n\t"
  18347. "mul r7, r6, r7\n\t"
  18348. "adds r3, r3, r7\n\t"
  18349. "adcs r4, r4, #0\n\t"
  18350. "adc r5, r5, #0\n\t"
  18351. "lsr r7, r9, #16\n\t"
  18352. "mul r6, r7, r6\n\t"
  18353. "lsr r7, r6, #16\n\t"
  18354. "lsl r6, r6, #16\n\t"
  18355. "adds r3, r3, r6\n\t"
  18356. "adcs r4, r4, r7\n\t"
  18357. "adc r5, r5, #0\n\t"
  18358. "lsr r6, r11, #16\n\t"
  18359. "lsr r7, r9, #16\n\t"
  18360. "mul r7, r6, r7\n\t"
  18361. "adds r4, r4, r7\n\t"
  18362. "adc r5, r5, #0\n\t"
  18363. "lsl r7, r9, #16\n\t"
  18364. "lsr r7, r7, #16\n\t"
  18365. "mul r6, r7, r6\n\t"
  18366. "lsr r7, r6, #16\n\t"
  18367. "lsl r6, r6, #16\n\t"
  18368. "adds r3, r3, r6\n\t"
  18369. "adcs r4, r4, r7\n\t"
  18370. "adc r5, r5, #0\n\t"
  18371. #else
  18372. "umull r6, r7, r11, r9\n\t"
  18373. "adds r3, r3, r6\n\t"
  18374. "adcs r4, r4, r7\n\t"
  18375. "adc r5, r5, #0\n\t"
  18376. #endif
  18377. /* A[2] * B[1] */
  18378. "ldr r8, [%[a], #8]\n\t"
  18379. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  18380. "lsl r6, r8, #16\n\t"
  18381. "lsl r7, r12, #16\n\t"
  18382. "lsr r6, r6, #16\n\t"
  18383. "lsr r7, r7, #16\n\t"
  18384. "mul r7, r6, r7\n\t"
  18385. "adds r3, r3, r7\n\t"
  18386. "adcs r4, r4, #0\n\t"
  18387. "adc r5, r5, #0\n\t"
  18388. "lsr r7, r12, #16\n\t"
  18389. "mul r6, r7, r6\n\t"
  18390. "lsr r7, r6, #16\n\t"
  18391. "lsl r6, r6, #16\n\t"
  18392. "adds r3, r3, r6\n\t"
  18393. "adcs r4, r4, r7\n\t"
  18394. "adc r5, r5, #0\n\t"
  18395. "lsr r6, r8, #16\n\t"
  18396. "lsr r7, r12, #16\n\t"
  18397. "mul r7, r6, r7\n\t"
  18398. "adds r4, r4, r7\n\t"
  18399. "adc r5, r5, #0\n\t"
  18400. "lsl r7, r12, #16\n\t"
  18401. "lsr r7, r7, #16\n\t"
  18402. "mul r6, r7, r6\n\t"
  18403. "lsr r7, r6, #16\n\t"
  18404. "lsl r6, r6, #16\n\t"
  18405. "adds r3, r3, r6\n\t"
  18406. "adcs r4, r4, r7\n\t"
  18407. "adc r5, r5, #0\n\t"
  18408. #else
  18409. "umull r6, r7, r8, r12\n\t"
  18410. "adds r3, r3, r6\n\t"
  18411. "adcs r4, r4, r7\n\t"
  18412. "adc r5, r5, #0\n\t"
  18413. #endif
  18414. /* A[3] * B[0] */
  18415. "ldr r8, [%[a], #12]\n\t"
  18416. "ldr r9, [%[b]]\n\t"
  18417. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  18418. "lsl r6, r8, #16\n\t"
  18419. "lsl r7, r9, #16\n\t"
  18420. "lsr r6, r6, #16\n\t"
  18421. "lsr r7, r7, #16\n\t"
  18422. "mul r7, r6, r7\n\t"
  18423. "adds r3, r3, r7\n\t"
  18424. "adcs r4, r4, #0\n\t"
  18425. "adc r5, r5, #0\n\t"
  18426. "lsr r7, r9, #16\n\t"
  18427. "mul r6, r7, r6\n\t"
  18428. "lsr r7, r6, #16\n\t"
  18429. "lsl r6, r6, #16\n\t"
  18430. "adds r3, r3, r6\n\t"
  18431. "adcs r4, r4, r7\n\t"
  18432. "adc r5, r5, #0\n\t"
  18433. "lsr r6, r8, #16\n\t"
  18434. "lsr r7, r9, #16\n\t"
  18435. "mul r7, r6, r7\n\t"
  18436. "adds r4, r4, r7\n\t"
  18437. "adc r5, r5, #0\n\t"
  18438. "lsl r7, r9, #16\n\t"
  18439. "lsr r7, r7, #16\n\t"
  18440. "mul r6, r7, r6\n\t"
  18441. "lsr r7, r6, #16\n\t"
  18442. "lsl r6, r6, #16\n\t"
  18443. "adds r3, r3, r6\n\t"
  18444. "adcs r4, r4, r7\n\t"
  18445. "adc r5, r5, #0\n\t"
  18446. #else
  18447. "umull r6, r7, r8, r9\n\t"
  18448. "adds r3, r3, r6\n\t"
  18449. "adcs r4, r4, r7\n\t"
  18450. "adc r5, r5, #0\n\t"
  18451. #endif
  18452. "str r3, [sp, #12]\n\t"
  18453. /* A[4] * B[0] */
  18454. "ldr r8, [%[a], #16]\n\t"
  18455. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  18456. "lsl r6, r8, #16\n\t"
  18457. "lsl r7, r9, #16\n\t"
  18458. "lsr r6, r6, #16\n\t"
  18459. "lsr r7, r7, #16\n\t"
  18460. "mul r7, r6, r7\n\t"
  18461. "adds r4, r4, r7\n\t"
  18462. "adcs r5, r5, #0\n\t"
  18463. "mov r3, #0\n\t"
  18464. "adc r3, r3, #0\n\t"
  18465. "lsr r7, r9, #16\n\t"
  18466. "mul r6, r7, r6\n\t"
  18467. "lsr r7, r6, #16\n\t"
  18468. "lsl r6, r6, #16\n\t"
  18469. "adds r4, r4, r6\n\t"
  18470. "adcs r5, r5, r7\n\t"
  18471. "adc r3, r3, #0\n\t"
  18472. "lsr r6, r8, #16\n\t"
  18473. "lsr r7, r9, #16\n\t"
  18474. "mul r7, r6, r7\n\t"
  18475. "adds r5, r5, r7\n\t"
  18476. "adc r3, r3, #0\n\t"
  18477. "lsl r7, r9, #16\n\t"
  18478. "lsr r7, r7, #16\n\t"
  18479. "mul r6, r7, r6\n\t"
  18480. "lsr r7, r6, #16\n\t"
  18481. "lsl r6, r6, #16\n\t"
  18482. "adds r4, r4, r6\n\t"
  18483. "adcs r5, r5, r7\n\t"
  18484. "adc r3, r3, #0\n\t"
  18485. #else
  18486. "umull r6, r7, r8, r9\n\t"
  18487. "adds r4, r4, r6\n\t"
  18488. "adcs r5, r5, r7\n\t"
  18489. "mov r3, #0\n\t"
  18490. "adc r3, r3, #0\n\t"
  18491. #endif
  18492. /* A[3] * B[1] */
  18493. "ldr r8, [%[a], #12]\n\t"
  18494. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  18495. "lsl r6, r8, #16\n\t"
  18496. "lsl r7, r12, #16\n\t"
  18497. "lsr r6, r6, #16\n\t"
  18498. "lsr r7, r7, #16\n\t"
  18499. "mul r7, r6, r7\n\t"
  18500. "adds r4, r4, r7\n\t"
  18501. "adcs r5, r5, #0\n\t"
  18502. "adc r3, r3, #0\n\t"
  18503. "lsr r7, r12, #16\n\t"
  18504. "mul r6, r7, r6\n\t"
  18505. "lsr r7, r6, #16\n\t"
  18506. "lsl r6, r6, #16\n\t"
  18507. "adds r4, r4, r6\n\t"
  18508. "adcs r5, r5, r7\n\t"
  18509. "adc r3, r3, #0\n\t"
  18510. "lsr r6, r8, #16\n\t"
  18511. "lsr r7, r12, #16\n\t"
  18512. "mul r7, r6, r7\n\t"
  18513. "adds r5, r5, r7\n\t"
  18514. "adc r3, r3, #0\n\t"
  18515. "lsl r7, r12, #16\n\t"
  18516. "lsr r7, r7, #16\n\t"
  18517. "mul r6, r7, r6\n\t"
  18518. "lsr r7, r6, #16\n\t"
  18519. "lsl r6, r6, #16\n\t"
  18520. "adds r4, r4, r6\n\t"
  18521. "adcs r5, r5, r7\n\t"
  18522. "adc r3, r3, #0\n\t"
  18523. #else
  18524. "umull r6, r7, r8, r12\n\t"
  18525. "adds r4, r4, r6\n\t"
  18526. "adcs r5, r5, r7\n\t"
  18527. "adc r3, r3, #0\n\t"
  18528. #endif
  18529. /* A[2] * B[2] */
  18530. "ldr r11, [%[a], #8]\n\t"
  18531. "ldr r12, [%[b], #8]\n\t"
  18532. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  18533. "lsl r6, r11, #16\n\t"
  18534. "lsl r7, r12, #16\n\t"
  18535. "lsr r6, r6, #16\n\t"
  18536. "lsr r7, r7, #16\n\t"
  18537. "mul r7, r6, r7\n\t"
  18538. "adds r4, r4, r7\n\t"
  18539. "adcs r5, r5, #0\n\t"
  18540. "adc r3, r3, #0\n\t"
  18541. "lsr r7, r12, #16\n\t"
  18542. "mul r6, r7, r6\n\t"
  18543. "lsr r7, r6, #16\n\t"
  18544. "lsl r6, r6, #16\n\t"
  18545. "adds r4, r4, r6\n\t"
  18546. "adcs r5, r5, r7\n\t"
  18547. "adc r3, r3, #0\n\t"
  18548. "lsr r6, r11, #16\n\t"
  18549. "lsr r7, r12, #16\n\t"
  18550. "mul r7, r6, r7\n\t"
  18551. "adds r5, r5, r7\n\t"
  18552. "adc r3, r3, #0\n\t"
  18553. "lsl r7, r12, #16\n\t"
  18554. "lsr r7, r7, #16\n\t"
  18555. "mul r6, r7, r6\n\t"
  18556. "lsr r7, r6, #16\n\t"
  18557. "lsl r6, r6, #16\n\t"
  18558. "adds r4, r4, r6\n\t"
  18559. "adcs r5, r5, r7\n\t"
  18560. "adc r3, r3, #0\n\t"
  18561. #else
  18562. "umull r6, r7, r11, r12\n\t"
  18563. "adds r4, r4, r6\n\t"
  18564. "adcs r5, r5, r7\n\t"
  18565. "adc r3, r3, #0\n\t"
  18566. #endif
  18567. /* A[1] * B[3] */
  18568. "ldr r8, [%[a], #4]\n\t"
  18569. "ldr r9, [%[b], #12]\n\t"
  18570. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  18571. "lsl r6, r8, #16\n\t"
  18572. "lsl r7, r9, #16\n\t"
  18573. "lsr r6, r6, #16\n\t"
  18574. "lsr r7, r7, #16\n\t"
  18575. "mul r7, r6, r7\n\t"
  18576. "adds r4, r4, r7\n\t"
  18577. "adcs r5, r5, #0\n\t"
  18578. "adc r3, r3, #0\n\t"
  18579. "lsr r7, r9, #16\n\t"
  18580. "mul r6, r7, r6\n\t"
  18581. "lsr r7, r6, #16\n\t"
  18582. "lsl r6, r6, #16\n\t"
  18583. "adds r4, r4, r6\n\t"
  18584. "adcs r5, r5, r7\n\t"
  18585. "adc r3, r3, #0\n\t"
  18586. "lsr r6, r8, #16\n\t"
  18587. "lsr r7, r9, #16\n\t"
  18588. "mul r7, r6, r7\n\t"
  18589. "adds r5, r5, r7\n\t"
  18590. "adc r3, r3, #0\n\t"
  18591. "lsl r7, r9, #16\n\t"
  18592. "lsr r7, r7, #16\n\t"
  18593. "mul r6, r7, r6\n\t"
  18594. "lsr r7, r6, #16\n\t"
  18595. "lsl r6, r6, #16\n\t"
  18596. "adds r4, r4, r6\n\t"
  18597. "adcs r5, r5, r7\n\t"
  18598. "adc r3, r3, #0\n\t"
  18599. #else
  18600. "umull r6, r7, r8, r9\n\t"
  18601. "adds r4, r4, r6\n\t"
  18602. "adcs r5, r5, r7\n\t"
  18603. "adc r3, r3, #0\n\t"
  18604. #endif
  18605. /* A[0] * B[4] */
  18606. "ldr r8, [%[a]]\n\t"
  18607. "ldr r9, [%[b], #16]\n\t"
  18608. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  18609. "lsl r6, r8, #16\n\t"
  18610. "lsl r7, r9, #16\n\t"
  18611. "lsr r6, r6, #16\n\t"
  18612. "lsr r7, r7, #16\n\t"
  18613. "mul r7, r6, r7\n\t"
  18614. "adds r4, r4, r7\n\t"
  18615. "adcs r5, r5, #0\n\t"
  18616. "adc r3, r3, #0\n\t"
  18617. "lsr r7, r9, #16\n\t"
  18618. "mul r6, r7, r6\n\t"
  18619. "lsr r7, r6, #16\n\t"
  18620. "lsl r6, r6, #16\n\t"
  18621. "adds r4, r4, r6\n\t"
  18622. "adcs r5, r5, r7\n\t"
  18623. "adc r3, r3, #0\n\t"
  18624. "lsr r6, r8, #16\n\t"
  18625. "lsr r7, r9, #16\n\t"
  18626. "mul r7, r6, r7\n\t"
  18627. "adds r5, r5, r7\n\t"
  18628. "adc r3, r3, #0\n\t"
  18629. "lsl r7, r9, #16\n\t"
  18630. "lsr r7, r7, #16\n\t"
  18631. "mul r6, r7, r6\n\t"
  18632. "lsr r7, r6, #16\n\t"
  18633. "lsl r6, r6, #16\n\t"
  18634. "adds r4, r4, r6\n\t"
  18635. "adcs r5, r5, r7\n\t"
  18636. "adc r3, r3, #0\n\t"
  18637. #else
  18638. "umull r6, r7, r8, r9\n\t"
  18639. "adds r4, r4, r6\n\t"
  18640. "adcs r5, r5, r7\n\t"
  18641. "adc r3, r3, #0\n\t"
  18642. #endif
  18643. "str r4, [sp, #16]\n\t"
  18644. /* A[0] * B[5] */
  18645. "ldr r9, [%[b], #20]\n\t"
  18646. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  18647. "lsl r6, r8, #16\n\t"
  18648. "lsl r7, r9, #16\n\t"
  18649. "lsr r6, r6, #16\n\t"
  18650. "lsr r7, r7, #16\n\t"
  18651. "mul r7, r6, r7\n\t"
  18652. "adds r5, r5, r7\n\t"
  18653. "adcs r3, r3, #0\n\t"
  18654. "mov r4, #0\n\t"
  18655. "adc r4, r4, #0\n\t"
  18656. "lsr r7, r9, #16\n\t"
  18657. "mul r6, r7, r6\n\t"
  18658. "lsr r7, r6, #16\n\t"
  18659. "lsl r6, r6, #16\n\t"
  18660. "adds r5, r5, r6\n\t"
  18661. "adcs r3, r3, r7\n\t"
  18662. "adc r4, r4, #0\n\t"
  18663. "lsr r6, r8, #16\n\t"
  18664. "lsr r7, r9, #16\n\t"
  18665. "mul r7, r6, r7\n\t"
  18666. "adds r3, r3, r7\n\t"
  18667. "adc r4, r4, #0\n\t"
  18668. "lsl r7, r9, #16\n\t"
  18669. "lsr r7, r7, #16\n\t"
  18670. "mul r6, r7, r6\n\t"
  18671. "lsr r7, r6, #16\n\t"
  18672. "lsl r6, r6, #16\n\t"
  18673. "adds r5, r5, r6\n\t"
  18674. "adcs r3, r3, r7\n\t"
  18675. "adc r4, r4, #0\n\t"
  18676. #else
  18677. "umull r6, r7, r8, r9\n\t"
  18678. "adds r5, r5, r6\n\t"
  18679. "adcs r3, r3, r7\n\t"
  18680. "mov r4, #0\n\t"
  18681. "adc r4, r4, #0\n\t"
  18682. #endif
  18683. /* A[1] * B[4] */
  18684. "ldr r8, [%[a], #4]\n\t"
  18685. "ldr r9, [%[b], #16]\n\t"
  18686. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  18687. "lsl r6, r8, #16\n\t"
  18688. "lsl r7, r9, #16\n\t"
  18689. "lsr r6, r6, #16\n\t"
  18690. "lsr r7, r7, #16\n\t"
  18691. "mul r7, r6, r7\n\t"
  18692. "adds r5, r5, r7\n\t"
  18693. "adcs r3, r3, #0\n\t"
  18694. "adc r4, r4, #0\n\t"
  18695. "lsr r7, r9, #16\n\t"
  18696. "mul r6, r7, r6\n\t"
  18697. "lsr r7, r6, #16\n\t"
  18698. "lsl r6, r6, #16\n\t"
  18699. "adds r5, r5, r6\n\t"
  18700. "adcs r3, r3, r7\n\t"
  18701. "adc r4, r4, #0\n\t"
  18702. "lsr r6, r8, #16\n\t"
  18703. "lsr r7, r9, #16\n\t"
  18704. "mul r7, r6, r7\n\t"
  18705. "adds r3, r3, r7\n\t"
  18706. "adc r4, r4, #0\n\t"
  18707. "lsl r7, r9, #16\n\t"
  18708. "lsr r7, r7, #16\n\t"
  18709. "mul r6, r7, r6\n\t"
  18710. "lsr r7, r6, #16\n\t"
  18711. "lsl r6, r6, #16\n\t"
  18712. "adds r5, r5, r6\n\t"
  18713. "adcs r3, r3, r7\n\t"
  18714. "adc r4, r4, #0\n\t"
  18715. #else
  18716. "umull r6, r7, r8, r9\n\t"
  18717. "adds r5, r5, r6\n\t"
  18718. "adcs r3, r3, r7\n\t"
  18719. "adc r4, r4, #0\n\t"
  18720. #endif
  18721. /* A[2] * B[3] */
  18722. "ldr r9, [%[b], #12]\n\t"
  18723. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  18724. "lsl r6, r11, #16\n\t"
  18725. "lsl r7, r9, #16\n\t"
  18726. "lsr r6, r6, #16\n\t"
  18727. "lsr r7, r7, #16\n\t"
  18728. "mul r7, r6, r7\n\t"
  18729. "adds r5, r5, r7\n\t"
  18730. "adcs r3, r3, #0\n\t"
  18731. "adc r4, r4, #0\n\t"
  18732. "lsr r7, r9, #16\n\t"
  18733. "mul r6, r7, r6\n\t"
  18734. "lsr r7, r6, #16\n\t"
  18735. "lsl r6, r6, #16\n\t"
  18736. "adds r5, r5, r6\n\t"
  18737. "adcs r3, r3, r7\n\t"
  18738. "adc r4, r4, #0\n\t"
  18739. "lsr r6, r11, #16\n\t"
  18740. "lsr r7, r9, #16\n\t"
  18741. "mul r7, r6, r7\n\t"
  18742. "adds r3, r3, r7\n\t"
  18743. "adc r4, r4, #0\n\t"
  18744. "lsl r7, r9, #16\n\t"
  18745. "lsr r7, r7, #16\n\t"
  18746. "mul r6, r7, r6\n\t"
  18747. "lsr r7, r6, #16\n\t"
  18748. "lsl r6, r6, #16\n\t"
  18749. "adds r5, r5, r6\n\t"
  18750. "adcs r3, r3, r7\n\t"
  18751. "adc r4, r4, #0\n\t"
  18752. #else
  18753. "umull r6, r7, r11, r9\n\t"
  18754. "adds r5, r5, r6\n\t"
  18755. "adcs r3, r3, r7\n\t"
  18756. "adc r4, r4, #0\n\t"
  18757. #endif
  18758. /* A[3] * B[2] */
  18759. "ldr r8, [%[a], #12]\n\t"
  18760. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  18761. "lsl r6, r8, #16\n\t"
  18762. "lsl r7, r12, #16\n\t"
  18763. "lsr r6, r6, #16\n\t"
  18764. "lsr r7, r7, #16\n\t"
  18765. "mul r7, r6, r7\n\t"
  18766. "adds r5, r5, r7\n\t"
  18767. "adcs r3, r3, #0\n\t"
  18768. "adc r4, r4, #0\n\t"
  18769. "lsr r7, r12, #16\n\t"
  18770. "mul r6, r7, r6\n\t"
  18771. "lsr r7, r6, #16\n\t"
  18772. "lsl r6, r6, #16\n\t"
  18773. "adds r5, r5, r6\n\t"
  18774. "adcs r3, r3, r7\n\t"
  18775. "adc r4, r4, #0\n\t"
  18776. "lsr r6, r8, #16\n\t"
  18777. "lsr r7, r12, #16\n\t"
  18778. "mul r7, r6, r7\n\t"
  18779. "adds r3, r3, r7\n\t"
  18780. "adc r4, r4, #0\n\t"
  18781. "lsl r7, r12, #16\n\t"
  18782. "lsr r7, r7, #16\n\t"
  18783. "mul r6, r7, r6\n\t"
  18784. "lsr r7, r6, #16\n\t"
  18785. "lsl r6, r6, #16\n\t"
  18786. "adds r5, r5, r6\n\t"
  18787. "adcs r3, r3, r7\n\t"
  18788. "adc r4, r4, #0\n\t"
  18789. #else
  18790. "umull r6, r7, r8, r12\n\t"
  18791. "adds r5, r5, r6\n\t"
  18792. "adcs r3, r3, r7\n\t"
  18793. "adc r4, r4, #0\n\t"
  18794. #endif
  18795. /* A[4] * B[1] */
  18796. "ldr r8, [%[a], #16]\n\t"
  18797. "ldr r9, [%[b], #4]\n\t"
  18798. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  18799. "lsl r6, r8, #16\n\t"
  18800. "lsl r7, r9, #16\n\t"
  18801. "lsr r6, r6, #16\n\t"
  18802. "lsr r7, r7, #16\n\t"
  18803. "mul r7, r6, r7\n\t"
  18804. "adds r5, r5, r7\n\t"
  18805. "adcs r3, r3, #0\n\t"
  18806. "adc r4, r4, #0\n\t"
  18807. "lsr r7, r9, #16\n\t"
  18808. "mul r6, r7, r6\n\t"
  18809. "lsr r7, r6, #16\n\t"
  18810. "lsl r6, r6, #16\n\t"
  18811. "adds r5, r5, r6\n\t"
  18812. "adcs r3, r3, r7\n\t"
  18813. "adc r4, r4, #0\n\t"
  18814. "lsr r6, r8, #16\n\t"
  18815. "lsr r7, r9, #16\n\t"
  18816. "mul r7, r6, r7\n\t"
  18817. "adds r3, r3, r7\n\t"
  18818. "adc r4, r4, #0\n\t"
  18819. "lsl r7, r9, #16\n\t"
  18820. "lsr r7, r7, #16\n\t"
  18821. "mul r6, r7, r6\n\t"
  18822. "lsr r7, r6, #16\n\t"
  18823. "lsl r6, r6, #16\n\t"
  18824. "adds r5, r5, r6\n\t"
  18825. "adcs r3, r3, r7\n\t"
  18826. "adc r4, r4, #0\n\t"
  18827. #else
  18828. "umull r6, r7, r8, r9\n\t"
  18829. "adds r5, r5, r6\n\t"
  18830. "adcs r3, r3, r7\n\t"
  18831. "adc r4, r4, #0\n\t"
  18832. #endif
  18833. /* A[5] * B[0] */
  18834. "ldr r8, [%[a], #20]\n\t"
  18835. "ldr r9, [%[b]]\n\t"
  18836. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  18837. "lsl r6, r8, #16\n\t"
  18838. "lsl r7, r9, #16\n\t"
  18839. "lsr r6, r6, #16\n\t"
  18840. "lsr r7, r7, #16\n\t"
  18841. "mul r7, r6, r7\n\t"
  18842. "adds r5, r5, r7\n\t"
  18843. "adcs r3, r3, #0\n\t"
  18844. "adc r4, r4, #0\n\t"
  18845. "lsr r7, r9, #16\n\t"
  18846. "mul r6, r7, r6\n\t"
  18847. "lsr r7, r6, #16\n\t"
  18848. "lsl r6, r6, #16\n\t"
  18849. "adds r5, r5, r6\n\t"
  18850. "adcs r3, r3, r7\n\t"
  18851. "adc r4, r4, #0\n\t"
  18852. "lsr r6, r8, #16\n\t"
  18853. "lsr r7, r9, #16\n\t"
  18854. "mul r7, r6, r7\n\t"
  18855. "adds r3, r3, r7\n\t"
  18856. "adc r4, r4, #0\n\t"
  18857. "lsl r7, r9, #16\n\t"
  18858. "lsr r7, r7, #16\n\t"
  18859. "mul r6, r7, r6\n\t"
  18860. "lsr r7, r6, #16\n\t"
  18861. "lsl r6, r6, #16\n\t"
  18862. "adds r5, r5, r6\n\t"
  18863. "adcs r3, r3, r7\n\t"
  18864. "adc r4, r4, #0\n\t"
  18865. #else
  18866. "umull r6, r7, r8, r9\n\t"
  18867. "adds r5, r5, r6\n\t"
  18868. "adcs r3, r3, r7\n\t"
  18869. "adc r4, r4, #0\n\t"
  18870. #endif
  18871. "str r5, [sp, #20]\n\t"
  18872. /* A[6] * B[0] */
  18873. "ldr r8, [%[a], #24]\n\t"
  18874. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  18875. "lsl r6, r8, #16\n\t"
  18876. "lsl r7, r9, #16\n\t"
  18877. "lsr r6, r6, #16\n\t"
  18878. "lsr r7, r7, #16\n\t"
  18879. "mul r7, r6, r7\n\t"
  18880. "adds r3, r3, r7\n\t"
  18881. "adcs r4, r4, #0\n\t"
  18882. "mov r5, #0\n\t"
  18883. "adc r5, r5, #0\n\t"
  18884. "lsr r7, r9, #16\n\t"
  18885. "mul r6, r7, r6\n\t"
  18886. "lsr r7, r6, #16\n\t"
  18887. "lsl r6, r6, #16\n\t"
  18888. "adds r3, r3, r6\n\t"
  18889. "adcs r4, r4, r7\n\t"
  18890. "adc r5, r5, #0\n\t"
  18891. "lsr r6, r8, #16\n\t"
  18892. "lsr r7, r9, #16\n\t"
  18893. "mul r7, r6, r7\n\t"
  18894. "adds r4, r4, r7\n\t"
  18895. "adc r5, r5, #0\n\t"
  18896. "lsl r7, r9, #16\n\t"
  18897. "lsr r7, r7, #16\n\t"
  18898. "mul r6, r7, r6\n\t"
  18899. "lsr r7, r6, #16\n\t"
  18900. "lsl r6, r6, #16\n\t"
  18901. "adds r3, r3, r6\n\t"
  18902. "adcs r4, r4, r7\n\t"
  18903. "adc r5, r5, #0\n\t"
  18904. #else
  18905. "umull r6, r7, r8, r9\n\t"
  18906. "adds r3, r3, r6\n\t"
  18907. "adcs r4, r4, r7\n\t"
  18908. "mov r5, #0\n\t"
  18909. "adc r5, r5, #0\n\t"
  18910. #endif
  18911. /* A[5] * B[1] */
  18912. "ldr r8, [%[a], #20]\n\t"
  18913. "ldr r9, [%[b], #4]\n\t"
  18914. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  18915. "lsl r6, r8, #16\n\t"
  18916. "lsl r7, r9, #16\n\t"
  18917. "lsr r6, r6, #16\n\t"
  18918. "lsr r7, r7, #16\n\t"
  18919. "mul r7, r6, r7\n\t"
  18920. "adds r3, r3, r7\n\t"
  18921. "adcs r4, r4, #0\n\t"
  18922. "adc r5, r5, #0\n\t"
  18923. "lsr r7, r9, #16\n\t"
  18924. "mul r6, r7, r6\n\t"
  18925. "lsr r7, r6, #16\n\t"
  18926. "lsl r6, r6, #16\n\t"
  18927. "adds r3, r3, r6\n\t"
  18928. "adcs r4, r4, r7\n\t"
  18929. "adc r5, r5, #0\n\t"
  18930. "lsr r6, r8, #16\n\t"
  18931. "lsr r7, r9, #16\n\t"
  18932. "mul r7, r6, r7\n\t"
  18933. "adds r4, r4, r7\n\t"
  18934. "adc r5, r5, #0\n\t"
  18935. "lsl r7, r9, #16\n\t"
  18936. "lsr r7, r7, #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 r3, r3, r6\n\t"
  18941. "adcs r4, r4, r7\n\t"
  18942. "adc r5, r5, #0\n\t"
  18943. #else
  18944. "umull r6, r7, r8, r9\n\t"
  18945. "adds r3, r3, r6\n\t"
  18946. "adcs r4, r4, r7\n\t"
  18947. "adc r5, r5, #0\n\t"
  18948. #endif
  18949. /* A[4] * B[2] */
  18950. "ldr r8, [%[a], #16]\n\t"
  18951. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  18952. "lsl r6, r8, #16\n\t"
  18953. "lsl r7, r12, #16\n\t"
  18954. "lsr r6, r6, #16\n\t"
  18955. "lsr r7, r7, #16\n\t"
  18956. "mul r7, r6, r7\n\t"
  18957. "adds r3, r3, r7\n\t"
  18958. "adcs r4, r4, #0\n\t"
  18959. "adc r5, r5, #0\n\t"
  18960. "lsr r7, r12, #16\n\t"
  18961. "mul r6, r7, r6\n\t"
  18962. "lsr r7, r6, #16\n\t"
  18963. "lsl r6, r6, #16\n\t"
  18964. "adds r3, r3, r6\n\t"
  18965. "adcs r4, r4, r7\n\t"
  18966. "adc r5, r5, #0\n\t"
  18967. "lsr r6, r8, #16\n\t"
  18968. "lsr r7, r12, #16\n\t"
  18969. "mul r7, r6, r7\n\t"
  18970. "adds r4, r4, r7\n\t"
  18971. "adc r5, r5, #0\n\t"
  18972. "lsl r7, r12, #16\n\t"
  18973. "lsr r7, r7, #16\n\t"
  18974. "mul r6, r7, r6\n\t"
  18975. "lsr r7, r6, #16\n\t"
  18976. "lsl r6, r6, #16\n\t"
  18977. "adds r3, r3, r6\n\t"
  18978. "adcs r4, r4, r7\n\t"
  18979. "adc r5, r5, #0\n\t"
  18980. #else
  18981. "umull r6, r7, r8, r12\n\t"
  18982. "adds r3, r3, r6\n\t"
  18983. "adcs r4, r4, r7\n\t"
  18984. "adc r5, r5, #0\n\t"
  18985. #endif
  18986. /* A[3] * B[3] */
  18987. "ldr r11, [%[a], #12]\n\t"
  18988. "ldr r12, [%[b], #12]\n\t"
  18989. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  18990. "lsl r6, r11, #16\n\t"
  18991. "lsl r7, r12, #16\n\t"
  18992. "lsr r6, r6, #16\n\t"
  18993. "lsr r7, r7, #16\n\t"
  18994. "mul r7, r6, r7\n\t"
  18995. "adds r3, r3, r7\n\t"
  18996. "adcs r4, r4, #0\n\t"
  18997. "adc r5, r5, #0\n\t"
  18998. "lsr r7, r12, #16\n\t"
  18999. "mul r6, r7, r6\n\t"
  19000. "lsr r7, r6, #16\n\t"
  19001. "lsl r6, r6, #16\n\t"
  19002. "adds r3, r3, r6\n\t"
  19003. "adcs r4, r4, r7\n\t"
  19004. "adc r5, r5, #0\n\t"
  19005. "lsr r6, r11, #16\n\t"
  19006. "lsr r7, r12, #16\n\t"
  19007. "mul r7, r6, r7\n\t"
  19008. "adds r4, r4, r7\n\t"
  19009. "adc r5, r5, #0\n\t"
  19010. "lsl r7, r12, #16\n\t"
  19011. "lsr r7, r7, #16\n\t"
  19012. "mul r6, r7, r6\n\t"
  19013. "lsr r7, r6, #16\n\t"
  19014. "lsl r6, r6, #16\n\t"
  19015. "adds r3, r3, r6\n\t"
  19016. "adcs r4, r4, r7\n\t"
  19017. "adc r5, r5, #0\n\t"
  19018. #else
  19019. "umull r6, r7, r11, r12\n\t"
  19020. "adds r3, r3, r6\n\t"
  19021. "adcs r4, r4, r7\n\t"
  19022. "adc r5, r5, #0\n\t"
  19023. #endif
  19024. /* A[2] * B[4] */
  19025. "ldr r8, [%[a], #8]\n\t"
  19026. "ldr r9, [%[b], #16]\n\t"
  19027. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  19028. "lsl r6, r8, #16\n\t"
  19029. "lsl r7, r9, #16\n\t"
  19030. "lsr r6, r6, #16\n\t"
  19031. "lsr r7, r7, #16\n\t"
  19032. "mul r7, r6, r7\n\t"
  19033. "adds r3, r3, r7\n\t"
  19034. "adcs r4, r4, #0\n\t"
  19035. "adc r5, r5, #0\n\t"
  19036. "lsr r7, r9, #16\n\t"
  19037. "mul r6, r7, r6\n\t"
  19038. "lsr r7, r6, #16\n\t"
  19039. "lsl r6, r6, #16\n\t"
  19040. "adds r3, r3, r6\n\t"
  19041. "adcs r4, r4, r7\n\t"
  19042. "adc r5, r5, #0\n\t"
  19043. "lsr r6, r8, #16\n\t"
  19044. "lsr r7, r9, #16\n\t"
  19045. "mul r7, r6, r7\n\t"
  19046. "adds r4, r4, r7\n\t"
  19047. "adc r5, r5, #0\n\t"
  19048. "lsl r7, r9, #16\n\t"
  19049. "lsr r7, r7, #16\n\t"
  19050. "mul r6, r7, r6\n\t"
  19051. "lsr r7, r6, #16\n\t"
  19052. "lsl r6, r6, #16\n\t"
  19053. "adds r3, r3, r6\n\t"
  19054. "adcs r4, r4, r7\n\t"
  19055. "adc r5, r5, #0\n\t"
  19056. #else
  19057. "umull r6, r7, r8, r9\n\t"
  19058. "adds r3, r3, r6\n\t"
  19059. "adcs r4, r4, r7\n\t"
  19060. "adc r5, r5, #0\n\t"
  19061. #endif
  19062. /* A[1] * B[5] */
  19063. "ldr r8, [%[a], #4]\n\t"
  19064. "ldr r9, [%[b], #20]\n\t"
  19065. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  19066. "lsl r6, r8, #16\n\t"
  19067. "lsl r7, r9, #16\n\t"
  19068. "lsr r6, r6, #16\n\t"
  19069. "lsr r7, r7, #16\n\t"
  19070. "mul r7, r6, r7\n\t"
  19071. "adds r3, r3, r7\n\t"
  19072. "adcs r4, r4, #0\n\t"
  19073. "adc r5, r5, #0\n\t"
  19074. "lsr r7, r9, #16\n\t"
  19075. "mul r6, r7, r6\n\t"
  19076. "lsr r7, r6, #16\n\t"
  19077. "lsl r6, r6, #16\n\t"
  19078. "adds r3, r3, r6\n\t"
  19079. "adcs r4, r4, r7\n\t"
  19080. "adc r5, r5, #0\n\t"
  19081. "lsr r6, r8, #16\n\t"
  19082. "lsr r7, r9, #16\n\t"
  19083. "mul r7, r6, r7\n\t"
  19084. "adds r4, r4, r7\n\t"
  19085. "adc r5, r5, #0\n\t"
  19086. "lsl r7, r9, #16\n\t"
  19087. "lsr r7, r7, #16\n\t"
  19088. "mul r6, r7, r6\n\t"
  19089. "lsr r7, r6, #16\n\t"
  19090. "lsl r6, r6, #16\n\t"
  19091. "adds r3, r3, r6\n\t"
  19092. "adcs r4, r4, r7\n\t"
  19093. "adc r5, r5, #0\n\t"
  19094. #else
  19095. "umull r6, r7, r8, r9\n\t"
  19096. "adds r3, r3, r6\n\t"
  19097. "adcs r4, r4, r7\n\t"
  19098. "adc r5, r5, #0\n\t"
  19099. #endif
  19100. /* A[0] * B[6] */
  19101. "ldr r8, [%[a]]\n\t"
  19102. "ldr r9, [%[b], #24]\n\t"
  19103. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  19104. "lsl r6, r8, #16\n\t"
  19105. "lsl r7, r9, #16\n\t"
  19106. "lsr r6, r6, #16\n\t"
  19107. "lsr r7, r7, #16\n\t"
  19108. "mul r7, r6, r7\n\t"
  19109. "adds r3, r3, r7\n\t"
  19110. "adcs r4, r4, #0\n\t"
  19111. "adc r5, r5, #0\n\t"
  19112. "lsr r7, r9, #16\n\t"
  19113. "mul r6, r7, r6\n\t"
  19114. "lsr r7, r6, #16\n\t"
  19115. "lsl r6, r6, #16\n\t"
  19116. "adds r3, r3, r6\n\t"
  19117. "adcs r4, r4, r7\n\t"
  19118. "adc r5, r5, #0\n\t"
  19119. "lsr r6, r8, #16\n\t"
  19120. "lsr r7, r9, #16\n\t"
  19121. "mul r7, r6, r7\n\t"
  19122. "adds r4, r4, r7\n\t"
  19123. "adc r5, r5, #0\n\t"
  19124. "lsl r7, r9, #16\n\t"
  19125. "lsr r7, r7, #16\n\t"
  19126. "mul r6, r7, r6\n\t"
  19127. "lsr r7, r6, #16\n\t"
  19128. "lsl r6, r6, #16\n\t"
  19129. "adds r3, r3, r6\n\t"
  19130. "adcs r4, r4, r7\n\t"
  19131. "adc r5, r5, #0\n\t"
  19132. #else
  19133. "umull r6, r7, r8, r9\n\t"
  19134. "adds r3, r3, r6\n\t"
  19135. "adcs r4, r4, r7\n\t"
  19136. "adc r5, r5, #0\n\t"
  19137. #endif
  19138. "str r3, [sp, #24]\n\t"
  19139. /* A[0] * B[7] */
  19140. "ldr r9, [%[b], #28]\n\t"
  19141. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  19142. "lsl r6, r8, #16\n\t"
  19143. "lsl r7, r9, #16\n\t"
  19144. "lsr r6, r6, #16\n\t"
  19145. "lsr r7, r7, #16\n\t"
  19146. "mul r7, r6, r7\n\t"
  19147. "adds r4, r4, r7\n\t"
  19148. "adcs r5, r5, #0\n\t"
  19149. "mov r3, #0\n\t"
  19150. "adc r3, r3, #0\n\t"
  19151. "lsr r7, r9, #16\n\t"
  19152. "mul r6, r7, r6\n\t"
  19153. "lsr r7, r6, #16\n\t"
  19154. "lsl r6, r6, #16\n\t"
  19155. "adds r4, r4, r6\n\t"
  19156. "adcs r5, r5, r7\n\t"
  19157. "adc r3, r3, #0\n\t"
  19158. "lsr r6, r8, #16\n\t"
  19159. "lsr r7, r9, #16\n\t"
  19160. "mul r7, r6, r7\n\t"
  19161. "adds r5, r5, r7\n\t"
  19162. "adc r3, r3, #0\n\t"
  19163. "lsl r7, r9, #16\n\t"
  19164. "lsr r7, r7, #16\n\t"
  19165. "mul r6, r7, r6\n\t"
  19166. "lsr r7, r6, #16\n\t"
  19167. "lsl r6, r6, #16\n\t"
  19168. "adds r4, r4, r6\n\t"
  19169. "adcs r5, r5, r7\n\t"
  19170. "adc r3, r3, #0\n\t"
  19171. #else
  19172. "umull r6, r7, r8, r9\n\t"
  19173. "adds r4, r4, r6\n\t"
  19174. "adcs r5, r5, r7\n\t"
  19175. "mov r3, #0\n\t"
  19176. "adc r3, r3, #0\n\t"
  19177. #endif
  19178. /* A[1] * B[6] */
  19179. "ldr r8, [%[a], #4]\n\t"
  19180. "ldr r9, [%[b], #24]\n\t"
  19181. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  19182. "lsl r6, r8, #16\n\t"
  19183. "lsl r7, r9, #16\n\t"
  19184. "lsr r6, r6, #16\n\t"
  19185. "lsr r7, r7, #16\n\t"
  19186. "mul r7, r6, r7\n\t"
  19187. "adds r4, r4, r7\n\t"
  19188. "adcs r5, r5, #0\n\t"
  19189. "adc r3, r3, #0\n\t"
  19190. "lsr r7, r9, #16\n\t"
  19191. "mul r6, r7, r6\n\t"
  19192. "lsr r7, r6, #16\n\t"
  19193. "lsl r6, r6, #16\n\t"
  19194. "adds r4, r4, r6\n\t"
  19195. "adcs r5, r5, r7\n\t"
  19196. "adc r3, r3, #0\n\t"
  19197. "lsr r6, r8, #16\n\t"
  19198. "lsr r7, r9, #16\n\t"
  19199. "mul r7, r6, r7\n\t"
  19200. "adds r5, r5, r7\n\t"
  19201. "adc r3, r3, #0\n\t"
  19202. "lsl r7, r9, #16\n\t"
  19203. "lsr r7, r7, #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 r4, r4, r6\n\t"
  19208. "adcs r5, r5, r7\n\t"
  19209. "adc r3, r3, #0\n\t"
  19210. #else
  19211. "umull r6, r7, r8, r9\n\t"
  19212. "adds r4, r4, r6\n\t"
  19213. "adcs r5, r5, r7\n\t"
  19214. "adc r3, r3, #0\n\t"
  19215. #endif
  19216. /* A[2] * B[5] */
  19217. "ldr r8, [%[a], #8]\n\t"
  19218. "ldr r9, [%[b], #20]\n\t"
  19219. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  19220. "lsl r6, r8, #16\n\t"
  19221. "lsl r7, r9, #16\n\t"
  19222. "lsr r6, r6, #16\n\t"
  19223. "lsr r7, r7, #16\n\t"
  19224. "mul r7, r6, r7\n\t"
  19225. "adds r4, r4, r7\n\t"
  19226. "adcs r5, r5, #0\n\t"
  19227. "adc r3, r3, #0\n\t"
  19228. "lsr r7, r9, #16\n\t"
  19229. "mul r6, r7, r6\n\t"
  19230. "lsr r7, r6, #16\n\t"
  19231. "lsl r6, r6, #16\n\t"
  19232. "adds r4, r4, r6\n\t"
  19233. "adcs r5, r5, r7\n\t"
  19234. "adc r3, r3, #0\n\t"
  19235. "lsr r6, r8, #16\n\t"
  19236. "lsr r7, r9, #16\n\t"
  19237. "mul r7, r6, r7\n\t"
  19238. "adds r5, r5, r7\n\t"
  19239. "adc r3, r3, #0\n\t"
  19240. "lsl r7, r9, #16\n\t"
  19241. "lsr r7, r7, #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 r4, r4, r6\n\t"
  19246. "adcs r5, r5, r7\n\t"
  19247. "adc r3, r3, #0\n\t"
  19248. #else
  19249. "umull r6, r7, r8, r9\n\t"
  19250. "adds r4, r4, r6\n\t"
  19251. "adcs r5, r5, r7\n\t"
  19252. "adc r3, r3, #0\n\t"
  19253. #endif
  19254. /* A[3] * B[4] */
  19255. "ldr r9, [%[b], #16]\n\t"
  19256. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  19257. "lsl r6, r11, #16\n\t"
  19258. "lsl r7, r9, #16\n\t"
  19259. "lsr r6, r6, #16\n\t"
  19260. "lsr r7, r7, #16\n\t"
  19261. "mul r7, r6, r7\n\t"
  19262. "adds r4, r4, r7\n\t"
  19263. "adcs r5, r5, #0\n\t"
  19264. "adc r3, r3, #0\n\t"
  19265. "lsr r7, r9, #16\n\t"
  19266. "mul r6, r7, r6\n\t"
  19267. "lsr r7, r6, #16\n\t"
  19268. "lsl r6, r6, #16\n\t"
  19269. "adds r4, r4, r6\n\t"
  19270. "adcs r5, r5, r7\n\t"
  19271. "adc r3, r3, #0\n\t"
  19272. "lsr r6, r11, #16\n\t"
  19273. "lsr r7, r9, #16\n\t"
  19274. "mul r7, r6, r7\n\t"
  19275. "adds r5, r5, r7\n\t"
  19276. "adc r3, r3, #0\n\t"
  19277. "lsl r7, r9, #16\n\t"
  19278. "lsr r7, r7, #16\n\t"
  19279. "mul r6, r7, r6\n\t"
  19280. "lsr r7, r6, #16\n\t"
  19281. "lsl r6, r6, #16\n\t"
  19282. "adds r4, r4, r6\n\t"
  19283. "adcs r5, r5, r7\n\t"
  19284. "adc r3, r3, #0\n\t"
  19285. #else
  19286. "umull r6, r7, r11, r9\n\t"
  19287. "adds r4, r4, r6\n\t"
  19288. "adcs r5, r5, r7\n\t"
  19289. "adc r3, r3, #0\n\t"
  19290. #endif
  19291. /* A[4] * B[3] */
  19292. "ldr r8, [%[a], #16]\n\t"
  19293. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  19294. "lsl r6, r8, #16\n\t"
  19295. "lsl r7, r12, #16\n\t"
  19296. "lsr r6, r6, #16\n\t"
  19297. "lsr r7, r7, #16\n\t"
  19298. "mul r7, r6, r7\n\t"
  19299. "adds r4, r4, r7\n\t"
  19300. "adcs r5, r5, #0\n\t"
  19301. "adc r3, r3, #0\n\t"
  19302. "lsr r7, r12, #16\n\t"
  19303. "mul r6, r7, r6\n\t"
  19304. "lsr r7, r6, #16\n\t"
  19305. "lsl r6, r6, #16\n\t"
  19306. "adds r4, r4, r6\n\t"
  19307. "adcs r5, r5, r7\n\t"
  19308. "adc r3, r3, #0\n\t"
  19309. "lsr r6, r8, #16\n\t"
  19310. "lsr r7, r12, #16\n\t"
  19311. "mul r7, r6, r7\n\t"
  19312. "adds r5, r5, r7\n\t"
  19313. "adc r3, r3, #0\n\t"
  19314. "lsl r7, r12, #16\n\t"
  19315. "lsr r7, r7, #16\n\t"
  19316. "mul r6, r7, r6\n\t"
  19317. "lsr r7, r6, #16\n\t"
  19318. "lsl r6, r6, #16\n\t"
  19319. "adds r4, r4, r6\n\t"
  19320. "adcs r5, r5, r7\n\t"
  19321. "adc r3, r3, #0\n\t"
  19322. #else
  19323. "umull r6, r7, r8, r12\n\t"
  19324. "adds r4, r4, r6\n\t"
  19325. "adcs r5, r5, r7\n\t"
  19326. "adc r3, r3, #0\n\t"
  19327. #endif
  19328. /* A[5] * B[2] */
  19329. "ldr r8, [%[a], #20]\n\t"
  19330. "ldr r9, [%[b], #8]\n\t"
  19331. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  19332. "lsl r6, r8, #16\n\t"
  19333. "lsl r7, r9, #16\n\t"
  19334. "lsr r6, r6, #16\n\t"
  19335. "lsr r7, r7, #16\n\t"
  19336. "mul r7, r6, r7\n\t"
  19337. "adds r4, r4, r7\n\t"
  19338. "adcs r5, r5, #0\n\t"
  19339. "adc r3, r3, #0\n\t"
  19340. "lsr r7, r9, #16\n\t"
  19341. "mul r6, r7, r6\n\t"
  19342. "lsr r7, r6, #16\n\t"
  19343. "lsl r6, r6, #16\n\t"
  19344. "adds r4, r4, r6\n\t"
  19345. "adcs r5, r5, r7\n\t"
  19346. "adc r3, r3, #0\n\t"
  19347. "lsr r6, r8, #16\n\t"
  19348. "lsr r7, r9, #16\n\t"
  19349. "mul r7, r6, r7\n\t"
  19350. "adds r5, r5, r7\n\t"
  19351. "adc r3, r3, #0\n\t"
  19352. "lsl r7, r9, #16\n\t"
  19353. "lsr r7, r7, #16\n\t"
  19354. "mul r6, r7, r6\n\t"
  19355. "lsr r7, r6, #16\n\t"
  19356. "lsl r6, r6, #16\n\t"
  19357. "adds r4, r4, r6\n\t"
  19358. "adcs r5, r5, r7\n\t"
  19359. "adc r3, r3, #0\n\t"
  19360. #else
  19361. "umull r6, r7, r8, r9\n\t"
  19362. "adds r4, r4, r6\n\t"
  19363. "adcs r5, r5, r7\n\t"
  19364. "adc r3, r3, #0\n\t"
  19365. #endif
  19366. /* A[6] * B[1] */
  19367. "ldr r8, [%[a], #24]\n\t"
  19368. "ldr r9, [%[b], #4]\n\t"
  19369. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  19370. "lsl r6, r8, #16\n\t"
  19371. "lsl r7, r9, #16\n\t"
  19372. "lsr r6, r6, #16\n\t"
  19373. "lsr r7, r7, #16\n\t"
  19374. "mul r7, r6, r7\n\t"
  19375. "adds r4, r4, r7\n\t"
  19376. "adcs r5, r5, #0\n\t"
  19377. "adc r3, r3, #0\n\t"
  19378. "lsr r7, r9, #16\n\t"
  19379. "mul r6, r7, r6\n\t"
  19380. "lsr r7, r6, #16\n\t"
  19381. "lsl r6, r6, #16\n\t"
  19382. "adds r4, r4, r6\n\t"
  19383. "adcs r5, r5, r7\n\t"
  19384. "adc r3, r3, #0\n\t"
  19385. "lsr r6, r8, #16\n\t"
  19386. "lsr r7, r9, #16\n\t"
  19387. "mul r7, r6, r7\n\t"
  19388. "adds r5, r5, r7\n\t"
  19389. "adc r3, r3, #0\n\t"
  19390. "lsl r7, r9, #16\n\t"
  19391. "lsr r7, r7, #16\n\t"
  19392. "mul r6, r7, r6\n\t"
  19393. "lsr r7, r6, #16\n\t"
  19394. "lsl r6, r6, #16\n\t"
  19395. "adds r4, r4, r6\n\t"
  19396. "adcs r5, r5, r7\n\t"
  19397. "adc r3, r3, #0\n\t"
  19398. #else
  19399. "umull r6, r7, r8, r9\n\t"
  19400. "adds r4, r4, r6\n\t"
  19401. "adcs r5, r5, r7\n\t"
  19402. "adc r3, r3, #0\n\t"
  19403. #endif
  19404. /* A[7] * B[0] */
  19405. "ldr r8, [%[a], #28]\n\t"
  19406. "ldr r9, [%[b]]\n\t"
  19407. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  19408. "lsl r6, r8, #16\n\t"
  19409. "lsl r7, r9, #16\n\t"
  19410. "lsr r6, r6, #16\n\t"
  19411. "lsr r7, r7, #16\n\t"
  19412. "mul r7, r6, r7\n\t"
  19413. "adds r4, r4, r7\n\t"
  19414. "adcs r5, r5, #0\n\t"
  19415. "adc r3, r3, #0\n\t"
  19416. "lsr r7, r9, #16\n\t"
  19417. "mul r6, r7, r6\n\t"
  19418. "lsr r7, r6, #16\n\t"
  19419. "lsl r6, r6, #16\n\t"
  19420. "adds r4, r4, r6\n\t"
  19421. "adcs r5, r5, r7\n\t"
  19422. "adc r3, r3, #0\n\t"
  19423. "lsr r6, r8, #16\n\t"
  19424. "lsr r7, r9, #16\n\t"
  19425. "mul r7, r6, r7\n\t"
  19426. "adds r5, r5, r7\n\t"
  19427. "adc r3, r3, #0\n\t"
  19428. "lsl r7, r9, #16\n\t"
  19429. "lsr r7, r7, #16\n\t"
  19430. "mul r6, r7, r6\n\t"
  19431. "lsr r7, r6, #16\n\t"
  19432. "lsl r6, r6, #16\n\t"
  19433. "adds r4, r4, r6\n\t"
  19434. "adcs r5, r5, r7\n\t"
  19435. "adc r3, r3, #0\n\t"
  19436. #else
  19437. "umull r6, r7, r8, r9\n\t"
  19438. "adds r4, r4, r6\n\t"
  19439. "adcs r5, r5, r7\n\t"
  19440. "adc r3, r3, #0\n\t"
  19441. #endif
  19442. "str r4, [sp, #28]\n\t"
  19443. /* A[8] * B[0] */
  19444. "ldr r8, [%[a], #32]\n\t"
  19445. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  19446. "lsl r6, r8, #16\n\t"
  19447. "lsl r7, r9, #16\n\t"
  19448. "lsr r6, r6, #16\n\t"
  19449. "lsr r7, r7, #16\n\t"
  19450. "mul r7, r6, r7\n\t"
  19451. "adds r5, r5, r7\n\t"
  19452. "adcs r3, r3, #0\n\t"
  19453. "mov r4, #0\n\t"
  19454. "adc r4, r4, #0\n\t"
  19455. "lsr r7, r9, #16\n\t"
  19456. "mul r6, r7, r6\n\t"
  19457. "lsr r7, r6, #16\n\t"
  19458. "lsl r6, r6, #16\n\t"
  19459. "adds r5, r5, r6\n\t"
  19460. "adcs r3, r3, r7\n\t"
  19461. "adc r4, r4, #0\n\t"
  19462. "lsr r6, r8, #16\n\t"
  19463. "lsr r7, r9, #16\n\t"
  19464. "mul r7, r6, r7\n\t"
  19465. "adds r3, r3, r7\n\t"
  19466. "adc r4, r4, #0\n\t"
  19467. "lsl r7, r9, #16\n\t"
  19468. "lsr r7, r7, #16\n\t"
  19469. "mul r6, r7, r6\n\t"
  19470. "lsr r7, r6, #16\n\t"
  19471. "lsl r6, r6, #16\n\t"
  19472. "adds r5, r5, r6\n\t"
  19473. "adcs r3, r3, r7\n\t"
  19474. "adc r4, r4, #0\n\t"
  19475. #else
  19476. "umull r6, r7, r8, r9\n\t"
  19477. "adds r5, r5, r6\n\t"
  19478. "adcs r3, r3, r7\n\t"
  19479. "mov r4, #0\n\t"
  19480. "adc r4, r4, #0\n\t"
  19481. #endif
  19482. /* A[7] * B[1] */
  19483. "ldr r8, [%[a], #28]\n\t"
  19484. "ldr r9, [%[b], #4]\n\t"
  19485. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  19486. "lsl r6, r8, #16\n\t"
  19487. "lsl r7, r9, #16\n\t"
  19488. "lsr r6, r6, #16\n\t"
  19489. "lsr r7, r7, #16\n\t"
  19490. "mul r7, r6, r7\n\t"
  19491. "adds r5, r5, r7\n\t"
  19492. "adcs r3, r3, #0\n\t"
  19493. "adc r4, r4, #0\n\t"
  19494. "lsr r7, r9, #16\n\t"
  19495. "mul r6, r7, r6\n\t"
  19496. "lsr r7, r6, #16\n\t"
  19497. "lsl r6, r6, #16\n\t"
  19498. "adds r5, r5, r6\n\t"
  19499. "adcs r3, r3, r7\n\t"
  19500. "adc r4, r4, #0\n\t"
  19501. "lsr r6, r8, #16\n\t"
  19502. "lsr r7, r9, #16\n\t"
  19503. "mul r7, r6, r7\n\t"
  19504. "adds r3, r3, r7\n\t"
  19505. "adc r4, r4, #0\n\t"
  19506. "lsl r7, r9, #16\n\t"
  19507. "lsr r7, r7, #16\n\t"
  19508. "mul r6, r7, r6\n\t"
  19509. "lsr r7, r6, #16\n\t"
  19510. "lsl r6, r6, #16\n\t"
  19511. "adds r5, r5, r6\n\t"
  19512. "adcs r3, r3, r7\n\t"
  19513. "adc r4, r4, #0\n\t"
  19514. #else
  19515. "umull r6, r7, r8, r9\n\t"
  19516. "adds r5, r5, r6\n\t"
  19517. "adcs r3, r3, r7\n\t"
  19518. "adc r4, r4, #0\n\t"
  19519. #endif
  19520. /* A[6] * B[2] */
  19521. "ldr r8, [%[a], #24]\n\t"
  19522. "ldr r9, [%[b], #8]\n\t"
  19523. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  19524. "lsl r6, r8, #16\n\t"
  19525. "lsl r7, r9, #16\n\t"
  19526. "lsr r6, r6, #16\n\t"
  19527. "lsr r7, r7, #16\n\t"
  19528. "mul r7, r6, r7\n\t"
  19529. "adds r5, r5, r7\n\t"
  19530. "adcs r3, r3, #0\n\t"
  19531. "adc r4, r4, #0\n\t"
  19532. "lsr r7, r9, #16\n\t"
  19533. "mul r6, r7, r6\n\t"
  19534. "lsr r7, r6, #16\n\t"
  19535. "lsl r6, r6, #16\n\t"
  19536. "adds r5, r5, r6\n\t"
  19537. "adcs r3, r3, r7\n\t"
  19538. "adc r4, r4, #0\n\t"
  19539. "lsr r6, r8, #16\n\t"
  19540. "lsr r7, r9, #16\n\t"
  19541. "mul r7, r6, r7\n\t"
  19542. "adds r3, r3, r7\n\t"
  19543. "adc r4, r4, #0\n\t"
  19544. "lsl r7, r9, #16\n\t"
  19545. "lsr r7, r7, #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 r5, r5, r6\n\t"
  19550. "adcs r3, r3, r7\n\t"
  19551. "adc r4, r4, #0\n\t"
  19552. #else
  19553. "umull r6, r7, r8, r9\n\t"
  19554. "adds r5, r5, r6\n\t"
  19555. "adcs r3, r3, r7\n\t"
  19556. "adc r4, r4, #0\n\t"
  19557. #endif
  19558. /* A[5] * B[3] */
  19559. "ldr r8, [%[a], #20]\n\t"
  19560. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  19561. "lsl r6, r8, #16\n\t"
  19562. "lsl r7, r12, #16\n\t"
  19563. "lsr r6, r6, #16\n\t"
  19564. "lsr r7, r7, #16\n\t"
  19565. "mul r7, r6, r7\n\t"
  19566. "adds r5, r5, r7\n\t"
  19567. "adcs r3, r3, #0\n\t"
  19568. "adc r4, r4, #0\n\t"
  19569. "lsr r7, r12, #16\n\t"
  19570. "mul r6, r7, r6\n\t"
  19571. "lsr r7, r6, #16\n\t"
  19572. "lsl r6, r6, #16\n\t"
  19573. "adds r5, r5, r6\n\t"
  19574. "adcs r3, r3, r7\n\t"
  19575. "adc r4, r4, #0\n\t"
  19576. "lsr r6, r8, #16\n\t"
  19577. "lsr r7, r12, #16\n\t"
  19578. "mul r7, r6, r7\n\t"
  19579. "adds r3, r3, r7\n\t"
  19580. "adc r4, r4, #0\n\t"
  19581. "lsl r7, r12, #16\n\t"
  19582. "lsr r7, r7, #16\n\t"
  19583. "mul r6, r7, r6\n\t"
  19584. "lsr r7, r6, #16\n\t"
  19585. "lsl r6, r6, #16\n\t"
  19586. "adds r5, r5, r6\n\t"
  19587. "adcs r3, r3, r7\n\t"
  19588. "adc r4, r4, #0\n\t"
  19589. #else
  19590. "umull r6, r7, r8, r12\n\t"
  19591. "adds r5, r5, r6\n\t"
  19592. "adcs r3, r3, r7\n\t"
  19593. "adc r4, r4, #0\n\t"
  19594. #endif
  19595. /* A[4] * B[4] */
  19596. "ldr r11, [%[a], #16]\n\t"
  19597. "ldr r12, [%[b], #16]\n\t"
  19598. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  19599. "lsl r6, r11, #16\n\t"
  19600. "lsl r7, r12, #16\n\t"
  19601. "lsr r6, r6, #16\n\t"
  19602. "lsr r7, r7, #16\n\t"
  19603. "mul r7, r6, r7\n\t"
  19604. "adds r5, r5, r7\n\t"
  19605. "adcs r3, r3, #0\n\t"
  19606. "adc r4, r4, #0\n\t"
  19607. "lsr r7, r12, #16\n\t"
  19608. "mul r6, r7, r6\n\t"
  19609. "lsr r7, r6, #16\n\t"
  19610. "lsl r6, r6, #16\n\t"
  19611. "adds r5, r5, r6\n\t"
  19612. "adcs r3, r3, r7\n\t"
  19613. "adc r4, r4, #0\n\t"
  19614. "lsr r6, r11, #16\n\t"
  19615. "lsr r7, r12, #16\n\t"
  19616. "mul r7, r6, r7\n\t"
  19617. "adds r3, r3, r7\n\t"
  19618. "adc r4, r4, #0\n\t"
  19619. "lsl r7, r12, #16\n\t"
  19620. "lsr r7, r7, #16\n\t"
  19621. "mul r6, r7, r6\n\t"
  19622. "lsr r7, r6, #16\n\t"
  19623. "lsl r6, r6, #16\n\t"
  19624. "adds r5, r5, r6\n\t"
  19625. "adcs r3, r3, r7\n\t"
  19626. "adc r4, r4, #0\n\t"
  19627. #else
  19628. "umull r6, r7, r11, r12\n\t"
  19629. "adds r5, r5, r6\n\t"
  19630. "adcs r3, r3, r7\n\t"
  19631. "adc r4, r4, #0\n\t"
  19632. #endif
  19633. /* A[3] * B[5] */
  19634. "ldr r8, [%[a], #12]\n\t"
  19635. "ldr r9, [%[b], #20]\n\t"
  19636. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  19637. "lsl r6, r8, #16\n\t"
  19638. "lsl r7, r9, #16\n\t"
  19639. "lsr r6, r6, #16\n\t"
  19640. "lsr r7, r7, #16\n\t"
  19641. "mul r7, r6, r7\n\t"
  19642. "adds r5, r5, r7\n\t"
  19643. "adcs r3, r3, #0\n\t"
  19644. "adc r4, r4, #0\n\t"
  19645. "lsr r7, r9, #16\n\t"
  19646. "mul r6, r7, r6\n\t"
  19647. "lsr r7, r6, #16\n\t"
  19648. "lsl r6, r6, #16\n\t"
  19649. "adds r5, r5, r6\n\t"
  19650. "adcs r3, r3, r7\n\t"
  19651. "adc r4, r4, #0\n\t"
  19652. "lsr r6, r8, #16\n\t"
  19653. "lsr r7, r9, #16\n\t"
  19654. "mul r7, r6, r7\n\t"
  19655. "adds r3, r3, r7\n\t"
  19656. "adc r4, r4, #0\n\t"
  19657. "lsl r7, r9, #16\n\t"
  19658. "lsr r7, r7, #16\n\t"
  19659. "mul r6, r7, r6\n\t"
  19660. "lsr r7, r6, #16\n\t"
  19661. "lsl r6, r6, #16\n\t"
  19662. "adds r5, r5, r6\n\t"
  19663. "adcs r3, r3, r7\n\t"
  19664. "adc r4, r4, #0\n\t"
  19665. #else
  19666. "umull r6, r7, r8, r9\n\t"
  19667. "adds r5, r5, r6\n\t"
  19668. "adcs r3, r3, r7\n\t"
  19669. "adc r4, r4, #0\n\t"
  19670. #endif
  19671. /* A[2] * B[6] */
  19672. "ldr r8, [%[a], #8]\n\t"
  19673. "ldr r9, [%[b], #24]\n\t"
  19674. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  19675. "lsl r6, r8, #16\n\t"
  19676. "lsl r7, r9, #16\n\t"
  19677. "lsr r6, r6, #16\n\t"
  19678. "lsr r7, r7, #16\n\t"
  19679. "mul r7, r6, r7\n\t"
  19680. "adds r5, r5, r7\n\t"
  19681. "adcs r3, r3, #0\n\t"
  19682. "adc r4, r4, #0\n\t"
  19683. "lsr r7, r9, #16\n\t"
  19684. "mul r6, r7, r6\n\t"
  19685. "lsr r7, r6, #16\n\t"
  19686. "lsl r6, r6, #16\n\t"
  19687. "adds r5, r5, r6\n\t"
  19688. "adcs r3, r3, r7\n\t"
  19689. "adc r4, r4, #0\n\t"
  19690. "lsr r6, r8, #16\n\t"
  19691. "lsr r7, r9, #16\n\t"
  19692. "mul r7, r6, r7\n\t"
  19693. "adds r3, r3, r7\n\t"
  19694. "adc r4, r4, #0\n\t"
  19695. "lsl r7, r9, #16\n\t"
  19696. "lsr r7, r7, #16\n\t"
  19697. "mul r6, r7, r6\n\t"
  19698. "lsr r7, r6, #16\n\t"
  19699. "lsl r6, r6, #16\n\t"
  19700. "adds r5, r5, r6\n\t"
  19701. "adcs r3, r3, r7\n\t"
  19702. "adc r4, r4, #0\n\t"
  19703. #else
  19704. "umull r6, r7, r8, r9\n\t"
  19705. "adds r5, r5, r6\n\t"
  19706. "adcs r3, r3, r7\n\t"
  19707. "adc r4, r4, #0\n\t"
  19708. #endif
  19709. /* A[1] * B[7] */
  19710. "ldr r8, [%[a], #4]\n\t"
  19711. "ldr r9, [%[b], #28]\n\t"
  19712. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  19713. "lsl r6, r8, #16\n\t"
  19714. "lsl r7, r9, #16\n\t"
  19715. "lsr r6, r6, #16\n\t"
  19716. "lsr r7, r7, #16\n\t"
  19717. "mul r7, r6, r7\n\t"
  19718. "adds r5, r5, r7\n\t"
  19719. "adcs r3, r3, #0\n\t"
  19720. "adc r4, r4, #0\n\t"
  19721. "lsr r7, r9, #16\n\t"
  19722. "mul r6, r7, r6\n\t"
  19723. "lsr r7, r6, #16\n\t"
  19724. "lsl r6, r6, #16\n\t"
  19725. "adds r5, r5, r6\n\t"
  19726. "adcs r3, r3, r7\n\t"
  19727. "adc r4, r4, #0\n\t"
  19728. "lsr r6, r8, #16\n\t"
  19729. "lsr r7, r9, #16\n\t"
  19730. "mul r7, r6, r7\n\t"
  19731. "adds r3, r3, r7\n\t"
  19732. "adc r4, r4, #0\n\t"
  19733. "lsl r7, r9, #16\n\t"
  19734. "lsr r7, r7, #16\n\t"
  19735. "mul r6, r7, r6\n\t"
  19736. "lsr r7, r6, #16\n\t"
  19737. "lsl r6, r6, #16\n\t"
  19738. "adds r5, r5, r6\n\t"
  19739. "adcs r3, r3, r7\n\t"
  19740. "adc r4, r4, #0\n\t"
  19741. #else
  19742. "umull r6, r7, r8, r9\n\t"
  19743. "adds r5, r5, r6\n\t"
  19744. "adcs r3, r3, r7\n\t"
  19745. "adc r4, r4, #0\n\t"
  19746. #endif
  19747. /* A[0] * B[8] */
  19748. "ldr r8, [%[a]]\n\t"
  19749. "ldr r9, [%[b], #32]\n\t"
  19750. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  19751. "lsl r6, r8, #16\n\t"
  19752. "lsl r7, r9, #16\n\t"
  19753. "lsr r6, r6, #16\n\t"
  19754. "lsr r7, r7, #16\n\t"
  19755. "mul r7, r6, r7\n\t"
  19756. "adds r5, r5, r7\n\t"
  19757. "adcs r3, r3, #0\n\t"
  19758. "adc r4, r4, #0\n\t"
  19759. "lsr r7, r9, #16\n\t"
  19760. "mul r6, r7, r6\n\t"
  19761. "lsr r7, r6, #16\n\t"
  19762. "lsl r6, r6, #16\n\t"
  19763. "adds r5, r5, r6\n\t"
  19764. "adcs r3, r3, r7\n\t"
  19765. "adc r4, r4, #0\n\t"
  19766. "lsr r6, r8, #16\n\t"
  19767. "lsr r7, r9, #16\n\t"
  19768. "mul r7, r6, r7\n\t"
  19769. "adds r3, r3, r7\n\t"
  19770. "adc r4, r4, #0\n\t"
  19771. "lsl r7, r9, #16\n\t"
  19772. "lsr r7, r7, #16\n\t"
  19773. "mul r6, r7, r6\n\t"
  19774. "lsr r7, r6, #16\n\t"
  19775. "lsl r6, r6, #16\n\t"
  19776. "adds r5, r5, r6\n\t"
  19777. "adcs r3, r3, r7\n\t"
  19778. "adc r4, r4, #0\n\t"
  19779. #else
  19780. "umull r6, r7, r8, r9\n\t"
  19781. "adds r5, r5, r6\n\t"
  19782. "adcs r3, r3, r7\n\t"
  19783. "adc r4, r4, #0\n\t"
  19784. #endif
  19785. "str r5, [sp, #32]\n\t"
  19786. /* A[0] * B[9] */
  19787. "ldr r9, [%[b], #36]\n\t"
  19788. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  19789. "lsl r6, r8, #16\n\t"
  19790. "lsl r7, r9, #16\n\t"
  19791. "lsr r6, r6, #16\n\t"
  19792. "lsr r7, r7, #16\n\t"
  19793. "mul r7, r6, r7\n\t"
  19794. "adds r3, r3, r7\n\t"
  19795. "adcs r4, r4, #0\n\t"
  19796. "mov r5, #0\n\t"
  19797. "adc r5, r5, #0\n\t"
  19798. "lsr r7, r9, #16\n\t"
  19799. "mul r6, r7, r6\n\t"
  19800. "lsr r7, r6, #16\n\t"
  19801. "lsl r6, r6, #16\n\t"
  19802. "adds r3, r3, r6\n\t"
  19803. "adcs r4, r4, r7\n\t"
  19804. "adc r5, r5, #0\n\t"
  19805. "lsr r6, r8, #16\n\t"
  19806. "lsr r7, r9, #16\n\t"
  19807. "mul r7, r6, r7\n\t"
  19808. "adds r4, r4, r7\n\t"
  19809. "adc r5, r5, #0\n\t"
  19810. "lsl r7, r9, #16\n\t"
  19811. "lsr r7, r7, #16\n\t"
  19812. "mul r6, r7, r6\n\t"
  19813. "lsr r7, r6, #16\n\t"
  19814. "lsl r6, r6, #16\n\t"
  19815. "adds r3, r3, r6\n\t"
  19816. "adcs r4, r4, r7\n\t"
  19817. "adc r5, r5, #0\n\t"
  19818. #else
  19819. "umull r6, r7, r8, r9\n\t"
  19820. "adds r3, r3, r6\n\t"
  19821. "adcs r4, r4, r7\n\t"
  19822. "mov r5, #0\n\t"
  19823. "adc r5, r5, #0\n\t"
  19824. #endif
  19825. /* A[1] * B[8] */
  19826. "ldr r8, [%[a], #4]\n\t"
  19827. "ldr r9, [%[b], #32]\n\t"
  19828. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  19829. "lsl r6, r8, #16\n\t"
  19830. "lsl r7, r9, #16\n\t"
  19831. "lsr r6, r6, #16\n\t"
  19832. "lsr r7, r7, #16\n\t"
  19833. "mul r7, r6, r7\n\t"
  19834. "adds r3, r3, r7\n\t"
  19835. "adcs r4, r4, #0\n\t"
  19836. "adc r5, r5, #0\n\t"
  19837. "lsr r7, r9, #16\n\t"
  19838. "mul r6, r7, r6\n\t"
  19839. "lsr r7, r6, #16\n\t"
  19840. "lsl r6, r6, #16\n\t"
  19841. "adds r3, r3, r6\n\t"
  19842. "adcs r4, r4, r7\n\t"
  19843. "adc r5, r5, #0\n\t"
  19844. "lsr r6, r8, #16\n\t"
  19845. "lsr r7, r9, #16\n\t"
  19846. "mul r7, r6, r7\n\t"
  19847. "adds r4, r4, r7\n\t"
  19848. "adc r5, r5, #0\n\t"
  19849. "lsl r7, r9, #16\n\t"
  19850. "lsr r7, r7, #16\n\t"
  19851. "mul r6, r7, r6\n\t"
  19852. "lsr r7, r6, #16\n\t"
  19853. "lsl r6, r6, #16\n\t"
  19854. "adds r3, r3, r6\n\t"
  19855. "adcs r4, r4, r7\n\t"
  19856. "adc r5, r5, #0\n\t"
  19857. #else
  19858. "umull r6, r7, r8, r9\n\t"
  19859. "adds r3, r3, r6\n\t"
  19860. "adcs r4, r4, r7\n\t"
  19861. "adc r5, r5, #0\n\t"
  19862. #endif
  19863. /* A[2] * B[7] */
  19864. "ldr r8, [%[a], #8]\n\t"
  19865. "ldr r9, [%[b], #28]\n\t"
  19866. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  19867. "lsl r6, r8, #16\n\t"
  19868. "lsl r7, r9, #16\n\t"
  19869. "lsr r6, r6, #16\n\t"
  19870. "lsr r7, r7, #16\n\t"
  19871. "mul r7, r6, r7\n\t"
  19872. "adds r3, r3, r7\n\t"
  19873. "adcs r4, r4, #0\n\t"
  19874. "adc r5, r5, #0\n\t"
  19875. "lsr r7, r9, #16\n\t"
  19876. "mul r6, r7, r6\n\t"
  19877. "lsr r7, r6, #16\n\t"
  19878. "lsl r6, r6, #16\n\t"
  19879. "adds r3, r3, r6\n\t"
  19880. "adcs r4, r4, r7\n\t"
  19881. "adc r5, r5, #0\n\t"
  19882. "lsr r6, r8, #16\n\t"
  19883. "lsr r7, r9, #16\n\t"
  19884. "mul r7, r6, r7\n\t"
  19885. "adds r4, r4, r7\n\t"
  19886. "adc r5, r5, #0\n\t"
  19887. "lsl r7, r9, #16\n\t"
  19888. "lsr r7, r7, #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 r3, r3, r6\n\t"
  19893. "adcs r4, r4, r7\n\t"
  19894. "adc r5, r5, #0\n\t"
  19895. #else
  19896. "umull r6, r7, r8, r9\n\t"
  19897. "adds r3, r3, r6\n\t"
  19898. "adcs r4, r4, r7\n\t"
  19899. "adc r5, r5, #0\n\t"
  19900. #endif
  19901. /* A[3] * B[6] */
  19902. "ldr r8, [%[a], #12]\n\t"
  19903. "ldr r9, [%[b], #24]\n\t"
  19904. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  19905. "lsl r6, r8, #16\n\t"
  19906. "lsl r7, r9, #16\n\t"
  19907. "lsr r6, r6, #16\n\t"
  19908. "lsr r7, r7, #16\n\t"
  19909. "mul r7, r6, r7\n\t"
  19910. "adds r3, r3, r7\n\t"
  19911. "adcs r4, r4, #0\n\t"
  19912. "adc r5, r5, #0\n\t"
  19913. "lsr r7, r9, #16\n\t"
  19914. "mul r6, r7, r6\n\t"
  19915. "lsr r7, r6, #16\n\t"
  19916. "lsl r6, r6, #16\n\t"
  19917. "adds r3, r3, r6\n\t"
  19918. "adcs r4, r4, r7\n\t"
  19919. "adc r5, r5, #0\n\t"
  19920. "lsr r6, r8, #16\n\t"
  19921. "lsr r7, r9, #16\n\t"
  19922. "mul r7, r6, r7\n\t"
  19923. "adds r4, r4, r7\n\t"
  19924. "adc r5, r5, #0\n\t"
  19925. "lsl r7, r9, #16\n\t"
  19926. "lsr r7, r7, #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 r3, r3, r6\n\t"
  19931. "adcs r4, r4, r7\n\t"
  19932. "adc r5, r5, #0\n\t"
  19933. #else
  19934. "umull r6, r7, r8, r9\n\t"
  19935. "adds r3, r3, r6\n\t"
  19936. "adcs r4, r4, r7\n\t"
  19937. "adc r5, r5, #0\n\t"
  19938. #endif
  19939. /* A[4] * B[5] */
  19940. "ldr r9, [%[b], #20]\n\t"
  19941. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  19942. "lsl r6, r11, #16\n\t"
  19943. "lsl r7, r9, #16\n\t"
  19944. "lsr r6, r6, #16\n\t"
  19945. "lsr r7, r7, #16\n\t"
  19946. "mul r7, r6, r7\n\t"
  19947. "adds r3, r3, r7\n\t"
  19948. "adcs r4, r4, #0\n\t"
  19949. "adc r5, r5, #0\n\t"
  19950. "lsr r7, r9, #16\n\t"
  19951. "mul r6, r7, r6\n\t"
  19952. "lsr r7, r6, #16\n\t"
  19953. "lsl r6, r6, #16\n\t"
  19954. "adds r3, r3, r6\n\t"
  19955. "adcs r4, r4, r7\n\t"
  19956. "adc r5, r5, #0\n\t"
  19957. "lsr r6, r11, #16\n\t"
  19958. "lsr r7, r9, #16\n\t"
  19959. "mul r7, r6, r7\n\t"
  19960. "adds r4, r4, r7\n\t"
  19961. "adc r5, r5, #0\n\t"
  19962. "lsl r7, r9, #16\n\t"
  19963. "lsr r7, r7, #16\n\t"
  19964. "mul r6, r7, r6\n\t"
  19965. "lsr r7, r6, #16\n\t"
  19966. "lsl r6, r6, #16\n\t"
  19967. "adds r3, r3, r6\n\t"
  19968. "adcs r4, r4, r7\n\t"
  19969. "adc r5, r5, #0\n\t"
  19970. #else
  19971. "umull r6, r7, r11, r9\n\t"
  19972. "adds r3, r3, r6\n\t"
  19973. "adcs r4, r4, r7\n\t"
  19974. "adc r5, r5, #0\n\t"
  19975. #endif
  19976. /* A[5] * B[4] */
  19977. "ldr r8, [%[a], #20]\n\t"
  19978. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  19979. "lsl r6, r8, #16\n\t"
  19980. "lsl r7, r12, #16\n\t"
  19981. "lsr r6, r6, #16\n\t"
  19982. "lsr r7, r7, #16\n\t"
  19983. "mul r7, r6, r7\n\t"
  19984. "adds r3, r3, r7\n\t"
  19985. "adcs r4, r4, #0\n\t"
  19986. "adc r5, r5, #0\n\t"
  19987. "lsr r7, r12, #16\n\t"
  19988. "mul r6, r7, r6\n\t"
  19989. "lsr r7, r6, #16\n\t"
  19990. "lsl r6, r6, #16\n\t"
  19991. "adds r3, r3, r6\n\t"
  19992. "adcs r4, r4, r7\n\t"
  19993. "adc r5, r5, #0\n\t"
  19994. "lsr r6, r8, #16\n\t"
  19995. "lsr r7, r12, #16\n\t"
  19996. "mul r7, r6, r7\n\t"
  19997. "adds r4, r4, r7\n\t"
  19998. "adc r5, r5, #0\n\t"
  19999. "lsl r7, r12, #16\n\t"
  20000. "lsr r7, r7, #16\n\t"
  20001. "mul r6, r7, r6\n\t"
  20002. "lsr r7, r6, #16\n\t"
  20003. "lsl r6, r6, #16\n\t"
  20004. "adds r3, r3, r6\n\t"
  20005. "adcs r4, r4, r7\n\t"
  20006. "adc r5, r5, #0\n\t"
  20007. #else
  20008. "umull r6, r7, r8, r12\n\t"
  20009. "adds r3, r3, r6\n\t"
  20010. "adcs r4, r4, r7\n\t"
  20011. "adc r5, r5, #0\n\t"
  20012. #endif
  20013. /* A[6] * B[3] */
  20014. "ldr r8, [%[a], #24]\n\t"
  20015. "ldr r9, [%[b], #12]\n\t"
  20016. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  20017. "lsl r6, r8, #16\n\t"
  20018. "lsl r7, r9, #16\n\t"
  20019. "lsr r6, r6, #16\n\t"
  20020. "lsr r7, r7, #16\n\t"
  20021. "mul r7, r6, r7\n\t"
  20022. "adds r3, r3, r7\n\t"
  20023. "adcs r4, r4, #0\n\t"
  20024. "adc r5, r5, #0\n\t"
  20025. "lsr r7, r9, #16\n\t"
  20026. "mul r6, r7, r6\n\t"
  20027. "lsr r7, r6, #16\n\t"
  20028. "lsl r6, r6, #16\n\t"
  20029. "adds r3, r3, r6\n\t"
  20030. "adcs r4, r4, r7\n\t"
  20031. "adc r5, r5, #0\n\t"
  20032. "lsr r6, r8, #16\n\t"
  20033. "lsr r7, r9, #16\n\t"
  20034. "mul r7, r6, r7\n\t"
  20035. "adds r4, r4, r7\n\t"
  20036. "adc r5, r5, #0\n\t"
  20037. "lsl r7, r9, #16\n\t"
  20038. "lsr r7, r7, #16\n\t"
  20039. "mul r6, r7, r6\n\t"
  20040. "lsr r7, r6, #16\n\t"
  20041. "lsl r6, r6, #16\n\t"
  20042. "adds r3, r3, r6\n\t"
  20043. "adcs r4, r4, r7\n\t"
  20044. "adc r5, r5, #0\n\t"
  20045. #else
  20046. "umull r6, r7, r8, r9\n\t"
  20047. "adds r3, r3, r6\n\t"
  20048. "adcs r4, r4, r7\n\t"
  20049. "adc r5, r5, #0\n\t"
  20050. #endif
  20051. /* A[7] * B[2] */
  20052. "ldr r8, [%[a], #28]\n\t"
  20053. "ldr r9, [%[b], #8]\n\t"
  20054. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  20055. "lsl r6, r8, #16\n\t"
  20056. "lsl r7, r9, #16\n\t"
  20057. "lsr r6, r6, #16\n\t"
  20058. "lsr r7, r7, #16\n\t"
  20059. "mul r7, r6, r7\n\t"
  20060. "adds r3, r3, r7\n\t"
  20061. "adcs r4, r4, #0\n\t"
  20062. "adc r5, r5, #0\n\t"
  20063. "lsr r7, r9, #16\n\t"
  20064. "mul r6, r7, r6\n\t"
  20065. "lsr r7, r6, #16\n\t"
  20066. "lsl r6, r6, #16\n\t"
  20067. "adds r3, r3, r6\n\t"
  20068. "adcs r4, r4, r7\n\t"
  20069. "adc r5, r5, #0\n\t"
  20070. "lsr r6, r8, #16\n\t"
  20071. "lsr r7, r9, #16\n\t"
  20072. "mul r7, r6, r7\n\t"
  20073. "adds r4, r4, r7\n\t"
  20074. "adc r5, r5, #0\n\t"
  20075. "lsl r7, r9, #16\n\t"
  20076. "lsr r7, r7, #16\n\t"
  20077. "mul r6, r7, r6\n\t"
  20078. "lsr r7, r6, #16\n\t"
  20079. "lsl r6, r6, #16\n\t"
  20080. "adds r3, r3, r6\n\t"
  20081. "adcs r4, r4, r7\n\t"
  20082. "adc r5, r5, #0\n\t"
  20083. #else
  20084. "umull r6, r7, r8, r9\n\t"
  20085. "adds r3, r3, r6\n\t"
  20086. "adcs r4, r4, r7\n\t"
  20087. "adc r5, r5, #0\n\t"
  20088. #endif
  20089. /* A[8] * B[1] */
  20090. "ldr r8, [%[a], #32]\n\t"
  20091. "ldr r9, [%[b], #4]\n\t"
  20092. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  20093. "lsl r6, r8, #16\n\t"
  20094. "lsl r7, r9, #16\n\t"
  20095. "lsr r6, r6, #16\n\t"
  20096. "lsr r7, r7, #16\n\t"
  20097. "mul r7, r6, r7\n\t"
  20098. "adds r3, r3, r7\n\t"
  20099. "adcs r4, r4, #0\n\t"
  20100. "adc r5, r5, #0\n\t"
  20101. "lsr r7, r9, #16\n\t"
  20102. "mul r6, r7, r6\n\t"
  20103. "lsr r7, r6, #16\n\t"
  20104. "lsl r6, r6, #16\n\t"
  20105. "adds r3, r3, r6\n\t"
  20106. "adcs r4, r4, r7\n\t"
  20107. "adc r5, r5, #0\n\t"
  20108. "lsr r6, r8, #16\n\t"
  20109. "lsr r7, r9, #16\n\t"
  20110. "mul r7, r6, r7\n\t"
  20111. "adds r4, r4, r7\n\t"
  20112. "adc r5, r5, #0\n\t"
  20113. "lsl r7, r9, #16\n\t"
  20114. "lsr r7, r7, #16\n\t"
  20115. "mul r6, r7, r6\n\t"
  20116. "lsr r7, r6, #16\n\t"
  20117. "lsl r6, r6, #16\n\t"
  20118. "adds r3, r3, r6\n\t"
  20119. "adcs r4, r4, r7\n\t"
  20120. "adc r5, r5, #0\n\t"
  20121. #else
  20122. "umull r6, r7, r8, r9\n\t"
  20123. "adds r3, r3, r6\n\t"
  20124. "adcs r4, r4, r7\n\t"
  20125. "adc r5, r5, #0\n\t"
  20126. #endif
  20127. /* A[9] * B[0] */
  20128. "ldr r8, [%[a], #36]\n\t"
  20129. "ldr r9, [%[b]]\n\t"
  20130. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  20131. "lsl r6, r8, #16\n\t"
  20132. "lsl r7, r9, #16\n\t"
  20133. "lsr r6, r6, #16\n\t"
  20134. "lsr r7, r7, #16\n\t"
  20135. "mul r7, r6, r7\n\t"
  20136. "adds r3, r3, r7\n\t"
  20137. "adcs r4, r4, #0\n\t"
  20138. "adc r5, r5, #0\n\t"
  20139. "lsr r7, r9, #16\n\t"
  20140. "mul r6, r7, r6\n\t"
  20141. "lsr r7, r6, #16\n\t"
  20142. "lsl r6, r6, #16\n\t"
  20143. "adds r3, r3, r6\n\t"
  20144. "adcs r4, r4, r7\n\t"
  20145. "adc r5, r5, #0\n\t"
  20146. "lsr r6, r8, #16\n\t"
  20147. "lsr r7, r9, #16\n\t"
  20148. "mul r7, r6, r7\n\t"
  20149. "adds r4, r4, r7\n\t"
  20150. "adc r5, r5, #0\n\t"
  20151. "lsl r7, r9, #16\n\t"
  20152. "lsr r7, r7, #16\n\t"
  20153. "mul r6, r7, r6\n\t"
  20154. "lsr r7, r6, #16\n\t"
  20155. "lsl r6, r6, #16\n\t"
  20156. "adds r3, r3, r6\n\t"
  20157. "adcs r4, r4, r7\n\t"
  20158. "adc r5, r5, #0\n\t"
  20159. #else
  20160. "umull r6, r7, r8, r9\n\t"
  20161. "adds r3, r3, r6\n\t"
  20162. "adcs r4, r4, r7\n\t"
  20163. "adc r5, r5, #0\n\t"
  20164. #endif
  20165. "str r3, [sp, #36]\n\t"
  20166. /* A[10] * B[0] */
  20167. "ldr r8, [%[a], #40]\n\t"
  20168. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  20169. "lsl r6, r8, #16\n\t"
  20170. "lsl r7, r9, #16\n\t"
  20171. "lsr r6, r6, #16\n\t"
  20172. "lsr r7, r7, #16\n\t"
  20173. "mul r7, r6, r7\n\t"
  20174. "adds r4, r4, r7\n\t"
  20175. "adcs r5, r5, #0\n\t"
  20176. "mov r3, #0\n\t"
  20177. "adc r3, r3, #0\n\t"
  20178. "lsr r7, r9, #16\n\t"
  20179. "mul r6, r7, r6\n\t"
  20180. "lsr r7, r6, #16\n\t"
  20181. "lsl r6, r6, #16\n\t"
  20182. "adds r4, r4, r6\n\t"
  20183. "adcs r5, r5, r7\n\t"
  20184. "adc r3, r3, #0\n\t"
  20185. "lsr r6, r8, #16\n\t"
  20186. "lsr r7, r9, #16\n\t"
  20187. "mul r7, r6, r7\n\t"
  20188. "adds r5, r5, r7\n\t"
  20189. "adc r3, r3, #0\n\t"
  20190. "lsl r7, r9, #16\n\t"
  20191. "lsr r7, r7, #16\n\t"
  20192. "mul r6, r7, r6\n\t"
  20193. "lsr r7, r6, #16\n\t"
  20194. "lsl r6, r6, #16\n\t"
  20195. "adds r4, r4, r6\n\t"
  20196. "adcs r5, r5, r7\n\t"
  20197. "adc r3, r3, #0\n\t"
  20198. #else
  20199. "umull r6, r7, r8, r9\n\t"
  20200. "adds r4, r4, r6\n\t"
  20201. "adcs r5, r5, r7\n\t"
  20202. "mov r3, #0\n\t"
  20203. "adc r3, r3, #0\n\t"
  20204. #endif
  20205. /* A[9] * B[1] */
  20206. "ldr r8, [%[a], #36]\n\t"
  20207. "ldr r9, [%[b], #4]\n\t"
  20208. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  20209. "lsl r6, r8, #16\n\t"
  20210. "lsl r7, r9, #16\n\t"
  20211. "lsr r6, r6, #16\n\t"
  20212. "lsr r7, r7, #16\n\t"
  20213. "mul r7, r6, r7\n\t"
  20214. "adds r4, r4, r7\n\t"
  20215. "adcs r5, r5, #0\n\t"
  20216. "adc r3, r3, #0\n\t"
  20217. "lsr r7, r9, #16\n\t"
  20218. "mul r6, r7, r6\n\t"
  20219. "lsr r7, r6, #16\n\t"
  20220. "lsl r6, r6, #16\n\t"
  20221. "adds r4, r4, r6\n\t"
  20222. "adcs r5, r5, r7\n\t"
  20223. "adc r3, r3, #0\n\t"
  20224. "lsr r6, r8, #16\n\t"
  20225. "lsr r7, r9, #16\n\t"
  20226. "mul r7, r6, r7\n\t"
  20227. "adds r5, r5, r7\n\t"
  20228. "adc r3, r3, #0\n\t"
  20229. "lsl r7, r9, #16\n\t"
  20230. "lsr r7, r7, #16\n\t"
  20231. "mul r6, r7, r6\n\t"
  20232. "lsr r7, r6, #16\n\t"
  20233. "lsl r6, r6, #16\n\t"
  20234. "adds r4, r4, r6\n\t"
  20235. "adcs r5, r5, r7\n\t"
  20236. "adc r3, r3, #0\n\t"
  20237. #else
  20238. "umull r6, r7, r8, r9\n\t"
  20239. "adds r4, r4, r6\n\t"
  20240. "adcs r5, r5, r7\n\t"
  20241. "adc r3, r3, #0\n\t"
  20242. #endif
  20243. /* A[8] * B[2] */
  20244. "ldr r8, [%[a], #32]\n\t"
  20245. "ldr r9, [%[b], #8]\n\t"
  20246. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  20247. "lsl r6, r8, #16\n\t"
  20248. "lsl r7, r9, #16\n\t"
  20249. "lsr r6, r6, #16\n\t"
  20250. "lsr r7, r7, #16\n\t"
  20251. "mul r7, r6, r7\n\t"
  20252. "adds r4, r4, r7\n\t"
  20253. "adcs r5, r5, #0\n\t"
  20254. "adc r3, r3, #0\n\t"
  20255. "lsr r7, r9, #16\n\t"
  20256. "mul r6, r7, r6\n\t"
  20257. "lsr r7, r6, #16\n\t"
  20258. "lsl r6, r6, #16\n\t"
  20259. "adds r4, r4, r6\n\t"
  20260. "adcs r5, r5, r7\n\t"
  20261. "adc r3, r3, #0\n\t"
  20262. "lsr r6, r8, #16\n\t"
  20263. "lsr r7, r9, #16\n\t"
  20264. "mul r7, r6, r7\n\t"
  20265. "adds r5, r5, r7\n\t"
  20266. "adc r3, r3, #0\n\t"
  20267. "lsl r7, r9, #16\n\t"
  20268. "lsr r7, r7, #16\n\t"
  20269. "mul r6, r7, r6\n\t"
  20270. "lsr r7, r6, #16\n\t"
  20271. "lsl r6, r6, #16\n\t"
  20272. "adds r4, r4, r6\n\t"
  20273. "adcs r5, r5, r7\n\t"
  20274. "adc r3, r3, #0\n\t"
  20275. #else
  20276. "umull r6, r7, r8, r9\n\t"
  20277. "adds r4, r4, r6\n\t"
  20278. "adcs r5, r5, r7\n\t"
  20279. "adc r3, r3, #0\n\t"
  20280. #endif
  20281. /* A[7] * B[3] */
  20282. "ldr r8, [%[a], #28]\n\t"
  20283. "ldr r9, [%[b], #12]\n\t"
  20284. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  20285. "lsl r6, r8, #16\n\t"
  20286. "lsl r7, r9, #16\n\t"
  20287. "lsr r6, r6, #16\n\t"
  20288. "lsr r7, r7, #16\n\t"
  20289. "mul r7, r6, r7\n\t"
  20290. "adds r4, r4, r7\n\t"
  20291. "adcs r5, r5, #0\n\t"
  20292. "adc r3, r3, #0\n\t"
  20293. "lsr r7, r9, #16\n\t"
  20294. "mul r6, r7, r6\n\t"
  20295. "lsr r7, r6, #16\n\t"
  20296. "lsl r6, r6, #16\n\t"
  20297. "adds r4, r4, r6\n\t"
  20298. "adcs r5, r5, r7\n\t"
  20299. "adc r3, r3, #0\n\t"
  20300. "lsr r6, r8, #16\n\t"
  20301. "lsr r7, r9, #16\n\t"
  20302. "mul r7, r6, r7\n\t"
  20303. "adds r5, r5, r7\n\t"
  20304. "adc r3, r3, #0\n\t"
  20305. "lsl r7, r9, #16\n\t"
  20306. "lsr r7, r7, #16\n\t"
  20307. "mul r6, r7, r6\n\t"
  20308. "lsr r7, r6, #16\n\t"
  20309. "lsl r6, r6, #16\n\t"
  20310. "adds r4, r4, r6\n\t"
  20311. "adcs r5, r5, r7\n\t"
  20312. "adc r3, r3, #0\n\t"
  20313. #else
  20314. "umull r6, r7, r8, r9\n\t"
  20315. "adds r4, r4, r6\n\t"
  20316. "adcs r5, r5, r7\n\t"
  20317. "adc r3, r3, #0\n\t"
  20318. #endif
  20319. /* A[6] * B[4] */
  20320. "ldr r8, [%[a], #24]\n\t"
  20321. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  20322. "lsl r6, r8, #16\n\t"
  20323. "lsl r7, r12, #16\n\t"
  20324. "lsr r6, r6, #16\n\t"
  20325. "lsr r7, r7, #16\n\t"
  20326. "mul r7, r6, r7\n\t"
  20327. "adds r4, r4, r7\n\t"
  20328. "adcs r5, r5, #0\n\t"
  20329. "adc r3, r3, #0\n\t"
  20330. "lsr r7, r12, #16\n\t"
  20331. "mul r6, r7, r6\n\t"
  20332. "lsr r7, r6, #16\n\t"
  20333. "lsl r6, r6, #16\n\t"
  20334. "adds r4, r4, r6\n\t"
  20335. "adcs r5, r5, r7\n\t"
  20336. "adc r3, r3, #0\n\t"
  20337. "lsr r6, r8, #16\n\t"
  20338. "lsr r7, r12, #16\n\t"
  20339. "mul r7, r6, r7\n\t"
  20340. "adds r5, r5, r7\n\t"
  20341. "adc r3, r3, #0\n\t"
  20342. "lsl r7, r12, #16\n\t"
  20343. "lsr r7, r7, #16\n\t"
  20344. "mul r6, r7, r6\n\t"
  20345. "lsr r7, r6, #16\n\t"
  20346. "lsl r6, r6, #16\n\t"
  20347. "adds r4, r4, r6\n\t"
  20348. "adcs r5, r5, r7\n\t"
  20349. "adc r3, r3, #0\n\t"
  20350. #else
  20351. "umull r6, r7, r8, r12\n\t"
  20352. "adds r4, r4, r6\n\t"
  20353. "adcs r5, r5, r7\n\t"
  20354. "adc r3, r3, #0\n\t"
  20355. #endif
  20356. /* A[5] * B[5] */
  20357. "ldr r11, [%[a], #20]\n\t"
  20358. "ldr r12, [%[b], #20]\n\t"
  20359. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  20360. "lsl r6, r11, #16\n\t"
  20361. "lsl r7, r12, #16\n\t"
  20362. "lsr r6, r6, #16\n\t"
  20363. "lsr r7, r7, #16\n\t"
  20364. "mul r7, r6, r7\n\t"
  20365. "adds r4, r4, r7\n\t"
  20366. "adcs r5, r5, #0\n\t"
  20367. "adc r3, r3, #0\n\t"
  20368. "lsr r7, r12, #16\n\t"
  20369. "mul r6, r7, r6\n\t"
  20370. "lsr r7, r6, #16\n\t"
  20371. "lsl r6, r6, #16\n\t"
  20372. "adds r4, r4, r6\n\t"
  20373. "adcs r5, r5, r7\n\t"
  20374. "adc r3, r3, #0\n\t"
  20375. "lsr r6, r11, #16\n\t"
  20376. "lsr r7, r12, #16\n\t"
  20377. "mul r7, r6, r7\n\t"
  20378. "adds r5, r5, r7\n\t"
  20379. "adc r3, r3, #0\n\t"
  20380. "lsl r7, r12, #16\n\t"
  20381. "lsr r7, r7, #16\n\t"
  20382. "mul r6, r7, r6\n\t"
  20383. "lsr r7, r6, #16\n\t"
  20384. "lsl r6, r6, #16\n\t"
  20385. "adds r4, r4, r6\n\t"
  20386. "adcs r5, r5, r7\n\t"
  20387. "adc r3, r3, #0\n\t"
  20388. #else
  20389. "umull r6, r7, r11, r12\n\t"
  20390. "adds r4, r4, r6\n\t"
  20391. "adcs r5, r5, r7\n\t"
  20392. "adc r3, r3, #0\n\t"
  20393. #endif
  20394. /* A[4] * B[6] */
  20395. "ldr r8, [%[a], #16]\n\t"
  20396. "ldr r9, [%[b], #24]\n\t"
  20397. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  20398. "lsl r6, r8, #16\n\t"
  20399. "lsl r7, r9, #16\n\t"
  20400. "lsr r6, r6, #16\n\t"
  20401. "lsr r7, r7, #16\n\t"
  20402. "mul r7, r6, r7\n\t"
  20403. "adds r4, r4, r7\n\t"
  20404. "adcs r5, r5, #0\n\t"
  20405. "adc r3, r3, #0\n\t"
  20406. "lsr r7, r9, #16\n\t"
  20407. "mul r6, r7, r6\n\t"
  20408. "lsr r7, r6, #16\n\t"
  20409. "lsl r6, r6, #16\n\t"
  20410. "adds r4, r4, r6\n\t"
  20411. "adcs r5, r5, r7\n\t"
  20412. "adc r3, r3, #0\n\t"
  20413. "lsr r6, r8, #16\n\t"
  20414. "lsr r7, r9, #16\n\t"
  20415. "mul r7, r6, r7\n\t"
  20416. "adds r5, r5, r7\n\t"
  20417. "adc r3, r3, #0\n\t"
  20418. "lsl r7, r9, #16\n\t"
  20419. "lsr r7, r7, #16\n\t"
  20420. "mul r6, r7, r6\n\t"
  20421. "lsr r7, r6, #16\n\t"
  20422. "lsl r6, r6, #16\n\t"
  20423. "adds r4, r4, r6\n\t"
  20424. "adcs r5, r5, r7\n\t"
  20425. "adc r3, r3, #0\n\t"
  20426. #else
  20427. "umull r6, r7, r8, r9\n\t"
  20428. "adds r4, r4, r6\n\t"
  20429. "adcs r5, r5, r7\n\t"
  20430. "adc r3, r3, #0\n\t"
  20431. #endif
  20432. /* A[3] * B[7] */
  20433. "ldr r8, [%[a], #12]\n\t"
  20434. "ldr r9, [%[b], #28]\n\t"
  20435. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  20436. "lsl r6, r8, #16\n\t"
  20437. "lsl r7, r9, #16\n\t"
  20438. "lsr r6, r6, #16\n\t"
  20439. "lsr r7, r7, #16\n\t"
  20440. "mul r7, r6, r7\n\t"
  20441. "adds r4, r4, r7\n\t"
  20442. "adcs r5, r5, #0\n\t"
  20443. "adc r3, r3, #0\n\t"
  20444. "lsr r7, r9, #16\n\t"
  20445. "mul r6, r7, r6\n\t"
  20446. "lsr r7, r6, #16\n\t"
  20447. "lsl r6, r6, #16\n\t"
  20448. "adds r4, r4, r6\n\t"
  20449. "adcs r5, r5, r7\n\t"
  20450. "adc r3, r3, #0\n\t"
  20451. "lsr r6, r8, #16\n\t"
  20452. "lsr r7, r9, #16\n\t"
  20453. "mul r7, r6, r7\n\t"
  20454. "adds r5, r5, r7\n\t"
  20455. "adc r3, r3, #0\n\t"
  20456. "lsl r7, r9, #16\n\t"
  20457. "lsr r7, r7, #16\n\t"
  20458. "mul r6, r7, r6\n\t"
  20459. "lsr r7, r6, #16\n\t"
  20460. "lsl r6, r6, #16\n\t"
  20461. "adds r4, r4, r6\n\t"
  20462. "adcs r5, r5, r7\n\t"
  20463. "adc r3, r3, #0\n\t"
  20464. #else
  20465. "umull r6, r7, r8, r9\n\t"
  20466. "adds r4, r4, r6\n\t"
  20467. "adcs r5, r5, r7\n\t"
  20468. "adc r3, r3, #0\n\t"
  20469. #endif
  20470. /* A[2] * B[8] */
  20471. "ldr r8, [%[a], #8]\n\t"
  20472. "ldr r9, [%[b], #32]\n\t"
  20473. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  20474. "lsl r6, r8, #16\n\t"
  20475. "lsl r7, r9, #16\n\t"
  20476. "lsr r6, r6, #16\n\t"
  20477. "lsr r7, r7, #16\n\t"
  20478. "mul r7, r6, r7\n\t"
  20479. "adds r4, r4, r7\n\t"
  20480. "adcs r5, r5, #0\n\t"
  20481. "adc r3, r3, #0\n\t"
  20482. "lsr r7, r9, #16\n\t"
  20483. "mul r6, r7, r6\n\t"
  20484. "lsr r7, r6, #16\n\t"
  20485. "lsl r6, r6, #16\n\t"
  20486. "adds r4, r4, r6\n\t"
  20487. "adcs r5, r5, r7\n\t"
  20488. "adc r3, r3, #0\n\t"
  20489. "lsr r6, r8, #16\n\t"
  20490. "lsr r7, r9, #16\n\t"
  20491. "mul r7, r6, r7\n\t"
  20492. "adds r5, r5, r7\n\t"
  20493. "adc r3, r3, #0\n\t"
  20494. "lsl r7, r9, #16\n\t"
  20495. "lsr r7, r7, #16\n\t"
  20496. "mul r6, r7, r6\n\t"
  20497. "lsr r7, r6, #16\n\t"
  20498. "lsl r6, r6, #16\n\t"
  20499. "adds r4, r4, r6\n\t"
  20500. "adcs r5, r5, r7\n\t"
  20501. "adc r3, r3, #0\n\t"
  20502. #else
  20503. "umull r6, r7, r8, r9\n\t"
  20504. "adds r4, r4, r6\n\t"
  20505. "adcs r5, r5, r7\n\t"
  20506. "adc r3, r3, #0\n\t"
  20507. #endif
  20508. /* A[1] * B[9] */
  20509. "ldr r8, [%[a], #4]\n\t"
  20510. "ldr r9, [%[b], #36]\n\t"
  20511. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  20512. "lsl r6, r8, #16\n\t"
  20513. "lsl r7, r9, #16\n\t"
  20514. "lsr r6, r6, #16\n\t"
  20515. "lsr r7, r7, #16\n\t"
  20516. "mul r7, r6, r7\n\t"
  20517. "adds r4, r4, r7\n\t"
  20518. "adcs r5, r5, #0\n\t"
  20519. "adc r3, r3, #0\n\t"
  20520. "lsr r7, r9, #16\n\t"
  20521. "mul r6, r7, r6\n\t"
  20522. "lsr r7, r6, #16\n\t"
  20523. "lsl r6, r6, #16\n\t"
  20524. "adds r4, r4, r6\n\t"
  20525. "adcs r5, r5, r7\n\t"
  20526. "adc r3, r3, #0\n\t"
  20527. "lsr r6, r8, #16\n\t"
  20528. "lsr r7, r9, #16\n\t"
  20529. "mul r7, r6, r7\n\t"
  20530. "adds r5, r5, r7\n\t"
  20531. "adc r3, r3, #0\n\t"
  20532. "lsl r7, r9, #16\n\t"
  20533. "lsr r7, r7, #16\n\t"
  20534. "mul r6, r7, r6\n\t"
  20535. "lsr r7, r6, #16\n\t"
  20536. "lsl r6, r6, #16\n\t"
  20537. "adds r4, r4, r6\n\t"
  20538. "adcs r5, r5, r7\n\t"
  20539. "adc r3, r3, #0\n\t"
  20540. #else
  20541. "umull r6, r7, r8, r9\n\t"
  20542. "adds r4, r4, r6\n\t"
  20543. "adcs r5, r5, r7\n\t"
  20544. "adc r3, r3, #0\n\t"
  20545. #endif
  20546. /* A[0] * B[10] */
  20547. "ldr r8, [%[a]]\n\t"
  20548. "ldr r9, [%[b], #40]\n\t"
  20549. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  20550. "lsl r6, r8, #16\n\t"
  20551. "lsl r7, r9, #16\n\t"
  20552. "lsr r6, r6, #16\n\t"
  20553. "lsr r7, r7, #16\n\t"
  20554. "mul r7, r6, r7\n\t"
  20555. "adds r4, r4, r7\n\t"
  20556. "adcs r5, r5, #0\n\t"
  20557. "adc r3, r3, #0\n\t"
  20558. "lsr r7, r9, #16\n\t"
  20559. "mul r6, r7, r6\n\t"
  20560. "lsr r7, r6, #16\n\t"
  20561. "lsl r6, r6, #16\n\t"
  20562. "adds r4, r4, r6\n\t"
  20563. "adcs r5, r5, r7\n\t"
  20564. "adc r3, r3, #0\n\t"
  20565. "lsr r6, r8, #16\n\t"
  20566. "lsr r7, r9, #16\n\t"
  20567. "mul r7, r6, r7\n\t"
  20568. "adds r5, r5, r7\n\t"
  20569. "adc r3, r3, #0\n\t"
  20570. "lsl r7, r9, #16\n\t"
  20571. "lsr r7, r7, #16\n\t"
  20572. "mul r6, r7, r6\n\t"
  20573. "lsr r7, r6, #16\n\t"
  20574. "lsl r6, r6, #16\n\t"
  20575. "adds r4, r4, r6\n\t"
  20576. "adcs r5, r5, r7\n\t"
  20577. "adc r3, r3, #0\n\t"
  20578. #else
  20579. "umull r6, r7, r8, r9\n\t"
  20580. "adds r4, r4, r6\n\t"
  20581. "adcs r5, r5, r7\n\t"
  20582. "adc r3, r3, #0\n\t"
  20583. #endif
  20584. "str r4, [sp, #40]\n\t"
  20585. /* A[0] * B[11] */
  20586. "ldr r9, [%[b], #44]\n\t"
  20587. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  20588. "lsl r6, r8, #16\n\t"
  20589. "lsl r7, r9, #16\n\t"
  20590. "lsr r6, r6, #16\n\t"
  20591. "lsr r7, r7, #16\n\t"
  20592. "mul r7, r6, r7\n\t"
  20593. "adds r5, r5, r7\n\t"
  20594. "adcs r3, r3, #0\n\t"
  20595. "mov r4, #0\n\t"
  20596. "adc r4, r4, #0\n\t"
  20597. "lsr r7, r9, #16\n\t"
  20598. "mul r6, r7, r6\n\t"
  20599. "lsr r7, r6, #16\n\t"
  20600. "lsl r6, r6, #16\n\t"
  20601. "adds r5, r5, r6\n\t"
  20602. "adcs r3, r3, r7\n\t"
  20603. "adc r4, r4, #0\n\t"
  20604. "lsr r6, r8, #16\n\t"
  20605. "lsr r7, r9, #16\n\t"
  20606. "mul r7, r6, r7\n\t"
  20607. "adds r3, r3, r7\n\t"
  20608. "adc r4, r4, #0\n\t"
  20609. "lsl r7, r9, #16\n\t"
  20610. "lsr r7, r7, #16\n\t"
  20611. "mul r6, r7, r6\n\t"
  20612. "lsr r7, r6, #16\n\t"
  20613. "lsl r6, r6, #16\n\t"
  20614. "adds r5, r5, r6\n\t"
  20615. "adcs r3, r3, r7\n\t"
  20616. "adc r4, r4, #0\n\t"
  20617. #else
  20618. "umull r6, r7, r8, r9\n\t"
  20619. "adds r5, r5, r6\n\t"
  20620. "adcs r3, r3, r7\n\t"
  20621. "mov r4, #0\n\t"
  20622. "adc r4, r4, #0\n\t"
  20623. #endif
  20624. /* A[1] * B[10] */
  20625. "ldr r8, [%[a], #4]\n\t"
  20626. "ldr r9, [%[b], #40]\n\t"
  20627. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  20628. "lsl r6, r8, #16\n\t"
  20629. "lsl r7, r9, #16\n\t"
  20630. "lsr r6, r6, #16\n\t"
  20631. "lsr r7, r7, #16\n\t"
  20632. "mul r7, r6, r7\n\t"
  20633. "adds r5, r5, r7\n\t"
  20634. "adcs r3, r3, #0\n\t"
  20635. "adc r4, r4, #0\n\t"
  20636. "lsr r7, r9, #16\n\t"
  20637. "mul r6, r7, r6\n\t"
  20638. "lsr r7, r6, #16\n\t"
  20639. "lsl r6, r6, #16\n\t"
  20640. "adds r5, r5, r6\n\t"
  20641. "adcs r3, r3, r7\n\t"
  20642. "adc r4, r4, #0\n\t"
  20643. "lsr r6, r8, #16\n\t"
  20644. "lsr r7, r9, #16\n\t"
  20645. "mul r7, r6, r7\n\t"
  20646. "adds r3, r3, r7\n\t"
  20647. "adc r4, r4, #0\n\t"
  20648. "lsl r7, r9, #16\n\t"
  20649. "lsr r7, r7, #16\n\t"
  20650. "mul r6, r7, r6\n\t"
  20651. "lsr r7, r6, #16\n\t"
  20652. "lsl r6, r6, #16\n\t"
  20653. "adds r5, r5, r6\n\t"
  20654. "adcs r3, r3, r7\n\t"
  20655. "adc r4, r4, #0\n\t"
  20656. #else
  20657. "umull r6, r7, r8, r9\n\t"
  20658. "adds r5, r5, r6\n\t"
  20659. "adcs r3, r3, r7\n\t"
  20660. "adc r4, r4, #0\n\t"
  20661. #endif
  20662. /* A[2] * B[9] */
  20663. "ldr r8, [%[a], #8]\n\t"
  20664. "ldr r9, [%[b], #36]\n\t"
  20665. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  20666. "lsl r6, r8, #16\n\t"
  20667. "lsl r7, r9, #16\n\t"
  20668. "lsr r6, r6, #16\n\t"
  20669. "lsr r7, r7, #16\n\t"
  20670. "mul r7, r6, r7\n\t"
  20671. "adds r5, r5, r7\n\t"
  20672. "adcs r3, r3, #0\n\t"
  20673. "adc r4, r4, #0\n\t"
  20674. "lsr r7, r9, #16\n\t"
  20675. "mul r6, r7, r6\n\t"
  20676. "lsr r7, r6, #16\n\t"
  20677. "lsl r6, r6, #16\n\t"
  20678. "adds r5, r5, r6\n\t"
  20679. "adcs r3, r3, r7\n\t"
  20680. "adc r4, r4, #0\n\t"
  20681. "lsr r6, r8, #16\n\t"
  20682. "lsr r7, r9, #16\n\t"
  20683. "mul r7, r6, r7\n\t"
  20684. "adds r3, r3, r7\n\t"
  20685. "adc r4, r4, #0\n\t"
  20686. "lsl r7, r9, #16\n\t"
  20687. "lsr r7, r7, #16\n\t"
  20688. "mul r6, r7, r6\n\t"
  20689. "lsr r7, r6, #16\n\t"
  20690. "lsl r6, r6, #16\n\t"
  20691. "adds r5, r5, r6\n\t"
  20692. "adcs r3, r3, r7\n\t"
  20693. "adc r4, r4, #0\n\t"
  20694. #else
  20695. "umull r6, r7, r8, r9\n\t"
  20696. "adds r5, r5, r6\n\t"
  20697. "adcs r3, r3, r7\n\t"
  20698. "adc r4, r4, #0\n\t"
  20699. #endif
  20700. /* A[3] * B[8] */
  20701. "ldr r8, [%[a], #12]\n\t"
  20702. "ldr r9, [%[b], #32]\n\t"
  20703. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  20704. "lsl r6, r8, #16\n\t"
  20705. "lsl r7, r9, #16\n\t"
  20706. "lsr r6, r6, #16\n\t"
  20707. "lsr r7, r7, #16\n\t"
  20708. "mul r7, r6, r7\n\t"
  20709. "adds r5, r5, r7\n\t"
  20710. "adcs r3, r3, #0\n\t"
  20711. "adc r4, r4, #0\n\t"
  20712. "lsr r7, r9, #16\n\t"
  20713. "mul r6, r7, r6\n\t"
  20714. "lsr r7, r6, #16\n\t"
  20715. "lsl r6, r6, #16\n\t"
  20716. "adds r5, r5, r6\n\t"
  20717. "adcs r3, r3, r7\n\t"
  20718. "adc r4, r4, #0\n\t"
  20719. "lsr r6, r8, #16\n\t"
  20720. "lsr r7, r9, #16\n\t"
  20721. "mul r7, r6, r7\n\t"
  20722. "adds r3, r3, r7\n\t"
  20723. "adc r4, r4, #0\n\t"
  20724. "lsl r7, r9, #16\n\t"
  20725. "lsr r7, r7, #16\n\t"
  20726. "mul r6, r7, r6\n\t"
  20727. "lsr r7, r6, #16\n\t"
  20728. "lsl r6, r6, #16\n\t"
  20729. "adds r5, r5, r6\n\t"
  20730. "adcs r3, r3, r7\n\t"
  20731. "adc r4, r4, #0\n\t"
  20732. #else
  20733. "umull r6, r7, r8, r9\n\t"
  20734. "adds r5, r5, r6\n\t"
  20735. "adcs r3, r3, r7\n\t"
  20736. "adc r4, r4, #0\n\t"
  20737. #endif
  20738. /* A[4] * B[7] */
  20739. "ldr r8, [%[a], #16]\n\t"
  20740. "ldr r9, [%[b], #28]\n\t"
  20741. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  20742. "lsl r6, r8, #16\n\t"
  20743. "lsl r7, r9, #16\n\t"
  20744. "lsr r6, r6, #16\n\t"
  20745. "lsr r7, r7, #16\n\t"
  20746. "mul r7, r6, r7\n\t"
  20747. "adds r5, r5, r7\n\t"
  20748. "adcs r3, r3, #0\n\t"
  20749. "adc r4, r4, #0\n\t"
  20750. "lsr r7, r9, #16\n\t"
  20751. "mul r6, r7, r6\n\t"
  20752. "lsr r7, r6, #16\n\t"
  20753. "lsl r6, r6, #16\n\t"
  20754. "adds r5, r5, r6\n\t"
  20755. "adcs r3, r3, r7\n\t"
  20756. "adc r4, r4, #0\n\t"
  20757. "lsr r6, r8, #16\n\t"
  20758. "lsr r7, r9, #16\n\t"
  20759. "mul r7, r6, r7\n\t"
  20760. "adds r3, r3, r7\n\t"
  20761. "adc r4, r4, #0\n\t"
  20762. "lsl r7, r9, #16\n\t"
  20763. "lsr r7, r7, #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 r5, r5, r6\n\t"
  20768. "adcs r3, r3, r7\n\t"
  20769. "adc r4, r4, #0\n\t"
  20770. #else
  20771. "umull r6, r7, r8, r9\n\t"
  20772. "adds r5, r5, r6\n\t"
  20773. "adcs r3, r3, r7\n\t"
  20774. "adc r4, r4, #0\n\t"
  20775. #endif
  20776. /* A[5] * B[6] */
  20777. "ldr r9, [%[b], #24]\n\t"
  20778. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  20779. "lsl r6, r11, #16\n\t"
  20780. "lsl r7, r9, #16\n\t"
  20781. "lsr r6, r6, #16\n\t"
  20782. "lsr r7, r7, #16\n\t"
  20783. "mul r7, r6, r7\n\t"
  20784. "adds r5, r5, r7\n\t"
  20785. "adcs r3, r3, #0\n\t"
  20786. "adc r4, r4, #0\n\t"
  20787. "lsr r7, r9, #16\n\t"
  20788. "mul r6, r7, r6\n\t"
  20789. "lsr r7, r6, #16\n\t"
  20790. "lsl r6, r6, #16\n\t"
  20791. "adds r5, r5, r6\n\t"
  20792. "adcs r3, r3, r7\n\t"
  20793. "adc r4, r4, #0\n\t"
  20794. "lsr r6, r11, #16\n\t"
  20795. "lsr r7, r9, #16\n\t"
  20796. "mul r7, r6, r7\n\t"
  20797. "adds r3, r3, r7\n\t"
  20798. "adc r4, r4, #0\n\t"
  20799. "lsl r7, r9, #16\n\t"
  20800. "lsr r7, r7, #16\n\t"
  20801. "mul r6, r7, r6\n\t"
  20802. "lsr r7, r6, #16\n\t"
  20803. "lsl r6, r6, #16\n\t"
  20804. "adds r5, r5, r6\n\t"
  20805. "adcs r3, r3, r7\n\t"
  20806. "adc r4, r4, #0\n\t"
  20807. #else
  20808. "umull r6, r7, r11, r9\n\t"
  20809. "adds r5, r5, r6\n\t"
  20810. "adcs r3, r3, r7\n\t"
  20811. "adc r4, r4, #0\n\t"
  20812. #endif
  20813. /* A[6] * B[5] */
  20814. "ldr r8, [%[a], #24]\n\t"
  20815. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  20816. "lsl r6, r8, #16\n\t"
  20817. "lsl r7, r12, #16\n\t"
  20818. "lsr r6, r6, #16\n\t"
  20819. "lsr r7, r7, #16\n\t"
  20820. "mul r7, r6, r7\n\t"
  20821. "adds r5, r5, r7\n\t"
  20822. "adcs r3, r3, #0\n\t"
  20823. "adc r4, r4, #0\n\t"
  20824. "lsr r7, r12, #16\n\t"
  20825. "mul r6, r7, r6\n\t"
  20826. "lsr r7, r6, #16\n\t"
  20827. "lsl r6, r6, #16\n\t"
  20828. "adds r5, r5, r6\n\t"
  20829. "adcs r3, r3, r7\n\t"
  20830. "adc r4, r4, #0\n\t"
  20831. "lsr r6, r8, #16\n\t"
  20832. "lsr r7, r12, #16\n\t"
  20833. "mul r7, r6, r7\n\t"
  20834. "adds r3, r3, r7\n\t"
  20835. "adc r4, r4, #0\n\t"
  20836. "lsl r7, r12, #16\n\t"
  20837. "lsr r7, r7, #16\n\t"
  20838. "mul r6, r7, r6\n\t"
  20839. "lsr r7, r6, #16\n\t"
  20840. "lsl r6, r6, #16\n\t"
  20841. "adds r5, r5, r6\n\t"
  20842. "adcs r3, r3, r7\n\t"
  20843. "adc r4, r4, #0\n\t"
  20844. #else
  20845. "umull r6, r7, r8, r12\n\t"
  20846. "adds r5, r5, r6\n\t"
  20847. "adcs r3, r3, r7\n\t"
  20848. "adc r4, r4, #0\n\t"
  20849. #endif
  20850. /* A[7] * B[4] */
  20851. "ldr r8, [%[a], #28]\n\t"
  20852. "ldr r9, [%[b], #16]\n\t"
  20853. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  20854. "lsl r6, r8, #16\n\t"
  20855. "lsl r7, r9, #16\n\t"
  20856. "lsr r6, r6, #16\n\t"
  20857. "lsr r7, r7, #16\n\t"
  20858. "mul r7, r6, r7\n\t"
  20859. "adds r5, r5, r7\n\t"
  20860. "adcs r3, r3, #0\n\t"
  20861. "adc r4, r4, #0\n\t"
  20862. "lsr r7, r9, #16\n\t"
  20863. "mul r6, r7, r6\n\t"
  20864. "lsr r7, r6, #16\n\t"
  20865. "lsl r6, r6, #16\n\t"
  20866. "adds r5, r5, r6\n\t"
  20867. "adcs r3, r3, r7\n\t"
  20868. "adc r4, r4, #0\n\t"
  20869. "lsr r6, r8, #16\n\t"
  20870. "lsr r7, r9, #16\n\t"
  20871. "mul r7, r6, r7\n\t"
  20872. "adds r3, r3, r7\n\t"
  20873. "adc r4, r4, #0\n\t"
  20874. "lsl r7, r9, #16\n\t"
  20875. "lsr r7, r7, #16\n\t"
  20876. "mul r6, r7, r6\n\t"
  20877. "lsr r7, r6, #16\n\t"
  20878. "lsl r6, r6, #16\n\t"
  20879. "adds r5, r5, r6\n\t"
  20880. "adcs r3, r3, r7\n\t"
  20881. "adc r4, r4, #0\n\t"
  20882. #else
  20883. "umull r6, r7, r8, r9\n\t"
  20884. "adds r5, r5, r6\n\t"
  20885. "adcs r3, r3, r7\n\t"
  20886. "adc r4, r4, #0\n\t"
  20887. #endif
  20888. /* A[8] * B[3] */
  20889. "ldr r8, [%[a], #32]\n\t"
  20890. "ldr r9, [%[b], #12]\n\t"
  20891. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  20892. "lsl r6, r8, #16\n\t"
  20893. "lsl r7, r9, #16\n\t"
  20894. "lsr r6, r6, #16\n\t"
  20895. "lsr r7, r7, #16\n\t"
  20896. "mul r7, r6, r7\n\t"
  20897. "adds r5, r5, r7\n\t"
  20898. "adcs r3, r3, #0\n\t"
  20899. "adc r4, r4, #0\n\t"
  20900. "lsr r7, r9, #16\n\t"
  20901. "mul r6, r7, r6\n\t"
  20902. "lsr r7, r6, #16\n\t"
  20903. "lsl r6, r6, #16\n\t"
  20904. "adds r5, r5, r6\n\t"
  20905. "adcs r3, r3, r7\n\t"
  20906. "adc r4, r4, #0\n\t"
  20907. "lsr r6, r8, #16\n\t"
  20908. "lsr r7, r9, #16\n\t"
  20909. "mul r7, r6, r7\n\t"
  20910. "adds r3, r3, r7\n\t"
  20911. "adc r4, r4, #0\n\t"
  20912. "lsl r7, r9, #16\n\t"
  20913. "lsr r7, r7, #16\n\t"
  20914. "mul r6, r7, r6\n\t"
  20915. "lsr r7, r6, #16\n\t"
  20916. "lsl r6, r6, #16\n\t"
  20917. "adds r5, r5, r6\n\t"
  20918. "adcs r3, r3, r7\n\t"
  20919. "adc r4, r4, #0\n\t"
  20920. #else
  20921. "umull r6, r7, r8, r9\n\t"
  20922. "adds r5, r5, r6\n\t"
  20923. "adcs r3, r3, r7\n\t"
  20924. "adc r4, r4, #0\n\t"
  20925. #endif
  20926. /* A[9] * B[2] */
  20927. "ldr r8, [%[a], #36]\n\t"
  20928. "ldr r9, [%[b], #8]\n\t"
  20929. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  20930. "lsl r6, r8, #16\n\t"
  20931. "lsl r7, r9, #16\n\t"
  20932. "lsr r6, r6, #16\n\t"
  20933. "lsr r7, r7, #16\n\t"
  20934. "mul r7, r6, r7\n\t"
  20935. "adds r5, r5, r7\n\t"
  20936. "adcs r3, r3, #0\n\t"
  20937. "adc r4, r4, #0\n\t"
  20938. "lsr r7, r9, #16\n\t"
  20939. "mul r6, r7, r6\n\t"
  20940. "lsr r7, r6, #16\n\t"
  20941. "lsl r6, r6, #16\n\t"
  20942. "adds r5, r5, r6\n\t"
  20943. "adcs r3, r3, r7\n\t"
  20944. "adc r4, r4, #0\n\t"
  20945. "lsr r6, r8, #16\n\t"
  20946. "lsr r7, r9, #16\n\t"
  20947. "mul r7, r6, r7\n\t"
  20948. "adds r3, r3, r7\n\t"
  20949. "adc r4, r4, #0\n\t"
  20950. "lsl r7, r9, #16\n\t"
  20951. "lsr r7, r7, #16\n\t"
  20952. "mul r6, r7, r6\n\t"
  20953. "lsr r7, r6, #16\n\t"
  20954. "lsl r6, r6, #16\n\t"
  20955. "adds r5, r5, r6\n\t"
  20956. "adcs r3, r3, r7\n\t"
  20957. "adc r4, r4, #0\n\t"
  20958. #else
  20959. "umull r6, r7, r8, r9\n\t"
  20960. "adds r5, r5, r6\n\t"
  20961. "adcs r3, r3, r7\n\t"
  20962. "adc r4, r4, #0\n\t"
  20963. #endif
  20964. /* A[10] * B[1] */
  20965. "ldr r8, [%[a], #40]\n\t"
  20966. "ldr r9, [%[b], #4]\n\t"
  20967. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  20968. "lsl r6, r8, #16\n\t"
  20969. "lsl r7, r9, #16\n\t"
  20970. "lsr r6, r6, #16\n\t"
  20971. "lsr r7, r7, #16\n\t"
  20972. "mul r7, r6, r7\n\t"
  20973. "adds r5, r5, r7\n\t"
  20974. "adcs r3, r3, #0\n\t"
  20975. "adc r4, r4, #0\n\t"
  20976. "lsr r7, r9, #16\n\t"
  20977. "mul r6, r7, r6\n\t"
  20978. "lsr r7, r6, #16\n\t"
  20979. "lsl r6, r6, #16\n\t"
  20980. "adds r5, r5, r6\n\t"
  20981. "adcs r3, r3, r7\n\t"
  20982. "adc r4, r4, #0\n\t"
  20983. "lsr r6, r8, #16\n\t"
  20984. "lsr r7, r9, #16\n\t"
  20985. "mul r7, r6, r7\n\t"
  20986. "adds r3, r3, r7\n\t"
  20987. "adc r4, r4, #0\n\t"
  20988. "lsl r7, r9, #16\n\t"
  20989. "lsr r7, r7, #16\n\t"
  20990. "mul r6, r7, r6\n\t"
  20991. "lsr r7, r6, #16\n\t"
  20992. "lsl r6, r6, #16\n\t"
  20993. "adds r5, r5, r6\n\t"
  20994. "adcs r3, r3, r7\n\t"
  20995. "adc r4, r4, #0\n\t"
  20996. #else
  20997. "umull r6, r7, r8, r9\n\t"
  20998. "adds r5, r5, r6\n\t"
  20999. "adcs r3, r3, r7\n\t"
  21000. "adc r4, r4, #0\n\t"
  21001. #endif
  21002. /* A[11] * B[0] */
  21003. "ldr r8, [%[a], #44]\n\t"
  21004. "ldr r9, [%[b]]\n\t"
  21005. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  21006. "lsl r6, r8, #16\n\t"
  21007. "lsl r7, r9, #16\n\t"
  21008. "lsr r6, r6, #16\n\t"
  21009. "lsr r7, r7, #16\n\t"
  21010. "mul r7, r6, r7\n\t"
  21011. "adds r5, r5, r7\n\t"
  21012. "adcs r3, r3, #0\n\t"
  21013. "adc r4, r4, #0\n\t"
  21014. "lsr r7, r9, #16\n\t"
  21015. "mul r6, r7, r6\n\t"
  21016. "lsr r7, r6, #16\n\t"
  21017. "lsl r6, r6, #16\n\t"
  21018. "adds r5, r5, r6\n\t"
  21019. "adcs r3, r3, r7\n\t"
  21020. "adc r4, r4, #0\n\t"
  21021. "lsr r6, r8, #16\n\t"
  21022. "lsr r7, r9, #16\n\t"
  21023. "mul r7, r6, r7\n\t"
  21024. "adds r3, r3, r7\n\t"
  21025. "adc r4, r4, #0\n\t"
  21026. "lsl r7, r9, #16\n\t"
  21027. "lsr r7, r7, #16\n\t"
  21028. "mul r6, r7, r6\n\t"
  21029. "lsr r7, r6, #16\n\t"
  21030. "lsl r6, r6, #16\n\t"
  21031. "adds r5, r5, r6\n\t"
  21032. "adcs r3, r3, r7\n\t"
  21033. "adc r4, r4, #0\n\t"
  21034. #else
  21035. "umull r6, r7, r8, r9\n\t"
  21036. "adds r5, r5, r6\n\t"
  21037. "adcs r3, r3, r7\n\t"
  21038. "adc r4, r4, #0\n\t"
  21039. #endif
  21040. "str r5, [sp, #44]\n\t"
  21041. /* A[11] * B[1] */
  21042. "ldr r9, [%[b], #4]\n\t"
  21043. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  21044. "lsl r6, r8, #16\n\t"
  21045. "lsl r7, r9, #16\n\t"
  21046. "lsr r6, r6, #16\n\t"
  21047. "lsr r7, r7, #16\n\t"
  21048. "mul r7, r6, r7\n\t"
  21049. "adds r3, r3, r7\n\t"
  21050. "adcs r4, r4, #0\n\t"
  21051. "mov r5, #0\n\t"
  21052. "adc r5, r5, #0\n\t"
  21053. "lsr r7, r9, #16\n\t"
  21054. "mul r6, r7, r6\n\t"
  21055. "lsr r7, r6, #16\n\t"
  21056. "lsl r6, r6, #16\n\t"
  21057. "adds r3, r3, r6\n\t"
  21058. "adcs r4, r4, r7\n\t"
  21059. "adc r5, r5, #0\n\t"
  21060. "lsr r6, r8, #16\n\t"
  21061. "lsr r7, r9, #16\n\t"
  21062. "mul r7, r6, r7\n\t"
  21063. "adds r4, r4, r7\n\t"
  21064. "adc r5, r5, #0\n\t"
  21065. "lsl r7, r9, #16\n\t"
  21066. "lsr r7, r7, #16\n\t"
  21067. "mul r6, r7, r6\n\t"
  21068. "lsr r7, r6, #16\n\t"
  21069. "lsl r6, r6, #16\n\t"
  21070. "adds r3, r3, r6\n\t"
  21071. "adcs r4, r4, r7\n\t"
  21072. "adc r5, r5, #0\n\t"
  21073. #else
  21074. "umull r6, r7, r8, r9\n\t"
  21075. "adds r3, r3, r6\n\t"
  21076. "adcs r4, r4, r7\n\t"
  21077. "mov r5, #0\n\t"
  21078. "adc r5, r5, #0\n\t"
  21079. #endif
  21080. /* A[10] * B[2] */
  21081. "ldr r8, [%[a], #40]\n\t"
  21082. "ldr r9, [%[b], #8]\n\t"
  21083. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  21084. "lsl r6, r8, #16\n\t"
  21085. "lsl r7, r9, #16\n\t"
  21086. "lsr r6, r6, #16\n\t"
  21087. "lsr r7, r7, #16\n\t"
  21088. "mul r7, r6, r7\n\t"
  21089. "adds r3, r3, r7\n\t"
  21090. "adcs r4, r4, #0\n\t"
  21091. "adc r5, r5, #0\n\t"
  21092. "lsr r7, r9, #16\n\t"
  21093. "mul r6, r7, r6\n\t"
  21094. "lsr r7, r6, #16\n\t"
  21095. "lsl r6, r6, #16\n\t"
  21096. "adds r3, r3, r6\n\t"
  21097. "adcs r4, r4, r7\n\t"
  21098. "adc r5, r5, #0\n\t"
  21099. "lsr r6, r8, #16\n\t"
  21100. "lsr r7, r9, #16\n\t"
  21101. "mul r7, r6, r7\n\t"
  21102. "adds r4, r4, r7\n\t"
  21103. "adc r5, r5, #0\n\t"
  21104. "lsl r7, r9, #16\n\t"
  21105. "lsr r7, r7, #16\n\t"
  21106. "mul r6, r7, r6\n\t"
  21107. "lsr r7, r6, #16\n\t"
  21108. "lsl r6, r6, #16\n\t"
  21109. "adds r3, r3, r6\n\t"
  21110. "adcs r4, r4, r7\n\t"
  21111. "adc r5, r5, #0\n\t"
  21112. #else
  21113. "umull r6, r7, r8, r9\n\t"
  21114. "adds r3, r3, r6\n\t"
  21115. "adcs r4, r4, r7\n\t"
  21116. "adc r5, r5, #0\n\t"
  21117. #endif
  21118. /* A[9] * B[3] */
  21119. "ldr r8, [%[a], #36]\n\t"
  21120. "ldr r9, [%[b], #12]\n\t"
  21121. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  21122. "lsl r6, r8, #16\n\t"
  21123. "lsl r7, r9, #16\n\t"
  21124. "lsr r6, r6, #16\n\t"
  21125. "lsr r7, r7, #16\n\t"
  21126. "mul r7, r6, r7\n\t"
  21127. "adds r3, r3, r7\n\t"
  21128. "adcs r4, r4, #0\n\t"
  21129. "adc r5, r5, #0\n\t"
  21130. "lsr r7, r9, #16\n\t"
  21131. "mul r6, r7, r6\n\t"
  21132. "lsr r7, r6, #16\n\t"
  21133. "lsl r6, r6, #16\n\t"
  21134. "adds r3, r3, r6\n\t"
  21135. "adcs r4, r4, r7\n\t"
  21136. "adc r5, r5, #0\n\t"
  21137. "lsr r6, r8, #16\n\t"
  21138. "lsr r7, r9, #16\n\t"
  21139. "mul r7, r6, r7\n\t"
  21140. "adds r4, r4, r7\n\t"
  21141. "adc r5, r5, #0\n\t"
  21142. "lsl r7, r9, #16\n\t"
  21143. "lsr r7, r7, #16\n\t"
  21144. "mul r6, r7, r6\n\t"
  21145. "lsr r7, r6, #16\n\t"
  21146. "lsl r6, r6, #16\n\t"
  21147. "adds r3, r3, r6\n\t"
  21148. "adcs r4, r4, r7\n\t"
  21149. "adc r5, r5, #0\n\t"
  21150. #else
  21151. "umull r6, r7, r8, r9\n\t"
  21152. "adds r3, r3, r6\n\t"
  21153. "adcs r4, r4, r7\n\t"
  21154. "adc r5, r5, #0\n\t"
  21155. #endif
  21156. /* A[8] * B[4] */
  21157. "ldr r8, [%[a], #32]\n\t"
  21158. "ldr r9, [%[b], #16]\n\t"
  21159. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  21160. "lsl r6, r8, #16\n\t"
  21161. "lsl r7, r9, #16\n\t"
  21162. "lsr r6, r6, #16\n\t"
  21163. "lsr r7, r7, #16\n\t"
  21164. "mul r7, r6, r7\n\t"
  21165. "adds r3, r3, r7\n\t"
  21166. "adcs r4, r4, #0\n\t"
  21167. "adc r5, r5, #0\n\t"
  21168. "lsr r7, r9, #16\n\t"
  21169. "mul r6, r7, r6\n\t"
  21170. "lsr r7, r6, #16\n\t"
  21171. "lsl r6, r6, #16\n\t"
  21172. "adds r3, r3, r6\n\t"
  21173. "adcs r4, r4, r7\n\t"
  21174. "adc r5, r5, #0\n\t"
  21175. "lsr r6, r8, #16\n\t"
  21176. "lsr r7, r9, #16\n\t"
  21177. "mul r7, r6, r7\n\t"
  21178. "adds r4, r4, r7\n\t"
  21179. "adc r5, r5, #0\n\t"
  21180. "lsl r7, r9, #16\n\t"
  21181. "lsr r7, r7, #16\n\t"
  21182. "mul r6, r7, r6\n\t"
  21183. "lsr r7, r6, #16\n\t"
  21184. "lsl r6, r6, #16\n\t"
  21185. "adds r3, r3, r6\n\t"
  21186. "adcs r4, r4, r7\n\t"
  21187. "adc r5, r5, #0\n\t"
  21188. #else
  21189. "umull r6, r7, r8, r9\n\t"
  21190. "adds r3, r3, r6\n\t"
  21191. "adcs r4, r4, r7\n\t"
  21192. "adc r5, r5, #0\n\t"
  21193. #endif
  21194. /* A[7] * B[5] */
  21195. "ldr r8, [%[a], #28]\n\t"
  21196. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  21197. "lsl r6, r8, #16\n\t"
  21198. "lsl r7, r12, #16\n\t"
  21199. "lsr r6, r6, #16\n\t"
  21200. "lsr r7, r7, #16\n\t"
  21201. "mul r7, r6, r7\n\t"
  21202. "adds r3, r3, r7\n\t"
  21203. "adcs r4, r4, #0\n\t"
  21204. "adc r5, r5, #0\n\t"
  21205. "lsr r7, r12, #16\n\t"
  21206. "mul r6, r7, r6\n\t"
  21207. "lsr r7, r6, #16\n\t"
  21208. "lsl r6, r6, #16\n\t"
  21209. "adds r3, r3, r6\n\t"
  21210. "adcs r4, r4, r7\n\t"
  21211. "adc r5, r5, #0\n\t"
  21212. "lsr r6, r8, #16\n\t"
  21213. "lsr r7, r12, #16\n\t"
  21214. "mul r7, r6, r7\n\t"
  21215. "adds r4, r4, r7\n\t"
  21216. "adc r5, r5, #0\n\t"
  21217. "lsl r7, r12, #16\n\t"
  21218. "lsr r7, r7, #16\n\t"
  21219. "mul r6, r7, r6\n\t"
  21220. "lsr r7, r6, #16\n\t"
  21221. "lsl r6, r6, #16\n\t"
  21222. "adds r3, r3, r6\n\t"
  21223. "adcs r4, r4, r7\n\t"
  21224. "adc r5, r5, #0\n\t"
  21225. #else
  21226. "umull r6, r7, r8, r12\n\t"
  21227. "adds r3, r3, r6\n\t"
  21228. "adcs r4, r4, r7\n\t"
  21229. "adc r5, r5, #0\n\t"
  21230. #endif
  21231. /* A[6] * B[6] */
  21232. "ldr r11, [%[a], #24]\n\t"
  21233. "ldr r12, [%[b], #24]\n\t"
  21234. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  21235. "lsl r6, r11, #16\n\t"
  21236. "lsl r7, r12, #16\n\t"
  21237. "lsr r6, r6, #16\n\t"
  21238. "lsr r7, r7, #16\n\t"
  21239. "mul r7, r6, r7\n\t"
  21240. "adds r3, r3, r7\n\t"
  21241. "adcs r4, r4, #0\n\t"
  21242. "adc r5, r5, #0\n\t"
  21243. "lsr r7, r12, #16\n\t"
  21244. "mul r6, r7, r6\n\t"
  21245. "lsr r7, r6, #16\n\t"
  21246. "lsl r6, r6, #16\n\t"
  21247. "adds r3, r3, r6\n\t"
  21248. "adcs r4, r4, r7\n\t"
  21249. "adc r5, r5, #0\n\t"
  21250. "lsr r6, r11, #16\n\t"
  21251. "lsr r7, r12, #16\n\t"
  21252. "mul r7, r6, r7\n\t"
  21253. "adds r4, r4, r7\n\t"
  21254. "adc r5, r5, #0\n\t"
  21255. "lsl r7, r12, #16\n\t"
  21256. "lsr r7, r7, #16\n\t"
  21257. "mul r6, r7, r6\n\t"
  21258. "lsr r7, r6, #16\n\t"
  21259. "lsl r6, r6, #16\n\t"
  21260. "adds r3, r3, r6\n\t"
  21261. "adcs r4, r4, r7\n\t"
  21262. "adc r5, r5, #0\n\t"
  21263. #else
  21264. "umull r6, r7, r11, r12\n\t"
  21265. "adds r3, r3, r6\n\t"
  21266. "adcs r4, r4, r7\n\t"
  21267. "adc r5, r5, #0\n\t"
  21268. #endif
  21269. /* A[5] * B[7] */
  21270. "ldr r8, [%[a], #20]\n\t"
  21271. "ldr r9, [%[b], #28]\n\t"
  21272. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  21273. "lsl r6, r8, #16\n\t"
  21274. "lsl r7, r9, #16\n\t"
  21275. "lsr r6, r6, #16\n\t"
  21276. "lsr r7, r7, #16\n\t"
  21277. "mul r7, r6, r7\n\t"
  21278. "adds r3, r3, r7\n\t"
  21279. "adcs r4, r4, #0\n\t"
  21280. "adc r5, r5, #0\n\t"
  21281. "lsr r7, r9, #16\n\t"
  21282. "mul r6, r7, r6\n\t"
  21283. "lsr r7, r6, #16\n\t"
  21284. "lsl r6, r6, #16\n\t"
  21285. "adds r3, r3, r6\n\t"
  21286. "adcs r4, r4, r7\n\t"
  21287. "adc r5, r5, #0\n\t"
  21288. "lsr r6, r8, #16\n\t"
  21289. "lsr r7, r9, #16\n\t"
  21290. "mul r7, r6, r7\n\t"
  21291. "adds r4, r4, r7\n\t"
  21292. "adc r5, r5, #0\n\t"
  21293. "lsl r7, r9, #16\n\t"
  21294. "lsr r7, r7, #16\n\t"
  21295. "mul r6, r7, r6\n\t"
  21296. "lsr r7, r6, #16\n\t"
  21297. "lsl r6, r6, #16\n\t"
  21298. "adds r3, r3, r6\n\t"
  21299. "adcs r4, r4, r7\n\t"
  21300. "adc r5, r5, #0\n\t"
  21301. #else
  21302. "umull r6, r7, r8, r9\n\t"
  21303. "adds r3, r3, r6\n\t"
  21304. "adcs r4, r4, r7\n\t"
  21305. "adc r5, r5, #0\n\t"
  21306. #endif
  21307. /* A[4] * B[8] */
  21308. "ldr r8, [%[a], #16]\n\t"
  21309. "ldr r9, [%[b], #32]\n\t"
  21310. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  21311. "lsl r6, r8, #16\n\t"
  21312. "lsl r7, r9, #16\n\t"
  21313. "lsr r6, r6, #16\n\t"
  21314. "lsr r7, r7, #16\n\t"
  21315. "mul r7, r6, r7\n\t"
  21316. "adds r3, r3, r7\n\t"
  21317. "adcs r4, r4, #0\n\t"
  21318. "adc r5, r5, #0\n\t"
  21319. "lsr r7, r9, #16\n\t"
  21320. "mul r6, r7, r6\n\t"
  21321. "lsr r7, r6, #16\n\t"
  21322. "lsl r6, r6, #16\n\t"
  21323. "adds r3, r3, r6\n\t"
  21324. "adcs r4, r4, r7\n\t"
  21325. "adc r5, r5, #0\n\t"
  21326. "lsr r6, r8, #16\n\t"
  21327. "lsr r7, r9, #16\n\t"
  21328. "mul r7, r6, r7\n\t"
  21329. "adds r4, r4, r7\n\t"
  21330. "adc r5, r5, #0\n\t"
  21331. "lsl r7, r9, #16\n\t"
  21332. "lsr r7, r7, #16\n\t"
  21333. "mul r6, r7, r6\n\t"
  21334. "lsr r7, r6, #16\n\t"
  21335. "lsl r6, r6, #16\n\t"
  21336. "adds r3, r3, r6\n\t"
  21337. "adcs r4, r4, r7\n\t"
  21338. "adc r5, r5, #0\n\t"
  21339. #else
  21340. "umull r6, r7, r8, r9\n\t"
  21341. "adds r3, r3, r6\n\t"
  21342. "adcs r4, r4, r7\n\t"
  21343. "adc r5, r5, #0\n\t"
  21344. #endif
  21345. /* A[3] * B[9] */
  21346. "ldr r8, [%[a], #12]\n\t"
  21347. "ldr r9, [%[b], #36]\n\t"
  21348. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  21349. "lsl r6, r8, #16\n\t"
  21350. "lsl r7, r9, #16\n\t"
  21351. "lsr r6, r6, #16\n\t"
  21352. "lsr r7, r7, #16\n\t"
  21353. "mul r7, r6, r7\n\t"
  21354. "adds r3, r3, r7\n\t"
  21355. "adcs r4, r4, #0\n\t"
  21356. "adc r5, r5, #0\n\t"
  21357. "lsr r7, r9, #16\n\t"
  21358. "mul r6, r7, r6\n\t"
  21359. "lsr r7, r6, #16\n\t"
  21360. "lsl r6, r6, #16\n\t"
  21361. "adds r3, r3, r6\n\t"
  21362. "adcs r4, r4, r7\n\t"
  21363. "adc r5, r5, #0\n\t"
  21364. "lsr r6, r8, #16\n\t"
  21365. "lsr r7, r9, #16\n\t"
  21366. "mul r7, r6, r7\n\t"
  21367. "adds r4, r4, r7\n\t"
  21368. "adc r5, r5, #0\n\t"
  21369. "lsl r7, r9, #16\n\t"
  21370. "lsr r7, r7, #16\n\t"
  21371. "mul r6, r7, r6\n\t"
  21372. "lsr r7, r6, #16\n\t"
  21373. "lsl r6, r6, #16\n\t"
  21374. "adds r3, r3, r6\n\t"
  21375. "adcs r4, r4, r7\n\t"
  21376. "adc r5, r5, #0\n\t"
  21377. #else
  21378. "umull r6, r7, r8, r9\n\t"
  21379. "adds r3, r3, r6\n\t"
  21380. "adcs r4, r4, r7\n\t"
  21381. "adc r5, r5, #0\n\t"
  21382. #endif
  21383. /* A[2] * B[10] */
  21384. "ldr r8, [%[a], #8]\n\t"
  21385. "ldr r9, [%[b], #40]\n\t"
  21386. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  21387. "lsl r6, r8, #16\n\t"
  21388. "lsl r7, r9, #16\n\t"
  21389. "lsr r6, r6, #16\n\t"
  21390. "lsr r7, r7, #16\n\t"
  21391. "mul r7, r6, r7\n\t"
  21392. "adds r3, r3, r7\n\t"
  21393. "adcs r4, r4, #0\n\t"
  21394. "adc r5, r5, #0\n\t"
  21395. "lsr r7, r9, #16\n\t"
  21396. "mul r6, r7, r6\n\t"
  21397. "lsr r7, r6, #16\n\t"
  21398. "lsl r6, r6, #16\n\t"
  21399. "adds r3, r3, r6\n\t"
  21400. "adcs r4, r4, r7\n\t"
  21401. "adc r5, r5, #0\n\t"
  21402. "lsr r6, r8, #16\n\t"
  21403. "lsr r7, r9, #16\n\t"
  21404. "mul r7, r6, r7\n\t"
  21405. "adds r4, r4, r7\n\t"
  21406. "adc r5, r5, #0\n\t"
  21407. "lsl r7, r9, #16\n\t"
  21408. "lsr r7, r7, #16\n\t"
  21409. "mul r6, r7, r6\n\t"
  21410. "lsr r7, r6, #16\n\t"
  21411. "lsl r6, r6, #16\n\t"
  21412. "adds r3, r3, r6\n\t"
  21413. "adcs r4, r4, r7\n\t"
  21414. "adc r5, r5, #0\n\t"
  21415. #else
  21416. "umull r6, r7, r8, r9\n\t"
  21417. "adds r3, r3, r6\n\t"
  21418. "adcs r4, r4, r7\n\t"
  21419. "adc r5, r5, #0\n\t"
  21420. #endif
  21421. /* A[1] * B[11] */
  21422. "ldr r8, [%[a], #4]\n\t"
  21423. "ldr r9, [%[b], #44]\n\t"
  21424. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  21425. "lsl r6, r8, #16\n\t"
  21426. "lsl r7, r9, #16\n\t"
  21427. "lsr r6, r6, #16\n\t"
  21428. "lsr r7, r7, #16\n\t"
  21429. "mul r7, r6, r7\n\t"
  21430. "adds r3, r3, r7\n\t"
  21431. "adcs r4, r4, #0\n\t"
  21432. "adc r5, r5, #0\n\t"
  21433. "lsr r7, r9, #16\n\t"
  21434. "mul r6, r7, r6\n\t"
  21435. "lsr r7, r6, #16\n\t"
  21436. "lsl r6, r6, #16\n\t"
  21437. "adds r3, r3, r6\n\t"
  21438. "adcs r4, r4, r7\n\t"
  21439. "adc r5, r5, #0\n\t"
  21440. "lsr r6, r8, #16\n\t"
  21441. "lsr r7, r9, #16\n\t"
  21442. "mul r7, r6, r7\n\t"
  21443. "adds r4, r4, r7\n\t"
  21444. "adc r5, r5, #0\n\t"
  21445. "lsl r7, r9, #16\n\t"
  21446. "lsr r7, r7, #16\n\t"
  21447. "mul r6, r7, r6\n\t"
  21448. "lsr r7, r6, #16\n\t"
  21449. "lsl r6, r6, #16\n\t"
  21450. "adds r3, r3, r6\n\t"
  21451. "adcs r4, r4, r7\n\t"
  21452. "adc r5, r5, #0\n\t"
  21453. #else
  21454. "umull r6, r7, r8, r9\n\t"
  21455. "adds r3, r3, r6\n\t"
  21456. "adcs r4, r4, r7\n\t"
  21457. "adc r5, r5, #0\n\t"
  21458. #endif
  21459. "str r3, [%[r], #48]\n\t"
  21460. /* A[2] * B[11] */
  21461. "ldr r8, [%[a], #8]\n\t"
  21462. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  21463. "lsl r6, r8, #16\n\t"
  21464. "lsl r7, r9, #16\n\t"
  21465. "lsr r6, r6, #16\n\t"
  21466. "lsr r7, r7, #16\n\t"
  21467. "mul r7, r6, r7\n\t"
  21468. "adds r4, r4, r7\n\t"
  21469. "adcs r5, r5, #0\n\t"
  21470. "mov r3, #0\n\t"
  21471. "adc r3, r3, #0\n\t"
  21472. "lsr r7, r9, #16\n\t"
  21473. "mul r6, r7, r6\n\t"
  21474. "lsr r7, r6, #16\n\t"
  21475. "lsl r6, r6, #16\n\t"
  21476. "adds r4, r4, r6\n\t"
  21477. "adcs r5, r5, r7\n\t"
  21478. "adc r3, r3, #0\n\t"
  21479. "lsr r6, r8, #16\n\t"
  21480. "lsr r7, r9, #16\n\t"
  21481. "mul r7, r6, r7\n\t"
  21482. "adds r5, r5, r7\n\t"
  21483. "adc r3, r3, #0\n\t"
  21484. "lsl r7, r9, #16\n\t"
  21485. "lsr r7, r7, #16\n\t"
  21486. "mul r6, r7, r6\n\t"
  21487. "lsr r7, r6, #16\n\t"
  21488. "lsl r6, r6, #16\n\t"
  21489. "adds r4, r4, r6\n\t"
  21490. "adcs r5, r5, r7\n\t"
  21491. "adc r3, r3, #0\n\t"
  21492. #else
  21493. "umull r6, r7, r8, r9\n\t"
  21494. "adds r4, r4, r6\n\t"
  21495. "adcs r5, r5, r7\n\t"
  21496. "mov r3, #0\n\t"
  21497. "adc r3, r3, #0\n\t"
  21498. #endif
  21499. /* A[3] * B[10] */
  21500. "ldr r8, [%[a], #12]\n\t"
  21501. "ldr r9, [%[b], #40]\n\t"
  21502. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  21503. "lsl r6, r8, #16\n\t"
  21504. "lsl r7, r9, #16\n\t"
  21505. "lsr r6, r6, #16\n\t"
  21506. "lsr r7, r7, #16\n\t"
  21507. "mul r7, r6, r7\n\t"
  21508. "adds r4, r4, r7\n\t"
  21509. "adcs r5, r5, #0\n\t"
  21510. "adc r3, r3, #0\n\t"
  21511. "lsr r7, r9, #16\n\t"
  21512. "mul r6, r7, r6\n\t"
  21513. "lsr r7, r6, #16\n\t"
  21514. "lsl r6, r6, #16\n\t"
  21515. "adds r4, r4, r6\n\t"
  21516. "adcs r5, r5, r7\n\t"
  21517. "adc r3, r3, #0\n\t"
  21518. "lsr r6, r8, #16\n\t"
  21519. "lsr r7, r9, #16\n\t"
  21520. "mul r7, r6, r7\n\t"
  21521. "adds r5, r5, r7\n\t"
  21522. "adc r3, r3, #0\n\t"
  21523. "lsl r7, r9, #16\n\t"
  21524. "lsr r7, r7, #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 r4, r4, r6\n\t"
  21529. "adcs r5, r5, r7\n\t"
  21530. "adc r3, r3, #0\n\t"
  21531. #else
  21532. "umull r6, r7, r8, r9\n\t"
  21533. "adds r4, r4, r6\n\t"
  21534. "adcs r5, r5, r7\n\t"
  21535. "adc r3, r3, #0\n\t"
  21536. #endif
  21537. /* A[4] * B[9] */
  21538. "ldr r8, [%[a], #16]\n\t"
  21539. "ldr r9, [%[b], #36]\n\t"
  21540. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  21541. "lsl r6, r8, #16\n\t"
  21542. "lsl r7, r9, #16\n\t"
  21543. "lsr r6, r6, #16\n\t"
  21544. "lsr r7, r7, #16\n\t"
  21545. "mul r7, r6, r7\n\t"
  21546. "adds r4, r4, r7\n\t"
  21547. "adcs r5, r5, #0\n\t"
  21548. "adc r3, r3, #0\n\t"
  21549. "lsr r7, r9, #16\n\t"
  21550. "mul r6, r7, r6\n\t"
  21551. "lsr r7, r6, #16\n\t"
  21552. "lsl r6, r6, #16\n\t"
  21553. "adds r4, r4, r6\n\t"
  21554. "adcs r5, r5, r7\n\t"
  21555. "adc r3, r3, #0\n\t"
  21556. "lsr r6, r8, #16\n\t"
  21557. "lsr r7, r9, #16\n\t"
  21558. "mul r7, r6, r7\n\t"
  21559. "adds r5, r5, r7\n\t"
  21560. "adc r3, r3, #0\n\t"
  21561. "lsl r7, r9, #16\n\t"
  21562. "lsr r7, r7, #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 r4, r4, r6\n\t"
  21567. "adcs r5, r5, r7\n\t"
  21568. "adc r3, r3, #0\n\t"
  21569. #else
  21570. "umull r6, r7, r8, r9\n\t"
  21571. "adds r4, r4, r6\n\t"
  21572. "adcs r5, r5, r7\n\t"
  21573. "adc r3, r3, #0\n\t"
  21574. #endif
  21575. /* A[5] * B[8] */
  21576. "ldr r8, [%[a], #20]\n\t"
  21577. "ldr r9, [%[b], #32]\n\t"
  21578. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  21579. "lsl r6, r8, #16\n\t"
  21580. "lsl r7, r9, #16\n\t"
  21581. "lsr r6, r6, #16\n\t"
  21582. "lsr r7, r7, #16\n\t"
  21583. "mul r7, r6, r7\n\t"
  21584. "adds r4, r4, r7\n\t"
  21585. "adcs r5, r5, #0\n\t"
  21586. "adc r3, r3, #0\n\t"
  21587. "lsr r7, r9, #16\n\t"
  21588. "mul r6, r7, r6\n\t"
  21589. "lsr r7, r6, #16\n\t"
  21590. "lsl r6, r6, #16\n\t"
  21591. "adds r4, r4, r6\n\t"
  21592. "adcs r5, r5, r7\n\t"
  21593. "adc r3, r3, #0\n\t"
  21594. "lsr r6, r8, #16\n\t"
  21595. "lsr r7, r9, #16\n\t"
  21596. "mul r7, r6, r7\n\t"
  21597. "adds r5, r5, r7\n\t"
  21598. "adc r3, r3, #0\n\t"
  21599. "lsl r7, r9, #16\n\t"
  21600. "lsr r7, r7, #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 r4, r4, r6\n\t"
  21605. "adcs r5, r5, r7\n\t"
  21606. "adc r3, r3, #0\n\t"
  21607. #else
  21608. "umull r6, r7, r8, r9\n\t"
  21609. "adds r4, r4, r6\n\t"
  21610. "adcs r5, r5, r7\n\t"
  21611. "adc r3, r3, #0\n\t"
  21612. #endif
  21613. /* A[6] * B[7] */
  21614. "ldr r9, [%[b], #28]\n\t"
  21615. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  21616. "lsl r6, r11, #16\n\t"
  21617. "lsl r7, r9, #16\n\t"
  21618. "lsr r6, r6, #16\n\t"
  21619. "lsr r7, r7, #16\n\t"
  21620. "mul r7, r6, r7\n\t"
  21621. "adds r4, r4, r7\n\t"
  21622. "adcs r5, r5, #0\n\t"
  21623. "adc r3, r3, #0\n\t"
  21624. "lsr r7, r9, #16\n\t"
  21625. "mul r6, r7, r6\n\t"
  21626. "lsr r7, r6, #16\n\t"
  21627. "lsl r6, r6, #16\n\t"
  21628. "adds r4, r4, r6\n\t"
  21629. "adcs r5, r5, r7\n\t"
  21630. "adc r3, r3, #0\n\t"
  21631. "lsr r6, r11, #16\n\t"
  21632. "lsr r7, r9, #16\n\t"
  21633. "mul r7, r6, r7\n\t"
  21634. "adds r5, r5, r7\n\t"
  21635. "adc r3, r3, #0\n\t"
  21636. "lsl r7, r9, #16\n\t"
  21637. "lsr r7, r7, #16\n\t"
  21638. "mul r6, r7, r6\n\t"
  21639. "lsr r7, r6, #16\n\t"
  21640. "lsl r6, r6, #16\n\t"
  21641. "adds r4, r4, r6\n\t"
  21642. "adcs r5, r5, r7\n\t"
  21643. "adc r3, r3, #0\n\t"
  21644. #else
  21645. "umull r6, r7, r11, r9\n\t"
  21646. "adds r4, r4, r6\n\t"
  21647. "adcs r5, r5, r7\n\t"
  21648. "adc r3, r3, #0\n\t"
  21649. #endif
  21650. /* A[7] * B[6] */
  21651. "ldr r8, [%[a], #28]\n\t"
  21652. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  21653. "lsl r6, r8, #16\n\t"
  21654. "lsl r7, r12, #16\n\t"
  21655. "lsr r6, r6, #16\n\t"
  21656. "lsr r7, r7, #16\n\t"
  21657. "mul r7, r6, r7\n\t"
  21658. "adds r4, r4, r7\n\t"
  21659. "adcs r5, r5, #0\n\t"
  21660. "adc r3, r3, #0\n\t"
  21661. "lsr r7, r12, #16\n\t"
  21662. "mul r6, r7, r6\n\t"
  21663. "lsr r7, r6, #16\n\t"
  21664. "lsl r6, r6, #16\n\t"
  21665. "adds r4, r4, r6\n\t"
  21666. "adcs r5, r5, r7\n\t"
  21667. "adc r3, r3, #0\n\t"
  21668. "lsr r6, r8, #16\n\t"
  21669. "lsr r7, r12, #16\n\t"
  21670. "mul r7, r6, r7\n\t"
  21671. "adds r5, r5, r7\n\t"
  21672. "adc r3, r3, #0\n\t"
  21673. "lsl r7, r12, #16\n\t"
  21674. "lsr r7, r7, #16\n\t"
  21675. "mul r6, r7, r6\n\t"
  21676. "lsr r7, r6, #16\n\t"
  21677. "lsl r6, r6, #16\n\t"
  21678. "adds r4, r4, r6\n\t"
  21679. "adcs r5, r5, r7\n\t"
  21680. "adc r3, r3, #0\n\t"
  21681. #else
  21682. "umull r6, r7, r8, r12\n\t"
  21683. "adds r4, r4, r6\n\t"
  21684. "adcs r5, r5, r7\n\t"
  21685. "adc r3, r3, #0\n\t"
  21686. #endif
  21687. /* A[8] * B[5] */
  21688. "ldr r8, [%[a], #32]\n\t"
  21689. "ldr r9, [%[b], #20]\n\t"
  21690. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  21691. "lsl r6, r8, #16\n\t"
  21692. "lsl r7, r9, #16\n\t"
  21693. "lsr r6, r6, #16\n\t"
  21694. "lsr r7, r7, #16\n\t"
  21695. "mul r7, r6, r7\n\t"
  21696. "adds r4, r4, r7\n\t"
  21697. "adcs r5, r5, #0\n\t"
  21698. "adc r3, r3, #0\n\t"
  21699. "lsr r7, r9, #16\n\t"
  21700. "mul r6, r7, r6\n\t"
  21701. "lsr r7, r6, #16\n\t"
  21702. "lsl r6, r6, #16\n\t"
  21703. "adds r4, r4, r6\n\t"
  21704. "adcs r5, r5, r7\n\t"
  21705. "adc r3, r3, #0\n\t"
  21706. "lsr r6, r8, #16\n\t"
  21707. "lsr r7, r9, #16\n\t"
  21708. "mul r7, r6, r7\n\t"
  21709. "adds r5, r5, r7\n\t"
  21710. "adc r3, r3, #0\n\t"
  21711. "lsl r7, r9, #16\n\t"
  21712. "lsr r7, r7, #16\n\t"
  21713. "mul r6, r7, r6\n\t"
  21714. "lsr r7, r6, #16\n\t"
  21715. "lsl r6, r6, #16\n\t"
  21716. "adds r4, r4, r6\n\t"
  21717. "adcs r5, r5, r7\n\t"
  21718. "adc r3, r3, #0\n\t"
  21719. #else
  21720. "umull r6, r7, r8, r9\n\t"
  21721. "adds r4, r4, r6\n\t"
  21722. "adcs r5, r5, r7\n\t"
  21723. "adc r3, r3, #0\n\t"
  21724. #endif
  21725. /* A[9] * B[4] */
  21726. "ldr r8, [%[a], #36]\n\t"
  21727. "ldr r9, [%[b], #16]\n\t"
  21728. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  21729. "lsl r6, r8, #16\n\t"
  21730. "lsl r7, r9, #16\n\t"
  21731. "lsr r6, r6, #16\n\t"
  21732. "lsr r7, r7, #16\n\t"
  21733. "mul r7, r6, r7\n\t"
  21734. "adds r4, r4, r7\n\t"
  21735. "adcs r5, r5, #0\n\t"
  21736. "adc r3, r3, #0\n\t"
  21737. "lsr r7, r9, #16\n\t"
  21738. "mul r6, r7, r6\n\t"
  21739. "lsr r7, r6, #16\n\t"
  21740. "lsl r6, r6, #16\n\t"
  21741. "adds r4, r4, r6\n\t"
  21742. "adcs r5, r5, r7\n\t"
  21743. "adc r3, r3, #0\n\t"
  21744. "lsr r6, r8, #16\n\t"
  21745. "lsr r7, r9, #16\n\t"
  21746. "mul r7, r6, r7\n\t"
  21747. "adds r5, r5, r7\n\t"
  21748. "adc r3, r3, #0\n\t"
  21749. "lsl r7, r9, #16\n\t"
  21750. "lsr r7, r7, #16\n\t"
  21751. "mul r6, r7, r6\n\t"
  21752. "lsr r7, r6, #16\n\t"
  21753. "lsl r6, r6, #16\n\t"
  21754. "adds r4, r4, r6\n\t"
  21755. "adcs r5, r5, r7\n\t"
  21756. "adc r3, r3, #0\n\t"
  21757. #else
  21758. "umull r6, r7, r8, r9\n\t"
  21759. "adds r4, r4, r6\n\t"
  21760. "adcs r5, r5, r7\n\t"
  21761. "adc r3, r3, #0\n\t"
  21762. #endif
  21763. /* A[10] * B[3] */
  21764. "ldr r8, [%[a], #40]\n\t"
  21765. "ldr r9, [%[b], #12]\n\t"
  21766. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  21767. "lsl r6, r8, #16\n\t"
  21768. "lsl r7, r9, #16\n\t"
  21769. "lsr r6, r6, #16\n\t"
  21770. "lsr r7, r7, #16\n\t"
  21771. "mul r7, r6, r7\n\t"
  21772. "adds r4, r4, r7\n\t"
  21773. "adcs r5, r5, #0\n\t"
  21774. "adc r3, r3, #0\n\t"
  21775. "lsr r7, r9, #16\n\t"
  21776. "mul r6, r7, r6\n\t"
  21777. "lsr r7, r6, #16\n\t"
  21778. "lsl r6, r6, #16\n\t"
  21779. "adds r4, r4, r6\n\t"
  21780. "adcs r5, r5, r7\n\t"
  21781. "adc r3, r3, #0\n\t"
  21782. "lsr r6, r8, #16\n\t"
  21783. "lsr r7, r9, #16\n\t"
  21784. "mul r7, r6, r7\n\t"
  21785. "adds r5, r5, r7\n\t"
  21786. "adc r3, r3, #0\n\t"
  21787. "lsl r7, r9, #16\n\t"
  21788. "lsr r7, r7, #16\n\t"
  21789. "mul r6, r7, r6\n\t"
  21790. "lsr r7, r6, #16\n\t"
  21791. "lsl r6, r6, #16\n\t"
  21792. "adds r4, r4, r6\n\t"
  21793. "adcs r5, r5, r7\n\t"
  21794. "adc r3, r3, #0\n\t"
  21795. #else
  21796. "umull r6, r7, r8, r9\n\t"
  21797. "adds r4, r4, r6\n\t"
  21798. "adcs r5, r5, r7\n\t"
  21799. "adc r3, r3, #0\n\t"
  21800. #endif
  21801. /* A[11] * B[2] */
  21802. "ldr r8, [%[a], #44]\n\t"
  21803. "ldr r9, [%[b], #8]\n\t"
  21804. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  21805. "lsl r6, r8, #16\n\t"
  21806. "lsl r7, r9, #16\n\t"
  21807. "lsr r6, r6, #16\n\t"
  21808. "lsr r7, r7, #16\n\t"
  21809. "mul r7, r6, r7\n\t"
  21810. "adds r4, r4, r7\n\t"
  21811. "adcs r5, r5, #0\n\t"
  21812. "adc r3, r3, #0\n\t"
  21813. "lsr r7, r9, #16\n\t"
  21814. "mul r6, r7, r6\n\t"
  21815. "lsr r7, r6, #16\n\t"
  21816. "lsl r6, r6, #16\n\t"
  21817. "adds r4, r4, r6\n\t"
  21818. "adcs r5, r5, r7\n\t"
  21819. "adc r3, r3, #0\n\t"
  21820. "lsr r6, r8, #16\n\t"
  21821. "lsr r7, r9, #16\n\t"
  21822. "mul r7, r6, r7\n\t"
  21823. "adds r5, r5, r7\n\t"
  21824. "adc r3, r3, #0\n\t"
  21825. "lsl r7, r9, #16\n\t"
  21826. "lsr r7, r7, #16\n\t"
  21827. "mul r6, r7, r6\n\t"
  21828. "lsr r7, r6, #16\n\t"
  21829. "lsl r6, r6, #16\n\t"
  21830. "adds r4, r4, r6\n\t"
  21831. "adcs r5, r5, r7\n\t"
  21832. "adc r3, r3, #0\n\t"
  21833. #else
  21834. "umull r6, r7, r8, r9\n\t"
  21835. "adds r4, r4, r6\n\t"
  21836. "adcs r5, r5, r7\n\t"
  21837. "adc r3, r3, #0\n\t"
  21838. #endif
  21839. "str r4, [%[r], #52]\n\t"
  21840. /* A[11] * B[3] */
  21841. "ldr r9, [%[b], #12]\n\t"
  21842. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  21843. "lsl r6, r8, #16\n\t"
  21844. "lsl r7, r9, #16\n\t"
  21845. "lsr r6, r6, #16\n\t"
  21846. "lsr r7, r7, #16\n\t"
  21847. "mul r7, r6, r7\n\t"
  21848. "adds r5, r5, r7\n\t"
  21849. "adcs r3, r3, #0\n\t"
  21850. "mov r4, #0\n\t"
  21851. "adc r4, r4, #0\n\t"
  21852. "lsr r7, r9, #16\n\t"
  21853. "mul r6, r7, r6\n\t"
  21854. "lsr r7, r6, #16\n\t"
  21855. "lsl r6, r6, #16\n\t"
  21856. "adds r5, r5, r6\n\t"
  21857. "adcs r3, r3, r7\n\t"
  21858. "adc r4, r4, #0\n\t"
  21859. "lsr r6, r8, #16\n\t"
  21860. "lsr r7, r9, #16\n\t"
  21861. "mul r7, r6, r7\n\t"
  21862. "adds r3, r3, r7\n\t"
  21863. "adc r4, r4, #0\n\t"
  21864. "lsl r7, r9, #16\n\t"
  21865. "lsr r7, r7, #16\n\t"
  21866. "mul r6, r7, r6\n\t"
  21867. "lsr r7, r6, #16\n\t"
  21868. "lsl r6, r6, #16\n\t"
  21869. "adds r5, r5, r6\n\t"
  21870. "adcs r3, r3, r7\n\t"
  21871. "adc r4, r4, #0\n\t"
  21872. #else
  21873. "umull r6, r7, r8, r9\n\t"
  21874. "adds r5, r5, r6\n\t"
  21875. "adcs r3, r3, r7\n\t"
  21876. "mov r4, #0\n\t"
  21877. "adc r4, r4, #0\n\t"
  21878. #endif
  21879. /* A[10] * B[4] */
  21880. "ldr r8, [%[a], #40]\n\t"
  21881. "ldr r9, [%[b], #16]\n\t"
  21882. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  21883. "lsl r6, r8, #16\n\t"
  21884. "lsl r7, r9, #16\n\t"
  21885. "lsr r6, r6, #16\n\t"
  21886. "lsr r7, r7, #16\n\t"
  21887. "mul r7, r6, r7\n\t"
  21888. "adds r5, r5, r7\n\t"
  21889. "adcs r3, r3, #0\n\t"
  21890. "adc r4, r4, #0\n\t"
  21891. "lsr r7, r9, #16\n\t"
  21892. "mul r6, r7, r6\n\t"
  21893. "lsr r7, r6, #16\n\t"
  21894. "lsl r6, r6, #16\n\t"
  21895. "adds r5, r5, r6\n\t"
  21896. "adcs r3, r3, r7\n\t"
  21897. "adc r4, r4, #0\n\t"
  21898. "lsr r6, r8, #16\n\t"
  21899. "lsr r7, r9, #16\n\t"
  21900. "mul r7, r6, r7\n\t"
  21901. "adds r3, r3, r7\n\t"
  21902. "adc r4, r4, #0\n\t"
  21903. "lsl r7, r9, #16\n\t"
  21904. "lsr r7, r7, #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 r5, r5, r6\n\t"
  21909. "adcs r3, r3, r7\n\t"
  21910. "adc r4, r4, #0\n\t"
  21911. #else
  21912. "umull r6, r7, r8, r9\n\t"
  21913. "adds r5, r5, r6\n\t"
  21914. "adcs r3, r3, r7\n\t"
  21915. "adc r4, r4, #0\n\t"
  21916. #endif
  21917. /* A[9] * B[5] */
  21918. "ldr r8, [%[a], #36]\n\t"
  21919. "ldr r9, [%[b], #20]\n\t"
  21920. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  21921. "lsl r6, r8, #16\n\t"
  21922. "lsl r7, r9, #16\n\t"
  21923. "lsr r6, r6, #16\n\t"
  21924. "lsr r7, r7, #16\n\t"
  21925. "mul r7, r6, r7\n\t"
  21926. "adds r5, r5, r7\n\t"
  21927. "adcs r3, r3, #0\n\t"
  21928. "adc r4, r4, #0\n\t"
  21929. "lsr r7, r9, #16\n\t"
  21930. "mul r6, r7, r6\n\t"
  21931. "lsr r7, r6, #16\n\t"
  21932. "lsl r6, r6, #16\n\t"
  21933. "adds r5, r5, r6\n\t"
  21934. "adcs r3, r3, r7\n\t"
  21935. "adc r4, r4, #0\n\t"
  21936. "lsr r6, r8, #16\n\t"
  21937. "lsr r7, r9, #16\n\t"
  21938. "mul r7, r6, r7\n\t"
  21939. "adds r3, r3, r7\n\t"
  21940. "adc r4, r4, #0\n\t"
  21941. "lsl r7, r9, #16\n\t"
  21942. "lsr r7, r7, #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 r5, r5, r6\n\t"
  21947. "adcs r3, r3, r7\n\t"
  21948. "adc r4, r4, #0\n\t"
  21949. #else
  21950. "umull r6, r7, r8, r9\n\t"
  21951. "adds r5, r5, r6\n\t"
  21952. "adcs r3, r3, r7\n\t"
  21953. "adc r4, r4, #0\n\t"
  21954. #endif
  21955. /* A[8] * B[6] */
  21956. "ldr r8, [%[a], #32]\n\t"
  21957. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  21958. "lsl r6, r8, #16\n\t"
  21959. "lsl r7, r12, #16\n\t"
  21960. "lsr r6, r6, #16\n\t"
  21961. "lsr r7, r7, #16\n\t"
  21962. "mul r7, r6, r7\n\t"
  21963. "adds r5, r5, r7\n\t"
  21964. "adcs r3, r3, #0\n\t"
  21965. "adc r4, r4, #0\n\t"
  21966. "lsr r7, r12, #16\n\t"
  21967. "mul r6, r7, r6\n\t"
  21968. "lsr r7, r6, #16\n\t"
  21969. "lsl r6, r6, #16\n\t"
  21970. "adds r5, r5, r6\n\t"
  21971. "adcs r3, r3, r7\n\t"
  21972. "adc r4, r4, #0\n\t"
  21973. "lsr r6, r8, #16\n\t"
  21974. "lsr r7, r12, #16\n\t"
  21975. "mul r7, r6, r7\n\t"
  21976. "adds r3, r3, r7\n\t"
  21977. "adc r4, r4, #0\n\t"
  21978. "lsl r7, r12, #16\n\t"
  21979. "lsr r7, r7, #16\n\t"
  21980. "mul r6, r7, r6\n\t"
  21981. "lsr r7, r6, #16\n\t"
  21982. "lsl r6, r6, #16\n\t"
  21983. "adds r5, r5, r6\n\t"
  21984. "adcs r3, r3, r7\n\t"
  21985. "adc r4, r4, #0\n\t"
  21986. #else
  21987. "umull r6, r7, r8, r12\n\t"
  21988. "adds r5, r5, r6\n\t"
  21989. "adcs r3, r3, r7\n\t"
  21990. "adc r4, r4, #0\n\t"
  21991. #endif
  21992. /* A[7] * B[7] */
  21993. "ldr r11, [%[a], #28]\n\t"
  21994. "ldr r12, [%[b], #28]\n\t"
  21995. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  21996. "lsl r6, r11, #16\n\t"
  21997. "lsl r7, r12, #16\n\t"
  21998. "lsr r6, r6, #16\n\t"
  21999. "lsr r7, r7, #16\n\t"
  22000. "mul r7, r6, r7\n\t"
  22001. "adds r5, r5, r7\n\t"
  22002. "adcs r3, r3, #0\n\t"
  22003. "adc r4, r4, #0\n\t"
  22004. "lsr r7, r12, #16\n\t"
  22005. "mul r6, r7, r6\n\t"
  22006. "lsr r7, r6, #16\n\t"
  22007. "lsl r6, r6, #16\n\t"
  22008. "adds r5, r5, r6\n\t"
  22009. "adcs r3, r3, r7\n\t"
  22010. "adc r4, r4, #0\n\t"
  22011. "lsr r6, r11, #16\n\t"
  22012. "lsr r7, r12, #16\n\t"
  22013. "mul r7, r6, r7\n\t"
  22014. "adds r3, r3, r7\n\t"
  22015. "adc r4, r4, #0\n\t"
  22016. "lsl r7, r12, #16\n\t"
  22017. "lsr r7, r7, #16\n\t"
  22018. "mul r6, r7, r6\n\t"
  22019. "lsr r7, r6, #16\n\t"
  22020. "lsl r6, r6, #16\n\t"
  22021. "adds r5, r5, r6\n\t"
  22022. "adcs r3, r3, r7\n\t"
  22023. "adc r4, r4, #0\n\t"
  22024. #else
  22025. "umull r6, r7, r11, r12\n\t"
  22026. "adds r5, r5, r6\n\t"
  22027. "adcs r3, r3, r7\n\t"
  22028. "adc r4, r4, #0\n\t"
  22029. #endif
  22030. /* A[6] * B[8] */
  22031. "ldr r8, [%[a], #24]\n\t"
  22032. "ldr r9, [%[b], #32]\n\t"
  22033. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  22034. "lsl r6, r8, #16\n\t"
  22035. "lsl r7, r9, #16\n\t"
  22036. "lsr r6, r6, #16\n\t"
  22037. "lsr r7, r7, #16\n\t"
  22038. "mul r7, r6, r7\n\t"
  22039. "adds r5, r5, r7\n\t"
  22040. "adcs r3, r3, #0\n\t"
  22041. "adc r4, r4, #0\n\t"
  22042. "lsr r7, r9, #16\n\t"
  22043. "mul r6, r7, r6\n\t"
  22044. "lsr r7, r6, #16\n\t"
  22045. "lsl r6, r6, #16\n\t"
  22046. "adds r5, r5, r6\n\t"
  22047. "adcs r3, r3, r7\n\t"
  22048. "adc r4, r4, #0\n\t"
  22049. "lsr r6, r8, #16\n\t"
  22050. "lsr r7, r9, #16\n\t"
  22051. "mul r7, r6, r7\n\t"
  22052. "adds r3, r3, r7\n\t"
  22053. "adc r4, r4, #0\n\t"
  22054. "lsl r7, r9, #16\n\t"
  22055. "lsr r7, r7, #16\n\t"
  22056. "mul r6, r7, r6\n\t"
  22057. "lsr r7, r6, #16\n\t"
  22058. "lsl r6, r6, #16\n\t"
  22059. "adds r5, r5, r6\n\t"
  22060. "adcs r3, r3, r7\n\t"
  22061. "adc r4, r4, #0\n\t"
  22062. #else
  22063. "umull r6, r7, r8, r9\n\t"
  22064. "adds r5, r5, r6\n\t"
  22065. "adcs r3, r3, r7\n\t"
  22066. "adc r4, r4, #0\n\t"
  22067. #endif
  22068. /* A[5] * B[9] */
  22069. "ldr r8, [%[a], #20]\n\t"
  22070. "ldr r9, [%[b], #36]\n\t"
  22071. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  22072. "lsl r6, r8, #16\n\t"
  22073. "lsl r7, r9, #16\n\t"
  22074. "lsr r6, r6, #16\n\t"
  22075. "lsr r7, r7, #16\n\t"
  22076. "mul r7, r6, r7\n\t"
  22077. "adds r5, r5, r7\n\t"
  22078. "adcs r3, r3, #0\n\t"
  22079. "adc r4, r4, #0\n\t"
  22080. "lsr r7, r9, #16\n\t"
  22081. "mul r6, r7, r6\n\t"
  22082. "lsr r7, r6, #16\n\t"
  22083. "lsl r6, r6, #16\n\t"
  22084. "adds r5, r5, r6\n\t"
  22085. "adcs r3, r3, r7\n\t"
  22086. "adc r4, r4, #0\n\t"
  22087. "lsr r6, r8, #16\n\t"
  22088. "lsr r7, r9, #16\n\t"
  22089. "mul r7, r6, r7\n\t"
  22090. "adds r3, r3, r7\n\t"
  22091. "adc r4, r4, #0\n\t"
  22092. "lsl r7, r9, #16\n\t"
  22093. "lsr r7, r7, #16\n\t"
  22094. "mul r6, r7, r6\n\t"
  22095. "lsr r7, r6, #16\n\t"
  22096. "lsl r6, r6, #16\n\t"
  22097. "adds r5, r5, r6\n\t"
  22098. "adcs r3, r3, r7\n\t"
  22099. "adc r4, r4, #0\n\t"
  22100. #else
  22101. "umull r6, r7, r8, r9\n\t"
  22102. "adds r5, r5, r6\n\t"
  22103. "adcs r3, r3, r7\n\t"
  22104. "adc r4, r4, #0\n\t"
  22105. #endif
  22106. /* A[4] * B[10] */
  22107. "ldr r8, [%[a], #16]\n\t"
  22108. "ldr r9, [%[b], #40]\n\t"
  22109. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  22110. "lsl r6, r8, #16\n\t"
  22111. "lsl r7, r9, #16\n\t"
  22112. "lsr r6, r6, #16\n\t"
  22113. "lsr r7, r7, #16\n\t"
  22114. "mul r7, r6, r7\n\t"
  22115. "adds r5, r5, r7\n\t"
  22116. "adcs r3, r3, #0\n\t"
  22117. "adc r4, r4, #0\n\t"
  22118. "lsr r7, r9, #16\n\t"
  22119. "mul r6, r7, r6\n\t"
  22120. "lsr r7, r6, #16\n\t"
  22121. "lsl r6, r6, #16\n\t"
  22122. "adds r5, r5, r6\n\t"
  22123. "adcs r3, r3, r7\n\t"
  22124. "adc r4, r4, #0\n\t"
  22125. "lsr r6, r8, #16\n\t"
  22126. "lsr r7, r9, #16\n\t"
  22127. "mul r7, r6, r7\n\t"
  22128. "adds r3, r3, r7\n\t"
  22129. "adc r4, r4, #0\n\t"
  22130. "lsl r7, r9, #16\n\t"
  22131. "lsr r7, r7, #16\n\t"
  22132. "mul r6, r7, r6\n\t"
  22133. "lsr r7, r6, #16\n\t"
  22134. "lsl r6, r6, #16\n\t"
  22135. "adds r5, r5, r6\n\t"
  22136. "adcs r3, r3, r7\n\t"
  22137. "adc r4, r4, #0\n\t"
  22138. #else
  22139. "umull r6, r7, r8, r9\n\t"
  22140. "adds r5, r5, r6\n\t"
  22141. "adcs r3, r3, r7\n\t"
  22142. "adc r4, r4, #0\n\t"
  22143. #endif
  22144. /* A[3] * B[11] */
  22145. "ldr r8, [%[a], #12]\n\t"
  22146. "ldr r9, [%[b], #44]\n\t"
  22147. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  22148. "lsl r6, r8, #16\n\t"
  22149. "lsl r7, r9, #16\n\t"
  22150. "lsr r6, r6, #16\n\t"
  22151. "lsr r7, r7, #16\n\t"
  22152. "mul r7, r6, r7\n\t"
  22153. "adds r5, r5, r7\n\t"
  22154. "adcs r3, r3, #0\n\t"
  22155. "adc r4, r4, #0\n\t"
  22156. "lsr r7, r9, #16\n\t"
  22157. "mul r6, r7, r6\n\t"
  22158. "lsr r7, r6, #16\n\t"
  22159. "lsl r6, r6, #16\n\t"
  22160. "adds r5, r5, r6\n\t"
  22161. "adcs r3, r3, r7\n\t"
  22162. "adc r4, r4, #0\n\t"
  22163. "lsr r6, r8, #16\n\t"
  22164. "lsr r7, r9, #16\n\t"
  22165. "mul r7, r6, r7\n\t"
  22166. "adds r3, r3, r7\n\t"
  22167. "adc r4, r4, #0\n\t"
  22168. "lsl r7, r9, #16\n\t"
  22169. "lsr r7, r7, #16\n\t"
  22170. "mul r6, r7, r6\n\t"
  22171. "lsr r7, r6, #16\n\t"
  22172. "lsl r6, r6, #16\n\t"
  22173. "adds r5, r5, r6\n\t"
  22174. "adcs r3, r3, r7\n\t"
  22175. "adc r4, r4, #0\n\t"
  22176. #else
  22177. "umull r6, r7, r8, r9\n\t"
  22178. "adds r5, r5, r6\n\t"
  22179. "adcs r3, r3, r7\n\t"
  22180. "adc r4, r4, #0\n\t"
  22181. #endif
  22182. "str r5, [%[r], #56]\n\t"
  22183. /* A[4] * B[11] */
  22184. "ldr r8, [%[a], #16]\n\t"
  22185. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  22186. "lsl r6, r8, #16\n\t"
  22187. "lsl r7, r9, #16\n\t"
  22188. "lsr r6, r6, #16\n\t"
  22189. "lsr r7, r7, #16\n\t"
  22190. "mul r7, r6, r7\n\t"
  22191. "adds r3, r3, r7\n\t"
  22192. "adcs r4, r4, #0\n\t"
  22193. "mov r5, #0\n\t"
  22194. "adc r5, r5, #0\n\t"
  22195. "lsr r7, r9, #16\n\t"
  22196. "mul r6, r7, r6\n\t"
  22197. "lsr r7, r6, #16\n\t"
  22198. "lsl r6, r6, #16\n\t"
  22199. "adds r3, r3, r6\n\t"
  22200. "adcs r4, r4, r7\n\t"
  22201. "adc r5, r5, #0\n\t"
  22202. "lsr r6, r8, #16\n\t"
  22203. "lsr r7, r9, #16\n\t"
  22204. "mul r7, r6, r7\n\t"
  22205. "adds r4, r4, r7\n\t"
  22206. "adc r5, r5, #0\n\t"
  22207. "lsl r7, r9, #16\n\t"
  22208. "lsr r7, r7, #16\n\t"
  22209. "mul r6, r7, r6\n\t"
  22210. "lsr r7, r6, #16\n\t"
  22211. "lsl r6, r6, #16\n\t"
  22212. "adds r3, r3, r6\n\t"
  22213. "adcs r4, r4, r7\n\t"
  22214. "adc r5, r5, #0\n\t"
  22215. #else
  22216. "umull r6, r7, r8, r9\n\t"
  22217. "adds r3, r3, r6\n\t"
  22218. "adcs r4, r4, r7\n\t"
  22219. "mov r5, #0\n\t"
  22220. "adc r5, r5, #0\n\t"
  22221. #endif
  22222. /* A[5] * B[10] */
  22223. "ldr r8, [%[a], #20]\n\t"
  22224. "ldr r9, [%[b], #40]\n\t"
  22225. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  22226. "lsl r6, r8, #16\n\t"
  22227. "lsl r7, r9, #16\n\t"
  22228. "lsr r6, r6, #16\n\t"
  22229. "lsr r7, r7, #16\n\t"
  22230. "mul r7, r6, r7\n\t"
  22231. "adds r3, r3, r7\n\t"
  22232. "adcs r4, r4, #0\n\t"
  22233. "adc r5, r5, #0\n\t"
  22234. "lsr r7, r9, #16\n\t"
  22235. "mul r6, r7, r6\n\t"
  22236. "lsr r7, r6, #16\n\t"
  22237. "lsl r6, r6, #16\n\t"
  22238. "adds r3, r3, r6\n\t"
  22239. "adcs r4, r4, r7\n\t"
  22240. "adc r5, r5, #0\n\t"
  22241. "lsr r6, r8, #16\n\t"
  22242. "lsr r7, r9, #16\n\t"
  22243. "mul r7, r6, r7\n\t"
  22244. "adds r4, r4, r7\n\t"
  22245. "adc r5, r5, #0\n\t"
  22246. "lsl r7, r9, #16\n\t"
  22247. "lsr r7, r7, #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 r3, r3, r6\n\t"
  22252. "adcs r4, r4, r7\n\t"
  22253. "adc r5, r5, #0\n\t"
  22254. #else
  22255. "umull r6, r7, r8, r9\n\t"
  22256. "adds r3, r3, r6\n\t"
  22257. "adcs r4, r4, r7\n\t"
  22258. "adc r5, r5, #0\n\t"
  22259. #endif
  22260. /* A[6] * B[9] */
  22261. "ldr r8, [%[a], #24]\n\t"
  22262. "ldr r9, [%[b], #36]\n\t"
  22263. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  22264. "lsl r6, r8, #16\n\t"
  22265. "lsl r7, r9, #16\n\t"
  22266. "lsr r6, r6, #16\n\t"
  22267. "lsr r7, r7, #16\n\t"
  22268. "mul r7, r6, r7\n\t"
  22269. "adds r3, r3, r7\n\t"
  22270. "adcs r4, r4, #0\n\t"
  22271. "adc r5, r5, #0\n\t"
  22272. "lsr r7, r9, #16\n\t"
  22273. "mul r6, r7, r6\n\t"
  22274. "lsr r7, r6, #16\n\t"
  22275. "lsl r6, r6, #16\n\t"
  22276. "adds r3, r3, r6\n\t"
  22277. "adcs r4, r4, r7\n\t"
  22278. "adc r5, r5, #0\n\t"
  22279. "lsr r6, r8, #16\n\t"
  22280. "lsr r7, r9, #16\n\t"
  22281. "mul r7, r6, r7\n\t"
  22282. "adds r4, r4, r7\n\t"
  22283. "adc r5, r5, #0\n\t"
  22284. "lsl r7, r9, #16\n\t"
  22285. "lsr r7, r7, #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 r3, r3, r6\n\t"
  22290. "adcs r4, r4, r7\n\t"
  22291. "adc r5, r5, #0\n\t"
  22292. #else
  22293. "umull r6, r7, r8, r9\n\t"
  22294. "adds r3, r3, r6\n\t"
  22295. "adcs r4, r4, r7\n\t"
  22296. "adc r5, r5, #0\n\t"
  22297. #endif
  22298. /* A[7] * B[8] */
  22299. "ldr r9, [%[b], #32]\n\t"
  22300. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  22301. "lsl r6, r11, #16\n\t"
  22302. "lsl r7, r9, #16\n\t"
  22303. "lsr r6, r6, #16\n\t"
  22304. "lsr r7, r7, #16\n\t"
  22305. "mul r7, r6, r7\n\t"
  22306. "adds r3, r3, r7\n\t"
  22307. "adcs r4, r4, #0\n\t"
  22308. "adc r5, r5, #0\n\t"
  22309. "lsr r7, r9, #16\n\t"
  22310. "mul r6, r7, r6\n\t"
  22311. "lsr r7, r6, #16\n\t"
  22312. "lsl r6, r6, #16\n\t"
  22313. "adds r3, r3, r6\n\t"
  22314. "adcs r4, r4, r7\n\t"
  22315. "adc r5, r5, #0\n\t"
  22316. "lsr r6, r11, #16\n\t"
  22317. "lsr r7, r9, #16\n\t"
  22318. "mul r7, r6, r7\n\t"
  22319. "adds r4, r4, r7\n\t"
  22320. "adc r5, r5, #0\n\t"
  22321. "lsl r7, r9, #16\n\t"
  22322. "lsr r7, r7, #16\n\t"
  22323. "mul r6, r7, r6\n\t"
  22324. "lsr r7, r6, #16\n\t"
  22325. "lsl r6, r6, #16\n\t"
  22326. "adds r3, r3, r6\n\t"
  22327. "adcs r4, r4, r7\n\t"
  22328. "adc r5, r5, #0\n\t"
  22329. #else
  22330. "umull r6, r7, r11, r9\n\t"
  22331. "adds r3, r3, r6\n\t"
  22332. "adcs r4, r4, r7\n\t"
  22333. "adc r5, r5, #0\n\t"
  22334. #endif
  22335. /* A[8] * B[7] */
  22336. "ldr r8, [%[a], #32]\n\t"
  22337. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  22338. "lsl r6, r8, #16\n\t"
  22339. "lsl r7, r12, #16\n\t"
  22340. "lsr r6, r6, #16\n\t"
  22341. "lsr r7, r7, #16\n\t"
  22342. "mul r7, r6, r7\n\t"
  22343. "adds r3, r3, r7\n\t"
  22344. "adcs r4, r4, #0\n\t"
  22345. "adc r5, r5, #0\n\t"
  22346. "lsr r7, r12, #16\n\t"
  22347. "mul r6, r7, r6\n\t"
  22348. "lsr r7, r6, #16\n\t"
  22349. "lsl r6, r6, #16\n\t"
  22350. "adds r3, r3, r6\n\t"
  22351. "adcs r4, r4, r7\n\t"
  22352. "adc r5, r5, #0\n\t"
  22353. "lsr r6, r8, #16\n\t"
  22354. "lsr r7, r12, #16\n\t"
  22355. "mul r7, r6, r7\n\t"
  22356. "adds r4, r4, r7\n\t"
  22357. "adc r5, r5, #0\n\t"
  22358. "lsl r7, r12, #16\n\t"
  22359. "lsr r7, r7, #16\n\t"
  22360. "mul r6, r7, r6\n\t"
  22361. "lsr r7, r6, #16\n\t"
  22362. "lsl r6, r6, #16\n\t"
  22363. "adds r3, r3, r6\n\t"
  22364. "adcs r4, r4, r7\n\t"
  22365. "adc r5, r5, #0\n\t"
  22366. #else
  22367. "umull r6, r7, r8, r12\n\t"
  22368. "adds r3, r3, r6\n\t"
  22369. "adcs r4, r4, r7\n\t"
  22370. "adc r5, r5, #0\n\t"
  22371. #endif
  22372. /* A[9] * B[6] */
  22373. "ldr r8, [%[a], #36]\n\t"
  22374. "ldr r9, [%[b], #24]\n\t"
  22375. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  22376. "lsl r6, r8, #16\n\t"
  22377. "lsl r7, r9, #16\n\t"
  22378. "lsr r6, r6, #16\n\t"
  22379. "lsr r7, r7, #16\n\t"
  22380. "mul r7, r6, r7\n\t"
  22381. "adds r3, r3, r7\n\t"
  22382. "adcs r4, r4, #0\n\t"
  22383. "adc r5, r5, #0\n\t"
  22384. "lsr r7, r9, #16\n\t"
  22385. "mul r6, r7, r6\n\t"
  22386. "lsr r7, r6, #16\n\t"
  22387. "lsl r6, r6, #16\n\t"
  22388. "adds r3, r3, r6\n\t"
  22389. "adcs r4, r4, r7\n\t"
  22390. "adc r5, r5, #0\n\t"
  22391. "lsr r6, r8, #16\n\t"
  22392. "lsr r7, r9, #16\n\t"
  22393. "mul r7, r6, r7\n\t"
  22394. "adds r4, r4, r7\n\t"
  22395. "adc r5, r5, #0\n\t"
  22396. "lsl r7, r9, #16\n\t"
  22397. "lsr r7, r7, #16\n\t"
  22398. "mul r6, r7, r6\n\t"
  22399. "lsr r7, r6, #16\n\t"
  22400. "lsl r6, r6, #16\n\t"
  22401. "adds r3, r3, r6\n\t"
  22402. "adcs r4, r4, r7\n\t"
  22403. "adc r5, r5, #0\n\t"
  22404. #else
  22405. "umull r6, r7, r8, r9\n\t"
  22406. "adds r3, r3, r6\n\t"
  22407. "adcs r4, r4, r7\n\t"
  22408. "adc r5, r5, #0\n\t"
  22409. #endif
  22410. /* A[10] * B[5] */
  22411. "ldr r8, [%[a], #40]\n\t"
  22412. "ldr r9, [%[b], #20]\n\t"
  22413. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  22414. "lsl r6, r8, #16\n\t"
  22415. "lsl r7, r9, #16\n\t"
  22416. "lsr r6, r6, #16\n\t"
  22417. "lsr r7, r7, #16\n\t"
  22418. "mul r7, r6, r7\n\t"
  22419. "adds r3, r3, r7\n\t"
  22420. "adcs r4, r4, #0\n\t"
  22421. "adc r5, r5, #0\n\t"
  22422. "lsr r7, r9, #16\n\t"
  22423. "mul r6, r7, r6\n\t"
  22424. "lsr r7, r6, #16\n\t"
  22425. "lsl r6, r6, #16\n\t"
  22426. "adds r3, r3, r6\n\t"
  22427. "adcs r4, r4, r7\n\t"
  22428. "adc r5, r5, #0\n\t"
  22429. "lsr r6, r8, #16\n\t"
  22430. "lsr r7, r9, #16\n\t"
  22431. "mul r7, r6, r7\n\t"
  22432. "adds r4, r4, r7\n\t"
  22433. "adc r5, r5, #0\n\t"
  22434. "lsl r7, r9, #16\n\t"
  22435. "lsr r7, r7, #16\n\t"
  22436. "mul r6, r7, r6\n\t"
  22437. "lsr r7, r6, #16\n\t"
  22438. "lsl r6, r6, #16\n\t"
  22439. "adds r3, r3, r6\n\t"
  22440. "adcs r4, r4, r7\n\t"
  22441. "adc r5, r5, #0\n\t"
  22442. #else
  22443. "umull r6, r7, r8, r9\n\t"
  22444. "adds r3, r3, r6\n\t"
  22445. "adcs r4, r4, r7\n\t"
  22446. "adc r5, r5, #0\n\t"
  22447. #endif
  22448. /* A[11] * B[4] */
  22449. "ldr r8, [%[a], #44]\n\t"
  22450. "ldr r9, [%[b], #16]\n\t"
  22451. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  22452. "lsl r6, r8, #16\n\t"
  22453. "lsl r7, r9, #16\n\t"
  22454. "lsr r6, r6, #16\n\t"
  22455. "lsr r7, r7, #16\n\t"
  22456. "mul r7, r6, r7\n\t"
  22457. "adds r3, r3, r7\n\t"
  22458. "adcs r4, r4, #0\n\t"
  22459. "adc r5, r5, #0\n\t"
  22460. "lsr r7, r9, #16\n\t"
  22461. "mul r6, r7, r6\n\t"
  22462. "lsr r7, r6, #16\n\t"
  22463. "lsl r6, r6, #16\n\t"
  22464. "adds r3, r3, r6\n\t"
  22465. "adcs r4, r4, r7\n\t"
  22466. "adc r5, r5, #0\n\t"
  22467. "lsr r6, r8, #16\n\t"
  22468. "lsr r7, r9, #16\n\t"
  22469. "mul r7, r6, r7\n\t"
  22470. "adds r4, r4, r7\n\t"
  22471. "adc r5, r5, #0\n\t"
  22472. "lsl r7, r9, #16\n\t"
  22473. "lsr r7, r7, #16\n\t"
  22474. "mul r6, r7, r6\n\t"
  22475. "lsr r7, r6, #16\n\t"
  22476. "lsl r6, r6, #16\n\t"
  22477. "adds r3, r3, r6\n\t"
  22478. "adcs r4, r4, r7\n\t"
  22479. "adc r5, r5, #0\n\t"
  22480. #else
  22481. "umull r6, r7, r8, r9\n\t"
  22482. "adds r3, r3, r6\n\t"
  22483. "adcs r4, r4, r7\n\t"
  22484. "adc r5, r5, #0\n\t"
  22485. #endif
  22486. "str r3, [%[r], #60]\n\t"
  22487. /* A[11] * B[5] */
  22488. "ldr r9, [%[b], #20]\n\t"
  22489. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  22490. "lsl r6, r8, #16\n\t"
  22491. "lsl r7, r9, #16\n\t"
  22492. "lsr r6, r6, #16\n\t"
  22493. "lsr r7, r7, #16\n\t"
  22494. "mul r7, r6, r7\n\t"
  22495. "adds r4, r4, r7\n\t"
  22496. "adcs r5, r5, #0\n\t"
  22497. "mov r3, #0\n\t"
  22498. "adc r3, r3, #0\n\t"
  22499. "lsr r7, r9, #16\n\t"
  22500. "mul r6, r7, r6\n\t"
  22501. "lsr r7, r6, #16\n\t"
  22502. "lsl r6, r6, #16\n\t"
  22503. "adds r4, r4, r6\n\t"
  22504. "adcs r5, r5, r7\n\t"
  22505. "adc r3, r3, #0\n\t"
  22506. "lsr r6, r8, #16\n\t"
  22507. "lsr r7, r9, #16\n\t"
  22508. "mul r7, r6, r7\n\t"
  22509. "adds r5, r5, r7\n\t"
  22510. "adc r3, r3, #0\n\t"
  22511. "lsl r7, r9, #16\n\t"
  22512. "lsr r7, r7, #16\n\t"
  22513. "mul r6, r7, r6\n\t"
  22514. "lsr r7, r6, #16\n\t"
  22515. "lsl r6, r6, #16\n\t"
  22516. "adds r4, r4, r6\n\t"
  22517. "adcs r5, r5, r7\n\t"
  22518. "adc r3, r3, #0\n\t"
  22519. #else
  22520. "umull r6, r7, r8, r9\n\t"
  22521. "adds r4, r4, r6\n\t"
  22522. "adcs r5, r5, r7\n\t"
  22523. "mov r3, #0\n\t"
  22524. "adc r3, r3, #0\n\t"
  22525. #endif
  22526. /* A[10] * B[6] */
  22527. "ldr r8, [%[a], #40]\n\t"
  22528. "ldr r9, [%[b], #24]\n\t"
  22529. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  22530. "lsl r6, r8, #16\n\t"
  22531. "lsl r7, r9, #16\n\t"
  22532. "lsr r6, r6, #16\n\t"
  22533. "lsr r7, r7, #16\n\t"
  22534. "mul r7, r6, r7\n\t"
  22535. "adds r4, r4, r7\n\t"
  22536. "adcs r5, r5, #0\n\t"
  22537. "adc r3, r3, #0\n\t"
  22538. "lsr r7, r9, #16\n\t"
  22539. "mul r6, r7, r6\n\t"
  22540. "lsr r7, r6, #16\n\t"
  22541. "lsl r6, r6, #16\n\t"
  22542. "adds r4, r4, r6\n\t"
  22543. "adcs r5, r5, r7\n\t"
  22544. "adc r3, r3, #0\n\t"
  22545. "lsr r6, r8, #16\n\t"
  22546. "lsr r7, r9, #16\n\t"
  22547. "mul r7, r6, r7\n\t"
  22548. "adds r5, r5, r7\n\t"
  22549. "adc r3, r3, #0\n\t"
  22550. "lsl r7, r9, #16\n\t"
  22551. "lsr r7, r7, #16\n\t"
  22552. "mul r6, r7, r6\n\t"
  22553. "lsr r7, r6, #16\n\t"
  22554. "lsl r6, r6, #16\n\t"
  22555. "adds r4, r4, r6\n\t"
  22556. "adcs r5, r5, r7\n\t"
  22557. "adc r3, r3, #0\n\t"
  22558. #else
  22559. "umull r6, r7, r8, r9\n\t"
  22560. "adds r4, r4, r6\n\t"
  22561. "adcs r5, r5, r7\n\t"
  22562. "adc r3, r3, #0\n\t"
  22563. #endif
  22564. /* A[9] * B[7] */
  22565. "ldr r8, [%[a], #36]\n\t"
  22566. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  22567. "lsl r6, r8, #16\n\t"
  22568. "lsl r7, r12, #16\n\t"
  22569. "lsr r6, r6, #16\n\t"
  22570. "lsr r7, r7, #16\n\t"
  22571. "mul r7, r6, r7\n\t"
  22572. "adds r4, r4, r7\n\t"
  22573. "adcs r5, r5, #0\n\t"
  22574. "adc r3, r3, #0\n\t"
  22575. "lsr r7, r12, #16\n\t"
  22576. "mul r6, r7, r6\n\t"
  22577. "lsr r7, r6, #16\n\t"
  22578. "lsl r6, r6, #16\n\t"
  22579. "adds r4, r4, r6\n\t"
  22580. "adcs r5, r5, r7\n\t"
  22581. "adc r3, r3, #0\n\t"
  22582. "lsr r6, r8, #16\n\t"
  22583. "lsr r7, r12, #16\n\t"
  22584. "mul r7, r6, r7\n\t"
  22585. "adds r5, r5, r7\n\t"
  22586. "adc r3, r3, #0\n\t"
  22587. "lsl r7, r12, #16\n\t"
  22588. "lsr r7, r7, #16\n\t"
  22589. "mul r6, r7, r6\n\t"
  22590. "lsr r7, r6, #16\n\t"
  22591. "lsl r6, r6, #16\n\t"
  22592. "adds r4, r4, r6\n\t"
  22593. "adcs r5, r5, r7\n\t"
  22594. "adc r3, r3, #0\n\t"
  22595. #else
  22596. "umull r6, r7, r8, r12\n\t"
  22597. "adds r4, r4, r6\n\t"
  22598. "adcs r5, r5, r7\n\t"
  22599. "adc r3, r3, #0\n\t"
  22600. #endif
  22601. /* A[8] * B[8] */
  22602. "ldr r11, [%[a], #32]\n\t"
  22603. "ldr r12, [%[b], #32]\n\t"
  22604. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  22605. "lsl r6, r11, #16\n\t"
  22606. "lsl r7, r12, #16\n\t"
  22607. "lsr r6, r6, #16\n\t"
  22608. "lsr r7, r7, #16\n\t"
  22609. "mul r7, r6, r7\n\t"
  22610. "adds r4, r4, r7\n\t"
  22611. "adcs r5, r5, #0\n\t"
  22612. "adc r3, r3, #0\n\t"
  22613. "lsr r7, r12, #16\n\t"
  22614. "mul r6, r7, r6\n\t"
  22615. "lsr r7, r6, #16\n\t"
  22616. "lsl r6, r6, #16\n\t"
  22617. "adds r4, r4, r6\n\t"
  22618. "adcs r5, r5, r7\n\t"
  22619. "adc r3, r3, #0\n\t"
  22620. "lsr r6, r11, #16\n\t"
  22621. "lsr r7, r12, #16\n\t"
  22622. "mul r7, r6, r7\n\t"
  22623. "adds r5, r5, r7\n\t"
  22624. "adc r3, r3, #0\n\t"
  22625. "lsl r7, r12, #16\n\t"
  22626. "lsr r7, r7, #16\n\t"
  22627. "mul r6, r7, r6\n\t"
  22628. "lsr r7, r6, #16\n\t"
  22629. "lsl r6, r6, #16\n\t"
  22630. "adds r4, r4, r6\n\t"
  22631. "adcs r5, r5, r7\n\t"
  22632. "adc r3, r3, #0\n\t"
  22633. #else
  22634. "umull r6, r7, r11, r12\n\t"
  22635. "adds r4, r4, r6\n\t"
  22636. "adcs r5, r5, r7\n\t"
  22637. "adc r3, r3, #0\n\t"
  22638. #endif
  22639. /* A[7] * B[9] */
  22640. "ldr r8, [%[a], #28]\n\t"
  22641. "ldr r9, [%[b], #36]\n\t"
  22642. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  22643. "lsl r6, r8, #16\n\t"
  22644. "lsl r7, r9, #16\n\t"
  22645. "lsr r6, r6, #16\n\t"
  22646. "lsr r7, r7, #16\n\t"
  22647. "mul r7, r6, r7\n\t"
  22648. "adds r4, r4, r7\n\t"
  22649. "adcs r5, r5, #0\n\t"
  22650. "adc r3, r3, #0\n\t"
  22651. "lsr r7, r9, #16\n\t"
  22652. "mul r6, r7, r6\n\t"
  22653. "lsr r7, r6, #16\n\t"
  22654. "lsl r6, r6, #16\n\t"
  22655. "adds r4, r4, r6\n\t"
  22656. "adcs r5, r5, r7\n\t"
  22657. "adc r3, r3, #0\n\t"
  22658. "lsr r6, r8, #16\n\t"
  22659. "lsr r7, r9, #16\n\t"
  22660. "mul r7, r6, r7\n\t"
  22661. "adds r5, r5, r7\n\t"
  22662. "adc r3, r3, #0\n\t"
  22663. "lsl r7, r9, #16\n\t"
  22664. "lsr r7, r7, #16\n\t"
  22665. "mul r6, r7, r6\n\t"
  22666. "lsr r7, r6, #16\n\t"
  22667. "lsl r6, r6, #16\n\t"
  22668. "adds r4, r4, r6\n\t"
  22669. "adcs r5, r5, r7\n\t"
  22670. "adc r3, r3, #0\n\t"
  22671. #else
  22672. "umull r6, r7, r8, r9\n\t"
  22673. "adds r4, r4, r6\n\t"
  22674. "adcs r5, r5, r7\n\t"
  22675. "adc r3, r3, #0\n\t"
  22676. #endif
  22677. /* A[6] * B[10] */
  22678. "ldr r8, [%[a], #24]\n\t"
  22679. "ldr r9, [%[b], #40]\n\t"
  22680. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  22681. "lsl r6, r8, #16\n\t"
  22682. "lsl r7, r9, #16\n\t"
  22683. "lsr r6, r6, #16\n\t"
  22684. "lsr r7, r7, #16\n\t"
  22685. "mul r7, r6, r7\n\t"
  22686. "adds r4, r4, r7\n\t"
  22687. "adcs r5, r5, #0\n\t"
  22688. "adc r3, r3, #0\n\t"
  22689. "lsr r7, r9, #16\n\t"
  22690. "mul r6, r7, r6\n\t"
  22691. "lsr r7, r6, #16\n\t"
  22692. "lsl r6, r6, #16\n\t"
  22693. "adds r4, r4, r6\n\t"
  22694. "adcs r5, r5, r7\n\t"
  22695. "adc r3, r3, #0\n\t"
  22696. "lsr r6, r8, #16\n\t"
  22697. "lsr r7, r9, #16\n\t"
  22698. "mul r7, r6, r7\n\t"
  22699. "adds r5, r5, r7\n\t"
  22700. "adc r3, r3, #0\n\t"
  22701. "lsl r7, r9, #16\n\t"
  22702. "lsr r7, r7, #16\n\t"
  22703. "mul r6, r7, r6\n\t"
  22704. "lsr r7, r6, #16\n\t"
  22705. "lsl r6, r6, #16\n\t"
  22706. "adds r4, r4, r6\n\t"
  22707. "adcs r5, r5, r7\n\t"
  22708. "adc r3, r3, #0\n\t"
  22709. #else
  22710. "umull r6, r7, r8, r9\n\t"
  22711. "adds r4, r4, r6\n\t"
  22712. "adcs r5, r5, r7\n\t"
  22713. "adc r3, r3, #0\n\t"
  22714. #endif
  22715. /* A[5] * B[11] */
  22716. "ldr r8, [%[a], #20]\n\t"
  22717. "ldr r9, [%[b], #44]\n\t"
  22718. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  22719. "lsl r6, r8, #16\n\t"
  22720. "lsl r7, r9, #16\n\t"
  22721. "lsr r6, r6, #16\n\t"
  22722. "lsr r7, r7, #16\n\t"
  22723. "mul r7, r6, r7\n\t"
  22724. "adds r4, r4, r7\n\t"
  22725. "adcs r5, r5, #0\n\t"
  22726. "adc r3, r3, #0\n\t"
  22727. "lsr r7, r9, #16\n\t"
  22728. "mul r6, r7, r6\n\t"
  22729. "lsr r7, r6, #16\n\t"
  22730. "lsl r6, r6, #16\n\t"
  22731. "adds r4, r4, r6\n\t"
  22732. "adcs r5, r5, r7\n\t"
  22733. "adc r3, r3, #0\n\t"
  22734. "lsr r6, r8, #16\n\t"
  22735. "lsr r7, r9, #16\n\t"
  22736. "mul r7, r6, r7\n\t"
  22737. "adds r5, r5, r7\n\t"
  22738. "adc r3, r3, #0\n\t"
  22739. "lsl r7, r9, #16\n\t"
  22740. "lsr r7, r7, #16\n\t"
  22741. "mul r6, r7, r6\n\t"
  22742. "lsr r7, r6, #16\n\t"
  22743. "lsl r6, r6, #16\n\t"
  22744. "adds r4, r4, r6\n\t"
  22745. "adcs r5, r5, r7\n\t"
  22746. "adc r3, r3, #0\n\t"
  22747. #else
  22748. "umull r6, r7, r8, r9\n\t"
  22749. "adds r4, r4, r6\n\t"
  22750. "adcs r5, r5, r7\n\t"
  22751. "adc r3, r3, #0\n\t"
  22752. #endif
  22753. "str r4, [%[r], #64]\n\t"
  22754. /* A[6] * B[11] */
  22755. "ldr r8, [%[a], #24]\n\t"
  22756. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  22757. "lsl r6, r8, #16\n\t"
  22758. "lsl r7, r9, #16\n\t"
  22759. "lsr r6, r6, #16\n\t"
  22760. "lsr r7, r7, #16\n\t"
  22761. "mul r7, r6, r7\n\t"
  22762. "adds r5, r5, r7\n\t"
  22763. "adcs r3, r3, #0\n\t"
  22764. "mov r4, #0\n\t"
  22765. "adc r4, r4, #0\n\t"
  22766. "lsr r7, r9, #16\n\t"
  22767. "mul r6, r7, r6\n\t"
  22768. "lsr r7, r6, #16\n\t"
  22769. "lsl r6, r6, #16\n\t"
  22770. "adds r5, r5, r6\n\t"
  22771. "adcs r3, r3, r7\n\t"
  22772. "adc r4, r4, #0\n\t"
  22773. "lsr r6, r8, #16\n\t"
  22774. "lsr r7, r9, #16\n\t"
  22775. "mul r7, r6, r7\n\t"
  22776. "adds r3, r3, r7\n\t"
  22777. "adc r4, r4, #0\n\t"
  22778. "lsl r7, r9, #16\n\t"
  22779. "lsr r7, r7, #16\n\t"
  22780. "mul r6, r7, r6\n\t"
  22781. "lsr r7, r6, #16\n\t"
  22782. "lsl r6, r6, #16\n\t"
  22783. "adds r5, r5, r6\n\t"
  22784. "adcs r3, r3, r7\n\t"
  22785. "adc r4, r4, #0\n\t"
  22786. #else
  22787. "umull r6, r7, r8, r9\n\t"
  22788. "adds r5, r5, r6\n\t"
  22789. "adcs r3, r3, r7\n\t"
  22790. "mov r4, #0\n\t"
  22791. "adc r4, r4, #0\n\t"
  22792. #endif
  22793. /* A[7] * B[10] */
  22794. "ldr r8, [%[a], #28]\n\t"
  22795. "ldr r9, [%[b], #40]\n\t"
  22796. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  22797. "lsl r6, r8, #16\n\t"
  22798. "lsl r7, r9, #16\n\t"
  22799. "lsr r6, r6, #16\n\t"
  22800. "lsr r7, r7, #16\n\t"
  22801. "mul r7, r6, r7\n\t"
  22802. "adds r5, r5, r7\n\t"
  22803. "adcs r3, r3, #0\n\t"
  22804. "adc r4, r4, #0\n\t"
  22805. "lsr r7, r9, #16\n\t"
  22806. "mul r6, r7, r6\n\t"
  22807. "lsr r7, r6, #16\n\t"
  22808. "lsl r6, r6, #16\n\t"
  22809. "adds r5, r5, r6\n\t"
  22810. "adcs r3, r3, r7\n\t"
  22811. "adc r4, r4, #0\n\t"
  22812. "lsr r6, r8, #16\n\t"
  22813. "lsr r7, r9, #16\n\t"
  22814. "mul r7, r6, r7\n\t"
  22815. "adds r3, r3, r7\n\t"
  22816. "adc r4, r4, #0\n\t"
  22817. "lsl r7, r9, #16\n\t"
  22818. "lsr r7, r7, #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 r5, r5, r6\n\t"
  22823. "adcs r3, r3, r7\n\t"
  22824. "adc r4, r4, #0\n\t"
  22825. #else
  22826. "umull r6, r7, r8, r9\n\t"
  22827. "adds r5, r5, r6\n\t"
  22828. "adcs r3, r3, r7\n\t"
  22829. "adc r4, r4, #0\n\t"
  22830. #endif
  22831. /* A[8] * B[9] */
  22832. "ldr r9, [%[b], #36]\n\t"
  22833. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  22834. "lsl r6, r11, #16\n\t"
  22835. "lsl r7, r9, #16\n\t"
  22836. "lsr r6, r6, #16\n\t"
  22837. "lsr r7, r7, #16\n\t"
  22838. "mul r7, r6, r7\n\t"
  22839. "adds r5, r5, r7\n\t"
  22840. "adcs r3, r3, #0\n\t"
  22841. "adc r4, r4, #0\n\t"
  22842. "lsr r7, r9, #16\n\t"
  22843. "mul r6, r7, r6\n\t"
  22844. "lsr r7, r6, #16\n\t"
  22845. "lsl r6, r6, #16\n\t"
  22846. "adds r5, r5, r6\n\t"
  22847. "adcs r3, r3, r7\n\t"
  22848. "adc r4, r4, #0\n\t"
  22849. "lsr r6, r11, #16\n\t"
  22850. "lsr r7, r9, #16\n\t"
  22851. "mul r7, r6, r7\n\t"
  22852. "adds r3, r3, r7\n\t"
  22853. "adc r4, r4, #0\n\t"
  22854. "lsl r7, r9, #16\n\t"
  22855. "lsr r7, r7, #16\n\t"
  22856. "mul r6, r7, r6\n\t"
  22857. "lsr r7, r6, #16\n\t"
  22858. "lsl r6, r6, #16\n\t"
  22859. "adds r5, r5, r6\n\t"
  22860. "adcs r3, r3, r7\n\t"
  22861. "adc r4, r4, #0\n\t"
  22862. #else
  22863. "umull r6, r7, r11, r9\n\t"
  22864. "adds r5, r5, r6\n\t"
  22865. "adcs r3, r3, r7\n\t"
  22866. "adc r4, r4, #0\n\t"
  22867. #endif
  22868. /* A[9] * B[8] */
  22869. "ldr r8, [%[a], #36]\n\t"
  22870. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  22871. "lsl r6, r8, #16\n\t"
  22872. "lsl r7, r12, #16\n\t"
  22873. "lsr r6, r6, #16\n\t"
  22874. "lsr r7, r7, #16\n\t"
  22875. "mul r7, r6, r7\n\t"
  22876. "adds r5, r5, r7\n\t"
  22877. "adcs r3, r3, #0\n\t"
  22878. "adc r4, r4, #0\n\t"
  22879. "lsr r7, r12, #16\n\t"
  22880. "mul r6, r7, r6\n\t"
  22881. "lsr r7, r6, #16\n\t"
  22882. "lsl r6, r6, #16\n\t"
  22883. "adds r5, r5, r6\n\t"
  22884. "adcs r3, r3, r7\n\t"
  22885. "adc r4, r4, #0\n\t"
  22886. "lsr r6, r8, #16\n\t"
  22887. "lsr r7, r12, #16\n\t"
  22888. "mul r7, r6, r7\n\t"
  22889. "adds r3, r3, r7\n\t"
  22890. "adc r4, r4, #0\n\t"
  22891. "lsl r7, r12, #16\n\t"
  22892. "lsr r7, r7, #16\n\t"
  22893. "mul r6, r7, r6\n\t"
  22894. "lsr r7, r6, #16\n\t"
  22895. "lsl r6, r6, #16\n\t"
  22896. "adds r5, r5, r6\n\t"
  22897. "adcs r3, r3, r7\n\t"
  22898. "adc r4, r4, #0\n\t"
  22899. #else
  22900. "umull r6, r7, r8, r12\n\t"
  22901. "adds r5, r5, r6\n\t"
  22902. "adcs r3, r3, r7\n\t"
  22903. "adc r4, r4, #0\n\t"
  22904. #endif
  22905. /* A[10] * B[7] */
  22906. "ldr r8, [%[a], #40]\n\t"
  22907. "ldr r9, [%[b], #28]\n\t"
  22908. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  22909. "lsl r6, r8, #16\n\t"
  22910. "lsl r7, r9, #16\n\t"
  22911. "lsr r6, r6, #16\n\t"
  22912. "lsr r7, r7, #16\n\t"
  22913. "mul r7, r6, r7\n\t"
  22914. "adds r5, r5, r7\n\t"
  22915. "adcs r3, r3, #0\n\t"
  22916. "adc r4, r4, #0\n\t"
  22917. "lsr r7, r9, #16\n\t"
  22918. "mul r6, r7, r6\n\t"
  22919. "lsr r7, r6, #16\n\t"
  22920. "lsl r6, r6, #16\n\t"
  22921. "adds r5, r5, r6\n\t"
  22922. "adcs r3, r3, r7\n\t"
  22923. "adc r4, r4, #0\n\t"
  22924. "lsr r6, r8, #16\n\t"
  22925. "lsr r7, r9, #16\n\t"
  22926. "mul r7, r6, r7\n\t"
  22927. "adds r3, r3, r7\n\t"
  22928. "adc r4, r4, #0\n\t"
  22929. "lsl r7, r9, #16\n\t"
  22930. "lsr r7, r7, #16\n\t"
  22931. "mul r6, r7, r6\n\t"
  22932. "lsr r7, r6, #16\n\t"
  22933. "lsl r6, r6, #16\n\t"
  22934. "adds r5, r5, r6\n\t"
  22935. "adcs r3, r3, r7\n\t"
  22936. "adc r4, r4, #0\n\t"
  22937. #else
  22938. "umull r6, r7, r8, r9\n\t"
  22939. "adds r5, r5, r6\n\t"
  22940. "adcs r3, r3, r7\n\t"
  22941. "adc r4, r4, #0\n\t"
  22942. #endif
  22943. /* A[11] * B[6] */
  22944. "ldr r8, [%[a], #44]\n\t"
  22945. "ldr r9, [%[b], #24]\n\t"
  22946. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  22947. "lsl r6, r8, #16\n\t"
  22948. "lsl r7, r9, #16\n\t"
  22949. "lsr r6, r6, #16\n\t"
  22950. "lsr r7, r7, #16\n\t"
  22951. "mul r7, r6, r7\n\t"
  22952. "adds r5, r5, r7\n\t"
  22953. "adcs r3, r3, #0\n\t"
  22954. "adc r4, r4, #0\n\t"
  22955. "lsr r7, r9, #16\n\t"
  22956. "mul r6, r7, r6\n\t"
  22957. "lsr r7, r6, #16\n\t"
  22958. "lsl r6, r6, #16\n\t"
  22959. "adds r5, r5, r6\n\t"
  22960. "adcs r3, r3, r7\n\t"
  22961. "adc r4, r4, #0\n\t"
  22962. "lsr r6, r8, #16\n\t"
  22963. "lsr r7, r9, #16\n\t"
  22964. "mul r7, r6, r7\n\t"
  22965. "adds r3, r3, r7\n\t"
  22966. "adc r4, r4, #0\n\t"
  22967. "lsl r7, r9, #16\n\t"
  22968. "lsr r7, r7, #16\n\t"
  22969. "mul r6, r7, r6\n\t"
  22970. "lsr r7, r6, #16\n\t"
  22971. "lsl r6, r6, #16\n\t"
  22972. "adds r5, r5, r6\n\t"
  22973. "adcs r3, r3, r7\n\t"
  22974. "adc r4, r4, #0\n\t"
  22975. #else
  22976. "umull r6, r7, r8, r9\n\t"
  22977. "adds r5, r5, r6\n\t"
  22978. "adcs r3, r3, r7\n\t"
  22979. "adc r4, r4, #0\n\t"
  22980. #endif
  22981. "str r5, [%[r], #68]\n\t"
  22982. /* A[11] * B[7] */
  22983. "ldr r9, [%[b], #28]\n\t"
  22984. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  22985. "lsl r6, r8, #16\n\t"
  22986. "lsl r7, r9, #16\n\t"
  22987. "lsr r6, r6, #16\n\t"
  22988. "lsr r7, r7, #16\n\t"
  22989. "mul r7, r6, r7\n\t"
  22990. "adds r3, r3, r7\n\t"
  22991. "adcs r4, r4, #0\n\t"
  22992. "mov r5, #0\n\t"
  22993. "adc r5, r5, #0\n\t"
  22994. "lsr r7, r9, #16\n\t"
  22995. "mul r6, r7, r6\n\t"
  22996. "lsr r7, r6, #16\n\t"
  22997. "lsl r6, r6, #16\n\t"
  22998. "adds r3, r3, r6\n\t"
  22999. "adcs r4, r4, r7\n\t"
  23000. "adc r5, r5, #0\n\t"
  23001. "lsr r6, r8, #16\n\t"
  23002. "lsr r7, r9, #16\n\t"
  23003. "mul r7, r6, r7\n\t"
  23004. "adds r4, r4, r7\n\t"
  23005. "adc r5, r5, #0\n\t"
  23006. "lsl r7, r9, #16\n\t"
  23007. "lsr r7, r7, #16\n\t"
  23008. "mul r6, r7, r6\n\t"
  23009. "lsr r7, r6, #16\n\t"
  23010. "lsl r6, r6, #16\n\t"
  23011. "adds r3, r3, r6\n\t"
  23012. "adcs r4, r4, r7\n\t"
  23013. "adc r5, r5, #0\n\t"
  23014. #else
  23015. "umull r6, r7, r8, r9\n\t"
  23016. "adds r3, r3, r6\n\t"
  23017. "adcs r4, r4, r7\n\t"
  23018. "mov r5, #0\n\t"
  23019. "adc r5, r5, #0\n\t"
  23020. #endif
  23021. /* A[10] * B[8] */
  23022. "ldr r8, [%[a], #40]\n\t"
  23023. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  23024. "lsl r6, r8, #16\n\t"
  23025. "lsl r7, r12, #16\n\t"
  23026. "lsr r6, r6, #16\n\t"
  23027. "lsr r7, r7, #16\n\t"
  23028. "mul r7, r6, r7\n\t"
  23029. "adds r3, r3, r7\n\t"
  23030. "adcs r4, r4, #0\n\t"
  23031. "adc r5, r5, #0\n\t"
  23032. "lsr r7, r12, #16\n\t"
  23033. "mul r6, r7, r6\n\t"
  23034. "lsr r7, r6, #16\n\t"
  23035. "lsl r6, r6, #16\n\t"
  23036. "adds r3, r3, r6\n\t"
  23037. "adcs r4, r4, r7\n\t"
  23038. "adc r5, r5, #0\n\t"
  23039. "lsr r6, r8, #16\n\t"
  23040. "lsr r7, r12, #16\n\t"
  23041. "mul r7, r6, r7\n\t"
  23042. "adds r4, r4, r7\n\t"
  23043. "adc r5, r5, #0\n\t"
  23044. "lsl r7, r12, #16\n\t"
  23045. "lsr r7, r7, #16\n\t"
  23046. "mul r6, r7, r6\n\t"
  23047. "lsr r7, r6, #16\n\t"
  23048. "lsl r6, r6, #16\n\t"
  23049. "adds r3, r3, r6\n\t"
  23050. "adcs r4, r4, r7\n\t"
  23051. "adc r5, r5, #0\n\t"
  23052. #else
  23053. "umull r6, r7, r8, r12\n\t"
  23054. "adds r3, r3, r6\n\t"
  23055. "adcs r4, r4, r7\n\t"
  23056. "adc r5, r5, #0\n\t"
  23057. #endif
  23058. /* A[9] * B[9] */
  23059. "ldr r11, [%[a], #36]\n\t"
  23060. "ldr r12, [%[b], #36]\n\t"
  23061. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  23062. "lsl r6, r11, #16\n\t"
  23063. "lsl r7, r12, #16\n\t"
  23064. "lsr r6, r6, #16\n\t"
  23065. "lsr r7, r7, #16\n\t"
  23066. "mul r7, r6, r7\n\t"
  23067. "adds r3, r3, r7\n\t"
  23068. "adcs r4, r4, #0\n\t"
  23069. "adc r5, r5, #0\n\t"
  23070. "lsr r7, r12, #16\n\t"
  23071. "mul r6, r7, r6\n\t"
  23072. "lsr r7, r6, #16\n\t"
  23073. "lsl r6, r6, #16\n\t"
  23074. "adds r3, r3, r6\n\t"
  23075. "adcs r4, r4, r7\n\t"
  23076. "adc r5, r5, #0\n\t"
  23077. "lsr r6, r11, #16\n\t"
  23078. "lsr r7, r12, #16\n\t"
  23079. "mul r7, r6, r7\n\t"
  23080. "adds r4, r4, r7\n\t"
  23081. "adc r5, r5, #0\n\t"
  23082. "lsl r7, r12, #16\n\t"
  23083. "lsr r7, r7, #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 r3, r3, r6\n\t"
  23088. "adcs r4, r4, r7\n\t"
  23089. "adc r5, r5, #0\n\t"
  23090. #else
  23091. "umull r6, r7, r11, r12\n\t"
  23092. "adds r3, r3, r6\n\t"
  23093. "adcs r4, r4, r7\n\t"
  23094. "adc r5, r5, #0\n\t"
  23095. #endif
  23096. /* A[8] * B[10] */
  23097. "ldr r8, [%[a], #32]\n\t"
  23098. "ldr r9, [%[b], #40]\n\t"
  23099. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  23100. "lsl r6, r8, #16\n\t"
  23101. "lsl r7, r9, #16\n\t"
  23102. "lsr r6, r6, #16\n\t"
  23103. "lsr r7, r7, #16\n\t"
  23104. "mul r7, r6, r7\n\t"
  23105. "adds r3, r3, r7\n\t"
  23106. "adcs r4, r4, #0\n\t"
  23107. "adc r5, r5, #0\n\t"
  23108. "lsr r7, r9, #16\n\t"
  23109. "mul r6, r7, r6\n\t"
  23110. "lsr r7, r6, #16\n\t"
  23111. "lsl r6, r6, #16\n\t"
  23112. "adds r3, r3, r6\n\t"
  23113. "adcs r4, r4, r7\n\t"
  23114. "adc r5, r5, #0\n\t"
  23115. "lsr r6, r8, #16\n\t"
  23116. "lsr r7, r9, #16\n\t"
  23117. "mul r7, r6, r7\n\t"
  23118. "adds r4, r4, r7\n\t"
  23119. "adc r5, r5, #0\n\t"
  23120. "lsl r7, r9, #16\n\t"
  23121. "lsr r7, r7, #16\n\t"
  23122. "mul r6, r7, r6\n\t"
  23123. "lsr r7, r6, #16\n\t"
  23124. "lsl r6, r6, #16\n\t"
  23125. "adds r3, r3, r6\n\t"
  23126. "adcs r4, r4, r7\n\t"
  23127. "adc r5, r5, #0\n\t"
  23128. #else
  23129. "umull r6, r7, r8, r9\n\t"
  23130. "adds r3, r3, r6\n\t"
  23131. "adcs r4, r4, r7\n\t"
  23132. "adc r5, r5, #0\n\t"
  23133. #endif
  23134. /* A[7] * B[11] */
  23135. "ldr r8, [%[a], #28]\n\t"
  23136. "ldr r9, [%[b], #44]\n\t"
  23137. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  23138. "lsl r6, r8, #16\n\t"
  23139. "lsl r7, r9, #16\n\t"
  23140. "lsr r6, r6, #16\n\t"
  23141. "lsr r7, r7, #16\n\t"
  23142. "mul r7, r6, r7\n\t"
  23143. "adds r3, r3, r7\n\t"
  23144. "adcs r4, r4, #0\n\t"
  23145. "adc r5, r5, #0\n\t"
  23146. "lsr r7, r9, #16\n\t"
  23147. "mul r6, r7, r6\n\t"
  23148. "lsr r7, r6, #16\n\t"
  23149. "lsl r6, r6, #16\n\t"
  23150. "adds r3, r3, r6\n\t"
  23151. "adcs r4, r4, r7\n\t"
  23152. "adc r5, r5, #0\n\t"
  23153. "lsr r6, r8, #16\n\t"
  23154. "lsr r7, r9, #16\n\t"
  23155. "mul r7, r6, r7\n\t"
  23156. "adds r4, r4, r7\n\t"
  23157. "adc r5, r5, #0\n\t"
  23158. "lsl r7, r9, #16\n\t"
  23159. "lsr r7, r7, #16\n\t"
  23160. "mul r6, r7, r6\n\t"
  23161. "lsr r7, r6, #16\n\t"
  23162. "lsl r6, r6, #16\n\t"
  23163. "adds r3, r3, r6\n\t"
  23164. "adcs r4, r4, r7\n\t"
  23165. "adc r5, r5, #0\n\t"
  23166. #else
  23167. "umull r6, r7, r8, r9\n\t"
  23168. "adds r3, r3, r6\n\t"
  23169. "adcs r4, r4, r7\n\t"
  23170. "adc r5, r5, #0\n\t"
  23171. #endif
  23172. "str r3, [%[r], #72]\n\t"
  23173. /* A[8] * B[11] */
  23174. "ldr r8, [%[a], #32]\n\t"
  23175. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  23176. "lsl r6, r8, #16\n\t"
  23177. "lsl r7, r9, #16\n\t"
  23178. "lsr r6, r6, #16\n\t"
  23179. "lsr r7, r7, #16\n\t"
  23180. "mul r7, r6, r7\n\t"
  23181. "adds r4, r4, r7\n\t"
  23182. "adcs r5, r5, #0\n\t"
  23183. "mov r3, #0\n\t"
  23184. "adc r3, r3, #0\n\t"
  23185. "lsr r7, r9, #16\n\t"
  23186. "mul r6, r7, r6\n\t"
  23187. "lsr r7, r6, #16\n\t"
  23188. "lsl r6, r6, #16\n\t"
  23189. "adds r4, r4, r6\n\t"
  23190. "adcs r5, r5, r7\n\t"
  23191. "adc r3, r3, #0\n\t"
  23192. "lsr r6, r8, #16\n\t"
  23193. "lsr r7, r9, #16\n\t"
  23194. "mul r7, r6, r7\n\t"
  23195. "adds r5, r5, r7\n\t"
  23196. "adc r3, r3, #0\n\t"
  23197. "lsl r7, r9, #16\n\t"
  23198. "lsr r7, r7, #16\n\t"
  23199. "mul r6, r7, r6\n\t"
  23200. "lsr r7, r6, #16\n\t"
  23201. "lsl r6, r6, #16\n\t"
  23202. "adds r4, r4, r6\n\t"
  23203. "adcs r5, r5, r7\n\t"
  23204. "adc r3, r3, #0\n\t"
  23205. #else
  23206. "umull r6, r7, r8, r9\n\t"
  23207. "adds r4, r4, r6\n\t"
  23208. "adcs r5, r5, r7\n\t"
  23209. "mov r3, #0\n\t"
  23210. "adc r3, r3, #0\n\t"
  23211. #endif
  23212. /* A[9] * B[10] */
  23213. "ldr r9, [%[b], #40]\n\t"
  23214. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  23215. "lsl r6, r11, #16\n\t"
  23216. "lsl r7, r9, #16\n\t"
  23217. "lsr r6, r6, #16\n\t"
  23218. "lsr r7, r7, #16\n\t"
  23219. "mul r7, r6, r7\n\t"
  23220. "adds r4, r4, r7\n\t"
  23221. "adcs r5, r5, #0\n\t"
  23222. "adc r3, r3, #0\n\t"
  23223. "lsr r7, r9, #16\n\t"
  23224. "mul r6, r7, r6\n\t"
  23225. "lsr r7, r6, #16\n\t"
  23226. "lsl r6, r6, #16\n\t"
  23227. "adds r4, r4, r6\n\t"
  23228. "adcs r5, r5, r7\n\t"
  23229. "adc r3, r3, #0\n\t"
  23230. "lsr r6, r11, #16\n\t"
  23231. "lsr r7, r9, #16\n\t"
  23232. "mul r7, r6, r7\n\t"
  23233. "adds r5, r5, r7\n\t"
  23234. "adc r3, r3, #0\n\t"
  23235. "lsl r7, r9, #16\n\t"
  23236. "lsr r7, r7, #16\n\t"
  23237. "mul r6, r7, r6\n\t"
  23238. "lsr r7, r6, #16\n\t"
  23239. "lsl r6, r6, #16\n\t"
  23240. "adds r4, r4, r6\n\t"
  23241. "adcs r5, r5, r7\n\t"
  23242. "adc r3, r3, #0\n\t"
  23243. #else
  23244. "umull r6, r7, r11, r9\n\t"
  23245. "adds r4, r4, r6\n\t"
  23246. "adcs r5, r5, r7\n\t"
  23247. "adc r3, r3, #0\n\t"
  23248. #endif
  23249. /* A[10] * B[9] */
  23250. "ldr r8, [%[a], #40]\n\t"
  23251. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  23252. "lsl r6, r8, #16\n\t"
  23253. "lsl r7, r12, #16\n\t"
  23254. "lsr r6, r6, #16\n\t"
  23255. "lsr r7, r7, #16\n\t"
  23256. "mul r7, r6, r7\n\t"
  23257. "adds r4, r4, r7\n\t"
  23258. "adcs r5, r5, #0\n\t"
  23259. "adc r3, r3, #0\n\t"
  23260. "lsr r7, r12, #16\n\t"
  23261. "mul r6, r7, r6\n\t"
  23262. "lsr r7, r6, #16\n\t"
  23263. "lsl r6, r6, #16\n\t"
  23264. "adds r4, r4, r6\n\t"
  23265. "adcs r5, r5, r7\n\t"
  23266. "adc r3, r3, #0\n\t"
  23267. "lsr r6, r8, #16\n\t"
  23268. "lsr r7, r12, #16\n\t"
  23269. "mul r7, r6, r7\n\t"
  23270. "adds r5, r5, r7\n\t"
  23271. "adc r3, r3, #0\n\t"
  23272. "lsl r7, r12, #16\n\t"
  23273. "lsr r7, r7, #16\n\t"
  23274. "mul r6, r7, r6\n\t"
  23275. "lsr r7, r6, #16\n\t"
  23276. "lsl r6, r6, #16\n\t"
  23277. "adds r4, r4, r6\n\t"
  23278. "adcs r5, r5, r7\n\t"
  23279. "adc r3, r3, #0\n\t"
  23280. #else
  23281. "umull r6, r7, r8, r12\n\t"
  23282. "adds r4, r4, r6\n\t"
  23283. "adcs r5, r5, r7\n\t"
  23284. "adc r3, r3, #0\n\t"
  23285. #endif
  23286. /* A[11] * B[8] */
  23287. "ldr r8, [%[a], #44]\n\t"
  23288. "ldr r9, [%[b], #32]\n\t"
  23289. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  23290. "lsl r6, r8, #16\n\t"
  23291. "lsl r7, r9, #16\n\t"
  23292. "lsr r6, r6, #16\n\t"
  23293. "lsr r7, r7, #16\n\t"
  23294. "mul r7, r6, r7\n\t"
  23295. "adds r4, r4, r7\n\t"
  23296. "adcs r5, r5, #0\n\t"
  23297. "adc r3, r3, #0\n\t"
  23298. "lsr r7, r9, #16\n\t"
  23299. "mul r6, r7, r6\n\t"
  23300. "lsr r7, r6, #16\n\t"
  23301. "lsl r6, r6, #16\n\t"
  23302. "adds r4, r4, r6\n\t"
  23303. "adcs r5, r5, r7\n\t"
  23304. "adc r3, r3, #0\n\t"
  23305. "lsr r6, r8, #16\n\t"
  23306. "lsr r7, r9, #16\n\t"
  23307. "mul r7, r6, r7\n\t"
  23308. "adds r5, r5, r7\n\t"
  23309. "adc r3, r3, #0\n\t"
  23310. "lsl r7, r9, #16\n\t"
  23311. "lsr r7, r7, #16\n\t"
  23312. "mul r6, r7, r6\n\t"
  23313. "lsr r7, r6, #16\n\t"
  23314. "lsl r6, r6, #16\n\t"
  23315. "adds r4, r4, r6\n\t"
  23316. "adcs r5, r5, r7\n\t"
  23317. "adc r3, r3, #0\n\t"
  23318. #else
  23319. "umull r6, r7, r8, r9\n\t"
  23320. "adds r4, r4, r6\n\t"
  23321. "adcs r5, r5, r7\n\t"
  23322. "adc r3, r3, #0\n\t"
  23323. #endif
  23324. "str r4, [%[r], #76]\n\t"
  23325. /* A[11] * B[9] */
  23326. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  23327. "lsl r6, r8, #16\n\t"
  23328. "lsl r7, r12, #16\n\t"
  23329. "lsr r6, r6, #16\n\t"
  23330. "lsr r7, r7, #16\n\t"
  23331. "mul r7, r6, r7\n\t"
  23332. "adds r5, r5, r7\n\t"
  23333. "adcs r3, r3, #0\n\t"
  23334. "mov r4, #0\n\t"
  23335. "adc r4, r4, #0\n\t"
  23336. "lsr r7, r12, #16\n\t"
  23337. "mul r6, r7, r6\n\t"
  23338. "lsr r7, r6, #16\n\t"
  23339. "lsl r6, r6, #16\n\t"
  23340. "adds r5, r5, r6\n\t"
  23341. "adcs r3, r3, r7\n\t"
  23342. "adc r4, r4, #0\n\t"
  23343. "lsr r6, r8, #16\n\t"
  23344. "lsr r7, r12, #16\n\t"
  23345. "mul r7, r6, r7\n\t"
  23346. "adds r3, r3, r7\n\t"
  23347. "adc r4, r4, #0\n\t"
  23348. "lsl r7, r12, #16\n\t"
  23349. "lsr r7, r7, #16\n\t"
  23350. "mul r6, r7, r6\n\t"
  23351. "lsr r7, r6, #16\n\t"
  23352. "lsl r6, r6, #16\n\t"
  23353. "adds r5, r5, r6\n\t"
  23354. "adcs r3, r3, r7\n\t"
  23355. "adc r4, r4, #0\n\t"
  23356. #else
  23357. "umull r6, r7, r8, r12\n\t"
  23358. "adds r5, r5, r6\n\t"
  23359. "adcs r3, r3, r7\n\t"
  23360. "mov r4, #0\n\t"
  23361. "adc r4, r4, #0\n\t"
  23362. #endif
  23363. /* A[10] * B[10] */
  23364. "ldr r11, [%[a], #40]\n\t"
  23365. "ldr r12, [%[b], #40]\n\t"
  23366. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  23367. "lsl r6, r11, #16\n\t"
  23368. "lsl r7, r12, #16\n\t"
  23369. "lsr r6, r6, #16\n\t"
  23370. "lsr r7, r7, #16\n\t"
  23371. "mul r7, r6, r7\n\t"
  23372. "adds r5, r5, r7\n\t"
  23373. "adcs r3, r3, #0\n\t"
  23374. "adc r4, r4, #0\n\t"
  23375. "lsr r7, r12, #16\n\t"
  23376. "mul r6, r7, r6\n\t"
  23377. "lsr r7, r6, #16\n\t"
  23378. "lsl r6, r6, #16\n\t"
  23379. "adds r5, r5, r6\n\t"
  23380. "adcs r3, r3, r7\n\t"
  23381. "adc r4, r4, #0\n\t"
  23382. "lsr r6, r11, #16\n\t"
  23383. "lsr r7, r12, #16\n\t"
  23384. "mul r7, r6, r7\n\t"
  23385. "adds r3, r3, r7\n\t"
  23386. "adc r4, r4, #0\n\t"
  23387. "lsl r7, r12, #16\n\t"
  23388. "lsr r7, r7, #16\n\t"
  23389. "mul r6, r7, r6\n\t"
  23390. "lsr r7, r6, #16\n\t"
  23391. "lsl r6, r6, #16\n\t"
  23392. "adds r5, r5, r6\n\t"
  23393. "adcs r3, r3, r7\n\t"
  23394. "adc r4, r4, #0\n\t"
  23395. #else
  23396. "umull r6, r7, r11, r12\n\t"
  23397. "adds r5, r5, r6\n\t"
  23398. "adcs r3, r3, r7\n\t"
  23399. "adc r4, r4, #0\n\t"
  23400. #endif
  23401. /* A[9] * B[11] */
  23402. "ldr r8, [%[a], #36]\n\t"
  23403. "ldr r9, [%[b], #44]\n\t"
  23404. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  23405. "lsl r6, r8, #16\n\t"
  23406. "lsl r7, r9, #16\n\t"
  23407. "lsr r6, r6, #16\n\t"
  23408. "lsr r7, r7, #16\n\t"
  23409. "mul r7, r6, r7\n\t"
  23410. "adds r5, r5, r7\n\t"
  23411. "adcs r3, r3, #0\n\t"
  23412. "adc r4, r4, #0\n\t"
  23413. "lsr r7, r9, #16\n\t"
  23414. "mul r6, r7, r6\n\t"
  23415. "lsr r7, r6, #16\n\t"
  23416. "lsl r6, r6, #16\n\t"
  23417. "adds r5, r5, r6\n\t"
  23418. "adcs r3, r3, r7\n\t"
  23419. "adc r4, r4, #0\n\t"
  23420. "lsr r6, r8, #16\n\t"
  23421. "lsr r7, r9, #16\n\t"
  23422. "mul r7, r6, r7\n\t"
  23423. "adds r3, r3, r7\n\t"
  23424. "adc r4, r4, #0\n\t"
  23425. "lsl r7, r9, #16\n\t"
  23426. "lsr r7, r7, #16\n\t"
  23427. "mul r6, r7, r6\n\t"
  23428. "lsr r7, r6, #16\n\t"
  23429. "lsl r6, r6, #16\n\t"
  23430. "adds r5, r5, r6\n\t"
  23431. "adcs r3, r3, r7\n\t"
  23432. "adc r4, r4, #0\n\t"
  23433. #else
  23434. "umull r6, r7, r8, r9\n\t"
  23435. "adds r5, r5, r6\n\t"
  23436. "adcs r3, r3, r7\n\t"
  23437. "adc r4, r4, #0\n\t"
  23438. #endif
  23439. "str r5, [%[r], #80]\n\t"
  23440. /* A[10] * B[11] */
  23441. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  23442. "lsl r6, r11, #16\n\t"
  23443. "lsl r7, r9, #16\n\t"
  23444. "lsr r6, r6, #16\n\t"
  23445. "lsr r7, r7, #16\n\t"
  23446. "mul r7, r6, r7\n\t"
  23447. "adds r3, r3, r7\n\t"
  23448. "adcs r4, r4, #0\n\t"
  23449. "mov r5, #0\n\t"
  23450. "adc r5, r5, #0\n\t"
  23451. "lsr r7, r9, #16\n\t"
  23452. "mul r6, r7, r6\n\t"
  23453. "lsr r7, r6, #16\n\t"
  23454. "lsl r6, r6, #16\n\t"
  23455. "adds r3, r3, r6\n\t"
  23456. "adcs r4, r4, r7\n\t"
  23457. "adc r5, r5, #0\n\t"
  23458. "lsr r6, r11, #16\n\t"
  23459. "lsr r7, r9, #16\n\t"
  23460. "mul r7, r6, r7\n\t"
  23461. "adds r4, r4, r7\n\t"
  23462. "adc r5, r5, #0\n\t"
  23463. "lsl r7, r9, #16\n\t"
  23464. "lsr r7, r7, #16\n\t"
  23465. "mul r6, r7, r6\n\t"
  23466. "lsr r7, r6, #16\n\t"
  23467. "lsl r6, r6, #16\n\t"
  23468. "adds r3, r3, r6\n\t"
  23469. "adcs r4, r4, r7\n\t"
  23470. "adc r5, r5, #0\n\t"
  23471. #else
  23472. "umull r6, r7, r11, r9\n\t"
  23473. "adds r3, r3, r6\n\t"
  23474. "adcs r4, r4, r7\n\t"
  23475. "mov r5, #0\n\t"
  23476. "adc r5, r5, #0\n\t"
  23477. #endif
  23478. /* A[11] * B[10] */
  23479. "ldr r8, [%[a], #44]\n\t"
  23480. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  23481. "lsl r6, r8, #16\n\t"
  23482. "lsl r7, r12, #16\n\t"
  23483. "lsr r6, r6, #16\n\t"
  23484. "lsr r7, r7, #16\n\t"
  23485. "mul r7, r6, r7\n\t"
  23486. "adds r3, r3, r7\n\t"
  23487. "adcs r4, r4, #0\n\t"
  23488. "adc r5, r5, #0\n\t"
  23489. "lsr r7, r12, #16\n\t"
  23490. "mul r6, r7, r6\n\t"
  23491. "lsr r7, r6, #16\n\t"
  23492. "lsl r6, r6, #16\n\t"
  23493. "adds r3, r3, r6\n\t"
  23494. "adcs r4, r4, r7\n\t"
  23495. "adc r5, r5, #0\n\t"
  23496. "lsr r6, r8, #16\n\t"
  23497. "lsr r7, r12, #16\n\t"
  23498. "mul r7, r6, r7\n\t"
  23499. "adds r4, r4, r7\n\t"
  23500. "adc r5, r5, #0\n\t"
  23501. "lsl r7, r12, #16\n\t"
  23502. "lsr r7, r7, #16\n\t"
  23503. "mul r6, r7, r6\n\t"
  23504. "lsr r7, r6, #16\n\t"
  23505. "lsl r6, r6, #16\n\t"
  23506. "adds r3, r3, r6\n\t"
  23507. "adcs r4, r4, r7\n\t"
  23508. "adc r5, r5, #0\n\t"
  23509. #else
  23510. "umull r6, r7, r8, r12\n\t"
  23511. "adds r3, r3, r6\n\t"
  23512. "adcs r4, r4, r7\n\t"
  23513. "adc r5, r5, #0\n\t"
  23514. #endif
  23515. "str r3, [%[r], #84]\n\t"
  23516. /* A[11] * B[11] */
  23517. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  23518. "lsl r6, r8, #16\n\t"
  23519. "lsl r7, r9, #16\n\t"
  23520. "lsr r6, r6, #16\n\t"
  23521. "lsr r7, r7, #16\n\t"
  23522. "mul r7, r6, r7\n\t"
  23523. "adds r4, r4, r7\n\t"
  23524. "adc r5, r5, #0\n\t"
  23525. "lsr r7, r9, #16\n\t"
  23526. "mul r6, r7, r6\n\t"
  23527. "lsr r7, r6, #16\n\t"
  23528. "lsl r6, r6, #16\n\t"
  23529. "adds r4, r4, r6\n\t"
  23530. "adc r5, r5, r7\n\t"
  23531. "lsr r6, r8, #16\n\t"
  23532. "lsr r7, r9, #16\n\t"
  23533. "mul r7, r6, r7\n\t"
  23534. "add r5, r5, r7\n\t"
  23535. "lsl r7, r9, #16\n\t"
  23536. "lsr r7, r7, #16\n\t"
  23537. "mul r6, r7, r6\n\t"
  23538. "lsr r7, r6, #16\n\t"
  23539. "lsl r6, r6, #16\n\t"
  23540. "adds r4, r4, r6\n\t"
  23541. "adc r5, r5, r7\n\t"
  23542. #else
  23543. "umlal r4, r5, r8, r9\n\t"
  23544. #endif
  23545. "str r4, [%[r], #88]\n\t"
  23546. "str r5, [%[r], #92]\n\t"
  23547. "ldm sp!, {r3, r4, r5, r6}\n\t"
  23548. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  23549. "ldm sp!, {r3, r4, r5, r6}\n\t"
  23550. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  23551. "ldm sp!, {r3, r4, r5, r6}\n\t"
  23552. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  23553. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  23554. :
  23555. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r11", "r12", "cc"
  23556. );
  23557. }
  23558. /* Add b to a into r. (r = a + b)
  23559. *
  23560. * r A single precision integer.
  23561. * a A single precision integer.
  23562. * b A single precision integer.
  23563. */
  23564. static sp_digit sp_3072_add_12(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p)
  23565. {
  23566. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  23567. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  23568. register const sp_digit* b asm ("r2") = (const sp_digit*)b_p;
  23569. __asm__ __volatile__ (
  23570. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  23571. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  23572. "adds r3, r3, r7\n\t"
  23573. "adcs r4, r4, r8\n\t"
  23574. "adcs r5, r5, r9\n\t"
  23575. "adcs r6, r6, r10\n\t"
  23576. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  23577. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  23578. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  23579. "adcs r3, r3, r7\n\t"
  23580. "adcs r4, r4, r8\n\t"
  23581. "adcs r5, r5, r9\n\t"
  23582. "adcs r6, r6, r10\n\t"
  23583. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  23584. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  23585. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  23586. "adcs r3, r3, r7\n\t"
  23587. "adcs r4, r4, r8\n\t"
  23588. "adcs r5, r5, r9\n\t"
  23589. "adcs r6, r6, r10\n\t"
  23590. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  23591. "mov %[r], #0\n\t"
  23592. "adc %[r], %[r], #0\n\t"
  23593. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  23594. :
  23595. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "cc"
  23596. );
  23597. return (uint32_t)(size_t)r;
  23598. }
  23599. /* Sub b from a into a. (a -= b)
  23600. *
  23601. * a A single precision integer and result.
  23602. * b A single precision integer.
  23603. */
  23604. static sp_digit sp_3072_sub_in_place_24(sp_digit* a_p, const sp_digit* b_p)
  23605. {
  23606. register sp_digit* a asm ("r0") = (sp_digit*)a_p;
  23607. register const sp_digit* b asm ("r1") = (const sp_digit*)b_p;
  23608. __asm__ __volatile__ (
  23609. "ldm %[a], {r2, r3, r4, r5}\n\t"
  23610. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  23611. "subs r2, r2, r6\n\t"
  23612. "sbcs r3, r3, r7\n\t"
  23613. "sbcs r4, r4, r8\n\t"
  23614. "sbcs r5, r5, r9\n\t"
  23615. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  23616. "ldm %[a], {r2, r3, r4, r5}\n\t"
  23617. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  23618. "sbcs r2, r2, r6\n\t"
  23619. "sbcs r3, r3, r7\n\t"
  23620. "sbcs r4, r4, r8\n\t"
  23621. "sbcs r5, r5, r9\n\t"
  23622. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  23623. "ldm %[a], {r2, r3, r4, r5}\n\t"
  23624. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  23625. "sbcs r2, r2, r6\n\t"
  23626. "sbcs r3, r3, r7\n\t"
  23627. "sbcs r4, r4, r8\n\t"
  23628. "sbcs r5, r5, r9\n\t"
  23629. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  23630. "ldm %[a], {r2, r3, r4, r5}\n\t"
  23631. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  23632. "sbcs r2, r2, r6\n\t"
  23633. "sbcs r3, r3, r7\n\t"
  23634. "sbcs r4, r4, r8\n\t"
  23635. "sbcs r5, r5, r9\n\t"
  23636. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  23637. "ldm %[a], {r2, r3, r4, r5}\n\t"
  23638. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  23639. "sbcs r2, r2, r6\n\t"
  23640. "sbcs r3, r3, r7\n\t"
  23641. "sbcs r4, r4, r8\n\t"
  23642. "sbcs r5, r5, r9\n\t"
  23643. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  23644. "ldm %[a], {r2, r3, r4, r5}\n\t"
  23645. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  23646. "sbcs r2, r2, r6\n\t"
  23647. "sbcs r3, r3, r7\n\t"
  23648. "sbcs r4, r4, r8\n\t"
  23649. "sbcs r5, r5, r9\n\t"
  23650. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  23651. "sbc %[a], r9, r9\n\t"
  23652. : [a] "+r" (a), [b] "+r" (b)
  23653. :
  23654. : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "cc"
  23655. );
  23656. return (uint32_t)(size_t)a;
  23657. }
  23658. /* Add b to a into r. (r = a + b)
  23659. *
  23660. * r A single precision integer.
  23661. * a A single precision integer.
  23662. * b A single precision integer.
  23663. */
  23664. static sp_digit sp_3072_add_24(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p)
  23665. {
  23666. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  23667. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  23668. register const sp_digit* b asm ("r2") = (const sp_digit*)b_p;
  23669. __asm__ __volatile__ (
  23670. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  23671. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  23672. "adds r3, r3, r7\n\t"
  23673. "adcs r4, r4, r8\n\t"
  23674. "adcs r5, r5, r9\n\t"
  23675. "adcs r6, r6, r10\n\t"
  23676. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  23677. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  23678. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  23679. "adcs r3, r3, r7\n\t"
  23680. "adcs r4, r4, r8\n\t"
  23681. "adcs r5, r5, r9\n\t"
  23682. "adcs r6, r6, r10\n\t"
  23683. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  23684. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  23685. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  23686. "adcs r3, r3, r7\n\t"
  23687. "adcs r4, r4, r8\n\t"
  23688. "adcs r5, r5, r9\n\t"
  23689. "adcs r6, r6, r10\n\t"
  23690. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  23691. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  23692. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  23693. "adcs r3, r3, r7\n\t"
  23694. "adcs r4, r4, r8\n\t"
  23695. "adcs r5, r5, r9\n\t"
  23696. "adcs r6, r6, r10\n\t"
  23697. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  23698. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  23699. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  23700. "adcs r3, r3, r7\n\t"
  23701. "adcs r4, r4, r8\n\t"
  23702. "adcs r5, r5, r9\n\t"
  23703. "adcs r6, r6, r10\n\t"
  23704. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  23705. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  23706. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  23707. "adcs r3, r3, r7\n\t"
  23708. "adcs r4, r4, r8\n\t"
  23709. "adcs r5, r5, r9\n\t"
  23710. "adcs r6, r6, r10\n\t"
  23711. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  23712. "mov %[r], #0\n\t"
  23713. "adc %[r], %[r], #0\n\t"
  23714. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  23715. :
  23716. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "cc"
  23717. );
  23718. return (uint32_t)(size_t)r;
  23719. }
  23720. /* AND m into each word of a and store in r.
  23721. *
  23722. * r A single precision integer.
  23723. * a A single precision integer.
  23724. * m Mask to AND against each digit.
  23725. */
  23726. static void sp_3072_mask_12(sp_digit* r, const sp_digit* a, sp_digit m)
  23727. {
  23728. #ifdef WOLFSSL_SP_SMALL
  23729. int i;
  23730. for (i=0; i<12; i++) {
  23731. r[i] = a[i] & m;
  23732. }
  23733. #else
  23734. r[0] = a[0] & m;
  23735. r[1] = a[1] & m;
  23736. r[2] = a[2] & m;
  23737. r[3] = a[3] & m;
  23738. r[4] = a[4] & m;
  23739. r[5] = a[5] & m;
  23740. r[6] = a[6] & m;
  23741. r[7] = a[7] & m;
  23742. r[8] = a[8] & m;
  23743. r[9] = a[9] & m;
  23744. r[10] = a[10] & m;
  23745. r[11] = a[11] & m;
  23746. #endif
  23747. }
  23748. /* Multiply a and b into r. (r = a * b)
  23749. *
  23750. * r A single precision integer.
  23751. * a A single precision integer.
  23752. * b A single precision integer.
  23753. */
  23754. SP_NOINLINE static void sp_3072_mul_24(sp_digit* r, const sp_digit* a,
  23755. const sp_digit* b)
  23756. {
  23757. sp_digit* z0 = r;
  23758. sp_digit z1[24];
  23759. sp_digit a1[12];
  23760. sp_digit b1[12];
  23761. sp_digit* z2 = r + 24;
  23762. sp_digit u;
  23763. sp_digit ca;
  23764. sp_digit cb;
  23765. ca = sp_3072_add_12(a1, a, &a[12]);
  23766. cb = sp_3072_add_12(b1, b, &b[12]);
  23767. u = ca & cb;
  23768. sp_3072_mul_12(z2, &a[12], &b[12]);
  23769. sp_3072_mul_12(z0, a, b);
  23770. sp_3072_mul_12(z1, a1, b1);
  23771. u += sp_3072_sub_in_place_24(z1, z0);
  23772. u += sp_3072_sub_in_place_24(z1, z2);
  23773. sp_3072_mask_12(a1, a1, 0 - cb);
  23774. u += sp_3072_add_12(z1 + 12, z1 + 12, a1);
  23775. sp_3072_mask_12(b1, b1, 0 - ca);
  23776. u += sp_3072_add_12(z1 + 12, z1 + 12, b1);
  23777. u += sp_3072_add_24(r + 12, r + 12, z1);
  23778. XMEMSET(a1 + 1, 0, sizeof(sp_digit) * (12 - 1));
  23779. a1[0] = u;
  23780. (void)sp_3072_add_12(r + 36, r + 36, a1);
  23781. }
  23782. /* Sub b from a into a. (a -= b)
  23783. *
  23784. * a A single precision integer and result.
  23785. * b A single precision integer.
  23786. */
  23787. static sp_digit sp_3072_sub_in_place_48(sp_digit* a_p, const sp_digit* b_p)
  23788. {
  23789. register sp_digit* a asm ("r0") = (sp_digit*)a_p;
  23790. register const sp_digit* b asm ("r1") = (const sp_digit*)b_p;
  23791. __asm__ __volatile__ (
  23792. "ldm %[a], {r2, r3, r4, r5}\n\t"
  23793. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  23794. "subs r2, r2, r6\n\t"
  23795. "sbcs r3, r3, r7\n\t"
  23796. "sbcs r4, r4, r8\n\t"
  23797. "sbcs r5, r5, r9\n\t"
  23798. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  23799. "ldm %[a], {r2, r3, r4, r5}\n\t"
  23800. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  23801. "sbcs r2, r2, r6\n\t"
  23802. "sbcs r3, r3, r7\n\t"
  23803. "sbcs r4, r4, r8\n\t"
  23804. "sbcs r5, r5, r9\n\t"
  23805. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  23806. "ldm %[a], {r2, r3, r4, r5}\n\t"
  23807. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  23808. "sbcs r2, r2, r6\n\t"
  23809. "sbcs r3, r3, r7\n\t"
  23810. "sbcs r4, r4, r8\n\t"
  23811. "sbcs r5, r5, r9\n\t"
  23812. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  23813. "ldm %[a], {r2, r3, r4, r5}\n\t"
  23814. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  23815. "sbcs r2, r2, r6\n\t"
  23816. "sbcs r3, r3, r7\n\t"
  23817. "sbcs r4, r4, r8\n\t"
  23818. "sbcs r5, r5, r9\n\t"
  23819. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  23820. "ldm %[a], {r2, r3, r4, r5}\n\t"
  23821. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  23822. "sbcs r2, r2, r6\n\t"
  23823. "sbcs r3, r3, r7\n\t"
  23824. "sbcs r4, r4, r8\n\t"
  23825. "sbcs r5, r5, r9\n\t"
  23826. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  23827. "ldm %[a], {r2, r3, r4, r5}\n\t"
  23828. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  23829. "sbcs r2, r2, r6\n\t"
  23830. "sbcs r3, r3, r7\n\t"
  23831. "sbcs r4, r4, r8\n\t"
  23832. "sbcs r5, r5, r9\n\t"
  23833. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  23834. "ldm %[a], {r2, r3, r4, r5}\n\t"
  23835. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  23836. "sbcs r2, r2, r6\n\t"
  23837. "sbcs r3, r3, r7\n\t"
  23838. "sbcs r4, r4, r8\n\t"
  23839. "sbcs r5, r5, r9\n\t"
  23840. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  23841. "ldm %[a], {r2, r3, r4, r5}\n\t"
  23842. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  23843. "sbcs r2, r2, r6\n\t"
  23844. "sbcs r3, r3, r7\n\t"
  23845. "sbcs r4, r4, r8\n\t"
  23846. "sbcs r5, r5, r9\n\t"
  23847. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  23848. "ldm %[a], {r2, r3, r4, r5}\n\t"
  23849. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  23850. "sbcs r2, r2, r6\n\t"
  23851. "sbcs r3, r3, r7\n\t"
  23852. "sbcs r4, r4, r8\n\t"
  23853. "sbcs r5, r5, r9\n\t"
  23854. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  23855. "ldm %[a], {r2, r3, r4, r5}\n\t"
  23856. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  23857. "sbcs r2, r2, r6\n\t"
  23858. "sbcs r3, r3, r7\n\t"
  23859. "sbcs r4, r4, r8\n\t"
  23860. "sbcs r5, r5, r9\n\t"
  23861. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  23862. "ldm %[a], {r2, r3, r4, r5}\n\t"
  23863. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  23864. "sbcs r2, r2, r6\n\t"
  23865. "sbcs r3, r3, r7\n\t"
  23866. "sbcs r4, r4, r8\n\t"
  23867. "sbcs r5, r5, r9\n\t"
  23868. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  23869. "ldm %[a], {r2, r3, r4, r5}\n\t"
  23870. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  23871. "sbcs r2, r2, r6\n\t"
  23872. "sbcs r3, r3, r7\n\t"
  23873. "sbcs r4, r4, r8\n\t"
  23874. "sbcs r5, r5, r9\n\t"
  23875. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  23876. "sbc %[a], r9, r9\n\t"
  23877. : [a] "+r" (a), [b] "+r" (b)
  23878. :
  23879. : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "cc"
  23880. );
  23881. return (uint32_t)(size_t)a;
  23882. }
  23883. /* Add b to a into r. (r = a + b)
  23884. *
  23885. * r A single precision integer.
  23886. * a A single precision integer.
  23887. * b A single precision integer.
  23888. */
  23889. static sp_digit sp_3072_add_48(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p)
  23890. {
  23891. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  23892. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  23893. register const sp_digit* b asm ("r2") = (const sp_digit*)b_p;
  23894. __asm__ __volatile__ (
  23895. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  23896. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  23897. "adds r3, r3, r7\n\t"
  23898. "adcs r4, r4, r8\n\t"
  23899. "adcs r5, r5, r9\n\t"
  23900. "adcs r6, r6, r10\n\t"
  23901. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  23902. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  23903. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  23904. "adcs r3, r3, r7\n\t"
  23905. "adcs r4, r4, r8\n\t"
  23906. "adcs r5, r5, r9\n\t"
  23907. "adcs r6, r6, r10\n\t"
  23908. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  23909. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  23910. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  23911. "adcs r3, r3, r7\n\t"
  23912. "adcs r4, r4, r8\n\t"
  23913. "adcs r5, r5, r9\n\t"
  23914. "adcs r6, r6, r10\n\t"
  23915. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  23916. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  23917. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  23918. "adcs r3, r3, r7\n\t"
  23919. "adcs r4, r4, r8\n\t"
  23920. "adcs r5, r5, r9\n\t"
  23921. "adcs r6, r6, r10\n\t"
  23922. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  23923. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  23924. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  23925. "adcs r3, r3, r7\n\t"
  23926. "adcs r4, r4, r8\n\t"
  23927. "adcs r5, r5, r9\n\t"
  23928. "adcs r6, r6, r10\n\t"
  23929. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  23930. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  23931. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  23932. "adcs r3, r3, r7\n\t"
  23933. "adcs r4, r4, r8\n\t"
  23934. "adcs r5, r5, r9\n\t"
  23935. "adcs r6, r6, r10\n\t"
  23936. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  23937. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  23938. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  23939. "adcs r3, r3, r7\n\t"
  23940. "adcs r4, r4, r8\n\t"
  23941. "adcs r5, r5, r9\n\t"
  23942. "adcs r6, r6, r10\n\t"
  23943. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  23944. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  23945. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  23946. "adcs r3, r3, r7\n\t"
  23947. "adcs r4, r4, r8\n\t"
  23948. "adcs r5, r5, r9\n\t"
  23949. "adcs r6, r6, r10\n\t"
  23950. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  23951. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  23952. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  23953. "adcs r3, r3, r7\n\t"
  23954. "adcs r4, r4, r8\n\t"
  23955. "adcs r5, r5, r9\n\t"
  23956. "adcs r6, r6, r10\n\t"
  23957. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  23958. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  23959. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  23960. "adcs r3, r3, r7\n\t"
  23961. "adcs r4, r4, r8\n\t"
  23962. "adcs r5, r5, r9\n\t"
  23963. "adcs r6, r6, r10\n\t"
  23964. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  23965. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  23966. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  23967. "adcs r3, r3, r7\n\t"
  23968. "adcs r4, r4, r8\n\t"
  23969. "adcs r5, r5, r9\n\t"
  23970. "adcs r6, r6, r10\n\t"
  23971. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  23972. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  23973. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  23974. "adcs r3, r3, r7\n\t"
  23975. "adcs r4, r4, r8\n\t"
  23976. "adcs r5, r5, r9\n\t"
  23977. "adcs r6, r6, r10\n\t"
  23978. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  23979. "mov %[r], #0\n\t"
  23980. "adc %[r], %[r], #0\n\t"
  23981. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  23982. :
  23983. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "cc"
  23984. );
  23985. return (uint32_t)(size_t)r;
  23986. }
  23987. /* AND m into each word of a and store in r.
  23988. *
  23989. * r A single precision integer.
  23990. * a A single precision integer.
  23991. * m Mask to AND against each digit.
  23992. */
  23993. static void sp_3072_mask_24(sp_digit* r, const sp_digit* a, sp_digit m)
  23994. {
  23995. #ifdef WOLFSSL_SP_SMALL
  23996. int i;
  23997. for (i=0; i<24; i++) {
  23998. r[i] = a[i] & m;
  23999. }
  24000. #else
  24001. int i;
  24002. for (i = 0; i < 24; i += 8) {
  24003. r[i+0] = a[i+0] & m;
  24004. r[i+1] = a[i+1] & m;
  24005. r[i+2] = a[i+2] & m;
  24006. r[i+3] = a[i+3] & m;
  24007. r[i+4] = a[i+4] & m;
  24008. r[i+5] = a[i+5] & m;
  24009. r[i+6] = a[i+6] & m;
  24010. r[i+7] = a[i+7] & m;
  24011. }
  24012. #endif
  24013. }
  24014. /* Multiply a and b into r. (r = a * b)
  24015. *
  24016. * r A single precision integer.
  24017. * a A single precision integer.
  24018. * b A single precision integer.
  24019. */
  24020. SP_NOINLINE static void sp_3072_mul_48(sp_digit* r, const sp_digit* a,
  24021. const sp_digit* b)
  24022. {
  24023. sp_digit* z0 = r;
  24024. sp_digit z1[48];
  24025. sp_digit a1[24];
  24026. sp_digit b1[24];
  24027. sp_digit* z2 = r + 48;
  24028. sp_digit u;
  24029. sp_digit ca;
  24030. sp_digit cb;
  24031. ca = sp_3072_add_24(a1, a, &a[24]);
  24032. cb = sp_3072_add_24(b1, b, &b[24]);
  24033. u = ca & cb;
  24034. sp_3072_mul_24(z2, &a[24], &b[24]);
  24035. sp_3072_mul_24(z0, a, b);
  24036. sp_3072_mul_24(z1, a1, b1);
  24037. u += sp_3072_sub_in_place_48(z1, z0);
  24038. u += sp_3072_sub_in_place_48(z1, z2);
  24039. sp_3072_mask_24(a1, a1, 0 - cb);
  24040. u += sp_3072_add_24(z1 + 24, z1 + 24, a1);
  24041. sp_3072_mask_24(b1, b1, 0 - ca);
  24042. u += sp_3072_add_24(z1 + 24, z1 + 24, b1);
  24043. u += sp_3072_add_48(r + 24, r + 24, z1);
  24044. XMEMSET(a1 + 1, 0, sizeof(sp_digit) * (24 - 1));
  24045. a1[0] = u;
  24046. (void)sp_3072_add_24(r + 72, r + 72, a1);
  24047. }
  24048. /* Sub b from a into a. (a -= b)
  24049. *
  24050. * a A single precision integer and result.
  24051. * b A single precision integer.
  24052. */
  24053. static sp_digit sp_3072_sub_in_place_96(sp_digit* a_p, const sp_digit* b_p)
  24054. {
  24055. register sp_digit* a asm ("r0") = (sp_digit*)a_p;
  24056. register const sp_digit* b asm ("r1") = (const sp_digit*)b_p;
  24057. __asm__ __volatile__ (
  24058. "ldm %[a], {r2, r3, r4, r5}\n\t"
  24059. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  24060. "subs r2, r2, r6\n\t"
  24061. "sbcs r3, r3, r7\n\t"
  24062. "sbcs r4, r4, r8\n\t"
  24063. "sbcs r5, r5, r9\n\t"
  24064. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  24065. "ldm %[a], {r2, r3, r4, r5}\n\t"
  24066. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  24067. "sbcs r2, r2, r6\n\t"
  24068. "sbcs r3, r3, r7\n\t"
  24069. "sbcs r4, r4, r8\n\t"
  24070. "sbcs r5, r5, r9\n\t"
  24071. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  24072. "ldm %[a], {r2, r3, r4, r5}\n\t"
  24073. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  24074. "sbcs r2, r2, r6\n\t"
  24075. "sbcs r3, r3, r7\n\t"
  24076. "sbcs r4, r4, r8\n\t"
  24077. "sbcs r5, r5, r9\n\t"
  24078. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  24079. "ldm %[a], {r2, r3, r4, r5}\n\t"
  24080. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  24081. "sbcs r2, r2, r6\n\t"
  24082. "sbcs r3, r3, r7\n\t"
  24083. "sbcs r4, r4, r8\n\t"
  24084. "sbcs r5, r5, r9\n\t"
  24085. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  24086. "ldm %[a], {r2, r3, r4, r5}\n\t"
  24087. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  24088. "sbcs r2, r2, r6\n\t"
  24089. "sbcs r3, r3, r7\n\t"
  24090. "sbcs r4, r4, r8\n\t"
  24091. "sbcs r5, r5, r9\n\t"
  24092. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  24093. "ldm %[a], {r2, r3, r4, r5}\n\t"
  24094. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  24095. "sbcs r2, r2, r6\n\t"
  24096. "sbcs r3, r3, r7\n\t"
  24097. "sbcs r4, r4, r8\n\t"
  24098. "sbcs r5, r5, r9\n\t"
  24099. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  24100. "ldm %[a], {r2, r3, r4, r5}\n\t"
  24101. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  24102. "sbcs r2, r2, r6\n\t"
  24103. "sbcs r3, r3, r7\n\t"
  24104. "sbcs r4, r4, r8\n\t"
  24105. "sbcs r5, r5, r9\n\t"
  24106. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  24107. "ldm %[a], {r2, r3, r4, r5}\n\t"
  24108. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  24109. "sbcs r2, r2, r6\n\t"
  24110. "sbcs r3, r3, r7\n\t"
  24111. "sbcs r4, r4, r8\n\t"
  24112. "sbcs r5, r5, r9\n\t"
  24113. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  24114. "ldm %[a], {r2, r3, r4, r5}\n\t"
  24115. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  24116. "sbcs r2, r2, r6\n\t"
  24117. "sbcs r3, r3, r7\n\t"
  24118. "sbcs r4, r4, r8\n\t"
  24119. "sbcs r5, r5, r9\n\t"
  24120. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  24121. "ldm %[a], {r2, r3, r4, r5}\n\t"
  24122. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  24123. "sbcs r2, r2, r6\n\t"
  24124. "sbcs r3, r3, r7\n\t"
  24125. "sbcs r4, r4, r8\n\t"
  24126. "sbcs r5, r5, r9\n\t"
  24127. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  24128. "ldm %[a], {r2, r3, r4, r5}\n\t"
  24129. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  24130. "sbcs r2, r2, r6\n\t"
  24131. "sbcs r3, r3, r7\n\t"
  24132. "sbcs r4, r4, r8\n\t"
  24133. "sbcs r5, r5, r9\n\t"
  24134. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  24135. "ldm %[a], {r2, r3, r4, r5}\n\t"
  24136. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  24137. "sbcs r2, r2, r6\n\t"
  24138. "sbcs r3, r3, r7\n\t"
  24139. "sbcs r4, r4, r8\n\t"
  24140. "sbcs r5, r5, r9\n\t"
  24141. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  24142. "ldm %[a], {r2, r3, r4, r5}\n\t"
  24143. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  24144. "sbcs r2, r2, r6\n\t"
  24145. "sbcs r3, r3, r7\n\t"
  24146. "sbcs r4, r4, r8\n\t"
  24147. "sbcs r5, r5, r9\n\t"
  24148. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  24149. "ldm %[a], {r2, r3, r4, r5}\n\t"
  24150. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  24151. "sbcs r2, r2, r6\n\t"
  24152. "sbcs r3, r3, r7\n\t"
  24153. "sbcs r4, r4, r8\n\t"
  24154. "sbcs r5, r5, r9\n\t"
  24155. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  24156. "ldm %[a], {r2, r3, r4, r5}\n\t"
  24157. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  24158. "sbcs r2, r2, r6\n\t"
  24159. "sbcs r3, r3, r7\n\t"
  24160. "sbcs r4, r4, r8\n\t"
  24161. "sbcs r5, r5, r9\n\t"
  24162. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  24163. "ldm %[a], {r2, r3, r4, r5}\n\t"
  24164. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  24165. "sbcs r2, r2, r6\n\t"
  24166. "sbcs r3, r3, r7\n\t"
  24167. "sbcs r4, r4, r8\n\t"
  24168. "sbcs r5, r5, r9\n\t"
  24169. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  24170. "ldm %[a], {r2, r3, r4, r5}\n\t"
  24171. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  24172. "sbcs r2, r2, r6\n\t"
  24173. "sbcs r3, r3, r7\n\t"
  24174. "sbcs r4, r4, r8\n\t"
  24175. "sbcs r5, r5, r9\n\t"
  24176. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  24177. "ldm %[a], {r2, r3, r4, r5}\n\t"
  24178. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  24179. "sbcs r2, r2, r6\n\t"
  24180. "sbcs r3, r3, r7\n\t"
  24181. "sbcs r4, r4, r8\n\t"
  24182. "sbcs r5, r5, r9\n\t"
  24183. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  24184. "ldm %[a], {r2, r3, r4, r5}\n\t"
  24185. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  24186. "sbcs r2, r2, r6\n\t"
  24187. "sbcs r3, r3, r7\n\t"
  24188. "sbcs r4, r4, r8\n\t"
  24189. "sbcs r5, r5, r9\n\t"
  24190. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  24191. "ldm %[a], {r2, r3, r4, r5}\n\t"
  24192. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  24193. "sbcs r2, r2, r6\n\t"
  24194. "sbcs r3, r3, r7\n\t"
  24195. "sbcs r4, r4, r8\n\t"
  24196. "sbcs r5, r5, r9\n\t"
  24197. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  24198. "ldm %[a], {r2, r3, r4, r5}\n\t"
  24199. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  24200. "sbcs r2, r2, r6\n\t"
  24201. "sbcs r3, r3, r7\n\t"
  24202. "sbcs r4, r4, r8\n\t"
  24203. "sbcs r5, r5, r9\n\t"
  24204. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  24205. "ldm %[a], {r2, r3, r4, r5}\n\t"
  24206. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  24207. "sbcs r2, r2, r6\n\t"
  24208. "sbcs r3, r3, r7\n\t"
  24209. "sbcs r4, r4, r8\n\t"
  24210. "sbcs r5, r5, r9\n\t"
  24211. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  24212. "ldm %[a], {r2, r3, r4, r5}\n\t"
  24213. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  24214. "sbcs r2, r2, r6\n\t"
  24215. "sbcs r3, r3, r7\n\t"
  24216. "sbcs r4, r4, r8\n\t"
  24217. "sbcs r5, r5, r9\n\t"
  24218. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  24219. "ldm %[a], {r2, r3, r4, r5}\n\t"
  24220. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  24221. "sbcs r2, r2, r6\n\t"
  24222. "sbcs r3, r3, r7\n\t"
  24223. "sbcs r4, r4, r8\n\t"
  24224. "sbcs r5, r5, r9\n\t"
  24225. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  24226. "sbc %[a], r9, r9\n\t"
  24227. : [a] "+r" (a), [b] "+r" (b)
  24228. :
  24229. : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "cc"
  24230. );
  24231. return (uint32_t)(size_t)a;
  24232. }
  24233. /* Add b to a into r. (r = a + b)
  24234. *
  24235. * r A single precision integer.
  24236. * a A single precision integer.
  24237. * b A single precision integer.
  24238. */
  24239. static sp_digit sp_3072_add_96(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p)
  24240. {
  24241. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  24242. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  24243. register const sp_digit* b asm ("r2") = (const sp_digit*)b_p;
  24244. __asm__ __volatile__ (
  24245. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  24246. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  24247. "adds r3, r3, r7\n\t"
  24248. "adcs r4, r4, r8\n\t"
  24249. "adcs r5, r5, r9\n\t"
  24250. "adcs r6, r6, r10\n\t"
  24251. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  24252. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  24253. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  24254. "adcs r3, r3, r7\n\t"
  24255. "adcs r4, r4, r8\n\t"
  24256. "adcs r5, r5, r9\n\t"
  24257. "adcs r6, r6, r10\n\t"
  24258. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  24259. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  24260. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  24261. "adcs r3, r3, r7\n\t"
  24262. "adcs r4, r4, r8\n\t"
  24263. "adcs r5, r5, r9\n\t"
  24264. "adcs r6, r6, r10\n\t"
  24265. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  24266. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  24267. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  24268. "adcs r3, r3, r7\n\t"
  24269. "adcs r4, r4, r8\n\t"
  24270. "adcs r5, r5, r9\n\t"
  24271. "adcs r6, r6, r10\n\t"
  24272. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  24273. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  24274. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  24275. "adcs r3, r3, r7\n\t"
  24276. "adcs r4, r4, r8\n\t"
  24277. "adcs r5, r5, r9\n\t"
  24278. "adcs r6, r6, r10\n\t"
  24279. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  24280. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  24281. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  24282. "adcs r3, r3, r7\n\t"
  24283. "adcs r4, r4, r8\n\t"
  24284. "adcs r5, r5, r9\n\t"
  24285. "adcs r6, r6, r10\n\t"
  24286. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  24287. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  24288. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  24289. "adcs r3, r3, r7\n\t"
  24290. "adcs r4, r4, r8\n\t"
  24291. "adcs r5, r5, r9\n\t"
  24292. "adcs r6, r6, r10\n\t"
  24293. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  24294. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  24295. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  24296. "adcs r3, r3, r7\n\t"
  24297. "adcs r4, r4, r8\n\t"
  24298. "adcs r5, r5, r9\n\t"
  24299. "adcs r6, r6, r10\n\t"
  24300. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  24301. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  24302. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  24303. "adcs r3, r3, r7\n\t"
  24304. "adcs r4, r4, r8\n\t"
  24305. "adcs r5, r5, r9\n\t"
  24306. "adcs r6, r6, r10\n\t"
  24307. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  24308. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  24309. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  24310. "adcs r3, r3, r7\n\t"
  24311. "adcs r4, r4, r8\n\t"
  24312. "adcs r5, r5, r9\n\t"
  24313. "adcs r6, r6, r10\n\t"
  24314. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  24315. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  24316. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  24317. "adcs r3, r3, r7\n\t"
  24318. "adcs r4, r4, r8\n\t"
  24319. "adcs r5, r5, r9\n\t"
  24320. "adcs r6, r6, r10\n\t"
  24321. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  24322. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  24323. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  24324. "adcs r3, r3, r7\n\t"
  24325. "adcs r4, r4, r8\n\t"
  24326. "adcs r5, r5, r9\n\t"
  24327. "adcs r6, r6, r10\n\t"
  24328. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  24329. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  24330. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  24331. "adcs r3, r3, r7\n\t"
  24332. "adcs r4, r4, r8\n\t"
  24333. "adcs r5, r5, r9\n\t"
  24334. "adcs r6, r6, r10\n\t"
  24335. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  24336. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  24337. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  24338. "adcs r3, r3, r7\n\t"
  24339. "adcs r4, r4, r8\n\t"
  24340. "adcs r5, r5, r9\n\t"
  24341. "adcs r6, r6, r10\n\t"
  24342. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  24343. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  24344. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  24345. "adcs r3, r3, r7\n\t"
  24346. "adcs r4, r4, r8\n\t"
  24347. "adcs r5, r5, r9\n\t"
  24348. "adcs r6, r6, r10\n\t"
  24349. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  24350. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  24351. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  24352. "adcs r3, r3, r7\n\t"
  24353. "adcs r4, r4, r8\n\t"
  24354. "adcs r5, r5, r9\n\t"
  24355. "adcs r6, r6, r10\n\t"
  24356. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  24357. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  24358. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  24359. "adcs r3, r3, r7\n\t"
  24360. "adcs r4, r4, r8\n\t"
  24361. "adcs r5, r5, r9\n\t"
  24362. "adcs r6, r6, r10\n\t"
  24363. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  24364. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  24365. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  24366. "adcs r3, r3, r7\n\t"
  24367. "adcs r4, r4, r8\n\t"
  24368. "adcs r5, r5, r9\n\t"
  24369. "adcs r6, r6, r10\n\t"
  24370. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  24371. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  24372. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  24373. "adcs r3, r3, r7\n\t"
  24374. "adcs r4, r4, r8\n\t"
  24375. "adcs r5, r5, r9\n\t"
  24376. "adcs r6, r6, r10\n\t"
  24377. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  24378. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  24379. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  24380. "adcs r3, r3, r7\n\t"
  24381. "adcs r4, r4, r8\n\t"
  24382. "adcs r5, r5, r9\n\t"
  24383. "adcs r6, r6, r10\n\t"
  24384. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  24385. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  24386. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  24387. "adcs r3, r3, r7\n\t"
  24388. "adcs r4, r4, r8\n\t"
  24389. "adcs r5, r5, r9\n\t"
  24390. "adcs r6, r6, r10\n\t"
  24391. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  24392. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  24393. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  24394. "adcs r3, r3, r7\n\t"
  24395. "adcs r4, r4, r8\n\t"
  24396. "adcs r5, r5, r9\n\t"
  24397. "adcs r6, r6, r10\n\t"
  24398. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  24399. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  24400. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  24401. "adcs r3, r3, r7\n\t"
  24402. "adcs r4, r4, r8\n\t"
  24403. "adcs r5, r5, r9\n\t"
  24404. "adcs r6, r6, r10\n\t"
  24405. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  24406. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  24407. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  24408. "adcs r3, r3, r7\n\t"
  24409. "adcs r4, r4, r8\n\t"
  24410. "adcs r5, r5, r9\n\t"
  24411. "adcs r6, r6, r10\n\t"
  24412. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  24413. "mov %[r], #0\n\t"
  24414. "adc %[r], %[r], #0\n\t"
  24415. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  24416. :
  24417. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "cc"
  24418. );
  24419. return (uint32_t)(size_t)r;
  24420. }
  24421. /* AND m into each word of a and store in r.
  24422. *
  24423. * r A single precision integer.
  24424. * a A single precision integer.
  24425. * m Mask to AND against each digit.
  24426. */
  24427. static void sp_3072_mask_48(sp_digit* r, const sp_digit* a, sp_digit m)
  24428. {
  24429. #ifdef WOLFSSL_SP_SMALL
  24430. int i;
  24431. for (i=0; i<48; i++) {
  24432. r[i] = a[i] & m;
  24433. }
  24434. #else
  24435. int i;
  24436. for (i = 0; i < 48; i += 8) {
  24437. r[i+0] = a[i+0] & m;
  24438. r[i+1] = a[i+1] & m;
  24439. r[i+2] = a[i+2] & m;
  24440. r[i+3] = a[i+3] & m;
  24441. r[i+4] = a[i+4] & m;
  24442. r[i+5] = a[i+5] & m;
  24443. r[i+6] = a[i+6] & m;
  24444. r[i+7] = a[i+7] & m;
  24445. }
  24446. #endif
  24447. }
  24448. /* Multiply a and b into r. (r = a * b)
  24449. *
  24450. * r A single precision integer.
  24451. * a A single precision integer.
  24452. * b A single precision integer.
  24453. */
  24454. SP_NOINLINE static void sp_3072_mul_96(sp_digit* r, const sp_digit* a,
  24455. const sp_digit* b)
  24456. {
  24457. sp_digit* z0 = r;
  24458. sp_digit z1[96];
  24459. sp_digit a1[48];
  24460. sp_digit b1[48];
  24461. sp_digit* z2 = r + 96;
  24462. sp_digit u;
  24463. sp_digit ca;
  24464. sp_digit cb;
  24465. ca = sp_3072_add_48(a1, a, &a[48]);
  24466. cb = sp_3072_add_48(b1, b, &b[48]);
  24467. u = ca & cb;
  24468. sp_3072_mul_48(z2, &a[48], &b[48]);
  24469. sp_3072_mul_48(z0, a, b);
  24470. sp_3072_mul_48(z1, a1, b1);
  24471. u += sp_3072_sub_in_place_96(z1, z0);
  24472. u += sp_3072_sub_in_place_96(z1, z2);
  24473. sp_3072_mask_48(a1, a1, 0 - cb);
  24474. u += sp_3072_add_48(z1 + 48, z1 + 48, a1);
  24475. sp_3072_mask_48(b1, b1, 0 - ca);
  24476. u += sp_3072_add_48(z1 + 48, z1 + 48, b1);
  24477. u += sp_3072_add_96(r + 48, r + 48, z1);
  24478. XMEMSET(a1 + 1, 0, sizeof(sp_digit) * (48 - 1));
  24479. a1[0] = u;
  24480. (void)sp_3072_add_48(r + 144, r + 144, a1);
  24481. }
  24482. /* Square a and put result in r. (r = a * a)
  24483. *
  24484. * r A single precision integer.
  24485. * a A single precision integer.
  24486. */
  24487. static void sp_3072_sqr_12(sp_digit* r_p, const sp_digit* a_p)
  24488. {
  24489. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  24490. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  24491. __asm__ __volatile__ (
  24492. "sub sp, sp, #48\n\t"
  24493. /* A[0] * A[0] */
  24494. "ldr r10, [%[a]]\n\t"
  24495. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  24496. "lsr r9, r10, #16\n\t"
  24497. "lsl r2, r10, #16\n\t"
  24498. "lsr r2, r2, #16\n\t"
  24499. "mul r8, r2, r2\n\t"
  24500. "mul r3, r9, r9\n\t"
  24501. "mul r2, r9, r2\n\t"
  24502. "lsr r9, r2, #15\n\t"
  24503. "lsl r2, r2, #17\n\t"
  24504. "adds r8, r8, r2\n\t"
  24505. "adc r3, r3, r9\n\t"
  24506. #else
  24507. "umull r8, r3, r10, r10\n\t"
  24508. #endif
  24509. "mov r4, #0\n\t"
  24510. "str r8, [sp]\n\t"
  24511. /* A[0] * A[1] */
  24512. "ldr r10, [%[a], #4]\n\t"
  24513. "ldr r12, [%[a]]\n\t"
  24514. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  24515. "lsl r8, r10, #16\n\t"
  24516. "lsl r9, r12, #16\n\t"
  24517. "lsr r8, r8, #16\n\t"
  24518. "lsr r9, r9, #16\n\t"
  24519. "mul r9, r8, r9\n\t"
  24520. "adds r3, r3, r9\n\t"
  24521. "adcs r4, r4, #0\n\t"
  24522. "mov r2, #0\n\t"
  24523. "adc r2, r2, #0\n\t"
  24524. "adds r3, r3, r9\n\t"
  24525. "adcs r4, r4, #0\n\t"
  24526. "adc r2, r2, #0\n\t"
  24527. "lsr r9, r12, #16\n\t"
  24528. "mul r8, r9, r8\n\t"
  24529. "lsr r9, r8, #16\n\t"
  24530. "lsl r8, r8, #16\n\t"
  24531. "adds r3, r3, r8\n\t"
  24532. "adcs r4, r4, r9\n\t"
  24533. "adc r2, r2, #0\n\t"
  24534. "adds r3, r3, r8\n\t"
  24535. "adcs r4, r4, r9\n\t"
  24536. "adc r2, r2, #0\n\t"
  24537. "lsr r8, r10, #16\n\t"
  24538. "lsr r9, r12, #16\n\t"
  24539. "mul r9, r8, r9\n\t"
  24540. "adds r4, r4, r9\n\t"
  24541. "adc r2, r2, #0\n\t"
  24542. "adds r4, r4, r9\n\t"
  24543. "adc r2, r2, #0\n\t"
  24544. "lsl r9, r12, #16\n\t"
  24545. "lsr r9, r9, #16\n\t"
  24546. "mul r8, r9, r8\n\t"
  24547. "lsr r9, r8, #16\n\t"
  24548. "lsl r8, r8, #16\n\t"
  24549. "adds r3, r3, r8\n\t"
  24550. "adcs r4, r4, r9\n\t"
  24551. "adc r2, r2, #0\n\t"
  24552. "adds r3, r3, r8\n\t"
  24553. "adcs r4, r4, r9\n\t"
  24554. "adc r2, r2, #0\n\t"
  24555. #else
  24556. "umull r8, r9, r10, r12\n\t"
  24557. "adds r3, r3, r8\n\t"
  24558. "adcs r4, r4, r9\n\t"
  24559. "mov r2, #0\n\t"
  24560. "adc r2, r2, #0\n\t"
  24561. "adds r3, r3, r8\n\t"
  24562. "adcs r4, r4, r9\n\t"
  24563. "mov r2, #0\n\t"
  24564. "adc r2, r2, #0\n\t"
  24565. #endif
  24566. "str r3, [sp, #4]\n\t"
  24567. /* A[0] * A[2] */
  24568. "ldr r10, [%[a], #8]\n\t"
  24569. "ldr r12, [%[a]]\n\t"
  24570. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  24571. "lsl r8, r10, #16\n\t"
  24572. "lsl r9, r12, #16\n\t"
  24573. "lsr r8, r8, #16\n\t"
  24574. "lsr r9, r9, #16\n\t"
  24575. "mul r9, r8, r9\n\t"
  24576. "adds r4, r4, r9\n\t"
  24577. "adcs r2, r2, #0\n\t"
  24578. "mov r3, #0\n\t"
  24579. "adc r3, r3, #0\n\t"
  24580. "adds r4, r4, r9\n\t"
  24581. "adcs r2, r2, #0\n\t"
  24582. "adc r3, r3, #0\n\t"
  24583. "lsr r9, r12, #16\n\t"
  24584. "mul r8, r9, r8\n\t"
  24585. "lsr r9, r8, #16\n\t"
  24586. "lsl r8, r8, #16\n\t"
  24587. "adds r4, r4, r8\n\t"
  24588. "adcs r2, r2, r9\n\t"
  24589. "adc r3, r3, #0\n\t"
  24590. "adds r4, r4, r8\n\t"
  24591. "adcs r2, r2, r9\n\t"
  24592. "adc r3, r3, #0\n\t"
  24593. "lsr r8, r10, #16\n\t"
  24594. "lsr r9, r12, #16\n\t"
  24595. "mul r9, r8, r9\n\t"
  24596. "adds r2, r2, r9\n\t"
  24597. "adc r3, r3, #0\n\t"
  24598. "adds r2, r2, r9\n\t"
  24599. "adc r3, r3, #0\n\t"
  24600. "lsl r9, r12, #16\n\t"
  24601. "lsr r9, r9, #16\n\t"
  24602. "mul r8, r9, r8\n\t"
  24603. "lsr r9, r8, #16\n\t"
  24604. "lsl r8, r8, #16\n\t"
  24605. "adds r4, r4, r8\n\t"
  24606. "adcs r2, r2, r9\n\t"
  24607. "adc r3, r3, #0\n\t"
  24608. "adds r4, r4, r8\n\t"
  24609. "adcs r2, r2, r9\n\t"
  24610. "adc r3, r3, #0\n\t"
  24611. #else
  24612. "umull r8, r9, r10, r12\n\t"
  24613. "adds r4, r4, r8\n\t"
  24614. "adcs r2, r2, r9\n\t"
  24615. "mov r3, #0\n\t"
  24616. "adc r3, r3, #0\n\t"
  24617. "adds r4, r4, r8\n\t"
  24618. "adcs r2, r2, r9\n\t"
  24619. "mov r3, #0\n\t"
  24620. "adc r3, r3, #0\n\t"
  24621. #endif
  24622. /* A[1] * A[1] */
  24623. "ldr r10, [%[a], #4]\n\t"
  24624. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  24625. "lsl r8, r10, #16\n\t"
  24626. "lsr r9, r10, #16\n\t"
  24627. "lsr r8, r8, #16\n\t"
  24628. "mov r12, r8\n\t"
  24629. "mul r8, r12, r8\n\t"
  24630. "mov r12, r9\n\t"
  24631. "mul r9, r12, r9\n\t"
  24632. "adds r4, r4, r8\n\t"
  24633. "adcs r2, r2, r9\n\t"
  24634. "adc r3, r3, #0\n\t"
  24635. "lsr r9, r10, #16\n\t"
  24636. "lsl r8, r10, #16\n\t"
  24637. "lsr r8, r8, #16\n\t"
  24638. "mul r8, r9, r8\n\t"
  24639. "lsr r9, r8, #15\n\t"
  24640. "lsl r8, r8, #17\n\t"
  24641. "adds r4, r4, r8\n\t"
  24642. "adcs r2, r2, r9\n\t"
  24643. "adc r3, r3, #0\n\t"
  24644. #else
  24645. "umull r8, r9, r10, r10\n\t"
  24646. "adds r4, r4, r8\n\t"
  24647. "adcs r2, r2, r9\n\t"
  24648. "adc r3, r3, #0\n\t"
  24649. #endif
  24650. "str r4, [sp, #8]\n\t"
  24651. /* A[0] * A[3] */
  24652. "ldr r10, [%[a], #12]\n\t"
  24653. "ldr r12, [%[a]]\n\t"
  24654. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  24655. "lsl r8, r10, #16\n\t"
  24656. "lsl r9, r12, #16\n\t"
  24657. "lsr r8, r8, #16\n\t"
  24658. "lsr r9, r9, #16\n\t"
  24659. "mul r9, r8, r9\n\t"
  24660. "adds r2, r2, r9\n\t"
  24661. "adcs r3, r3, #0\n\t"
  24662. "mov r4, #0\n\t"
  24663. "adc r4, r4, #0\n\t"
  24664. "adds r2, r2, r9\n\t"
  24665. "adcs r3, r3, #0\n\t"
  24666. "adc r4, r4, #0\n\t"
  24667. "lsr r9, r12, #16\n\t"
  24668. "mul r8, r9, r8\n\t"
  24669. "lsr r9, r8, #16\n\t"
  24670. "lsl r8, r8, #16\n\t"
  24671. "adds r2, r2, r8\n\t"
  24672. "adcs r3, r3, r9\n\t"
  24673. "adc r4, r4, #0\n\t"
  24674. "adds r2, r2, r8\n\t"
  24675. "adcs r3, r3, r9\n\t"
  24676. "adc r4, r4, #0\n\t"
  24677. "lsr r8, r10, #16\n\t"
  24678. "lsr r9, r12, #16\n\t"
  24679. "mul r9, r8, r9\n\t"
  24680. "adds r3, r3, r9\n\t"
  24681. "adc r4, r4, #0\n\t"
  24682. "adds r3, r3, r9\n\t"
  24683. "adc r4, r4, #0\n\t"
  24684. "lsl r9, r12, #16\n\t"
  24685. "lsr r9, r9, #16\n\t"
  24686. "mul r8, r9, r8\n\t"
  24687. "lsr r9, r8, #16\n\t"
  24688. "lsl r8, r8, #16\n\t"
  24689. "adds r2, r2, r8\n\t"
  24690. "adcs r3, r3, r9\n\t"
  24691. "adc r4, r4, #0\n\t"
  24692. "adds r2, r2, r8\n\t"
  24693. "adcs r3, r3, r9\n\t"
  24694. "adc r4, r4, #0\n\t"
  24695. #else
  24696. "umull r8, r9, r10, r12\n\t"
  24697. "adds r2, r2, r8\n\t"
  24698. "adcs r3, r3, r9\n\t"
  24699. "mov r4, #0\n\t"
  24700. "adc r4, r4, #0\n\t"
  24701. "adds r2, r2, r8\n\t"
  24702. "adcs r3, r3, r9\n\t"
  24703. "mov r4, #0\n\t"
  24704. "adc r4, r4, #0\n\t"
  24705. #endif
  24706. /* A[1] * A[2] */
  24707. "ldr r10, [%[a], #8]\n\t"
  24708. "ldr r12, [%[a], #4]\n\t"
  24709. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  24710. "lsl r8, r10, #16\n\t"
  24711. "lsl r9, r12, #16\n\t"
  24712. "lsr r8, r8, #16\n\t"
  24713. "lsr r9, r9, #16\n\t"
  24714. "mul r9, r8, r9\n\t"
  24715. "adds r2, r2, r9\n\t"
  24716. "adcs r3, r3, #0\n\t"
  24717. "adc r4, r4, #0\n\t"
  24718. "adds r2, r2, r9\n\t"
  24719. "adcs r3, r3, #0\n\t"
  24720. "adc r4, r4, #0\n\t"
  24721. "lsr r9, r12, #16\n\t"
  24722. "mul r8, r9, r8\n\t"
  24723. "lsr r9, r8, #16\n\t"
  24724. "lsl r8, r8, #16\n\t"
  24725. "adds r2, r2, r8\n\t"
  24726. "adcs r3, r3, r9\n\t"
  24727. "adc r4, r4, #0\n\t"
  24728. "adds r2, r2, r8\n\t"
  24729. "adcs r3, r3, r9\n\t"
  24730. "adc r4, r4, #0\n\t"
  24731. "lsr r8, r10, #16\n\t"
  24732. "lsr r9, r12, #16\n\t"
  24733. "mul r9, r8, r9\n\t"
  24734. "adds r3, r3, r9\n\t"
  24735. "adc r4, r4, #0\n\t"
  24736. "adds r3, r3, r9\n\t"
  24737. "adc r4, r4, #0\n\t"
  24738. "lsl r9, r12, #16\n\t"
  24739. "lsr r9, r9, #16\n\t"
  24740. "mul r8, r9, r8\n\t"
  24741. "lsr r9, r8, #16\n\t"
  24742. "lsl r8, r8, #16\n\t"
  24743. "adds r2, r2, r8\n\t"
  24744. "adcs r3, r3, r9\n\t"
  24745. "adc r4, r4, #0\n\t"
  24746. "adds r2, r2, r8\n\t"
  24747. "adcs r3, r3, r9\n\t"
  24748. "adc r4, r4, #0\n\t"
  24749. #else
  24750. "umull r8, r9, r10, r12\n\t"
  24751. "adds r2, r2, r8\n\t"
  24752. "adcs r3, r3, r9\n\t"
  24753. "adc r4, r4, #0\n\t"
  24754. "adds r2, r2, r8\n\t"
  24755. "adcs r3, r3, r9\n\t"
  24756. "adc r4, r4, #0\n\t"
  24757. #endif
  24758. "str r2, [sp, #12]\n\t"
  24759. /* A[0] * A[4] */
  24760. "ldr r10, [%[a], #16]\n\t"
  24761. "ldr r12, [%[a]]\n\t"
  24762. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  24763. "lsl r8, r10, #16\n\t"
  24764. "lsl r9, r12, #16\n\t"
  24765. "lsr r8, r8, #16\n\t"
  24766. "lsr r9, r9, #16\n\t"
  24767. "mul r9, r8, r9\n\t"
  24768. "adds r3, r3, r9\n\t"
  24769. "adcs r4, r4, #0\n\t"
  24770. "mov r2, #0\n\t"
  24771. "adc r2, r2, #0\n\t"
  24772. "adds r3, r3, r9\n\t"
  24773. "adcs r4, r4, #0\n\t"
  24774. "adc r2, r2, #0\n\t"
  24775. "lsr r9, r12, #16\n\t"
  24776. "mul r8, r9, r8\n\t"
  24777. "lsr r9, r8, #16\n\t"
  24778. "lsl r8, r8, #16\n\t"
  24779. "adds r3, r3, r8\n\t"
  24780. "adcs r4, r4, r9\n\t"
  24781. "adc r2, r2, #0\n\t"
  24782. "adds r3, r3, r8\n\t"
  24783. "adcs r4, r4, r9\n\t"
  24784. "adc r2, r2, #0\n\t"
  24785. "lsr r8, r10, #16\n\t"
  24786. "lsr r9, r12, #16\n\t"
  24787. "mul r9, r8, r9\n\t"
  24788. "adds r4, r4, r9\n\t"
  24789. "adc r2, r2, #0\n\t"
  24790. "adds r4, r4, r9\n\t"
  24791. "adc r2, r2, #0\n\t"
  24792. "lsl r9, r12, #16\n\t"
  24793. "lsr r9, r9, #16\n\t"
  24794. "mul r8, r9, r8\n\t"
  24795. "lsr r9, r8, #16\n\t"
  24796. "lsl r8, r8, #16\n\t"
  24797. "adds r3, r3, r8\n\t"
  24798. "adcs r4, r4, r9\n\t"
  24799. "adc r2, r2, #0\n\t"
  24800. "adds r3, r3, r8\n\t"
  24801. "adcs r4, r4, r9\n\t"
  24802. "adc r2, r2, #0\n\t"
  24803. #else
  24804. "umull r8, r9, r10, r12\n\t"
  24805. "adds r3, r3, r8\n\t"
  24806. "adcs r4, r4, r9\n\t"
  24807. "mov r2, #0\n\t"
  24808. "adc r2, r2, #0\n\t"
  24809. "adds r3, r3, r8\n\t"
  24810. "adcs r4, r4, r9\n\t"
  24811. "mov r2, #0\n\t"
  24812. "adc r2, r2, #0\n\t"
  24813. #endif
  24814. /* A[1] * A[3] */
  24815. "ldr r10, [%[a], #12]\n\t"
  24816. "ldr r12, [%[a], #4]\n\t"
  24817. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  24818. "lsl r8, r10, #16\n\t"
  24819. "lsl r9, r12, #16\n\t"
  24820. "lsr r8, r8, #16\n\t"
  24821. "lsr r9, r9, #16\n\t"
  24822. "mul r9, r8, r9\n\t"
  24823. "adds r3, r3, r9\n\t"
  24824. "adcs r4, r4, #0\n\t"
  24825. "adc r2, r2, #0\n\t"
  24826. "adds r3, r3, r9\n\t"
  24827. "adcs r4, r4, #0\n\t"
  24828. "adc r2, r2, #0\n\t"
  24829. "lsr r9, r12, #16\n\t"
  24830. "mul r8, r9, r8\n\t"
  24831. "lsr r9, r8, #16\n\t"
  24832. "lsl r8, r8, #16\n\t"
  24833. "adds r3, r3, r8\n\t"
  24834. "adcs r4, r4, r9\n\t"
  24835. "adc r2, r2, #0\n\t"
  24836. "adds r3, r3, r8\n\t"
  24837. "adcs r4, r4, r9\n\t"
  24838. "adc r2, r2, #0\n\t"
  24839. "lsr r8, r10, #16\n\t"
  24840. "lsr r9, r12, #16\n\t"
  24841. "mul r9, r8, r9\n\t"
  24842. "adds r4, r4, r9\n\t"
  24843. "adc r2, r2, #0\n\t"
  24844. "adds r4, r4, r9\n\t"
  24845. "adc r2, r2, #0\n\t"
  24846. "lsl r9, r12, #16\n\t"
  24847. "lsr r9, r9, #16\n\t"
  24848. "mul r8, r9, r8\n\t"
  24849. "lsr r9, r8, #16\n\t"
  24850. "lsl r8, r8, #16\n\t"
  24851. "adds r3, r3, r8\n\t"
  24852. "adcs r4, r4, r9\n\t"
  24853. "adc r2, r2, #0\n\t"
  24854. "adds r3, r3, r8\n\t"
  24855. "adcs r4, r4, r9\n\t"
  24856. "adc r2, r2, #0\n\t"
  24857. #else
  24858. "umull r8, r9, r10, r12\n\t"
  24859. "adds r3, r3, r8\n\t"
  24860. "adcs r4, r4, r9\n\t"
  24861. "adc r2, r2, #0\n\t"
  24862. "adds r3, r3, r8\n\t"
  24863. "adcs r4, r4, r9\n\t"
  24864. "adc r2, r2, #0\n\t"
  24865. #endif
  24866. /* A[2] * A[2] */
  24867. "ldr r10, [%[a], #8]\n\t"
  24868. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  24869. "lsl r8, r10, #16\n\t"
  24870. "lsr r9, r10, #16\n\t"
  24871. "lsr r8, r8, #16\n\t"
  24872. "mov r12, r8\n\t"
  24873. "mul r8, r12, r8\n\t"
  24874. "mov r12, r9\n\t"
  24875. "mul r9, r12, r9\n\t"
  24876. "adds r3, r3, r8\n\t"
  24877. "adcs r4, r4, r9\n\t"
  24878. "adc r2, r2, #0\n\t"
  24879. "lsr r9, r10, #16\n\t"
  24880. "lsl r8, r10, #16\n\t"
  24881. "lsr r8, r8, #16\n\t"
  24882. "mul r8, r9, r8\n\t"
  24883. "lsr r9, r8, #15\n\t"
  24884. "lsl r8, r8, #17\n\t"
  24885. "adds r3, r3, r8\n\t"
  24886. "adcs r4, r4, r9\n\t"
  24887. "adc r2, r2, #0\n\t"
  24888. #else
  24889. "umull r8, r9, r10, r10\n\t"
  24890. "adds r3, r3, r8\n\t"
  24891. "adcs r4, r4, r9\n\t"
  24892. "adc r2, r2, #0\n\t"
  24893. #endif
  24894. "str r3, [sp, #16]\n\t"
  24895. /* A[0] * A[5] */
  24896. "ldr r10, [%[a], #20]\n\t"
  24897. "ldr r12, [%[a]]\n\t"
  24898. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  24899. "lsl r8, r10, #16\n\t"
  24900. "lsl r5, r12, #16\n\t"
  24901. "lsr r8, r8, #16\n\t"
  24902. "lsr r5, r5, #16\n\t"
  24903. "mul r5, r8, r5\n\t"
  24904. "lsr r9, r12, #16\n\t"
  24905. "mul r8, r9, r8\n\t"
  24906. "lsr r6, r8, #16\n\t"
  24907. "lsl r8, r8, #16\n\t"
  24908. "adds r5, r5, r8\n\t"
  24909. "adc r6, r6, #0\n\t"
  24910. "lsr r8, r10, #16\n\t"
  24911. "mul r9, r8, r9\n\t"
  24912. "add r6, r6, r9\n\t"
  24913. "lsl r9, r12, #16\n\t"
  24914. "lsr r9, r9, #16\n\t"
  24915. "mul r8, r9, r8\n\t"
  24916. "lsr r9, r8, #16\n\t"
  24917. "lsl r8, r8, #16\n\t"
  24918. "adds r5, r5, r8\n\t"
  24919. "adc r6, r6, r9\n\t"
  24920. #else
  24921. "umull r5, r6, r10, r12\n\t"
  24922. #endif
  24923. "mov r3, #0\n\t"
  24924. "mov r7, #0\n\t"
  24925. /* A[1] * A[4] */
  24926. "ldr r10, [%[a], #16]\n\t"
  24927. "ldr r12, [%[a], #4]\n\t"
  24928. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  24929. "lsl r8, r10, #16\n\t"
  24930. "lsl r9, r12, #16\n\t"
  24931. "lsr r8, r8, #16\n\t"
  24932. "lsr r9, r9, #16\n\t"
  24933. "mul r9, r8, r9\n\t"
  24934. "adds r5, r5, r9\n\t"
  24935. "adcs r6, r6, #0\n\t"
  24936. "adc r7, r7, #0\n\t"
  24937. "lsr r9, r12, #16\n\t"
  24938. "mul r8, r9, r8\n\t"
  24939. "lsr r9, r8, #16\n\t"
  24940. "lsl r8, r8, #16\n\t"
  24941. "adds r5, r5, r8\n\t"
  24942. "adcs r6, r6, r9\n\t"
  24943. "adc r7, r7, #0\n\t"
  24944. "lsr r8, r10, #16\n\t"
  24945. "lsr r9, r12, #16\n\t"
  24946. "mul r9, r8, r9\n\t"
  24947. "adds r6, r6, r9\n\t"
  24948. "adc r7, r7, #0\n\t"
  24949. "lsl r9, r12, #16\n\t"
  24950. "lsr r9, r9, #16\n\t"
  24951. "mul r8, r9, r8\n\t"
  24952. "lsr r9, r8, #16\n\t"
  24953. "lsl r8, r8, #16\n\t"
  24954. "adds r5, r5, r8\n\t"
  24955. "adcs r6, r6, r9\n\t"
  24956. "adc r7, r7, #0\n\t"
  24957. #else
  24958. "umull r8, r9, r10, r12\n\t"
  24959. "adds r5, r5, r8\n\t"
  24960. "adcs r6, r6, r9\n\t"
  24961. "adc r7, r7, #0\n\t"
  24962. #endif
  24963. /* A[2] * A[3] */
  24964. "ldr r10, [%[a], #12]\n\t"
  24965. "ldr r12, [%[a], #8]\n\t"
  24966. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  24967. "lsl r8, r10, #16\n\t"
  24968. "lsl r9, r12, #16\n\t"
  24969. "lsr r8, r8, #16\n\t"
  24970. "lsr r9, r9, #16\n\t"
  24971. "mul r9, r8, r9\n\t"
  24972. "adds r5, r5, r9\n\t"
  24973. "adcs r6, r6, #0\n\t"
  24974. "adc r7, r7, #0\n\t"
  24975. "lsr r9, r12, #16\n\t"
  24976. "mul r8, r9, r8\n\t"
  24977. "lsr r9, r8, #16\n\t"
  24978. "lsl r8, r8, #16\n\t"
  24979. "adds r5, r5, r8\n\t"
  24980. "adcs r6, r6, r9\n\t"
  24981. "adc r7, r7, #0\n\t"
  24982. "lsr r8, r10, #16\n\t"
  24983. "lsr r9, r12, #16\n\t"
  24984. "mul r9, r8, r9\n\t"
  24985. "adds r6, r6, r9\n\t"
  24986. "adc r7, r7, #0\n\t"
  24987. "lsl r9, r12, #16\n\t"
  24988. "lsr r9, r9, #16\n\t"
  24989. "mul r8, r9, r8\n\t"
  24990. "lsr r9, r8, #16\n\t"
  24991. "lsl r8, r8, #16\n\t"
  24992. "adds r5, r5, r8\n\t"
  24993. "adcs r6, r6, r9\n\t"
  24994. "adc r7, r7, #0\n\t"
  24995. #else
  24996. "umull r8, r9, r10, r12\n\t"
  24997. "adds r5, r5, r8\n\t"
  24998. "adcs r6, r6, r9\n\t"
  24999. "adc r7, r7, #0\n\t"
  25000. #endif
  25001. "adds r5, r5, r5\n\t"
  25002. "adcs r6, r6, r6\n\t"
  25003. "adc r7, r7, r7\n\t"
  25004. "adds r4, r4, r5\n\t"
  25005. "adcs r2, r2, r6\n\t"
  25006. "adc r3, r3, r7\n\t"
  25007. "str r4, [sp, #20]\n\t"
  25008. /* A[0] * A[6] */
  25009. "ldr r10, [%[a], #24]\n\t"
  25010. "ldr r12, [%[a]]\n\t"
  25011. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  25012. "lsl r8, r10, #16\n\t"
  25013. "lsl r5, r12, #16\n\t"
  25014. "lsr r8, r8, #16\n\t"
  25015. "lsr r5, r5, #16\n\t"
  25016. "mul r5, r8, r5\n\t"
  25017. "lsr r9, r12, #16\n\t"
  25018. "mul r8, r9, r8\n\t"
  25019. "lsr r6, r8, #16\n\t"
  25020. "lsl r8, r8, #16\n\t"
  25021. "adds r5, r5, r8\n\t"
  25022. "adc r6, r6, #0\n\t"
  25023. "lsr r8, r10, #16\n\t"
  25024. "mul r9, r8, r9\n\t"
  25025. "add r6, r6, r9\n\t"
  25026. "lsl r9, r12, #16\n\t"
  25027. "lsr r9, r9, #16\n\t"
  25028. "mul r8, r9, r8\n\t"
  25029. "lsr r9, r8, #16\n\t"
  25030. "lsl r8, r8, #16\n\t"
  25031. "adds r5, r5, r8\n\t"
  25032. "adc r6, r6, r9\n\t"
  25033. #else
  25034. "umull r5, r6, r10, r12\n\t"
  25035. #endif
  25036. "mov r4, #0\n\t"
  25037. "mov r7, #0\n\t"
  25038. /* A[1] * A[5] */
  25039. "ldr r10, [%[a], #20]\n\t"
  25040. "ldr r12, [%[a], #4]\n\t"
  25041. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  25042. "lsl r8, r10, #16\n\t"
  25043. "lsl r9, r12, #16\n\t"
  25044. "lsr r8, r8, #16\n\t"
  25045. "lsr r9, r9, #16\n\t"
  25046. "mul r9, r8, r9\n\t"
  25047. "adds r5, r5, r9\n\t"
  25048. "adcs r6, r6, #0\n\t"
  25049. "adc r7, r7, #0\n\t"
  25050. "lsr r9, r12, #16\n\t"
  25051. "mul r8, r9, r8\n\t"
  25052. "lsr r9, r8, #16\n\t"
  25053. "lsl r8, r8, #16\n\t"
  25054. "adds r5, r5, r8\n\t"
  25055. "adcs r6, r6, r9\n\t"
  25056. "adc r7, r7, #0\n\t"
  25057. "lsr r8, r10, #16\n\t"
  25058. "lsr r9, r12, #16\n\t"
  25059. "mul r9, r8, r9\n\t"
  25060. "adds r6, r6, r9\n\t"
  25061. "adc r7, r7, #0\n\t"
  25062. "lsl r9, r12, #16\n\t"
  25063. "lsr r9, r9, #16\n\t"
  25064. "mul r8, r9, r8\n\t"
  25065. "lsr r9, r8, #16\n\t"
  25066. "lsl r8, r8, #16\n\t"
  25067. "adds r5, r5, r8\n\t"
  25068. "adcs r6, r6, r9\n\t"
  25069. "adc r7, r7, #0\n\t"
  25070. #else
  25071. "umull r8, r9, r10, r12\n\t"
  25072. "adds r5, r5, r8\n\t"
  25073. "adcs r6, r6, r9\n\t"
  25074. "adc r7, r7, #0\n\t"
  25075. #endif
  25076. /* A[2] * A[4] */
  25077. "ldr r10, [%[a], #16]\n\t"
  25078. "ldr r12, [%[a], #8]\n\t"
  25079. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  25080. "lsl r8, r10, #16\n\t"
  25081. "lsl r9, r12, #16\n\t"
  25082. "lsr r8, r8, #16\n\t"
  25083. "lsr r9, r9, #16\n\t"
  25084. "mul r9, r8, r9\n\t"
  25085. "adds r5, r5, r9\n\t"
  25086. "adcs r6, r6, #0\n\t"
  25087. "adc r7, r7, #0\n\t"
  25088. "lsr r9, r12, #16\n\t"
  25089. "mul r8, r9, r8\n\t"
  25090. "lsr r9, r8, #16\n\t"
  25091. "lsl r8, r8, #16\n\t"
  25092. "adds r5, r5, r8\n\t"
  25093. "adcs r6, r6, r9\n\t"
  25094. "adc r7, r7, #0\n\t"
  25095. "lsr r8, r10, #16\n\t"
  25096. "lsr r9, r12, #16\n\t"
  25097. "mul r9, r8, r9\n\t"
  25098. "adds r6, r6, r9\n\t"
  25099. "adc r7, r7, #0\n\t"
  25100. "lsl r9, r12, #16\n\t"
  25101. "lsr r9, r9, #16\n\t"
  25102. "mul r8, r9, r8\n\t"
  25103. "lsr r9, r8, #16\n\t"
  25104. "lsl r8, r8, #16\n\t"
  25105. "adds r5, r5, r8\n\t"
  25106. "adcs r6, r6, r9\n\t"
  25107. "adc r7, r7, #0\n\t"
  25108. #else
  25109. "umull r8, r9, r10, r12\n\t"
  25110. "adds r5, r5, r8\n\t"
  25111. "adcs r6, r6, r9\n\t"
  25112. "adc r7, r7, #0\n\t"
  25113. #endif
  25114. /* A[3] * A[3] */
  25115. "ldr r10, [%[a], #12]\n\t"
  25116. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  25117. "lsl r8, r10, #16\n\t"
  25118. "lsr r9, r10, #16\n\t"
  25119. "lsr r8, r8, #16\n\t"
  25120. "mov r12, r8\n\t"
  25121. "mul r8, r12, r8\n\t"
  25122. "mov r12, r9\n\t"
  25123. "mul r9, r12, r9\n\t"
  25124. "adds r2, r2, r8\n\t"
  25125. "adcs r3, r3, r9\n\t"
  25126. "adc r4, r4, #0\n\t"
  25127. "lsr r9, r10, #16\n\t"
  25128. "lsl r8, r10, #16\n\t"
  25129. "lsr r8, r8, #16\n\t"
  25130. "mul r8, r9, r8\n\t"
  25131. "lsr r9, r8, #15\n\t"
  25132. "lsl r8, r8, #17\n\t"
  25133. "adds r2, r2, r8\n\t"
  25134. "adcs r3, r3, r9\n\t"
  25135. "adc r4, r4, #0\n\t"
  25136. "adds r5, r5, r5\n\t"
  25137. "adcs r6, r6, r6\n\t"
  25138. "adc r7, r7, r7\n\t"
  25139. #else
  25140. "umull r8, r9, r10, r10\n\t"
  25141. "adds r5, r5, r5\n\t"
  25142. "adcs r6, r6, r6\n\t"
  25143. "adc r7, r7, r7\n\t"
  25144. "adds r2, r2, r8\n\t"
  25145. "adcs r3, r3, r9\n\t"
  25146. "adc r4, r4, #0\n\t"
  25147. #endif
  25148. "adds r2, r2, r5\n\t"
  25149. "adcs r3, r3, r6\n\t"
  25150. "adc r4, r4, r7\n\t"
  25151. "str r2, [sp, #24]\n\t"
  25152. /* A[0] * A[7] */
  25153. "ldr r10, [%[a], #28]\n\t"
  25154. "ldr r12, [%[a]]\n\t"
  25155. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  25156. "lsl r8, r10, #16\n\t"
  25157. "lsl r5, r12, #16\n\t"
  25158. "lsr r8, r8, #16\n\t"
  25159. "lsr r5, r5, #16\n\t"
  25160. "mul r5, r8, r5\n\t"
  25161. "lsr r9, r12, #16\n\t"
  25162. "mul r8, r9, r8\n\t"
  25163. "lsr r6, r8, #16\n\t"
  25164. "lsl r8, r8, #16\n\t"
  25165. "adds r5, r5, r8\n\t"
  25166. "adc r6, r6, #0\n\t"
  25167. "lsr r8, r10, #16\n\t"
  25168. "mul r9, r8, r9\n\t"
  25169. "add r6, r6, r9\n\t"
  25170. "lsl r9, r12, #16\n\t"
  25171. "lsr r9, r9, #16\n\t"
  25172. "mul r8, r9, r8\n\t"
  25173. "lsr r9, r8, #16\n\t"
  25174. "lsl r8, r8, #16\n\t"
  25175. "adds r5, r5, r8\n\t"
  25176. "adc r6, r6, r9\n\t"
  25177. #else
  25178. "umull r5, r6, r10, r12\n\t"
  25179. #endif
  25180. "mov r2, #0\n\t"
  25181. "mov r7, #0\n\t"
  25182. /* A[1] * A[6] */
  25183. "ldr r10, [%[a], #24]\n\t"
  25184. "ldr r12, [%[a], #4]\n\t"
  25185. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  25186. "lsl r8, r10, #16\n\t"
  25187. "lsl r9, r12, #16\n\t"
  25188. "lsr r8, r8, #16\n\t"
  25189. "lsr r9, r9, #16\n\t"
  25190. "mul r9, r8, r9\n\t"
  25191. "adds r5, r5, r9\n\t"
  25192. "adcs r6, r6, #0\n\t"
  25193. "adc r7, r7, #0\n\t"
  25194. "lsr r9, r12, #16\n\t"
  25195. "mul r8, r9, r8\n\t"
  25196. "lsr r9, r8, #16\n\t"
  25197. "lsl r8, r8, #16\n\t"
  25198. "adds r5, r5, r8\n\t"
  25199. "adcs r6, r6, r9\n\t"
  25200. "adc r7, r7, #0\n\t"
  25201. "lsr r8, r10, #16\n\t"
  25202. "lsr r9, r12, #16\n\t"
  25203. "mul r9, r8, r9\n\t"
  25204. "adds r6, r6, r9\n\t"
  25205. "adc r7, r7, #0\n\t"
  25206. "lsl r9, r12, #16\n\t"
  25207. "lsr r9, r9, #16\n\t"
  25208. "mul r8, r9, r8\n\t"
  25209. "lsr r9, r8, #16\n\t"
  25210. "lsl r8, r8, #16\n\t"
  25211. "adds r5, r5, r8\n\t"
  25212. "adcs r6, r6, r9\n\t"
  25213. "adc r7, r7, #0\n\t"
  25214. #else
  25215. "umull r8, r9, r10, r12\n\t"
  25216. "adds r5, r5, r8\n\t"
  25217. "adcs r6, r6, r9\n\t"
  25218. "adc r7, r7, #0\n\t"
  25219. #endif
  25220. /* A[2] * A[5] */
  25221. "ldr r10, [%[a], #20]\n\t"
  25222. "ldr r12, [%[a], #8]\n\t"
  25223. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  25224. "lsl r8, r10, #16\n\t"
  25225. "lsl r9, r12, #16\n\t"
  25226. "lsr r8, r8, #16\n\t"
  25227. "lsr r9, r9, #16\n\t"
  25228. "mul r9, r8, r9\n\t"
  25229. "adds r5, r5, r9\n\t"
  25230. "adcs r6, r6, #0\n\t"
  25231. "adc r7, r7, #0\n\t"
  25232. "lsr r9, r12, #16\n\t"
  25233. "mul r8, r9, r8\n\t"
  25234. "lsr r9, r8, #16\n\t"
  25235. "lsl r8, r8, #16\n\t"
  25236. "adds r5, r5, r8\n\t"
  25237. "adcs r6, r6, r9\n\t"
  25238. "adc r7, r7, #0\n\t"
  25239. "lsr r8, r10, #16\n\t"
  25240. "lsr r9, r12, #16\n\t"
  25241. "mul r9, r8, r9\n\t"
  25242. "adds r6, r6, r9\n\t"
  25243. "adc r7, r7, #0\n\t"
  25244. "lsl r9, r12, #16\n\t"
  25245. "lsr r9, r9, #16\n\t"
  25246. "mul r8, r9, r8\n\t"
  25247. "lsr r9, r8, #16\n\t"
  25248. "lsl r8, r8, #16\n\t"
  25249. "adds r5, r5, r8\n\t"
  25250. "adcs r6, r6, r9\n\t"
  25251. "adc r7, r7, #0\n\t"
  25252. #else
  25253. "umull r8, r9, r10, r12\n\t"
  25254. "adds r5, r5, r8\n\t"
  25255. "adcs r6, r6, r9\n\t"
  25256. "adc r7, r7, #0\n\t"
  25257. #endif
  25258. /* A[3] * A[4] */
  25259. "ldr r10, [%[a], #16]\n\t"
  25260. "ldr r12, [%[a], #12]\n\t"
  25261. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  25262. "lsl r8, r10, #16\n\t"
  25263. "lsl r9, r12, #16\n\t"
  25264. "lsr r8, r8, #16\n\t"
  25265. "lsr r9, r9, #16\n\t"
  25266. "mul r9, r8, r9\n\t"
  25267. "adds r5, r5, r9\n\t"
  25268. "adcs r6, r6, #0\n\t"
  25269. "adc r7, r7, #0\n\t"
  25270. "lsr r9, r12, #16\n\t"
  25271. "mul r8, r9, r8\n\t"
  25272. "lsr r9, r8, #16\n\t"
  25273. "lsl r8, r8, #16\n\t"
  25274. "adds r5, r5, r8\n\t"
  25275. "adcs r6, r6, r9\n\t"
  25276. "adc r7, r7, #0\n\t"
  25277. "lsr r8, r10, #16\n\t"
  25278. "lsr r9, r12, #16\n\t"
  25279. "mul r9, r8, r9\n\t"
  25280. "adds r6, r6, r9\n\t"
  25281. "adc r7, r7, #0\n\t"
  25282. "lsl r9, r12, #16\n\t"
  25283. "lsr r9, r9, #16\n\t"
  25284. "mul r8, r9, r8\n\t"
  25285. "lsr r9, r8, #16\n\t"
  25286. "lsl r8, r8, #16\n\t"
  25287. "adds r5, r5, r8\n\t"
  25288. "adcs r6, r6, r9\n\t"
  25289. "adc r7, r7, #0\n\t"
  25290. #else
  25291. "umull r8, r9, r10, r12\n\t"
  25292. "adds r5, r5, r8\n\t"
  25293. "adcs r6, r6, r9\n\t"
  25294. "adc r7, r7, #0\n\t"
  25295. #endif
  25296. "adds r5, r5, r5\n\t"
  25297. "adcs r6, r6, r6\n\t"
  25298. "adc r7, r7, r7\n\t"
  25299. "adds r3, r3, r5\n\t"
  25300. "adcs r4, r4, r6\n\t"
  25301. "adc r2, r2, r7\n\t"
  25302. "str r3, [sp, #28]\n\t"
  25303. /* A[0] * A[8] */
  25304. "ldr r10, [%[a], #32]\n\t"
  25305. "ldr r12, [%[a]]\n\t"
  25306. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  25307. "lsl r8, r10, #16\n\t"
  25308. "lsl r5, r12, #16\n\t"
  25309. "lsr r8, r8, #16\n\t"
  25310. "lsr r5, r5, #16\n\t"
  25311. "mul r5, r8, r5\n\t"
  25312. "lsr r9, r12, #16\n\t"
  25313. "mul r8, r9, r8\n\t"
  25314. "lsr r6, r8, #16\n\t"
  25315. "lsl r8, r8, #16\n\t"
  25316. "adds r5, r5, r8\n\t"
  25317. "adc r6, r6, #0\n\t"
  25318. "lsr r8, r10, #16\n\t"
  25319. "mul r9, r8, r9\n\t"
  25320. "add r6, r6, r9\n\t"
  25321. "lsl r9, r12, #16\n\t"
  25322. "lsr r9, r9, #16\n\t"
  25323. "mul r8, r9, r8\n\t"
  25324. "lsr r9, r8, #16\n\t"
  25325. "lsl r8, r8, #16\n\t"
  25326. "adds r5, r5, r8\n\t"
  25327. "adc r6, r6, r9\n\t"
  25328. #else
  25329. "umull r5, r6, r10, r12\n\t"
  25330. #endif
  25331. "mov r3, #0\n\t"
  25332. "mov r7, #0\n\t"
  25333. /* A[1] * A[7] */
  25334. "ldr r10, [%[a], #28]\n\t"
  25335. "ldr r12, [%[a], #4]\n\t"
  25336. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  25337. "lsl r8, r10, #16\n\t"
  25338. "lsl r9, r12, #16\n\t"
  25339. "lsr r8, r8, #16\n\t"
  25340. "lsr r9, r9, #16\n\t"
  25341. "mul r9, r8, r9\n\t"
  25342. "adds r5, r5, r9\n\t"
  25343. "adcs r6, r6, #0\n\t"
  25344. "adc r7, r7, #0\n\t"
  25345. "lsr r9, r12, #16\n\t"
  25346. "mul r8, r9, r8\n\t"
  25347. "lsr r9, r8, #16\n\t"
  25348. "lsl r8, r8, #16\n\t"
  25349. "adds r5, r5, r8\n\t"
  25350. "adcs r6, r6, r9\n\t"
  25351. "adc r7, r7, #0\n\t"
  25352. "lsr r8, r10, #16\n\t"
  25353. "lsr r9, r12, #16\n\t"
  25354. "mul r9, r8, r9\n\t"
  25355. "adds r6, r6, r9\n\t"
  25356. "adc r7, r7, #0\n\t"
  25357. "lsl r9, r12, #16\n\t"
  25358. "lsr r9, r9, #16\n\t"
  25359. "mul r8, r9, r8\n\t"
  25360. "lsr r9, r8, #16\n\t"
  25361. "lsl r8, r8, #16\n\t"
  25362. "adds r5, r5, r8\n\t"
  25363. "adcs r6, r6, r9\n\t"
  25364. "adc r7, r7, #0\n\t"
  25365. #else
  25366. "umull r8, r9, r10, r12\n\t"
  25367. "adds r5, r5, r8\n\t"
  25368. "adcs r6, r6, r9\n\t"
  25369. "adc r7, r7, #0\n\t"
  25370. #endif
  25371. /* A[2] * A[6] */
  25372. "ldr r10, [%[a], #24]\n\t"
  25373. "ldr r12, [%[a], #8]\n\t"
  25374. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  25375. "lsl r8, r10, #16\n\t"
  25376. "lsl r9, r12, #16\n\t"
  25377. "lsr r8, r8, #16\n\t"
  25378. "lsr r9, r9, #16\n\t"
  25379. "mul r9, r8, r9\n\t"
  25380. "adds r5, r5, r9\n\t"
  25381. "adcs r6, r6, #0\n\t"
  25382. "adc r7, r7, #0\n\t"
  25383. "lsr r9, r12, #16\n\t"
  25384. "mul r8, r9, r8\n\t"
  25385. "lsr r9, r8, #16\n\t"
  25386. "lsl r8, r8, #16\n\t"
  25387. "adds r5, r5, r8\n\t"
  25388. "adcs r6, r6, r9\n\t"
  25389. "adc r7, r7, #0\n\t"
  25390. "lsr r8, r10, #16\n\t"
  25391. "lsr r9, r12, #16\n\t"
  25392. "mul r9, r8, r9\n\t"
  25393. "adds r6, r6, r9\n\t"
  25394. "adc r7, r7, #0\n\t"
  25395. "lsl r9, r12, #16\n\t"
  25396. "lsr r9, r9, #16\n\t"
  25397. "mul r8, r9, r8\n\t"
  25398. "lsr r9, r8, #16\n\t"
  25399. "lsl r8, r8, #16\n\t"
  25400. "adds r5, r5, r8\n\t"
  25401. "adcs r6, r6, r9\n\t"
  25402. "adc r7, r7, #0\n\t"
  25403. #else
  25404. "umull r8, r9, r10, r12\n\t"
  25405. "adds r5, r5, r8\n\t"
  25406. "adcs r6, r6, r9\n\t"
  25407. "adc r7, r7, #0\n\t"
  25408. #endif
  25409. /* A[3] * A[5] */
  25410. "ldr r10, [%[a], #20]\n\t"
  25411. "ldr r12, [%[a], #12]\n\t"
  25412. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  25413. "lsl r8, r10, #16\n\t"
  25414. "lsl r9, r12, #16\n\t"
  25415. "lsr r8, r8, #16\n\t"
  25416. "lsr r9, r9, #16\n\t"
  25417. "mul r9, r8, r9\n\t"
  25418. "adds r5, r5, r9\n\t"
  25419. "adcs r6, r6, #0\n\t"
  25420. "adc r7, r7, #0\n\t"
  25421. "lsr r9, r12, #16\n\t"
  25422. "mul r8, r9, r8\n\t"
  25423. "lsr r9, r8, #16\n\t"
  25424. "lsl r8, r8, #16\n\t"
  25425. "adds r5, r5, r8\n\t"
  25426. "adcs r6, r6, r9\n\t"
  25427. "adc r7, r7, #0\n\t"
  25428. "lsr r8, r10, #16\n\t"
  25429. "lsr r9, r12, #16\n\t"
  25430. "mul r9, r8, r9\n\t"
  25431. "adds r6, r6, r9\n\t"
  25432. "adc r7, r7, #0\n\t"
  25433. "lsl r9, r12, #16\n\t"
  25434. "lsr r9, r9, #16\n\t"
  25435. "mul r8, r9, r8\n\t"
  25436. "lsr r9, r8, #16\n\t"
  25437. "lsl r8, r8, #16\n\t"
  25438. "adds r5, r5, r8\n\t"
  25439. "adcs r6, r6, r9\n\t"
  25440. "adc r7, r7, #0\n\t"
  25441. #else
  25442. "umull r8, r9, r10, r12\n\t"
  25443. "adds r5, r5, r8\n\t"
  25444. "adcs r6, r6, r9\n\t"
  25445. "adc r7, r7, #0\n\t"
  25446. #endif
  25447. /* A[4] * A[4] */
  25448. "ldr r10, [%[a], #16]\n\t"
  25449. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  25450. "lsl r8, r10, #16\n\t"
  25451. "lsr r9, r10, #16\n\t"
  25452. "lsr r8, r8, #16\n\t"
  25453. "mov r12, r8\n\t"
  25454. "mul r8, r12, r8\n\t"
  25455. "mov r12, r9\n\t"
  25456. "mul r9, r12, r9\n\t"
  25457. "adds r4, r4, r8\n\t"
  25458. "adcs r2, r2, r9\n\t"
  25459. "adc r3, r3, #0\n\t"
  25460. "lsr r9, r10, #16\n\t"
  25461. "lsl r8, r10, #16\n\t"
  25462. "lsr r8, r8, #16\n\t"
  25463. "mul r8, r9, r8\n\t"
  25464. "lsr r9, r8, #15\n\t"
  25465. "lsl r8, r8, #17\n\t"
  25466. "adds r4, r4, r8\n\t"
  25467. "adcs r2, r2, r9\n\t"
  25468. "adc r3, r3, #0\n\t"
  25469. "adds r5, r5, r5\n\t"
  25470. "adcs r6, r6, r6\n\t"
  25471. "adc r7, r7, r7\n\t"
  25472. #else
  25473. "umull r8, r9, r10, r10\n\t"
  25474. "adds r5, r5, r5\n\t"
  25475. "adcs r6, r6, r6\n\t"
  25476. "adc r7, r7, r7\n\t"
  25477. "adds r4, r4, r8\n\t"
  25478. "adcs r2, r2, r9\n\t"
  25479. "adc r3, r3, #0\n\t"
  25480. #endif
  25481. "adds r4, r4, r5\n\t"
  25482. "adcs r2, r2, r6\n\t"
  25483. "adc r3, r3, r7\n\t"
  25484. "str r4, [sp, #32]\n\t"
  25485. /* A[0] * A[9] */
  25486. "ldr r10, [%[a], #36]\n\t"
  25487. "ldr r12, [%[a]]\n\t"
  25488. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  25489. "lsl r8, r10, #16\n\t"
  25490. "lsl r5, r12, #16\n\t"
  25491. "lsr r8, r8, #16\n\t"
  25492. "lsr r5, r5, #16\n\t"
  25493. "mul r5, r8, r5\n\t"
  25494. "lsr r9, r12, #16\n\t"
  25495. "mul r8, r9, r8\n\t"
  25496. "lsr r6, r8, #16\n\t"
  25497. "lsl r8, r8, #16\n\t"
  25498. "adds r5, r5, r8\n\t"
  25499. "adc r6, r6, #0\n\t"
  25500. "lsr r8, r10, #16\n\t"
  25501. "mul r9, r8, r9\n\t"
  25502. "add r6, r6, r9\n\t"
  25503. "lsl r9, r12, #16\n\t"
  25504. "lsr r9, r9, #16\n\t"
  25505. "mul r8, r9, r8\n\t"
  25506. "lsr r9, r8, #16\n\t"
  25507. "lsl r8, r8, #16\n\t"
  25508. "adds r5, r5, r8\n\t"
  25509. "adc r6, r6, r9\n\t"
  25510. #else
  25511. "umull r5, r6, r10, r12\n\t"
  25512. #endif
  25513. "mov r4, #0\n\t"
  25514. "mov r7, #0\n\t"
  25515. /* A[1] * A[8] */
  25516. "ldr r10, [%[a], #32]\n\t"
  25517. "ldr r12, [%[a], #4]\n\t"
  25518. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  25519. "lsl r8, r10, #16\n\t"
  25520. "lsl r9, r12, #16\n\t"
  25521. "lsr r8, r8, #16\n\t"
  25522. "lsr r9, r9, #16\n\t"
  25523. "mul r9, r8, r9\n\t"
  25524. "adds r5, r5, r9\n\t"
  25525. "adcs r6, r6, #0\n\t"
  25526. "adc r7, r7, #0\n\t"
  25527. "lsr r9, r12, #16\n\t"
  25528. "mul r8, r9, r8\n\t"
  25529. "lsr r9, r8, #16\n\t"
  25530. "lsl r8, r8, #16\n\t"
  25531. "adds r5, r5, r8\n\t"
  25532. "adcs r6, r6, r9\n\t"
  25533. "adc r7, r7, #0\n\t"
  25534. "lsr r8, r10, #16\n\t"
  25535. "lsr r9, r12, #16\n\t"
  25536. "mul r9, r8, r9\n\t"
  25537. "adds r6, r6, r9\n\t"
  25538. "adc r7, r7, #0\n\t"
  25539. "lsl r9, r12, #16\n\t"
  25540. "lsr r9, r9, #16\n\t"
  25541. "mul r8, r9, r8\n\t"
  25542. "lsr r9, r8, #16\n\t"
  25543. "lsl r8, r8, #16\n\t"
  25544. "adds r5, r5, r8\n\t"
  25545. "adcs r6, r6, r9\n\t"
  25546. "adc r7, r7, #0\n\t"
  25547. #else
  25548. "umull r8, r9, r10, r12\n\t"
  25549. "adds r5, r5, r8\n\t"
  25550. "adcs r6, r6, r9\n\t"
  25551. "adc r7, r7, #0\n\t"
  25552. #endif
  25553. /* A[2] * A[7] */
  25554. "ldr r10, [%[a], #28]\n\t"
  25555. "ldr r12, [%[a], #8]\n\t"
  25556. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  25557. "lsl r8, r10, #16\n\t"
  25558. "lsl r9, r12, #16\n\t"
  25559. "lsr r8, r8, #16\n\t"
  25560. "lsr r9, r9, #16\n\t"
  25561. "mul r9, r8, r9\n\t"
  25562. "adds r5, r5, r9\n\t"
  25563. "adcs r6, r6, #0\n\t"
  25564. "adc r7, r7, #0\n\t"
  25565. "lsr r9, r12, #16\n\t"
  25566. "mul r8, r9, r8\n\t"
  25567. "lsr r9, r8, #16\n\t"
  25568. "lsl r8, r8, #16\n\t"
  25569. "adds r5, r5, r8\n\t"
  25570. "adcs r6, r6, r9\n\t"
  25571. "adc r7, r7, #0\n\t"
  25572. "lsr r8, r10, #16\n\t"
  25573. "lsr r9, r12, #16\n\t"
  25574. "mul r9, r8, r9\n\t"
  25575. "adds r6, r6, r9\n\t"
  25576. "adc r7, r7, #0\n\t"
  25577. "lsl r9, r12, #16\n\t"
  25578. "lsr r9, r9, #16\n\t"
  25579. "mul r8, r9, r8\n\t"
  25580. "lsr r9, r8, #16\n\t"
  25581. "lsl r8, r8, #16\n\t"
  25582. "adds r5, r5, r8\n\t"
  25583. "adcs r6, r6, r9\n\t"
  25584. "adc r7, r7, #0\n\t"
  25585. #else
  25586. "umull r8, r9, r10, r12\n\t"
  25587. "adds r5, r5, r8\n\t"
  25588. "adcs r6, r6, r9\n\t"
  25589. "adc r7, r7, #0\n\t"
  25590. #endif
  25591. /* A[3] * A[6] */
  25592. "ldr r10, [%[a], #24]\n\t"
  25593. "ldr r12, [%[a], #12]\n\t"
  25594. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  25595. "lsl r8, r10, #16\n\t"
  25596. "lsl r9, r12, #16\n\t"
  25597. "lsr r8, r8, #16\n\t"
  25598. "lsr r9, r9, #16\n\t"
  25599. "mul r9, r8, r9\n\t"
  25600. "adds r5, r5, r9\n\t"
  25601. "adcs r6, r6, #0\n\t"
  25602. "adc r7, r7, #0\n\t"
  25603. "lsr r9, r12, #16\n\t"
  25604. "mul r8, r9, r8\n\t"
  25605. "lsr r9, r8, #16\n\t"
  25606. "lsl r8, r8, #16\n\t"
  25607. "adds r5, r5, r8\n\t"
  25608. "adcs r6, r6, r9\n\t"
  25609. "adc r7, r7, #0\n\t"
  25610. "lsr r8, r10, #16\n\t"
  25611. "lsr r9, r12, #16\n\t"
  25612. "mul r9, r8, r9\n\t"
  25613. "adds r6, r6, r9\n\t"
  25614. "adc r7, r7, #0\n\t"
  25615. "lsl r9, r12, #16\n\t"
  25616. "lsr r9, r9, #16\n\t"
  25617. "mul r8, r9, r8\n\t"
  25618. "lsr r9, r8, #16\n\t"
  25619. "lsl r8, r8, #16\n\t"
  25620. "adds r5, r5, r8\n\t"
  25621. "adcs r6, r6, r9\n\t"
  25622. "adc r7, r7, #0\n\t"
  25623. #else
  25624. "umull r8, r9, r10, r12\n\t"
  25625. "adds r5, r5, r8\n\t"
  25626. "adcs r6, r6, r9\n\t"
  25627. "adc r7, r7, #0\n\t"
  25628. #endif
  25629. /* A[4] * A[5] */
  25630. "ldr r10, [%[a], #20]\n\t"
  25631. "ldr r12, [%[a], #16]\n\t"
  25632. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  25633. "lsl r8, r10, #16\n\t"
  25634. "lsl r9, r12, #16\n\t"
  25635. "lsr r8, r8, #16\n\t"
  25636. "lsr r9, r9, #16\n\t"
  25637. "mul r9, r8, r9\n\t"
  25638. "adds r5, r5, r9\n\t"
  25639. "adcs r6, r6, #0\n\t"
  25640. "adc r7, r7, #0\n\t"
  25641. "lsr r9, r12, #16\n\t"
  25642. "mul r8, r9, r8\n\t"
  25643. "lsr r9, r8, #16\n\t"
  25644. "lsl r8, r8, #16\n\t"
  25645. "adds r5, r5, r8\n\t"
  25646. "adcs r6, r6, r9\n\t"
  25647. "adc r7, r7, #0\n\t"
  25648. "lsr r8, r10, #16\n\t"
  25649. "lsr r9, r12, #16\n\t"
  25650. "mul r9, r8, r9\n\t"
  25651. "adds r6, r6, r9\n\t"
  25652. "adc r7, r7, #0\n\t"
  25653. "lsl r9, r12, #16\n\t"
  25654. "lsr r9, r9, #16\n\t"
  25655. "mul r8, r9, r8\n\t"
  25656. "lsr r9, r8, #16\n\t"
  25657. "lsl r8, r8, #16\n\t"
  25658. "adds r5, r5, r8\n\t"
  25659. "adcs r6, r6, r9\n\t"
  25660. "adc r7, r7, #0\n\t"
  25661. #else
  25662. "umull r8, r9, r10, r12\n\t"
  25663. "adds r5, r5, r8\n\t"
  25664. "adcs r6, r6, r9\n\t"
  25665. "adc r7, r7, #0\n\t"
  25666. #endif
  25667. "adds r5, r5, r5\n\t"
  25668. "adcs r6, r6, r6\n\t"
  25669. "adc r7, r7, r7\n\t"
  25670. "adds r2, r2, r5\n\t"
  25671. "adcs r3, r3, r6\n\t"
  25672. "adc r4, r4, r7\n\t"
  25673. "str r2, [sp, #36]\n\t"
  25674. /* A[0] * A[10] */
  25675. "ldr r10, [%[a], #40]\n\t"
  25676. "ldr r12, [%[a]]\n\t"
  25677. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  25678. "lsl r8, r10, #16\n\t"
  25679. "lsl r5, r12, #16\n\t"
  25680. "lsr r8, r8, #16\n\t"
  25681. "lsr r5, r5, #16\n\t"
  25682. "mul r5, r8, r5\n\t"
  25683. "lsr r9, r12, #16\n\t"
  25684. "mul r8, r9, r8\n\t"
  25685. "lsr r6, r8, #16\n\t"
  25686. "lsl r8, r8, #16\n\t"
  25687. "adds r5, r5, r8\n\t"
  25688. "adc r6, r6, #0\n\t"
  25689. "lsr r8, r10, #16\n\t"
  25690. "mul r9, r8, r9\n\t"
  25691. "add r6, r6, r9\n\t"
  25692. "lsl r9, r12, #16\n\t"
  25693. "lsr r9, r9, #16\n\t"
  25694. "mul r8, r9, r8\n\t"
  25695. "lsr r9, r8, #16\n\t"
  25696. "lsl r8, r8, #16\n\t"
  25697. "adds r5, r5, r8\n\t"
  25698. "adc r6, r6, r9\n\t"
  25699. #else
  25700. "umull r5, r6, r10, r12\n\t"
  25701. #endif
  25702. "mov r2, #0\n\t"
  25703. "mov r7, #0\n\t"
  25704. /* A[1] * A[9] */
  25705. "ldr r10, [%[a], #36]\n\t"
  25706. "ldr r12, [%[a], #4]\n\t"
  25707. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  25708. "lsl r8, r10, #16\n\t"
  25709. "lsl r9, r12, #16\n\t"
  25710. "lsr r8, r8, #16\n\t"
  25711. "lsr r9, r9, #16\n\t"
  25712. "mul r9, r8, r9\n\t"
  25713. "adds r5, r5, r9\n\t"
  25714. "adcs r6, r6, #0\n\t"
  25715. "adc r7, r7, #0\n\t"
  25716. "lsr r9, r12, #16\n\t"
  25717. "mul r8, r9, r8\n\t"
  25718. "lsr r9, r8, #16\n\t"
  25719. "lsl r8, r8, #16\n\t"
  25720. "adds r5, r5, r8\n\t"
  25721. "adcs r6, r6, r9\n\t"
  25722. "adc r7, r7, #0\n\t"
  25723. "lsr r8, r10, #16\n\t"
  25724. "lsr r9, r12, #16\n\t"
  25725. "mul r9, r8, r9\n\t"
  25726. "adds r6, r6, r9\n\t"
  25727. "adc r7, r7, #0\n\t"
  25728. "lsl r9, r12, #16\n\t"
  25729. "lsr r9, r9, #16\n\t"
  25730. "mul r8, r9, r8\n\t"
  25731. "lsr r9, r8, #16\n\t"
  25732. "lsl r8, r8, #16\n\t"
  25733. "adds r5, r5, r8\n\t"
  25734. "adcs r6, r6, r9\n\t"
  25735. "adc r7, r7, #0\n\t"
  25736. #else
  25737. "umull r8, r9, r10, r12\n\t"
  25738. "adds r5, r5, r8\n\t"
  25739. "adcs r6, r6, r9\n\t"
  25740. "adc r7, r7, #0\n\t"
  25741. #endif
  25742. /* A[2] * A[8] */
  25743. "ldr r10, [%[a], #32]\n\t"
  25744. "ldr r12, [%[a], #8]\n\t"
  25745. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  25746. "lsl r8, r10, #16\n\t"
  25747. "lsl r9, r12, #16\n\t"
  25748. "lsr r8, r8, #16\n\t"
  25749. "lsr r9, r9, #16\n\t"
  25750. "mul r9, r8, r9\n\t"
  25751. "adds r5, r5, r9\n\t"
  25752. "adcs r6, r6, #0\n\t"
  25753. "adc r7, r7, #0\n\t"
  25754. "lsr r9, r12, #16\n\t"
  25755. "mul r8, r9, r8\n\t"
  25756. "lsr r9, r8, #16\n\t"
  25757. "lsl r8, r8, #16\n\t"
  25758. "adds r5, r5, r8\n\t"
  25759. "adcs r6, r6, r9\n\t"
  25760. "adc r7, r7, #0\n\t"
  25761. "lsr r8, r10, #16\n\t"
  25762. "lsr r9, r12, #16\n\t"
  25763. "mul r9, r8, r9\n\t"
  25764. "adds r6, r6, r9\n\t"
  25765. "adc r7, r7, #0\n\t"
  25766. "lsl r9, r12, #16\n\t"
  25767. "lsr r9, r9, #16\n\t"
  25768. "mul r8, r9, r8\n\t"
  25769. "lsr r9, r8, #16\n\t"
  25770. "lsl r8, r8, #16\n\t"
  25771. "adds r5, r5, r8\n\t"
  25772. "adcs r6, r6, r9\n\t"
  25773. "adc r7, r7, #0\n\t"
  25774. #else
  25775. "umull r8, r9, r10, r12\n\t"
  25776. "adds r5, r5, r8\n\t"
  25777. "adcs r6, r6, r9\n\t"
  25778. "adc r7, r7, #0\n\t"
  25779. #endif
  25780. /* A[3] * A[7] */
  25781. "ldr r10, [%[a], #28]\n\t"
  25782. "ldr r12, [%[a], #12]\n\t"
  25783. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  25784. "lsl r8, r10, #16\n\t"
  25785. "lsl r9, r12, #16\n\t"
  25786. "lsr r8, r8, #16\n\t"
  25787. "lsr r9, r9, #16\n\t"
  25788. "mul r9, r8, r9\n\t"
  25789. "adds r5, r5, r9\n\t"
  25790. "adcs r6, r6, #0\n\t"
  25791. "adc r7, r7, #0\n\t"
  25792. "lsr r9, r12, #16\n\t"
  25793. "mul r8, r9, r8\n\t"
  25794. "lsr r9, r8, #16\n\t"
  25795. "lsl r8, r8, #16\n\t"
  25796. "adds r5, r5, r8\n\t"
  25797. "adcs r6, r6, r9\n\t"
  25798. "adc r7, r7, #0\n\t"
  25799. "lsr r8, r10, #16\n\t"
  25800. "lsr r9, r12, #16\n\t"
  25801. "mul r9, r8, r9\n\t"
  25802. "adds r6, r6, r9\n\t"
  25803. "adc r7, r7, #0\n\t"
  25804. "lsl r9, r12, #16\n\t"
  25805. "lsr r9, r9, #16\n\t"
  25806. "mul r8, r9, r8\n\t"
  25807. "lsr r9, r8, #16\n\t"
  25808. "lsl r8, r8, #16\n\t"
  25809. "adds r5, r5, r8\n\t"
  25810. "adcs r6, r6, r9\n\t"
  25811. "adc r7, r7, #0\n\t"
  25812. #else
  25813. "umull r8, r9, r10, r12\n\t"
  25814. "adds r5, r5, r8\n\t"
  25815. "adcs r6, r6, r9\n\t"
  25816. "adc r7, r7, #0\n\t"
  25817. #endif
  25818. /* A[4] * A[6] */
  25819. "ldr r10, [%[a], #24]\n\t"
  25820. "ldr r12, [%[a], #16]\n\t"
  25821. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  25822. "lsl r8, r10, #16\n\t"
  25823. "lsl r9, r12, #16\n\t"
  25824. "lsr r8, r8, #16\n\t"
  25825. "lsr r9, r9, #16\n\t"
  25826. "mul r9, r8, r9\n\t"
  25827. "adds r5, r5, r9\n\t"
  25828. "adcs r6, r6, #0\n\t"
  25829. "adc r7, r7, #0\n\t"
  25830. "lsr r9, r12, #16\n\t"
  25831. "mul r8, r9, r8\n\t"
  25832. "lsr r9, r8, #16\n\t"
  25833. "lsl r8, r8, #16\n\t"
  25834. "adds r5, r5, r8\n\t"
  25835. "adcs r6, r6, r9\n\t"
  25836. "adc r7, r7, #0\n\t"
  25837. "lsr r8, r10, #16\n\t"
  25838. "lsr r9, r12, #16\n\t"
  25839. "mul r9, r8, r9\n\t"
  25840. "adds r6, r6, r9\n\t"
  25841. "adc r7, r7, #0\n\t"
  25842. "lsl r9, r12, #16\n\t"
  25843. "lsr r9, r9, #16\n\t"
  25844. "mul r8, r9, r8\n\t"
  25845. "lsr r9, r8, #16\n\t"
  25846. "lsl r8, r8, #16\n\t"
  25847. "adds r5, r5, r8\n\t"
  25848. "adcs r6, r6, r9\n\t"
  25849. "adc r7, r7, #0\n\t"
  25850. #else
  25851. "umull r8, r9, r10, r12\n\t"
  25852. "adds r5, r5, r8\n\t"
  25853. "adcs r6, r6, r9\n\t"
  25854. "adc r7, r7, #0\n\t"
  25855. #endif
  25856. /* A[5] * A[5] */
  25857. "ldr r10, [%[a], #20]\n\t"
  25858. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  25859. "lsl r8, r10, #16\n\t"
  25860. "lsr r9, r10, #16\n\t"
  25861. "lsr r8, r8, #16\n\t"
  25862. "mov r12, r8\n\t"
  25863. "mul r8, r12, r8\n\t"
  25864. "mov r12, r9\n\t"
  25865. "mul r9, r12, r9\n\t"
  25866. "adds r3, r3, r8\n\t"
  25867. "adcs r4, r4, r9\n\t"
  25868. "adc r2, r2, #0\n\t"
  25869. "lsr r9, r10, #16\n\t"
  25870. "lsl r8, r10, #16\n\t"
  25871. "lsr r8, r8, #16\n\t"
  25872. "mul r8, r9, r8\n\t"
  25873. "lsr r9, r8, #15\n\t"
  25874. "lsl r8, r8, #17\n\t"
  25875. "adds r3, r3, r8\n\t"
  25876. "adcs r4, r4, r9\n\t"
  25877. "adc r2, r2, #0\n\t"
  25878. "adds r5, r5, r5\n\t"
  25879. "adcs r6, r6, r6\n\t"
  25880. "adc r7, r7, r7\n\t"
  25881. #else
  25882. "umull r8, r9, r10, r10\n\t"
  25883. "adds r5, r5, r5\n\t"
  25884. "adcs r6, r6, r6\n\t"
  25885. "adc r7, r7, r7\n\t"
  25886. "adds r3, r3, r8\n\t"
  25887. "adcs r4, r4, r9\n\t"
  25888. "adc r2, r2, #0\n\t"
  25889. #endif
  25890. "adds r3, r3, r5\n\t"
  25891. "adcs r4, r4, r6\n\t"
  25892. "adc r2, r2, r7\n\t"
  25893. "str r3, [sp, #40]\n\t"
  25894. /* A[0] * A[11] */
  25895. "ldr r10, [%[a], #44]\n\t"
  25896. "ldr r12, [%[a]]\n\t"
  25897. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  25898. "lsl r8, r10, #16\n\t"
  25899. "lsl r5, r12, #16\n\t"
  25900. "lsr r8, r8, #16\n\t"
  25901. "lsr r5, r5, #16\n\t"
  25902. "mul r5, r8, r5\n\t"
  25903. "lsr r9, r12, #16\n\t"
  25904. "mul r8, r9, r8\n\t"
  25905. "lsr r6, r8, #16\n\t"
  25906. "lsl r8, r8, #16\n\t"
  25907. "adds r5, r5, r8\n\t"
  25908. "adc r6, r6, #0\n\t"
  25909. "lsr r8, r10, #16\n\t"
  25910. "mul r9, r8, r9\n\t"
  25911. "add r6, r6, r9\n\t"
  25912. "lsl r9, r12, #16\n\t"
  25913. "lsr r9, r9, #16\n\t"
  25914. "mul r8, r9, r8\n\t"
  25915. "lsr r9, r8, #16\n\t"
  25916. "lsl r8, r8, #16\n\t"
  25917. "adds r5, r5, r8\n\t"
  25918. "adc r6, r6, r9\n\t"
  25919. #else
  25920. "umull r5, r6, r10, r12\n\t"
  25921. #endif
  25922. "mov r3, #0\n\t"
  25923. "mov r7, #0\n\t"
  25924. /* A[1] * A[10] */
  25925. "ldr r10, [%[a], #40]\n\t"
  25926. "ldr r12, [%[a], #4]\n\t"
  25927. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  25928. "lsl r8, r10, #16\n\t"
  25929. "lsl r9, r12, #16\n\t"
  25930. "lsr r8, r8, #16\n\t"
  25931. "lsr r9, r9, #16\n\t"
  25932. "mul r9, r8, r9\n\t"
  25933. "adds r5, r5, r9\n\t"
  25934. "adcs r6, r6, #0\n\t"
  25935. "adc r7, r7, #0\n\t"
  25936. "lsr r9, r12, #16\n\t"
  25937. "mul r8, r9, r8\n\t"
  25938. "lsr r9, r8, #16\n\t"
  25939. "lsl r8, r8, #16\n\t"
  25940. "adds r5, r5, r8\n\t"
  25941. "adcs r6, r6, r9\n\t"
  25942. "adc r7, r7, #0\n\t"
  25943. "lsr r8, r10, #16\n\t"
  25944. "lsr r9, r12, #16\n\t"
  25945. "mul r9, r8, r9\n\t"
  25946. "adds r6, r6, r9\n\t"
  25947. "adc r7, r7, #0\n\t"
  25948. "lsl r9, r12, #16\n\t"
  25949. "lsr r9, r9, #16\n\t"
  25950. "mul r8, r9, r8\n\t"
  25951. "lsr r9, r8, #16\n\t"
  25952. "lsl r8, r8, #16\n\t"
  25953. "adds r5, r5, r8\n\t"
  25954. "adcs r6, r6, r9\n\t"
  25955. "adc r7, r7, #0\n\t"
  25956. #else
  25957. "umull r8, r9, r10, r12\n\t"
  25958. "adds r5, r5, r8\n\t"
  25959. "adcs r6, r6, r9\n\t"
  25960. "adc r7, r7, #0\n\t"
  25961. #endif
  25962. /* A[2] * A[9] */
  25963. "ldr r10, [%[a], #36]\n\t"
  25964. "ldr r12, [%[a], #8]\n\t"
  25965. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  25966. "lsl r8, r10, #16\n\t"
  25967. "lsl r9, r12, #16\n\t"
  25968. "lsr r8, r8, #16\n\t"
  25969. "lsr r9, r9, #16\n\t"
  25970. "mul r9, r8, r9\n\t"
  25971. "adds r5, r5, r9\n\t"
  25972. "adcs r6, r6, #0\n\t"
  25973. "adc r7, r7, #0\n\t"
  25974. "lsr r9, r12, #16\n\t"
  25975. "mul r8, r9, r8\n\t"
  25976. "lsr r9, r8, #16\n\t"
  25977. "lsl r8, r8, #16\n\t"
  25978. "adds r5, r5, r8\n\t"
  25979. "adcs r6, r6, r9\n\t"
  25980. "adc r7, r7, #0\n\t"
  25981. "lsr r8, r10, #16\n\t"
  25982. "lsr r9, r12, #16\n\t"
  25983. "mul r9, r8, r9\n\t"
  25984. "adds r6, r6, r9\n\t"
  25985. "adc r7, r7, #0\n\t"
  25986. "lsl r9, r12, #16\n\t"
  25987. "lsr r9, r9, #16\n\t"
  25988. "mul r8, r9, r8\n\t"
  25989. "lsr r9, r8, #16\n\t"
  25990. "lsl r8, r8, #16\n\t"
  25991. "adds r5, r5, r8\n\t"
  25992. "adcs r6, r6, r9\n\t"
  25993. "adc r7, r7, #0\n\t"
  25994. #else
  25995. "umull r8, r9, r10, r12\n\t"
  25996. "adds r5, r5, r8\n\t"
  25997. "adcs r6, r6, r9\n\t"
  25998. "adc r7, r7, #0\n\t"
  25999. #endif
  26000. /* A[3] * A[8] */
  26001. "ldr r10, [%[a], #32]\n\t"
  26002. "ldr r12, [%[a], #12]\n\t"
  26003. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  26004. "lsl r8, r10, #16\n\t"
  26005. "lsl r9, r12, #16\n\t"
  26006. "lsr r8, r8, #16\n\t"
  26007. "lsr r9, r9, #16\n\t"
  26008. "mul r9, r8, r9\n\t"
  26009. "adds r5, r5, r9\n\t"
  26010. "adcs r6, r6, #0\n\t"
  26011. "adc r7, r7, #0\n\t"
  26012. "lsr r9, r12, #16\n\t"
  26013. "mul r8, r9, r8\n\t"
  26014. "lsr r9, r8, #16\n\t"
  26015. "lsl r8, r8, #16\n\t"
  26016. "adds r5, r5, r8\n\t"
  26017. "adcs r6, r6, r9\n\t"
  26018. "adc r7, r7, #0\n\t"
  26019. "lsr r8, r10, #16\n\t"
  26020. "lsr r9, r12, #16\n\t"
  26021. "mul r9, r8, r9\n\t"
  26022. "adds r6, r6, r9\n\t"
  26023. "adc r7, r7, #0\n\t"
  26024. "lsl r9, r12, #16\n\t"
  26025. "lsr r9, r9, #16\n\t"
  26026. "mul r8, r9, r8\n\t"
  26027. "lsr r9, r8, #16\n\t"
  26028. "lsl r8, r8, #16\n\t"
  26029. "adds r5, r5, r8\n\t"
  26030. "adcs r6, r6, r9\n\t"
  26031. "adc r7, r7, #0\n\t"
  26032. #else
  26033. "umull r8, r9, r10, r12\n\t"
  26034. "adds r5, r5, r8\n\t"
  26035. "adcs r6, r6, r9\n\t"
  26036. "adc r7, r7, #0\n\t"
  26037. #endif
  26038. /* A[4] * A[7] */
  26039. "ldr r10, [%[a], #28]\n\t"
  26040. "ldr r12, [%[a], #16]\n\t"
  26041. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  26042. "lsl r8, r10, #16\n\t"
  26043. "lsl r9, r12, #16\n\t"
  26044. "lsr r8, r8, #16\n\t"
  26045. "lsr r9, r9, #16\n\t"
  26046. "mul r9, r8, r9\n\t"
  26047. "adds r5, r5, r9\n\t"
  26048. "adcs r6, r6, #0\n\t"
  26049. "adc r7, r7, #0\n\t"
  26050. "lsr r9, r12, #16\n\t"
  26051. "mul r8, r9, r8\n\t"
  26052. "lsr r9, r8, #16\n\t"
  26053. "lsl r8, r8, #16\n\t"
  26054. "adds r5, r5, r8\n\t"
  26055. "adcs r6, r6, r9\n\t"
  26056. "adc r7, r7, #0\n\t"
  26057. "lsr r8, r10, #16\n\t"
  26058. "lsr r9, r12, #16\n\t"
  26059. "mul r9, r8, r9\n\t"
  26060. "adds r6, r6, r9\n\t"
  26061. "adc r7, r7, #0\n\t"
  26062. "lsl r9, r12, #16\n\t"
  26063. "lsr r9, r9, #16\n\t"
  26064. "mul r8, r9, r8\n\t"
  26065. "lsr r9, r8, #16\n\t"
  26066. "lsl r8, r8, #16\n\t"
  26067. "adds r5, r5, r8\n\t"
  26068. "adcs r6, r6, r9\n\t"
  26069. "adc r7, r7, #0\n\t"
  26070. #else
  26071. "umull r8, r9, r10, r12\n\t"
  26072. "adds r5, r5, r8\n\t"
  26073. "adcs r6, r6, r9\n\t"
  26074. "adc r7, r7, #0\n\t"
  26075. #endif
  26076. /* A[5] * A[6] */
  26077. "ldr r10, [%[a], #24]\n\t"
  26078. "ldr r12, [%[a], #20]\n\t"
  26079. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  26080. "lsl r8, r10, #16\n\t"
  26081. "lsl r9, r12, #16\n\t"
  26082. "lsr r8, r8, #16\n\t"
  26083. "lsr r9, r9, #16\n\t"
  26084. "mul r9, r8, r9\n\t"
  26085. "adds r5, r5, r9\n\t"
  26086. "adcs r6, r6, #0\n\t"
  26087. "adc r7, r7, #0\n\t"
  26088. "lsr r9, r12, #16\n\t"
  26089. "mul r8, r9, r8\n\t"
  26090. "lsr r9, r8, #16\n\t"
  26091. "lsl r8, r8, #16\n\t"
  26092. "adds r5, r5, r8\n\t"
  26093. "adcs r6, r6, r9\n\t"
  26094. "adc r7, r7, #0\n\t"
  26095. "lsr r8, r10, #16\n\t"
  26096. "lsr r9, r12, #16\n\t"
  26097. "mul r9, r8, r9\n\t"
  26098. "adds r6, r6, r9\n\t"
  26099. "adc r7, r7, #0\n\t"
  26100. "lsl r9, r12, #16\n\t"
  26101. "lsr r9, r9, #16\n\t"
  26102. "mul r8, r9, r8\n\t"
  26103. "lsr r9, r8, #16\n\t"
  26104. "lsl r8, r8, #16\n\t"
  26105. "adds r5, r5, r8\n\t"
  26106. "adcs r6, r6, r9\n\t"
  26107. "adc r7, r7, #0\n\t"
  26108. #else
  26109. "umull r8, r9, r10, r12\n\t"
  26110. "adds r5, r5, r8\n\t"
  26111. "adcs r6, r6, r9\n\t"
  26112. "adc r7, r7, #0\n\t"
  26113. #endif
  26114. "adds r5, r5, r5\n\t"
  26115. "adcs r6, r6, r6\n\t"
  26116. "adc r7, r7, r7\n\t"
  26117. "adds r4, r4, r5\n\t"
  26118. "adcs r2, r2, r6\n\t"
  26119. "adc r3, r3, r7\n\t"
  26120. "str r4, [sp, #44]\n\t"
  26121. /* A[1] * A[11] */
  26122. "ldr r10, [%[a], #44]\n\t"
  26123. "ldr r12, [%[a], #4]\n\t"
  26124. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  26125. "lsl r8, r10, #16\n\t"
  26126. "lsl r5, r12, #16\n\t"
  26127. "lsr r8, r8, #16\n\t"
  26128. "lsr r5, r5, #16\n\t"
  26129. "mul r5, r8, r5\n\t"
  26130. "lsr r9, r12, #16\n\t"
  26131. "mul r8, r9, r8\n\t"
  26132. "lsr r6, r8, #16\n\t"
  26133. "lsl r8, r8, #16\n\t"
  26134. "adds r5, r5, r8\n\t"
  26135. "adc r6, r6, #0\n\t"
  26136. "lsr r8, r10, #16\n\t"
  26137. "mul r9, r8, r9\n\t"
  26138. "add r6, r6, r9\n\t"
  26139. "lsl r9, r12, #16\n\t"
  26140. "lsr r9, r9, #16\n\t"
  26141. "mul r8, r9, r8\n\t"
  26142. "lsr r9, r8, #16\n\t"
  26143. "lsl r8, r8, #16\n\t"
  26144. "adds r5, r5, r8\n\t"
  26145. "adc r6, r6, r9\n\t"
  26146. #else
  26147. "umull r5, r6, r10, r12\n\t"
  26148. #endif
  26149. "mov r4, #0\n\t"
  26150. "mov r7, #0\n\t"
  26151. /* A[2] * A[10] */
  26152. "ldr r10, [%[a], #40]\n\t"
  26153. "ldr r12, [%[a], #8]\n\t"
  26154. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  26155. "lsl r8, r10, #16\n\t"
  26156. "lsl r9, r12, #16\n\t"
  26157. "lsr r8, r8, #16\n\t"
  26158. "lsr r9, r9, #16\n\t"
  26159. "mul r9, r8, r9\n\t"
  26160. "adds r5, r5, r9\n\t"
  26161. "adcs r6, r6, #0\n\t"
  26162. "adc r7, r7, #0\n\t"
  26163. "lsr r9, r12, #16\n\t"
  26164. "mul r8, r9, r8\n\t"
  26165. "lsr r9, r8, #16\n\t"
  26166. "lsl r8, r8, #16\n\t"
  26167. "adds r5, r5, r8\n\t"
  26168. "adcs r6, r6, r9\n\t"
  26169. "adc r7, r7, #0\n\t"
  26170. "lsr r8, r10, #16\n\t"
  26171. "lsr r9, r12, #16\n\t"
  26172. "mul r9, r8, r9\n\t"
  26173. "adds r6, r6, r9\n\t"
  26174. "adc r7, r7, #0\n\t"
  26175. "lsl r9, r12, #16\n\t"
  26176. "lsr r9, r9, #16\n\t"
  26177. "mul r8, r9, r8\n\t"
  26178. "lsr r9, r8, #16\n\t"
  26179. "lsl r8, r8, #16\n\t"
  26180. "adds r5, r5, r8\n\t"
  26181. "adcs r6, r6, r9\n\t"
  26182. "adc r7, r7, #0\n\t"
  26183. #else
  26184. "umull r8, r9, r10, r12\n\t"
  26185. "adds r5, r5, r8\n\t"
  26186. "adcs r6, r6, r9\n\t"
  26187. "adc r7, r7, #0\n\t"
  26188. #endif
  26189. /* A[3] * A[9] */
  26190. "ldr r10, [%[a], #36]\n\t"
  26191. "ldr r12, [%[a], #12]\n\t"
  26192. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  26193. "lsl r8, r10, #16\n\t"
  26194. "lsl r9, r12, #16\n\t"
  26195. "lsr r8, r8, #16\n\t"
  26196. "lsr r9, r9, #16\n\t"
  26197. "mul r9, r8, r9\n\t"
  26198. "adds r5, r5, r9\n\t"
  26199. "adcs r6, r6, #0\n\t"
  26200. "adc r7, r7, #0\n\t"
  26201. "lsr r9, r12, #16\n\t"
  26202. "mul r8, r9, r8\n\t"
  26203. "lsr r9, r8, #16\n\t"
  26204. "lsl r8, r8, #16\n\t"
  26205. "adds r5, r5, r8\n\t"
  26206. "adcs r6, r6, r9\n\t"
  26207. "adc r7, r7, #0\n\t"
  26208. "lsr r8, r10, #16\n\t"
  26209. "lsr r9, r12, #16\n\t"
  26210. "mul r9, r8, r9\n\t"
  26211. "adds r6, r6, r9\n\t"
  26212. "adc r7, r7, #0\n\t"
  26213. "lsl r9, r12, #16\n\t"
  26214. "lsr r9, r9, #16\n\t"
  26215. "mul r8, r9, r8\n\t"
  26216. "lsr r9, r8, #16\n\t"
  26217. "lsl r8, r8, #16\n\t"
  26218. "adds r5, r5, r8\n\t"
  26219. "adcs r6, r6, r9\n\t"
  26220. "adc r7, r7, #0\n\t"
  26221. #else
  26222. "umull r8, r9, r10, r12\n\t"
  26223. "adds r5, r5, r8\n\t"
  26224. "adcs r6, r6, r9\n\t"
  26225. "adc r7, r7, #0\n\t"
  26226. #endif
  26227. /* A[4] * A[8] */
  26228. "ldr r10, [%[a], #32]\n\t"
  26229. "ldr r12, [%[a], #16]\n\t"
  26230. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  26231. "lsl r8, r10, #16\n\t"
  26232. "lsl r9, r12, #16\n\t"
  26233. "lsr r8, r8, #16\n\t"
  26234. "lsr r9, r9, #16\n\t"
  26235. "mul r9, r8, r9\n\t"
  26236. "adds r5, r5, r9\n\t"
  26237. "adcs r6, r6, #0\n\t"
  26238. "adc r7, r7, #0\n\t"
  26239. "lsr r9, r12, #16\n\t"
  26240. "mul r8, r9, r8\n\t"
  26241. "lsr r9, r8, #16\n\t"
  26242. "lsl r8, r8, #16\n\t"
  26243. "adds r5, r5, r8\n\t"
  26244. "adcs r6, r6, r9\n\t"
  26245. "adc r7, r7, #0\n\t"
  26246. "lsr r8, r10, #16\n\t"
  26247. "lsr r9, r12, #16\n\t"
  26248. "mul r9, r8, r9\n\t"
  26249. "adds r6, r6, r9\n\t"
  26250. "adc r7, r7, #0\n\t"
  26251. "lsl r9, r12, #16\n\t"
  26252. "lsr r9, r9, #16\n\t"
  26253. "mul r8, r9, r8\n\t"
  26254. "lsr r9, r8, #16\n\t"
  26255. "lsl r8, r8, #16\n\t"
  26256. "adds r5, r5, r8\n\t"
  26257. "adcs r6, r6, r9\n\t"
  26258. "adc r7, r7, #0\n\t"
  26259. #else
  26260. "umull r8, r9, r10, r12\n\t"
  26261. "adds r5, r5, r8\n\t"
  26262. "adcs r6, r6, r9\n\t"
  26263. "adc r7, r7, #0\n\t"
  26264. #endif
  26265. /* A[5] * A[7] */
  26266. "ldr r10, [%[a], #28]\n\t"
  26267. "ldr r12, [%[a], #20]\n\t"
  26268. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  26269. "lsl r8, r10, #16\n\t"
  26270. "lsl r9, r12, #16\n\t"
  26271. "lsr r8, r8, #16\n\t"
  26272. "lsr r9, r9, #16\n\t"
  26273. "mul r9, r8, r9\n\t"
  26274. "adds r5, r5, r9\n\t"
  26275. "adcs r6, r6, #0\n\t"
  26276. "adc r7, r7, #0\n\t"
  26277. "lsr r9, r12, #16\n\t"
  26278. "mul r8, r9, r8\n\t"
  26279. "lsr r9, r8, #16\n\t"
  26280. "lsl r8, r8, #16\n\t"
  26281. "adds r5, r5, r8\n\t"
  26282. "adcs r6, r6, r9\n\t"
  26283. "adc r7, r7, #0\n\t"
  26284. "lsr r8, r10, #16\n\t"
  26285. "lsr r9, r12, #16\n\t"
  26286. "mul r9, r8, r9\n\t"
  26287. "adds r6, r6, r9\n\t"
  26288. "adc r7, r7, #0\n\t"
  26289. "lsl r9, r12, #16\n\t"
  26290. "lsr r9, r9, #16\n\t"
  26291. "mul r8, r9, r8\n\t"
  26292. "lsr r9, r8, #16\n\t"
  26293. "lsl r8, r8, #16\n\t"
  26294. "adds r5, r5, r8\n\t"
  26295. "adcs r6, r6, r9\n\t"
  26296. "adc r7, r7, #0\n\t"
  26297. #else
  26298. "umull r8, r9, r10, r12\n\t"
  26299. "adds r5, r5, r8\n\t"
  26300. "adcs r6, r6, r9\n\t"
  26301. "adc r7, r7, #0\n\t"
  26302. #endif
  26303. /* A[6] * A[6] */
  26304. "ldr r10, [%[a], #24]\n\t"
  26305. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  26306. "lsl r8, r10, #16\n\t"
  26307. "lsr r9, r10, #16\n\t"
  26308. "lsr r8, r8, #16\n\t"
  26309. "mov r12, r8\n\t"
  26310. "mul r8, r12, r8\n\t"
  26311. "mov r12, r9\n\t"
  26312. "mul r9, r12, r9\n\t"
  26313. "adds r2, r2, r8\n\t"
  26314. "adcs r3, r3, r9\n\t"
  26315. "adc r4, r4, #0\n\t"
  26316. "lsr r9, r10, #16\n\t"
  26317. "lsl r8, r10, #16\n\t"
  26318. "lsr r8, r8, #16\n\t"
  26319. "mul r8, r9, r8\n\t"
  26320. "lsr r9, r8, #15\n\t"
  26321. "lsl r8, r8, #17\n\t"
  26322. "adds r2, r2, r8\n\t"
  26323. "adcs r3, r3, r9\n\t"
  26324. "adc r4, r4, #0\n\t"
  26325. "adds r5, r5, r5\n\t"
  26326. "adcs r6, r6, r6\n\t"
  26327. "adc r7, r7, r7\n\t"
  26328. #else
  26329. "umull r8, r9, r10, r10\n\t"
  26330. "adds r5, r5, r5\n\t"
  26331. "adcs r6, r6, r6\n\t"
  26332. "adc r7, r7, r7\n\t"
  26333. "adds r2, r2, r8\n\t"
  26334. "adcs r3, r3, r9\n\t"
  26335. "adc r4, r4, #0\n\t"
  26336. #endif
  26337. "adds r2, r2, r5\n\t"
  26338. "adcs r3, r3, r6\n\t"
  26339. "adc r4, r4, r7\n\t"
  26340. "str r2, [%[r], #48]\n\t"
  26341. /* A[2] * A[11] */
  26342. "ldr r10, [%[a], #44]\n\t"
  26343. "ldr r12, [%[a], #8]\n\t"
  26344. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  26345. "lsl r8, r10, #16\n\t"
  26346. "lsl r5, r12, #16\n\t"
  26347. "lsr r8, r8, #16\n\t"
  26348. "lsr r5, r5, #16\n\t"
  26349. "mul r5, r8, r5\n\t"
  26350. "lsr r9, r12, #16\n\t"
  26351. "mul r8, r9, r8\n\t"
  26352. "lsr r6, r8, #16\n\t"
  26353. "lsl r8, r8, #16\n\t"
  26354. "adds r5, r5, r8\n\t"
  26355. "adc r6, r6, #0\n\t"
  26356. "lsr r8, r10, #16\n\t"
  26357. "mul r9, r8, r9\n\t"
  26358. "add r6, r6, r9\n\t"
  26359. "lsl r9, r12, #16\n\t"
  26360. "lsr r9, r9, #16\n\t"
  26361. "mul r8, r9, r8\n\t"
  26362. "lsr r9, r8, #16\n\t"
  26363. "lsl r8, r8, #16\n\t"
  26364. "adds r5, r5, r8\n\t"
  26365. "adc r6, r6, r9\n\t"
  26366. #else
  26367. "umull r5, r6, r10, r12\n\t"
  26368. #endif
  26369. "mov r2, #0\n\t"
  26370. "mov r7, #0\n\t"
  26371. /* A[3] * A[10] */
  26372. "ldr r10, [%[a], #40]\n\t"
  26373. "ldr r12, [%[a], #12]\n\t"
  26374. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  26375. "lsl r8, r10, #16\n\t"
  26376. "lsl r9, r12, #16\n\t"
  26377. "lsr r8, r8, #16\n\t"
  26378. "lsr r9, r9, #16\n\t"
  26379. "mul r9, r8, r9\n\t"
  26380. "adds r5, r5, r9\n\t"
  26381. "adcs r6, r6, #0\n\t"
  26382. "adc r7, r7, #0\n\t"
  26383. "lsr r9, r12, #16\n\t"
  26384. "mul r8, r9, r8\n\t"
  26385. "lsr r9, r8, #16\n\t"
  26386. "lsl r8, r8, #16\n\t"
  26387. "adds r5, r5, r8\n\t"
  26388. "adcs r6, r6, r9\n\t"
  26389. "adc r7, r7, #0\n\t"
  26390. "lsr r8, r10, #16\n\t"
  26391. "lsr r9, r12, #16\n\t"
  26392. "mul r9, r8, r9\n\t"
  26393. "adds r6, r6, r9\n\t"
  26394. "adc r7, r7, #0\n\t"
  26395. "lsl r9, r12, #16\n\t"
  26396. "lsr r9, r9, #16\n\t"
  26397. "mul r8, r9, r8\n\t"
  26398. "lsr r9, r8, #16\n\t"
  26399. "lsl r8, r8, #16\n\t"
  26400. "adds r5, r5, r8\n\t"
  26401. "adcs r6, r6, r9\n\t"
  26402. "adc r7, r7, #0\n\t"
  26403. #else
  26404. "umull r8, r9, r10, r12\n\t"
  26405. "adds r5, r5, r8\n\t"
  26406. "adcs r6, r6, r9\n\t"
  26407. "adc r7, r7, #0\n\t"
  26408. #endif
  26409. /* A[4] * A[9] */
  26410. "ldr r10, [%[a], #36]\n\t"
  26411. "ldr r12, [%[a], #16]\n\t"
  26412. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  26413. "lsl r8, r10, #16\n\t"
  26414. "lsl r9, r12, #16\n\t"
  26415. "lsr r8, r8, #16\n\t"
  26416. "lsr r9, r9, #16\n\t"
  26417. "mul r9, r8, r9\n\t"
  26418. "adds r5, r5, r9\n\t"
  26419. "adcs r6, r6, #0\n\t"
  26420. "adc r7, r7, #0\n\t"
  26421. "lsr r9, r12, #16\n\t"
  26422. "mul r8, r9, r8\n\t"
  26423. "lsr r9, r8, #16\n\t"
  26424. "lsl r8, r8, #16\n\t"
  26425. "adds r5, r5, r8\n\t"
  26426. "adcs r6, r6, r9\n\t"
  26427. "adc r7, r7, #0\n\t"
  26428. "lsr r8, r10, #16\n\t"
  26429. "lsr r9, r12, #16\n\t"
  26430. "mul r9, r8, r9\n\t"
  26431. "adds r6, r6, r9\n\t"
  26432. "adc r7, r7, #0\n\t"
  26433. "lsl r9, r12, #16\n\t"
  26434. "lsr r9, r9, #16\n\t"
  26435. "mul r8, r9, r8\n\t"
  26436. "lsr r9, r8, #16\n\t"
  26437. "lsl r8, r8, #16\n\t"
  26438. "adds r5, r5, r8\n\t"
  26439. "adcs r6, r6, r9\n\t"
  26440. "adc r7, r7, #0\n\t"
  26441. #else
  26442. "umull r8, r9, r10, r12\n\t"
  26443. "adds r5, r5, r8\n\t"
  26444. "adcs r6, r6, r9\n\t"
  26445. "adc r7, r7, #0\n\t"
  26446. #endif
  26447. /* A[5] * A[8] */
  26448. "ldr r10, [%[a], #32]\n\t"
  26449. "ldr r12, [%[a], #20]\n\t"
  26450. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  26451. "lsl r8, r10, #16\n\t"
  26452. "lsl r9, r12, #16\n\t"
  26453. "lsr r8, r8, #16\n\t"
  26454. "lsr r9, r9, #16\n\t"
  26455. "mul r9, r8, r9\n\t"
  26456. "adds r5, r5, r9\n\t"
  26457. "adcs r6, r6, #0\n\t"
  26458. "adc r7, r7, #0\n\t"
  26459. "lsr r9, r12, #16\n\t"
  26460. "mul r8, r9, r8\n\t"
  26461. "lsr r9, r8, #16\n\t"
  26462. "lsl r8, r8, #16\n\t"
  26463. "adds r5, r5, r8\n\t"
  26464. "adcs r6, r6, r9\n\t"
  26465. "adc r7, r7, #0\n\t"
  26466. "lsr r8, r10, #16\n\t"
  26467. "lsr r9, r12, #16\n\t"
  26468. "mul r9, r8, r9\n\t"
  26469. "adds r6, r6, r9\n\t"
  26470. "adc r7, r7, #0\n\t"
  26471. "lsl r9, r12, #16\n\t"
  26472. "lsr r9, r9, #16\n\t"
  26473. "mul r8, r9, r8\n\t"
  26474. "lsr r9, r8, #16\n\t"
  26475. "lsl r8, r8, #16\n\t"
  26476. "adds r5, r5, r8\n\t"
  26477. "adcs r6, r6, r9\n\t"
  26478. "adc r7, r7, #0\n\t"
  26479. #else
  26480. "umull r8, r9, r10, r12\n\t"
  26481. "adds r5, r5, r8\n\t"
  26482. "adcs r6, r6, r9\n\t"
  26483. "adc r7, r7, #0\n\t"
  26484. #endif
  26485. /* A[6] * A[7] */
  26486. "ldr r10, [%[a], #28]\n\t"
  26487. "ldr r12, [%[a], #24]\n\t"
  26488. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  26489. "lsl r8, r10, #16\n\t"
  26490. "lsl r9, r12, #16\n\t"
  26491. "lsr r8, r8, #16\n\t"
  26492. "lsr r9, r9, #16\n\t"
  26493. "mul r9, r8, r9\n\t"
  26494. "adds r5, r5, r9\n\t"
  26495. "adcs r6, r6, #0\n\t"
  26496. "adc r7, r7, #0\n\t"
  26497. "lsr r9, r12, #16\n\t"
  26498. "mul r8, r9, r8\n\t"
  26499. "lsr r9, r8, #16\n\t"
  26500. "lsl r8, r8, #16\n\t"
  26501. "adds r5, r5, r8\n\t"
  26502. "adcs r6, r6, r9\n\t"
  26503. "adc r7, r7, #0\n\t"
  26504. "lsr r8, r10, #16\n\t"
  26505. "lsr r9, r12, #16\n\t"
  26506. "mul r9, r8, r9\n\t"
  26507. "adds r6, r6, r9\n\t"
  26508. "adc r7, r7, #0\n\t"
  26509. "lsl r9, r12, #16\n\t"
  26510. "lsr r9, r9, #16\n\t"
  26511. "mul r8, r9, r8\n\t"
  26512. "lsr r9, r8, #16\n\t"
  26513. "lsl r8, r8, #16\n\t"
  26514. "adds r5, r5, r8\n\t"
  26515. "adcs r6, r6, r9\n\t"
  26516. "adc r7, r7, #0\n\t"
  26517. #else
  26518. "umull r8, r9, r10, r12\n\t"
  26519. "adds r5, r5, r8\n\t"
  26520. "adcs r6, r6, r9\n\t"
  26521. "adc r7, r7, #0\n\t"
  26522. #endif
  26523. "adds r5, r5, r5\n\t"
  26524. "adcs r6, r6, r6\n\t"
  26525. "adc r7, r7, r7\n\t"
  26526. "adds r3, r3, r5\n\t"
  26527. "adcs r4, r4, r6\n\t"
  26528. "adc r2, r2, r7\n\t"
  26529. "str r3, [%[r], #52]\n\t"
  26530. /* A[3] * A[11] */
  26531. "ldr r10, [%[a], #44]\n\t"
  26532. "ldr r12, [%[a], #12]\n\t"
  26533. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  26534. "lsl r8, r10, #16\n\t"
  26535. "lsl r5, r12, #16\n\t"
  26536. "lsr r8, r8, #16\n\t"
  26537. "lsr r5, r5, #16\n\t"
  26538. "mul r5, r8, r5\n\t"
  26539. "lsr r9, r12, #16\n\t"
  26540. "mul r8, r9, r8\n\t"
  26541. "lsr r6, r8, #16\n\t"
  26542. "lsl r8, r8, #16\n\t"
  26543. "adds r5, r5, r8\n\t"
  26544. "adc r6, r6, #0\n\t"
  26545. "lsr r8, r10, #16\n\t"
  26546. "mul r9, r8, r9\n\t"
  26547. "add r6, r6, r9\n\t"
  26548. "lsl r9, r12, #16\n\t"
  26549. "lsr r9, r9, #16\n\t"
  26550. "mul r8, r9, r8\n\t"
  26551. "lsr r9, r8, #16\n\t"
  26552. "lsl r8, r8, #16\n\t"
  26553. "adds r5, r5, r8\n\t"
  26554. "adc r6, r6, r9\n\t"
  26555. #else
  26556. "umull r5, r6, r10, r12\n\t"
  26557. #endif
  26558. "mov r3, #0\n\t"
  26559. "mov r7, #0\n\t"
  26560. /* A[4] * A[10] */
  26561. "ldr r10, [%[a], #40]\n\t"
  26562. "ldr r12, [%[a], #16]\n\t"
  26563. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  26564. "lsl r8, r10, #16\n\t"
  26565. "lsl r9, r12, #16\n\t"
  26566. "lsr r8, r8, #16\n\t"
  26567. "lsr r9, r9, #16\n\t"
  26568. "mul r9, r8, r9\n\t"
  26569. "adds r5, r5, r9\n\t"
  26570. "adcs r6, r6, #0\n\t"
  26571. "adc r7, r7, #0\n\t"
  26572. "lsr r9, r12, #16\n\t"
  26573. "mul r8, r9, r8\n\t"
  26574. "lsr r9, r8, #16\n\t"
  26575. "lsl r8, r8, #16\n\t"
  26576. "adds r5, r5, r8\n\t"
  26577. "adcs r6, r6, r9\n\t"
  26578. "adc r7, r7, #0\n\t"
  26579. "lsr r8, r10, #16\n\t"
  26580. "lsr r9, r12, #16\n\t"
  26581. "mul r9, r8, r9\n\t"
  26582. "adds r6, r6, r9\n\t"
  26583. "adc r7, r7, #0\n\t"
  26584. "lsl r9, r12, #16\n\t"
  26585. "lsr r9, r9, #16\n\t"
  26586. "mul r8, r9, r8\n\t"
  26587. "lsr r9, r8, #16\n\t"
  26588. "lsl r8, r8, #16\n\t"
  26589. "adds r5, r5, r8\n\t"
  26590. "adcs r6, r6, r9\n\t"
  26591. "adc r7, r7, #0\n\t"
  26592. #else
  26593. "umull r8, r9, r10, r12\n\t"
  26594. "adds r5, r5, r8\n\t"
  26595. "adcs r6, r6, r9\n\t"
  26596. "adc r7, r7, #0\n\t"
  26597. #endif
  26598. /* A[5] * A[9] */
  26599. "ldr r10, [%[a], #36]\n\t"
  26600. "ldr r12, [%[a], #20]\n\t"
  26601. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  26602. "lsl r8, r10, #16\n\t"
  26603. "lsl r9, r12, #16\n\t"
  26604. "lsr r8, r8, #16\n\t"
  26605. "lsr r9, r9, #16\n\t"
  26606. "mul r9, r8, r9\n\t"
  26607. "adds r5, r5, r9\n\t"
  26608. "adcs r6, r6, #0\n\t"
  26609. "adc r7, r7, #0\n\t"
  26610. "lsr r9, r12, #16\n\t"
  26611. "mul r8, r9, r8\n\t"
  26612. "lsr r9, r8, #16\n\t"
  26613. "lsl r8, r8, #16\n\t"
  26614. "adds r5, r5, r8\n\t"
  26615. "adcs r6, r6, r9\n\t"
  26616. "adc r7, r7, #0\n\t"
  26617. "lsr r8, r10, #16\n\t"
  26618. "lsr r9, r12, #16\n\t"
  26619. "mul r9, r8, r9\n\t"
  26620. "adds r6, r6, r9\n\t"
  26621. "adc r7, r7, #0\n\t"
  26622. "lsl r9, r12, #16\n\t"
  26623. "lsr r9, r9, #16\n\t"
  26624. "mul r8, r9, r8\n\t"
  26625. "lsr r9, r8, #16\n\t"
  26626. "lsl r8, r8, #16\n\t"
  26627. "adds r5, r5, r8\n\t"
  26628. "adcs r6, r6, r9\n\t"
  26629. "adc r7, r7, #0\n\t"
  26630. #else
  26631. "umull r8, r9, r10, r12\n\t"
  26632. "adds r5, r5, r8\n\t"
  26633. "adcs r6, r6, r9\n\t"
  26634. "adc r7, r7, #0\n\t"
  26635. #endif
  26636. /* A[6] * A[8] */
  26637. "ldr r10, [%[a], #32]\n\t"
  26638. "ldr r12, [%[a], #24]\n\t"
  26639. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  26640. "lsl r8, r10, #16\n\t"
  26641. "lsl r9, r12, #16\n\t"
  26642. "lsr r8, r8, #16\n\t"
  26643. "lsr r9, r9, #16\n\t"
  26644. "mul r9, r8, r9\n\t"
  26645. "adds r5, r5, r9\n\t"
  26646. "adcs r6, r6, #0\n\t"
  26647. "adc r7, r7, #0\n\t"
  26648. "lsr r9, r12, #16\n\t"
  26649. "mul r8, r9, r8\n\t"
  26650. "lsr r9, r8, #16\n\t"
  26651. "lsl r8, r8, #16\n\t"
  26652. "adds r5, r5, r8\n\t"
  26653. "adcs r6, r6, r9\n\t"
  26654. "adc r7, r7, #0\n\t"
  26655. "lsr r8, r10, #16\n\t"
  26656. "lsr r9, r12, #16\n\t"
  26657. "mul r9, r8, r9\n\t"
  26658. "adds r6, r6, r9\n\t"
  26659. "adc r7, r7, #0\n\t"
  26660. "lsl r9, r12, #16\n\t"
  26661. "lsr r9, r9, #16\n\t"
  26662. "mul r8, r9, r8\n\t"
  26663. "lsr r9, r8, #16\n\t"
  26664. "lsl r8, r8, #16\n\t"
  26665. "adds r5, r5, r8\n\t"
  26666. "adcs r6, r6, r9\n\t"
  26667. "adc r7, r7, #0\n\t"
  26668. #else
  26669. "umull r8, r9, r10, r12\n\t"
  26670. "adds r5, r5, r8\n\t"
  26671. "adcs r6, r6, r9\n\t"
  26672. "adc r7, r7, #0\n\t"
  26673. #endif
  26674. /* A[7] * A[7] */
  26675. "ldr r10, [%[a], #28]\n\t"
  26676. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  26677. "lsl r8, r10, #16\n\t"
  26678. "lsr r9, r10, #16\n\t"
  26679. "lsr r8, r8, #16\n\t"
  26680. "mov r12, r8\n\t"
  26681. "mul r8, r12, r8\n\t"
  26682. "mov r12, r9\n\t"
  26683. "mul r9, r12, r9\n\t"
  26684. "adds r4, r4, r8\n\t"
  26685. "adcs r2, r2, r9\n\t"
  26686. "adc r3, r3, #0\n\t"
  26687. "lsr r9, r10, #16\n\t"
  26688. "lsl r8, r10, #16\n\t"
  26689. "lsr r8, r8, #16\n\t"
  26690. "mul r8, r9, r8\n\t"
  26691. "lsr r9, r8, #15\n\t"
  26692. "lsl r8, r8, #17\n\t"
  26693. "adds r4, r4, r8\n\t"
  26694. "adcs r2, r2, r9\n\t"
  26695. "adc r3, r3, #0\n\t"
  26696. "adds r5, r5, r5\n\t"
  26697. "adcs r6, r6, r6\n\t"
  26698. "adc r7, r7, r7\n\t"
  26699. #else
  26700. "umull r8, r9, r10, r10\n\t"
  26701. "adds r5, r5, r5\n\t"
  26702. "adcs r6, r6, r6\n\t"
  26703. "adc r7, r7, r7\n\t"
  26704. "adds r4, r4, r8\n\t"
  26705. "adcs r2, r2, r9\n\t"
  26706. "adc r3, r3, #0\n\t"
  26707. #endif
  26708. "adds r4, r4, r5\n\t"
  26709. "adcs r2, r2, r6\n\t"
  26710. "adc r3, r3, r7\n\t"
  26711. "str r4, [%[r], #56]\n\t"
  26712. /* A[4] * A[11] */
  26713. "ldr r10, [%[a], #44]\n\t"
  26714. "ldr r12, [%[a], #16]\n\t"
  26715. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  26716. "lsl r8, r10, #16\n\t"
  26717. "lsl r5, r12, #16\n\t"
  26718. "lsr r8, r8, #16\n\t"
  26719. "lsr r5, r5, #16\n\t"
  26720. "mul r5, r8, r5\n\t"
  26721. "lsr r9, r12, #16\n\t"
  26722. "mul r8, r9, r8\n\t"
  26723. "lsr r6, r8, #16\n\t"
  26724. "lsl r8, r8, #16\n\t"
  26725. "adds r5, r5, r8\n\t"
  26726. "adc r6, r6, #0\n\t"
  26727. "lsr r8, r10, #16\n\t"
  26728. "mul r9, r8, r9\n\t"
  26729. "add r6, r6, r9\n\t"
  26730. "lsl r9, r12, #16\n\t"
  26731. "lsr r9, r9, #16\n\t"
  26732. "mul r8, r9, r8\n\t"
  26733. "lsr r9, r8, #16\n\t"
  26734. "lsl r8, r8, #16\n\t"
  26735. "adds r5, r5, r8\n\t"
  26736. "adc r6, r6, r9\n\t"
  26737. #else
  26738. "umull r5, r6, r10, r12\n\t"
  26739. #endif
  26740. "mov r4, #0\n\t"
  26741. "mov r7, #0\n\t"
  26742. /* A[5] * A[10] */
  26743. "ldr r10, [%[a], #40]\n\t"
  26744. "ldr r12, [%[a], #20]\n\t"
  26745. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  26746. "lsl r8, r10, #16\n\t"
  26747. "lsl r9, r12, #16\n\t"
  26748. "lsr r8, r8, #16\n\t"
  26749. "lsr r9, r9, #16\n\t"
  26750. "mul r9, r8, r9\n\t"
  26751. "adds r5, r5, r9\n\t"
  26752. "adcs r6, r6, #0\n\t"
  26753. "adc r7, r7, #0\n\t"
  26754. "lsr r9, r12, #16\n\t"
  26755. "mul r8, r9, r8\n\t"
  26756. "lsr r9, r8, #16\n\t"
  26757. "lsl r8, r8, #16\n\t"
  26758. "adds r5, r5, r8\n\t"
  26759. "adcs r6, r6, r9\n\t"
  26760. "adc r7, r7, #0\n\t"
  26761. "lsr r8, r10, #16\n\t"
  26762. "lsr r9, r12, #16\n\t"
  26763. "mul r9, r8, r9\n\t"
  26764. "adds r6, r6, r9\n\t"
  26765. "adc r7, r7, #0\n\t"
  26766. "lsl r9, r12, #16\n\t"
  26767. "lsr r9, r9, #16\n\t"
  26768. "mul r8, r9, r8\n\t"
  26769. "lsr r9, r8, #16\n\t"
  26770. "lsl r8, r8, #16\n\t"
  26771. "adds r5, r5, r8\n\t"
  26772. "adcs r6, r6, r9\n\t"
  26773. "adc r7, r7, #0\n\t"
  26774. #else
  26775. "umull r8, r9, r10, r12\n\t"
  26776. "adds r5, r5, r8\n\t"
  26777. "adcs r6, r6, r9\n\t"
  26778. "adc r7, r7, #0\n\t"
  26779. #endif
  26780. /* A[6] * A[9] */
  26781. "ldr r10, [%[a], #36]\n\t"
  26782. "ldr r12, [%[a], #24]\n\t"
  26783. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  26784. "lsl r8, r10, #16\n\t"
  26785. "lsl r9, r12, #16\n\t"
  26786. "lsr r8, r8, #16\n\t"
  26787. "lsr r9, r9, #16\n\t"
  26788. "mul r9, r8, r9\n\t"
  26789. "adds r5, r5, r9\n\t"
  26790. "adcs r6, r6, #0\n\t"
  26791. "adc r7, r7, #0\n\t"
  26792. "lsr r9, r12, #16\n\t"
  26793. "mul r8, r9, r8\n\t"
  26794. "lsr r9, r8, #16\n\t"
  26795. "lsl r8, r8, #16\n\t"
  26796. "adds r5, r5, r8\n\t"
  26797. "adcs r6, r6, r9\n\t"
  26798. "adc r7, r7, #0\n\t"
  26799. "lsr r8, r10, #16\n\t"
  26800. "lsr r9, r12, #16\n\t"
  26801. "mul r9, r8, r9\n\t"
  26802. "adds r6, r6, r9\n\t"
  26803. "adc r7, r7, #0\n\t"
  26804. "lsl r9, r12, #16\n\t"
  26805. "lsr r9, r9, #16\n\t"
  26806. "mul r8, r9, r8\n\t"
  26807. "lsr r9, r8, #16\n\t"
  26808. "lsl r8, r8, #16\n\t"
  26809. "adds r5, r5, r8\n\t"
  26810. "adcs r6, r6, r9\n\t"
  26811. "adc r7, r7, #0\n\t"
  26812. #else
  26813. "umull r8, r9, r10, r12\n\t"
  26814. "adds r5, r5, r8\n\t"
  26815. "adcs r6, r6, r9\n\t"
  26816. "adc r7, r7, #0\n\t"
  26817. #endif
  26818. /* A[7] * A[8] */
  26819. "ldr r10, [%[a], #32]\n\t"
  26820. "ldr r12, [%[a], #28]\n\t"
  26821. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  26822. "lsl r8, r10, #16\n\t"
  26823. "lsl r9, r12, #16\n\t"
  26824. "lsr r8, r8, #16\n\t"
  26825. "lsr r9, r9, #16\n\t"
  26826. "mul r9, r8, r9\n\t"
  26827. "adds r5, r5, r9\n\t"
  26828. "adcs r6, r6, #0\n\t"
  26829. "adc r7, r7, #0\n\t"
  26830. "lsr r9, r12, #16\n\t"
  26831. "mul r8, r9, r8\n\t"
  26832. "lsr r9, r8, #16\n\t"
  26833. "lsl r8, r8, #16\n\t"
  26834. "adds r5, r5, r8\n\t"
  26835. "adcs r6, r6, r9\n\t"
  26836. "adc r7, r7, #0\n\t"
  26837. "lsr r8, r10, #16\n\t"
  26838. "lsr r9, r12, #16\n\t"
  26839. "mul r9, r8, r9\n\t"
  26840. "adds r6, r6, r9\n\t"
  26841. "adc r7, r7, #0\n\t"
  26842. "lsl r9, r12, #16\n\t"
  26843. "lsr r9, r9, #16\n\t"
  26844. "mul r8, r9, r8\n\t"
  26845. "lsr r9, r8, #16\n\t"
  26846. "lsl r8, r8, #16\n\t"
  26847. "adds r5, r5, r8\n\t"
  26848. "adcs r6, r6, r9\n\t"
  26849. "adc r7, r7, #0\n\t"
  26850. #else
  26851. "umull r8, r9, r10, r12\n\t"
  26852. "adds r5, r5, r8\n\t"
  26853. "adcs r6, r6, r9\n\t"
  26854. "adc r7, r7, #0\n\t"
  26855. #endif
  26856. "adds r5, r5, r5\n\t"
  26857. "adcs r6, r6, r6\n\t"
  26858. "adc r7, r7, r7\n\t"
  26859. "adds r2, r2, r5\n\t"
  26860. "adcs r3, r3, r6\n\t"
  26861. "adc r4, r4, r7\n\t"
  26862. "str r2, [%[r], #60]\n\t"
  26863. /* A[5] * A[11] */
  26864. "ldr r10, [%[a], #44]\n\t"
  26865. "ldr r12, [%[a], #20]\n\t"
  26866. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  26867. "lsl r8, r10, #16\n\t"
  26868. "lsl r5, r12, #16\n\t"
  26869. "lsr r8, r8, #16\n\t"
  26870. "lsr r5, r5, #16\n\t"
  26871. "mul r5, r8, r5\n\t"
  26872. "lsr r9, r12, #16\n\t"
  26873. "mul r8, r9, r8\n\t"
  26874. "lsr r6, r8, #16\n\t"
  26875. "lsl r8, r8, #16\n\t"
  26876. "adds r5, r5, r8\n\t"
  26877. "adc r6, r6, #0\n\t"
  26878. "lsr r8, r10, #16\n\t"
  26879. "mul r9, r8, r9\n\t"
  26880. "add r6, r6, r9\n\t"
  26881. "lsl r9, r12, #16\n\t"
  26882. "lsr r9, r9, #16\n\t"
  26883. "mul r8, r9, r8\n\t"
  26884. "lsr r9, r8, #16\n\t"
  26885. "lsl r8, r8, #16\n\t"
  26886. "adds r5, r5, r8\n\t"
  26887. "adc r6, r6, r9\n\t"
  26888. #else
  26889. "umull r5, r6, r10, r12\n\t"
  26890. #endif
  26891. "mov r2, #0\n\t"
  26892. "mov r7, #0\n\t"
  26893. /* A[6] * A[10] */
  26894. "ldr r10, [%[a], #40]\n\t"
  26895. "ldr r12, [%[a], #24]\n\t"
  26896. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  26897. "lsl r8, r10, #16\n\t"
  26898. "lsl r9, r12, #16\n\t"
  26899. "lsr r8, r8, #16\n\t"
  26900. "lsr r9, r9, #16\n\t"
  26901. "mul r9, r8, r9\n\t"
  26902. "adds r5, r5, r9\n\t"
  26903. "adcs r6, r6, #0\n\t"
  26904. "adc r7, r7, #0\n\t"
  26905. "lsr r9, r12, #16\n\t"
  26906. "mul r8, r9, r8\n\t"
  26907. "lsr r9, r8, #16\n\t"
  26908. "lsl r8, r8, #16\n\t"
  26909. "adds r5, r5, r8\n\t"
  26910. "adcs r6, r6, r9\n\t"
  26911. "adc r7, r7, #0\n\t"
  26912. "lsr r8, r10, #16\n\t"
  26913. "lsr r9, r12, #16\n\t"
  26914. "mul r9, r8, r9\n\t"
  26915. "adds r6, r6, r9\n\t"
  26916. "adc r7, r7, #0\n\t"
  26917. "lsl r9, r12, #16\n\t"
  26918. "lsr r9, r9, #16\n\t"
  26919. "mul r8, r9, r8\n\t"
  26920. "lsr r9, r8, #16\n\t"
  26921. "lsl r8, r8, #16\n\t"
  26922. "adds r5, r5, r8\n\t"
  26923. "adcs r6, r6, r9\n\t"
  26924. "adc r7, r7, #0\n\t"
  26925. #else
  26926. "umull r8, r9, r10, r12\n\t"
  26927. "adds r5, r5, r8\n\t"
  26928. "adcs r6, r6, r9\n\t"
  26929. "adc r7, r7, #0\n\t"
  26930. #endif
  26931. /* A[7] * A[9] */
  26932. "ldr r10, [%[a], #36]\n\t"
  26933. "ldr r12, [%[a], #28]\n\t"
  26934. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  26935. "lsl r8, r10, #16\n\t"
  26936. "lsl r9, r12, #16\n\t"
  26937. "lsr r8, r8, #16\n\t"
  26938. "lsr r9, r9, #16\n\t"
  26939. "mul r9, r8, r9\n\t"
  26940. "adds r5, r5, r9\n\t"
  26941. "adcs r6, r6, #0\n\t"
  26942. "adc r7, r7, #0\n\t"
  26943. "lsr r9, r12, #16\n\t"
  26944. "mul r8, r9, r8\n\t"
  26945. "lsr r9, r8, #16\n\t"
  26946. "lsl r8, r8, #16\n\t"
  26947. "adds r5, r5, r8\n\t"
  26948. "adcs r6, r6, r9\n\t"
  26949. "adc r7, r7, #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 r6, r6, r9\n\t"
  26954. "adc r7, r7, #0\n\t"
  26955. "lsl r9, r12, #16\n\t"
  26956. "lsr r9, r9, #16\n\t"
  26957. "mul r8, r9, r8\n\t"
  26958. "lsr r9, r8, #16\n\t"
  26959. "lsl r8, r8, #16\n\t"
  26960. "adds r5, r5, r8\n\t"
  26961. "adcs r6, r6, r9\n\t"
  26962. "adc r7, r7, #0\n\t"
  26963. #else
  26964. "umull r8, r9, r10, r12\n\t"
  26965. "adds r5, r5, r8\n\t"
  26966. "adcs r6, r6, r9\n\t"
  26967. "adc r7, r7, #0\n\t"
  26968. #endif
  26969. /* A[8] * A[8] */
  26970. "ldr r10, [%[a], #32]\n\t"
  26971. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  26972. "lsl r8, r10, #16\n\t"
  26973. "lsr r9, r10, #16\n\t"
  26974. "lsr r8, r8, #16\n\t"
  26975. "mov r12, r8\n\t"
  26976. "mul r8, r12, r8\n\t"
  26977. "mov r12, r9\n\t"
  26978. "mul r9, r12, r9\n\t"
  26979. "adds r3, r3, r8\n\t"
  26980. "adcs r4, r4, r9\n\t"
  26981. "adc r2, r2, #0\n\t"
  26982. "lsr r9, r10, #16\n\t"
  26983. "lsl r8, r10, #16\n\t"
  26984. "lsr r8, r8, #16\n\t"
  26985. "mul r8, r9, r8\n\t"
  26986. "lsr r9, r8, #15\n\t"
  26987. "lsl r8, r8, #17\n\t"
  26988. "adds r3, r3, r8\n\t"
  26989. "adcs r4, r4, r9\n\t"
  26990. "adc r2, r2, #0\n\t"
  26991. "adds r5, r5, r5\n\t"
  26992. "adcs r6, r6, r6\n\t"
  26993. "adc r7, r7, r7\n\t"
  26994. #else
  26995. "umull r8, r9, r10, r10\n\t"
  26996. "adds r5, r5, r5\n\t"
  26997. "adcs r6, r6, r6\n\t"
  26998. "adc r7, r7, r7\n\t"
  26999. "adds r3, r3, r8\n\t"
  27000. "adcs r4, r4, r9\n\t"
  27001. "adc r2, r2, #0\n\t"
  27002. #endif
  27003. "adds r3, r3, r5\n\t"
  27004. "adcs r4, r4, r6\n\t"
  27005. "adc r2, r2, r7\n\t"
  27006. "str r3, [%[r], #64]\n\t"
  27007. /* A[6] * A[11] */
  27008. "ldr r10, [%[a], #44]\n\t"
  27009. "ldr r12, [%[a], #24]\n\t"
  27010. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  27011. "lsl r8, r10, #16\n\t"
  27012. "lsl r5, r12, #16\n\t"
  27013. "lsr r8, r8, #16\n\t"
  27014. "lsr r5, r5, #16\n\t"
  27015. "mul r5, r8, r5\n\t"
  27016. "lsr r9, r12, #16\n\t"
  27017. "mul r8, r9, r8\n\t"
  27018. "lsr r6, r8, #16\n\t"
  27019. "lsl r8, r8, #16\n\t"
  27020. "adds r5, r5, r8\n\t"
  27021. "adc r6, r6, #0\n\t"
  27022. "lsr r8, r10, #16\n\t"
  27023. "mul r9, r8, r9\n\t"
  27024. "add r6, r6, r9\n\t"
  27025. "lsl r9, r12, #16\n\t"
  27026. "lsr r9, r9, #16\n\t"
  27027. "mul r8, r9, r8\n\t"
  27028. "lsr r9, r8, #16\n\t"
  27029. "lsl r8, r8, #16\n\t"
  27030. "adds r5, r5, r8\n\t"
  27031. "adc r6, r6, r9\n\t"
  27032. #else
  27033. "umull r5, r6, r10, r12\n\t"
  27034. #endif
  27035. "mov r3, #0\n\t"
  27036. "mov r7, #0\n\t"
  27037. /* A[7] * A[10] */
  27038. "ldr r10, [%[a], #40]\n\t"
  27039. "ldr r12, [%[a], #28]\n\t"
  27040. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  27041. "lsl r8, r10, #16\n\t"
  27042. "lsl r9, r12, #16\n\t"
  27043. "lsr r8, r8, #16\n\t"
  27044. "lsr r9, r9, #16\n\t"
  27045. "mul r9, r8, r9\n\t"
  27046. "adds r5, r5, r9\n\t"
  27047. "adcs r6, r6, #0\n\t"
  27048. "adc r7, r7, #0\n\t"
  27049. "lsr r9, r12, #16\n\t"
  27050. "mul r8, r9, r8\n\t"
  27051. "lsr r9, r8, #16\n\t"
  27052. "lsl r8, r8, #16\n\t"
  27053. "adds r5, r5, r8\n\t"
  27054. "adcs r6, r6, r9\n\t"
  27055. "adc r7, r7, #0\n\t"
  27056. "lsr r8, r10, #16\n\t"
  27057. "lsr r9, r12, #16\n\t"
  27058. "mul r9, r8, r9\n\t"
  27059. "adds r6, r6, r9\n\t"
  27060. "adc r7, r7, #0\n\t"
  27061. "lsl r9, r12, #16\n\t"
  27062. "lsr r9, r9, #16\n\t"
  27063. "mul r8, r9, r8\n\t"
  27064. "lsr r9, r8, #16\n\t"
  27065. "lsl r8, r8, #16\n\t"
  27066. "adds r5, r5, r8\n\t"
  27067. "adcs r6, r6, r9\n\t"
  27068. "adc r7, r7, #0\n\t"
  27069. #else
  27070. "umull r8, r9, r10, r12\n\t"
  27071. "adds r5, r5, r8\n\t"
  27072. "adcs r6, r6, r9\n\t"
  27073. "adc r7, r7, #0\n\t"
  27074. #endif
  27075. /* A[8] * A[9] */
  27076. "ldr r10, [%[a], #36]\n\t"
  27077. "ldr r12, [%[a], #32]\n\t"
  27078. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  27079. "lsl r8, r10, #16\n\t"
  27080. "lsl r9, r12, #16\n\t"
  27081. "lsr r8, r8, #16\n\t"
  27082. "lsr r9, r9, #16\n\t"
  27083. "mul r9, r8, r9\n\t"
  27084. "adds r5, r5, r9\n\t"
  27085. "adcs r6, r6, #0\n\t"
  27086. "adc r7, r7, #0\n\t"
  27087. "lsr r9, r12, #16\n\t"
  27088. "mul r8, r9, r8\n\t"
  27089. "lsr r9, r8, #16\n\t"
  27090. "lsl r8, r8, #16\n\t"
  27091. "adds r5, r5, r8\n\t"
  27092. "adcs r6, r6, r9\n\t"
  27093. "adc r7, r7, #0\n\t"
  27094. "lsr r8, r10, #16\n\t"
  27095. "lsr r9, r12, #16\n\t"
  27096. "mul r9, r8, r9\n\t"
  27097. "adds r6, r6, r9\n\t"
  27098. "adc r7, r7, #0\n\t"
  27099. "lsl r9, r12, #16\n\t"
  27100. "lsr r9, r9, #16\n\t"
  27101. "mul r8, r9, r8\n\t"
  27102. "lsr r9, r8, #16\n\t"
  27103. "lsl r8, r8, #16\n\t"
  27104. "adds r5, r5, r8\n\t"
  27105. "adcs r6, r6, r9\n\t"
  27106. "adc r7, r7, #0\n\t"
  27107. #else
  27108. "umull r8, r9, r10, r12\n\t"
  27109. "adds r5, r5, r8\n\t"
  27110. "adcs r6, r6, r9\n\t"
  27111. "adc r7, r7, #0\n\t"
  27112. #endif
  27113. "adds r5, r5, r5\n\t"
  27114. "adcs r6, r6, r6\n\t"
  27115. "adc r7, r7, r7\n\t"
  27116. "adds r4, r4, r5\n\t"
  27117. "adcs r2, r2, r6\n\t"
  27118. "adc r3, r3, r7\n\t"
  27119. "str r4, [%[r], #68]\n\t"
  27120. /* A[7] * A[11] */
  27121. "ldr r10, [%[a], #44]\n\t"
  27122. "ldr r12, [%[a], #28]\n\t"
  27123. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  27124. "lsl r8, r10, #16\n\t"
  27125. "lsl r9, r12, #16\n\t"
  27126. "lsr r8, r8, #16\n\t"
  27127. "lsr r9, r9, #16\n\t"
  27128. "mul r9, r8, r9\n\t"
  27129. "adds r2, r2, r9\n\t"
  27130. "adcs r3, r3, #0\n\t"
  27131. "mov r4, #0\n\t"
  27132. "adc r4, r4, #0\n\t"
  27133. "adds r2, r2, r9\n\t"
  27134. "adcs r3, r3, #0\n\t"
  27135. "adc r4, r4, #0\n\t"
  27136. "lsr r9, r12, #16\n\t"
  27137. "mul r8, r9, r8\n\t"
  27138. "lsr r9, r8, #16\n\t"
  27139. "lsl r8, r8, #16\n\t"
  27140. "adds r2, r2, r8\n\t"
  27141. "adcs r3, r3, r9\n\t"
  27142. "adc r4, r4, #0\n\t"
  27143. "adds r2, r2, r8\n\t"
  27144. "adcs r3, r3, r9\n\t"
  27145. "adc r4, r4, #0\n\t"
  27146. "lsr r8, r10, #16\n\t"
  27147. "lsr r9, r12, #16\n\t"
  27148. "mul r9, r8, r9\n\t"
  27149. "adds r3, r3, r9\n\t"
  27150. "adc r4, r4, #0\n\t"
  27151. "adds r3, r3, r9\n\t"
  27152. "adc r4, r4, #0\n\t"
  27153. "lsl r9, r12, #16\n\t"
  27154. "lsr r9, r9, #16\n\t"
  27155. "mul r8, r9, r8\n\t"
  27156. "lsr r9, r8, #16\n\t"
  27157. "lsl r8, r8, #16\n\t"
  27158. "adds r2, r2, r8\n\t"
  27159. "adcs r3, r3, r9\n\t"
  27160. "adc r4, r4, #0\n\t"
  27161. "adds r2, r2, r8\n\t"
  27162. "adcs r3, r3, r9\n\t"
  27163. "adc r4, r4, #0\n\t"
  27164. #else
  27165. "umull r8, r9, r10, r12\n\t"
  27166. "adds r2, r2, r8\n\t"
  27167. "adcs r3, r3, r9\n\t"
  27168. "mov r4, #0\n\t"
  27169. "adc r4, r4, #0\n\t"
  27170. "adds r2, r2, r8\n\t"
  27171. "adcs r3, r3, r9\n\t"
  27172. "mov r4, #0\n\t"
  27173. "adc r4, r4, #0\n\t"
  27174. #endif
  27175. /* A[8] * A[10] */
  27176. "ldr r10, [%[a], #40]\n\t"
  27177. "ldr r12, [%[a], #32]\n\t"
  27178. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  27179. "lsl r8, r10, #16\n\t"
  27180. "lsl r9, r12, #16\n\t"
  27181. "lsr r8, r8, #16\n\t"
  27182. "lsr r9, r9, #16\n\t"
  27183. "mul r9, r8, r9\n\t"
  27184. "adds r2, r2, r9\n\t"
  27185. "adcs r3, r3, #0\n\t"
  27186. "adc r4, r4, #0\n\t"
  27187. "adds r2, r2, r9\n\t"
  27188. "adcs r3, r3, #0\n\t"
  27189. "adc r4, r4, #0\n\t"
  27190. "lsr r9, r12, #16\n\t"
  27191. "mul r8, r9, r8\n\t"
  27192. "lsr r9, r8, #16\n\t"
  27193. "lsl r8, r8, #16\n\t"
  27194. "adds r2, r2, r8\n\t"
  27195. "adcs r3, r3, r9\n\t"
  27196. "adc r4, r4, #0\n\t"
  27197. "adds r2, r2, r8\n\t"
  27198. "adcs r3, r3, r9\n\t"
  27199. "adc r4, r4, #0\n\t"
  27200. "lsr r8, r10, #16\n\t"
  27201. "lsr r9, r12, #16\n\t"
  27202. "mul r9, r8, r9\n\t"
  27203. "adds r3, r3, r9\n\t"
  27204. "adc r4, r4, #0\n\t"
  27205. "adds r3, r3, r9\n\t"
  27206. "adc r4, r4, #0\n\t"
  27207. "lsl r9, r12, #16\n\t"
  27208. "lsr r9, r9, #16\n\t"
  27209. "mul r8, r9, r8\n\t"
  27210. "lsr r9, r8, #16\n\t"
  27211. "lsl r8, r8, #16\n\t"
  27212. "adds r2, r2, r8\n\t"
  27213. "adcs r3, r3, r9\n\t"
  27214. "adc r4, r4, #0\n\t"
  27215. "adds r2, r2, r8\n\t"
  27216. "adcs r3, r3, r9\n\t"
  27217. "adc r4, r4, #0\n\t"
  27218. #else
  27219. "umull r8, r9, r10, r12\n\t"
  27220. "adds r2, r2, r8\n\t"
  27221. "adcs r3, r3, r9\n\t"
  27222. "adc r4, r4, #0\n\t"
  27223. "adds r2, r2, r8\n\t"
  27224. "adcs r3, r3, r9\n\t"
  27225. "adc r4, r4, #0\n\t"
  27226. #endif
  27227. /* A[9] * A[9] */
  27228. "ldr r10, [%[a], #36]\n\t"
  27229. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  27230. "lsl r8, r10, #16\n\t"
  27231. "lsr r9, r10, #16\n\t"
  27232. "lsr r8, r8, #16\n\t"
  27233. "mov r12, r8\n\t"
  27234. "mul r8, r12, r8\n\t"
  27235. "mov r12, r9\n\t"
  27236. "mul r9, r12, r9\n\t"
  27237. "adds r2, r2, r8\n\t"
  27238. "adcs r3, r3, r9\n\t"
  27239. "adc r4, r4, #0\n\t"
  27240. "lsr r9, r10, #16\n\t"
  27241. "lsl r8, r10, #16\n\t"
  27242. "lsr r8, r8, #16\n\t"
  27243. "mul r8, r9, r8\n\t"
  27244. "lsr r9, r8, #15\n\t"
  27245. "lsl r8, r8, #17\n\t"
  27246. "adds r2, r2, r8\n\t"
  27247. "adcs r3, r3, r9\n\t"
  27248. "adc r4, r4, #0\n\t"
  27249. #else
  27250. "umull r8, r9, r10, r10\n\t"
  27251. "adds r2, r2, r8\n\t"
  27252. "adcs r3, r3, r9\n\t"
  27253. "adc r4, r4, #0\n\t"
  27254. #endif
  27255. "str r2, [%[r], #72]\n\t"
  27256. /* A[8] * A[11] */
  27257. "ldr r10, [%[a], #44]\n\t"
  27258. "ldr r12, [%[a], #32]\n\t"
  27259. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  27260. "lsl r8, r10, #16\n\t"
  27261. "lsl r9, r12, #16\n\t"
  27262. "lsr r8, r8, #16\n\t"
  27263. "lsr r9, r9, #16\n\t"
  27264. "mul r9, r8, r9\n\t"
  27265. "adds r3, r3, r9\n\t"
  27266. "adcs r4, r4, #0\n\t"
  27267. "mov r2, #0\n\t"
  27268. "adc r2, r2, #0\n\t"
  27269. "adds r3, r3, r9\n\t"
  27270. "adcs r4, r4, #0\n\t"
  27271. "adc r2, r2, #0\n\t"
  27272. "lsr r9, r12, #16\n\t"
  27273. "mul r8, r9, r8\n\t"
  27274. "lsr r9, r8, #16\n\t"
  27275. "lsl r8, r8, #16\n\t"
  27276. "adds r3, r3, r8\n\t"
  27277. "adcs r4, r4, r9\n\t"
  27278. "adc r2, r2, #0\n\t"
  27279. "adds r3, r3, r8\n\t"
  27280. "adcs r4, r4, r9\n\t"
  27281. "adc r2, r2, #0\n\t"
  27282. "lsr r8, r10, #16\n\t"
  27283. "lsr r9, r12, #16\n\t"
  27284. "mul r9, r8, r9\n\t"
  27285. "adds r4, r4, r9\n\t"
  27286. "adc r2, r2, #0\n\t"
  27287. "adds r4, r4, r9\n\t"
  27288. "adc r2, r2, #0\n\t"
  27289. "lsl r9, r12, #16\n\t"
  27290. "lsr r9, r9, #16\n\t"
  27291. "mul r8, r9, r8\n\t"
  27292. "lsr r9, r8, #16\n\t"
  27293. "lsl r8, r8, #16\n\t"
  27294. "adds r3, r3, r8\n\t"
  27295. "adcs r4, r4, r9\n\t"
  27296. "adc r2, r2, #0\n\t"
  27297. "adds r3, r3, r8\n\t"
  27298. "adcs r4, r4, r9\n\t"
  27299. "adc r2, r2, #0\n\t"
  27300. #else
  27301. "umull r8, r9, r10, r12\n\t"
  27302. "adds r3, r3, r8\n\t"
  27303. "adcs r4, r4, r9\n\t"
  27304. "mov r2, #0\n\t"
  27305. "adc r2, r2, #0\n\t"
  27306. "adds r3, r3, r8\n\t"
  27307. "adcs r4, r4, r9\n\t"
  27308. "mov r2, #0\n\t"
  27309. "adc r2, r2, #0\n\t"
  27310. #endif
  27311. /* A[9] * A[10] */
  27312. "ldr r10, [%[a], #40]\n\t"
  27313. "ldr r12, [%[a], #36]\n\t"
  27314. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  27315. "lsl r8, r10, #16\n\t"
  27316. "lsl r9, r12, #16\n\t"
  27317. "lsr r8, r8, #16\n\t"
  27318. "lsr r9, r9, #16\n\t"
  27319. "mul r9, r8, r9\n\t"
  27320. "adds r3, r3, r9\n\t"
  27321. "adcs r4, r4, #0\n\t"
  27322. "adc r2, r2, #0\n\t"
  27323. "adds r3, r3, r9\n\t"
  27324. "adcs r4, r4, #0\n\t"
  27325. "adc r2, r2, #0\n\t"
  27326. "lsr r9, r12, #16\n\t"
  27327. "mul r8, r9, r8\n\t"
  27328. "lsr r9, r8, #16\n\t"
  27329. "lsl r8, r8, #16\n\t"
  27330. "adds r3, r3, r8\n\t"
  27331. "adcs r4, r4, r9\n\t"
  27332. "adc r2, r2, #0\n\t"
  27333. "adds r3, r3, r8\n\t"
  27334. "adcs r4, r4, r9\n\t"
  27335. "adc r2, r2, #0\n\t"
  27336. "lsr r8, r10, #16\n\t"
  27337. "lsr r9, r12, #16\n\t"
  27338. "mul r9, r8, r9\n\t"
  27339. "adds r4, r4, r9\n\t"
  27340. "adc r2, r2, #0\n\t"
  27341. "adds r4, r4, r9\n\t"
  27342. "adc r2, r2, #0\n\t"
  27343. "lsl r9, r12, #16\n\t"
  27344. "lsr r9, r9, #16\n\t"
  27345. "mul r8, r9, r8\n\t"
  27346. "lsr r9, r8, #16\n\t"
  27347. "lsl r8, r8, #16\n\t"
  27348. "adds r3, r3, r8\n\t"
  27349. "adcs r4, r4, r9\n\t"
  27350. "adc r2, r2, #0\n\t"
  27351. "adds r3, r3, r8\n\t"
  27352. "adcs r4, r4, r9\n\t"
  27353. "adc r2, r2, #0\n\t"
  27354. #else
  27355. "umull r8, r9, r10, r12\n\t"
  27356. "adds r3, r3, r8\n\t"
  27357. "adcs r4, r4, r9\n\t"
  27358. "adc r2, r2, #0\n\t"
  27359. "adds r3, r3, r8\n\t"
  27360. "adcs r4, r4, r9\n\t"
  27361. "adc r2, r2, #0\n\t"
  27362. #endif
  27363. "str r3, [%[r], #76]\n\t"
  27364. /* A[9] * A[11] */
  27365. "ldr r10, [%[a], #44]\n\t"
  27366. "ldr r12, [%[a], #36]\n\t"
  27367. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  27368. "lsl r8, r10, #16\n\t"
  27369. "lsl r9, r12, #16\n\t"
  27370. "lsr r8, r8, #16\n\t"
  27371. "lsr r9, r9, #16\n\t"
  27372. "mul r9, r8, r9\n\t"
  27373. "adds r4, r4, r9\n\t"
  27374. "adcs r2, r2, #0\n\t"
  27375. "mov r3, #0\n\t"
  27376. "adc r3, r3, #0\n\t"
  27377. "adds r4, r4, r9\n\t"
  27378. "adcs r2, r2, #0\n\t"
  27379. "adc r3, r3, #0\n\t"
  27380. "lsr r9, r12, #16\n\t"
  27381. "mul r8, r9, r8\n\t"
  27382. "lsr r9, r8, #16\n\t"
  27383. "lsl r8, r8, #16\n\t"
  27384. "adds r4, r4, r8\n\t"
  27385. "adcs r2, r2, r9\n\t"
  27386. "adc r3, r3, #0\n\t"
  27387. "adds r4, r4, r8\n\t"
  27388. "adcs r2, r2, r9\n\t"
  27389. "adc r3, r3, #0\n\t"
  27390. "lsr r8, r10, #16\n\t"
  27391. "lsr r9, r12, #16\n\t"
  27392. "mul r9, r8, r9\n\t"
  27393. "adds r2, r2, r9\n\t"
  27394. "adc r3, r3, #0\n\t"
  27395. "adds r2, r2, r9\n\t"
  27396. "adc r3, r3, #0\n\t"
  27397. "lsl r9, r12, #16\n\t"
  27398. "lsr r9, r9, #16\n\t"
  27399. "mul r8, r9, r8\n\t"
  27400. "lsr r9, r8, #16\n\t"
  27401. "lsl r8, r8, #16\n\t"
  27402. "adds r4, r4, r8\n\t"
  27403. "adcs r2, r2, r9\n\t"
  27404. "adc r3, r3, #0\n\t"
  27405. "adds r4, r4, r8\n\t"
  27406. "adcs r2, r2, r9\n\t"
  27407. "adc r3, r3, #0\n\t"
  27408. #else
  27409. "umull r8, r9, r10, r12\n\t"
  27410. "adds r4, r4, r8\n\t"
  27411. "adcs r2, r2, r9\n\t"
  27412. "mov r3, #0\n\t"
  27413. "adc r3, r3, #0\n\t"
  27414. "adds r4, r4, r8\n\t"
  27415. "adcs r2, r2, r9\n\t"
  27416. "mov r3, #0\n\t"
  27417. "adc r3, r3, #0\n\t"
  27418. #endif
  27419. /* A[10] * A[10] */
  27420. "ldr r10, [%[a], #40]\n\t"
  27421. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  27422. "lsl r8, r10, #16\n\t"
  27423. "lsr r9, r10, #16\n\t"
  27424. "lsr r8, r8, #16\n\t"
  27425. "mov r12, r8\n\t"
  27426. "mul r8, r12, r8\n\t"
  27427. "mov r12, r9\n\t"
  27428. "mul r9, r12, r9\n\t"
  27429. "adds r4, r4, r8\n\t"
  27430. "adcs r2, r2, r9\n\t"
  27431. "adc r3, r3, #0\n\t"
  27432. "lsr r9, r10, #16\n\t"
  27433. "lsl r8, r10, #16\n\t"
  27434. "lsr r8, r8, #16\n\t"
  27435. "mul r8, r9, r8\n\t"
  27436. "lsr r9, r8, #15\n\t"
  27437. "lsl r8, r8, #17\n\t"
  27438. "adds r4, r4, r8\n\t"
  27439. "adcs r2, r2, r9\n\t"
  27440. "adc r3, r3, #0\n\t"
  27441. #else
  27442. "umull r8, r9, r10, r10\n\t"
  27443. "adds r4, r4, r8\n\t"
  27444. "adcs r2, r2, r9\n\t"
  27445. "adc r3, r3, #0\n\t"
  27446. #endif
  27447. "str r4, [%[r], #80]\n\t"
  27448. /* A[10] * A[11] */
  27449. "ldr r10, [%[a], #44]\n\t"
  27450. "ldr r12, [%[a], #40]\n\t"
  27451. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  27452. "lsl r8, r10, #16\n\t"
  27453. "lsl r9, r12, #16\n\t"
  27454. "lsr r8, r8, #16\n\t"
  27455. "lsr r9, r9, #16\n\t"
  27456. "mul r9, r8, r9\n\t"
  27457. "adds r2, r2, r9\n\t"
  27458. "adcs r3, r3, #0\n\t"
  27459. "mov r4, #0\n\t"
  27460. "adc r4, r4, #0\n\t"
  27461. "adds r2, r2, r9\n\t"
  27462. "adcs r3, r3, #0\n\t"
  27463. "adc r4, r4, #0\n\t"
  27464. "lsr r9, r12, #16\n\t"
  27465. "mul r8, r9, r8\n\t"
  27466. "lsr r9, r8, #16\n\t"
  27467. "lsl r8, r8, #16\n\t"
  27468. "adds r2, r2, r8\n\t"
  27469. "adcs r3, r3, r9\n\t"
  27470. "adc r4, r4, #0\n\t"
  27471. "adds r2, r2, r8\n\t"
  27472. "adcs r3, r3, r9\n\t"
  27473. "adc r4, r4, #0\n\t"
  27474. "lsr r8, r10, #16\n\t"
  27475. "lsr r9, r12, #16\n\t"
  27476. "mul r9, r8, r9\n\t"
  27477. "adds r3, r3, r9\n\t"
  27478. "adc r4, r4, #0\n\t"
  27479. "adds r3, r3, r9\n\t"
  27480. "adc r4, r4, #0\n\t"
  27481. "lsl r9, r12, #16\n\t"
  27482. "lsr r9, r9, #16\n\t"
  27483. "mul r8, r9, r8\n\t"
  27484. "lsr r9, r8, #16\n\t"
  27485. "lsl r8, r8, #16\n\t"
  27486. "adds r2, r2, r8\n\t"
  27487. "adcs r3, r3, r9\n\t"
  27488. "adc r4, r4, #0\n\t"
  27489. "adds r2, r2, r8\n\t"
  27490. "adcs r3, r3, r9\n\t"
  27491. "adc r4, r4, #0\n\t"
  27492. #else
  27493. "umull r8, r9, r10, r12\n\t"
  27494. "adds r2, r2, r8\n\t"
  27495. "adcs r3, r3, r9\n\t"
  27496. "mov r4, #0\n\t"
  27497. "adc r4, r4, #0\n\t"
  27498. "adds r2, r2, r8\n\t"
  27499. "adcs r3, r3, r9\n\t"
  27500. "mov r4, #0\n\t"
  27501. "adc r4, r4, #0\n\t"
  27502. #endif
  27503. "str r2, [%[r], #84]\n\t"
  27504. /* A[11] * A[11] */
  27505. "ldr r10, [%[a], #44]\n\t"
  27506. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  27507. "lsl r8, r10, #16\n\t"
  27508. "lsr r9, r10, #16\n\t"
  27509. "lsr r8, r8, #16\n\t"
  27510. "mov r12, r8\n\t"
  27511. "mul r8, r12, r8\n\t"
  27512. "mov r12, r9\n\t"
  27513. "mul r9, r12, r9\n\t"
  27514. "adds r3, r3, r8\n\t"
  27515. "adc r4, r4, r9\n\t"
  27516. "lsr r9, r10, #16\n\t"
  27517. "lsl r8, r10, #16\n\t"
  27518. "lsr r8, r8, #16\n\t"
  27519. "mul r8, r9, r8\n\t"
  27520. "lsr r9, r8, #15\n\t"
  27521. "lsl r8, r8, #17\n\t"
  27522. "adds r3, r3, r8\n\t"
  27523. "adc r4, r4, r9\n\t"
  27524. #else
  27525. "umull r8, r9, r10, r10\n\t"
  27526. "adds r3, r3, r8\n\t"
  27527. "adc r4, r4, r9\n\t"
  27528. #endif
  27529. "str r3, [%[r], #88]\n\t"
  27530. "str r4, [%[r], #92]\n\t"
  27531. "ldm sp!, {r2, r3, r4, r8}\n\t"
  27532. "stm %[r]!, {r2, r3, r4, r8}\n\t"
  27533. "ldm sp!, {r2, r3, r4, r8}\n\t"
  27534. "stm %[r]!, {r2, r3, r4, r8}\n\t"
  27535. "ldm sp!, {r2, r3, r4, r8}\n\t"
  27536. "stm %[r]!, {r2, r3, r4, r8}\n\t"
  27537. : [r] "+r" (r), [a] "+r" (a)
  27538. :
  27539. : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r12", "cc"
  27540. );
  27541. }
  27542. /* Sub b from a into r. (r = a - b)
  27543. *
  27544. * r A single precision integer.
  27545. * a A single precision integer.
  27546. * b A single precision integer.
  27547. */
  27548. static sp_digit sp_3072_sub_12(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p)
  27549. {
  27550. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  27551. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  27552. register const sp_digit* b asm ("r2") = (const sp_digit*)b_p;
  27553. __asm__ __volatile__ (
  27554. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  27555. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  27556. "subs r3, r3, r7\n\t"
  27557. "sbcs r4, r4, r8\n\t"
  27558. "sbcs r5, r5, r9\n\t"
  27559. "sbcs r6, r6, r10\n\t"
  27560. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  27561. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  27562. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  27563. "sbcs r3, r3, r7\n\t"
  27564. "sbcs r4, r4, r8\n\t"
  27565. "sbcs r5, r5, r9\n\t"
  27566. "sbcs r6, r6, r10\n\t"
  27567. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  27568. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  27569. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  27570. "sbcs r3, r3, r7\n\t"
  27571. "sbcs r4, r4, r8\n\t"
  27572. "sbcs r5, r5, r9\n\t"
  27573. "sbcs r6, r6, r10\n\t"
  27574. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  27575. "sbc %[r], r6, r6\n\t"
  27576. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  27577. :
  27578. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "cc"
  27579. );
  27580. return (uint32_t)(size_t)r;
  27581. }
  27582. /* Square a and put result in r. (r = a * a)
  27583. *
  27584. * r A single precision integer.
  27585. * a A single precision integer.
  27586. */
  27587. SP_NOINLINE static void sp_3072_sqr_24(sp_digit* r, const sp_digit* a)
  27588. {
  27589. sp_digit* z0 = r;
  27590. sp_digit* z2 = r + 24;
  27591. sp_digit z1[24];
  27592. sp_digit* a1 = z1;
  27593. sp_digit zero[12];
  27594. sp_digit u;
  27595. sp_digit mask;
  27596. sp_digit* p1;
  27597. sp_digit* p2;
  27598. XMEMSET(zero, 0, sizeof(sp_digit) * 12);
  27599. mask = sp_3072_sub_12(a1, a, &a[12]);
  27600. p1 = (sp_digit*)(((sp_digit)zero & mask ) | ((sp_digit)a1 & (~mask)));
  27601. p2 = (sp_digit*)(((sp_digit)zero & (~mask)) | ((sp_digit)a1 & mask ));
  27602. (void)sp_3072_sub_12(a1, p1, p2);
  27603. sp_3072_sqr_12(z2, &a[12]);
  27604. sp_3072_sqr_12(z0, a);
  27605. sp_3072_sqr_12(z1, a1);
  27606. u = 0;
  27607. u -= sp_3072_sub_in_place_24(z1, z2);
  27608. u -= sp_3072_sub_in_place_24(z1, z0);
  27609. u += sp_3072_sub_in_place_24(r + 12, z1);
  27610. zero[0] = u;
  27611. (void)sp_3072_add_12(r + 36, r + 36, zero);
  27612. }
  27613. /* Sub b from a into r. (r = a - b)
  27614. *
  27615. * r A single precision integer.
  27616. * a A single precision integer.
  27617. * b A single precision integer.
  27618. */
  27619. static sp_digit sp_3072_sub_24(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p)
  27620. {
  27621. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  27622. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  27623. register const sp_digit* b asm ("r2") = (const sp_digit*)b_p;
  27624. __asm__ __volatile__ (
  27625. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  27626. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  27627. "subs r3, r3, r7\n\t"
  27628. "sbcs r4, r4, r8\n\t"
  27629. "sbcs r5, r5, r9\n\t"
  27630. "sbcs r6, r6, r10\n\t"
  27631. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  27632. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  27633. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  27634. "sbcs r3, r3, r7\n\t"
  27635. "sbcs r4, r4, r8\n\t"
  27636. "sbcs r5, r5, r9\n\t"
  27637. "sbcs r6, r6, r10\n\t"
  27638. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  27639. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  27640. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  27641. "sbcs r3, r3, r7\n\t"
  27642. "sbcs r4, r4, r8\n\t"
  27643. "sbcs r5, r5, r9\n\t"
  27644. "sbcs r6, r6, r10\n\t"
  27645. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  27646. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  27647. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  27648. "sbcs r3, r3, r7\n\t"
  27649. "sbcs r4, r4, r8\n\t"
  27650. "sbcs r5, r5, r9\n\t"
  27651. "sbcs r6, r6, r10\n\t"
  27652. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  27653. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  27654. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  27655. "sbcs r3, r3, r7\n\t"
  27656. "sbcs r4, r4, r8\n\t"
  27657. "sbcs r5, r5, r9\n\t"
  27658. "sbcs r6, r6, r10\n\t"
  27659. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  27660. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  27661. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  27662. "sbcs r3, r3, r7\n\t"
  27663. "sbcs r4, r4, r8\n\t"
  27664. "sbcs r5, r5, r9\n\t"
  27665. "sbcs r6, r6, r10\n\t"
  27666. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  27667. "sbc %[r], r6, r6\n\t"
  27668. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  27669. :
  27670. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "cc"
  27671. );
  27672. return (uint32_t)(size_t)r;
  27673. }
  27674. /* Square a and put result in r. (r = a * a)
  27675. *
  27676. * r A single precision integer.
  27677. * a A single precision integer.
  27678. */
  27679. SP_NOINLINE static void sp_3072_sqr_48(sp_digit* r, const sp_digit* a)
  27680. {
  27681. sp_digit* z0 = r;
  27682. sp_digit* z2 = r + 48;
  27683. sp_digit z1[48];
  27684. sp_digit* a1 = z1;
  27685. sp_digit zero[24];
  27686. sp_digit u;
  27687. sp_digit mask;
  27688. sp_digit* p1;
  27689. sp_digit* p2;
  27690. XMEMSET(zero, 0, sizeof(sp_digit) * 24);
  27691. mask = sp_3072_sub_24(a1, a, &a[24]);
  27692. p1 = (sp_digit*)(((sp_digit)zero & mask ) | ((sp_digit)a1 & (~mask)));
  27693. p2 = (sp_digit*)(((sp_digit)zero & (~mask)) | ((sp_digit)a1 & mask ));
  27694. (void)sp_3072_sub_24(a1, p1, p2);
  27695. sp_3072_sqr_24(z2, &a[24]);
  27696. sp_3072_sqr_24(z0, a);
  27697. sp_3072_sqr_24(z1, a1);
  27698. u = 0;
  27699. u -= sp_3072_sub_in_place_48(z1, z2);
  27700. u -= sp_3072_sub_in_place_48(z1, z0);
  27701. u += sp_3072_sub_in_place_48(r + 24, z1);
  27702. zero[0] = u;
  27703. (void)sp_3072_add_24(r + 72, r + 72, zero);
  27704. }
  27705. /* Sub b from a into r. (r = a - b)
  27706. *
  27707. * r A single precision integer.
  27708. * a A single precision integer.
  27709. * b A single precision integer.
  27710. */
  27711. static sp_digit sp_3072_sub_48(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p)
  27712. {
  27713. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  27714. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  27715. register const sp_digit* b asm ("r2") = (const sp_digit*)b_p;
  27716. __asm__ __volatile__ (
  27717. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  27718. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  27719. "subs r3, r3, r7\n\t"
  27720. "sbcs r4, r4, r8\n\t"
  27721. "sbcs r5, r5, r9\n\t"
  27722. "sbcs r6, r6, r10\n\t"
  27723. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  27724. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  27725. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  27726. "sbcs r3, r3, r7\n\t"
  27727. "sbcs r4, r4, r8\n\t"
  27728. "sbcs r5, r5, r9\n\t"
  27729. "sbcs r6, r6, r10\n\t"
  27730. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  27731. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  27732. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  27733. "sbcs r3, r3, r7\n\t"
  27734. "sbcs r4, r4, r8\n\t"
  27735. "sbcs r5, r5, r9\n\t"
  27736. "sbcs r6, r6, r10\n\t"
  27737. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  27738. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  27739. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  27740. "sbcs r3, r3, r7\n\t"
  27741. "sbcs r4, r4, r8\n\t"
  27742. "sbcs r5, r5, r9\n\t"
  27743. "sbcs r6, r6, r10\n\t"
  27744. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  27745. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  27746. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  27747. "sbcs r3, r3, r7\n\t"
  27748. "sbcs r4, r4, r8\n\t"
  27749. "sbcs r5, r5, r9\n\t"
  27750. "sbcs r6, r6, r10\n\t"
  27751. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  27752. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  27753. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  27754. "sbcs r3, r3, r7\n\t"
  27755. "sbcs r4, r4, r8\n\t"
  27756. "sbcs r5, r5, r9\n\t"
  27757. "sbcs r6, r6, r10\n\t"
  27758. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  27759. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  27760. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  27761. "sbcs r3, r3, r7\n\t"
  27762. "sbcs r4, r4, r8\n\t"
  27763. "sbcs r5, r5, r9\n\t"
  27764. "sbcs r6, r6, r10\n\t"
  27765. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  27766. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  27767. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  27768. "sbcs r3, r3, r7\n\t"
  27769. "sbcs r4, r4, r8\n\t"
  27770. "sbcs r5, r5, r9\n\t"
  27771. "sbcs r6, r6, r10\n\t"
  27772. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  27773. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  27774. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  27775. "sbcs r3, r3, r7\n\t"
  27776. "sbcs r4, r4, r8\n\t"
  27777. "sbcs r5, r5, r9\n\t"
  27778. "sbcs r6, r6, r10\n\t"
  27779. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  27780. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  27781. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  27782. "sbcs r3, r3, r7\n\t"
  27783. "sbcs r4, r4, r8\n\t"
  27784. "sbcs r5, r5, r9\n\t"
  27785. "sbcs r6, r6, r10\n\t"
  27786. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  27787. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  27788. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  27789. "sbcs r3, r3, r7\n\t"
  27790. "sbcs r4, r4, r8\n\t"
  27791. "sbcs r5, r5, r9\n\t"
  27792. "sbcs r6, r6, r10\n\t"
  27793. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  27794. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  27795. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  27796. "sbcs r3, r3, r7\n\t"
  27797. "sbcs r4, r4, r8\n\t"
  27798. "sbcs r5, r5, r9\n\t"
  27799. "sbcs r6, r6, r10\n\t"
  27800. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  27801. "sbc %[r], r6, r6\n\t"
  27802. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  27803. :
  27804. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "cc"
  27805. );
  27806. return (uint32_t)(size_t)r;
  27807. }
  27808. /* Square a and put result in r. (r = a * a)
  27809. *
  27810. * r A single precision integer.
  27811. * a A single precision integer.
  27812. */
  27813. SP_NOINLINE static void sp_3072_sqr_96(sp_digit* r, const sp_digit* a)
  27814. {
  27815. sp_digit* z0 = r;
  27816. sp_digit* z2 = r + 96;
  27817. sp_digit z1[96];
  27818. sp_digit* a1 = z1;
  27819. sp_digit zero[48];
  27820. sp_digit u;
  27821. sp_digit mask;
  27822. sp_digit* p1;
  27823. sp_digit* p2;
  27824. XMEMSET(zero, 0, sizeof(sp_digit) * 48);
  27825. mask = sp_3072_sub_48(a1, a, &a[48]);
  27826. p1 = (sp_digit*)(((sp_digit)zero & mask ) | ((sp_digit)a1 & (~mask)));
  27827. p2 = (sp_digit*)(((sp_digit)zero & (~mask)) | ((sp_digit)a1 & mask ));
  27828. (void)sp_3072_sub_48(a1, p1, p2);
  27829. sp_3072_sqr_48(z2, &a[48]);
  27830. sp_3072_sqr_48(z0, a);
  27831. sp_3072_sqr_48(z1, a1);
  27832. u = 0;
  27833. u -= sp_3072_sub_in_place_96(z1, z2);
  27834. u -= sp_3072_sub_in_place_96(z1, z0);
  27835. u += sp_3072_sub_in_place_96(r + 48, z1);
  27836. zero[0] = u;
  27837. (void)sp_3072_add_48(r + 144, r + 144, zero);
  27838. }
  27839. #endif /* !WOLFSSL_SP_SMALL */
  27840. #ifdef WOLFSSL_SP_SMALL
  27841. /* Add b to a into r. (r = a + b)
  27842. *
  27843. * r A single precision integer.
  27844. * a A single precision integer.
  27845. * b A single precision integer.
  27846. */
  27847. static sp_digit sp_3072_add_96(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p)
  27848. {
  27849. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  27850. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  27851. register const sp_digit* b asm ("r2") = (const sp_digit*)b_p;
  27852. __asm__ __volatile__ (
  27853. "mov r3, #0\n\t"
  27854. "add r12, %[a], #0x180\n\t"
  27855. "\n"
  27856. "L_sp_3072_add_96_word_%=: \n\t"
  27857. "adds r3, r3, #-1\n\t"
  27858. "ldm %[a]!, {r4, r5, r6, r7}\n\t"
  27859. "ldm %[b]!, {r8, r9, r10, r11}\n\t"
  27860. "adcs r4, r4, r8\n\t"
  27861. "adcs r5, r5, r9\n\t"
  27862. "adcs r6, r6, r10\n\t"
  27863. "adcs r7, r7, r11\n\t"
  27864. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  27865. "mov r4, #0\n\t"
  27866. "adc r3, r4, #0\n\t"
  27867. "cmp %[a], r12\n\t"
  27868. "bne L_sp_3072_add_96_word_%=\n\t"
  27869. "mov %[r], r3\n\t"
  27870. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  27871. :
  27872. : "memory", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r3", "r12", "cc"
  27873. );
  27874. return (uint32_t)(size_t)r;
  27875. }
  27876. #endif /* WOLFSSL_SP_SMALL */
  27877. #ifdef WOLFSSL_SP_SMALL
  27878. /* Sub b from a into a. (a -= b)
  27879. *
  27880. * a A single precision integer.
  27881. * b A single precision integer.
  27882. */
  27883. static sp_digit sp_3072_sub_in_place_96(sp_digit* a_p, const sp_digit* b_p)
  27884. {
  27885. register sp_digit* a asm ("r0") = (sp_digit*)a_p;
  27886. register const sp_digit* b asm ("r1") = (const sp_digit*)b_p;
  27887. __asm__ __volatile__ (
  27888. "mov r12, #0\n\t"
  27889. "add lr, %[a], #0x180\n\t"
  27890. "\n"
  27891. "L_sp_3072_sub_in_pkace_96_word_%=: \n\t"
  27892. "rsbs r12, r12, #0\n\t"
  27893. "ldm %[a], {r2, r3, r4, r5}\n\t"
  27894. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  27895. "sbcs r2, r2, r6\n\t"
  27896. "sbcs r3, r3, r7\n\t"
  27897. "sbcs r4, r4, r8\n\t"
  27898. "sbcs r5, r5, r9\n\t"
  27899. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  27900. "sbc r12, r12, r12\n\t"
  27901. "cmp %[a], lr\n\t"
  27902. "bne L_sp_3072_sub_in_pkace_96_word_%=\n\t"
  27903. "mov %[a], r12\n\t"
  27904. : [a] "+r" (a), [b] "+r" (b)
  27905. :
  27906. : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r12", "lr", "cc"
  27907. );
  27908. return (uint32_t)(size_t)a;
  27909. }
  27910. #endif /* WOLFSSL_SP_SMALL */
  27911. #ifdef WOLFSSL_SP_SMALL
  27912. /* Multiply a and b into r. (r = a * b)
  27913. *
  27914. * r A single precision integer.
  27915. * a A single precision integer.
  27916. * b A single precision integer.
  27917. */
  27918. static void sp_3072_mul_96(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p)
  27919. {
  27920. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  27921. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  27922. register const sp_digit* b asm ("r2") = (const sp_digit*)b_p;
  27923. __asm__ __volatile__ (
  27924. "sub sp, sp, #0x300\n\t"
  27925. "ldr lr, [%[a]]\n\t"
  27926. "ldr r11, [%[b]]\n\t"
  27927. "umull r8, r6, lr, r11\n\t"
  27928. "str r8, [sp]\n\t"
  27929. "mov r7, #0\n\t"
  27930. "mov r8, #0\n\t"
  27931. "mov r5, #4\n\t"
  27932. "\n"
  27933. "L_sp_3072_mul_96_outer_%=: \n\t"
  27934. "subs r3, r5, #0x17c\n\t"
  27935. "it cc\n\t"
  27936. "movcc r3, #0\n\t"
  27937. "sub r4, r5, r3\n\t"
  27938. "\n"
  27939. "L_sp_3072_mul_96_inner_%=: \n\t"
  27940. "ldr lr, [%[a], r3]\n\t"
  27941. "ldr r11, [%[b], r4]\n\t"
  27942. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  27943. "lsl r9, lr, #16\n\t"
  27944. "lsl r10, r11, #16\n\t"
  27945. "lsr r9, r9, #16\n\t"
  27946. "lsr r10, r10, #16\n\t"
  27947. "mul r10, r9, r10\n\t"
  27948. "adds r6, r6, r10\n\t"
  27949. "adcs r7, r7, #0\n\t"
  27950. "adc r8, r8, #0\n\t"
  27951. "lsr r10, r11, #16\n\t"
  27952. "mul r9, r10, r9\n\t"
  27953. "lsr r10, r9, #16\n\t"
  27954. "lsl r9, r9, #16\n\t"
  27955. "adds r6, r6, r9\n\t"
  27956. "adcs r7, r7, r10\n\t"
  27957. "adc r8, r8, #0\n\t"
  27958. "lsr r9, lr, #16\n\t"
  27959. "lsr r10, r11, #16\n\t"
  27960. "mul r10, r9, r10\n\t"
  27961. "adds r7, r7, r10\n\t"
  27962. "adc r8, r8, #0\n\t"
  27963. "lsl r10, r11, #16\n\t"
  27964. "lsr r10, r10, #16\n\t"
  27965. "mul r9, r10, r9\n\t"
  27966. "lsr r10, r9, #16\n\t"
  27967. "lsl r9, r9, #16\n\t"
  27968. "adds r6, r6, r9\n\t"
  27969. "adcs r7, r7, r10\n\t"
  27970. "adc r8, r8, #0\n\t"
  27971. #else
  27972. "umull r9, r10, lr, r11\n\t"
  27973. "adds r6, r6, r9\n\t"
  27974. "adcs r7, r7, r10\n\t"
  27975. "adc r8, r8, #0\n\t"
  27976. #endif
  27977. "ldr lr, [%[a], r4]\n\t"
  27978. "ldr r11, [%[b], r3]\n\t"
  27979. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  27980. "lsl r9, lr, #16\n\t"
  27981. "lsl r10, r11, #16\n\t"
  27982. "lsr r9, r9, #16\n\t"
  27983. "lsr r10, r10, #16\n\t"
  27984. "mul r10, r9, r10\n\t"
  27985. "adds r6, r6, r10\n\t"
  27986. "adcs r7, r7, #0\n\t"
  27987. "adc r8, r8, #0\n\t"
  27988. "lsr r10, r11, #16\n\t"
  27989. "mul r9, r10, r9\n\t"
  27990. "lsr r10, r9, #16\n\t"
  27991. "lsl r9, r9, #16\n\t"
  27992. "adds r6, r6, r9\n\t"
  27993. "adcs r7, r7, r10\n\t"
  27994. "adc r8, r8, #0\n\t"
  27995. "lsr r9, lr, #16\n\t"
  27996. "lsr r10, r11, #16\n\t"
  27997. "mul r10, r9, r10\n\t"
  27998. "adds r7, r7, r10\n\t"
  27999. "adc r8, r8, #0\n\t"
  28000. "lsl r10, r11, #16\n\t"
  28001. "lsr r10, r10, #16\n\t"
  28002. "mul r9, r10, r9\n\t"
  28003. "lsr r10, r9, #16\n\t"
  28004. "lsl r9, r9, #16\n\t"
  28005. "adds r6, r6, r9\n\t"
  28006. "adcs r7, r7, r10\n\t"
  28007. "adc r8, r8, #0\n\t"
  28008. #else
  28009. "umull r9, r10, lr, r11\n\t"
  28010. "adds r6, r6, r9\n\t"
  28011. "adcs r7, r7, r10\n\t"
  28012. "adc r8, r8, #0\n\t"
  28013. #endif
  28014. "add r3, r3, #4\n\t"
  28015. "sub r4, r4, #4\n\t"
  28016. "cmp r3, r4\n\t"
  28017. "bgt L_sp_3072_mul_96_inner_done_%=\n\t"
  28018. "blt L_sp_3072_mul_96_inner_%=\n\t"
  28019. "ldr lr, [%[a], r3]\n\t"
  28020. "ldr r11, [%[b], r3]\n\t"
  28021. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  28022. "lsl r9, lr, #16\n\t"
  28023. "lsl r10, r11, #16\n\t"
  28024. "lsr r9, r9, #16\n\t"
  28025. "lsr r10, r10, #16\n\t"
  28026. "mul r10, r9, r10\n\t"
  28027. "adds r6, r6, r10\n\t"
  28028. "adcs r7, r7, #0\n\t"
  28029. "adc r8, r8, #0\n\t"
  28030. "lsr r10, r11, #16\n\t"
  28031. "mul r9, r10, r9\n\t"
  28032. "lsr r10, r9, #16\n\t"
  28033. "lsl r9, r9, #16\n\t"
  28034. "adds r6, r6, r9\n\t"
  28035. "adcs r7, r7, r10\n\t"
  28036. "adc r8, r8, #0\n\t"
  28037. "lsr r9, lr, #16\n\t"
  28038. "lsr r10, r11, #16\n\t"
  28039. "mul r10, r9, r10\n\t"
  28040. "adds r7, r7, r10\n\t"
  28041. "adc r8, r8, #0\n\t"
  28042. "lsl r10, r11, #16\n\t"
  28043. "lsr r10, r10, #16\n\t"
  28044. "mul r9, r10, r9\n\t"
  28045. "lsr r10, r9, #16\n\t"
  28046. "lsl r9, r9, #16\n\t"
  28047. "adds r6, r6, r9\n\t"
  28048. "adcs r7, r7, r10\n\t"
  28049. "adc r8, r8, #0\n\t"
  28050. #else
  28051. "umull r9, r10, lr, r11\n\t"
  28052. "adds r6, r6, r9\n\t"
  28053. "adcs r7, r7, r10\n\t"
  28054. "adc r8, r8, #0\n\t"
  28055. #endif
  28056. "\n"
  28057. "L_sp_3072_mul_96_inner_done_%=: \n\t"
  28058. "str r6, [sp, r5]\n\t"
  28059. "mov r6, r7\n\t"
  28060. "mov r7, r8\n\t"
  28061. "mov r8, #0\n\t"
  28062. "add r5, r5, #4\n\t"
  28063. "cmp r5, #0x2f4\n\t"
  28064. "ble L_sp_3072_mul_96_outer_%=\n\t"
  28065. "ldr lr, [%[a], #380]\n\t"
  28066. "ldr r11, [%[b], #380]\n\t"
  28067. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  28068. "lsl r9, lr, #16\n\t"
  28069. "lsl r10, r11, #16\n\t"
  28070. "lsr r9, r9, #16\n\t"
  28071. "lsr r10, r10, #16\n\t"
  28072. "mul r10, r9, r10\n\t"
  28073. "adds r6, r6, r10\n\t"
  28074. "adc r7, r7, #0\n\t"
  28075. "lsr r10, r11, #16\n\t"
  28076. "mul r9, r10, r9\n\t"
  28077. "lsr r10, r9, #16\n\t"
  28078. "lsl r9, r9, #16\n\t"
  28079. "adds r6, r6, r9\n\t"
  28080. "adc r7, r7, r10\n\t"
  28081. "lsr r9, lr, #16\n\t"
  28082. "lsr r10, r11, #16\n\t"
  28083. "mul r10, r9, r10\n\t"
  28084. "add r7, r7, r10\n\t"
  28085. "lsl r10, r11, #16\n\t"
  28086. "lsr r10, r10, #16\n\t"
  28087. "mul r9, r10, r9\n\t"
  28088. "lsr r10, r9, #16\n\t"
  28089. "lsl r9, r9, #16\n\t"
  28090. "adds r6, r6, r9\n\t"
  28091. "adc r7, r7, r10\n\t"
  28092. #else
  28093. "umlal r6, r7, lr, r11\n\t"
  28094. #endif
  28095. "str r6, [sp, r5]\n\t"
  28096. "add r5, r5, #4\n\t"
  28097. "str r7, [sp, r5]\n\t"
  28098. "\n"
  28099. "L_sp_3072_mul_96_store_%=: \n\t"
  28100. "ldm sp!, {r3, r4, r6, r7, r8, r9, r10, r11}\n\t"
  28101. "stm %[r]!, {r3, r4, r6, r7, r8, r9, r10, r11}\n\t"
  28102. "subs r5, r5, #32\n\t"
  28103. "bgt L_sp_3072_mul_96_store_%=\n\t"
  28104. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  28105. :
  28106. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "lr", "r11", "cc"
  28107. );
  28108. }
  28109. /* Square a and put result in r. (r = a * a)
  28110. *
  28111. * r A single precision integer.
  28112. * a A single precision integer.
  28113. */
  28114. static void sp_3072_sqr_96(sp_digit* r_p, const sp_digit* a_p)
  28115. {
  28116. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  28117. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  28118. __asm__ __volatile__ (
  28119. "sub sp, sp, #0x300\n\t"
  28120. "ldr lr, [%[a]]\n\t"
  28121. "umull r8, r6, lr, lr\n\t"
  28122. "str r8, [sp]\n\t"
  28123. "mov r7, #0\n\t"
  28124. "mov r8, #0\n\t"
  28125. "mov r5, #4\n\t"
  28126. "\n"
  28127. "L_sp_3072_sqr_96_outer_%=: \n\t"
  28128. "subs r3, r5, #0x17c\n\t"
  28129. "it cc\n\t"
  28130. "movcc r3, #0\n\t"
  28131. "sub r4, r5, r3\n\t"
  28132. "\n"
  28133. "L_sp_3072_sqr_96_inner_%=: \n\t"
  28134. "ldr lr, [%[a], r3]\n\t"
  28135. "ldr r11, [%[a], r4]\n\t"
  28136. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  28137. "lsl r9, lr, #16\n\t"
  28138. "lsl r10, r11, #16\n\t"
  28139. "lsr r9, r9, #16\n\t"
  28140. "lsr r10, r10, #16\n\t"
  28141. "mul r10, r9, r10\n\t"
  28142. "adds r6, r6, r10\n\t"
  28143. "adcs r7, r7, #0\n\t"
  28144. "adc r8, r8, #0\n\t"
  28145. "adds r6, r6, r10\n\t"
  28146. "adcs r7, r7, #0\n\t"
  28147. "adc r8, r8, #0\n\t"
  28148. "lsr r10, r11, #16\n\t"
  28149. "mul r9, r10, r9\n\t"
  28150. "lsr r10, r9, #16\n\t"
  28151. "lsl r9, r9, #16\n\t"
  28152. "adds r6, r6, r9\n\t"
  28153. "adcs r7, r7, r10\n\t"
  28154. "adc r8, r8, #0\n\t"
  28155. "adds r6, r6, r9\n\t"
  28156. "adcs r7, r7, r10\n\t"
  28157. "adc r8, r8, #0\n\t"
  28158. "lsr r9, lr, #16\n\t"
  28159. "lsr r10, r11, #16\n\t"
  28160. "mul r10, r9, r10\n\t"
  28161. "adds r7, r7, r10\n\t"
  28162. "adc r8, r8, #0\n\t"
  28163. "adds r7, r7, r10\n\t"
  28164. "adc r8, r8, #0\n\t"
  28165. "lsl r10, r11, #16\n\t"
  28166. "lsr r10, r10, #16\n\t"
  28167. "mul r9, r10, r9\n\t"
  28168. "lsr r10, r9, #16\n\t"
  28169. "lsl r9, r9, #16\n\t"
  28170. "adds r6, r6, r9\n\t"
  28171. "adcs r7, r7, r10\n\t"
  28172. "adc r8, r8, #0\n\t"
  28173. "adds r6, r6, r9\n\t"
  28174. "adcs r7, r7, r10\n\t"
  28175. "adc r8, r8, #0\n\t"
  28176. #else
  28177. "umull r9, r10, lr, r11\n\t"
  28178. "adds r6, r6, r9\n\t"
  28179. "adcs r7, r7, r10\n\t"
  28180. "adc r8, r8, #0\n\t"
  28181. "adds r6, r6, r9\n\t"
  28182. "adcs r7, r7, r10\n\t"
  28183. "adc r8, r8, #0\n\t"
  28184. #endif
  28185. "add r3, r3, #4\n\t"
  28186. "sub r4, r4, #4\n\t"
  28187. "cmp r3, r4\n\t"
  28188. "bgt L_sp_3072_sqr_96_inner_done_%=\n\t"
  28189. "blt L_sp_3072_sqr_96_inner_%=\n\t"
  28190. "ldr lr, [%[a], r3]\n\t"
  28191. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  28192. "lsl r9, lr, #16\n\t"
  28193. "lsr r10, lr, #16\n\t"
  28194. "lsr r9, r9, #16\n\t"
  28195. "mov r11, r9\n\t"
  28196. "mul r9, r11, r9\n\t"
  28197. "mov r11, r10\n\t"
  28198. "mul r10, r11, r10\n\t"
  28199. "adds r6, r6, r9\n\t"
  28200. "adcs r7, r7, r10\n\t"
  28201. "adc r8, r8, #0\n\t"
  28202. "lsr r10, lr, #16\n\t"
  28203. "lsl r9, lr, #16\n\t"
  28204. "lsr r9, r9, #16\n\t"
  28205. "mul r9, r10, r9\n\t"
  28206. "lsr r10, r9, #15\n\t"
  28207. "lsl r9, r9, #17\n\t"
  28208. "adds r6, r6, r9\n\t"
  28209. "adcs r7, r7, r10\n\t"
  28210. "adc r8, r8, #0\n\t"
  28211. #else
  28212. "umull r9, r10, lr, lr\n\t"
  28213. "adds r6, r6, r9\n\t"
  28214. "adcs r7, r7, r10\n\t"
  28215. "adc r8, r8, #0\n\t"
  28216. #endif
  28217. "\n"
  28218. "L_sp_3072_sqr_96_inner_done_%=: \n\t"
  28219. "str r6, [sp, r5]\n\t"
  28220. "mov r6, r7\n\t"
  28221. "mov r7, r8\n\t"
  28222. "mov r8, #0\n\t"
  28223. "add r5, r5, #4\n\t"
  28224. "cmp r5, #0x2f4\n\t"
  28225. "ble L_sp_3072_sqr_96_outer_%=\n\t"
  28226. "ldr lr, [%[a], #380]\n\t"
  28227. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  28228. "lsl r9, lr, #16\n\t"
  28229. "lsr r10, lr, #16\n\t"
  28230. "lsr r9, r9, #16\n\t"
  28231. "mov r11, r9\n\t"
  28232. "mul r9, r11, r9\n\t"
  28233. "mov r11, r10\n\t"
  28234. "mul r10, r11, r10\n\t"
  28235. "adds r6, r6, r9\n\t"
  28236. "adc r7, r7, r10\n\t"
  28237. "lsr r10, lr, #16\n\t"
  28238. "lsl r9, lr, #16\n\t"
  28239. "lsr r9, r9, #16\n\t"
  28240. "mul r9, r10, r9\n\t"
  28241. "lsr r10, r9, #15\n\t"
  28242. "lsl r9, r9, #17\n\t"
  28243. "adds r6, r6, r9\n\t"
  28244. "adc r7, r7, r10\n\t"
  28245. #else
  28246. "umull r9, r10, lr, lr\n\t"
  28247. "adds r6, r6, r9\n\t"
  28248. "adc r7, r7, r10\n\t"
  28249. #endif
  28250. "str r6, [sp, r5]\n\t"
  28251. "add r5, r5, #4\n\t"
  28252. "str r7, [sp, r5]\n\t"
  28253. "\n"
  28254. "L_sp_3072_sqr_96_store_%=: \n\t"
  28255. "ldm sp!, {r3, r4, r6, r7, r8, r9, r10, r11}\n\t"
  28256. "stm %[r]!, {r3, r4, r6, r7, r8, r9, r10, r11}\n\t"
  28257. "subs r5, r5, #32\n\t"
  28258. "bgt L_sp_3072_sqr_96_store_%=\n\t"
  28259. : [r] "+r" (r), [a] "+r" (a)
  28260. :
  28261. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "lr", "r11", "cc"
  28262. );
  28263. }
  28264. #endif /* WOLFSSL_SP_SMALL */
  28265. #if (defined(WOLFSSL_HAVE_SP_RSA) && !defined(WOLFSSL_RSA_PUBLIC_ONLY)) || defined(WOLFSSL_HAVE_SP_DH)
  28266. #ifdef WOLFSSL_SP_SMALL
  28267. /* AND m into each word of a and store in r.
  28268. *
  28269. * r A single precision integer.
  28270. * a A single precision integer.
  28271. * m Mask to AND against each digit.
  28272. */
  28273. static void sp_3072_mask_48(sp_digit* r, const sp_digit* a, sp_digit m)
  28274. {
  28275. int i;
  28276. for (i=0; i<48; i++) {
  28277. r[i] = a[i] & m;
  28278. }
  28279. }
  28280. #endif /* WOLFSSL_SP_SMALL */
  28281. #ifdef WOLFSSL_SP_SMALL
  28282. /* Add b to a into r. (r = a + b)
  28283. *
  28284. * r A single precision integer.
  28285. * a A single precision integer.
  28286. * b A single precision integer.
  28287. */
  28288. static sp_digit sp_3072_add_48(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p)
  28289. {
  28290. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  28291. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  28292. register const sp_digit* b asm ("r2") = (const sp_digit*)b_p;
  28293. __asm__ __volatile__ (
  28294. "mov r3, #0\n\t"
  28295. "add r12, %[a], #0xc0\n\t"
  28296. "\n"
  28297. "L_sp_3072_add_48_word_%=: \n\t"
  28298. "adds r3, r3, #-1\n\t"
  28299. "ldm %[a]!, {r4, r5, r6, r7}\n\t"
  28300. "ldm %[b]!, {r8, r9, r10, r11}\n\t"
  28301. "adcs r4, r4, r8\n\t"
  28302. "adcs r5, r5, r9\n\t"
  28303. "adcs r6, r6, r10\n\t"
  28304. "adcs r7, r7, r11\n\t"
  28305. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  28306. "mov r4, #0\n\t"
  28307. "adc r3, r4, #0\n\t"
  28308. "cmp %[a], r12\n\t"
  28309. "bne L_sp_3072_add_48_word_%=\n\t"
  28310. "mov %[r], r3\n\t"
  28311. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  28312. :
  28313. : "memory", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r3", "r12", "cc"
  28314. );
  28315. return (uint32_t)(size_t)r;
  28316. }
  28317. #endif /* WOLFSSL_SP_SMALL */
  28318. #ifdef WOLFSSL_SP_SMALL
  28319. /* Sub b from a into a. (a -= b)
  28320. *
  28321. * a A single precision integer.
  28322. * b A single precision integer.
  28323. */
  28324. static sp_digit sp_3072_sub_in_place_48(sp_digit* a_p, const sp_digit* b_p)
  28325. {
  28326. register sp_digit* a asm ("r0") = (sp_digit*)a_p;
  28327. register const sp_digit* b asm ("r1") = (const sp_digit*)b_p;
  28328. __asm__ __volatile__ (
  28329. "mov r12, #0\n\t"
  28330. "add lr, %[a], #0xc0\n\t"
  28331. "\n"
  28332. "L_sp_3072_sub_in_pkace_48_word_%=: \n\t"
  28333. "rsbs r12, r12, #0\n\t"
  28334. "ldm %[a], {r2, r3, r4, r5}\n\t"
  28335. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  28336. "sbcs r2, r2, r6\n\t"
  28337. "sbcs r3, r3, r7\n\t"
  28338. "sbcs r4, r4, r8\n\t"
  28339. "sbcs r5, r5, r9\n\t"
  28340. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  28341. "sbc r12, r12, r12\n\t"
  28342. "cmp %[a], lr\n\t"
  28343. "bne L_sp_3072_sub_in_pkace_48_word_%=\n\t"
  28344. "mov %[a], r12\n\t"
  28345. : [a] "+r" (a), [b] "+r" (b)
  28346. :
  28347. : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r12", "lr", "cc"
  28348. );
  28349. return (uint32_t)(size_t)a;
  28350. }
  28351. #endif /* WOLFSSL_SP_SMALL */
  28352. #ifdef WOLFSSL_SP_SMALL
  28353. /* Multiply a and b into r. (r = a * b)
  28354. *
  28355. * r A single precision integer.
  28356. * a A single precision integer.
  28357. * b A single precision integer.
  28358. */
  28359. static void sp_3072_mul_48(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p)
  28360. {
  28361. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  28362. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  28363. register const sp_digit* b asm ("r2") = (const sp_digit*)b_p;
  28364. __asm__ __volatile__ (
  28365. "sub sp, sp, #0x180\n\t"
  28366. "ldr lr, [%[a]]\n\t"
  28367. "ldr r11, [%[b]]\n\t"
  28368. "umull r8, r6, lr, r11\n\t"
  28369. "str r8, [sp]\n\t"
  28370. "mov r7, #0\n\t"
  28371. "mov r8, #0\n\t"
  28372. "mov r5, #4\n\t"
  28373. "\n"
  28374. "L_sp_3072_mul_48_outer_%=: \n\t"
  28375. "subs r3, r5, #0xbc\n\t"
  28376. "it cc\n\t"
  28377. "movcc r3, #0\n\t"
  28378. "sub r4, r5, r3\n\t"
  28379. "\n"
  28380. "L_sp_3072_mul_48_inner_%=: \n\t"
  28381. "ldr lr, [%[a], r3]\n\t"
  28382. "ldr r11, [%[b], r4]\n\t"
  28383. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  28384. "lsl r9, lr, #16\n\t"
  28385. "lsl r10, r11, #16\n\t"
  28386. "lsr r9, r9, #16\n\t"
  28387. "lsr r10, r10, #16\n\t"
  28388. "mul r10, r9, r10\n\t"
  28389. "adds r6, r6, r10\n\t"
  28390. "adcs r7, r7, #0\n\t"
  28391. "adc r8, r8, #0\n\t"
  28392. "lsr r10, r11, #16\n\t"
  28393. "mul r9, r10, r9\n\t"
  28394. "lsr r10, r9, #16\n\t"
  28395. "lsl r9, r9, #16\n\t"
  28396. "adds r6, r6, r9\n\t"
  28397. "adcs r7, r7, r10\n\t"
  28398. "adc r8, r8, #0\n\t"
  28399. "lsr r9, lr, #16\n\t"
  28400. "lsr r10, r11, #16\n\t"
  28401. "mul r10, r9, r10\n\t"
  28402. "adds r7, r7, r10\n\t"
  28403. "adc r8, r8, #0\n\t"
  28404. "lsl r10, r11, #16\n\t"
  28405. "lsr r10, r10, #16\n\t"
  28406. "mul r9, r10, r9\n\t"
  28407. "lsr r10, r9, #16\n\t"
  28408. "lsl r9, r9, #16\n\t"
  28409. "adds r6, r6, r9\n\t"
  28410. "adcs r7, r7, r10\n\t"
  28411. "adc r8, r8, #0\n\t"
  28412. #else
  28413. "umull r9, r10, lr, r11\n\t"
  28414. "adds r6, r6, r9\n\t"
  28415. "adcs r7, r7, r10\n\t"
  28416. "adc r8, r8, #0\n\t"
  28417. #endif
  28418. "ldr lr, [%[a], r4]\n\t"
  28419. "ldr r11, [%[b], r3]\n\t"
  28420. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  28421. "lsl r9, lr, #16\n\t"
  28422. "lsl r10, r11, #16\n\t"
  28423. "lsr r9, r9, #16\n\t"
  28424. "lsr r10, r10, #16\n\t"
  28425. "mul r10, r9, r10\n\t"
  28426. "adds r6, r6, r10\n\t"
  28427. "adcs r7, r7, #0\n\t"
  28428. "adc r8, r8, #0\n\t"
  28429. "lsr r10, r11, #16\n\t"
  28430. "mul r9, r10, r9\n\t"
  28431. "lsr r10, r9, #16\n\t"
  28432. "lsl r9, r9, #16\n\t"
  28433. "adds r6, r6, r9\n\t"
  28434. "adcs r7, r7, r10\n\t"
  28435. "adc r8, r8, #0\n\t"
  28436. "lsr r9, lr, #16\n\t"
  28437. "lsr r10, r11, #16\n\t"
  28438. "mul r10, r9, r10\n\t"
  28439. "adds r7, r7, r10\n\t"
  28440. "adc r8, r8, #0\n\t"
  28441. "lsl r10, r11, #16\n\t"
  28442. "lsr r10, r10, #16\n\t"
  28443. "mul r9, r10, r9\n\t"
  28444. "lsr r10, r9, #16\n\t"
  28445. "lsl r9, r9, #16\n\t"
  28446. "adds r6, r6, r9\n\t"
  28447. "adcs r7, r7, r10\n\t"
  28448. "adc r8, r8, #0\n\t"
  28449. #else
  28450. "umull r9, r10, lr, r11\n\t"
  28451. "adds r6, r6, r9\n\t"
  28452. "adcs r7, r7, r10\n\t"
  28453. "adc r8, r8, #0\n\t"
  28454. #endif
  28455. "add r3, r3, #4\n\t"
  28456. "sub r4, r4, #4\n\t"
  28457. "cmp r3, r4\n\t"
  28458. "bgt L_sp_3072_mul_48_inner_done_%=\n\t"
  28459. "blt L_sp_3072_mul_48_inner_%=\n\t"
  28460. "ldr lr, [%[a], r3]\n\t"
  28461. "ldr r11, [%[b], r3]\n\t"
  28462. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  28463. "lsl r9, lr, #16\n\t"
  28464. "lsl r10, r11, #16\n\t"
  28465. "lsr r9, r9, #16\n\t"
  28466. "lsr r10, r10, #16\n\t"
  28467. "mul r10, r9, r10\n\t"
  28468. "adds r6, r6, r10\n\t"
  28469. "adcs r7, r7, #0\n\t"
  28470. "adc r8, r8, #0\n\t"
  28471. "lsr r10, r11, #16\n\t"
  28472. "mul r9, r10, r9\n\t"
  28473. "lsr r10, r9, #16\n\t"
  28474. "lsl r9, r9, #16\n\t"
  28475. "adds r6, r6, r9\n\t"
  28476. "adcs r7, r7, r10\n\t"
  28477. "adc r8, r8, #0\n\t"
  28478. "lsr r9, lr, #16\n\t"
  28479. "lsr r10, r11, #16\n\t"
  28480. "mul r10, r9, r10\n\t"
  28481. "adds r7, r7, r10\n\t"
  28482. "adc r8, r8, #0\n\t"
  28483. "lsl r10, r11, #16\n\t"
  28484. "lsr r10, r10, #16\n\t"
  28485. "mul r9, r10, r9\n\t"
  28486. "lsr r10, r9, #16\n\t"
  28487. "lsl r9, r9, #16\n\t"
  28488. "adds r6, r6, r9\n\t"
  28489. "adcs r7, r7, r10\n\t"
  28490. "adc r8, r8, #0\n\t"
  28491. #else
  28492. "umull r9, r10, lr, r11\n\t"
  28493. "adds r6, r6, r9\n\t"
  28494. "adcs r7, r7, r10\n\t"
  28495. "adc r8, r8, #0\n\t"
  28496. #endif
  28497. "\n"
  28498. "L_sp_3072_mul_48_inner_done_%=: \n\t"
  28499. "str r6, [sp, r5]\n\t"
  28500. "mov r6, r7\n\t"
  28501. "mov r7, r8\n\t"
  28502. "mov r8, #0\n\t"
  28503. "add r5, r5, #4\n\t"
  28504. "cmp r5, #0x174\n\t"
  28505. "ble L_sp_3072_mul_48_outer_%=\n\t"
  28506. "ldr lr, [%[a], #188]\n\t"
  28507. "ldr r11, [%[b], #188]\n\t"
  28508. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  28509. "lsl r9, lr, #16\n\t"
  28510. "lsl r10, r11, #16\n\t"
  28511. "lsr r9, r9, #16\n\t"
  28512. "lsr r10, r10, #16\n\t"
  28513. "mul r10, r9, r10\n\t"
  28514. "adds r6, r6, r10\n\t"
  28515. "adc r7, r7, #0\n\t"
  28516. "lsr r10, r11, #16\n\t"
  28517. "mul r9, r10, r9\n\t"
  28518. "lsr r10, r9, #16\n\t"
  28519. "lsl r9, r9, #16\n\t"
  28520. "adds r6, r6, r9\n\t"
  28521. "adc r7, r7, r10\n\t"
  28522. "lsr r9, lr, #16\n\t"
  28523. "lsr r10, r11, #16\n\t"
  28524. "mul r10, r9, r10\n\t"
  28525. "add r7, r7, r10\n\t"
  28526. "lsl r10, r11, #16\n\t"
  28527. "lsr r10, r10, #16\n\t"
  28528. "mul r9, r10, r9\n\t"
  28529. "lsr r10, r9, #16\n\t"
  28530. "lsl r9, r9, #16\n\t"
  28531. "adds r6, r6, r9\n\t"
  28532. "adc r7, r7, r10\n\t"
  28533. #else
  28534. "umlal r6, r7, lr, r11\n\t"
  28535. #endif
  28536. "str r6, [sp, r5]\n\t"
  28537. "add r5, r5, #4\n\t"
  28538. "str r7, [sp, r5]\n\t"
  28539. "\n"
  28540. "L_sp_3072_mul_48_store_%=: \n\t"
  28541. "ldm sp!, {r3, r4, r6, r7, r8, r9, r10, r11}\n\t"
  28542. "stm %[r]!, {r3, r4, r6, r7, r8, r9, r10, r11}\n\t"
  28543. "subs r5, r5, #32\n\t"
  28544. "bgt L_sp_3072_mul_48_store_%=\n\t"
  28545. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  28546. :
  28547. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "lr", "r11", "cc"
  28548. );
  28549. }
  28550. /* Square a and put result in r. (r = a * a)
  28551. *
  28552. * r A single precision integer.
  28553. * a A single precision integer.
  28554. */
  28555. static void sp_3072_sqr_48(sp_digit* r_p, const sp_digit* a_p)
  28556. {
  28557. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  28558. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  28559. __asm__ __volatile__ (
  28560. "sub sp, sp, #0x180\n\t"
  28561. "ldr lr, [%[a]]\n\t"
  28562. "umull r8, r6, lr, lr\n\t"
  28563. "str r8, [sp]\n\t"
  28564. "mov r7, #0\n\t"
  28565. "mov r8, #0\n\t"
  28566. "mov r5, #4\n\t"
  28567. "\n"
  28568. "L_sp_3072_sqr_48_outer_%=: \n\t"
  28569. "subs r3, r5, #0xbc\n\t"
  28570. "it cc\n\t"
  28571. "movcc r3, #0\n\t"
  28572. "sub r4, r5, r3\n\t"
  28573. "\n"
  28574. "L_sp_3072_sqr_48_inner_%=: \n\t"
  28575. "ldr lr, [%[a], r3]\n\t"
  28576. "ldr r11, [%[a], r4]\n\t"
  28577. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  28578. "lsl r9, lr, #16\n\t"
  28579. "lsl r10, r11, #16\n\t"
  28580. "lsr r9, r9, #16\n\t"
  28581. "lsr r10, r10, #16\n\t"
  28582. "mul r10, r9, r10\n\t"
  28583. "adds r6, r6, r10\n\t"
  28584. "adcs r7, r7, #0\n\t"
  28585. "adc r8, r8, #0\n\t"
  28586. "adds r6, r6, r10\n\t"
  28587. "adcs r7, r7, #0\n\t"
  28588. "adc r8, r8, #0\n\t"
  28589. "lsr r10, r11, #16\n\t"
  28590. "mul r9, r10, r9\n\t"
  28591. "lsr r10, r9, #16\n\t"
  28592. "lsl r9, r9, #16\n\t"
  28593. "adds r6, r6, r9\n\t"
  28594. "adcs r7, r7, r10\n\t"
  28595. "adc r8, r8, #0\n\t"
  28596. "adds r6, r6, r9\n\t"
  28597. "adcs r7, r7, r10\n\t"
  28598. "adc r8, r8, #0\n\t"
  28599. "lsr r9, lr, #16\n\t"
  28600. "lsr r10, r11, #16\n\t"
  28601. "mul r10, r9, r10\n\t"
  28602. "adds r7, r7, r10\n\t"
  28603. "adc r8, r8, #0\n\t"
  28604. "adds r7, r7, r10\n\t"
  28605. "adc r8, r8, #0\n\t"
  28606. "lsl r10, r11, #16\n\t"
  28607. "lsr r10, r10, #16\n\t"
  28608. "mul r9, r10, r9\n\t"
  28609. "lsr r10, r9, #16\n\t"
  28610. "lsl r9, r9, #16\n\t"
  28611. "adds r6, r6, r9\n\t"
  28612. "adcs r7, r7, r10\n\t"
  28613. "adc r8, r8, #0\n\t"
  28614. "adds r6, r6, r9\n\t"
  28615. "adcs r7, r7, r10\n\t"
  28616. "adc r8, r8, #0\n\t"
  28617. #else
  28618. "umull r9, r10, lr, r11\n\t"
  28619. "adds r6, r6, r9\n\t"
  28620. "adcs r7, r7, r10\n\t"
  28621. "adc r8, r8, #0\n\t"
  28622. "adds r6, r6, r9\n\t"
  28623. "adcs r7, r7, r10\n\t"
  28624. "adc r8, r8, #0\n\t"
  28625. #endif
  28626. "add r3, r3, #4\n\t"
  28627. "sub r4, r4, #4\n\t"
  28628. "cmp r3, r4\n\t"
  28629. "bgt L_sp_3072_sqr_48_inner_done_%=\n\t"
  28630. "blt L_sp_3072_sqr_48_inner_%=\n\t"
  28631. "ldr lr, [%[a], r3]\n\t"
  28632. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  28633. "lsl r9, lr, #16\n\t"
  28634. "lsr r10, lr, #16\n\t"
  28635. "lsr r9, r9, #16\n\t"
  28636. "mov r11, r9\n\t"
  28637. "mul r9, r11, r9\n\t"
  28638. "mov r11, r10\n\t"
  28639. "mul r10, r11, r10\n\t"
  28640. "adds r6, r6, r9\n\t"
  28641. "adcs r7, r7, r10\n\t"
  28642. "adc r8, r8, #0\n\t"
  28643. "lsr r10, lr, #16\n\t"
  28644. "lsl r9, lr, #16\n\t"
  28645. "lsr r9, r9, #16\n\t"
  28646. "mul r9, r10, r9\n\t"
  28647. "lsr r10, r9, #15\n\t"
  28648. "lsl r9, r9, #17\n\t"
  28649. "adds r6, r6, r9\n\t"
  28650. "adcs r7, r7, r10\n\t"
  28651. "adc r8, r8, #0\n\t"
  28652. #else
  28653. "umull r9, r10, lr, lr\n\t"
  28654. "adds r6, r6, r9\n\t"
  28655. "adcs r7, r7, r10\n\t"
  28656. "adc r8, r8, #0\n\t"
  28657. #endif
  28658. "\n"
  28659. "L_sp_3072_sqr_48_inner_done_%=: \n\t"
  28660. "str r6, [sp, r5]\n\t"
  28661. "mov r6, r7\n\t"
  28662. "mov r7, r8\n\t"
  28663. "mov r8, #0\n\t"
  28664. "add r5, r5, #4\n\t"
  28665. "cmp r5, #0x174\n\t"
  28666. "ble L_sp_3072_sqr_48_outer_%=\n\t"
  28667. "ldr lr, [%[a], #188]\n\t"
  28668. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  28669. "lsl r9, lr, #16\n\t"
  28670. "lsr r10, lr, #16\n\t"
  28671. "lsr r9, r9, #16\n\t"
  28672. "mov r11, r9\n\t"
  28673. "mul r9, r11, r9\n\t"
  28674. "mov r11, r10\n\t"
  28675. "mul r10, r11, r10\n\t"
  28676. "adds r6, r6, r9\n\t"
  28677. "adc r7, r7, r10\n\t"
  28678. "lsr r10, lr, #16\n\t"
  28679. "lsl r9, lr, #16\n\t"
  28680. "lsr r9, r9, #16\n\t"
  28681. "mul r9, r10, r9\n\t"
  28682. "lsr r10, r9, #15\n\t"
  28683. "lsl r9, r9, #17\n\t"
  28684. "adds r6, r6, r9\n\t"
  28685. "adc r7, r7, r10\n\t"
  28686. #else
  28687. "umull r9, r10, lr, lr\n\t"
  28688. "adds r6, r6, r9\n\t"
  28689. "adc r7, r7, r10\n\t"
  28690. #endif
  28691. "str r6, [sp, r5]\n\t"
  28692. "add r5, r5, #4\n\t"
  28693. "str r7, [sp, r5]\n\t"
  28694. "\n"
  28695. "L_sp_3072_sqr_48_store_%=: \n\t"
  28696. "ldm sp!, {r3, r4, r6, r7, r8, r9, r10, r11}\n\t"
  28697. "stm %[r]!, {r3, r4, r6, r7, r8, r9, r10, r11}\n\t"
  28698. "subs r5, r5, #32\n\t"
  28699. "bgt L_sp_3072_sqr_48_store_%=\n\t"
  28700. : [r] "+r" (r), [a] "+r" (a)
  28701. :
  28702. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "lr", "r11", "cc"
  28703. );
  28704. }
  28705. #endif /* WOLFSSL_SP_SMALL */
  28706. #endif /* (WOLFSSL_HAVE_SP_RSA & !WOLFSSL_RSA_PUBLIC_ONLY) | WOLFSSL_HAVE_SP_DH */
  28707. /* Calculate the bottom digit of -1/a mod 2^n.
  28708. *
  28709. * a A single precision number.
  28710. * rho Bottom word of inverse.
  28711. */
  28712. static void sp_3072_mont_setup(const sp_digit* a, sp_digit* rho)
  28713. {
  28714. sp_digit x;
  28715. sp_digit b;
  28716. b = a[0];
  28717. x = (((b + 2) & 4) << 1) + b; /* here x*a==1 mod 2**4 */
  28718. x *= 2 - b * x; /* here x*a==1 mod 2**8 */
  28719. x *= 2 - b * x; /* here x*a==1 mod 2**16 */
  28720. x *= 2 - b * x; /* here x*a==1 mod 2**32 */
  28721. /* rho = -1/m mod b */
  28722. *rho = (sp_digit)0 - x;
  28723. }
  28724. #ifdef WOLFSSL_SP_SMALL
  28725. /* Mul a by digit b into r. (r = a * b)
  28726. *
  28727. * r A single precision integer.
  28728. * a A single precision integer.
  28729. * b A single precision digit.
  28730. */
  28731. static void sp_3072_mul_d_96(sp_digit* r_p, const sp_digit* a_p, sp_digit b_p)
  28732. {
  28733. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  28734. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  28735. register sp_digit b asm ("r2") = (sp_digit)b_p;
  28736. __asm__ __volatile__ (
  28737. /* A[0] * B */
  28738. "ldr r8, [%[a]]\n\t"
  28739. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  28740. "lsl r6, %[b], #16\n\t"
  28741. "lsl r5, r8, #16\n\t"
  28742. "lsr r6, r6, #16\n\t"
  28743. "lsr r5, r5, #16\n\t"
  28744. "mul r5, r6, r5\n\t"
  28745. "lsr r7, r8, #16\n\t"
  28746. "mul r6, r7, r6\n\t"
  28747. "lsr r3, r6, #16\n\t"
  28748. "lsl r6, r6, #16\n\t"
  28749. "adds r5, r5, r6\n\t"
  28750. "adc r3, r3, #0\n\t"
  28751. "lsr r6, %[b], #16\n\t"
  28752. "mul r7, r6, r7\n\t"
  28753. "add r3, r3, r7\n\t"
  28754. "lsl r7, r8, #16\n\t"
  28755. "lsr r7, r7, #16\n\t"
  28756. "mul r6, r7, r6\n\t"
  28757. "lsr r7, r6, #16\n\t"
  28758. "lsl r6, r6, #16\n\t"
  28759. "adds r5, r5, r6\n\t"
  28760. "adc r3, r3, r7\n\t"
  28761. #else
  28762. "umull r5, r3, %[b], r8\n\t"
  28763. #endif
  28764. "mov r4, #0\n\t"
  28765. "str r5, [%[r]]\n\t"
  28766. "mov r5, #0\n\t"
  28767. "mov r9, #4\n\t"
  28768. "\n"
  28769. "L_sp_3072_mul_d_96_word_%=: \n\t"
  28770. /* A[i] * B */
  28771. "ldr r8, [%[a], r9]\n\t"
  28772. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  28773. "lsl r6, %[b], #16\n\t"
  28774. "lsl r7, r8, #16\n\t"
  28775. "lsr r6, r6, #16\n\t"
  28776. "lsr r7, r7, #16\n\t"
  28777. "mul r7, r6, r7\n\t"
  28778. "adds r3, r3, r7\n\t"
  28779. "adcs r4, r4, #0\n\t"
  28780. "adc r5, r5, #0\n\t"
  28781. "lsr r7, r8, #16\n\t"
  28782. "mul r6, r7, r6\n\t"
  28783. "lsr r7, r6, #16\n\t"
  28784. "lsl r6, r6, #16\n\t"
  28785. "adds r3, r3, r6\n\t"
  28786. "adcs r4, r4, r7\n\t"
  28787. "adc r5, r5, #0\n\t"
  28788. "lsr r6, %[b], #16\n\t"
  28789. "lsr r7, r8, #16\n\t"
  28790. "mul r7, r6, r7\n\t"
  28791. "adds r4, r4, r7\n\t"
  28792. "adc r5, r5, #0\n\t"
  28793. "lsl r7, r8, #16\n\t"
  28794. "lsr r7, r7, #16\n\t"
  28795. "mul r6, r7, r6\n\t"
  28796. "lsr r7, r6, #16\n\t"
  28797. "lsl r6, r6, #16\n\t"
  28798. "adds r3, r3, r6\n\t"
  28799. "adcs r4, r4, r7\n\t"
  28800. "adc r5, r5, #0\n\t"
  28801. #else
  28802. "umull r6, r7, %[b], r8\n\t"
  28803. "adds r3, r3, r6\n\t"
  28804. "adcs r4, r4, r7\n\t"
  28805. "adc r5, r5, #0\n\t"
  28806. #endif
  28807. "str r3, [%[r], r9]\n\t"
  28808. "mov r3, r4\n\t"
  28809. "mov r4, r5\n\t"
  28810. "mov r5, #0\n\t"
  28811. "add r9, r9, #4\n\t"
  28812. "cmp r9, #0x180\n\t"
  28813. "blt L_sp_3072_mul_d_96_word_%=\n\t"
  28814. "str r3, [%[r], #384]\n\t"
  28815. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  28816. :
  28817. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "cc"
  28818. );
  28819. }
  28820. #else
  28821. /* Mul a by digit b into r. (r = a * b)
  28822. *
  28823. * r A single precision integer.
  28824. * a A single precision integer.
  28825. * b A single precision digit.
  28826. */
  28827. static void sp_3072_mul_d_96(sp_digit* r_p, const sp_digit* a_p, sp_digit b_p)
  28828. {
  28829. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  28830. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  28831. register sp_digit b asm ("r2") = (sp_digit)b_p;
  28832. __asm__ __volatile__ (
  28833. /* A[0] * B */
  28834. "ldm %[a]!, {r8}\n\t"
  28835. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  28836. "lsl r6, %[b], #16\n\t"
  28837. "lsl r3, r8, #16\n\t"
  28838. "lsr r6, r6, #16\n\t"
  28839. "lsr r3, r3, #16\n\t"
  28840. "mul r3, r6, r3\n\t"
  28841. "lsr r7, r8, #16\n\t"
  28842. "mul r6, r7, r6\n\t"
  28843. "lsr r4, r6, #16\n\t"
  28844. "lsl r6, r6, #16\n\t"
  28845. "adds r3, r3, r6\n\t"
  28846. "adc r4, r4, #0\n\t"
  28847. "lsr r6, %[b], #16\n\t"
  28848. "mul r7, r6, r7\n\t"
  28849. "add r4, r4, r7\n\t"
  28850. "lsl r7, r8, #16\n\t"
  28851. "lsr r7, r7, #16\n\t"
  28852. "mul r6, r7, r6\n\t"
  28853. "lsr r7, r6, #16\n\t"
  28854. "lsl r6, r6, #16\n\t"
  28855. "adds r3, r3, r6\n\t"
  28856. "adc r4, r4, r7\n\t"
  28857. #else
  28858. "umull r3, r4, %[b], r8\n\t"
  28859. #endif
  28860. "stm %[r]!, {r3}\n\t"
  28861. "mov r5, #0\n\t"
  28862. /* A[1] * B */
  28863. "ldm %[a]!, {r8}\n\t"
  28864. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  28865. "lsl r6, %[b], #16\n\t"
  28866. "lsl r7, r8, #16\n\t"
  28867. "lsr r6, r6, #16\n\t"
  28868. "lsr r7, r7, #16\n\t"
  28869. "mul r7, r6, r7\n\t"
  28870. "adds r4, r4, r7\n\t"
  28871. "adc r5, r5, #0\n\t"
  28872. "lsr r7, r8, #16\n\t"
  28873. "mul r6, r7, r6\n\t"
  28874. "lsr r7, r6, #16\n\t"
  28875. "lsl r6, r6, #16\n\t"
  28876. "adds r4, r4, r6\n\t"
  28877. "adc r5, r5, r7\n\t"
  28878. "lsr r6, %[b], #16\n\t"
  28879. "lsr r7, r8, #16\n\t"
  28880. "mul r7, r6, r7\n\t"
  28881. "add r5, r5, r7\n\t"
  28882. "lsl r7, r8, #16\n\t"
  28883. "lsr r7, r7, #16\n\t"
  28884. "mul r6, r7, r6\n\t"
  28885. "lsr r7, r6, #16\n\t"
  28886. "lsl r6, r6, #16\n\t"
  28887. "adds r4, r4, r6\n\t"
  28888. "adc r5, r5, r7\n\t"
  28889. #else
  28890. "umlal r4, r5, %[b], r8\n\t"
  28891. #endif
  28892. "stm %[r]!, {r4}\n\t"
  28893. "mov r3, #0\n\t"
  28894. /* A[2] * B */
  28895. "ldm %[a]!, {r8}\n\t"
  28896. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  28897. "lsl r6, %[b], #16\n\t"
  28898. "lsl r7, r8, #16\n\t"
  28899. "lsr r6, r6, #16\n\t"
  28900. "lsr r7, r7, #16\n\t"
  28901. "mul r7, r6, r7\n\t"
  28902. "adds r5, r5, r7\n\t"
  28903. "adc r3, r3, #0\n\t"
  28904. "lsr r7, r8, #16\n\t"
  28905. "mul r6, r7, r6\n\t"
  28906. "lsr r7, r6, #16\n\t"
  28907. "lsl r6, r6, #16\n\t"
  28908. "adds r5, r5, r6\n\t"
  28909. "adc r3, r3, r7\n\t"
  28910. "lsr r6, %[b], #16\n\t"
  28911. "lsr r7, r8, #16\n\t"
  28912. "mul r7, r6, r7\n\t"
  28913. "add r3, r3, r7\n\t"
  28914. "lsl r7, r8, #16\n\t"
  28915. "lsr r7, r7, #16\n\t"
  28916. "mul r6, r7, r6\n\t"
  28917. "lsr r7, r6, #16\n\t"
  28918. "lsl r6, r6, #16\n\t"
  28919. "adds r5, r5, r6\n\t"
  28920. "adc r3, r3, r7\n\t"
  28921. #else
  28922. "umlal r5, r3, %[b], r8\n\t"
  28923. #endif
  28924. "stm %[r]!, {r5}\n\t"
  28925. "mov r4, #0\n\t"
  28926. /* A[3] * B */
  28927. "ldm %[a]!, {r8}\n\t"
  28928. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  28929. "lsl r6, %[b], #16\n\t"
  28930. "lsl r7, r8, #16\n\t"
  28931. "lsr r6, r6, #16\n\t"
  28932. "lsr r7, r7, #16\n\t"
  28933. "mul r7, r6, r7\n\t"
  28934. "adds r3, r3, r7\n\t"
  28935. "adc r4, r4, #0\n\t"
  28936. "lsr r7, r8, #16\n\t"
  28937. "mul r6, r7, r6\n\t"
  28938. "lsr r7, r6, #16\n\t"
  28939. "lsl r6, r6, #16\n\t"
  28940. "adds r3, r3, r6\n\t"
  28941. "adc r4, r4, r7\n\t"
  28942. "lsr r6, %[b], #16\n\t"
  28943. "lsr r7, r8, #16\n\t"
  28944. "mul r7, r6, r7\n\t"
  28945. "add r4, r4, r7\n\t"
  28946. "lsl r7, r8, #16\n\t"
  28947. "lsr r7, r7, #16\n\t"
  28948. "mul r6, r7, r6\n\t"
  28949. "lsr r7, r6, #16\n\t"
  28950. "lsl r6, r6, #16\n\t"
  28951. "adds r3, r3, r6\n\t"
  28952. "adc r4, r4, r7\n\t"
  28953. #else
  28954. "umlal r3, r4, %[b], r8\n\t"
  28955. #endif
  28956. "stm %[r]!, {r3}\n\t"
  28957. "mov r5, #0\n\t"
  28958. /* A[4] * B */
  28959. "ldm %[a]!, {r8}\n\t"
  28960. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  28961. "lsl r6, %[b], #16\n\t"
  28962. "lsl r7, r8, #16\n\t"
  28963. "lsr r6, r6, #16\n\t"
  28964. "lsr r7, r7, #16\n\t"
  28965. "mul r7, r6, r7\n\t"
  28966. "adds r4, r4, r7\n\t"
  28967. "adc r5, r5, #0\n\t"
  28968. "lsr r7, r8, #16\n\t"
  28969. "mul r6, r7, r6\n\t"
  28970. "lsr r7, r6, #16\n\t"
  28971. "lsl r6, r6, #16\n\t"
  28972. "adds r4, r4, r6\n\t"
  28973. "adc r5, r5, r7\n\t"
  28974. "lsr r6, %[b], #16\n\t"
  28975. "lsr r7, r8, #16\n\t"
  28976. "mul r7, r6, r7\n\t"
  28977. "add r5, r5, r7\n\t"
  28978. "lsl r7, r8, #16\n\t"
  28979. "lsr r7, r7, #16\n\t"
  28980. "mul r6, r7, r6\n\t"
  28981. "lsr r7, r6, #16\n\t"
  28982. "lsl r6, r6, #16\n\t"
  28983. "adds r4, r4, r6\n\t"
  28984. "adc r5, r5, r7\n\t"
  28985. #else
  28986. "umlal r4, r5, %[b], r8\n\t"
  28987. #endif
  28988. "stm %[r]!, {r4}\n\t"
  28989. "mov r3, #0\n\t"
  28990. /* A[5] * B */
  28991. "ldm %[a]!, {r8}\n\t"
  28992. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  28993. "lsl r6, %[b], #16\n\t"
  28994. "lsl r7, r8, #16\n\t"
  28995. "lsr r6, r6, #16\n\t"
  28996. "lsr r7, r7, #16\n\t"
  28997. "mul r7, r6, r7\n\t"
  28998. "adds r5, r5, r7\n\t"
  28999. "adc r3, r3, #0\n\t"
  29000. "lsr r7, r8, #16\n\t"
  29001. "mul r6, r7, r6\n\t"
  29002. "lsr r7, r6, #16\n\t"
  29003. "lsl r6, r6, #16\n\t"
  29004. "adds r5, r5, r6\n\t"
  29005. "adc r3, r3, r7\n\t"
  29006. "lsr r6, %[b], #16\n\t"
  29007. "lsr r7, r8, #16\n\t"
  29008. "mul r7, r6, r7\n\t"
  29009. "add r3, r3, r7\n\t"
  29010. "lsl r7, r8, #16\n\t"
  29011. "lsr r7, r7, #16\n\t"
  29012. "mul r6, r7, r6\n\t"
  29013. "lsr r7, r6, #16\n\t"
  29014. "lsl r6, r6, #16\n\t"
  29015. "adds r5, r5, r6\n\t"
  29016. "adc r3, r3, r7\n\t"
  29017. #else
  29018. "umlal r5, r3, %[b], r8\n\t"
  29019. #endif
  29020. "stm %[r]!, {r5}\n\t"
  29021. "mov r4, #0\n\t"
  29022. /* A[6] * B */
  29023. "ldm %[a]!, {r8}\n\t"
  29024. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  29025. "lsl r6, %[b], #16\n\t"
  29026. "lsl r7, r8, #16\n\t"
  29027. "lsr r6, r6, #16\n\t"
  29028. "lsr r7, r7, #16\n\t"
  29029. "mul r7, r6, r7\n\t"
  29030. "adds r3, r3, r7\n\t"
  29031. "adc r4, r4, #0\n\t"
  29032. "lsr r7, r8, #16\n\t"
  29033. "mul r6, r7, r6\n\t"
  29034. "lsr r7, r6, #16\n\t"
  29035. "lsl r6, r6, #16\n\t"
  29036. "adds r3, r3, r6\n\t"
  29037. "adc r4, r4, r7\n\t"
  29038. "lsr r6, %[b], #16\n\t"
  29039. "lsr r7, r8, #16\n\t"
  29040. "mul r7, r6, r7\n\t"
  29041. "add r4, r4, r7\n\t"
  29042. "lsl r7, r8, #16\n\t"
  29043. "lsr r7, r7, #16\n\t"
  29044. "mul r6, r7, r6\n\t"
  29045. "lsr r7, r6, #16\n\t"
  29046. "lsl r6, r6, #16\n\t"
  29047. "adds r3, r3, r6\n\t"
  29048. "adc r4, r4, r7\n\t"
  29049. #else
  29050. "umlal r3, r4, %[b], r8\n\t"
  29051. #endif
  29052. "stm %[r]!, {r3}\n\t"
  29053. "mov r5, #0\n\t"
  29054. /* A[7] * B */
  29055. "ldm %[a]!, {r8}\n\t"
  29056. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  29057. "lsl r6, %[b], #16\n\t"
  29058. "lsl r7, r8, #16\n\t"
  29059. "lsr r6, r6, #16\n\t"
  29060. "lsr r7, r7, #16\n\t"
  29061. "mul r7, r6, r7\n\t"
  29062. "adds r4, r4, r7\n\t"
  29063. "adc r5, r5, #0\n\t"
  29064. "lsr r7, r8, #16\n\t"
  29065. "mul r6, r7, r6\n\t"
  29066. "lsr r7, r6, #16\n\t"
  29067. "lsl r6, r6, #16\n\t"
  29068. "adds r4, r4, r6\n\t"
  29069. "adc r5, r5, r7\n\t"
  29070. "lsr r6, %[b], #16\n\t"
  29071. "lsr r7, r8, #16\n\t"
  29072. "mul r7, r6, r7\n\t"
  29073. "add r5, r5, r7\n\t"
  29074. "lsl r7, r8, #16\n\t"
  29075. "lsr r7, r7, #16\n\t"
  29076. "mul r6, r7, r6\n\t"
  29077. "lsr r7, r6, #16\n\t"
  29078. "lsl r6, r6, #16\n\t"
  29079. "adds r4, r4, r6\n\t"
  29080. "adc r5, r5, r7\n\t"
  29081. #else
  29082. "umlal r4, r5, %[b], r8\n\t"
  29083. #endif
  29084. "stm %[r]!, {r4}\n\t"
  29085. "mov r3, #0\n\t"
  29086. /* A[8] * B */
  29087. "ldm %[a]!, {r8}\n\t"
  29088. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  29089. "lsl r6, %[b], #16\n\t"
  29090. "lsl r7, r8, #16\n\t"
  29091. "lsr r6, r6, #16\n\t"
  29092. "lsr r7, r7, #16\n\t"
  29093. "mul r7, r6, r7\n\t"
  29094. "adds r5, r5, r7\n\t"
  29095. "adc r3, r3, #0\n\t"
  29096. "lsr r7, r8, #16\n\t"
  29097. "mul r6, r7, r6\n\t"
  29098. "lsr r7, r6, #16\n\t"
  29099. "lsl r6, r6, #16\n\t"
  29100. "adds r5, r5, r6\n\t"
  29101. "adc r3, r3, r7\n\t"
  29102. "lsr r6, %[b], #16\n\t"
  29103. "lsr r7, r8, #16\n\t"
  29104. "mul r7, r6, r7\n\t"
  29105. "add r3, r3, r7\n\t"
  29106. "lsl r7, r8, #16\n\t"
  29107. "lsr r7, r7, #16\n\t"
  29108. "mul r6, r7, r6\n\t"
  29109. "lsr r7, r6, #16\n\t"
  29110. "lsl r6, r6, #16\n\t"
  29111. "adds r5, r5, r6\n\t"
  29112. "adc r3, r3, r7\n\t"
  29113. #else
  29114. "umlal r5, r3, %[b], r8\n\t"
  29115. #endif
  29116. "stm %[r]!, {r5}\n\t"
  29117. "mov r4, #0\n\t"
  29118. /* A[9] * B */
  29119. "ldm %[a]!, {r8}\n\t"
  29120. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  29121. "lsl r6, %[b], #16\n\t"
  29122. "lsl r7, r8, #16\n\t"
  29123. "lsr r6, r6, #16\n\t"
  29124. "lsr r7, r7, #16\n\t"
  29125. "mul r7, r6, r7\n\t"
  29126. "adds r3, r3, r7\n\t"
  29127. "adc r4, r4, #0\n\t"
  29128. "lsr r7, r8, #16\n\t"
  29129. "mul r6, r7, r6\n\t"
  29130. "lsr r7, r6, #16\n\t"
  29131. "lsl r6, r6, #16\n\t"
  29132. "adds r3, r3, r6\n\t"
  29133. "adc r4, r4, r7\n\t"
  29134. "lsr r6, %[b], #16\n\t"
  29135. "lsr r7, r8, #16\n\t"
  29136. "mul r7, r6, r7\n\t"
  29137. "add r4, r4, r7\n\t"
  29138. "lsl r7, r8, #16\n\t"
  29139. "lsr r7, r7, #16\n\t"
  29140. "mul r6, r7, r6\n\t"
  29141. "lsr r7, r6, #16\n\t"
  29142. "lsl r6, r6, #16\n\t"
  29143. "adds r3, r3, r6\n\t"
  29144. "adc r4, r4, r7\n\t"
  29145. #else
  29146. "umlal r3, r4, %[b], r8\n\t"
  29147. #endif
  29148. "stm %[r]!, {r3}\n\t"
  29149. "mov r5, #0\n\t"
  29150. /* A[10] * B */
  29151. "ldm %[a]!, {r8}\n\t"
  29152. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  29153. "lsl r6, %[b], #16\n\t"
  29154. "lsl r7, r8, #16\n\t"
  29155. "lsr r6, r6, #16\n\t"
  29156. "lsr r7, r7, #16\n\t"
  29157. "mul r7, r6, r7\n\t"
  29158. "adds r4, r4, r7\n\t"
  29159. "adc r5, r5, #0\n\t"
  29160. "lsr r7, r8, #16\n\t"
  29161. "mul r6, r7, r6\n\t"
  29162. "lsr r7, r6, #16\n\t"
  29163. "lsl r6, r6, #16\n\t"
  29164. "adds r4, r4, r6\n\t"
  29165. "adc r5, r5, r7\n\t"
  29166. "lsr r6, %[b], #16\n\t"
  29167. "lsr r7, r8, #16\n\t"
  29168. "mul r7, r6, r7\n\t"
  29169. "add r5, r5, r7\n\t"
  29170. "lsl r7, r8, #16\n\t"
  29171. "lsr r7, r7, #16\n\t"
  29172. "mul r6, r7, r6\n\t"
  29173. "lsr r7, r6, #16\n\t"
  29174. "lsl r6, r6, #16\n\t"
  29175. "adds r4, r4, r6\n\t"
  29176. "adc r5, r5, r7\n\t"
  29177. #else
  29178. "umlal r4, r5, %[b], r8\n\t"
  29179. #endif
  29180. "stm %[r]!, {r4}\n\t"
  29181. "mov r3, #0\n\t"
  29182. /* A[11] * B */
  29183. "ldm %[a]!, {r8}\n\t"
  29184. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  29185. "lsl r6, %[b], #16\n\t"
  29186. "lsl r7, r8, #16\n\t"
  29187. "lsr r6, r6, #16\n\t"
  29188. "lsr r7, r7, #16\n\t"
  29189. "mul r7, r6, r7\n\t"
  29190. "adds r5, r5, r7\n\t"
  29191. "adc r3, r3, #0\n\t"
  29192. "lsr r7, r8, #16\n\t"
  29193. "mul r6, r7, r6\n\t"
  29194. "lsr r7, r6, #16\n\t"
  29195. "lsl r6, r6, #16\n\t"
  29196. "adds r5, r5, r6\n\t"
  29197. "adc r3, r3, r7\n\t"
  29198. "lsr r6, %[b], #16\n\t"
  29199. "lsr r7, r8, #16\n\t"
  29200. "mul r7, r6, r7\n\t"
  29201. "add r3, r3, r7\n\t"
  29202. "lsl r7, r8, #16\n\t"
  29203. "lsr r7, r7, #16\n\t"
  29204. "mul r6, r7, r6\n\t"
  29205. "lsr r7, r6, #16\n\t"
  29206. "lsl r6, r6, #16\n\t"
  29207. "adds r5, r5, r6\n\t"
  29208. "adc r3, r3, r7\n\t"
  29209. #else
  29210. "umlal r5, r3, %[b], r8\n\t"
  29211. #endif
  29212. "stm %[r]!, {r5}\n\t"
  29213. "mov r4, #0\n\t"
  29214. /* A[12] * B */
  29215. "ldm %[a]!, {r8}\n\t"
  29216. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  29217. "lsl r6, %[b], #16\n\t"
  29218. "lsl r7, r8, #16\n\t"
  29219. "lsr r6, r6, #16\n\t"
  29220. "lsr r7, r7, #16\n\t"
  29221. "mul r7, r6, r7\n\t"
  29222. "adds r3, r3, r7\n\t"
  29223. "adc r4, r4, #0\n\t"
  29224. "lsr r7, r8, #16\n\t"
  29225. "mul r6, r7, r6\n\t"
  29226. "lsr r7, r6, #16\n\t"
  29227. "lsl r6, r6, #16\n\t"
  29228. "adds r3, r3, r6\n\t"
  29229. "adc r4, r4, r7\n\t"
  29230. "lsr r6, %[b], #16\n\t"
  29231. "lsr r7, r8, #16\n\t"
  29232. "mul r7, r6, r7\n\t"
  29233. "add r4, r4, r7\n\t"
  29234. "lsl r7, r8, #16\n\t"
  29235. "lsr r7, r7, #16\n\t"
  29236. "mul r6, r7, r6\n\t"
  29237. "lsr r7, r6, #16\n\t"
  29238. "lsl r6, r6, #16\n\t"
  29239. "adds r3, r3, r6\n\t"
  29240. "adc r4, r4, r7\n\t"
  29241. #else
  29242. "umlal r3, r4, %[b], r8\n\t"
  29243. #endif
  29244. "stm %[r]!, {r3}\n\t"
  29245. "mov r5, #0\n\t"
  29246. /* A[13] * B */
  29247. "ldm %[a]!, {r8}\n\t"
  29248. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  29249. "lsl r6, %[b], #16\n\t"
  29250. "lsl r7, r8, #16\n\t"
  29251. "lsr r6, r6, #16\n\t"
  29252. "lsr r7, r7, #16\n\t"
  29253. "mul r7, r6, r7\n\t"
  29254. "adds r4, r4, r7\n\t"
  29255. "adc r5, r5, #0\n\t"
  29256. "lsr r7, r8, #16\n\t"
  29257. "mul r6, r7, r6\n\t"
  29258. "lsr r7, r6, #16\n\t"
  29259. "lsl r6, r6, #16\n\t"
  29260. "adds r4, r4, r6\n\t"
  29261. "adc r5, r5, r7\n\t"
  29262. "lsr r6, %[b], #16\n\t"
  29263. "lsr r7, r8, #16\n\t"
  29264. "mul r7, r6, r7\n\t"
  29265. "add r5, r5, r7\n\t"
  29266. "lsl r7, r8, #16\n\t"
  29267. "lsr r7, r7, #16\n\t"
  29268. "mul r6, r7, r6\n\t"
  29269. "lsr r7, r6, #16\n\t"
  29270. "lsl r6, r6, #16\n\t"
  29271. "adds r4, r4, r6\n\t"
  29272. "adc r5, r5, r7\n\t"
  29273. #else
  29274. "umlal r4, r5, %[b], r8\n\t"
  29275. #endif
  29276. "stm %[r]!, {r4}\n\t"
  29277. "mov r3, #0\n\t"
  29278. /* A[14] * B */
  29279. "ldm %[a]!, {r8}\n\t"
  29280. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  29281. "lsl r6, %[b], #16\n\t"
  29282. "lsl r7, r8, #16\n\t"
  29283. "lsr r6, r6, #16\n\t"
  29284. "lsr r7, r7, #16\n\t"
  29285. "mul r7, r6, r7\n\t"
  29286. "adds r5, r5, r7\n\t"
  29287. "adc r3, r3, #0\n\t"
  29288. "lsr r7, r8, #16\n\t"
  29289. "mul r6, r7, r6\n\t"
  29290. "lsr r7, r6, #16\n\t"
  29291. "lsl r6, r6, #16\n\t"
  29292. "adds r5, r5, r6\n\t"
  29293. "adc r3, r3, r7\n\t"
  29294. "lsr r6, %[b], #16\n\t"
  29295. "lsr r7, r8, #16\n\t"
  29296. "mul r7, r6, r7\n\t"
  29297. "add r3, r3, r7\n\t"
  29298. "lsl r7, r8, #16\n\t"
  29299. "lsr r7, r7, #16\n\t"
  29300. "mul r6, r7, r6\n\t"
  29301. "lsr r7, r6, #16\n\t"
  29302. "lsl r6, r6, #16\n\t"
  29303. "adds r5, r5, r6\n\t"
  29304. "adc r3, r3, r7\n\t"
  29305. #else
  29306. "umlal r5, r3, %[b], r8\n\t"
  29307. #endif
  29308. "stm %[r]!, {r5}\n\t"
  29309. "mov r4, #0\n\t"
  29310. /* A[15] * B */
  29311. "ldm %[a]!, {r8}\n\t"
  29312. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  29313. "lsl r6, %[b], #16\n\t"
  29314. "lsl r7, r8, #16\n\t"
  29315. "lsr r6, r6, #16\n\t"
  29316. "lsr r7, r7, #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. "lsr r7, r8, #16\n\t"
  29321. "mul r6, r7, r6\n\t"
  29322. "lsr r7, r6, #16\n\t"
  29323. "lsl r6, r6, #16\n\t"
  29324. "adds r3, r3, r6\n\t"
  29325. "adc r4, r4, r7\n\t"
  29326. "lsr r6, %[b], #16\n\t"
  29327. "lsr r7, r8, #16\n\t"
  29328. "mul r7, r6, r7\n\t"
  29329. "add r4, r4, r7\n\t"
  29330. "lsl r7, r8, #16\n\t"
  29331. "lsr r7, r7, #16\n\t"
  29332. "mul r6, r7, r6\n\t"
  29333. "lsr r7, r6, #16\n\t"
  29334. "lsl r6, r6, #16\n\t"
  29335. "adds r3, r3, r6\n\t"
  29336. "adc r4, r4, r7\n\t"
  29337. #else
  29338. "umlal r3, r4, %[b], r8\n\t"
  29339. #endif
  29340. "stm %[r]!, {r3}\n\t"
  29341. "mov r5, #0\n\t"
  29342. /* A[16] * B */
  29343. "ldm %[a]!, {r8}\n\t"
  29344. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  29345. "lsl r6, %[b], #16\n\t"
  29346. "lsl r7, r8, #16\n\t"
  29347. "lsr r6, r6, #16\n\t"
  29348. "lsr r7, r7, #16\n\t"
  29349. "mul r7, r6, r7\n\t"
  29350. "adds r4, r4, r7\n\t"
  29351. "adc r5, r5, #0\n\t"
  29352. "lsr r7, r8, #16\n\t"
  29353. "mul r6, r7, r6\n\t"
  29354. "lsr r7, r6, #16\n\t"
  29355. "lsl r6, r6, #16\n\t"
  29356. "adds r4, r4, r6\n\t"
  29357. "adc r5, r5, r7\n\t"
  29358. "lsr r6, %[b], #16\n\t"
  29359. "lsr r7, r8, #16\n\t"
  29360. "mul r7, r6, r7\n\t"
  29361. "add r5, r5, r7\n\t"
  29362. "lsl r7, r8, #16\n\t"
  29363. "lsr r7, r7, #16\n\t"
  29364. "mul r6, r7, r6\n\t"
  29365. "lsr r7, r6, #16\n\t"
  29366. "lsl r6, r6, #16\n\t"
  29367. "adds r4, r4, r6\n\t"
  29368. "adc r5, r5, r7\n\t"
  29369. #else
  29370. "umlal r4, r5, %[b], r8\n\t"
  29371. #endif
  29372. "stm %[r]!, {r4}\n\t"
  29373. "mov r3, #0\n\t"
  29374. /* A[17] * B */
  29375. "ldm %[a]!, {r8}\n\t"
  29376. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  29377. "lsl r6, %[b], #16\n\t"
  29378. "lsl r7, r8, #16\n\t"
  29379. "lsr r6, r6, #16\n\t"
  29380. "lsr r7, r7, #16\n\t"
  29381. "mul r7, r6, r7\n\t"
  29382. "adds r5, r5, r7\n\t"
  29383. "adc r3, r3, #0\n\t"
  29384. "lsr r7, r8, #16\n\t"
  29385. "mul r6, r7, r6\n\t"
  29386. "lsr r7, r6, #16\n\t"
  29387. "lsl r6, r6, #16\n\t"
  29388. "adds r5, r5, r6\n\t"
  29389. "adc r3, r3, r7\n\t"
  29390. "lsr r6, %[b], #16\n\t"
  29391. "lsr r7, r8, #16\n\t"
  29392. "mul r7, r6, r7\n\t"
  29393. "add r3, r3, r7\n\t"
  29394. "lsl r7, r8, #16\n\t"
  29395. "lsr r7, r7, #16\n\t"
  29396. "mul r6, r7, r6\n\t"
  29397. "lsr r7, r6, #16\n\t"
  29398. "lsl r6, r6, #16\n\t"
  29399. "adds r5, r5, r6\n\t"
  29400. "adc r3, r3, r7\n\t"
  29401. #else
  29402. "umlal r5, r3, %[b], r8\n\t"
  29403. #endif
  29404. "stm %[r]!, {r5}\n\t"
  29405. "mov r4, #0\n\t"
  29406. /* A[18] * B */
  29407. "ldm %[a]!, {r8}\n\t"
  29408. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  29409. "lsl r6, %[b], #16\n\t"
  29410. "lsl r7, r8, #16\n\t"
  29411. "lsr r6, r6, #16\n\t"
  29412. "lsr r7, r7, #16\n\t"
  29413. "mul r7, r6, r7\n\t"
  29414. "adds r3, r3, r7\n\t"
  29415. "adc r4, r4, #0\n\t"
  29416. "lsr r7, r8, #16\n\t"
  29417. "mul r6, r7, r6\n\t"
  29418. "lsr r7, r6, #16\n\t"
  29419. "lsl r6, r6, #16\n\t"
  29420. "adds r3, r3, r6\n\t"
  29421. "adc r4, r4, r7\n\t"
  29422. "lsr r6, %[b], #16\n\t"
  29423. "lsr r7, r8, #16\n\t"
  29424. "mul r7, r6, r7\n\t"
  29425. "add r4, r4, r7\n\t"
  29426. "lsl r7, r8, #16\n\t"
  29427. "lsr r7, r7, #16\n\t"
  29428. "mul r6, r7, r6\n\t"
  29429. "lsr r7, r6, #16\n\t"
  29430. "lsl r6, r6, #16\n\t"
  29431. "adds r3, r3, r6\n\t"
  29432. "adc r4, r4, r7\n\t"
  29433. #else
  29434. "umlal r3, r4, %[b], r8\n\t"
  29435. #endif
  29436. "stm %[r]!, {r3}\n\t"
  29437. "mov r5, #0\n\t"
  29438. /* A[19] * B */
  29439. "ldm %[a]!, {r8}\n\t"
  29440. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  29441. "lsl r6, %[b], #16\n\t"
  29442. "lsl r7, r8, #16\n\t"
  29443. "lsr r6, r6, #16\n\t"
  29444. "lsr r7, r7, #16\n\t"
  29445. "mul r7, r6, r7\n\t"
  29446. "adds r4, r4, r7\n\t"
  29447. "adc r5, r5, #0\n\t"
  29448. "lsr r7, r8, #16\n\t"
  29449. "mul r6, r7, r6\n\t"
  29450. "lsr r7, r6, #16\n\t"
  29451. "lsl r6, r6, #16\n\t"
  29452. "adds r4, r4, r6\n\t"
  29453. "adc r5, r5, r7\n\t"
  29454. "lsr r6, %[b], #16\n\t"
  29455. "lsr r7, r8, #16\n\t"
  29456. "mul r7, r6, r7\n\t"
  29457. "add r5, r5, r7\n\t"
  29458. "lsl r7, r8, #16\n\t"
  29459. "lsr r7, r7, #16\n\t"
  29460. "mul r6, r7, r6\n\t"
  29461. "lsr r7, r6, #16\n\t"
  29462. "lsl r6, r6, #16\n\t"
  29463. "adds r4, r4, r6\n\t"
  29464. "adc r5, r5, r7\n\t"
  29465. #else
  29466. "umlal r4, r5, %[b], r8\n\t"
  29467. #endif
  29468. "stm %[r]!, {r4}\n\t"
  29469. "mov r3, #0\n\t"
  29470. /* A[20] * B */
  29471. "ldm %[a]!, {r8}\n\t"
  29472. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  29473. "lsl r6, %[b], #16\n\t"
  29474. "lsl r7, r8, #16\n\t"
  29475. "lsr r6, r6, #16\n\t"
  29476. "lsr r7, r7, #16\n\t"
  29477. "mul r7, r6, r7\n\t"
  29478. "adds r5, r5, r7\n\t"
  29479. "adc r3, r3, #0\n\t"
  29480. "lsr r7, r8, #16\n\t"
  29481. "mul r6, r7, r6\n\t"
  29482. "lsr r7, r6, #16\n\t"
  29483. "lsl r6, r6, #16\n\t"
  29484. "adds r5, r5, r6\n\t"
  29485. "adc r3, r3, r7\n\t"
  29486. "lsr r6, %[b], #16\n\t"
  29487. "lsr r7, r8, #16\n\t"
  29488. "mul r7, r6, r7\n\t"
  29489. "add r3, r3, r7\n\t"
  29490. "lsl r7, r8, #16\n\t"
  29491. "lsr r7, r7, #16\n\t"
  29492. "mul r6, r7, r6\n\t"
  29493. "lsr r7, r6, #16\n\t"
  29494. "lsl r6, r6, #16\n\t"
  29495. "adds r5, r5, r6\n\t"
  29496. "adc r3, r3, r7\n\t"
  29497. #else
  29498. "umlal r5, r3, %[b], r8\n\t"
  29499. #endif
  29500. "stm %[r]!, {r5}\n\t"
  29501. "mov r4, #0\n\t"
  29502. /* A[21] * B */
  29503. "ldm %[a]!, {r8}\n\t"
  29504. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  29505. "lsl r6, %[b], #16\n\t"
  29506. "lsl r7, r8, #16\n\t"
  29507. "lsr r6, r6, #16\n\t"
  29508. "lsr r7, r7, #16\n\t"
  29509. "mul r7, r6, r7\n\t"
  29510. "adds r3, r3, r7\n\t"
  29511. "adc r4, r4, #0\n\t"
  29512. "lsr r7, r8, #16\n\t"
  29513. "mul r6, r7, r6\n\t"
  29514. "lsr r7, r6, #16\n\t"
  29515. "lsl r6, r6, #16\n\t"
  29516. "adds r3, r3, r6\n\t"
  29517. "adc r4, r4, r7\n\t"
  29518. "lsr r6, %[b], #16\n\t"
  29519. "lsr r7, r8, #16\n\t"
  29520. "mul r7, r6, r7\n\t"
  29521. "add r4, r4, r7\n\t"
  29522. "lsl r7, r8, #16\n\t"
  29523. "lsr r7, r7, #16\n\t"
  29524. "mul r6, r7, r6\n\t"
  29525. "lsr r7, r6, #16\n\t"
  29526. "lsl r6, r6, #16\n\t"
  29527. "adds r3, r3, r6\n\t"
  29528. "adc r4, r4, r7\n\t"
  29529. #else
  29530. "umlal r3, r4, %[b], r8\n\t"
  29531. #endif
  29532. "stm %[r]!, {r3}\n\t"
  29533. "mov r5, #0\n\t"
  29534. /* A[22] * B */
  29535. "ldm %[a]!, {r8}\n\t"
  29536. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  29537. "lsl r6, %[b], #16\n\t"
  29538. "lsl r7, r8, #16\n\t"
  29539. "lsr r6, r6, #16\n\t"
  29540. "lsr r7, r7, #16\n\t"
  29541. "mul r7, r6, r7\n\t"
  29542. "adds r4, r4, r7\n\t"
  29543. "adc r5, r5, #0\n\t"
  29544. "lsr r7, r8, #16\n\t"
  29545. "mul r6, r7, r6\n\t"
  29546. "lsr r7, r6, #16\n\t"
  29547. "lsl r6, r6, #16\n\t"
  29548. "adds r4, r4, r6\n\t"
  29549. "adc r5, r5, r7\n\t"
  29550. "lsr r6, %[b], #16\n\t"
  29551. "lsr r7, r8, #16\n\t"
  29552. "mul r7, r6, r7\n\t"
  29553. "add r5, r5, r7\n\t"
  29554. "lsl r7, r8, #16\n\t"
  29555. "lsr r7, r7, #16\n\t"
  29556. "mul r6, r7, r6\n\t"
  29557. "lsr r7, r6, #16\n\t"
  29558. "lsl r6, r6, #16\n\t"
  29559. "adds r4, r4, r6\n\t"
  29560. "adc r5, r5, r7\n\t"
  29561. #else
  29562. "umlal r4, r5, %[b], r8\n\t"
  29563. #endif
  29564. "stm %[r]!, {r4}\n\t"
  29565. "mov r3, #0\n\t"
  29566. /* A[23] * B */
  29567. "ldm %[a]!, {r8}\n\t"
  29568. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  29569. "lsl r6, %[b], #16\n\t"
  29570. "lsl r7, r8, #16\n\t"
  29571. "lsr r6, r6, #16\n\t"
  29572. "lsr r7, r7, #16\n\t"
  29573. "mul r7, r6, r7\n\t"
  29574. "adds r5, r5, r7\n\t"
  29575. "adc r3, r3, #0\n\t"
  29576. "lsr r7, r8, #16\n\t"
  29577. "mul r6, r7, r6\n\t"
  29578. "lsr r7, r6, #16\n\t"
  29579. "lsl r6, r6, #16\n\t"
  29580. "adds r5, r5, r6\n\t"
  29581. "adc r3, r3, r7\n\t"
  29582. "lsr r6, %[b], #16\n\t"
  29583. "lsr r7, r8, #16\n\t"
  29584. "mul r7, r6, r7\n\t"
  29585. "add r3, r3, r7\n\t"
  29586. "lsl r7, r8, #16\n\t"
  29587. "lsr r7, r7, #16\n\t"
  29588. "mul r6, r7, r6\n\t"
  29589. "lsr r7, r6, #16\n\t"
  29590. "lsl r6, r6, #16\n\t"
  29591. "adds r5, r5, r6\n\t"
  29592. "adc r3, r3, r7\n\t"
  29593. #else
  29594. "umlal r5, r3, %[b], r8\n\t"
  29595. #endif
  29596. "stm %[r]!, {r5}\n\t"
  29597. "mov r4, #0\n\t"
  29598. /* A[24] * B */
  29599. "ldm %[a]!, {r8}\n\t"
  29600. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  29601. "lsl r6, %[b], #16\n\t"
  29602. "lsl r7, r8, #16\n\t"
  29603. "lsr r6, r6, #16\n\t"
  29604. "lsr r7, r7, #16\n\t"
  29605. "mul r7, r6, r7\n\t"
  29606. "adds r3, r3, r7\n\t"
  29607. "adc r4, r4, #0\n\t"
  29608. "lsr r7, r8, #16\n\t"
  29609. "mul r6, r7, r6\n\t"
  29610. "lsr r7, r6, #16\n\t"
  29611. "lsl r6, r6, #16\n\t"
  29612. "adds r3, r3, r6\n\t"
  29613. "adc r4, r4, r7\n\t"
  29614. "lsr r6, %[b], #16\n\t"
  29615. "lsr r7, r8, #16\n\t"
  29616. "mul r7, r6, r7\n\t"
  29617. "add r4, r4, r7\n\t"
  29618. "lsl r7, r8, #16\n\t"
  29619. "lsr r7, r7, #16\n\t"
  29620. "mul r6, r7, r6\n\t"
  29621. "lsr r7, r6, #16\n\t"
  29622. "lsl r6, r6, #16\n\t"
  29623. "adds r3, r3, r6\n\t"
  29624. "adc r4, r4, r7\n\t"
  29625. #else
  29626. "umlal r3, r4, %[b], r8\n\t"
  29627. #endif
  29628. "stm %[r]!, {r3}\n\t"
  29629. "mov r5, #0\n\t"
  29630. /* A[25] * B */
  29631. "ldm %[a]!, {r8}\n\t"
  29632. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  29633. "lsl r6, %[b], #16\n\t"
  29634. "lsl r7, r8, #16\n\t"
  29635. "lsr r6, r6, #16\n\t"
  29636. "lsr r7, r7, #16\n\t"
  29637. "mul r7, r6, r7\n\t"
  29638. "adds r4, r4, r7\n\t"
  29639. "adc r5, r5, #0\n\t"
  29640. "lsr r7, r8, #16\n\t"
  29641. "mul r6, r7, r6\n\t"
  29642. "lsr r7, r6, #16\n\t"
  29643. "lsl r6, r6, #16\n\t"
  29644. "adds r4, r4, r6\n\t"
  29645. "adc r5, r5, r7\n\t"
  29646. "lsr r6, %[b], #16\n\t"
  29647. "lsr r7, r8, #16\n\t"
  29648. "mul r7, r6, r7\n\t"
  29649. "add r5, r5, r7\n\t"
  29650. "lsl r7, r8, #16\n\t"
  29651. "lsr r7, r7, #16\n\t"
  29652. "mul r6, r7, r6\n\t"
  29653. "lsr r7, r6, #16\n\t"
  29654. "lsl r6, r6, #16\n\t"
  29655. "adds r4, r4, r6\n\t"
  29656. "adc r5, r5, r7\n\t"
  29657. #else
  29658. "umlal r4, r5, %[b], r8\n\t"
  29659. #endif
  29660. "stm %[r]!, {r4}\n\t"
  29661. "mov r3, #0\n\t"
  29662. /* A[26] * B */
  29663. "ldm %[a]!, {r8}\n\t"
  29664. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  29665. "lsl r6, %[b], #16\n\t"
  29666. "lsl r7, r8, #16\n\t"
  29667. "lsr r6, r6, #16\n\t"
  29668. "lsr r7, r7, #16\n\t"
  29669. "mul r7, r6, r7\n\t"
  29670. "adds r5, r5, r7\n\t"
  29671. "adc r3, r3, #0\n\t"
  29672. "lsr r7, r8, #16\n\t"
  29673. "mul r6, r7, r6\n\t"
  29674. "lsr r7, r6, #16\n\t"
  29675. "lsl r6, r6, #16\n\t"
  29676. "adds r5, r5, r6\n\t"
  29677. "adc r3, r3, r7\n\t"
  29678. "lsr r6, %[b], #16\n\t"
  29679. "lsr r7, r8, #16\n\t"
  29680. "mul r7, r6, r7\n\t"
  29681. "add r3, r3, r7\n\t"
  29682. "lsl r7, r8, #16\n\t"
  29683. "lsr r7, r7, #16\n\t"
  29684. "mul r6, r7, r6\n\t"
  29685. "lsr r7, r6, #16\n\t"
  29686. "lsl r6, r6, #16\n\t"
  29687. "adds r5, r5, r6\n\t"
  29688. "adc r3, r3, r7\n\t"
  29689. #else
  29690. "umlal r5, r3, %[b], r8\n\t"
  29691. #endif
  29692. "stm %[r]!, {r5}\n\t"
  29693. "mov r4, #0\n\t"
  29694. /* A[27] * B */
  29695. "ldm %[a]!, {r8}\n\t"
  29696. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  29697. "lsl r6, %[b], #16\n\t"
  29698. "lsl r7, r8, #16\n\t"
  29699. "lsr r6, r6, #16\n\t"
  29700. "lsr r7, r7, #16\n\t"
  29701. "mul r7, r6, r7\n\t"
  29702. "adds r3, r3, r7\n\t"
  29703. "adc r4, r4, #0\n\t"
  29704. "lsr r7, r8, #16\n\t"
  29705. "mul r6, r7, r6\n\t"
  29706. "lsr r7, r6, #16\n\t"
  29707. "lsl r6, r6, #16\n\t"
  29708. "adds r3, r3, r6\n\t"
  29709. "adc r4, r4, r7\n\t"
  29710. "lsr r6, %[b], #16\n\t"
  29711. "lsr r7, r8, #16\n\t"
  29712. "mul r7, r6, r7\n\t"
  29713. "add r4, r4, r7\n\t"
  29714. "lsl r7, r8, #16\n\t"
  29715. "lsr r7, r7, #16\n\t"
  29716. "mul r6, r7, r6\n\t"
  29717. "lsr r7, r6, #16\n\t"
  29718. "lsl r6, r6, #16\n\t"
  29719. "adds r3, r3, r6\n\t"
  29720. "adc r4, r4, r7\n\t"
  29721. #else
  29722. "umlal r3, r4, %[b], r8\n\t"
  29723. #endif
  29724. "stm %[r]!, {r3}\n\t"
  29725. "mov r5, #0\n\t"
  29726. /* A[28] * B */
  29727. "ldm %[a]!, {r8}\n\t"
  29728. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  29729. "lsl r6, %[b], #16\n\t"
  29730. "lsl r7, r8, #16\n\t"
  29731. "lsr r6, r6, #16\n\t"
  29732. "lsr r7, r7, #16\n\t"
  29733. "mul r7, r6, r7\n\t"
  29734. "adds r4, r4, r7\n\t"
  29735. "adc r5, r5, #0\n\t"
  29736. "lsr r7, r8, #16\n\t"
  29737. "mul r6, r7, r6\n\t"
  29738. "lsr r7, r6, #16\n\t"
  29739. "lsl r6, r6, #16\n\t"
  29740. "adds r4, r4, r6\n\t"
  29741. "adc r5, r5, r7\n\t"
  29742. "lsr r6, %[b], #16\n\t"
  29743. "lsr r7, r8, #16\n\t"
  29744. "mul r7, r6, r7\n\t"
  29745. "add r5, r5, r7\n\t"
  29746. "lsl r7, r8, #16\n\t"
  29747. "lsr r7, r7, #16\n\t"
  29748. "mul r6, r7, r6\n\t"
  29749. "lsr r7, r6, #16\n\t"
  29750. "lsl r6, r6, #16\n\t"
  29751. "adds r4, r4, r6\n\t"
  29752. "adc r5, r5, r7\n\t"
  29753. #else
  29754. "umlal r4, r5, %[b], r8\n\t"
  29755. #endif
  29756. "stm %[r]!, {r4}\n\t"
  29757. "mov r3, #0\n\t"
  29758. /* A[29] * B */
  29759. "ldm %[a]!, {r8}\n\t"
  29760. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  29761. "lsl r6, %[b], #16\n\t"
  29762. "lsl r7, r8, #16\n\t"
  29763. "lsr r6, r6, #16\n\t"
  29764. "lsr r7, r7, #16\n\t"
  29765. "mul r7, r6, r7\n\t"
  29766. "adds r5, r5, r7\n\t"
  29767. "adc r3, r3, #0\n\t"
  29768. "lsr r7, r8, #16\n\t"
  29769. "mul r6, r7, r6\n\t"
  29770. "lsr r7, r6, #16\n\t"
  29771. "lsl r6, r6, #16\n\t"
  29772. "adds r5, r5, r6\n\t"
  29773. "adc r3, r3, r7\n\t"
  29774. "lsr r6, %[b], #16\n\t"
  29775. "lsr r7, r8, #16\n\t"
  29776. "mul r7, r6, r7\n\t"
  29777. "add r3, r3, r7\n\t"
  29778. "lsl r7, r8, #16\n\t"
  29779. "lsr r7, r7, #16\n\t"
  29780. "mul r6, r7, r6\n\t"
  29781. "lsr r7, r6, #16\n\t"
  29782. "lsl r6, r6, #16\n\t"
  29783. "adds r5, r5, r6\n\t"
  29784. "adc r3, r3, r7\n\t"
  29785. #else
  29786. "umlal r5, r3, %[b], r8\n\t"
  29787. #endif
  29788. "stm %[r]!, {r5}\n\t"
  29789. "mov r4, #0\n\t"
  29790. /* A[30] * B */
  29791. "ldm %[a]!, {r8}\n\t"
  29792. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  29793. "lsl r6, %[b], #16\n\t"
  29794. "lsl r7, r8, #16\n\t"
  29795. "lsr r6, r6, #16\n\t"
  29796. "lsr r7, r7, #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. "lsr r7, r8, #16\n\t"
  29801. "mul r6, r7, r6\n\t"
  29802. "lsr r7, r6, #16\n\t"
  29803. "lsl r6, r6, #16\n\t"
  29804. "adds r3, r3, r6\n\t"
  29805. "adc r4, r4, r7\n\t"
  29806. "lsr r6, %[b], #16\n\t"
  29807. "lsr r7, r8, #16\n\t"
  29808. "mul r7, r6, r7\n\t"
  29809. "add r4, r4, r7\n\t"
  29810. "lsl r7, r8, #16\n\t"
  29811. "lsr r7, r7, #16\n\t"
  29812. "mul r6, r7, r6\n\t"
  29813. "lsr r7, r6, #16\n\t"
  29814. "lsl r6, r6, #16\n\t"
  29815. "adds r3, r3, r6\n\t"
  29816. "adc r4, r4, r7\n\t"
  29817. #else
  29818. "umlal r3, r4, %[b], r8\n\t"
  29819. #endif
  29820. "stm %[r]!, {r3}\n\t"
  29821. "mov r5, #0\n\t"
  29822. /* A[31] * B */
  29823. "ldm %[a]!, {r8}\n\t"
  29824. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  29825. "lsl r6, %[b], #16\n\t"
  29826. "lsl r7, r8, #16\n\t"
  29827. "lsr r6, r6, #16\n\t"
  29828. "lsr r7, r7, #16\n\t"
  29829. "mul r7, r6, r7\n\t"
  29830. "adds r4, r4, r7\n\t"
  29831. "adc r5, r5, #0\n\t"
  29832. "lsr r7, r8, #16\n\t"
  29833. "mul r6, r7, r6\n\t"
  29834. "lsr r7, r6, #16\n\t"
  29835. "lsl r6, r6, #16\n\t"
  29836. "adds r4, r4, r6\n\t"
  29837. "adc r5, r5, r7\n\t"
  29838. "lsr r6, %[b], #16\n\t"
  29839. "lsr r7, r8, #16\n\t"
  29840. "mul r7, r6, r7\n\t"
  29841. "add r5, r5, r7\n\t"
  29842. "lsl r7, r8, #16\n\t"
  29843. "lsr r7, r7, #16\n\t"
  29844. "mul r6, r7, r6\n\t"
  29845. "lsr r7, r6, #16\n\t"
  29846. "lsl r6, r6, #16\n\t"
  29847. "adds r4, r4, r6\n\t"
  29848. "adc r5, r5, r7\n\t"
  29849. #else
  29850. "umlal r4, r5, %[b], r8\n\t"
  29851. #endif
  29852. "stm %[r]!, {r4}\n\t"
  29853. "mov r3, #0\n\t"
  29854. /* A[32] * B */
  29855. "ldm %[a]!, {r8}\n\t"
  29856. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  29857. "lsl r6, %[b], #16\n\t"
  29858. "lsl r7, r8, #16\n\t"
  29859. "lsr r6, r6, #16\n\t"
  29860. "lsr r7, r7, #16\n\t"
  29861. "mul r7, r6, r7\n\t"
  29862. "adds r5, r5, r7\n\t"
  29863. "adc r3, r3, #0\n\t"
  29864. "lsr r7, r8, #16\n\t"
  29865. "mul r6, r7, r6\n\t"
  29866. "lsr r7, r6, #16\n\t"
  29867. "lsl r6, r6, #16\n\t"
  29868. "adds r5, r5, r6\n\t"
  29869. "adc r3, r3, r7\n\t"
  29870. "lsr r6, %[b], #16\n\t"
  29871. "lsr r7, r8, #16\n\t"
  29872. "mul r7, r6, r7\n\t"
  29873. "add r3, r3, r7\n\t"
  29874. "lsl r7, r8, #16\n\t"
  29875. "lsr r7, r7, #16\n\t"
  29876. "mul r6, r7, r6\n\t"
  29877. "lsr r7, r6, #16\n\t"
  29878. "lsl r6, r6, #16\n\t"
  29879. "adds r5, r5, r6\n\t"
  29880. "adc r3, r3, r7\n\t"
  29881. #else
  29882. "umlal r5, r3, %[b], r8\n\t"
  29883. #endif
  29884. "stm %[r]!, {r5}\n\t"
  29885. "mov r4, #0\n\t"
  29886. /* A[33] * B */
  29887. "ldm %[a]!, {r8}\n\t"
  29888. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  29889. "lsl r6, %[b], #16\n\t"
  29890. "lsl r7, r8, #16\n\t"
  29891. "lsr r6, r6, #16\n\t"
  29892. "lsr r7, r7, #16\n\t"
  29893. "mul r7, r6, r7\n\t"
  29894. "adds r3, r3, r7\n\t"
  29895. "adc r4, r4, #0\n\t"
  29896. "lsr r7, r8, #16\n\t"
  29897. "mul r6, r7, r6\n\t"
  29898. "lsr r7, r6, #16\n\t"
  29899. "lsl r6, r6, #16\n\t"
  29900. "adds r3, r3, r6\n\t"
  29901. "adc r4, r4, r7\n\t"
  29902. "lsr r6, %[b], #16\n\t"
  29903. "lsr r7, r8, #16\n\t"
  29904. "mul r7, r6, r7\n\t"
  29905. "add r4, r4, r7\n\t"
  29906. "lsl r7, r8, #16\n\t"
  29907. "lsr r7, r7, #16\n\t"
  29908. "mul r6, r7, r6\n\t"
  29909. "lsr r7, r6, #16\n\t"
  29910. "lsl r6, r6, #16\n\t"
  29911. "adds r3, r3, r6\n\t"
  29912. "adc r4, r4, r7\n\t"
  29913. #else
  29914. "umlal r3, r4, %[b], r8\n\t"
  29915. #endif
  29916. "stm %[r]!, {r3}\n\t"
  29917. "mov r5, #0\n\t"
  29918. /* A[34] * B */
  29919. "ldm %[a]!, {r8}\n\t"
  29920. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  29921. "lsl r6, %[b], #16\n\t"
  29922. "lsl r7, r8, #16\n\t"
  29923. "lsr r6, r6, #16\n\t"
  29924. "lsr r7, r7, #16\n\t"
  29925. "mul r7, r6, r7\n\t"
  29926. "adds r4, r4, r7\n\t"
  29927. "adc r5, r5, #0\n\t"
  29928. "lsr r7, r8, #16\n\t"
  29929. "mul r6, r7, r6\n\t"
  29930. "lsr r7, r6, #16\n\t"
  29931. "lsl r6, r6, #16\n\t"
  29932. "adds r4, r4, r6\n\t"
  29933. "adc r5, r5, r7\n\t"
  29934. "lsr r6, %[b], #16\n\t"
  29935. "lsr r7, r8, #16\n\t"
  29936. "mul r7, r6, r7\n\t"
  29937. "add r5, r5, r7\n\t"
  29938. "lsl r7, r8, #16\n\t"
  29939. "lsr r7, r7, #16\n\t"
  29940. "mul r6, r7, r6\n\t"
  29941. "lsr r7, r6, #16\n\t"
  29942. "lsl r6, r6, #16\n\t"
  29943. "adds r4, r4, r6\n\t"
  29944. "adc r5, r5, r7\n\t"
  29945. #else
  29946. "umlal r4, r5, %[b], r8\n\t"
  29947. #endif
  29948. "stm %[r]!, {r4}\n\t"
  29949. "mov r3, #0\n\t"
  29950. /* A[35] * B */
  29951. "ldm %[a]!, {r8}\n\t"
  29952. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  29953. "lsl r6, %[b], #16\n\t"
  29954. "lsl r7, r8, #16\n\t"
  29955. "lsr r6, r6, #16\n\t"
  29956. "lsr r7, r7, #16\n\t"
  29957. "mul r7, r6, r7\n\t"
  29958. "adds r5, r5, r7\n\t"
  29959. "adc r3, r3, #0\n\t"
  29960. "lsr r7, r8, #16\n\t"
  29961. "mul r6, r7, r6\n\t"
  29962. "lsr r7, r6, #16\n\t"
  29963. "lsl r6, r6, #16\n\t"
  29964. "adds r5, r5, r6\n\t"
  29965. "adc r3, r3, r7\n\t"
  29966. "lsr r6, %[b], #16\n\t"
  29967. "lsr r7, r8, #16\n\t"
  29968. "mul r7, r6, r7\n\t"
  29969. "add r3, r3, r7\n\t"
  29970. "lsl r7, r8, #16\n\t"
  29971. "lsr r7, r7, #16\n\t"
  29972. "mul r6, r7, r6\n\t"
  29973. "lsr r7, r6, #16\n\t"
  29974. "lsl r6, r6, #16\n\t"
  29975. "adds r5, r5, r6\n\t"
  29976. "adc r3, r3, r7\n\t"
  29977. #else
  29978. "umlal r5, r3, %[b], r8\n\t"
  29979. #endif
  29980. "stm %[r]!, {r5}\n\t"
  29981. "mov r4, #0\n\t"
  29982. /* A[36] * B */
  29983. "ldm %[a]!, {r8}\n\t"
  29984. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  29985. "lsl r6, %[b], #16\n\t"
  29986. "lsl r7, r8, #16\n\t"
  29987. "lsr r6, r6, #16\n\t"
  29988. "lsr r7, r7, #16\n\t"
  29989. "mul r7, r6, r7\n\t"
  29990. "adds r3, r3, r7\n\t"
  29991. "adc r4, r4, #0\n\t"
  29992. "lsr r7, r8, #16\n\t"
  29993. "mul r6, r7, r6\n\t"
  29994. "lsr r7, r6, #16\n\t"
  29995. "lsl r6, r6, #16\n\t"
  29996. "adds r3, r3, r6\n\t"
  29997. "adc r4, r4, r7\n\t"
  29998. "lsr r6, %[b], #16\n\t"
  29999. "lsr r7, r8, #16\n\t"
  30000. "mul r7, r6, r7\n\t"
  30001. "add r4, r4, r7\n\t"
  30002. "lsl r7, r8, #16\n\t"
  30003. "lsr r7, r7, #16\n\t"
  30004. "mul r6, r7, r6\n\t"
  30005. "lsr r7, r6, #16\n\t"
  30006. "lsl r6, r6, #16\n\t"
  30007. "adds r3, r3, r6\n\t"
  30008. "adc r4, r4, r7\n\t"
  30009. #else
  30010. "umlal r3, r4, %[b], r8\n\t"
  30011. #endif
  30012. "stm %[r]!, {r3}\n\t"
  30013. "mov r5, #0\n\t"
  30014. /* A[37] * B */
  30015. "ldm %[a]!, {r8}\n\t"
  30016. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  30017. "lsl r6, %[b], #16\n\t"
  30018. "lsl r7, r8, #16\n\t"
  30019. "lsr r6, r6, #16\n\t"
  30020. "lsr r7, r7, #16\n\t"
  30021. "mul r7, r6, r7\n\t"
  30022. "adds r4, r4, r7\n\t"
  30023. "adc r5, r5, #0\n\t"
  30024. "lsr r7, r8, #16\n\t"
  30025. "mul r6, r7, r6\n\t"
  30026. "lsr r7, r6, #16\n\t"
  30027. "lsl r6, r6, #16\n\t"
  30028. "adds r4, r4, r6\n\t"
  30029. "adc r5, r5, r7\n\t"
  30030. "lsr r6, %[b], #16\n\t"
  30031. "lsr r7, r8, #16\n\t"
  30032. "mul r7, r6, r7\n\t"
  30033. "add r5, r5, r7\n\t"
  30034. "lsl r7, r8, #16\n\t"
  30035. "lsr r7, r7, #16\n\t"
  30036. "mul r6, r7, r6\n\t"
  30037. "lsr r7, r6, #16\n\t"
  30038. "lsl r6, r6, #16\n\t"
  30039. "adds r4, r4, r6\n\t"
  30040. "adc r5, r5, r7\n\t"
  30041. #else
  30042. "umlal r4, r5, %[b], r8\n\t"
  30043. #endif
  30044. "stm %[r]!, {r4}\n\t"
  30045. "mov r3, #0\n\t"
  30046. /* A[38] * B */
  30047. "ldm %[a]!, {r8}\n\t"
  30048. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  30049. "lsl r6, %[b], #16\n\t"
  30050. "lsl r7, r8, #16\n\t"
  30051. "lsr r6, r6, #16\n\t"
  30052. "lsr r7, r7, #16\n\t"
  30053. "mul r7, r6, r7\n\t"
  30054. "adds r5, r5, r7\n\t"
  30055. "adc r3, r3, #0\n\t"
  30056. "lsr r7, r8, #16\n\t"
  30057. "mul r6, r7, r6\n\t"
  30058. "lsr r7, r6, #16\n\t"
  30059. "lsl r6, r6, #16\n\t"
  30060. "adds r5, r5, r6\n\t"
  30061. "adc r3, r3, r7\n\t"
  30062. "lsr r6, %[b], #16\n\t"
  30063. "lsr r7, r8, #16\n\t"
  30064. "mul r7, r6, r7\n\t"
  30065. "add r3, r3, r7\n\t"
  30066. "lsl r7, r8, #16\n\t"
  30067. "lsr r7, r7, #16\n\t"
  30068. "mul r6, r7, r6\n\t"
  30069. "lsr r7, r6, #16\n\t"
  30070. "lsl r6, r6, #16\n\t"
  30071. "adds r5, r5, r6\n\t"
  30072. "adc r3, r3, r7\n\t"
  30073. #else
  30074. "umlal r5, r3, %[b], r8\n\t"
  30075. #endif
  30076. "stm %[r]!, {r5}\n\t"
  30077. "mov r4, #0\n\t"
  30078. /* A[39] * B */
  30079. "ldm %[a]!, {r8}\n\t"
  30080. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  30081. "lsl r6, %[b], #16\n\t"
  30082. "lsl r7, r8, #16\n\t"
  30083. "lsr r6, r6, #16\n\t"
  30084. "lsr r7, r7, #16\n\t"
  30085. "mul r7, r6, r7\n\t"
  30086. "adds r3, r3, r7\n\t"
  30087. "adc r4, r4, #0\n\t"
  30088. "lsr r7, r8, #16\n\t"
  30089. "mul r6, r7, r6\n\t"
  30090. "lsr r7, r6, #16\n\t"
  30091. "lsl r6, r6, #16\n\t"
  30092. "adds r3, r3, r6\n\t"
  30093. "adc r4, r4, r7\n\t"
  30094. "lsr r6, %[b], #16\n\t"
  30095. "lsr r7, r8, #16\n\t"
  30096. "mul r7, r6, r7\n\t"
  30097. "add r4, r4, r7\n\t"
  30098. "lsl r7, r8, #16\n\t"
  30099. "lsr r7, r7, #16\n\t"
  30100. "mul r6, r7, r6\n\t"
  30101. "lsr r7, r6, #16\n\t"
  30102. "lsl r6, r6, #16\n\t"
  30103. "adds r3, r3, r6\n\t"
  30104. "adc r4, r4, r7\n\t"
  30105. #else
  30106. "umlal r3, r4, %[b], r8\n\t"
  30107. #endif
  30108. "stm %[r]!, {r3}\n\t"
  30109. "mov r5, #0\n\t"
  30110. /* A[40] * B */
  30111. "ldm %[a]!, {r8}\n\t"
  30112. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  30113. "lsl r6, %[b], #16\n\t"
  30114. "lsl r7, r8, #16\n\t"
  30115. "lsr r6, r6, #16\n\t"
  30116. "lsr r7, r7, #16\n\t"
  30117. "mul r7, r6, r7\n\t"
  30118. "adds r4, r4, r7\n\t"
  30119. "adc r5, r5, #0\n\t"
  30120. "lsr r7, r8, #16\n\t"
  30121. "mul r6, r7, r6\n\t"
  30122. "lsr r7, r6, #16\n\t"
  30123. "lsl r6, r6, #16\n\t"
  30124. "adds r4, r4, r6\n\t"
  30125. "adc r5, r5, r7\n\t"
  30126. "lsr r6, %[b], #16\n\t"
  30127. "lsr r7, r8, #16\n\t"
  30128. "mul r7, r6, r7\n\t"
  30129. "add r5, r5, r7\n\t"
  30130. "lsl r7, r8, #16\n\t"
  30131. "lsr r7, r7, #16\n\t"
  30132. "mul r6, r7, r6\n\t"
  30133. "lsr r7, r6, #16\n\t"
  30134. "lsl r6, r6, #16\n\t"
  30135. "adds r4, r4, r6\n\t"
  30136. "adc r5, r5, r7\n\t"
  30137. #else
  30138. "umlal r4, r5, %[b], r8\n\t"
  30139. #endif
  30140. "stm %[r]!, {r4}\n\t"
  30141. "mov r3, #0\n\t"
  30142. /* A[41] * B */
  30143. "ldm %[a]!, {r8}\n\t"
  30144. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  30145. "lsl r6, %[b], #16\n\t"
  30146. "lsl r7, r8, #16\n\t"
  30147. "lsr r6, r6, #16\n\t"
  30148. "lsr r7, r7, #16\n\t"
  30149. "mul r7, r6, r7\n\t"
  30150. "adds r5, r5, r7\n\t"
  30151. "adc r3, r3, #0\n\t"
  30152. "lsr r7, r8, #16\n\t"
  30153. "mul r6, r7, r6\n\t"
  30154. "lsr r7, r6, #16\n\t"
  30155. "lsl r6, r6, #16\n\t"
  30156. "adds r5, r5, r6\n\t"
  30157. "adc r3, r3, r7\n\t"
  30158. "lsr r6, %[b], #16\n\t"
  30159. "lsr r7, r8, #16\n\t"
  30160. "mul r7, r6, r7\n\t"
  30161. "add r3, r3, r7\n\t"
  30162. "lsl r7, r8, #16\n\t"
  30163. "lsr r7, r7, #16\n\t"
  30164. "mul r6, r7, r6\n\t"
  30165. "lsr r7, r6, #16\n\t"
  30166. "lsl r6, r6, #16\n\t"
  30167. "adds r5, r5, r6\n\t"
  30168. "adc r3, r3, r7\n\t"
  30169. #else
  30170. "umlal r5, r3, %[b], r8\n\t"
  30171. #endif
  30172. "stm %[r]!, {r5}\n\t"
  30173. "mov r4, #0\n\t"
  30174. /* A[42] * B */
  30175. "ldm %[a]!, {r8}\n\t"
  30176. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  30177. "lsl r6, %[b], #16\n\t"
  30178. "lsl r7, r8, #16\n\t"
  30179. "lsr r6, r6, #16\n\t"
  30180. "lsr r7, r7, #16\n\t"
  30181. "mul r7, r6, r7\n\t"
  30182. "adds r3, r3, r7\n\t"
  30183. "adc r4, r4, #0\n\t"
  30184. "lsr r7, r8, #16\n\t"
  30185. "mul r6, r7, r6\n\t"
  30186. "lsr r7, r6, #16\n\t"
  30187. "lsl r6, r6, #16\n\t"
  30188. "adds r3, r3, r6\n\t"
  30189. "adc r4, r4, r7\n\t"
  30190. "lsr r6, %[b], #16\n\t"
  30191. "lsr r7, r8, #16\n\t"
  30192. "mul r7, r6, r7\n\t"
  30193. "add r4, r4, r7\n\t"
  30194. "lsl r7, r8, #16\n\t"
  30195. "lsr r7, r7, #16\n\t"
  30196. "mul r6, r7, r6\n\t"
  30197. "lsr r7, r6, #16\n\t"
  30198. "lsl r6, r6, #16\n\t"
  30199. "adds r3, r3, r6\n\t"
  30200. "adc r4, r4, r7\n\t"
  30201. #else
  30202. "umlal r3, r4, %[b], r8\n\t"
  30203. #endif
  30204. "stm %[r]!, {r3}\n\t"
  30205. "mov r5, #0\n\t"
  30206. /* A[43] * B */
  30207. "ldm %[a]!, {r8}\n\t"
  30208. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  30209. "lsl r6, %[b], #16\n\t"
  30210. "lsl r7, r8, #16\n\t"
  30211. "lsr r6, r6, #16\n\t"
  30212. "lsr r7, r7, #16\n\t"
  30213. "mul r7, r6, r7\n\t"
  30214. "adds r4, r4, r7\n\t"
  30215. "adc r5, r5, #0\n\t"
  30216. "lsr r7, r8, #16\n\t"
  30217. "mul r6, r7, r6\n\t"
  30218. "lsr r7, r6, #16\n\t"
  30219. "lsl r6, r6, #16\n\t"
  30220. "adds r4, r4, r6\n\t"
  30221. "adc r5, r5, r7\n\t"
  30222. "lsr r6, %[b], #16\n\t"
  30223. "lsr r7, r8, #16\n\t"
  30224. "mul r7, r6, r7\n\t"
  30225. "add r5, r5, r7\n\t"
  30226. "lsl r7, r8, #16\n\t"
  30227. "lsr r7, r7, #16\n\t"
  30228. "mul r6, r7, r6\n\t"
  30229. "lsr r7, r6, #16\n\t"
  30230. "lsl r6, r6, #16\n\t"
  30231. "adds r4, r4, r6\n\t"
  30232. "adc r5, r5, r7\n\t"
  30233. #else
  30234. "umlal r4, r5, %[b], r8\n\t"
  30235. #endif
  30236. "stm %[r]!, {r4}\n\t"
  30237. "mov r3, #0\n\t"
  30238. /* A[44] * B */
  30239. "ldm %[a]!, {r8}\n\t"
  30240. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  30241. "lsl r6, %[b], #16\n\t"
  30242. "lsl r7, r8, #16\n\t"
  30243. "lsr r6, r6, #16\n\t"
  30244. "lsr r7, r7, #16\n\t"
  30245. "mul r7, r6, r7\n\t"
  30246. "adds r5, r5, r7\n\t"
  30247. "adc r3, r3, #0\n\t"
  30248. "lsr r7, r8, #16\n\t"
  30249. "mul r6, r7, r6\n\t"
  30250. "lsr r7, r6, #16\n\t"
  30251. "lsl r6, r6, #16\n\t"
  30252. "adds r5, r5, r6\n\t"
  30253. "adc r3, r3, r7\n\t"
  30254. "lsr r6, %[b], #16\n\t"
  30255. "lsr r7, r8, #16\n\t"
  30256. "mul r7, r6, r7\n\t"
  30257. "add r3, r3, r7\n\t"
  30258. "lsl r7, r8, #16\n\t"
  30259. "lsr r7, r7, #16\n\t"
  30260. "mul r6, r7, r6\n\t"
  30261. "lsr r7, r6, #16\n\t"
  30262. "lsl r6, r6, #16\n\t"
  30263. "adds r5, r5, r6\n\t"
  30264. "adc r3, r3, r7\n\t"
  30265. #else
  30266. "umlal r5, r3, %[b], r8\n\t"
  30267. #endif
  30268. "stm %[r]!, {r5}\n\t"
  30269. "mov r4, #0\n\t"
  30270. /* A[45] * B */
  30271. "ldm %[a]!, {r8}\n\t"
  30272. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  30273. "lsl r6, %[b], #16\n\t"
  30274. "lsl r7, r8, #16\n\t"
  30275. "lsr r6, r6, #16\n\t"
  30276. "lsr r7, r7, #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. "lsr r7, r8, #16\n\t"
  30281. "mul r6, r7, r6\n\t"
  30282. "lsr r7, r6, #16\n\t"
  30283. "lsl r6, r6, #16\n\t"
  30284. "adds r3, r3, r6\n\t"
  30285. "adc r4, r4, r7\n\t"
  30286. "lsr r6, %[b], #16\n\t"
  30287. "lsr r7, r8, #16\n\t"
  30288. "mul r7, r6, r7\n\t"
  30289. "add r4, r4, r7\n\t"
  30290. "lsl r7, r8, #16\n\t"
  30291. "lsr r7, r7, #16\n\t"
  30292. "mul r6, r7, r6\n\t"
  30293. "lsr r7, r6, #16\n\t"
  30294. "lsl r6, r6, #16\n\t"
  30295. "adds r3, r3, r6\n\t"
  30296. "adc r4, r4, r7\n\t"
  30297. #else
  30298. "umlal r3, r4, %[b], r8\n\t"
  30299. #endif
  30300. "stm %[r]!, {r3}\n\t"
  30301. "mov r5, #0\n\t"
  30302. /* A[46] * B */
  30303. "ldm %[a]!, {r8}\n\t"
  30304. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  30305. "lsl r6, %[b], #16\n\t"
  30306. "lsl r7, r8, #16\n\t"
  30307. "lsr r6, r6, #16\n\t"
  30308. "lsr r7, r7, #16\n\t"
  30309. "mul r7, r6, r7\n\t"
  30310. "adds r4, r4, r7\n\t"
  30311. "adc r5, r5, #0\n\t"
  30312. "lsr r7, r8, #16\n\t"
  30313. "mul r6, r7, r6\n\t"
  30314. "lsr r7, r6, #16\n\t"
  30315. "lsl r6, r6, #16\n\t"
  30316. "adds r4, r4, r6\n\t"
  30317. "adc r5, r5, r7\n\t"
  30318. "lsr r6, %[b], #16\n\t"
  30319. "lsr r7, r8, #16\n\t"
  30320. "mul r7, r6, r7\n\t"
  30321. "add r5, r5, r7\n\t"
  30322. "lsl r7, r8, #16\n\t"
  30323. "lsr r7, r7, #16\n\t"
  30324. "mul r6, r7, r6\n\t"
  30325. "lsr r7, r6, #16\n\t"
  30326. "lsl r6, r6, #16\n\t"
  30327. "adds r4, r4, r6\n\t"
  30328. "adc r5, r5, r7\n\t"
  30329. #else
  30330. "umlal r4, r5, %[b], r8\n\t"
  30331. #endif
  30332. "stm %[r]!, {r4}\n\t"
  30333. "mov r3, #0\n\t"
  30334. /* A[47] * B */
  30335. "ldm %[a]!, {r8}\n\t"
  30336. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  30337. "lsl r6, %[b], #16\n\t"
  30338. "lsl r7, r8, #16\n\t"
  30339. "lsr r6, r6, #16\n\t"
  30340. "lsr r7, r7, #16\n\t"
  30341. "mul r7, r6, r7\n\t"
  30342. "adds r5, r5, r7\n\t"
  30343. "adc r3, r3, #0\n\t"
  30344. "lsr r7, r8, #16\n\t"
  30345. "mul r6, r7, r6\n\t"
  30346. "lsr r7, r6, #16\n\t"
  30347. "lsl r6, r6, #16\n\t"
  30348. "adds r5, r5, r6\n\t"
  30349. "adc r3, r3, r7\n\t"
  30350. "lsr r6, %[b], #16\n\t"
  30351. "lsr r7, r8, #16\n\t"
  30352. "mul r7, r6, r7\n\t"
  30353. "add r3, r3, r7\n\t"
  30354. "lsl r7, r8, #16\n\t"
  30355. "lsr r7, r7, #16\n\t"
  30356. "mul r6, r7, r6\n\t"
  30357. "lsr r7, r6, #16\n\t"
  30358. "lsl r6, r6, #16\n\t"
  30359. "adds r5, r5, r6\n\t"
  30360. "adc r3, r3, r7\n\t"
  30361. #else
  30362. "umlal r5, r3, %[b], r8\n\t"
  30363. #endif
  30364. "stm %[r]!, {r5}\n\t"
  30365. "mov r4, #0\n\t"
  30366. /* A[48] * B */
  30367. "ldm %[a]!, {r8}\n\t"
  30368. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  30369. "lsl r6, %[b], #16\n\t"
  30370. "lsl r7, r8, #16\n\t"
  30371. "lsr r6, r6, #16\n\t"
  30372. "lsr r7, r7, #16\n\t"
  30373. "mul r7, r6, r7\n\t"
  30374. "adds r3, r3, r7\n\t"
  30375. "adc r4, r4, #0\n\t"
  30376. "lsr r7, r8, #16\n\t"
  30377. "mul r6, r7, r6\n\t"
  30378. "lsr r7, r6, #16\n\t"
  30379. "lsl r6, r6, #16\n\t"
  30380. "adds r3, r3, r6\n\t"
  30381. "adc r4, r4, r7\n\t"
  30382. "lsr r6, %[b], #16\n\t"
  30383. "lsr r7, r8, #16\n\t"
  30384. "mul r7, r6, r7\n\t"
  30385. "add r4, r4, r7\n\t"
  30386. "lsl r7, r8, #16\n\t"
  30387. "lsr r7, r7, #16\n\t"
  30388. "mul r6, r7, r6\n\t"
  30389. "lsr r7, r6, #16\n\t"
  30390. "lsl r6, r6, #16\n\t"
  30391. "adds r3, r3, r6\n\t"
  30392. "adc r4, r4, r7\n\t"
  30393. #else
  30394. "umlal r3, r4, %[b], r8\n\t"
  30395. #endif
  30396. "stm %[r]!, {r3}\n\t"
  30397. "mov r5, #0\n\t"
  30398. /* A[49] * B */
  30399. "ldm %[a]!, {r8}\n\t"
  30400. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  30401. "lsl r6, %[b], #16\n\t"
  30402. "lsl r7, r8, #16\n\t"
  30403. "lsr r6, r6, #16\n\t"
  30404. "lsr r7, r7, #16\n\t"
  30405. "mul r7, r6, r7\n\t"
  30406. "adds r4, r4, r7\n\t"
  30407. "adc r5, r5, #0\n\t"
  30408. "lsr r7, r8, #16\n\t"
  30409. "mul r6, r7, r6\n\t"
  30410. "lsr r7, r6, #16\n\t"
  30411. "lsl r6, r6, #16\n\t"
  30412. "adds r4, r4, r6\n\t"
  30413. "adc r5, r5, r7\n\t"
  30414. "lsr r6, %[b], #16\n\t"
  30415. "lsr r7, r8, #16\n\t"
  30416. "mul r7, r6, r7\n\t"
  30417. "add r5, r5, r7\n\t"
  30418. "lsl r7, r8, #16\n\t"
  30419. "lsr r7, r7, #16\n\t"
  30420. "mul r6, r7, r6\n\t"
  30421. "lsr r7, r6, #16\n\t"
  30422. "lsl r6, r6, #16\n\t"
  30423. "adds r4, r4, r6\n\t"
  30424. "adc r5, r5, r7\n\t"
  30425. #else
  30426. "umlal r4, r5, %[b], r8\n\t"
  30427. #endif
  30428. "stm %[r]!, {r4}\n\t"
  30429. "mov r3, #0\n\t"
  30430. /* A[50] * B */
  30431. "ldm %[a]!, {r8}\n\t"
  30432. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  30433. "lsl r6, %[b], #16\n\t"
  30434. "lsl r7, r8, #16\n\t"
  30435. "lsr r6, r6, #16\n\t"
  30436. "lsr r7, r7, #16\n\t"
  30437. "mul r7, r6, r7\n\t"
  30438. "adds r5, r5, r7\n\t"
  30439. "adc r3, r3, #0\n\t"
  30440. "lsr r7, r8, #16\n\t"
  30441. "mul r6, r7, r6\n\t"
  30442. "lsr r7, r6, #16\n\t"
  30443. "lsl r6, r6, #16\n\t"
  30444. "adds r5, r5, r6\n\t"
  30445. "adc r3, r3, r7\n\t"
  30446. "lsr r6, %[b], #16\n\t"
  30447. "lsr r7, r8, #16\n\t"
  30448. "mul r7, r6, r7\n\t"
  30449. "add r3, r3, r7\n\t"
  30450. "lsl r7, r8, #16\n\t"
  30451. "lsr r7, r7, #16\n\t"
  30452. "mul r6, r7, r6\n\t"
  30453. "lsr r7, r6, #16\n\t"
  30454. "lsl r6, r6, #16\n\t"
  30455. "adds r5, r5, r6\n\t"
  30456. "adc r3, r3, r7\n\t"
  30457. #else
  30458. "umlal r5, r3, %[b], r8\n\t"
  30459. #endif
  30460. "stm %[r]!, {r5}\n\t"
  30461. "mov r4, #0\n\t"
  30462. /* A[51] * B */
  30463. "ldm %[a]!, {r8}\n\t"
  30464. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  30465. "lsl r6, %[b], #16\n\t"
  30466. "lsl r7, r8, #16\n\t"
  30467. "lsr r6, r6, #16\n\t"
  30468. "lsr r7, r7, #16\n\t"
  30469. "mul r7, r6, r7\n\t"
  30470. "adds r3, r3, r7\n\t"
  30471. "adc r4, r4, #0\n\t"
  30472. "lsr r7, r8, #16\n\t"
  30473. "mul r6, r7, r6\n\t"
  30474. "lsr r7, r6, #16\n\t"
  30475. "lsl r6, r6, #16\n\t"
  30476. "adds r3, r3, r6\n\t"
  30477. "adc r4, r4, r7\n\t"
  30478. "lsr r6, %[b], #16\n\t"
  30479. "lsr r7, r8, #16\n\t"
  30480. "mul r7, r6, r7\n\t"
  30481. "add r4, r4, r7\n\t"
  30482. "lsl r7, r8, #16\n\t"
  30483. "lsr r7, r7, #16\n\t"
  30484. "mul r6, r7, r6\n\t"
  30485. "lsr r7, r6, #16\n\t"
  30486. "lsl r6, r6, #16\n\t"
  30487. "adds r3, r3, r6\n\t"
  30488. "adc r4, r4, r7\n\t"
  30489. #else
  30490. "umlal r3, r4, %[b], r8\n\t"
  30491. #endif
  30492. "stm %[r]!, {r3}\n\t"
  30493. "mov r5, #0\n\t"
  30494. /* A[52] * B */
  30495. "ldm %[a]!, {r8}\n\t"
  30496. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  30497. "lsl r6, %[b], #16\n\t"
  30498. "lsl r7, r8, #16\n\t"
  30499. "lsr r6, r6, #16\n\t"
  30500. "lsr r7, r7, #16\n\t"
  30501. "mul r7, r6, r7\n\t"
  30502. "adds r4, r4, r7\n\t"
  30503. "adc r5, r5, #0\n\t"
  30504. "lsr r7, r8, #16\n\t"
  30505. "mul r6, r7, r6\n\t"
  30506. "lsr r7, r6, #16\n\t"
  30507. "lsl r6, r6, #16\n\t"
  30508. "adds r4, r4, r6\n\t"
  30509. "adc r5, r5, r7\n\t"
  30510. "lsr r6, %[b], #16\n\t"
  30511. "lsr r7, r8, #16\n\t"
  30512. "mul r7, r6, r7\n\t"
  30513. "add r5, r5, r7\n\t"
  30514. "lsl r7, r8, #16\n\t"
  30515. "lsr r7, r7, #16\n\t"
  30516. "mul r6, r7, r6\n\t"
  30517. "lsr r7, r6, #16\n\t"
  30518. "lsl r6, r6, #16\n\t"
  30519. "adds r4, r4, r6\n\t"
  30520. "adc r5, r5, r7\n\t"
  30521. #else
  30522. "umlal r4, r5, %[b], r8\n\t"
  30523. #endif
  30524. "stm %[r]!, {r4}\n\t"
  30525. "mov r3, #0\n\t"
  30526. /* A[53] * B */
  30527. "ldm %[a]!, {r8}\n\t"
  30528. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  30529. "lsl r6, %[b], #16\n\t"
  30530. "lsl r7, r8, #16\n\t"
  30531. "lsr r6, r6, #16\n\t"
  30532. "lsr r7, r7, #16\n\t"
  30533. "mul r7, r6, r7\n\t"
  30534. "adds r5, r5, r7\n\t"
  30535. "adc r3, r3, #0\n\t"
  30536. "lsr r7, r8, #16\n\t"
  30537. "mul r6, r7, r6\n\t"
  30538. "lsr r7, r6, #16\n\t"
  30539. "lsl r6, r6, #16\n\t"
  30540. "adds r5, r5, r6\n\t"
  30541. "adc r3, r3, r7\n\t"
  30542. "lsr r6, %[b], #16\n\t"
  30543. "lsr r7, r8, #16\n\t"
  30544. "mul r7, r6, r7\n\t"
  30545. "add r3, r3, r7\n\t"
  30546. "lsl r7, r8, #16\n\t"
  30547. "lsr r7, r7, #16\n\t"
  30548. "mul r6, r7, r6\n\t"
  30549. "lsr r7, r6, #16\n\t"
  30550. "lsl r6, r6, #16\n\t"
  30551. "adds r5, r5, r6\n\t"
  30552. "adc r3, r3, r7\n\t"
  30553. #else
  30554. "umlal r5, r3, %[b], r8\n\t"
  30555. #endif
  30556. "stm %[r]!, {r5}\n\t"
  30557. "mov r4, #0\n\t"
  30558. /* A[54] * B */
  30559. "ldm %[a]!, {r8}\n\t"
  30560. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  30561. "lsl r6, %[b], #16\n\t"
  30562. "lsl r7, r8, #16\n\t"
  30563. "lsr r6, r6, #16\n\t"
  30564. "lsr r7, r7, #16\n\t"
  30565. "mul r7, r6, r7\n\t"
  30566. "adds r3, r3, r7\n\t"
  30567. "adc r4, r4, #0\n\t"
  30568. "lsr r7, r8, #16\n\t"
  30569. "mul r6, r7, r6\n\t"
  30570. "lsr r7, r6, #16\n\t"
  30571. "lsl r6, r6, #16\n\t"
  30572. "adds r3, r3, r6\n\t"
  30573. "adc r4, r4, r7\n\t"
  30574. "lsr r6, %[b], #16\n\t"
  30575. "lsr r7, r8, #16\n\t"
  30576. "mul r7, r6, r7\n\t"
  30577. "add r4, r4, r7\n\t"
  30578. "lsl r7, r8, #16\n\t"
  30579. "lsr r7, r7, #16\n\t"
  30580. "mul r6, r7, r6\n\t"
  30581. "lsr r7, r6, #16\n\t"
  30582. "lsl r6, r6, #16\n\t"
  30583. "adds r3, r3, r6\n\t"
  30584. "adc r4, r4, r7\n\t"
  30585. #else
  30586. "umlal r3, r4, %[b], r8\n\t"
  30587. #endif
  30588. "stm %[r]!, {r3}\n\t"
  30589. "mov r5, #0\n\t"
  30590. /* A[55] * B */
  30591. "ldm %[a]!, {r8}\n\t"
  30592. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  30593. "lsl r6, %[b], #16\n\t"
  30594. "lsl r7, r8, #16\n\t"
  30595. "lsr r6, r6, #16\n\t"
  30596. "lsr r7, r7, #16\n\t"
  30597. "mul r7, r6, r7\n\t"
  30598. "adds r4, r4, r7\n\t"
  30599. "adc r5, r5, #0\n\t"
  30600. "lsr r7, r8, #16\n\t"
  30601. "mul r6, r7, r6\n\t"
  30602. "lsr r7, r6, #16\n\t"
  30603. "lsl r6, r6, #16\n\t"
  30604. "adds r4, r4, r6\n\t"
  30605. "adc r5, r5, r7\n\t"
  30606. "lsr r6, %[b], #16\n\t"
  30607. "lsr r7, r8, #16\n\t"
  30608. "mul r7, r6, r7\n\t"
  30609. "add r5, r5, r7\n\t"
  30610. "lsl r7, r8, #16\n\t"
  30611. "lsr r7, r7, #16\n\t"
  30612. "mul r6, r7, r6\n\t"
  30613. "lsr r7, r6, #16\n\t"
  30614. "lsl r6, r6, #16\n\t"
  30615. "adds r4, r4, r6\n\t"
  30616. "adc r5, r5, r7\n\t"
  30617. #else
  30618. "umlal r4, r5, %[b], r8\n\t"
  30619. #endif
  30620. "stm %[r]!, {r4}\n\t"
  30621. "mov r3, #0\n\t"
  30622. /* A[56] * B */
  30623. "ldm %[a]!, {r8}\n\t"
  30624. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  30625. "lsl r6, %[b], #16\n\t"
  30626. "lsl r7, r8, #16\n\t"
  30627. "lsr r6, r6, #16\n\t"
  30628. "lsr r7, r7, #16\n\t"
  30629. "mul r7, r6, r7\n\t"
  30630. "adds r5, r5, r7\n\t"
  30631. "adc r3, r3, #0\n\t"
  30632. "lsr r7, r8, #16\n\t"
  30633. "mul r6, r7, r6\n\t"
  30634. "lsr r7, r6, #16\n\t"
  30635. "lsl r6, r6, #16\n\t"
  30636. "adds r5, r5, r6\n\t"
  30637. "adc r3, r3, r7\n\t"
  30638. "lsr r6, %[b], #16\n\t"
  30639. "lsr r7, r8, #16\n\t"
  30640. "mul r7, r6, r7\n\t"
  30641. "add r3, r3, r7\n\t"
  30642. "lsl r7, r8, #16\n\t"
  30643. "lsr r7, r7, #16\n\t"
  30644. "mul r6, r7, r6\n\t"
  30645. "lsr r7, r6, #16\n\t"
  30646. "lsl r6, r6, #16\n\t"
  30647. "adds r5, r5, r6\n\t"
  30648. "adc r3, r3, r7\n\t"
  30649. #else
  30650. "umlal r5, r3, %[b], r8\n\t"
  30651. #endif
  30652. "stm %[r]!, {r5}\n\t"
  30653. "mov r4, #0\n\t"
  30654. /* A[57] * B */
  30655. "ldm %[a]!, {r8}\n\t"
  30656. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  30657. "lsl r6, %[b], #16\n\t"
  30658. "lsl r7, r8, #16\n\t"
  30659. "lsr r6, r6, #16\n\t"
  30660. "lsr r7, r7, #16\n\t"
  30661. "mul r7, r6, r7\n\t"
  30662. "adds r3, r3, r7\n\t"
  30663. "adc r4, r4, #0\n\t"
  30664. "lsr r7, r8, #16\n\t"
  30665. "mul r6, r7, r6\n\t"
  30666. "lsr r7, r6, #16\n\t"
  30667. "lsl r6, r6, #16\n\t"
  30668. "adds r3, r3, r6\n\t"
  30669. "adc r4, r4, r7\n\t"
  30670. "lsr r6, %[b], #16\n\t"
  30671. "lsr r7, r8, #16\n\t"
  30672. "mul r7, r6, r7\n\t"
  30673. "add r4, r4, r7\n\t"
  30674. "lsl r7, r8, #16\n\t"
  30675. "lsr r7, r7, #16\n\t"
  30676. "mul r6, r7, r6\n\t"
  30677. "lsr r7, r6, #16\n\t"
  30678. "lsl r6, r6, #16\n\t"
  30679. "adds r3, r3, r6\n\t"
  30680. "adc r4, r4, r7\n\t"
  30681. #else
  30682. "umlal r3, r4, %[b], r8\n\t"
  30683. #endif
  30684. "stm %[r]!, {r3}\n\t"
  30685. "mov r5, #0\n\t"
  30686. /* A[58] * B */
  30687. "ldm %[a]!, {r8}\n\t"
  30688. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  30689. "lsl r6, %[b], #16\n\t"
  30690. "lsl r7, r8, #16\n\t"
  30691. "lsr r6, r6, #16\n\t"
  30692. "lsr r7, r7, #16\n\t"
  30693. "mul r7, r6, r7\n\t"
  30694. "adds r4, r4, r7\n\t"
  30695. "adc r5, r5, #0\n\t"
  30696. "lsr r7, r8, #16\n\t"
  30697. "mul r6, r7, r6\n\t"
  30698. "lsr r7, r6, #16\n\t"
  30699. "lsl r6, r6, #16\n\t"
  30700. "adds r4, r4, r6\n\t"
  30701. "adc r5, r5, r7\n\t"
  30702. "lsr r6, %[b], #16\n\t"
  30703. "lsr r7, r8, #16\n\t"
  30704. "mul r7, r6, r7\n\t"
  30705. "add r5, r5, r7\n\t"
  30706. "lsl r7, r8, #16\n\t"
  30707. "lsr r7, r7, #16\n\t"
  30708. "mul r6, r7, r6\n\t"
  30709. "lsr r7, r6, #16\n\t"
  30710. "lsl r6, r6, #16\n\t"
  30711. "adds r4, r4, r6\n\t"
  30712. "adc r5, r5, r7\n\t"
  30713. #else
  30714. "umlal r4, r5, %[b], r8\n\t"
  30715. #endif
  30716. "stm %[r]!, {r4}\n\t"
  30717. "mov r3, #0\n\t"
  30718. /* A[59] * B */
  30719. "ldm %[a]!, {r8}\n\t"
  30720. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  30721. "lsl r6, %[b], #16\n\t"
  30722. "lsl r7, r8, #16\n\t"
  30723. "lsr r6, r6, #16\n\t"
  30724. "lsr r7, r7, #16\n\t"
  30725. "mul r7, r6, r7\n\t"
  30726. "adds r5, r5, r7\n\t"
  30727. "adc r3, r3, #0\n\t"
  30728. "lsr r7, r8, #16\n\t"
  30729. "mul r6, r7, r6\n\t"
  30730. "lsr r7, r6, #16\n\t"
  30731. "lsl r6, r6, #16\n\t"
  30732. "adds r5, r5, r6\n\t"
  30733. "adc r3, r3, r7\n\t"
  30734. "lsr r6, %[b], #16\n\t"
  30735. "lsr r7, r8, #16\n\t"
  30736. "mul r7, r6, r7\n\t"
  30737. "add r3, r3, r7\n\t"
  30738. "lsl r7, r8, #16\n\t"
  30739. "lsr r7, r7, #16\n\t"
  30740. "mul r6, r7, r6\n\t"
  30741. "lsr r7, r6, #16\n\t"
  30742. "lsl r6, r6, #16\n\t"
  30743. "adds r5, r5, r6\n\t"
  30744. "adc r3, r3, r7\n\t"
  30745. #else
  30746. "umlal r5, r3, %[b], r8\n\t"
  30747. #endif
  30748. "stm %[r]!, {r5}\n\t"
  30749. "mov r4, #0\n\t"
  30750. /* A[60] * B */
  30751. "ldm %[a]!, {r8}\n\t"
  30752. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  30753. "lsl r6, %[b], #16\n\t"
  30754. "lsl r7, r8, #16\n\t"
  30755. "lsr r6, r6, #16\n\t"
  30756. "lsr r7, r7, #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. "lsr r7, r8, #16\n\t"
  30761. "mul r6, r7, r6\n\t"
  30762. "lsr r7, r6, #16\n\t"
  30763. "lsl r6, r6, #16\n\t"
  30764. "adds r3, r3, r6\n\t"
  30765. "adc r4, r4, r7\n\t"
  30766. "lsr r6, %[b], #16\n\t"
  30767. "lsr r7, r8, #16\n\t"
  30768. "mul r7, r6, r7\n\t"
  30769. "add r4, r4, r7\n\t"
  30770. "lsl r7, r8, #16\n\t"
  30771. "lsr r7, r7, #16\n\t"
  30772. "mul r6, r7, r6\n\t"
  30773. "lsr r7, r6, #16\n\t"
  30774. "lsl r6, r6, #16\n\t"
  30775. "adds r3, r3, r6\n\t"
  30776. "adc r4, r4, r7\n\t"
  30777. #else
  30778. "umlal r3, r4, %[b], r8\n\t"
  30779. #endif
  30780. "stm %[r]!, {r3}\n\t"
  30781. "mov r5, #0\n\t"
  30782. /* A[61] * B */
  30783. "ldm %[a]!, {r8}\n\t"
  30784. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  30785. "lsl r6, %[b], #16\n\t"
  30786. "lsl r7, r8, #16\n\t"
  30787. "lsr r6, r6, #16\n\t"
  30788. "lsr r7, r7, #16\n\t"
  30789. "mul r7, r6, r7\n\t"
  30790. "adds r4, r4, r7\n\t"
  30791. "adc r5, r5, #0\n\t"
  30792. "lsr r7, r8, #16\n\t"
  30793. "mul r6, r7, r6\n\t"
  30794. "lsr r7, r6, #16\n\t"
  30795. "lsl r6, r6, #16\n\t"
  30796. "adds r4, r4, r6\n\t"
  30797. "adc r5, r5, r7\n\t"
  30798. "lsr r6, %[b], #16\n\t"
  30799. "lsr r7, r8, #16\n\t"
  30800. "mul r7, r6, r7\n\t"
  30801. "add r5, r5, r7\n\t"
  30802. "lsl r7, r8, #16\n\t"
  30803. "lsr r7, r7, #16\n\t"
  30804. "mul r6, r7, r6\n\t"
  30805. "lsr r7, r6, #16\n\t"
  30806. "lsl r6, r6, #16\n\t"
  30807. "adds r4, r4, r6\n\t"
  30808. "adc r5, r5, r7\n\t"
  30809. #else
  30810. "umlal r4, r5, %[b], r8\n\t"
  30811. #endif
  30812. "stm %[r]!, {r4}\n\t"
  30813. "mov r3, #0\n\t"
  30814. /* A[62] * B */
  30815. "ldm %[a]!, {r8}\n\t"
  30816. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  30817. "lsl r6, %[b], #16\n\t"
  30818. "lsl r7, r8, #16\n\t"
  30819. "lsr r6, r6, #16\n\t"
  30820. "lsr r7, r7, #16\n\t"
  30821. "mul r7, r6, r7\n\t"
  30822. "adds r5, r5, r7\n\t"
  30823. "adc r3, r3, #0\n\t"
  30824. "lsr r7, r8, #16\n\t"
  30825. "mul r6, r7, r6\n\t"
  30826. "lsr r7, r6, #16\n\t"
  30827. "lsl r6, r6, #16\n\t"
  30828. "adds r5, r5, r6\n\t"
  30829. "adc r3, r3, r7\n\t"
  30830. "lsr r6, %[b], #16\n\t"
  30831. "lsr r7, r8, #16\n\t"
  30832. "mul r7, r6, r7\n\t"
  30833. "add r3, r3, r7\n\t"
  30834. "lsl r7, r8, #16\n\t"
  30835. "lsr r7, r7, #16\n\t"
  30836. "mul r6, r7, r6\n\t"
  30837. "lsr r7, r6, #16\n\t"
  30838. "lsl r6, r6, #16\n\t"
  30839. "adds r5, r5, r6\n\t"
  30840. "adc r3, r3, r7\n\t"
  30841. #else
  30842. "umlal r5, r3, %[b], r8\n\t"
  30843. #endif
  30844. "stm %[r]!, {r5}\n\t"
  30845. "mov r4, #0\n\t"
  30846. /* A[63] * B */
  30847. "ldm %[a]!, {r8}\n\t"
  30848. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  30849. "lsl r6, %[b], #16\n\t"
  30850. "lsl r7, r8, #16\n\t"
  30851. "lsr r6, r6, #16\n\t"
  30852. "lsr r7, r7, #16\n\t"
  30853. "mul r7, r6, r7\n\t"
  30854. "adds r3, r3, r7\n\t"
  30855. "adc r4, r4, #0\n\t"
  30856. "lsr r7, r8, #16\n\t"
  30857. "mul r6, r7, r6\n\t"
  30858. "lsr r7, r6, #16\n\t"
  30859. "lsl r6, r6, #16\n\t"
  30860. "adds r3, r3, r6\n\t"
  30861. "adc r4, r4, r7\n\t"
  30862. "lsr r6, %[b], #16\n\t"
  30863. "lsr r7, r8, #16\n\t"
  30864. "mul r7, r6, r7\n\t"
  30865. "add r4, r4, r7\n\t"
  30866. "lsl r7, r8, #16\n\t"
  30867. "lsr r7, r7, #16\n\t"
  30868. "mul r6, r7, r6\n\t"
  30869. "lsr r7, r6, #16\n\t"
  30870. "lsl r6, r6, #16\n\t"
  30871. "adds r3, r3, r6\n\t"
  30872. "adc r4, r4, r7\n\t"
  30873. #else
  30874. "umlal r3, r4, %[b], r8\n\t"
  30875. #endif
  30876. "stm %[r]!, {r3}\n\t"
  30877. "mov r5, #0\n\t"
  30878. /* A[64] * B */
  30879. "ldm %[a]!, {r8}\n\t"
  30880. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  30881. "lsl r6, %[b], #16\n\t"
  30882. "lsl r7, r8, #16\n\t"
  30883. "lsr r6, r6, #16\n\t"
  30884. "lsr r7, r7, #16\n\t"
  30885. "mul r7, r6, r7\n\t"
  30886. "adds r4, r4, r7\n\t"
  30887. "adc r5, r5, #0\n\t"
  30888. "lsr r7, r8, #16\n\t"
  30889. "mul r6, r7, r6\n\t"
  30890. "lsr r7, r6, #16\n\t"
  30891. "lsl r6, r6, #16\n\t"
  30892. "adds r4, r4, r6\n\t"
  30893. "adc r5, r5, r7\n\t"
  30894. "lsr r6, %[b], #16\n\t"
  30895. "lsr r7, r8, #16\n\t"
  30896. "mul r7, r6, r7\n\t"
  30897. "add r5, r5, r7\n\t"
  30898. "lsl r7, r8, #16\n\t"
  30899. "lsr r7, r7, #16\n\t"
  30900. "mul r6, r7, r6\n\t"
  30901. "lsr r7, r6, #16\n\t"
  30902. "lsl r6, r6, #16\n\t"
  30903. "adds r4, r4, r6\n\t"
  30904. "adc r5, r5, r7\n\t"
  30905. #else
  30906. "umlal r4, r5, %[b], r8\n\t"
  30907. #endif
  30908. "stm %[r]!, {r4}\n\t"
  30909. "mov r3, #0\n\t"
  30910. /* A[65] * B */
  30911. "ldm %[a]!, {r8}\n\t"
  30912. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  30913. "lsl r6, %[b], #16\n\t"
  30914. "lsl r7, r8, #16\n\t"
  30915. "lsr r6, r6, #16\n\t"
  30916. "lsr r7, r7, #16\n\t"
  30917. "mul r7, r6, r7\n\t"
  30918. "adds r5, r5, r7\n\t"
  30919. "adc r3, r3, #0\n\t"
  30920. "lsr r7, r8, #16\n\t"
  30921. "mul r6, r7, r6\n\t"
  30922. "lsr r7, r6, #16\n\t"
  30923. "lsl r6, r6, #16\n\t"
  30924. "adds r5, r5, r6\n\t"
  30925. "adc r3, r3, r7\n\t"
  30926. "lsr r6, %[b], #16\n\t"
  30927. "lsr r7, r8, #16\n\t"
  30928. "mul r7, r6, r7\n\t"
  30929. "add r3, r3, r7\n\t"
  30930. "lsl r7, r8, #16\n\t"
  30931. "lsr r7, r7, #16\n\t"
  30932. "mul r6, r7, r6\n\t"
  30933. "lsr r7, r6, #16\n\t"
  30934. "lsl r6, r6, #16\n\t"
  30935. "adds r5, r5, r6\n\t"
  30936. "adc r3, r3, r7\n\t"
  30937. #else
  30938. "umlal r5, r3, %[b], r8\n\t"
  30939. #endif
  30940. "stm %[r]!, {r5}\n\t"
  30941. "mov r4, #0\n\t"
  30942. /* A[66] * B */
  30943. "ldm %[a]!, {r8}\n\t"
  30944. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  30945. "lsl r6, %[b], #16\n\t"
  30946. "lsl r7, r8, #16\n\t"
  30947. "lsr r6, r6, #16\n\t"
  30948. "lsr r7, r7, #16\n\t"
  30949. "mul r7, r6, r7\n\t"
  30950. "adds r3, r3, r7\n\t"
  30951. "adc r4, r4, #0\n\t"
  30952. "lsr r7, r8, #16\n\t"
  30953. "mul r6, r7, r6\n\t"
  30954. "lsr r7, r6, #16\n\t"
  30955. "lsl r6, r6, #16\n\t"
  30956. "adds r3, r3, r6\n\t"
  30957. "adc r4, r4, r7\n\t"
  30958. "lsr r6, %[b], #16\n\t"
  30959. "lsr r7, r8, #16\n\t"
  30960. "mul r7, r6, r7\n\t"
  30961. "add r4, r4, r7\n\t"
  30962. "lsl r7, r8, #16\n\t"
  30963. "lsr r7, r7, #16\n\t"
  30964. "mul r6, r7, r6\n\t"
  30965. "lsr r7, r6, #16\n\t"
  30966. "lsl r6, r6, #16\n\t"
  30967. "adds r3, r3, r6\n\t"
  30968. "adc r4, r4, r7\n\t"
  30969. #else
  30970. "umlal r3, r4, %[b], r8\n\t"
  30971. #endif
  30972. "stm %[r]!, {r3}\n\t"
  30973. "mov r5, #0\n\t"
  30974. /* A[67] * B */
  30975. "ldm %[a]!, {r8}\n\t"
  30976. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  30977. "lsl r6, %[b], #16\n\t"
  30978. "lsl r7, r8, #16\n\t"
  30979. "lsr r6, r6, #16\n\t"
  30980. "lsr r7, r7, #16\n\t"
  30981. "mul r7, r6, r7\n\t"
  30982. "adds r4, r4, r7\n\t"
  30983. "adc r5, r5, #0\n\t"
  30984. "lsr r7, r8, #16\n\t"
  30985. "mul r6, r7, r6\n\t"
  30986. "lsr r7, r6, #16\n\t"
  30987. "lsl r6, r6, #16\n\t"
  30988. "adds r4, r4, r6\n\t"
  30989. "adc r5, r5, r7\n\t"
  30990. "lsr r6, %[b], #16\n\t"
  30991. "lsr r7, r8, #16\n\t"
  30992. "mul r7, r6, r7\n\t"
  30993. "add r5, r5, r7\n\t"
  30994. "lsl r7, r8, #16\n\t"
  30995. "lsr r7, r7, #16\n\t"
  30996. "mul r6, r7, r6\n\t"
  30997. "lsr r7, r6, #16\n\t"
  30998. "lsl r6, r6, #16\n\t"
  30999. "adds r4, r4, r6\n\t"
  31000. "adc r5, r5, r7\n\t"
  31001. #else
  31002. "umlal r4, r5, %[b], r8\n\t"
  31003. #endif
  31004. "stm %[r]!, {r4}\n\t"
  31005. "mov r3, #0\n\t"
  31006. /* A[68] * B */
  31007. "ldm %[a]!, {r8}\n\t"
  31008. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  31009. "lsl r6, %[b], #16\n\t"
  31010. "lsl r7, r8, #16\n\t"
  31011. "lsr r6, r6, #16\n\t"
  31012. "lsr r7, r7, #16\n\t"
  31013. "mul r7, r6, r7\n\t"
  31014. "adds r5, r5, r7\n\t"
  31015. "adc r3, r3, #0\n\t"
  31016. "lsr r7, r8, #16\n\t"
  31017. "mul r6, r7, r6\n\t"
  31018. "lsr r7, r6, #16\n\t"
  31019. "lsl r6, r6, #16\n\t"
  31020. "adds r5, r5, r6\n\t"
  31021. "adc r3, r3, r7\n\t"
  31022. "lsr r6, %[b], #16\n\t"
  31023. "lsr r7, r8, #16\n\t"
  31024. "mul r7, r6, r7\n\t"
  31025. "add r3, r3, r7\n\t"
  31026. "lsl r7, r8, #16\n\t"
  31027. "lsr r7, r7, #16\n\t"
  31028. "mul r6, r7, r6\n\t"
  31029. "lsr r7, r6, #16\n\t"
  31030. "lsl r6, r6, #16\n\t"
  31031. "adds r5, r5, r6\n\t"
  31032. "adc r3, r3, r7\n\t"
  31033. #else
  31034. "umlal r5, r3, %[b], r8\n\t"
  31035. #endif
  31036. "stm %[r]!, {r5}\n\t"
  31037. "mov r4, #0\n\t"
  31038. /* A[69] * B */
  31039. "ldm %[a]!, {r8}\n\t"
  31040. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  31041. "lsl r6, %[b], #16\n\t"
  31042. "lsl r7, r8, #16\n\t"
  31043. "lsr r6, r6, #16\n\t"
  31044. "lsr r7, r7, #16\n\t"
  31045. "mul r7, r6, r7\n\t"
  31046. "adds r3, r3, r7\n\t"
  31047. "adc r4, r4, #0\n\t"
  31048. "lsr r7, r8, #16\n\t"
  31049. "mul r6, r7, r6\n\t"
  31050. "lsr r7, r6, #16\n\t"
  31051. "lsl r6, r6, #16\n\t"
  31052. "adds r3, r3, r6\n\t"
  31053. "adc r4, r4, r7\n\t"
  31054. "lsr r6, %[b], #16\n\t"
  31055. "lsr r7, r8, #16\n\t"
  31056. "mul r7, r6, r7\n\t"
  31057. "add r4, r4, r7\n\t"
  31058. "lsl r7, r8, #16\n\t"
  31059. "lsr r7, r7, #16\n\t"
  31060. "mul r6, r7, r6\n\t"
  31061. "lsr r7, r6, #16\n\t"
  31062. "lsl r6, r6, #16\n\t"
  31063. "adds r3, r3, r6\n\t"
  31064. "adc r4, r4, r7\n\t"
  31065. #else
  31066. "umlal r3, r4, %[b], r8\n\t"
  31067. #endif
  31068. "stm %[r]!, {r3}\n\t"
  31069. "mov r5, #0\n\t"
  31070. /* A[70] * B */
  31071. "ldm %[a]!, {r8}\n\t"
  31072. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  31073. "lsl r6, %[b], #16\n\t"
  31074. "lsl r7, r8, #16\n\t"
  31075. "lsr r6, r6, #16\n\t"
  31076. "lsr r7, r7, #16\n\t"
  31077. "mul r7, r6, r7\n\t"
  31078. "adds r4, r4, r7\n\t"
  31079. "adc r5, r5, #0\n\t"
  31080. "lsr r7, r8, #16\n\t"
  31081. "mul r6, r7, r6\n\t"
  31082. "lsr r7, r6, #16\n\t"
  31083. "lsl r6, r6, #16\n\t"
  31084. "adds r4, r4, r6\n\t"
  31085. "adc r5, r5, r7\n\t"
  31086. "lsr r6, %[b], #16\n\t"
  31087. "lsr r7, r8, #16\n\t"
  31088. "mul r7, r6, r7\n\t"
  31089. "add r5, r5, r7\n\t"
  31090. "lsl r7, r8, #16\n\t"
  31091. "lsr r7, r7, #16\n\t"
  31092. "mul r6, r7, r6\n\t"
  31093. "lsr r7, r6, #16\n\t"
  31094. "lsl r6, r6, #16\n\t"
  31095. "adds r4, r4, r6\n\t"
  31096. "adc r5, r5, r7\n\t"
  31097. #else
  31098. "umlal r4, r5, %[b], r8\n\t"
  31099. #endif
  31100. "stm %[r]!, {r4}\n\t"
  31101. "mov r3, #0\n\t"
  31102. /* A[71] * B */
  31103. "ldm %[a]!, {r8}\n\t"
  31104. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  31105. "lsl r6, %[b], #16\n\t"
  31106. "lsl r7, r8, #16\n\t"
  31107. "lsr r6, r6, #16\n\t"
  31108. "lsr r7, r7, #16\n\t"
  31109. "mul r7, r6, r7\n\t"
  31110. "adds r5, r5, r7\n\t"
  31111. "adc r3, r3, #0\n\t"
  31112. "lsr r7, r8, #16\n\t"
  31113. "mul r6, r7, r6\n\t"
  31114. "lsr r7, r6, #16\n\t"
  31115. "lsl r6, r6, #16\n\t"
  31116. "adds r5, r5, r6\n\t"
  31117. "adc r3, r3, r7\n\t"
  31118. "lsr r6, %[b], #16\n\t"
  31119. "lsr r7, r8, #16\n\t"
  31120. "mul r7, r6, r7\n\t"
  31121. "add r3, r3, r7\n\t"
  31122. "lsl r7, r8, #16\n\t"
  31123. "lsr r7, r7, #16\n\t"
  31124. "mul r6, r7, r6\n\t"
  31125. "lsr r7, r6, #16\n\t"
  31126. "lsl r6, r6, #16\n\t"
  31127. "adds r5, r5, r6\n\t"
  31128. "adc r3, r3, r7\n\t"
  31129. #else
  31130. "umlal r5, r3, %[b], r8\n\t"
  31131. #endif
  31132. "stm %[r]!, {r5}\n\t"
  31133. "mov r4, #0\n\t"
  31134. /* A[72] * B */
  31135. "ldm %[a]!, {r8}\n\t"
  31136. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  31137. "lsl r6, %[b], #16\n\t"
  31138. "lsl r7, r8, #16\n\t"
  31139. "lsr r6, r6, #16\n\t"
  31140. "lsr r7, r7, #16\n\t"
  31141. "mul r7, r6, r7\n\t"
  31142. "adds r3, r3, r7\n\t"
  31143. "adc r4, r4, #0\n\t"
  31144. "lsr r7, r8, #16\n\t"
  31145. "mul r6, r7, r6\n\t"
  31146. "lsr r7, r6, #16\n\t"
  31147. "lsl r6, r6, #16\n\t"
  31148. "adds r3, r3, r6\n\t"
  31149. "adc r4, r4, r7\n\t"
  31150. "lsr r6, %[b], #16\n\t"
  31151. "lsr r7, r8, #16\n\t"
  31152. "mul r7, r6, r7\n\t"
  31153. "add r4, r4, r7\n\t"
  31154. "lsl r7, r8, #16\n\t"
  31155. "lsr r7, r7, #16\n\t"
  31156. "mul r6, r7, r6\n\t"
  31157. "lsr r7, r6, #16\n\t"
  31158. "lsl r6, r6, #16\n\t"
  31159. "adds r3, r3, r6\n\t"
  31160. "adc r4, r4, r7\n\t"
  31161. #else
  31162. "umlal r3, r4, %[b], r8\n\t"
  31163. #endif
  31164. "stm %[r]!, {r3}\n\t"
  31165. "mov r5, #0\n\t"
  31166. /* A[73] * B */
  31167. "ldm %[a]!, {r8}\n\t"
  31168. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  31169. "lsl r6, %[b], #16\n\t"
  31170. "lsl r7, r8, #16\n\t"
  31171. "lsr r6, r6, #16\n\t"
  31172. "lsr r7, r7, #16\n\t"
  31173. "mul r7, r6, r7\n\t"
  31174. "adds r4, r4, r7\n\t"
  31175. "adc r5, r5, #0\n\t"
  31176. "lsr r7, r8, #16\n\t"
  31177. "mul r6, r7, r6\n\t"
  31178. "lsr r7, r6, #16\n\t"
  31179. "lsl r6, r6, #16\n\t"
  31180. "adds r4, r4, r6\n\t"
  31181. "adc r5, r5, r7\n\t"
  31182. "lsr r6, %[b], #16\n\t"
  31183. "lsr r7, r8, #16\n\t"
  31184. "mul r7, r6, r7\n\t"
  31185. "add r5, r5, r7\n\t"
  31186. "lsl r7, r8, #16\n\t"
  31187. "lsr r7, r7, #16\n\t"
  31188. "mul r6, r7, r6\n\t"
  31189. "lsr r7, r6, #16\n\t"
  31190. "lsl r6, r6, #16\n\t"
  31191. "adds r4, r4, r6\n\t"
  31192. "adc r5, r5, r7\n\t"
  31193. #else
  31194. "umlal r4, r5, %[b], r8\n\t"
  31195. #endif
  31196. "stm %[r]!, {r4}\n\t"
  31197. "mov r3, #0\n\t"
  31198. /* A[74] * B */
  31199. "ldm %[a]!, {r8}\n\t"
  31200. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  31201. "lsl r6, %[b], #16\n\t"
  31202. "lsl r7, r8, #16\n\t"
  31203. "lsr r6, r6, #16\n\t"
  31204. "lsr r7, r7, #16\n\t"
  31205. "mul r7, r6, r7\n\t"
  31206. "adds r5, r5, r7\n\t"
  31207. "adc r3, r3, #0\n\t"
  31208. "lsr r7, r8, #16\n\t"
  31209. "mul r6, r7, r6\n\t"
  31210. "lsr r7, r6, #16\n\t"
  31211. "lsl r6, r6, #16\n\t"
  31212. "adds r5, r5, r6\n\t"
  31213. "adc r3, r3, r7\n\t"
  31214. "lsr r6, %[b], #16\n\t"
  31215. "lsr r7, r8, #16\n\t"
  31216. "mul r7, r6, r7\n\t"
  31217. "add r3, r3, r7\n\t"
  31218. "lsl r7, r8, #16\n\t"
  31219. "lsr r7, r7, #16\n\t"
  31220. "mul r6, r7, r6\n\t"
  31221. "lsr r7, r6, #16\n\t"
  31222. "lsl r6, r6, #16\n\t"
  31223. "adds r5, r5, r6\n\t"
  31224. "adc r3, r3, r7\n\t"
  31225. #else
  31226. "umlal r5, r3, %[b], r8\n\t"
  31227. #endif
  31228. "stm %[r]!, {r5}\n\t"
  31229. "mov r4, #0\n\t"
  31230. /* A[75] * B */
  31231. "ldm %[a]!, {r8}\n\t"
  31232. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  31233. "lsl r6, %[b], #16\n\t"
  31234. "lsl r7, r8, #16\n\t"
  31235. "lsr r6, r6, #16\n\t"
  31236. "lsr r7, r7, #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. "lsr r7, r8, #16\n\t"
  31241. "mul r6, r7, r6\n\t"
  31242. "lsr r7, r6, #16\n\t"
  31243. "lsl r6, r6, #16\n\t"
  31244. "adds r3, r3, r6\n\t"
  31245. "adc r4, r4, r7\n\t"
  31246. "lsr r6, %[b], #16\n\t"
  31247. "lsr r7, r8, #16\n\t"
  31248. "mul r7, r6, r7\n\t"
  31249. "add r4, r4, r7\n\t"
  31250. "lsl r7, r8, #16\n\t"
  31251. "lsr r7, r7, #16\n\t"
  31252. "mul r6, r7, r6\n\t"
  31253. "lsr r7, r6, #16\n\t"
  31254. "lsl r6, r6, #16\n\t"
  31255. "adds r3, r3, r6\n\t"
  31256. "adc r4, r4, r7\n\t"
  31257. #else
  31258. "umlal r3, r4, %[b], r8\n\t"
  31259. #endif
  31260. "stm %[r]!, {r3}\n\t"
  31261. "mov r5, #0\n\t"
  31262. /* A[76] * B */
  31263. "ldm %[a]!, {r8}\n\t"
  31264. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  31265. "lsl r6, %[b], #16\n\t"
  31266. "lsl r7, r8, #16\n\t"
  31267. "lsr r6, r6, #16\n\t"
  31268. "lsr r7, r7, #16\n\t"
  31269. "mul r7, r6, r7\n\t"
  31270. "adds r4, r4, r7\n\t"
  31271. "adc r5, r5, #0\n\t"
  31272. "lsr r7, r8, #16\n\t"
  31273. "mul r6, r7, r6\n\t"
  31274. "lsr r7, r6, #16\n\t"
  31275. "lsl r6, r6, #16\n\t"
  31276. "adds r4, r4, r6\n\t"
  31277. "adc r5, r5, r7\n\t"
  31278. "lsr r6, %[b], #16\n\t"
  31279. "lsr r7, r8, #16\n\t"
  31280. "mul r7, r6, r7\n\t"
  31281. "add r5, r5, r7\n\t"
  31282. "lsl r7, r8, #16\n\t"
  31283. "lsr r7, r7, #16\n\t"
  31284. "mul r6, r7, r6\n\t"
  31285. "lsr r7, r6, #16\n\t"
  31286. "lsl r6, r6, #16\n\t"
  31287. "adds r4, r4, r6\n\t"
  31288. "adc r5, r5, r7\n\t"
  31289. #else
  31290. "umlal r4, r5, %[b], r8\n\t"
  31291. #endif
  31292. "stm %[r]!, {r4}\n\t"
  31293. "mov r3, #0\n\t"
  31294. /* A[77] * B */
  31295. "ldm %[a]!, {r8}\n\t"
  31296. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  31297. "lsl r6, %[b], #16\n\t"
  31298. "lsl r7, r8, #16\n\t"
  31299. "lsr r6, r6, #16\n\t"
  31300. "lsr r7, r7, #16\n\t"
  31301. "mul r7, r6, r7\n\t"
  31302. "adds r5, r5, r7\n\t"
  31303. "adc r3, r3, #0\n\t"
  31304. "lsr r7, r8, #16\n\t"
  31305. "mul r6, r7, r6\n\t"
  31306. "lsr r7, r6, #16\n\t"
  31307. "lsl r6, r6, #16\n\t"
  31308. "adds r5, r5, r6\n\t"
  31309. "adc r3, r3, r7\n\t"
  31310. "lsr r6, %[b], #16\n\t"
  31311. "lsr r7, r8, #16\n\t"
  31312. "mul r7, r6, r7\n\t"
  31313. "add r3, r3, r7\n\t"
  31314. "lsl r7, r8, #16\n\t"
  31315. "lsr r7, r7, #16\n\t"
  31316. "mul r6, r7, r6\n\t"
  31317. "lsr r7, r6, #16\n\t"
  31318. "lsl r6, r6, #16\n\t"
  31319. "adds r5, r5, r6\n\t"
  31320. "adc r3, r3, r7\n\t"
  31321. #else
  31322. "umlal r5, r3, %[b], r8\n\t"
  31323. #endif
  31324. "stm %[r]!, {r5}\n\t"
  31325. "mov r4, #0\n\t"
  31326. /* A[78] * B */
  31327. "ldm %[a]!, {r8}\n\t"
  31328. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  31329. "lsl r6, %[b], #16\n\t"
  31330. "lsl r7, r8, #16\n\t"
  31331. "lsr r6, r6, #16\n\t"
  31332. "lsr r7, r7, #16\n\t"
  31333. "mul r7, r6, r7\n\t"
  31334. "adds r3, r3, r7\n\t"
  31335. "adc r4, r4, #0\n\t"
  31336. "lsr r7, r8, #16\n\t"
  31337. "mul r6, r7, r6\n\t"
  31338. "lsr r7, r6, #16\n\t"
  31339. "lsl r6, r6, #16\n\t"
  31340. "adds r3, r3, r6\n\t"
  31341. "adc r4, r4, r7\n\t"
  31342. "lsr r6, %[b], #16\n\t"
  31343. "lsr r7, r8, #16\n\t"
  31344. "mul r7, r6, r7\n\t"
  31345. "add r4, r4, r7\n\t"
  31346. "lsl r7, r8, #16\n\t"
  31347. "lsr r7, r7, #16\n\t"
  31348. "mul r6, r7, r6\n\t"
  31349. "lsr r7, r6, #16\n\t"
  31350. "lsl r6, r6, #16\n\t"
  31351. "adds r3, r3, r6\n\t"
  31352. "adc r4, r4, r7\n\t"
  31353. #else
  31354. "umlal r3, r4, %[b], r8\n\t"
  31355. #endif
  31356. "stm %[r]!, {r3}\n\t"
  31357. "mov r5, #0\n\t"
  31358. /* A[79] * B */
  31359. "ldm %[a]!, {r8}\n\t"
  31360. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  31361. "lsl r6, %[b], #16\n\t"
  31362. "lsl r7, r8, #16\n\t"
  31363. "lsr r6, r6, #16\n\t"
  31364. "lsr r7, r7, #16\n\t"
  31365. "mul r7, r6, r7\n\t"
  31366. "adds r4, r4, r7\n\t"
  31367. "adc r5, r5, #0\n\t"
  31368. "lsr r7, r8, #16\n\t"
  31369. "mul r6, r7, r6\n\t"
  31370. "lsr r7, r6, #16\n\t"
  31371. "lsl r6, r6, #16\n\t"
  31372. "adds r4, r4, r6\n\t"
  31373. "adc r5, r5, r7\n\t"
  31374. "lsr r6, %[b], #16\n\t"
  31375. "lsr r7, r8, #16\n\t"
  31376. "mul r7, r6, r7\n\t"
  31377. "add r5, r5, r7\n\t"
  31378. "lsl r7, r8, #16\n\t"
  31379. "lsr r7, r7, #16\n\t"
  31380. "mul r6, r7, r6\n\t"
  31381. "lsr r7, r6, #16\n\t"
  31382. "lsl r6, r6, #16\n\t"
  31383. "adds r4, r4, r6\n\t"
  31384. "adc r5, r5, r7\n\t"
  31385. #else
  31386. "umlal r4, r5, %[b], r8\n\t"
  31387. #endif
  31388. "stm %[r]!, {r4}\n\t"
  31389. "mov r3, #0\n\t"
  31390. /* A[80] * B */
  31391. "ldm %[a]!, {r8}\n\t"
  31392. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  31393. "lsl r6, %[b], #16\n\t"
  31394. "lsl r7, r8, #16\n\t"
  31395. "lsr r6, r6, #16\n\t"
  31396. "lsr r7, r7, #16\n\t"
  31397. "mul r7, r6, r7\n\t"
  31398. "adds r5, r5, r7\n\t"
  31399. "adc r3, r3, #0\n\t"
  31400. "lsr r7, r8, #16\n\t"
  31401. "mul r6, r7, r6\n\t"
  31402. "lsr r7, r6, #16\n\t"
  31403. "lsl r6, r6, #16\n\t"
  31404. "adds r5, r5, r6\n\t"
  31405. "adc r3, r3, r7\n\t"
  31406. "lsr r6, %[b], #16\n\t"
  31407. "lsr r7, r8, #16\n\t"
  31408. "mul r7, r6, r7\n\t"
  31409. "add r3, r3, r7\n\t"
  31410. "lsl r7, r8, #16\n\t"
  31411. "lsr r7, r7, #16\n\t"
  31412. "mul r6, r7, r6\n\t"
  31413. "lsr r7, r6, #16\n\t"
  31414. "lsl r6, r6, #16\n\t"
  31415. "adds r5, r5, r6\n\t"
  31416. "adc r3, r3, r7\n\t"
  31417. #else
  31418. "umlal r5, r3, %[b], r8\n\t"
  31419. #endif
  31420. "stm %[r]!, {r5}\n\t"
  31421. "mov r4, #0\n\t"
  31422. /* A[81] * B */
  31423. "ldm %[a]!, {r8}\n\t"
  31424. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  31425. "lsl r6, %[b], #16\n\t"
  31426. "lsl r7, r8, #16\n\t"
  31427. "lsr r6, r6, #16\n\t"
  31428. "lsr r7, r7, #16\n\t"
  31429. "mul r7, r6, r7\n\t"
  31430. "adds r3, r3, r7\n\t"
  31431. "adc r4, r4, #0\n\t"
  31432. "lsr r7, r8, #16\n\t"
  31433. "mul r6, r7, r6\n\t"
  31434. "lsr r7, r6, #16\n\t"
  31435. "lsl r6, r6, #16\n\t"
  31436. "adds r3, r3, r6\n\t"
  31437. "adc r4, r4, r7\n\t"
  31438. "lsr r6, %[b], #16\n\t"
  31439. "lsr r7, r8, #16\n\t"
  31440. "mul r7, r6, r7\n\t"
  31441. "add r4, r4, r7\n\t"
  31442. "lsl r7, r8, #16\n\t"
  31443. "lsr r7, r7, #16\n\t"
  31444. "mul r6, r7, r6\n\t"
  31445. "lsr r7, r6, #16\n\t"
  31446. "lsl r6, r6, #16\n\t"
  31447. "adds r3, r3, r6\n\t"
  31448. "adc r4, r4, r7\n\t"
  31449. #else
  31450. "umlal r3, r4, %[b], r8\n\t"
  31451. #endif
  31452. "stm %[r]!, {r3}\n\t"
  31453. "mov r5, #0\n\t"
  31454. /* A[82] * B */
  31455. "ldm %[a]!, {r8}\n\t"
  31456. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  31457. "lsl r6, %[b], #16\n\t"
  31458. "lsl r7, r8, #16\n\t"
  31459. "lsr r6, r6, #16\n\t"
  31460. "lsr r7, r7, #16\n\t"
  31461. "mul r7, r6, r7\n\t"
  31462. "adds r4, r4, r7\n\t"
  31463. "adc r5, r5, #0\n\t"
  31464. "lsr r7, r8, #16\n\t"
  31465. "mul r6, r7, r6\n\t"
  31466. "lsr r7, r6, #16\n\t"
  31467. "lsl r6, r6, #16\n\t"
  31468. "adds r4, r4, r6\n\t"
  31469. "adc r5, r5, r7\n\t"
  31470. "lsr r6, %[b], #16\n\t"
  31471. "lsr r7, r8, #16\n\t"
  31472. "mul r7, r6, r7\n\t"
  31473. "add r5, r5, r7\n\t"
  31474. "lsl r7, r8, #16\n\t"
  31475. "lsr r7, r7, #16\n\t"
  31476. "mul r6, r7, r6\n\t"
  31477. "lsr r7, r6, #16\n\t"
  31478. "lsl r6, r6, #16\n\t"
  31479. "adds r4, r4, r6\n\t"
  31480. "adc r5, r5, r7\n\t"
  31481. #else
  31482. "umlal r4, r5, %[b], r8\n\t"
  31483. #endif
  31484. "stm %[r]!, {r4}\n\t"
  31485. "mov r3, #0\n\t"
  31486. /* A[83] * B */
  31487. "ldm %[a]!, {r8}\n\t"
  31488. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  31489. "lsl r6, %[b], #16\n\t"
  31490. "lsl r7, r8, #16\n\t"
  31491. "lsr r6, r6, #16\n\t"
  31492. "lsr r7, r7, #16\n\t"
  31493. "mul r7, r6, r7\n\t"
  31494. "adds r5, r5, r7\n\t"
  31495. "adc r3, r3, #0\n\t"
  31496. "lsr r7, r8, #16\n\t"
  31497. "mul r6, r7, r6\n\t"
  31498. "lsr r7, r6, #16\n\t"
  31499. "lsl r6, r6, #16\n\t"
  31500. "adds r5, r5, r6\n\t"
  31501. "adc r3, r3, r7\n\t"
  31502. "lsr r6, %[b], #16\n\t"
  31503. "lsr r7, r8, #16\n\t"
  31504. "mul r7, r6, r7\n\t"
  31505. "add r3, r3, r7\n\t"
  31506. "lsl r7, r8, #16\n\t"
  31507. "lsr r7, r7, #16\n\t"
  31508. "mul r6, r7, r6\n\t"
  31509. "lsr r7, r6, #16\n\t"
  31510. "lsl r6, r6, #16\n\t"
  31511. "adds r5, r5, r6\n\t"
  31512. "adc r3, r3, r7\n\t"
  31513. #else
  31514. "umlal r5, r3, %[b], r8\n\t"
  31515. #endif
  31516. "stm %[r]!, {r5}\n\t"
  31517. "mov r4, #0\n\t"
  31518. /* A[84] * B */
  31519. "ldm %[a]!, {r8}\n\t"
  31520. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  31521. "lsl r6, %[b], #16\n\t"
  31522. "lsl r7, r8, #16\n\t"
  31523. "lsr r6, r6, #16\n\t"
  31524. "lsr r7, r7, #16\n\t"
  31525. "mul r7, r6, r7\n\t"
  31526. "adds r3, r3, r7\n\t"
  31527. "adc r4, r4, #0\n\t"
  31528. "lsr r7, r8, #16\n\t"
  31529. "mul r6, r7, r6\n\t"
  31530. "lsr r7, r6, #16\n\t"
  31531. "lsl r6, r6, #16\n\t"
  31532. "adds r3, r3, r6\n\t"
  31533. "adc r4, r4, r7\n\t"
  31534. "lsr r6, %[b], #16\n\t"
  31535. "lsr r7, r8, #16\n\t"
  31536. "mul r7, r6, r7\n\t"
  31537. "add r4, r4, r7\n\t"
  31538. "lsl r7, r8, #16\n\t"
  31539. "lsr r7, r7, #16\n\t"
  31540. "mul r6, r7, r6\n\t"
  31541. "lsr r7, r6, #16\n\t"
  31542. "lsl r6, r6, #16\n\t"
  31543. "adds r3, r3, r6\n\t"
  31544. "adc r4, r4, r7\n\t"
  31545. #else
  31546. "umlal r3, r4, %[b], r8\n\t"
  31547. #endif
  31548. "stm %[r]!, {r3}\n\t"
  31549. "mov r5, #0\n\t"
  31550. /* A[85] * B */
  31551. "ldm %[a]!, {r8}\n\t"
  31552. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  31553. "lsl r6, %[b], #16\n\t"
  31554. "lsl r7, r8, #16\n\t"
  31555. "lsr r6, r6, #16\n\t"
  31556. "lsr r7, r7, #16\n\t"
  31557. "mul r7, r6, r7\n\t"
  31558. "adds r4, r4, r7\n\t"
  31559. "adc r5, r5, #0\n\t"
  31560. "lsr r7, r8, #16\n\t"
  31561. "mul r6, r7, r6\n\t"
  31562. "lsr r7, r6, #16\n\t"
  31563. "lsl r6, r6, #16\n\t"
  31564. "adds r4, r4, r6\n\t"
  31565. "adc r5, r5, r7\n\t"
  31566. "lsr r6, %[b], #16\n\t"
  31567. "lsr r7, r8, #16\n\t"
  31568. "mul r7, r6, r7\n\t"
  31569. "add r5, r5, r7\n\t"
  31570. "lsl r7, r8, #16\n\t"
  31571. "lsr r7, r7, #16\n\t"
  31572. "mul r6, r7, r6\n\t"
  31573. "lsr r7, r6, #16\n\t"
  31574. "lsl r6, r6, #16\n\t"
  31575. "adds r4, r4, r6\n\t"
  31576. "adc r5, r5, r7\n\t"
  31577. #else
  31578. "umlal r4, r5, %[b], r8\n\t"
  31579. #endif
  31580. "stm %[r]!, {r4}\n\t"
  31581. "mov r3, #0\n\t"
  31582. /* A[86] * B */
  31583. "ldm %[a]!, {r8}\n\t"
  31584. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  31585. "lsl r6, %[b], #16\n\t"
  31586. "lsl r7, r8, #16\n\t"
  31587. "lsr r6, r6, #16\n\t"
  31588. "lsr r7, r7, #16\n\t"
  31589. "mul r7, r6, r7\n\t"
  31590. "adds r5, r5, r7\n\t"
  31591. "adc r3, r3, #0\n\t"
  31592. "lsr r7, r8, #16\n\t"
  31593. "mul r6, r7, r6\n\t"
  31594. "lsr r7, r6, #16\n\t"
  31595. "lsl r6, r6, #16\n\t"
  31596. "adds r5, r5, r6\n\t"
  31597. "adc r3, r3, r7\n\t"
  31598. "lsr r6, %[b], #16\n\t"
  31599. "lsr r7, r8, #16\n\t"
  31600. "mul r7, r6, r7\n\t"
  31601. "add r3, r3, r7\n\t"
  31602. "lsl r7, r8, #16\n\t"
  31603. "lsr r7, r7, #16\n\t"
  31604. "mul r6, r7, r6\n\t"
  31605. "lsr r7, r6, #16\n\t"
  31606. "lsl r6, r6, #16\n\t"
  31607. "adds r5, r5, r6\n\t"
  31608. "adc r3, r3, r7\n\t"
  31609. #else
  31610. "umlal r5, r3, %[b], r8\n\t"
  31611. #endif
  31612. "stm %[r]!, {r5}\n\t"
  31613. "mov r4, #0\n\t"
  31614. /* A[87] * B */
  31615. "ldm %[a]!, {r8}\n\t"
  31616. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  31617. "lsl r6, %[b], #16\n\t"
  31618. "lsl r7, r8, #16\n\t"
  31619. "lsr r6, r6, #16\n\t"
  31620. "lsr r7, r7, #16\n\t"
  31621. "mul r7, r6, r7\n\t"
  31622. "adds r3, r3, r7\n\t"
  31623. "adc r4, r4, #0\n\t"
  31624. "lsr r7, r8, #16\n\t"
  31625. "mul r6, r7, r6\n\t"
  31626. "lsr r7, r6, #16\n\t"
  31627. "lsl r6, r6, #16\n\t"
  31628. "adds r3, r3, r6\n\t"
  31629. "adc r4, r4, r7\n\t"
  31630. "lsr r6, %[b], #16\n\t"
  31631. "lsr r7, r8, #16\n\t"
  31632. "mul r7, r6, r7\n\t"
  31633. "add r4, r4, r7\n\t"
  31634. "lsl r7, r8, #16\n\t"
  31635. "lsr r7, r7, #16\n\t"
  31636. "mul r6, r7, r6\n\t"
  31637. "lsr r7, r6, #16\n\t"
  31638. "lsl r6, r6, #16\n\t"
  31639. "adds r3, r3, r6\n\t"
  31640. "adc r4, r4, r7\n\t"
  31641. #else
  31642. "umlal r3, r4, %[b], r8\n\t"
  31643. #endif
  31644. "stm %[r]!, {r3}\n\t"
  31645. "mov r5, #0\n\t"
  31646. /* A[88] * B */
  31647. "ldm %[a]!, {r8}\n\t"
  31648. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  31649. "lsl r6, %[b], #16\n\t"
  31650. "lsl r7, r8, #16\n\t"
  31651. "lsr r6, r6, #16\n\t"
  31652. "lsr r7, r7, #16\n\t"
  31653. "mul r7, r6, r7\n\t"
  31654. "adds r4, r4, r7\n\t"
  31655. "adc r5, r5, #0\n\t"
  31656. "lsr r7, r8, #16\n\t"
  31657. "mul r6, r7, r6\n\t"
  31658. "lsr r7, r6, #16\n\t"
  31659. "lsl r6, r6, #16\n\t"
  31660. "adds r4, r4, r6\n\t"
  31661. "adc r5, r5, r7\n\t"
  31662. "lsr r6, %[b], #16\n\t"
  31663. "lsr r7, r8, #16\n\t"
  31664. "mul r7, r6, r7\n\t"
  31665. "add r5, r5, r7\n\t"
  31666. "lsl r7, r8, #16\n\t"
  31667. "lsr r7, r7, #16\n\t"
  31668. "mul r6, r7, r6\n\t"
  31669. "lsr r7, r6, #16\n\t"
  31670. "lsl r6, r6, #16\n\t"
  31671. "adds r4, r4, r6\n\t"
  31672. "adc r5, r5, r7\n\t"
  31673. #else
  31674. "umlal r4, r5, %[b], r8\n\t"
  31675. #endif
  31676. "stm %[r]!, {r4}\n\t"
  31677. "mov r3, #0\n\t"
  31678. /* A[89] * B */
  31679. "ldm %[a]!, {r8}\n\t"
  31680. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  31681. "lsl r6, %[b], #16\n\t"
  31682. "lsl r7, r8, #16\n\t"
  31683. "lsr r6, r6, #16\n\t"
  31684. "lsr r7, r7, #16\n\t"
  31685. "mul r7, r6, r7\n\t"
  31686. "adds r5, r5, r7\n\t"
  31687. "adc r3, r3, #0\n\t"
  31688. "lsr r7, r8, #16\n\t"
  31689. "mul r6, r7, r6\n\t"
  31690. "lsr r7, r6, #16\n\t"
  31691. "lsl r6, r6, #16\n\t"
  31692. "adds r5, r5, r6\n\t"
  31693. "adc r3, r3, r7\n\t"
  31694. "lsr r6, %[b], #16\n\t"
  31695. "lsr r7, r8, #16\n\t"
  31696. "mul r7, r6, r7\n\t"
  31697. "add r3, r3, r7\n\t"
  31698. "lsl r7, r8, #16\n\t"
  31699. "lsr r7, r7, #16\n\t"
  31700. "mul r6, r7, r6\n\t"
  31701. "lsr r7, r6, #16\n\t"
  31702. "lsl r6, r6, #16\n\t"
  31703. "adds r5, r5, r6\n\t"
  31704. "adc r3, r3, r7\n\t"
  31705. #else
  31706. "umlal r5, r3, %[b], r8\n\t"
  31707. #endif
  31708. "stm %[r]!, {r5}\n\t"
  31709. "mov r4, #0\n\t"
  31710. /* A[90] * B */
  31711. "ldm %[a]!, {r8}\n\t"
  31712. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  31713. "lsl r6, %[b], #16\n\t"
  31714. "lsl r7, r8, #16\n\t"
  31715. "lsr r6, r6, #16\n\t"
  31716. "lsr r7, r7, #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. "lsr r7, r8, #16\n\t"
  31721. "mul r6, r7, r6\n\t"
  31722. "lsr r7, r6, #16\n\t"
  31723. "lsl r6, r6, #16\n\t"
  31724. "adds r3, r3, r6\n\t"
  31725. "adc r4, r4, r7\n\t"
  31726. "lsr r6, %[b], #16\n\t"
  31727. "lsr r7, r8, #16\n\t"
  31728. "mul r7, r6, r7\n\t"
  31729. "add r4, r4, r7\n\t"
  31730. "lsl r7, r8, #16\n\t"
  31731. "lsr r7, r7, #16\n\t"
  31732. "mul r6, r7, r6\n\t"
  31733. "lsr r7, r6, #16\n\t"
  31734. "lsl r6, r6, #16\n\t"
  31735. "adds r3, r3, r6\n\t"
  31736. "adc r4, r4, r7\n\t"
  31737. #else
  31738. "umlal r3, r4, %[b], r8\n\t"
  31739. #endif
  31740. "stm %[r]!, {r3}\n\t"
  31741. "mov r5, #0\n\t"
  31742. /* A[91] * B */
  31743. "ldm %[a]!, {r8}\n\t"
  31744. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  31745. "lsl r6, %[b], #16\n\t"
  31746. "lsl r7, r8, #16\n\t"
  31747. "lsr r6, r6, #16\n\t"
  31748. "lsr r7, r7, #16\n\t"
  31749. "mul r7, r6, r7\n\t"
  31750. "adds r4, r4, r7\n\t"
  31751. "adc r5, r5, #0\n\t"
  31752. "lsr r7, r8, #16\n\t"
  31753. "mul r6, r7, r6\n\t"
  31754. "lsr r7, r6, #16\n\t"
  31755. "lsl r6, r6, #16\n\t"
  31756. "adds r4, r4, r6\n\t"
  31757. "adc r5, r5, r7\n\t"
  31758. "lsr r6, %[b], #16\n\t"
  31759. "lsr r7, r8, #16\n\t"
  31760. "mul r7, r6, r7\n\t"
  31761. "add r5, r5, r7\n\t"
  31762. "lsl r7, r8, #16\n\t"
  31763. "lsr r7, r7, #16\n\t"
  31764. "mul r6, r7, r6\n\t"
  31765. "lsr r7, r6, #16\n\t"
  31766. "lsl r6, r6, #16\n\t"
  31767. "adds r4, r4, r6\n\t"
  31768. "adc r5, r5, r7\n\t"
  31769. #else
  31770. "umlal r4, r5, %[b], r8\n\t"
  31771. #endif
  31772. "stm %[r]!, {r4}\n\t"
  31773. "mov r3, #0\n\t"
  31774. /* A[92] * B */
  31775. "ldm %[a]!, {r8}\n\t"
  31776. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  31777. "lsl r6, %[b], #16\n\t"
  31778. "lsl r7, r8, #16\n\t"
  31779. "lsr r6, r6, #16\n\t"
  31780. "lsr r7, r7, #16\n\t"
  31781. "mul r7, r6, r7\n\t"
  31782. "adds r5, r5, r7\n\t"
  31783. "adc r3, r3, #0\n\t"
  31784. "lsr r7, r8, #16\n\t"
  31785. "mul r6, r7, r6\n\t"
  31786. "lsr r7, r6, #16\n\t"
  31787. "lsl r6, r6, #16\n\t"
  31788. "adds r5, r5, r6\n\t"
  31789. "adc r3, r3, r7\n\t"
  31790. "lsr r6, %[b], #16\n\t"
  31791. "lsr r7, r8, #16\n\t"
  31792. "mul r7, r6, r7\n\t"
  31793. "add r3, r3, r7\n\t"
  31794. "lsl r7, r8, #16\n\t"
  31795. "lsr r7, r7, #16\n\t"
  31796. "mul r6, r7, r6\n\t"
  31797. "lsr r7, r6, #16\n\t"
  31798. "lsl r6, r6, #16\n\t"
  31799. "adds r5, r5, r6\n\t"
  31800. "adc r3, r3, r7\n\t"
  31801. #else
  31802. "umlal r5, r3, %[b], r8\n\t"
  31803. #endif
  31804. "stm %[r]!, {r5}\n\t"
  31805. "mov r4, #0\n\t"
  31806. /* A[93] * B */
  31807. "ldm %[a]!, {r8}\n\t"
  31808. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  31809. "lsl r6, %[b], #16\n\t"
  31810. "lsl r7, r8, #16\n\t"
  31811. "lsr r6, r6, #16\n\t"
  31812. "lsr r7, r7, #16\n\t"
  31813. "mul r7, r6, r7\n\t"
  31814. "adds r3, r3, r7\n\t"
  31815. "adc r4, r4, #0\n\t"
  31816. "lsr r7, r8, #16\n\t"
  31817. "mul r6, r7, r6\n\t"
  31818. "lsr r7, r6, #16\n\t"
  31819. "lsl r6, r6, #16\n\t"
  31820. "adds r3, r3, r6\n\t"
  31821. "adc r4, r4, r7\n\t"
  31822. "lsr r6, %[b], #16\n\t"
  31823. "lsr r7, r8, #16\n\t"
  31824. "mul r7, r6, r7\n\t"
  31825. "add r4, r4, r7\n\t"
  31826. "lsl r7, r8, #16\n\t"
  31827. "lsr r7, r7, #16\n\t"
  31828. "mul r6, r7, r6\n\t"
  31829. "lsr r7, r6, #16\n\t"
  31830. "lsl r6, r6, #16\n\t"
  31831. "adds r3, r3, r6\n\t"
  31832. "adc r4, r4, r7\n\t"
  31833. #else
  31834. "umlal r3, r4, %[b], r8\n\t"
  31835. #endif
  31836. "stm %[r]!, {r3}\n\t"
  31837. "mov r5, #0\n\t"
  31838. /* A[94] * B */
  31839. "ldm %[a]!, {r8}\n\t"
  31840. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  31841. "lsl r6, %[b], #16\n\t"
  31842. "lsl r7, r8, #16\n\t"
  31843. "lsr r6, r6, #16\n\t"
  31844. "lsr r7, r7, #16\n\t"
  31845. "mul r7, r6, r7\n\t"
  31846. "adds r4, r4, r7\n\t"
  31847. "adc r5, r5, #0\n\t"
  31848. "lsr r7, r8, #16\n\t"
  31849. "mul r6, r7, r6\n\t"
  31850. "lsr r7, r6, #16\n\t"
  31851. "lsl r6, r6, #16\n\t"
  31852. "adds r4, r4, r6\n\t"
  31853. "adc r5, r5, r7\n\t"
  31854. "lsr r6, %[b], #16\n\t"
  31855. "lsr r7, r8, #16\n\t"
  31856. "mul r7, r6, r7\n\t"
  31857. "add r5, r5, r7\n\t"
  31858. "lsl r7, r8, #16\n\t"
  31859. "lsr r7, r7, #16\n\t"
  31860. "mul r6, r7, r6\n\t"
  31861. "lsr r7, r6, #16\n\t"
  31862. "lsl r6, r6, #16\n\t"
  31863. "adds r4, r4, r6\n\t"
  31864. "adc r5, r5, r7\n\t"
  31865. #else
  31866. "umlal r4, r5, %[b], r8\n\t"
  31867. #endif
  31868. "stm %[r]!, {r4}\n\t"
  31869. "mov r3, #0\n\t"
  31870. /* A[95] * B */
  31871. "ldm %[a]!, {r8}\n\t"
  31872. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  31873. "lsl r6, %[b], #16\n\t"
  31874. "lsl r7, r8, #16\n\t"
  31875. "lsr r6, r6, #16\n\t"
  31876. "lsr r7, r7, #16\n\t"
  31877. "mul r7, r6, r7\n\t"
  31878. "adds r5, r5, r7\n\t"
  31879. "adc r3, r3, #0\n\t"
  31880. "lsr r7, r8, #16\n\t"
  31881. "mul r6, r7, r6\n\t"
  31882. "lsr r7, r6, #16\n\t"
  31883. "lsl r6, r6, #16\n\t"
  31884. "adds r5, r5, r6\n\t"
  31885. "adc r3, r3, r7\n\t"
  31886. "lsr r6, %[b], #16\n\t"
  31887. "lsr r7, r8, #16\n\t"
  31888. "mul r7, r6, r7\n\t"
  31889. "add r3, r3, r7\n\t"
  31890. "lsl r7, r8, #16\n\t"
  31891. "lsr r7, r7, #16\n\t"
  31892. "mul r6, r7, r6\n\t"
  31893. "lsr r7, r6, #16\n\t"
  31894. "lsl r6, r6, #16\n\t"
  31895. "adds r5, r5, r6\n\t"
  31896. "adc r3, r3, r7\n\t"
  31897. #else
  31898. "umlal r5, r3, %[b], r8\n\t"
  31899. #endif
  31900. "stm %[r]!, {r5}\n\t"
  31901. "str r3, [%[r]]\n\t"
  31902. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  31903. :
  31904. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "cc"
  31905. );
  31906. }
  31907. #endif /* WOLFSSL_SP_SMALL */
  31908. #if (defined(WOLFSSL_HAVE_SP_RSA) && !defined(WOLFSSL_RSA_PUBLIC_ONLY)) || defined(WOLFSSL_HAVE_SP_DH)
  31909. /* r = 2^n mod m where n is the number of bits to reduce by.
  31910. * Given m must be 3072 bits, just need to subtract.
  31911. *
  31912. * r A single precision number.
  31913. * m A single precision number.
  31914. */
  31915. static void sp_3072_mont_norm_48(sp_digit* r, const sp_digit* m)
  31916. {
  31917. XMEMSET(r, 0, sizeof(sp_digit) * 48);
  31918. /* r = 2^n mod m */
  31919. sp_3072_sub_in_place_48(r, m);
  31920. }
  31921. #ifdef WOLFSSL_SP_SMALL
  31922. /* Conditionally subtract b from a using the mask m.
  31923. * m is -1 to subtract and 0 when not copying.
  31924. *
  31925. * r A single precision number representing condition subtract result.
  31926. * a A single precision number to subtract from.
  31927. * b A single precision number to subtract.
  31928. * m Mask value to apply.
  31929. */
  31930. 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)
  31931. {
  31932. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  31933. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  31934. register const sp_digit* b asm ("r2") = (const sp_digit*)b_p;
  31935. register sp_digit m asm ("r3") = (sp_digit)m_p;
  31936. __asm__ __volatile__ (
  31937. "mov r6, #0\n\t"
  31938. "mov r12, #0\n\t"
  31939. "mov lr, #0\n\t"
  31940. "\n"
  31941. "L_sp_3072_cond_sub_48_words_%=: \n\t"
  31942. "subs r12, r6, r12\n\t"
  31943. "ldr r4, [%[a], lr]\n\t"
  31944. "ldr r5, [%[b], lr]\n\t"
  31945. "and r5, r5, %[m]\n\t"
  31946. "sbcs r4, r4, r5\n\t"
  31947. "sbc r12, r6, r6\n\t"
  31948. "str r4, [%[r], lr]\n\t"
  31949. "add lr, lr, #4\n\t"
  31950. "cmp lr, #0xc0\n\t"
  31951. "blt L_sp_3072_cond_sub_48_words_%=\n\t"
  31952. "mov %[r], r12\n\t"
  31953. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b), [m] "+r" (m)
  31954. :
  31955. : "memory", "r12", "lr", "r4", "r5", "r6", "cc"
  31956. );
  31957. return (uint32_t)(size_t)r;
  31958. }
  31959. #else
  31960. /* Conditionally subtract b from a using the mask m.
  31961. * m is -1 to subtract and 0 when not copying.
  31962. *
  31963. * r A single precision number representing condition subtract result.
  31964. * a A single precision number to subtract from.
  31965. * b A single precision number to subtract.
  31966. * m Mask value to apply.
  31967. */
  31968. 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)
  31969. {
  31970. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  31971. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  31972. register const sp_digit* b asm ("r2") = (const sp_digit*)b_p;
  31973. register sp_digit m asm ("r3") = (sp_digit)m_p;
  31974. __asm__ __volatile__ (
  31975. "mov lr, #0\n\t"
  31976. "ldm %[a]!, {r4, r5}\n\t"
  31977. "ldm %[b]!, {r6, r7}\n\t"
  31978. "and r6, r6, %[m]\n\t"
  31979. "and r7, r7, %[m]\n\t"
  31980. "subs r4, r4, r6\n\t"
  31981. "sbcs r5, r5, r7\n\t"
  31982. "stm %[r]!, {r4, r5}\n\t"
  31983. "ldm %[a]!, {r4, r5}\n\t"
  31984. "ldm %[b]!, {r6, r7}\n\t"
  31985. "and r6, r6, %[m]\n\t"
  31986. "and r7, r7, %[m]\n\t"
  31987. "sbcs r4, r4, r6\n\t"
  31988. "sbcs r5, r5, r7\n\t"
  31989. "stm %[r]!, {r4, r5}\n\t"
  31990. "ldm %[a]!, {r4, r5}\n\t"
  31991. "ldm %[b]!, {r6, r7}\n\t"
  31992. "and r6, r6, %[m]\n\t"
  31993. "and r7, r7, %[m]\n\t"
  31994. "sbcs r4, r4, r6\n\t"
  31995. "sbcs r5, r5, r7\n\t"
  31996. "stm %[r]!, {r4, r5}\n\t"
  31997. "ldm %[a]!, {r4, r5}\n\t"
  31998. "ldm %[b]!, {r6, r7}\n\t"
  31999. "and r6, r6, %[m]\n\t"
  32000. "and r7, r7, %[m]\n\t"
  32001. "sbcs r4, r4, r6\n\t"
  32002. "sbcs r5, r5, r7\n\t"
  32003. "stm %[r]!, {r4, r5}\n\t"
  32004. "ldm %[a]!, {r4, r5}\n\t"
  32005. "ldm %[b]!, {r6, r7}\n\t"
  32006. "and r6, r6, %[m]\n\t"
  32007. "and r7, r7, %[m]\n\t"
  32008. "sbcs r4, r4, r6\n\t"
  32009. "sbcs r5, r5, r7\n\t"
  32010. "stm %[r]!, {r4, r5}\n\t"
  32011. "ldm %[a]!, {r4, r5}\n\t"
  32012. "ldm %[b]!, {r6, r7}\n\t"
  32013. "and r6, r6, %[m]\n\t"
  32014. "and r7, r7, %[m]\n\t"
  32015. "sbcs r4, r4, r6\n\t"
  32016. "sbcs r5, r5, r7\n\t"
  32017. "stm %[r]!, {r4, r5}\n\t"
  32018. "ldm %[a]!, {r4, r5}\n\t"
  32019. "ldm %[b]!, {r6, r7}\n\t"
  32020. "and r6, r6, %[m]\n\t"
  32021. "and r7, r7, %[m]\n\t"
  32022. "sbcs r4, r4, r6\n\t"
  32023. "sbcs r5, r5, r7\n\t"
  32024. "stm %[r]!, {r4, r5}\n\t"
  32025. "ldm %[a]!, {r4, r5}\n\t"
  32026. "ldm %[b]!, {r6, r7}\n\t"
  32027. "and r6, r6, %[m]\n\t"
  32028. "and r7, r7, %[m]\n\t"
  32029. "sbcs r4, r4, r6\n\t"
  32030. "sbcs r5, r5, r7\n\t"
  32031. "stm %[r]!, {r4, r5}\n\t"
  32032. "ldm %[a]!, {r4, r5}\n\t"
  32033. "ldm %[b]!, {r6, r7}\n\t"
  32034. "and r6, r6, %[m]\n\t"
  32035. "and r7, r7, %[m]\n\t"
  32036. "sbcs r4, r4, r6\n\t"
  32037. "sbcs r5, r5, r7\n\t"
  32038. "stm %[r]!, {r4, r5}\n\t"
  32039. "ldm %[a]!, {r4, r5}\n\t"
  32040. "ldm %[b]!, {r6, r7}\n\t"
  32041. "and r6, r6, %[m]\n\t"
  32042. "and r7, r7, %[m]\n\t"
  32043. "sbcs r4, r4, r6\n\t"
  32044. "sbcs r5, r5, r7\n\t"
  32045. "stm %[r]!, {r4, r5}\n\t"
  32046. "ldm %[a]!, {r4, r5}\n\t"
  32047. "ldm %[b]!, {r6, r7}\n\t"
  32048. "and r6, r6, %[m]\n\t"
  32049. "and r7, r7, %[m]\n\t"
  32050. "sbcs r4, r4, r6\n\t"
  32051. "sbcs r5, r5, r7\n\t"
  32052. "stm %[r]!, {r4, r5}\n\t"
  32053. "ldm %[a]!, {r4, r5}\n\t"
  32054. "ldm %[b]!, {r6, r7}\n\t"
  32055. "and r6, r6, %[m]\n\t"
  32056. "and r7, r7, %[m]\n\t"
  32057. "sbcs r4, r4, r6\n\t"
  32058. "sbcs r5, r5, r7\n\t"
  32059. "stm %[r]!, {r4, r5}\n\t"
  32060. "ldm %[a]!, {r4, r5}\n\t"
  32061. "ldm %[b]!, {r6, r7}\n\t"
  32062. "and r6, r6, %[m]\n\t"
  32063. "and r7, r7, %[m]\n\t"
  32064. "sbcs r4, r4, r6\n\t"
  32065. "sbcs r5, r5, r7\n\t"
  32066. "stm %[r]!, {r4, r5}\n\t"
  32067. "ldm %[a]!, {r4, r5}\n\t"
  32068. "ldm %[b]!, {r6, r7}\n\t"
  32069. "and r6, r6, %[m]\n\t"
  32070. "and r7, r7, %[m]\n\t"
  32071. "sbcs r4, r4, r6\n\t"
  32072. "sbcs r5, r5, r7\n\t"
  32073. "stm %[r]!, {r4, r5}\n\t"
  32074. "ldm %[a]!, {r4, r5}\n\t"
  32075. "ldm %[b]!, {r6, r7}\n\t"
  32076. "and r6, r6, %[m]\n\t"
  32077. "and r7, r7, %[m]\n\t"
  32078. "sbcs r4, r4, r6\n\t"
  32079. "sbcs r5, r5, r7\n\t"
  32080. "stm %[r]!, {r4, r5}\n\t"
  32081. "ldm %[a]!, {r4, r5}\n\t"
  32082. "ldm %[b]!, {r6, r7}\n\t"
  32083. "and r6, r6, %[m]\n\t"
  32084. "and r7, r7, %[m]\n\t"
  32085. "sbcs r4, r4, r6\n\t"
  32086. "sbcs r5, r5, r7\n\t"
  32087. "stm %[r]!, {r4, r5}\n\t"
  32088. "ldm %[a]!, {r4, r5}\n\t"
  32089. "ldm %[b]!, {r6, r7}\n\t"
  32090. "and r6, r6, %[m]\n\t"
  32091. "and r7, r7, %[m]\n\t"
  32092. "sbcs r4, r4, r6\n\t"
  32093. "sbcs r5, r5, r7\n\t"
  32094. "stm %[r]!, {r4, r5}\n\t"
  32095. "ldm %[a]!, {r4, r5}\n\t"
  32096. "ldm %[b]!, {r6, r7}\n\t"
  32097. "and r6, r6, %[m]\n\t"
  32098. "and r7, r7, %[m]\n\t"
  32099. "sbcs r4, r4, r6\n\t"
  32100. "sbcs r5, r5, r7\n\t"
  32101. "stm %[r]!, {r4, r5}\n\t"
  32102. "ldm %[a]!, {r4, r5}\n\t"
  32103. "ldm %[b]!, {r6, r7}\n\t"
  32104. "and r6, r6, %[m]\n\t"
  32105. "and r7, r7, %[m]\n\t"
  32106. "sbcs r4, r4, r6\n\t"
  32107. "sbcs r5, r5, r7\n\t"
  32108. "stm %[r]!, {r4, r5}\n\t"
  32109. "ldm %[a]!, {r4, r5}\n\t"
  32110. "ldm %[b]!, {r6, r7}\n\t"
  32111. "and r6, r6, %[m]\n\t"
  32112. "and r7, r7, %[m]\n\t"
  32113. "sbcs r4, r4, r6\n\t"
  32114. "sbcs r5, r5, r7\n\t"
  32115. "stm %[r]!, {r4, r5}\n\t"
  32116. "ldm %[a]!, {r4, r5}\n\t"
  32117. "ldm %[b]!, {r6, r7}\n\t"
  32118. "and r6, r6, %[m]\n\t"
  32119. "and r7, r7, %[m]\n\t"
  32120. "sbcs r4, r4, r6\n\t"
  32121. "sbcs r5, r5, r7\n\t"
  32122. "stm %[r]!, {r4, r5}\n\t"
  32123. "ldm %[a]!, {r4, r5}\n\t"
  32124. "ldm %[b]!, {r6, r7}\n\t"
  32125. "and r6, r6, %[m]\n\t"
  32126. "and r7, r7, %[m]\n\t"
  32127. "sbcs r4, r4, r6\n\t"
  32128. "sbcs r5, r5, r7\n\t"
  32129. "stm %[r]!, {r4, r5}\n\t"
  32130. "ldm %[a]!, {r4, r5}\n\t"
  32131. "ldm %[b]!, {r6, r7}\n\t"
  32132. "and r6, r6, %[m]\n\t"
  32133. "and r7, r7, %[m]\n\t"
  32134. "sbcs r4, r4, r6\n\t"
  32135. "sbcs r5, r5, r7\n\t"
  32136. "stm %[r]!, {r4, r5}\n\t"
  32137. "ldm %[a]!, {r4, r5}\n\t"
  32138. "ldm %[b]!, {r6, r7}\n\t"
  32139. "and r6, r6, %[m]\n\t"
  32140. "and r7, r7, %[m]\n\t"
  32141. "sbcs r4, r4, r6\n\t"
  32142. "sbcs r5, r5, r7\n\t"
  32143. "stm %[r]!, {r4, r5}\n\t"
  32144. "sbc %[r], lr, lr\n\t"
  32145. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b), [m] "+r" (m)
  32146. :
  32147. : "memory", "r12", "lr", "r4", "r5", "r6", "r7", "cc"
  32148. );
  32149. return (uint32_t)(size_t)r;
  32150. }
  32151. #endif /* WOLFSSL_SP_SMALL */
  32152. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  32153. /* Reduce the number back to 3072 bits using Montgomery reduction.
  32154. *
  32155. * a A single precision number to reduce in place.
  32156. * m The single precision number representing the modulus.
  32157. * mp The digit representing the negative inverse of m mod 2^n.
  32158. */
  32159. static SP_NOINLINE void sp_3072_mont_reduce_48(sp_digit* a_p, const sp_digit* m_p, sp_digit mp_p)
  32160. {
  32161. register sp_digit* a asm ("r0") = (sp_digit*)a_p;
  32162. register const sp_digit* m asm ("r1") = (const sp_digit*)m_p;
  32163. register sp_digit mp asm ("r2") = (sp_digit)mp_p;
  32164. __asm__ __volatile__ (
  32165. #if !(defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4))
  32166. "ldr r11, [%[m]]\n\t"
  32167. #endif
  32168. /* i = 0 */
  32169. "mov r9, #0\n\t"
  32170. "mov r3, #0\n\t"
  32171. "ldr r12, [%[a]]\n\t"
  32172. "ldr lr, [%[a], #4]\n\t"
  32173. "\n"
  32174. "L_sp_3072_mont_reduce_48_word_%=: \n\t"
  32175. /* mu = a[i] * mp */
  32176. "mul r8, %[mp], r12\n\t"
  32177. /* a[i+0] += m[0] * mu */
  32178. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  32179. "ldr r11, [%[m]]\n\t"
  32180. #endif
  32181. "lsr r7, r11, #16\n\t"
  32182. "lsr r6, r8, #16\n\t"
  32183. "mul r5, r6, r7\n\t"
  32184. "lsl r7, r11, #16\n\t"
  32185. "lsr r7, r7, #16\n\t"
  32186. "mul r6, r7, r6\n\t"
  32187. "lsr r7, r6, #16\n\t"
  32188. "lsl r6, r6, #16\n\t"
  32189. "adds r12, r12, r6\n\t"
  32190. "adc r5, r5, r7\n\t"
  32191. "lsl r6, r8, #16\n\t"
  32192. "lsl r7, r11, #16\n\t"
  32193. "lsr r6, r6, #16\n\t"
  32194. "lsr r7, r7, #16\n\t"
  32195. "mul r7, r6, r7\n\t"
  32196. "adds r12, r12, r7\n\t"
  32197. "adc r5, r5, #0\n\t"
  32198. "lsr r7, r11, #16\n\t"
  32199. "mul r6, r7, r6\n\t"
  32200. "lsr r7, r6, #16\n\t"
  32201. "lsl r6, r6, #16\n\t"
  32202. "adds r12, r12, r6\n\t"
  32203. "adc r5, r5, r7\n\t"
  32204. /* a[i+1] += m[1] * mu */
  32205. "ldr r7, [%[m], #4]\n\t"
  32206. "lsr r10, r7, #16\n\t"
  32207. "lsr r6, r8, #16\n\t"
  32208. "mul r4, r6, r10\n\t"
  32209. "lsl r10, r7, #16\n\t"
  32210. "lsr r10, r10, #16\n\t"
  32211. "mul r6, r10, r6\n\t"
  32212. "lsr r10, r6, #16\n\t"
  32213. "lsl r6, r6, #16\n\t"
  32214. "adds lr, lr, r6\n\t"
  32215. "adc r4, r4, r10\n\t"
  32216. "lsl r6, r8, #16\n\t"
  32217. "lsl r10, r7, #16\n\t"
  32218. "lsr r6, r6, #16\n\t"
  32219. "lsr r10, r10, #16\n\t"
  32220. "mul r10, r6, r10\n\t"
  32221. "adds lr, lr, r10\n\t"
  32222. "adc r4, r4, #0\n\t"
  32223. "lsr r10, r7, #16\n\t"
  32224. "mul r6, r10, r6\n\t"
  32225. "lsr r10, r6, #16\n\t"
  32226. "lsl r6, r6, #16\n\t"
  32227. "adds lr, lr, r6\n\t"
  32228. "adc r4, r4, r10\n\t"
  32229. "mov r12, lr\n\t"
  32230. "adds r12, r12, r5\n\t"
  32231. "adc r4, r4, #0\n\t"
  32232. /* a[i+2] += m[2] * mu */
  32233. "ldr r7, [%[m], #8]\n\t"
  32234. "ldr lr, [%[a], #8]\n\t"
  32235. "lsr r10, r7, #16\n\t"
  32236. "lsr r6, r8, #16\n\t"
  32237. "mul r5, r6, r10\n\t"
  32238. "lsl r10, r7, #16\n\t"
  32239. "lsr r10, r10, #16\n\t"
  32240. "mul r6, r10, r6\n\t"
  32241. "lsr r10, r6, #16\n\t"
  32242. "lsl r6, r6, #16\n\t"
  32243. "adds lr, lr, r6\n\t"
  32244. "adc r5, r5, r10\n\t"
  32245. "lsl r6, r8, #16\n\t"
  32246. "lsl r10, r7, #16\n\t"
  32247. "lsr r6, r6, #16\n\t"
  32248. "lsr r10, r10, #16\n\t"
  32249. "mul r10, r6, r10\n\t"
  32250. "adds lr, lr, r10\n\t"
  32251. "adc r5, r5, #0\n\t"
  32252. "lsr r10, r7, #16\n\t"
  32253. "mul r6, r10, r6\n\t"
  32254. "lsr r10, r6, #16\n\t"
  32255. "lsl r6, r6, #16\n\t"
  32256. "adds lr, lr, r6\n\t"
  32257. "adc r5, r5, r10\n\t"
  32258. "adds lr, lr, r4\n\t"
  32259. "adc r5, r5, #0\n\t"
  32260. /* a[i+3] += m[3] * mu */
  32261. "ldr r7, [%[m], #12]\n\t"
  32262. "ldr r10, [%[a], #12]\n\t"
  32263. "lsr r11, r7, #16\n\t"
  32264. "lsr r6, r8, #16\n\t"
  32265. "mul r4, r6, r11\n\t"
  32266. "lsl r11, r7, #16\n\t"
  32267. "lsr r11, r11, #16\n\t"
  32268. "mul r6, r11, r6\n\t"
  32269. "lsr r11, r6, #16\n\t"
  32270. "lsl r6, r6, #16\n\t"
  32271. "adds r10, r10, r6\n\t"
  32272. "adc r4, r4, r11\n\t"
  32273. "lsl r6, r8, #16\n\t"
  32274. "lsl r11, r7, #16\n\t"
  32275. "lsr r6, r6, #16\n\t"
  32276. "lsr r11, r11, #16\n\t"
  32277. "mul r11, r6, r11\n\t"
  32278. "adds r10, r10, r11\n\t"
  32279. "adc r4, r4, #0\n\t"
  32280. "lsr r11, r7, #16\n\t"
  32281. "mul r6, r11, r6\n\t"
  32282. "lsr r11, r6, #16\n\t"
  32283. "lsl r6, r6, #16\n\t"
  32284. "adds r10, r10, r6\n\t"
  32285. "adc r4, r4, r11\n\t"
  32286. "adds r10, r10, r5\n\t"
  32287. "str r10, [%[a], #12]\n\t"
  32288. "adc r4, r4, #0\n\t"
  32289. /* a[i+4] += m[4] * mu */
  32290. "ldr r7, [%[m], #16]\n\t"
  32291. "ldr r10, [%[a], #16]\n\t"
  32292. "lsr r11, r7, #16\n\t"
  32293. "lsr r6, r8, #16\n\t"
  32294. "mul r5, r6, r11\n\t"
  32295. "lsl r11, r7, #16\n\t"
  32296. "lsr r11, r11, #16\n\t"
  32297. "mul r6, r11, r6\n\t"
  32298. "lsr r11, r6, #16\n\t"
  32299. "lsl r6, r6, #16\n\t"
  32300. "adds r10, r10, r6\n\t"
  32301. "adc r5, r5, r11\n\t"
  32302. "lsl r6, r8, #16\n\t"
  32303. "lsl r11, r7, #16\n\t"
  32304. "lsr r6, r6, #16\n\t"
  32305. "lsr r11, r11, #16\n\t"
  32306. "mul r11, r6, r11\n\t"
  32307. "adds r10, r10, r11\n\t"
  32308. "adc r5, r5, #0\n\t"
  32309. "lsr r11, r7, #16\n\t"
  32310. "mul r6, r11, r6\n\t"
  32311. "lsr r11, r6, #16\n\t"
  32312. "lsl r6, r6, #16\n\t"
  32313. "adds r10, r10, r6\n\t"
  32314. "adc r5, r5, r11\n\t"
  32315. "adds r10, r10, r4\n\t"
  32316. "str r10, [%[a], #16]\n\t"
  32317. "adc r5, r5, #0\n\t"
  32318. /* a[i+5] += m[5] * mu */
  32319. "ldr r7, [%[m], #20]\n\t"
  32320. "ldr r10, [%[a], #20]\n\t"
  32321. "lsr r11, r7, #16\n\t"
  32322. "lsr r6, r8, #16\n\t"
  32323. "mul r4, r6, r11\n\t"
  32324. "lsl r11, r7, #16\n\t"
  32325. "lsr r11, r11, #16\n\t"
  32326. "mul r6, r11, r6\n\t"
  32327. "lsr r11, r6, #16\n\t"
  32328. "lsl r6, r6, #16\n\t"
  32329. "adds r10, r10, r6\n\t"
  32330. "adc r4, r4, r11\n\t"
  32331. "lsl r6, r8, #16\n\t"
  32332. "lsl r11, r7, #16\n\t"
  32333. "lsr r6, r6, #16\n\t"
  32334. "lsr r11, r11, #16\n\t"
  32335. "mul r11, r6, r11\n\t"
  32336. "adds r10, r10, r11\n\t"
  32337. "adc r4, r4, #0\n\t"
  32338. "lsr r11, r7, #16\n\t"
  32339. "mul r6, r11, r6\n\t"
  32340. "lsr r11, r6, #16\n\t"
  32341. "lsl r6, r6, #16\n\t"
  32342. "adds r10, r10, r6\n\t"
  32343. "adc r4, r4, r11\n\t"
  32344. "adds r10, r10, r5\n\t"
  32345. "str r10, [%[a], #20]\n\t"
  32346. "adc r4, r4, #0\n\t"
  32347. /* a[i+6] += m[6] * mu */
  32348. "ldr r7, [%[m], #24]\n\t"
  32349. "ldr r10, [%[a], #24]\n\t"
  32350. "lsr r11, r7, #16\n\t"
  32351. "lsr r6, r8, #16\n\t"
  32352. "mul r5, r6, r11\n\t"
  32353. "lsl r11, r7, #16\n\t"
  32354. "lsr r11, r11, #16\n\t"
  32355. "mul r6, r11, r6\n\t"
  32356. "lsr r11, r6, #16\n\t"
  32357. "lsl r6, r6, #16\n\t"
  32358. "adds r10, r10, r6\n\t"
  32359. "adc r5, r5, r11\n\t"
  32360. "lsl r6, r8, #16\n\t"
  32361. "lsl r11, r7, #16\n\t"
  32362. "lsr r6, r6, #16\n\t"
  32363. "lsr r11, r11, #16\n\t"
  32364. "mul r11, r6, r11\n\t"
  32365. "adds r10, r10, r11\n\t"
  32366. "adc r5, r5, #0\n\t"
  32367. "lsr r11, r7, #16\n\t"
  32368. "mul r6, r11, r6\n\t"
  32369. "lsr r11, r6, #16\n\t"
  32370. "lsl r6, r6, #16\n\t"
  32371. "adds r10, r10, r6\n\t"
  32372. "adc r5, r5, r11\n\t"
  32373. "adds r10, r10, r4\n\t"
  32374. "str r10, [%[a], #24]\n\t"
  32375. "adc r5, r5, #0\n\t"
  32376. /* a[i+7] += m[7] * mu */
  32377. "ldr r7, [%[m], #28]\n\t"
  32378. "ldr r10, [%[a], #28]\n\t"
  32379. "lsr r11, r7, #16\n\t"
  32380. "lsr r6, r8, #16\n\t"
  32381. "mul r4, r6, r11\n\t"
  32382. "lsl r11, r7, #16\n\t"
  32383. "lsr r11, r11, #16\n\t"
  32384. "mul r6, r11, r6\n\t"
  32385. "lsr r11, r6, #16\n\t"
  32386. "lsl r6, r6, #16\n\t"
  32387. "adds r10, r10, r6\n\t"
  32388. "adc r4, r4, r11\n\t"
  32389. "lsl r6, r8, #16\n\t"
  32390. "lsl r11, r7, #16\n\t"
  32391. "lsr r6, r6, #16\n\t"
  32392. "lsr r11, r11, #16\n\t"
  32393. "mul r11, r6, r11\n\t"
  32394. "adds r10, r10, r11\n\t"
  32395. "adc r4, r4, #0\n\t"
  32396. "lsr r11, r7, #16\n\t"
  32397. "mul r6, r11, r6\n\t"
  32398. "lsr r11, r6, #16\n\t"
  32399. "lsl r6, r6, #16\n\t"
  32400. "adds r10, r10, r6\n\t"
  32401. "adc r4, r4, r11\n\t"
  32402. "adds r10, r10, r5\n\t"
  32403. "str r10, [%[a], #28]\n\t"
  32404. "adc r4, r4, #0\n\t"
  32405. /* a[i+8] += m[8] * mu */
  32406. "ldr r7, [%[m], #32]\n\t"
  32407. "ldr r10, [%[a], #32]\n\t"
  32408. "lsr r11, r7, #16\n\t"
  32409. "lsr r6, r8, #16\n\t"
  32410. "mul r5, r6, r11\n\t"
  32411. "lsl r11, r7, #16\n\t"
  32412. "lsr r11, r11, #16\n\t"
  32413. "mul r6, r11, r6\n\t"
  32414. "lsr r11, r6, #16\n\t"
  32415. "lsl r6, r6, #16\n\t"
  32416. "adds r10, r10, r6\n\t"
  32417. "adc r5, r5, r11\n\t"
  32418. "lsl r6, r8, #16\n\t"
  32419. "lsl r11, r7, #16\n\t"
  32420. "lsr r6, r6, #16\n\t"
  32421. "lsr r11, r11, #16\n\t"
  32422. "mul r11, r6, r11\n\t"
  32423. "adds r10, r10, r11\n\t"
  32424. "adc r5, r5, #0\n\t"
  32425. "lsr r11, r7, #16\n\t"
  32426. "mul r6, r11, r6\n\t"
  32427. "lsr r11, r6, #16\n\t"
  32428. "lsl r6, r6, #16\n\t"
  32429. "adds r10, r10, r6\n\t"
  32430. "adc r5, r5, r11\n\t"
  32431. "adds r10, r10, r4\n\t"
  32432. "str r10, [%[a], #32]\n\t"
  32433. "adc r5, r5, #0\n\t"
  32434. /* a[i+9] += m[9] * mu */
  32435. "ldr r7, [%[m], #36]\n\t"
  32436. "ldr r10, [%[a], #36]\n\t"
  32437. "lsr r11, r7, #16\n\t"
  32438. "lsr r6, r8, #16\n\t"
  32439. "mul r4, r6, r11\n\t"
  32440. "lsl r11, r7, #16\n\t"
  32441. "lsr r11, r11, #16\n\t"
  32442. "mul r6, r11, r6\n\t"
  32443. "lsr r11, r6, #16\n\t"
  32444. "lsl r6, r6, #16\n\t"
  32445. "adds r10, r10, r6\n\t"
  32446. "adc r4, r4, r11\n\t"
  32447. "lsl r6, r8, #16\n\t"
  32448. "lsl r11, r7, #16\n\t"
  32449. "lsr r6, r6, #16\n\t"
  32450. "lsr r11, r11, #16\n\t"
  32451. "mul r11, r6, r11\n\t"
  32452. "adds r10, r10, r11\n\t"
  32453. "adc r4, r4, #0\n\t"
  32454. "lsr r11, r7, #16\n\t"
  32455. "mul r6, r11, r6\n\t"
  32456. "lsr r11, r6, #16\n\t"
  32457. "lsl r6, r6, #16\n\t"
  32458. "adds r10, r10, r6\n\t"
  32459. "adc r4, r4, r11\n\t"
  32460. "adds r10, r10, r5\n\t"
  32461. "str r10, [%[a], #36]\n\t"
  32462. "adc r4, r4, #0\n\t"
  32463. /* a[i+10] += m[10] * mu */
  32464. "ldr r7, [%[m], #40]\n\t"
  32465. "ldr r10, [%[a], #40]\n\t"
  32466. "lsr r11, r7, #16\n\t"
  32467. "lsr r6, r8, #16\n\t"
  32468. "mul r5, r6, r11\n\t"
  32469. "lsl r11, r7, #16\n\t"
  32470. "lsr r11, r11, #16\n\t"
  32471. "mul r6, r11, r6\n\t"
  32472. "lsr r11, r6, #16\n\t"
  32473. "lsl r6, r6, #16\n\t"
  32474. "adds r10, r10, r6\n\t"
  32475. "adc r5, r5, r11\n\t"
  32476. "lsl r6, r8, #16\n\t"
  32477. "lsl r11, r7, #16\n\t"
  32478. "lsr r6, r6, #16\n\t"
  32479. "lsr r11, r11, #16\n\t"
  32480. "mul r11, r6, r11\n\t"
  32481. "adds r10, r10, r11\n\t"
  32482. "adc r5, r5, #0\n\t"
  32483. "lsr r11, r7, #16\n\t"
  32484. "mul r6, r11, r6\n\t"
  32485. "lsr r11, r6, #16\n\t"
  32486. "lsl r6, r6, #16\n\t"
  32487. "adds r10, r10, r6\n\t"
  32488. "adc r5, r5, r11\n\t"
  32489. "adds r10, r10, r4\n\t"
  32490. "str r10, [%[a], #40]\n\t"
  32491. "adc r5, r5, #0\n\t"
  32492. /* a[i+11] += m[11] * mu */
  32493. "ldr r7, [%[m], #44]\n\t"
  32494. "ldr r10, [%[a], #44]\n\t"
  32495. "lsr r11, r7, #16\n\t"
  32496. "lsr r6, r8, #16\n\t"
  32497. "mul r4, r6, r11\n\t"
  32498. "lsl r11, r7, #16\n\t"
  32499. "lsr r11, r11, #16\n\t"
  32500. "mul r6, r11, r6\n\t"
  32501. "lsr r11, r6, #16\n\t"
  32502. "lsl r6, r6, #16\n\t"
  32503. "adds r10, r10, r6\n\t"
  32504. "adc r4, r4, r11\n\t"
  32505. "lsl r6, r8, #16\n\t"
  32506. "lsl r11, r7, #16\n\t"
  32507. "lsr r6, r6, #16\n\t"
  32508. "lsr r11, r11, #16\n\t"
  32509. "mul r11, r6, r11\n\t"
  32510. "adds r10, r10, r11\n\t"
  32511. "adc r4, r4, #0\n\t"
  32512. "lsr r11, r7, #16\n\t"
  32513. "mul r6, r11, r6\n\t"
  32514. "lsr r11, r6, #16\n\t"
  32515. "lsl r6, r6, #16\n\t"
  32516. "adds r10, r10, r6\n\t"
  32517. "adc r4, r4, r11\n\t"
  32518. "adds r10, r10, r5\n\t"
  32519. "str r10, [%[a], #44]\n\t"
  32520. "adc r4, r4, #0\n\t"
  32521. /* a[i+12] += m[12] * mu */
  32522. "ldr r7, [%[m], #48]\n\t"
  32523. "ldr r10, [%[a], #48]\n\t"
  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. "adds r10, r10, r4\n\t"
  32548. "str r10, [%[a], #48]\n\t"
  32549. "adc r5, r5, #0\n\t"
  32550. /* a[i+13] += m[13] * mu */
  32551. "ldr r7, [%[m], #52]\n\t"
  32552. "ldr r10, [%[a], #52]\n\t"
  32553. "lsr r11, r7, #16\n\t"
  32554. "lsr r6, r8, #16\n\t"
  32555. "mul r4, r6, r11\n\t"
  32556. "lsl r11, r7, #16\n\t"
  32557. "lsr r11, r11, #16\n\t"
  32558. "mul r6, r11, r6\n\t"
  32559. "lsr r11, r6, #16\n\t"
  32560. "lsl r6, r6, #16\n\t"
  32561. "adds r10, r10, r6\n\t"
  32562. "adc r4, r4, r11\n\t"
  32563. "lsl r6, r8, #16\n\t"
  32564. "lsl r11, r7, #16\n\t"
  32565. "lsr r6, r6, #16\n\t"
  32566. "lsr r11, r11, #16\n\t"
  32567. "mul r11, r6, r11\n\t"
  32568. "adds r10, r10, r11\n\t"
  32569. "adc r4, r4, #0\n\t"
  32570. "lsr r11, r7, #16\n\t"
  32571. "mul r6, r11, r6\n\t"
  32572. "lsr r11, r6, #16\n\t"
  32573. "lsl r6, r6, #16\n\t"
  32574. "adds r10, r10, r6\n\t"
  32575. "adc r4, r4, r11\n\t"
  32576. "adds r10, r10, r5\n\t"
  32577. "str r10, [%[a], #52]\n\t"
  32578. "adc r4, r4, #0\n\t"
  32579. /* a[i+14] += m[14] * mu */
  32580. "ldr r7, [%[m], #56]\n\t"
  32581. "ldr r10, [%[a], #56]\n\t"
  32582. "lsr r11, r7, #16\n\t"
  32583. "lsr r6, r8, #16\n\t"
  32584. "mul r5, r6, r11\n\t"
  32585. "lsl r11, r7, #16\n\t"
  32586. "lsr r11, r11, #16\n\t"
  32587. "mul r6, r11, r6\n\t"
  32588. "lsr r11, r6, #16\n\t"
  32589. "lsl r6, r6, #16\n\t"
  32590. "adds r10, r10, r6\n\t"
  32591. "adc r5, r5, r11\n\t"
  32592. "lsl r6, r8, #16\n\t"
  32593. "lsl r11, r7, #16\n\t"
  32594. "lsr r6, r6, #16\n\t"
  32595. "lsr r11, r11, #16\n\t"
  32596. "mul r11, r6, r11\n\t"
  32597. "adds r10, r10, r11\n\t"
  32598. "adc r5, r5, #0\n\t"
  32599. "lsr r11, r7, #16\n\t"
  32600. "mul r6, r11, r6\n\t"
  32601. "lsr r11, r6, #16\n\t"
  32602. "lsl r6, r6, #16\n\t"
  32603. "adds r10, r10, r6\n\t"
  32604. "adc r5, r5, r11\n\t"
  32605. "adds r10, r10, r4\n\t"
  32606. "str r10, [%[a], #56]\n\t"
  32607. "adc r5, r5, #0\n\t"
  32608. /* a[i+15] += m[15] * mu */
  32609. "ldr r7, [%[m], #60]\n\t"
  32610. "ldr r10, [%[a], #60]\n\t"
  32611. "lsr r11, r7, #16\n\t"
  32612. "lsr r6, r8, #16\n\t"
  32613. "mul r4, r6, r11\n\t"
  32614. "lsl r11, r7, #16\n\t"
  32615. "lsr r11, r11, #16\n\t"
  32616. "mul r6, r11, r6\n\t"
  32617. "lsr r11, r6, #16\n\t"
  32618. "lsl r6, r6, #16\n\t"
  32619. "adds r10, r10, r6\n\t"
  32620. "adc r4, r4, r11\n\t"
  32621. "lsl r6, r8, #16\n\t"
  32622. "lsl r11, r7, #16\n\t"
  32623. "lsr r6, r6, #16\n\t"
  32624. "lsr r11, r11, #16\n\t"
  32625. "mul r11, r6, r11\n\t"
  32626. "adds r10, r10, r11\n\t"
  32627. "adc r4, r4, #0\n\t"
  32628. "lsr r11, r7, #16\n\t"
  32629. "mul r6, r11, r6\n\t"
  32630. "lsr r11, r6, #16\n\t"
  32631. "lsl r6, r6, #16\n\t"
  32632. "adds r10, r10, r6\n\t"
  32633. "adc r4, r4, r11\n\t"
  32634. "adds r10, r10, r5\n\t"
  32635. "str r10, [%[a], #60]\n\t"
  32636. "adc r4, r4, #0\n\t"
  32637. /* a[i+16] += m[16] * mu */
  32638. "ldr r7, [%[m], #64]\n\t"
  32639. "ldr r10, [%[a], #64]\n\t"
  32640. "lsr r11, r7, #16\n\t"
  32641. "lsr r6, r8, #16\n\t"
  32642. "mul r5, r6, r11\n\t"
  32643. "lsl r11, r7, #16\n\t"
  32644. "lsr r11, r11, #16\n\t"
  32645. "mul r6, r11, r6\n\t"
  32646. "lsr r11, r6, #16\n\t"
  32647. "lsl r6, r6, #16\n\t"
  32648. "adds r10, r10, r6\n\t"
  32649. "adc r5, r5, r11\n\t"
  32650. "lsl r6, r8, #16\n\t"
  32651. "lsl r11, r7, #16\n\t"
  32652. "lsr r6, r6, #16\n\t"
  32653. "lsr r11, r11, #16\n\t"
  32654. "mul r11, r6, r11\n\t"
  32655. "adds r10, r10, r11\n\t"
  32656. "adc r5, r5, #0\n\t"
  32657. "lsr r11, r7, #16\n\t"
  32658. "mul r6, r11, r6\n\t"
  32659. "lsr r11, r6, #16\n\t"
  32660. "lsl r6, r6, #16\n\t"
  32661. "adds r10, r10, r6\n\t"
  32662. "adc r5, r5, r11\n\t"
  32663. "adds r10, r10, r4\n\t"
  32664. "str r10, [%[a], #64]\n\t"
  32665. "adc r5, r5, #0\n\t"
  32666. /* a[i+17] += m[17] * mu */
  32667. "ldr r7, [%[m], #68]\n\t"
  32668. "ldr r10, [%[a], #68]\n\t"
  32669. "lsr r11, r7, #16\n\t"
  32670. "lsr r6, r8, #16\n\t"
  32671. "mul r4, r6, r11\n\t"
  32672. "lsl r11, r7, #16\n\t"
  32673. "lsr r11, r11, #16\n\t"
  32674. "mul r6, r11, r6\n\t"
  32675. "lsr r11, r6, #16\n\t"
  32676. "lsl r6, r6, #16\n\t"
  32677. "adds r10, r10, r6\n\t"
  32678. "adc r4, r4, r11\n\t"
  32679. "lsl r6, r8, #16\n\t"
  32680. "lsl r11, r7, #16\n\t"
  32681. "lsr r6, r6, #16\n\t"
  32682. "lsr r11, r11, #16\n\t"
  32683. "mul r11, r6, r11\n\t"
  32684. "adds r10, r10, r11\n\t"
  32685. "adc r4, r4, #0\n\t"
  32686. "lsr r11, r7, #16\n\t"
  32687. "mul r6, r11, r6\n\t"
  32688. "lsr r11, r6, #16\n\t"
  32689. "lsl r6, r6, #16\n\t"
  32690. "adds r10, r10, r6\n\t"
  32691. "adc r4, r4, r11\n\t"
  32692. "adds r10, r10, r5\n\t"
  32693. "str r10, [%[a], #68]\n\t"
  32694. "adc r4, r4, #0\n\t"
  32695. /* a[i+18] += m[18] * mu */
  32696. "ldr r7, [%[m], #72]\n\t"
  32697. "ldr r10, [%[a], #72]\n\t"
  32698. "lsr r11, r7, #16\n\t"
  32699. "lsr r6, r8, #16\n\t"
  32700. "mul r5, r6, r11\n\t"
  32701. "lsl r11, r7, #16\n\t"
  32702. "lsr r11, r11, #16\n\t"
  32703. "mul r6, r11, r6\n\t"
  32704. "lsr r11, r6, #16\n\t"
  32705. "lsl r6, r6, #16\n\t"
  32706. "adds r10, r10, r6\n\t"
  32707. "adc r5, r5, r11\n\t"
  32708. "lsl r6, r8, #16\n\t"
  32709. "lsl r11, r7, #16\n\t"
  32710. "lsr r6, r6, #16\n\t"
  32711. "lsr r11, r11, #16\n\t"
  32712. "mul r11, r6, r11\n\t"
  32713. "adds r10, r10, r11\n\t"
  32714. "adc r5, r5, #0\n\t"
  32715. "lsr r11, r7, #16\n\t"
  32716. "mul r6, r11, r6\n\t"
  32717. "lsr r11, r6, #16\n\t"
  32718. "lsl r6, r6, #16\n\t"
  32719. "adds r10, r10, r6\n\t"
  32720. "adc r5, r5, r11\n\t"
  32721. "adds r10, r10, r4\n\t"
  32722. "str r10, [%[a], #72]\n\t"
  32723. "adc r5, r5, #0\n\t"
  32724. /* a[i+19] += m[19] * mu */
  32725. "ldr r7, [%[m], #76]\n\t"
  32726. "ldr r10, [%[a], #76]\n\t"
  32727. "lsr r11, r7, #16\n\t"
  32728. "lsr r6, r8, #16\n\t"
  32729. "mul r4, r6, r11\n\t"
  32730. "lsl r11, r7, #16\n\t"
  32731. "lsr r11, r11, #16\n\t"
  32732. "mul r6, r11, r6\n\t"
  32733. "lsr r11, r6, #16\n\t"
  32734. "lsl r6, r6, #16\n\t"
  32735. "adds r10, r10, r6\n\t"
  32736. "adc r4, r4, r11\n\t"
  32737. "lsl r6, r8, #16\n\t"
  32738. "lsl r11, r7, #16\n\t"
  32739. "lsr r6, r6, #16\n\t"
  32740. "lsr r11, r11, #16\n\t"
  32741. "mul r11, r6, r11\n\t"
  32742. "adds r10, r10, r11\n\t"
  32743. "adc r4, r4, #0\n\t"
  32744. "lsr r11, r7, #16\n\t"
  32745. "mul r6, r11, r6\n\t"
  32746. "lsr r11, r6, #16\n\t"
  32747. "lsl r6, r6, #16\n\t"
  32748. "adds r10, r10, r6\n\t"
  32749. "adc r4, r4, r11\n\t"
  32750. "adds r10, r10, r5\n\t"
  32751. "str r10, [%[a], #76]\n\t"
  32752. "adc r4, r4, #0\n\t"
  32753. /* a[i+20] += m[20] * mu */
  32754. "ldr r7, [%[m], #80]\n\t"
  32755. "ldr r10, [%[a], #80]\n\t"
  32756. "lsr r11, r7, #16\n\t"
  32757. "lsr r6, r8, #16\n\t"
  32758. "mul r5, r6, r11\n\t"
  32759. "lsl r11, r7, #16\n\t"
  32760. "lsr r11, r11, #16\n\t"
  32761. "mul r6, r11, r6\n\t"
  32762. "lsr r11, r6, #16\n\t"
  32763. "lsl r6, r6, #16\n\t"
  32764. "adds r10, r10, r6\n\t"
  32765. "adc r5, r5, r11\n\t"
  32766. "lsl r6, r8, #16\n\t"
  32767. "lsl r11, r7, #16\n\t"
  32768. "lsr r6, r6, #16\n\t"
  32769. "lsr r11, r11, #16\n\t"
  32770. "mul r11, r6, r11\n\t"
  32771. "adds r10, r10, r11\n\t"
  32772. "adc r5, r5, #0\n\t"
  32773. "lsr r11, r7, #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 r5, r5, r11\n\t"
  32779. "adds r10, r10, r4\n\t"
  32780. "str r10, [%[a], #80]\n\t"
  32781. "adc r5, r5, #0\n\t"
  32782. /* a[i+21] += m[21] * mu */
  32783. "ldr r7, [%[m], #84]\n\t"
  32784. "ldr r10, [%[a], #84]\n\t"
  32785. "lsr r11, r7, #16\n\t"
  32786. "lsr r6, r8, #16\n\t"
  32787. "mul r4, r6, r11\n\t"
  32788. "lsl r11, r7, #16\n\t"
  32789. "lsr r11, r11, #16\n\t"
  32790. "mul r6, r11, r6\n\t"
  32791. "lsr r11, r6, #16\n\t"
  32792. "lsl r6, r6, #16\n\t"
  32793. "adds r10, r10, r6\n\t"
  32794. "adc r4, r4, r11\n\t"
  32795. "lsl r6, r8, #16\n\t"
  32796. "lsl r11, r7, #16\n\t"
  32797. "lsr r6, r6, #16\n\t"
  32798. "lsr r11, r11, #16\n\t"
  32799. "mul r11, r6, r11\n\t"
  32800. "adds r10, r10, r11\n\t"
  32801. "adc r4, r4, #0\n\t"
  32802. "lsr r11, r7, #16\n\t"
  32803. "mul r6, r11, r6\n\t"
  32804. "lsr r11, r6, #16\n\t"
  32805. "lsl r6, r6, #16\n\t"
  32806. "adds r10, r10, r6\n\t"
  32807. "adc r4, r4, r11\n\t"
  32808. "adds r10, r10, r5\n\t"
  32809. "str r10, [%[a], #84]\n\t"
  32810. "adc r4, r4, #0\n\t"
  32811. /* a[i+22] += m[22] * mu */
  32812. "ldr r7, [%[m], #88]\n\t"
  32813. "ldr r10, [%[a], #88]\n\t"
  32814. "lsr r11, r7, #16\n\t"
  32815. "lsr r6, r8, #16\n\t"
  32816. "mul r5, r6, r11\n\t"
  32817. "lsl r11, r7, #16\n\t"
  32818. "lsr r11, r11, #16\n\t"
  32819. "mul r6, r11, r6\n\t"
  32820. "lsr r11, r6, #16\n\t"
  32821. "lsl r6, r6, #16\n\t"
  32822. "adds r10, r10, r6\n\t"
  32823. "adc r5, r5, r11\n\t"
  32824. "lsl r6, r8, #16\n\t"
  32825. "lsl r11, r7, #16\n\t"
  32826. "lsr r6, r6, #16\n\t"
  32827. "lsr r11, r11, #16\n\t"
  32828. "mul r11, r6, r11\n\t"
  32829. "adds r10, r10, r11\n\t"
  32830. "adc r5, r5, #0\n\t"
  32831. "lsr r11, r7, #16\n\t"
  32832. "mul r6, r11, r6\n\t"
  32833. "lsr r11, r6, #16\n\t"
  32834. "lsl r6, r6, #16\n\t"
  32835. "adds r10, r10, r6\n\t"
  32836. "adc r5, r5, r11\n\t"
  32837. "adds r10, r10, r4\n\t"
  32838. "str r10, [%[a], #88]\n\t"
  32839. "adc r5, r5, #0\n\t"
  32840. /* a[i+23] += m[23] * mu */
  32841. "ldr r7, [%[m], #92]\n\t"
  32842. "ldr r10, [%[a], #92]\n\t"
  32843. "lsr r11, r7, #16\n\t"
  32844. "lsr r6, r8, #16\n\t"
  32845. "mul r4, r6, r11\n\t"
  32846. "lsl r11, r7, #16\n\t"
  32847. "lsr r11, r11, #16\n\t"
  32848. "mul r6, r11, r6\n\t"
  32849. "lsr r11, r6, #16\n\t"
  32850. "lsl r6, r6, #16\n\t"
  32851. "adds r10, r10, r6\n\t"
  32852. "adc r4, r4, r11\n\t"
  32853. "lsl r6, r8, #16\n\t"
  32854. "lsl r11, r7, #16\n\t"
  32855. "lsr r6, r6, #16\n\t"
  32856. "lsr r11, r11, #16\n\t"
  32857. "mul r11, r6, r11\n\t"
  32858. "adds r10, r10, r11\n\t"
  32859. "adc r4, r4, #0\n\t"
  32860. "lsr r11, r7, #16\n\t"
  32861. "mul r6, r11, r6\n\t"
  32862. "lsr r11, r6, #16\n\t"
  32863. "lsl r6, r6, #16\n\t"
  32864. "adds r10, r10, r6\n\t"
  32865. "adc r4, r4, r11\n\t"
  32866. "adds r10, r10, r5\n\t"
  32867. "str r10, [%[a], #92]\n\t"
  32868. "adc r4, r4, #0\n\t"
  32869. /* a[i+24] += m[24] * mu */
  32870. "ldr r7, [%[m], #96]\n\t"
  32871. "ldr r10, [%[a], #96]\n\t"
  32872. "lsr r11, r7, #16\n\t"
  32873. "lsr r6, r8, #16\n\t"
  32874. "mul r5, r6, r11\n\t"
  32875. "lsl r11, r7, #16\n\t"
  32876. "lsr r11, r11, #16\n\t"
  32877. "mul r6, r11, r6\n\t"
  32878. "lsr r11, r6, #16\n\t"
  32879. "lsl r6, r6, #16\n\t"
  32880. "adds r10, r10, r6\n\t"
  32881. "adc r5, r5, r11\n\t"
  32882. "lsl r6, r8, #16\n\t"
  32883. "lsl r11, r7, #16\n\t"
  32884. "lsr r6, r6, #16\n\t"
  32885. "lsr r11, r11, #16\n\t"
  32886. "mul r11, r6, r11\n\t"
  32887. "adds r10, r10, r11\n\t"
  32888. "adc r5, r5, #0\n\t"
  32889. "lsr r11, r7, #16\n\t"
  32890. "mul r6, r11, r6\n\t"
  32891. "lsr r11, r6, #16\n\t"
  32892. "lsl r6, r6, #16\n\t"
  32893. "adds r10, r10, r6\n\t"
  32894. "adc r5, r5, r11\n\t"
  32895. "adds r10, r10, r4\n\t"
  32896. "str r10, [%[a], #96]\n\t"
  32897. "adc r5, r5, #0\n\t"
  32898. /* a[i+25] += m[25] * mu */
  32899. "ldr r7, [%[m], #100]\n\t"
  32900. "ldr r10, [%[a], #100]\n\t"
  32901. "lsr r11, r7, #16\n\t"
  32902. "lsr r6, r8, #16\n\t"
  32903. "mul r4, r6, r11\n\t"
  32904. "lsl r11, r7, #16\n\t"
  32905. "lsr r11, r11, #16\n\t"
  32906. "mul r6, r11, r6\n\t"
  32907. "lsr r11, r6, #16\n\t"
  32908. "lsl r6, r6, #16\n\t"
  32909. "adds r10, r10, r6\n\t"
  32910. "adc r4, r4, r11\n\t"
  32911. "lsl r6, r8, #16\n\t"
  32912. "lsl r11, r7, #16\n\t"
  32913. "lsr r6, r6, #16\n\t"
  32914. "lsr r11, r11, #16\n\t"
  32915. "mul r11, r6, r11\n\t"
  32916. "adds r10, r10, r11\n\t"
  32917. "adc r4, r4, #0\n\t"
  32918. "lsr r11, r7, #16\n\t"
  32919. "mul r6, r11, r6\n\t"
  32920. "lsr r11, r6, #16\n\t"
  32921. "lsl r6, r6, #16\n\t"
  32922. "adds r10, r10, r6\n\t"
  32923. "adc r4, r4, r11\n\t"
  32924. "adds r10, r10, r5\n\t"
  32925. "str r10, [%[a], #100]\n\t"
  32926. "adc r4, r4, #0\n\t"
  32927. /* a[i+26] += m[26] * mu */
  32928. "ldr r7, [%[m], #104]\n\t"
  32929. "ldr r10, [%[a], #104]\n\t"
  32930. "lsr r11, r7, #16\n\t"
  32931. "lsr r6, r8, #16\n\t"
  32932. "mul r5, r6, r11\n\t"
  32933. "lsl r11, r7, #16\n\t"
  32934. "lsr r11, r11, #16\n\t"
  32935. "mul r6, r11, r6\n\t"
  32936. "lsr r11, r6, #16\n\t"
  32937. "lsl r6, r6, #16\n\t"
  32938. "adds r10, r10, r6\n\t"
  32939. "adc r5, r5, r11\n\t"
  32940. "lsl r6, r8, #16\n\t"
  32941. "lsl r11, r7, #16\n\t"
  32942. "lsr r6, r6, #16\n\t"
  32943. "lsr r11, r11, #16\n\t"
  32944. "mul r11, r6, r11\n\t"
  32945. "adds r10, r10, r11\n\t"
  32946. "adc r5, r5, #0\n\t"
  32947. "lsr r11, r7, #16\n\t"
  32948. "mul r6, r11, r6\n\t"
  32949. "lsr r11, r6, #16\n\t"
  32950. "lsl r6, r6, #16\n\t"
  32951. "adds r10, r10, r6\n\t"
  32952. "adc r5, r5, r11\n\t"
  32953. "adds r10, r10, r4\n\t"
  32954. "str r10, [%[a], #104]\n\t"
  32955. "adc r5, r5, #0\n\t"
  32956. /* a[i+27] += m[27] * mu */
  32957. "ldr r7, [%[m], #108]\n\t"
  32958. "ldr r10, [%[a], #108]\n\t"
  32959. "lsr r11, r7, #16\n\t"
  32960. "lsr r6, r8, #16\n\t"
  32961. "mul r4, r6, r11\n\t"
  32962. "lsl r11, r7, #16\n\t"
  32963. "lsr r11, r11, #16\n\t"
  32964. "mul r6, r11, r6\n\t"
  32965. "lsr r11, r6, #16\n\t"
  32966. "lsl r6, r6, #16\n\t"
  32967. "adds r10, r10, r6\n\t"
  32968. "adc r4, r4, r11\n\t"
  32969. "lsl r6, r8, #16\n\t"
  32970. "lsl r11, r7, #16\n\t"
  32971. "lsr r6, r6, #16\n\t"
  32972. "lsr r11, r11, #16\n\t"
  32973. "mul r11, r6, r11\n\t"
  32974. "adds r10, r10, r11\n\t"
  32975. "adc r4, r4, #0\n\t"
  32976. "lsr r11, r7, #16\n\t"
  32977. "mul r6, r11, r6\n\t"
  32978. "lsr r11, r6, #16\n\t"
  32979. "lsl r6, r6, #16\n\t"
  32980. "adds r10, r10, r6\n\t"
  32981. "adc r4, r4, r11\n\t"
  32982. "adds r10, r10, r5\n\t"
  32983. "str r10, [%[a], #108]\n\t"
  32984. "adc r4, r4, #0\n\t"
  32985. /* a[i+28] += m[28] * mu */
  32986. "ldr r7, [%[m], #112]\n\t"
  32987. "ldr r10, [%[a], #112]\n\t"
  32988. "lsr r11, r7, #16\n\t"
  32989. "lsr r6, r8, #16\n\t"
  32990. "mul r5, r6, r11\n\t"
  32991. "lsl r11, r7, #16\n\t"
  32992. "lsr r11, r11, #16\n\t"
  32993. "mul r6, r11, r6\n\t"
  32994. "lsr r11, r6, #16\n\t"
  32995. "lsl r6, r6, #16\n\t"
  32996. "adds r10, r10, r6\n\t"
  32997. "adc r5, r5, r11\n\t"
  32998. "lsl r6, r8, #16\n\t"
  32999. "lsl r11, r7, #16\n\t"
  33000. "lsr r6, r6, #16\n\t"
  33001. "lsr r11, r11, #16\n\t"
  33002. "mul r11, r6, r11\n\t"
  33003. "adds r10, r10, r11\n\t"
  33004. "adc r5, r5, #0\n\t"
  33005. "lsr r11, r7, #16\n\t"
  33006. "mul r6, r11, r6\n\t"
  33007. "lsr r11, r6, #16\n\t"
  33008. "lsl r6, r6, #16\n\t"
  33009. "adds r10, r10, r6\n\t"
  33010. "adc r5, r5, r11\n\t"
  33011. "adds r10, r10, r4\n\t"
  33012. "str r10, [%[a], #112]\n\t"
  33013. "adc r5, r5, #0\n\t"
  33014. /* a[i+29] += m[29] * mu */
  33015. "ldr r7, [%[m], #116]\n\t"
  33016. "ldr r10, [%[a], #116]\n\t"
  33017. "lsr r11, r7, #16\n\t"
  33018. "lsr r6, r8, #16\n\t"
  33019. "mul r4, r6, r11\n\t"
  33020. "lsl r11, r7, #16\n\t"
  33021. "lsr r11, r11, #16\n\t"
  33022. "mul r6, r11, r6\n\t"
  33023. "lsr r11, r6, #16\n\t"
  33024. "lsl r6, r6, #16\n\t"
  33025. "adds r10, r10, r6\n\t"
  33026. "adc r4, r4, r11\n\t"
  33027. "lsl r6, r8, #16\n\t"
  33028. "lsl r11, r7, #16\n\t"
  33029. "lsr r6, r6, #16\n\t"
  33030. "lsr r11, r11, #16\n\t"
  33031. "mul r11, r6, r11\n\t"
  33032. "adds r10, r10, r11\n\t"
  33033. "adc r4, r4, #0\n\t"
  33034. "lsr r11, r7, #16\n\t"
  33035. "mul r6, r11, r6\n\t"
  33036. "lsr r11, r6, #16\n\t"
  33037. "lsl r6, r6, #16\n\t"
  33038. "adds r10, r10, r6\n\t"
  33039. "adc r4, r4, r11\n\t"
  33040. "adds r10, r10, r5\n\t"
  33041. "str r10, [%[a], #116]\n\t"
  33042. "adc r4, r4, #0\n\t"
  33043. /* a[i+30] += m[30] * mu */
  33044. "ldr r7, [%[m], #120]\n\t"
  33045. "ldr r10, [%[a], #120]\n\t"
  33046. "lsr r11, r7, #16\n\t"
  33047. "lsr r6, r8, #16\n\t"
  33048. "mul r5, r6, r11\n\t"
  33049. "lsl r11, r7, #16\n\t"
  33050. "lsr r11, r11, #16\n\t"
  33051. "mul r6, r11, r6\n\t"
  33052. "lsr r11, r6, #16\n\t"
  33053. "lsl r6, r6, #16\n\t"
  33054. "adds r10, r10, r6\n\t"
  33055. "adc r5, r5, r11\n\t"
  33056. "lsl r6, r8, #16\n\t"
  33057. "lsl r11, r7, #16\n\t"
  33058. "lsr r6, r6, #16\n\t"
  33059. "lsr r11, r11, #16\n\t"
  33060. "mul r11, r6, r11\n\t"
  33061. "adds r10, r10, r11\n\t"
  33062. "adc r5, r5, #0\n\t"
  33063. "lsr r11, r7, #16\n\t"
  33064. "mul r6, r11, r6\n\t"
  33065. "lsr r11, r6, #16\n\t"
  33066. "lsl r6, r6, #16\n\t"
  33067. "adds r10, r10, r6\n\t"
  33068. "adc r5, r5, r11\n\t"
  33069. "adds r10, r10, r4\n\t"
  33070. "str r10, [%[a], #120]\n\t"
  33071. "adc r5, r5, #0\n\t"
  33072. /* a[i+31] += m[31] * mu */
  33073. "ldr r7, [%[m], #124]\n\t"
  33074. "ldr r10, [%[a], #124]\n\t"
  33075. "lsr r11, r7, #16\n\t"
  33076. "lsr r6, r8, #16\n\t"
  33077. "mul r4, r6, r11\n\t"
  33078. "lsl r11, r7, #16\n\t"
  33079. "lsr r11, r11, #16\n\t"
  33080. "mul r6, r11, r6\n\t"
  33081. "lsr r11, r6, #16\n\t"
  33082. "lsl r6, r6, #16\n\t"
  33083. "adds r10, r10, r6\n\t"
  33084. "adc r4, r4, r11\n\t"
  33085. "lsl r6, r8, #16\n\t"
  33086. "lsl r11, r7, #16\n\t"
  33087. "lsr r6, r6, #16\n\t"
  33088. "lsr r11, r11, #16\n\t"
  33089. "mul r11, r6, r11\n\t"
  33090. "adds r10, r10, r11\n\t"
  33091. "adc r4, r4, #0\n\t"
  33092. "lsr r11, r7, #16\n\t"
  33093. "mul r6, r11, r6\n\t"
  33094. "lsr r11, r6, #16\n\t"
  33095. "lsl r6, r6, #16\n\t"
  33096. "adds r10, r10, r6\n\t"
  33097. "adc r4, r4, r11\n\t"
  33098. "adds r10, r10, r5\n\t"
  33099. "str r10, [%[a], #124]\n\t"
  33100. "adc r4, r4, #0\n\t"
  33101. /* a[i+32] += m[32] * mu */
  33102. "ldr r7, [%[m], #128]\n\t"
  33103. "ldr r10, [%[a], #128]\n\t"
  33104. "lsr r11, r7, #16\n\t"
  33105. "lsr r6, r8, #16\n\t"
  33106. "mul r5, r6, r11\n\t"
  33107. "lsl r11, r7, #16\n\t"
  33108. "lsr r11, r11, #16\n\t"
  33109. "mul r6, r11, r6\n\t"
  33110. "lsr r11, r6, #16\n\t"
  33111. "lsl r6, r6, #16\n\t"
  33112. "adds r10, r10, r6\n\t"
  33113. "adc r5, r5, r11\n\t"
  33114. "lsl r6, r8, #16\n\t"
  33115. "lsl r11, r7, #16\n\t"
  33116. "lsr r6, r6, #16\n\t"
  33117. "lsr r11, r11, #16\n\t"
  33118. "mul r11, r6, r11\n\t"
  33119. "adds r10, r10, r11\n\t"
  33120. "adc r5, r5, #0\n\t"
  33121. "lsr r11, r7, #16\n\t"
  33122. "mul r6, r11, r6\n\t"
  33123. "lsr r11, r6, #16\n\t"
  33124. "lsl r6, r6, #16\n\t"
  33125. "adds r10, r10, r6\n\t"
  33126. "adc r5, r5, r11\n\t"
  33127. "adds r10, r10, r4\n\t"
  33128. "str r10, [%[a], #128]\n\t"
  33129. "adc r5, r5, #0\n\t"
  33130. /* a[i+33] += m[33] * mu */
  33131. "ldr r7, [%[m], #132]\n\t"
  33132. "ldr r10, [%[a], #132]\n\t"
  33133. "lsr r11, r7, #16\n\t"
  33134. "lsr r6, r8, #16\n\t"
  33135. "mul r4, r6, r11\n\t"
  33136. "lsl r11, r7, #16\n\t"
  33137. "lsr r11, r11, #16\n\t"
  33138. "mul r6, r11, r6\n\t"
  33139. "lsr r11, r6, #16\n\t"
  33140. "lsl r6, r6, #16\n\t"
  33141. "adds r10, r10, r6\n\t"
  33142. "adc r4, r4, r11\n\t"
  33143. "lsl r6, r8, #16\n\t"
  33144. "lsl r11, r7, #16\n\t"
  33145. "lsr r6, r6, #16\n\t"
  33146. "lsr r11, r11, #16\n\t"
  33147. "mul r11, r6, r11\n\t"
  33148. "adds r10, r10, r11\n\t"
  33149. "adc r4, r4, #0\n\t"
  33150. "lsr r11, r7, #16\n\t"
  33151. "mul r6, r11, r6\n\t"
  33152. "lsr r11, r6, #16\n\t"
  33153. "lsl r6, r6, #16\n\t"
  33154. "adds r10, r10, r6\n\t"
  33155. "adc r4, r4, r11\n\t"
  33156. "adds r10, r10, r5\n\t"
  33157. "str r10, [%[a], #132]\n\t"
  33158. "adc r4, r4, #0\n\t"
  33159. /* a[i+34] += m[34] * mu */
  33160. "ldr r7, [%[m], #136]\n\t"
  33161. "ldr r10, [%[a], #136]\n\t"
  33162. "lsr r11, r7, #16\n\t"
  33163. "lsr r6, r8, #16\n\t"
  33164. "mul r5, r6, r11\n\t"
  33165. "lsl r11, r7, #16\n\t"
  33166. "lsr r11, r11, #16\n\t"
  33167. "mul r6, r11, r6\n\t"
  33168. "lsr r11, r6, #16\n\t"
  33169. "lsl r6, r6, #16\n\t"
  33170. "adds r10, r10, r6\n\t"
  33171. "adc r5, r5, r11\n\t"
  33172. "lsl r6, r8, #16\n\t"
  33173. "lsl r11, r7, #16\n\t"
  33174. "lsr r6, r6, #16\n\t"
  33175. "lsr r11, r11, #16\n\t"
  33176. "mul r11, r6, r11\n\t"
  33177. "adds r10, r10, r11\n\t"
  33178. "adc r5, r5, #0\n\t"
  33179. "lsr r11, r7, #16\n\t"
  33180. "mul r6, r11, r6\n\t"
  33181. "lsr r11, r6, #16\n\t"
  33182. "lsl r6, r6, #16\n\t"
  33183. "adds r10, r10, r6\n\t"
  33184. "adc r5, r5, r11\n\t"
  33185. "adds r10, r10, r4\n\t"
  33186. "str r10, [%[a], #136]\n\t"
  33187. "adc r5, r5, #0\n\t"
  33188. /* a[i+35] += m[35] * mu */
  33189. "ldr r7, [%[m], #140]\n\t"
  33190. "ldr r10, [%[a], #140]\n\t"
  33191. "lsr r11, r7, #16\n\t"
  33192. "lsr r6, r8, #16\n\t"
  33193. "mul r4, r6, r11\n\t"
  33194. "lsl r11, r7, #16\n\t"
  33195. "lsr r11, r11, #16\n\t"
  33196. "mul r6, r11, r6\n\t"
  33197. "lsr r11, r6, #16\n\t"
  33198. "lsl r6, r6, #16\n\t"
  33199. "adds r10, r10, r6\n\t"
  33200. "adc r4, r4, r11\n\t"
  33201. "lsl r6, r8, #16\n\t"
  33202. "lsl r11, r7, #16\n\t"
  33203. "lsr r6, r6, #16\n\t"
  33204. "lsr r11, r11, #16\n\t"
  33205. "mul r11, r6, r11\n\t"
  33206. "adds r10, r10, r11\n\t"
  33207. "adc r4, r4, #0\n\t"
  33208. "lsr r11, r7, #16\n\t"
  33209. "mul r6, r11, r6\n\t"
  33210. "lsr r11, r6, #16\n\t"
  33211. "lsl r6, r6, #16\n\t"
  33212. "adds r10, r10, r6\n\t"
  33213. "adc r4, r4, r11\n\t"
  33214. "adds r10, r10, r5\n\t"
  33215. "str r10, [%[a], #140]\n\t"
  33216. "adc r4, r4, #0\n\t"
  33217. /* a[i+36] += m[36] * mu */
  33218. "ldr r7, [%[m], #144]\n\t"
  33219. "ldr r10, [%[a], #144]\n\t"
  33220. "lsr r11, r7, #16\n\t"
  33221. "lsr r6, r8, #16\n\t"
  33222. "mul r5, r6, r11\n\t"
  33223. "lsl r11, r7, #16\n\t"
  33224. "lsr r11, r11, #16\n\t"
  33225. "mul r6, r11, r6\n\t"
  33226. "lsr r11, r6, #16\n\t"
  33227. "lsl r6, r6, #16\n\t"
  33228. "adds r10, r10, r6\n\t"
  33229. "adc r5, r5, r11\n\t"
  33230. "lsl r6, r8, #16\n\t"
  33231. "lsl r11, r7, #16\n\t"
  33232. "lsr r6, r6, #16\n\t"
  33233. "lsr r11, r11, #16\n\t"
  33234. "mul r11, r6, r11\n\t"
  33235. "adds r10, r10, r11\n\t"
  33236. "adc r5, r5, #0\n\t"
  33237. "lsr r11, r7, #16\n\t"
  33238. "mul r6, r11, r6\n\t"
  33239. "lsr r11, r6, #16\n\t"
  33240. "lsl r6, r6, #16\n\t"
  33241. "adds r10, r10, r6\n\t"
  33242. "adc r5, r5, r11\n\t"
  33243. "adds r10, r10, r4\n\t"
  33244. "str r10, [%[a], #144]\n\t"
  33245. "adc r5, r5, #0\n\t"
  33246. /* a[i+37] += m[37] * mu */
  33247. "ldr r7, [%[m], #148]\n\t"
  33248. "ldr r10, [%[a], #148]\n\t"
  33249. "lsr r11, r7, #16\n\t"
  33250. "lsr r6, r8, #16\n\t"
  33251. "mul r4, r6, r11\n\t"
  33252. "lsl r11, r7, #16\n\t"
  33253. "lsr r11, r11, #16\n\t"
  33254. "mul r6, r11, r6\n\t"
  33255. "lsr r11, r6, #16\n\t"
  33256. "lsl r6, r6, #16\n\t"
  33257. "adds r10, r10, r6\n\t"
  33258. "adc r4, r4, r11\n\t"
  33259. "lsl r6, r8, #16\n\t"
  33260. "lsl r11, r7, #16\n\t"
  33261. "lsr r6, r6, #16\n\t"
  33262. "lsr r11, r11, #16\n\t"
  33263. "mul r11, r6, r11\n\t"
  33264. "adds r10, r10, r11\n\t"
  33265. "adc r4, r4, #0\n\t"
  33266. "lsr r11, r7, #16\n\t"
  33267. "mul r6, r11, r6\n\t"
  33268. "lsr r11, r6, #16\n\t"
  33269. "lsl r6, r6, #16\n\t"
  33270. "adds r10, r10, r6\n\t"
  33271. "adc r4, r4, r11\n\t"
  33272. "adds r10, r10, r5\n\t"
  33273. "str r10, [%[a], #148]\n\t"
  33274. "adc r4, r4, #0\n\t"
  33275. /* a[i+38] += m[38] * mu */
  33276. "ldr r7, [%[m], #152]\n\t"
  33277. "ldr r10, [%[a], #152]\n\t"
  33278. "lsr r11, r7, #16\n\t"
  33279. "lsr r6, r8, #16\n\t"
  33280. "mul r5, r6, r11\n\t"
  33281. "lsl r11, r7, #16\n\t"
  33282. "lsr r11, r11, #16\n\t"
  33283. "mul r6, r11, r6\n\t"
  33284. "lsr r11, r6, #16\n\t"
  33285. "lsl r6, r6, #16\n\t"
  33286. "adds r10, r10, r6\n\t"
  33287. "adc r5, r5, r11\n\t"
  33288. "lsl r6, r8, #16\n\t"
  33289. "lsl r11, r7, #16\n\t"
  33290. "lsr r6, r6, #16\n\t"
  33291. "lsr r11, r11, #16\n\t"
  33292. "mul r11, r6, r11\n\t"
  33293. "adds r10, r10, r11\n\t"
  33294. "adc r5, r5, #0\n\t"
  33295. "lsr r11, r7, #16\n\t"
  33296. "mul r6, r11, r6\n\t"
  33297. "lsr r11, r6, #16\n\t"
  33298. "lsl r6, r6, #16\n\t"
  33299. "adds r10, r10, r6\n\t"
  33300. "adc r5, r5, r11\n\t"
  33301. "adds r10, r10, r4\n\t"
  33302. "str r10, [%[a], #152]\n\t"
  33303. "adc r5, r5, #0\n\t"
  33304. /* a[i+39] += m[39] * mu */
  33305. "ldr r7, [%[m], #156]\n\t"
  33306. "ldr r10, [%[a], #156]\n\t"
  33307. "lsr r11, r7, #16\n\t"
  33308. "lsr r6, r8, #16\n\t"
  33309. "mul r4, r6, r11\n\t"
  33310. "lsl r11, r7, #16\n\t"
  33311. "lsr r11, r11, #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 r4, r4, r11\n\t"
  33317. "lsl r6, r8, #16\n\t"
  33318. "lsl r11, r7, #16\n\t"
  33319. "lsr r6, r6, #16\n\t"
  33320. "lsr r11, r11, #16\n\t"
  33321. "mul r11, r6, r11\n\t"
  33322. "adds r10, r10, r11\n\t"
  33323. "adc r4, r4, #0\n\t"
  33324. "lsr r11, r7, #16\n\t"
  33325. "mul r6, r11, r6\n\t"
  33326. "lsr r11, r6, #16\n\t"
  33327. "lsl r6, r6, #16\n\t"
  33328. "adds r10, r10, r6\n\t"
  33329. "adc r4, r4, r11\n\t"
  33330. "adds r10, r10, r5\n\t"
  33331. "str r10, [%[a], #156]\n\t"
  33332. "adc r4, r4, #0\n\t"
  33333. /* a[i+40] += m[40] * mu */
  33334. "ldr r7, [%[m], #160]\n\t"
  33335. "ldr r10, [%[a], #160]\n\t"
  33336. "lsr r11, r7, #16\n\t"
  33337. "lsr r6, r8, #16\n\t"
  33338. "mul r5, r6, r11\n\t"
  33339. "lsl r11, r7, #16\n\t"
  33340. "lsr r11, r11, #16\n\t"
  33341. "mul r6, r11, r6\n\t"
  33342. "lsr r11, r6, #16\n\t"
  33343. "lsl r6, r6, #16\n\t"
  33344. "adds r10, r10, r6\n\t"
  33345. "adc r5, r5, r11\n\t"
  33346. "lsl r6, r8, #16\n\t"
  33347. "lsl r11, r7, #16\n\t"
  33348. "lsr r6, r6, #16\n\t"
  33349. "lsr r11, r11, #16\n\t"
  33350. "mul r11, r6, r11\n\t"
  33351. "adds r10, r10, r11\n\t"
  33352. "adc r5, r5, #0\n\t"
  33353. "lsr r11, r7, #16\n\t"
  33354. "mul r6, r11, r6\n\t"
  33355. "lsr r11, r6, #16\n\t"
  33356. "lsl r6, r6, #16\n\t"
  33357. "adds r10, r10, r6\n\t"
  33358. "adc r5, r5, r11\n\t"
  33359. "adds r10, r10, r4\n\t"
  33360. "str r10, [%[a], #160]\n\t"
  33361. "adc r5, r5, #0\n\t"
  33362. /* a[i+41] += m[41] * mu */
  33363. "ldr r7, [%[m], #164]\n\t"
  33364. "ldr r10, [%[a], #164]\n\t"
  33365. "lsr r11, r7, #16\n\t"
  33366. "lsr r6, r8, #16\n\t"
  33367. "mul r4, r6, r11\n\t"
  33368. "lsl r11, r7, #16\n\t"
  33369. "lsr r11, r11, #16\n\t"
  33370. "mul r6, r11, r6\n\t"
  33371. "lsr r11, r6, #16\n\t"
  33372. "lsl r6, r6, #16\n\t"
  33373. "adds r10, r10, r6\n\t"
  33374. "adc r4, r4, r11\n\t"
  33375. "lsl r6, r8, #16\n\t"
  33376. "lsl r11, r7, #16\n\t"
  33377. "lsr r6, r6, #16\n\t"
  33378. "lsr r11, r11, #16\n\t"
  33379. "mul r11, r6, r11\n\t"
  33380. "adds r10, r10, r11\n\t"
  33381. "adc r4, r4, #0\n\t"
  33382. "lsr r11, r7, #16\n\t"
  33383. "mul r6, r11, r6\n\t"
  33384. "lsr r11, r6, #16\n\t"
  33385. "lsl r6, r6, #16\n\t"
  33386. "adds r10, r10, r6\n\t"
  33387. "adc r4, r4, r11\n\t"
  33388. "adds r10, r10, r5\n\t"
  33389. "str r10, [%[a], #164]\n\t"
  33390. "adc r4, r4, #0\n\t"
  33391. /* a[i+42] += m[42] * mu */
  33392. "ldr r7, [%[m], #168]\n\t"
  33393. "ldr r10, [%[a], #168]\n\t"
  33394. "lsr r11, r7, #16\n\t"
  33395. "lsr r6, r8, #16\n\t"
  33396. "mul r5, r6, r11\n\t"
  33397. "lsl r11, r7, #16\n\t"
  33398. "lsr r11, r11, #16\n\t"
  33399. "mul r6, r11, r6\n\t"
  33400. "lsr r11, r6, #16\n\t"
  33401. "lsl r6, r6, #16\n\t"
  33402. "adds r10, r10, r6\n\t"
  33403. "adc r5, r5, r11\n\t"
  33404. "lsl r6, r8, #16\n\t"
  33405. "lsl r11, r7, #16\n\t"
  33406. "lsr r6, r6, #16\n\t"
  33407. "lsr r11, r11, #16\n\t"
  33408. "mul r11, r6, r11\n\t"
  33409. "adds r10, r10, r11\n\t"
  33410. "adc r5, r5, #0\n\t"
  33411. "lsr r11, r7, #16\n\t"
  33412. "mul r6, r11, r6\n\t"
  33413. "lsr r11, r6, #16\n\t"
  33414. "lsl r6, r6, #16\n\t"
  33415. "adds r10, r10, r6\n\t"
  33416. "adc r5, r5, r11\n\t"
  33417. "adds r10, r10, r4\n\t"
  33418. "str r10, [%[a], #168]\n\t"
  33419. "adc r5, r5, #0\n\t"
  33420. /* a[i+43] += m[43] * mu */
  33421. "ldr r7, [%[m], #172]\n\t"
  33422. "ldr r10, [%[a], #172]\n\t"
  33423. "lsr r11, r7, #16\n\t"
  33424. "lsr r6, r8, #16\n\t"
  33425. "mul r4, r6, r11\n\t"
  33426. "lsl r11, r7, #16\n\t"
  33427. "lsr r11, r11, #16\n\t"
  33428. "mul r6, r11, r6\n\t"
  33429. "lsr r11, r6, #16\n\t"
  33430. "lsl r6, r6, #16\n\t"
  33431. "adds r10, r10, r6\n\t"
  33432. "adc r4, r4, r11\n\t"
  33433. "lsl r6, r8, #16\n\t"
  33434. "lsl r11, r7, #16\n\t"
  33435. "lsr r6, r6, #16\n\t"
  33436. "lsr r11, r11, #16\n\t"
  33437. "mul r11, r6, r11\n\t"
  33438. "adds r10, r10, r11\n\t"
  33439. "adc r4, r4, #0\n\t"
  33440. "lsr r11, r7, #16\n\t"
  33441. "mul r6, r11, r6\n\t"
  33442. "lsr r11, r6, #16\n\t"
  33443. "lsl r6, r6, #16\n\t"
  33444. "adds r10, r10, r6\n\t"
  33445. "adc r4, r4, r11\n\t"
  33446. "adds r10, r10, r5\n\t"
  33447. "str r10, [%[a], #172]\n\t"
  33448. "adc r4, r4, #0\n\t"
  33449. /* a[i+44] += m[44] * mu */
  33450. "ldr r7, [%[m], #176]\n\t"
  33451. "ldr r10, [%[a], #176]\n\t"
  33452. "lsr r11, r7, #16\n\t"
  33453. "lsr r6, r8, #16\n\t"
  33454. "mul r5, r6, r11\n\t"
  33455. "lsl r11, r7, #16\n\t"
  33456. "lsr r11, r11, #16\n\t"
  33457. "mul r6, r11, r6\n\t"
  33458. "lsr r11, r6, #16\n\t"
  33459. "lsl r6, r6, #16\n\t"
  33460. "adds r10, r10, r6\n\t"
  33461. "adc r5, r5, r11\n\t"
  33462. "lsl r6, r8, #16\n\t"
  33463. "lsl r11, r7, #16\n\t"
  33464. "lsr r6, r6, #16\n\t"
  33465. "lsr r11, r11, #16\n\t"
  33466. "mul r11, r6, r11\n\t"
  33467. "adds r10, r10, r11\n\t"
  33468. "adc r5, r5, #0\n\t"
  33469. "lsr r11, r7, #16\n\t"
  33470. "mul r6, r11, r6\n\t"
  33471. "lsr r11, r6, #16\n\t"
  33472. "lsl r6, r6, #16\n\t"
  33473. "adds r10, r10, r6\n\t"
  33474. "adc r5, r5, r11\n\t"
  33475. "adds r10, r10, r4\n\t"
  33476. "str r10, [%[a], #176]\n\t"
  33477. "adc r5, r5, #0\n\t"
  33478. /* a[i+45] += m[45] * mu */
  33479. "ldr r7, [%[m], #180]\n\t"
  33480. "ldr r10, [%[a], #180]\n\t"
  33481. "lsr r11, r7, #16\n\t"
  33482. "lsr r6, r8, #16\n\t"
  33483. "mul r4, r6, r11\n\t"
  33484. "lsl r11, r7, #16\n\t"
  33485. "lsr r11, r11, #16\n\t"
  33486. "mul r6, r11, r6\n\t"
  33487. "lsr r11, r6, #16\n\t"
  33488. "lsl r6, r6, #16\n\t"
  33489. "adds r10, r10, r6\n\t"
  33490. "adc r4, r4, r11\n\t"
  33491. "lsl r6, r8, #16\n\t"
  33492. "lsl r11, r7, #16\n\t"
  33493. "lsr r6, r6, #16\n\t"
  33494. "lsr r11, r11, #16\n\t"
  33495. "mul r11, r6, r11\n\t"
  33496. "adds r10, r10, r11\n\t"
  33497. "adc r4, r4, #0\n\t"
  33498. "lsr r11, r7, #16\n\t"
  33499. "mul r6, r11, r6\n\t"
  33500. "lsr r11, r6, #16\n\t"
  33501. "lsl r6, r6, #16\n\t"
  33502. "adds r10, r10, r6\n\t"
  33503. "adc r4, r4, r11\n\t"
  33504. "adds r10, r10, r5\n\t"
  33505. "str r10, [%[a], #180]\n\t"
  33506. "adc r4, r4, #0\n\t"
  33507. /* a[i+46] += m[46] * mu */
  33508. "ldr r7, [%[m], #184]\n\t"
  33509. "ldr r10, [%[a], #184]\n\t"
  33510. "lsr r11, r7, #16\n\t"
  33511. "lsr r6, r8, #16\n\t"
  33512. "mul r5, r6, r11\n\t"
  33513. "lsl r11, r7, #16\n\t"
  33514. "lsr r11, r11, #16\n\t"
  33515. "mul r6, r11, r6\n\t"
  33516. "lsr r11, r6, #16\n\t"
  33517. "lsl r6, r6, #16\n\t"
  33518. "adds r10, r10, r6\n\t"
  33519. "adc r5, r5, r11\n\t"
  33520. "lsl r6, r8, #16\n\t"
  33521. "lsl r11, r7, #16\n\t"
  33522. "lsr r6, r6, #16\n\t"
  33523. "lsr r11, r11, #16\n\t"
  33524. "mul r11, r6, r11\n\t"
  33525. "adds r10, r10, r11\n\t"
  33526. "adc r5, r5, #0\n\t"
  33527. "lsr r11, r7, #16\n\t"
  33528. "mul r6, r11, r6\n\t"
  33529. "lsr r11, r6, #16\n\t"
  33530. "lsl r6, r6, #16\n\t"
  33531. "adds r10, r10, r6\n\t"
  33532. "adc r5, r5, r11\n\t"
  33533. "adds r10, r10, r4\n\t"
  33534. "str r10, [%[a], #184]\n\t"
  33535. "adc r5, r5, #0\n\t"
  33536. /* a[i+47] += m[47] * mu */
  33537. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  33538. "ldr r11, [%[m], #188]\n\t"
  33539. #else
  33540. "ldr r7, [%[m], #188]\n\t"
  33541. #endif
  33542. "ldr r10, [%[a], #188]\n\t"
  33543. "lsl r6, r8, #16\n\t"
  33544. "lsl r7, r11, #16\n\t"
  33545. "lsr r6, r6, #16\n\t"
  33546. "lsr r7, r7, #16\n\t"
  33547. "mul r7, r6, r7\n\t"
  33548. "adds r5, r5, r7\n\t"
  33549. "adcs r4, r3, #0\n\t"
  33550. "mov r3, #0\n\t"
  33551. "adc r3, r3, r3\n\t"
  33552. "lsr r7, r11, #16\n\t"
  33553. "mul r6, r7, r6\n\t"
  33554. "lsr r7, r6, #16\n\t"
  33555. "lsl r6, r6, #16\n\t"
  33556. "adds r5, r5, r6\n\t"
  33557. "adcs r4, r4, r7\n\t"
  33558. "adc r3, r3, #0\n\t"
  33559. "mov r6, r8\n\t"
  33560. "lsr r7, r11, #16\n\t"
  33561. "lsr r6, r6, #16\n\t"
  33562. "mul r7, r6, r7\n\t"
  33563. "adds r4, r4, r7\n\t"
  33564. "lsl r7, r11, #16\n\t"
  33565. "adc r3, r3, #0\n\t"
  33566. "lsr r7, r7, #16\n\t"
  33567. "mul r6, r7, r6\n\t"
  33568. "lsr r7, r6, #16\n\t"
  33569. "lsl r6, r6, #16\n\t"
  33570. "adds r5, r5, r6\n\t"
  33571. "adcs r4, r4, r7\n\t"
  33572. "adc r3, r3, #0\n\t"
  33573. "adds r10, r10, r5\n\t"
  33574. "str r10, [%[a], #188]\n\t"
  33575. "ldr r10, [%[a], #192]\n\t"
  33576. "adcs r10, r10, r4\n\t"
  33577. "str r10, [%[a], #192]\n\t"
  33578. "adc r3, r3, #0\n\t"
  33579. /* i += 1 */
  33580. "add r9, r9, #4\n\t"
  33581. "add %[a], %[a], #4\n\t"
  33582. "cmp r9, #0xc0\n\t"
  33583. "blt L_sp_3072_mont_reduce_48_word_%=\n\t"
  33584. /* Loop Done */
  33585. "str r12, [%[a]]\n\t"
  33586. "str lr, [%[a], #4]\n\t"
  33587. "mov %[mp], r3\n\t"
  33588. : [a] "+r" (a), [m] "+r" (m), [mp] "+r" (mp)
  33589. :
  33590. : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "cc"
  33591. );
  33592. sp_3072_cond_sub_48(a - 48, a, m, (sp_digit)0 - mp);
  33593. }
  33594. #elif defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  33595. /* Reduce the number back to 3072 bits using Montgomery reduction.
  33596. *
  33597. * a A single precision number to reduce in place.
  33598. * m The single precision number representing the modulus.
  33599. * mp The digit representing the negative inverse of m mod 2^n.
  33600. */
  33601. static SP_NOINLINE void sp_3072_mont_reduce_48(sp_digit* a_p, const sp_digit* m_p, sp_digit mp_p)
  33602. {
  33603. register sp_digit* a asm ("r0") = (sp_digit*)a_p;
  33604. register const sp_digit* m asm ("r1") = (const sp_digit*)m_p;
  33605. register sp_digit mp asm ("r2") = (sp_digit)mp_p;
  33606. __asm__ __volatile__ (
  33607. "ldr r11, [%[m]]\n\t"
  33608. /* i = 0 */
  33609. "mov r9, #0\n\t"
  33610. "mov r3, #0\n\t"
  33611. "ldr r12, [%[a]]\n\t"
  33612. "ldr lr, [%[a], #4]\n\t"
  33613. "\n"
  33614. "L_sp_3072_mont_reduce_48_word_%=: \n\t"
  33615. /* mu = a[i] * mp */
  33616. "mul r8, %[mp], r12\n\t"
  33617. /* a[i+0] += m[0] * mu */
  33618. "mov r5, #0\n\t"
  33619. "umlal r12, r5, r8, r11\n\t"
  33620. /* a[i+1] += m[1] * mu */
  33621. "ldr r7, [%[m], #4]\n\t"
  33622. "mov r4, #0\n\t"
  33623. "umlal lr, r4, r8, r7\n\t"
  33624. "mov r12, lr\n\t"
  33625. "adds r12, r12, r5\n\t"
  33626. "adc r4, r4, #0\n\t"
  33627. /* a[i+2] += m[2] * mu */
  33628. "ldr r7, [%[m], #8]\n\t"
  33629. "ldr lr, [%[a], #8]\n\t"
  33630. "mov r5, #0\n\t"
  33631. "umlal lr, r5, r8, r7\n\t"
  33632. "adds lr, lr, r4\n\t"
  33633. "adc r5, r5, #0\n\t"
  33634. /* a[i+3] += m[3] * mu */
  33635. "ldr r7, [%[m], #12]\n\t"
  33636. "ldr r10, [%[a], #12]\n\t"
  33637. "mov r4, #0\n\t"
  33638. "umlal r10, r4, r8, r7\n\t"
  33639. "adds r10, r10, r5\n\t"
  33640. "str r10, [%[a], #12]\n\t"
  33641. "adc r4, r4, #0\n\t"
  33642. /* a[i+4] += m[4] * mu */
  33643. "ldr r7, [%[m], #16]\n\t"
  33644. "ldr r10, [%[a], #16]\n\t"
  33645. "mov r5, #0\n\t"
  33646. "umlal r10, r5, r8, r7\n\t"
  33647. "adds r10, r10, r4\n\t"
  33648. "str r10, [%[a], #16]\n\t"
  33649. "adc r5, r5, #0\n\t"
  33650. /* a[i+5] += m[5] * mu */
  33651. "ldr r7, [%[m], #20]\n\t"
  33652. "ldr r10, [%[a], #20]\n\t"
  33653. "mov r4, #0\n\t"
  33654. "umlal r10, r4, r8, r7\n\t"
  33655. "adds r10, r10, r5\n\t"
  33656. "str r10, [%[a], #20]\n\t"
  33657. "adc r4, r4, #0\n\t"
  33658. /* a[i+6] += m[6] * mu */
  33659. "ldr r7, [%[m], #24]\n\t"
  33660. "ldr r10, [%[a], #24]\n\t"
  33661. "mov r5, #0\n\t"
  33662. "umlal r10, r5, r8, r7\n\t"
  33663. "adds r10, r10, r4\n\t"
  33664. "str r10, [%[a], #24]\n\t"
  33665. "adc r5, r5, #0\n\t"
  33666. /* a[i+7] += m[7] * mu */
  33667. "ldr r7, [%[m], #28]\n\t"
  33668. "ldr r10, [%[a], #28]\n\t"
  33669. "mov r4, #0\n\t"
  33670. "umlal r10, r4, r8, r7\n\t"
  33671. "adds r10, r10, r5\n\t"
  33672. "str r10, [%[a], #28]\n\t"
  33673. "adc r4, r4, #0\n\t"
  33674. /* a[i+8] += m[8] * mu */
  33675. "ldr r7, [%[m], #32]\n\t"
  33676. "ldr r10, [%[a], #32]\n\t"
  33677. "mov r5, #0\n\t"
  33678. "umlal r10, r5, r8, r7\n\t"
  33679. "adds r10, r10, r4\n\t"
  33680. "str r10, [%[a], #32]\n\t"
  33681. "adc r5, r5, #0\n\t"
  33682. /* a[i+9] += m[9] * mu */
  33683. "ldr r7, [%[m], #36]\n\t"
  33684. "ldr r10, [%[a], #36]\n\t"
  33685. "mov r4, #0\n\t"
  33686. "umlal r10, r4, r8, r7\n\t"
  33687. "adds r10, r10, r5\n\t"
  33688. "str r10, [%[a], #36]\n\t"
  33689. "adc r4, r4, #0\n\t"
  33690. /* a[i+10] += m[10] * mu */
  33691. "ldr r7, [%[m], #40]\n\t"
  33692. "ldr r10, [%[a], #40]\n\t"
  33693. "mov r5, #0\n\t"
  33694. "umlal r10, r5, r8, r7\n\t"
  33695. "adds r10, r10, r4\n\t"
  33696. "str r10, [%[a], #40]\n\t"
  33697. "adc r5, r5, #0\n\t"
  33698. /* a[i+11] += m[11] * mu */
  33699. "ldr r7, [%[m], #44]\n\t"
  33700. "ldr r10, [%[a], #44]\n\t"
  33701. "mov r4, #0\n\t"
  33702. "umlal r10, r4, r8, r7\n\t"
  33703. "adds r10, r10, r5\n\t"
  33704. "str r10, [%[a], #44]\n\t"
  33705. "adc r4, r4, #0\n\t"
  33706. /* a[i+12] += m[12] * mu */
  33707. "ldr r7, [%[m], #48]\n\t"
  33708. "ldr r10, [%[a], #48]\n\t"
  33709. "mov r5, #0\n\t"
  33710. "umlal r10, r5, r8, r7\n\t"
  33711. "adds r10, r10, r4\n\t"
  33712. "str r10, [%[a], #48]\n\t"
  33713. "adc r5, r5, #0\n\t"
  33714. /* a[i+13] += m[13] * mu */
  33715. "ldr r7, [%[m], #52]\n\t"
  33716. "ldr r10, [%[a], #52]\n\t"
  33717. "mov r4, #0\n\t"
  33718. "umlal r10, r4, r8, r7\n\t"
  33719. "adds r10, r10, r5\n\t"
  33720. "str r10, [%[a], #52]\n\t"
  33721. "adc r4, r4, #0\n\t"
  33722. /* a[i+14] += m[14] * mu */
  33723. "ldr r7, [%[m], #56]\n\t"
  33724. "ldr r10, [%[a], #56]\n\t"
  33725. "mov r5, #0\n\t"
  33726. "umlal r10, r5, r8, r7\n\t"
  33727. "adds r10, r10, r4\n\t"
  33728. "str r10, [%[a], #56]\n\t"
  33729. "adc r5, r5, #0\n\t"
  33730. /* a[i+15] += m[15] * mu */
  33731. "ldr r7, [%[m], #60]\n\t"
  33732. "ldr r10, [%[a], #60]\n\t"
  33733. "mov r4, #0\n\t"
  33734. "umlal r10, r4, r8, r7\n\t"
  33735. "adds r10, r10, r5\n\t"
  33736. "str r10, [%[a], #60]\n\t"
  33737. "adc r4, r4, #0\n\t"
  33738. /* a[i+16] += m[16] * mu */
  33739. "ldr r7, [%[m], #64]\n\t"
  33740. "ldr r10, [%[a], #64]\n\t"
  33741. "mov r5, #0\n\t"
  33742. "umlal r10, r5, r8, r7\n\t"
  33743. "adds r10, r10, r4\n\t"
  33744. "str r10, [%[a], #64]\n\t"
  33745. "adc r5, r5, #0\n\t"
  33746. /* a[i+17] += m[17] * mu */
  33747. "ldr r7, [%[m], #68]\n\t"
  33748. "ldr r10, [%[a], #68]\n\t"
  33749. "mov r4, #0\n\t"
  33750. "umlal r10, r4, r8, r7\n\t"
  33751. "adds r10, r10, r5\n\t"
  33752. "str r10, [%[a], #68]\n\t"
  33753. "adc r4, r4, #0\n\t"
  33754. /* a[i+18] += m[18] * mu */
  33755. "ldr r7, [%[m], #72]\n\t"
  33756. "ldr r10, [%[a], #72]\n\t"
  33757. "mov r5, #0\n\t"
  33758. "umlal r10, r5, r8, r7\n\t"
  33759. "adds r10, r10, r4\n\t"
  33760. "str r10, [%[a], #72]\n\t"
  33761. "adc r5, r5, #0\n\t"
  33762. /* a[i+19] += m[19] * mu */
  33763. "ldr r7, [%[m], #76]\n\t"
  33764. "ldr r10, [%[a], #76]\n\t"
  33765. "mov r4, #0\n\t"
  33766. "umlal r10, r4, r8, r7\n\t"
  33767. "adds r10, r10, r5\n\t"
  33768. "str r10, [%[a], #76]\n\t"
  33769. "adc r4, r4, #0\n\t"
  33770. /* a[i+20] += m[20] * mu */
  33771. "ldr r7, [%[m], #80]\n\t"
  33772. "ldr r10, [%[a], #80]\n\t"
  33773. "mov r5, #0\n\t"
  33774. "umlal r10, r5, r8, r7\n\t"
  33775. "adds r10, r10, r4\n\t"
  33776. "str r10, [%[a], #80]\n\t"
  33777. "adc r5, r5, #0\n\t"
  33778. /* a[i+21] += m[21] * mu */
  33779. "ldr r7, [%[m], #84]\n\t"
  33780. "ldr r10, [%[a], #84]\n\t"
  33781. "mov r4, #0\n\t"
  33782. "umlal r10, r4, r8, r7\n\t"
  33783. "adds r10, r10, r5\n\t"
  33784. "str r10, [%[a], #84]\n\t"
  33785. "adc r4, r4, #0\n\t"
  33786. /* a[i+22] += m[22] * mu */
  33787. "ldr r7, [%[m], #88]\n\t"
  33788. "ldr r10, [%[a], #88]\n\t"
  33789. "mov r5, #0\n\t"
  33790. "umlal r10, r5, r8, r7\n\t"
  33791. "adds r10, r10, r4\n\t"
  33792. "str r10, [%[a], #88]\n\t"
  33793. "adc r5, r5, #0\n\t"
  33794. /* a[i+23] += m[23] * mu */
  33795. "ldr r7, [%[m], #92]\n\t"
  33796. "ldr r10, [%[a], #92]\n\t"
  33797. "mov r4, #0\n\t"
  33798. "umlal r10, r4, r8, r7\n\t"
  33799. "adds r10, r10, r5\n\t"
  33800. "str r10, [%[a], #92]\n\t"
  33801. "adc r4, r4, #0\n\t"
  33802. /* a[i+24] += m[24] * mu */
  33803. "ldr r7, [%[m], #96]\n\t"
  33804. "ldr r10, [%[a], #96]\n\t"
  33805. "mov r5, #0\n\t"
  33806. "umlal r10, r5, r8, r7\n\t"
  33807. "adds r10, r10, r4\n\t"
  33808. "str r10, [%[a], #96]\n\t"
  33809. "adc r5, r5, #0\n\t"
  33810. /* a[i+25] += m[25] * mu */
  33811. "ldr r7, [%[m], #100]\n\t"
  33812. "ldr r10, [%[a], #100]\n\t"
  33813. "mov r4, #0\n\t"
  33814. "umlal r10, r4, r8, r7\n\t"
  33815. "adds r10, r10, r5\n\t"
  33816. "str r10, [%[a], #100]\n\t"
  33817. "adc r4, r4, #0\n\t"
  33818. /* a[i+26] += m[26] * mu */
  33819. "ldr r7, [%[m], #104]\n\t"
  33820. "ldr r10, [%[a], #104]\n\t"
  33821. "mov r5, #0\n\t"
  33822. "umlal r10, r5, r8, r7\n\t"
  33823. "adds r10, r10, r4\n\t"
  33824. "str r10, [%[a], #104]\n\t"
  33825. "adc r5, r5, #0\n\t"
  33826. /* a[i+27] += m[27] * mu */
  33827. "ldr r7, [%[m], #108]\n\t"
  33828. "ldr r10, [%[a], #108]\n\t"
  33829. "mov r4, #0\n\t"
  33830. "umlal r10, r4, r8, r7\n\t"
  33831. "adds r10, r10, r5\n\t"
  33832. "str r10, [%[a], #108]\n\t"
  33833. "adc r4, r4, #0\n\t"
  33834. /* a[i+28] += m[28] * mu */
  33835. "ldr r7, [%[m], #112]\n\t"
  33836. "ldr r10, [%[a], #112]\n\t"
  33837. "mov r5, #0\n\t"
  33838. "umlal r10, r5, r8, r7\n\t"
  33839. "adds r10, r10, r4\n\t"
  33840. "str r10, [%[a], #112]\n\t"
  33841. "adc r5, r5, #0\n\t"
  33842. /* a[i+29] += m[29] * mu */
  33843. "ldr r7, [%[m], #116]\n\t"
  33844. "ldr r10, [%[a], #116]\n\t"
  33845. "mov r4, #0\n\t"
  33846. "umlal r10, r4, r8, r7\n\t"
  33847. "adds r10, r10, r5\n\t"
  33848. "str r10, [%[a], #116]\n\t"
  33849. "adc r4, r4, #0\n\t"
  33850. /* a[i+30] += m[30] * mu */
  33851. "ldr r7, [%[m], #120]\n\t"
  33852. "ldr r10, [%[a], #120]\n\t"
  33853. "mov r5, #0\n\t"
  33854. "umlal r10, r5, r8, r7\n\t"
  33855. "adds r10, r10, r4\n\t"
  33856. "str r10, [%[a], #120]\n\t"
  33857. "adc r5, r5, #0\n\t"
  33858. /* a[i+31] += m[31] * mu */
  33859. "ldr r7, [%[m], #124]\n\t"
  33860. "ldr r10, [%[a], #124]\n\t"
  33861. "mov r4, #0\n\t"
  33862. "umlal r10, r4, r8, r7\n\t"
  33863. "adds r10, r10, r5\n\t"
  33864. "str r10, [%[a], #124]\n\t"
  33865. "adc r4, r4, #0\n\t"
  33866. /* a[i+32] += m[32] * mu */
  33867. "ldr r7, [%[m], #128]\n\t"
  33868. "ldr r10, [%[a], #128]\n\t"
  33869. "mov r5, #0\n\t"
  33870. "umlal r10, r5, r8, r7\n\t"
  33871. "adds r10, r10, r4\n\t"
  33872. "str r10, [%[a], #128]\n\t"
  33873. "adc r5, r5, #0\n\t"
  33874. /* a[i+33] += m[33] * mu */
  33875. "ldr r7, [%[m], #132]\n\t"
  33876. "ldr r10, [%[a], #132]\n\t"
  33877. "mov r4, #0\n\t"
  33878. "umlal r10, r4, r8, r7\n\t"
  33879. "adds r10, r10, r5\n\t"
  33880. "str r10, [%[a], #132]\n\t"
  33881. "adc r4, r4, #0\n\t"
  33882. /* a[i+34] += m[34] * mu */
  33883. "ldr r7, [%[m], #136]\n\t"
  33884. "ldr r10, [%[a], #136]\n\t"
  33885. "mov r5, #0\n\t"
  33886. "umlal r10, r5, r8, r7\n\t"
  33887. "adds r10, r10, r4\n\t"
  33888. "str r10, [%[a], #136]\n\t"
  33889. "adc r5, r5, #0\n\t"
  33890. /* a[i+35] += m[35] * mu */
  33891. "ldr r7, [%[m], #140]\n\t"
  33892. "ldr r10, [%[a], #140]\n\t"
  33893. "mov r4, #0\n\t"
  33894. "umlal r10, r4, r8, r7\n\t"
  33895. "adds r10, r10, r5\n\t"
  33896. "str r10, [%[a], #140]\n\t"
  33897. "adc r4, r4, #0\n\t"
  33898. /* a[i+36] += m[36] * mu */
  33899. "ldr r7, [%[m], #144]\n\t"
  33900. "ldr r10, [%[a], #144]\n\t"
  33901. "mov r5, #0\n\t"
  33902. "umlal r10, r5, r8, r7\n\t"
  33903. "adds r10, r10, r4\n\t"
  33904. "str r10, [%[a], #144]\n\t"
  33905. "adc r5, r5, #0\n\t"
  33906. /* a[i+37] += m[37] * mu */
  33907. "ldr r7, [%[m], #148]\n\t"
  33908. "ldr r10, [%[a], #148]\n\t"
  33909. "mov r4, #0\n\t"
  33910. "umlal r10, r4, r8, r7\n\t"
  33911. "adds r10, r10, r5\n\t"
  33912. "str r10, [%[a], #148]\n\t"
  33913. "adc r4, r4, #0\n\t"
  33914. /* a[i+38] += m[38] * mu */
  33915. "ldr r7, [%[m], #152]\n\t"
  33916. "ldr r10, [%[a], #152]\n\t"
  33917. "mov r5, #0\n\t"
  33918. "umlal r10, r5, r8, r7\n\t"
  33919. "adds r10, r10, r4\n\t"
  33920. "str r10, [%[a], #152]\n\t"
  33921. "adc r5, r5, #0\n\t"
  33922. /* a[i+39] += m[39] * mu */
  33923. "ldr r7, [%[m], #156]\n\t"
  33924. "ldr r10, [%[a], #156]\n\t"
  33925. "mov r4, #0\n\t"
  33926. "umlal r10, r4, r8, r7\n\t"
  33927. "adds r10, r10, r5\n\t"
  33928. "str r10, [%[a], #156]\n\t"
  33929. "adc r4, r4, #0\n\t"
  33930. /* a[i+40] += m[40] * mu */
  33931. "ldr r7, [%[m], #160]\n\t"
  33932. "ldr r10, [%[a], #160]\n\t"
  33933. "mov r5, #0\n\t"
  33934. "umlal r10, r5, r8, r7\n\t"
  33935. "adds r10, r10, r4\n\t"
  33936. "str r10, [%[a], #160]\n\t"
  33937. "adc r5, r5, #0\n\t"
  33938. /* a[i+41] += m[41] * mu */
  33939. "ldr r7, [%[m], #164]\n\t"
  33940. "ldr r10, [%[a], #164]\n\t"
  33941. "mov r4, #0\n\t"
  33942. "umlal r10, r4, r8, r7\n\t"
  33943. "adds r10, r10, r5\n\t"
  33944. "str r10, [%[a], #164]\n\t"
  33945. "adc r4, r4, #0\n\t"
  33946. /* a[i+42] += m[42] * mu */
  33947. "ldr r7, [%[m], #168]\n\t"
  33948. "ldr r10, [%[a], #168]\n\t"
  33949. "mov r5, #0\n\t"
  33950. "umlal r10, r5, r8, r7\n\t"
  33951. "adds r10, r10, r4\n\t"
  33952. "str r10, [%[a], #168]\n\t"
  33953. "adc r5, r5, #0\n\t"
  33954. /* a[i+43] += m[43] * mu */
  33955. "ldr r7, [%[m], #172]\n\t"
  33956. "ldr r10, [%[a], #172]\n\t"
  33957. "mov r4, #0\n\t"
  33958. "umlal r10, r4, r8, r7\n\t"
  33959. "adds r10, r10, r5\n\t"
  33960. "str r10, [%[a], #172]\n\t"
  33961. "adc r4, r4, #0\n\t"
  33962. /* a[i+44] += m[44] * mu */
  33963. "ldr r7, [%[m], #176]\n\t"
  33964. "ldr r10, [%[a], #176]\n\t"
  33965. "mov r5, #0\n\t"
  33966. "umlal r10, r5, r8, r7\n\t"
  33967. "adds r10, r10, r4\n\t"
  33968. "str r10, [%[a], #176]\n\t"
  33969. "adc r5, r5, #0\n\t"
  33970. /* a[i+45] += m[45] * mu */
  33971. "ldr r7, [%[m], #180]\n\t"
  33972. "ldr r10, [%[a], #180]\n\t"
  33973. "mov r4, #0\n\t"
  33974. "umlal r10, r4, r8, r7\n\t"
  33975. "adds r10, r10, r5\n\t"
  33976. "str r10, [%[a], #180]\n\t"
  33977. "adc r4, r4, #0\n\t"
  33978. /* a[i+46] += m[46] * mu */
  33979. "ldr r7, [%[m], #184]\n\t"
  33980. "ldr r10, [%[a], #184]\n\t"
  33981. "mov r5, #0\n\t"
  33982. "umlal r10, r5, r8, r7\n\t"
  33983. "adds r10, r10, r4\n\t"
  33984. "str r10, [%[a], #184]\n\t"
  33985. "adc r5, r5, #0\n\t"
  33986. /* a[i+47] += m[47] * mu */
  33987. "ldr r7, [%[m], #188]\n\t"
  33988. "ldr r10, [%[a], #188]\n\t"
  33989. "umull r6, r7, r8, r7\n\t"
  33990. "adds r5, r5, r6\n\t"
  33991. "adcs r4, r7, r3\n\t"
  33992. "mov r3, #0\n\t"
  33993. "adc r3, r3, r3\n\t"
  33994. "adds r10, r10, r5\n\t"
  33995. "str r10, [%[a], #188]\n\t"
  33996. "ldr r10, [%[a], #192]\n\t"
  33997. "adcs r10, r10, r4\n\t"
  33998. "str r10, [%[a], #192]\n\t"
  33999. "adc r3, r3, #0\n\t"
  34000. /* i += 1 */
  34001. "add r9, r9, #4\n\t"
  34002. "add %[a], %[a], #4\n\t"
  34003. "cmp r9, #0xc0\n\t"
  34004. "blt L_sp_3072_mont_reduce_48_word_%=\n\t"
  34005. /* Loop Done */
  34006. "str r12, [%[a]]\n\t"
  34007. "str lr, [%[a], #4]\n\t"
  34008. "mov %[mp], r3\n\t"
  34009. : [a] "+r" (a), [m] "+r" (m), [mp] "+r" (mp)
  34010. :
  34011. : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "cc"
  34012. );
  34013. sp_3072_cond_sub_48(a - 48, a, m, (sp_digit)0 - mp);
  34014. }
  34015. #else
  34016. /* Reduce the number back to 3072 bits using Montgomery reduction.
  34017. *
  34018. * a A single precision number to reduce in place.
  34019. * m The single precision number representing the modulus.
  34020. * mp The digit representing the negative inverse of m mod 2^n.
  34021. */
  34022. static SP_NOINLINE void sp_3072_mont_reduce_48(sp_digit* a_p, const sp_digit* m_p, sp_digit mp_p)
  34023. {
  34024. register sp_digit* a asm ("r0") = (sp_digit*)a_p;
  34025. register const sp_digit* m asm ("r1") = (const sp_digit*)m_p;
  34026. register sp_digit mp asm ("r2") = (sp_digit)mp_p;
  34027. __asm__ __volatile__ (
  34028. /* i = 0 */
  34029. "mov r12, #0\n\t"
  34030. "mov lr, #0\n\t"
  34031. "ldr r4, [%[a]]\n\t"
  34032. "ldr r5, [%[a], #4]\n\t"
  34033. "ldr r6, [%[a], #8]\n\t"
  34034. "ldr r7, [%[a], #12]\n\t"
  34035. "ldr r8, [%[a], #16]\n\t"
  34036. "\n"
  34037. "L_sp_3072_mont_reduce_48_word_%=: \n\t"
  34038. /* mu = a[i] * mp */
  34039. "mul r11, %[mp], r4\n\t"
  34040. /* a[i+0] += m[0] * mu */
  34041. "ldr r10, [%[m]]\n\t"
  34042. "mov r3, #0\n\t"
  34043. "umaal r4, r3, r11, r10\n\t"
  34044. /* a[i+1] += m[1] * mu */
  34045. "ldr r10, [%[m], #4]\n\t"
  34046. "mov r4, r5\n\t"
  34047. "umaal r4, r3, r11, r10\n\t"
  34048. /* a[i+2] += m[2] * mu */
  34049. "ldr r10, [%[m], #8]\n\t"
  34050. "mov r5, r6\n\t"
  34051. "umaal r5, r3, r11, r10\n\t"
  34052. /* a[i+3] += m[3] * mu */
  34053. "ldr r10, [%[m], #12]\n\t"
  34054. "mov r6, r7\n\t"
  34055. "umaal r6, r3, r11, r10\n\t"
  34056. /* a[i+4] += m[4] * mu */
  34057. "ldr r10, [%[m], #16]\n\t"
  34058. "mov r7, r8\n\t"
  34059. "umaal r7, r3, r11, r10\n\t"
  34060. /* a[i+5] += m[5] * mu */
  34061. "ldr r10, [%[m], #20]\n\t"
  34062. "ldr r8, [%[a], #20]\n\t"
  34063. "umaal r8, r3, r11, r10\n\t"
  34064. /* a[i+6] += m[6] * mu */
  34065. "ldr r10, [%[m], #24]\n\t"
  34066. "ldr r9, [%[a], #24]\n\t"
  34067. "umaal r9, r3, r11, r10\n\t"
  34068. "str r9, [%[a], #24]\n\t"
  34069. /* a[i+7] += m[7] * mu */
  34070. "ldr r10, [%[m], #28]\n\t"
  34071. "ldr r9, [%[a], #28]\n\t"
  34072. "umaal r9, r3, r11, r10\n\t"
  34073. "str r9, [%[a], #28]\n\t"
  34074. /* a[i+8] += m[8] * mu */
  34075. "ldr r10, [%[m], #32]\n\t"
  34076. "ldr r9, [%[a], #32]\n\t"
  34077. "umaal r9, r3, r11, r10\n\t"
  34078. "str r9, [%[a], #32]\n\t"
  34079. /* a[i+9] += m[9] * mu */
  34080. "ldr r10, [%[m], #36]\n\t"
  34081. "ldr r9, [%[a], #36]\n\t"
  34082. "umaal r9, r3, r11, r10\n\t"
  34083. "str r9, [%[a], #36]\n\t"
  34084. /* a[i+10] += m[10] * mu */
  34085. "ldr r10, [%[m], #40]\n\t"
  34086. "ldr r9, [%[a], #40]\n\t"
  34087. "umaal r9, r3, r11, r10\n\t"
  34088. "str r9, [%[a], #40]\n\t"
  34089. /* a[i+11] += m[11] * mu */
  34090. "ldr r10, [%[m], #44]\n\t"
  34091. "ldr r9, [%[a], #44]\n\t"
  34092. "umaal r9, r3, r11, r10\n\t"
  34093. "str r9, [%[a], #44]\n\t"
  34094. /* a[i+12] += m[12] * mu */
  34095. "ldr r10, [%[m], #48]\n\t"
  34096. "ldr r9, [%[a], #48]\n\t"
  34097. "umaal r9, r3, r11, r10\n\t"
  34098. "str r9, [%[a], #48]\n\t"
  34099. /* a[i+13] += m[13] * mu */
  34100. "ldr r10, [%[m], #52]\n\t"
  34101. "ldr r9, [%[a], #52]\n\t"
  34102. "umaal r9, r3, r11, r10\n\t"
  34103. "str r9, [%[a], #52]\n\t"
  34104. /* a[i+14] += m[14] * mu */
  34105. "ldr r10, [%[m], #56]\n\t"
  34106. "ldr r9, [%[a], #56]\n\t"
  34107. "umaal r9, r3, r11, r10\n\t"
  34108. "str r9, [%[a], #56]\n\t"
  34109. /* a[i+15] += m[15] * mu */
  34110. "ldr r10, [%[m], #60]\n\t"
  34111. "ldr r9, [%[a], #60]\n\t"
  34112. "umaal r9, r3, r11, r10\n\t"
  34113. "str r9, [%[a], #60]\n\t"
  34114. /* a[i+16] += m[16] * mu */
  34115. "ldr r10, [%[m], #64]\n\t"
  34116. "ldr r9, [%[a], #64]\n\t"
  34117. "umaal r9, r3, r11, r10\n\t"
  34118. "str r9, [%[a], #64]\n\t"
  34119. /* a[i+17] += m[17] * mu */
  34120. "ldr r10, [%[m], #68]\n\t"
  34121. "ldr r9, [%[a], #68]\n\t"
  34122. "umaal r9, r3, r11, r10\n\t"
  34123. "str r9, [%[a], #68]\n\t"
  34124. /* a[i+18] += m[18] * mu */
  34125. "ldr r10, [%[m], #72]\n\t"
  34126. "ldr r9, [%[a], #72]\n\t"
  34127. "umaal r9, r3, r11, r10\n\t"
  34128. "str r9, [%[a], #72]\n\t"
  34129. /* a[i+19] += m[19] * mu */
  34130. "ldr r10, [%[m], #76]\n\t"
  34131. "ldr r9, [%[a], #76]\n\t"
  34132. "umaal r9, r3, r11, r10\n\t"
  34133. "str r9, [%[a], #76]\n\t"
  34134. /* a[i+20] += m[20] * mu */
  34135. "ldr r10, [%[m], #80]\n\t"
  34136. "ldr r9, [%[a], #80]\n\t"
  34137. "umaal r9, r3, r11, r10\n\t"
  34138. "str r9, [%[a], #80]\n\t"
  34139. /* a[i+21] += m[21] * mu */
  34140. "ldr r10, [%[m], #84]\n\t"
  34141. "ldr r9, [%[a], #84]\n\t"
  34142. "umaal r9, r3, r11, r10\n\t"
  34143. "str r9, [%[a], #84]\n\t"
  34144. /* a[i+22] += m[22] * mu */
  34145. "ldr r10, [%[m], #88]\n\t"
  34146. "ldr r9, [%[a], #88]\n\t"
  34147. "umaal r9, r3, r11, r10\n\t"
  34148. "str r9, [%[a], #88]\n\t"
  34149. /* a[i+23] += m[23] * mu */
  34150. "ldr r10, [%[m], #92]\n\t"
  34151. "ldr r9, [%[a], #92]\n\t"
  34152. "umaal r9, r3, r11, r10\n\t"
  34153. "str r9, [%[a], #92]\n\t"
  34154. /* a[i+24] += m[24] * mu */
  34155. "ldr r10, [%[m], #96]\n\t"
  34156. "ldr r9, [%[a], #96]\n\t"
  34157. "umaal r9, r3, r11, r10\n\t"
  34158. "str r9, [%[a], #96]\n\t"
  34159. /* a[i+25] += m[25] * mu */
  34160. "ldr r10, [%[m], #100]\n\t"
  34161. "ldr r9, [%[a], #100]\n\t"
  34162. "umaal r9, r3, r11, r10\n\t"
  34163. "str r9, [%[a], #100]\n\t"
  34164. /* a[i+26] += m[26] * mu */
  34165. "ldr r10, [%[m], #104]\n\t"
  34166. "ldr r9, [%[a], #104]\n\t"
  34167. "umaal r9, r3, r11, r10\n\t"
  34168. "str r9, [%[a], #104]\n\t"
  34169. /* a[i+27] += m[27] * mu */
  34170. "ldr r10, [%[m], #108]\n\t"
  34171. "ldr r9, [%[a], #108]\n\t"
  34172. "umaal r9, r3, r11, r10\n\t"
  34173. "str r9, [%[a], #108]\n\t"
  34174. /* a[i+28] += m[28] * mu */
  34175. "ldr r10, [%[m], #112]\n\t"
  34176. "ldr r9, [%[a], #112]\n\t"
  34177. "umaal r9, r3, r11, r10\n\t"
  34178. "str r9, [%[a], #112]\n\t"
  34179. /* a[i+29] += m[29] * mu */
  34180. "ldr r10, [%[m], #116]\n\t"
  34181. "ldr r9, [%[a], #116]\n\t"
  34182. "umaal r9, r3, r11, r10\n\t"
  34183. "str r9, [%[a], #116]\n\t"
  34184. /* a[i+30] += m[30] * mu */
  34185. "ldr r10, [%[m], #120]\n\t"
  34186. "ldr r9, [%[a], #120]\n\t"
  34187. "umaal r9, r3, r11, r10\n\t"
  34188. "str r9, [%[a], #120]\n\t"
  34189. /* a[i+31] += m[31] * mu */
  34190. "ldr r10, [%[m], #124]\n\t"
  34191. "ldr r9, [%[a], #124]\n\t"
  34192. "umaal r9, r3, r11, r10\n\t"
  34193. "str r9, [%[a], #124]\n\t"
  34194. /* a[i+32] += m[32] * mu */
  34195. "ldr r10, [%[m], #128]\n\t"
  34196. "ldr r9, [%[a], #128]\n\t"
  34197. "umaal r9, r3, r11, r10\n\t"
  34198. "str r9, [%[a], #128]\n\t"
  34199. /* a[i+33] += m[33] * mu */
  34200. "ldr r10, [%[m], #132]\n\t"
  34201. "ldr r9, [%[a], #132]\n\t"
  34202. "umaal r9, r3, r11, r10\n\t"
  34203. "str r9, [%[a], #132]\n\t"
  34204. /* a[i+34] += m[34] * mu */
  34205. "ldr r10, [%[m], #136]\n\t"
  34206. "ldr r9, [%[a], #136]\n\t"
  34207. "umaal r9, r3, r11, r10\n\t"
  34208. "str r9, [%[a], #136]\n\t"
  34209. /* a[i+35] += m[35] * mu */
  34210. "ldr r10, [%[m], #140]\n\t"
  34211. "ldr r9, [%[a], #140]\n\t"
  34212. "umaal r9, r3, r11, r10\n\t"
  34213. "str r9, [%[a], #140]\n\t"
  34214. /* a[i+36] += m[36] * mu */
  34215. "ldr r10, [%[m], #144]\n\t"
  34216. "ldr r9, [%[a], #144]\n\t"
  34217. "umaal r9, r3, r11, r10\n\t"
  34218. "str r9, [%[a], #144]\n\t"
  34219. /* a[i+37] += m[37] * mu */
  34220. "ldr r10, [%[m], #148]\n\t"
  34221. "ldr r9, [%[a], #148]\n\t"
  34222. "umaal r9, r3, r11, r10\n\t"
  34223. "str r9, [%[a], #148]\n\t"
  34224. /* a[i+38] += m[38] * mu */
  34225. "ldr r10, [%[m], #152]\n\t"
  34226. "ldr r9, [%[a], #152]\n\t"
  34227. "umaal r9, r3, r11, r10\n\t"
  34228. "str r9, [%[a], #152]\n\t"
  34229. /* a[i+39] += m[39] * mu */
  34230. "ldr r10, [%[m], #156]\n\t"
  34231. "ldr r9, [%[a], #156]\n\t"
  34232. "umaal r9, r3, r11, r10\n\t"
  34233. "str r9, [%[a], #156]\n\t"
  34234. /* a[i+40] += m[40] * mu */
  34235. "ldr r10, [%[m], #160]\n\t"
  34236. "ldr r9, [%[a], #160]\n\t"
  34237. "umaal r9, r3, r11, r10\n\t"
  34238. "str r9, [%[a], #160]\n\t"
  34239. /* a[i+41] += m[41] * mu */
  34240. "ldr r10, [%[m], #164]\n\t"
  34241. "ldr r9, [%[a], #164]\n\t"
  34242. "umaal r9, r3, r11, r10\n\t"
  34243. "str r9, [%[a], #164]\n\t"
  34244. /* a[i+42] += m[42] * mu */
  34245. "ldr r10, [%[m], #168]\n\t"
  34246. "ldr r9, [%[a], #168]\n\t"
  34247. "umaal r9, r3, r11, r10\n\t"
  34248. "str r9, [%[a], #168]\n\t"
  34249. /* a[i+43] += m[43] * mu */
  34250. "ldr r10, [%[m], #172]\n\t"
  34251. "ldr r9, [%[a], #172]\n\t"
  34252. "umaal r9, r3, r11, r10\n\t"
  34253. "str r9, [%[a], #172]\n\t"
  34254. /* a[i+44] += m[44] * mu */
  34255. "ldr r10, [%[m], #176]\n\t"
  34256. "ldr r9, [%[a], #176]\n\t"
  34257. "umaal r9, r3, r11, r10\n\t"
  34258. "str r9, [%[a], #176]\n\t"
  34259. /* a[i+45] += m[45] * mu */
  34260. "ldr r10, [%[m], #180]\n\t"
  34261. "ldr r9, [%[a], #180]\n\t"
  34262. "umaal r9, r3, r11, r10\n\t"
  34263. "str r9, [%[a], #180]\n\t"
  34264. /* a[i+46] += m[46] * mu */
  34265. "ldr r10, [%[m], #184]\n\t"
  34266. "ldr r9, [%[a], #184]\n\t"
  34267. "umaal r9, r3, r11, r10\n\t"
  34268. "str r9, [%[a], #184]\n\t"
  34269. /* a[i+47] += m[47] * mu */
  34270. "ldr r10, [%[m], #188]\n\t"
  34271. "ldr r9, [%[a], #188]\n\t"
  34272. "umaal r9, r3, r11, r10\n\t"
  34273. "ldr r11, [%[a], #192]\n\t"
  34274. "mov r10, #0\n\t"
  34275. "umaal r3, r11, r10, r10\n\t"
  34276. "str r9, [%[a], #188]\n\t"
  34277. "adds r3, r3, lr\n\t"
  34278. "adc lr, r11, #0\n\t"
  34279. "str r3, [%[a], #192]\n\t"
  34280. /* i += 1 */
  34281. "add r12, r12, #4\n\t"
  34282. "add %[a], %[a], #4\n\t"
  34283. "cmp r12, #0xc0\n\t"
  34284. "blt L_sp_3072_mont_reduce_48_word_%=\n\t"
  34285. /* Loop Done */
  34286. "str r4, [%[a]]\n\t"
  34287. "str r5, [%[a], #4]\n\t"
  34288. "str r6, [%[a], #8]\n\t"
  34289. "str r7, [%[a], #12]\n\t"
  34290. "str r8, [%[a], #16]\n\t"
  34291. "mov %[mp], lr\n\t"
  34292. : [a] "+r" (a), [m] "+r" (m), [mp] "+r" (mp)
  34293. :
  34294. : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "cc"
  34295. );
  34296. sp_3072_cond_sub_48(a - 48, a, m, (sp_digit)0 - mp);
  34297. }
  34298. #endif
  34299. /* Multiply two Montgomery form numbers mod the modulus (prime).
  34300. * (r = a * b mod m)
  34301. *
  34302. * r Result of multiplication.
  34303. * a First number to multiply in Montgomery form.
  34304. * b Second number to multiply in Montgomery form.
  34305. * m Modulus (prime).
  34306. * mp Montgomery multiplier.
  34307. */
  34308. SP_NOINLINE static void sp_3072_mont_mul_48(sp_digit* r, const sp_digit* a,
  34309. const sp_digit* b, const sp_digit* m, sp_digit mp)
  34310. {
  34311. sp_3072_mul_48(r, a, b);
  34312. sp_3072_mont_reduce_48(r, m, mp);
  34313. }
  34314. /* Square the Montgomery form number. (r = a * a mod m)
  34315. *
  34316. * r Result of squaring.
  34317. * a Number to square in Montgomery form.
  34318. * m Modulus (prime).
  34319. * mp Montgomery multiplier.
  34320. */
  34321. SP_NOINLINE static void sp_3072_mont_sqr_48(sp_digit* r, const sp_digit* a,
  34322. const sp_digit* m, sp_digit mp)
  34323. {
  34324. sp_3072_sqr_48(r, a);
  34325. sp_3072_mont_reduce_48(r, m, mp);
  34326. }
  34327. #ifdef WOLFSSL_SP_SMALL
  34328. /* Mul a by digit b into r. (r = a * b)
  34329. *
  34330. * r A single precision integer.
  34331. * a A single precision integer.
  34332. * b A single precision digit.
  34333. */
  34334. static void sp_3072_mul_d_48(sp_digit* r_p, const sp_digit* a_p, sp_digit b_p)
  34335. {
  34336. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  34337. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  34338. register sp_digit b asm ("r2") = (sp_digit)b_p;
  34339. __asm__ __volatile__ (
  34340. /* A[0] * B */
  34341. "ldr r8, [%[a]]\n\t"
  34342. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  34343. "lsl r6, %[b], #16\n\t"
  34344. "lsl r5, r8, #16\n\t"
  34345. "lsr r6, r6, #16\n\t"
  34346. "lsr r5, r5, #16\n\t"
  34347. "mul r5, r6, r5\n\t"
  34348. "lsr r7, r8, #16\n\t"
  34349. "mul r6, r7, r6\n\t"
  34350. "lsr r3, r6, #16\n\t"
  34351. "lsl r6, r6, #16\n\t"
  34352. "adds r5, r5, r6\n\t"
  34353. "adc r3, r3, #0\n\t"
  34354. "lsr r6, %[b], #16\n\t"
  34355. "mul r7, r6, r7\n\t"
  34356. "add r3, r3, r7\n\t"
  34357. "lsl r7, r8, #16\n\t"
  34358. "lsr r7, r7, #16\n\t"
  34359. "mul r6, r7, r6\n\t"
  34360. "lsr r7, r6, #16\n\t"
  34361. "lsl r6, r6, #16\n\t"
  34362. "adds r5, r5, r6\n\t"
  34363. "adc r3, r3, r7\n\t"
  34364. #else
  34365. "umull r5, r3, %[b], r8\n\t"
  34366. #endif
  34367. "mov r4, #0\n\t"
  34368. "str r5, [%[r]]\n\t"
  34369. "mov r5, #0\n\t"
  34370. "mov r9, #4\n\t"
  34371. "\n"
  34372. "L_sp_3072_mul_d_48_word_%=: \n\t"
  34373. /* A[i] * B */
  34374. "ldr r8, [%[a], r9]\n\t"
  34375. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  34376. "lsl r6, %[b], #16\n\t"
  34377. "lsl r7, r8, #16\n\t"
  34378. "lsr r6, r6, #16\n\t"
  34379. "lsr r7, r7, #16\n\t"
  34380. "mul r7, r6, r7\n\t"
  34381. "adds r3, r3, r7\n\t"
  34382. "adcs r4, r4, #0\n\t"
  34383. "adc r5, r5, #0\n\t"
  34384. "lsr r7, r8, #16\n\t"
  34385. "mul r6, r7, r6\n\t"
  34386. "lsr r7, r6, #16\n\t"
  34387. "lsl r6, r6, #16\n\t"
  34388. "adds r3, r3, r6\n\t"
  34389. "adcs r4, r4, r7\n\t"
  34390. "adc r5, r5, #0\n\t"
  34391. "lsr r6, %[b], #16\n\t"
  34392. "lsr r7, r8, #16\n\t"
  34393. "mul r7, r6, r7\n\t"
  34394. "adds r4, r4, r7\n\t"
  34395. "adc r5, r5, #0\n\t"
  34396. "lsl r7, r8, #16\n\t"
  34397. "lsr r7, r7, #16\n\t"
  34398. "mul r6, r7, r6\n\t"
  34399. "lsr r7, r6, #16\n\t"
  34400. "lsl r6, r6, #16\n\t"
  34401. "adds r3, r3, r6\n\t"
  34402. "adcs r4, r4, r7\n\t"
  34403. "adc r5, r5, #0\n\t"
  34404. #else
  34405. "umull r6, r7, %[b], r8\n\t"
  34406. "adds r3, r3, r6\n\t"
  34407. "adcs r4, r4, r7\n\t"
  34408. "adc r5, r5, #0\n\t"
  34409. #endif
  34410. "str r3, [%[r], r9]\n\t"
  34411. "mov r3, r4\n\t"
  34412. "mov r4, r5\n\t"
  34413. "mov r5, #0\n\t"
  34414. "add r9, r9, #4\n\t"
  34415. "cmp r9, #0xc0\n\t"
  34416. "blt L_sp_3072_mul_d_48_word_%=\n\t"
  34417. "str r3, [%[r], #192]\n\t"
  34418. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  34419. :
  34420. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "cc"
  34421. );
  34422. }
  34423. #else
  34424. /* Mul a by digit b into r. (r = a * b)
  34425. *
  34426. * r A single precision integer.
  34427. * a A single precision integer.
  34428. * b A single precision digit.
  34429. */
  34430. static void sp_3072_mul_d_48(sp_digit* r_p, const sp_digit* a_p, sp_digit b_p)
  34431. {
  34432. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  34433. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  34434. register sp_digit b asm ("r2") = (sp_digit)b_p;
  34435. __asm__ __volatile__ (
  34436. /* A[0] * B */
  34437. "ldm %[a]!, {r8}\n\t"
  34438. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  34439. "lsl r6, %[b], #16\n\t"
  34440. "lsl r3, r8, #16\n\t"
  34441. "lsr r6, r6, #16\n\t"
  34442. "lsr r3, r3, #16\n\t"
  34443. "mul r3, r6, r3\n\t"
  34444. "lsr r7, r8, #16\n\t"
  34445. "mul r6, r7, r6\n\t"
  34446. "lsr r4, r6, #16\n\t"
  34447. "lsl r6, r6, #16\n\t"
  34448. "adds r3, r3, r6\n\t"
  34449. "adc r4, r4, #0\n\t"
  34450. "lsr r6, %[b], #16\n\t"
  34451. "mul r7, r6, r7\n\t"
  34452. "add r4, r4, r7\n\t"
  34453. "lsl r7, r8, #16\n\t"
  34454. "lsr r7, r7, #16\n\t"
  34455. "mul r6, r7, r6\n\t"
  34456. "lsr r7, r6, #16\n\t"
  34457. "lsl r6, r6, #16\n\t"
  34458. "adds r3, r3, r6\n\t"
  34459. "adc r4, r4, r7\n\t"
  34460. #else
  34461. "umull r3, r4, %[b], r8\n\t"
  34462. #endif
  34463. "stm %[r]!, {r3}\n\t"
  34464. "mov r5, #0\n\t"
  34465. /* A[1] * B */
  34466. "ldm %[a]!, {r8}\n\t"
  34467. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  34468. "lsl r6, %[b], #16\n\t"
  34469. "lsl r7, r8, #16\n\t"
  34470. "lsr r6, r6, #16\n\t"
  34471. "lsr r7, r7, #16\n\t"
  34472. "mul r7, r6, r7\n\t"
  34473. "adds r4, r4, r7\n\t"
  34474. "adc r5, r5, #0\n\t"
  34475. "lsr r7, r8, #16\n\t"
  34476. "mul r6, r7, r6\n\t"
  34477. "lsr r7, r6, #16\n\t"
  34478. "lsl r6, r6, #16\n\t"
  34479. "adds r4, r4, r6\n\t"
  34480. "adc r5, r5, r7\n\t"
  34481. "lsr r6, %[b], #16\n\t"
  34482. "lsr r7, r8, #16\n\t"
  34483. "mul r7, r6, r7\n\t"
  34484. "add r5, r5, r7\n\t"
  34485. "lsl r7, r8, #16\n\t"
  34486. "lsr r7, r7, #16\n\t"
  34487. "mul r6, r7, r6\n\t"
  34488. "lsr r7, r6, #16\n\t"
  34489. "lsl r6, r6, #16\n\t"
  34490. "adds r4, r4, r6\n\t"
  34491. "adc r5, r5, r7\n\t"
  34492. #else
  34493. "umlal r4, r5, %[b], r8\n\t"
  34494. #endif
  34495. "stm %[r]!, {r4}\n\t"
  34496. "mov r3, #0\n\t"
  34497. /* A[2] * B */
  34498. "ldm %[a]!, {r8}\n\t"
  34499. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  34500. "lsl r6, %[b], #16\n\t"
  34501. "lsl r7, r8, #16\n\t"
  34502. "lsr r6, r6, #16\n\t"
  34503. "lsr r7, r7, #16\n\t"
  34504. "mul r7, r6, r7\n\t"
  34505. "adds r5, r5, r7\n\t"
  34506. "adc r3, r3, #0\n\t"
  34507. "lsr r7, r8, #16\n\t"
  34508. "mul r6, r7, r6\n\t"
  34509. "lsr r7, r6, #16\n\t"
  34510. "lsl r6, r6, #16\n\t"
  34511. "adds r5, r5, r6\n\t"
  34512. "adc r3, r3, r7\n\t"
  34513. "lsr r6, %[b], #16\n\t"
  34514. "lsr r7, r8, #16\n\t"
  34515. "mul r7, r6, r7\n\t"
  34516. "add r3, r3, r7\n\t"
  34517. "lsl r7, r8, #16\n\t"
  34518. "lsr r7, r7, #16\n\t"
  34519. "mul r6, r7, r6\n\t"
  34520. "lsr r7, r6, #16\n\t"
  34521. "lsl r6, r6, #16\n\t"
  34522. "adds r5, r5, r6\n\t"
  34523. "adc r3, r3, r7\n\t"
  34524. #else
  34525. "umlal r5, r3, %[b], r8\n\t"
  34526. #endif
  34527. "stm %[r]!, {r5}\n\t"
  34528. "mov r4, #0\n\t"
  34529. /* A[3] * B */
  34530. "ldm %[a]!, {r8}\n\t"
  34531. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  34532. "lsl r6, %[b], #16\n\t"
  34533. "lsl r7, r8, #16\n\t"
  34534. "lsr r6, r6, #16\n\t"
  34535. "lsr r7, r7, #16\n\t"
  34536. "mul r7, r6, r7\n\t"
  34537. "adds r3, r3, r7\n\t"
  34538. "adc r4, r4, #0\n\t"
  34539. "lsr r7, r8, #16\n\t"
  34540. "mul r6, r7, r6\n\t"
  34541. "lsr r7, r6, #16\n\t"
  34542. "lsl r6, r6, #16\n\t"
  34543. "adds r3, r3, r6\n\t"
  34544. "adc r4, r4, r7\n\t"
  34545. "lsr r6, %[b], #16\n\t"
  34546. "lsr r7, r8, #16\n\t"
  34547. "mul r7, r6, r7\n\t"
  34548. "add r4, r4, r7\n\t"
  34549. "lsl r7, r8, #16\n\t"
  34550. "lsr r7, r7, #16\n\t"
  34551. "mul r6, r7, r6\n\t"
  34552. "lsr r7, r6, #16\n\t"
  34553. "lsl r6, r6, #16\n\t"
  34554. "adds r3, r3, r6\n\t"
  34555. "adc r4, r4, r7\n\t"
  34556. #else
  34557. "umlal r3, r4, %[b], r8\n\t"
  34558. #endif
  34559. "stm %[r]!, {r3}\n\t"
  34560. "mov r5, #0\n\t"
  34561. /* A[4] * B */
  34562. "ldm %[a]!, {r8}\n\t"
  34563. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  34564. "lsl r6, %[b], #16\n\t"
  34565. "lsl r7, r8, #16\n\t"
  34566. "lsr r6, r6, #16\n\t"
  34567. "lsr r7, r7, #16\n\t"
  34568. "mul r7, r6, r7\n\t"
  34569. "adds r4, r4, r7\n\t"
  34570. "adc r5, r5, #0\n\t"
  34571. "lsr r7, r8, #16\n\t"
  34572. "mul r6, r7, r6\n\t"
  34573. "lsr r7, r6, #16\n\t"
  34574. "lsl r6, r6, #16\n\t"
  34575. "adds r4, r4, r6\n\t"
  34576. "adc r5, r5, r7\n\t"
  34577. "lsr r6, %[b], #16\n\t"
  34578. "lsr r7, r8, #16\n\t"
  34579. "mul r7, r6, r7\n\t"
  34580. "add r5, r5, r7\n\t"
  34581. "lsl r7, r8, #16\n\t"
  34582. "lsr r7, r7, #16\n\t"
  34583. "mul r6, r7, r6\n\t"
  34584. "lsr r7, r6, #16\n\t"
  34585. "lsl r6, r6, #16\n\t"
  34586. "adds r4, r4, r6\n\t"
  34587. "adc r5, r5, r7\n\t"
  34588. #else
  34589. "umlal r4, r5, %[b], r8\n\t"
  34590. #endif
  34591. "stm %[r]!, {r4}\n\t"
  34592. "mov r3, #0\n\t"
  34593. /* A[5] * B */
  34594. "ldm %[a]!, {r8}\n\t"
  34595. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  34596. "lsl r6, %[b], #16\n\t"
  34597. "lsl r7, r8, #16\n\t"
  34598. "lsr r6, r6, #16\n\t"
  34599. "lsr r7, r7, #16\n\t"
  34600. "mul r7, r6, r7\n\t"
  34601. "adds r5, r5, r7\n\t"
  34602. "adc r3, r3, #0\n\t"
  34603. "lsr r7, r8, #16\n\t"
  34604. "mul r6, r7, r6\n\t"
  34605. "lsr r7, r6, #16\n\t"
  34606. "lsl r6, r6, #16\n\t"
  34607. "adds r5, r5, r6\n\t"
  34608. "adc r3, r3, r7\n\t"
  34609. "lsr r6, %[b], #16\n\t"
  34610. "lsr r7, r8, #16\n\t"
  34611. "mul r7, r6, r7\n\t"
  34612. "add r3, r3, r7\n\t"
  34613. "lsl r7, r8, #16\n\t"
  34614. "lsr r7, r7, #16\n\t"
  34615. "mul r6, r7, r6\n\t"
  34616. "lsr r7, r6, #16\n\t"
  34617. "lsl r6, r6, #16\n\t"
  34618. "adds r5, r5, r6\n\t"
  34619. "adc r3, r3, r7\n\t"
  34620. #else
  34621. "umlal r5, r3, %[b], r8\n\t"
  34622. #endif
  34623. "stm %[r]!, {r5}\n\t"
  34624. "mov r4, #0\n\t"
  34625. /* A[6] * B */
  34626. "ldm %[a]!, {r8}\n\t"
  34627. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  34628. "lsl r6, %[b], #16\n\t"
  34629. "lsl r7, r8, #16\n\t"
  34630. "lsr r6, r6, #16\n\t"
  34631. "lsr r7, r7, #16\n\t"
  34632. "mul r7, r6, r7\n\t"
  34633. "adds r3, r3, r7\n\t"
  34634. "adc r4, r4, #0\n\t"
  34635. "lsr r7, r8, #16\n\t"
  34636. "mul r6, r7, r6\n\t"
  34637. "lsr r7, r6, #16\n\t"
  34638. "lsl r6, r6, #16\n\t"
  34639. "adds r3, r3, r6\n\t"
  34640. "adc r4, r4, r7\n\t"
  34641. "lsr r6, %[b], #16\n\t"
  34642. "lsr r7, r8, #16\n\t"
  34643. "mul r7, r6, r7\n\t"
  34644. "add r4, r4, r7\n\t"
  34645. "lsl r7, r8, #16\n\t"
  34646. "lsr r7, r7, #16\n\t"
  34647. "mul r6, r7, r6\n\t"
  34648. "lsr r7, r6, #16\n\t"
  34649. "lsl r6, r6, #16\n\t"
  34650. "adds r3, r3, r6\n\t"
  34651. "adc r4, r4, r7\n\t"
  34652. #else
  34653. "umlal r3, r4, %[b], r8\n\t"
  34654. #endif
  34655. "stm %[r]!, {r3}\n\t"
  34656. "mov r5, #0\n\t"
  34657. /* A[7] * B */
  34658. "ldm %[a]!, {r8}\n\t"
  34659. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  34660. "lsl r6, %[b], #16\n\t"
  34661. "lsl r7, r8, #16\n\t"
  34662. "lsr r6, r6, #16\n\t"
  34663. "lsr r7, r7, #16\n\t"
  34664. "mul r7, r6, r7\n\t"
  34665. "adds r4, r4, r7\n\t"
  34666. "adc r5, r5, #0\n\t"
  34667. "lsr r7, r8, #16\n\t"
  34668. "mul r6, r7, r6\n\t"
  34669. "lsr r7, r6, #16\n\t"
  34670. "lsl r6, r6, #16\n\t"
  34671. "adds r4, r4, r6\n\t"
  34672. "adc r5, r5, r7\n\t"
  34673. "lsr r6, %[b], #16\n\t"
  34674. "lsr r7, r8, #16\n\t"
  34675. "mul r7, r6, r7\n\t"
  34676. "add r5, r5, r7\n\t"
  34677. "lsl r7, r8, #16\n\t"
  34678. "lsr r7, r7, #16\n\t"
  34679. "mul r6, r7, r6\n\t"
  34680. "lsr r7, r6, #16\n\t"
  34681. "lsl r6, r6, #16\n\t"
  34682. "adds r4, r4, r6\n\t"
  34683. "adc r5, r5, r7\n\t"
  34684. #else
  34685. "umlal r4, r5, %[b], r8\n\t"
  34686. #endif
  34687. "stm %[r]!, {r4}\n\t"
  34688. "mov r3, #0\n\t"
  34689. /* A[8] * B */
  34690. "ldm %[a]!, {r8}\n\t"
  34691. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  34692. "lsl r6, %[b], #16\n\t"
  34693. "lsl r7, r8, #16\n\t"
  34694. "lsr r6, r6, #16\n\t"
  34695. "lsr r7, r7, #16\n\t"
  34696. "mul r7, r6, r7\n\t"
  34697. "adds r5, r5, r7\n\t"
  34698. "adc r3, r3, #0\n\t"
  34699. "lsr r7, r8, #16\n\t"
  34700. "mul r6, r7, r6\n\t"
  34701. "lsr r7, r6, #16\n\t"
  34702. "lsl r6, r6, #16\n\t"
  34703. "adds r5, r5, r6\n\t"
  34704. "adc r3, r3, r7\n\t"
  34705. "lsr r6, %[b], #16\n\t"
  34706. "lsr r7, r8, #16\n\t"
  34707. "mul r7, r6, r7\n\t"
  34708. "add r3, r3, r7\n\t"
  34709. "lsl r7, r8, #16\n\t"
  34710. "lsr r7, r7, #16\n\t"
  34711. "mul r6, r7, r6\n\t"
  34712. "lsr r7, r6, #16\n\t"
  34713. "lsl r6, r6, #16\n\t"
  34714. "adds r5, r5, r6\n\t"
  34715. "adc r3, r3, r7\n\t"
  34716. #else
  34717. "umlal r5, r3, %[b], r8\n\t"
  34718. #endif
  34719. "stm %[r]!, {r5}\n\t"
  34720. "mov r4, #0\n\t"
  34721. /* A[9] * B */
  34722. "ldm %[a]!, {r8}\n\t"
  34723. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  34724. "lsl r6, %[b], #16\n\t"
  34725. "lsl r7, r8, #16\n\t"
  34726. "lsr r6, r6, #16\n\t"
  34727. "lsr r7, r7, #16\n\t"
  34728. "mul r7, r6, r7\n\t"
  34729. "adds r3, r3, r7\n\t"
  34730. "adc r4, r4, #0\n\t"
  34731. "lsr r7, r8, #16\n\t"
  34732. "mul r6, r7, r6\n\t"
  34733. "lsr r7, r6, #16\n\t"
  34734. "lsl r6, r6, #16\n\t"
  34735. "adds r3, r3, r6\n\t"
  34736. "adc r4, r4, r7\n\t"
  34737. "lsr r6, %[b], #16\n\t"
  34738. "lsr r7, r8, #16\n\t"
  34739. "mul r7, r6, r7\n\t"
  34740. "add r4, r4, r7\n\t"
  34741. "lsl r7, r8, #16\n\t"
  34742. "lsr r7, r7, #16\n\t"
  34743. "mul r6, r7, r6\n\t"
  34744. "lsr r7, r6, #16\n\t"
  34745. "lsl r6, r6, #16\n\t"
  34746. "adds r3, r3, r6\n\t"
  34747. "adc r4, r4, r7\n\t"
  34748. #else
  34749. "umlal r3, r4, %[b], r8\n\t"
  34750. #endif
  34751. "stm %[r]!, {r3}\n\t"
  34752. "mov r5, #0\n\t"
  34753. /* A[10] * B */
  34754. "ldm %[a]!, {r8}\n\t"
  34755. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  34756. "lsl r6, %[b], #16\n\t"
  34757. "lsl r7, r8, #16\n\t"
  34758. "lsr r6, r6, #16\n\t"
  34759. "lsr r7, r7, #16\n\t"
  34760. "mul r7, r6, r7\n\t"
  34761. "adds r4, r4, r7\n\t"
  34762. "adc r5, r5, #0\n\t"
  34763. "lsr r7, r8, #16\n\t"
  34764. "mul r6, r7, r6\n\t"
  34765. "lsr r7, r6, #16\n\t"
  34766. "lsl r6, r6, #16\n\t"
  34767. "adds r4, r4, r6\n\t"
  34768. "adc r5, r5, r7\n\t"
  34769. "lsr r6, %[b], #16\n\t"
  34770. "lsr r7, r8, #16\n\t"
  34771. "mul r7, r6, r7\n\t"
  34772. "add r5, r5, r7\n\t"
  34773. "lsl r7, r8, #16\n\t"
  34774. "lsr r7, r7, #16\n\t"
  34775. "mul r6, r7, r6\n\t"
  34776. "lsr r7, r6, #16\n\t"
  34777. "lsl r6, r6, #16\n\t"
  34778. "adds r4, r4, r6\n\t"
  34779. "adc r5, r5, r7\n\t"
  34780. #else
  34781. "umlal r4, r5, %[b], r8\n\t"
  34782. #endif
  34783. "stm %[r]!, {r4}\n\t"
  34784. "mov r3, #0\n\t"
  34785. /* A[11] * B */
  34786. "ldm %[a]!, {r8}\n\t"
  34787. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  34788. "lsl r6, %[b], #16\n\t"
  34789. "lsl r7, r8, #16\n\t"
  34790. "lsr r6, r6, #16\n\t"
  34791. "lsr r7, r7, #16\n\t"
  34792. "mul r7, r6, r7\n\t"
  34793. "adds r5, r5, r7\n\t"
  34794. "adc r3, r3, #0\n\t"
  34795. "lsr r7, r8, #16\n\t"
  34796. "mul r6, r7, r6\n\t"
  34797. "lsr r7, r6, #16\n\t"
  34798. "lsl r6, r6, #16\n\t"
  34799. "adds r5, r5, r6\n\t"
  34800. "adc r3, r3, r7\n\t"
  34801. "lsr r6, %[b], #16\n\t"
  34802. "lsr r7, r8, #16\n\t"
  34803. "mul r7, r6, r7\n\t"
  34804. "add r3, r3, r7\n\t"
  34805. "lsl r7, r8, #16\n\t"
  34806. "lsr r7, r7, #16\n\t"
  34807. "mul r6, r7, r6\n\t"
  34808. "lsr r7, r6, #16\n\t"
  34809. "lsl r6, r6, #16\n\t"
  34810. "adds r5, r5, r6\n\t"
  34811. "adc r3, r3, r7\n\t"
  34812. #else
  34813. "umlal r5, r3, %[b], r8\n\t"
  34814. #endif
  34815. "stm %[r]!, {r5}\n\t"
  34816. "mov r4, #0\n\t"
  34817. /* A[12] * B */
  34818. "ldm %[a]!, {r8}\n\t"
  34819. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  34820. "lsl r6, %[b], #16\n\t"
  34821. "lsl r7, r8, #16\n\t"
  34822. "lsr r6, r6, #16\n\t"
  34823. "lsr r7, r7, #16\n\t"
  34824. "mul r7, r6, r7\n\t"
  34825. "adds r3, r3, r7\n\t"
  34826. "adc r4, r4, #0\n\t"
  34827. "lsr r7, r8, #16\n\t"
  34828. "mul r6, r7, r6\n\t"
  34829. "lsr r7, r6, #16\n\t"
  34830. "lsl r6, r6, #16\n\t"
  34831. "adds r3, r3, r6\n\t"
  34832. "adc r4, r4, r7\n\t"
  34833. "lsr r6, %[b], #16\n\t"
  34834. "lsr r7, r8, #16\n\t"
  34835. "mul r7, r6, r7\n\t"
  34836. "add r4, r4, r7\n\t"
  34837. "lsl r7, r8, #16\n\t"
  34838. "lsr r7, r7, #16\n\t"
  34839. "mul r6, r7, r6\n\t"
  34840. "lsr r7, r6, #16\n\t"
  34841. "lsl r6, r6, #16\n\t"
  34842. "adds r3, r3, r6\n\t"
  34843. "adc r4, r4, r7\n\t"
  34844. #else
  34845. "umlal r3, r4, %[b], r8\n\t"
  34846. #endif
  34847. "stm %[r]!, {r3}\n\t"
  34848. "mov r5, #0\n\t"
  34849. /* A[13] * B */
  34850. "ldm %[a]!, {r8}\n\t"
  34851. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  34852. "lsl r6, %[b], #16\n\t"
  34853. "lsl r7, r8, #16\n\t"
  34854. "lsr r6, r6, #16\n\t"
  34855. "lsr r7, r7, #16\n\t"
  34856. "mul r7, r6, r7\n\t"
  34857. "adds r4, r4, r7\n\t"
  34858. "adc r5, r5, #0\n\t"
  34859. "lsr r7, r8, #16\n\t"
  34860. "mul r6, r7, r6\n\t"
  34861. "lsr r7, r6, #16\n\t"
  34862. "lsl r6, r6, #16\n\t"
  34863. "adds r4, r4, r6\n\t"
  34864. "adc r5, r5, r7\n\t"
  34865. "lsr r6, %[b], #16\n\t"
  34866. "lsr r7, r8, #16\n\t"
  34867. "mul r7, r6, r7\n\t"
  34868. "add r5, r5, r7\n\t"
  34869. "lsl r7, r8, #16\n\t"
  34870. "lsr r7, r7, #16\n\t"
  34871. "mul r6, r7, r6\n\t"
  34872. "lsr r7, r6, #16\n\t"
  34873. "lsl r6, r6, #16\n\t"
  34874. "adds r4, r4, r6\n\t"
  34875. "adc r5, r5, r7\n\t"
  34876. #else
  34877. "umlal r4, r5, %[b], r8\n\t"
  34878. #endif
  34879. "stm %[r]!, {r4}\n\t"
  34880. "mov r3, #0\n\t"
  34881. /* A[14] * B */
  34882. "ldm %[a]!, {r8}\n\t"
  34883. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  34884. "lsl r6, %[b], #16\n\t"
  34885. "lsl r7, r8, #16\n\t"
  34886. "lsr r6, r6, #16\n\t"
  34887. "lsr r7, r7, #16\n\t"
  34888. "mul r7, r6, r7\n\t"
  34889. "adds r5, r5, r7\n\t"
  34890. "adc r3, r3, #0\n\t"
  34891. "lsr r7, r8, #16\n\t"
  34892. "mul r6, r7, r6\n\t"
  34893. "lsr r7, r6, #16\n\t"
  34894. "lsl r6, r6, #16\n\t"
  34895. "adds r5, r5, r6\n\t"
  34896. "adc r3, r3, r7\n\t"
  34897. "lsr r6, %[b], #16\n\t"
  34898. "lsr r7, r8, #16\n\t"
  34899. "mul r7, r6, r7\n\t"
  34900. "add r3, r3, r7\n\t"
  34901. "lsl r7, r8, #16\n\t"
  34902. "lsr r7, r7, #16\n\t"
  34903. "mul r6, r7, r6\n\t"
  34904. "lsr r7, r6, #16\n\t"
  34905. "lsl r6, r6, #16\n\t"
  34906. "adds r5, r5, r6\n\t"
  34907. "adc r3, r3, r7\n\t"
  34908. #else
  34909. "umlal r5, r3, %[b], r8\n\t"
  34910. #endif
  34911. "stm %[r]!, {r5}\n\t"
  34912. "mov r4, #0\n\t"
  34913. /* A[15] * B */
  34914. "ldm %[a]!, {r8}\n\t"
  34915. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  34916. "lsl r6, %[b], #16\n\t"
  34917. "lsl r7, r8, #16\n\t"
  34918. "lsr r6, r6, #16\n\t"
  34919. "lsr r7, r7, #16\n\t"
  34920. "mul r7, r6, r7\n\t"
  34921. "adds r3, r3, r7\n\t"
  34922. "adc r4, r4, #0\n\t"
  34923. "lsr r7, r8, #16\n\t"
  34924. "mul r6, r7, r6\n\t"
  34925. "lsr r7, r6, #16\n\t"
  34926. "lsl r6, r6, #16\n\t"
  34927. "adds r3, r3, r6\n\t"
  34928. "adc r4, r4, r7\n\t"
  34929. "lsr r6, %[b], #16\n\t"
  34930. "lsr r7, r8, #16\n\t"
  34931. "mul r7, r6, r7\n\t"
  34932. "add r4, r4, r7\n\t"
  34933. "lsl r7, r8, #16\n\t"
  34934. "lsr r7, r7, #16\n\t"
  34935. "mul r6, r7, r6\n\t"
  34936. "lsr r7, r6, #16\n\t"
  34937. "lsl r6, r6, #16\n\t"
  34938. "adds r3, r3, r6\n\t"
  34939. "adc r4, r4, r7\n\t"
  34940. #else
  34941. "umlal r3, r4, %[b], r8\n\t"
  34942. #endif
  34943. "stm %[r]!, {r3}\n\t"
  34944. "mov r5, #0\n\t"
  34945. /* A[16] * B */
  34946. "ldm %[a]!, {r8}\n\t"
  34947. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  34948. "lsl r6, %[b], #16\n\t"
  34949. "lsl r7, r8, #16\n\t"
  34950. "lsr r6, r6, #16\n\t"
  34951. "lsr r7, r7, #16\n\t"
  34952. "mul r7, r6, r7\n\t"
  34953. "adds r4, r4, r7\n\t"
  34954. "adc r5, r5, #0\n\t"
  34955. "lsr r7, r8, #16\n\t"
  34956. "mul r6, r7, r6\n\t"
  34957. "lsr r7, r6, #16\n\t"
  34958. "lsl r6, r6, #16\n\t"
  34959. "adds r4, r4, r6\n\t"
  34960. "adc r5, r5, r7\n\t"
  34961. "lsr r6, %[b], #16\n\t"
  34962. "lsr r7, r8, #16\n\t"
  34963. "mul r7, r6, r7\n\t"
  34964. "add r5, r5, r7\n\t"
  34965. "lsl r7, r8, #16\n\t"
  34966. "lsr r7, r7, #16\n\t"
  34967. "mul r6, r7, r6\n\t"
  34968. "lsr r7, r6, #16\n\t"
  34969. "lsl r6, r6, #16\n\t"
  34970. "adds r4, r4, r6\n\t"
  34971. "adc r5, r5, r7\n\t"
  34972. #else
  34973. "umlal r4, r5, %[b], r8\n\t"
  34974. #endif
  34975. "stm %[r]!, {r4}\n\t"
  34976. "mov r3, #0\n\t"
  34977. /* A[17] * B */
  34978. "ldm %[a]!, {r8}\n\t"
  34979. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  34980. "lsl r6, %[b], #16\n\t"
  34981. "lsl r7, r8, #16\n\t"
  34982. "lsr r6, r6, #16\n\t"
  34983. "lsr r7, r7, #16\n\t"
  34984. "mul r7, r6, r7\n\t"
  34985. "adds r5, r5, r7\n\t"
  34986. "adc r3, r3, #0\n\t"
  34987. "lsr r7, r8, #16\n\t"
  34988. "mul r6, r7, r6\n\t"
  34989. "lsr r7, r6, #16\n\t"
  34990. "lsl r6, r6, #16\n\t"
  34991. "adds r5, r5, r6\n\t"
  34992. "adc r3, r3, r7\n\t"
  34993. "lsr r6, %[b], #16\n\t"
  34994. "lsr r7, r8, #16\n\t"
  34995. "mul r7, r6, r7\n\t"
  34996. "add r3, r3, r7\n\t"
  34997. "lsl r7, r8, #16\n\t"
  34998. "lsr r7, r7, #16\n\t"
  34999. "mul r6, r7, r6\n\t"
  35000. "lsr r7, r6, #16\n\t"
  35001. "lsl r6, r6, #16\n\t"
  35002. "adds r5, r5, r6\n\t"
  35003. "adc r3, r3, r7\n\t"
  35004. #else
  35005. "umlal r5, r3, %[b], r8\n\t"
  35006. #endif
  35007. "stm %[r]!, {r5}\n\t"
  35008. "mov r4, #0\n\t"
  35009. /* A[18] * B */
  35010. "ldm %[a]!, {r8}\n\t"
  35011. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  35012. "lsl r6, %[b], #16\n\t"
  35013. "lsl r7, r8, #16\n\t"
  35014. "lsr r6, r6, #16\n\t"
  35015. "lsr r7, r7, #16\n\t"
  35016. "mul r7, r6, r7\n\t"
  35017. "adds r3, r3, r7\n\t"
  35018. "adc r4, r4, #0\n\t"
  35019. "lsr r7, r8, #16\n\t"
  35020. "mul r6, r7, r6\n\t"
  35021. "lsr r7, r6, #16\n\t"
  35022. "lsl r6, r6, #16\n\t"
  35023. "adds r3, r3, r6\n\t"
  35024. "adc r4, r4, r7\n\t"
  35025. "lsr r6, %[b], #16\n\t"
  35026. "lsr r7, r8, #16\n\t"
  35027. "mul r7, r6, r7\n\t"
  35028. "add r4, r4, r7\n\t"
  35029. "lsl r7, r8, #16\n\t"
  35030. "lsr r7, r7, #16\n\t"
  35031. "mul r6, r7, r6\n\t"
  35032. "lsr r7, r6, #16\n\t"
  35033. "lsl r6, r6, #16\n\t"
  35034. "adds r3, r3, r6\n\t"
  35035. "adc r4, r4, r7\n\t"
  35036. #else
  35037. "umlal r3, r4, %[b], r8\n\t"
  35038. #endif
  35039. "stm %[r]!, {r3}\n\t"
  35040. "mov r5, #0\n\t"
  35041. /* A[19] * B */
  35042. "ldm %[a]!, {r8}\n\t"
  35043. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  35044. "lsl r6, %[b], #16\n\t"
  35045. "lsl r7, r8, #16\n\t"
  35046. "lsr r6, r6, #16\n\t"
  35047. "lsr r7, r7, #16\n\t"
  35048. "mul r7, r6, r7\n\t"
  35049. "adds r4, r4, r7\n\t"
  35050. "adc r5, r5, #0\n\t"
  35051. "lsr r7, r8, #16\n\t"
  35052. "mul r6, r7, r6\n\t"
  35053. "lsr r7, r6, #16\n\t"
  35054. "lsl r6, r6, #16\n\t"
  35055. "adds r4, r4, r6\n\t"
  35056. "adc r5, r5, r7\n\t"
  35057. "lsr r6, %[b], #16\n\t"
  35058. "lsr r7, r8, #16\n\t"
  35059. "mul r7, r6, r7\n\t"
  35060. "add r5, r5, r7\n\t"
  35061. "lsl r7, r8, #16\n\t"
  35062. "lsr r7, r7, #16\n\t"
  35063. "mul r6, r7, r6\n\t"
  35064. "lsr r7, r6, #16\n\t"
  35065. "lsl r6, r6, #16\n\t"
  35066. "adds r4, r4, r6\n\t"
  35067. "adc r5, r5, r7\n\t"
  35068. #else
  35069. "umlal r4, r5, %[b], r8\n\t"
  35070. #endif
  35071. "stm %[r]!, {r4}\n\t"
  35072. "mov r3, #0\n\t"
  35073. /* A[20] * B */
  35074. "ldm %[a]!, {r8}\n\t"
  35075. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  35076. "lsl r6, %[b], #16\n\t"
  35077. "lsl r7, r8, #16\n\t"
  35078. "lsr r6, r6, #16\n\t"
  35079. "lsr r7, r7, #16\n\t"
  35080. "mul r7, r6, r7\n\t"
  35081. "adds r5, r5, r7\n\t"
  35082. "adc r3, r3, #0\n\t"
  35083. "lsr r7, r8, #16\n\t"
  35084. "mul r6, r7, r6\n\t"
  35085. "lsr r7, r6, #16\n\t"
  35086. "lsl r6, r6, #16\n\t"
  35087. "adds r5, r5, r6\n\t"
  35088. "adc r3, r3, r7\n\t"
  35089. "lsr r6, %[b], #16\n\t"
  35090. "lsr r7, r8, #16\n\t"
  35091. "mul r7, r6, r7\n\t"
  35092. "add r3, r3, r7\n\t"
  35093. "lsl r7, r8, #16\n\t"
  35094. "lsr r7, r7, #16\n\t"
  35095. "mul r6, r7, r6\n\t"
  35096. "lsr r7, r6, #16\n\t"
  35097. "lsl r6, r6, #16\n\t"
  35098. "adds r5, r5, r6\n\t"
  35099. "adc r3, r3, r7\n\t"
  35100. #else
  35101. "umlal r5, r3, %[b], r8\n\t"
  35102. #endif
  35103. "stm %[r]!, {r5}\n\t"
  35104. "mov r4, #0\n\t"
  35105. /* A[21] * B */
  35106. "ldm %[a]!, {r8}\n\t"
  35107. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  35108. "lsl r6, %[b], #16\n\t"
  35109. "lsl r7, r8, #16\n\t"
  35110. "lsr r6, r6, #16\n\t"
  35111. "lsr r7, r7, #16\n\t"
  35112. "mul r7, r6, r7\n\t"
  35113. "adds r3, r3, r7\n\t"
  35114. "adc r4, r4, #0\n\t"
  35115. "lsr r7, r8, #16\n\t"
  35116. "mul r6, r7, r6\n\t"
  35117. "lsr r7, r6, #16\n\t"
  35118. "lsl r6, r6, #16\n\t"
  35119. "adds r3, r3, r6\n\t"
  35120. "adc r4, r4, r7\n\t"
  35121. "lsr r6, %[b], #16\n\t"
  35122. "lsr r7, r8, #16\n\t"
  35123. "mul r7, r6, r7\n\t"
  35124. "add r4, r4, r7\n\t"
  35125. "lsl r7, r8, #16\n\t"
  35126. "lsr r7, r7, #16\n\t"
  35127. "mul r6, r7, r6\n\t"
  35128. "lsr r7, r6, #16\n\t"
  35129. "lsl r6, r6, #16\n\t"
  35130. "adds r3, r3, r6\n\t"
  35131. "adc r4, r4, r7\n\t"
  35132. #else
  35133. "umlal r3, r4, %[b], r8\n\t"
  35134. #endif
  35135. "stm %[r]!, {r3}\n\t"
  35136. "mov r5, #0\n\t"
  35137. /* A[22] * B */
  35138. "ldm %[a]!, {r8}\n\t"
  35139. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  35140. "lsl r6, %[b], #16\n\t"
  35141. "lsl r7, r8, #16\n\t"
  35142. "lsr r6, r6, #16\n\t"
  35143. "lsr r7, r7, #16\n\t"
  35144. "mul r7, r6, r7\n\t"
  35145. "adds r4, r4, r7\n\t"
  35146. "adc r5, r5, #0\n\t"
  35147. "lsr r7, r8, #16\n\t"
  35148. "mul r6, r7, r6\n\t"
  35149. "lsr r7, r6, #16\n\t"
  35150. "lsl r6, r6, #16\n\t"
  35151. "adds r4, r4, r6\n\t"
  35152. "adc r5, r5, r7\n\t"
  35153. "lsr r6, %[b], #16\n\t"
  35154. "lsr r7, r8, #16\n\t"
  35155. "mul r7, r6, r7\n\t"
  35156. "add r5, r5, r7\n\t"
  35157. "lsl r7, r8, #16\n\t"
  35158. "lsr r7, r7, #16\n\t"
  35159. "mul r6, r7, r6\n\t"
  35160. "lsr r7, r6, #16\n\t"
  35161. "lsl r6, r6, #16\n\t"
  35162. "adds r4, r4, r6\n\t"
  35163. "adc r5, r5, r7\n\t"
  35164. #else
  35165. "umlal r4, r5, %[b], r8\n\t"
  35166. #endif
  35167. "stm %[r]!, {r4}\n\t"
  35168. "mov r3, #0\n\t"
  35169. /* A[23] * B */
  35170. "ldm %[a]!, {r8}\n\t"
  35171. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  35172. "lsl r6, %[b], #16\n\t"
  35173. "lsl r7, r8, #16\n\t"
  35174. "lsr r6, r6, #16\n\t"
  35175. "lsr r7, r7, #16\n\t"
  35176. "mul r7, r6, r7\n\t"
  35177. "adds r5, r5, r7\n\t"
  35178. "adc r3, r3, #0\n\t"
  35179. "lsr r7, r8, #16\n\t"
  35180. "mul r6, r7, r6\n\t"
  35181. "lsr r7, r6, #16\n\t"
  35182. "lsl r6, r6, #16\n\t"
  35183. "adds r5, r5, r6\n\t"
  35184. "adc r3, r3, r7\n\t"
  35185. "lsr r6, %[b], #16\n\t"
  35186. "lsr r7, r8, #16\n\t"
  35187. "mul r7, r6, r7\n\t"
  35188. "add r3, r3, r7\n\t"
  35189. "lsl r7, r8, #16\n\t"
  35190. "lsr r7, r7, #16\n\t"
  35191. "mul r6, r7, r6\n\t"
  35192. "lsr r7, r6, #16\n\t"
  35193. "lsl r6, r6, #16\n\t"
  35194. "adds r5, r5, r6\n\t"
  35195. "adc r3, r3, r7\n\t"
  35196. #else
  35197. "umlal r5, r3, %[b], r8\n\t"
  35198. #endif
  35199. "stm %[r]!, {r5}\n\t"
  35200. "mov r4, #0\n\t"
  35201. /* A[24] * B */
  35202. "ldm %[a]!, {r8}\n\t"
  35203. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  35204. "lsl r6, %[b], #16\n\t"
  35205. "lsl r7, r8, #16\n\t"
  35206. "lsr r6, r6, #16\n\t"
  35207. "lsr r7, r7, #16\n\t"
  35208. "mul r7, r6, r7\n\t"
  35209. "adds r3, r3, r7\n\t"
  35210. "adc r4, r4, #0\n\t"
  35211. "lsr r7, r8, #16\n\t"
  35212. "mul r6, r7, r6\n\t"
  35213. "lsr r7, r6, #16\n\t"
  35214. "lsl r6, r6, #16\n\t"
  35215. "adds r3, r3, r6\n\t"
  35216. "adc r4, r4, r7\n\t"
  35217. "lsr r6, %[b], #16\n\t"
  35218. "lsr r7, r8, #16\n\t"
  35219. "mul r7, r6, r7\n\t"
  35220. "add r4, r4, r7\n\t"
  35221. "lsl r7, r8, #16\n\t"
  35222. "lsr r7, r7, #16\n\t"
  35223. "mul r6, r7, r6\n\t"
  35224. "lsr r7, r6, #16\n\t"
  35225. "lsl r6, r6, #16\n\t"
  35226. "adds r3, r3, r6\n\t"
  35227. "adc r4, r4, r7\n\t"
  35228. #else
  35229. "umlal r3, r4, %[b], r8\n\t"
  35230. #endif
  35231. "stm %[r]!, {r3}\n\t"
  35232. "mov r5, #0\n\t"
  35233. /* A[25] * B */
  35234. "ldm %[a]!, {r8}\n\t"
  35235. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  35236. "lsl r6, %[b], #16\n\t"
  35237. "lsl r7, r8, #16\n\t"
  35238. "lsr r6, r6, #16\n\t"
  35239. "lsr r7, r7, #16\n\t"
  35240. "mul r7, r6, r7\n\t"
  35241. "adds r4, r4, r7\n\t"
  35242. "adc r5, r5, #0\n\t"
  35243. "lsr r7, r8, #16\n\t"
  35244. "mul r6, r7, r6\n\t"
  35245. "lsr r7, r6, #16\n\t"
  35246. "lsl r6, r6, #16\n\t"
  35247. "adds r4, r4, r6\n\t"
  35248. "adc r5, r5, r7\n\t"
  35249. "lsr r6, %[b], #16\n\t"
  35250. "lsr r7, r8, #16\n\t"
  35251. "mul r7, r6, r7\n\t"
  35252. "add r5, r5, r7\n\t"
  35253. "lsl r7, r8, #16\n\t"
  35254. "lsr r7, r7, #16\n\t"
  35255. "mul r6, r7, r6\n\t"
  35256. "lsr r7, r6, #16\n\t"
  35257. "lsl r6, r6, #16\n\t"
  35258. "adds r4, r4, r6\n\t"
  35259. "adc r5, r5, r7\n\t"
  35260. #else
  35261. "umlal r4, r5, %[b], r8\n\t"
  35262. #endif
  35263. "stm %[r]!, {r4}\n\t"
  35264. "mov r3, #0\n\t"
  35265. /* A[26] * B */
  35266. "ldm %[a]!, {r8}\n\t"
  35267. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  35268. "lsl r6, %[b], #16\n\t"
  35269. "lsl r7, r8, #16\n\t"
  35270. "lsr r6, r6, #16\n\t"
  35271. "lsr r7, r7, #16\n\t"
  35272. "mul r7, r6, r7\n\t"
  35273. "adds r5, r5, r7\n\t"
  35274. "adc r3, r3, #0\n\t"
  35275. "lsr r7, r8, #16\n\t"
  35276. "mul r6, r7, r6\n\t"
  35277. "lsr r7, r6, #16\n\t"
  35278. "lsl r6, r6, #16\n\t"
  35279. "adds r5, r5, r6\n\t"
  35280. "adc r3, r3, r7\n\t"
  35281. "lsr r6, %[b], #16\n\t"
  35282. "lsr r7, r8, #16\n\t"
  35283. "mul r7, r6, r7\n\t"
  35284. "add r3, r3, r7\n\t"
  35285. "lsl r7, r8, #16\n\t"
  35286. "lsr r7, r7, #16\n\t"
  35287. "mul r6, r7, r6\n\t"
  35288. "lsr r7, r6, #16\n\t"
  35289. "lsl r6, r6, #16\n\t"
  35290. "adds r5, r5, r6\n\t"
  35291. "adc r3, r3, r7\n\t"
  35292. #else
  35293. "umlal r5, r3, %[b], r8\n\t"
  35294. #endif
  35295. "stm %[r]!, {r5}\n\t"
  35296. "mov r4, #0\n\t"
  35297. /* A[27] * B */
  35298. "ldm %[a]!, {r8}\n\t"
  35299. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  35300. "lsl r6, %[b], #16\n\t"
  35301. "lsl r7, r8, #16\n\t"
  35302. "lsr r6, r6, #16\n\t"
  35303. "lsr r7, r7, #16\n\t"
  35304. "mul r7, r6, r7\n\t"
  35305. "adds r3, r3, r7\n\t"
  35306. "adc r4, r4, #0\n\t"
  35307. "lsr r7, r8, #16\n\t"
  35308. "mul r6, r7, r6\n\t"
  35309. "lsr r7, r6, #16\n\t"
  35310. "lsl r6, r6, #16\n\t"
  35311. "adds r3, r3, r6\n\t"
  35312. "adc r4, r4, r7\n\t"
  35313. "lsr r6, %[b], #16\n\t"
  35314. "lsr r7, r8, #16\n\t"
  35315. "mul r7, r6, r7\n\t"
  35316. "add r4, r4, r7\n\t"
  35317. "lsl r7, r8, #16\n\t"
  35318. "lsr r7, r7, #16\n\t"
  35319. "mul r6, r7, r6\n\t"
  35320. "lsr r7, r6, #16\n\t"
  35321. "lsl r6, r6, #16\n\t"
  35322. "adds r3, r3, r6\n\t"
  35323. "adc r4, r4, r7\n\t"
  35324. #else
  35325. "umlal r3, r4, %[b], r8\n\t"
  35326. #endif
  35327. "stm %[r]!, {r3}\n\t"
  35328. "mov r5, #0\n\t"
  35329. /* A[28] * B */
  35330. "ldm %[a]!, {r8}\n\t"
  35331. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  35332. "lsl r6, %[b], #16\n\t"
  35333. "lsl r7, r8, #16\n\t"
  35334. "lsr r6, r6, #16\n\t"
  35335. "lsr r7, r7, #16\n\t"
  35336. "mul r7, r6, r7\n\t"
  35337. "adds r4, r4, r7\n\t"
  35338. "adc r5, r5, #0\n\t"
  35339. "lsr r7, r8, #16\n\t"
  35340. "mul r6, r7, r6\n\t"
  35341. "lsr r7, r6, #16\n\t"
  35342. "lsl r6, r6, #16\n\t"
  35343. "adds r4, r4, r6\n\t"
  35344. "adc r5, r5, r7\n\t"
  35345. "lsr r6, %[b], #16\n\t"
  35346. "lsr r7, r8, #16\n\t"
  35347. "mul r7, r6, r7\n\t"
  35348. "add r5, r5, r7\n\t"
  35349. "lsl r7, r8, #16\n\t"
  35350. "lsr r7, r7, #16\n\t"
  35351. "mul r6, r7, r6\n\t"
  35352. "lsr r7, r6, #16\n\t"
  35353. "lsl r6, r6, #16\n\t"
  35354. "adds r4, r4, r6\n\t"
  35355. "adc r5, r5, r7\n\t"
  35356. #else
  35357. "umlal r4, r5, %[b], r8\n\t"
  35358. #endif
  35359. "stm %[r]!, {r4}\n\t"
  35360. "mov r3, #0\n\t"
  35361. /* A[29] * B */
  35362. "ldm %[a]!, {r8}\n\t"
  35363. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  35364. "lsl r6, %[b], #16\n\t"
  35365. "lsl r7, r8, #16\n\t"
  35366. "lsr r6, r6, #16\n\t"
  35367. "lsr r7, r7, #16\n\t"
  35368. "mul r7, r6, r7\n\t"
  35369. "adds r5, r5, r7\n\t"
  35370. "adc r3, r3, #0\n\t"
  35371. "lsr r7, r8, #16\n\t"
  35372. "mul r6, r7, r6\n\t"
  35373. "lsr r7, r6, #16\n\t"
  35374. "lsl r6, r6, #16\n\t"
  35375. "adds r5, r5, r6\n\t"
  35376. "adc r3, r3, r7\n\t"
  35377. "lsr r6, %[b], #16\n\t"
  35378. "lsr r7, r8, #16\n\t"
  35379. "mul r7, r6, r7\n\t"
  35380. "add r3, r3, r7\n\t"
  35381. "lsl r7, r8, #16\n\t"
  35382. "lsr r7, r7, #16\n\t"
  35383. "mul r6, r7, r6\n\t"
  35384. "lsr r7, r6, #16\n\t"
  35385. "lsl r6, r6, #16\n\t"
  35386. "adds r5, r5, r6\n\t"
  35387. "adc r3, r3, r7\n\t"
  35388. #else
  35389. "umlal r5, r3, %[b], r8\n\t"
  35390. #endif
  35391. "stm %[r]!, {r5}\n\t"
  35392. "mov r4, #0\n\t"
  35393. /* A[30] * B */
  35394. "ldm %[a]!, {r8}\n\t"
  35395. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  35396. "lsl r6, %[b], #16\n\t"
  35397. "lsl r7, r8, #16\n\t"
  35398. "lsr r6, r6, #16\n\t"
  35399. "lsr r7, r7, #16\n\t"
  35400. "mul r7, r6, r7\n\t"
  35401. "adds r3, r3, r7\n\t"
  35402. "adc r4, r4, #0\n\t"
  35403. "lsr r7, r8, #16\n\t"
  35404. "mul r6, r7, r6\n\t"
  35405. "lsr r7, r6, #16\n\t"
  35406. "lsl r6, r6, #16\n\t"
  35407. "adds r3, r3, r6\n\t"
  35408. "adc r4, r4, r7\n\t"
  35409. "lsr r6, %[b], #16\n\t"
  35410. "lsr r7, r8, #16\n\t"
  35411. "mul r7, r6, r7\n\t"
  35412. "add r4, r4, r7\n\t"
  35413. "lsl r7, r8, #16\n\t"
  35414. "lsr r7, r7, #16\n\t"
  35415. "mul r6, r7, r6\n\t"
  35416. "lsr r7, r6, #16\n\t"
  35417. "lsl r6, r6, #16\n\t"
  35418. "adds r3, r3, r6\n\t"
  35419. "adc r4, r4, r7\n\t"
  35420. #else
  35421. "umlal r3, r4, %[b], r8\n\t"
  35422. #endif
  35423. "stm %[r]!, {r3}\n\t"
  35424. "mov r5, #0\n\t"
  35425. /* A[31] * B */
  35426. "ldm %[a]!, {r8}\n\t"
  35427. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  35428. "lsl r6, %[b], #16\n\t"
  35429. "lsl r7, r8, #16\n\t"
  35430. "lsr r6, r6, #16\n\t"
  35431. "lsr r7, r7, #16\n\t"
  35432. "mul r7, r6, r7\n\t"
  35433. "adds r4, r4, r7\n\t"
  35434. "adc r5, r5, #0\n\t"
  35435. "lsr r7, r8, #16\n\t"
  35436. "mul r6, r7, r6\n\t"
  35437. "lsr r7, r6, #16\n\t"
  35438. "lsl r6, r6, #16\n\t"
  35439. "adds r4, r4, r6\n\t"
  35440. "adc r5, r5, r7\n\t"
  35441. "lsr r6, %[b], #16\n\t"
  35442. "lsr r7, r8, #16\n\t"
  35443. "mul r7, r6, r7\n\t"
  35444. "add r5, r5, r7\n\t"
  35445. "lsl r7, r8, #16\n\t"
  35446. "lsr r7, r7, #16\n\t"
  35447. "mul r6, r7, r6\n\t"
  35448. "lsr r7, r6, #16\n\t"
  35449. "lsl r6, r6, #16\n\t"
  35450. "adds r4, r4, r6\n\t"
  35451. "adc r5, r5, r7\n\t"
  35452. #else
  35453. "umlal r4, r5, %[b], r8\n\t"
  35454. #endif
  35455. "stm %[r]!, {r4}\n\t"
  35456. "mov r3, #0\n\t"
  35457. /* A[32] * B */
  35458. "ldm %[a]!, {r8}\n\t"
  35459. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  35460. "lsl r6, %[b], #16\n\t"
  35461. "lsl r7, r8, #16\n\t"
  35462. "lsr r6, r6, #16\n\t"
  35463. "lsr r7, r7, #16\n\t"
  35464. "mul r7, r6, r7\n\t"
  35465. "adds r5, r5, r7\n\t"
  35466. "adc r3, r3, #0\n\t"
  35467. "lsr r7, r8, #16\n\t"
  35468. "mul r6, r7, r6\n\t"
  35469. "lsr r7, r6, #16\n\t"
  35470. "lsl r6, r6, #16\n\t"
  35471. "adds r5, r5, r6\n\t"
  35472. "adc r3, r3, r7\n\t"
  35473. "lsr r6, %[b], #16\n\t"
  35474. "lsr r7, r8, #16\n\t"
  35475. "mul r7, r6, r7\n\t"
  35476. "add r3, r3, r7\n\t"
  35477. "lsl r7, r8, #16\n\t"
  35478. "lsr r7, r7, #16\n\t"
  35479. "mul r6, r7, r6\n\t"
  35480. "lsr r7, r6, #16\n\t"
  35481. "lsl r6, r6, #16\n\t"
  35482. "adds r5, r5, r6\n\t"
  35483. "adc r3, r3, r7\n\t"
  35484. #else
  35485. "umlal r5, r3, %[b], r8\n\t"
  35486. #endif
  35487. "stm %[r]!, {r5}\n\t"
  35488. "mov r4, #0\n\t"
  35489. /* A[33] * B */
  35490. "ldm %[a]!, {r8}\n\t"
  35491. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  35492. "lsl r6, %[b], #16\n\t"
  35493. "lsl r7, r8, #16\n\t"
  35494. "lsr r6, r6, #16\n\t"
  35495. "lsr r7, r7, #16\n\t"
  35496. "mul r7, r6, r7\n\t"
  35497. "adds r3, r3, r7\n\t"
  35498. "adc r4, r4, #0\n\t"
  35499. "lsr r7, r8, #16\n\t"
  35500. "mul r6, r7, r6\n\t"
  35501. "lsr r7, r6, #16\n\t"
  35502. "lsl r6, r6, #16\n\t"
  35503. "adds r3, r3, r6\n\t"
  35504. "adc r4, r4, r7\n\t"
  35505. "lsr r6, %[b], #16\n\t"
  35506. "lsr r7, r8, #16\n\t"
  35507. "mul r7, r6, r7\n\t"
  35508. "add r4, r4, r7\n\t"
  35509. "lsl r7, r8, #16\n\t"
  35510. "lsr r7, r7, #16\n\t"
  35511. "mul r6, r7, r6\n\t"
  35512. "lsr r7, r6, #16\n\t"
  35513. "lsl r6, r6, #16\n\t"
  35514. "adds r3, r3, r6\n\t"
  35515. "adc r4, r4, r7\n\t"
  35516. #else
  35517. "umlal r3, r4, %[b], r8\n\t"
  35518. #endif
  35519. "stm %[r]!, {r3}\n\t"
  35520. "mov r5, #0\n\t"
  35521. /* A[34] * B */
  35522. "ldm %[a]!, {r8}\n\t"
  35523. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  35524. "lsl r6, %[b], #16\n\t"
  35525. "lsl r7, r8, #16\n\t"
  35526. "lsr r6, r6, #16\n\t"
  35527. "lsr r7, r7, #16\n\t"
  35528. "mul r7, r6, r7\n\t"
  35529. "adds r4, r4, r7\n\t"
  35530. "adc r5, r5, #0\n\t"
  35531. "lsr r7, r8, #16\n\t"
  35532. "mul r6, r7, r6\n\t"
  35533. "lsr r7, r6, #16\n\t"
  35534. "lsl r6, r6, #16\n\t"
  35535. "adds r4, r4, r6\n\t"
  35536. "adc r5, r5, r7\n\t"
  35537. "lsr r6, %[b], #16\n\t"
  35538. "lsr r7, r8, #16\n\t"
  35539. "mul r7, r6, r7\n\t"
  35540. "add r5, r5, r7\n\t"
  35541. "lsl r7, r8, #16\n\t"
  35542. "lsr r7, r7, #16\n\t"
  35543. "mul r6, r7, r6\n\t"
  35544. "lsr r7, r6, #16\n\t"
  35545. "lsl r6, r6, #16\n\t"
  35546. "adds r4, r4, r6\n\t"
  35547. "adc r5, r5, r7\n\t"
  35548. #else
  35549. "umlal r4, r5, %[b], r8\n\t"
  35550. #endif
  35551. "stm %[r]!, {r4}\n\t"
  35552. "mov r3, #0\n\t"
  35553. /* A[35] * B */
  35554. "ldm %[a]!, {r8}\n\t"
  35555. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  35556. "lsl r6, %[b], #16\n\t"
  35557. "lsl r7, r8, #16\n\t"
  35558. "lsr r6, r6, #16\n\t"
  35559. "lsr r7, r7, #16\n\t"
  35560. "mul r7, r6, r7\n\t"
  35561. "adds r5, r5, r7\n\t"
  35562. "adc r3, r3, #0\n\t"
  35563. "lsr r7, r8, #16\n\t"
  35564. "mul r6, r7, r6\n\t"
  35565. "lsr r7, r6, #16\n\t"
  35566. "lsl r6, r6, #16\n\t"
  35567. "adds r5, r5, r6\n\t"
  35568. "adc r3, r3, r7\n\t"
  35569. "lsr r6, %[b], #16\n\t"
  35570. "lsr r7, r8, #16\n\t"
  35571. "mul r7, r6, r7\n\t"
  35572. "add r3, r3, r7\n\t"
  35573. "lsl r7, r8, #16\n\t"
  35574. "lsr r7, r7, #16\n\t"
  35575. "mul r6, r7, r6\n\t"
  35576. "lsr r7, r6, #16\n\t"
  35577. "lsl r6, r6, #16\n\t"
  35578. "adds r5, r5, r6\n\t"
  35579. "adc r3, r3, r7\n\t"
  35580. #else
  35581. "umlal r5, r3, %[b], r8\n\t"
  35582. #endif
  35583. "stm %[r]!, {r5}\n\t"
  35584. "mov r4, #0\n\t"
  35585. /* A[36] * B */
  35586. "ldm %[a]!, {r8}\n\t"
  35587. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  35588. "lsl r6, %[b], #16\n\t"
  35589. "lsl r7, r8, #16\n\t"
  35590. "lsr r6, r6, #16\n\t"
  35591. "lsr r7, r7, #16\n\t"
  35592. "mul r7, r6, r7\n\t"
  35593. "adds r3, r3, r7\n\t"
  35594. "adc r4, r4, #0\n\t"
  35595. "lsr r7, r8, #16\n\t"
  35596. "mul r6, r7, r6\n\t"
  35597. "lsr r7, r6, #16\n\t"
  35598. "lsl r6, r6, #16\n\t"
  35599. "adds r3, r3, r6\n\t"
  35600. "adc r4, r4, r7\n\t"
  35601. "lsr r6, %[b], #16\n\t"
  35602. "lsr r7, r8, #16\n\t"
  35603. "mul r7, r6, r7\n\t"
  35604. "add r4, r4, r7\n\t"
  35605. "lsl r7, r8, #16\n\t"
  35606. "lsr r7, r7, #16\n\t"
  35607. "mul r6, r7, r6\n\t"
  35608. "lsr r7, r6, #16\n\t"
  35609. "lsl r6, r6, #16\n\t"
  35610. "adds r3, r3, r6\n\t"
  35611. "adc r4, r4, r7\n\t"
  35612. #else
  35613. "umlal r3, r4, %[b], r8\n\t"
  35614. #endif
  35615. "stm %[r]!, {r3}\n\t"
  35616. "mov r5, #0\n\t"
  35617. /* A[37] * B */
  35618. "ldm %[a]!, {r8}\n\t"
  35619. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  35620. "lsl r6, %[b], #16\n\t"
  35621. "lsl r7, r8, #16\n\t"
  35622. "lsr r6, r6, #16\n\t"
  35623. "lsr r7, r7, #16\n\t"
  35624. "mul r7, r6, r7\n\t"
  35625. "adds r4, r4, r7\n\t"
  35626. "adc r5, r5, #0\n\t"
  35627. "lsr r7, r8, #16\n\t"
  35628. "mul r6, r7, r6\n\t"
  35629. "lsr r7, r6, #16\n\t"
  35630. "lsl r6, r6, #16\n\t"
  35631. "adds r4, r4, r6\n\t"
  35632. "adc r5, r5, r7\n\t"
  35633. "lsr r6, %[b], #16\n\t"
  35634. "lsr r7, r8, #16\n\t"
  35635. "mul r7, r6, r7\n\t"
  35636. "add r5, r5, r7\n\t"
  35637. "lsl r7, r8, #16\n\t"
  35638. "lsr r7, r7, #16\n\t"
  35639. "mul r6, r7, r6\n\t"
  35640. "lsr r7, r6, #16\n\t"
  35641. "lsl r6, r6, #16\n\t"
  35642. "adds r4, r4, r6\n\t"
  35643. "adc r5, r5, r7\n\t"
  35644. #else
  35645. "umlal r4, r5, %[b], r8\n\t"
  35646. #endif
  35647. "stm %[r]!, {r4}\n\t"
  35648. "mov r3, #0\n\t"
  35649. /* A[38] * B */
  35650. "ldm %[a]!, {r8}\n\t"
  35651. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  35652. "lsl r6, %[b], #16\n\t"
  35653. "lsl r7, r8, #16\n\t"
  35654. "lsr r6, r6, #16\n\t"
  35655. "lsr r7, r7, #16\n\t"
  35656. "mul r7, r6, r7\n\t"
  35657. "adds r5, r5, r7\n\t"
  35658. "adc r3, r3, #0\n\t"
  35659. "lsr r7, r8, #16\n\t"
  35660. "mul r6, r7, r6\n\t"
  35661. "lsr r7, r6, #16\n\t"
  35662. "lsl r6, r6, #16\n\t"
  35663. "adds r5, r5, r6\n\t"
  35664. "adc r3, r3, r7\n\t"
  35665. "lsr r6, %[b], #16\n\t"
  35666. "lsr r7, r8, #16\n\t"
  35667. "mul r7, r6, r7\n\t"
  35668. "add r3, r3, r7\n\t"
  35669. "lsl r7, r8, #16\n\t"
  35670. "lsr r7, r7, #16\n\t"
  35671. "mul r6, r7, r6\n\t"
  35672. "lsr r7, r6, #16\n\t"
  35673. "lsl r6, r6, #16\n\t"
  35674. "adds r5, r5, r6\n\t"
  35675. "adc r3, r3, r7\n\t"
  35676. #else
  35677. "umlal r5, r3, %[b], r8\n\t"
  35678. #endif
  35679. "stm %[r]!, {r5}\n\t"
  35680. "mov r4, #0\n\t"
  35681. /* A[39] * B */
  35682. "ldm %[a]!, {r8}\n\t"
  35683. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  35684. "lsl r6, %[b], #16\n\t"
  35685. "lsl r7, r8, #16\n\t"
  35686. "lsr r6, r6, #16\n\t"
  35687. "lsr r7, r7, #16\n\t"
  35688. "mul r7, r6, r7\n\t"
  35689. "adds r3, r3, r7\n\t"
  35690. "adc r4, r4, #0\n\t"
  35691. "lsr r7, r8, #16\n\t"
  35692. "mul r6, r7, r6\n\t"
  35693. "lsr r7, r6, #16\n\t"
  35694. "lsl r6, r6, #16\n\t"
  35695. "adds r3, r3, r6\n\t"
  35696. "adc r4, r4, r7\n\t"
  35697. "lsr r6, %[b], #16\n\t"
  35698. "lsr r7, r8, #16\n\t"
  35699. "mul r7, r6, r7\n\t"
  35700. "add r4, r4, r7\n\t"
  35701. "lsl r7, r8, #16\n\t"
  35702. "lsr r7, r7, #16\n\t"
  35703. "mul r6, r7, r6\n\t"
  35704. "lsr r7, r6, #16\n\t"
  35705. "lsl r6, r6, #16\n\t"
  35706. "adds r3, r3, r6\n\t"
  35707. "adc r4, r4, r7\n\t"
  35708. #else
  35709. "umlal r3, r4, %[b], r8\n\t"
  35710. #endif
  35711. "stm %[r]!, {r3}\n\t"
  35712. "mov r5, #0\n\t"
  35713. /* A[40] * B */
  35714. "ldm %[a]!, {r8}\n\t"
  35715. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  35716. "lsl r6, %[b], #16\n\t"
  35717. "lsl r7, r8, #16\n\t"
  35718. "lsr r6, r6, #16\n\t"
  35719. "lsr r7, r7, #16\n\t"
  35720. "mul r7, r6, r7\n\t"
  35721. "adds r4, r4, r7\n\t"
  35722. "adc r5, r5, #0\n\t"
  35723. "lsr r7, r8, #16\n\t"
  35724. "mul r6, r7, r6\n\t"
  35725. "lsr r7, r6, #16\n\t"
  35726. "lsl r6, r6, #16\n\t"
  35727. "adds r4, r4, r6\n\t"
  35728. "adc r5, r5, r7\n\t"
  35729. "lsr r6, %[b], #16\n\t"
  35730. "lsr r7, r8, #16\n\t"
  35731. "mul r7, r6, r7\n\t"
  35732. "add r5, r5, r7\n\t"
  35733. "lsl r7, r8, #16\n\t"
  35734. "lsr r7, r7, #16\n\t"
  35735. "mul r6, r7, r6\n\t"
  35736. "lsr r7, r6, #16\n\t"
  35737. "lsl r6, r6, #16\n\t"
  35738. "adds r4, r4, r6\n\t"
  35739. "adc r5, r5, r7\n\t"
  35740. #else
  35741. "umlal r4, r5, %[b], r8\n\t"
  35742. #endif
  35743. "stm %[r]!, {r4}\n\t"
  35744. "mov r3, #0\n\t"
  35745. /* A[41] * B */
  35746. "ldm %[a]!, {r8}\n\t"
  35747. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  35748. "lsl r6, %[b], #16\n\t"
  35749. "lsl r7, r8, #16\n\t"
  35750. "lsr r6, r6, #16\n\t"
  35751. "lsr r7, r7, #16\n\t"
  35752. "mul r7, r6, r7\n\t"
  35753. "adds r5, r5, r7\n\t"
  35754. "adc r3, r3, #0\n\t"
  35755. "lsr r7, r8, #16\n\t"
  35756. "mul r6, r7, r6\n\t"
  35757. "lsr r7, r6, #16\n\t"
  35758. "lsl r6, r6, #16\n\t"
  35759. "adds r5, r5, r6\n\t"
  35760. "adc r3, r3, r7\n\t"
  35761. "lsr r6, %[b], #16\n\t"
  35762. "lsr r7, r8, #16\n\t"
  35763. "mul r7, r6, r7\n\t"
  35764. "add r3, r3, r7\n\t"
  35765. "lsl r7, r8, #16\n\t"
  35766. "lsr r7, r7, #16\n\t"
  35767. "mul r6, r7, r6\n\t"
  35768. "lsr r7, r6, #16\n\t"
  35769. "lsl r6, r6, #16\n\t"
  35770. "adds r5, r5, r6\n\t"
  35771. "adc r3, r3, r7\n\t"
  35772. #else
  35773. "umlal r5, r3, %[b], r8\n\t"
  35774. #endif
  35775. "stm %[r]!, {r5}\n\t"
  35776. "mov r4, #0\n\t"
  35777. /* A[42] * B */
  35778. "ldm %[a]!, {r8}\n\t"
  35779. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  35780. "lsl r6, %[b], #16\n\t"
  35781. "lsl r7, r8, #16\n\t"
  35782. "lsr r6, r6, #16\n\t"
  35783. "lsr r7, r7, #16\n\t"
  35784. "mul r7, r6, r7\n\t"
  35785. "adds r3, r3, r7\n\t"
  35786. "adc r4, r4, #0\n\t"
  35787. "lsr r7, r8, #16\n\t"
  35788. "mul r6, r7, r6\n\t"
  35789. "lsr r7, r6, #16\n\t"
  35790. "lsl r6, r6, #16\n\t"
  35791. "adds r3, r3, r6\n\t"
  35792. "adc r4, r4, r7\n\t"
  35793. "lsr r6, %[b], #16\n\t"
  35794. "lsr r7, r8, #16\n\t"
  35795. "mul r7, r6, r7\n\t"
  35796. "add r4, r4, r7\n\t"
  35797. "lsl r7, r8, #16\n\t"
  35798. "lsr r7, r7, #16\n\t"
  35799. "mul r6, r7, r6\n\t"
  35800. "lsr r7, r6, #16\n\t"
  35801. "lsl r6, r6, #16\n\t"
  35802. "adds r3, r3, r6\n\t"
  35803. "adc r4, r4, r7\n\t"
  35804. #else
  35805. "umlal r3, r4, %[b], r8\n\t"
  35806. #endif
  35807. "stm %[r]!, {r3}\n\t"
  35808. "mov r5, #0\n\t"
  35809. /* A[43] * B */
  35810. "ldm %[a]!, {r8}\n\t"
  35811. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  35812. "lsl r6, %[b], #16\n\t"
  35813. "lsl r7, r8, #16\n\t"
  35814. "lsr r6, r6, #16\n\t"
  35815. "lsr r7, r7, #16\n\t"
  35816. "mul r7, r6, r7\n\t"
  35817. "adds r4, r4, r7\n\t"
  35818. "adc r5, r5, #0\n\t"
  35819. "lsr r7, r8, #16\n\t"
  35820. "mul r6, r7, r6\n\t"
  35821. "lsr r7, r6, #16\n\t"
  35822. "lsl r6, r6, #16\n\t"
  35823. "adds r4, r4, r6\n\t"
  35824. "adc r5, r5, r7\n\t"
  35825. "lsr r6, %[b], #16\n\t"
  35826. "lsr r7, r8, #16\n\t"
  35827. "mul r7, r6, r7\n\t"
  35828. "add r5, r5, r7\n\t"
  35829. "lsl r7, r8, #16\n\t"
  35830. "lsr r7, r7, #16\n\t"
  35831. "mul r6, r7, r6\n\t"
  35832. "lsr r7, r6, #16\n\t"
  35833. "lsl r6, r6, #16\n\t"
  35834. "adds r4, r4, r6\n\t"
  35835. "adc r5, r5, r7\n\t"
  35836. #else
  35837. "umlal r4, r5, %[b], r8\n\t"
  35838. #endif
  35839. "stm %[r]!, {r4}\n\t"
  35840. "mov r3, #0\n\t"
  35841. /* A[44] * B */
  35842. "ldm %[a]!, {r8}\n\t"
  35843. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  35844. "lsl r6, %[b], #16\n\t"
  35845. "lsl r7, r8, #16\n\t"
  35846. "lsr r6, r6, #16\n\t"
  35847. "lsr r7, r7, #16\n\t"
  35848. "mul r7, r6, r7\n\t"
  35849. "adds r5, r5, r7\n\t"
  35850. "adc r3, r3, #0\n\t"
  35851. "lsr r7, r8, #16\n\t"
  35852. "mul r6, r7, r6\n\t"
  35853. "lsr r7, r6, #16\n\t"
  35854. "lsl r6, r6, #16\n\t"
  35855. "adds r5, r5, r6\n\t"
  35856. "adc r3, r3, r7\n\t"
  35857. "lsr r6, %[b], #16\n\t"
  35858. "lsr r7, r8, #16\n\t"
  35859. "mul r7, r6, r7\n\t"
  35860. "add r3, r3, r7\n\t"
  35861. "lsl r7, r8, #16\n\t"
  35862. "lsr r7, r7, #16\n\t"
  35863. "mul r6, r7, r6\n\t"
  35864. "lsr r7, r6, #16\n\t"
  35865. "lsl r6, r6, #16\n\t"
  35866. "adds r5, r5, r6\n\t"
  35867. "adc r3, r3, r7\n\t"
  35868. #else
  35869. "umlal r5, r3, %[b], r8\n\t"
  35870. #endif
  35871. "stm %[r]!, {r5}\n\t"
  35872. "mov r4, #0\n\t"
  35873. /* A[45] * B */
  35874. "ldm %[a]!, {r8}\n\t"
  35875. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  35876. "lsl r6, %[b], #16\n\t"
  35877. "lsl r7, r8, #16\n\t"
  35878. "lsr r6, r6, #16\n\t"
  35879. "lsr r7, r7, #16\n\t"
  35880. "mul r7, r6, r7\n\t"
  35881. "adds r3, r3, r7\n\t"
  35882. "adc r4, r4, #0\n\t"
  35883. "lsr r7, r8, #16\n\t"
  35884. "mul r6, r7, r6\n\t"
  35885. "lsr r7, r6, #16\n\t"
  35886. "lsl r6, r6, #16\n\t"
  35887. "adds r3, r3, r6\n\t"
  35888. "adc r4, r4, r7\n\t"
  35889. "lsr r6, %[b], #16\n\t"
  35890. "lsr r7, r8, #16\n\t"
  35891. "mul r7, r6, r7\n\t"
  35892. "add r4, r4, r7\n\t"
  35893. "lsl r7, r8, #16\n\t"
  35894. "lsr r7, r7, #16\n\t"
  35895. "mul r6, r7, r6\n\t"
  35896. "lsr r7, r6, #16\n\t"
  35897. "lsl r6, r6, #16\n\t"
  35898. "adds r3, r3, r6\n\t"
  35899. "adc r4, r4, r7\n\t"
  35900. #else
  35901. "umlal r3, r4, %[b], r8\n\t"
  35902. #endif
  35903. "stm %[r]!, {r3}\n\t"
  35904. "mov r5, #0\n\t"
  35905. /* A[46] * B */
  35906. "ldm %[a]!, {r8}\n\t"
  35907. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  35908. "lsl r6, %[b], #16\n\t"
  35909. "lsl r7, r8, #16\n\t"
  35910. "lsr r6, r6, #16\n\t"
  35911. "lsr r7, r7, #16\n\t"
  35912. "mul r7, r6, r7\n\t"
  35913. "adds r4, r4, r7\n\t"
  35914. "adc r5, r5, #0\n\t"
  35915. "lsr r7, r8, #16\n\t"
  35916. "mul r6, r7, r6\n\t"
  35917. "lsr r7, r6, #16\n\t"
  35918. "lsl r6, r6, #16\n\t"
  35919. "adds r4, r4, r6\n\t"
  35920. "adc r5, r5, r7\n\t"
  35921. "lsr r6, %[b], #16\n\t"
  35922. "lsr r7, r8, #16\n\t"
  35923. "mul r7, r6, r7\n\t"
  35924. "add r5, r5, r7\n\t"
  35925. "lsl r7, r8, #16\n\t"
  35926. "lsr r7, r7, #16\n\t"
  35927. "mul r6, r7, r6\n\t"
  35928. "lsr r7, r6, #16\n\t"
  35929. "lsl r6, r6, #16\n\t"
  35930. "adds r4, r4, r6\n\t"
  35931. "adc r5, r5, r7\n\t"
  35932. #else
  35933. "umlal r4, r5, %[b], r8\n\t"
  35934. #endif
  35935. "stm %[r]!, {r4}\n\t"
  35936. "mov r3, #0\n\t"
  35937. /* A[47] * B */
  35938. "ldm %[a]!, {r8}\n\t"
  35939. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  35940. "lsl r6, %[b], #16\n\t"
  35941. "lsl r7, r8, #16\n\t"
  35942. "lsr r6, r6, #16\n\t"
  35943. "lsr r7, r7, #16\n\t"
  35944. "mul r7, r6, r7\n\t"
  35945. "adds r5, r5, r7\n\t"
  35946. "adc r3, r3, #0\n\t"
  35947. "lsr r7, r8, #16\n\t"
  35948. "mul r6, r7, r6\n\t"
  35949. "lsr r7, r6, #16\n\t"
  35950. "lsl r6, r6, #16\n\t"
  35951. "adds r5, r5, r6\n\t"
  35952. "adc r3, r3, r7\n\t"
  35953. "lsr r6, %[b], #16\n\t"
  35954. "lsr r7, r8, #16\n\t"
  35955. "mul r7, r6, r7\n\t"
  35956. "add r3, r3, r7\n\t"
  35957. "lsl r7, r8, #16\n\t"
  35958. "lsr r7, r7, #16\n\t"
  35959. "mul r6, r7, r6\n\t"
  35960. "lsr r7, r6, #16\n\t"
  35961. "lsl r6, r6, #16\n\t"
  35962. "adds r5, r5, r6\n\t"
  35963. "adc r3, r3, r7\n\t"
  35964. #else
  35965. "umlal r5, r3, %[b], r8\n\t"
  35966. #endif
  35967. "stm %[r]!, {r5}\n\t"
  35968. "str r3, [%[r]]\n\t"
  35969. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  35970. :
  35971. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "cc"
  35972. );
  35973. }
  35974. #endif /* WOLFSSL_SP_SMALL */
  35975. #ifdef WOLFSSL_SP_USE_UDIV
  35976. /* Divide the double width number (d1|d0) by the divisor. (d1|d0 / div)
  35977. *
  35978. * d1 The high order half of the number to divide.
  35979. * d0 The low order half of the number to divide.
  35980. * div The divisor.
  35981. * returns the result of the division.
  35982. *
  35983. * Note that this is an approximate div. It may give an answer 1 larger.
  35984. */
  35985. static sp_digit div_3072_word_48(sp_digit d1_p, sp_digit d0_p, sp_digit div_p)
  35986. {
  35987. register sp_digit d1 asm ("r0") = (sp_digit)d1_p;
  35988. register sp_digit d0 asm ("r1") = (sp_digit)d0_p;
  35989. register sp_digit div asm ("r2") = (sp_digit)div_p;
  35990. __asm__ __volatile__ (
  35991. "lsr r6, %[div], #16\n\t"
  35992. "add lr, r6, #1\n\t"
  35993. "udiv r4, %[d1], lr\n\t"
  35994. "lsl r5, %[div], #16\n\t"
  35995. "lsl r4, r4, #16\n\t"
  35996. "umull r3, r12, %[div], r4\n\t"
  35997. "subs %[d0], %[d0], r3\n\t"
  35998. "sbc %[d1], %[d1], r12\n\t"
  35999. "subs r3, %[d1], lr\n\t"
  36000. "sbc r7, r7, r7\n\t"
  36001. "add r7, r7, #1\n\t"
  36002. "rsb r8, r7, #0\n\t"
  36003. "lsl r7, r7, #16\n\t"
  36004. "and r5, r5, r8\n\t"
  36005. "and r6, r6, r8\n\t"
  36006. "subs %[d0], %[d0], r5\n\t"
  36007. "add r4, r4, r7\n\t"
  36008. "sbc %[d1], %[d1], r6\n\t"
  36009. "lsl r12, %[d1], #16\n\t"
  36010. "lsr r3, %[d0], #16\n\t"
  36011. "orr r3, r3, r12\n\t"
  36012. "udiv r3, r3, lr\n\t"
  36013. "add r4, r4, r3\n\t"
  36014. "umull r3, r12, %[div], r3\n\t"
  36015. "subs %[d0], %[d0], r3\n\t"
  36016. "sbc %[d1], %[d1], r12\n\t"
  36017. "lsl r12, %[d1], #16\n\t"
  36018. "lsr r3, %[d0], #16\n\t"
  36019. "orr r3, r3, r12\n\t"
  36020. "udiv r3, r3, lr\n\t"
  36021. "add r4, r4, r3\n\t"
  36022. "mul r3, %[div], r3\n\t"
  36023. "sub %[d0], %[d0], r3\n\t"
  36024. "udiv r3, %[d0], %[div]\n\t"
  36025. "add %[d1], r4, r3\n\t"
  36026. : [d1] "+r" (d1), [d0] "+r" (d0), [div] "+r" (div)
  36027. :
  36028. : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8", "cc"
  36029. );
  36030. return (uint32_t)(size_t)d1;
  36031. }
  36032. #else
  36033. /* Divide the double width number (d1|d0) by the divisor. (d1|d0 / div)
  36034. *
  36035. * d1 The high order half of the number to divide.
  36036. * d0 The low order half of the number to divide.
  36037. * div The divisor.
  36038. * returns the result of the division.
  36039. *
  36040. * Note that this is an approximate div. It may give an answer 1 larger.
  36041. */
  36042. static sp_digit div_3072_word_48(sp_digit d1_p, sp_digit d0_p, sp_digit div_p)
  36043. {
  36044. register sp_digit d1 asm ("r0") = (sp_digit)d1_p;
  36045. register sp_digit d0 asm ("r1") = (sp_digit)d0_p;
  36046. register sp_digit div asm ("r2") = (sp_digit)div_p;
  36047. __asm__ __volatile__ (
  36048. "lsr lr, %[div], #1\n\t"
  36049. "add lr, lr, #1\n\t"
  36050. "mov r4, %[d0]\n\t"
  36051. "mov r5, %[d1]\n\t"
  36052. /* Do top 32 */
  36053. "subs r6, lr, r5\n\t"
  36054. "sbc r6, r6, r6\n\t"
  36055. "mov r3, #0\n\t"
  36056. "sub r3, r3, r6\n\t"
  36057. "and r6, r6, lr\n\t"
  36058. "subs r5, r5, r6\n\t"
  36059. /* Next 30 bits */
  36060. "mov r12, #29\n\t"
  36061. "\n"
  36062. "L_div_3072_word_48_bit_%=: \n\t"
  36063. "lsls r4, r4, #1\n\t"
  36064. "adc r5, r5, r5\n\t"
  36065. "subs r6, lr, r5\n\t"
  36066. "sbc r6, r6, r6\n\t"
  36067. "add r3, r3, r3\n\t"
  36068. "sub r3, r3, r6\n\t"
  36069. "and r6, r6, lr\n\t"
  36070. "subs r5, r5, r6\n\t"
  36071. "subs r12, r12, #1\n\t"
  36072. "bpl L_div_3072_word_48_bit_%=\n\t"
  36073. "add r3, r3, r3\n\t"
  36074. "add r3, r3, #1\n\t"
  36075. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  36076. "lsl r7, r3, #16\n\t"
  36077. "lsl r4, %[div], #16\n\t"
  36078. "lsr r7, r7, #16\n\t"
  36079. "lsr r4, r4, #16\n\t"
  36080. "mul r4, r7, r4\n\t"
  36081. "lsr r8, %[div], #16\n\t"
  36082. "mul r7, r8, r7\n\t"
  36083. "lsr r5, r7, #16\n\t"
  36084. "lsl r7, r7, #16\n\t"
  36085. "adds r4, r4, r7\n\t"
  36086. "adc r5, r5, #0\n\t"
  36087. "lsr r7, r3, #16\n\t"
  36088. "mul r8, r7, r8\n\t"
  36089. "add r5, r5, r8\n\t"
  36090. "lsl r8, %[div], #16\n\t"
  36091. "lsr r8, r8, #16\n\t"
  36092. "mul r7, r8, r7\n\t"
  36093. "lsr r8, r7, #16\n\t"
  36094. "lsl r7, r7, #16\n\t"
  36095. "adds r4, r4, r7\n\t"
  36096. "adc r5, r5, r8\n\t"
  36097. #else
  36098. "umull r4, r5, r3, %[div]\n\t"
  36099. #endif
  36100. "subs r7, %[d0], r4\n\t"
  36101. "sbc r8, %[d1], r5\n\t"
  36102. "add r3, r3, r8\n\t"
  36103. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  36104. "lsl r7, r3, #16\n\t"
  36105. "lsl r4, %[div], #16\n\t"
  36106. "lsr r7, r7, #16\n\t"
  36107. "lsr r4, r4, #16\n\t"
  36108. "mul r4, r7, r4\n\t"
  36109. "lsr r8, %[div], #16\n\t"
  36110. "mul r7, r8, r7\n\t"
  36111. "lsr r5, r7, #16\n\t"
  36112. "lsl r7, r7, #16\n\t"
  36113. "adds r4, r4, r7\n\t"
  36114. "adc r5, r5, #0\n\t"
  36115. "lsr r7, r3, #16\n\t"
  36116. "mul r8, r7, r8\n\t"
  36117. "add r5, r5, r8\n\t"
  36118. "lsl r8, %[div], #16\n\t"
  36119. "lsr r8, r8, #16\n\t"
  36120. "mul r7, r8, r7\n\t"
  36121. "lsr r8, r7, #16\n\t"
  36122. "lsl r7, r7, #16\n\t"
  36123. "adds r4, r4, r7\n\t"
  36124. "adc r5, r5, r8\n\t"
  36125. #else
  36126. "umull r4, r5, r3, %[div]\n\t"
  36127. #endif
  36128. "subs r7, %[d0], r4\n\t"
  36129. "sbc r8, %[d1], r5\n\t"
  36130. "add r3, r3, r8\n\t"
  36131. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  36132. "lsl r7, r3, #16\n\t"
  36133. "lsl r4, %[div], #16\n\t"
  36134. "lsr r7, r7, #16\n\t"
  36135. "lsr r4, r4, #16\n\t"
  36136. "mul r4, r7, r4\n\t"
  36137. "lsr r8, %[div], #16\n\t"
  36138. "mul r7, r8, r7\n\t"
  36139. "lsr r5, r7, #16\n\t"
  36140. "lsl r7, r7, #16\n\t"
  36141. "adds r4, r4, r7\n\t"
  36142. "adc r5, r5, #0\n\t"
  36143. "lsr r7, r3, #16\n\t"
  36144. "mul r8, r7, r8\n\t"
  36145. "add r5, r5, r8\n\t"
  36146. "lsl r8, %[div], #16\n\t"
  36147. "lsr r8, r8, #16\n\t"
  36148. "mul r7, r8, r7\n\t"
  36149. "lsr r8, r7, #16\n\t"
  36150. "lsl r7, r7, #16\n\t"
  36151. "adds r4, r4, r7\n\t"
  36152. "adc r5, r5, r8\n\t"
  36153. #else
  36154. "umull r4, r5, r3, %[div]\n\t"
  36155. #endif
  36156. "subs r7, %[d0], r4\n\t"
  36157. "sbc r8, %[d1], r5\n\t"
  36158. "add r3, r3, r8\n\t"
  36159. "subs r6, %[div], r7\n\t"
  36160. "sbc r6, r6, r6\n\t"
  36161. "sub %[d1], r3, r6\n\t"
  36162. : [d1] "+r" (d1), [d0] "+r" (d0), [div] "+r" (div)
  36163. :
  36164. : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8", "cc"
  36165. );
  36166. return (uint32_t)(size_t)d1;
  36167. }
  36168. #endif
  36169. /* Compare a with b in constant time.
  36170. *
  36171. * a A single precision integer.
  36172. * b A single precision integer.
  36173. * return -ve, 0 or +ve if a is less than, equal to or greater than b
  36174. * respectively.
  36175. */
  36176. static sp_int32 sp_3072_cmp_48(const sp_digit* a_p, const sp_digit* b_p)
  36177. {
  36178. register const sp_digit* a asm ("r0") = (const sp_digit*)a_p;
  36179. register const sp_digit* b asm ("r1") = (const sp_digit*)b_p;
  36180. __asm__ __volatile__ (
  36181. "mov r2, #-1\n\t"
  36182. "mov r6, #1\n\t"
  36183. "mov r5, #0\n\t"
  36184. "mov r3, #-1\n\t"
  36185. #ifdef WOLFSSL_SP_SMALL
  36186. "mov r4, #0xbc\n\t"
  36187. "\n"
  36188. "L_sp_3072_cmp_48_words_%=: \n\t"
  36189. "ldr r12, [%[a], r4]\n\t"
  36190. "ldr lr, [%[b], r4]\n\t"
  36191. "and r12, r12, r3\n\t"
  36192. "and lr, lr, r3\n\t"
  36193. "subs r12, r12, lr\n\t"
  36194. "it hi\n\t"
  36195. "movhi r2, r6\n\t"
  36196. "it lo\n\t"
  36197. "movlo r2, r3\n\t"
  36198. "it ne\n\t"
  36199. "movne r3, r5\n\t"
  36200. "subs r4, r4, #4\n\t"
  36201. "bcs L_sp_3072_cmp_48_words_%=\n\t"
  36202. "eor r2, r2, r3\n\t"
  36203. #else
  36204. "ldr r12, [%[a], #188]\n\t"
  36205. "ldr lr, [%[b], #188]\n\t"
  36206. "and r12, r12, r3\n\t"
  36207. "and lr, lr, r3\n\t"
  36208. "subs r12, r12, lr\n\t"
  36209. "it hi\n\t"
  36210. "movhi r2, r6\n\t"
  36211. "it lo\n\t"
  36212. "movlo r2, r3\n\t"
  36213. "it ne\n\t"
  36214. "movne r3, r5\n\t"
  36215. "ldr r12, [%[a], #184]\n\t"
  36216. "ldr lr, [%[b], #184]\n\t"
  36217. "and r12, r12, r3\n\t"
  36218. "and lr, lr, r3\n\t"
  36219. "subs r12, r12, lr\n\t"
  36220. "it hi\n\t"
  36221. "movhi r2, r6\n\t"
  36222. "it lo\n\t"
  36223. "movlo r2, r3\n\t"
  36224. "it ne\n\t"
  36225. "movne r3, r5\n\t"
  36226. "ldr r12, [%[a], #180]\n\t"
  36227. "ldr lr, [%[b], #180]\n\t"
  36228. "and r12, r12, r3\n\t"
  36229. "and lr, lr, r3\n\t"
  36230. "subs r12, r12, lr\n\t"
  36231. "it hi\n\t"
  36232. "movhi r2, r6\n\t"
  36233. "it lo\n\t"
  36234. "movlo r2, r3\n\t"
  36235. "it ne\n\t"
  36236. "movne r3, r5\n\t"
  36237. "ldr r12, [%[a], #176]\n\t"
  36238. "ldr lr, [%[b], #176]\n\t"
  36239. "and r12, r12, r3\n\t"
  36240. "and lr, lr, r3\n\t"
  36241. "subs r12, r12, lr\n\t"
  36242. "it hi\n\t"
  36243. "movhi r2, r6\n\t"
  36244. "it lo\n\t"
  36245. "movlo r2, r3\n\t"
  36246. "it ne\n\t"
  36247. "movne r3, r5\n\t"
  36248. "ldr r12, [%[a], #172]\n\t"
  36249. "ldr lr, [%[b], #172]\n\t"
  36250. "and r12, r12, r3\n\t"
  36251. "and lr, lr, r3\n\t"
  36252. "subs r12, r12, lr\n\t"
  36253. "it hi\n\t"
  36254. "movhi r2, r6\n\t"
  36255. "it lo\n\t"
  36256. "movlo r2, r3\n\t"
  36257. "it ne\n\t"
  36258. "movne r3, r5\n\t"
  36259. "ldr r12, [%[a], #168]\n\t"
  36260. "ldr lr, [%[b], #168]\n\t"
  36261. "and r12, r12, r3\n\t"
  36262. "and lr, lr, r3\n\t"
  36263. "subs r12, r12, lr\n\t"
  36264. "it hi\n\t"
  36265. "movhi r2, r6\n\t"
  36266. "it lo\n\t"
  36267. "movlo r2, r3\n\t"
  36268. "it ne\n\t"
  36269. "movne r3, r5\n\t"
  36270. "ldr r12, [%[a], #164]\n\t"
  36271. "ldr lr, [%[b], #164]\n\t"
  36272. "and r12, r12, r3\n\t"
  36273. "and lr, lr, r3\n\t"
  36274. "subs r12, r12, lr\n\t"
  36275. "it hi\n\t"
  36276. "movhi r2, r6\n\t"
  36277. "it lo\n\t"
  36278. "movlo r2, r3\n\t"
  36279. "it ne\n\t"
  36280. "movne r3, r5\n\t"
  36281. "ldr r12, [%[a], #160]\n\t"
  36282. "ldr lr, [%[b], #160]\n\t"
  36283. "and r12, r12, r3\n\t"
  36284. "and lr, lr, r3\n\t"
  36285. "subs r12, r12, lr\n\t"
  36286. "it hi\n\t"
  36287. "movhi r2, r6\n\t"
  36288. "it lo\n\t"
  36289. "movlo r2, r3\n\t"
  36290. "it ne\n\t"
  36291. "movne r3, r5\n\t"
  36292. "ldr r12, [%[a], #156]\n\t"
  36293. "ldr lr, [%[b], #156]\n\t"
  36294. "and r12, r12, r3\n\t"
  36295. "and lr, lr, r3\n\t"
  36296. "subs r12, r12, lr\n\t"
  36297. "it hi\n\t"
  36298. "movhi r2, r6\n\t"
  36299. "it lo\n\t"
  36300. "movlo r2, r3\n\t"
  36301. "it ne\n\t"
  36302. "movne r3, r5\n\t"
  36303. "ldr r12, [%[a], #152]\n\t"
  36304. "ldr lr, [%[b], #152]\n\t"
  36305. "and r12, r12, r3\n\t"
  36306. "and lr, lr, r3\n\t"
  36307. "subs r12, r12, lr\n\t"
  36308. "it hi\n\t"
  36309. "movhi r2, r6\n\t"
  36310. "it lo\n\t"
  36311. "movlo r2, r3\n\t"
  36312. "it ne\n\t"
  36313. "movne r3, r5\n\t"
  36314. "ldr r12, [%[a], #148]\n\t"
  36315. "ldr lr, [%[b], #148]\n\t"
  36316. "and r12, r12, r3\n\t"
  36317. "and lr, lr, r3\n\t"
  36318. "subs r12, r12, lr\n\t"
  36319. "it hi\n\t"
  36320. "movhi r2, r6\n\t"
  36321. "it lo\n\t"
  36322. "movlo r2, r3\n\t"
  36323. "it ne\n\t"
  36324. "movne r3, r5\n\t"
  36325. "ldr r12, [%[a], #144]\n\t"
  36326. "ldr lr, [%[b], #144]\n\t"
  36327. "and r12, r12, r3\n\t"
  36328. "and lr, lr, r3\n\t"
  36329. "subs r12, r12, lr\n\t"
  36330. "it hi\n\t"
  36331. "movhi r2, r6\n\t"
  36332. "it lo\n\t"
  36333. "movlo r2, r3\n\t"
  36334. "it ne\n\t"
  36335. "movne r3, r5\n\t"
  36336. "ldr r12, [%[a], #140]\n\t"
  36337. "ldr lr, [%[b], #140]\n\t"
  36338. "and r12, r12, r3\n\t"
  36339. "and lr, lr, r3\n\t"
  36340. "subs r12, r12, lr\n\t"
  36341. "it hi\n\t"
  36342. "movhi r2, r6\n\t"
  36343. "it lo\n\t"
  36344. "movlo r2, r3\n\t"
  36345. "it ne\n\t"
  36346. "movne r3, r5\n\t"
  36347. "ldr r12, [%[a], #136]\n\t"
  36348. "ldr lr, [%[b], #136]\n\t"
  36349. "and r12, r12, r3\n\t"
  36350. "and lr, lr, r3\n\t"
  36351. "subs r12, r12, lr\n\t"
  36352. "it hi\n\t"
  36353. "movhi r2, r6\n\t"
  36354. "it lo\n\t"
  36355. "movlo r2, r3\n\t"
  36356. "it ne\n\t"
  36357. "movne r3, r5\n\t"
  36358. "ldr r12, [%[a], #132]\n\t"
  36359. "ldr lr, [%[b], #132]\n\t"
  36360. "and r12, r12, r3\n\t"
  36361. "and lr, lr, r3\n\t"
  36362. "subs r12, r12, lr\n\t"
  36363. "it hi\n\t"
  36364. "movhi r2, r6\n\t"
  36365. "it lo\n\t"
  36366. "movlo r2, r3\n\t"
  36367. "it ne\n\t"
  36368. "movne r3, r5\n\t"
  36369. "ldr r12, [%[a], #128]\n\t"
  36370. "ldr lr, [%[b], #128]\n\t"
  36371. "and r12, r12, r3\n\t"
  36372. "and lr, lr, r3\n\t"
  36373. "subs r12, r12, lr\n\t"
  36374. "it hi\n\t"
  36375. "movhi r2, r6\n\t"
  36376. "it lo\n\t"
  36377. "movlo r2, r3\n\t"
  36378. "it ne\n\t"
  36379. "movne r3, r5\n\t"
  36380. "ldr r12, [%[a], #124]\n\t"
  36381. "ldr lr, [%[b], #124]\n\t"
  36382. "and r12, r12, r3\n\t"
  36383. "and lr, lr, r3\n\t"
  36384. "subs r12, r12, lr\n\t"
  36385. "it hi\n\t"
  36386. "movhi r2, r6\n\t"
  36387. "it lo\n\t"
  36388. "movlo r2, r3\n\t"
  36389. "it ne\n\t"
  36390. "movne r3, r5\n\t"
  36391. "ldr r12, [%[a], #120]\n\t"
  36392. "ldr lr, [%[b], #120]\n\t"
  36393. "and r12, r12, r3\n\t"
  36394. "and lr, lr, r3\n\t"
  36395. "subs r12, r12, lr\n\t"
  36396. "it hi\n\t"
  36397. "movhi r2, r6\n\t"
  36398. "it lo\n\t"
  36399. "movlo r2, r3\n\t"
  36400. "it ne\n\t"
  36401. "movne r3, r5\n\t"
  36402. "ldr r12, [%[a], #116]\n\t"
  36403. "ldr lr, [%[b], #116]\n\t"
  36404. "and r12, r12, r3\n\t"
  36405. "and lr, lr, r3\n\t"
  36406. "subs r12, r12, lr\n\t"
  36407. "it hi\n\t"
  36408. "movhi r2, r6\n\t"
  36409. "it lo\n\t"
  36410. "movlo r2, r3\n\t"
  36411. "it ne\n\t"
  36412. "movne r3, r5\n\t"
  36413. "ldr r12, [%[a], #112]\n\t"
  36414. "ldr lr, [%[b], #112]\n\t"
  36415. "and r12, r12, r3\n\t"
  36416. "and lr, lr, r3\n\t"
  36417. "subs r12, r12, lr\n\t"
  36418. "it hi\n\t"
  36419. "movhi r2, r6\n\t"
  36420. "it lo\n\t"
  36421. "movlo r2, r3\n\t"
  36422. "it ne\n\t"
  36423. "movne r3, r5\n\t"
  36424. "ldr r12, [%[a], #108]\n\t"
  36425. "ldr lr, [%[b], #108]\n\t"
  36426. "and r12, r12, r3\n\t"
  36427. "and lr, lr, r3\n\t"
  36428. "subs r12, r12, lr\n\t"
  36429. "it hi\n\t"
  36430. "movhi r2, r6\n\t"
  36431. "it lo\n\t"
  36432. "movlo r2, r3\n\t"
  36433. "it ne\n\t"
  36434. "movne r3, r5\n\t"
  36435. "ldr r12, [%[a], #104]\n\t"
  36436. "ldr lr, [%[b], #104]\n\t"
  36437. "and r12, r12, r3\n\t"
  36438. "and lr, lr, r3\n\t"
  36439. "subs r12, r12, lr\n\t"
  36440. "it hi\n\t"
  36441. "movhi r2, r6\n\t"
  36442. "it lo\n\t"
  36443. "movlo r2, r3\n\t"
  36444. "it ne\n\t"
  36445. "movne r3, r5\n\t"
  36446. "ldr r12, [%[a], #100]\n\t"
  36447. "ldr lr, [%[b], #100]\n\t"
  36448. "and r12, r12, r3\n\t"
  36449. "and lr, lr, r3\n\t"
  36450. "subs r12, r12, lr\n\t"
  36451. "it hi\n\t"
  36452. "movhi r2, r6\n\t"
  36453. "it lo\n\t"
  36454. "movlo r2, r3\n\t"
  36455. "it ne\n\t"
  36456. "movne r3, r5\n\t"
  36457. "ldr r12, [%[a], #96]\n\t"
  36458. "ldr lr, [%[b], #96]\n\t"
  36459. "and r12, r12, r3\n\t"
  36460. "and lr, lr, r3\n\t"
  36461. "subs r12, r12, lr\n\t"
  36462. "it hi\n\t"
  36463. "movhi r2, r6\n\t"
  36464. "it lo\n\t"
  36465. "movlo r2, r3\n\t"
  36466. "it ne\n\t"
  36467. "movne r3, r5\n\t"
  36468. "ldr r12, [%[a], #92]\n\t"
  36469. "ldr lr, [%[b], #92]\n\t"
  36470. "and r12, r12, r3\n\t"
  36471. "and lr, lr, r3\n\t"
  36472. "subs r12, r12, lr\n\t"
  36473. "it hi\n\t"
  36474. "movhi r2, r6\n\t"
  36475. "it lo\n\t"
  36476. "movlo r2, r3\n\t"
  36477. "it ne\n\t"
  36478. "movne r3, r5\n\t"
  36479. "ldr r12, [%[a], #88]\n\t"
  36480. "ldr lr, [%[b], #88]\n\t"
  36481. "and r12, r12, r3\n\t"
  36482. "and lr, lr, r3\n\t"
  36483. "subs r12, r12, lr\n\t"
  36484. "it hi\n\t"
  36485. "movhi r2, r6\n\t"
  36486. "it lo\n\t"
  36487. "movlo r2, r3\n\t"
  36488. "it ne\n\t"
  36489. "movne r3, r5\n\t"
  36490. "ldr r12, [%[a], #84]\n\t"
  36491. "ldr lr, [%[b], #84]\n\t"
  36492. "and r12, r12, r3\n\t"
  36493. "and lr, lr, r3\n\t"
  36494. "subs r12, r12, lr\n\t"
  36495. "it hi\n\t"
  36496. "movhi r2, r6\n\t"
  36497. "it lo\n\t"
  36498. "movlo r2, r3\n\t"
  36499. "it ne\n\t"
  36500. "movne r3, r5\n\t"
  36501. "ldr r12, [%[a], #80]\n\t"
  36502. "ldr lr, [%[b], #80]\n\t"
  36503. "and r12, r12, r3\n\t"
  36504. "and lr, lr, r3\n\t"
  36505. "subs r12, r12, lr\n\t"
  36506. "it hi\n\t"
  36507. "movhi r2, r6\n\t"
  36508. "it lo\n\t"
  36509. "movlo r2, r3\n\t"
  36510. "it ne\n\t"
  36511. "movne r3, r5\n\t"
  36512. "ldr r12, [%[a], #76]\n\t"
  36513. "ldr lr, [%[b], #76]\n\t"
  36514. "and r12, r12, r3\n\t"
  36515. "and lr, lr, r3\n\t"
  36516. "subs r12, r12, lr\n\t"
  36517. "it hi\n\t"
  36518. "movhi r2, r6\n\t"
  36519. "it lo\n\t"
  36520. "movlo r2, r3\n\t"
  36521. "it ne\n\t"
  36522. "movne r3, r5\n\t"
  36523. "ldr r12, [%[a], #72]\n\t"
  36524. "ldr lr, [%[b], #72]\n\t"
  36525. "and r12, r12, r3\n\t"
  36526. "and lr, lr, r3\n\t"
  36527. "subs r12, r12, lr\n\t"
  36528. "it hi\n\t"
  36529. "movhi r2, r6\n\t"
  36530. "it lo\n\t"
  36531. "movlo r2, r3\n\t"
  36532. "it ne\n\t"
  36533. "movne r3, r5\n\t"
  36534. "ldr r12, [%[a], #68]\n\t"
  36535. "ldr lr, [%[b], #68]\n\t"
  36536. "and r12, r12, r3\n\t"
  36537. "and lr, lr, r3\n\t"
  36538. "subs r12, r12, lr\n\t"
  36539. "it hi\n\t"
  36540. "movhi r2, r6\n\t"
  36541. "it lo\n\t"
  36542. "movlo r2, r3\n\t"
  36543. "it ne\n\t"
  36544. "movne r3, r5\n\t"
  36545. "ldr r12, [%[a], #64]\n\t"
  36546. "ldr lr, [%[b], #64]\n\t"
  36547. "and r12, r12, r3\n\t"
  36548. "and lr, lr, r3\n\t"
  36549. "subs r12, r12, lr\n\t"
  36550. "it hi\n\t"
  36551. "movhi r2, r6\n\t"
  36552. "it lo\n\t"
  36553. "movlo r2, r3\n\t"
  36554. "it ne\n\t"
  36555. "movne r3, r5\n\t"
  36556. "ldr r12, [%[a], #60]\n\t"
  36557. "ldr lr, [%[b], #60]\n\t"
  36558. "and r12, r12, r3\n\t"
  36559. "and lr, lr, r3\n\t"
  36560. "subs r12, r12, lr\n\t"
  36561. "it hi\n\t"
  36562. "movhi r2, r6\n\t"
  36563. "it lo\n\t"
  36564. "movlo r2, r3\n\t"
  36565. "it ne\n\t"
  36566. "movne r3, r5\n\t"
  36567. "ldr r12, [%[a], #56]\n\t"
  36568. "ldr lr, [%[b], #56]\n\t"
  36569. "and r12, r12, r3\n\t"
  36570. "and lr, lr, r3\n\t"
  36571. "subs r12, r12, lr\n\t"
  36572. "it hi\n\t"
  36573. "movhi r2, r6\n\t"
  36574. "it lo\n\t"
  36575. "movlo r2, r3\n\t"
  36576. "it ne\n\t"
  36577. "movne r3, r5\n\t"
  36578. "ldr r12, [%[a], #52]\n\t"
  36579. "ldr lr, [%[b], #52]\n\t"
  36580. "and r12, r12, r3\n\t"
  36581. "and lr, lr, r3\n\t"
  36582. "subs r12, r12, lr\n\t"
  36583. "it hi\n\t"
  36584. "movhi r2, r6\n\t"
  36585. "it lo\n\t"
  36586. "movlo r2, r3\n\t"
  36587. "it ne\n\t"
  36588. "movne r3, r5\n\t"
  36589. "ldr r12, [%[a], #48]\n\t"
  36590. "ldr lr, [%[b], #48]\n\t"
  36591. "and r12, r12, r3\n\t"
  36592. "and lr, lr, r3\n\t"
  36593. "subs r12, r12, lr\n\t"
  36594. "it hi\n\t"
  36595. "movhi r2, r6\n\t"
  36596. "it lo\n\t"
  36597. "movlo r2, r3\n\t"
  36598. "it ne\n\t"
  36599. "movne r3, r5\n\t"
  36600. "ldr r12, [%[a], #44]\n\t"
  36601. "ldr lr, [%[b], #44]\n\t"
  36602. "and r12, r12, r3\n\t"
  36603. "and lr, lr, r3\n\t"
  36604. "subs r12, r12, lr\n\t"
  36605. "it hi\n\t"
  36606. "movhi r2, r6\n\t"
  36607. "it lo\n\t"
  36608. "movlo r2, r3\n\t"
  36609. "it ne\n\t"
  36610. "movne r3, r5\n\t"
  36611. "ldr r12, [%[a], #40]\n\t"
  36612. "ldr lr, [%[b], #40]\n\t"
  36613. "and r12, r12, r3\n\t"
  36614. "and lr, lr, r3\n\t"
  36615. "subs r12, r12, lr\n\t"
  36616. "it hi\n\t"
  36617. "movhi r2, r6\n\t"
  36618. "it lo\n\t"
  36619. "movlo r2, r3\n\t"
  36620. "it ne\n\t"
  36621. "movne r3, r5\n\t"
  36622. "ldr r12, [%[a], #36]\n\t"
  36623. "ldr lr, [%[b], #36]\n\t"
  36624. "and r12, r12, r3\n\t"
  36625. "and lr, lr, r3\n\t"
  36626. "subs r12, r12, lr\n\t"
  36627. "it hi\n\t"
  36628. "movhi r2, r6\n\t"
  36629. "it lo\n\t"
  36630. "movlo r2, r3\n\t"
  36631. "it ne\n\t"
  36632. "movne r3, r5\n\t"
  36633. "ldr r12, [%[a], #32]\n\t"
  36634. "ldr lr, [%[b], #32]\n\t"
  36635. "and r12, r12, r3\n\t"
  36636. "and lr, lr, r3\n\t"
  36637. "subs r12, r12, lr\n\t"
  36638. "it hi\n\t"
  36639. "movhi r2, r6\n\t"
  36640. "it lo\n\t"
  36641. "movlo r2, r3\n\t"
  36642. "it ne\n\t"
  36643. "movne r3, r5\n\t"
  36644. "ldr r12, [%[a], #28]\n\t"
  36645. "ldr lr, [%[b], #28]\n\t"
  36646. "and r12, r12, r3\n\t"
  36647. "and lr, lr, r3\n\t"
  36648. "subs r12, r12, lr\n\t"
  36649. "it hi\n\t"
  36650. "movhi r2, r6\n\t"
  36651. "it lo\n\t"
  36652. "movlo r2, r3\n\t"
  36653. "it ne\n\t"
  36654. "movne r3, r5\n\t"
  36655. "ldr r12, [%[a], #24]\n\t"
  36656. "ldr lr, [%[b], #24]\n\t"
  36657. "and r12, r12, r3\n\t"
  36658. "and lr, lr, r3\n\t"
  36659. "subs r12, r12, lr\n\t"
  36660. "it hi\n\t"
  36661. "movhi r2, r6\n\t"
  36662. "it lo\n\t"
  36663. "movlo r2, r3\n\t"
  36664. "it ne\n\t"
  36665. "movne r3, r5\n\t"
  36666. "ldr r12, [%[a], #20]\n\t"
  36667. "ldr lr, [%[b], #20]\n\t"
  36668. "and r12, r12, r3\n\t"
  36669. "and lr, lr, r3\n\t"
  36670. "subs r12, r12, lr\n\t"
  36671. "it hi\n\t"
  36672. "movhi r2, r6\n\t"
  36673. "it lo\n\t"
  36674. "movlo r2, r3\n\t"
  36675. "it ne\n\t"
  36676. "movne r3, r5\n\t"
  36677. "ldr r12, [%[a], #16]\n\t"
  36678. "ldr lr, [%[b], #16]\n\t"
  36679. "and r12, r12, r3\n\t"
  36680. "and lr, lr, r3\n\t"
  36681. "subs r12, r12, lr\n\t"
  36682. "it hi\n\t"
  36683. "movhi r2, r6\n\t"
  36684. "it lo\n\t"
  36685. "movlo r2, r3\n\t"
  36686. "it ne\n\t"
  36687. "movne r3, r5\n\t"
  36688. "ldr r12, [%[a], #12]\n\t"
  36689. "ldr lr, [%[b], #12]\n\t"
  36690. "and r12, r12, r3\n\t"
  36691. "and lr, lr, r3\n\t"
  36692. "subs r12, r12, lr\n\t"
  36693. "it hi\n\t"
  36694. "movhi r2, r6\n\t"
  36695. "it lo\n\t"
  36696. "movlo r2, r3\n\t"
  36697. "it ne\n\t"
  36698. "movne r3, r5\n\t"
  36699. "ldr r12, [%[a], #8]\n\t"
  36700. "ldr lr, [%[b], #8]\n\t"
  36701. "and r12, r12, r3\n\t"
  36702. "and lr, lr, r3\n\t"
  36703. "subs r12, r12, lr\n\t"
  36704. "it hi\n\t"
  36705. "movhi r2, r6\n\t"
  36706. "it lo\n\t"
  36707. "movlo r2, r3\n\t"
  36708. "it ne\n\t"
  36709. "movne r3, r5\n\t"
  36710. "ldr r12, [%[a], #4]\n\t"
  36711. "ldr lr, [%[b], #4]\n\t"
  36712. "and r12, r12, r3\n\t"
  36713. "and lr, lr, r3\n\t"
  36714. "subs r12, r12, lr\n\t"
  36715. "it hi\n\t"
  36716. "movhi r2, r6\n\t"
  36717. "it lo\n\t"
  36718. "movlo r2, r3\n\t"
  36719. "it ne\n\t"
  36720. "movne r3, r5\n\t"
  36721. "ldr r12, [%[a]]\n\t"
  36722. "ldr lr, [%[b]]\n\t"
  36723. "and r12, r12, r3\n\t"
  36724. "and lr, lr, r3\n\t"
  36725. "subs r12, r12, lr\n\t"
  36726. "it hi\n\t"
  36727. "movhi r2, r6\n\t"
  36728. "it lo\n\t"
  36729. "movlo r2, r3\n\t"
  36730. "it ne\n\t"
  36731. "movne r3, r5\n\t"
  36732. "eor r2, r2, r3\n\t"
  36733. #endif /*WOLFSSL_SP_SMALL */
  36734. "mov %[a], r2\n\t"
  36735. : [a] "+r" (a), [b] "+r" (b)
  36736. :
  36737. : "memory", "r2", "r3", "r12", "lr", "r4", "r5", "r6", "cc"
  36738. );
  36739. return (uint32_t)(size_t)a;
  36740. }
  36741. /* Divide d in a and put remainder into r (m*d + r = a)
  36742. * m is not calculated as it is not needed at this time.
  36743. *
  36744. * a Number to be divided.
  36745. * d Number to divide with.
  36746. * m Multiplier result.
  36747. * r Remainder from the division.
  36748. * returns MP_OKAY indicating success.
  36749. */
  36750. static WC_INLINE int sp_3072_div_48(const sp_digit* a, const sp_digit* d,
  36751. sp_digit* m, sp_digit* r)
  36752. {
  36753. sp_digit t1[96], t2[49];
  36754. sp_digit div, r1;
  36755. int i;
  36756. (void)m;
  36757. div = d[47];
  36758. XMEMCPY(t1, a, sizeof(*t1) * 2 * 48);
  36759. r1 = sp_3072_cmp_48(&t1[48], d) >= 0;
  36760. sp_3072_cond_sub_48(&t1[48], &t1[48], d, (sp_digit)0 - r1);
  36761. for (i = 47; i >= 0; i--) {
  36762. volatile sp_digit mask = (sp_digit)0 - (t1[48 + i] == div);
  36763. sp_digit hi = t1[48 + i] + mask;
  36764. r1 = div_3072_word_48(hi, t1[48 + i - 1], div);
  36765. r1 |= mask;
  36766. sp_3072_mul_d_48(t2, d, r1);
  36767. t1[48 + i] += sp_3072_sub_in_place_48(&t1[i], t2);
  36768. t1[48 + i] -= t2[48];
  36769. sp_3072_mask_48(t2, d, t1[48 + i]);
  36770. t1[48 + i] += sp_3072_add_48(&t1[i], &t1[i], t2);
  36771. sp_3072_mask_48(t2, d, t1[48 + i]);
  36772. t1[48 + i] += sp_3072_add_48(&t1[i], &t1[i], t2);
  36773. }
  36774. r1 = sp_3072_cmp_48(t1, d) >= 0;
  36775. sp_3072_cond_sub_48(r, t1, d, (sp_digit)0 - r1);
  36776. return MP_OKAY;
  36777. }
  36778. /* Reduce a modulo m into r. (r = a mod m)
  36779. *
  36780. * r A single precision number that is the reduced result.
  36781. * a A single precision number that is to be reduced.
  36782. * m A single precision number that is the modulus to reduce with.
  36783. * returns MP_OKAY indicating success.
  36784. */
  36785. static WC_INLINE int sp_3072_mod_48(sp_digit* r, const sp_digit* a,
  36786. const sp_digit* m)
  36787. {
  36788. return sp_3072_div_48(a, m, NULL, r);
  36789. }
  36790. #ifdef WOLFSSL_SP_SMALL
  36791. /* Modular exponentiate a to the e mod m. (r = a^e mod m)
  36792. *
  36793. * r A single precision number that is the result of the operation.
  36794. * a A single precision number being exponentiated.
  36795. * e A single precision number that is the exponent.
  36796. * bits The number of bits in the exponent.
  36797. * m A single precision number that is the modulus.
  36798. * returns 0 on success.
  36799. * returns MEMORY_E on dynamic memory allocation failure.
  36800. * returns MP_VAL when base is even or exponent is 0.
  36801. */
  36802. static int sp_3072_mod_exp_48(sp_digit* r, const sp_digit* a, const sp_digit* e,
  36803. int bits, const sp_digit* m, int reduceA)
  36804. {
  36805. #ifdef WOLFSSL_SP_SMALL_STACK
  36806. sp_digit* td = NULL;
  36807. #else
  36808. sp_digit td[16 * 96];
  36809. #endif
  36810. sp_digit* t[16];
  36811. sp_digit* norm = NULL;
  36812. sp_digit mp = 1;
  36813. sp_digit n;
  36814. sp_digit mask;
  36815. int i;
  36816. int c;
  36817. byte y;
  36818. int err = MP_OKAY;
  36819. if (bits == 0) {
  36820. err = MP_VAL;
  36821. }
  36822. #ifdef WOLFSSL_SP_SMALL_STACK
  36823. if (err == MP_OKAY) {
  36824. td = (sp_digit*)XMALLOC(sizeof(sp_digit) * (16 * 96), NULL,
  36825. DYNAMIC_TYPE_TMP_BUFFER);
  36826. if (td == NULL)
  36827. err = MEMORY_E;
  36828. }
  36829. #endif
  36830. if (err == MP_OKAY) {
  36831. norm = td;
  36832. for (i=0; i<16; i++) {
  36833. t[i] = td + i * 96;
  36834. }
  36835. sp_3072_mont_setup(m, &mp);
  36836. sp_3072_mont_norm_48(norm, m);
  36837. XMEMSET(t[1], 0, sizeof(sp_digit) * 48U);
  36838. if (reduceA != 0) {
  36839. err = sp_3072_mod_48(t[1] + 48, a, m);
  36840. if (err == MP_OKAY) {
  36841. err = sp_3072_mod_48(t[1], t[1], m);
  36842. }
  36843. }
  36844. else {
  36845. XMEMCPY(t[1] + 48, a, sizeof(sp_digit) * 48);
  36846. err = sp_3072_mod_48(t[1], t[1], m);
  36847. }
  36848. }
  36849. if (err == MP_OKAY) {
  36850. sp_3072_mont_sqr_48(t[ 2], t[ 1], m, mp);
  36851. sp_3072_mont_mul_48(t[ 3], t[ 2], t[ 1], m, mp);
  36852. sp_3072_mont_sqr_48(t[ 4], t[ 2], m, mp);
  36853. sp_3072_mont_mul_48(t[ 5], t[ 3], t[ 2], m, mp);
  36854. sp_3072_mont_sqr_48(t[ 6], t[ 3], m, mp);
  36855. sp_3072_mont_mul_48(t[ 7], t[ 4], t[ 3], m, mp);
  36856. sp_3072_mont_sqr_48(t[ 8], t[ 4], m, mp);
  36857. sp_3072_mont_mul_48(t[ 9], t[ 5], t[ 4], m, mp);
  36858. sp_3072_mont_sqr_48(t[10], t[ 5], m, mp);
  36859. sp_3072_mont_mul_48(t[11], t[ 6], t[ 5], m, mp);
  36860. sp_3072_mont_sqr_48(t[12], t[ 6], m, mp);
  36861. sp_3072_mont_mul_48(t[13], t[ 7], t[ 6], m, mp);
  36862. sp_3072_mont_sqr_48(t[14], t[ 7], m, mp);
  36863. sp_3072_mont_mul_48(t[15], t[ 8], t[ 7], m, mp);
  36864. i = (bits - 1) / 32;
  36865. n = e[i--];
  36866. c = bits & 31;
  36867. if (c == 0) {
  36868. c = 32;
  36869. }
  36870. c -= bits % 4;
  36871. if (c == 32) {
  36872. c = 28;
  36873. }
  36874. if (c < 0) {
  36875. /* Number of bits in top word is less than number needed. */
  36876. c = -c;
  36877. y = (byte)(n << c);
  36878. n = e[i--];
  36879. y |= (byte)(n >> (64 - c));
  36880. n <<= c;
  36881. c = 64 - c;
  36882. }
  36883. else if (c == 0) {
  36884. /* All bits in top word used. */
  36885. y = (byte)n;
  36886. }
  36887. else {
  36888. y = (byte)(n >> c);
  36889. n <<= 32 - c;
  36890. }
  36891. XMEMCPY(r, t[y], sizeof(sp_digit) * 48);
  36892. for (; i>=0 || c>=4; ) {
  36893. if (c == 0) {
  36894. n = e[i--];
  36895. y = (byte)(n >> 28);
  36896. n <<= 4;
  36897. c = 28;
  36898. }
  36899. else if (c < 4) {
  36900. y = (byte)(n >> 28);
  36901. n = e[i--];
  36902. c = 4 - c;
  36903. y |= (byte)(n >> (32 - c));
  36904. n <<= c;
  36905. c = 32 - c;
  36906. }
  36907. else {
  36908. y = (byte)((n >> 28) & 0xf);
  36909. n <<= 4;
  36910. c -= 4;
  36911. }
  36912. sp_3072_mont_sqr_48(r, r, m, mp);
  36913. sp_3072_mont_sqr_48(r, r, m, mp);
  36914. sp_3072_mont_sqr_48(r, r, m, mp);
  36915. sp_3072_mont_sqr_48(r, r, m, mp);
  36916. sp_3072_mont_mul_48(r, r, t[y], m, mp);
  36917. }
  36918. XMEMSET(&r[48], 0, sizeof(sp_digit) * 48U);
  36919. sp_3072_mont_reduce_48(r, m, mp);
  36920. mask = 0 - (sp_3072_cmp_48(r, m) >= 0);
  36921. sp_3072_cond_sub_48(r, r, m, mask);
  36922. }
  36923. #ifdef WOLFSSL_SP_SMALL_STACK
  36924. if (td != NULL)
  36925. XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  36926. #endif
  36927. return err;
  36928. }
  36929. #else
  36930. /* Modular exponentiate a to the e mod m. (r = a^e mod m)
  36931. *
  36932. * r A single precision number that is the result of the operation.
  36933. * a A single precision number being exponentiated.
  36934. * e A single precision number that is the exponent.
  36935. * bits The number of bits in the exponent.
  36936. * m A single precision number that is the modulus.
  36937. * returns 0 on success.
  36938. * returns MEMORY_E on dynamic memory allocation failure.
  36939. * returns MP_VAL when base is even or exponent is 0.
  36940. */
  36941. static int sp_3072_mod_exp_48(sp_digit* r, const sp_digit* a, const sp_digit* e,
  36942. int bits, const sp_digit* m, int reduceA)
  36943. {
  36944. #ifdef WOLFSSL_SP_SMALL_STACK
  36945. sp_digit* td = NULL;
  36946. #else
  36947. sp_digit td[32 * 96];
  36948. #endif
  36949. sp_digit* t[32];
  36950. sp_digit* norm = NULL;
  36951. sp_digit mp = 1;
  36952. sp_digit n;
  36953. sp_digit mask;
  36954. int i;
  36955. int c;
  36956. byte y;
  36957. int err = MP_OKAY;
  36958. if (bits == 0) {
  36959. err = MP_VAL;
  36960. }
  36961. #ifdef WOLFSSL_SP_SMALL_STACK
  36962. if (err == MP_OKAY) {
  36963. td = (sp_digit*)XMALLOC(sizeof(sp_digit) * (32 * 96), NULL,
  36964. DYNAMIC_TYPE_TMP_BUFFER);
  36965. if (td == NULL)
  36966. err = MEMORY_E;
  36967. }
  36968. #endif
  36969. if (err == MP_OKAY) {
  36970. norm = td;
  36971. for (i=0; i<32; i++) {
  36972. t[i] = td + i * 96;
  36973. }
  36974. sp_3072_mont_setup(m, &mp);
  36975. sp_3072_mont_norm_48(norm, m);
  36976. XMEMSET(t[1], 0, sizeof(sp_digit) * 48U);
  36977. if (reduceA != 0) {
  36978. err = sp_3072_mod_48(t[1] + 48, a, m);
  36979. if (err == MP_OKAY) {
  36980. err = sp_3072_mod_48(t[1], t[1], m);
  36981. }
  36982. }
  36983. else {
  36984. XMEMCPY(t[1] + 48, a, sizeof(sp_digit) * 48);
  36985. err = sp_3072_mod_48(t[1], t[1], m);
  36986. }
  36987. }
  36988. if (err == MP_OKAY) {
  36989. sp_3072_mont_sqr_48(t[ 2], t[ 1], m, mp);
  36990. sp_3072_mont_mul_48(t[ 3], t[ 2], t[ 1], m, mp);
  36991. sp_3072_mont_sqr_48(t[ 4], t[ 2], m, mp);
  36992. sp_3072_mont_mul_48(t[ 5], t[ 3], t[ 2], m, mp);
  36993. sp_3072_mont_sqr_48(t[ 6], t[ 3], m, mp);
  36994. sp_3072_mont_mul_48(t[ 7], t[ 4], t[ 3], m, mp);
  36995. sp_3072_mont_sqr_48(t[ 8], t[ 4], m, mp);
  36996. sp_3072_mont_mul_48(t[ 9], t[ 5], t[ 4], m, mp);
  36997. sp_3072_mont_sqr_48(t[10], t[ 5], m, mp);
  36998. sp_3072_mont_mul_48(t[11], t[ 6], t[ 5], m, mp);
  36999. sp_3072_mont_sqr_48(t[12], t[ 6], m, mp);
  37000. sp_3072_mont_mul_48(t[13], t[ 7], t[ 6], m, mp);
  37001. sp_3072_mont_sqr_48(t[14], t[ 7], m, mp);
  37002. sp_3072_mont_mul_48(t[15], t[ 8], t[ 7], m, mp);
  37003. sp_3072_mont_sqr_48(t[16], t[ 8], m, mp);
  37004. sp_3072_mont_mul_48(t[17], t[ 9], t[ 8], m, mp);
  37005. sp_3072_mont_sqr_48(t[18], t[ 9], m, mp);
  37006. sp_3072_mont_mul_48(t[19], t[10], t[ 9], m, mp);
  37007. sp_3072_mont_sqr_48(t[20], t[10], m, mp);
  37008. sp_3072_mont_mul_48(t[21], t[11], t[10], m, mp);
  37009. sp_3072_mont_sqr_48(t[22], t[11], m, mp);
  37010. sp_3072_mont_mul_48(t[23], t[12], t[11], m, mp);
  37011. sp_3072_mont_sqr_48(t[24], t[12], m, mp);
  37012. sp_3072_mont_mul_48(t[25], t[13], t[12], m, mp);
  37013. sp_3072_mont_sqr_48(t[26], t[13], m, mp);
  37014. sp_3072_mont_mul_48(t[27], t[14], t[13], m, mp);
  37015. sp_3072_mont_sqr_48(t[28], t[14], m, mp);
  37016. sp_3072_mont_mul_48(t[29], t[15], t[14], m, mp);
  37017. sp_3072_mont_sqr_48(t[30], t[15], m, mp);
  37018. sp_3072_mont_mul_48(t[31], t[16], t[15], m, mp);
  37019. i = (bits - 1) / 32;
  37020. n = e[i--];
  37021. c = bits & 31;
  37022. if (c == 0) {
  37023. c = 32;
  37024. }
  37025. c -= bits % 5;
  37026. if (c == 32) {
  37027. c = 27;
  37028. }
  37029. if (c < 0) {
  37030. /* Number of bits in top word is less than number needed. */
  37031. c = -c;
  37032. y = (byte)(n << c);
  37033. n = e[i--];
  37034. y |= (byte)(n >> (64 - c));
  37035. n <<= c;
  37036. c = 64 - c;
  37037. }
  37038. else if (c == 0) {
  37039. /* All bits in top word used. */
  37040. y = (byte)n;
  37041. }
  37042. else {
  37043. y = (byte)(n >> c);
  37044. n <<= 32 - c;
  37045. }
  37046. XMEMCPY(r, t[y], sizeof(sp_digit) * 48);
  37047. for (; i>=0 || c>=5; ) {
  37048. if (c == 0) {
  37049. n = e[i--];
  37050. y = (byte)(n >> 27);
  37051. n <<= 5;
  37052. c = 27;
  37053. }
  37054. else if (c < 5) {
  37055. y = (byte)(n >> 27);
  37056. n = e[i--];
  37057. c = 5 - c;
  37058. y |= (byte)(n >> (32 - c));
  37059. n <<= c;
  37060. c = 32 - c;
  37061. }
  37062. else {
  37063. y = (byte)((n >> 27) & 0x1f);
  37064. n <<= 5;
  37065. c -= 5;
  37066. }
  37067. sp_3072_mont_sqr_48(r, r, m, mp);
  37068. sp_3072_mont_sqr_48(r, r, m, mp);
  37069. sp_3072_mont_sqr_48(r, r, m, mp);
  37070. sp_3072_mont_sqr_48(r, r, m, mp);
  37071. sp_3072_mont_sqr_48(r, r, m, mp);
  37072. sp_3072_mont_mul_48(r, r, t[y], m, mp);
  37073. }
  37074. XMEMSET(&r[48], 0, sizeof(sp_digit) * 48U);
  37075. sp_3072_mont_reduce_48(r, m, mp);
  37076. mask = 0 - (sp_3072_cmp_48(r, m) >= 0);
  37077. sp_3072_cond_sub_48(r, r, m, mask);
  37078. }
  37079. #ifdef WOLFSSL_SP_SMALL_STACK
  37080. if (td != NULL)
  37081. XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  37082. #endif
  37083. return err;
  37084. }
  37085. #endif /* WOLFSSL_SP_SMALL */
  37086. #endif /* (WOLFSSL_HAVE_SP_RSA & !WOLFSSL_RSA_PUBLIC_ONLY) | WOLFSSL_HAVE_SP_DH */
  37087. #if (defined(WOLFSSL_HAVE_SP_RSA) && !defined(WOLFSSL_RSA_PUBLIC_ONLY)) || defined(WOLFSSL_HAVE_SP_DH)
  37088. /* r = 2^n mod m where n is the number of bits to reduce by.
  37089. * Given m must be 3072 bits, just need to subtract.
  37090. *
  37091. * r A single precision number.
  37092. * m A single precision number.
  37093. */
  37094. static void sp_3072_mont_norm_96(sp_digit* r, const sp_digit* m)
  37095. {
  37096. XMEMSET(r, 0, sizeof(sp_digit) * 96);
  37097. /* r = 2^n mod m */
  37098. sp_3072_sub_in_place_96(r, m);
  37099. }
  37100. #endif /* (WOLFSSL_HAVE_SP_RSA & !WOLFSSL_RSA_PUBLIC_ONLY) | WOLFSSL_HAVE_SP_DH */
  37101. #ifdef WOLFSSL_SP_SMALL
  37102. /* Conditionally subtract b from a using the mask m.
  37103. * m is -1 to subtract and 0 when not copying.
  37104. *
  37105. * r A single precision number representing condition subtract result.
  37106. * a A single precision number to subtract from.
  37107. * b A single precision number to subtract.
  37108. * m Mask value to apply.
  37109. */
  37110. 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)
  37111. {
  37112. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  37113. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  37114. register const sp_digit* b asm ("r2") = (const sp_digit*)b_p;
  37115. register sp_digit m asm ("r3") = (sp_digit)m_p;
  37116. __asm__ __volatile__ (
  37117. "mov r6, #0\n\t"
  37118. "mov r12, #0\n\t"
  37119. "mov lr, #0\n\t"
  37120. "\n"
  37121. "L_sp_3072_cond_sub_96_words_%=: \n\t"
  37122. "subs r12, r6, r12\n\t"
  37123. "ldr r4, [%[a], lr]\n\t"
  37124. "ldr r5, [%[b], lr]\n\t"
  37125. "and r5, r5, %[m]\n\t"
  37126. "sbcs r4, r4, r5\n\t"
  37127. "sbc r12, r6, r6\n\t"
  37128. "str r4, [%[r], lr]\n\t"
  37129. "add lr, lr, #4\n\t"
  37130. "cmp lr, #0x180\n\t"
  37131. "blt L_sp_3072_cond_sub_96_words_%=\n\t"
  37132. "mov %[r], r12\n\t"
  37133. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b), [m] "+r" (m)
  37134. :
  37135. : "memory", "r12", "lr", "r4", "r5", "r6", "cc"
  37136. );
  37137. return (uint32_t)(size_t)r;
  37138. }
  37139. #else
  37140. /* Conditionally subtract b from a using the mask m.
  37141. * m is -1 to subtract and 0 when not copying.
  37142. *
  37143. * r A single precision number representing condition subtract result.
  37144. * a A single precision number to subtract from.
  37145. * b A single precision number to subtract.
  37146. * m Mask value to apply.
  37147. */
  37148. 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)
  37149. {
  37150. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  37151. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  37152. register const sp_digit* b asm ("r2") = (const sp_digit*)b_p;
  37153. register sp_digit m asm ("r3") = (sp_digit)m_p;
  37154. __asm__ __volatile__ (
  37155. "mov lr, #0\n\t"
  37156. "ldm %[a]!, {r4, r5}\n\t"
  37157. "ldm %[b]!, {r6, r7}\n\t"
  37158. "and r6, r6, %[m]\n\t"
  37159. "and r7, r7, %[m]\n\t"
  37160. "subs r4, r4, r6\n\t"
  37161. "sbcs r5, r5, r7\n\t"
  37162. "stm %[r]!, {r4, r5}\n\t"
  37163. "ldm %[a]!, {r4, r5}\n\t"
  37164. "ldm %[b]!, {r6, r7}\n\t"
  37165. "and r6, r6, %[m]\n\t"
  37166. "and r7, r7, %[m]\n\t"
  37167. "sbcs r4, r4, r6\n\t"
  37168. "sbcs r5, r5, r7\n\t"
  37169. "stm %[r]!, {r4, r5}\n\t"
  37170. "ldm %[a]!, {r4, r5}\n\t"
  37171. "ldm %[b]!, {r6, r7}\n\t"
  37172. "and r6, r6, %[m]\n\t"
  37173. "and r7, r7, %[m]\n\t"
  37174. "sbcs r4, r4, r6\n\t"
  37175. "sbcs r5, r5, r7\n\t"
  37176. "stm %[r]!, {r4, r5}\n\t"
  37177. "ldm %[a]!, {r4, r5}\n\t"
  37178. "ldm %[b]!, {r6, r7}\n\t"
  37179. "and r6, r6, %[m]\n\t"
  37180. "and r7, r7, %[m]\n\t"
  37181. "sbcs r4, r4, r6\n\t"
  37182. "sbcs r5, r5, r7\n\t"
  37183. "stm %[r]!, {r4, r5}\n\t"
  37184. "ldm %[a]!, {r4, r5}\n\t"
  37185. "ldm %[b]!, {r6, r7}\n\t"
  37186. "and r6, r6, %[m]\n\t"
  37187. "and r7, r7, %[m]\n\t"
  37188. "sbcs r4, r4, r6\n\t"
  37189. "sbcs r5, r5, r7\n\t"
  37190. "stm %[r]!, {r4, r5}\n\t"
  37191. "ldm %[a]!, {r4, r5}\n\t"
  37192. "ldm %[b]!, {r6, r7}\n\t"
  37193. "and r6, r6, %[m]\n\t"
  37194. "and r7, r7, %[m]\n\t"
  37195. "sbcs r4, r4, r6\n\t"
  37196. "sbcs r5, r5, r7\n\t"
  37197. "stm %[r]!, {r4, r5}\n\t"
  37198. "ldm %[a]!, {r4, r5}\n\t"
  37199. "ldm %[b]!, {r6, r7}\n\t"
  37200. "and r6, r6, %[m]\n\t"
  37201. "and r7, r7, %[m]\n\t"
  37202. "sbcs r4, r4, r6\n\t"
  37203. "sbcs r5, r5, r7\n\t"
  37204. "stm %[r]!, {r4, r5}\n\t"
  37205. "ldm %[a]!, {r4, r5}\n\t"
  37206. "ldm %[b]!, {r6, r7}\n\t"
  37207. "and r6, r6, %[m]\n\t"
  37208. "and r7, r7, %[m]\n\t"
  37209. "sbcs r4, r4, r6\n\t"
  37210. "sbcs r5, r5, r7\n\t"
  37211. "stm %[r]!, {r4, r5}\n\t"
  37212. "ldm %[a]!, {r4, r5}\n\t"
  37213. "ldm %[b]!, {r6, r7}\n\t"
  37214. "and r6, r6, %[m]\n\t"
  37215. "and r7, r7, %[m]\n\t"
  37216. "sbcs r4, r4, r6\n\t"
  37217. "sbcs r5, r5, r7\n\t"
  37218. "stm %[r]!, {r4, r5}\n\t"
  37219. "ldm %[a]!, {r4, r5}\n\t"
  37220. "ldm %[b]!, {r6, r7}\n\t"
  37221. "and r6, r6, %[m]\n\t"
  37222. "and r7, r7, %[m]\n\t"
  37223. "sbcs r4, r4, r6\n\t"
  37224. "sbcs r5, r5, r7\n\t"
  37225. "stm %[r]!, {r4, r5}\n\t"
  37226. "ldm %[a]!, {r4, r5}\n\t"
  37227. "ldm %[b]!, {r6, r7}\n\t"
  37228. "and r6, r6, %[m]\n\t"
  37229. "and r7, r7, %[m]\n\t"
  37230. "sbcs r4, r4, r6\n\t"
  37231. "sbcs r5, r5, r7\n\t"
  37232. "stm %[r]!, {r4, r5}\n\t"
  37233. "ldm %[a]!, {r4, r5}\n\t"
  37234. "ldm %[b]!, {r6, r7}\n\t"
  37235. "and r6, r6, %[m]\n\t"
  37236. "and r7, r7, %[m]\n\t"
  37237. "sbcs r4, r4, r6\n\t"
  37238. "sbcs r5, r5, r7\n\t"
  37239. "stm %[r]!, {r4, r5}\n\t"
  37240. "ldm %[a]!, {r4, r5}\n\t"
  37241. "ldm %[b]!, {r6, r7}\n\t"
  37242. "and r6, r6, %[m]\n\t"
  37243. "and r7, r7, %[m]\n\t"
  37244. "sbcs r4, r4, r6\n\t"
  37245. "sbcs r5, r5, r7\n\t"
  37246. "stm %[r]!, {r4, r5}\n\t"
  37247. "ldm %[a]!, {r4, r5}\n\t"
  37248. "ldm %[b]!, {r6, r7}\n\t"
  37249. "and r6, r6, %[m]\n\t"
  37250. "and r7, r7, %[m]\n\t"
  37251. "sbcs r4, r4, r6\n\t"
  37252. "sbcs r5, r5, r7\n\t"
  37253. "stm %[r]!, {r4, r5}\n\t"
  37254. "ldm %[a]!, {r4, r5}\n\t"
  37255. "ldm %[b]!, {r6, r7}\n\t"
  37256. "and r6, r6, %[m]\n\t"
  37257. "and r7, r7, %[m]\n\t"
  37258. "sbcs r4, r4, r6\n\t"
  37259. "sbcs r5, r5, r7\n\t"
  37260. "stm %[r]!, {r4, r5}\n\t"
  37261. "ldm %[a]!, {r4, r5}\n\t"
  37262. "ldm %[b]!, {r6, r7}\n\t"
  37263. "and r6, r6, %[m]\n\t"
  37264. "and r7, r7, %[m]\n\t"
  37265. "sbcs r4, r4, r6\n\t"
  37266. "sbcs r5, r5, r7\n\t"
  37267. "stm %[r]!, {r4, r5}\n\t"
  37268. "ldm %[a]!, {r4, r5}\n\t"
  37269. "ldm %[b]!, {r6, r7}\n\t"
  37270. "and r6, r6, %[m]\n\t"
  37271. "and r7, r7, %[m]\n\t"
  37272. "sbcs r4, r4, r6\n\t"
  37273. "sbcs r5, r5, r7\n\t"
  37274. "stm %[r]!, {r4, r5}\n\t"
  37275. "ldm %[a]!, {r4, r5}\n\t"
  37276. "ldm %[b]!, {r6, r7}\n\t"
  37277. "and r6, r6, %[m]\n\t"
  37278. "and r7, r7, %[m]\n\t"
  37279. "sbcs r4, r4, r6\n\t"
  37280. "sbcs r5, r5, r7\n\t"
  37281. "stm %[r]!, {r4, r5}\n\t"
  37282. "ldm %[a]!, {r4, r5}\n\t"
  37283. "ldm %[b]!, {r6, r7}\n\t"
  37284. "and r6, r6, %[m]\n\t"
  37285. "and r7, r7, %[m]\n\t"
  37286. "sbcs r4, r4, r6\n\t"
  37287. "sbcs r5, r5, r7\n\t"
  37288. "stm %[r]!, {r4, r5}\n\t"
  37289. "ldm %[a]!, {r4, r5}\n\t"
  37290. "ldm %[b]!, {r6, r7}\n\t"
  37291. "and r6, r6, %[m]\n\t"
  37292. "and r7, r7, %[m]\n\t"
  37293. "sbcs r4, r4, r6\n\t"
  37294. "sbcs r5, r5, r7\n\t"
  37295. "stm %[r]!, {r4, r5}\n\t"
  37296. "ldm %[a]!, {r4, r5}\n\t"
  37297. "ldm %[b]!, {r6, r7}\n\t"
  37298. "and r6, r6, %[m]\n\t"
  37299. "and r7, r7, %[m]\n\t"
  37300. "sbcs r4, r4, r6\n\t"
  37301. "sbcs r5, r5, r7\n\t"
  37302. "stm %[r]!, {r4, r5}\n\t"
  37303. "ldm %[a]!, {r4, r5}\n\t"
  37304. "ldm %[b]!, {r6, r7}\n\t"
  37305. "and r6, r6, %[m]\n\t"
  37306. "and r7, r7, %[m]\n\t"
  37307. "sbcs r4, r4, r6\n\t"
  37308. "sbcs r5, r5, r7\n\t"
  37309. "stm %[r]!, {r4, r5}\n\t"
  37310. "ldm %[a]!, {r4, r5}\n\t"
  37311. "ldm %[b]!, {r6, r7}\n\t"
  37312. "and r6, r6, %[m]\n\t"
  37313. "and r7, r7, %[m]\n\t"
  37314. "sbcs r4, r4, r6\n\t"
  37315. "sbcs r5, r5, r7\n\t"
  37316. "stm %[r]!, {r4, r5}\n\t"
  37317. "ldm %[a]!, {r4, r5}\n\t"
  37318. "ldm %[b]!, {r6, r7}\n\t"
  37319. "and r6, r6, %[m]\n\t"
  37320. "and r7, r7, %[m]\n\t"
  37321. "sbcs r4, r4, r6\n\t"
  37322. "sbcs r5, r5, r7\n\t"
  37323. "stm %[r]!, {r4, r5}\n\t"
  37324. "ldm %[a]!, {r4, r5}\n\t"
  37325. "ldm %[b]!, {r6, r7}\n\t"
  37326. "and r6, r6, %[m]\n\t"
  37327. "and r7, r7, %[m]\n\t"
  37328. "sbcs r4, r4, r6\n\t"
  37329. "sbcs r5, r5, r7\n\t"
  37330. "stm %[r]!, {r4, r5}\n\t"
  37331. "ldm %[a]!, {r4, r5}\n\t"
  37332. "ldm %[b]!, {r6, r7}\n\t"
  37333. "and r6, r6, %[m]\n\t"
  37334. "and r7, r7, %[m]\n\t"
  37335. "sbcs r4, r4, r6\n\t"
  37336. "sbcs r5, r5, r7\n\t"
  37337. "stm %[r]!, {r4, r5}\n\t"
  37338. "ldm %[a]!, {r4, r5}\n\t"
  37339. "ldm %[b]!, {r6, r7}\n\t"
  37340. "and r6, r6, %[m]\n\t"
  37341. "and r7, r7, %[m]\n\t"
  37342. "sbcs r4, r4, r6\n\t"
  37343. "sbcs r5, r5, r7\n\t"
  37344. "stm %[r]!, {r4, r5}\n\t"
  37345. "ldm %[a]!, {r4, r5}\n\t"
  37346. "ldm %[b]!, {r6, r7}\n\t"
  37347. "and r6, r6, %[m]\n\t"
  37348. "and r7, r7, %[m]\n\t"
  37349. "sbcs r4, r4, r6\n\t"
  37350. "sbcs r5, r5, r7\n\t"
  37351. "stm %[r]!, {r4, r5}\n\t"
  37352. "ldm %[a]!, {r4, r5}\n\t"
  37353. "ldm %[b]!, {r6, r7}\n\t"
  37354. "and r6, r6, %[m]\n\t"
  37355. "and r7, r7, %[m]\n\t"
  37356. "sbcs r4, r4, r6\n\t"
  37357. "sbcs r5, r5, r7\n\t"
  37358. "stm %[r]!, {r4, r5}\n\t"
  37359. "ldm %[a]!, {r4, r5}\n\t"
  37360. "ldm %[b]!, {r6, r7}\n\t"
  37361. "and r6, r6, %[m]\n\t"
  37362. "and r7, r7, %[m]\n\t"
  37363. "sbcs r4, r4, r6\n\t"
  37364. "sbcs r5, r5, r7\n\t"
  37365. "stm %[r]!, {r4, r5}\n\t"
  37366. "ldm %[a]!, {r4, r5}\n\t"
  37367. "ldm %[b]!, {r6, r7}\n\t"
  37368. "and r6, r6, %[m]\n\t"
  37369. "and r7, r7, %[m]\n\t"
  37370. "sbcs r4, r4, r6\n\t"
  37371. "sbcs r5, r5, r7\n\t"
  37372. "stm %[r]!, {r4, r5}\n\t"
  37373. "ldm %[a]!, {r4, r5}\n\t"
  37374. "ldm %[b]!, {r6, r7}\n\t"
  37375. "and r6, r6, %[m]\n\t"
  37376. "and r7, r7, %[m]\n\t"
  37377. "sbcs r4, r4, r6\n\t"
  37378. "sbcs r5, r5, r7\n\t"
  37379. "stm %[r]!, {r4, r5}\n\t"
  37380. "ldm %[a]!, {r4, r5}\n\t"
  37381. "ldm %[b]!, {r6, r7}\n\t"
  37382. "and r6, r6, %[m]\n\t"
  37383. "and r7, r7, %[m]\n\t"
  37384. "sbcs r4, r4, r6\n\t"
  37385. "sbcs r5, r5, r7\n\t"
  37386. "stm %[r]!, {r4, r5}\n\t"
  37387. "ldm %[a]!, {r4, r5}\n\t"
  37388. "ldm %[b]!, {r6, r7}\n\t"
  37389. "and r6, r6, %[m]\n\t"
  37390. "and r7, r7, %[m]\n\t"
  37391. "sbcs r4, r4, r6\n\t"
  37392. "sbcs r5, r5, r7\n\t"
  37393. "stm %[r]!, {r4, r5}\n\t"
  37394. "ldm %[a]!, {r4, r5}\n\t"
  37395. "ldm %[b]!, {r6, r7}\n\t"
  37396. "and r6, r6, %[m]\n\t"
  37397. "and r7, r7, %[m]\n\t"
  37398. "sbcs r4, r4, r6\n\t"
  37399. "sbcs r5, r5, r7\n\t"
  37400. "stm %[r]!, {r4, r5}\n\t"
  37401. "ldm %[a]!, {r4, r5}\n\t"
  37402. "ldm %[b]!, {r6, r7}\n\t"
  37403. "and r6, r6, %[m]\n\t"
  37404. "and r7, r7, %[m]\n\t"
  37405. "sbcs r4, r4, r6\n\t"
  37406. "sbcs r5, r5, r7\n\t"
  37407. "stm %[r]!, {r4, r5}\n\t"
  37408. "ldm %[a]!, {r4, r5}\n\t"
  37409. "ldm %[b]!, {r6, r7}\n\t"
  37410. "and r6, r6, %[m]\n\t"
  37411. "and r7, r7, %[m]\n\t"
  37412. "sbcs r4, r4, r6\n\t"
  37413. "sbcs r5, r5, r7\n\t"
  37414. "stm %[r]!, {r4, r5}\n\t"
  37415. "ldm %[a]!, {r4, r5}\n\t"
  37416. "ldm %[b]!, {r6, r7}\n\t"
  37417. "and r6, r6, %[m]\n\t"
  37418. "and r7, r7, %[m]\n\t"
  37419. "sbcs r4, r4, r6\n\t"
  37420. "sbcs r5, r5, r7\n\t"
  37421. "stm %[r]!, {r4, r5}\n\t"
  37422. "ldm %[a]!, {r4, r5}\n\t"
  37423. "ldm %[b]!, {r6, r7}\n\t"
  37424. "and r6, r6, %[m]\n\t"
  37425. "and r7, r7, %[m]\n\t"
  37426. "sbcs r4, r4, r6\n\t"
  37427. "sbcs r5, r5, r7\n\t"
  37428. "stm %[r]!, {r4, r5}\n\t"
  37429. "ldm %[a]!, {r4, r5}\n\t"
  37430. "ldm %[b]!, {r6, r7}\n\t"
  37431. "and r6, r6, %[m]\n\t"
  37432. "and r7, r7, %[m]\n\t"
  37433. "sbcs r4, r4, r6\n\t"
  37434. "sbcs r5, r5, r7\n\t"
  37435. "stm %[r]!, {r4, r5}\n\t"
  37436. "ldm %[a]!, {r4, r5}\n\t"
  37437. "ldm %[b]!, {r6, r7}\n\t"
  37438. "and r6, r6, %[m]\n\t"
  37439. "and r7, r7, %[m]\n\t"
  37440. "sbcs r4, r4, r6\n\t"
  37441. "sbcs r5, r5, r7\n\t"
  37442. "stm %[r]!, {r4, r5}\n\t"
  37443. "ldm %[a]!, {r4, r5}\n\t"
  37444. "ldm %[b]!, {r6, r7}\n\t"
  37445. "and r6, r6, %[m]\n\t"
  37446. "and r7, r7, %[m]\n\t"
  37447. "sbcs r4, r4, r6\n\t"
  37448. "sbcs r5, r5, r7\n\t"
  37449. "stm %[r]!, {r4, r5}\n\t"
  37450. "ldm %[a]!, {r4, r5}\n\t"
  37451. "ldm %[b]!, {r6, r7}\n\t"
  37452. "and r6, r6, %[m]\n\t"
  37453. "and r7, r7, %[m]\n\t"
  37454. "sbcs r4, r4, r6\n\t"
  37455. "sbcs r5, r5, r7\n\t"
  37456. "stm %[r]!, {r4, r5}\n\t"
  37457. "ldm %[a]!, {r4, r5}\n\t"
  37458. "ldm %[b]!, {r6, r7}\n\t"
  37459. "and r6, r6, %[m]\n\t"
  37460. "and r7, r7, %[m]\n\t"
  37461. "sbcs r4, r4, r6\n\t"
  37462. "sbcs r5, r5, r7\n\t"
  37463. "stm %[r]!, {r4, r5}\n\t"
  37464. "ldm %[a]!, {r4, r5}\n\t"
  37465. "ldm %[b]!, {r6, r7}\n\t"
  37466. "and r6, r6, %[m]\n\t"
  37467. "and r7, r7, %[m]\n\t"
  37468. "sbcs r4, r4, r6\n\t"
  37469. "sbcs r5, r5, r7\n\t"
  37470. "stm %[r]!, {r4, r5}\n\t"
  37471. "ldm %[a]!, {r4, r5}\n\t"
  37472. "ldm %[b]!, {r6, r7}\n\t"
  37473. "and r6, r6, %[m]\n\t"
  37474. "and r7, r7, %[m]\n\t"
  37475. "sbcs r4, r4, r6\n\t"
  37476. "sbcs r5, r5, r7\n\t"
  37477. "stm %[r]!, {r4, r5}\n\t"
  37478. "ldm %[a]!, {r4, r5}\n\t"
  37479. "ldm %[b]!, {r6, r7}\n\t"
  37480. "and r6, r6, %[m]\n\t"
  37481. "and r7, r7, %[m]\n\t"
  37482. "sbcs r4, r4, r6\n\t"
  37483. "sbcs r5, r5, r7\n\t"
  37484. "stm %[r]!, {r4, r5}\n\t"
  37485. "ldm %[a]!, {r4, r5}\n\t"
  37486. "ldm %[b]!, {r6, r7}\n\t"
  37487. "and r6, r6, %[m]\n\t"
  37488. "and r7, r7, %[m]\n\t"
  37489. "sbcs r4, r4, r6\n\t"
  37490. "sbcs r5, r5, r7\n\t"
  37491. "stm %[r]!, {r4, r5}\n\t"
  37492. "sbc %[r], lr, lr\n\t"
  37493. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b), [m] "+r" (m)
  37494. :
  37495. : "memory", "r12", "lr", "r4", "r5", "r6", "r7", "cc"
  37496. );
  37497. return (uint32_t)(size_t)r;
  37498. }
  37499. #endif /* WOLFSSL_SP_SMALL */
  37500. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  37501. /* Reduce the number back to 3072 bits using Montgomery reduction.
  37502. *
  37503. * a A single precision number to reduce in place.
  37504. * m The single precision number representing the modulus.
  37505. * mp The digit representing the negative inverse of m mod 2^n.
  37506. */
  37507. static SP_NOINLINE void sp_3072_mont_reduce_96(sp_digit* a_p, const sp_digit* m_p, sp_digit mp_p)
  37508. {
  37509. register sp_digit* a asm ("r0") = (sp_digit*)a_p;
  37510. register const sp_digit* m asm ("r1") = (const sp_digit*)m_p;
  37511. register sp_digit mp asm ("r2") = (sp_digit)mp_p;
  37512. __asm__ __volatile__ (
  37513. #if !(defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4))
  37514. "ldr r11, [%[m]]\n\t"
  37515. #endif
  37516. /* i = 0 */
  37517. "mov r9, #0\n\t"
  37518. "mov r3, #0\n\t"
  37519. "ldr r12, [%[a]]\n\t"
  37520. "ldr lr, [%[a], #4]\n\t"
  37521. "\n"
  37522. "L_sp_3072_mont_reduce_96_word_%=: \n\t"
  37523. /* mu = a[i] * mp */
  37524. "mul r8, %[mp], r12\n\t"
  37525. /* a[i+0] += m[0] * mu */
  37526. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  37527. "ldr r11, [%[m]]\n\t"
  37528. #endif
  37529. "lsr r7, r11, #16\n\t"
  37530. "lsr r6, r8, #16\n\t"
  37531. "mul r5, r6, r7\n\t"
  37532. "lsl r7, r11, #16\n\t"
  37533. "lsr r7, r7, #16\n\t"
  37534. "mul r6, r7, r6\n\t"
  37535. "lsr r7, r6, #16\n\t"
  37536. "lsl r6, r6, #16\n\t"
  37537. "adds r12, r12, r6\n\t"
  37538. "adc r5, r5, r7\n\t"
  37539. "lsl r6, r8, #16\n\t"
  37540. "lsl r7, r11, #16\n\t"
  37541. "lsr r6, r6, #16\n\t"
  37542. "lsr r7, r7, #16\n\t"
  37543. "mul r7, r6, r7\n\t"
  37544. "adds r12, r12, r7\n\t"
  37545. "adc r5, r5, #0\n\t"
  37546. "lsr r7, r11, #16\n\t"
  37547. "mul r6, r7, r6\n\t"
  37548. "lsr r7, r6, #16\n\t"
  37549. "lsl r6, r6, #16\n\t"
  37550. "adds r12, r12, r6\n\t"
  37551. "adc r5, r5, r7\n\t"
  37552. /* a[i+1] += m[1] * mu */
  37553. "ldr r7, [%[m], #4]\n\t"
  37554. "lsr r10, r7, #16\n\t"
  37555. "lsr r6, r8, #16\n\t"
  37556. "mul r4, r6, r10\n\t"
  37557. "lsl r10, r7, #16\n\t"
  37558. "lsr r10, r10, #16\n\t"
  37559. "mul r6, r10, r6\n\t"
  37560. "lsr r10, r6, #16\n\t"
  37561. "lsl r6, r6, #16\n\t"
  37562. "adds lr, lr, r6\n\t"
  37563. "adc r4, r4, r10\n\t"
  37564. "lsl r6, r8, #16\n\t"
  37565. "lsl r10, r7, #16\n\t"
  37566. "lsr r6, r6, #16\n\t"
  37567. "lsr r10, r10, #16\n\t"
  37568. "mul r10, r6, r10\n\t"
  37569. "adds lr, lr, r10\n\t"
  37570. "adc r4, r4, #0\n\t"
  37571. "lsr r10, r7, #16\n\t"
  37572. "mul r6, r10, r6\n\t"
  37573. "lsr r10, r6, #16\n\t"
  37574. "lsl r6, r6, #16\n\t"
  37575. "adds lr, lr, r6\n\t"
  37576. "adc r4, r4, r10\n\t"
  37577. "mov r12, lr\n\t"
  37578. "adds r12, r12, r5\n\t"
  37579. "adc r4, r4, #0\n\t"
  37580. /* a[i+2] += m[2] * mu */
  37581. "ldr r7, [%[m], #8]\n\t"
  37582. "ldr lr, [%[a], #8]\n\t"
  37583. "lsr r10, r7, #16\n\t"
  37584. "lsr r6, r8, #16\n\t"
  37585. "mul r5, r6, r10\n\t"
  37586. "lsl r10, r7, #16\n\t"
  37587. "lsr r10, r10, #16\n\t"
  37588. "mul r6, r10, r6\n\t"
  37589. "lsr r10, r6, #16\n\t"
  37590. "lsl r6, r6, #16\n\t"
  37591. "adds lr, lr, r6\n\t"
  37592. "adc r5, r5, r10\n\t"
  37593. "lsl r6, r8, #16\n\t"
  37594. "lsl r10, r7, #16\n\t"
  37595. "lsr r6, r6, #16\n\t"
  37596. "lsr r10, r10, #16\n\t"
  37597. "mul r10, r6, r10\n\t"
  37598. "adds lr, lr, r10\n\t"
  37599. "adc r5, r5, #0\n\t"
  37600. "lsr r10, r7, #16\n\t"
  37601. "mul r6, r10, r6\n\t"
  37602. "lsr r10, r6, #16\n\t"
  37603. "lsl r6, r6, #16\n\t"
  37604. "adds lr, lr, r6\n\t"
  37605. "adc r5, r5, r10\n\t"
  37606. "adds lr, lr, r4\n\t"
  37607. "adc r5, r5, #0\n\t"
  37608. /* a[i+3] += m[3] * mu */
  37609. "ldr r7, [%[m], #12]\n\t"
  37610. "ldr r10, [%[a], #12]\n\t"
  37611. "lsr r11, r7, #16\n\t"
  37612. "lsr r6, r8, #16\n\t"
  37613. "mul r4, r6, r11\n\t"
  37614. "lsl r11, r7, #16\n\t"
  37615. "lsr r11, r11, #16\n\t"
  37616. "mul r6, r11, r6\n\t"
  37617. "lsr r11, r6, #16\n\t"
  37618. "lsl r6, r6, #16\n\t"
  37619. "adds r10, r10, r6\n\t"
  37620. "adc r4, r4, r11\n\t"
  37621. "lsl r6, r8, #16\n\t"
  37622. "lsl r11, r7, #16\n\t"
  37623. "lsr r6, r6, #16\n\t"
  37624. "lsr r11, r11, #16\n\t"
  37625. "mul r11, r6, r11\n\t"
  37626. "adds r10, r10, r11\n\t"
  37627. "adc r4, r4, #0\n\t"
  37628. "lsr r11, r7, #16\n\t"
  37629. "mul r6, r11, r6\n\t"
  37630. "lsr r11, r6, #16\n\t"
  37631. "lsl r6, r6, #16\n\t"
  37632. "adds r10, r10, r6\n\t"
  37633. "adc r4, r4, r11\n\t"
  37634. "adds r10, r10, r5\n\t"
  37635. "str r10, [%[a], #12]\n\t"
  37636. "adc r4, r4, #0\n\t"
  37637. /* a[i+4] += m[4] * mu */
  37638. "ldr r7, [%[m], #16]\n\t"
  37639. "ldr r10, [%[a], #16]\n\t"
  37640. "lsr r11, r7, #16\n\t"
  37641. "lsr r6, r8, #16\n\t"
  37642. "mul r5, r6, r11\n\t"
  37643. "lsl r11, r7, #16\n\t"
  37644. "lsr r11, r11, #16\n\t"
  37645. "mul r6, r11, r6\n\t"
  37646. "lsr r11, r6, #16\n\t"
  37647. "lsl r6, r6, #16\n\t"
  37648. "adds r10, r10, r6\n\t"
  37649. "adc r5, r5, r11\n\t"
  37650. "lsl r6, r8, #16\n\t"
  37651. "lsl r11, r7, #16\n\t"
  37652. "lsr r6, r6, #16\n\t"
  37653. "lsr r11, r11, #16\n\t"
  37654. "mul r11, r6, r11\n\t"
  37655. "adds r10, r10, r11\n\t"
  37656. "adc r5, r5, #0\n\t"
  37657. "lsr r11, r7, #16\n\t"
  37658. "mul r6, r11, r6\n\t"
  37659. "lsr r11, r6, #16\n\t"
  37660. "lsl r6, r6, #16\n\t"
  37661. "adds r10, r10, r6\n\t"
  37662. "adc r5, r5, r11\n\t"
  37663. "adds r10, r10, r4\n\t"
  37664. "str r10, [%[a], #16]\n\t"
  37665. "adc r5, r5, #0\n\t"
  37666. /* a[i+5] += m[5] * mu */
  37667. "ldr r7, [%[m], #20]\n\t"
  37668. "ldr r10, [%[a], #20]\n\t"
  37669. "lsr r11, r7, #16\n\t"
  37670. "lsr r6, r8, #16\n\t"
  37671. "mul r4, r6, r11\n\t"
  37672. "lsl r11, r7, #16\n\t"
  37673. "lsr r11, r11, #16\n\t"
  37674. "mul r6, r11, r6\n\t"
  37675. "lsr r11, r6, #16\n\t"
  37676. "lsl r6, r6, #16\n\t"
  37677. "adds r10, r10, r6\n\t"
  37678. "adc r4, r4, r11\n\t"
  37679. "lsl r6, r8, #16\n\t"
  37680. "lsl r11, r7, #16\n\t"
  37681. "lsr r6, r6, #16\n\t"
  37682. "lsr r11, r11, #16\n\t"
  37683. "mul r11, r6, r11\n\t"
  37684. "adds r10, r10, r11\n\t"
  37685. "adc r4, r4, #0\n\t"
  37686. "lsr r11, r7, #16\n\t"
  37687. "mul r6, r11, r6\n\t"
  37688. "lsr r11, r6, #16\n\t"
  37689. "lsl r6, r6, #16\n\t"
  37690. "adds r10, r10, r6\n\t"
  37691. "adc r4, r4, r11\n\t"
  37692. "adds r10, r10, r5\n\t"
  37693. "str r10, [%[a], #20]\n\t"
  37694. "adc r4, r4, #0\n\t"
  37695. /* a[i+6] += m[6] * mu */
  37696. "ldr r7, [%[m], #24]\n\t"
  37697. "ldr r10, [%[a], #24]\n\t"
  37698. "lsr r11, r7, #16\n\t"
  37699. "lsr r6, r8, #16\n\t"
  37700. "mul r5, r6, r11\n\t"
  37701. "lsl r11, r7, #16\n\t"
  37702. "lsr r11, r11, #16\n\t"
  37703. "mul r6, r11, r6\n\t"
  37704. "lsr r11, r6, #16\n\t"
  37705. "lsl r6, r6, #16\n\t"
  37706. "adds r10, r10, r6\n\t"
  37707. "adc r5, r5, r11\n\t"
  37708. "lsl r6, r8, #16\n\t"
  37709. "lsl r11, r7, #16\n\t"
  37710. "lsr r6, r6, #16\n\t"
  37711. "lsr r11, r11, #16\n\t"
  37712. "mul r11, r6, r11\n\t"
  37713. "adds r10, r10, r11\n\t"
  37714. "adc r5, r5, #0\n\t"
  37715. "lsr r11, r7, #16\n\t"
  37716. "mul r6, r11, r6\n\t"
  37717. "lsr r11, r6, #16\n\t"
  37718. "lsl r6, r6, #16\n\t"
  37719. "adds r10, r10, r6\n\t"
  37720. "adc r5, r5, r11\n\t"
  37721. "adds r10, r10, r4\n\t"
  37722. "str r10, [%[a], #24]\n\t"
  37723. "adc r5, r5, #0\n\t"
  37724. /* a[i+7] += m[7] * mu */
  37725. "ldr r7, [%[m], #28]\n\t"
  37726. "ldr r10, [%[a], #28]\n\t"
  37727. "lsr r11, r7, #16\n\t"
  37728. "lsr r6, r8, #16\n\t"
  37729. "mul r4, r6, r11\n\t"
  37730. "lsl r11, r7, #16\n\t"
  37731. "lsr r11, r11, #16\n\t"
  37732. "mul r6, r11, r6\n\t"
  37733. "lsr r11, r6, #16\n\t"
  37734. "lsl r6, r6, #16\n\t"
  37735. "adds r10, r10, r6\n\t"
  37736. "adc r4, r4, r11\n\t"
  37737. "lsl r6, r8, #16\n\t"
  37738. "lsl r11, r7, #16\n\t"
  37739. "lsr r6, r6, #16\n\t"
  37740. "lsr r11, r11, #16\n\t"
  37741. "mul r11, r6, r11\n\t"
  37742. "adds r10, r10, r11\n\t"
  37743. "adc r4, r4, #0\n\t"
  37744. "lsr r11, r7, #16\n\t"
  37745. "mul r6, r11, r6\n\t"
  37746. "lsr r11, r6, #16\n\t"
  37747. "lsl r6, r6, #16\n\t"
  37748. "adds r10, r10, r6\n\t"
  37749. "adc r4, r4, r11\n\t"
  37750. "adds r10, r10, r5\n\t"
  37751. "str r10, [%[a], #28]\n\t"
  37752. "adc r4, r4, #0\n\t"
  37753. /* a[i+8] += m[8] * mu */
  37754. "ldr r7, [%[m], #32]\n\t"
  37755. "ldr r10, [%[a], #32]\n\t"
  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. "adds r10, r10, r4\n\t"
  37780. "str r10, [%[a], #32]\n\t"
  37781. "adc r5, r5, #0\n\t"
  37782. /* a[i+9] += m[9] * mu */
  37783. "ldr r7, [%[m], #36]\n\t"
  37784. "ldr r10, [%[a], #36]\n\t"
  37785. "lsr r11, r7, #16\n\t"
  37786. "lsr r6, r8, #16\n\t"
  37787. "mul r4, r6, r11\n\t"
  37788. "lsl r11, r7, #16\n\t"
  37789. "lsr r11, r11, #16\n\t"
  37790. "mul r6, r11, r6\n\t"
  37791. "lsr r11, r6, #16\n\t"
  37792. "lsl r6, r6, #16\n\t"
  37793. "adds r10, r10, r6\n\t"
  37794. "adc r4, r4, r11\n\t"
  37795. "lsl r6, r8, #16\n\t"
  37796. "lsl r11, r7, #16\n\t"
  37797. "lsr r6, r6, #16\n\t"
  37798. "lsr r11, r11, #16\n\t"
  37799. "mul r11, r6, r11\n\t"
  37800. "adds r10, r10, r11\n\t"
  37801. "adc r4, r4, #0\n\t"
  37802. "lsr r11, r7, #16\n\t"
  37803. "mul r6, r11, r6\n\t"
  37804. "lsr r11, r6, #16\n\t"
  37805. "lsl r6, r6, #16\n\t"
  37806. "adds r10, r10, r6\n\t"
  37807. "adc r4, r4, r11\n\t"
  37808. "adds r10, r10, r5\n\t"
  37809. "str r10, [%[a], #36]\n\t"
  37810. "adc r4, r4, #0\n\t"
  37811. /* a[i+10] += m[10] * mu */
  37812. "ldr r7, [%[m], #40]\n\t"
  37813. "ldr r10, [%[a], #40]\n\t"
  37814. "lsr r11, r7, #16\n\t"
  37815. "lsr r6, r8, #16\n\t"
  37816. "mul r5, r6, r11\n\t"
  37817. "lsl r11, r7, #16\n\t"
  37818. "lsr r11, r11, #16\n\t"
  37819. "mul r6, r11, r6\n\t"
  37820. "lsr r11, r6, #16\n\t"
  37821. "lsl r6, r6, #16\n\t"
  37822. "adds r10, r10, r6\n\t"
  37823. "adc r5, r5, r11\n\t"
  37824. "lsl r6, r8, #16\n\t"
  37825. "lsl r11, r7, #16\n\t"
  37826. "lsr r6, r6, #16\n\t"
  37827. "lsr r11, r11, #16\n\t"
  37828. "mul r11, r6, r11\n\t"
  37829. "adds r10, r10, r11\n\t"
  37830. "adc r5, r5, #0\n\t"
  37831. "lsr r11, r7, #16\n\t"
  37832. "mul r6, r11, r6\n\t"
  37833. "lsr r11, r6, #16\n\t"
  37834. "lsl r6, r6, #16\n\t"
  37835. "adds r10, r10, r6\n\t"
  37836. "adc r5, r5, r11\n\t"
  37837. "adds r10, r10, r4\n\t"
  37838. "str r10, [%[a], #40]\n\t"
  37839. "adc r5, r5, #0\n\t"
  37840. /* a[i+11] += m[11] * mu */
  37841. "ldr r7, [%[m], #44]\n\t"
  37842. "ldr r10, [%[a], #44]\n\t"
  37843. "lsr r11, r7, #16\n\t"
  37844. "lsr r6, r8, #16\n\t"
  37845. "mul r4, r6, r11\n\t"
  37846. "lsl r11, r7, #16\n\t"
  37847. "lsr r11, r11, #16\n\t"
  37848. "mul r6, r11, r6\n\t"
  37849. "lsr r11, r6, #16\n\t"
  37850. "lsl r6, r6, #16\n\t"
  37851. "adds r10, r10, r6\n\t"
  37852. "adc r4, r4, r11\n\t"
  37853. "lsl r6, r8, #16\n\t"
  37854. "lsl r11, r7, #16\n\t"
  37855. "lsr r6, r6, #16\n\t"
  37856. "lsr r11, r11, #16\n\t"
  37857. "mul r11, r6, r11\n\t"
  37858. "adds r10, r10, r11\n\t"
  37859. "adc r4, r4, #0\n\t"
  37860. "lsr r11, r7, #16\n\t"
  37861. "mul r6, r11, r6\n\t"
  37862. "lsr r11, r6, #16\n\t"
  37863. "lsl r6, r6, #16\n\t"
  37864. "adds r10, r10, r6\n\t"
  37865. "adc r4, r4, r11\n\t"
  37866. "adds r10, r10, r5\n\t"
  37867. "str r10, [%[a], #44]\n\t"
  37868. "adc r4, r4, #0\n\t"
  37869. /* a[i+12] += m[12] * mu */
  37870. "ldr r7, [%[m], #48]\n\t"
  37871. "ldr r10, [%[a], #48]\n\t"
  37872. "lsr r11, r7, #16\n\t"
  37873. "lsr r6, r8, #16\n\t"
  37874. "mul r5, r6, r11\n\t"
  37875. "lsl r11, r7, #16\n\t"
  37876. "lsr r11, r11, #16\n\t"
  37877. "mul r6, r11, r6\n\t"
  37878. "lsr r11, r6, #16\n\t"
  37879. "lsl r6, r6, #16\n\t"
  37880. "adds r10, r10, r6\n\t"
  37881. "adc r5, r5, r11\n\t"
  37882. "lsl r6, r8, #16\n\t"
  37883. "lsl r11, r7, #16\n\t"
  37884. "lsr r6, r6, #16\n\t"
  37885. "lsr r11, r11, #16\n\t"
  37886. "mul r11, r6, r11\n\t"
  37887. "adds r10, r10, r11\n\t"
  37888. "adc r5, r5, #0\n\t"
  37889. "lsr r11, r7, #16\n\t"
  37890. "mul r6, r11, r6\n\t"
  37891. "lsr r11, r6, #16\n\t"
  37892. "lsl r6, r6, #16\n\t"
  37893. "adds r10, r10, r6\n\t"
  37894. "adc r5, r5, r11\n\t"
  37895. "adds r10, r10, r4\n\t"
  37896. "str r10, [%[a], #48]\n\t"
  37897. "adc r5, r5, #0\n\t"
  37898. /* a[i+13] += m[13] * mu */
  37899. "ldr r7, [%[m], #52]\n\t"
  37900. "ldr r10, [%[a], #52]\n\t"
  37901. "lsr r11, r7, #16\n\t"
  37902. "lsr r6, r8, #16\n\t"
  37903. "mul r4, r6, r11\n\t"
  37904. "lsl r11, r7, #16\n\t"
  37905. "lsr r11, r11, #16\n\t"
  37906. "mul r6, r11, r6\n\t"
  37907. "lsr r11, r6, #16\n\t"
  37908. "lsl r6, r6, #16\n\t"
  37909. "adds r10, r10, r6\n\t"
  37910. "adc r4, r4, r11\n\t"
  37911. "lsl r6, r8, #16\n\t"
  37912. "lsl r11, r7, #16\n\t"
  37913. "lsr r6, r6, #16\n\t"
  37914. "lsr r11, r11, #16\n\t"
  37915. "mul r11, r6, r11\n\t"
  37916. "adds r10, r10, r11\n\t"
  37917. "adc r4, r4, #0\n\t"
  37918. "lsr r11, r7, #16\n\t"
  37919. "mul r6, r11, r6\n\t"
  37920. "lsr r11, r6, #16\n\t"
  37921. "lsl r6, r6, #16\n\t"
  37922. "adds r10, r10, r6\n\t"
  37923. "adc r4, r4, r11\n\t"
  37924. "adds r10, r10, r5\n\t"
  37925. "str r10, [%[a], #52]\n\t"
  37926. "adc r4, r4, #0\n\t"
  37927. /* a[i+14] += m[14] * mu */
  37928. "ldr r7, [%[m], #56]\n\t"
  37929. "ldr r10, [%[a], #56]\n\t"
  37930. "lsr r11, r7, #16\n\t"
  37931. "lsr r6, r8, #16\n\t"
  37932. "mul r5, r6, r11\n\t"
  37933. "lsl r11, r7, #16\n\t"
  37934. "lsr r11, r11, #16\n\t"
  37935. "mul r6, r11, r6\n\t"
  37936. "lsr r11, r6, #16\n\t"
  37937. "lsl r6, r6, #16\n\t"
  37938. "adds r10, r10, r6\n\t"
  37939. "adc r5, r5, r11\n\t"
  37940. "lsl r6, r8, #16\n\t"
  37941. "lsl r11, r7, #16\n\t"
  37942. "lsr r6, r6, #16\n\t"
  37943. "lsr r11, r11, #16\n\t"
  37944. "mul r11, r6, r11\n\t"
  37945. "adds r10, r10, r11\n\t"
  37946. "adc r5, r5, #0\n\t"
  37947. "lsr r11, r7, #16\n\t"
  37948. "mul r6, r11, r6\n\t"
  37949. "lsr r11, r6, #16\n\t"
  37950. "lsl r6, r6, #16\n\t"
  37951. "adds r10, r10, r6\n\t"
  37952. "adc r5, r5, r11\n\t"
  37953. "adds r10, r10, r4\n\t"
  37954. "str r10, [%[a], #56]\n\t"
  37955. "adc r5, r5, #0\n\t"
  37956. /* a[i+15] += m[15] * mu */
  37957. "ldr r7, [%[m], #60]\n\t"
  37958. "ldr r10, [%[a], #60]\n\t"
  37959. "lsr r11, r7, #16\n\t"
  37960. "lsr r6, r8, #16\n\t"
  37961. "mul r4, r6, r11\n\t"
  37962. "lsl r11, r7, #16\n\t"
  37963. "lsr r11, r11, #16\n\t"
  37964. "mul r6, r11, r6\n\t"
  37965. "lsr r11, r6, #16\n\t"
  37966. "lsl r6, r6, #16\n\t"
  37967. "adds r10, r10, r6\n\t"
  37968. "adc r4, r4, r11\n\t"
  37969. "lsl r6, r8, #16\n\t"
  37970. "lsl r11, r7, #16\n\t"
  37971. "lsr r6, r6, #16\n\t"
  37972. "lsr r11, r11, #16\n\t"
  37973. "mul r11, r6, r11\n\t"
  37974. "adds r10, r10, r11\n\t"
  37975. "adc r4, r4, #0\n\t"
  37976. "lsr r11, r7, #16\n\t"
  37977. "mul r6, r11, r6\n\t"
  37978. "lsr r11, r6, #16\n\t"
  37979. "lsl r6, r6, #16\n\t"
  37980. "adds r10, r10, r6\n\t"
  37981. "adc r4, r4, r11\n\t"
  37982. "adds r10, r10, r5\n\t"
  37983. "str r10, [%[a], #60]\n\t"
  37984. "adc r4, r4, #0\n\t"
  37985. /* a[i+16] += m[16] * mu */
  37986. "ldr r7, [%[m], #64]\n\t"
  37987. "ldr r10, [%[a], #64]\n\t"
  37988. "lsr r11, r7, #16\n\t"
  37989. "lsr r6, r8, #16\n\t"
  37990. "mul r5, r6, r11\n\t"
  37991. "lsl r11, r7, #16\n\t"
  37992. "lsr r11, r11, #16\n\t"
  37993. "mul r6, r11, r6\n\t"
  37994. "lsr r11, r6, #16\n\t"
  37995. "lsl r6, r6, #16\n\t"
  37996. "adds r10, r10, r6\n\t"
  37997. "adc r5, r5, r11\n\t"
  37998. "lsl r6, r8, #16\n\t"
  37999. "lsl r11, r7, #16\n\t"
  38000. "lsr r6, r6, #16\n\t"
  38001. "lsr r11, r11, #16\n\t"
  38002. "mul r11, r6, r11\n\t"
  38003. "adds r10, r10, r11\n\t"
  38004. "adc r5, r5, #0\n\t"
  38005. "lsr r11, r7, #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 r5, r5, r11\n\t"
  38011. "adds r10, r10, r4\n\t"
  38012. "str r10, [%[a], #64]\n\t"
  38013. "adc r5, r5, #0\n\t"
  38014. /* a[i+17] += m[17] * mu */
  38015. "ldr r7, [%[m], #68]\n\t"
  38016. "ldr r10, [%[a], #68]\n\t"
  38017. "lsr r11, r7, #16\n\t"
  38018. "lsr r6, r8, #16\n\t"
  38019. "mul r4, r6, r11\n\t"
  38020. "lsl r11, r7, #16\n\t"
  38021. "lsr r11, r11, #16\n\t"
  38022. "mul r6, r11, r6\n\t"
  38023. "lsr r11, r6, #16\n\t"
  38024. "lsl r6, r6, #16\n\t"
  38025. "adds r10, r10, r6\n\t"
  38026. "adc r4, r4, r11\n\t"
  38027. "lsl r6, r8, #16\n\t"
  38028. "lsl r11, r7, #16\n\t"
  38029. "lsr r6, r6, #16\n\t"
  38030. "lsr r11, r11, #16\n\t"
  38031. "mul r11, r6, r11\n\t"
  38032. "adds r10, r10, r11\n\t"
  38033. "adc r4, r4, #0\n\t"
  38034. "lsr r11, r7, #16\n\t"
  38035. "mul r6, r11, r6\n\t"
  38036. "lsr r11, r6, #16\n\t"
  38037. "lsl r6, r6, #16\n\t"
  38038. "adds r10, r10, r6\n\t"
  38039. "adc r4, r4, r11\n\t"
  38040. "adds r10, r10, r5\n\t"
  38041. "str r10, [%[a], #68]\n\t"
  38042. "adc r4, r4, #0\n\t"
  38043. /* a[i+18] += m[18] * mu */
  38044. "ldr r7, [%[m], #72]\n\t"
  38045. "ldr r10, [%[a], #72]\n\t"
  38046. "lsr r11, r7, #16\n\t"
  38047. "lsr r6, r8, #16\n\t"
  38048. "mul r5, r6, r11\n\t"
  38049. "lsl r11, r7, #16\n\t"
  38050. "lsr r11, r11, #16\n\t"
  38051. "mul r6, r11, r6\n\t"
  38052. "lsr r11, r6, #16\n\t"
  38053. "lsl r6, r6, #16\n\t"
  38054. "adds r10, r10, r6\n\t"
  38055. "adc r5, r5, r11\n\t"
  38056. "lsl r6, r8, #16\n\t"
  38057. "lsl r11, r7, #16\n\t"
  38058. "lsr r6, r6, #16\n\t"
  38059. "lsr r11, r11, #16\n\t"
  38060. "mul r11, r6, r11\n\t"
  38061. "adds r10, r10, r11\n\t"
  38062. "adc r5, r5, #0\n\t"
  38063. "lsr r11, r7, #16\n\t"
  38064. "mul r6, r11, r6\n\t"
  38065. "lsr r11, r6, #16\n\t"
  38066. "lsl r6, r6, #16\n\t"
  38067. "adds r10, r10, r6\n\t"
  38068. "adc r5, r5, r11\n\t"
  38069. "adds r10, r10, r4\n\t"
  38070. "str r10, [%[a], #72]\n\t"
  38071. "adc r5, r5, #0\n\t"
  38072. /* a[i+19] += m[19] * mu */
  38073. "ldr r7, [%[m], #76]\n\t"
  38074. "ldr r10, [%[a], #76]\n\t"
  38075. "lsr r11, r7, #16\n\t"
  38076. "lsr r6, r8, #16\n\t"
  38077. "mul r4, r6, r11\n\t"
  38078. "lsl r11, r7, #16\n\t"
  38079. "lsr r11, r11, #16\n\t"
  38080. "mul r6, r11, r6\n\t"
  38081. "lsr r11, r6, #16\n\t"
  38082. "lsl r6, r6, #16\n\t"
  38083. "adds r10, r10, r6\n\t"
  38084. "adc r4, r4, r11\n\t"
  38085. "lsl r6, r8, #16\n\t"
  38086. "lsl r11, r7, #16\n\t"
  38087. "lsr r6, r6, #16\n\t"
  38088. "lsr r11, r11, #16\n\t"
  38089. "mul r11, r6, r11\n\t"
  38090. "adds r10, r10, r11\n\t"
  38091. "adc r4, r4, #0\n\t"
  38092. "lsr r11, r7, #16\n\t"
  38093. "mul r6, r11, r6\n\t"
  38094. "lsr r11, r6, #16\n\t"
  38095. "lsl r6, r6, #16\n\t"
  38096. "adds r10, r10, r6\n\t"
  38097. "adc r4, r4, r11\n\t"
  38098. "adds r10, r10, r5\n\t"
  38099. "str r10, [%[a], #76]\n\t"
  38100. "adc r4, r4, #0\n\t"
  38101. /* a[i+20] += m[20] * mu */
  38102. "ldr r7, [%[m], #80]\n\t"
  38103. "ldr r10, [%[a], #80]\n\t"
  38104. "lsr r11, r7, #16\n\t"
  38105. "lsr r6, r8, #16\n\t"
  38106. "mul r5, r6, r11\n\t"
  38107. "lsl r11, r7, #16\n\t"
  38108. "lsr r11, r11, #16\n\t"
  38109. "mul r6, r11, r6\n\t"
  38110. "lsr r11, r6, #16\n\t"
  38111. "lsl r6, r6, #16\n\t"
  38112. "adds r10, r10, r6\n\t"
  38113. "adc r5, r5, r11\n\t"
  38114. "lsl r6, r8, #16\n\t"
  38115. "lsl r11, r7, #16\n\t"
  38116. "lsr r6, r6, #16\n\t"
  38117. "lsr r11, r11, #16\n\t"
  38118. "mul r11, r6, r11\n\t"
  38119. "adds r10, r10, r11\n\t"
  38120. "adc r5, r5, #0\n\t"
  38121. "lsr r11, r7, #16\n\t"
  38122. "mul r6, r11, r6\n\t"
  38123. "lsr r11, r6, #16\n\t"
  38124. "lsl r6, r6, #16\n\t"
  38125. "adds r10, r10, r6\n\t"
  38126. "adc r5, r5, r11\n\t"
  38127. "adds r10, r10, r4\n\t"
  38128. "str r10, [%[a], #80]\n\t"
  38129. "adc r5, r5, #0\n\t"
  38130. /* a[i+21] += m[21] * mu */
  38131. "ldr r7, [%[m], #84]\n\t"
  38132. "ldr r10, [%[a], #84]\n\t"
  38133. "lsr r11, r7, #16\n\t"
  38134. "lsr r6, r8, #16\n\t"
  38135. "mul r4, r6, r11\n\t"
  38136. "lsl r11, r7, #16\n\t"
  38137. "lsr r11, r11, #16\n\t"
  38138. "mul r6, r11, r6\n\t"
  38139. "lsr r11, r6, #16\n\t"
  38140. "lsl r6, r6, #16\n\t"
  38141. "adds r10, r10, r6\n\t"
  38142. "adc r4, r4, r11\n\t"
  38143. "lsl r6, r8, #16\n\t"
  38144. "lsl r11, r7, #16\n\t"
  38145. "lsr r6, r6, #16\n\t"
  38146. "lsr r11, r11, #16\n\t"
  38147. "mul r11, r6, r11\n\t"
  38148. "adds r10, r10, r11\n\t"
  38149. "adc r4, r4, #0\n\t"
  38150. "lsr r11, r7, #16\n\t"
  38151. "mul r6, r11, r6\n\t"
  38152. "lsr r11, r6, #16\n\t"
  38153. "lsl r6, r6, #16\n\t"
  38154. "adds r10, r10, r6\n\t"
  38155. "adc r4, r4, r11\n\t"
  38156. "adds r10, r10, r5\n\t"
  38157. "str r10, [%[a], #84]\n\t"
  38158. "adc r4, r4, #0\n\t"
  38159. /* a[i+22] += m[22] * mu */
  38160. "ldr r7, [%[m], #88]\n\t"
  38161. "ldr r10, [%[a], #88]\n\t"
  38162. "lsr r11, r7, #16\n\t"
  38163. "lsr r6, r8, #16\n\t"
  38164. "mul r5, r6, r11\n\t"
  38165. "lsl r11, r7, #16\n\t"
  38166. "lsr r11, r11, #16\n\t"
  38167. "mul r6, r11, r6\n\t"
  38168. "lsr r11, r6, #16\n\t"
  38169. "lsl r6, r6, #16\n\t"
  38170. "adds r10, r10, r6\n\t"
  38171. "adc r5, r5, r11\n\t"
  38172. "lsl r6, r8, #16\n\t"
  38173. "lsl r11, r7, #16\n\t"
  38174. "lsr r6, r6, #16\n\t"
  38175. "lsr r11, r11, #16\n\t"
  38176. "mul r11, r6, r11\n\t"
  38177. "adds r10, r10, r11\n\t"
  38178. "adc r5, r5, #0\n\t"
  38179. "lsr r11, r7, #16\n\t"
  38180. "mul r6, r11, r6\n\t"
  38181. "lsr r11, r6, #16\n\t"
  38182. "lsl r6, r6, #16\n\t"
  38183. "adds r10, r10, r6\n\t"
  38184. "adc r5, r5, r11\n\t"
  38185. "adds r10, r10, r4\n\t"
  38186. "str r10, [%[a], #88]\n\t"
  38187. "adc r5, r5, #0\n\t"
  38188. /* a[i+23] += m[23] * mu */
  38189. "ldr r7, [%[m], #92]\n\t"
  38190. "ldr r10, [%[a], #92]\n\t"
  38191. "lsr r11, r7, #16\n\t"
  38192. "lsr r6, r8, #16\n\t"
  38193. "mul r4, r6, r11\n\t"
  38194. "lsl r11, r7, #16\n\t"
  38195. "lsr r11, r11, #16\n\t"
  38196. "mul r6, r11, r6\n\t"
  38197. "lsr r11, r6, #16\n\t"
  38198. "lsl r6, r6, #16\n\t"
  38199. "adds r10, r10, r6\n\t"
  38200. "adc r4, r4, r11\n\t"
  38201. "lsl r6, r8, #16\n\t"
  38202. "lsl r11, r7, #16\n\t"
  38203. "lsr r6, r6, #16\n\t"
  38204. "lsr r11, r11, #16\n\t"
  38205. "mul r11, r6, r11\n\t"
  38206. "adds r10, r10, r11\n\t"
  38207. "adc r4, r4, #0\n\t"
  38208. "lsr r11, r7, #16\n\t"
  38209. "mul r6, r11, r6\n\t"
  38210. "lsr r11, r6, #16\n\t"
  38211. "lsl r6, r6, #16\n\t"
  38212. "adds r10, r10, r6\n\t"
  38213. "adc r4, r4, r11\n\t"
  38214. "adds r10, r10, r5\n\t"
  38215. "str r10, [%[a], #92]\n\t"
  38216. "adc r4, r4, #0\n\t"
  38217. /* a[i+24] += m[24] * mu */
  38218. "ldr r7, [%[m], #96]\n\t"
  38219. "ldr r10, [%[a], #96]\n\t"
  38220. "lsr r11, r7, #16\n\t"
  38221. "lsr r6, r8, #16\n\t"
  38222. "mul r5, r6, r11\n\t"
  38223. "lsl r11, r7, #16\n\t"
  38224. "lsr r11, r11, #16\n\t"
  38225. "mul r6, r11, r6\n\t"
  38226. "lsr r11, r6, #16\n\t"
  38227. "lsl r6, r6, #16\n\t"
  38228. "adds r10, r10, r6\n\t"
  38229. "adc r5, r5, r11\n\t"
  38230. "lsl r6, r8, #16\n\t"
  38231. "lsl r11, r7, #16\n\t"
  38232. "lsr r6, r6, #16\n\t"
  38233. "lsr r11, r11, #16\n\t"
  38234. "mul r11, r6, r11\n\t"
  38235. "adds r10, r10, r11\n\t"
  38236. "adc r5, r5, #0\n\t"
  38237. "lsr r11, r7, #16\n\t"
  38238. "mul r6, r11, r6\n\t"
  38239. "lsr r11, r6, #16\n\t"
  38240. "lsl r6, r6, #16\n\t"
  38241. "adds r10, r10, r6\n\t"
  38242. "adc r5, r5, r11\n\t"
  38243. "adds r10, r10, r4\n\t"
  38244. "str r10, [%[a], #96]\n\t"
  38245. "adc r5, r5, #0\n\t"
  38246. /* a[i+25] += m[25] * mu */
  38247. "ldr r7, [%[m], #100]\n\t"
  38248. "ldr r10, [%[a], #100]\n\t"
  38249. "lsr r11, r7, #16\n\t"
  38250. "lsr r6, r8, #16\n\t"
  38251. "mul r4, r6, r11\n\t"
  38252. "lsl r11, r7, #16\n\t"
  38253. "lsr r11, r11, #16\n\t"
  38254. "mul r6, r11, r6\n\t"
  38255. "lsr r11, r6, #16\n\t"
  38256. "lsl r6, r6, #16\n\t"
  38257. "adds r10, r10, r6\n\t"
  38258. "adc r4, r4, r11\n\t"
  38259. "lsl r6, r8, #16\n\t"
  38260. "lsl r11, r7, #16\n\t"
  38261. "lsr r6, r6, #16\n\t"
  38262. "lsr r11, r11, #16\n\t"
  38263. "mul r11, r6, r11\n\t"
  38264. "adds r10, r10, r11\n\t"
  38265. "adc r4, r4, #0\n\t"
  38266. "lsr r11, r7, #16\n\t"
  38267. "mul r6, r11, r6\n\t"
  38268. "lsr r11, r6, #16\n\t"
  38269. "lsl r6, r6, #16\n\t"
  38270. "adds r10, r10, r6\n\t"
  38271. "adc r4, r4, r11\n\t"
  38272. "adds r10, r10, r5\n\t"
  38273. "str r10, [%[a], #100]\n\t"
  38274. "adc r4, r4, #0\n\t"
  38275. /* a[i+26] += m[26] * mu */
  38276. "ldr r7, [%[m], #104]\n\t"
  38277. "ldr r10, [%[a], #104]\n\t"
  38278. "lsr r11, r7, #16\n\t"
  38279. "lsr r6, r8, #16\n\t"
  38280. "mul r5, r6, r11\n\t"
  38281. "lsl r11, r7, #16\n\t"
  38282. "lsr r11, r11, #16\n\t"
  38283. "mul r6, r11, r6\n\t"
  38284. "lsr r11, r6, #16\n\t"
  38285. "lsl r6, r6, #16\n\t"
  38286. "adds r10, r10, r6\n\t"
  38287. "adc r5, r5, r11\n\t"
  38288. "lsl r6, r8, #16\n\t"
  38289. "lsl r11, r7, #16\n\t"
  38290. "lsr r6, r6, #16\n\t"
  38291. "lsr r11, r11, #16\n\t"
  38292. "mul r11, r6, r11\n\t"
  38293. "adds r10, r10, r11\n\t"
  38294. "adc r5, r5, #0\n\t"
  38295. "lsr r11, r7, #16\n\t"
  38296. "mul r6, r11, r6\n\t"
  38297. "lsr r11, r6, #16\n\t"
  38298. "lsl r6, r6, #16\n\t"
  38299. "adds r10, r10, r6\n\t"
  38300. "adc r5, r5, r11\n\t"
  38301. "adds r10, r10, r4\n\t"
  38302. "str r10, [%[a], #104]\n\t"
  38303. "adc r5, r5, #0\n\t"
  38304. /* a[i+27] += m[27] * mu */
  38305. "ldr r7, [%[m], #108]\n\t"
  38306. "ldr r10, [%[a], #108]\n\t"
  38307. "lsr r11, r7, #16\n\t"
  38308. "lsr r6, r8, #16\n\t"
  38309. "mul r4, r6, r11\n\t"
  38310. "lsl r11, r7, #16\n\t"
  38311. "lsr r11, r11, #16\n\t"
  38312. "mul r6, r11, r6\n\t"
  38313. "lsr r11, r6, #16\n\t"
  38314. "lsl r6, r6, #16\n\t"
  38315. "adds r10, r10, r6\n\t"
  38316. "adc r4, r4, r11\n\t"
  38317. "lsl r6, r8, #16\n\t"
  38318. "lsl r11, r7, #16\n\t"
  38319. "lsr r6, r6, #16\n\t"
  38320. "lsr r11, r11, #16\n\t"
  38321. "mul r11, r6, r11\n\t"
  38322. "adds r10, r10, r11\n\t"
  38323. "adc r4, r4, #0\n\t"
  38324. "lsr r11, r7, #16\n\t"
  38325. "mul r6, r11, r6\n\t"
  38326. "lsr r11, r6, #16\n\t"
  38327. "lsl r6, r6, #16\n\t"
  38328. "adds r10, r10, r6\n\t"
  38329. "adc r4, r4, r11\n\t"
  38330. "adds r10, r10, r5\n\t"
  38331. "str r10, [%[a], #108]\n\t"
  38332. "adc r4, r4, #0\n\t"
  38333. /* a[i+28] += m[28] * mu */
  38334. "ldr r7, [%[m], #112]\n\t"
  38335. "ldr r10, [%[a], #112]\n\t"
  38336. "lsr r11, r7, #16\n\t"
  38337. "lsr r6, r8, #16\n\t"
  38338. "mul r5, r6, r11\n\t"
  38339. "lsl r11, r7, #16\n\t"
  38340. "lsr r11, r11, #16\n\t"
  38341. "mul r6, r11, r6\n\t"
  38342. "lsr r11, r6, #16\n\t"
  38343. "lsl r6, r6, #16\n\t"
  38344. "adds r10, r10, r6\n\t"
  38345. "adc r5, r5, r11\n\t"
  38346. "lsl r6, r8, #16\n\t"
  38347. "lsl r11, r7, #16\n\t"
  38348. "lsr r6, r6, #16\n\t"
  38349. "lsr r11, r11, #16\n\t"
  38350. "mul r11, r6, r11\n\t"
  38351. "adds r10, r10, r11\n\t"
  38352. "adc r5, r5, #0\n\t"
  38353. "lsr r11, r7, #16\n\t"
  38354. "mul r6, r11, r6\n\t"
  38355. "lsr r11, r6, #16\n\t"
  38356. "lsl r6, r6, #16\n\t"
  38357. "adds r10, r10, r6\n\t"
  38358. "adc r5, r5, r11\n\t"
  38359. "adds r10, r10, r4\n\t"
  38360. "str r10, [%[a], #112]\n\t"
  38361. "adc r5, r5, #0\n\t"
  38362. /* a[i+29] += m[29] * mu */
  38363. "ldr r7, [%[m], #116]\n\t"
  38364. "ldr r10, [%[a], #116]\n\t"
  38365. "lsr r11, r7, #16\n\t"
  38366. "lsr r6, r8, #16\n\t"
  38367. "mul r4, r6, r11\n\t"
  38368. "lsl r11, r7, #16\n\t"
  38369. "lsr r11, r11, #16\n\t"
  38370. "mul r6, r11, r6\n\t"
  38371. "lsr r11, r6, #16\n\t"
  38372. "lsl r6, r6, #16\n\t"
  38373. "adds r10, r10, r6\n\t"
  38374. "adc r4, r4, r11\n\t"
  38375. "lsl r6, r8, #16\n\t"
  38376. "lsl r11, r7, #16\n\t"
  38377. "lsr r6, r6, #16\n\t"
  38378. "lsr r11, r11, #16\n\t"
  38379. "mul r11, r6, r11\n\t"
  38380. "adds r10, r10, r11\n\t"
  38381. "adc r4, r4, #0\n\t"
  38382. "lsr r11, r7, #16\n\t"
  38383. "mul r6, r11, r6\n\t"
  38384. "lsr r11, r6, #16\n\t"
  38385. "lsl r6, r6, #16\n\t"
  38386. "adds r10, r10, r6\n\t"
  38387. "adc r4, r4, r11\n\t"
  38388. "adds r10, r10, r5\n\t"
  38389. "str r10, [%[a], #116]\n\t"
  38390. "adc r4, r4, #0\n\t"
  38391. /* a[i+30] += m[30] * mu */
  38392. "ldr r7, [%[m], #120]\n\t"
  38393. "ldr r10, [%[a], #120]\n\t"
  38394. "lsr r11, r7, #16\n\t"
  38395. "lsr r6, r8, #16\n\t"
  38396. "mul r5, r6, r11\n\t"
  38397. "lsl r11, r7, #16\n\t"
  38398. "lsr r11, r11, #16\n\t"
  38399. "mul r6, r11, r6\n\t"
  38400. "lsr r11, r6, #16\n\t"
  38401. "lsl r6, r6, #16\n\t"
  38402. "adds r10, r10, r6\n\t"
  38403. "adc r5, r5, r11\n\t"
  38404. "lsl r6, r8, #16\n\t"
  38405. "lsl r11, r7, #16\n\t"
  38406. "lsr r6, r6, #16\n\t"
  38407. "lsr r11, r11, #16\n\t"
  38408. "mul r11, r6, r11\n\t"
  38409. "adds r10, r10, r11\n\t"
  38410. "adc r5, r5, #0\n\t"
  38411. "lsr r11, r7, #16\n\t"
  38412. "mul r6, r11, r6\n\t"
  38413. "lsr r11, r6, #16\n\t"
  38414. "lsl r6, r6, #16\n\t"
  38415. "adds r10, r10, r6\n\t"
  38416. "adc r5, r5, r11\n\t"
  38417. "adds r10, r10, r4\n\t"
  38418. "str r10, [%[a], #120]\n\t"
  38419. "adc r5, r5, #0\n\t"
  38420. /* a[i+31] += m[31] * mu */
  38421. "ldr r7, [%[m], #124]\n\t"
  38422. "ldr r10, [%[a], #124]\n\t"
  38423. "lsr r11, r7, #16\n\t"
  38424. "lsr r6, r8, #16\n\t"
  38425. "mul r4, r6, r11\n\t"
  38426. "lsl r11, r7, #16\n\t"
  38427. "lsr r11, r11, #16\n\t"
  38428. "mul r6, r11, r6\n\t"
  38429. "lsr r11, r6, #16\n\t"
  38430. "lsl r6, r6, #16\n\t"
  38431. "adds r10, r10, r6\n\t"
  38432. "adc r4, r4, r11\n\t"
  38433. "lsl r6, r8, #16\n\t"
  38434. "lsl r11, r7, #16\n\t"
  38435. "lsr r6, r6, #16\n\t"
  38436. "lsr r11, r11, #16\n\t"
  38437. "mul r11, r6, r11\n\t"
  38438. "adds r10, r10, r11\n\t"
  38439. "adc r4, r4, #0\n\t"
  38440. "lsr r11, r7, #16\n\t"
  38441. "mul r6, r11, r6\n\t"
  38442. "lsr r11, r6, #16\n\t"
  38443. "lsl r6, r6, #16\n\t"
  38444. "adds r10, r10, r6\n\t"
  38445. "adc r4, r4, r11\n\t"
  38446. "adds r10, r10, r5\n\t"
  38447. "str r10, [%[a], #124]\n\t"
  38448. "adc r4, r4, #0\n\t"
  38449. /* a[i+32] += m[32] * mu */
  38450. "ldr r7, [%[m], #128]\n\t"
  38451. "ldr r10, [%[a], #128]\n\t"
  38452. "lsr r11, r7, #16\n\t"
  38453. "lsr r6, r8, #16\n\t"
  38454. "mul r5, r6, r11\n\t"
  38455. "lsl r11, r7, #16\n\t"
  38456. "lsr r11, r11, #16\n\t"
  38457. "mul r6, r11, r6\n\t"
  38458. "lsr r11, r6, #16\n\t"
  38459. "lsl r6, r6, #16\n\t"
  38460. "adds r10, r10, r6\n\t"
  38461. "adc r5, r5, r11\n\t"
  38462. "lsl r6, r8, #16\n\t"
  38463. "lsl r11, r7, #16\n\t"
  38464. "lsr r6, r6, #16\n\t"
  38465. "lsr r11, r11, #16\n\t"
  38466. "mul r11, r6, r11\n\t"
  38467. "adds r10, r10, r11\n\t"
  38468. "adc r5, r5, #0\n\t"
  38469. "lsr r11, r7, #16\n\t"
  38470. "mul r6, r11, r6\n\t"
  38471. "lsr r11, r6, #16\n\t"
  38472. "lsl r6, r6, #16\n\t"
  38473. "adds r10, r10, r6\n\t"
  38474. "adc r5, r5, r11\n\t"
  38475. "adds r10, r10, r4\n\t"
  38476. "str r10, [%[a], #128]\n\t"
  38477. "adc r5, r5, #0\n\t"
  38478. /* a[i+33] += m[33] * mu */
  38479. "ldr r7, [%[m], #132]\n\t"
  38480. "ldr r10, [%[a], #132]\n\t"
  38481. "lsr r11, r7, #16\n\t"
  38482. "lsr r6, r8, #16\n\t"
  38483. "mul r4, r6, r11\n\t"
  38484. "lsl r11, r7, #16\n\t"
  38485. "lsr r11, r11, #16\n\t"
  38486. "mul r6, r11, r6\n\t"
  38487. "lsr r11, r6, #16\n\t"
  38488. "lsl r6, r6, #16\n\t"
  38489. "adds r10, r10, r6\n\t"
  38490. "adc r4, r4, r11\n\t"
  38491. "lsl r6, r8, #16\n\t"
  38492. "lsl r11, r7, #16\n\t"
  38493. "lsr r6, r6, #16\n\t"
  38494. "lsr r11, r11, #16\n\t"
  38495. "mul r11, r6, r11\n\t"
  38496. "adds r10, r10, r11\n\t"
  38497. "adc r4, r4, #0\n\t"
  38498. "lsr r11, r7, #16\n\t"
  38499. "mul r6, r11, r6\n\t"
  38500. "lsr r11, r6, #16\n\t"
  38501. "lsl r6, r6, #16\n\t"
  38502. "adds r10, r10, r6\n\t"
  38503. "adc r4, r4, r11\n\t"
  38504. "adds r10, r10, r5\n\t"
  38505. "str r10, [%[a], #132]\n\t"
  38506. "adc r4, r4, #0\n\t"
  38507. /* a[i+34] += m[34] * mu */
  38508. "ldr r7, [%[m], #136]\n\t"
  38509. "ldr r10, [%[a], #136]\n\t"
  38510. "lsr r11, r7, #16\n\t"
  38511. "lsr r6, r8, #16\n\t"
  38512. "mul r5, r6, r11\n\t"
  38513. "lsl r11, r7, #16\n\t"
  38514. "lsr r11, r11, #16\n\t"
  38515. "mul r6, r11, r6\n\t"
  38516. "lsr r11, r6, #16\n\t"
  38517. "lsl r6, r6, #16\n\t"
  38518. "adds r10, r10, r6\n\t"
  38519. "adc r5, r5, r11\n\t"
  38520. "lsl r6, r8, #16\n\t"
  38521. "lsl r11, r7, #16\n\t"
  38522. "lsr r6, r6, #16\n\t"
  38523. "lsr r11, r11, #16\n\t"
  38524. "mul r11, r6, r11\n\t"
  38525. "adds r10, r10, r11\n\t"
  38526. "adc r5, r5, #0\n\t"
  38527. "lsr r11, r7, #16\n\t"
  38528. "mul r6, r11, r6\n\t"
  38529. "lsr r11, r6, #16\n\t"
  38530. "lsl r6, r6, #16\n\t"
  38531. "adds r10, r10, r6\n\t"
  38532. "adc r5, r5, r11\n\t"
  38533. "adds r10, r10, r4\n\t"
  38534. "str r10, [%[a], #136]\n\t"
  38535. "adc r5, r5, #0\n\t"
  38536. /* a[i+35] += m[35] * mu */
  38537. "ldr r7, [%[m], #140]\n\t"
  38538. "ldr r10, [%[a], #140]\n\t"
  38539. "lsr r11, r7, #16\n\t"
  38540. "lsr r6, r8, #16\n\t"
  38541. "mul r4, r6, r11\n\t"
  38542. "lsl r11, r7, #16\n\t"
  38543. "lsr r11, r11, #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 r4, r4, r11\n\t"
  38549. "lsl r6, r8, #16\n\t"
  38550. "lsl r11, r7, #16\n\t"
  38551. "lsr r6, r6, #16\n\t"
  38552. "lsr r11, r11, #16\n\t"
  38553. "mul r11, r6, r11\n\t"
  38554. "adds r10, r10, r11\n\t"
  38555. "adc r4, r4, #0\n\t"
  38556. "lsr r11, r7, #16\n\t"
  38557. "mul r6, r11, r6\n\t"
  38558. "lsr r11, r6, #16\n\t"
  38559. "lsl r6, r6, #16\n\t"
  38560. "adds r10, r10, r6\n\t"
  38561. "adc r4, r4, r11\n\t"
  38562. "adds r10, r10, r5\n\t"
  38563. "str r10, [%[a], #140]\n\t"
  38564. "adc r4, r4, #0\n\t"
  38565. /* a[i+36] += m[36] * mu */
  38566. "ldr r7, [%[m], #144]\n\t"
  38567. "ldr r10, [%[a], #144]\n\t"
  38568. "lsr r11, r7, #16\n\t"
  38569. "lsr r6, r8, #16\n\t"
  38570. "mul r5, r6, r11\n\t"
  38571. "lsl r11, r7, #16\n\t"
  38572. "lsr r11, r11, #16\n\t"
  38573. "mul r6, r11, r6\n\t"
  38574. "lsr r11, r6, #16\n\t"
  38575. "lsl r6, r6, #16\n\t"
  38576. "adds r10, r10, r6\n\t"
  38577. "adc r5, r5, r11\n\t"
  38578. "lsl r6, r8, #16\n\t"
  38579. "lsl r11, r7, #16\n\t"
  38580. "lsr r6, r6, #16\n\t"
  38581. "lsr r11, r11, #16\n\t"
  38582. "mul r11, r6, r11\n\t"
  38583. "adds r10, r10, r11\n\t"
  38584. "adc r5, r5, #0\n\t"
  38585. "lsr r11, r7, #16\n\t"
  38586. "mul r6, r11, r6\n\t"
  38587. "lsr r11, r6, #16\n\t"
  38588. "lsl r6, r6, #16\n\t"
  38589. "adds r10, r10, r6\n\t"
  38590. "adc r5, r5, r11\n\t"
  38591. "adds r10, r10, r4\n\t"
  38592. "str r10, [%[a], #144]\n\t"
  38593. "adc r5, r5, #0\n\t"
  38594. /* a[i+37] += m[37] * mu */
  38595. "ldr r7, [%[m], #148]\n\t"
  38596. "ldr r10, [%[a], #148]\n\t"
  38597. "lsr r11, r7, #16\n\t"
  38598. "lsr r6, r8, #16\n\t"
  38599. "mul r4, r6, r11\n\t"
  38600. "lsl r11, r7, #16\n\t"
  38601. "lsr r11, r11, #16\n\t"
  38602. "mul r6, r11, r6\n\t"
  38603. "lsr r11, r6, #16\n\t"
  38604. "lsl r6, r6, #16\n\t"
  38605. "adds r10, r10, r6\n\t"
  38606. "adc r4, r4, r11\n\t"
  38607. "lsl r6, r8, #16\n\t"
  38608. "lsl r11, r7, #16\n\t"
  38609. "lsr r6, r6, #16\n\t"
  38610. "lsr r11, r11, #16\n\t"
  38611. "mul r11, r6, r11\n\t"
  38612. "adds r10, r10, r11\n\t"
  38613. "adc r4, r4, #0\n\t"
  38614. "lsr r11, r7, #16\n\t"
  38615. "mul r6, r11, r6\n\t"
  38616. "lsr r11, r6, #16\n\t"
  38617. "lsl r6, r6, #16\n\t"
  38618. "adds r10, r10, r6\n\t"
  38619. "adc r4, r4, r11\n\t"
  38620. "adds r10, r10, r5\n\t"
  38621. "str r10, [%[a], #148]\n\t"
  38622. "adc r4, r4, #0\n\t"
  38623. /* a[i+38] += m[38] * mu */
  38624. "ldr r7, [%[m], #152]\n\t"
  38625. "ldr r10, [%[a], #152]\n\t"
  38626. "lsr r11, r7, #16\n\t"
  38627. "lsr r6, r8, #16\n\t"
  38628. "mul r5, r6, r11\n\t"
  38629. "lsl r11, r7, #16\n\t"
  38630. "lsr r11, r11, #16\n\t"
  38631. "mul r6, r11, r6\n\t"
  38632. "lsr r11, r6, #16\n\t"
  38633. "lsl r6, r6, #16\n\t"
  38634. "adds r10, r10, r6\n\t"
  38635. "adc r5, r5, r11\n\t"
  38636. "lsl r6, r8, #16\n\t"
  38637. "lsl r11, r7, #16\n\t"
  38638. "lsr r6, r6, #16\n\t"
  38639. "lsr r11, r11, #16\n\t"
  38640. "mul r11, r6, r11\n\t"
  38641. "adds r10, r10, r11\n\t"
  38642. "adc r5, r5, #0\n\t"
  38643. "lsr r11, r7, #16\n\t"
  38644. "mul r6, r11, r6\n\t"
  38645. "lsr r11, r6, #16\n\t"
  38646. "lsl r6, r6, #16\n\t"
  38647. "adds r10, r10, r6\n\t"
  38648. "adc r5, r5, r11\n\t"
  38649. "adds r10, r10, r4\n\t"
  38650. "str r10, [%[a], #152]\n\t"
  38651. "adc r5, r5, #0\n\t"
  38652. /* a[i+39] += m[39] * mu */
  38653. "ldr r7, [%[m], #156]\n\t"
  38654. "ldr r10, [%[a], #156]\n\t"
  38655. "lsr r11, r7, #16\n\t"
  38656. "lsr r6, r8, #16\n\t"
  38657. "mul r4, r6, r11\n\t"
  38658. "lsl r11, r7, #16\n\t"
  38659. "lsr r11, r11, #16\n\t"
  38660. "mul r6, r11, r6\n\t"
  38661. "lsr r11, r6, #16\n\t"
  38662. "lsl r6, r6, #16\n\t"
  38663. "adds r10, r10, r6\n\t"
  38664. "adc r4, r4, r11\n\t"
  38665. "lsl r6, r8, #16\n\t"
  38666. "lsl r11, r7, #16\n\t"
  38667. "lsr r6, r6, #16\n\t"
  38668. "lsr r11, r11, #16\n\t"
  38669. "mul r11, r6, r11\n\t"
  38670. "adds r10, r10, r11\n\t"
  38671. "adc r4, r4, #0\n\t"
  38672. "lsr r11, r7, #16\n\t"
  38673. "mul r6, r11, r6\n\t"
  38674. "lsr r11, r6, #16\n\t"
  38675. "lsl r6, r6, #16\n\t"
  38676. "adds r10, r10, r6\n\t"
  38677. "adc r4, r4, r11\n\t"
  38678. "adds r10, r10, r5\n\t"
  38679. "str r10, [%[a], #156]\n\t"
  38680. "adc r4, r4, #0\n\t"
  38681. /* a[i+40] += m[40] * mu */
  38682. "ldr r7, [%[m], #160]\n\t"
  38683. "ldr r10, [%[a], #160]\n\t"
  38684. "lsr r11, r7, #16\n\t"
  38685. "lsr r6, r8, #16\n\t"
  38686. "mul r5, r6, r11\n\t"
  38687. "lsl r11, r7, #16\n\t"
  38688. "lsr r11, r11, #16\n\t"
  38689. "mul r6, r11, r6\n\t"
  38690. "lsr r11, r6, #16\n\t"
  38691. "lsl r6, r6, #16\n\t"
  38692. "adds r10, r10, r6\n\t"
  38693. "adc r5, r5, r11\n\t"
  38694. "lsl r6, r8, #16\n\t"
  38695. "lsl r11, r7, #16\n\t"
  38696. "lsr r6, r6, #16\n\t"
  38697. "lsr r11, r11, #16\n\t"
  38698. "mul r11, r6, r11\n\t"
  38699. "adds r10, r10, r11\n\t"
  38700. "adc r5, r5, #0\n\t"
  38701. "lsr r11, r7, #16\n\t"
  38702. "mul r6, r11, r6\n\t"
  38703. "lsr r11, r6, #16\n\t"
  38704. "lsl r6, r6, #16\n\t"
  38705. "adds r10, r10, r6\n\t"
  38706. "adc r5, r5, r11\n\t"
  38707. "adds r10, r10, r4\n\t"
  38708. "str r10, [%[a], #160]\n\t"
  38709. "adc r5, r5, #0\n\t"
  38710. /* a[i+41] += m[41] * mu */
  38711. "ldr r7, [%[m], #164]\n\t"
  38712. "ldr r10, [%[a], #164]\n\t"
  38713. "lsr r11, r7, #16\n\t"
  38714. "lsr r6, r8, #16\n\t"
  38715. "mul r4, r6, r11\n\t"
  38716. "lsl r11, r7, #16\n\t"
  38717. "lsr r11, r11, #16\n\t"
  38718. "mul r6, r11, r6\n\t"
  38719. "lsr r11, r6, #16\n\t"
  38720. "lsl r6, r6, #16\n\t"
  38721. "adds r10, r10, r6\n\t"
  38722. "adc r4, r4, r11\n\t"
  38723. "lsl r6, r8, #16\n\t"
  38724. "lsl r11, r7, #16\n\t"
  38725. "lsr r6, r6, #16\n\t"
  38726. "lsr r11, r11, #16\n\t"
  38727. "mul r11, r6, r11\n\t"
  38728. "adds r10, r10, r11\n\t"
  38729. "adc r4, r4, #0\n\t"
  38730. "lsr r11, r7, #16\n\t"
  38731. "mul r6, r11, r6\n\t"
  38732. "lsr r11, r6, #16\n\t"
  38733. "lsl r6, r6, #16\n\t"
  38734. "adds r10, r10, r6\n\t"
  38735. "adc r4, r4, r11\n\t"
  38736. "adds r10, r10, r5\n\t"
  38737. "str r10, [%[a], #164]\n\t"
  38738. "adc r4, r4, #0\n\t"
  38739. /* a[i+42] += m[42] * mu */
  38740. "ldr r7, [%[m], #168]\n\t"
  38741. "ldr r10, [%[a], #168]\n\t"
  38742. "lsr r11, r7, #16\n\t"
  38743. "lsr r6, r8, #16\n\t"
  38744. "mul r5, r6, r11\n\t"
  38745. "lsl r11, r7, #16\n\t"
  38746. "lsr r11, r11, #16\n\t"
  38747. "mul r6, r11, r6\n\t"
  38748. "lsr r11, r6, #16\n\t"
  38749. "lsl r6, r6, #16\n\t"
  38750. "adds r10, r10, r6\n\t"
  38751. "adc r5, r5, r11\n\t"
  38752. "lsl r6, r8, #16\n\t"
  38753. "lsl r11, r7, #16\n\t"
  38754. "lsr r6, r6, #16\n\t"
  38755. "lsr r11, r11, #16\n\t"
  38756. "mul r11, r6, r11\n\t"
  38757. "adds r10, r10, r11\n\t"
  38758. "adc r5, r5, #0\n\t"
  38759. "lsr r11, r7, #16\n\t"
  38760. "mul r6, r11, r6\n\t"
  38761. "lsr r11, r6, #16\n\t"
  38762. "lsl r6, r6, #16\n\t"
  38763. "adds r10, r10, r6\n\t"
  38764. "adc r5, r5, r11\n\t"
  38765. "adds r10, r10, r4\n\t"
  38766. "str r10, [%[a], #168]\n\t"
  38767. "adc r5, r5, #0\n\t"
  38768. /* a[i+43] += m[43] * mu */
  38769. "ldr r7, [%[m], #172]\n\t"
  38770. "ldr r10, [%[a], #172]\n\t"
  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. "adds r10, r10, r5\n\t"
  38795. "str r10, [%[a], #172]\n\t"
  38796. "adc r4, r4, #0\n\t"
  38797. /* a[i+44] += m[44] * mu */
  38798. "ldr r7, [%[m], #176]\n\t"
  38799. "ldr r10, [%[a], #176]\n\t"
  38800. "lsr r11, r7, #16\n\t"
  38801. "lsr r6, r8, #16\n\t"
  38802. "mul r5, r6, r11\n\t"
  38803. "lsl r11, r7, #16\n\t"
  38804. "lsr r11, r11, #16\n\t"
  38805. "mul r6, r11, r6\n\t"
  38806. "lsr r11, r6, #16\n\t"
  38807. "lsl r6, r6, #16\n\t"
  38808. "adds r10, r10, r6\n\t"
  38809. "adc r5, r5, r11\n\t"
  38810. "lsl r6, r8, #16\n\t"
  38811. "lsl r11, r7, #16\n\t"
  38812. "lsr r6, r6, #16\n\t"
  38813. "lsr r11, r11, #16\n\t"
  38814. "mul r11, r6, r11\n\t"
  38815. "adds r10, r10, r11\n\t"
  38816. "adc r5, r5, #0\n\t"
  38817. "lsr r11, r7, #16\n\t"
  38818. "mul r6, r11, r6\n\t"
  38819. "lsr r11, r6, #16\n\t"
  38820. "lsl r6, r6, #16\n\t"
  38821. "adds r10, r10, r6\n\t"
  38822. "adc r5, r5, r11\n\t"
  38823. "adds r10, r10, r4\n\t"
  38824. "str r10, [%[a], #176]\n\t"
  38825. "adc r5, r5, #0\n\t"
  38826. /* a[i+45] += m[45] * mu */
  38827. "ldr r7, [%[m], #180]\n\t"
  38828. "ldr r10, [%[a], #180]\n\t"
  38829. "lsr r11, r7, #16\n\t"
  38830. "lsr r6, r8, #16\n\t"
  38831. "mul r4, r6, r11\n\t"
  38832. "lsl r11, r7, #16\n\t"
  38833. "lsr r11, r11, #16\n\t"
  38834. "mul r6, r11, r6\n\t"
  38835. "lsr r11, r6, #16\n\t"
  38836. "lsl r6, r6, #16\n\t"
  38837. "adds r10, r10, r6\n\t"
  38838. "adc r4, r4, r11\n\t"
  38839. "lsl r6, r8, #16\n\t"
  38840. "lsl r11, r7, #16\n\t"
  38841. "lsr r6, r6, #16\n\t"
  38842. "lsr r11, r11, #16\n\t"
  38843. "mul r11, r6, r11\n\t"
  38844. "adds r10, r10, r11\n\t"
  38845. "adc r4, r4, #0\n\t"
  38846. "lsr r11, r7, #16\n\t"
  38847. "mul r6, r11, r6\n\t"
  38848. "lsr r11, r6, #16\n\t"
  38849. "lsl r6, r6, #16\n\t"
  38850. "adds r10, r10, r6\n\t"
  38851. "adc r4, r4, r11\n\t"
  38852. "adds r10, r10, r5\n\t"
  38853. "str r10, [%[a], #180]\n\t"
  38854. "adc r4, r4, #0\n\t"
  38855. /* a[i+46] += m[46] * mu */
  38856. "ldr r7, [%[m], #184]\n\t"
  38857. "ldr r10, [%[a], #184]\n\t"
  38858. "lsr r11, r7, #16\n\t"
  38859. "lsr r6, r8, #16\n\t"
  38860. "mul r5, r6, r11\n\t"
  38861. "lsl r11, r7, #16\n\t"
  38862. "lsr r11, r11, #16\n\t"
  38863. "mul r6, r11, r6\n\t"
  38864. "lsr r11, r6, #16\n\t"
  38865. "lsl r6, r6, #16\n\t"
  38866. "adds r10, r10, r6\n\t"
  38867. "adc r5, r5, r11\n\t"
  38868. "lsl r6, r8, #16\n\t"
  38869. "lsl r11, r7, #16\n\t"
  38870. "lsr r6, r6, #16\n\t"
  38871. "lsr r11, r11, #16\n\t"
  38872. "mul r11, r6, r11\n\t"
  38873. "adds r10, r10, r11\n\t"
  38874. "adc r5, r5, #0\n\t"
  38875. "lsr r11, r7, #16\n\t"
  38876. "mul r6, r11, r6\n\t"
  38877. "lsr r11, r6, #16\n\t"
  38878. "lsl r6, r6, #16\n\t"
  38879. "adds r10, r10, r6\n\t"
  38880. "adc r5, r5, r11\n\t"
  38881. "adds r10, r10, r4\n\t"
  38882. "str r10, [%[a], #184]\n\t"
  38883. "adc r5, r5, #0\n\t"
  38884. /* a[i+47] += m[47] * mu */
  38885. "ldr r7, [%[m], #188]\n\t"
  38886. "ldr r10, [%[a], #188]\n\t"
  38887. "lsr r11, r7, #16\n\t"
  38888. "lsr r6, r8, #16\n\t"
  38889. "mul r4, r6, r11\n\t"
  38890. "lsl r11, r7, #16\n\t"
  38891. "lsr r11, r11, #16\n\t"
  38892. "mul r6, r11, r6\n\t"
  38893. "lsr r11, r6, #16\n\t"
  38894. "lsl r6, r6, #16\n\t"
  38895. "adds r10, r10, r6\n\t"
  38896. "adc r4, r4, r11\n\t"
  38897. "lsl r6, r8, #16\n\t"
  38898. "lsl r11, r7, #16\n\t"
  38899. "lsr r6, r6, #16\n\t"
  38900. "lsr r11, r11, #16\n\t"
  38901. "mul r11, r6, r11\n\t"
  38902. "adds r10, r10, r11\n\t"
  38903. "adc r4, r4, #0\n\t"
  38904. "lsr r11, r7, #16\n\t"
  38905. "mul r6, r11, r6\n\t"
  38906. "lsr r11, r6, #16\n\t"
  38907. "lsl r6, r6, #16\n\t"
  38908. "adds r10, r10, r6\n\t"
  38909. "adc r4, r4, r11\n\t"
  38910. "adds r10, r10, r5\n\t"
  38911. "str r10, [%[a], #188]\n\t"
  38912. "adc r4, r4, #0\n\t"
  38913. /* a[i+48] += m[48] * mu */
  38914. "ldr r7, [%[m], #192]\n\t"
  38915. "ldr r10, [%[a], #192]\n\t"
  38916. "lsr r11, r7, #16\n\t"
  38917. "lsr r6, r8, #16\n\t"
  38918. "mul r5, r6, r11\n\t"
  38919. "lsl r11, r7, #16\n\t"
  38920. "lsr r11, r11, #16\n\t"
  38921. "mul r6, r11, r6\n\t"
  38922. "lsr r11, r6, #16\n\t"
  38923. "lsl r6, r6, #16\n\t"
  38924. "adds r10, r10, r6\n\t"
  38925. "adc r5, r5, r11\n\t"
  38926. "lsl r6, r8, #16\n\t"
  38927. "lsl r11, r7, #16\n\t"
  38928. "lsr r6, r6, #16\n\t"
  38929. "lsr r11, r11, #16\n\t"
  38930. "mul r11, r6, r11\n\t"
  38931. "adds r10, r10, r11\n\t"
  38932. "adc r5, r5, #0\n\t"
  38933. "lsr r11, r7, #16\n\t"
  38934. "mul r6, r11, r6\n\t"
  38935. "lsr r11, r6, #16\n\t"
  38936. "lsl r6, r6, #16\n\t"
  38937. "adds r10, r10, r6\n\t"
  38938. "adc r5, r5, r11\n\t"
  38939. "adds r10, r10, r4\n\t"
  38940. "str r10, [%[a], #192]\n\t"
  38941. "adc r5, r5, #0\n\t"
  38942. /* a[i+49] += m[49] * mu */
  38943. "ldr r7, [%[m], #196]\n\t"
  38944. "ldr r10, [%[a], #196]\n\t"
  38945. "lsr r11, r7, #16\n\t"
  38946. "lsr r6, r8, #16\n\t"
  38947. "mul r4, r6, r11\n\t"
  38948. "lsl r11, r7, #16\n\t"
  38949. "lsr r11, r11, #16\n\t"
  38950. "mul r6, r11, r6\n\t"
  38951. "lsr r11, r6, #16\n\t"
  38952. "lsl r6, r6, #16\n\t"
  38953. "adds r10, r10, r6\n\t"
  38954. "adc r4, r4, r11\n\t"
  38955. "lsl r6, r8, #16\n\t"
  38956. "lsl r11, r7, #16\n\t"
  38957. "lsr r6, r6, #16\n\t"
  38958. "lsr r11, r11, #16\n\t"
  38959. "mul r11, r6, r11\n\t"
  38960. "adds r10, r10, r11\n\t"
  38961. "adc r4, r4, #0\n\t"
  38962. "lsr r11, r7, #16\n\t"
  38963. "mul r6, r11, r6\n\t"
  38964. "lsr r11, r6, #16\n\t"
  38965. "lsl r6, r6, #16\n\t"
  38966. "adds r10, r10, r6\n\t"
  38967. "adc r4, r4, r11\n\t"
  38968. "adds r10, r10, r5\n\t"
  38969. "str r10, [%[a], #196]\n\t"
  38970. "adc r4, r4, #0\n\t"
  38971. /* a[i+50] += m[50] * mu */
  38972. "ldr r7, [%[m], #200]\n\t"
  38973. "ldr r10, [%[a], #200]\n\t"
  38974. "lsr r11, r7, #16\n\t"
  38975. "lsr r6, r8, #16\n\t"
  38976. "mul r5, r6, r11\n\t"
  38977. "lsl r11, r7, #16\n\t"
  38978. "lsr r11, r11, #16\n\t"
  38979. "mul r6, r11, r6\n\t"
  38980. "lsr r11, r6, #16\n\t"
  38981. "lsl r6, r6, #16\n\t"
  38982. "adds r10, r10, r6\n\t"
  38983. "adc r5, r5, r11\n\t"
  38984. "lsl r6, r8, #16\n\t"
  38985. "lsl r11, r7, #16\n\t"
  38986. "lsr r6, r6, #16\n\t"
  38987. "lsr r11, r11, #16\n\t"
  38988. "mul r11, r6, r11\n\t"
  38989. "adds r10, r10, r11\n\t"
  38990. "adc r5, r5, #0\n\t"
  38991. "lsr r11, r7, #16\n\t"
  38992. "mul r6, r11, r6\n\t"
  38993. "lsr r11, r6, #16\n\t"
  38994. "lsl r6, r6, #16\n\t"
  38995. "adds r10, r10, r6\n\t"
  38996. "adc r5, r5, r11\n\t"
  38997. "adds r10, r10, r4\n\t"
  38998. "str r10, [%[a], #200]\n\t"
  38999. "adc r5, r5, #0\n\t"
  39000. /* a[i+51] += m[51] * mu */
  39001. "ldr r7, [%[m], #204]\n\t"
  39002. "ldr r10, [%[a], #204]\n\t"
  39003. "lsr r11, r7, #16\n\t"
  39004. "lsr r6, r8, #16\n\t"
  39005. "mul r4, r6, r11\n\t"
  39006. "lsl r11, r7, #16\n\t"
  39007. "lsr r11, r11, #16\n\t"
  39008. "mul r6, r11, r6\n\t"
  39009. "lsr r11, r6, #16\n\t"
  39010. "lsl r6, r6, #16\n\t"
  39011. "adds r10, r10, r6\n\t"
  39012. "adc r4, r4, r11\n\t"
  39013. "lsl r6, r8, #16\n\t"
  39014. "lsl r11, r7, #16\n\t"
  39015. "lsr r6, r6, #16\n\t"
  39016. "lsr r11, r11, #16\n\t"
  39017. "mul r11, r6, r11\n\t"
  39018. "adds r10, r10, r11\n\t"
  39019. "adc r4, r4, #0\n\t"
  39020. "lsr r11, r7, #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 r4, r4, r11\n\t"
  39026. "adds r10, r10, r5\n\t"
  39027. "str r10, [%[a], #204]\n\t"
  39028. "adc r4, r4, #0\n\t"
  39029. /* a[i+52] += m[52] * mu */
  39030. "ldr r7, [%[m], #208]\n\t"
  39031. "ldr r10, [%[a], #208]\n\t"
  39032. "lsr r11, r7, #16\n\t"
  39033. "lsr r6, r8, #16\n\t"
  39034. "mul r5, r6, r11\n\t"
  39035. "lsl r11, r7, #16\n\t"
  39036. "lsr r11, r11, #16\n\t"
  39037. "mul r6, r11, r6\n\t"
  39038. "lsr r11, r6, #16\n\t"
  39039. "lsl r6, r6, #16\n\t"
  39040. "adds r10, r10, r6\n\t"
  39041. "adc r5, r5, r11\n\t"
  39042. "lsl r6, r8, #16\n\t"
  39043. "lsl r11, r7, #16\n\t"
  39044. "lsr r6, r6, #16\n\t"
  39045. "lsr r11, r11, #16\n\t"
  39046. "mul r11, r6, r11\n\t"
  39047. "adds r10, r10, r11\n\t"
  39048. "adc r5, r5, #0\n\t"
  39049. "lsr r11, r7, #16\n\t"
  39050. "mul r6, r11, r6\n\t"
  39051. "lsr r11, r6, #16\n\t"
  39052. "lsl r6, r6, #16\n\t"
  39053. "adds r10, r10, r6\n\t"
  39054. "adc r5, r5, r11\n\t"
  39055. "adds r10, r10, r4\n\t"
  39056. "str r10, [%[a], #208]\n\t"
  39057. "adc r5, r5, #0\n\t"
  39058. /* a[i+53] += m[53] * mu */
  39059. "ldr r7, [%[m], #212]\n\t"
  39060. "ldr r10, [%[a], #212]\n\t"
  39061. "lsr r11, r7, #16\n\t"
  39062. "lsr r6, r8, #16\n\t"
  39063. "mul r4, r6, r11\n\t"
  39064. "lsl r11, r7, #16\n\t"
  39065. "lsr r11, r11, #16\n\t"
  39066. "mul r6, r11, r6\n\t"
  39067. "lsr r11, r6, #16\n\t"
  39068. "lsl r6, r6, #16\n\t"
  39069. "adds r10, r10, r6\n\t"
  39070. "adc r4, r4, r11\n\t"
  39071. "lsl r6, r8, #16\n\t"
  39072. "lsl r11, r7, #16\n\t"
  39073. "lsr r6, r6, #16\n\t"
  39074. "lsr r11, r11, #16\n\t"
  39075. "mul r11, r6, r11\n\t"
  39076. "adds r10, r10, r11\n\t"
  39077. "adc r4, r4, #0\n\t"
  39078. "lsr r11, r7, #16\n\t"
  39079. "mul r6, r11, r6\n\t"
  39080. "lsr r11, r6, #16\n\t"
  39081. "lsl r6, r6, #16\n\t"
  39082. "adds r10, r10, r6\n\t"
  39083. "adc r4, r4, r11\n\t"
  39084. "adds r10, r10, r5\n\t"
  39085. "str r10, [%[a], #212]\n\t"
  39086. "adc r4, r4, #0\n\t"
  39087. /* a[i+54] += m[54] * mu */
  39088. "ldr r7, [%[m], #216]\n\t"
  39089. "ldr r10, [%[a], #216]\n\t"
  39090. "lsr r11, r7, #16\n\t"
  39091. "lsr r6, r8, #16\n\t"
  39092. "mul r5, r6, r11\n\t"
  39093. "lsl r11, r7, #16\n\t"
  39094. "lsr r11, r11, #16\n\t"
  39095. "mul r6, r11, r6\n\t"
  39096. "lsr r11, r6, #16\n\t"
  39097. "lsl r6, r6, #16\n\t"
  39098. "adds r10, r10, r6\n\t"
  39099. "adc r5, r5, r11\n\t"
  39100. "lsl r6, r8, #16\n\t"
  39101. "lsl r11, r7, #16\n\t"
  39102. "lsr r6, r6, #16\n\t"
  39103. "lsr r11, r11, #16\n\t"
  39104. "mul r11, r6, r11\n\t"
  39105. "adds r10, r10, r11\n\t"
  39106. "adc r5, r5, #0\n\t"
  39107. "lsr r11, r7, #16\n\t"
  39108. "mul r6, r11, r6\n\t"
  39109. "lsr r11, r6, #16\n\t"
  39110. "lsl r6, r6, #16\n\t"
  39111. "adds r10, r10, r6\n\t"
  39112. "adc r5, r5, r11\n\t"
  39113. "adds r10, r10, r4\n\t"
  39114. "str r10, [%[a], #216]\n\t"
  39115. "adc r5, r5, #0\n\t"
  39116. /* a[i+55] += m[55] * mu */
  39117. "ldr r7, [%[m], #220]\n\t"
  39118. "ldr r10, [%[a], #220]\n\t"
  39119. "lsr r11, r7, #16\n\t"
  39120. "lsr r6, r8, #16\n\t"
  39121. "mul r4, r6, r11\n\t"
  39122. "lsl r11, r7, #16\n\t"
  39123. "lsr r11, r11, #16\n\t"
  39124. "mul r6, r11, r6\n\t"
  39125. "lsr r11, r6, #16\n\t"
  39126. "lsl r6, r6, #16\n\t"
  39127. "adds r10, r10, r6\n\t"
  39128. "adc r4, r4, r11\n\t"
  39129. "lsl r6, r8, #16\n\t"
  39130. "lsl r11, r7, #16\n\t"
  39131. "lsr r6, r6, #16\n\t"
  39132. "lsr r11, r11, #16\n\t"
  39133. "mul r11, r6, r11\n\t"
  39134. "adds r10, r10, r11\n\t"
  39135. "adc r4, r4, #0\n\t"
  39136. "lsr r11, r7, #16\n\t"
  39137. "mul r6, r11, r6\n\t"
  39138. "lsr r11, r6, #16\n\t"
  39139. "lsl r6, r6, #16\n\t"
  39140. "adds r10, r10, r6\n\t"
  39141. "adc r4, r4, r11\n\t"
  39142. "adds r10, r10, r5\n\t"
  39143. "str r10, [%[a], #220]\n\t"
  39144. "adc r4, r4, #0\n\t"
  39145. /* a[i+56] += m[56] * mu */
  39146. "ldr r7, [%[m], #224]\n\t"
  39147. "ldr r10, [%[a], #224]\n\t"
  39148. "lsr r11, r7, #16\n\t"
  39149. "lsr r6, r8, #16\n\t"
  39150. "mul r5, r6, r11\n\t"
  39151. "lsl r11, r7, #16\n\t"
  39152. "lsr r11, r11, #16\n\t"
  39153. "mul r6, r11, r6\n\t"
  39154. "lsr r11, r6, #16\n\t"
  39155. "lsl r6, r6, #16\n\t"
  39156. "adds r10, r10, r6\n\t"
  39157. "adc r5, r5, r11\n\t"
  39158. "lsl r6, r8, #16\n\t"
  39159. "lsl r11, r7, #16\n\t"
  39160. "lsr r6, r6, #16\n\t"
  39161. "lsr r11, r11, #16\n\t"
  39162. "mul r11, r6, r11\n\t"
  39163. "adds r10, r10, r11\n\t"
  39164. "adc r5, r5, #0\n\t"
  39165. "lsr r11, r7, #16\n\t"
  39166. "mul r6, r11, r6\n\t"
  39167. "lsr r11, r6, #16\n\t"
  39168. "lsl r6, r6, #16\n\t"
  39169. "adds r10, r10, r6\n\t"
  39170. "adc r5, r5, r11\n\t"
  39171. "adds r10, r10, r4\n\t"
  39172. "str r10, [%[a], #224]\n\t"
  39173. "adc r5, r5, #0\n\t"
  39174. /* a[i+57] += m[57] * mu */
  39175. "ldr r7, [%[m], #228]\n\t"
  39176. "ldr r10, [%[a], #228]\n\t"
  39177. "lsr r11, r7, #16\n\t"
  39178. "lsr r6, r8, #16\n\t"
  39179. "mul r4, r6, r11\n\t"
  39180. "lsl r11, r7, #16\n\t"
  39181. "lsr r11, r11, #16\n\t"
  39182. "mul r6, r11, r6\n\t"
  39183. "lsr r11, r6, #16\n\t"
  39184. "lsl r6, r6, #16\n\t"
  39185. "adds r10, r10, r6\n\t"
  39186. "adc r4, r4, r11\n\t"
  39187. "lsl r6, r8, #16\n\t"
  39188. "lsl r11, r7, #16\n\t"
  39189. "lsr r6, r6, #16\n\t"
  39190. "lsr r11, r11, #16\n\t"
  39191. "mul r11, r6, r11\n\t"
  39192. "adds r10, r10, r11\n\t"
  39193. "adc r4, r4, #0\n\t"
  39194. "lsr r11, r7, #16\n\t"
  39195. "mul r6, r11, r6\n\t"
  39196. "lsr r11, r6, #16\n\t"
  39197. "lsl r6, r6, #16\n\t"
  39198. "adds r10, r10, r6\n\t"
  39199. "adc r4, r4, r11\n\t"
  39200. "adds r10, r10, r5\n\t"
  39201. "str r10, [%[a], #228]\n\t"
  39202. "adc r4, r4, #0\n\t"
  39203. /* a[i+58] += m[58] * mu */
  39204. "ldr r7, [%[m], #232]\n\t"
  39205. "ldr r10, [%[a], #232]\n\t"
  39206. "lsr r11, r7, #16\n\t"
  39207. "lsr r6, r8, #16\n\t"
  39208. "mul r5, r6, r11\n\t"
  39209. "lsl r11, r7, #16\n\t"
  39210. "lsr r11, r11, #16\n\t"
  39211. "mul r6, r11, r6\n\t"
  39212. "lsr r11, r6, #16\n\t"
  39213. "lsl r6, r6, #16\n\t"
  39214. "adds r10, r10, r6\n\t"
  39215. "adc r5, r5, r11\n\t"
  39216. "lsl r6, r8, #16\n\t"
  39217. "lsl r11, r7, #16\n\t"
  39218. "lsr r6, r6, #16\n\t"
  39219. "lsr r11, r11, #16\n\t"
  39220. "mul r11, r6, r11\n\t"
  39221. "adds r10, r10, r11\n\t"
  39222. "adc r5, r5, #0\n\t"
  39223. "lsr r11, r7, #16\n\t"
  39224. "mul r6, r11, r6\n\t"
  39225. "lsr r11, r6, #16\n\t"
  39226. "lsl r6, r6, #16\n\t"
  39227. "adds r10, r10, r6\n\t"
  39228. "adc r5, r5, r11\n\t"
  39229. "adds r10, r10, r4\n\t"
  39230. "str r10, [%[a], #232]\n\t"
  39231. "adc r5, r5, #0\n\t"
  39232. /* a[i+59] += m[59] * mu */
  39233. "ldr r7, [%[m], #236]\n\t"
  39234. "ldr r10, [%[a], #236]\n\t"
  39235. "lsr r11, r7, #16\n\t"
  39236. "lsr r6, r8, #16\n\t"
  39237. "mul r4, r6, r11\n\t"
  39238. "lsl r11, r7, #16\n\t"
  39239. "lsr r11, r11, #16\n\t"
  39240. "mul r6, r11, r6\n\t"
  39241. "lsr r11, r6, #16\n\t"
  39242. "lsl r6, r6, #16\n\t"
  39243. "adds r10, r10, r6\n\t"
  39244. "adc r4, r4, r11\n\t"
  39245. "lsl r6, r8, #16\n\t"
  39246. "lsl r11, r7, #16\n\t"
  39247. "lsr r6, r6, #16\n\t"
  39248. "lsr r11, r11, #16\n\t"
  39249. "mul r11, r6, r11\n\t"
  39250. "adds r10, r10, r11\n\t"
  39251. "adc r4, r4, #0\n\t"
  39252. "lsr r11, r7, #16\n\t"
  39253. "mul r6, r11, r6\n\t"
  39254. "lsr r11, r6, #16\n\t"
  39255. "lsl r6, r6, #16\n\t"
  39256. "adds r10, r10, r6\n\t"
  39257. "adc r4, r4, r11\n\t"
  39258. "adds r10, r10, r5\n\t"
  39259. "str r10, [%[a], #236]\n\t"
  39260. "adc r4, r4, #0\n\t"
  39261. /* a[i+60] += m[60] * mu */
  39262. "ldr r7, [%[m], #240]\n\t"
  39263. "ldr r10, [%[a], #240]\n\t"
  39264. "lsr r11, r7, #16\n\t"
  39265. "lsr r6, r8, #16\n\t"
  39266. "mul r5, r6, r11\n\t"
  39267. "lsl r11, r7, #16\n\t"
  39268. "lsr r11, r11, #16\n\t"
  39269. "mul r6, r11, r6\n\t"
  39270. "lsr r11, r6, #16\n\t"
  39271. "lsl r6, r6, #16\n\t"
  39272. "adds r10, r10, r6\n\t"
  39273. "adc r5, r5, r11\n\t"
  39274. "lsl r6, r8, #16\n\t"
  39275. "lsl r11, r7, #16\n\t"
  39276. "lsr r6, r6, #16\n\t"
  39277. "lsr r11, r11, #16\n\t"
  39278. "mul r11, r6, r11\n\t"
  39279. "adds r10, r10, r11\n\t"
  39280. "adc r5, r5, #0\n\t"
  39281. "lsr r11, r7, #16\n\t"
  39282. "mul r6, r11, r6\n\t"
  39283. "lsr r11, r6, #16\n\t"
  39284. "lsl r6, r6, #16\n\t"
  39285. "adds r10, r10, r6\n\t"
  39286. "adc r5, r5, r11\n\t"
  39287. "adds r10, r10, r4\n\t"
  39288. "str r10, [%[a], #240]\n\t"
  39289. "adc r5, r5, #0\n\t"
  39290. /* a[i+61] += m[61] * mu */
  39291. "ldr r7, [%[m], #244]\n\t"
  39292. "ldr r10, [%[a], #244]\n\t"
  39293. "lsr r11, r7, #16\n\t"
  39294. "lsr r6, r8, #16\n\t"
  39295. "mul r4, r6, r11\n\t"
  39296. "lsl r11, r7, #16\n\t"
  39297. "lsr r11, r11, #16\n\t"
  39298. "mul r6, r11, r6\n\t"
  39299. "lsr r11, r6, #16\n\t"
  39300. "lsl r6, r6, #16\n\t"
  39301. "adds r10, r10, r6\n\t"
  39302. "adc r4, r4, r11\n\t"
  39303. "lsl r6, r8, #16\n\t"
  39304. "lsl r11, r7, #16\n\t"
  39305. "lsr r6, r6, #16\n\t"
  39306. "lsr r11, r11, #16\n\t"
  39307. "mul r11, r6, r11\n\t"
  39308. "adds r10, r10, r11\n\t"
  39309. "adc r4, r4, #0\n\t"
  39310. "lsr r11, r7, #16\n\t"
  39311. "mul r6, r11, r6\n\t"
  39312. "lsr r11, r6, #16\n\t"
  39313. "lsl r6, r6, #16\n\t"
  39314. "adds r10, r10, r6\n\t"
  39315. "adc r4, r4, r11\n\t"
  39316. "adds r10, r10, r5\n\t"
  39317. "str r10, [%[a], #244]\n\t"
  39318. "adc r4, r4, #0\n\t"
  39319. /* a[i+62] += m[62] * mu */
  39320. "ldr r7, [%[m], #248]\n\t"
  39321. "ldr r10, [%[a], #248]\n\t"
  39322. "lsr r11, r7, #16\n\t"
  39323. "lsr r6, r8, #16\n\t"
  39324. "mul r5, r6, r11\n\t"
  39325. "lsl r11, r7, #16\n\t"
  39326. "lsr r11, r11, #16\n\t"
  39327. "mul r6, r11, r6\n\t"
  39328. "lsr r11, r6, #16\n\t"
  39329. "lsl r6, r6, #16\n\t"
  39330. "adds r10, r10, r6\n\t"
  39331. "adc r5, r5, r11\n\t"
  39332. "lsl r6, r8, #16\n\t"
  39333. "lsl r11, r7, #16\n\t"
  39334. "lsr r6, r6, #16\n\t"
  39335. "lsr r11, r11, #16\n\t"
  39336. "mul r11, r6, r11\n\t"
  39337. "adds r10, r10, r11\n\t"
  39338. "adc r5, r5, #0\n\t"
  39339. "lsr r11, r7, #16\n\t"
  39340. "mul r6, r11, r6\n\t"
  39341. "lsr r11, r6, #16\n\t"
  39342. "lsl r6, r6, #16\n\t"
  39343. "adds r10, r10, r6\n\t"
  39344. "adc r5, r5, r11\n\t"
  39345. "adds r10, r10, r4\n\t"
  39346. "str r10, [%[a], #248]\n\t"
  39347. "adc r5, r5, #0\n\t"
  39348. /* a[i+63] += m[63] * mu */
  39349. "ldr r7, [%[m], #252]\n\t"
  39350. "ldr r10, [%[a], #252]\n\t"
  39351. "lsr r11, r7, #16\n\t"
  39352. "lsr r6, r8, #16\n\t"
  39353. "mul r4, r6, r11\n\t"
  39354. "lsl r11, r7, #16\n\t"
  39355. "lsr r11, r11, #16\n\t"
  39356. "mul r6, r11, r6\n\t"
  39357. "lsr r11, r6, #16\n\t"
  39358. "lsl r6, r6, #16\n\t"
  39359. "adds r10, r10, r6\n\t"
  39360. "adc r4, r4, r11\n\t"
  39361. "lsl r6, r8, #16\n\t"
  39362. "lsl r11, r7, #16\n\t"
  39363. "lsr r6, r6, #16\n\t"
  39364. "lsr r11, r11, #16\n\t"
  39365. "mul r11, r6, r11\n\t"
  39366. "adds r10, r10, r11\n\t"
  39367. "adc r4, r4, #0\n\t"
  39368. "lsr r11, r7, #16\n\t"
  39369. "mul r6, r11, r6\n\t"
  39370. "lsr r11, r6, #16\n\t"
  39371. "lsl r6, r6, #16\n\t"
  39372. "adds r10, r10, r6\n\t"
  39373. "adc r4, r4, r11\n\t"
  39374. "adds r10, r10, r5\n\t"
  39375. "str r10, [%[a], #252]\n\t"
  39376. "adc r4, r4, #0\n\t"
  39377. /* a[i+64] += m[64] * mu */
  39378. "ldr r7, [%[m], #256]\n\t"
  39379. "ldr r10, [%[a], #256]\n\t"
  39380. "lsr r11, r7, #16\n\t"
  39381. "lsr r6, r8, #16\n\t"
  39382. "mul r5, r6, r11\n\t"
  39383. "lsl r11, r7, #16\n\t"
  39384. "lsr r11, r11, #16\n\t"
  39385. "mul r6, r11, r6\n\t"
  39386. "lsr r11, r6, #16\n\t"
  39387. "lsl r6, r6, #16\n\t"
  39388. "adds r10, r10, r6\n\t"
  39389. "adc r5, r5, r11\n\t"
  39390. "lsl r6, r8, #16\n\t"
  39391. "lsl r11, r7, #16\n\t"
  39392. "lsr r6, r6, #16\n\t"
  39393. "lsr r11, r11, #16\n\t"
  39394. "mul r11, r6, r11\n\t"
  39395. "adds r10, r10, r11\n\t"
  39396. "adc r5, r5, #0\n\t"
  39397. "lsr r11, r7, #16\n\t"
  39398. "mul r6, r11, r6\n\t"
  39399. "lsr r11, r6, #16\n\t"
  39400. "lsl r6, r6, #16\n\t"
  39401. "adds r10, r10, r6\n\t"
  39402. "adc r5, r5, r11\n\t"
  39403. "adds r10, r10, r4\n\t"
  39404. "str r10, [%[a], #256]\n\t"
  39405. "adc r5, r5, #0\n\t"
  39406. /* a[i+65] += m[65] * mu */
  39407. "ldr r7, [%[m], #260]\n\t"
  39408. "ldr r10, [%[a], #260]\n\t"
  39409. "lsr r11, r7, #16\n\t"
  39410. "lsr r6, r8, #16\n\t"
  39411. "mul r4, r6, r11\n\t"
  39412. "lsl r11, r7, #16\n\t"
  39413. "lsr r11, r11, #16\n\t"
  39414. "mul r6, r11, r6\n\t"
  39415. "lsr r11, r6, #16\n\t"
  39416. "lsl r6, r6, #16\n\t"
  39417. "adds r10, r10, r6\n\t"
  39418. "adc r4, r4, r11\n\t"
  39419. "lsl r6, r8, #16\n\t"
  39420. "lsl r11, r7, #16\n\t"
  39421. "lsr r6, r6, #16\n\t"
  39422. "lsr r11, r11, #16\n\t"
  39423. "mul r11, r6, r11\n\t"
  39424. "adds r10, r10, r11\n\t"
  39425. "adc r4, r4, #0\n\t"
  39426. "lsr r11, r7, #16\n\t"
  39427. "mul r6, r11, r6\n\t"
  39428. "lsr r11, r6, #16\n\t"
  39429. "lsl r6, r6, #16\n\t"
  39430. "adds r10, r10, r6\n\t"
  39431. "adc r4, r4, r11\n\t"
  39432. "adds r10, r10, r5\n\t"
  39433. "str r10, [%[a], #260]\n\t"
  39434. "adc r4, r4, #0\n\t"
  39435. /* a[i+66] += m[66] * mu */
  39436. "ldr r7, [%[m], #264]\n\t"
  39437. "ldr r10, [%[a], #264]\n\t"
  39438. "lsr r11, r7, #16\n\t"
  39439. "lsr r6, r8, #16\n\t"
  39440. "mul r5, r6, r11\n\t"
  39441. "lsl r11, r7, #16\n\t"
  39442. "lsr r11, r11, #16\n\t"
  39443. "mul r6, r11, r6\n\t"
  39444. "lsr r11, r6, #16\n\t"
  39445. "lsl r6, r6, #16\n\t"
  39446. "adds r10, r10, r6\n\t"
  39447. "adc r5, r5, r11\n\t"
  39448. "lsl r6, r8, #16\n\t"
  39449. "lsl r11, r7, #16\n\t"
  39450. "lsr r6, r6, #16\n\t"
  39451. "lsr r11, r11, #16\n\t"
  39452. "mul r11, r6, r11\n\t"
  39453. "adds r10, r10, r11\n\t"
  39454. "adc r5, r5, #0\n\t"
  39455. "lsr r11, r7, #16\n\t"
  39456. "mul r6, r11, r6\n\t"
  39457. "lsr r11, r6, #16\n\t"
  39458. "lsl r6, r6, #16\n\t"
  39459. "adds r10, r10, r6\n\t"
  39460. "adc r5, r5, r11\n\t"
  39461. "adds r10, r10, r4\n\t"
  39462. "str r10, [%[a], #264]\n\t"
  39463. "adc r5, r5, #0\n\t"
  39464. /* a[i+67] += m[67] * mu */
  39465. "ldr r7, [%[m], #268]\n\t"
  39466. "ldr r10, [%[a], #268]\n\t"
  39467. "lsr r11, r7, #16\n\t"
  39468. "lsr r6, r8, #16\n\t"
  39469. "mul r4, r6, r11\n\t"
  39470. "lsl r11, r7, #16\n\t"
  39471. "lsr r11, r11, #16\n\t"
  39472. "mul r6, r11, r6\n\t"
  39473. "lsr r11, r6, #16\n\t"
  39474. "lsl r6, r6, #16\n\t"
  39475. "adds r10, r10, r6\n\t"
  39476. "adc r4, r4, r11\n\t"
  39477. "lsl r6, r8, #16\n\t"
  39478. "lsl r11, r7, #16\n\t"
  39479. "lsr r6, r6, #16\n\t"
  39480. "lsr r11, r11, #16\n\t"
  39481. "mul r11, r6, r11\n\t"
  39482. "adds r10, r10, r11\n\t"
  39483. "adc r4, r4, #0\n\t"
  39484. "lsr r11, r7, #16\n\t"
  39485. "mul r6, r11, r6\n\t"
  39486. "lsr r11, r6, #16\n\t"
  39487. "lsl r6, r6, #16\n\t"
  39488. "adds r10, r10, r6\n\t"
  39489. "adc r4, r4, r11\n\t"
  39490. "adds r10, r10, r5\n\t"
  39491. "str r10, [%[a], #268]\n\t"
  39492. "adc r4, r4, #0\n\t"
  39493. /* a[i+68] += m[68] * mu */
  39494. "ldr r7, [%[m], #272]\n\t"
  39495. "ldr r10, [%[a], #272]\n\t"
  39496. "lsr r11, r7, #16\n\t"
  39497. "lsr r6, r8, #16\n\t"
  39498. "mul r5, r6, r11\n\t"
  39499. "lsl r11, r7, #16\n\t"
  39500. "lsr r11, r11, #16\n\t"
  39501. "mul r6, r11, r6\n\t"
  39502. "lsr r11, r6, #16\n\t"
  39503. "lsl r6, r6, #16\n\t"
  39504. "adds r10, r10, r6\n\t"
  39505. "adc r5, r5, r11\n\t"
  39506. "lsl r6, r8, #16\n\t"
  39507. "lsl r11, r7, #16\n\t"
  39508. "lsr r6, r6, #16\n\t"
  39509. "lsr r11, r11, #16\n\t"
  39510. "mul r11, r6, r11\n\t"
  39511. "adds r10, r10, r11\n\t"
  39512. "adc r5, r5, #0\n\t"
  39513. "lsr r11, r7, #16\n\t"
  39514. "mul r6, r11, r6\n\t"
  39515. "lsr r11, r6, #16\n\t"
  39516. "lsl r6, r6, #16\n\t"
  39517. "adds r10, r10, r6\n\t"
  39518. "adc r5, r5, r11\n\t"
  39519. "adds r10, r10, r4\n\t"
  39520. "str r10, [%[a], #272]\n\t"
  39521. "adc r5, r5, #0\n\t"
  39522. /* a[i+69] += m[69] * mu */
  39523. "ldr r7, [%[m], #276]\n\t"
  39524. "ldr r10, [%[a], #276]\n\t"
  39525. "lsr r11, r7, #16\n\t"
  39526. "lsr r6, r8, #16\n\t"
  39527. "mul r4, r6, r11\n\t"
  39528. "lsl r11, r7, #16\n\t"
  39529. "lsr r11, r11, #16\n\t"
  39530. "mul r6, r11, r6\n\t"
  39531. "lsr r11, r6, #16\n\t"
  39532. "lsl r6, r6, #16\n\t"
  39533. "adds r10, r10, r6\n\t"
  39534. "adc r4, r4, r11\n\t"
  39535. "lsl r6, r8, #16\n\t"
  39536. "lsl r11, r7, #16\n\t"
  39537. "lsr r6, r6, #16\n\t"
  39538. "lsr r11, r11, #16\n\t"
  39539. "mul r11, r6, r11\n\t"
  39540. "adds r10, r10, r11\n\t"
  39541. "adc r4, r4, #0\n\t"
  39542. "lsr r11, r7, #16\n\t"
  39543. "mul r6, r11, r6\n\t"
  39544. "lsr r11, r6, #16\n\t"
  39545. "lsl r6, r6, #16\n\t"
  39546. "adds r10, r10, r6\n\t"
  39547. "adc r4, r4, r11\n\t"
  39548. "adds r10, r10, r5\n\t"
  39549. "str r10, [%[a], #276]\n\t"
  39550. "adc r4, r4, #0\n\t"
  39551. /* a[i+70] += m[70] * mu */
  39552. "ldr r7, [%[m], #280]\n\t"
  39553. "ldr r10, [%[a], #280]\n\t"
  39554. "lsr r11, r7, #16\n\t"
  39555. "lsr r6, r8, #16\n\t"
  39556. "mul r5, r6, r11\n\t"
  39557. "lsl r11, r7, #16\n\t"
  39558. "lsr r11, r11, #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 r5, r5, r11\n\t"
  39564. "lsl r6, r8, #16\n\t"
  39565. "lsl r11, r7, #16\n\t"
  39566. "lsr r6, r6, #16\n\t"
  39567. "lsr r11, r11, #16\n\t"
  39568. "mul r11, r6, r11\n\t"
  39569. "adds r10, r10, r11\n\t"
  39570. "adc r5, r5, #0\n\t"
  39571. "lsr r11, r7, #16\n\t"
  39572. "mul r6, r11, r6\n\t"
  39573. "lsr r11, r6, #16\n\t"
  39574. "lsl r6, r6, #16\n\t"
  39575. "adds r10, r10, r6\n\t"
  39576. "adc r5, r5, r11\n\t"
  39577. "adds r10, r10, r4\n\t"
  39578. "str r10, [%[a], #280]\n\t"
  39579. "adc r5, r5, #0\n\t"
  39580. /* a[i+71] += m[71] * mu */
  39581. "ldr r7, [%[m], #284]\n\t"
  39582. "ldr r10, [%[a], #284]\n\t"
  39583. "lsr r11, r7, #16\n\t"
  39584. "lsr r6, r8, #16\n\t"
  39585. "mul r4, r6, r11\n\t"
  39586. "lsl r11, r7, #16\n\t"
  39587. "lsr r11, r11, #16\n\t"
  39588. "mul r6, r11, r6\n\t"
  39589. "lsr r11, r6, #16\n\t"
  39590. "lsl r6, r6, #16\n\t"
  39591. "adds r10, r10, r6\n\t"
  39592. "adc r4, r4, r11\n\t"
  39593. "lsl r6, r8, #16\n\t"
  39594. "lsl r11, r7, #16\n\t"
  39595. "lsr r6, r6, #16\n\t"
  39596. "lsr r11, r11, #16\n\t"
  39597. "mul r11, r6, r11\n\t"
  39598. "adds r10, r10, r11\n\t"
  39599. "adc r4, r4, #0\n\t"
  39600. "lsr r11, r7, #16\n\t"
  39601. "mul r6, r11, r6\n\t"
  39602. "lsr r11, r6, #16\n\t"
  39603. "lsl r6, r6, #16\n\t"
  39604. "adds r10, r10, r6\n\t"
  39605. "adc r4, r4, r11\n\t"
  39606. "adds r10, r10, r5\n\t"
  39607. "str r10, [%[a], #284]\n\t"
  39608. "adc r4, r4, #0\n\t"
  39609. /* a[i+72] += m[72] * mu */
  39610. "ldr r7, [%[m], #288]\n\t"
  39611. "ldr r10, [%[a], #288]\n\t"
  39612. "lsr r11, r7, #16\n\t"
  39613. "lsr r6, r8, #16\n\t"
  39614. "mul r5, r6, r11\n\t"
  39615. "lsl r11, r7, #16\n\t"
  39616. "lsr r11, r11, #16\n\t"
  39617. "mul r6, r11, r6\n\t"
  39618. "lsr r11, r6, #16\n\t"
  39619. "lsl r6, r6, #16\n\t"
  39620. "adds r10, r10, r6\n\t"
  39621. "adc r5, r5, r11\n\t"
  39622. "lsl r6, r8, #16\n\t"
  39623. "lsl r11, r7, #16\n\t"
  39624. "lsr r6, r6, #16\n\t"
  39625. "lsr r11, r11, #16\n\t"
  39626. "mul r11, r6, r11\n\t"
  39627. "adds r10, r10, r11\n\t"
  39628. "adc r5, r5, #0\n\t"
  39629. "lsr r11, r7, #16\n\t"
  39630. "mul r6, r11, r6\n\t"
  39631. "lsr r11, r6, #16\n\t"
  39632. "lsl r6, r6, #16\n\t"
  39633. "adds r10, r10, r6\n\t"
  39634. "adc r5, r5, r11\n\t"
  39635. "adds r10, r10, r4\n\t"
  39636. "str r10, [%[a], #288]\n\t"
  39637. "adc r5, r5, #0\n\t"
  39638. /* a[i+73] += m[73] * mu */
  39639. "ldr r7, [%[m], #292]\n\t"
  39640. "ldr r10, [%[a], #292]\n\t"
  39641. "lsr r11, r7, #16\n\t"
  39642. "lsr r6, r8, #16\n\t"
  39643. "mul r4, r6, r11\n\t"
  39644. "lsl r11, r7, #16\n\t"
  39645. "lsr r11, r11, #16\n\t"
  39646. "mul r6, r11, r6\n\t"
  39647. "lsr r11, r6, #16\n\t"
  39648. "lsl r6, r6, #16\n\t"
  39649. "adds r10, r10, r6\n\t"
  39650. "adc r4, r4, r11\n\t"
  39651. "lsl r6, r8, #16\n\t"
  39652. "lsl r11, r7, #16\n\t"
  39653. "lsr r6, r6, #16\n\t"
  39654. "lsr r11, r11, #16\n\t"
  39655. "mul r11, r6, r11\n\t"
  39656. "adds r10, r10, r11\n\t"
  39657. "adc r4, r4, #0\n\t"
  39658. "lsr r11, r7, #16\n\t"
  39659. "mul r6, r11, r6\n\t"
  39660. "lsr r11, r6, #16\n\t"
  39661. "lsl r6, r6, #16\n\t"
  39662. "adds r10, r10, r6\n\t"
  39663. "adc r4, r4, r11\n\t"
  39664. "adds r10, r10, r5\n\t"
  39665. "str r10, [%[a], #292]\n\t"
  39666. "adc r4, r4, #0\n\t"
  39667. /* a[i+74] += m[74] * mu */
  39668. "ldr r7, [%[m], #296]\n\t"
  39669. "ldr r10, [%[a], #296]\n\t"
  39670. "lsr r11, r7, #16\n\t"
  39671. "lsr r6, r8, #16\n\t"
  39672. "mul r5, r6, r11\n\t"
  39673. "lsl r11, r7, #16\n\t"
  39674. "lsr r11, r11, #16\n\t"
  39675. "mul r6, r11, r6\n\t"
  39676. "lsr r11, r6, #16\n\t"
  39677. "lsl r6, r6, #16\n\t"
  39678. "adds r10, r10, r6\n\t"
  39679. "adc r5, r5, r11\n\t"
  39680. "lsl r6, r8, #16\n\t"
  39681. "lsl r11, r7, #16\n\t"
  39682. "lsr r6, r6, #16\n\t"
  39683. "lsr r11, r11, #16\n\t"
  39684. "mul r11, r6, r11\n\t"
  39685. "adds r10, r10, r11\n\t"
  39686. "adc r5, r5, #0\n\t"
  39687. "lsr r11, r7, #16\n\t"
  39688. "mul r6, r11, r6\n\t"
  39689. "lsr r11, r6, #16\n\t"
  39690. "lsl r6, r6, #16\n\t"
  39691. "adds r10, r10, r6\n\t"
  39692. "adc r5, r5, r11\n\t"
  39693. "adds r10, r10, r4\n\t"
  39694. "str r10, [%[a], #296]\n\t"
  39695. "adc r5, r5, #0\n\t"
  39696. /* a[i+75] += m[75] * mu */
  39697. "ldr r7, [%[m], #300]\n\t"
  39698. "ldr r10, [%[a], #300]\n\t"
  39699. "lsr r11, r7, #16\n\t"
  39700. "lsr r6, r8, #16\n\t"
  39701. "mul r4, r6, r11\n\t"
  39702. "lsl r11, r7, #16\n\t"
  39703. "lsr r11, r11, #16\n\t"
  39704. "mul r6, r11, r6\n\t"
  39705. "lsr r11, r6, #16\n\t"
  39706. "lsl r6, r6, #16\n\t"
  39707. "adds r10, r10, r6\n\t"
  39708. "adc r4, r4, r11\n\t"
  39709. "lsl r6, r8, #16\n\t"
  39710. "lsl r11, r7, #16\n\t"
  39711. "lsr r6, r6, #16\n\t"
  39712. "lsr r11, r11, #16\n\t"
  39713. "mul r11, r6, r11\n\t"
  39714. "adds r10, r10, r11\n\t"
  39715. "adc r4, r4, #0\n\t"
  39716. "lsr r11, r7, #16\n\t"
  39717. "mul r6, r11, r6\n\t"
  39718. "lsr r11, r6, #16\n\t"
  39719. "lsl r6, r6, #16\n\t"
  39720. "adds r10, r10, r6\n\t"
  39721. "adc r4, r4, r11\n\t"
  39722. "adds r10, r10, r5\n\t"
  39723. "str r10, [%[a], #300]\n\t"
  39724. "adc r4, r4, #0\n\t"
  39725. /* a[i+76] += m[76] * mu */
  39726. "ldr r7, [%[m], #304]\n\t"
  39727. "ldr r10, [%[a], #304]\n\t"
  39728. "lsr r11, r7, #16\n\t"
  39729. "lsr r6, r8, #16\n\t"
  39730. "mul r5, r6, r11\n\t"
  39731. "lsl r11, r7, #16\n\t"
  39732. "lsr r11, r11, #16\n\t"
  39733. "mul r6, r11, r6\n\t"
  39734. "lsr r11, r6, #16\n\t"
  39735. "lsl r6, r6, #16\n\t"
  39736. "adds r10, r10, r6\n\t"
  39737. "adc r5, r5, r11\n\t"
  39738. "lsl r6, r8, #16\n\t"
  39739. "lsl r11, r7, #16\n\t"
  39740. "lsr r6, r6, #16\n\t"
  39741. "lsr r11, r11, #16\n\t"
  39742. "mul r11, r6, r11\n\t"
  39743. "adds r10, r10, r11\n\t"
  39744. "adc r5, r5, #0\n\t"
  39745. "lsr r11, r7, #16\n\t"
  39746. "mul r6, r11, r6\n\t"
  39747. "lsr r11, r6, #16\n\t"
  39748. "lsl r6, r6, #16\n\t"
  39749. "adds r10, r10, r6\n\t"
  39750. "adc r5, r5, r11\n\t"
  39751. "adds r10, r10, r4\n\t"
  39752. "str r10, [%[a], #304]\n\t"
  39753. "adc r5, r5, #0\n\t"
  39754. /* a[i+77] += m[77] * mu */
  39755. "ldr r7, [%[m], #308]\n\t"
  39756. "ldr r10, [%[a], #308]\n\t"
  39757. "lsr r11, r7, #16\n\t"
  39758. "lsr r6, r8, #16\n\t"
  39759. "mul r4, r6, r11\n\t"
  39760. "lsl r11, r7, #16\n\t"
  39761. "lsr r11, r11, #16\n\t"
  39762. "mul r6, r11, r6\n\t"
  39763. "lsr r11, r6, #16\n\t"
  39764. "lsl r6, r6, #16\n\t"
  39765. "adds r10, r10, r6\n\t"
  39766. "adc r4, r4, r11\n\t"
  39767. "lsl r6, r8, #16\n\t"
  39768. "lsl r11, r7, #16\n\t"
  39769. "lsr r6, r6, #16\n\t"
  39770. "lsr r11, r11, #16\n\t"
  39771. "mul r11, r6, r11\n\t"
  39772. "adds r10, r10, r11\n\t"
  39773. "adc r4, r4, #0\n\t"
  39774. "lsr r11, r7, #16\n\t"
  39775. "mul r6, r11, r6\n\t"
  39776. "lsr r11, r6, #16\n\t"
  39777. "lsl r6, r6, #16\n\t"
  39778. "adds r10, r10, r6\n\t"
  39779. "adc r4, r4, r11\n\t"
  39780. "adds r10, r10, r5\n\t"
  39781. "str r10, [%[a], #308]\n\t"
  39782. "adc r4, r4, #0\n\t"
  39783. /* a[i+78] += m[78] * mu */
  39784. "ldr r7, [%[m], #312]\n\t"
  39785. "ldr r10, [%[a], #312]\n\t"
  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. "adds r10, r10, r4\n\t"
  39810. "str r10, [%[a], #312]\n\t"
  39811. "adc r5, r5, #0\n\t"
  39812. /* a[i+79] += m[79] * mu */
  39813. "ldr r7, [%[m], #316]\n\t"
  39814. "ldr r10, [%[a], #316]\n\t"
  39815. "lsr r11, r7, #16\n\t"
  39816. "lsr r6, r8, #16\n\t"
  39817. "mul r4, r6, r11\n\t"
  39818. "lsl r11, r7, #16\n\t"
  39819. "lsr r11, r11, #16\n\t"
  39820. "mul r6, r11, r6\n\t"
  39821. "lsr r11, r6, #16\n\t"
  39822. "lsl r6, r6, #16\n\t"
  39823. "adds r10, r10, r6\n\t"
  39824. "adc r4, r4, r11\n\t"
  39825. "lsl r6, r8, #16\n\t"
  39826. "lsl r11, r7, #16\n\t"
  39827. "lsr r6, r6, #16\n\t"
  39828. "lsr r11, r11, #16\n\t"
  39829. "mul r11, r6, r11\n\t"
  39830. "adds r10, r10, r11\n\t"
  39831. "adc r4, r4, #0\n\t"
  39832. "lsr r11, r7, #16\n\t"
  39833. "mul r6, r11, r6\n\t"
  39834. "lsr r11, r6, #16\n\t"
  39835. "lsl r6, r6, #16\n\t"
  39836. "adds r10, r10, r6\n\t"
  39837. "adc r4, r4, r11\n\t"
  39838. "adds r10, r10, r5\n\t"
  39839. "str r10, [%[a], #316]\n\t"
  39840. "adc r4, r4, #0\n\t"
  39841. /* a[i+80] += m[80] * mu */
  39842. "ldr r7, [%[m], #320]\n\t"
  39843. "ldr r10, [%[a], #320]\n\t"
  39844. "lsr r11, r7, #16\n\t"
  39845. "lsr r6, r8, #16\n\t"
  39846. "mul r5, r6, r11\n\t"
  39847. "lsl r11, r7, #16\n\t"
  39848. "lsr r11, r11, #16\n\t"
  39849. "mul r6, r11, r6\n\t"
  39850. "lsr r11, r6, #16\n\t"
  39851. "lsl r6, r6, #16\n\t"
  39852. "adds r10, r10, r6\n\t"
  39853. "adc r5, r5, r11\n\t"
  39854. "lsl r6, r8, #16\n\t"
  39855. "lsl r11, r7, #16\n\t"
  39856. "lsr r6, r6, #16\n\t"
  39857. "lsr r11, r11, #16\n\t"
  39858. "mul r11, r6, r11\n\t"
  39859. "adds r10, r10, r11\n\t"
  39860. "adc r5, r5, #0\n\t"
  39861. "lsr r11, r7, #16\n\t"
  39862. "mul r6, r11, r6\n\t"
  39863. "lsr r11, r6, #16\n\t"
  39864. "lsl r6, r6, #16\n\t"
  39865. "adds r10, r10, r6\n\t"
  39866. "adc r5, r5, r11\n\t"
  39867. "adds r10, r10, r4\n\t"
  39868. "str r10, [%[a], #320]\n\t"
  39869. "adc r5, r5, #0\n\t"
  39870. /* a[i+81] += m[81] * mu */
  39871. "ldr r7, [%[m], #324]\n\t"
  39872. "ldr r10, [%[a], #324]\n\t"
  39873. "lsr r11, r7, #16\n\t"
  39874. "lsr r6, r8, #16\n\t"
  39875. "mul r4, r6, r11\n\t"
  39876. "lsl r11, r7, #16\n\t"
  39877. "lsr r11, r11, #16\n\t"
  39878. "mul r6, r11, r6\n\t"
  39879. "lsr r11, r6, #16\n\t"
  39880. "lsl r6, r6, #16\n\t"
  39881. "adds r10, r10, r6\n\t"
  39882. "adc r4, r4, r11\n\t"
  39883. "lsl r6, r8, #16\n\t"
  39884. "lsl r11, r7, #16\n\t"
  39885. "lsr r6, r6, #16\n\t"
  39886. "lsr r11, r11, #16\n\t"
  39887. "mul r11, r6, r11\n\t"
  39888. "adds r10, r10, r11\n\t"
  39889. "adc r4, r4, #0\n\t"
  39890. "lsr r11, r7, #16\n\t"
  39891. "mul r6, r11, r6\n\t"
  39892. "lsr r11, r6, #16\n\t"
  39893. "lsl r6, r6, #16\n\t"
  39894. "adds r10, r10, r6\n\t"
  39895. "adc r4, r4, r11\n\t"
  39896. "adds r10, r10, r5\n\t"
  39897. "str r10, [%[a], #324]\n\t"
  39898. "adc r4, r4, #0\n\t"
  39899. /* a[i+82] += m[82] * mu */
  39900. "ldr r7, [%[m], #328]\n\t"
  39901. "ldr r10, [%[a], #328]\n\t"
  39902. "lsr r11, r7, #16\n\t"
  39903. "lsr r6, r8, #16\n\t"
  39904. "mul r5, r6, r11\n\t"
  39905. "lsl r11, r7, #16\n\t"
  39906. "lsr r11, r11, #16\n\t"
  39907. "mul r6, r11, r6\n\t"
  39908. "lsr r11, r6, #16\n\t"
  39909. "lsl r6, r6, #16\n\t"
  39910. "adds r10, r10, r6\n\t"
  39911. "adc r5, r5, r11\n\t"
  39912. "lsl r6, r8, #16\n\t"
  39913. "lsl r11, r7, #16\n\t"
  39914. "lsr r6, r6, #16\n\t"
  39915. "lsr r11, r11, #16\n\t"
  39916. "mul r11, r6, r11\n\t"
  39917. "adds r10, r10, r11\n\t"
  39918. "adc r5, r5, #0\n\t"
  39919. "lsr r11, r7, #16\n\t"
  39920. "mul r6, r11, r6\n\t"
  39921. "lsr r11, r6, #16\n\t"
  39922. "lsl r6, r6, #16\n\t"
  39923. "adds r10, r10, r6\n\t"
  39924. "adc r5, r5, r11\n\t"
  39925. "adds r10, r10, r4\n\t"
  39926. "str r10, [%[a], #328]\n\t"
  39927. "adc r5, r5, #0\n\t"
  39928. /* a[i+83] += m[83] * mu */
  39929. "ldr r7, [%[m], #332]\n\t"
  39930. "ldr r10, [%[a], #332]\n\t"
  39931. "lsr r11, r7, #16\n\t"
  39932. "lsr r6, r8, #16\n\t"
  39933. "mul r4, r6, r11\n\t"
  39934. "lsl r11, r7, #16\n\t"
  39935. "lsr r11, r11, #16\n\t"
  39936. "mul r6, r11, r6\n\t"
  39937. "lsr r11, r6, #16\n\t"
  39938. "lsl r6, r6, #16\n\t"
  39939. "adds r10, r10, r6\n\t"
  39940. "adc r4, r4, r11\n\t"
  39941. "lsl r6, r8, #16\n\t"
  39942. "lsl r11, r7, #16\n\t"
  39943. "lsr r6, r6, #16\n\t"
  39944. "lsr r11, r11, #16\n\t"
  39945. "mul r11, r6, r11\n\t"
  39946. "adds r10, r10, r11\n\t"
  39947. "adc r4, r4, #0\n\t"
  39948. "lsr r11, r7, #16\n\t"
  39949. "mul r6, r11, r6\n\t"
  39950. "lsr r11, r6, #16\n\t"
  39951. "lsl r6, r6, #16\n\t"
  39952. "adds r10, r10, r6\n\t"
  39953. "adc r4, r4, r11\n\t"
  39954. "adds r10, r10, r5\n\t"
  39955. "str r10, [%[a], #332]\n\t"
  39956. "adc r4, r4, #0\n\t"
  39957. /* a[i+84] += m[84] * mu */
  39958. "ldr r7, [%[m], #336]\n\t"
  39959. "ldr r10, [%[a], #336]\n\t"
  39960. "lsr r11, r7, #16\n\t"
  39961. "lsr r6, r8, #16\n\t"
  39962. "mul r5, r6, r11\n\t"
  39963. "lsl r11, r7, #16\n\t"
  39964. "lsr r11, r11, #16\n\t"
  39965. "mul r6, r11, r6\n\t"
  39966. "lsr r11, r6, #16\n\t"
  39967. "lsl r6, r6, #16\n\t"
  39968. "adds r10, r10, r6\n\t"
  39969. "adc r5, r5, r11\n\t"
  39970. "lsl r6, r8, #16\n\t"
  39971. "lsl r11, r7, #16\n\t"
  39972. "lsr r6, r6, #16\n\t"
  39973. "lsr r11, r11, #16\n\t"
  39974. "mul r11, r6, r11\n\t"
  39975. "adds r10, r10, r11\n\t"
  39976. "adc r5, r5, #0\n\t"
  39977. "lsr r11, r7, #16\n\t"
  39978. "mul r6, r11, r6\n\t"
  39979. "lsr r11, r6, #16\n\t"
  39980. "lsl r6, r6, #16\n\t"
  39981. "adds r10, r10, r6\n\t"
  39982. "adc r5, r5, r11\n\t"
  39983. "adds r10, r10, r4\n\t"
  39984. "str r10, [%[a], #336]\n\t"
  39985. "adc r5, r5, #0\n\t"
  39986. /* a[i+85] += m[85] * mu */
  39987. "ldr r7, [%[m], #340]\n\t"
  39988. "ldr r10, [%[a], #340]\n\t"
  39989. "lsr r11, r7, #16\n\t"
  39990. "lsr r6, r8, #16\n\t"
  39991. "mul r4, r6, r11\n\t"
  39992. "lsl r11, r7, #16\n\t"
  39993. "lsr r11, r11, #16\n\t"
  39994. "mul r6, r11, r6\n\t"
  39995. "lsr r11, r6, #16\n\t"
  39996. "lsl r6, r6, #16\n\t"
  39997. "adds r10, r10, r6\n\t"
  39998. "adc r4, r4, r11\n\t"
  39999. "lsl r6, r8, #16\n\t"
  40000. "lsl r11, r7, #16\n\t"
  40001. "lsr r6, r6, #16\n\t"
  40002. "lsr r11, r11, #16\n\t"
  40003. "mul r11, r6, r11\n\t"
  40004. "adds r10, r10, r11\n\t"
  40005. "adc r4, r4, #0\n\t"
  40006. "lsr r11, r7, #16\n\t"
  40007. "mul r6, r11, r6\n\t"
  40008. "lsr r11, r6, #16\n\t"
  40009. "lsl r6, r6, #16\n\t"
  40010. "adds r10, r10, r6\n\t"
  40011. "adc r4, r4, r11\n\t"
  40012. "adds r10, r10, r5\n\t"
  40013. "str r10, [%[a], #340]\n\t"
  40014. "adc r4, r4, #0\n\t"
  40015. /* a[i+86] += m[86] * mu */
  40016. "ldr r7, [%[m], #344]\n\t"
  40017. "ldr r10, [%[a], #344]\n\t"
  40018. "lsr r11, r7, #16\n\t"
  40019. "lsr r6, r8, #16\n\t"
  40020. "mul r5, r6, r11\n\t"
  40021. "lsl r11, r7, #16\n\t"
  40022. "lsr r11, r11, #16\n\t"
  40023. "mul r6, r11, r6\n\t"
  40024. "lsr r11, r6, #16\n\t"
  40025. "lsl r6, r6, #16\n\t"
  40026. "adds r10, r10, r6\n\t"
  40027. "adc r5, r5, r11\n\t"
  40028. "lsl r6, r8, #16\n\t"
  40029. "lsl r11, r7, #16\n\t"
  40030. "lsr r6, r6, #16\n\t"
  40031. "lsr r11, r11, #16\n\t"
  40032. "mul r11, r6, r11\n\t"
  40033. "adds r10, r10, r11\n\t"
  40034. "adc r5, r5, #0\n\t"
  40035. "lsr r11, r7, #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 r5, r5, r11\n\t"
  40041. "adds r10, r10, r4\n\t"
  40042. "str r10, [%[a], #344]\n\t"
  40043. "adc r5, r5, #0\n\t"
  40044. /* a[i+87] += m[87] * mu */
  40045. "ldr r7, [%[m], #348]\n\t"
  40046. "ldr r10, [%[a], #348]\n\t"
  40047. "lsr r11, r7, #16\n\t"
  40048. "lsr r6, r8, #16\n\t"
  40049. "mul r4, r6, r11\n\t"
  40050. "lsl r11, r7, #16\n\t"
  40051. "lsr r11, r11, #16\n\t"
  40052. "mul r6, r11, r6\n\t"
  40053. "lsr r11, r6, #16\n\t"
  40054. "lsl r6, r6, #16\n\t"
  40055. "adds r10, r10, r6\n\t"
  40056. "adc r4, r4, r11\n\t"
  40057. "lsl r6, r8, #16\n\t"
  40058. "lsl r11, r7, #16\n\t"
  40059. "lsr r6, r6, #16\n\t"
  40060. "lsr r11, r11, #16\n\t"
  40061. "mul r11, r6, r11\n\t"
  40062. "adds r10, r10, r11\n\t"
  40063. "adc r4, r4, #0\n\t"
  40064. "lsr r11, r7, #16\n\t"
  40065. "mul r6, r11, r6\n\t"
  40066. "lsr r11, r6, #16\n\t"
  40067. "lsl r6, r6, #16\n\t"
  40068. "adds r10, r10, r6\n\t"
  40069. "adc r4, r4, r11\n\t"
  40070. "adds r10, r10, r5\n\t"
  40071. "str r10, [%[a], #348]\n\t"
  40072. "adc r4, r4, #0\n\t"
  40073. /* a[i+88] += m[88] * mu */
  40074. "ldr r7, [%[m], #352]\n\t"
  40075. "ldr r10, [%[a], #352]\n\t"
  40076. "lsr r11, r7, #16\n\t"
  40077. "lsr r6, r8, #16\n\t"
  40078. "mul r5, r6, r11\n\t"
  40079. "lsl r11, r7, #16\n\t"
  40080. "lsr r11, r11, #16\n\t"
  40081. "mul r6, r11, r6\n\t"
  40082. "lsr r11, r6, #16\n\t"
  40083. "lsl r6, r6, #16\n\t"
  40084. "adds r10, r10, r6\n\t"
  40085. "adc r5, r5, r11\n\t"
  40086. "lsl r6, r8, #16\n\t"
  40087. "lsl r11, r7, #16\n\t"
  40088. "lsr r6, r6, #16\n\t"
  40089. "lsr r11, r11, #16\n\t"
  40090. "mul r11, r6, r11\n\t"
  40091. "adds r10, r10, r11\n\t"
  40092. "adc r5, r5, #0\n\t"
  40093. "lsr r11, r7, #16\n\t"
  40094. "mul r6, r11, r6\n\t"
  40095. "lsr r11, r6, #16\n\t"
  40096. "lsl r6, r6, #16\n\t"
  40097. "adds r10, r10, r6\n\t"
  40098. "adc r5, r5, r11\n\t"
  40099. "adds r10, r10, r4\n\t"
  40100. "str r10, [%[a], #352]\n\t"
  40101. "adc r5, r5, #0\n\t"
  40102. /* a[i+89] += m[89] * mu */
  40103. "ldr r7, [%[m], #356]\n\t"
  40104. "ldr r10, [%[a], #356]\n\t"
  40105. "lsr r11, r7, #16\n\t"
  40106. "lsr r6, r8, #16\n\t"
  40107. "mul r4, r6, r11\n\t"
  40108. "lsl r11, r7, #16\n\t"
  40109. "lsr r11, r11, #16\n\t"
  40110. "mul r6, r11, r6\n\t"
  40111. "lsr r11, r6, #16\n\t"
  40112. "lsl r6, r6, #16\n\t"
  40113. "adds r10, r10, r6\n\t"
  40114. "adc r4, r4, r11\n\t"
  40115. "lsl r6, r8, #16\n\t"
  40116. "lsl r11, r7, #16\n\t"
  40117. "lsr r6, r6, #16\n\t"
  40118. "lsr r11, r11, #16\n\t"
  40119. "mul r11, r6, r11\n\t"
  40120. "adds r10, r10, r11\n\t"
  40121. "adc r4, r4, #0\n\t"
  40122. "lsr r11, r7, #16\n\t"
  40123. "mul r6, r11, r6\n\t"
  40124. "lsr r11, r6, #16\n\t"
  40125. "lsl r6, r6, #16\n\t"
  40126. "adds r10, r10, r6\n\t"
  40127. "adc r4, r4, r11\n\t"
  40128. "adds r10, r10, r5\n\t"
  40129. "str r10, [%[a], #356]\n\t"
  40130. "adc r4, r4, #0\n\t"
  40131. /* a[i+90] += m[90] * mu */
  40132. "ldr r7, [%[m], #360]\n\t"
  40133. "ldr r10, [%[a], #360]\n\t"
  40134. "lsr r11, r7, #16\n\t"
  40135. "lsr r6, r8, #16\n\t"
  40136. "mul r5, r6, r11\n\t"
  40137. "lsl r11, r7, #16\n\t"
  40138. "lsr r11, r11, #16\n\t"
  40139. "mul r6, r11, r6\n\t"
  40140. "lsr r11, r6, #16\n\t"
  40141. "lsl r6, r6, #16\n\t"
  40142. "adds r10, r10, r6\n\t"
  40143. "adc r5, r5, r11\n\t"
  40144. "lsl r6, r8, #16\n\t"
  40145. "lsl r11, r7, #16\n\t"
  40146. "lsr r6, r6, #16\n\t"
  40147. "lsr r11, r11, #16\n\t"
  40148. "mul r11, r6, r11\n\t"
  40149. "adds r10, r10, r11\n\t"
  40150. "adc r5, r5, #0\n\t"
  40151. "lsr r11, r7, #16\n\t"
  40152. "mul r6, r11, r6\n\t"
  40153. "lsr r11, r6, #16\n\t"
  40154. "lsl r6, r6, #16\n\t"
  40155. "adds r10, r10, r6\n\t"
  40156. "adc r5, r5, r11\n\t"
  40157. "adds r10, r10, r4\n\t"
  40158. "str r10, [%[a], #360]\n\t"
  40159. "adc r5, r5, #0\n\t"
  40160. /* a[i+91] += m[91] * mu */
  40161. "ldr r7, [%[m], #364]\n\t"
  40162. "ldr r10, [%[a], #364]\n\t"
  40163. "lsr r11, r7, #16\n\t"
  40164. "lsr r6, r8, #16\n\t"
  40165. "mul r4, r6, r11\n\t"
  40166. "lsl r11, r7, #16\n\t"
  40167. "lsr r11, r11, #16\n\t"
  40168. "mul r6, r11, r6\n\t"
  40169. "lsr r11, r6, #16\n\t"
  40170. "lsl r6, r6, #16\n\t"
  40171. "adds r10, r10, r6\n\t"
  40172. "adc r4, r4, r11\n\t"
  40173. "lsl r6, r8, #16\n\t"
  40174. "lsl r11, r7, #16\n\t"
  40175. "lsr r6, r6, #16\n\t"
  40176. "lsr r11, r11, #16\n\t"
  40177. "mul r11, r6, r11\n\t"
  40178. "adds r10, r10, r11\n\t"
  40179. "adc r4, r4, #0\n\t"
  40180. "lsr r11, r7, #16\n\t"
  40181. "mul r6, r11, r6\n\t"
  40182. "lsr r11, r6, #16\n\t"
  40183. "lsl r6, r6, #16\n\t"
  40184. "adds r10, r10, r6\n\t"
  40185. "adc r4, r4, r11\n\t"
  40186. "adds r10, r10, r5\n\t"
  40187. "str r10, [%[a], #364]\n\t"
  40188. "adc r4, r4, #0\n\t"
  40189. /* a[i+92] += m[92] * mu */
  40190. "ldr r7, [%[m], #368]\n\t"
  40191. "ldr r10, [%[a], #368]\n\t"
  40192. "lsr r11, r7, #16\n\t"
  40193. "lsr r6, r8, #16\n\t"
  40194. "mul r5, r6, r11\n\t"
  40195. "lsl r11, r7, #16\n\t"
  40196. "lsr r11, r11, #16\n\t"
  40197. "mul r6, r11, r6\n\t"
  40198. "lsr r11, r6, #16\n\t"
  40199. "lsl r6, r6, #16\n\t"
  40200. "adds r10, r10, r6\n\t"
  40201. "adc r5, r5, r11\n\t"
  40202. "lsl r6, r8, #16\n\t"
  40203. "lsl r11, r7, #16\n\t"
  40204. "lsr r6, r6, #16\n\t"
  40205. "lsr r11, r11, #16\n\t"
  40206. "mul r11, r6, r11\n\t"
  40207. "adds r10, r10, r11\n\t"
  40208. "adc r5, r5, #0\n\t"
  40209. "lsr r11, r7, #16\n\t"
  40210. "mul r6, r11, r6\n\t"
  40211. "lsr r11, r6, #16\n\t"
  40212. "lsl r6, r6, #16\n\t"
  40213. "adds r10, r10, r6\n\t"
  40214. "adc r5, r5, r11\n\t"
  40215. "adds r10, r10, r4\n\t"
  40216. "str r10, [%[a], #368]\n\t"
  40217. "adc r5, r5, #0\n\t"
  40218. /* a[i+93] += m[93] * mu */
  40219. "ldr r7, [%[m], #372]\n\t"
  40220. "ldr r10, [%[a], #372]\n\t"
  40221. "lsr r11, r7, #16\n\t"
  40222. "lsr r6, r8, #16\n\t"
  40223. "mul r4, r6, r11\n\t"
  40224. "lsl r11, r7, #16\n\t"
  40225. "lsr r11, r11, #16\n\t"
  40226. "mul r6, r11, r6\n\t"
  40227. "lsr r11, r6, #16\n\t"
  40228. "lsl r6, r6, #16\n\t"
  40229. "adds r10, r10, r6\n\t"
  40230. "adc r4, r4, r11\n\t"
  40231. "lsl r6, r8, #16\n\t"
  40232. "lsl r11, r7, #16\n\t"
  40233. "lsr r6, r6, #16\n\t"
  40234. "lsr r11, r11, #16\n\t"
  40235. "mul r11, r6, r11\n\t"
  40236. "adds r10, r10, r11\n\t"
  40237. "adc r4, r4, #0\n\t"
  40238. "lsr r11, r7, #16\n\t"
  40239. "mul r6, r11, r6\n\t"
  40240. "lsr r11, r6, #16\n\t"
  40241. "lsl r6, r6, #16\n\t"
  40242. "adds r10, r10, r6\n\t"
  40243. "adc r4, r4, r11\n\t"
  40244. "adds r10, r10, r5\n\t"
  40245. "str r10, [%[a], #372]\n\t"
  40246. "adc r4, r4, #0\n\t"
  40247. /* a[i+94] += m[94] * mu */
  40248. "ldr r7, [%[m], #376]\n\t"
  40249. "ldr r10, [%[a], #376]\n\t"
  40250. "lsr r11, r7, #16\n\t"
  40251. "lsr r6, r8, #16\n\t"
  40252. "mul r5, r6, r11\n\t"
  40253. "lsl r11, r7, #16\n\t"
  40254. "lsr r11, r11, #16\n\t"
  40255. "mul r6, r11, r6\n\t"
  40256. "lsr r11, r6, #16\n\t"
  40257. "lsl r6, r6, #16\n\t"
  40258. "adds r10, r10, r6\n\t"
  40259. "adc r5, r5, r11\n\t"
  40260. "lsl r6, r8, #16\n\t"
  40261. "lsl r11, r7, #16\n\t"
  40262. "lsr r6, r6, #16\n\t"
  40263. "lsr r11, r11, #16\n\t"
  40264. "mul r11, r6, r11\n\t"
  40265. "adds r10, r10, r11\n\t"
  40266. "adc r5, r5, #0\n\t"
  40267. "lsr r11, r7, #16\n\t"
  40268. "mul r6, r11, r6\n\t"
  40269. "lsr r11, r6, #16\n\t"
  40270. "lsl r6, r6, #16\n\t"
  40271. "adds r10, r10, r6\n\t"
  40272. "adc r5, r5, r11\n\t"
  40273. "adds r10, r10, r4\n\t"
  40274. "str r10, [%[a], #376]\n\t"
  40275. "adc r5, r5, #0\n\t"
  40276. /* a[i+95] += m[95] * mu */
  40277. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  40278. "ldr r11, [%[m], #380]\n\t"
  40279. #else
  40280. "ldr r7, [%[m], #380]\n\t"
  40281. #endif
  40282. "ldr r10, [%[a], #380]\n\t"
  40283. "lsl r6, r8, #16\n\t"
  40284. "lsl r7, r11, #16\n\t"
  40285. "lsr r6, r6, #16\n\t"
  40286. "lsr r7, r7, #16\n\t"
  40287. "mul r7, r6, r7\n\t"
  40288. "adds r5, r5, r7\n\t"
  40289. "adcs r4, r3, #0\n\t"
  40290. "mov r3, #0\n\t"
  40291. "adc r3, r3, r3\n\t"
  40292. "lsr r7, r11, #16\n\t"
  40293. "mul r6, r7, r6\n\t"
  40294. "lsr r7, r6, #16\n\t"
  40295. "lsl r6, r6, #16\n\t"
  40296. "adds r5, r5, r6\n\t"
  40297. "adcs r4, r4, r7\n\t"
  40298. "adc r3, r3, #0\n\t"
  40299. "mov r6, r8\n\t"
  40300. "lsr r7, r11, #16\n\t"
  40301. "lsr r6, r6, #16\n\t"
  40302. "mul r7, r6, r7\n\t"
  40303. "adds r4, r4, r7\n\t"
  40304. "lsl r7, r11, #16\n\t"
  40305. "adc r3, r3, #0\n\t"
  40306. "lsr r7, r7, #16\n\t"
  40307. "mul r6, r7, r6\n\t"
  40308. "lsr r7, r6, #16\n\t"
  40309. "lsl r6, r6, #16\n\t"
  40310. "adds r5, r5, r6\n\t"
  40311. "adcs r4, r4, r7\n\t"
  40312. "adc r3, r3, #0\n\t"
  40313. "adds r10, r10, r5\n\t"
  40314. "str r10, [%[a], #380]\n\t"
  40315. "ldr r10, [%[a], #384]\n\t"
  40316. "adcs r10, r10, r4\n\t"
  40317. "str r10, [%[a], #384]\n\t"
  40318. "adc r3, r3, #0\n\t"
  40319. /* i += 1 */
  40320. "add r9, r9, #4\n\t"
  40321. "add %[a], %[a], #4\n\t"
  40322. "cmp r9, #0x180\n\t"
  40323. "blt L_sp_3072_mont_reduce_96_word_%=\n\t"
  40324. /* Loop Done */
  40325. "str r12, [%[a]]\n\t"
  40326. "str lr, [%[a], #4]\n\t"
  40327. "mov %[mp], r3\n\t"
  40328. : [a] "+r" (a), [m] "+r" (m), [mp] "+r" (mp)
  40329. :
  40330. : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "cc"
  40331. );
  40332. sp_3072_cond_sub_96(a - 96, a, m, (sp_digit)0 - mp);
  40333. }
  40334. #elif defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  40335. /* Reduce the number back to 3072 bits using Montgomery reduction.
  40336. *
  40337. * a A single precision number to reduce in place.
  40338. * m The single precision number representing the modulus.
  40339. * mp The digit representing the negative inverse of m mod 2^n.
  40340. */
  40341. static SP_NOINLINE void sp_3072_mont_reduce_96(sp_digit* a_p, const sp_digit* m_p, sp_digit mp_p)
  40342. {
  40343. register sp_digit* a asm ("r0") = (sp_digit*)a_p;
  40344. register const sp_digit* m asm ("r1") = (const sp_digit*)m_p;
  40345. register sp_digit mp asm ("r2") = (sp_digit)mp_p;
  40346. __asm__ __volatile__ (
  40347. "ldr r11, [%[m]]\n\t"
  40348. /* i = 0 */
  40349. "mov r9, #0\n\t"
  40350. "mov r3, #0\n\t"
  40351. "ldr r12, [%[a]]\n\t"
  40352. "ldr lr, [%[a], #4]\n\t"
  40353. "\n"
  40354. "L_sp_3072_mont_reduce_96_word_%=: \n\t"
  40355. /* mu = a[i] * mp */
  40356. "mul r8, %[mp], r12\n\t"
  40357. /* a[i+0] += m[0] * mu */
  40358. "mov r5, #0\n\t"
  40359. "umlal r12, r5, r8, r11\n\t"
  40360. /* a[i+1] += m[1] * mu */
  40361. "ldr r7, [%[m], #4]\n\t"
  40362. "mov r4, #0\n\t"
  40363. "umlal lr, r4, r8, r7\n\t"
  40364. "mov r12, lr\n\t"
  40365. "adds r12, r12, r5\n\t"
  40366. "adc r4, r4, #0\n\t"
  40367. /* a[i+2] += m[2] * mu */
  40368. "ldr r7, [%[m], #8]\n\t"
  40369. "ldr lr, [%[a], #8]\n\t"
  40370. "mov r5, #0\n\t"
  40371. "umlal lr, r5, r8, r7\n\t"
  40372. "adds lr, lr, r4\n\t"
  40373. "adc r5, r5, #0\n\t"
  40374. /* a[i+3] += m[3] * mu */
  40375. "ldr r7, [%[m], #12]\n\t"
  40376. "ldr r10, [%[a], #12]\n\t"
  40377. "mov r4, #0\n\t"
  40378. "umlal r10, r4, r8, r7\n\t"
  40379. "adds r10, r10, r5\n\t"
  40380. "str r10, [%[a], #12]\n\t"
  40381. "adc r4, r4, #0\n\t"
  40382. /* a[i+4] += m[4] * mu */
  40383. "ldr r7, [%[m], #16]\n\t"
  40384. "ldr r10, [%[a], #16]\n\t"
  40385. "mov r5, #0\n\t"
  40386. "umlal r10, r5, r8, r7\n\t"
  40387. "adds r10, r10, r4\n\t"
  40388. "str r10, [%[a], #16]\n\t"
  40389. "adc r5, r5, #0\n\t"
  40390. /* a[i+5] += m[5] * mu */
  40391. "ldr r7, [%[m], #20]\n\t"
  40392. "ldr r10, [%[a], #20]\n\t"
  40393. "mov r4, #0\n\t"
  40394. "umlal r10, r4, r8, r7\n\t"
  40395. "adds r10, r10, r5\n\t"
  40396. "str r10, [%[a], #20]\n\t"
  40397. "adc r4, r4, #0\n\t"
  40398. /* a[i+6] += m[6] * mu */
  40399. "ldr r7, [%[m], #24]\n\t"
  40400. "ldr r10, [%[a], #24]\n\t"
  40401. "mov r5, #0\n\t"
  40402. "umlal r10, r5, r8, r7\n\t"
  40403. "adds r10, r10, r4\n\t"
  40404. "str r10, [%[a], #24]\n\t"
  40405. "adc r5, r5, #0\n\t"
  40406. /* a[i+7] += m[7] * mu */
  40407. "ldr r7, [%[m], #28]\n\t"
  40408. "ldr r10, [%[a], #28]\n\t"
  40409. "mov r4, #0\n\t"
  40410. "umlal r10, r4, r8, r7\n\t"
  40411. "adds r10, r10, r5\n\t"
  40412. "str r10, [%[a], #28]\n\t"
  40413. "adc r4, r4, #0\n\t"
  40414. /* a[i+8] += m[8] * mu */
  40415. "ldr r7, [%[m], #32]\n\t"
  40416. "ldr r10, [%[a], #32]\n\t"
  40417. "mov r5, #0\n\t"
  40418. "umlal r10, r5, r8, r7\n\t"
  40419. "adds r10, r10, r4\n\t"
  40420. "str r10, [%[a], #32]\n\t"
  40421. "adc r5, r5, #0\n\t"
  40422. /* a[i+9] += m[9] * mu */
  40423. "ldr r7, [%[m], #36]\n\t"
  40424. "ldr r10, [%[a], #36]\n\t"
  40425. "mov r4, #0\n\t"
  40426. "umlal r10, r4, r8, r7\n\t"
  40427. "adds r10, r10, r5\n\t"
  40428. "str r10, [%[a], #36]\n\t"
  40429. "adc r4, r4, #0\n\t"
  40430. /* a[i+10] += m[10] * mu */
  40431. "ldr r7, [%[m], #40]\n\t"
  40432. "ldr r10, [%[a], #40]\n\t"
  40433. "mov r5, #0\n\t"
  40434. "umlal r10, r5, r8, r7\n\t"
  40435. "adds r10, r10, r4\n\t"
  40436. "str r10, [%[a], #40]\n\t"
  40437. "adc r5, r5, #0\n\t"
  40438. /* a[i+11] += m[11] * mu */
  40439. "ldr r7, [%[m], #44]\n\t"
  40440. "ldr r10, [%[a], #44]\n\t"
  40441. "mov r4, #0\n\t"
  40442. "umlal r10, r4, r8, r7\n\t"
  40443. "adds r10, r10, r5\n\t"
  40444. "str r10, [%[a], #44]\n\t"
  40445. "adc r4, r4, #0\n\t"
  40446. /* a[i+12] += m[12] * mu */
  40447. "ldr r7, [%[m], #48]\n\t"
  40448. "ldr r10, [%[a], #48]\n\t"
  40449. "mov r5, #0\n\t"
  40450. "umlal r10, r5, r8, r7\n\t"
  40451. "adds r10, r10, r4\n\t"
  40452. "str r10, [%[a], #48]\n\t"
  40453. "adc r5, r5, #0\n\t"
  40454. /* a[i+13] += m[13] * mu */
  40455. "ldr r7, [%[m], #52]\n\t"
  40456. "ldr r10, [%[a], #52]\n\t"
  40457. "mov r4, #0\n\t"
  40458. "umlal r10, r4, r8, r7\n\t"
  40459. "adds r10, r10, r5\n\t"
  40460. "str r10, [%[a], #52]\n\t"
  40461. "adc r4, r4, #0\n\t"
  40462. /* a[i+14] += m[14] * mu */
  40463. "ldr r7, [%[m], #56]\n\t"
  40464. "ldr r10, [%[a], #56]\n\t"
  40465. "mov r5, #0\n\t"
  40466. "umlal r10, r5, r8, r7\n\t"
  40467. "adds r10, r10, r4\n\t"
  40468. "str r10, [%[a], #56]\n\t"
  40469. "adc r5, r5, #0\n\t"
  40470. /* a[i+15] += m[15] * mu */
  40471. "ldr r7, [%[m], #60]\n\t"
  40472. "ldr r10, [%[a], #60]\n\t"
  40473. "mov r4, #0\n\t"
  40474. "umlal r10, r4, r8, r7\n\t"
  40475. "adds r10, r10, r5\n\t"
  40476. "str r10, [%[a], #60]\n\t"
  40477. "adc r4, r4, #0\n\t"
  40478. /* a[i+16] += m[16] * mu */
  40479. "ldr r7, [%[m], #64]\n\t"
  40480. "ldr r10, [%[a], #64]\n\t"
  40481. "mov r5, #0\n\t"
  40482. "umlal r10, r5, r8, r7\n\t"
  40483. "adds r10, r10, r4\n\t"
  40484. "str r10, [%[a], #64]\n\t"
  40485. "adc r5, r5, #0\n\t"
  40486. /* a[i+17] += m[17] * mu */
  40487. "ldr r7, [%[m], #68]\n\t"
  40488. "ldr r10, [%[a], #68]\n\t"
  40489. "mov r4, #0\n\t"
  40490. "umlal r10, r4, r8, r7\n\t"
  40491. "adds r10, r10, r5\n\t"
  40492. "str r10, [%[a], #68]\n\t"
  40493. "adc r4, r4, #0\n\t"
  40494. /* a[i+18] += m[18] * mu */
  40495. "ldr r7, [%[m], #72]\n\t"
  40496. "ldr r10, [%[a], #72]\n\t"
  40497. "mov r5, #0\n\t"
  40498. "umlal r10, r5, r8, r7\n\t"
  40499. "adds r10, r10, r4\n\t"
  40500. "str r10, [%[a], #72]\n\t"
  40501. "adc r5, r5, #0\n\t"
  40502. /* a[i+19] += m[19] * mu */
  40503. "ldr r7, [%[m], #76]\n\t"
  40504. "ldr r10, [%[a], #76]\n\t"
  40505. "mov r4, #0\n\t"
  40506. "umlal r10, r4, r8, r7\n\t"
  40507. "adds r10, r10, r5\n\t"
  40508. "str r10, [%[a], #76]\n\t"
  40509. "adc r4, r4, #0\n\t"
  40510. /* a[i+20] += m[20] * mu */
  40511. "ldr r7, [%[m], #80]\n\t"
  40512. "ldr r10, [%[a], #80]\n\t"
  40513. "mov r5, #0\n\t"
  40514. "umlal r10, r5, r8, r7\n\t"
  40515. "adds r10, r10, r4\n\t"
  40516. "str r10, [%[a], #80]\n\t"
  40517. "adc r5, r5, #0\n\t"
  40518. /* a[i+21] += m[21] * mu */
  40519. "ldr r7, [%[m], #84]\n\t"
  40520. "ldr r10, [%[a], #84]\n\t"
  40521. "mov r4, #0\n\t"
  40522. "umlal r10, r4, r8, r7\n\t"
  40523. "adds r10, r10, r5\n\t"
  40524. "str r10, [%[a], #84]\n\t"
  40525. "adc r4, r4, #0\n\t"
  40526. /* a[i+22] += m[22] * mu */
  40527. "ldr r7, [%[m], #88]\n\t"
  40528. "ldr r10, [%[a], #88]\n\t"
  40529. "mov r5, #0\n\t"
  40530. "umlal r10, r5, r8, r7\n\t"
  40531. "adds r10, r10, r4\n\t"
  40532. "str r10, [%[a], #88]\n\t"
  40533. "adc r5, r5, #0\n\t"
  40534. /* a[i+23] += m[23] * mu */
  40535. "ldr r7, [%[m], #92]\n\t"
  40536. "ldr r10, [%[a], #92]\n\t"
  40537. "mov r4, #0\n\t"
  40538. "umlal r10, r4, r8, r7\n\t"
  40539. "adds r10, r10, r5\n\t"
  40540. "str r10, [%[a], #92]\n\t"
  40541. "adc r4, r4, #0\n\t"
  40542. /* a[i+24] += m[24] * mu */
  40543. "ldr r7, [%[m], #96]\n\t"
  40544. "ldr r10, [%[a], #96]\n\t"
  40545. "mov r5, #0\n\t"
  40546. "umlal r10, r5, r8, r7\n\t"
  40547. "adds r10, r10, r4\n\t"
  40548. "str r10, [%[a], #96]\n\t"
  40549. "adc r5, r5, #0\n\t"
  40550. /* a[i+25] += m[25] * mu */
  40551. "ldr r7, [%[m], #100]\n\t"
  40552. "ldr r10, [%[a], #100]\n\t"
  40553. "mov r4, #0\n\t"
  40554. "umlal r10, r4, r8, r7\n\t"
  40555. "adds r10, r10, r5\n\t"
  40556. "str r10, [%[a], #100]\n\t"
  40557. "adc r4, r4, #0\n\t"
  40558. /* a[i+26] += m[26] * mu */
  40559. "ldr r7, [%[m], #104]\n\t"
  40560. "ldr r10, [%[a], #104]\n\t"
  40561. "mov r5, #0\n\t"
  40562. "umlal r10, r5, r8, r7\n\t"
  40563. "adds r10, r10, r4\n\t"
  40564. "str r10, [%[a], #104]\n\t"
  40565. "adc r5, r5, #0\n\t"
  40566. /* a[i+27] += m[27] * mu */
  40567. "ldr r7, [%[m], #108]\n\t"
  40568. "ldr r10, [%[a], #108]\n\t"
  40569. "mov r4, #0\n\t"
  40570. "umlal r10, r4, r8, r7\n\t"
  40571. "adds r10, r10, r5\n\t"
  40572. "str r10, [%[a], #108]\n\t"
  40573. "adc r4, r4, #0\n\t"
  40574. /* a[i+28] += m[28] * mu */
  40575. "ldr r7, [%[m], #112]\n\t"
  40576. "ldr r10, [%[a], #112]\n\t"
  40577. "mov r5, #0\n\t"
  40578. "umlal r10, r5, r8, r7\n\t"
  40579. "adds r10, r10, r4\n\t"
  40580. "str r10, [%[a], #112]\n\t"
  40581. "adc r5, r5, #0\n\t"
  40582. /* a[i+29] += m[29] * mu */
  40583. "ldr r7, [%[m], #116]\n\t"
  40584. "ldr r10, [%[a], #116]\n\t"
  40585. "mov r4, #0\n\t"
  40586. "umlal r10, r4, r8, r7\n\t"
  40587. "adds r10, r10, r5\n\t"
  40588. "str r10, [%[a], #116]\n\t"
  40589. "adc r4, r4, #0\n\t"
  40590. /* a[i+30] += m[30] * mu */
  40591. "ldr r7, [%[m], #120]\n\t"
  40592. "ldr r10, [%[a], #120]\n\t"
  40593. "mov r5, #0\n\t"
  40594. "umlal r10, r5, r8, r7\n\t"
  40595. "adds r10, r10, r4\n\t"
  40596. "str r10, [%[a], #120]\n\t"
  40597. "adc r5, r5, #0\n\t"
  40598. /* a[i+31] += m[31] * mu */
  40599. "ldr r7, [%[m], #124]\n\t"
  40600. "ldr r10, [%[a], #124]\n\t"
  40601. "mov r4, #0\n\t"
  40602. "umlal r10, r4, r8, r7\n\t"
  40603. "adds r10, r10, r5\n\t"
  40604. "str r10, [%[a], #124]\n\t"
  40605. "adc r4, r4, #0\n\t"
  40606. /* a[i+32] += m[32] * mu */
  40607. "ldr r7, [%[m], #128]\n\t"
  40608. "ldr r10, [%[a], #128]\n\t"
  40609. "mov r5, #0\n\t"
  40610. "umlal r10, r5, r8, r7\n\t"
  40611. "adds r10, r10, r4\n\t"
  40612. "str r10, [%[a], #128]\n\t"
  40613. "adc r5, r5, #0\n\t"
  40614. /* a[i+33] += m[33] * mu */
  40615. "ldr r7, [%[m], #132]\n\t"
  40616. "ldr r10, [%[a], #132]\n\t"
  40617. "mov r4, #0\n\t"
  40618. "umlal r10, r4, r8, r7\n\t"
  40619. "adds r10, r10, r5\n\t"
  40620. "str r10, [%[a], #132]\n\t"
  40621. "adc r4, r4, #0\n\t"
  40622. /* a[i+34] += m[34] * mu */
  40623. "ldr r7, [%[m], #136]\n\t"
  40624. "ldr r10, [%[a], #136]\n\t"
  40625. "mov r5, #0\n\t"
  40626. "umlal r10, r5, r8, r7\n\t"
  40627. "adds r10, r10, r4\n\t"
  40628. "str r10, [%[a], #136]\n\t"
  40629. "adc r5, r5, #0\n\t"
  40630. /* a[i+35] += m[35] * mu */
  40631. "ldr r7, [%[m], #140]\n\t"
  40632. "ldr r10, [%[a], #140]\n\t"
  40633. "mov r4, #0\n\t"
  40634. "umlal r10, r4, r8, r7\n\t"
  40635. "adds r10, r10, r5\n\t"
  40636. "str r10, [%[a], #140]\n\t"
  40637. "adc r4, r4, #0\n\t"
  40638. /* a[i+36] += m[36] * mu */
  40639. "ldr r7, [%[m], #144]\n\t"
  40640. "ldr r10, [%[a], #144]\n\t"
  40641. "mov r5, #0\n\t"
  40642. "umlal r10, r5, r8, r7\n\t"
  40643. "adds r10, r10, r4\n\t"
  40644. "str r10, [%[a], #144]\n\t"
  40645. "adc r5, r5, #0\n\t"
  40646. /* a[i+37] += m[37] * mu */
  40647. "ldr r7, [%[m], #148]\n\t"
  40648. "ldr r10, [%[a], #148]\n\t"
  40649. "mov r4, #0\n\t"
  40650. "umlal r10, r4, r8, r7\n\t"
  40651. "adds r10, r10, r5\n\t"
  40652. "str r10, [%[a], #148]\n\t"
  40653. "adc r4, r4, #0\n\t"
  40654. /* a[i+38] += m[38] * mu */
  40655. "ldr r7, [%[m], #152]\n\t"
  40656. "ldr r10, [%[a], #152]\n\t"
  40657. "mov r5, #0\n\t"
  40658. "umlal r10, r5, r8, r7\n\t"
  40659. "adds r10, r10, r4\n\t"
  40660. "str r10, [%[a], #152]\n\t"
  40661. "adc r5, r5, #0\n\t"
  40662. /* a[i+39] += m[39] * mu */
  40663. "ldr r7, [%[m], #156]\n\t"
  40664. "ldr r10, [%[a], #156]\n\t"
  40665. "mov r4, #0\n\t"
  40666. "umlal r10, r4, r8, r7\n\t"
  40667. "adds r10, r10, r5\n\t"
  40668. "str r10, [%[a], #156]\n\t"
  40669. "adc r4, r4, #0\n\t"
  40670. /* a[i+40] += m[40] * mu */
  40671. "ldr r7, [%[m], #160]\n\t"
  40672. "ldr r10, [%[a], #160]\n\t"
  40673. "mov r5, #0\n\t"
  40674. "umlal r10, r5, r8, r7\n\t"
  40675. "adds r10, r10, r4\n\t"
  40676. "str r10, [%[a], #160]\n\t"
  40677. "adc r5, r5, #0\n\t"
  40678. /* a[i+41] += m[41] * mu */
  40679. "ldr r7, [%[m], #164]\n\t"
  40680. "ldr r10, [%[a], #164]\n\t"
  40681. "mov r4, #0\n\t"
  40682. "umlal r10, r4, r8, r7\n\t"
  40683. "adds r10, r10, r5\n\t"
  40684. "str r10, [%[a], #164]\n\t"
  40685. "adc r4, r4, #0\n\t"
  40686. /* a[i+42] += m[42] * mu */
  40687. "ldr r7, [%[m], #168]\n\t"
  40688. "ldr r10, [%[a], #168]\n\t"
  40689. "mov r5, #0\n\t"
  40690. "umlal r10, r5, r8, r7\n\t"
  40691. "adds r10, r10, r4\n\t"
  40692. "str r10, [%[a], #168]\n\t"
  40693. "adc r5, r5, #0\n\t"
  40694. /* a[i+43] += m[43] * mu */
  40695. "ldr r7, [%[m], #172]\n\t"
  40696. "ldr r10, [%[a], #172]\n\t"
  40697. "mov r4, #0\n\t"
  40698. "umlal r10, r4, r8, r7\n\t"
  40699. "adds r10, r10, r5\n\t"
  40700. "str r10, [%[a], #172]\n\t"
  40701. "adc r4, r4, #0\n\t"
  40702. /* a[i+44] += m[44] * mu */
  40703. "ldr r7, [%[m], #176]\n\t"
  40704. "ldr r10, [%[a], #176]\n\t"
  40705. "mov r5, #0\n\t"
  40706. "umlal r10, r5, r8, r7\n\t"
  40707. "adds r10, r10, r4\n\t"
  40708. "str r10, [%[a], #176]\n\t"
  40709. "adc r5, r5, #0\n\t"
  40710. /* a[i+45] += m[45] * mu */
  40711. "ldr r7, [%[m], #180]\n\t"
  40712. "ldr r10, [%[a], #180]\n\t"
  40713. "mov r4, #0\n\t"
  40714. "umlal r10, r4, r8, r7\n\t"
  40715. "adds r10, r10, r5\n\t"
  40716. "str r10, [%[a], #180]\n\t"
  40717. "adc r4, r4, #0\n\t"
  40718. /* a[i+46] += m[46] * mu */
  40719. "ldr r7, [%[m], #184]\n\t"
  40720. "ldr r10, [%[a], #184]\n\t"
  40721. "mov r5, #0\n\t"
  40722. "umlal r10, r5, r8, r7\n\t"
  40723. "adds r10, r10, r4\n\t"
  40724. "str r10, [%[a], #184]\n\t"
  40725. "adc r5, r5, #0\n\t"
  40726. /* a[i+47] += m[47] * mu */
  40727. "ldr r7, [%[m], #188]\n\t"
  40728. "ldr r10, [%[a], #188]\n\t"
  40729. "mov r4, #0\n\t"
  40730. "umlal r10, r4, r8, r7\n\t"
  40731. "adds r10, r10, r5\n\t"
  40732. "str r10, [%[a], #188]\n\t"
  40733. "adc r4, r4, #0\n\t"
  40734. /* a[i+48] += m[48] * mu */
  40735. "ldr r7, [%[m], #192]\n\t"
  40736. "ldr r10, [%[a], #192]\n\t"
  40737. "mov r5, #0\n\t"
  40738. "umlal r10, r5, r8, r7\n\t"
  40739. "adds r10, r10, r4\n\t"
  40740. "str r10, [%[a], #192]\n\t"
  40741. "adc r5, r5, #0\n\t"
  40742. /* a[i+49] += m[49] * mu */
  40743. "ldr r7, [%[m], #196]\n\t"
  40744. "ldr r10, [%[a], #196]\n\t"
  40745. "mov r4, #0\n\t"
  40746. "umlal r10, r4, r8, r7\n\t"
  40747. "adds r10, r10, r5\n\t"
  40748. "str r10, [%[a], #196]\n\t"
  40749. "adc r4, r4, #0\n\t"
  40750. /* a[i+50] += m[50] * mu */
  40751. "ldr r7, [%[m], #200]\n\t"
  40752. "ldr r10, [%[a], #200]\n\t"
  40753. "mov r5, #0\n\t"
  40754. "umlal r10, r5, r8, r7\n\t"
  40755. "adds r10, r10, r4\n\t"
  40756. "str r10, [%[a], #200]\n\t"
  40757. "adc r5, r5, #0\n\t"
  40758. /* a[i+51] += m[51] * mu */
  40759. "ldr r7, [%[m], #204]\n\t"
  40760. "ldr r10, [%[a], #204]\n\t"
  40761. "mov r4, #0\n\t"
  40762. "umlal r10, r4, r8, r7\n\t"
  40763. "adds r10, r10, r5\n\t"
  40764. "str r10, [%[a], #204]\n\t"
  40765. "adc r4, r4, #0\n\t"
  40766. /* a[i+52] += m[52] * mu */
  40767. "ldr r7, [%[m], #208]\n\t"
  40768. "ldr r10, [%[a], #208]\n\t"
  40769. "mov r5, #0\n\t"
  40770. "umlal r10, r5, r8, r7\n\t"
  40771. "adds r10, r10, r4\n\t"
  40772. "str r10, [%[a], #208]\n\t"
  40773. "adc r5, r5, #0\n\t"
  40774. /* a[i+53] += m[53] * mu */
  40775. "ldr r7, [%[m], #212]\n\t"
  40776. "ldr r10, [%[a], #212]\n\t"
  40777. "mov r4, #0\n\t"
  40778. "umlal r10, r4, r8, r7\n\t"
  40779. "adds r10, r10, r5\n\t"
  40780. "str r10, [%[a], #212]\n\t"
  40781. "adc r4, r4, #0\n\t"
  40782. /* a[i+54] += m[54] * mu */
  40783. "ldr r7, [%[m], #216]\n\t"
  40784. "ldr r10, [%[a], #216]\n\t"
  40785. "mov r5, #0\n\t"
  40786. "umlal r10, r5, r8, r7\n\t"
  40787. "adds r10, r10, r4\n\t"
  40788. "str r10, [%[a], #216]\n\t"
  40789. "adc r5, r5, #0\n\t"
  40790. /* a[i+55] += m[55] * mu */
  40791. "ldr r7, [%[m], #220]\n\t"
  40792. "ldr r10, [%[a], #220]\n\t"
  40793. "mov r4, #0\n\t"
  40794. "umlal r10, r4, r8, r7\n\t"
  40795. "adds r10, r10, r5\n\t"
  40796. "str r10, [%[a], #220]\n\t"
  40797. "adc r4, r4, #0\n\t"
  40798. /* a[i+56] += m[56] * mu */
  40799. "ldr r7, [%[m], #224]\n\t"
  40800. "ldr r10, [%[a], #224]\n\t"
  40801. "mov r5, #0\n\t"
  40802. "umlal r10, r5, r8, r7\n\t"
  40803. "adds r10, r10, r4\n\t"
  40804. "str r10, [%[a], #224]\n\t"
  40805. "adc r5, r5, #0\n\t"
  40806. /* a[i+57] += m[57] * mu */
  40807. "ldr r7, [%[m], #228]\n\t"
  40808. "ldr r10, [%[a], #228]\n\t"
  40809. "mov r4, #0\n\t"
  40810. "umlal r10, r4, r8, r7\n\t"
  40811. "adds r10, r10, r5\n\t"
  40812. "str r10, [%[a], #228]\n\t"
  40813. "adc r4, r4, #0\n\t"
  40814. /* a[i+58] += m[58] * mu */
  40815. "ldr r7, [%[m], #232]\n\t"
  40816. "ldr r10, [%[a], #232]\n\t"
  40817. "mov r5, #0\n\t"
  40818. "umlal r10, r5, r8, r7\n\t"
  40819. "adds r10, r10, r4\n\t"
  40820. "str r10, [%[a], #232]\n\t"
  40821. "adc r5, r5, #0\n\t"
  40822. /* a[i+59] += m[59] * mu */
  40823. "ldr r7, [%[m], #236]\n\t"
  40824. "ldr r10, [%[a], #236]\n\t"
  40825. "mov r4, #0\n\t"
  40826. "umlal r10, r4, r8, r7\n\t"
  40827. "adds r10, r10, r5\n\t"
  40828. "str r10, [%[a], #236]\n\t"
  40829. "adc r4, r4, #0\n\t"
  40830. /* a[i+60] += m[60] * mu */
  40831. "ldr r7, [%[m], #240]\n\t"
  40832. "ldr r10, [%[a], #240]\n\t"
  40833. "mov r5, #0\n\t"
  40834. "umlal r10, r5, r8, r7\n\t"
  40835. "adds r10, r10, r4\n\t"
  40836. "str r10, [%[a], #240]\n\t"
  40837. "adc r5, r5, #0\n\t"
  40838. /* a[i+61] += m[61] * mu */
  40839. "ldr r7, [%[m], #244]\n\t"
  40840. "ldr r10, [%[a], #244]\n\t"
  40841. "mov r4, #0\n\t"
  40842. "umlal r10, r4, r8, r7\n\t"
  40843. "adds r10, r10, r5\n\t"
  40844. "str r10, [%[a], #244]\n\t"
  40845. "adc r4, r4, #0\n\t"
  40846. /* a[i+62] += m[62] * mu */
  40847. "ldr r7, [%[m], #248]\n\t"
  40848. "ldr r10, [%[a], #248]\n\t"
  40849. "mov r5, #0\n\t"
  40850. "umlal r10, r5, r8, r7\n\t"
  40851. "adds r10, r10, r4\n\t"
  40852. "str r10, [%[a], #248]\n\t"
  40853. "adc r5, r5, #0\n\t"
  40854. /* a[i+63] += m[63] * mu */
  40855. "ldr r7, [%[m], #252]\n\t"
  40856. "ldr r10, [%[a], #252]\n\t"
  40857. "mov r4, #0\n\t"
  40858. "umlal r10, r4, r8, r7\n\t"
  40859. "adds r10, r10, r5\n\t"
  40860. "str r10, [%[a], #252]\n\t"
  40861. "adc r4, r4, #0\n\t"
  40862. /* a[i+64] += m[64] * mu */
  40863. "ldr r7, [%[m], #256]\n\t"
  40864. "ldr r10, [%[a], #256]\n\t"
  40865. "mov r5, #0\n\t"
  40866. "umlal r10, r5, r8, r7\n\t"
  40867. "adds r10, r10, r4\n\t"
  40868. "str r10, [%[a], #256]\n\t"
  40869. "adc r5, r5, #0\n\t"
  40870. /* a[i+65] += m[65] * mu */
  40871. "ldr r7, [%[m], #260]\n\t"
  40872. "ldr r10, [%[a], #260]\n\t"
  40873. "mov r4, #0\n\t"
  40874. "umlal r10, r4, r8, r7\n\t"
  40875. "adds r10, r10, r5\n\t"
  40876. "str r10, [%[a], #260]\n\t"
  40877. "adc r4, r4, #0\n\t"
  40878. /* a[i+66] += m[66] * mu */
  40879. "ldr r7, [%[m], #264]\n\t"
  40880. "ldr r10, [%[a], #264]\n\t"
  40881. "mov r5, #0\n\t"
  40882. "umlal r10, r5, r8, r7\n\t"
  40883. "adds r10, r10, r4\n\t"
  40884. "str r10, [%[a], #264]\n\t"
  40885. "adc r5, r5, #0\n\t"
  40886. /* a[i+67] += m[67] * mu */
  40887. "ldr r7, [%[m], #268]\n\t"
  40888. "ldr r10, [%[a], #268]\n\t"
  40889. "mov r4, #0\n\t"
  40890. "umlal r10, r4, r8, r7\n\t"
  40891. "adds r10, r10, r5\n\t"
  40892. "str r10, [%[a], #268]\n\t"
  40893. "adc r4, r4, #0\n\t"
  40894. /* a[i+68] += m[68] * mu */
  40895. "ldr r7, [%[m], #272]\n\t"
  40896. "ldr r10, [%[a], #272]\n\t"
  40897. "mov r5, #0\n\t"
  40898. "umlal r10, r5, r8, r7\n\t"
  40899. "adds r10, r10, r4\n\t"
  40900. "str r10, [%[a], #272]\n\t"
  40901. "adc r5, r5, #0\n\t"
  40902. /* a[i+69] += m[69] * mu */
  40903. "ldr r7, [%[m], #276]\n\t"
  40904. "ldr r10, [%[a], #276]\n\t"
  40905. "mov r4, #0\n\t"
  40906. "umlal r10, r4, r8, r7\n\t"
  40907. "adds r10, r10, r5\n\t"
  40908. "str r10, [%[a], #276]\n\t"
  40909. "adc r4, r4, #0\n\t"
  40910. /* a[i+70] += m[70] * mu */
  40911. "ldr r7, [%[m], #280]\n\t"
  40912. "ldr r10, [%[a], #280]\n\t"
  40913. "mov r5, #0\n\t"
  40914. "umlal r10, r5, r8, r7\n\t"
  40915. "adds r10, r10, r4\n\t"
  40916. "str r10, [%[a], #280]\n\t"
  40917. "adc r5, r5, #0\n\t"
  40918. /* a[i+71] += m[71] * mu */
  40919. "ldr r7, [%[m], #284]\n\t"
  40920. "ldr r10, [%[a], #284]\n\t"
  40921. "mov r4, #0\n\t"
  40922. "umlal r10, r4, r8, r7\n\t"
  40923. "adds r10, r10, r5\n\t"
  40924. "str r10, [%[a], #284]\n\t"
  40925. "adc r4, r4, #0\n\t"
  40926. /* a[i+72] += m[72] * mu */
  40927. "ldr r7, [%[m], #288]\n\t"
  40928. "ldr r10, [%[a], #288]\n\t"
  40929. "mov r5, #0\n\t"
  40930. "umlal r10, r5, r8, r7\n\t"
  40931. "adds r10, r10, r4\n\t"
  40932. "str r10, [%[a], #288]\n\t"
  40933. "adc r5, r5, #0\n\t"
  40934. /* a[i+73] += m[73] * mu */
  40935. "ldr r7, [%[m], #292]\n\t"
  40936. "ldr r10, [%[a], #292]\n\t"
  40937. "mov r4, #0\n\t"
  40938. "umlal r10, r4, r8, r7\n\t"
  40939. "adds r10, r10, r5\n\t"
  40940. "str r10, [%[a], #292]\n\t"
  40941. "adc r4, r4, #0\n\t"
  40942. /* a[i+74] += m[74] * mu */
  40943. "ldr r7, [%[m], #296]\n\t"
  40944. "ldr r10, [%[a], #296]\n\t"
  40945. "mov r5, #0\n\t"
  40946. "umlal r10, r5, r8, r7\n\t"
  40947. "adds r10, r10, r4\n\t"
  40948. "str r10, [%[a], #296]\n\t"
  40949. "adc r5, r5, #0\n\t"
  40950. /* a[i+75] += m[75] * mu */
  40951. "ldr r7, [%[m], #300]\n\t"
  40952. "ldr r10, [%[a], #300]\n\t"
  40953. "mov r4, #0\n\t"
  40954. "umlal r10, r4, r8, r7\n\t"
  40955. "adds r10, r10, r5\n\t"
  40956. "str r10, [%[a], #300]\n\t"
  40957. "adc r4, r4, #0\n\t"
  40958. /* a[i+76] += m[76] * mu */
  40959. "ldr r7, [%[m], #304]\n\t"
  40960. "ldr r10, [%[a], #304]\n\t"
  40961. "mov r5, #0\n\t"
  40962. "umlal r10, r5, r8, r7\n\t"
  40963. "adds r10, r10, r4\n\t"
  40964. "str r10, [%[a], #304]\n\t"
  40965. "adc r5, r5, #0\n\t"
  40966. /* a[i+77] += m[77] * mu */
  40967. "ldr r7, [%[m], #308]\n\t"
  40968. "ldr r10, [%[a], #308]\n\t"
  40969. "mov r4, #0\n\t"
  40970. "umlal r10, r4, r8, r7\n\t"
  40971. "adds r10, r10, r5\n\t"
  40972. "str r10, [%[a], #308]\n\t"
  40973. "adc r4, r4, #0\n\t"
  40974. /* a[i+78] += m[78] * mu */
  40975. "ldr r7, [%[m], #312]\n\t"
  40976. "ldr r10, [%[a], #312]\n\t"
  40977. "mov r5, #0\n\t"
  40978. "umlal r10, r5, r8, r7\n\t"
  40979. "adds r10, r10, r4\n\t"
  40980. "str r10, [%[a], #312]\n\t"
  40981. "adc r5, r5, #0\n\t"
  40982. /* a[i+79] += m[79] * mu */
  40983. "ldr r7, [%[m], #316]\n\t"
  40984. "ldr r10, [%[a], #316]\n\t"
  40985. "mov r4, #0\n\t"
  40986. "umlal r10, r4, r8, r7\n\t"
  40987. "adds r10, r10, r5\n\t"
  40988. "str r10, [%[a], #316]\n\t"
  40989. "adc r4, r4, #0\n\t"
  40990. /* a[i+80] += m[80] * mu */
  40991. "ldr r7, [%[m], #320]\n\t"
  40992. "ldr r10, [%[a], #320]\n\t"
  40993. "mov r5, #0\n\t"
  40994. "umlal r10, r5, r8, r7\n\t"
  40995. "adds r10, r10, r4\n\t"
  40996. "str r10, [%[a], #320]\n\t"
  40997. "adc r5, r5, #0\n\t"
  40998. /* a[i+81] += m[81] * mu */
  40999. "ldr r7, [%[m], #324]\n\t"
  41000. "ldr r10, [%[a], #324]\n\t"
  41001. "mov r4, #0\n\t"
  41002. "umlal r10, r4, r8, r7\n\t"
  41003. "adds r10, r10, r5\n\t"
  41004. "str r10, [%[a], #324]\n\t"
  41005. "adc r4, r4, #0\n\t"
  41006. /* a[i+82] += m[82] * mu */
  41007. "ldr r7, [%[m], #328]\n\t"
  41008. "ldr r10, [%[a], #328]\n\t"
  41009. "mov r5, #0\n\t"
  41010. "umlal r10, r5, r8, r7\n\t"
  41011. "adds r10, r10, r4\n\t"
  41012. "str r10, [%[a], #328]\n\t"
  41013. "adc r5, r5, #0\n\t"
  41014. /* a[i+83] += m[83] * mu */
  41015. "ldr r7, [%[m], #332]\n\t"
  41016. "ldr r10, [%[a], #332]\n\t"
  41017. "mov r4, #0\n\t"
  41018. "umlal r10, r4, r8, r7\n\t"
  41019. "adds r10, r10, r5\n\t"
  41020. "str r10, [%[a], #332]\n\t"
  41021. "adc r4, r4, #0\n\t"
  41022. /* a[i+84] += m[84] * mu */
  41023. "ldr r7, [%[m], #336]\n\t"
  41024. "ldr r10, [%[a], #336]\n\t"
  41025. "mov r5, #0\n\t"
  41026. "umlal r10, r5, r8, r7\n\t"
  41027. "adds r10, r10, r4\n\t"
  41028. "str r10, [%[a], #336]\n\t"
  41029. "adc r5, r5, #0\n\t"
  41030. /* a[i+85] += m[85] * mu */
  41031. "ldr r7, [%[m], #340]\n\t"
  41032. "ldr r10, [%[a], #340]\n\t"
  41033. "mov r4, #0\n\t"
  41034. "umlal r10, r4, r8, r7\n\t"
  41035. "adds r10, r10, r5\n\t"
  41036. "str r10, [%[a], #340]\n\t"
  41037. "adc r4, r4, #0\n\t"
  41038. /* a[i+86] += m[86] * mu */
  41039. "ldr r7, [%[m], #344]\n\t"
  41040. "ldr r10, [%[a], #344]\n\t"
  41041. "mov r5, #0\n\t"
  41042. "umlal r10, r5, r8, r7\n\t"
  41043. "adds r10, r10, r4\n\t"
  41044. "str r10, [%[a], #344]\n\t"
  41045. "adc r5, r5, #0\n\t"
  41046. /* a[i+87] += m[87] * mu */
  41047. "ldr r7, [%[m], #348]\n\t"
  41048. "ldr r10, [%[a], #348]\n\t"
  41049. "mov r4, #0\n\t"
  41050. "umlal r10, r4, r8, r7\n\t"
  41051. "adds r10, r10, r5\n\t"
  41052. "str r10, [%[a], #348]\n\t"
  41053. "adc r4, r4, #0\n\t"
  41054. /* a[i+88] += m[88] * mu */
  41055. "ldr r7, [%[m], #352]\n\t"
  41056. "ldr r10, [%[a], #352]\n\t"
  41057. "mov r5, #0\n\t"
  41058. "umlal r10, r5, r8, r7\n\t"
  41059. "adds r10, r10, r4\n\t"
  41060. "str r10, [%[a], #352]\n\t"
  41061. "adc r5, r5, #0\n\t"
  41062. /* a[i+89] += m[89] * mu */
  41063. "ldr r7, [%[m], #356]\n\t"
  41064. "ldr r10, [%[a], #356]\n\t"
  41065. "mov r4, #0\n\t"
  41066. "umlal r10, r4, r8, r7\n\t"
  41067. "adds r10, r10, r5\n\t"
  41068. "str r10, [%[a], #356]\n\t"
  41069. "adc r4, r4, #0\n\t"
  41070. /* a[i+90] += m[90] * mu */
  41071. "ldr r7, [%[m], #360]\n\t"
  41072. "ldr r10, [%[a], #360]\n\t"
  41073. "mov r5, #0\n\t"
  41074. "umlal r10, r5, r8, r7\n\t"
  41075. "adds r10, r10, r4\n\t"
  41076. "str r10, [%[a], #360]\n\t"
  41077. "adc r5, r5, #0\n\t"
  41078. /* a[i+91] += m[91] * mu */
  41079. "ldr r7, [%[m], #364]\n\t"
  41080. "ldr r10, [%[a], #364]\n\t"
  41081. "mov r4, #0\n\t"
  41082. "umlal r10, r4, r8, r7\n\t"
  41083. "adds r10, r10, r5\n\t"
  41084. "str r10, [%[a], #364]\n\t"
  41085. "adc r4, r4, #0\n\t"
  41086. /* a[i+92] += m[92] * mu */
  41087. "ldr r7, [%[m], #368]\n\t"
  41088. "ldr r10, [%[a], #368]\n\t"
  41089. "mov r5, #0\n\t"
  41090. "umlal r10, r5, r8, r7\n\t"
  41091. "adds r10, r10, r4\n\t"
  41092. "str r10, [%[a], #368]\n\t"
  41093. "adc r5, r5, #0\n\t"
  41094. /* a[i+93] += m[93] * mu */
  41095. "ldr r7, [%[m], #372]\n\t"
  41096. "ldr r10, [%[a], #372]\n\t"
  41097. "mov r4, #0\n\t"
  41098. "umlal r10, r4, r8, r7\n\t"
  41099. "adds r10, r10, r5\n\t"
  41100. "str r10, [%[a], #372]\n\t"
  41101. "adc r4, r4, #0\n\t"
  41102. /* a[i+94] += m[94] * mu */
  41103. "ldr r7, [%[m], #376]\n\t"
  41104. "ldr r10, [%[a], #376]\n\t"
  41105. "mov r5, #0\n\t"
  41106. "umlal r10, r5, r8, r7\n\t"
  41107. "adds r10, r10, r4\n\t"
  41108. "str r10, [%[a], #376]\n\t"
  41109. "adc r5, r5, #0\n\t"
  41110. /* a[i+95] += m[95] * mu */
  41111. "ldr r7, [%[m], #380]\n\t"
  41112. "ldr r10, [%[a], #380]\n\t"
  41113. "umull r6, r7, r8, r7\n\t"
  41114. "adds r5, r5, r6\n\t"
  41115. "adcs r4, r7, r3\n\t"
  41116. "mov r3, #0\n\t"
  41117. "adc r3, r3, r3\n\t"
  41118. "adds r10, r10, r5\n\t"
  41119. "str r10, [%[a], #380]\n\t"
  41120. "ldr r10, [%[a], #384]\n\t"
  41121. "adcs r10, r10, r4\n\t"
  41122. "str r10, [%[a], #384]\n\t"
  41123. "adc r3, r3, #0\n\t"
  41124. /* i += 1 */
  41125. "add r9, r9, #4\n\t"
  41126. "add %[a], %[a], #4\n\t"
  41127. "cmp r9, #0x180\n\t"
  41128. "blt L_sp_3072_mont_reduce_96_word_%=\n\t"
  41129. /* Loop Done */
  41130. "str r12, [%[a]]\n\t"
  41131. "str lr, [%[a], #4]\n\t"
  41132. "mov %[mp], r3\n\t"
  41133. : [a] "+r" (a), [m] "+r" (m), [mp] "+r" (mp)
  41134. :
  41135. : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "cc"
  41136. );
  41137. sp_3072_cond_sub_96(a - 96, a, m, (sp_digit)0 - mp);
  41138. }
  41139. #else
  41140. /* Reduce the number back to 3072 bits using Montgomery reduction.
  41141. *
  41142. * a A single precision number to reduce in place.
  41143. * m The single precision number representing the modulus.
  41144. * mp The digit representing the negative inverse of m mod 2^n.
  41145. */
  41146. static SP_NOINLINE void sp_3072_mont_reduce_96(sp_digit* a_p, const sp_digit* m_p, sp_digit mp_p)
  41147. {
  41148. register sp_digit* a asm ("r0") = (sp_digit*)a_p;
  41149. register const sp_digit* m asm ("r1") = (const sp_digit*)m_p;
  41150. register sp_digit mp asm ("r2") = (sp_digit)mp_p;
  41151. __asm__ __volatile__ (
  41152. /* i = 0 */
  41153. "mov r12, #0\n\t"
  41154. "mov lr, #0\n\t"
  41155. "ldr r4, [%[a]]\n\t"
  41156. "ldr r5, [%[a], #4]\n\t"
  41157. "ldr r6, [%[a], #8]\n\t"
  41158. "ldr r7, [%[a], #12]\n\t"
  41159. "ldr r8, [%[a], #16]\n\t"
  41160. "\n"
  41161. "L_sp_3072_mont_reduce_96_word_%=: \n\t"
  41162. /* mu = a[i] * mp */
  41163. "mul r11, %[mp], r4\n\t"
  41164. /* a[i+0] += m[0] * mu */
  41165. "ldr r10, [%[m]]\n\t"
  41166. "mov r3, #0\n\t"
  41167. "umaal r4, r3, r11, r10\n\t"
  41168. /* a[i+1] += m[1] * mu */
  41169. "ldr r10, [%[m], #4]\n\t"
  41170. "mov r4, r5\n\t"
  41171. "umaal r4, r3, r11, r10\n\t"
  41172. /* a[i+2] += m[2] * mu */
  41173. "ldr r10, [%[m], #8]\n\t"
  41174. "mov r5, r6\n\t"
  41175. "umaal r5, r3, r11, r10\n\t"
  41176. /* a[i+3] += m[3] * mu */
  41177. "ldr r10, [%[m], #12]\n\t"
  41178. "mov r6, r7\n\t"
  41179. "umaal r6, r3, r11, r10\n\t"
  41180. /* a[i+4] += m[4] * mu */
  41181. "ldr r10, [%[m], #16]\n\t"
  41182. "mov r7, r8\n\t"
  41183. "umaal r7, r3, r11, r10\n\t"
  41184. /* a[i+5] += m[5] * mu */
  41185. "ldr r10, [%[m], #20]\n\t"
  41186. "ldr r8, [%[a], #20]\n\t"
  41187. "umaal r8, r3, r11, r10\n\t"
  41188. /* a[i+6] += m[6] * mu */
  41189. "ldr r10, [%[m], #24]\n\t"
  41190. "ldr r9, [%[a], #24]\n\t"
  41191. "umaal r9, r3, r11, r10\n\t"
  41192. "str r9, [%[a], #24]\n\t"
  41193. /* a[i+7] += m[7] * mu */
  41194. "ldr r10, [%[m], #28]\n\t"
  41195. "ldr r9, [%[a], #28]\n\t"
  41196. "umaal r9, r3, r11, r10\n\t"
  41197. "str r9, [%[a], #28]\n\t"
  41198. /* a[i+8] += m[8] * mu */
  41199. "ldr r10, [%[m], #32]\n\t"
  41200. "ldr r9, [%[a], #32]\n\t"
  41201. "umaal r9, r3, r11, r10\n\t"
  41202. "str r9, [%[a], #32]\n\t"
  41203. /* a[i+9] += m[9] * mu */
  41204. "ldr r10, [%[m], #36]\n\t"
  41205. "ldr r9, [%[a], #36]\n\t"
  41206. "umaal r9, r3, r11, r10\n\t"
  41207. "str r9, [%[a], #36]\n\t"
  41208. /* a[i+10] += m[10] * mu */
  41209. "ldr r10, [%[m], #40]\n\t"
  41210. "ldr r9, [%[a], #40]\n\t"
  41211. "umaal r9, r3, r11, r10\n\t"
  41212. "str r9, [%[a], #40]\n\t"
  41213. /* a[i+11] += m[11] * mu */
  41214. "ldr r10, [%[m], #44]\n\t"
  41215. "ldr r9, [%[a], #44]\n\t"
  41216. "umaal r9, r3, r11, r10\n\t"
  41217. "str r9, [%[a], #44]\n\t"
  41218. /* a[i+12] += m[12] * mu */
  41219. "ldr r10, [%[m], #48]\n\t"
  41220. "ldr r9, [%[a], #48]\n\t"
  41221. "umaal r9, r3, r11, r10\n\t"
  41222. "str r9, [%[a], #48]\n\t"
  41223. /* a[i+13] += m[13] * mu */
  41224. "ldr r10, [%[m], #52]\n\t"
  41225. "ldr r9, [%[a], #52]\n\t"
  41226. "umaal r9, r3, r11, r10\n\t"
  41227. "str r9, [%[a], #52]\n\t"
  41228. /* a[i+14] += m[14] * mu */
  41229. "ldr r10, [%[m], #56]\n\t"
  41230. "ldr r9, [%[a], #56]\n\t"
  41231. "umaal r9, r3, r11, r10\n\t"
  41232. "str r9, [%[a], #56]\n\t"
  41233. /* a[i+15] += m[15] * mu */
  41234. "ldr r10, [%[m], #60]\n\t"
  41235. "ldr r9, [%[a], #60]\n\t"
  41236. "umaal r9, r3, r11, r10\n\t"
  41237. "str r9, [%[a], #60]\n\t"
  41238. /* a[i+16] += m[16] * mu */
  41239. "ldr r10, [%[m], #64]\n\t"
  41240. "ldr r9, [%[a], #64]\n\t"
  41241. "umaal r9, r3, r11, r10\n\t"
  41242. "str r9, [%[a], #64]\n\t"
  41243. /* a[i+17] += m[17] * mu */
  41244. "ldr r10, [%[m], #68]\n\t"
  41245. "ldr r9, [%[a], #68]\n\t"
  41246. "umaal r9, r3, r11, r10\n\t"
  41247. "str r9, [%[a], #68]\n\t"
  41248. /* a[i+18] += m[18] * mu */
  41249. "ldr r10, [%[m], #72]\n\t"
  41250. "ldr r9, [%[a], #72]\n\t"
  41251. "umaal r9, r3, r11, r10\n\t"
  41252. "str r9, [%[a], #72]\n\t"
  41253. /* a[i+19] += m[19] * mu */
  41254. "ldr r10, [%[m], #76]\n\t"
  41255. "ldr r9, [%[a], #76]\n\t"
  41256. "umaal r9, r3, r11, r10\n\t"
  41257. "str r9, [%[a], #76]\n\t"
  41258. /* a[i+20] += m[20] * mu */
  41259. "ldr r10, [%[m], #80]\n\t"
  41260. "ldr r9, [%[a], #80]\n\t"
  41261. "umaal r9, r3, r11, r10\n\t"
  41262. "str r9, [%[a], #80]\n\t"
  41263. /* a[i+21] += m[21] * mu */
  41264. "ldr r10, [%[m], #84]\n\t"
  41265. "ldr r9, [%[a], #84]\n\t"
  41266. "umaal r9, r3, r11, r10\n\t"
  41267. "str r9, [%[a], #84]\n\t"
  41268. /* a[i+22] += m[22] * mu */
  41269. "ldr r10, [%[m], #88]\n\t"
  41270. "ldr r9, [%[a], #88]\n\t"
  41271. "umaal r9, r3, r11, r10\n\t"
  41272. "str r9, [%[a], #88]\n\t"
  41273. /* a[i+23] += m[23] * mu */
  41274. "ldr r10, [%[m], #92]\n\t"
  41275. "ldr r9, [%[a], #92]\n\t"
  41276. "umaal r9, r3, r11, r10\n\t"
  41277. "str r9, [%[a], #92]\n\t"
  41278. /* a[i+24] += m[24] * mu */
  41279. "ldr r10, [%[m], #96]\n\t"
  41280. "ldr r9, [%[a], #96]\n\t"
  41281. "umaal r9, r3, r11, r10\n\t"
  41282. "str r9, [%[a], #96]\n\t"
  41283. /* a[i+25] += m[25] * mu */
  41284. "ldr r10, [%[m], #100]\n\t"
  41285. "ldr r9, [%[a], #100]\n\t"
  41286. "umaal r9, r3, r11, r10\n\t"
  41287. "str r9, [%[a], #100]\n\t"
  41288. /* a[i+26] += m[26] * mu */
  41289. "ldr r10, [%[m], #104]\n\t"
  41290. "ldr r9, [%[a], #104]\n\t"
  41291. "umaal r9, r3, r11, r10\n\t"
  41292. "str r9, [%[a], #104]\n\t"
  41293. /* a[i+27] += m[27] * mu */
  41294. "ldr r10, [%[m], #108]\n\t"
  41295. "ldr r9, [%[a], #108]\n\t"
  41296. "umaal r9, r3, r11, r10\n\t"
  41297. "str r9, [%[a], #108]\n\t"
  41298. /* a[i+28] += m[28] * mu */
  41299. "ldr r10, [%[m], #112]\n\t"
  41300. "ldr r9, [%[a], #112]\n\t"
  41301. "umaal r9, r3, r11, r10\n\t"
  41302. "str r9, [%[a], #112]\n\t"
  41303. /* a[i+29] += m[29] * mu */
  41304. "ldr r10, [%[m], #116]\n\t"
  41305. "ldr r9, [%[a], #116]\n\t"
  41306. "umaal r9, r3, r11, r10\n\t"
  41307. "str r9, [%[a], #116]\n\t"
  41308. /* a[i+30] += m[30] * mu */
  41309. "ldr r10, [%[m], #120]\n\t"
  41310. "ldr r9, [%[a], #120]\n\t"
  41311. "umaal r9, r3, r11, r10\n\t"
  41312. "str r9, [%[a], #120]\n\t"
  41313. /* a[i+31] += m[31] * mu */
  41314. "ldr r10, [%[m], #124]\n\t"
  41315. "ldr r9, [%[a], #124]\n\t"
  41316. "umaal r9, r3, r11, r10\n\t"
  41317. "str r9, [%[a], #124]\n\t"
  41318. /* a[i+32] += m[32] * mu */
  41319. "ldr r10, [%[m], #128]\n\t"
  41320. "ldr r9, [%[a], #128]\n\t"
  41321. "umaal r9, r3, r11, r10\n\t"
  41322. "str r9, [%[a], #128]\n\t"
  41323. /* a[i+33] += m[33] * mu */
  41324. "ldr r10, [%[m], #132]\n\t"
  41325. "ldr r9, [%[a], #132]\n\t"
  41326. "umaal r9, r3, r11, r10\n\t"
  41327. "str r9, [%[a], #132]\n\t"
  41328. /* a[i+34] += m[34] * mu */
  41329. "ldr r10, [%[m], #136]\n\t"
  41330. "ldr r9, [%[a], #136]\n\t"
  41331. "umaal r9, r3, r11, r10\n\t"
  41332. "str r9, [%[a], #136]\n\t"
  41333. /* a[i+35] += m[35] * mu */
  41334. "ldr r10, [%[m], #140]\n\t"
  41335. "ldr r9, [%[a], #140]\n\t"
  41336. "umaal r9, r3, r11, r10\n\t"
  41337. "str r9, [%[a], #140]\n\t"
  41338. /* a[i+36] += m[36] * mu */
  41339. "ldr r10, [%[m], #144]\n\t"
  41340. "ldr r9, [%[a], #144]\n\t"
  41341. "umaal r9, r3, r11, r10\n\t"
  41342. "str r9, [%[a], #144]\n\t"
  41343. /* a[i+37] += m[37] * mu */
  41344. "ldr r10, [%[m], #148]\n\t"
  41345. "ldr r9, [%[a], #148]\n\t"
  41346. "umaal r9, r3, r11, r10\n\t"
  41347. "str r9, [%[a], #148]\n\t"
  41348. /* a[i+38] += m[38] * mu */
  41349. "ldr r10, [%[m], #152]\n\t"
  41350. "ldr r9, [%[a], #152]\n\t"
  41351. "umaal r9, r3, r11, r10\n\t"
  41352. "str r9, [%[a], #152]\n\t"
  41353. /* a[i+39] += m[39] * mu */
  41354. "ldr r10, [%[m], #156]\n\t"
  41355. "ldr r9, [%[a], #156]\n\t"
  41356. "umaal r9, r3, r11, r10\n\t"
  41357. "str r9, [%[a], #156]\n\t"
  41358. /* a[i+40] += m[40] * mu */
  41359. "ldr r10, [%[m], #160]\n\t"
  41360. "ldr r9, [%[a], #160]\n\t"
  41361. "umaal r9, r3, r11, r10\n\t"
  41362. "str r9, [%[a], #160]\n\t"
  41363. /* a[i+41] += m[41] * mu */
  41364. "ldr r10, [%[m], #164]\n\t"
  41365. "ldr r9, [%[a], #164]\n\t"
  41366. "umaal r9, r3, r11, r10\n\t"
  41367. "str r9, [%[a], #164]\n\t"
  41368. /* a[i+42] += m[42] * mu */
  41369. "ldr r10, [%[m], #168]\n\t"
  41370. "ldr r9, [%[a], #168]\n\t"
  41371. "umaal r9, r3, r11, r10\n\t"
  41372. "str r9, [%[a], #168]\n\t"
  41373. /* a[i+43] += m[43] * mu */
  41374. "ldr r10, [%[m], #172]\n\t"
  41375. "ldr r9, [%[a], #172]\n\t"
  41376. "umaal r9, r3, r11, r10\n\t"
  41377. "str r9, [%[a], #172]\n\t"
  41378. /* a[i+44] += m[44] * mu */
  41379. "ldr r10, [%[m], #176]\n\t"
  41380. "ldr r9, [%[a], #176]\n\t"
  41381. "umaal r9, r3, r11, r10\n\t"
  41382. "str r9, [%[a], #176]\n\t"
  41383. /* a[i+45] += m[45] * mu */
  41384. "ldr r10, [%[m], #180]\n\t"
  41385. "ldr r9, [%[a], #180]\n\t"
  41386. "umaal r9, r3, r11, r10\n\t"
  41387. "str r9, [%[a], #180]\n\t"
  41388. /* a[i+46] += m[46] * mu */
  41389. "ldr r10, [%[m], #184]\n\t"
  41390. "ldr r9, [%[a], #184]\n\t"
  41391. "umaal r9, r3, r11, r10\n\t"
  41392. "str r9, [%[a], #184]\n\t"
  41393. /* a[i+47] += m[47] * mu */
  41394. "ldr r10, [%[m], #188]\n\t"
  41395. "ldr r9, [%[a], #188]\n\t"
  41396. "umaal r9, r3, r11, r10\n\t"
  41397. "str r9, [%[a], #188]\n\t"
  41398. /* a[i+48] += m[48] * mu */
  41399. "ldr r10, [%[m], #192]\n\t"
  41400. "ldr r9, [%[a], #192]\n\t"
  41401. "umaal r9, r3, r11, r10\n\t"
  41402. "str r9, [%[a], #192]\n\t"
  41403. /* a[i+49] += m[49] * mu */
  41404. "ldr r10, [%[m], #196]\n\t"
  41405. "ldr r9, [%[a], #196]\n\t"
  41406. "umaal r9, r3, r11, r10\n\t"
  41407. "str r9, [%[a], #196]\n\t"
  41408. /* a[i+50] += m[50] * mu */
  41409. "ldr r10, [%[m], #200]\n\t"
  41410. "ldr r9, [%[a], #200]\n\t"
  41411. "umaal r9, r3, r11, r10\n\t"
  41412. "str r9, [%[a], #200]\n\t"
  41413. /* a[i+51] += m[51] * mu */
  41414. "ldr r10, [%[m], #204]\n\t"
  41415. "ldr r9, [%[a], #204]\n\t"
  41416. "umaal r9, r3, r11, r10\n\t"
  41417. "str r9, [%[a], #204]\n\t"
  41418. /* a[i+52] += m[52] * mu */
  41419. "ldr r10, [%[m], #208]\n\t"
  41420. "ldr r9, [%[a], #208]\n\t"
  41421. "umaal r9, r3, r11, r10\n\t"
  41422. "str r9, [%[a], #208]\n\t"
  41423. /* a[i+53] += m[53] * mu */
  41424. "ldr r10, [%[m], #212]\n\t"
  41425. "ldr r9, [%[a], #212]\n\t"
  41426. "umaal r9, r3, r11, r10\n\t"
  41427. "str r9, [%[a], #212]\n\t"
  41428. /* a[i+54] += m[54] * mu */
  41429. "ldr r10, [%[m], #216]\n\t"
  41430. "ldr r9, [%[a], #216]\n\t"
  41431. "umaal r9, r3, r11, r10\n\t"
  41432. "str r9, [%[a], #216]\n\t"
  41433. /* a[i+55] += m[55] * mu */
  41434. "ldr r10, [%[m], #220]\n\t"
  41435. "ldr r9, [%[a], #220]\n\t"
  41436. "umaal r9, r3, r11, r10\n\t"
  41437. "str r9, [%[a], #220]\n\t"
  41438. /* a[i+56] += m[56] * mu */
  41439. "ldr r10, [%[m], #224]\n\t"
  41440. "ldr r9, [%[a], #224]\n\t"
  41441. "umaal r9, r3, r11, r10\n\t"
  41442. "str r9, [%[a], #224]\n\t"
  41443. /* a[i+57] += m[57] * mu */
  41444. "ldr r10, [%[m], #228]\n\t"
  41445. "ldr r9, [%[a], #228]\n\t"
  41446. "umaal r9, r3, r11, r10\n\t"
  41447. "str r9, [%[a], #228]\n\t"
  41448. /* a[i+58] += m[58] * mu */
  41449. "ldr r10, [%[m], #232]\n\t"
  41450. "ldr r9, [%[a], #232]\n\t"
  41451. "umaal r9, r3, r11, r10\n\t"
  41452. "str r9, [%[a], #232]\n\t"
  41453. /* a[i+59] += m[59] * mu */
  41454. "ldr r10, [%[m], #236]\n\t"
  41455. "ldr r9, [%[a], #236]\n\t"
  41456. "umaal r9, r3, r11, r10\n\t"
  41457. "str r9, [%[a], #236]\n\t"
  41458. /* a[i+60] += m[60] * mu */
  41459. "ldr r10, [%[m], #240]\n\t"
  41460. "ldr r9, [%[a], #240]\n\t"
  41461. "umaal r9, r3, r11, r10\n\t"
  41462. "str r9, [%[a], #240]\n\t"
  41463. /* a[i+61] += m[61] * mu */
  41464. "ldr r10, [%[m], #244]\n\t"
  41465. "ldr r9, [%[a], #244]\n\t"
  41466. "umaal r9, r3, r11, r10\n\t"
  41467. "str r9, [%[a], #244]\n\t"
  41468. /* a[i+62] += m[62] * mu */
  41469. "ldr r10, [%[m], #248]\n\t"
  41470. "ldr r9, [%[a], #248]\n\t"
  41471. "umaal r9, r3, r11, r10\n\t"
  41472. "str r9, [%[a], #248]\n\t"
  41473. /* a[i+63] += m[63] * mu */
  41474. "ldr r10, [%[m], #252]\n\t"
  41475. "ldr r9, [%[a], #252]\n\t"
  41476. "umaal r9, r3, r11, r10\n\t"
  41477. "str r9, [%[a], #252]\n\t"
  41478. /* a[i+64] += m[64] * mu */
  41479. "ldr r10, [%[m], #256]\n\t"
  41480. "ldr r9, [%[a], #256]\n\t"
  41481. "umaal r9, r3, r11, r10\n\t"
  41482. "str r9, [%[a], #256]\n\t"
  41483. /* a[i+65] += m[65] * mu */
  41484. "ldr r10, [%[m], #260]\n\t"
  41485. "ldr r9, [%[a], #260]\n\t"
  41486. "umaal r9, r3, r11, r10\n\t"
  41487. "str r9, [%[a], #260]\n\t"
  41488. /* a[i+66] += m[66] * mu */
  41489. "ldr r10, [%[m], #264]\n\t"
  41490. "ldr r9, [%[a], #264]\n\t"
  41491. "umaal r9, r3, r11, r10\n\t"
  41492. "str r9, [%[a], #264]\n\t"
  41493. /* a[i+67] += m[67] * mu */
  41494. "ldr r10, [%[m], #268]\n\t"
  41495. "ldr r9, [%[a], #268]\n\t"
  41496. "umaal r9, r3, r11, r10\n\t"
  41497. "str r9, [%[a], #268]\n\t"
  41498. /* a[i+68] += m[68] * mu */
  41499. "ldr r10, [%[m], #272]\n\t"
  41500. "ldr r9, [%[a], #272]\n\t"
  41501. "umaal r9, r3, r11, r10\n\t"
  41502. "str r9, [%[a], #272]\n\t"
  41503. /* a[i+69] += m[69] * mu */
  41504. "ldr r10, [%[m], #276]\n\t"
  41505. "ldr r9, [%[a], #276]\n\t"
  41506. "umaal r9, r3, r11, r10\n\t"
  41507. "str r9, [%[a], #276]\n\t"
  41508. /* a[i+70] += m[70] * mu */
  41509. "ldr r10, [%[m], #280]\n\t"
  41510. "ldr r9, [%[a], #280]\n\t"
  41511. "umaal r9, r3, r11, r10\n\t"
  41512. "str r9, [%[a], #280]\n\t"
  41513. /* a[i+71] += m[71] * mu */
  41514. "ldr r10, [%[m], #284]\n\t"
  41515. "ldr r9, [%[a], #284]\n\t"
  41516. "umaal r9, r3, r11, r10\n\t"
  41517. "str r9, [%[a], #284]\n\t"
  41518. /* a[i+72] += m[72] * mu */
  41519. "ldr r10, [%[m], #288]\n\t"
  41520. "ldr r9, [%[a], #288]\n\t"
  41521. "umaal r9, r3, r11, r10\n\t"
  41522. "str r9, [%[a], #288]\n\t"
  41523. /* a[i+73] += m[73] * mu */
  41524. "ldr r10, [%[m], #292]\n\t"
  41525. "ldr r9, [%[a], #292]\n\t"
  41526. "umaal r9, r3, r11, r10\n\t"
  41527. "str r9, [%[a], #292]\n\t"
  41528. /* a[i+74] += m[74] * mu */
  41529. "ldr r10, [%[m], #296]\n\t"
  41530. "ldr r9, [%[a], #296]\n\t"
  41531. "umaal r9, r3, r11, r10\n\t"
  41532. "str r9, [%[a], #296]\n\t"
  41533. /* a[i+75] += m[75] * mu */
  41534. "ldr r10, [%[m], #300]\n\t"
  41535. "ldr r9, [%[a], #300]\n\t"
  41536. "umaal r9, r3, r11, r10\n\t"
  41537. "str r9, [%[a], #300]\n\t"
  41538. /* a[i+76] += m[76] * mu */
  41539. "ldr r10, [%[m], #304]\n\t"
  41540. "ldr r9, [%[a], #304]\n\t"
  41541. "umaal r9, r3, r11, r10\n\t"
  41542. "str r9, [%[a], #304]\n\t"
  41543. /* a[i+77] += m[77] * mu */
  41544. "ldr r10, [%[m], #308]\n\t"
  41545. "ldr r9, [%[a], #308]\n\t"
  41546. "umaal r9, r3, r11, r10\n\t"
  41547. "str r9, [%[a], #308]\n\t"
  41548. /* a[i+78] += m[78] * mu */
  41549. "ldr r10, [%[m], #312]\n\t"
  41550. "ldr r9, [%[a], #312]\n\t"
  41551. "umaal r9, r3, r11, r10\n\t"
  41552. "str r9, [%[a], #312]\n\t"
  41553. /* a[i+79] += m[79] * mu */
  41554. "ldr r10, [%[m], #316]\n\t"
  41555. "ldr r9, [%[a], #316]\n\t"
  41556. "umaal r9, r3, r11, r10\n\t"
  41557. "str r9, [%[a], #316]\n\t"
  41558. /* a[i+80] += m[80] * mu */
  41559. "ldr r10, [%[m], #320]\n\t"
  41560. "ldr r9, [%[a], #320]\n\t"
  41561. "umaal r9, r3, r11, r10\n\t"
  41562. "str r9, [%[a], #320]\n\t"
  41563. /* a[i+81] += m[81] * mu */
  41564. "ldr r10, [%[m], #324]\n\t"
  41565. "ldr r9, [%[a], #324]\n\t"
  41566. "umaal r9, r3, r11, r10\n\t"
  41567. "str r9, [%[a], #324]\n\t"
  41568. /* a[i+82] += m[82] * mu */
  41569. "ldr r10, [%[m], #328]\n\t"
  41570. "ldr r9, [%[a], #328]\n\t"
  41571. "umaal r9, r3, r11, r10\n\t"
  41572. "str r9, [%[a], #328]\n\t"
  41573. /* a[i+83] += m[83] * mu */
  41574. "ldr r10, [%[m], #332]\n\t"
  41575. "ldr r9, [%[a], #332]\n\t"
  41576. "umaal r9, r3, r11, r10\n\t"
  41577. "str r9, [%[a], #332]\n\t"
  41578. /* a[i+84] += m[84] * mu */
  41579. "ldr r10, [%[m], #336]\n\t"
  41580. "ldr r9, [%[a], #336]\n\t"
  41581. "umaal r9, r3, r11, r10\n\t"
  41582. "str r9, [%[a], #336]\n\t"
  41583. /* a[i+85] += m[85] * mu */
  41584. "ldr r10, [%[m], #340]\n\t"
  41585. "ldr r9, [%[a], #340]\n\t"
  41586. "umaal r9, r3, r11, r10\n\t"
  41587. "str r9, [%[a], #340]\n\t"
  41588. /* a[i+86] += m[86] * mu */
  41589. "ldr r10, [%[m], #344]\n\t"
  41590. "ldr r9, [%[a], #344]\n\t"
  41591. "umaal r9, r3, r11, r10\n\t"
  41592. "str r9, [%[a], #344]\n\t"
  41593. /* a[i+87] += m[87] * mu */
  41594. "ldr r10, [%[m], #348]\n\t"
  41595. "ldr r9, [%[a], #348]\n\t"
  41596. "umaal r9, r3, r11, r10\n\t"
  41597. "str r9, [%[a], #348]\n\t"
  41598. /* a[i+88] += m[88] * mu */
  41599. "ldr r10, [%[m], #352]\n\t"
  41600. "ldr r9, [%[a], #352]\n\t"
  41601. "umaal r9, r3, r11, r10\n\t"
  41602. "str r9, [%[a], #352]\n\t"
  41603. /* a[i+89] += m[89] * mu */
  41604. "ldr r10, [%[m], #356]\n\t"
  41605. "ldr r9, [%[a], #356]\n\t"
  41606. "umaal r9, r3, r11, r10\n\t"
  41607. "str r9, [%[a], #356]\n\t"
  41608. /* a[i+90] += m[90] * mu */
  41609. "ldr r10, [%[m], #360]\n\t"
  41610. "ldr r9, [%[a], #360]\n\t"
  41611. "umaal r9, r3, r11, r10\n\t"
  41612. "str r9, [%[a], #360]\n\t"
  41613. /* a[i+91] += m[91] * mu */
  41614. "ldr r10, [%[m], #364]\n\t"
  41615. "ldr r9, [%[a], #364]\n\t"
  41616. "umaal r9, r3, r11, r10\n\t"
  41617. "str r9, [%[a], #364]\n\t"
  41618. /* a[i+92] += m[92] * mu */
  41619. "ldr r10, [%[m], #368]\n\t"
  41620. "ldr r9, [%[a], #368]\n\t"
  41621. "umaal r9, r3, r11, r10\n\t"
  41622. "str r9, [%[a], #368]\n\t"
  41623. /* a[i+93] += m[93] * mu */
  41624. "ldr r10, [%[m], #372]\n\t"
  41625. "ldr r9, [%[a], #372]\n\t"
  41626. "umaal r9, r3, r11, r10\n\t"
  41627. "str r9, [%[a], #372]\n\t"
  41628. /* a[i+94] += m[94] * mu */
  41629. "ldr r10, [%[m], #376]\n\t"
  41630. "ldr r9, [%[a], #376]\n\t"
  41631. "umaal r9, r3, r11, r10\n\t"
  41632. "str r9, [%[a], #376]\n\t"
  41633. /* a[i+95] += m[95] * mu */
  41634. "ldr r10, [%[m], #380]\n\t"
  41635. "ldr r9, [%[a], #380]\n\t"
  41636. "umaal r9, r3, r11, r10\n\t"
  41637. "ldr r11, [%[a], #384]\n\t"
  41638. "mov r10, #0\n\t"
  41639. "umaal r3, r11, r10, r10\n\t"
  41640. "str r9, [%[a], #380]\n\t"
  41641. "adds r3, r3, lr\n\t"
  41642. "adc lr, r11, #0\n\t"
  41643. "str r3, [%[a], #384]\n\t"
  41644. /* i += 1 */
  41645. "add r12, r12, #4\n\t"
  41646. "add %[a], %[a], #4\n\t"
  41647. "cmp r12, #0x180\n\t"
  41648. "blt L_sp_3072_mont_reduce_96_word_%=\n\t"
  41649. /* Loop Done */
  41650. "str r4, [%[a]]\n\t"
  41651. "str r5, [%[a], #4]\n\t"
  41652. "str r6, [%[a], #8]\n\t"
  41653. "str r7, [%[a], #12]\n\t"
  41654. "str r8, [%[a], #16]\n\t"
  41655. "mov %[mp], lr\n\t"
  41656. : [a] "+r" (a), [m] "+r" (m), [mp] "+r" (mp)
  41657. :
  41658. : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "cc"
  41659. );
  41660. sp_3072_cond_sub_96(a - 96, a, m, (sp_digit)0 - mp);
  41661. }
  41662. #endif
  41663. /* Multiply two Montgomery form numbers mod the modulus (prime).
  41664. * (r = a * b mod m)
  41665. *
  41666. * r Result of multiplication.
  41667. * a First number to multiply in Montgomery form.
  41668. * b Second number to multiply in Montgomery form.
  41669. * m Modulus (prime).
  41670. * mp Montgomery multiplier.
  41671. */
  41672. SP_NOINLINE static void sp_3072_mont_mul_96(sp_digit* r, const sp_digit* a,
  41673. const sp_digit* b, const sp_digit* m, sp_digit mp)
  41674. {
  41675. sp_3072_mul_96(r, a, b);
  41676. sp_3072_mont_reduce_96(r, m, mp);
  41677. }
  41678. /* Square the Montgomery form number. (r = a * a mod m)
  41679. *
  41680. * r Result of squaring.
  41681. * a Number to square in Montgomery form.
  41682. * m Modulus (prime).
  41683. * mp Montgomery multiplier.
  41684. */
  41685. SP_NOINLINE static void sp_3072_mont_sqr_96(sp_digit* r, const sp_digit* a,
  41686. const sp_digit* m, sp_digit mp)
  41687. {
  41688. sp_3072_sqr_96(r, a);
  41689. sp_3072_mont_reduce_96(r, m, mp);
  41690. }
  41691. #ifdef WOLFSSL_SP_SMALL
  41692. /* Sub b from a into r. (r = a - b)
  41693. *
  41694. * r A single precision integer.
  41695. * a A single precision integer.
  41696. * b A single precision integer.
  41697. */
  41698. static sp_digit sp_3072_sub_96(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p)
  41699. {
  41700. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  41701. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  41702. register const sp_digit* b asm ("r2") = (const sp_digit*)b_p;
  41703. __asm__ __volatile__ (
  41704. "mov r12, #0\n\t"
  41705. "add lr, %[a], #0x180\n\t"
  41706. "\n"
  41707. "L_sp_3072_sub_96_word_%=: \n\t"
  41708. "rsbs r12, r12, #0\n\t"
  41709. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  41710. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  41711. "sbcs r3, r3, r7\n\t"
  41712. "sbcs r4, r4, r8\n\t"
  41713. "sbcs r5, r5, r9\n\t"
  41714. "sbcs r6, r6, r10\n\t"
  41715. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  41716. "sbc r12, r3, r3\n\t"
  41717. "cmp %[a], lr\n\t"
  41718. "bne L_sp_3072_sub_96_word_%=\n\t"
  41719. "mov %[r], r12\n\t"
  41720. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  41721. :
  41722. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r12", "lr", "cc"
  41723. );
  41724. return (uint32_t)(size_t)r;
  41725. }
  41726. #else
  41727. /* Sub b from a into r. (r = a - b)
  41728. *
  41729. * r A single precision integer.
  41730. * a A single precision integer.
  41731. * b A single precision integer.
  41732. */
  41733. static sp_digit sp_3072_sub_96(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p)
  41734. {
  41735. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  41736. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  41737. register const sp_digit* b asm ("r2") = (const sp_digit*)b_p;
  41738. __asm__ __volatile__ (
  41739. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  41740. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  41741. "subs r3, r3, r7\n\t"
  41742. "sbcs r4, r4, r8\n\t"
  41743. "sbcs r5, r5, r9\n\t"
  41744. "sbcs r6, r6, r10\n\t"
  41745. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  41746. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  41747. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  41748. "sbcs r3, r3, r7\n\t"
  41749. "sbcs r4, r4, r8\n\t"
  41750. "sbcs r5, r5, r9\n\t"
  41751. "sbcs r6, r6, r10\n\t"
  41752. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  41753. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  41754. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  41755. "sbcs r3, r3, r7\n\t"
  41756. "sbcs r4, r4, r8\n\t"
  41757. "sbcs r5, r5, r9\n\t"
  41758. "sbcs r6, r6, r10\n\t"
  41759. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  41760. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  41761. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  41762. "sbcs r3, r3, r7\n\t"
  41763. "sbcs r4, r4, r8\n\t"
  41764. "sbcs r5, r5, r9\n\t"
  41765. "sbcs r6, r6, r10\n\t"
  41766. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  41767. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  41768. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  41769. "sbcs r3, r3, r7\n\t"
  41770. "sbcs r4, r4, r8\n\t"
  41771. "sbcs r5, r5, r9\n\t"
  41772. "sbcs r6, r6, r10\n\t"
  41773. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  41774. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  41775. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  41776. "sbcs r3, r3, r7\n\t"
  41777. "sbcs r4, r4, r8\n\t"
  41778. "sbcs r5, r5, r9\n\t"
  41779. "sbcs r6, r6, r10\n\t"
  41780. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  41781. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  41782. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  41783. "sbcs r3, r3, r7\n\t"
  41784. "sbcs r4, r4, r8\n\t"
  41785. "sbcs r5, r5, r9\n\t"
  41786. "sbcs r6, r6, r10\n\t"
  41787. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  41788. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  41789. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  41790. "sbcs r3, r3, r7\n\t"
  41791. "sbcs r4, r4, r8\n\t"
  41792. "sbcs r5, r5, r9\n\t"
  41793. "sbcs r6, r6, r10\n\t"
  41794. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  41795. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  41796. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  41797. "sbcs r3, r3, r7\n\t"
  41798. "sbcs r4, r4, r8\n\t"
  41799. "sbcs r5, r5, r9\n\t"
  41800. "sbcs r6, r6, r10\n\t"
  41801. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  41802. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  41803. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  41804. "sbcs r3, r3, r7\n\t"
  41805. "sbcs r4, r4, r8\n\t"
  41806. "sbcs r5, r5, r9\n\t"
  41807. "sbcs r6, r6, r10\n\t"
  41808. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  41809. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  41810. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  41811. "sbcs r3, r3, r7\n\t"
  41812. "sbcs r4, r4, r8\n\t"
  41813. "sbcs r5, r5, r9\n\t"
  41814. "sbcs r6, r6, r10\n\t"
  41815. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  41816. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  41817. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  41818. "sbcs r3, r3, r7\n\t"
  41819. "sbcs r4, r4, r8\n\t"
  41820. "sbcs r5, r5, r9\n\t"
  41821. "sbcs r6, r6, r10\n\t"
  41822. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  41823. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  41824. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  41825. "sbcs r3, r3, r7\n\t"
  41826. "sbcs r4, r4, r8\n\t"
  41827. "sbcs r5, r5, r9\n\t"
  41828. "sbcs r6, r6, r10\n\t"
  41829. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  41830. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  41831. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  41832. "sbcs r3, r3, r7\n\t"
  41833. "sbcs r4, r4, r8\n\t"
  41834. "sbcs r5, r5, r9\n\t"
  41835. "sbcs r6, r6, r10\n\t"
  41836. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  41837. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  41838. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  41839. "sbcs r3, r3, r7\n\t"
  41840. "sbcs r4, r4, r8\n\t"
  41841. "sbcs r5, r5, r9\n\t"
  41842. "sbcs r6, r6, r10\n\t"
  41843. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  41844. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  41845. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  41846. "sbcs r3, r3, r7\n\t"
  41847. "sbcs r4, r4, r8\n\t"
  41848. "sbcs r5, r5, r9\n\t"
  41849. "sbcs r6, r6, r10\n\t"
  41850. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  41851. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  41852. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  41853. "sbcs r3, r3, r7\n\t"
  41854. "sbcs r4, r4, r8\n\t"
  41855. "sbcs r5, r5, r9\n\t"
  41856. "sbcs r6, r6, r10\n\t"
  41857. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  41858. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  41859. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  41860. "sbcs r3, r3, r7\n\t"
  41861. "sbcs r4, r4, r8\n\t"
  41862. "sbcs r5, r5, r9\n\t"
  41863. "sbcs r6, r6, r10\n\t"
  41864. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  41865. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  41866. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  41867. "sbcs r3, r3, r7\n\t"
  41868. "sbcs r4, r4, r8\n\t"
  41869. "sbcs r5, r5, r9\n\t"
  41870. "sbcs r6, r6, r10\n\t"
  41871. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  41872. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  41873. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  41874. "sbcs r3, r3, r7\n\t"
  41875. "sbcs r4, r4, r8\n\t"
  41876. "sbcs r5, r5, r9\n\t"
  41877. "sbcs r6, r6, r10\n\t"
  41878. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  41879. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  41880. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  41881. "sbcs r3, r3, r7\n\t"
  41882. "sbcs r4, r4, r8\n\t"
  41883. "sbcs r5, r5, r9\n\t"
  41884. "sbcs r6, r6, r10\n\t"
  41885. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  41886. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  41887. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  41888. "sbcs r3, r3, r7\n\t"
  41889. "sbcs r4, r4, r8\n\t"
  41890. "sbcs r5, r5, r9\n\t"
  41891. "sbcs r6, r6, r10\n\t"
  41892. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  41893. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  41894. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  41895. "sbcs r3, r3, r7\n\t"
  41896. "sbcs r4, r4, r8\n\t"
  41897. "sbcs r5, r5, r9\n\t"
  41898. "sbcs r6, r6, r10\n\t"
  41899. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  41900. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  41901. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  41902. "sbcs r3, r3, r7\n\t"
  41903. "sbcs r4, r4, r8\n\t"
  41904. "sbcs r5, r5, r9\n\t"
  41905. "sbcs r6, r6, r10\n\t"
  41906. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  41907. "sbc %[r], r6, r6\n\t"
  41908. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  41909. :
  41910. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "cc"
  41911. );
  41912. return (uint32_t)(size_t)r;
  41913. }
  41914. #endif /* WOLFSSL_SP_SMALL */
  41915. #ifdef WOLFSSL_SP_USE_UDIV
  41916. /* Divide the double width number (d1|d0) by the divisor. (d1|d0 / div)
  41917. *
  41918. * d1 The high order half of the number to divide.
  41919. * d0 The low order half of the number to divide.
  41920. * div The divisor.
  41921. * returns the result of the division.
  41922. *
  41923. * Note that this is an approximate div. It may give an answer 1 larger.
  41924. */
  41925. static sp_digit div_3072_word_96(sp_digit d1_p, sp_digit d0_p, sp_digit div_p)
  41926. {
  41927. register sp_digit d1 asm ("r0") = (sp_digit)d1_p;
  41928. register sp_digit d0 asm ("r1") = (sp_digit)d0_p;
  41929. register sp_digit div asm ("r2") = (sp_digit)div_p;
  41930. __asm__ __volatile__ (
  41931. "lsr r6, %[div], #16\n\t"
  41932. "add lr, r6, #1\n\t"
  41933. "udiv r4, %[d1], lr\n\t"
  41934. "lsl r5, %[div], #16\n\t"
  41935. "lsl r4, r4, #16\n\t"
  41936. "umull r3, r12, %[div], r4\n\t"
  41937. "subs %[d0], %[d0], r3\n\t"
  41938. "sbc %[d1], %[d1], r12\n\t"
  41939. "subs r3, %[d1], lr\n\t"
  41940. "sbc r7, r7, r7\n\t"
  41941. "add r7, r7, #1\n\t"
  41942. "rsb r8, r7, #0\n\t"
  41943. "lsl r7, r7, #16\n\t"
  41944. "and r5, r5, r8\n\t"
  41945. "and r6, r6, r8\n\t"
  41946. "subs %[d0], %[d0], r5\n\t"
  41947. "add r4, r4, r7\n\t"
  41948. "sbc %[d1], %[d1], r6\n\t"
  41949. "lsl r12, %[d1], #16\n\t"
  41950. "lsr r3, %[d0], #16\n\t"
  41951. "orr r3, r3, r12\n\t"
  41952. "udiv r3, r3, lr\n\t"
  41953. "add r4, r4, r3\n\t"
  41954. "umull r3, r12, %[div], r3\n\t"
  41955. "subs %[d0], %[d0], r3\n\t"
  41956. "sbc %[d1], %[d1], r12\n\t"
  41957. "lsl r12, %[d1], #16\n\t"
  41958. "lsr r3, %[d0], #16\n\t"
  41959. "orr r3, r3, r12\n\t"
  41960. "udiv r3, r3, lr\n\t"
  41961. "add r4, r4, r3\n\t"
  41962. "mul r3, %[div], r3\n\t"
  41963. "sub %[d0], %[d0], r3\n\t"
  41964. "udiv r3, %[d0], %[div]\n\t"
  41965. "add %[d1], r4, r3\n\t"
  41966. : [d1] "+r" (d1), [d0] "+r" (d0), [div] "+r" (div)
  41967. :
  41968. : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8", "cc"
  41969. );
  41970. return (uint32_t)(size_t)d1;
  41971. }
  41972. #else
  41973. /* Divide the double width number (d1|d0) by the divisor. (d1|d0 / div)
  41974. *
  41975. * d1 The high order half of the number to divide.
  41976. * d0 The low order half of the number to divide.
  41977. * div The divisor.
  41978. * returns the result of the division.
  41979. *
  41980. * Note that this is an approximate div. It may give an answer 1 larger.
  41981. */
  41982. static sp_digit div_3072_word_96(sp_digit d1_p, sp_digit d0_p, sp_digit div_p)
  41983. {
  41984. register sp_digit d1 asm ("r0") = (sp_digit)d1_p;
  41985. register sp_digit d0 asm ("r1") = (sp_digit)d0_p;
  41986. register sp_digit div asm ("r2") = (sp_digit)div_p;
  41987. __asm__ __volatile__ (
  41988. "lsr lr, %[div], #1\n\t"
  41989. "add lr, lr, #1\n\t"
  41990. "mov r4, %[d0]\n\t"
  41991. "mov r5, %[d1]\n\t"
  41992. /* Do top 32 */
  41993. "subs r6, lr, r5\n\t"
  41994. "sbc r6, r6, r6\n\t"
  41995. "mov r3, #0\n\t"
  41996. "sub r3, r3, r6\n\t"
  41997. "and r6, r6, lr\n\t"
  41998. "subs r5, r5, r6\n\t"
  41999. /* Next 30 bits */
  42000. "mov r12, #29\n\t"
  42001. "\n"
  42002. "L_div_3072_word_96_bit_%=: \n\t"
  42003. "lsls r4, r4, #1\n\t"
  42004. "adc r5, r5, r5\n\t"
  42005. "subs r6, lr, r5\n\t"
  42006. "sbc r6, r6, r6\n\t"
  42007. "add r3, r3, r3\n\t"
  42008. "sub r3, r3, r6\n\t"
  42009. "and r6, r6, lr\n\t"
  42010. "subs r5, r5, r6\n\t"
  42011. "subs r12, r12, #1\n\t"
  42012. "bpl L_div_3072_word_96_bit_%=\n\t"
  42013. "add r3, r3, r3\n\t"
  42014. "add r3, r3, #1\n\t"
  42015. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  42016. "lsl r7, r3, #16\n\t"
  42017. "lsl r4, %[div], #16\n\t"
  42018. "lsr r7, r7, #16\n\t"
  42019. "lsr r4, r4, #16\n\t"
  42020. "mul r4, r7, r4\n\t"
  42021. "lsr r8, %[div], #16\n\t"
  42022. "mul r7, r8, r7\n\t"
  42023. "lsr r5, r7, #16\n\t"
  42024. "lsl r7, r7, #16\n\t"
  42025. "adds r4, r4, r7\n\t"
  42026. "adc r5, r5, #0\n\t"
  42027. "lsr r7, r3, #16\n\t"
  42028. "mul r8, r7, r8\n\t"
  42029. "add r5, r5, r8\n\t"
  42030. "lsl r8, %[div], #16\n\t"
  42031. "lsr r8, r8, #16\n\t"
  42032. "mul r7, r8, r7\n\t"
  42033. "lsr r8, r7, #16\n\t"
  42034. "lsl r7, r7, #16\n\t"
  42035. "adds r4, r4, r7\n\t"
  42036. "adc r5, r5, r8\n\t"
  42037. #else
  42038. "umull r4, r5, r3, %[div]\n\t"
  42039. #endif
  42040. "subs r7, %[d0], r4\n\t"
  42041. "sbc r8, %[d1], r5\n\t"
  42042. "add r3, r3, r8\n\t"
  42043. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  42044. "lsl r7, r3, #16\n\t"
  42045. "lsl r4, %[div], #16\n\t"
  42046. "lsr r7, r7, #16\n\t"
  42047. "lsr r4, r4, #16\n\t"
  42048. "mul r4, r7, r4\n\t"
  42049. "lsr r8, %[div], #16\n\t"
  42050. "mul r7, r8, r7\n\t"
  42051. "lsr r5, r7, #16\n\t"
  42052. "lsl r7, r7, #16\n\t"
  42053. "adds r4, r4, r7\n\t"
  42054. "adc r5, r5, #0\n\t"
  42055. "lsr r7, r3, #16\n\t"
  42056. "mul r8, r7, r8\n\t"
  42057. "add r5, r5, r8\n\t"
  42058. "lsl r8, %[div], #16\n\t"
  42059. "lsr r8, r8, #16\n\t"
  42060. "mul r7, r8, r7\n\t"
  42061. "lsr r8, r7, #16\n\t"
  42062. "lsl r7, r7, #16\n\t"
  42063. "adds r4, r4, r7\n\t"
  42064. "adc r5, r5, r8\n\t"
  42065. #else
  42066. "umull r4, r5, r3, %[div]\n\t"
  42067. #endif
  42068. "subs r7, %[d0], r4\n\t"
  42069. "sbc r8, %[d1], r5\n\t"
  42070. "add r3, r3, r8\n\t"
  42071. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  42072. "lsl r7, r3, #16\n\t"
  42073. "lsl r4, %[div], #16\n\t"
  42074. "lsr r7, r7, #16\n\t"
  42075. "lsr r4, r4, #16\n\t"
  42076. "mul r4, r7, r4\n\t"
  42077. "lsr r8, %[div], #16\n\t"
  42078. "mul r7, r8, r7\n\t"
  42079. "lsr r5, r7, #16\n\t"
  42080. "lsl r7, r7, #16\n\t"
  42081. "adds r4, r4, r7\n\t"
  42082. "adc r5, r5, #0\n\t"
  42083. "lsr r7, r3, #16\n\t"
  42084. "mul r8, r7, r8\n\t"
  42085. "add r5, r5, r8\n\t"
  42086. "lsl r8, %[div], #16\n\t"
  42087. "lsr r8, r8, #16\n\t"
  42088. "mul r7, r8, r7\n\t"
  42089. "lsr r8, r7, #16\n\t"
  42090. "lsl r7, r7, #16\n\t"
  42091. "adds r4, r4, r7\n\t"
  42092. "adc r5, r5, r8\n\t"
  42093. #else
  42094. "umull r4, r5, r3, %[div]\n\t"
  42095. #endif
  42096. "subs r7, %[d0], r4\n\t"
  42097. "sbc r8, %[d1], r5\n\t"
  42098. "add r3, r3, r8\n\t"
  42099. "subs r6, %[div], r7\n\t"
  42100. "sbc r6, r6, r6\n\t"
  42101. "sub %[d1], r3, r6\n\t"
  42102. : [d1] "+r" (d1), [d0] "+r" (d0), [div] "+r" (div)
  42103. :
  42104. : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8", "cc"
  42105. );
  42106. return (uint32_t)(size_t)d1;
  42107. }
  42108. #endif
  42109. /* Divide d in a and put remainder into r (m*d + r = a)
  42110. * m is not calculated as it is not needed at this time.
  42111. *
  42112. * a Number to be divided.
  42113. * d Number to divide with.
  42114. * m Multiplier result.
  42115. * r Remainder from the division.
  42116. * returns MP_OKAY indicating success.
  42117. */
  42118. static WC_INLINE int sp_3072_div_96_cond(const sp_digit* a, const sp_digit* d,
  42119. sp_digit* m, sp_digit* r)
  42120. {
  42121. sp_digit t1[192], t2[97];
  42122. sp_digit div, r1;
  42123. int i;
  42124. (void)m;
  42125. div = d[95];
  42126. XMEMCPY(t1, a, sizeof(*t1) * 2 * 96);
  42127. for (i = 95; i > 0; i--) {
  42128. if (t1[i + 96] != d[i])
  42129. break;
  42130. }
  42131. if (t1[i + 96] >= d[i]) {
  42132. sp_3072_sub_in_place_96(&t1[96], d);
  42133. }
  42134. for (i = 95; i >= 0; i--) {
  42135. if (t1[96 + i] == div) {
  42136. r1 = SP_DIGIT_MAX;
  42137. }
  42138. else {
  42139. r1 = div_3072_word_96(t1[96 + i], t1[96 + i - 1], div);
  42140. }
  42141. sp_3072_mul_d_96(t2, d, r1);
  42142. t1[96 + i] += sp_3072_sub_in_place_96(&t1[i], t2);
  42143. t1[96 + i] -= t2[96];
  42144. if (t1[96 + i] != 0) {
  42145. t1[96 + i] += sp_3072_add_96(&t1[i], &t1[i], d);
  42146. if (t1[96 + i] != 0)
  42147. t1[96 + i] += sp_3072_add_96(&t1[i], &t1[i], d);
  42148. }
  42149. }
  42150. for (i = 95; i > 0; i--) {
  42151. if (t1[i] != d[i])
  42152. break;
  42153. }
  42154. if (t1[i] >= d[i]) {
  42155. sp_3072_sub_96(r, t1, d);
  42156. }
  42157. else {
  42158. XMEMCPY(r, t1, sizeof(*t1) * 96);
  42159. }
  42160. return MP_OKAY;
  42161. }
  42162. /* Reduce a modulo m into r. (r = a mod m)
  42163. *
  42164. * r A single precision number that is the reduced result.
  42165. * a A single precision number that is to be reduced.
  42166. * m A single precision number that is the modulus to reduce with.
  42167. * returns MP_OKAY indicating success.
  42168. */
  42169. static WC_INLINE int sp_3072_mod_96_cond(sp_digit* r, const sp_digit* a,
  42170. const sp_digit* m)
  42171. {
  42172. return sp_3072_div_96_cond(a, m, NULL, r);
  42173. }
  42174. #if (defined(WOLFSSL_HAVE_SP_RSA) && !defined(WOLFSSL_RSA_PUBLIC_ONLY)) || defined(WOLFSSL_HAVE_SP_DH)
  42175. #if defined(WOLFSSL_HAVE_SP_DH) || !defined(WOLFSSL_RSA_PUBLIC_ONLY)
  42176. /* AND m into each word of a and store in r.
  42177. *
  42178. * r A single precision integer.
  42179. * a A single precision integer.
  42180. * m Mask to AND against each digit.
  42181. */
  42182. static void sp_3072_mask_96(sp_digit* r, const sp_digit* a, sp_digit m)
  42183. {
  42184. #ifdef WOLFSSL_SP_SMALL
  42185. int i;
  42186. for (i=0; i<96; i++) {
  42187. r[i] = a[i] & m;
  42188. }
  42189. #else
  42190. int i;
  42191. for (i = 0; i < 96; i += 8) {
  42192. r[i+0] = a[i+0] & m;
  42193. r[i+1] = a[i+1] & m;
  42194. r[i+2] = a[i+2] & m;
  42195. r[i+3] = a[i+3] & m;
  42196. r[i+4] = a[i+4] & m;
  42197. r[i+5] = a[i+5] & m;
  42198. r[i+6] = a[i+6] & m;
  42199. r[i+7] = a[i+7] & m;
  42200. }
  42201. #endif
  42202. }
  42203. /* Compare a with b in constant time.
  42204. *
  42205. * a A single precision integer.
  42206. * b A single precision integer.
  42207. * return -ve, 0 or +ve if a is less than, equal to or greater than b
  42208. * respectively.
  42209. */
  42210. static sp_int32 sp_3072_cmp_96(const sp_digit* a_p, const sp_digit* b_p)
  42211. {
  42212. register const sp_digit* a asm ("r0") = (const sp_digit*)a_p;
  42213. register const sp_digit* b asm ("r1") = (const sp_digit*)b_p;
  42214. __asm__ __volatile__ (
  42215. "mov r2, #-1\n\t"
  42216. "mov r6, #1\n\t"
  42217. "mov r5, #0\n\t"
  42218. "mov r3, #-1\n\t"
  42219. #ifdef WOLFSSL_SP_SMALL
  42220. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  42221. "mov r4, #0x1\n\t"
  42222. "lsl r4, r4, #8\n\t"
  42223. "add r4, r4, #0x7c\n\t"
  42224. #else
  42225. "mov r4, #0x17c\n\t"
  42226. #endif
  42227. "\n"
  42228. "L_sp_3072_cmp_96_words_%=: \n\t"
  42229. "ldr r12, [%[a], r4]\n\t"
  42230. "ldr lr, [%[b], r4]\n\t"
  42231. "and r12, r12, r3\n\t"
  42232. "and lr, lr, r3\n\t"
  42233. "subs r12, r12, lr\n\t"
  42234. "it hi\n\t"
  42235. "movhi r2, r6\n\t"
  42236. "it lo\n\t"
  42237. "movlo r2, r3\n\t"
  42238. "it ne\n\t"
  42239. "movne r3, r5\n\t"
  42240. "subs r4, r4, #4\n\t"
  42241. "bcs L_sp_3072_cmp_96_words_%=\n\t"
  42242. "eor r2, r2, r3\n\t"
  42243. #else
  42244. "ldr r12, [%[a], #380]\n\t"
  42245. "ldr lr, [%[b], #380]\n\t"
  42246. "and r12, r12, r3\n\t"
  42247. "and lr, lr, r3\n\t"
  42248. "subs r12, r12, lr\n\t"
  42249. "it hi\n\t"
  42250. "movhi r2, r6\n\t"
  42251. "it lo\n\t"
  42252. "movlo r2, r3\n\t"
  42253. "it ne\n\t"
  42254. "movne r3, r5\n\t"
  42255. "ldr r12, [%[a], #376]\n\t"
  42256. "ldr lr, [%[b], #376]\n\t"
  42257. "and r12, r12, r3\n\t"
  42258. "and lr, lr, r3\n\t"
  42259. "subs r12, r12, lr\n\t"
  42260. "it hi\n\t"
  42261. "movhi r2, r6\n\t"
  42262. "it lo\n\t"
  42263. "movlo r2, r3\n\t"
  42264. "it ne\n\t"
  42265. "movne r3, r5\n\t"
  42266. "ldr r12, [%[a], #372]\n\t"
  42267. "ldr lr, [%[b], #372]\n\t"
  42268. "and r12, r12, r3\n\t"
  42269. "and lr, lr, r3\n\t"
  42270. "subs r12, r12, lr\n\t"
  42271. "it hi\n\t"
  42272. "movhi r2, r6\n\t"
  42273. "it lo\n\t"
  42274. "movlo r2, r3\n\t"
  42275. "it ne\n\t"
  42276. "movne r3, r5\n\t"
  42277. "ldr r12, [%[a], #368]\n\t"
  42278. "ldr lr, [%[b], #368]\n\t"
  42279. "and r12, r12, r3\n\t"
  42280. "and lr, lr, r3\n\t"
  42281. "subs r12, r12, lr\n\t"
  42282. "it hi\n\t"
  42283. "movhi r2, r6\n\t"
  42284. "it lo\n\t"
  42285. "movlo r2, r3\n\t"
  42286. "it ne\n\t"
  42287. "movne r3, r5\n\t"
  42288. "ldr r12, [%[a], #364]\n\t"
  42289. "ldr lr, [%[b], #364]\n\t"
  42290. "and r12, r12, r3\n\t"
  42291. "and lr, lr, r3\n\t"
  42292. "subs r12, r12, lr\n\t"
  42293. "it hi\n\t"
  42294. "movhi r2, r6\n\t"
  42295. "it lo\n\t"
  42296. "movlo r2, r3\n\t"
  42297. "it ne\n\t"
  42298. "movne r3, r5\n\t"
  42299. "ldr r12, [%[a], #360]\n\t"
  42300. "ldr lr, [%[b], #360]\n\t"
  42301. "and r12, r12, r3\n\t"
  42302. "and lr, lr, r3\n\t"
  42303. "subs r12, r12, lr\n\t"
  42304. "it hi\n\t"
  42305. "movhi r2, r6\n\t"
  42306. "it lo\n\t"
  42307. "movlo r2, r3\n\t"
  42308. "it ne\n\t"
  42309. "movne r3, r5\n\t"
  42310. "ldr r12, [%[a], #356]\n\t"
  42311. "ldr lr, [%[b], #356]\n\t"
  42312. "and r12, r12, r3\n\t"
  42313. "and lr, lr, r3\n\t"
  42314. "subs r12, r12, lr\n\t"
  42315. "it hi\n\t"
  42316. "movhi r2, r6\n\t"
  42317. "it lo\n\t"
  42318. "movlo r2, r3\n\t"
  42319. "it ne\n\t"
  42320. "movne r3, r5\n\t"
  42321. "ldr r12, [%[a], #352]\n\t"
  42322. "ldr lr, [%[b], #352]\n\t"
  42323. "and r12, r12, r3\n\t"
  42324. "and lr, lr, r3\n\t"
  42325. "subs r12, r12, lr\n\t"
  42326. "it hi\n\t"
  42327. "movhi r2, r6\n\t"
  42328. "it lo\n\t"
  42329. "movlo r2, r3\n\t"
  42330. "it ne\n\t"
  42331. "movne r3, r5\n\t"
  42332. "ldr r12, [%[a], #348]\n\t"
  42333. "ldr lr, [%[b], #348]\n\t"
  42334. "and r12, r12, r3\n\t"
  42335. "and lr, lr, r3\n\t"
  42336. "subs r12, r12, lr\n\t"
  42337. "it hi\n\t"
  42338. "movhi r2, r6\n\t"
  42339. "it lo\n\t"
  42340. "movlo r2, r3\n\t"
  42341. "it ne\n\t"
  42342. "movne r3, r5\n\t"
  42343. "ldr r12, [%[a], #344]\n\t"
  42344. "ldr lr, [%[b], #344]\n\t"
  42345. "and r12, r12, r3\n\t"
  42346. "and lr, lr, r3\n\t"
  42347. "subs r12, r12, lr\n\t"
  42348. "it hi\n\t"
  42349. "movhi r2, r6\n\t"
  42350. "it lo\n\t"
  42351. "movlo r2, r3\n\t"
  42352. "it ne\n\t"
  42353. "movne r3, r5\n\t"
  42354. "ldr r12, [%[a], #340]\n\t"
  42355. "ldr lr, [%[b], #340]\n\t"
  42356. "and r12, r12, r3\n\t"
  42357. "and lr, lr, r3\n\t"
  42358. "subs r12, r12, lr\n\t"
  42359. "it hi\n\t"
  42360. "movhi r2, r6\n\t"
  42361. "it lo\n\t"
  42362. "movlo r2, r3\n\t"
  42363. "it ne\n\t"
  42364. "movne r3, r5\n\t"
  42365. "ldr r12, [%[a], #336]\n\t"
  42366. "ldr lr, [%[b], #336]\n\t"
  42367. "and r12, r12, r3\n\t"
  42368. "and lr, lr, r3\n\t"
  42369. "subs r12, r12, lr\n\t"
  42370. "it hi\n\t"
  42371. "movhi r2, r6\n\t"
  42372. "it lo\n\t"
  42373. "movlo r2, r3\n\t"
  42374. "it ne\n\t"
  42375. "movne r3, r5\n\t"
  42376. "ldr r12, [%[a], #332]\n\t"
  42377. "ldr lr, [%[b], #332]\n\t"
  42378. "and r12, r12, r3\n\t"
  42379. "and lr, lr, r3\n\t"
  42380. "subs r12, r12, lr\n\t"
  42381. "it hi\n\t"
  42382. "movhi r2, r6\n\t"
  42383. "it lo\n\t"
  42384. "movlo r2, r3\n\t"
  42385. "it ne\n\t"
  42386. "movne r3, r5\n\t"
  42387. "ldr r12, [%[a], #328]\n\t"
  42388. "ldr lr, [%[b], #328]\n\t"
  42389. "and r12, r12, r3\n\t"
  42390. "and lr, lr, r3\n\t"
  42391. "subs r12, r12, lr\n\t"
  42392. "it hi\n\t"
  42393. "movhi r2, r6\n\t"
  42394. "it lo\n\t"
  42395. "movlo r2, r3\n\t"
  42396. "it ne\n\t"
  42397. "movne r3, r5\n\t"
  42398. "ldr r12, [%[a], #324]\n\t"
  42399. "ldr lr, [%[b], #324]\n\t"
  42400. "and r12, r12, r3\n\t"
  42401. "and lr, lr, r3\n\t"
  42402. "subs r12, r12, lr\n\t"
  42403. "it hi\n\t"
  42404. "movhi r2, r6\n\t"
  42405. "it lo\n\t"
  42406. "movlo r2, r3\n\t"
  42407. "it ne\n\t"
  42408. "movne r3, r5\n\t"
  42409. "ldr r12, [%[a], #320]\n\t"
  42410. "ldr lr, [%[b], #320]\n\t"
  42411. "and r12, r12, r3\n\t"
  42412. "and lr, lr, r3\n\t"
  42413. "subs r12, r12, lr\n\t"
  42414. "it hi\n\t"
  42415. "movhi r2, r6\n\t"
  42416. "it lo\n\t"
  42417. "movlo r2, r3\n\t"
  42418. "it ne\n\t"
  42419. "movne r3, r5\n\t"
  42420. "ldr r12, [%[a], #316]\n\t"
  42421. "ldr lr, [%[b], #316]\n\t"
  42422. "and r12, r12, r3\n\t"
  42423. "and lr, lr, r3\n\t"
  42424. "subs r12, r12, lr\n\t"
  42425. "it hi\n\t"
  42426. "movhi r2, r6\n\t"
  42427. "it lo\n\t"
  42428. "movlo r2, r3\n\t"
  42429. "it ne\n\t"
  42430. "movne r3, r5\n\t"
  42431. "ldr r12, [%[a], #312]\n\t"
  42432. "ldr lr, [%[b], #312]\n\t"
  42433. "and r12, r12, r3\n\t"
  42434. "and lr, lr, r3\n\t"
  42435. "subs r12, r12, lr\n\t"
  42436. "it hi\n\t"
  42437. "movhi r2, r6\n\t"
  42438. "it lo\n\t"
  42439. "movlo r2, r3\n\t"
  42440. "it ne\n\t"
  42441. "movne r3, r5\n\t"
  42442. "ldr r12, [%[a], #308]\n\t"
  42443. "ldr lr, [%[b], #308]\n\t"
  42444. "and r12, r12, r3\n\t"
  42445. "and lr, lr, r3\n\t"
  42446. "subs r12, r12, lr\n\t"
  42447. "it hi\n\t"
  42448. "movhi r2, r6\n\t"
  42449. "it lo\n\t"
  42450. "movlo r2, r3\n\t"
  42451. "it ne\n\t"
  42452. "movne r3, r5\n\t"
  42453. "ldr r12, [%[a], #304]\n\t"
  42454. "ldr lr, [%[b], #304]\n\t"
  42455. "and r12, r12, r3\n\t"
  42456. "and lr, lr, r3\n\t"
  42457. "subs r12, r12, lr\n\t"
  42458. "it hi\n\t"
  42459. "movhi r2, r6\n\t"
  42460. "it lo\n\t"
  42461. "movlo r2, r3\n\t"
  42462. "it ne\n\t"
  42463. "movne r3, r5\n\t"
  42464. "ldr r12, [%[a], #300]\n\t"
  42465. "ldr lr, [%[b], #300]\n\t"
  42466. "and r12, r12, r3\n\t"
  42467. "and lr, lr, r3\n\t"
  42468. "subs r12, r12, lr\n\t"
  42469. "it hi\n\t"
  42470. "movhi r2, r6\n\t"
  42471. "it lo\n\t"
  42472. "movlo r2, r3\n\t"
  42473. "it ne\n\t"
  42474. "movne r3, r5\n\t"
  42475. "ldr r12, [%[a], #296]\n\t"
  42476. "ldr lr, [%[b], #296]\n\t"
  42477. "and r12, r12, r3\n\t"
  42478. "and lr, lr, r3\n\t"
  42479. "subs r12, r12, lr\n\t"
  42480. "it hi\n\t"
  42481. "movhi r2, r6\n\t"
  42482. "it lo\n\t"
  42483. "movlo r2, r3\n\t"
  42484. "it ne\n\t"
  42485. "movne r3, r5\n\t"
  42486. "ldr r12, [%[a], #292]\n\t"
  42487. "ldr lr, [%[b], #292]\n\t"
  42488. "and r12, r12, r3\n\t"
  42489. "and lr, lr, r3\n\t"
  42490. "subs r12, r12, lr\n\t"
  42491. "it hi\n\t"
  42492. "movhi r2, r6\n\t"
  42493. "it lo\n\t"
  42494. "movlo r2, r3\n\t"
  42495. "it ne\n\t"
  42496. "movne r3, r5\n\t"
  42497. "ldr r12, [%[a], #288]\n\t"
  42498. "ldr lr, [%[b], #288]\n\t"
  42499. "and r12, r12, r3\n\t"
  42500. "and lr, lr, r3\n\t"
  42501. "subs r12, r12, lr\n\t"
  42502. "it hi\n\t"
  42503. "movhi r2, r6\n\t"
  42504. "it lo\n\t"
  42505. "movlo r2, r3\n\t"
  42506. "it ne\n\t"
  42507. "movne r3, r5\n\t"
  42508. "ldr r12, [%[a], #284]\n\t"
  42509. "ldr lr, [%[b], #284]\n\t"
  42510. "and r12, r12, r3\n\t"
  42511. "and lr, lr, r3\n\t"
  42512. "subs r12, r12, lr\n\t"
  42513. "it hi\n\t"
  42514. "movhi r2, r6\n\t"
  42515. "it lo\n\t"
  42516. "movlo r2, r3\n\t"
  42517. "it ne\n\t"
  42518. "movne r3, r5\n\t"
  42519. "ldr r12, [%[a], #280]\n\t"
  42520. "ldr lr, [%[b], #280]\n\t"
  42521. "and r12, r12, r3\n\t"
  42522. "and lr, lr, r3\n\t"
  42523. "subs r12, r12, lr\n\t"
  42524. "it hi\n\t"
  42525. "movhi r2, r6\n\t"
  42526. "it lo\n\t"
  42527. "movlo r2, r3\n\t"
  42528. "it ne\n\t"
  42529. "movne r3, r5\n\t"
  42530. "ldr r12, [%[a], #276]\n\t"
  42531. "ldr lr, [%[b], #276]\n\t"
  42532. "and r12, r12, r3\n\t"
  42533. "and lr, lr, r3\n\t"
  42534. "subs r12, r12, lr\n\t"
  42535. "it hi\n\t"
  42536. "movhi r2, r6\n\t"
  42537. "it lo\n\t"
  42538. "movlo r2, r3\n\t"
  42539. "it ne\n\t"
  42540. "movne r3, r5\n\t"
  42541. "ldr r12, [%[a], #272]\n\t"
  42542. "ldr lr, [%[b], #272]\n\t"
  42543. "and r12, r12, r3\n\t"
  42544. "and lr, lr, r3\n\t"
  42545. "subs r12, r12, lr\n\t"
  42546. "it hi\n\t"
  42547. "movhi r2, r6\n\t"
  42548. "it lo\n\t"
  42549. "movlo r2, r3\n\t"
  42550. "it ne\n\t"
  42551. "movne r3, r5\n\t"
  42552. "ldr r12, [%[a], #268]\n\t"
  42553. "ldr lr, [%[b], #268]\n\t"
  42554. "and r12, r12, r3\n\t"
  42555. "and lr, lr, r3\n\t"
  42556. "subs r12, r12, lr\n\t"
  42557. "it hi\n\t"
  42558. "movhi r2, r6\n\t"
  42559. "it lo\n\t"
  42560. "movlo r2, r3\n\t"
  42561. "it ne\n\t"
  42562. "movne r3, r5\n\t"
  42563. "ldr r12, [%[a], #264]\n\t"
  42564. "ldr lr, [%[b], #264]\n\t"
  42565. "and r12, r12, r3\n\t"
  42566. "and lr, lr, r3\n\t"
  42567. "subs r12, r12, lr\n\t"
  42568. "it hi\n\t"
  42569. "movhi r2, r6\n\t"
  42570. "it lo\n\t"
  42571. "movlo r2, r3\n\t"
  42572. "it ne\n\t"
  42573. "movne r3, r5\n\t"
  42574. "ldr r12, [%[a], #260]\n\t"
  42575. "ldr lr, [%[b], #260]\n\t"
  42576. "and r12, r12, r3\n\t"
  42577. "and lr, lr, r3\n\t"
  42578. "subs r12, r12, lr\n\t"
  42579. "it hi\n\t"
  42580. "movhi r2, r6\n\t"
  42581. "it lo\n\t"
  42582. "movlo r2, r3\n\t"
  42583. "it ne\n\t"
  42584. "movne r3, r5\n\t"
  42585. "ldr r12, [%[a], #256]\n\t"
  42586. "ldr lr, [%[b], #256]\n\t"
  42587. "and r12, r12, r3\n\t"
  42588. "and lr, lr, r3\n\t"
  42589. "subs r12, r12, lr\n\t"
  42590. "it hi\n\t"
  42591. "movhi r2, r6\n\t"
  42592. "it lo\n\t"
  42593. "movlo r2, r3\n\t"
  42594. "it ne\n\t"
  42595. "movne r3, r5\n\t"
  42596. "ldr r12, [%[a], #252]\n\t"
  42597. "ldr lr, [%[b], #252]\n\t"
  42598. "and r12, r12, r3\n\t"
  42599. "and lr, lr, r3\n\t"
  42600. "subs r12, r12, lr\n\t"
  42601. "it hi\n\t"
  42602. "movhi r2, r6\n\t"
  42603. "it lo\n\t"
  42604. "movlo r2, r3\n\t"
  42605. "it ne\n\t"
  42606. "movne r3, r5\n\t"
  42607. "ldr r12, [%[a], #248]\n\t"
  42608. "ldr lr, [%[b], #248]\n\t"
  42609. "and r12, r12, r3\n\t"
  42610. "and lr, lr, r3\n\t"
  42611. "subs r12, r12, lr\n\t"
  42612. "it hi\n\t"
  42613. "movhi r2, r6\n\t"
  42614. "it lo\n\t"
  42615. "movlo r2, r3\n\t"
  42616. "it ne\n\t"
  42617. "movne r3, r5\n\t"
  42618. "ldr r12, [%[a], #244]\n\t"
  42619. "ldr lr, [%[b], #244]\n\t"
  42620. "and r12, r12, r3\n\t"
  42621. "and lr, lr, r3\n\t"
  42622. "subs r12, r12, lr\n\t"
  42623. "it hi\n\t"
  42624. "movhi r2, r6\n\t"
  42625. "it lo\n\t"
  42626. "movlo r2, r3\n\t"
  42627. "it ne\n\t"
  42628. "movne r3, r5\n\t"
  42629. "ldr r12, [%[a], #240]\n\t"
  42630. "ldr lr, [%[b], #240]\n\t"
  42631. "and r12, r12, r3\n\t"
  42632. "and lr, lr, r3\n\t"
  42633. "subs r12, r12, lr\n\t"
  42634. "it hi\n\t"
  42635. "movhi r2, r6\n\t"
  42636. "it lo\n\t"
  42637. "movlo r2, r3\n\t"
  42638. "it ne\n\t"
  42639. "movne r3, r5\n\t"
  42640. "ldr r12, [%[a], #236]\n\t"
  42641. "ldr lr, [%[b], #236]\n\t"
  42642. "and r12, r12, r3\n\t"
  42643. "and lr, lr, r3\n\t"
  42644. "subs r12, r12, lr\n\t"
  42645. "it hi\n\t"
  42646. "movhi r2, r6\n\t"
  42647. "it lo\n\t"
  42648. "movlo r2, r3\n\t"
  42649. "it ne\n\t"
  42650. "movne r3, r5\n\t"
  42651. "ldr r12, [%[a], #232]\n\t"
  42652. "ldr lr, [%[b], #232]\n\t"
  42653. "and r12, r12, r3\n\t"
  42654. "and lr, lr, r3\n\t"
  42655. "subs r12, r12, lr\n\t"
  42656. "it hi\n\t"
  42657. "movhi r2, r6\n\t"
  42658. "it lo\n\t"
  42659. "movlo r2, r3\n\t"
  42660. "it ne\n\t"
  42661. "movne r3, r5\n\t"
  42662. "ldr r12, [%[a], #228]\n\t"
  42663. "ldr lr, [%[b], #228]\n\t"
  42664. "and r12, r12, r3\n\t"
  42665. "and lr, lr, r3\n\t"
  42666. "subs r12, r12, lr\n\t"
  42667. "it hi\n\t"
  42668. "movhi r2, r6\n\t"
  42669. "it lo\n\t"
  42670. "movlo r2, r3\n\t"
  42671. "it ne\n\t"
  42672. "movne r3, r5\n\t"
  42673. "ldr r12, [%[a], #224]\n\t"
  42674. "ldr lr, [%[b], #224]\n\t"
  42675. "and r12, r12, r3\n\t"
  42676. "and lr, lr, r3\n\t"
  42677. "subs r12, r12, lr\n\t"
  42678. "it hi\n\t"
  42679. "movhi r2, r6\n\t"
  42680. "it lo\n\t"
  42681. "movlo r2, r3\n\t"
  42682. "it ne\n\t"
  42683. "movne r3, r5\n\t"
  42684. "ldr r12, [%[a], #220]\n\t"
  42685. "ldr lr, [%[b], #220]\n\t"
  42686. "and r12, r12, r3\n\t"
  42687. "and lr, lr, r3\n\t"
  42688. "subs r12, r12, lr\n\t"
  42689. "it hi\n\t"
  42690. "movhi r2, r6\n\t"
  42691. "it lo\n\t"
  42692. "movlo r2, r3\n\t"
  42693. "it ne\n\t"
  42694. "movne r3, r5\n\t"
  42695. "ldr r12, [%[a], #216]\n\t"
  42696. "ldr lr, [%[b], #216]\n\t"
  42697. "and r12, r12, r3\n\t"
  42698. "and lr, lr, r3\n\t"
  42699. "subs r12, r12, lr\n\t"
  42700. "it hi\n\t"
  42701. "movhi r2, r6\n\t"
  42702. "it lo\n\t"
  42703. "movlo r2, r3\n\t"
  42704. "it ne\n\t"
  42705. "movne r3, r5\n\t"
  42706. "ldr r12, [%[a], #212]\n\t"
  42707. "ldr lr, [%[b], #212]\n\t"
  42708. "and r12, r12, r3\n\t"
  42709. "and lr, lr, r3\n\t"
  42710. "subs r12, r12, lr\n\t"
  42711. "it hi\n\t"
  42712. "movhi r2, r6\n\t"
  42713. "it lo\n\t"
  42714. "movlo r2, r3\n\t"
  42715. "it ne\n\t"
  42716. "movne r3, r5\n\t"
  42717. "ldr r12, [%[a], #208]\n\t"
  42718. "ldr lr, [%[b], #208]\n\t"
  42719. "and r12, r12, r3\n\t"
  42720. "and lr, lr, r3\n\t"
  42721. "subs r12, r12, lr\n\t"
  42722. "it hi\n\t"
  42723. "movhi r2, r6\n\t"
  42724. "it lo\n\t"
  42725. "movlo r2, r3\n\t"
  42726. "it ne\n\t"
  42727. "movne r3, r5\n\t"
  42728. "ldr r12, [%[a], #204]\n\t"
  42729. "ldr lr, [%[b], #204]\n\t"
  42730. "and r12, r12, r3\n\t"
  42731. "and lr, lr, r3\n\t"
  42732. "subs r12, r12, lr\n\t"
  42733. "it hi\n\t"
  42734. "movhi r2, r6\n\t"
  42735. "it lo\n\t"
  42736. "movlo r2, r3\n\t"
  42737. "it ne\n\t"
  42738. "movne r3, r5\n\t"
  42739. "ldr r12, [%[a], #200]\n\t"
  42740. "ldr lr, [%[b], #200]\n\t"
  42741. "and r12, r12, r3\n\t"
  42742. "and lr, lr, r3\n\t"
  42743. "subs r12, r12, lr\n\t"
  42744. "it hi\n\t"
  42745. "movhi r2, r6\n\t"
  42746. "it lo\n\t"
  42747. "movlo r2, r3\n\t"
  42748. "it ne\n\t"
  42749. "movne r3, r5\n\t"
  42750. "ldr r12, [%[a], #196]\n\t"
  42751. "ldr lr, [%[b], #196]\n\t"
  42752. "and r12, r12, r3\n\t"
  42753. "and lr, lr, r3\n\t"
  42754. "subs r12, r12, lr\n\t"
  42755. "it hi\n\t"
  42756. "movhi r2, r6\n\t"
  42757. "it lo\n\t"
  42758. "movlo r2, r3\n\t"
  42759. "it ne\n\t"
  42760. "movne r3, r5\n\t"
  42761. "ldr r12, [%[a], #192]\n\t"
  42762. "ldr lr, [%[b], #192]\n\t"
  42763. "and r12, r12, r3\n\t"
  42764. "and lr, lr, r3\n\t"
  42765. "subs r12, r12, lr\n\t"
  42766. "it hi\n\t"
  42767. "movhi r2, r6\n\t"
  42768. "it lo\n\t"
  42769. "movlo r2, r3\n\t"
  42770. "it ne\n\t"
  42771. "movne r3, r5\n\t"
  42772. "ldr r12, [%[a], #188]\n\t"
  42773. "ldr lr, [%[b], #188]\n\t"
  42774. "and r12, r12, r3\n\t"
  42775. "and lr, lr, r3\n\t"
  42776. "subs r12, r12, lr\n\t"
  42777. "it hi\n\t"
  42778. "movhi r2, r6\n\t"
  42779. "it lo\n\t"
  42780. "movlo r2, r3\n\t"
  42781. "it ne\n\t"
  42782. "movne r3, r5\n\t"
  42783. "ldr r12, [%[a], #184]\n\t"
  42784. "ldr lr, [%[b], #184]\n\t"
  42785. "and r12, r12, r3\n\t"
  42786. "and lr, lr, r3\n\t"
  42787. "subs r12, r12, lr\n\t"
  42788. "it hi\n\t"
  42789. "movhi r2, r6\n\t"
  42790. "it lo\n\t"
  42791. "movlo r2, r3\n\t"
  42792. "it ne\n\t"
  42793. "movne r3, r5\n\t"
  42794. "ldr r12, [%[a], #180]\n\t"
  42795. "ldr lr, [%[b], #180]\n\t"
  42796. "and r12, r12, r3\n\t"
  42797. "and lr, lr, r3\n\t"
  42798. "subs r12, r12, lr\n\t"
  42799. "it hi\n\t"
  42800. "movhi r2, r6\n\t"
  42801. "it lo\n\t"
  42802. "movlo r2, r3\n\t"
  42803. "it ne\n\t"
  42804. "movne r3, r5\n\t"
  42805. "ldr r12, [%[a], #176]\n\t"
  42806. "ldr lr, [%[b], #176]\n\t"
  42807. "and r12, r12, r3\n\t"
  42808. "and lr, lr, r3\n\t"
  42809. "subs r12, r12, lr\n\t"
  42810. "it hi\n\t"
  42811. "movhi r2, r6\n\t"
  42812. "it lo\n\t"
  42813. "movlo r2, r3\n\t"
  42814. "it ne\n\t"
  42815. "movne r3, r5\n\t"
  42816. "ldr r12, [%[a], #172]\n\t"
  42817. "ldr lr, [%[b], #172]\n\t"
  42818. "and r12, r12, r3\n\t"
  42819. "and lr, lr, r3\n\t"
  42820. "subs r12, r12, lr\n\t"
  42821. "it hi\n\t"
  42822. "movhi r2, r6\n\t"
  42823. "it lo\n\t"
  42824. "movlo r2, r3\n\t"
  42825. "it ne\n\t"
  42826. "movne r3, r5\n\t"
  42827. "ldr r12, [%[a], #168]\n\t"
  42828. "ldr lr, [%[b], #168]\n\t"
  42829. "and r12, r12, r3\n\t"
  42830. "and lr, lr, r3\n\t"
  42831. "subs r12, r12, lr\n\t"
  42832. "it hi\n\t"
  42833. "movhi r2, r6\n\t"
  42834. "it lo\n\t"
  42835. "movlo r2, r3\n\t"
  42836. "it ne\n\t"
  42837. "movne r3, r5\n\t"
  42838. "ldr r12, [%[a], #164]\n\t"
  42839. "ldr lr, [%[b], #164]\n\t"
  42840. "and r12, r12, r3\n\t"
  42841. "and lr, lr, r3\n\t"
  42842. "subs r12, r12, lr\n\t"
  42843. "it hi\n\t"
  42844. "movhi r2, r6\n\t"
  42845. "it lo\n\t"
  42846. "movlo r2, r3\n\t"
  42847. "it ne\n\t"
  42848. "movne r3, r5\n\t"
  42849. "ldr r12, [%[a], #160]\n\t"
  42850. "ldr lr, [%[b], #160]\n\t"
  42851. "and r12, r12, r3\n\t"
  42852. "and lr, lr, r3\n\t"
  42853. "subs r12, r12, lr\n\t"
  42854. "it hi\n\t"
  42855. "movhi r2, r6\n\t"
  42856. "it lo\n\t"
  42857. "movlo r2, r3\n\t"
  42858. "it ne\n\t"
  42859. "movne r3, r5\n\t"
  42860. "ldr r12, [%[a], #156]\n\t"
  42861. "ldr lr, [%[b], #156]\n\t"
  42862. "and r12, r12, r3\n\t"
  42863. "and lr, lr, r3\n\t"
  42864. "subs r12, r12, lr\n\t"
  42865. "it hi\n\t"
  42866. "movhi r2, r6\n\t"
  42867. "it lo\n\t"
  42868. "movlo r2, r3\n\t"
  42869. "it ne\n\t"
  42870. "movne r3, r5\n\t"
  42871. "ldr r12, [%[a], #152]\n\t"
  42872. "ldr lr, [%[b], #152]\n\t"
  42873. "and r12, r12, r3\n\t"
  42874. "and lr, lr, r3\n\t"
  42875. "subs r12, r12, lr\n\t"
  42876. "it hi\n\t"
  42877. "movhi r2, r6\n\t"
  42878. "it lo\n\t"
  42879. "movlo r2, r3\n\t"
  42880. "it ne\n\t"
  42881. "movne r3, r5\n\t"
  42882. "ldr r12, [%[a], #148]\n\t"
  42883. "ldr lr, [%[b], #148]\n\t"
  42884. "and r12, r12, r3\n\t"
  42885. "and lr, lr, r3\n\t"
  42886. "subs r12, r12, lr\n\t"
  42887. "it hi\n\t"
  42888. "movhi r2, r6\n\t"
  42889. "it lo\n\t"
  42890. "movlo r2, r3\n\t"
  42891. "it ne\n\t"
  42892. "movne r3, r5\n\t"
  42893. "ldr r12, [%[a], #144]\n\t"
  42894. "ldr lr, [%[b], #144]\n\t"
  42895. "and r12, r12, r3\n\t"
  42896. "and lr, lr, r3\n\t"
  42897. "subs r12, r12, lr\n\t"
  42898. "it hi\n\t"
  42899. "movhi r2, r6\n\t"
  42900. "it lo\n\t"
  42901. "movlo r2, r3\n\t"
  42902. "it ne\n\t"
  42903. "movne r3, r5\n\t"
  42904. "ldr r12, [%[a], #140]\n\t"
  42905. "ldr lr, [%[b], #140]\n\t"
  42906. "and r12, r12, r3\n\t"
  42907. "and lr, lr, r3\n\t"
  42908. "subs r12, r12, lr\n\t"
  42909. "it hi\n\t"
  42910. "movhi r2, r6\n\t"
  42911. "it lo\n\t"
  42912. "movlo r2, r3\n\t"
  42913. "it ne\n\t"
  42914. "movne r3, r5\n\t"
  42915. "ldr r12, [%[a], #136]\n\t"
  42916. "ldr lr, [%[b], #136]\n\t"
  42917. "and r12, r12, r3\n\t"
  42918. "and lr, lr, r3\n\t"
  42919. "subs r12, r12, lr\n\t"
  42920. "it hi\n\t"
  42921. "movhi r2, r6\n\t"
  42922. "it lo\n\t"
  42923. "movlo r2, r3\n\t"
  42924. "it ne\n\t"
  42925. "movne r3, r5\n\t"
  42926. "ldr r12, [%[a], #132]\n\t"
  42927. "ldr lr, [%[b], #132]\n\t"
  42928. "and r12, r12, r3\n\t"
  42929. "and lr, lr, r3\n\t"
  42930. "subs r12, r12, lr\n\t"
  42931. "it hi\n\t"
  42932. "movhi r2, r6\n\t"
  42933. "it lo\n\t"
  42934. "movlo r2, r3\n\t"
  42935. "it ne\n\t"
  42936. "movne r3, r5\n\t"
  42937. "ldr r12, [%[a], #128]\n\t"
  42938. "ldr lr, [%[b], #128]\n\t"
  42939. "and r12, r12, r3\n\t"
  42940. "and lr, lr, r3\n\t"
  42941. "subs r12, r12, lr\n\t"
  42942. "it hi\n\t"
  42943. "movhi r2, r6\n\t"
  42944. "it lo\n\t"
  42945. "movlo r2, r3\n\t"
  42946. "it ne\n\t"
  42947. "movne r3, r5\n\t"
  42948. "ldr r12, [%[a], #124]\n\t"
  42949. "ldr lr, [%[b], #124]\n\t"
  42950. "and r12, r12, r3\n\t"
  42951. "and lr, lr, r3\n\t"
  42952. "subs r12, r12, lr\n\t"
  42953. "it hi\n\t"
  42954. "movhi r2, r6\n\t"
  42955. "it lo\n\t"
  42956. "movlo r2, r3\n\t"
  42957. "it ne\n\t"
  42958. "movne r3, r5\n\t"
  42959. "ldr r12, [%[a], #120]\n\t"
  42960. "ldr lr, [%[b], #120]\n\t"
  42961. "and r12, r12, r3\n\t"
  42962. "and lr, lr, r3\n\t"
  42963. "subs r12, r12, lr\n\t"
  42964. "it hi\n\t"
  42965. "movhi r2, r6\n\t"
  42966. "it lo\n\t"
  42967. "movlo r2, r3\n\t"
  42968. "it ne\n\t"
  42969. "movne r3, r5\n\t"
  42970. "ldr r12, [%[a], #116]\n\t"
  42971. "ldr lr, [%[b], #116]\n\t"
  42972. "and r12, r12, r3\n\t"
  42973. "and lr, lr, r3\n\t"
  42974. "subs r12, r12, lr\n\t"
  42975. "it hi\n\t"
  42976. "movhi r2, r6\n\t"
  42977. "it lo\n\t"
  42978. "movlo r2, r3\n\t"
  42979. "it ne\n\t"
  42980. "movne r3, r5\n\t"
  42981. "ldr r12, [%[a], #112]\n\t"
  42982. "ldr lr, [%[b], #112]\n\t"
  42983. "and r12, r12, r3\n\t"
  42984. "and lr, lr, r3\n\t"
  42985. "subs r12, r12, lr\n\t"
  42986. "it hi\n\t"
  42987. "movhi r2, r6\n\t"
  42988. "it lo\n\t"
  42989. "movlo r2, r3\n\t"
  42990. "it ne\n\t"
  42991. "movne r3, r5\n\t"
  42992. "ldr r12, [%[a], #108]\n\t"
  42993. "ldr lr, [%[b], #108]\n\t"
  42994. "and r12, r12, r3\n\t"
  42995. "and lr, lr, r3\n\t"
  42996. "subs r12, r12, lr\n\t"
  42997. "it hi\n\t"
  42998. "movhi r2, r6\n\t"
  42999. "it lo\n\t"
  43000. "movlo r2, r3\n\t"
  43001. "it ne\n\t"
  43002. "movne r3, r5\n\t"
  43003. "ldr r12, [%[a], #104]\n\t"
  43004. "ldr lr, [%[b], #104]\n\t"
  43005. "and r12, r12, r3\n\t"
  43006. "and lr, lr, r3\n\t"
  43007. "subs r12, r12, lr\n\t"
  43008. "it hi\n\t"
  43009. "movhi r2, r6\n\t"
  43010. "it lo\n\t"
  43011. "movlo r2, r3\n\t"
  43012. "it ne\n\t"
  43013. "movne r3, r5\n\t"
  43014. "ldr r12, [%[a], #100]\n\t"
  43015. "ldr lr, [%[b], #100]\n\t"
  43016. "and r12, r12, r3\n\t"
  43017. "and lr, lr, r3\n\t"
  43018. "subs r12, r12, lr\n\t"
  43019. "it hi\n\t"
  43020. "movhi r2, r6\n\t"
  43021. "it lo\n\t"
  43022. "movlo r2, r3\n\t"
  43023. "it ne\n\t"
  43024. "movne r3, r5\n\t"
  43025. "ldr r12, [%[a], #96]\n\t"
  43026. "ldr lr, [%[b], #96]\n\t"
  43027. "and r12, r12, r3\n\t"
  43028. "and lr, lr, r3\n\t"
  43029. "subs r12, r12, lr\n\t"
  43030. "it hi\n\t"
  43031. "movhi r2, r6\n\t"
  43032. "it lo\n\t"
  43033. "movlo r2, r3\n\t"
  43034. "it ne\n\t"
  43035. "movne r3, r5\n\t"
  43036. "ldr r12, [%[a], #92]\n\t"
  43037. "ldr lr, [%[b], #92]\n\t"
  43038. "and r12, r12, r3\n\t"
  43039. "and lr, lr, r3\n\t"
  43040. "subs r12, r12, lr\n\t"
  43041. "it hi\n\t"
  43042. "movhi r2, r6\n\t"
  43043. "it lo\n\t"
  43044. "movlo r2, r3\n\t"
  43045. "it ne\n\t"
  43046. "movne r3, r5\n\t"
  43047. "ldr r12, [%[a], #88]\n\t"
  43048. "ldr lr, [%[b], #88]\n\t"
  43049. "and r12, r12, r3\n\t"
  43050. "and lr, lr, r3\n\t"
  43051. "subs r12, r12, lr\n\t"
  43052. "it hi\n\t"
  43053. "movhi r2, r6\n\t"
  43054. "it lo\n\t"
  43055. "movlo r2, r3\n\t"
  43056. "it ne\n\t"
  43057. "movne r3, r5\n\t"
  43058. "ldr r12, [%[a], #84]\n\t"
  43059. "ldr lr, [%[b], #84]\n\t"
  43060. "and r12, r12, r3\n\t"
  43061. "and lr, lr, r3\n\t"
  43062. "subs r12, r12, lr\n\t"
  43063. "it hi\n\t"
  43064. "movhi r2, r6\n\t"
  43065. "it lo\n\t"
  43066. "movlo r2, r3\n\t"
  43067. "it ne\n\t"
  43068. "movne r3, r5\n\t"
  43069. "ldr r12, [%[a], #80]\n\t"
  43070. "ldr lr, [%[b], #80]\n\t"
  43071. "and r12, r12, r3\n\t"
  43072. "and lr, lr, r3\n\t"
  43073. "subs r12, r12, lr\n\t"
  43074. "it hi\n\t"
  43075. "movhi r2, r6\n\t"
  43076. "it lo\n\t"
  43077. "movlo r2, r3\n\t"
  43078. "it ne\n\t"
  43079. "movne r3, r5\n\t"
  43080. "ldr r12, [%[a], #76]\n\t"
  43081. "ldr lr, [%[b], #76]\n\t"
  43082. "and r12, r12, r3\n\t"
  43083. "and lr, lr, r3\n\t"
  43084. "subs r12, r12, lr\n\t"
  43085. "it hi\n\t"
  43086. "movhi r2, r6\n\t"
  43087. "it lo\n\t"
  43088. "movlo r2, r3\n\t"
  43089. "it ne\n\t"
  43090. "movne r3, r5\n\t"
  43091. "ldr r12, [%[a], #72]\n\t"
  43092. "ldr lr, [%[b], #72]\n\t"
  43093. "and r12, r12, r3\n\t"
  43094. "and lr, lr, r3\n\t"
  43095. "subs r12, r12, lr\n\t"
  43096. "it hi\n\t"
  43097. "movhi r2, r6\n\t"
  43098. "it lo\n\t"
  43099. "movlo r2, r3\n\t"
  43100. "it ne\n\t"
  43101. "movne r3, r5\n\t"
  43102. "ldr r12, [%[a], #68]\n\t"
  43103. "ldr lr, [%[b], #68]\n\t"
  43104. "and r12, r12, r3\n\t"
  43105. "and lr, lr, r3\n\t"
  43106. "subs r12, r12, lr\n\t"
  43107. "it hi\n\t"
  43108. "movhi r2, r6\n\t"
  43109. "it lo\n\t"
  43110. "movlo r2, r3\n\t"
  43111. "it ne\n\t"
  43112. "movne r3, r5\n\t"
  43113. "ldr r12, [%[a], #64]\n\t"
  43114. "ldr lr, [%[b], #64]\n\t"
  43115. "and r12, r12, r3\n\t"
  43116. "and lr, lr, r3\n\t"
  43117. "subs r12, r12, lr\n\t"
  43118. "it hi\n\t"
  43119. "movhi r2, r6\n\t"
  43120. "it lo\n\t"
  43121. "movlo r2, r3\n\t"
  43122. "it ne\n\t"
  43123. "movne r3, r5\n\t"
  43124. "ldr r12, [%[a], #60]\n\t"
  43125. "ldr lr, [%[b], #60]\n\t"
  43126. "and r12, r12, r3\n\t"
  43127. "and lr, lr, r3\n\t"
  43128. "subs r12, r12, lr\n\t"
  43129. "it hi\n\t"
  43130. "movhi r2, r6\n\t"
  43131. "it lo\n\t"
  43132. "movlo r2, r3\n\t"
  43133. "it ne\n\t"
  43134. "movne r3, r5\n\t"
  43135. "ldr r12, [%[a], #56]\n\t"
  43136. "ldr lr, [%[b], #56]\n\t"
  43137. "and r12, r12, r3\n\t"
  43138. "and lr, lr, r3\n\t"
  43139. "subs r12, r12, lr\n\t"
  43140. "it hi\n\t"
  43141. "movhi r2, r6\n\t"
  43142. "it lo\n\t"
  43143. "movlo r2, r3\n\t"
  43144. "it ne\n\t"
  43145. "movne r3, r5\n\t"
  43146. "ldr r12, [%[a], #52]\n\t"
  43147. "ldr lr, [%[b], #52]\n\t"
  43148. "and r12, r12, r3\n\t"
  43149. "and lr, lr, r3\n\t"
  43150. "subs r12, r12, lr\n\t"
  43151. "it hi\n\t"
  43152. "movhi r2, r6\n\t"
  43153. "it lo\n\t"
  43154. "movlo r2, r3\n\t"
  43155. "it ne\n\t"
  43156. "movne r3, r5\n\t"
  43157. "ldr r12, [%[a], #48]\n\t"
  43158. "ldr lr, [%[b], #48]\n\t"
  43159. "and r12, r12, r3\n\t"
  43160. "and lr, lr, r3\n\t"
  43161. "subs r12, r12, lr\n\t"
  43162. "it hi\n\t"
  43163. "movhi r2, r6\n\t"
  43164. "it lo\n\t"
  43165. "movlo r2, r3\n\t"
  43166. "it ne\n\t"
  43167. "movne r3, r5\n\t"
  43168. "ldr r12, [%[a], #44]\n\t"
  43169. "ldr lr, [%[b], #44]\n\t"
  43170. "and r12, r12, r3\n\t"
  43171. "and lr, lr, r3\n\t"
  43172. "subs r12, r12, lr\n\t"
  43173. "it hi\n\t"
  43174. "movhi r2, r6\n\t"
  43175. "it lo\n\t"
  43176. "movlo r2, r3\n\t"
  43177. "it ne\n\t"
  43178. "movne r3, r5\n\t"
  43179. "ldr r12, [%[a], #40]\n\t"
  43180. "ldr lr, [%[b], #40]\n\t"
  43181. "and r12, r12, r3\n\t"
  43182. "and lr, lr, r3\n\t"
  43183. "subs r12, r12, lr\n\t"
  43184. "it hi\n\t"
  43185. "movhi r2, r6\n\t"
  43186. "it lo\n\t"
  43187. "movlo r2, r3\n\t"
  43188. "it ne\n\t"
  43189. "movne r3, r5\n\t"
  43190. "ldr r12, [%[a], #36]\n\t"
  43191. "ldr lr, [%[b], #36]\n\t"
  43192. "and r12, r12, r3\n\t"
  43193. "and lr, lr, r3\n\t"
  43194. "subs r12, r12, lr\n\t"
  43195. "it hi\n\t"
  43196. "movhi r2, r6\n\t"
  43197. "it lo\n\t"
  43198. "movlo r2, r3\n\t"
  43199. "it ne\n\t"
  43200. "movne r3, r5\n\t"
  43201. "ldr r12, [%[a], #32]\n\t"
  43202. "ldr lr, [%[b], #32]\n\t"
  43203. "and r12, r12, r3\n\t"
  43204. "and lr, lr, r3\n\t"
  43205. "subs r12, r12, lr\n\t"
  43206. "it hi\n\t"
  43207. "movhi r2, r6\n\t"
  43208. "it lo\n\t"
  43209. "movlo r2, r3\n\t"
  43210. "it ne\n\t"
  43211. "movne r3, r5\n\t"
  43212. "ldr r12, [%[a], #28]\n\t"
  43213. "ldr lr, [%[b], #28]\n\t"
  43214. "and r12, r12, r3\n\t"
  43215. "and lr, lr, r3\n\t"
  43216. "subs r12, r12, lr\n\t"
  43217. "it hi\n\t"
  43218. "movhi r2, r6\n\t"
  43219. "it lo\n\t"
  43220. "movlo r2, r3\n\t"
  43221. "it ne\n\t"
  43222. "movne r3, r5\n\t"
  43223. "ldr r12, [%[a], #24]\n\t"
  43224. "ldr lr, [%[b], #24]\n\t"
  43225. "and r12, r12, r3\n\t"
  43226. "and lr, lr, r3\n\t"
  43227. "subs r12, r12, lr\n\t"
  43228. "it hi\n\t"
  43229. "movhi r2, r6\n\t"
  43230. "it lo\n\t"
  43231. "movlo r2, r3\n\t"
  43232. "it ne\n\t"
  43233. "movne r3, r5\n\t"
  43234. "ldr r12, [%[a], #20]\n\t"
  43235. "ldr lr, [%[b], #20]\n\t"
  43236. "and r12, r12, r3\n\t"
  43237. "and lr, lr, r3\n\t"
  43238. "subs r12, r12, lr\n\t"
  43239. "it hi\n\t"
  43240. "movhi r2, r6\n\t"
  43241. "it lo\n\t"
  43242. "movlo r2, r3\n\t"
  43243. "it ne\n\t"
  43244. "movne r3, r5\n\t"
  43245. "ldr r12, [%[a], #16]\n\t"
  43246. "ldr lr, [%[b], #16]\n\t"
  43247. "and r12, r12, r3\n\t"
  43248. "and lr, lr, r3\n\t"
  43249. "subs r12, r12, lr\n\t"
  43250. "it hi\n\t"
  43251. "movhi r2, r6\n\t"
  43252. "it lo\n\t"
  43253. "movlo r2, r3\n\t"
  43254. "it ne\n\t"
  43255. "movne r3, r5\n\t"
  43256. "ldr r12, [%[a], #12]\n\t"
  43257. "ldr lr, [%[b], #12]\n\t"
  43258. "and r12, r12, r3\n\t"
  43259. "and lr, lr, r3\n\t"
  43260. "subs r12, r12, lr\n\t"
  43261. "it hi\n\t"
  43262. "movhi r2, r6\n\t"
  43263. "it lo\n\t"
  43264. "movlo r2, r3\n\t"
  43265. "it ne\n\t"
  43266. "movne r3, r5\n\t"
  43267. "ldr r12, [%[a], #8]\n\t"
  43268. "ldr lr, [%[b], #8]\n\t"
  43269. "and r12, r12, r3\n\t"
  43270. "and lr, lr, r3\n\t"
  43271. "subs r12, r12, lr\n\t"
  43272. "it hi\n\t"
  43273. "movhi r2, r6\n\t"
  43274. "it lo\n\t"
  43275. "movlo r2, r3\n\t"
  43276. "it ne\n\t"
  43277. "movne r3, r5\n\t"
  43278. "ldr r12, [%[a], #4]\n\t"
  43279. "ldr lr, [%[b], #4]\n\t"
  43280. "and r12, r12, r3\n\t"
  43281. "and lr, lr, r3\n\t"
  43282. "subs r12, r12, lr\n\t"
  43283. "it hi\n\t"
  43284. "movhi r2, r6\n\t"
  43285. "it lo\n\t"
  43286. "movlo r2, r3\n\t"
  43287. "it ne\n\t"
  43288. "movne r3, r5\n\t"
  43289. "ldr r12, [%[a]]\n\t"
  43290. "ldr lr, [%[b]]\n\t"
  43291. "and r12, r12, r3\n\t"
  43292. "and lr, lr, r3\n\t"
  43293. "subs r12, r12, lr\n\t"
  43294. "it hi\n\t"
  43295. "movhi r2, r6\n\t"
  43296. "it lo\n\t"
  43297. "movlo r2, r3\n\t"
  43298. "it ne\n\t"
  43299. "movne r3, r5\n\t"
  43300. "eor r2, r2, r3\n\t"
  43301. #endif /*WOLFSSL_SP_SMALL */
  43302. "mov %[a], r2\n\t"
  43303. : [a] "+r" (a), [b] "+r" (b)
  43304. :
  43305. : "memory", "r2", "r3", "r12", "lr", "r4", "r5", "r6", "cc"
  43306. );
  43307. return (uint32_t)(size_t)a;
  43308. }
  43309. /* Divide d in a and put remainder into r (m*d + r = a)
  43310. * m is not calculated as it is not needed at this time.
  43311. *
  43312. * a Number to be divided.
  43313. * d Number to divide with.
  43314. * m Multiplier result.
  43315. * r Remainder from the division.
  43316. * returns MP_OKAY indicating success.
  43317. */
  43318. static WC_INLINE int sp_3072_div_96(const sp_digit* a, const sp_digit* d,
  43319. sp_digit* m, sp_digit* r)
  43320. {
  43321. sp_digit t1[192], t2[97];
  43322. sp_digit div, r1;
  43323. int i;
  43324. (void)m;
  43325. div = d[95];
  43326. XMEMCPY(t1, a, sizeof(*t1) * 2 * 96);
  43327. r1 = sp_3072_cmp_96(&t1[96], d) >= 0;
  43328. sp_3072_cond_sub_96(&t1[96], &t1[96], d, (sp_digit)0 - r1);
  43329. for (i = 95; i >= 0; i--) {
  43330. volatile sp_digit mask = (sp_digit)0 - (t1[96 + i] == div);
  43331. sp_digit hi = t1[96 + i] + mask;
  43332. r1 = div_3072_word_96(hi, t1[96 + i - 1], div);
  43333. r1 |= mask;
  43334. sp_3072_mul_d_96(t2, d, r1);
  43335. t1[96 + i] += sp_3072_sub_in_place_96(&t1[i], t2);
  43336. t1[96 + i] -= t2[96];
  43337. sp_3072_mask_96(t2, d, t1[96 + i]);
  43338. t1[96 + i] += sp_3072_add_96(&t1[i], &t1[i], t2);
  43339. sp_3072_mask_96(t2, d, t1[96 + i]);
  43340. t1[96 + i] += sp_3072_add_96(&t1[i], &t1[i], t2);
  43341. }
  43342. r1 = sp_3072_cmp_96(t1, d) >= 0;
  43343. sp_3072_cond_sub_96(r, t1, d, (sp_digit)0 - r1);
  43344. return MP_OKAY;
  43345. }
  43346. /* Reduce a modulo m into r. (r = a mod m)
  43347. *
  43348. * r A single precision number that is the reduced result.
  43349. * a A single precision number that is to be reduced.
  43350. * m A single precision number that is the modulus to reduce with.
  43351. * returns MP_OKAY indicating success.
  43352. */
  43353. static WC_INLINE int sp_3072_mod_96(sp_digit* r, const sp_digit* a,
  43354. const sp_digit* m)
  43355. {
  43356. return sp_3072_div_96(a, m, NULL, r);
  43357. }
  43358. #endif /* WOLFSSL_HAVE_SP_DH || !WOLFSSL_RSA_PUBLIC_ONLY */
  43359. #if (defined(WOLFSSL_HAVE_SP_RSA) && !defined(WOLFSSL_RSA_PUBLIC_ONLY)) || \
  43360. defined(WOLFSSL_HAVE_SP_DH)
  43361. #ifdef WOLFSSL_SP_SMALL
  43362. /* Modular exponentiate a to the e mod m. (r = a^e mod m)
  43363. *
  43364. * r A single precision number that is the result of the operation.
  43365. * a A single precision number being exponentiated.
  43366. * e A single precision number that is the exponent.
  43367. * bits The number of bits in the exponent.
  43368. * m A single precision number that is the modulus.
  43369. * returns 0 on success.
  43370. * returns MEMORY_E on dynamic memory allocation failure.
  43371. * returns MP_VAL when base is even or exponent is 0.
  43372. */
  43373. static int sp_3072_mod_exp_96(sp_digit* r, const sp_digit* a, const sp_digit* e,
  43374. int bits, const sp_digit* m, int reduceA)
  43375. {
  43376. #ifdef WOLFSSL_SP_SMALL_STACK
  43377. sp_digit* td = NULL;
  43378. #else
  43379. sp_digit td[8 * 192];
  43380. #endif
  43381. sp_digit* t[8];
  43382. sp_digit* norm = NULL;
  43383. sp_digit mp = 1;
  43384. sp_digit n;
  43385. sp_digit mask;
  43386. int i;
  43387. int c;
  43388. byte y;
  43389. int err = MP_OKAY;
  43390. if (bits == 0) {
  43391. err = MP_VAL;
  43392. }
  43393. #ifdef WOLFSSL_SP_SMALL_STACK
  43394. if (err == MP_OKAY) {
  43395. td = (sp_digit*)XMALLOC(sizeof(sp_digit) * (8 * 192), NULL,
  43396. DYNAMIC_TYPE_TMP_BUFFER);
  43397. if (td == NULL)
  43398. err = MEMORY_E;
  43399. }
  43400. #endif
  43401. if (err == MP_OKAY) {
  43402. norm = td;
  43403. for (i=0; i<8; i++) {
  43404. t[i] = td + i * 192;
  43405. }
  43406. sp_3072_mont_setup(m, &mp);
  43407. sp_3072_mont_norm_96(norm, m);
  43408. XMEMSET(t[1], 0, sizeof(sp_digit) * 96U);
  43409. if (reduceA != 0) {
  43410. err = sp_3072_mod_96(t[1] + 96, a, m);
  43411. if (err == MP_OKAY) {
  43412. err = sp_3072_mod_96(t[1], t[1], m);
  43413. }
  43414. }
  43415. else {
  43416. XMEMCPY(t[1] + 96, a, sizeof(sp_digit) * 96);
  43417. err = sp_3072_mod_96(t[1], t[1], m);
  43418. }
  43419. }
  43420. if (err == MP_OKAY) {
  43421. sp_3072_mont_sqr_96(t[ 2], t[ 1], m, mp);
  43422. sp_3072_mont_mul_96(t[ 3], t[ 2], t[ 1], m, mp);
  43423. sp_3072_mont_sqr_96(t[ 4], t[ 2], m, mp);
  43424. sp_3072_mont_mul_96(t[ 5], t[ 3], t[ 2], m, mp);
  43425. sp_3072_mont_sqr_96(t[ 6], t[ 3], m, mp);
  43426. sp_3072_mont_mul_96(t[ 7], t[ 4], t[ 3], m, mp);
  43427. i = (bits - 1) / 32;
  43428. n = e[i--];
  43429. c = bits & 31;
  43430. if (c == 0) {
  43431. c = 32;
  43432. }
  43433. c -= bits % 3;
  43434. if (c == 32) {
  43435. c = 29;
  43436. }
  43437. if (c < 0) {
  43438. /* Number of bits in top word is less than number needed. */
  43439. c = -c;
  43440. y = (byte)(n << c);
  43441. n = e[i--];
  43442. y |= (byte)(n >> (64 - c));
  43443. n <<= c;
  43444. c = 64 - c;
  43445. }
  43446. else if (c == 0) {
  43447. /* All bits in top word used. */
  43448. y = (byte)n;
  43449. }
  43450. else {
  43451. y = (byte)(n >> c);
  43452. n <<= 32 - c;
  43453. }
  43454. XMEMCPY(r, t[y], sizeof(sp_digit) * 96);
  43455. for (; i>=0 || c>=3; ) {
  43456. if (c == 0) {
  43457. n = e[i--];
  43458. y = (byte)(n >> 29);
  43459. n <<= 3;
  43460. c = 29;
  43461. }
  43462. else if (c < 3) {
  43463. y = (byte)(n >> 29);
  43464. n = e[i--];
  43465. c = 3 - c;
  43466. y |= (byte)(n >> (32 - c));
  43467. n <<= c;
  43468. c = 32 - c;
  43469. }
  43470. else {
  43471. y = (byte)((n >> 29) & 0x7);
  43472. n <<= 3;
  43473. c -= 3;
  43474. }
  43475. sp_3072_mont_sqr_96(r, r, m, mp);
  43476. sp_3072_mont_sqr_96(r, r, m, mp);
  43477. sp_3072_mont_sqr_96(r, r, m, mp);
  43478. sp_3072_mont_mul_96(r, r, t[y], m, mp);
  43479. }
  43480. XMEMSET(&r[96], 0, sizeof(sp_digit) * 96U);
  43481. sp_3072_mont_reduce_96(r, m, mp);
  43482. mask = 0 - (sp_3072_cmp_96(r, m) >= 0);
  43483. sp_3072_cond_sub_96(r, r, m, mask);
  43484. }
  43485. #ifdef WOLFSSL_SP_SMALL_STACK
  43486. if (td != NULL)
  43487. XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  43488. #endif
  43489. return err;
  43490. }
  43491. #else
  43492. /* Modular exponentiate a to the e mod m. (r = a^e mod m)
  43493. *
  43494. * r A single precision number that is the result of the operation.
  43495. * a A single precision number being exponentiated.
  43496. * e A single precision number that is the exponent.
  43497. * bits The number of bits in the exponent.
  43498. * m A single precision number that is the modulus.
  43499. * returns 0 on success.
  43500. * returns MEMORY_E on dynamic memory allocation failure.
  43501. * returns MP_VAL when base is even or exponent is 0.
  43502. */
  43503. static int sp_3072_mod_exp_96(sp_digit* r, const sp_digit* a, const sp_digit* e,
  43504. int bits, const sp_digit* m, int reduceA)
  43505. {
  43506. #ifdef WOLFSSL_SP_SMALL_STACK
  43507. sp_digit* td = NULL;
  43508. #else
  43509. sp_digit td[16 * 192];
  43510. #endif
  43511. sp_digit* t[16];
  43512. sp_digit* norm = NULL;
  43513. sp_digit mp = 1;
  43514. sp_digit n;
  43515. sp_digit mask;
  43516. int i;
  43517. int c;
  43518. byte y;
  43519. int err = MP_OKAY;
  43520. if (bits == 0) {
  43521. err = MP_VAL;
  43522. }
  43523. #ifdef WOLFSSL_SP_SMALL_STACK
  43524. if (err == MP_OKAY) {
  43525. td = (sp_digit*)XMALLOC(sizeof(sp_digit) * (16 * 192), NULL,
  43526. DYNAMIC_TYPE_TMP_BUFFER);
  43527. if (td == NULL)
  43528. err = MEMORY_E;
  43529. }
  43530. #endif
  43531. if (err == MP_OKAY) {
  43532. norm = td;
  43533. for (i=0; i<16; i++) {
  43534. t[i] = td + i * 192;
  43535. }
  43536. sp_3072_mont_setup(m, &mp);
  43537. sp_3072_mont_norm_96(norm, m);
  43538. XMEMSET(t[1], 0, sizeof(sp_digit) * 96U);
  43539. if (reduceA != 0) {
  43540. err = sp_3072_mod_96(t[1] + 96, a, m);
  43541. if (err == MP_OKAY) {
  43542. err = sp_3072_mod_96(t[1], t[1], m);
  43543. }
  43544. }
  43545. else {
  43546. XMEMCPY(t[1] + 96, a, sizeof(sp_digit) * 96);
  43547. err = sp_3072_mod_96(t[1], t[1], m);
  43548. }
  43549. }
  43550. if (err == MP_OKAY) {
  43551. sp_3072_mont_sqr_96(t[ 2], t[ 1], m, mp);
  43552. sp_3072_mont_mul_96(t[ 3], t[ 2], t[ 1], m, mp);
  43553. sp_3072_mont_sqr_96(t[ 4], t[ 2], m, mp);
  43554. sp_3072_mont_mul_96(t[ 5], t[ 3], t[ 2], m, mp);
  43555. sp_3072_mont_sqr_96(t[ 6], t[ 3], m, mp);
  43556. sp_3072_mont_mul_96(t[ 7], t[ 4], t[ 3], m, mp);
  43557. sp_3072_mont_sqr_96(t[ 8], t[ 4], m, mp);
  43558. sp_3072_mont_mul_96(t[ 9], t[ 5], t[ 4], m, mp);
  43559. sp_3072_mont_sqr_96(t[10], t[ 5], m, mp);
  43560. sp_3072_mont_mul_96(t[11], t[ 6], t[ 5], m, mp);
  43561. sp_3072_mont_sqr_96(t[12], t[ 6], m, mp);
  43562. sp_3072_mont_mul_96(t[13], t[ 7], t[ 6], m, mp);
  43563. sp_3072_mont_sqr_96(t[14], t[ 7], m, mp);
  43564. sp_3072_mont_mul_96(t[15], t[ 8], t[ 7], m, mp);
  43565. i = (bits - 1) / 32;
  43566. n = e[i--];
  43567. c = bits & 31;
  43568. if (c == 0) {
  43569. c = 32;
  43570. }
  43571. c -= bits % 4;
  43572. if (c == 32) {
  43573. c = 28;
  43574. }
  43575. if (c < 0) {
  43576. /* Number of bits in top word is less than number needed. */
  43577. c = -c;
  43578. y = (byte)(n << c);
  43579. n = e[i--];
  43580. y |= (byte)(n >> (64 - c));
  43581. n <<= c;
  43582. c = 64 - c;
  43583. }
  43584. else if (c == 0) {
  43585. /* All bits in top word used. */
  43586. y = (byte)n;
  43587. }
  43588. else {
  43589. y = (byte)(n >> c);
  43590. n <<= 32 - c;
  43591. }
  43592. XMEMCPY(r, t[y], sizeof(sp_digit) * 96);
  43593. for (; i>=0 || c>=4; ) {
  43594. if (c == 0) {
  43595. n = e[i--];
  43596. y = (byte)(n >> 28);
  43597. n <<= 4;
  43598. c = 28;
  43599. }
  43600. else if (c < 4) {
  43601. y = (byte)(n >> 28);
  43602. n = e[i--];
  43603. c = 4 - c;
  43604. y |= (byte)(n >> (32 - c));
  43605. n <<= c;
  43606. c = 32 - c;
  43607. }
  43608. else {
  43609. y = (byte)((n >> 28) & 0xf);
  43610. n <<= 4;
  43611. c -= 4;
  43612. }
  43613. sp_3072_mont_sqr_96(r, r, m, mp);
  43614. sp_3072_mont_sqr_96(r, r, m, mp);
  43615. sp_3072_mont_sqr_96(r, r, m, mp);
  43616. sp_3072_mont_sqr_96(r, r, m, mp);
  43617. sp_3072_mont_mul_96(r, r, t[y], m, mp);
  43618. }
  43619. XMEMSET(&r[96], 0, sizeof(sp_digit) * 96U);
  43620. sp_3072_mont_reduce_96(r, m, mp);
  43621. mask = 0 - (sp_3072_cmp_96(r, m) >= 0);
  43622. sp_3072_cond_sub_96(r, r, m, mask);
  43623. }
  43624. #ifdef WOLFSSL_SP_SMALL_STACK
  43625. if (td != NULL)
  43626. XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  43627. #endif
  43628. return err;
  43629. }
  43630. #endif /* WOLFSSL_SP_SMALL */
  43631. #endif /* (WOLFSSL_HAVE_SP_RSA && !WOLFSSL_RSA_PUBLIC_ONLY) || WOLFSSL_HAVE_SP_DH */
  43632. #endif /* (WOLFSSL_HAVE_SP_RSA && !WOLFSSL_RSA_PUBLIC_ONLY) || WOLFSSL_HAVE_SP_DH */
  43633. #ifdef WOLFSSL_HAVE_SP_RSA
  43634. /* RSA public key operation.
  43635. *
  43636. * in Array of bytes representing the number to exponentiate, base.
  43637. * inLen Number of bytes in base.
  43638. * em Public exponent.
  43639. * mm Modulus.
  43640. * out Buffer to hold big-endian bytes of exponentiation result.
  43641. * Must be at least 384 bytes long.
  43642. * outLen Number of bytes in result.
  43643. * returns 0 on success, MP_TO_E when the outLen is too small, MP_READ_E when
  43644. * an array is too long and MEMORY_E when dynamic memory allocation fails.
  43645. */
  43646. int sp_RsaPublic_3072(const byte* in, word32 inLen, const mp_int* em,
  43647. const mp_int* mm, byte* out, word32* outLen)
  43648. {
  43649. #ifdef WOLFSSL_SP_SMALL_STACK
  43650. sp_digit* a = NULL;
  43651. #else
  43652. sp_digit a[96 * 5];
  43653. #endif
  43654. sp_digit* m = NULL;
  43655. sp_digit* r = NULL;
  43656. sp_digit *ah = NULL;
  43657. sp_digit e[1] = {0};
  43658. int err = MP_OKAY;
  43659. if (*outLen < 384) {
  43660. err = MP_TO_E;
  43661. }
  43662. else if (mp_count_bits(em) > 32 || inLen > 384 ||
  43663. mp_count_bits(mm) != 3072) {
  43664. err = MP_READ_E;
  43665. }
  43666. else if (mp_iseven(mm)) {
  43667. err = MP_VAL;
  43668. }
  43669. #ifdef WOLFSSL_SP_SMALL_STACK
  43670. if (err == MP_OKAY) {
  43671. a = (sp_digit*)XMALLOC(sizeof(sp_digit) * 96 * 5, NULL,
  43672. DYNAMIC_TYPE_RSA);
  43673. if (a == NULL)
  43674. err = MEMORY_E;
  43675. }
  43676. #endif
  43677. if (err == MP_OKAY) {
  43678. ah = a + 96;
  43679. r = a + 96 * 2;
  43680. m = r + 96 * 2;
  43681. sp_3072_from_bin(ah, 96, in, inLen);
  43682. #if DIGIT_BIT >= 32
  43683. e[0] = em->dp[0];
  43684. #else
  43685. e[0] = em->dp[0];
  43686. if (em->used > 1) {
  43687. e[0] |= ((sp_digit)em->dp[1]) << DIGIT_BIT;
  43688. }
  43689. #endif
  43690. if (e[0] == 0) {
  43691. err = MP_EXPTMOD_E;
  43692. }
  43693. }
  43694. if (err == MP_OKAY) {
  43695. sp_3072_from_mp(m, 96, mm);
  43696. if (e[0] == 0x10001) {
  43697. int i;
  43698. sp_digit mp;
  43699. sp_3072_mont_setup(m, &mp);
  43700. /* Convert to Montgomery form. */
  43701. XMEMSET(a, 0, sizeof(sp_digit) * 96);
  43702. err = sp_3072_mod_96_cond(r, a, m);
  43703. /* Montgomery form: r = a.R mod m */
  43704. if (err == MP_OKAY) {
  43705. /* r = a ^ 0x10000 => r = a squared 16 times */
  43706. for (i = 15; i >= 0; i--) {
  43707. sp_3072_mont_sqr_96(r, r, m, mp);
  43708. }
  43709. /* mont_red(r.R.R) = (r.R.R / R) mod m = r.R mod m
  43710. * mont_red(r.R * a) = (r.R.a / R) mod m = r.a mod m
  43711. */
  43712. sp_3072_mont_mul_96(r, r, ah, m, mp);
  43713. for (i = 95; i > 0; i--) {
  43714. if (r[i] != m[i]) {
  43715. break;
  43716. }
  43717. }
  43718. if (r[i] >= m[i]) {
  43719. sp_3072_sub_in_place_96(r, m);
  43720. }
  43721. }
  43722. }
  43723. else if (e[0] == 0x3) {
  43724. if (err == MP_OKAY) {
  43725. sp_3072_sqr_96(r, ah);
  43726. err = sp_3072_mod_96_cond(r, r, m);
  43727. }
  43728. if (err == MP_OKAY) {
  43729. sp_3072_mul_96(r, ah, r);
  43730. err = sp_3072_mod_96_cond(r, r, m);
  43731. }
  43732. }
  43733. else {
  43734. int i;
  43735. sp_digit mp;
  43736. sp_3072_mont_setup(m, &mp);
  43737. /* Convert to Montgomery form. */
  43738. XMEMSET(a, 0, sizeof(sp_digit) * 96);
  43739. err = sp_3072_mod_96_cond(a, a, m);
  43740. if (err == MP_OKAY) {
  43741. for (i = 31; i >= 0; i--) {
  43742. if (e[0] >> i) {
  43743. break;
  43744. }
  43745. }
  43746. XMEMCPY(r, a, sizeof(sp_digit) * 96);
  43747. for (i--; i >= 0; i--) {
  43748. sp_3072_mont_sqr_96(r, r, m, mp);
  43749. if (((e[0] >> i) & 1) == 1) {
  43750. sp_3072_mont_mul_96(r, r, a, m, mp);
  43751. }
  43752. }
  43753. XMEMSET(&r[96], 0, sizeof(sp_digit) * 96);
  43754. sp_3072_mont_reduce_96(r, m, mp);
  43755. for (i = 95; i > 0; i--) {
  43756. if (r[i] != m[i]) {
  43757. break;
  43758. }
  43759. }
  43760. if (r[i] >= m[i]) {
  43761. sp_3072_sub_in_place_96(r, m);
  43762. }
  43763. }
  43764. }
  43765. }
  43766. if (err == MP_OKAY) {
  43767. sp_3072_to_bin_96(r, out);
  43768. *outLen = 384;
  43769. }
  43770. #ifdef WOLFSSL_SP_SMALL_STACK
  43771. if (a != NULL)
  43772. XFREE(a, NULL, DYNAMIC_TYPE_RSA);
  43773. #endif
  43774. return err;
  43775. }
  43776. #ifndef WOLFSSL_RSA_PUBLIC_ONLY
  43777. #ifdef WOLFSSL_SP_SMALL
  43778. /* Conditionally add a and b using the mask m.
  43779. * m is -1 to add and 0 when not.
  43780. *
  43781. * r A single precision number representing conditional add result.
  43782. * a A single precision number to add with.
  43783. * b A single precision number to add.
  43784. * m Mask value to apply.
  43785. */
  43786. 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)
  43787. {
  43788. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  43789. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  43790. register const sp_digit* b asm ("r2") = (const sp_digit*)b_p;
  43791. register sp_digit m asm ("r3") = (sp_digit)m_p;
  43792. __asm__ __volatile__ (
  43793. "mov lr, #0\n\t"
  43794. "mov r6, #0\n\t"
  43795. "mov r12, #0\n\t"
  43796. "\n"
  43797. "L_sp_3072_cond_add_48_words_%=: \n\t"
  43798. "adds lr, lr, #-1\n\t"
  43799. "ldr r4, [%[a], r12]\n\t"
  43800. "ldr r5, [%[b], r12]\n\t"
  43801. "and r5, r5, %[m]\n\t"
  43802. "adcs r4, r4, r5\n\t"
  43803. "adc lr, r6, r6\n\t"
  43804. "str r4, [%[r], r12]\n\t"
  43805. "add r12, r12, #4\n\t"
  43806. "cmp r12, #0xc0\n\t"
  43807. "blt L_sp_3072_cond_add_48_words_%=\n\t"
  43808. "mov %[r], lr\n\t"
  43809. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b), [m] "+r" (m)
  43810. :
  43811. : "memory", "r12", "lr", "r4", "r5", "r6", "cc"
  43812. );
  43813. return (uint32_t)(size_t)r;
  43814. }
  43815. #else
  43816. /* Conditionally add a and b using the mask m.
  43817. * m is -1 to add and 0 when not.
  43818. *
  43819. * r A single precision number representing conditional add result.
  43820. * a A single precision number to add with.
  43821. * b A single precision number to add.
  43822. * m Mask value to apply.
  43823. */
  43824. 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)
  43825. {
  43826. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  43827. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  43828. register const sp_digit* b asm ("r2") = (const sp_digit*)b_p;
  43829. register sp_digit m asm ("r3") = (sp_digit)m_p;
  43830. __asm__ __volatile__ (
  43831. "mov r8, #0\n\t"
  43832. "ldm %[a]!, {r4, r5}\n\t"
  43833. "ldm %[b]!, {r6, r7}\n\t"
  43834. "and r6, r6, %[m]\n\t"
  43835. "and r7, r7, %[m]\n\t"
  43836. "adds r4, r4, r6\n\t"
  43837. "adcs r5, r5, r7\n\t"
  43838. "stm %[r]!, {r4, r5}\n\t"
  43839. "ldm %[a]!, {r4, r5}\n\t"
  43840. "ldm %[b]!, {r6, r7}\n\t"
  43841. "and r6, r6, %[m]\n\t"
  43842. "and r7, r7, %[m]\n\t"
  43843. "adcs r4, r4, r6\n\t"
  43844. "adcs r5, r5, r7\n\t"
  43845. "stm %[r]!, {r4, r5}\n\t"
  43846. "ldm %[a]!, {r4, r5}\n\t"
  43847. "ldm %[b]!, {r6, r7}\n\t"
  43848. "and r6, r6, %[m]\n\t"
  43849. "and r7, r7, %[m]\n\t"
  43850. "adcs r4, r4, r6\n\t"
  43851. "adcs r5, r5, r7\n\t"
  43852. "stm %[r]!, {r4, r5}\n\t"
  43853. "ldm %[a]!, {r4, r5}\n\t"
  43854. "ldm %[b]!, {r6, r7}\n\t"
  43855. "and r6, r6, %[m]\n\t"
  43856. "and r7, r7, %[m]\n\t"
  43857. "adcs r4, r4, r6\n\t"
  43858. "adcs r5, r5, r7\n\t"
  43859. "stm %[r]!, {r4, r5}\n\t"
  43860. "ldm %[a]!, {r4, r5}\n\t"
  43861. "ldm %[b]!, {r6, r7}\n\t"
  43862. "and r6, r6, %[m]\n\t"
  43863. "and r7, r7, %[m]\n\t"
  43864. "adcs r4, r4, r6\n\t"
  43865. "adcs r5, r5, r7\n\t"
  43866. "stm %[r]!, {r4, r5}\n\t"
  43867. "ldm %[a]!, {r4, r5}\n\t"
  43868. "ldm %[b]!, {r6, r7}\n\t"
  43869. "and r6, r6, %[m]\n\t"
  43870. "and r7, r7, %[m]\n\t"
  43871. "adcs r4, r4, r6\n\t"
  43872. "adcs r5, r5, r7\n\t"
  43873. "stm %[r]!, {r4, r5}\n\t"
  43874. "ldm %[a]!, {r4, r5}\n\t"
  43875. "ldm %[b]!, {r6, r7}\n\t"
  43876. "and r6, r6, %[m]\n\t"
  43877. "and r7, r7, %[m]\n\t"
  43878. "adcs r4, r4, r6\n\t"
  43879. "adcs r5, r5, r7\n\t"
  43880. "stm %[r]!, {r4, r5}\n\t"
  43881. "ldm %[a]!, {r4, r5}\n\t"
  43882. "ldm %[b]!, {r6, r7}\n\t"
  43883. "and r6, r6, %[m]\n\t"
  43884. "and r7, r7, %[m]\n\t"
  43885. "adcs r4, r4, r6\n\t"
  43886. "adcs r5, r5, r7\n\t"
  43887. "stm %[r]!, {r4, r5}\n\t"
  43888. "ldm %[a]!, {r4, r5}\n\t"
  43889. "ldm %[b]!, {r6, r7}\n\t"
  43890. "and r6, r6, %[m]\n\t"
  43891. "and r7, r7, %[m]\n\t"
  43892. "adcs r4, r4, r6\n\t"
  43893. "adcs r5, r5, r7\n\t"
  43894. "stm %[r]!, {r4, r5}\n\t"
  43895. "ldm %[a]!, {r4, r5}\n\t"
  43896. "ldm %[b]!, {r6, r7}\n\t"
  43897. "and r6, r6, %[m]\n\t"
  43898. "and r7, r7, %[m]\n\t"
  43899. "adcs r4, r4, r6\n\t"
  43900. "adcs r5, r5, r7\n\t"
  43901. "stm %[r]!, {r4, r5}\n\t"
  43902. "ldm %[a]!, {r4, r5}\n\t"
  43903. "ldm %[b]!, {r6, r7}\n\t"
  43904. "and r6, r6, %[m]\n\t"
  43905. "and r7, r7, %[m]\n\t"
  43906. "adcs r4, r4, r6\n\t"
  43907. "adcs r5, r5, r7\n\t"
  43908. "stm %[r]!, {r4, r5}\n\t"
  43909. "ldm %[a]!, {r4, r5}\n\t"
  43910. "ldm %[b]!, {r6, r7}\n\t"
  43911. "and r6, r6, %[m]\n\t"
  43912. "and r7, r7, %[m]\n\t"
  43913. "adcs r4, r4, r6\n\t"
  43914. "adcs r5, r5, r7\n\t"
  43915. "stm %[r]!, {r4, r5}\n\t"
  43916. "ldm %[a]!, {r4, r5}\n\t"
  43917. "ldm %[b]!, {r6, r7}\n\t"
  43918. "and r6, r6, %[m]\n\t"
  43919. "and r7, r7, %[m]\n\t"
  43920. "adcs r4, r4, r6\n\t"
  43921. "adcs r5, r5, r7\n\t"
  43922. "stm %[r]!, {r4, r5}\n\t"
  43923. "ldm %[a]!, {r4, r5}\n\t"
  43924. "ldm %[b]!, {r6, r7}\n\t"
  43925. "and r6, r6, %[m]\n\t"
  43926. "and r7, r7, %[m]\n\t"
  43927. "adcs r4, r4, r6\n\t"
  43928. "adcs r5, r5, r7\n\t"
  43929. "stm %[r]!, {r4, r5}\n\t"
  43930. "ldm %[a]!, {r4, r5}\n\t"
  43931. "ldm %[b]!, {r6, r7}\n\t"
  43932. "and r6, r6, %[m]\n\t"
  43933. "and r7, r7, %[m]\n\t"
  43934. "adcs r4, r4, r6\n\t"
  43935. "adcs r5, r5, r7\n\t"
  43936. "stm %[r]!, {r4, r5}\n\t"
  43937. "ldm %[a]!, {r4, r5}\n\t"
  43938. "ldm %[b]!, {r6, r7}\n\t"
  43939. "and r6, r6, %[m]\n\t"
  43940. "and r7, r7, %[m]\n\t"
  43941. "adcs r4, r4, r6\n\t"
  43942. "adcs r5, r5, r7\n\t"
  43943. "stm %[r]!, {r4, r5}\n\t"
  43944. "ldm %[a]!, {r4, r5}\n\t"
  43945. "ldm %[b]!, {r6, r7}\n\t"
  43946. "and r6, r6, %[m]\n\t"
  43947. "and r7, r7, %[m]\n\t"
  43948. "adcs r4, r4, r6\n\t"
  43949. "adcs r5, r5, r7\n\t"
  43950. "stm %[r]!, {r4, r5}\n\t"
  43951. "ldm %[a]!, {r4, r5}\n\t"
  43952. "ldm %[b]!, {r6, r7}\n\t"
  43953. "and r6, r6, %[m]\n\t"
  43954. "and r7, r7, %[m]\n\t"
  43955. "adcs r4, r4, r6\n\t"
  43956. "adcs r5, r5, r7\n\t"
  43957. "stm %[r]!, {r4, r5}\n\t"
  43958. "ldm %[a]!, {r4, r5}\n\t"
  43959. "ldm %[b]!, {r6, r7}\n\t"
  43960. "and r6, r6, %[m]\n\t"
  43961. "and r7, r7, %[m]\n\t"
  43962. "adcs r4, r4, r6\n\t"
  43963. "adcs r5, r5, r7\n\t"
  43964. "stm %[r]!, {r4, r5}\n\t"
  43965. "ldm %[a]!, {r4, r5}\n\t"
  43966. "ldm %[b]!, {r6, r7}\n\t"
  43967. "and r6, r6, %[m]\n\t"
  43968. "and r7, r7, %[m]\n\t"
  43969. "adcs r4, r4, r6\n\t"
  43970. "adcs r5, r5, r7\n\t"
  43971. "stm %[r]!, {r4, r5}\n\t"
  43972. "ldm %[a]!, {r4, r5}\n\t"
  43973. "ldm %[b]!, {r6, r7}\n\t"
  43974. "and r6, r6, %[m]\n\t"
  43975. "and r7, r7, %[m]\n\t"
  43976. "adcs r4, r4, r6\n\t"
  43977. "adcs r5, r5, r7\n\t"
  43978. "stm %[r]!, {r4, r5}\n\t"
  43979. "ldm %[a]!, {r4, r5}\n\t"
  43980. "ldm %[b]!, {r6, r7}\n\t"
  43981. "and r6, r6, %[m]\n\t"
  43982. "and r7, r7, %[m]\n\t"
  43983. "adcs r4, r4, r6\n\t"
  43984. "adcs r5, r5, r7\n\t"
  43985. "stm %[r]!, {r4, r5}\n\t"
  43986. "ldm %[a]!, {r4, r5}\n\t"
  43987. "ldm %[b]!, {r6, r7}\n\t"
  43988. "and r6, r6, %[m]\n\t"
  43989. "and r7, r7, %[m]\n\t"
  43990. "adcs r4, r4, r6\n\t"
  43991. "adcs r5, r5, r7\n\t"
  43992. "stm %[r]!, {r4, r5}\n\t"
  43993. "ldm %[a]!, {r4, r5}\n\t"
  43994. "ldm %[b]!, {r6, r7}\n\t"
  43995. "and r6, r6, %[m]\n\t"
  43996. "and r7, r7, %[m]\n\t"
  43997. "adcs r4, r4, r6\n\t"
  43998. "adcs r5, r5, r7\n\t"
  43999. "stm %[r]!, {r4, r5}\n\t"
  44000. "adc %[r], r8, r8\n\t"
  44001. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b), [m] "+r" (m)
  44002. :
  44003. : "memory", "r12", "lr", "r4", "r5", "r6", "r7", "r8", "cc"
  44004. );
  44005. return (uint32_t)(size_t)r;
  44006. }
  44007. #endif /* WOLFSSL_SP_SMALL */
  44008. /* RSA private key operation.
  44009. *
  44010. * in Array of bytes representing the number to exponentiate, base.
  44011. * inLen Number of bytes in base.
  44012. * dm Private exponent.
  44013. * pm First prime.
  44014. * qm Second prime.
  44015. * dpm First prime's CRT exponent.
  44016. * dqm Second prime's CRT exponent.
  44017. * qim Inverse of second prime mod p.
  44018. * mm Modulus.
  44019. * out Buffer to hold big-endian bytes of exponentiation result.
  44020. * Must be at least 384 bytes long.
  44021. * outLen Number of bytes in result.
  44022. * returns 0 on success, MP_TO_E when the outLen is too small, MP_READ_E when
  44023. * an array is too long and MEMORY_E when dynamic memory allocation fails.
  44024. */
  44025. int sp_RsaPrivate_3072(const byte* in, word32 inLen, const mp_int* dm,
  44026. const mp_int* pm, const mp_int* qm, const mp_int* dpm, const mp_int* dqm,
  44027. const mp_int* qim, const mp_int* mm, byte* out, word32* outLen)
  44028. {
  44029. #if defined(SP_RSA_PRIVATE_EXP_D) || defined(RSA_LOW_MEM)
  44030. #ifdef WOLFSSL_SP_SMALL_STACK
  44031. sp_digit* d = NULL;
  44032. #else
  44033. sp_digit d[96 * 4];
  44034. #endif
  44035. sp_digit* a = NULL;
  44036. sp_digit* m = NULL;
  44037. sp_digit* r = NULL;
  44038. int err = MP_OKAY;
  44039. (void)pm;
  44040. (void)qm;
  44041. (void)dpm;
  44042. (void)dqm;
  44043. (void)qim;
  44044. if (*outLen < 384U) {
  44045. err = MP_TO_E;
  44046. }
  44047. if (err == MP_OKAY) {
  44048. if (mp_count_bits(dm) > 3072) {
  44049. err = MP_READ_E;
  44050. }
  44051. else if (inLen > 384) {
  44052. err = MP_READ_E;
  44053. }
  44054. else if (mp_count_bits(mm) != 3072) {
  44055. err = MP_READ_E;
  44056. }
  44057. else if (mp_iseven(mm)) {
  44058. err = MP_VAL;
  44059. }
  44060. }
  44061. #ifdef WOLFSSL_SP_SMALL_STACK
  44062. if (err == MP_OKAY) {
  44063. d = (sp_digit*)XMALLOC(sizeof(sp_digit) * 96 * 4, NULL,
  44064. DYNAMIC_TYPE_RSA);
  44065. if (d == NULL)
  44066. err = MEMORY_E;
  44067. }
  44068. #endif
  44069. if (err == MP_OKAY) {
  44070. a = d + 96;
  44071. m = a + 192;
  44072. r = a;
  44073. sp_3072_from_bin(a, 96, in, inLen);
  44074. sp_3072_from_mp(d, 96, dm);
  44075. sp_3072_from_mp(m, 96, mm);
  44076. err = sp_3072_mod_exp_96(r, a, d, 3072, m, 0);
  44077. }
  44078. if (err == MP_OKAY) {
  44079. sp_3072_to_bin_96(r, out);
  44080. *outLen = 384;
  44081. }
  44082. #ifdef WOLFSSL_SP_SMALL_STACK
  44083. if (d != NULL)
  44084. #endif
  44085. {
  44086. /* only "a" and "r" are sensitive and need zeroized (same pointer) */
  44087. if (a != NULL)
  44088. ForceZero(a, sizeof(sp_digit) * 96);
  44089. #ifdef WOLFSSL_SP_SMALL_STACK
  44090. XFREE(d, NULL, DYNAMIC_TYPE_RSA);
  44091. #endif
  44092. }
  44093. return err;
  44094. #else
  44095. #ifdef WOLFSSL_SP_SMALL_STACK
  44096. sp_digit* a = NULL;
  44097. #else
  44098. sp_digit a[48 * 11];
  44099. #endif
  44100. sp_digit* p = NULL;
  44101. sp_digit* q = NULL;
  44102. sp_digit* dp = NULL;
  44103. sp_digit* tmpa = NULL;
  44104. sp_digit* tmpb = NULL;
  44105. sp_digit* r = NULL;
  44106. sp_digit* qi = NULL;
  44107. sp_digit* dq = NULL;
  44108. sp_digit c;
  44109. int err = MP_OKAY;
  44110. (void)dm;
  44111. (void)mm;
  44112. if (*outLen < 384) {
  44113. err = MP_TO_E;
  44114. }
  44115. else if (inLen > 384 || mp_count_bits(mm) != 3072) {
  44116. err = MP_READ_E;
  44117. }
  44118. else if (mp_iseven(mm)) {
  44119. err = MP_VAL;
  44120. }
  44121. else if (mp_iseven(pm)) {
  44122. err = MP_VAL;
  44123. }
  44124. else if (mp_iseven(qm)) {
  44125. err = MP_VAL;
  44126. }
  44127. #ifdef WOLFSSL_SP_SMALL_STACK
  44128. if (err == MP_OKAY) {
  44129. a = (sp_digit*)XMALLOC(sizeof(sp_digit) * 48 * 11, NULL,
  44130. DYNAMIC_TYPE_RSA);
  44131. if (a == NULL)
  44132. err = MEMORY_E;
  44133. }
  44134. #endif
  44135. if (err == MP_OKAY) {
  44136. p = a + 96 * 2;
  44137. q = p + 48;
  44138. qi = dq = dp = q + 48;
  44139. tmpa = qi + 48;
  44140. tmpb = tmpa + 96;
  44141. r = a;
  44142. sp_3072_from_bin(a, 96, in, inLen);
  44143. sp_3072_from_mp(p, 48, pm);
  44144. sp_3072_from_mp(q, 48, qm);
  44145. sp_3072_from_mp(dp, 48, dpm);
  44146. err = sp_3072_mod_exp_48(tmpa, a, dp, 1536, p, 1);
  44147. }
  44148. if (err == MP_OKAY) {
  44149. sp_3072_from_mp(dq, 48, dqm);
  44150. err = sp_3072_mod_exp_48(tmpb, a, dq, 1536, q, 1);
  44151. }
  44152. if (err == MP_OKAY) {
  44153. c = sp_3072_sub_in_place_48(tmpa, tmpb);
  44154. c += sp_3072_cond_add_48(tmpa, tmpa, p, c);
  44155. sp_3072_cond_add_48(tmpa, tmpa, p, c);
  44156. sp_3072_from_mp(qi, 48, qim);
  44157. sp_3072_mul_48(tmpa, tmpa, qi);
  44158. err = sp_3072_mod_48(tmpa, tmpa, p);
  44159. }
  44160. if (err == MP_OKAY) {
  44161. sp_3072_mul_48(tmpa, q, tmpa);
  44162. XMEMSET(&tmpb[48], 0, sizeof(sp_digit) * 48);
  44163. sp_3072_add_96(r, tmpb, tmpa);
  44164. sp_3072_to_bin_96(r, out);
  44165. *outLen = 384;
  44166. }
  44167. #ifdef WOLFSSL_SP_SMALL_STACK
  44168. if (a != NULL)
  44169. #endif
  44170. {
  44171. ForceZero(a, sizeof(sp_digit) * 48 * 11);
  44172. #ifdef WOLFSSL_SP_SMALL_STACK
  44173. XFREE(a, NULL, DYNAMIC_TYPE_RSA);
  44174. #endif
  44175. }
  44176. #endif /* SP_RSA_PRIVATE_EXP_D || RSA_LOW_MEM */
  44177. return err;
  44178. }
  44179. #endif /* WOLFSSL_RSA_PUBLIC_ONLY */
  44180. #endif /* WOLFSSL_HAVE_SP_RSA */
  44181. #if defined(WOLFSSL_HAVE_SP_DH) || (defined(WOLFSSL_HAVE_SP_RSA) && \
  44182. !defined(WOLFSSL_RSA_PUBLIC_ONLY))
  44183. /* Convert an array of sp_digit to an mp_int.
  44184. *
  44185. * a A single precision integer.
  44186. * r A multi-precision integer.
  44187. */
  44188. static int sp_3072_to_mp(const sp_digit* a, mp_int* r)
  44189. {
  44190. int err;
  44191. err = mp_grow(r, (3072 + DIGIT_BIT - 1) / DIGIT_BIT);
  44192. if (err == MP_OKAY) { /*lint !e774 case where err is always MP_OKAY*/
  44193. #if DIGIT_BIT == 32
  44194. XMEMCPY(r->dp, a, sizeof(sp_digit) * 96);
  44195. r->used = 96;
  44196. mp_clamp(r);
  44197. #elif DIGIT_BIT < 32
  44198. int i;
  44199. int j = 0;
  44200. int s = 0;
  44201. r->dp[0] = 0;
  44202. for (i = 0; i < 96; i++) {
  44203. r->dp[j] |= (mp_digit)(a[i] << s);
  44204. r->dp[j] &= ((sp_digit)1 << DIGIT_BIT) - 1;
  44205. s = DIGIT_BIT - s;
  44206. r->dp[++j] = (mp_digit)(a[i] >> s);
  44207. while (s + DIGIT_BIT <= 32) {
  44208. s += DIGIT_BIT;
  44209. r->dp[j++] &= ((sp_digit)1 << DIGIT_BIT) - 1;
  44210. if (s == SP_WORD_SIZE) {
  44211. r->dp[j] = 0;
  44212. }
  44213. else {
  44214. r->dp[j] = (mp_digit)(a[i] >> s);
  44215. }
  44216. }
  44217. s = 32 - s;
  44218. }
  44219. r->used = (3072 + DIGIT_BIT - 1) / DIGIT_BIT;
  44220. mp_clamp(r);
  44221. #else
  44222. int i;
  44223. int j = 0;
  44224. int s = 0;
  44225. r->dp[0] = 0;
  44226. for (i = 0; i < 96; i++) {
  44227. r->dp[j] |= ((mp_digit)a[i]) << s;
  44228. if (s + 32 >= DIGIT_BIT) {
  44229. #if DIGIT_BIT != 32 && DIGIT_BIT != 64
  44230. r->dp[j] &= ((sp_digit)1 << DIGIT_BIT) - 1;
  44231. #endif
  44232. s = DIGIT_BIT - s;
  44233. r->dp[++j] = a[i] >> s;
  44234. s = 32 - s;
  44235. }
  44236. else {
  44237. s += 32;
  44238. }
  44239. }
  44240. r->used = (3072 + DIGIT_BIT - 1) / DIGIT_BIT;
  44241. mp_clamp(r);
  44242. #endif
  44243. }
  44244. return err;
  44245. }
  44246. /* Perform the modular exponentiation for Diffie-Hellman.
  44247. *
  44248. * base Base. MP integer.
  44249. * exp Exponent. MP integer.
  44250. * mod Modulus. MP integer.
  44251. * res Result. MP integer.
  44252. * returns 0 on success, MP_READ_E if there are too many bytes in an array
  44253. * and MEMORY_E if memory allocation fails.
  44254. */
  44255. int sp_ModExp_3072(const mp_int* base, const mp_int* exp, const mp_int* mod,
  44256. mp_int* res)
  44257. {
  44258. int err = MP_OKAY;
  44259. sp_digit b[192];
  44260. sp_digit e[96];
  44261. sp_digit m[96];
  44262. sp_digit* r = b;
  44263. int expBits = mp_count_bits(exp);
  44264. if (mp_count_bits(base) > 3072) {
  44265. err = MP_READ_E;
  44266. }
  44267. else if (expBits > 3072) {
  44268. err = MP_READ_E;
  44269. }
  44270. else if (mp_count_bits(mod) != 3072) {
  44271. err = MP_READ_E;
  44272. }
  44273. else if (mp_iseven(mod)) {
  44274. err = MP_VAL;
  44275. }
  44276. if (err == MP_OKAY) {
  44277. sp_3072_from_mp(b, 96, base);
  44278. sp_3072_from_mp(e, 96, exp);
  44279. sp_3072_from_mp(m, 96, mod);
  44280. err = sp_3072_mod_exp_96(r, b, e, expBits, m, 0);
  44281. }
  44282. if (err == MP_OKAY) {
  44283. err = sp_3072_to_mp(r, res);
  44284. }
  44285. XMEMSET(e, 0, sizeof(e));
  44286. return err;
  44287. }
  44288. #ifdef WOLFSSL_HAVE_SP_DH
  44289. #ifdef HAVE_FFDHE_3072
  44290. static void sp_3072_lshift_96(sp_digit* r_p, const sp_digit* a_p, byte n_p)
  44291. {
  44292. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  44293. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  44294. register byte n asm ("r2") = (byte)n_p;
  44295. __asm__ __volatile__ (
  44296. "rsb r12, %[n], #31\n\t"
  44297. "ldr r5, [%[a], #380]\n\t"
  44298. "lsr r6, r5, #1\n\t"
  44299. "lsl r5, r5, %[n]\n\t"
  44300. "lsr r6, r6, r12\n\t"
  44301. "ldr r4, [%[a], #376]\n\t"
  44302. "str r6, [%[r], #384]\n\t"
  44303. "lsr r3, r4, #1\n\t"
  44304. "lsl r4, r4, %[n]\n\t"
  44305. "lsr r3, r3, r12\n\t"
  44306. "orr r5, r5, r3\n\t"
  44307. "ldr r6, [%[a], #372]\n\t"
  44308. "str r5, [%[r], #380]\n\t"
  44309. "lsr r3, r6, #1\n\t"
  44310. "lsl r6, r6, %[n]\n\t"
  44311. "lsr r3, r3, r12\n\t"
  44312. "orr r4, r4, r3\n\t"
  44313. "ldr r5, [%[a], #368]\n\t"
  44314. "str r4, [%[r], #376]\n\t"
  44315. "lsr r3, r5, #1\n\t"
  44316. "lsl r5, r5, %[n]\n\t"
  44317. "lsr r3, r3, r12\n\t"
  44318. "orr r6, r6, r3\n\t"
  44319. "ldr r4, [%[a], #364]\n\t"
  44320. "str r6, [%[r], #372]\n\t"
  44321. "lsr r3, r4, #1\n\t"
  44322. "lsl r4, r4, %[n]\n\t"
  44323. "lsr r3, r3, r12\n\t"
  44324. "orr r5, r5, r3\n\t"
  44325. "ldr r6, [%[a], #360]\n\t"
  44326. "str r5, [%[r], #368]\n\t"
  44327. "lsr r3, r6, #1\n\t"
  44328. "lsl r6, r6, %[n]\n\t"
  44329. "lsr r3, r3, r12\n\t"
  44330. "orr r4, r4, r3\n\t"
  44331. "ldr r5, [%[a], #356]\n\t"
  44332. "str r4, [%[r], #364]\n\t"
  44333. "lsr r3, r5, #1\n\t"
  44334. "lsl r5, r5, %[n]\n\t"
  44335. "lsr r3, r3, r12\n\t"
  44336. "orr r6, r6, r3\n\t"
  44337. "ldr r4, [%[a], #352]\n\t"
  44338. "str r6, [%[r], #360]\n\t"
  44339. "lsr r3, r4, #1\n\t"
  44340. "lsl r4, r4, %[n]\n\t"
  44341. "lsr r3, r3, r12\n\t"
  44342. "orr r5, r5, r3\n\t"
  44343. "ldr r6, [%[a], #348]\n\t"
  44344. "str r5, [%[r], #356]\n\t"
  44345. "lsr r3, r6, #1\n\t"
  44346. "lsl r6, r6, %[n]\n\t"
  44347. "lsr r3, r3, r12\n\t"
  44348. "orr r4, r4, r3\n\t"
  44349. "ldr r5, [%[a], #344]\n\t"
  44350. "str r4, [%[r], #352]\n\t"
  44351. "lsr r3, r5, #1\n\t"
  44352. "lsl r5, r5, %[n]\n\t"
  44353. "lsr r3, r3, r12\n\t"
  44354. "orr r6, r6, r3\n\t"
  44355. "ldr r4, [%[a], #340]\n\t"
  44356. "str r6, [%[r], #348]\n\t"
  44357. "lsr r3, r4, #1\n\t"
  44358. "lsl r4, r4, %[n]\n\t"
  44359. "lsr r3, r3, r12\n\t"
  44360. "orr r5, r5, r3\n\t"
  44361. "ldr r6, [%[a], #336]\n\t"
  44362. "str r5, [%[r], #344]\n\t"
  44363. "lsr r3, r6, #1\n\t"
  44364. "lsl r6, r6, %[n]\n\t"
  44365. "lsr r3, r3, r12\n\t"
  44366. "orr r4, r4, r3\n\t"
  44367. "ldr r5, [%[a], #332]\n\t"
  44368. "str r4, [%[r], #340]\n\t"
  44369. "lsr r3, r5, #1\n\t"
  44370. "lsl r5, r5, %[n]\n\t"
  44371. "lsr r3, r3, r12\n\t"
  44372. "orr r6, r6, r3\n\t"
  44373. "ldr r4, [%[a], #328]\n\t"
  44374. "str r6, [%[r], #336]\n\t"
  44375. "lsr r3, r4, #1\n\t"
  44376. "lsl r4, r4, %[n]\n\t"
  44377. "lsr r3, r3, r12\n\t"
  44378. "orr r5, r5, r3\n\t"
  44379. "ldr r6, [%[a], #324]\n\t"
  44380. "str r5, [%[r], #332]\n\t"
  44381. "lsr r3, r6, #1\n\t"
  44382. "lsl r6, r6, %[n]\n\t"
  44383. "lsr r3, r3, r12\n\t"
  44384. "orr r4, r4, r3\n\t"
  44385. "ldr r5, [%[a], #320]\n\t"
  44386. "str r4, [%[r], #328]\n\t"
  44387. "lsr r3, r5, #1\n\t"
  44388. "lsl r5, r5, %[n]\n\t"
  44389. "lsr r3, r3, r12\n\t"
  44390. "orr r6, r6, r3\n\t"
  44391. "ldr r4, [%[a], #316]\n\t"
  44392. "str r6, [%[r], #324]\n\t"
  44393. "lsr r3, r4, #1\n\t"
  44394. "lsl r4, r4, %[n]\n\t"
  44395. "lsr r3, r3, r12\n\t"
  44396. "orr r5, r5, r3\n\t"
  44397. "ldr r6, [%[a], #312]\n\t"
  44398. "str r5, [%[r], #320]\n\t"
  44399. "lsr r3, r6, #1\n\t"
  44400. "lsl r6, r6, %[n]\n\t"
  44401. "lsr r3, r3, r12\n\t"
  44402. "orr r4, r4, r3\n\t"
  44403. "ldr r5, [%[a], #308]\n\t"
  44404. "str r4, [%[r], #316]\n\t"
  44405. "lsr r3, r5, #1\n\t"
  44406. "lsl r5, r5, %[n]\n\t"
  44407. "lsr r3, r3, r12\n\t"
  44408. "orr r6, r6, r3\n\t"
  44409. "ldr r4, [%[a], #304]\n\t"
  44410. "str r6, [%[r], #312]\n\t"
  44411. "lsr r3, r4, #1\n\t"
  44412. "lsl r4, r4, %[n]\n\t"
  44413. "lsr r3, r3, r12\n\t"
  44414. "orr r5, r5, r3\n\t"
  44415. "ldr r6, [%[a], #300]\n\t"
  44416. "str r5, [%[r], #308]\n\t"
  44417. "lsr r3, r6, #1\n\t"
  44418. "lsl r6, r6, %[n]\n\t"
  44419. "lsr r3, r3, r12\n\t"
  44420. "orr r4, r4, r3\n\t"
  44421. "ldr r5, [%[a], #296]\n\t"
  44422. "str r4, [%[r], #304]\n\t"
  44423. "lsr r3, r5, #1\n\t"
  44424. "lsl r5, r5, %[n]\n\t"
  44425. "lsr r3, r3, r12\n\t"
  44426. "orr r6, r6, r3\n\t"
  44427. "ldr r4, [%[a], #292]\n\t"
  44428. "str r6, [%[r], #300]\n\t"
  44429. "lsr r3, r4, #1\n\t"
  44430. "lsl r4, r4, %[n]\n\t"
  44431. "lsr r3, r3, r12\n\t"
  44432. "orr r5, r5, r3\n\t"
  44433. "ldr r6, [%[a], #288]\n\t"
  44434. "str r5, [%[r], #296]\n\t"
  44435. "lsr r3, r6, #1\n\t"
  44436. "lsl r6, r6, %[n]\n\t"
  44437. "lsr r3, r3, r12\n\t"
  44438. "orr r4, r4, r3\n\t"
  44439. "ldr r5, [%[a], #284]\n\t"
  44440. "str r4, [%[r], #292]\n\t"
  44441. "lsr r3, r5, #1\n\t"
  44442. "lsl r5, r5, %[n]\n\t"
  44443. "lsr r3, r3, r12\n\t"
  44444. "orr r6, r6, r3\n\t"
  44445. "ldr r4, [%[a], #280]\n\t"
  44446. "str r6, [%[r], #288]\n\t"
  44447. "lsr r3, r4, #1\n\t"
  44448. "lsl r4, r4, %[n]\n\t"
  44449. "lsr r3, r3, r12\n\t"
  44450. "orr r5, r5, r3\n\t"
  44451. "ldr r6, [%[a], #276]\n\t"
  44452. "str r5, [%[r], #284]\n\t"
  44453. "lsr r3, r6, #1\n\t"
  44454. "lsl r6, r6, %[n]\n\t"
  44455. "lsr r3, r3, r12\n\t"
  44456. "orr r4, r4, r3\n\t"
  44457. "ldr r5, [%[a], #272]\n\t"
  44458. "str r4, [%[r], #280]\n\t"
  44459. "lsr r3, r5, #1\n\t"
  44460. "lsl r5, r5, %[n]\n\t"
  44461. "lsr r3, r3, r12\n\t"
  44462. "orr r6, r6, r3\n\t"
  44463. "ldr r4, [%[a], #268]\n\t"
  44464. "str r6, [%[r], #276]\n\t"
  44465. "lsr r3, r4, #1\n\t"
  44466. "lsl r4, r4, %[n]\n\t"
  44467. "lsr r3, r3, r12\n\t"
  44468. "orr r5, r5, r3\n\t"
  44469. "ldr r6, [%[a], #264]\n\t"
  44470. "str r5, [%[r], #272]\n\t"
  44471. "lsr r3, r6, #1\n\t"
  44472. "lsl r6, r6, %[n]\n\t"
  44473. "lsr r3, r3, r12\n\t"
  44474. "orr r4, r4, r3\n\t"
  44475. "ldr r5, [%[a], #260]\n\t"
  44476. "str r4, [%[r], #268]\n\t"
  44477. "lsr r3, r5, #1\n\t"
  44478. "lsl r5, r5, %[n]\n\t"
  44479. "lsr r3, r3, r12\n\t"
  44480. "orr r6, r6, r3\n\t"
  44481. "ldr r4, [%[a], #256]\n\t"
  44482. "str r6, [%[r], #264]\n\t"
  44483. "lsr r3, r4, #1\n\t"
  44484. "lsl r4, r4, %[n]\n\t"
  44485. "lsr r3, r3, r12\n\t"
  44486. "orr r5, r5, r3\n\t"
  44487. "ldr r6, [%[a], #252]\n\t"
  44488. "str r5, [%[r], #260]\n\t"
  44489. "lsr r3, r6, #1\n\t"
  44490. "lsl r6, r6, %[n]\n\t"
  44491. "lsr r3, r3, r12\n\t"
  44492. "orr r4, r4, r3\n\t"
  44493. "ldr r5, [%[a], #248]\n\t"
  44494. "str r4, [%[r], #256]\n\t"
  44495. "lsr r3, r5, #1\n\t"
  44496. "lsl r5, r5, %[n]\n\t"
  44497. "lsr r3, r3, r12\n\t"
  44498. "orr r6, r6, r3\n\t"
  44499. "ldr r4, [%[a], #244]\n\t"
  44500. "str r6, [%[r], #252]\n\t"
  44501. "lsr r3, r4, #1\n\t"
  44502. "lsl r4, r4, %[n]\n\t"
  44503. "lsr r3, r3, r12\n\t"
  44504. "orr r5, r5, r3\n\t"
  44505. "ldr r6, [%[a], #240]\n\t"
  44506. "str r5, [%[r], #248]\n\t"
  44507. "lsr r3, r6, #1\n\t"
  44508. "lsl r6, r6, %[n]\n\t"
  44509. "lsr r3, r3, r12\n\t"
  44510. "orr r4, r4, r3\n\t"
  44511. "ldr r5, [%[a], #236]\n\t"
  44512. "str r4, [%[r], #244]\n\t"
  44513. "lsr r3, r5, #1\n\t"
  44514. "lsl r5, r5, %[n]\n\t"
  44515. "lsr r3, r3, r12\n\t"
  44516. "orr r6, r6, r3\n\t"
  44517. "ldr r4, [%[a], #232]\n\t"
  44518. "str r6, [%[r], #240]\n\t"
  44519. "lsr r3, r4, #1\n\t"
  44520. "lsl r4, r4, %[n]\n\t"
  44521. "lsr r3, r3, r12\n\t"
  44522. "orr r5, r5, r3\n\t"
  44523. "ldr r6, [%[a], #228]\n\t"
  44524. "str r5, [%[r], #236]\n\t"
  44525. "lsr r3, r6, #1\n\t"
  44526. "lsl r6, r6, %[n]\n\t"
  44527. "lsr r3, r3, r12\n\t"
  44528. "orr r4, r4, r3\n\t"
  44529. "ldr r5, [%[a], #224]\n\t"
  44530. "str r4, [%[r], #232]\n\t"
  44531. "lsr r3, r5, #1\n\t"
  44532. "lsl r5, r5, %[n]\n\t"
  44533. "lsr r3, r3, r12\n\t"
  44534. "orr r6, r6, r3\n\t"
  44535. "ldr r4, [%[a], #220]\n\t"
  44536. "str r6, [%[r], #228]\n\t"
  44537. "lsr r3, r4, #1\n\t"
  44538. "lsl r4, r4, %[n]\n\t"
  44539. "lsr r3, r3, r12\n\t"
  44540. "orr r5, r5, r3\n\t"
  44541. "ldr r6, [%[a], #216]\n\t"
  44542. "str r5, [%[r], #224]\n\t"
  44543. "lsr r3, r6, #1\n\t"
  44544. "lsl r6, r6, %[n]\n\t"
  44545. "lsr r3, r3, r12\n\t"
  44546. "orr r4, r4, r3\n\t"
  44547. "ldr r5, [%[a], #212]\n\t"
  44548. "str r4, [%[r], #220]\n\t"
  44549. "lsr r3, r5, #1\n\t"
  44550. "lsl r5, r5, %[n]\n\t"
  44551. "lsr r3, r3, r12\n\t"
  44552. "orr r6, r6, r3\n\t"
  44553. "ldr r4, [%[a], #208]\n\t"
  44554. "str r6, [%[r], #216]\n\t"
  44555. "lsr r3, r4, #1\n\t"
  44556. "lsl r4, r4, %[n]\n\t"
  44557. "lsr r3, r3, r12\n\t"
  44558. "orr r5, r5, r3\n\t"
  44559. "ldr r6, [%[a], #204]\n\t"
  44560. "str r5, [%[r], #212]\n\t"
  44561. "lsr r3, r6, #1\n\t"
  44562. "lsl r6, r6, %[n]\n\t"
  44563. "lsr r3, r3, r12\n\t"
  44564. "orr r4, r4, r3\n\t"
  44565. "ldr r5, [%[a], #200]\n\t"
  44566. "str r4, [%[r], #208]\n\t"
  44567. "lsr r3, r5, #1\n\t"
  44568. "lsl r5, r5, %[n]\n\t"
  44569. "lsr r3, r3, r12\n\t"
  44570. "orr r6, r6, r3\n\t"
  44571. "ldr r4, [%[a], #196]\n\t"
  44572. "str r6, [%[r], #204]\n\t"
  44573. "lsr r3, r4, #1\n\t"
  44574. "lsl r4, r4, %[n]\n\t"
  44575. "lsr r3, r3, r12\n\t"
  44576. "orr r5, r5, r3\n\t"
  44577. "ldr r6, [%[a], #192]\n\t"
  44578. "str r5, [%[r], #200]\n\t"
  44579. "lsr r3, r6, #1\n\t"
  44580. "lsl r6, r6, %[n]\n\t"
  44581. "lsr r3, r3, r12\n\t"
  44582. "orr r4, r4, r3\n\t"
  44583. "ldr r5, [%[a], #188]\n\t"
  44584. "str r4, [%[r], #196]\n\t"
  44585. "lsr r3, r5, #1\n\t"
  44586. "lsl r5, r5, %[n]\n\t"
  44587. "lsr r3, r3, r12\n\t"
  44588. "orr r6, r6, r3\n\t"
  44589. "ldr r4, [%[a], #184]\n\t"
  44590. "str r6, [%[r], #192]\n\t"
  44591. "lsr r3, r4, #1\n\t"
  44592. "lsl r4, r4, %[n]\n\t"
  44593. "lsr r3, r3, r12\n\t"
  44594. "orr r5, r5, r3\n\t"
  44595. "ldr r6, [%[a], #180]\n\t"
  44596. "str r5, [%[r], #188]\n\t"
  44597. "lsr r3, r6, #1\n\t"
  44598. "lsl r6, r6, %[n]\n\t"
  44599. "lsr r3, r3, r12\n\t"
  44600. "orr r4, r4, r3\n\t"
  44601. "ldr r5, [%[a], #176]\n\t"
  44602. "str r4, [%[r], #184]\n\t"
  44603. "lsr r3, r5, #1\n\t"
  44604. "lsl r5, r5, %[n]\n\t"
  44605. "lsr r3, r3, r12\n\t"
  44606. "orr r6, r6, r3\n\t"
  44607. "ldr r4, [%[a], #172]\n\t"
  44608. "str r6, [%[r], #180]\n\t"
  44609. "lsr r3, r4, #1\n\t"
  44610. "lsl r4, r4, %[n]\n\t"
  44611. "lsr r3, r3, r12\n\t"
  44612. "orr r5, r5, r3\n\t"
  44613. "ldr r6, [%[a], #168]\n\t"
  44614. "str r5, [%[r], #176]\n\t"
  44615. "lsr r3, r6, #1\n\t"
  44616. "lsl r6, r6, %[n]\n\t"
  44617. "lsr r3, r3, r12\n\t"
  44618. "orr r4, r4, r3\n\t"
  44619. "ldr r5, [%[a], #164]\n\t"
  44620. "str r4, [%[r], #172]\n\t"
  44621. "lsr r3, r5, #1\n\t"
  44622. "lsl r5, r5, %[n]\n\t"
  44623. "lsr r3, r3, r12\n\t"
  44624. "orr r6, r6, r3\n\t"
  44625. "ldr r4, [%[a], #160]\n\t"
  44626. "str r6, [%[r], #168]\n\t"
  44627. "lsr r3, r4, #1\n\t"
  44628. "lsl r4, r4, %[n]\n\t"
  44629. "lsr r3, r3, r12\n\t"
  44630. "orr r5, r5, r3\n\t"
  44631. "ldr r6, [%[a], #156]\n\t"
  44632. "str r5, [%[r], #164]\n\t"
  44633. "lsr r3, r6, #1\n\t"
  44634. "lsl r6, r6, %[n]\n\t"
  44635. "lsr r3, r3, r12\n\t"
  44636. "orr r4, r4, r3\n\t"
  44637. "ldr r5, [%[a], #152]\n\t"
  44638. "str r4, [%[r], #160]\n\t"
  44639. "lsr r3, r5, #1\n\t"
  44640. "lsl r5, r5, %[n]\n\t"
  44641. "lsr r3, r3, r12\n\t"
  44642. "orr r6, r6, r3\n\t"
  44643. "ldr r4, [%[a], #148]\n\t"
  44644. "str r6, [%[r], #156]\n\t"
  44645. "lsr r3, r4, #1\n\t"
  44646. "lsl r4, r4, %[n]\n\t"
  44647. "lsr r3, r3, r12\n\t"
  44648. "orr r5, r5, r3\n\t"
  44649. "ldr r6, [%[a], #144]\n\t"
  44650. "str r5, [%[r], #152]\n\t"
  44651. "lsr r3, r6, #1\n\t"
  44652. "lsl r6, r6, %[n]\n\t"
  44653. "lsr r3, r3, r12\n\t"
  44654. "orr r4, r4, r3\n\t"
  44655. "ldr r5, [%[a], #140]\n\t"
  44656. "str r4, [%[r], #148]\n\t"
  44657. "lsr r3, r5, #1\n\t"
  44658. "lsl r5, r5, %[n]\n\t"
  44659. "lsr r3, r3, r12\n\t"
  44660. "orr r6, r6, r3\n\t"
  44661. "ldr r4, [%[a], #136]\n\t"
  44662. "str r6, [%[r], #144]\n\t"
  44663. "lsr r3, r4, #1\n\t"
  44664. "lsl r4, r4, %[n]\n\t"
  44665. "lsr r3, r3, r12\n\t"
  44666. "orr r5, r5, r3\n\t"
  44667. "ldr r6, [%[a], #132]\n\t"
  44668. "str r5, [%[r], #140]\n\t"
  44669. "lsr r3, r6, #1\n\t"
  44670. "lsl r6, r6, %[n]\n\t"
  44671. "lsr r3, r3, r12\n\t"
  44672. "orr r4, r4, r3\n\t"
  44673. "ldr r5, [%[a], #128]\n\t"
  44674. "str r4, [%[r], #136]\n\t"
  44675. "lsr r3, r5, #1\n\t"
  44676. "lsl r5, r5, %[n]\n\t"
  44677. "lsr r3, r3, r12\n\t"
  44678. "orr r6, r6, r3\n\t"
  44679. "ldr r4, [%[a], #124]\n\t"
  44680. "str r6, [%[r], #132]\n\t"
  44681. "lsr r3, r4, #1\n\t"
  44682. "lsl r4, r4, %[n]\n\t"
  44683. "lsr r3, r3, r12\n\t"
  44684. "orr r5, r5, r3\n\t"
  44685. "ldr r6, [%[a], #120]\n\t"
  44686. "str r5, [%[r], #128]\n\t"
  44687. "lsr r3, r6, #1\n\t"
  44688. "lsl r6, r6, %[n]\n\t"
  44689. "lsr r3, r3, r12\n\t"
  44690. "orr r4, r4, r3\n\t"
  44691. "ldr r5, [%[a], #116]\n\t"
  44692. "str r4, [%[r], #124]\n\t"
  44693. "lsr r3, r5, #1\n\t"
  44694. "lsl r5, r5, %[n]\n\t"
  44695. "lsr r3, r3, r12\n\t"
  44696. "orr r6, r6, r3\n\t"
  44697. "ldr r4, [%[a], #112]\n\t"
  44698. "str r6, [%[r], #120]\n\t"
  44699. "lsr r3, r4, #1\n\t"
  44700. "lsl r4, r4, %[n]\n\t"
  44701. "lsr r3, r3, r12\n\t"
  44702. "orr r5, r5, r3\n\t"
  44703. "ldr r6, [%[a], #108]\n\t"
  44704. "str r5, [%[r], #116]\n\t"
  44705. "lsr r3, r6, #1\n\t"
  44706. "lsl r6, r6, %[n]\n\t"
  44707. "lsr r3, r3, r12\n\t"
  44708. "orr r4, r4, r3\n\t"
  44709. "ldr r5, [%[a], #104]\n\t"
  44710. "str r4, [%[r], #112]\n\t"
  44711. "lsr r3, r5, #1\n\t"
  44712. "lsl r5, r5, %[n]\n\t"
  44713. "lsr r3, r3, r12\n\t"
  44714. "orr r6, r6, r3\n\t"
  44715. "ldr r4, [%[a], #100]\n\t"
  44716. "str r6, [%[r], #108]\n\t"
  44717. "lsr r3, r4, #1\n\t"
  44718. "lsl r4, r4, %[n]\n\t"
  44719. "lsr r3, r3, r12\n\t"
  44720. "orr r5, r5, r3\n\t"
  44721. "ldr r6, [%[a], #96]\n\t"
  44722. "str r5, [%[r], #104]\n\t"
  44723. "lsr r3, r6, #1\n\t"
  44724. "lsl r6, r6, %[n]\n\t"
  44725. "lsr r3, r3, r12\n\t"
  44726. "orr r4, r4, r3\n\t"
  44727. "ldr r5, [%[a], #92]\n\t"
  44728. "str r4, [%[r], #100]\n\t"
  44729. "lsr r3, r5, #1\n\t"
  44730. "lsl r5, r5, %[n]\n\t"
  44731. "lsr r3, r3, r12\n\t"
  44732. "orr r6, r6, r3\n\t"
  44733. "ldr r4, [%[a], #88]\n\t"
  44734. "str r6, [%[r], #96]\n\t"
  44735. "lsr r3, r4, #1\n\t"
  44736. "lsl r4, r4, %[n]\n\t"
  44737. "lsr r3, r3, r12\n\t"
  44738. "orr r5, r5, r3\n\t"
  44739. "ldr r6, [%[a], #84]\n\t"
  44740. "str r5, [%[r], #92]\n\t"
  44741. "lsr r3, r6, #1\n\t"
  44742. "lsl r6, r6, %[n]\n\t"
  44743. "lsr r3, r3, r12\n\t"
  44744. "orr r4, r4, r3\n\t"
  44745. "ldr r5, [%[a], #80]\n\t"
  44746. "str r4, [%[r], #88]\n\t"
  44747. "lsr r3, r5, #1\n\t"
  44748. "lsl r5, r5, %[n]\n\t"
  44749. "lsr r3, r3, r12\n\t"
  44750. "orr r6, r6, r3\n\t"
  44751. "ldr r4, [%[a], #76]\n\t"
  44752. "str r6, [%[r], #84]\n\t"
  44753. "lsr r3, r4, #1\n\t"
  44754. "lsl r4, r4, %[n]\n\t"
  44755. "lsr r3, r3, r12\n\t"
  44756. "orr r5, r5, r3\n\t"
  44757. "ldr r6, [%[a], #72]\n\t"
  44758. "str r5, [%[r], #80]\n\t"
  44759. "lsr r3, r6, #1\n\t"
  44760. "lsl r6, r6, %[n]\n\t"
  44761. "lsr r3, r3, r12\n\t"
  44762. "orr r4, r4, r3\n\t"
  44763. "ldr r5, [%[a], #68]\n\t"
  44764. "str r4, [%[r], #76]\n\t"
  44765. "lsr r3, r5, #1\n\t"
  44766. "lsl r5, r5, %[n]\n\t"
  44767. "lsr r3, r3, r12\n\t"
  44768. "orr r6, r6, r3\n\t"
  44769. "ldr r4, [%[a], #64]\n\t"
  44770. "str r6, [%[r], #72]\n\t"
  44771. "lsr r3, r4, #1\n\t"
  44772. "lsl r4, r4, %[n]\n\t"
  44773. "lsr r3, r3, r12\n\t"
  44774. "orr r5, r5, r3\n\t"
  44775. "ldr r6, [%[a], #60]\n\t"
  44776. "str r5, [%[r], #68]\n\t"
  44777. "lsr r3, r6, #1\n\t"
  44778. "lsl r6, r6, %[n]\n\t"
  44779. "lsr r3, r3, r12\n\t"
  44780. "orr r4, r4, r3\n\t"
  44781. "ldr r5, [%[a], #56]\n\t"
  44782. "str r4, [%[r], #64]\n\t"
  44783. "lsr r3, r5, #1\n\t"
  44784. "lsl r5, r5, %[n]\n\t"
  44785. "lsr r3, r3, r12\n\t"
  44786. "orr r6, r6, r3\n\t"
  44787. "ldr r4, [%[a], #52]\n\t"
  44788. "str r6, [%[r], #60]\n\t"
  44789. "lsr r3, r4, #1\n\t"
  44790. "lsl r4, r4, %[n]\n\t"
  44791. "lsr r3, r3, r12\n\t"
  44792. "orr r5, r5, r3\n\t"
  44793. "ldr r6, [%[a], #48]\n\t"
  44794. "str r5, [%[r], #56]\n\t"
  44795. "lsr r3, r6, #1\n\t"
  44796. "lsl r6, r6, %[n]\n\t"
  44797. "lsr r3, r3, r12\n\t"
  44798. "orr r4, r4, r3\n\t"
  44799. "ldr r5, [%[a], #44]\n\t"
  44800. "str r4, [%[r], #52]\n\t"
  44801. "lsr r3, r5, #1\n\t"
  44802. "lsl r5, r5, %[n]\n\t"
  44803. "lsr r3, r3, r12\n\t"
  44804. "orr r6, r6, r3\n\t"
  44805. "ldr r4, [%[a], #40]\n\t"
  44806. "str r6, [%[r], #48]\n\t"
  44807. "lsr r3, r4, #1\n\t"
  44808. "lsl r4, r4, %[n]\n\t"
  44809. "lsr r3, r3, r12\n\t"
  44810. "orr r5, r5, r3\n\t"
  44811. "ldr r6, [%[a], #36]\n\t"
  44812. "str r5, [%[r], #44]\n\t"
  44813. "lsr r3, r6, #1\n\t"
  44814. "lsl r6, r6, %[n]\n\t"
  44815. "lsr r3, r3, r12\n\t"
  44816. "orr r4, r4, r3\n\t"
  44817. "ldr r5, [%[a], #32]\n\t"
  44818. "str r4, [%[r], #40]\n\t"
  44819. "lsr r3, r5, #1\n\t"
  44820. "lsl r5, r5, %[n]\n\t"
  44821. "lsr r3, r3, r12\n\t"
  44822. "orr r6, r6, r3\n\t"
  44823. "ldr r4, [%[a], #28]\n\t"
  44824. "str r6, [%[r], #36]\n\t"
  44825. "lsr r3, r4, #1\n\t"
  44826. "lsl r4, r4, %[n]\n\t"
  44827. "lsr r3, r3, r12\n\t"
  44828. "orr r5, r5, r3\n\t"
  44829. "ldr r6, [%[a], #24]\n\t"
  44830. "str r5, [%[r], #32]\n\t"
  44831. "lsr r3, r6, #1\n\t"
  44832. "lsl r6, r6, %[n]\n\t"
  44833. "lsr r3, r3, r12\n\t"
  44834. "orr r4, r4, r3\n\t"
  44835. "ldr r5, [%[a], #20]\n\t"
  44836. "str r4, [%[r], #28]\n\t"
  44837. "lsr r3, r5, #1\n\t"
  44838. "lsl r5, r5, %[n]\n\t"
  44839. "lsr r3, r3, r12\n\t"
  44840. "orr r6, r6, r3\n\t"
  44841. "ldr r4, [%[a], #16]\n\t"
  44842. "str r6, [%[r], #24]\n\t"
  44843. "lsr r3, r4, #1\n\t"
  44844. "lsl r4, r4, %[n]\n\t"
  44845. "lsr r3, r3, r12\n\t"
  44846. "orr r5, r5, r3\n\t"
  44847. "ldr r6, [%[a], #12]\n\t"
  44848. "str r5, [%[r], #20]\n\t"
  44849. "lsr r3, r6, #1\n\t"
  44850. "lsl r6, r6, %[n]\n\t"
  44851. "lsr r3, r3, r12\n\t"
  44852. "orr r4, r4, r3\n\t"
  44853. "ldr r5, [%[a], #8]\n\t"
  44854. "str r4, [%[r], #16]\n\t"
  44855. "lsr r3, r5, #1\n\t"
  44856. "lsl r5, r5, %[n]\n\t"
  44857. "lsr r3, r3, r12\n\t"
  44858. "orr r6, r6, r3\n\t"
  44859. "ldr r4, [%[a], #4]\n\t"
  44860. "str r6, [%[r], #12]\n\t"
  44861. "lsr r3, r4, #1\n\t"
  44862. "lsl r4, r4, %[n]\n\t"
  44863. "lsr r3, r3, r12\n\t"
  44864. "orr r5, r5, r3\n\t"
  44865. "ldr r6, [%[a]]\n\t"
  44866. "str r5, [%[r], #8]\n\t"
  44867. "lsr r3, r6, #1\n\t"
  44868. "lsl r6, r6, %[n]\n\t"
  44869. "lsr r3, r3, r12\n\t"
  44870. "orr r4, r4, r3\n\t"
  44871. "str r6, [%[r]]\n\t"
  44872. "str r4, [%[r], #4]\n\t"
  44873. : [r] "+r" (r), [a] "+r" (a), [n] "+r" (n)
  44874. :
  44875. : "memory", "r4", "r5", "r6", "r3", "r12", "cc"
  44876. );
  44877. }
  44878. /* Modular exponentiate 2 to the e mod m. (r = 2^e mod m)
  44879. *
  44880. * r A single precision number that is the result of the operation.
  44881. * e A single precision number that is the exponent.
  44882. * bits The number of bits in the exponent.
  44883. * m A single precision number that is the modulus.
  44884. * returns 0 on success.
  44885. * returns MEMORY_E on dynamic memory allocation failure.
  44886. * returns MP_VAL when base is even.
  44887. */
  44888. static int sp_3072_mod_exp_2_96(sp_digit* r, const sp_digit* e, int bits,
  44889. const sp_digit* m)
  44890. {
  44891. #ifdef WOLFSSL_SP_SMALL_STACK
  44892. sp_digit* td = NULL;
  44893. #else
  44894. sp_digit td[289];
  44895. #endif
  44896. sp_digit* norm = NULL;
  44897. sp_digit* tmp = NULL;
  44898. sp_digit mp = 1;
  44899. sp_digit n;
  44900. sp_digit o;
  44901. sp_digit mask;
  44902. int i;
  44903. int c;
  44904. byte y;
  44905. int err = MP_OKAY;
  44906. if (bits == 0) {
  44907. err = MP_VAL;
  44908. }
  44909. #ifdef WOLFSSL_SP_SMALL_STACK
  44910. if (err == MP_OKAY) {
  44911. td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 289, NULL,
  44912. DYNAMIC_TYPE_TMP_BUFFER);
  44913. if (td == NULL)
  44914. err = MEMORY_E;
  44915. }
  44916. #endif
  44917. if (err == MP_OKAY) {
  44918. norm = td;
  44919. tmp = td + 192;
  44920. sp_3072_mont_setup(m, &mp);
  44921. sp_3072_mont_norm_96(norm, m);
  44922. i = (bits - 1) / 32;
  44923. n = e[i--];
  44924. c = bits & 31;
  44925. if (c == 0) {
  44926. c = 32;
  44927. }
  44928. c -= bits % 5;
  44929. if (c == 32) {
  44930. c = 27;
  44931. }
  44932. if (c < 0) {
  44933. /* Number of bits in top word is less than number needed. */
  44934. c = -c;
  44935. y = (byte)(n << c);
  44936. n = e[i--];
  44937. y |= (byte)(n >> (64 - c));
  44938. n <<= c;
  44939. c = 64 - c;
  44940. }
  44941. else if (c == 0) {
  44942. /* All bits in top word used. */
  44943. y = (byte)n;
  44944. }
  44945. else {
  44946. y = (byte)(n >> c);
  44947. n <<= 32 - c;
  44948. }
  44949. sp_3072_lshift_96(r, norm, y);
  44950. for (; i>=0 || c>=5; ) {
  44951. if (c == 0) {
  44952. n = e[i--];
  44953. y = (byte)(n >> 27);
  44954. n <<= 5;
  44955. c = 27;
  44956. }
  44957. else if (c < 5) {
  44958. y = (byte)(n >> 27);
  44959. n = e[i--];
  44960. c = 5 - c;
  44961. y |= (byte)(n >> (32 - c));
  44962. n <<= c;
  44963. c = 32 - c;
  44964. }
  44965. else {
  44966. y = (byte)((n >> 27) & 0x1f);
  44967. n <<= 5;
  44968. c -= 5;
  44969. }
  44970. sp_3072_mont_sqr_96(r, r, m, mp);
  44971. sp_3072_mont_sqr_96(r, r, m, mp);
  44972. sp_3072_mont_sqr_96(r, r, m, mp);
  44973. sp_3072_mont_sqr_96(r, r, m, mp);
  44974. sp_3072_mont_sqr_96(r, r, m, mp);
  44975. sp_3072_lshift_96(r, r, y);
  44976. sp_3072_mul_d_96(tmp, norm, r[96]);
  44977. r[96] = 0;
  44978. o = sp_3072_add_96(r, r, tmp);
  44979. sp_3072_cond_sub_96(r, r, m, (sp_digit)0 - o);
  44980. }
  44981. XMEMSET(&r[96], 0, sizeof(sp_digit) * 96U);
  44982. sp_3072_mont_reduce_96(r, m, mp);
  44983. mask = 0 - (sp_3072_cmp_96(r, m) >= 0);
  44984. sp_3072_cond_sub_96(r, r, m, mask);
  44985. }
  44986. #ifdef WOLFSSL_SP_SMALL_STACK
  44987. if (td != NULL)
  44988. XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  44989. #endif
  44990. return err;
  44991. }
  44992. #endif /* HAVE_FFDHE_3072 */
  44993. /* Perform the modular exponentiation for Diffie-Hellman.
  44994. *
  44995. * base Base.
  44996. * exp Array of bytes that is the exponent.
  44997. * expLen Length of data, in bytes, in exponent.
  44998. * mod Modulus.
  44999. * out Buffer to hold big-endian bytes of exponentiation result.
  45000. * Must be at least 384 bytes long.
  45001. * outLen Length, in bytes, of exponentiation result.
  45002. * returns 0 on success, MP_READ_E if there are too many bytes in an array
  45003. * and MEMORY_E if memory allocation fails.
  45004. */
  45005. int sp_DhExp_3072(const mp_int* base, const byte* exp, word32 expLen,
  45006. const mp_int* mod, byte* out, word32* outLen)
  45007. {
  45008. int err = MP_OKAY;
  45009. sp_digit b[192];
  45010. sp_digit e[96];
  45011. sp_digit m[96];
  45012. sp_digit* r = b;
  45013. word32 i;
  45014. if (mp_count_bits(base) > 3072) {
  45015. err = MP_READ_E;
  45016. }
  45017. else if (expLen > 384) {
  45018. err = MP_READ_E;
  45019. }
  45020. else if (mp_count_bits(mod) != 3072) {
  45021. err = MP_READ_E;
  45022. }
  45023. else if (mp_iseven(mod)) {
  45024. err = MP_VAL;
  45025. }
  45026. if (err == MP_OKAY) {
  45027. sp_3072_from_mp(b, 96, base);
  45028. sp_3072_from_bin(e, 96, exp, expLen);
  45029. sp_3072_from_mp(m, 96, mod);
  45030. #ifdef HAVE_FFDHE_3072
  45031. if (base->used == 1 && base->dp[0] == 2 && m[95] == (sp_digit)-1)
  45032. err = sp_3072_mod_exp_2_96(r, e, expLen * 8, m);
  45033. else
  45034. #endif
  45035. err = sp_3072_mod_exp_96(r, b, e, expLen * 8, m, 0);
  45036. }
  45037. if (err == MP_OKAY) {
  45038. sp_3072_to_bin_96(r, out);
  45039. *outLen = 384;
  45040. for (i=0; i<384 && out[i] == 0; i++) {
  45041. /* Search for first non-zero. */
  45042. }
  45043. *outLen -= i;
  45044. XMEMMOVE(out, out + i, *outLen);
  45045. }
  45046. XMEMSET(e, 0, sizeof(e));
  45047. return err;
  45048. }
  45049. #endif /* WOLFSSL_HAVE_SP_DH */
  45050. /* Perform the modular exponentiation for Diffie-Hellman.
  45051. *
  45052. * base Base. MP integer.
  45053. * exp Exponent. MP integer.
  45054. * mod Modulus. MP integer.
  45055. * res Result. MP integer.
  45056. * returns 0 on success, MP_READ_E if there are too many bytes in an array
  45057. * and MEMORY_E if memory allocation fails.
  45058. */
  45059. int sp_ModExp_1536(const mp_int* base, const mp_int* exp, const mp_int* mod,
  45060. mp_int* res)
  45061. {
  45062. int err = MP_OKAY;
  45063. sp_digit b[96];
  45064. sp_digit e[48];
  45065. sp_digit m[48];
  45066. sp_digit* r = b;
  45067. int expBits = mp_count_bits(exp);
  45068. if (mp_count_bits(base) > 1536) {
  45069. err = MP_READ_E;
  45070. }
  45071. else if (expBits > 1536) {
  45072. err = MP_READ_E;
  45073. }
  45074. else if (mp_count_bits(mod) != 1536) {
  45075. err = MP_READ_E;
  45076. }
  45077. else if (mp_iseven(mod)) {
  45078. err = MP_VAL;
  45079. }
  45080. if (err == MP_OKAY) {
  45081. sp_3072_from_mp(b, 48, base);
  45082. sp_3072_from_mp(e, 48, exp);
  45083. sp_3072_from_mp(m, 48, mod);
  45084. err = sp_3072_mod_exp_48(r, b, e, expBits, m, 0);
  45085. }
  45086. if (err == MP_OKAY) {
  45087. XMEMSET(r + 48, 0, sizeof(*r) * 48U);
  45088. err = sp_3072_to_mp(r, res);
  45089. res->used = mod->used;
  45090. mp_clamp(res);
  45091. }
  45092. XMEMSET(e, 0, sizeof(e));
  45093. return err;
  45094. }
  45095. #endif /* WOLFSSL_HAVE_SP_DH | (WOLFSSL_HAVE_SP_RSA & !WOLFSSL_RSA_PUBLIC_ONLY) */
  45096. #endif /* !WOLFSSL_SP_NO_3072 */
  45097. #ifdef WOLFSSL_SP_4096
  45098. /* Read big endian unsigned byte array into r.
  45099. *
  45100. * r A single precision integer.
  45101. * size Maximum number of bytes to convert
  45102. * a Byte array.
  45103. * n Number of bytes in array to read.
  45104. */
  45105. static void sp_4096_from_bin(sp_digit* r, int size, const byte* a, int n)
  45106. {
  45107. int i;
  45108. int j;
  45109. byte* d;
  45110. for (i = n - 1,j = 0; i >= 3; i -= 4) {
  45111. r[j] = ((sp_digit)a[i - 0] << 0) |
  45112. ((sp_digit)a[i - 1] << 8) |
  45113. ((sp_digit)a[i - 2] << 16) |
  45114. ((sp_digit)a[i - 3] << 24);
  45115. j++;
  45116. }
  45117. if (i >= 0) {
  45118. r[j] = 0;
  45119. d = (byte*)r;
  45120. switch (i) {
  45121. case 2: d[n - 1 - 2] = a[2]; //fallthrough
  45122. case 1: d[n - 1 - 1] = a[1]; //fallthrough
  45123. case 0: d[n - 1 - 0] = a[0]; //fallthrough
  45124. }
  45125. j++;
  45126. }
  45127. for (; j < size; j++) {
  45128. r[j] = 0;
  45129. }
  45130. }
  45131. /* Convert an mp_int to an array of sp_digit.
  45132. *
  45133. * r A single precision integer.
  45134. * size Maximum number of bytes to convert
  45135. * a A multi-precision integer.
  45136. */
  45137. static void sp_4096_from_mp(sp_digit* r, int size, const mp_int* a)
  45138. {
  45139. #if DIGIT_BIT == 32
  45140. int i;
  45141. sp_digit j = (sp_digit)0 - (sp_digit)a->used;
  45142. int o = 0;
  45143. for (i = 0; i < size; i++) {
  45144. sp_digit mask = (sp_digit)0 - (j >> 31);
  45145. r[i] = a->dp[o] & mask;
  45146. j++;
  45147. o += (int)(j >> 31);
  45148. }
  45149. #elif DIGIT_BIT > 32
  45150. unsigned int i;
  45151. int j = 0;
  45152. word32 s = 0;
  45153. r[0] = 0;
  45154. for (i = 0; i < (unsigned int)a->used && j < size; i++) {
  45155. r[j] |= ((sp_digit)a->dp[i] << s);
  45156. r[j] &= 0xffffffff;
  45157. s = 32U - s;
  45158. if (j + 1 >= size) {
  45159. break;
  45160. }
  45161. /* lint allow cast of mismatch word32 and mp_digit */
  45162. r[++j] = (sp_digit)(a->dp[i] >> s); /*lint !e9033*/
  45163. while ((s + 32U) <= (word32)DIGIT_BIT) {
  45164. s += 32U;
  45165. r[j] &= 0xffffffff;
  45166. if (j + 1 >= size) {
  45167. break;
  45168. }
  45169. if (s < (word32)DIGIT_BIT) {
  45170. /* lint allow cast of mismatch word32 and mp_digit */
  45171. r[++j] = (sp_digit)(a->dp[i] >> s); /*lint !e9033*/
  45172. }
  45173. else {
  45174. r[++j] = (sp_digit)0;
  45175. }
  45176. }
  45177. s = (word32)DIGIT_BIT - s;
  45178. }
  45179. for (j++; j < size; j++) {
  45180. r[j] = 0;
  45181. }
  45182. #else
  45183. unsigned int i;
  45184. int j = 0;
  45185. int s = 0;
  45186. r[0] = 0;
  45187. for (i = 0; i < (unsigned int)a->used && j < size; i++) {
  45188. r[j] |= ((sp_digit)a->dp[i]) << s;
  45189. if (s + DIGIT_BIT >= 32) {
  45190. r[j] &= 0xffffffff;
  45191. if (j + 1 >= size) {
  45192. break;
  45193. }
  45194. s = 32 - s;
  45195. if (s == DIGIT_BIT) {
  45196. r[++j] = 0;
  45197. s = 0;
  45198. }
  45199. else {
  45200. r[++j] = a->dp[i] >> s;
  45201. s = DIGIT_BIT - s;
  45202. }
  45203. }
  45204. else {
  45205. s += DIGIT_BIT;
  45206. }
  45207. }
  45208. for (j++; j < size; j++) {
  45209. r[j] = 0;
  45210. }
  45211. #endif
  45212. }
  45213. /* Write r as big endian to byte array.
  45214. * Fixed length number of bytes written: 512
  45215. *
  45216. * r A single precision integer.
  45217. * a Byte array.
  45218. */
  45219. static void sp_4096_to_bin_128(sp_digit* r, byte* a)
  45220. {
  45221. int i;
  45222. int j = 0;
  45223. for (i = 127; i >= 0; i--) {
  45224. a[j++] = r[i] >> 24;
  45225. a[j++] = r[i] >> 16;
  45226. a[j++] = r[i] >> 8;
  45227. a[j++] = r[i] >> 0;
  45228. }
  45229. }
  45230. #if (defined(WOLFSSL_HAVE_SP_RSA) && (!defined(WOLFSSL_RSA_PUBLIC_ONLY) || !defined(WOLFSSL_SP_SMALL))) || defined(WOLFSSL_HAVE_SP_DH)
  45231. /* Normalize the values in each word to 32.
  45232. *
  45233. * a Array of sp_digit to normalize.
  45234. */
  45235. #define sp_4096_norm_128(a)
  45236. #endif /* (WOLFSSL_HAVE_SP_RSA && (!WOLFSSL_RSA_PUBLIC_ONLY || !WOLFSSL_SP_SMALL)) || WOLFSSL_HAVE_SP_DH */
  45237. /* Normalize the values in each word to 32.
  45238. *
  45239. * a Array of sp_digit to normalize.
  45240. */
  45241. #define sp_4096_norm_128(a)
  45242. #ifndef WOLFSSL_SP_SMALL
  45243. /* Sub b from a into a. (a -= b)
  45244. *
  45245. * a A single precision integer and result.
  45246. * b A single precision integer.
  45247. */
  45248. static sp_digit sp_4096_sub_in_place_128(sp_digit* a_p, const sp_digit* b_p)
  45249. {
  45250. register sp_digit* a asm ("r0") = (sp_digit*)a_p;
  45251. register const sp_digit* b asm ("r1") = (const sp_digit*)b_p;
  45252. __asm__ __volatile__ (
  45253. "ldm %[a], {r2, r3, r4, r5}\n\t"
  45254. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  45255. "subs r2, r2, r6\n\t"
  45256. "sbcs r3, r3, r7\n\t"
  45257. "sbcs r4, r4, r8\n\t"
  45258. "sbcs r5, r5, r9\n\t"
  45259. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  45260. "ldm %[a], {r2, r3, r4, r5}\n\t"
  45261. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  45262. "sbcs r2, r2, r6\n\t"
  45263. "sbcs r3, r3, r7\n\t"
  45264. "sbcs r4, r4, r8\n\t"
  45265. "sbcs r5, r5, r9\n\t"
  45266. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  45267. "ldm %[a], {r2, r3, r4, r5}\n\t"
  45268. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  45269. "sbcs r2, r2, r6\n\t"
  45270. "sbcs r3, r3, r7\n\t"
  45271. "sbcs r4, r4, r8\n\t"
  45272. "sbcs r5, r5, r9\n\t"
  45273. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  45274. "ldm %[a], {r2, r3, r4, r5}\n\t"
  45275. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  45276. "sbcs r2, r2, r6\n\t"
  45277. "sbcs r3, r3, r7\n\t"
  45278. "sbcs r4, r4, r8\n\t"
  45279. "sbcs r5, r5, r9\n\t"
  45280. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  45281. "ldm %[a], {r2, r3, r4, r5}\n\t"
  45282. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  45283. "sbcs r2, r2, r6\n\t"
  45284. "sbcs r3, r3, r7\n\t"
  45285. "sbcs r4, r4, r8\n\t"
  45286. "sbcs r5, r5, r9\n\t"
  45287. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  45288. "ldm %[a], {r2, r3, r4, r5}\n\t"
  45289. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  45290. "sbcs r2, r2, r6\n\t"
  45291. "sbcs r3, r3, r7\n\t"
  45292. "sbcs r4, r4, r8\n\t"
  45293. "sbcs r5, r5, r9\n\t"
  45294. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  45295. "ldm %[a], {r2, r3, r4, r5}\n\t"
  45296. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  45297. "sbcs r2, r2, r6\n\t"
  45298. "sbcs r3, r3, r7\n\t"
  45299. "sbcs r4, r4, r8\n\t"
  45300. "sbcs r5, r5, r9\n\t"
  45301. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  45302. "ldm %[a], {r2, r3, r4, r5}\n\t"
  45303. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  45304. "sbcs r2, r2, r6\n\t"
  45305. "sbcs r3, r3, r7\n\t"
  45306. "sbcs r4, r4, r8\n\t"
  45307. "sbcs r5, r5, r9\n\t"
  45308. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  45309. "ldm %[a], {r2, r3, r4, r5}\n\t"
  45310. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  45311. "sbcs r2, r2, r6\n\t"
  45312. "sbcs r3, r3, r7\n\t"
  45313. "sbcs r4, r4, r8\n\t"
  45314. "sbcs r5, r5, r9\n\t"
  45315. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  45316. "ldm %[a], {r2, r3, r4, r5}\n\t"
  45317. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  45318. "sbcs r2, r2, r6\n\t"
  45319. "sbcs r3, r3, r7\n\t"
  45320. "sbcs r4, r4, r8\n\t"
  45321. "sbcs r5, r5, r9\n\t"
  45322. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  45323. "ldm %[a], {r2, r3, r4, r5}\n\t"
  45324. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  45325. "sbcs r2, r2, r6\n\t"
  45326. "sbcs r3, r3, r7\n\t"
  45327. "sbcs r4, r4, r8\n\t"
  45328. "sbcs r5, r5, r9\n\t"
  45329. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  45330. "ldm %[a], {r2, r3, r4, r5}\n\t"
  45331. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  45332. "sbcs r2, r2, r6\n\t"
  45333. "sbcs r3, r3, r7\n\t"
  45334. "sbcs r4, r4, r8\n\t"
  45335. "sbcs r5, r5, r9\n\t"
  45336. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  45337. "ldm %[a], {r2, r3, r4, r5}\n\t"
  45338. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  45339. "sbcs r2, r2, r6\n\t"
  45340. "sbcs r3, r3, r7\n\t"
  45341. "sbcs r4, r4, r8\n\t"
  45342. "sbcs r5, r5, r9\n\t"
  45343. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  45344. "ldm %[a], {r2, r3, r4, r5}\n\t"
  45345. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  45346. "sbcs r2, r2, r6\n\t"
  45347. "sbcs r3, r3, r7\n\t"
  45348. "sbcs r4, r4, r8\n\t"
  45349. "sbcs r5, r5, r9\n\t"
  45350. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  45351. "ldm %[a], {r2, r3, r4, r5}\n\t"
  45352. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  45353. "sbcs r2, r2, r6\n\t"
  45354. "sbcs r3, r3, r7\n\t"
  45355. "sbcs r4, r4, r8\n\t"
  45356. "sbcs r5, r5, r9\n\t"
  45357. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  45358. "ldm %[a], {r2, r3, r4, r5}\n\t"
  45359. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  45360. "sbcs r2, r2, r6\n\t"
  45361. "sbcs r3, r3, r7\n\t"
  45362. "sbcs r4, r4, r8\n\t"
  45363. "sbcs r5, r5, r9\n\t"
  45364. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  45365. "ldm %[a], {r2, r3, r4, r5}\n\t"
  45366. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  45367. "sbcs r2, r2, r6\n\t"
  45368. "sbcs r3, r3, r7\n\t"
  45369. "sbcs r4, r4, r8\n\t"
  45370. "sbcs r5, r5, r9\n\t"
  45371. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  45372. "ldm %[a], {r2, r3, r4, r5}\n\t"
  45373. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  45374. "sbcs r2, r2, r6\n\t"
  45375. "sbcs r3, r3, r7\n\t"
  45376. "sbcs r4, r4, r8\n\t"
  45377. "sbcs r5, r5, r9\n\t"
  45378. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  45379. "ldm %[a], {r2, r3, r4, r5}\n\t"
  45380. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  45381. "sbcs r2, r2, r6\n\t"
  45382. "sbcs r3, r3, r7\n\t"
  45383. "sbcs r4, r4, r8\n\t"
  45384. "sbcs r5, r5, r9\n\t"
  45385. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  45386. "ldm %[a], {r2, r3, r4, r5}\n\t"
  45387. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  45388. "sbcs r2, r2, r6\n\t"
  45389. "sbcs r3, r3, r7\n\t"
  45390. "sbcs r4, r4, r8\n\t"
  45391. "sbcs r5, r5, r9\n\t"
  45392. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  45393. "ldm %[a], {r2, r3, r4, r5}\n\t"
  45394. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  45395. "sbcs r2, r2, r6\n\t"
  45396. "sbcs r3, r3, r7\n\t"
  45397. "sbcs r4, r4, r8\n\t"
  45398. "sbcs r5, r5, r9\n\t"
  45399. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  45400. "ldm %[a], {r2, r3, r4, r5}\n\t"
  45401. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  45402. "sbcs r2, r2, r6\n\t"
  45403. "sbcs r3, r3, r7\n\t"
  45404. "sbcs r4, r4, r8\n\t"
  45405. "sbcs r5, r5, r9\n\t"
  45406. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  45407. "ldm %[a], {r2, r3, r4, r5}\n\t"
  45408. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  45409. "sbcs r2, r2, r6\n\t"
  45410. "sbcs r3, r3, r7\n\t"
  45411. "sbcs r4, r4, r8\n\t"
  45412. "sbcs r5, r5, r9\n\t"
  45413. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  45414. "ldm %[a], {r2, r3, r4, r5}\n\t"
  45415. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  45416. "sbcs r2, r2, r6\n\t"
  45417. "sbcs r3, r3, r7\n\t"
  45418. "sbcs r4, r4, r8\n\t"
  45419. "sbcs r5, r5, r9\n\t"
  45420. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  45421. "ldm %[a], {r2, r3, r4, r5}\n\t"
  45422. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  45423. "sbcs r2, r2, r6\n\t"
  45424. "sbcs r3, r3, r7\n\t"
  45425. "sbcs r4, r4, r8\n\t"
  45426. "sbcs r5, r5, r9\n\t"
  45427. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  45428. "ldm %[a], {r2, r3, r4, r5}\n\t"
  45429. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  45430. "sbcs r2, r2, r6\n\t"
  45431. "sbcs r3, r3, r7\n\t"
  45432. "sbcs r4, r4, r8\n\t"
  45433. "sbcs r5, r5, r9\n\t"
  45434. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  45435. "ldm %[a], {r2, r3, r4, r5}\n\t"
  45436. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  45437. "sbcs r2, r2, r6\n\t"
  45438. "sbcs r3, r3, r7\n\t"
  45439. "sbcs r4, r4, r8\n\t"
  45440. "sbcs r5, r5, r9\n\t"
  45441. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  45442. "ldm %[a], {r2, r3, r4, r5}\n\t"
  45443. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  45444. "sbcs r2, r2, r6\n\t"
  45445. "sbcs r3, r3, r7\n\t"
  45446. "sbcs r4, r4, r8\n\t"
  45447. "sbcs r5, r5, r9\n\t"
  45448. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  45449. "ldm %[a], {r2, r3, r4, r5}\n\t"
  45450. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  45451. "sbcs r2, r2, r6\n\t"
  45452. "sbcs r3, r3, r7\n\t"
  45453. "sbcs r4, r4, r8\n\t"
  45454. "sbcs r5, r5, r9\n\t"
  45455. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  45456. "ldm %[a], {r2, r3, r4, r5}\n\t"
  45457. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  45458. "sbcs r2, r2, r6\n\t"
  45459. "sbcs r3, r3, r7\n\t"
  45460. "sbcs r4, r4, r8\n\t"
  45461. "sbcs r5, r5, r9\n\t"
  45462. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  45463. "ldm %[a], {r2, r3, r4, r5}\n\t"
  45464. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  45465. "sbcs r2, r2, r6\n\t"
  45466. "sbcs r3, r3, r7\n\t"
  45467. "sbcs r4, r4, r8\n\t"
  45468. "sbcs r5, r5, r9\n\t"
  45469. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  45470. "ldm %[a], {r2, r3, r4, r5}\n\t"
  45471. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  45472. "sbcs r2, r2, r6\n\t"
  45473. "sbcs r3, r3, r7\n\t"
  45474. "sbcs r4, r4, r8\n\t"
  45475. "sbcs r5, r5, r9\n\t"
  45476. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  45477. "sbc %[a], r9, r9\n\t"
  45478. : [a] "+r" (a), [b] "+r" (b)
  45479. :
  45480. : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "cc"
  45481. );
  45482. return (uint32_t)(size_t)a;
  45483. }
  45484. /* Add b to a into r. (r = a + b)
  45485. *
  45486. * r A single precision integer.
  45487. * a A single precision integer.
  45488. * b A single precision integer.
  45489. */
  45490. static sp_digit sp_4096_add_128(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p)
  45491. {
  45492. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  45493. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  45494. register const sp_digit* b asm ("r2") = (const sp_digit*)b_p;
  45495. __asm__ __volatile__ (
  45496. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  45497. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  45498. "adds r3, r3, r7\n\t"
  45499. "adcs r4, r4, r8\n\t"
  45500. "adcs r5, r5, r9\n\t"
  45501. "adcs r6, r6, r10\n\t"
  45502. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  45503. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  45504. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  45505. "adcs r3, r3, r7\n\t"
  45506. "adcs r4, r4, r8\n\t"
  45507. "adcs r5, r5, r9\n\t"
  45508. "adcs r6, r6, r10\n\t"
  45509. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  45510. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  45511. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  45512. "adcs r3, r3, r7\n\t"
  45513. "adcs r4, r4, r8\n\t"
  45514. "adcs r5, r5, r9\n\t"
  45515. "adcs r6, r6, r10\n\t"
  45516. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  45517. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  45518. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  45519. "adcs r3, r3, r7\n\t"
  45520. "adcs r4, r4, r8\n\t"
  45521. "adcs r5, r5, r9\n\t"
  45522. "adcs r6, r6, r10\n\t"
  45523. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  45524. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  45525. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  45526. "adcs r3, r3, r7\n\t"
  45527. "adcs r4, r4, r8\n\t"
  45528. "adcs r5, r5, r9\n\t"
  45529. "adcs r6, r6, r10\n\t"
  45530. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  45531. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  45532. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  45533. "adcs r3, r3, r7\n\t"
  45534. "adcs r4, r4, r8\n\t"
  45535. "adcs r5, r5, r9\n\t"
  45536. "adcs r6, r6, r10\n\t"
  45537. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  45538. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  45539. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  45540. "adcs r3, r3, r7\n\t"
  45541. "adcs r4, r4, r8\n\t"
  45542. "adcs r5, r5, r9\n\t"
  45543. "adcs r6, r6, r10\n\t"
  45544. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  45545. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  45546. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  45547. "adcs r3, r3, r7\n\t"
  45548. "adcs r4, r4, r8\n\t"
  45549. "adcs r5, r5, r9\n\t"
  45550. "adcs r6, r6, r10\n\t"
  45551. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  45552. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  45553. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  45554. "adcs r3, r3, r7\n\t"
  45555. "adcs r4, r4, r8\n\t"
  45556. "adcs r5, r5, r9\n\t"
  45557. "adcs r6, r6, r10\n\t"
  45558. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  45559. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  45560. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  45561. "adcs r3, r3, r7\n\t"
  45562. "adcs r4, r4, r8\n\t"
  45563. "adcs r5, r5, r9\n\t"
  45564. "adcs r6, r6, r10\n\t"
  45565. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  45566. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  45567. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  45568. "adcs r3, r3, r7\n\t"
  45569. "adcs r4, r4, r8\n\t"
  45570. "adcs r5, r5, r9\n\t"
  45571. "adcs r6, r6, r10\n\t"
  45572. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  45573. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  45574. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  45575. "adcs r3, r3, r7\n\t"
  45576. "adcs r4, r4, r8\n\t"
  45577. "adcs r5, r5, r9\n\t"
  45578. "adcs r6, r6, r10\n\t"
  45579. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  45580. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  45581. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  45582. "adcs r3, r3, r7\n\t"
  45583. "adcs r4, r4, r8\n\t"
  45584. "adcs r5, r5, r9\n\t"
  45585. "adcs r6, r6, r10\n\t"
  45586. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  45587. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  45588. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  45589. "adcs r3, r3, r7\n\t"
  45590. "adcs r4, r4, r8\n\t"
  45591. "adcs r5, r5, r9\n\t"
  45592. "adcs r6, r6, r10\n\t"
  45593. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  45594. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  45595. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  45596. "adcs r3, r3, r7\n\t"
  45597. "adcs r4, r4, r8\n\t"
  45598. "adcs r5, r5, r9\n\t"
  45599. "adcs r6, r6, r10\n\t"
  45600. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  45601. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  45602. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  45603. "adcs r3, r3, r7\n\t"
  45604. "adcs r4, r4, r8\n\t"
  45605. "adcs r5, r5, r9\n\t"
  45606. "adcs r6, r6, r10\n\t"
  45607. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  45608. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  45609. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  45610. "adcs r3, r3, r7\n\t"
  45611. "adcs r4, r4, r8\n\t"
  45612. "adcs r5, r5, r9\n\t"
  45613. "adcs r6, r6, r10\n\t"
  45614. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  45615. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  45616. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  45617. "adcs r3, r3, r7\n\t"
  45618. "adcs r4, r4, r8\n\t"
  45619. "adcs r5, r5, r9\n\t"
  45620. "adcs r6, r6, r10\n\t"
  45621. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  45622. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  45623. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  45624. "adcs r3, r3, r7\n\t"
  45625. "adcs r4, r4, r8\n\t"
  45626. "adcs r5, r5, r9\n\t"
  45627. "adcs r6, r6, r10\n\t"
  45628. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  45629. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  45630. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  45631. "adcs r3, r3, r7\n\t"
  45632. "adcs r4, r4, r8\n\t"
  45633. "adcs r5, r5, r9\n\t"
  45634. "adcs r6, r6, r10\n\t"
  45635. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  45636. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  45637. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  45638. "adcs r3, r3, r7\n\t"
  45639. "adcs r4, r4, r8\n\t"
  45640. "adcs r5, r5, r9\n\t"
  45641. "adcs r6, r6, r10\n\t"
  45642. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  45643. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  45644. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  45645. "adcs r3, r3, r7\n\t"
  45646. "adcs r4, r4, r8\n\t"
  45647. "adcs r5, r5, r9\n\t"
  45648. "adcs r6, r6, r10\n\t"
  45649. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  45650. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  45651. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  45652. "adcs r3, r3, r7\n\t"
  45653. "adcs r4, r4, r8\n\t"
  45654. "adcs r5, r5, r9\n\t"
  45655. "adcs r6, r6, r10\n\t"
  45656. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  45657. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  45658. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  45659. "adcs r3, r3, r7\n\t"
  45660. "adcs r4, r4, r8\n\t"
  45661. "adcs r5, r5, r9\n\t"
  45662. "adcs r6, r6, r10\n\t"
  45663. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  45664. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  45665. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  45666. "adcs r3, r3, r7\n\t"
  45667. "adcs r4, r4, r8\n\t"
  45668. "adcs r5, r5, r9\n\t"
  45669. "adcs r6, r6, r10\n\t"
  45670. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  45671. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  45672. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  45673. "adcs r3, r3, r7\n\t"
  45674. "adcs r4, r4, r8\n\t"
  45675. "adcs r5, r5, r9\n\t"
  45676. "adcs r6, r6, r10\n\t"
  45677. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  45678. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  45679. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  45680. "adcs r3, r3, r7\n\t"
  45681. "adcs r4, r4, r8\n\t"
  45682. "adcs r5, r5, r9\n\t"
  45683. "adcs r6, r6, r10\n\t"
  45684. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  45685. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  45686. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  45687. "adcs r3, r3, r7\n\t"
  45688. "adcs r4, r4, r8\n\t"
  45689. "adcs r5, r5, r9\n\t"
  45690. "adcs r6, r6, r10\n\t"
  45691. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  45692. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  45693. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  45694. "adcs r3, r3, r7\n\t"
  45695. "adcs r4, r4, r8\n\t"
  45696. "adcs r5, r5, r9\n\t"
  45697. "adcs r6, r6, r10\n\t"
  45698. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  45699. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  45700. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  45701. "adcs r3, r3, r7\n\t"
  45702. "adcs r4, r4, r8\n\t"
  45703. "adcs r5, r5, r9\n\t"
  45704. "adcs r6, r6, r10\n\t"
  45705. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  45706. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  45707. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  45708. "adcs r3, r3, r7\n\t"
  45709. "adcs r4, r4, r8\n\t"
  45710. "adcs r5, r5, r9\n\t"
  45711. "adcs r6, r6, r10\n\t"
  45712. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  45713. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  45714. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  45715. "adcs r3, r3, r7\n\t"
  45716. "adcs r4, r4, r8\n\t"
  45717. "adcs r5, r5, r9\n\t"
  45718. "adcs r6, r6, r10\n\t"
  45719. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  45720. "mov %[r], #0\n\t"
  45721. "adc %[r], %[r], #0\n\t"
  45722. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  45723. :
  45724. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "cc"
  45725. );
  45726. return (uint32_t)(size_t)r;
  45727. }
  45728. /* Multiply a and b into r. (r = a * b)
  45729. *
  45730. * r A single precision integer.
  45731. * a A single precision integer.
  45732. * b A single precision integer.
  45733. */
  45734. SP_NOINLINE static void sp_4096_mul_128(sp_digit* r, const sp_digit* a,
  45735. const sp_digit* b)
  45736. {
  45737. sp_digit* z0 = r;
  45738. sp_digit z1[128];
  45739. sp_digit a1[64];
  45740. sp_digit b1[64];
  45741. sp_digit* z2 = r + 128;
  45742. sp_digit u;
  45743. sp_digit ca;
  45744. sp_digit cb;
  45745. ca = sp_2048_add_64(a1, a, &a[64]);
  45746. cb = sp_2048_add_64(b1, b, &b[64]);
  45747. u = ca & cb;
  45748. sp_2048_mul_64(z2, &a[64], &b[64]);
  45749. sp_2048_mul_64(z0, a, b);
  45750. sp_2048_mul_64(z1, a1, b1);
  45751. u += sp_4096_sub_in_place_128(z1, z0);
  45752. u += sp_4096_sub_in_place_128(z1, z2);
  45753. sp_2048_mask_64(a1, a1, 0 - cb);
  45754. u += sp_2048_add_64(z1 + 64, z1 + 64, a1);
  45755. sp_2048_mask_64(b1, b1, 0 - ca);
  45756. u += sp_2048_add_64(z1 + 64, z1 + 64, b1);
  45757. u += sp_4096_add_128(r + 64, r + 64, z1);
  45758. XMEMSET(a1 + 1, 0, sizeof(sp_digit) * (64 - 1));
  45759. a1[0] = u;
  45760. (void)sp_2048_add_64(r + 192, r + 192, a1);
  45761. }
  45762. /* Square a and put result in r. (r = a * a)
  45763. *
  45764. * r A single precision integer.
  45765. * a A single precision integer.
  45766. */
  45767. SP_NOINLINE static void sp_4096_sqr_128(sp_digit* r, const sp_digit* a)
  45768. {
  45769. sp_digit* z0 = r;
  45770. sp_digit* z2 = r + 128;
  45771. sp_digit z1[128];
  45772. sp_digit* a1 = z1;
  45773. sp_digit zero[64];
  45774. sp_digit u;
  45775. sp_digit mask;
  45776. sp_digit* p1;
  45777. sp_digit* p2;
  45778. XMEMSET(zero, 0, sizeof(sp_digit) * 64);
  45779. mask = sp_2048_sub_64(a1, a, &a[64]);
  45780. p1 = (sp_digit*)(((sp_digit)zero & mask ) | ((sp_digit)a1 & (~mask)));
  45781. p2 = (sp_digit*)(((sp_digit)zero & (~mask)) | ((sp_digit)a1 & mask ));
  45782. (void)sp_2048_sub_64(a1, p1, p2);
  45783. sp_2048_sqr_64(z2, &a[64]);
  45784. sp_2048_sqr_64(z0, a);
  45785. sp_2048_sqr_64(z1, a1);
  45786. u = 0;
  45787. u -= sp_4096_sub_in_place_128(z1, z2);
  45788. u -= sp_4096_sub_in_place_128(z1, z0);
  45789. u += sp_4096_sub_in_place_128(r + 64, z1);
  45790. zero[0] = u;
  45791. (void)sp_2048_add_64(r + 192, r + 192, zero);
  45792. }
  45793. #endif /* !WOLFSSL_SP_SMALL */
  45794. #ifdef WOLFSSL_SP_SMALL
  45795. /* Add b to a into r. (r = a + b)
  45796. *
  45797. * r A single precision integer.
  45798. * a A single precision integer.
  45799. * b A single precision integer.
  45800. */
  45801. static sp_digit sp_4096_add_128(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p)
  45802. {
  45803. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  45804. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  45805. register const sp_digit* b asm ("r2") = (const sp_digit*)b_p;
  45806. __asm__ __volatile__ (
  45807. "mov r3, #0\n\t"
  45808. "add r12, %[a], #0x200\n\t"
  45809. "\n"
  45810. "L_sp_4096_add_128_word_%=: \n\t"
  45811. "adds r3, r3, #-1\n\t"
  45812. "ldm %[a]!, {r4, r5, r6, r7}\n\t"
  45813. "ldm %[b]!, {r8, r9, r10, r11}\n\t"
  45814. "adcs r4, r4, r8\n\t"
  45815. "adcs r5, r5, r9\n\t"
  45816. "adcs r6, r6, r10\n\t"
  45817. "adcs r7, r7, r11\n\t"
  45818. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  45819. "mov r4, #0\n\t"
  45820. "adc r3, r4, #0\n\t"
  45821. "cmp %[a], r12\n\t"
  45822. "bne L_sp_4096_add_128_word_%=\n\t"
  45823. "mov %[r], r3\n\t"
  45824. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  45825. :
  45826. : "memory", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r3", "r12", "cc"
  45827. );
  45828. return (uint32_t)(size_t)r;
  45829. }
  45830. #endif /* WOLFSSL_SP_SMALL */
  45831. #ifdef WOLFSSL_SP_SMALL
  45832. /* Sub b from a into a. (a -= b)
  45833. *
  45834. * a A single precision integer.
  45835. * b A single precision integer.
  45836. */
  45837. static sp_digit sp_4096_sub_in_place_128(sp_digit* a_p, const sp_digit* b_p)
  45838. {
  45839. register sp_digit* a asm ("r0") = (sp_digit*)a_p;
  45840. register const sp_digit* b asm ("r1") = (const sp_digit*)b_p;
  45841. __asm__ __volatile__ (
  45842. "mov r12, #0\n\t"
  45843. "add lr, %[a], #0x200\n\t"
  45844. "\n"
  45845. "L_sp_4096_sub_in_pkace_128_word_%=: \n\t"
  45846. "rsbs r12, r12, #0\n\t"
  45847. "ldm %[a], {r2, r3, r4, r5}\n\t"
  45848. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  45849. "sbcs r2, r2, r6\n\t"
  45850. "sbcs r3, r3, r7\n\t"
  45851. "sbcs r4, r4, r8\n\t"
  45852. "sbcs r5, r5, r9\n\t"
  45853. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  45854. "sbc r12, r12, r12\n\t"
  45855. "cmp %[a], lr\n\t"
  45856. "bne L_sp_4096_sub_in_pkace_128_word_%=\n\t"
  45857. "mov %[a], r12\n\t"
  45858. : [a] "+r" (a), [b] "+r" (b)
  45859. :
  45860. : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r12", "lr", "cc"
  45861. );
  45862. return (uint32_t)(size_t)a;
  45863. }
  45864. #endif /* WOLFSSL_SP_SMALL */
  45865. #ifdef WOLFSSL_SP_SMALL
  45866. /* Multiply a and b into r. (r = a * b)
  45867. *
  45868. * r A single precision integer.
  45869. * a A single precision integer.
  45870. * b A single precision integer.
  45871. */
  45872. static void sp_4096_mul_128(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p)
  45873. {
  45874. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  45875. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  45876. register const sp_digit* b asm ("r2") = (const sp_digit*)b_p;
  45877. __asm__ __volatile__ (
  45878. "sub sp, sp, #0x400\n\t"
  45879. "ldr lr, [%[a]]\n\t"
  45880. "ldr r11, [%[b]]\n\t"
  45881. "umull r8, r6, lr, r11\n\t"
  45882. "str r8, [sp]\n\t"
  45883. "mov r7, #0\n\t"
  45884. "mov r8, #0\n\t"
  45885. "mov r5, #4\n\t"
  45886. "\n"
  45887. "L_sp_4096_mul_128_outer_%=: \n\t"
  45888. "subs r3, r5, #0x1fc\n\t"
  45889. "it cc\n\t"
  45890. "movcc r3, #0\n\t"
  45891. "sub r4, r5, r3\n\t"
  45892. "\n"
  45893. "L_sp_4096_mul_128_inner_%=: \n\t"
  45894. "ldr lr, [%[a], r3]\n\t"
  45895. "ldr r11, [%[b], r4]\n\t"
  45896. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  45897. "lsl r9, lr, #16\n\t"
  45898. "lsl r10, r11, #16\n\t"
  45899. "lsr r9, r9, #16\n\t"
  45900. "lsr r10, r10, #16\n\t"
  45901. "mul r10, r9, r10\n\t"
  45902. "adds r6, r6, r10\n\t"
  45903. "adcs r7, r7, #0\n\t"
  45904. "adc r8, r8, #0\n\t"
  45905. "lsr r10, r11, #16\n\t"
  45906. "mul r9, r10, r9\n\t"
  45907. "lsr r10, r9, #16\n\t"
  45908. "lsl r9, r9, #16\n\t"
  45909. "adds r6, r6, r9\n\t"
  45910. "adcs r7, r7, r10\n\t"
  45911. "adc r8, r8, #0\n\t"
  45912. "lsr r9, lr, #16\n\t"
  45913. "lsr r10, r11, #16\n\t"
  45914. "mul r10, r9, r10\n\t"
  45915. "adds r7, r7, r10\n\t"
  45916. "adc r8, r8, #0\n\t"
  45917. "lsl r10, r11, #16\n\t"
  45918. "lsr r10, r10, #16\n\t"
  45919. "mul r9, r10, r9\n\t"
  45920. "lsr r10, r9, #16\n\t"
  45921. "lsl r9, r9, #16\n\t"
  45922. "adds r6, r6, r9\n\t"
  45923. "adcs r7, r7, r10\n\t"
  45924. "adc r8, r8, #0\n\t"
  45925. #else
  45926. "umull r9, r10, lr, r11\n\t"
  45927. "adds r6, r6, r9\n\t"
  45928. "adcs r7, r7, r10\n\t"
  45929. "adc r8, r8, #0\n\t"
  45930. #endif
  45931. "ldr lr, [%[a], r4]\n\t"
  45932. "ldr r11, [%[b], r3]\n\t"
  45933. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  45934. "lsl r9, lr, #16\n\t"
  45935. "lsl r10, r11, #16\n\t"
  45936. "lsr r9, r9, #16\n\t"
  45937. "lsr r10, r10, #16\n\t"
  45938. "mul r10, r9, r10\n\t"
  45939. "adds r6, r6, r10\n\t"
  45940. "adcs r7, r7, #0\n\t"
  45941. "adc r8, r8, #0\n\t"
  45942. "lsr r10, r11, #16\n\t"
  45943. "mul r9, r10, r9\n\t"
  45944. "lsr r10, r9, #16\n\t"
  45945. "lsl r9, r9, #16\n\t"
  45946. "adds r6, r6, r9\n\t"
  45947. "adcs r7, r7, r10\n\t"
  45948. "adc r8, r8, #0\n\t"
  45949. "lsr r9, lr, #16\n\t"
  45950. "lsr r10, r11, #16\n\t"
  45951. "mul r10, r9, r10\n\t"
  45952. "adds r7, r7, r10\n\t"
  45953. "adc r8, r8, #0\n\t"
  45954. "lsl r10, r11, #16\n\t"
  45955. "lsr r10, r10, #16\n\t"
  45956. "mul r9, r10, r9\n\t"
  45957. "lsr r10, r9, #16\n\t"
  45958. "lsl r9, r9, #16\n\t"
  45959. "adds r6, r6, r9\n\t"
  45960. "adcs r7, r7, r10\n\t"
  45961. "adc r8, r8, #0\n\t"
  45962. #else
  45963. "umull r9, r10, lr, r11\n\t"
  45964. "adds r6, r6, r9\n\t"
  45965. "adcs r7, r7, r10\n\t"
  45966. "adc r8, r8, #0\n\t"
  45967. #endif
  45968. "add r3, r3, #4\n\t"
  45969. "sub r4, r4, #4\n\t"
  45970. "cmp r3, r4\n\t"
  45971. "bgt L_sp_4096_mul_128_inner_done_%=\n\t"
  45972. "blt L_sp_4096_mul_128_inner_%=\n\t"
  45973. "ldr lr, [%[a], r3]\n\t"
  45974. "ldr r11, [%[b], r3]\n\t"
  45975. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  45976. "lsl r9, lr, #16\n\t"
  45977. "lsl r10, r11, #16\n\t"
  45978. "lsr r9, r9, #16\n\t"
  45979. "lsr r10, r10, #16\n\t"
  45980. "mul r10, r9, r10\n\t"
  45981. "adds r6, r6, r10\n\t"
  45982. "adcs r7, r7, #0\n\t"
  45983. "adc r8, r8, #0\n\t"
  45984. "lsr r10, r11, #16\n\t"
  45985. "mul r9, r10, r9\n\t"
  45986. "lsr r10, r9, #16\n\t"
  45987. "lsl r9, r9, #16\n\t"
  45988. "adds r6, r6, r9\n\t"
  45989. "adcs r7, r7, r10\n\t"
  45990. "adc r8, r8, #0\n\t"
  45991. "lsr r9, lr, #16\n\t"
  45992. "lsr r10, r11, #16\n\t"
  45993. "mul r10, r9, r10\n\t"
  45994. "adds r7, r7, r10\n\t"
  45995. "adc r8, r8, #0\n\t"
  45996. "lsl r10, r11, #16\n\t"
  45997. "lsr r10, r10, #16\n\t"
  45998. "mul r9, r10, r9\n\t"
  45999. "lsr r10, r9, #16\n\t"
  46000. "lsl r9, r9, #16\n\t"
  46001. "adds r6, r6, r9\n\t"
  46002. "adcs r7, r7, r10\n\t"
  46003. "adc r8, r8, #0\n\t"
  46004. #else
  46005. "umull r9, r10, lr, r11\n\t"
  46006. "adds r6, r6, r9\n\t"
  46007. "adcs r7, r7, r10\n\t"
  46008. "adc r8, r8, #0\n\t"
  46009. #endif
  46010. "\n"
  46011. "L_sp_4096_mul_128_inner_done_%=: \n\t"
  46012. "str r6, [sp, r5]\n\t"
  46013. "mov r6, r7\n\t"
  46014. "mov r7, r8\n\t"
  46015. "mov r8, #0\n\t"
  46016. "add r5, r5, #4\n\t"
  46017. "cmp r5, #0x3f4\n\t"
  46018. "ble L_sp_4096_mul_128_outer_%=\n\t"
  46019. "ldr lr, [%[a], #508]\n\t"
  46020. "ldr r11, [%[b], #508]\n\t"
  46021. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  46022. "lsl r9, lr, #16\n\t"
  46023. "lsl r10, r11, #16\n\t"
  46024. "lsr r9, r9, #16\n\t"
  46025. "lsr r10, r10, #16\n\t"
  46026. "mul r10, r9, r10\n\t"
  46027. "adds r6, r6, r10\n\t"
  46028. "adc r7, r7, #0\n\t"
  46029. "lsr r10, r11, #16\n\t"
  46030. "mul r9, r10, r9\n\t"
  46031. "lsr r10, r9, #16\n\t"
  46032. "lsl r9, r9, #16\n\t"
  46033. "adds r6, r6, r9\n\t"
  46034. "adc r7, r7, r10\n\t"
  46035. "lsr r9, lr, #16\n\t"
  46036. "lsr r10, r11, #16\n\t"
  46037. "mul r10, r9, r10\n\t"
  46038. "add r7, r7, r10\n\t"
  46039. "lsl r10, r11, #16\n\t"
  46040. "lsr r10, r10, #16\n\t"
  46041. "mul r9, r10, r9\n\t"
  46042. "lsr r10, r9, #16\n\t"
  46043. "lsl r9, r9, #16\n\t"
  46044. "adds r6, r6, r9\n\t"
  46045. "adc r7, r7, r10\n\t"
  46046. #else
  46047. "umlal r6, r7, lr, r11\n\t"
  46048. #endif
  46049. "str r6, [sp, r5]\n\t"
  46050. "add r5, r5, #4\n\t"
  46051. "str r7, [sp, r5]\n\t"
  46052. "\n"
  46053. "L_sp_4096_mul_128_store_%=: \n\t"
  46054. "ldm sp!, {r3, r4, r6, r7, r8, r9, r10, r11}\n\t"
  46055. "stm %[r]!, {r3, r4, r6, r7, r8, r9, r10, r11}\n\t"
  46056. "subs r5, r5, #32\n\t"
  46057. "bgt L_sp_4096_mul_128_store_%=\n\t"
  46058. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  46059. :
  46060. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "lr", "r11", "cc"
  46061. );
  46062. }
  46063. /* Square a and put result in r. (r = a * a)
  46064. *
  46065. * r A single precision integer.
  46066. * a A single precision integer.
  46067. */
  46068. static void sp_4096_sqr_128(sp_digit* r_p, const sp_digit* a_p)
  46069. {
  46070. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  46071. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  46072. __asm__ __volatile__ (
  46073. "sub sp, sp, #0x400\n\t"
  46074. "ldr lr, [%[a]]\n\t"
  46075. "umull r8, r6, lr, lr\n\t"
  46076. "str r8, [sp]\n\t"
  46077. "mov r7, #0\n\t"
  46078. "mov r8, #0\n\t"
  46079. "mov r5, #4\n\t"
  46080. "\n"
  46081. "L_sp_4096_sqr_128_outer_%=: \n\t"
  46082. "subs r3, r5, #0x1fc\n\t"
  46083. "it cc\n\t"
  46084. "movcc r3, #0\n\t"
  46085. "sub r4, r5, r3\n\t"
  46086. "\n"
  46087. "L_sp_4096_sqr_128_inner_%=: \n\t"
  46088. "ldr lr, [%[a], r3]\n\t"
  46089. "ldr r11, [%[a], r4]\n\t"
  46090. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  46091. "lsl r9, lr, #16\n\t"
  46092. "lsl r10, r11, #16\n\t"
  46093. "lsr r9, r9, #16\n\t"
  46094. "lsr r10, r10, #16\n\t"
  46095. "mul r10, r9, r10\n\t"
  46096. "adds r6, r6, r10\n\t"
  46097. "adcs r7, r7, #0\n\t"
  46098. "adc r8, r8, #0\n\t"
  46099. "adds r6, r6, r10\n\t"
  46100. "adcs r7, r7, #0\n\t"
  46101. "adc r8, r8, #0\n\t"
  46102. "lsr r10, r11, #16\n\t"
  46103. "mul r9, r10, r9\n\t"
  46104. "lsr r10, r9, #16\n\t"
  46105. "lsl r9, r9, #16\n\t"
  46106. "adds r6, r6, r9\n\t"
  46107. "adcs r7, r7, r10\n\t"
  46108. "adc r8, r8, #0\n\t"
  46109. "adds r6, r6, r9\n\t"
  46110. "adcs r7, r7, r10\n\t"
  46111. "adc r8, r8, #0\n\t"
  46112. "lsr r9, lr, #16\n\t"
  46113. "lsr r10, r11, #16\n\t"
  46114. "mul r10, r9, r10\n\t"
  46115. "adds r7, r7, r10\n\t"
  46116. "adc r8, r8, #0\n\t"
  46117. "adds r7, r7, r10\n\t"
  46118. "adc r8, r8, #0\n\t"
  46119. "lsl r10, r11, #16\n\t"
  46120. "lsr r10, r10, #16\n\t"
  46121. "mul r9, r10, r9\n\t"
  46122. "lsr r10, r9, #16\n\t"
  46123. "lsl r9, r9, #16\n\t"
  46124. "adds r6, r6, r9\n\t"
  46125. "adcs r7, r7, r10\n\t"
  46126. "adc r8, r8, #0\n\t"
  46127. "adds r6, r6, r9\n\t"
  46128. "adcs r7, r7, r10\n\t"
  46129. "adc r8, r8, #0\n\t"
  46130. #else
  46131. "umull r9, r10, lr, r11\n\t"
  46132. "adds r6, r6, r9\n\t"
  46133. "adcs r7, r7, r10\n\t"
  46134. "adc r8, r8, #0\n\t"
  46135. "adds r6, r6, r9\n\t"
  46136. "adcs r7, r7, r10\n\t"
  46137. "adc r8, r8, #0\n\t"
  46138. #endif
  46139. "add r3, r3, #4\n\t"
  46140. "sub r4, r4, #4\n\t"
  46141. "cmp r3, r4\n\t"
  46142. "bgt L_sp_4096_sqr_128_inner_done_%=\n\t"
  46143. "blt L_sp_4096_sqr_128_inner_%=\n\t"
  46144. "ldr lr, [%[a], r3]\n\t"
  46145. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  46146. "lsl r9, lr, #16\n\t"
  46147. "lsr r10, lr, #16\n\t"
  46148. "lsr r9, r9, #16\n\t"
  46149. "mov r11, r9\n\t"
  46150. "mul r9, r11, r9\n\t"
  46151. "mov r11, r10\n\t"
  46152. "mul r10, r11, r10\n\t"
  46153. "adds r6, r6, r9\n\t"
  46154. "adcs r7, r7, r10\n\t"
  46155. "adc r8, r8, #0\n\t"
  46156. "lsr r10, lr, #16\n\t"
  46157. "lsl r9, lr, #16\n\t"
  46158. "lsr r9, r9, #16\n\t"
  46159. "mul r9, r10, r9\n\t"
  46160. "lsr r10, r9, #15\n\t"
  46161. "lsl r9, r9, #17\n\t"
  46162. "adds r6, r6, r9\n\t"
  46163. "adcs r7, r7, r10\n\t"
  46164. "adc r8, r8, #0\n\t"
  46165. #else
  46166. "umull r9, r10, lr, lr\n\t"
  46167. "adds r6, r6, r9\n\t"
  46168. "adcs r7, r7, r10\n\t"
  46169. "adc r8, r8, #0\n\t"
  46170. #endif
  46171. "\n"
  46172. "L_sp_4096_sqr_128_inner_done_%=: \n\t"
  46173. "str r6, [sp, r5]\n\t"
  46174. "mov r6, r7\n\t"
  46175. "mov r7, r8\n\t"
  46176. "mov r8, #0\n\t"
  46177. "add r5, r5, #4\n\t"
  46178. "cmp r5, #0x3f4\n\t"
  46179. "ble L_sp_4096_sqr_128_outer_%=\n\t"
  46180. "ldr lr, [%[a], #508]\n\t"
  46181. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  46182. "lsl r9, lr, #16\n\t"
  46183. "lsr r10, lr, #16\n\t"
  46184. "lsr r9, r9, #16\n\t"
  46185. "mov r11, r9\n\t"
  46186. "mul r9, r11, r9\n\t"
  46187. "mov r11, r10\n\t"
  46188. "mul r10, r11, r10\n\t"
  46189. "adds r6, r6, r9\n\t"
  46190. "adc r7, r7, r10\n\t"
  46191. "lsr r10, lr, #16\n\t"
  46192. "lsl r9, lr, #16\n\t"
  46193. "lsr r9, r9, #16\n\t"
  46194. "mul r9, r10, r9\n\t"
  46195. "lsr r10, r9, #15\n\t"
  46196. "lsl r9, r9, #17\n\t"
  46197. "adds r6, r6, r9\n\t"
  46198. "adc r7, r7, r10\n\t"
  46199. #else
  46200. "umull r9, r10, lr, lr\n\t"
  46201. "adds r6, r6, r9\n\t"
  46202. "adc r7, r7, r10\n\t"
  46203. #endif
  46204. "str r6, [sp, r5]\n\t"
  46205. "add r5, r5, #4\n\t"
  46206. "str r7, [sp, r5]\n\t"
  46207. "\n"
  46208. "L_sp_4096_sqr_128_store_%=: \n\t"
  46209. "ldm sp!, {r3, r4, r6, r7, r8, r9, r10, r11}\n\t"
  46210. "stm %[r]!, {r3, r4, r6, r7, r8, r9, r10, r11}\n\t"
  46211. "subs r5, r5, #32\n\t"
  46212. "bgt L_sp_4096_sqr_128_store_%=\n\t"
  46213. : [r] "+r" (r), [a] "+r" (a)
  46214. :
  46215. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "lr", "r11", "cc"
  46216. );
  46217. }
  46218. #endif /* WOLFSSL_SP_SMALL */
  46219. /* Calculate the bottom digit of -1/a mod 2^n.
  46220. *
  46221. * a A single precision number.
  46222. * rho Bottom word of inverse.
  46223. */
  46224. static void sp_4096_mont_setup(const sp_digit* a, sp_digit* rho)
  46225. {
  46226. sp_digit x;
  46227. sp_digit b;
  46228. b = a[0];
  46229. x = (((b + 2) & 4) << 1) + b; /* here x*a==1 mod 2**4 */
  46230. x *= 2 - b * x; /* here x*a==1 mod 2**8 */
  46231. x *= 2 - b * x; /* here x*a==1 mod 2**16 */
  46232. x *= 2 - b * x; /* here x*a==1 mod 2**32 */
  46233. /* rho = -1/m mod b */
  46234. *rho = (sp_digit)0 - x;
  46235. }
  46236. #ifdef WOLFSSL_SP_SMALL
  46237. /* Mul a by digit b into r. (r = a * b)
  46238. *
  46239. * r A single precision integer.
  46240. * a A single precision integer.
  46241. * b A single precision digit.
  46242. */
  46243. static void sp_4096_mul_d_128(sp_digit* r_p, const sp_digit* a_p, sp_digit b_p)
  46244. {
  46245. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  46246. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  46247. register sp_digit b asm ("r2") = (sp_digit)b_p;
  46248. __asm__ __volatile__ (
  46249. /* A[0] * B */
  46250. "ldr r8, [%[a]]\n\t"
  46251. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  46252. "lsl r6, %[b], #16\n\t"
  46253. "lsl r5, r8, #16\n\t"
  46254. "lsr r6, r6, #16\n\t"
  46255. "lsr r5, r5, #16\n\t"
  46256. "mul r5, r6, r5\n\t"
  46257. "lsr r7, r8, #16\n\t"
  46258. "mul r6, r7, r6\n\t"
  46259. "lsr r3, r6, #16\n\t"
  46260. "lsl r6, r6, #16\n\t"
  46261. "adds r5, r5, r6\n\t"
  46262. "adc r3, r3, #0\n\t"
  46263. "lsr r6, %[b], #16\n\t"
  46264. "mul r7, r6, r7\n\t"
  46265. "add r3, r3, r7\n\t"
  46266. "lsl r7, r8, #16\n\t"
  46267. "lsr r7, r7, #16\n\t"
  46268. "mul r6, r7, r6\n\t"
  46269. "lsr r7, r6, #16\n\t"
  46270. "lsl r6, r6, #16\n\t"
  46271. "adds r5, r5, r6\n\t"
  46272. "adc r3, r3, r7\n\t"
  46273. #else
  46274. "umull r5, r3, %[b], r8\n\t"
  46275. #endif
  46276. "mov r4, #0\n\t"
  46277. "str r5, [%[r]]\n\t"
  46278. "mov r5, #0\n\t"
  46279. "mov r9, #4\n\t"
  46280. "\n"
  46281. "L_sp_4096_mul_d_128_word_%=: \n\t"
  46282. /* A[i] * B */
  46283. "ldr r8, [%[a], r9]\n\t"
  46284. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  46285. "lsl r6, %[b], #16\n\t"
  46286. "lsl r7, r8, #16\n\t"
  46287. "lsr r6, r6, #16\n\t"
  46288. "lsr r7, r7, #16\n\t"
  46289. "mul r7, r6, r7\n\t"
  46290. "adds r3, r3, r7\n\t"
  46291. "adcs r4, r4, #0\n\t"
  46292. "adc r5, r5, #0\n\t"
  46293. "lsr r7, r8, #16\n\t"
  46294. "mul r6, r7, r6\n\t"
  46295. "lsr r7, r6, #16\n\t"
  46296. "lsl r6, r6, #16\n\t"
  46297. "adds r3, r3, r6\n\t"
  46298. "adcs r4, r4, r7\n\t"
  46299. "adc r5, r5, #0\n\t"
  46300. "lsr r6, %[b], #16\n\t"
  46301. "lsr r7, r8, #16\n\t"
  46302. "mul r7, r6, r7\n\t"
  46303. "adds r4, r4, r7\n\t"
  46304. "adc r5, r5, #0\n\t"
  46305. "lsl r7, r8, #16\n\t"
  46306. "lsr r7, r7, #16\n\t"
  46307. "mul r6, r7, r6\n\t"
  46308. "lsr r7, r6, #16\n\t"
  46309. "lsl r6, r6, #16\n\t"
  46310. "adds r3, r3, r6\n\t"
  46311. "adcs r4, r4, r7\n\t"
  46312. "adc r5, r5, #0\n\t"
  46313. #else
  46314. "umull r6, r7, %[b], r8\n\t"
  46315. "adds r3, r3, r6\n\t"
  46316. "adcs r4, r4, r7\n\t"
  46317. "adc r5, r5, #0\n\t"
  46318. #endif
  46319. "str r3, [%[r], r9]\n\t"
  46320. "mov r3, r4\n\t"
  46321. "mov r4, r5\n\t"
  46322. "mov r5, #0\n\t"
  46323. "add r9, r9, #4\n\t"
  46324. "cmp r9, #0x200\n\t"
  46325. "blt L_sp_4096_mul_d_128_word_%=\n\t"
  46326. "str r3, [%[r], #512]\n\t"
  46327. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  46328. :
  46329. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "cc"
  46330. );
  46331. }
  46332. #else
  46333. /* Mul a by digit b into r. (r = a * b)
  46334. *
  46335. * r A single precision integer.
  46336. * a A single precision integer.
  46337. * b A single precision digit.
  46338. */
  46339. static void sp_4096_mul_d_128(sp_digit* r_p, const sp_digit* a_p, sp_digit b_p)
  46340. {
  46341. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  46342. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  46343. register sp_digit b asm ("r2") = (sp_digit)b_p;
  46344. __asm__ __volatile__ (
  46345. /* A[0] * B */
  46346. "ldm %[a]!, {r8}\n\t"
  46347. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  46348. "lsl r6, %[b], #16\n\t"
  46349. "lsl r3, r8, #16\n\t"
  46350. "lsr r6, r6, #16\n\t"
  46351. "lsr r3, r3, #16\n\t"
  46352. "mul r3, r6, r3\n\t"
  46353. "lsr r7, r8, #16\n\t"
  46354. "mul r6, r7, r6\n\t"
  46355. "lsr r4, r6, #16\n\t"
  46356. "lsl r6, r6, #16\n\t"
  46357. "adds r3, r3, r6\n\t"
  46358. "adc r4, r4, #0\n\t"
  46359. "lsr r6, %[b], #16\n\t"
  46360. "mul r7, r6, r7\n\t"
  46361. "add r4, r4, r7\n\t"
  46362. "lsl r7, r8, #16\n\t"
  46363. "lsr r7, r7, #16\n\t"
  46364. "mul r6, r7, r6\n\t"
  46365. "lsr r7, r6, #16\n\t"
  46366. "lsl r6, r6, #16\n\t"
  46367. "adds r3, r3, r6\n\t"
  46368. "adc r4, r4, r7\n\t"
  46369. #else
  46370. "umull r3, r4, %[b], r8\n\t"
  46371. #endif
  46372. "stm %[r]!, {r3}\n\t"
  46373. "mov r5, #0\n\t"
  46374. /* A[1] * B */
  46375. "ldm %[a]!, {r8}\n\t"
  46376. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  46377. "lsl r6, %[b], #16\n\t"
  46378. "lsl r7, r8, #16\n\t"
  46379. "lsr r6, r6, #16\n\t"
  46380. "lsr r7, r7, #16\n\t"
  46381. "mul r7, r6, r7\n\t"
  46382. "adds r4, r4, r7\n\t"
  46383. "adc r5, r5, #0\n\t"
  46384. "lsr r7, r8, #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. "adc r5, r5, r7\n\t"
  46390. "lsr r6, %[b], #16\n\t"
  46391. "lsr r7, r8, #16\n\t"
  46392. "mul r7, r6, r7\n\t"
  46393. "add r5, r5, r7\n\t"
  46394. "lsl r7, r8, #16\n\t"
  46395. "lsr r7, r7, #16\n\t"
  46396. "mul r6, r7, r6\n\t"
  46397. "lsr r7, r6, #16\n\t"
  46398. "lsl r6, r6, #16\n\t"
  46399. "adds r4, r4, r6\n\t"
  46400. "adc r5, r5, r7\n\t"
  46401. #else
  46402. "umlal r4, r5, %[b], r8\n\t"
  46403. #endif
  46404. "stm %[r]!, {r4}\n\t"
  46405. "mov r3, #0\n\t"
  46406. /* A[2] * B */
  46407. "ldm %[a]!, {r8}\n\t"
  46408. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  46409. "lsl r6, %[b], #16\n\t"
  46410. "lsl r7, r8, #16\n\t"
  46411. "lsr r6, r6, #16\n\t"
  46412. "lsr r7, r7, #16\n\t"
  46413. "mul r7, r6, r7\n\t"
  46414. "adds r5, r5, r7\n\t"
  46415. "adc r3, r3, #0\n\t"
  46416. "lsr r7, r8, #16\n\t"
  46417. "mul r6, r7, r6\n\t"
  46418. "lsr r7, r6, #16\n\t"
  46419. "lsl r6, r6, #16\n\t"
  46420. "adds r5, r5, r6\n\t"
  46421. "adc r3, r3, r7\n\t"
  46422. "lsr r6, %[b], #16\n\t"
  46423. "lsr r7, r8, #16\n\t"
  46424. "mul r7, r6, r7\n\t"
  46425. "add r3, r3, r7\n\t"
  46426. "lsl r7, r8, #16\n\t"
  46427. "lsr r7, r7, #16\n\t"
  46428. "mul r6, r7, r6\n\t"
  46429. "lsr r7, r6, #16\n\t"
  46430. "lsl r6, r6, #16\n\t"
  46431. "adds r5, r5, r6\n\t"
  46432. "adc r3, r3, r7\n\t"
  46433. #else
  46434. "umlal r5, r3, %[b], r8\n\t"
  46435. #endif
  46436. "stm %[r]!, {r5}\n\t"
  46437. "mov r4, #0\n\t"
  46438. /* A[3] * B */
  46439. "ldm %[a]!, {r8}\n\t"
  46440. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  46441. "lsl r6, %[b], #16\n\t"
  46442. "lsl r7, r8, #16\n\t"
  46443. "lsr r6, r6, #16\n\t"
  46444. "lsr r7, r7, #16\n\t"
  46445. "mul r7, r6, r7\n\t"
  46446. "adds r3, r3, r7\n\t"
  46447. "adc r4, r4, #0\n\t"
  46448. "lsr r7, r8, #16\n\t"
  46449. "mul r6, r7, r6\n\t"
  46450. "lsr r7, r6, #16\n\t"
  46451. "lsl r6, r6, #16\n\t"
  46452. "adds r3, r3, r6\n\t"
  46453. "adc r4, r4, r7\n\t"
  46454. "lsr r6, %[b], #16\n\t"
  46455. "lsr r7, r8, #16\n\t"
  46456. "mul r7, r6, r7\n\t"
  46457. "add r4, r4, r7\n\t"
  46458. "lsl r7, r8, #16\n\t"
  46459. "lsr r7, r7, #16\n\t"
  46460. "mul r6, r7, r6\n\t"
  46461. "lsr r7, r6, #16\n\t"
  46462. "lsl r6, r6, #16\n\t"
  46463. "adds r3, r3, r6\n\t"
  46464. "adc r4, r4, r7\n\t"
  46465. #else
  46466. "umlal r3, r4, %[b], r8\n\t"
  46467. #endif
  46468. "stm %[r]!, {r3}\n\t"
  46469. "mov r5, #0\n\t"
  46470. /* A[4] * B */
  46471. "ldm %[a]!, {r8}\n\t"
  46472. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  46473. "lsl r6, %[b], #16\n\t"
  46474. "lsl r7, r8, #16\n\t"
  46475. "lsr r6, r6, #16\n\t"
  46476. "lsr r7, r7, #16\n\t"
  46477. "mul r7, r6, r7\n\t"
  46478. "adds r4, r4, r7\n\t"
  46479. "adc r5, r5, #0\n\t"
  46480. "lsr r7, r8, #16\n\t"
  46481. "mul r6, r7, r6\n\t"
  46482. "lsr r7, r6, #16\n\t"
  46483. "lsl r6, r6, #16\n\t"
  46484. "adds r4, r4, r6\n\t"
  46485. "adc r5, r5, r7\n\t"
  46486. "lsr r6, %[b], #16\n\t"
  46487. "lsr r7, r8, #16\n\t"
  46488. "mul r7, r6, r7\n\t"
  46489. "add r5, r5, r7\n\t"
  46490. "lsl r7, r8, #16\n\t"
  46491. "lsr r7, r7, #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. "adc r5, r5, r7\n\t"
  46497. #else
  46498. "umlal r4, r5, %[b], r8\n\t"
  46499. #endif
  46500. "stm %[r]!, {r4}\n\t"
  46501. "mov r3, #0\n\t"
  46502. /* A[5] * B */
  46503. "ldm %[a]!, {r8}\n\t"
  46504. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  46505. "lsl r6, %[b], #16\n\t"
  46506. "lsl r7, r8, #16\n\t"
  46507. "lsr r6, r6, #16\n\t"
  46508. "lsr r7, r7, #16\n\t"
  46509. "mul r7, r6, r7\n\t"
  46510. "adds r5, r5, r7\n\t"
  46511. "adc r3, r3, #0\n\t"
  46512. "lsr r7, r8, #16\n\t"
  46513. "mul r6, r7, r6\n\t"
  46514. "lsr r7, r6, #16\n\t"
  46515. "lsl r6, r6, #16\n\t"
  46516. "adds r5, r5, r6\n\t"
  46517. "adc r3, r3, r7\n\t"
  46518. "lsr r6, %[b], #16\n\t"
  46519. "lsr r7, r8, #16\n\t"
  46520. "mul r7, r6, r7\n\t"
  46521. "add r3, r3, r7\n\t"
  46522. "lsl r7, r8, #16\n\t"
  46523. "lsr r7, r7, #16\n\t"
  46524. "mul r6, r7, r6\n\t"
  46525. "lsr r7, r6, #16\n\t"
  46526. "lsl r6, r6, #16\n\t"
  46527. "adds r5, r5, r6\n\t"
  46528. "adc r3, r3, r7\n\t"
  46529. #else
  46530. "umlal r5, r3, %[b], r8\n\t"
  46531. #endif
  46532. "stm %[r]!, {r5}\n\t"
  46533. "mov r4, #0\n\t"
  46534. /* A[6] * B */
  46535. "ldm %[a]!, {r8}\n\t"
  46536. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  46537. "lsl r6, %[b], #16\n\t"
  46538. "lsl r7, r8, #16\n\t"
  46539. "lsr r6, r6, #16\n\t"
  46540. "lsr r7, r7, #16\n\t"
  46541. "mul r7, r6, r7\n\t"
  46542. "adds r3, r3, r7\n\t"
  46543. "adc r4, r4, #0\n\t"
  46544. "lsr r7, r8, #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 r3, r3, r6\n\t"
  46549. "adc r4, r4, r7\n\t"
  46550. "lsr r6, %[b], #16\n\t"
  46551. "lsr r7, r8, #16\n\t"
  46552. "mul r7, r6, r7\n\t"
  46553. "add r4, r4, r7\n\t"
  46554. "lsl r7, r8, #16\n\t"
  46555. "lsr r7, r7, #16\n\t"
  46556. "mul r6, r7, r6\n\t"
  46557. "lsr r7, r6, #16\n\t"
  46558. "lsl r6, r6, #16\n\t"
  46559. "adds r3, r3, r6\n\t"
  46560. "adc r4, r4, r7\n\t"
  46561. #else
  46562. "umlal r3, r4, %[b], r8\n\t"
  46563. #endif
  46564. "stm %[r]!, {r3}\n\t"
  46565. "mov r5, #0\n\t"
  46566. /* A[7] * B */
  46567. "ldm %[a]!, {r8}\n\t"
  46568. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  46569. "lsl r6, %[b], #16\n\t"
  46570. "lsl r7, r8, #16\n\t"
  46571. "lsr r6, r6, #16\n\t"
  46572. "lsr r7, r7, #16\n\t"
  46573. "mul r7, r6, r7\n\t"
  46574. "adds r4, r4, r7\n\t"
  46575. "adc r5, r5, #0\n\t"
  46576. "lsr r7, r8, #16\n\t"
  46577. "mul r6, r7, r6\n\t"
  46578. "lsr r7, r6, #16\n\t"
  46579. "lsl r6, r6, #16\n\t"
  46580. "adds r4, r4, r6\n\t"
  46581. "adc r5, r5, r7\n\t"
  46582. "lsr r6, %[b], #16\n\t"
  46583. "lsr r7, r8, #16\n\t"
  46584. "mul r7, r6, r7\n\t"
  46585. "add r5, r5, r7\n\t"
  46586. "lsl r7, r8, #16\n\t"
  46587. "lsr r7, r7, #16\n\t"
  46588. "mul r6, r7, r6\n\t"
  46589. "lsr r7, r6, #16\n\t"
  46590. "lsl r6, r6, #16\n\t"
  46591. "adds r4, r4, r6\n\t"
  46592. "adc r5, r5, r7\n\t"
  46593. #else
  46594. "umlal r4, r5, %[b], r8\n\t"
  46595. #endif
  46596. "stm %[r]!, {r4}\n\t"
  46597. "mov r3, #0\n\t"
  46598. /* A[8] * B */
  46599. "ldm %[a]!, {r8}\n\t"
  46600. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  46601. "lsl r6, %[b], #16\n\t"
  46602. "lsl r7, r8, #16\n\t"
  46603. "lsr r6, r6, #16\n\t"
  46604. "lsr r7, r7, #16\n\t"
  46605. "mul r7, r6, r7\n\t"
  46606. "adds r5, r5, r7\n\t"
  46607. "adc r3, r3, #0\n\t"
  46608. "lsr r7, r8, #16\n\t"
  46609. "mul r6, r7, r6\n\t"
  46610. "lsr r7, r6, #16\n\t"
  46611. "lsl r6, r6, #16\n\t"
  46612. "adds r5, r5, r6\n\t"
  46613. "adc r3, r3, r7\n\t"
  46614. "lsr r6, %[b], #16\n\t"
  46615. "lsr r7, r8, #16\n\t"
  46616. "mul r7, r6, r7\n\t"
  46617. "add r3, r3, r7\n\t"
  46618. "lsl r7, r8, #16\n\t"
  46619. "lsr r7, r7, #16\n\t"
  46620. "mul r6, r7, r6\n\t"
  46621. "lsr r7, r6, #16\n\t"
  46622. "lsl r6, r6, #16\n\t"
  46623. "adds r5, r5, r6\n\t"
  46624. "adc r3, r3, r7\n\t"
  46625. #else
  46626. "umlal r5, r3, %[b], r8\n\t"
  46627. #endif
  46628. "stm %[r]!, {r5}\n\t"
  46629. "mov r4, #0\n\t"
  46630. /* A[9] * B */
  46631. "ldm %[a]!, {r8}\n\t"
  46632. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  46633. "lsl r6, %[b], #16\n\t"
  46634. "lsl r7, r8, #16\n\t"
  46635. "lsr r6, r6, #16\n\t"
  46636. "lsr r7, r7, #16\n\t"
  46637. "mul r7, r6, r7\n\t"
  46638. "adds r3, r3, r7\n\t"
  46639. "adc r4, r4, #0\n\t"
  46640. "lsr r7, r8, #16\n\t"
  46641. "mul r6, r7, r6\n\t"
  46642. "lsr r7, r6, #16\n\t"
  46643. "lsl r6, r6, #16\n\t"
  46644. "adds r3, r3, r6\n\t"
  46645. "adc r4, r4, r7\n\t"
  46646. "lsr r6, %[b], #16\n\t"
  46647. "lsr r7, r8, #16\n\t"
  46648. "mul r7, r6, r7\n\t"
  46649. "add r4, r4, r7\n\t"
  46650. "lsl r7, r8, #16\n\t"
  46651. "lsr r7, r7, #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 r3, r3, r6\n\t"
  46656. "adc r4, r4, r7\n\t"
  46657. #else
  46658. "umlal r3, r4, %[b], r8\n\t"
  46659. #endif
  46660. "stm %[r]!, {r3}\n\t"
  46661. "mov r5, #0\n\t"
  46662. /* A[10] * B */
  46663. "ldm %[a]!, {r8}\n\t"
  46664. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  46665. "lsl r6, %[b], #16\n\t"
  46666. "lsl r7, r8, #16\n\t"
  46667. "lsr r6, r6, #16\n\t"
  46668. "lsr r7, r7, #16\n\t"
  46669. "mul r7, r6, r7\n\t"
  46670. "adds r4, r4, r7\n\t"
  46671. "adc r5, r5, #0\n\t"
  46672. "lsr r7, r8, #16\n\t"
  46673. "mul r6, r7, r6\n\t"
  46674. "lsr r7, r6, #16\n\t"
  46675. "lsl r6, r6, #16\n\t"
  46676. "adds r4, r4, r6\n\t"
  46677. "adc r5, r5, r7\n\t"
  46678. "lsr r6, %[b], #16\n\t"
  46679. "lsr r7, r8, #16\n\t"
  46680. "mul r7, r6, r7\n\t"
  46681. "add r5, r5, r7\n\t"
  46682. "lsl r7, r8, #16\n\t"
  46683. "lsr r7, r7, #16\n\t"
  46684. "mul r6, r7, r6\n\t"
  46685. "lsr r7, r6, #16\n\t"
  46686. "lsl r6, r6, #16\n\t"
  46687. "adds r4, r4, r6\n\t"
  46688. "adc r5, r5, r7\n\t"
  46689. #else
  46690. "umlal r4, r5, %[b], r8\n\t"
  46691. #endif
  46692. "stm %[r]!, {r4}\n\t"
  46693. "mov r3, #0\n\t"
  46694. /* A[11] * B */
  46695. "ldm %[a]!, {r8}\n\t"
  46696. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  46697. "lsl r6, %[b], #16\n\t"
  46698. "lsl r7, r8, #16\n\t"
  46699. "lsr r6, r6, #16\n\t"
  46700. "lsr r7, r7, #16\n\t"
  46701. "mul r7, r6, r7\n\t"
  46702. "adds r5, r5, r7\n\t"
  46703. "adc r3, r3, #0\n\t"
  46704. "lsr r7, r8, #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 r5, r5, r6\n\t"
  46709. "adc r3, r3, r7\n\t"
  46710. "lsr r6, %[b], #16\n\t"
  46711. "lsr r7, r8, #16\n\t"
  46712. "mul r7, r6, r7\n\t"
  46713. "add r3, r3, r7\n\t"
  46714. "lsl r7, r8, #16\n\t"
  46715. "lsr r7, r7, #16\n\t"
  46716. "mul r6, r7, r6\n\t"
  46717. "lsr r7, r6, #16\n\t"
  46718. "lsl r6, r6, #16\n\t"
  46719. "adds r5, r5, r6\n\t"
  46720. "adc r3, r3, r7\n\t"
  46721. #else
  46722. "umlal r5, r3, %[b], r8\n\t"
  46723. #endif
  46724. "stm %[r]!, {r5}\n\t"
  46725. "mov r4, #0\n\t"
  46726. /* A[12] * B */
  46727. "ldm %[a]!, {r8}\n\t"
  46728. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  46729. "lsl r6, %[b], #16\n\t"
  46730. "lsl r7, r8, #16\n\t"
  46731. "lsr r6, r6, #16\n\t"
  46732. "lsr r7, r7, #16\n\t"
  46733. "mul r7, r6, r7\n\t"
  46734. "adds r3, r3, r7\n\t"
  46735. "adc r4, r4, #0\n\t"
  46736. "lsr r7, r8, #16\n\t"
  46737. "mul r6, r7, r6\n\t"
  46738. "lsr r7, r6, #16\n\t"
  46739. "lsl r6, r6, #16\n\t"
  46740. "adds r3, r3, r6\n\t"
  46741. "adc r4, r4, r7\n\t"
  46742. "lsr r6, %[b], #16\n\t"
  46743. "lsr r7, r8, #16\n\t"
  46744. "mul r7, r6, r7\n\t"
  46745. "add r4, r4, r7\n\t"
  46746. "lsl r7, r8, #16\n\t"
  46747. "lsr r7, r7, #16\n\t"
  46748. "mul r6, r7, r6\n\t"
  46749. "lsr r7, r6, #16\n\t"
  46750. "lsl r6, r6, #16\n\t"
  46751. "adds r3, r3, r6\n\t"
  46752. "adc r4, r4, r7\n\t"
  46753. #else
  46754. "umlal r3, r4, %[b], r8\n\t"
  46755. #endif
  46756. "stm %[r]!, {r3}\n\t"
  46757. "mov r5, #0\n\t"
  46758. /* A[13] * B */
  46759. "ldm %[a]!, {r8}\n\t"
  46760. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  46761. "lsl r6, %[b], #16\n\t"
  46762. "lsl r7, r8, #16\n\t"
  46763. "lsr r6, r6, #16\n\t"
  46764. "lsr r7, r7, #16\n\t"
  46765. "mul r7, r6, r7\n\t"
  46766. "adds r4, r4, r7\n\t"
  46767. "adc r5, r5, #0\n\t"
  46768. "lsr r7, r8, #16\n\t"
  46769. "mul r6, r7, r6\n\t"
  46770. "lsr r7, r6, #16\n\t"
  46771. "lsl r6, r6, #16\n\t"
  46772. "adds r4, r4, r6\n\t"
  46773. "adc r5, r5, r7\n\t"
  46774. "lsr r6, %[b], #16\n\t"
  46775. "lsr r7, r8, #16\n\t"
  46776. "mul r7, r6, r7\n\t"
  46777. "add r5, r5, r7\n\t"
  46778. "lsl r7, r8, #16\n\t"
  46779. "lsr r7, r7, #16\n\t"
  46780. "mul r6, r7, r6\n\t"
  46781. "lsr r7, r6, #16\n\t"
  46782. "lsl r6, r6, #16\n\t"
  46783. "adds r4, r4, r6\n\t"
  46784. "adc r5, r5, r7\n\t"
  46785. #else
  46786. "umlal r4, r5, %[b], r8\n\t"
  46787. #endif
  46788. "stm %[r]!, {r4}\n\t"
  46789. "mov r3, #0\n\t"
  46790. /* A[14] * B */
  46791. "ldm %[a]!, {r8}\n\t"
  46792. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  46793. "lsl r6, %[b], #16\n\t"
  46794. "lsl r7, r8, #16\n\t"
  46795. "lsr r6, r6, #16\n\t"
  46796. "lsr r7, r7, #16\n\t"
  46797. "mul r7, r6, r7\n\t"
  46798. "adds r5, r5, r7\n\t"
  46799. "adc r3, r3, #0\n\t"
  46800. "lsr r7, r8, #16\n\t"
  46801. "mul r6, r7, r6\n\t"
  46802. "lsr r7, r6, #16\n\t"
  46803. "lsl r6, r6, #16\n\t"
  46804. "adds r5, r5, r6\n\t"
  46805. "adc r3, r3, r7\n\t"
  46806. "lsr r6, %[b], #16\n\t"
  46807. "lsr r7, r8, #16\n\t"
  46808. "mul r7, r6, r7\n\t"
  46809. "add r3, r3, r7\n\t"
  46810. "lsl r7, r8, #16\n\t"
  46811. "lsr r7, r7, #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 r5, r5, r6\n\t"
  46816. "adc r3, r3, r7\n\t"
  46817. #else
  46818. "umlal r5, r3, %[b], r8\n\t"
  46819. #endif
  46820. "stm %[r]!, {r5}\n\t"
  46821. "mov r4, #0\n\t"
  46822. /* A[15] * B */
  46823. "ldm %[a]!, {r8}\n\t"
  46824. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  46825. "lsl r6, %[b], #16\n\t"
  46826. "lsl r7, r8, #16\n\t"
  46827. "lsr r6, r6, #16\n\t"
  46828. "lsr r7, r7, #16\n\t"
  46829. "mul r7, r6, r7\n\t"
  46830. "adds r3, r3, r7\n\t"
  46831. "adc r4, r4, #0\n\t"
  46832. "lsr r7, r8, #16\n\t"
  46833. "mul r6, r7, r6\n\t"
  46834. "lsr r7, r6, #16\n\t"
  46835. "lsl r6, r6, #16\n\t"
  46836. "adds r3, r3, r6\n\t"
  46837. "adc r4, r4, r7\n\t"
  46838. "lsr r6, %[b], #16\n\t"
  46839. "lsr r7, r8, #16\n\t"
  46840. "mul r7, r6, r7\n\t"
  46841. "add r4, r4, r7\n\t"
  46842. "lsl r7, r8, #16\n\t"
  46843. "lsr r7, r7, #16\n\t"
  46844. "mul r6, r7, r6\n\t"
  46845. "lsr r7, r6, #16\n\t"
  46846. "lsl r6, r6, #16\n\t"
  46847. "adds r3, r3, r6\n\t"
  46848. "adc r4, r4, r7\n\t"
  46849. #else
  46850. "umlal r3, r4, %[b], r8\n\t"
  46851. #endif
  46852. "stm %[r]!, {r3}\n\t"
  46853. "mov r5, #0\n\t"
  46854. /* A[16] * B */
  46855. "ldm %[a]!, {r8}\n\t"
  46856. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  46857. "lsl r6, %[b], #16\n\t"
  46858. "lsl r7, r8, #16\n\t"
  46859. "lsr r6, r6, #16\n\t"
  46860. "lsr r7, r7, #16\n\t"
  46861. "mul r7, r6, r7\n\t"
  46862. "adds r4, r4, r7\n\t"
  46863. "adc r5, r5, #0\n\t"
  46864. "lsr r7, r8, #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. "adc r5, r5, r7\n\t"
  46870. "lsr r6, %[b], #16\n\t"
  46871. "lsr r7, r8, #16\n\t"
  46872. "mul r7, r6, r7\n\t"
  46873. "add r5, r5, r7\n\t"
  46874. "lsl r7, r8, #16\n\t"
  46875. "lsr r7, r7, #16\n\t"
  46876. "mul r6, r7, r6\n\t"
  46877. "lsr r7, r6, #16\n\t"
  46878. "lsl r6, r6, #16\n\t"
  46879. "adds r4, r4, r6\n\t"
  46880. "adc r5, r5, r7\n\t"
  46881. #else
  46882. "umlal r4, r5, %[b], r8\n\t"
  46883. #endif
  46884. "stm %[r]!, {r4}\n\t"
  46885. "mov r3, #0\n\t"
  46886. /* A[17] * B */
  46887. "ldm %[a]!, {r8}\n\t"
  46888. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  46889. "lsl r6, %[b], #16\n\t"
  46890. "lsl r7, r8, #16\n\t"
  46891. "lsr r6, r6, #16\n\t"
  46892. "lsr r7, r7, #16\n\t"
  46893. "mul r7, r6, r7\n\t"
  46894. "adds r5, r5, r7\n\t"
  46895. "adc r3, r3, #0\n\t"
  46896. "lsr r7, r8, #16\n\t"
  46897. "mul r6, r7, r6\n\t"
  46898. "lsr r7, r6, #16\n\t"
  46899. "lsl r6, r6, #16\n\t"
  46900. "adds r5, r5, r6\n\t"
  46901. "adc r3, r3, r7\n\t"
  46902. "lsr r6, %[b], #16\n\t"
  46903. "lsr r7, r8, #16\n\t"
  46904. "mul r7, r6, r7\n\t"
  46905. "add r3, r3, r7\n\t"
  46906. "lsl r7, r8, #16\n\t"
  46907. "lsr r7, r7, #16\n\t"
  46908. "mul r6, r7, r6\n\t"
  46909. "lsr r7, r6, #16\n\t"
  46910. "lsl r6, r6, #16\n\t"
  46911. "adds r5, r5, r6\n\t"
  46912. "adc r3, r3, r7\n\t"
  46913. #else
  46914. "umlal r5, r3, %[b], r8\n\t"
  46915. #endif
  46916. "stm %[r]!, {r5}\n\t"
  46917. "mov r4, #0\n\t"
  46918. /* A[18] * B */
  46919. "ldm %[a]!, {r8}\n\t"
  46920. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  46921. "lsl r6, %[b], #16\n\t"
  46922. "lsl r7, r8, #16\n\t"
  46923. "lsr r6, r6, #16\n\t"
  46924. "lsr r7, r7, #16\n\t"
  46925. "mul r7, r6, r7\n\t"
  46926. "adds r3, r3, r7\n\t"
  46927. "adc r4, r4, #0\n\t"
  46928. "lsr r7, r8, #16\n\t"
  46929. "mul r6, r7, r6\n\t"
  46930. "lsr r7, r6, #16\n\t"
  46931. "lsl r6, r6, #16\n\t"
  46932. "adds r3, r3, r6\n\t"
  46933. "adc r4, r4, r7\n\t"
  46934. "lsr r6, %[b], #16\n\t"
  46935. "lsr r7, r8, #16\n\t"
  46936. "mul r7, r6, r7\n\t"
  46937. "add r4, r4, r7\n\t"
  46938. "lsl r7, r8, #16\n\t"
  46939. "lsr r7, r7, #16\n\t"
  46940. "mul r6, r7, r6\n\t"
  46941. "lsr r7, r6, #16\n\t"
  46942. "lsl r6, r6, #16\n\t"
  46943. "adds r3, r3, r6\n\t"
  46944. "adc r4, r4, r7\n\t"
  46945. #else
  46946. "umlal r3, r4, %[b], r8\n\t"
  46947. #endif
  46948. "stm %[r]!, {r3}\n\t"
  46949. "mov r5, #0\n\t"
  46950. /* A[19] * B */
  46951. "ldm %[a]!, {r8}\n\t"
  46952. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  46953. "lsl r6, %[b], #16\n\t"
  46954. "lsl r7, r8, #16\n\t"
  46955. "lsr r6, r6, #16\n\t"
  46956. "lsr r7, r7, #16\n\t"
  46957. "mul r7, r6, r7\n\t"
  46958. "adds r4, r4, r7\n\t"
  46959. "adc r5, r5, #0\n\t"
  46960. "lsr r7, r8, #16\n\t"
  46961. "mul r6, r7, r6\n\t"
  46962. "lsr r7, r6, #16\n\t"
  46963. "lsl r6, r6, #16\n\t"
  46964. "adds r4, r4, r6\n\t"
  46965. "adc r5, r5, r7\n\t"
  46966. "lsr r6, %[b], #16\n\t"
  46967. "lsr r7, r8, #16\n\t"
  46968. "mul r7, r6, r7\n\t"
  46969. "add r5, r5, r7\n\t"
  46970. "lsl r7, r8, #16\n\t"
  46971. "lsr r7, r7, #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. "adc r5, r5, r7\n\t"
  46977. #else
  46978. "umlal r4, r5, %[b], r8\n\t"
  46979. #endif
  46980. "stm %[r]!, {r4}\n\t"
  46981. "mov r3, #0\n\t"
  46982. /* A[20] * B */
  46983. "ldm %[a]!, {r8}\n\t"
  46984. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  46985. "lsl r6, %[b], #16\n\t"
  46986. "lsl r7, r8, #16\n\t"
  46987. "lsr r6, r6, #16\n\t"
  46988. "lsr r7, r7, #16\n\t"
  46989. "mul r7, r6, r7\n\t"
  46990. "adds r5, r5, r7\n\t"
  46991. "adc r3, r3, #0\n\t"
  46992. "lsr r7, r8, #16\n\t"
  46993. "mul r6, r7, r6\n\t"
  46994. "lsr r7, r6, #16\n\t"
  46995. "lsl r6, r6, #16\n\t"
  46996. "adds r5, r5, r6\n\t"
  46997. "adc r3, r3, r7\n\t"
  46998. "lsr r6, %[b], #16\n\t"
  46999. "lsr r7, r8, #16\n\t"
  47000. "mul r7, r6, r7\n\t"
  47001. "add r3, r3, r7\n\t"
  47002. "lsl r7, r8, #16\n\t"
  47003. "lsr r7, r7, #16\n\t"
  47004. "mul r6, r7, r6\n\t"
  47005. "lsr r7, r6, #16\n\t"
  47006. "lsl r6, r6, #16\n\t"
  47007. "adds r5, r5, r6\n\t"
  47008. "adc r3, r3, r7\n\t"
  47009. #else
  47010. "umlal r5, r3, %[b], r8\n\t"
  47011. #endif
  47012. "stm %[r]!, {r5}\n\t"
  47013. "mov r4, #0\n\t"
  47014. /* A[21] * B */
  47015. "ldm %[a]!, {r8}\n\t"
  47016. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  47017. "lsl r6, %[b], #16\n\t"
  47018. "lsl r7, r8, #16\n\t"
  47019. "lsr r6, r6, #16\n\t"
  47020. "lsr r7, r7, #16\n\t"
  47021. "mul r7, r6, r7\n\t"
  47022. "adds r3, r3, r7\n\t"
  47023. "adc r4, r4, #0\n\t"
  47024. "lsr r7, r8, #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 r3, r3, r6\n\t"
  47029. "adc r4, r4, r7\n\t"
  47030. "lsr r6, %[b], #16\n\t"
  47031. "lsr r7, r8, #16\n\t"
  47032. "mul r7, r6, r7\n\t"
  47033. "add r4, r4, r7\n\t"
  47034. "lsl r7, r8, #16\n\t"
  47035. "lsr r7, r7, #16\n\t"
  47036. "mul r6, r7, r6\n\t"
  47037. "lsr r7, r6, #16\n\t"
  47038. "lsl r6, r6, #16\n\t"
  47039. "adds r3, r3, r6\n\t"
  47040. "adc r4, r4, r7\n\t"
  47041. #else
  47042. "umlal r3, r4, %[b], r8\n\t"
  47043. #endif
  47044. "stm %[r]!, {r3}\n\t"
  47045. "mov r5, #0\n\t"
  47046. /* A[22] * B */
  47047. "ldm %[a]!, {r8}\n\t"
  47048. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  47049. "lsl r6, %[b], #16\n\t"
  47050. "lsl r7, r8, #16\n\t"
  47051. "lsr r6, r6, #16\n\t"
  47052. "lsr r7, r7, #16\n\t"
  47053. "mul r7, r6, r7\n\t"
  47054. "adds r4, r4, r7\n\t"
  47055. "adc r5, r5, #0\n\t"
  47056. "lsr r7, r8, #16\n\t"
  47057. "mul r6, r7, r6\n\t"
  47058. "lsr r7, r6, #16\n\t"
  47059. "lsl r6, r6, #16\n\t"
  47060. "adds r4, r4, r6\n\t"
  47061. "adc r5, r5, r7\n\t"
  47062. "lsr r6, %[b], #16\n\t"
  47063. "lsr r7, r8, #16\n\t"
  47064. "mul r7, r6, r7\n\t"
  47065. "add r5, r5, r7\n\t"
  47066. "lsl r7, r8, #16\n\t"
  47067. "lsr r7, r7, #16\n\t"
  47068. "mul r6, r7, r6\n\t"
  47069. "lsr r7, r6, #16\n\t"
  47070. "lsl r6, r6, #16\n\t"
  47071. "adds r4, r4, r6\n\t"
  47072. "adc r5, r5, r7\n\t"
  47073. #else
  47074. "umlal r4, r5, %[b], r8\n\t"
  47075. #endif
  47076. "stm %[r]!, {r4}\n\t"
  47077. "mov r3, #0\n\t"
  47078. /* A[23] * B */
  47079. "ldm %[a]!, {r8}\n\t"
  47080. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  47081. "lsl r6, %[b], #16\n\t"
  47082. "lsl r7, r8, #16\n\t"
  47083. "lsr r6, r6, #16\n\t"
  47084. "lsr r7, r7, #16\n\t"
  47085. "mul r7, r6, r7\n\t"
  47086. "adds r5, r5, r7\n\t"
  47087. "adc r3, r3, #0\n\t"
  47088. "lsr r7, r8, #16\n\t"
  47089. "mul r6, r7, r6\n\t"
  47090. "lsr r7, r6, #16\n\t"
  47091. "lsl r6, r6, #16\n\t"
  47092. "adds r5, r5, r6\n\t"
  47093. "adc r3, r3, r7\n\t"
  47094. "lsr r6, %[b], #16\n\t"
  47095. "lsr r7, r8, #16\n\t"
  47096. "mul r7, r6, r7\n\t"
  47097. "add r3, r3, r7\n\t"
  47098. "lsl r7, r8, #16\n\t"
  47099. "lsr r7, r7, #16\n\t"
  47100. "mul r6, r7, r6\n\t"
  47101. "lsr r7, r6, #16\n\t"
  47102. "lsl r6, r6, #16\n\t"
  47103. "adds r5, r5, r6\n\t"
  47104. "adc r3, r3, r7\n\t"
  47105. #else
  47106. "umlal r5, r3, %[b], r8\n\t"
  47107. #endif
  47108. "stm %[r]!, {r5}\n\t"
  47109. "mov r4, #0\n\t"
  47110. /* A[24] * B */
  47111. "ldm %[a]!, {r8}\n\t"
  47112. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  47113. "lsl r6, %[b], #16\n\t"
  47114. "lsl r7, r8, #16\n\t"
  47115. "lsr r6, r6, #16\n\t"
  47116. "lsr r7, r7, #16\n\t"
  47117. "mul r7, r6, r7\n\t"
  47118. "adds r3, r3, r7\n\t"
  47119. "adc r4, r4, #0\n\t"
  47120. "lsr r7, r8, #16\n\t"
  47121. "mul r6, r7, r6\n\t"
  47122. "lsr r7, r6, #16\n\t"
  47123. "lsl r6, r6, #16\n\t"
  47124. "adds r3, r3, r6\n\t"
  47125. "adc r4, r4, r7\n\t"
  47126. "lsr r6, %[b], #16\n\t"
  47127. "lsr r7, r8, #16\n\t"
  47128. "mul r7, r6, r7\n\t"
  47129. "add r4, r4, r7\n\t"
  47130. "lsl r7, r8, #16\n\t"
  47131. "lsr r7, r7, #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 r3, r3, r6\n\t"
  47136. "adc r4, r4, r7\n\t"
  47137. #else
  47138. "umlal r3, r4, %[b], r8\n\t"
  47139. #endif
  47140. "stm %[r]!, {r3}\n\t"
  47141. "mov r5, #0\n\t"
  47142. /* A[25] * B */
  47143. "ldm %[a]!, {r8}\n\t"
  47144. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  47145. "lsl r6, %[b], #16\n\t"
  47146. "lsl r7, r8, #16\n\t"
  47147. "lsr r6, r6, #16\n\t"
  47148. "lsr r7, r7, #16\n\t"
  47149. "mul r7, r6, r7\n\t"
  47150. "adds r4, r4, r7\n\t"
  47151. "adc r5, r5, #0\n\t"
  47152. "lsr r7, r8, #16\n\t"
  47153. "mul r6, r7, r6\n\t"
  47154. "lsr r7, r6, #16\n\t"
  47155. "lsl r6, r6, #16\n\t"
  47156. "adds r4, r4, r6\n\t"
  47157. "adc r5, r5, r7\n\t"
  47158. "lsr r6, %[b], #16\n\t"
  47159. "lsr r7, r8, #16\n\t"
  47160. "mul r7, r6, r7\n\t"
  47161. "add r5, r5, r7\n\t"
  47162. "lsl r7, r8, #16\n\t"
  47163. "lsr r7, r7, #16\n\t"
  47164. "mul r6, r7, r6\n\t"
  47165. "lsr r7, r6, #16\n\t"
  47166. "lsl r6, r6, #16\n\t"
  47167. "adds r4, r4, r6\n\t"
  47168. "adc r5, r5, r7\n\t"
  47169. #else
  47170. "umlal r4, r5, %[b], r8\n\t"
  47171. #endif
  47172. "stm %[r]!, {r4}\n\t"
  47173. "mov r3, #0\n\t"
  47174. /* A[26] * B */
  47175. "ldm %[a]!, {r8}\n\t"
  47176. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  47177. "lsl r6, %[b], #16\n\t"
  47178. "lsl r7, r8, #16\n\t"
  47179. "lsr r6, r6, #16\n\t"
  47180. "lsr r7, r7, #16\n\t"
  47181. "mul r7, r6, r7\n\t"
  47182. "adds r5, r5, r7\n\t"
  47183. "adc r3, r3, #0\n\t"
  47184. "lsr r7, r8, #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 r5, r5, r6\n\t"
  47189. "adc r3, r3, r7\n\t"
  47190. "lsr r6, %[b], #16\n\t"
  47191. "lsr r7, r8, #16\n\t"
  47192. "mul r7, r6, r7\n\t"
  47193. "add r3, r3, r7\n\t"
  47194. "lsl r7, r8, #16\n\t"
  47195. "lsr r7, r7, #16\n\t"
  47196. "mul r6, r7, r6\n\t"
  47197. "lsr r7, r6, #16\n\t"
  47198. "lsl r6, r6, #16\n\t"
  47199. "adds r5, r5, r6\n\t"
  47200. "adc r3, r3, r7\n\t"
  47201. #else
  47202. "umlal r5, r3, %[b], r8\n\t"
  47203. #endif
  47204. "stm %[r]!, {r5}\n\t"
  47205. "mov r4, #0\n\t"
  47206. /* A[27] * B */
  47207. "ldm %[a]!, {r8}\n\t"
  47208. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  47209. "lsl r6, %[b], #16\n\t"
  47210. "lsl r7, r8, #16\n\t"
  47211. "lsr r6, r6, #16\n\t"
  47212. "lsr r7, r7, #16\n\t"
  47213. "mul r7, r6, r7\n\t"
  47214. "adds r3, r3, r7\n\t"
  47215. "adc r4, r4, #0\n\t"
  47216. "lsr r7, r8, #16\n\t"
  47217. "mul r6, r7, r6\n\t"
  47218. "lsr r7, r6, #16\n\t"
  47219. "lsl r6, r6, #16\n\t"
  47220. "adds r3, r3, r6\n\t"
  47221. "adc r4, r4, r7\n\t"
  47222. "lsr r6, %[b], #16\n\t"
  47223. "lsr r7, r8, #16\n\t"
  47224. "mul r7, r6, r7\n\t"
  47225. "add r4, r4, r7\n\t"
  47226. "lsl r7, r8, #16\n\t"
  47227. "lsr r7, r7, #16\n\t"
  47228. "mul r6, r7, r6\n\t"
  47229. "lsr r7, r6, #16\n\t"
  47230. "lsl r6, r6, #16\n\t"
  47231. "adds r3, r3, r6\n\t"
  47232. "adc r4, r4, r7\n\t"
  47233. #else
  47234. "umlal r3, r4, %[b], r8\n\t"
  47235. #endif
  47236. "stm %[r]!, {r3}\n\t"
  47237. "mov r5, #0\n\t"
  47238. /* A[28] * B */
  47239. "ldm %[a]!, {r8}\n\t"
  47240. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  47241. "lsl r6, %[b], #16\n\t"
  47242. "lsl r7, r8, #16\n\t"
  47243. "lsr r6, r6, #16\n\t"
  47244. "lsr r7, r7, #16\n\t"
  47245. "mul r7, r6, r7\n\t"
  47246. "adds r4, r4, r7\n\t"
  47247. "adc r5, r5, #0\n\t"
  47248. "lsr r7, r8, #16\n\t"
  47249. "mul r6, r7, r6\n\t"
  47250. "lsr r7, r6, #16\n\t"
  47251. "lsl r6, r6, #16\n\t"
  47252. "adds r4, r4, r6\n\t"
  47253. "adc r5, r5, r7\n\t"
  47254. "lsr r6, %[b], #16\n\t"
  47255. "lsr r7, r8, #16\n\t"
  47256. "mul r7, r6, r7\n\t"
  47257. "add r5, r5, r7\n\t"
  47258. "lsl r7, r8, #16\n\t"
  47259. "lsr r7, r7, #16\n\t"
  47260. "mul r6, r7, r6\n\t"
  47261. "lsr r7, r6, #16\n\t"
  47262. "lsl r6, r6, #16\n\t"
  47263. "adds r4, r4, r6\n\t"
  47264. "adc r5, r5, r7\n\t"
  47265. #else
  47266. "umlal r4, r5, %[b], r8\n\t"
  47267. #endif
  47268. "stm %[r]!, {r4}\n\t"
  47269. "mov r3, #0\n\t"
  47270. /* A[29] * B */
  47271. "ldm %[a]!, {r8}\n\t"
  47272. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  47273. "lsl r6, %[b], #16\n\t"
  47274. "lsl r7, r8, #16\n\t"
  47275. "lsr r6, r6, #16\n\t"
  47276. "lsr r7, r7, #16\n\t"
  47277. "mul r7, r6, r7\n\t"
  47278. "adds r5, r5, r7\n\t"
  47279. "adc r3, r3, #0\n\t"
  47280. "lsr r7, r8, #16\n\t"
  47281. "mul r6, r7, r6\n\t"
  47282. "lsr r7, r6, #16\n\t"
  47283. "lsl r6, r6, #16\n\t"
  47284. "adds r5, r5, r6\n\t"
  47285. "adc r3, r3, r7\n\t"
  47286. "lsr r6, %[b], #16\n\t"
  47287. "lsr r7, r8, #16\n\t"
  47288. "mul r7, r6, r7\n\t"
  47289. "add r3, r3, r7\n\t"
  47290. "lsl r7, r8, #16\n\t"
  47291. "lsr r7, r7, #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 r5, r5, r6\n\t"
  47296. "adc r3, r3, r7\n\t"
  47297. #else
  47298. "umlal r5, r3, %[b], r8\n\t"
  47299. #endif
  47300. "stm %[r]!, {r5}\n\t"
  47301. "mov r4, #0\n\t"
  47302. /* A[30] * B */
  47303. "ldm %[a]!, {r8}\n\t"
  47304. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  47305. "lsl r6, %[b], #16\n\t"
  47306. "lsl r7, r8, #16\n\t"
  47307. "lsr r6, r6, #16\n\t"
  47308. "lsr r7, r7, #16\n\t"
  47309. "mul r7, r6, r7\n\t"
  47310. "adds r3, r3, r7\n\t"
  47311. "adc r4, r4, #0\n\t"
  47312. "lsr r7, r8, #16\n\t"
  47313. "mul r6, r7, r6\n\t"
  47314. "lsr r7, r6, #16\n\t"
  47315. "lsl r6, r6, #16\n\t"
  47316. "adds r3, r3, r6\n\t"
  47317. "adc r4, r4, r7\n\t"
  47318. "lsr r6, %[b], #16\n\t"
  47319. "lsr r7, r8, #16\n\t"
  47320. "mul r7, r6, r7\n\t"
  47321. "add r4, r4, r7\n\t"
  47322. "lsl r7, r8, #16\n\t"
  47323. "lsr r7, r7, #16\n\t"
  47324. "mul r6, r7, r6\n\t"
  47325. "lsr r7, r6, #16\n\t"
  47326. "lsl r6, r6, #16\n\t"
  47327. "adds r3, r3, r6\n\t"
  47328. "adc r4, r4, r7\n\t"
  47329. #else
  47330. "umlal r3, r4, %[b], r8\n\t"
  47331. #endif
  47332. "stm %[r]!, {r3}\n\t"
  47333. "mov r5, #0\n\t"
  47334. /* A[31] * B */
  47335. "ldm %[a]!, {r8}\n\t"
  47336. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  47337. "lsl r6, %[b], #16\n\t"
  47338. "lsl r7, r8, #16\n\t"
  47339. "lsr r6, r6, #16\n\t"
  47340. "lsr r7, r7, #16\n\t"
  47341. "mul r7, r6, r7\n\t"
  47342. "adds r4, r4, r7\n\t"
  47343. "adc r5, r5, #0\n\t"
  47344. "lsr r7, r8, #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. "adc r5, r5, r7\n\t"
  47350. "lsr r6, %[b], #16\n\t"
  47351. "lsr r7, r8, #16\n\t"
  47352. "mul r7, r6, r7\n\t"
  47353. "add r5, r5, r7\n\t"
  47354. "lsl r7, r8, #16\n\t"
  47355. "lsr r7, r7, #16\n\t"
  47356. "mul r6, r7, r6\n\t"
  47357. "lsr r7, r6, #16\n\t"
  47358. "lsl r6, r6, #16\n\t"
  47359. "adds r4, r4, r6\n\t"
  47360. "adc r5, r5, r7\n\t"
  47361. #else
  47362. "umlal r4, r5, %[b], r8\n\t"
  47363. #endif
  47364. "stm %[r]!, {r4}\n\t"
  47365. "mov r3, #0\n\t"
  47366. /* A[32] * B */
  47367. "ldm %[a]!, {r8}\n\t"
  47368. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  47369. "lsl r6, %[b], #16\n\t"
  47370. "lsl r7, r8, #16\n\t"
  47371. "lsr r6, r6, #16\n\t"
  47372. "lsr r7, r7, #16\n\t"
  47373. "mul r7, r6, r7\n\t"
  47374. "adds r5, r5, r7\n\t"
  47375. "adc r3, r3, #0\n\t"
  47376. "lsr r7, r8, #16\n\t"
  47377. "mul r6, r7, r6\n\t"
  47378. "lsr r7, r6, #16\n\t"
  47379. "lsl r6, r6, #16\n\t"
  47380. "adds r5, r5, r6\n\t"
  47381. "adc r3, r3, r7\n\t"
  47382. "lsr r6, %[b], #16\n\t"
  47383. "lsr r7, r8, #16\n\t"
  47384. "mul r7, r6, r7\n\t"
  47385. "add r3, r3, r7\n\t"
  47386. "lsl r7, r8, #16\n\t"
  47387. "lsr r7, r7, #16\n\t"
  47388. "mul r6, r7, r6\n\t"
  47389. "lsr r7, r6, #16\n\t"
  47390. "lsl r6, r6, #16\n\t"
  47391. "adds r5, r5, r6\n\t"
  47392. "adc r3, r3, r7\n\t"
  47393. #else
  47394. "umlal r5, r3, %[b], r8\n\t"
  47395. #endif
  47396. "stm %[r]!, {r5}\n\t"
  47397. "mov r4, #0\n\t"
  47398. /* A[33] * B */
  47399. "ldm %[a]!, {r8}\n\t"
  47400. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  47401. "lsl r6, %[b], #16\n\t"
  47402. "lsl r7, r8, #16\n\t"
  47403. "lsr r6, r6, #16\n\t"
  47404. "lsr r7, r7, #16\n\t"
  47405. "mul r7, r6, r7\n\t"
  47406. "adds r3, r3, r7\n\t"
  47407. "adc r4, r4, #0\n\t"
  47408. "lsr r7, r8, #16\n\t"
  47409. "mul r6, r7, r6\n\t"
  47410. "lsr r7, r6, #16\n\t"
  47411. "lsl r6, r6, #16\n\t"
  47412. "adds r3, r3, r6\n\t"
  47413. "adc r4, r4, r7\n\t"
  47414. "lsr r6, %[b], #16\n\t"
  47415. "lsr r7, r8, #16\n\t"
  47416. "mul r7, r6, r7\n\t"
  47417. "add r4, r4, r7\n\t"
  47418. "lsl r7, r8, #16\n\t"
  47419. "lsr r7, r7, #16\n\t"
  47420. "mul r6, r7, r6\n\t"
  47421. "lsr r7, r6, #16\n\t"
  47422. "lsl r6, r6, #16\n\t"
  47423. "adds r3, r3, r6\n\t"
  47424. "adc r4, r4, r7\n\t"
  47425. #else
  47426. "umlal r3, r4, %[b], r8\n\t"
  47427. #endif
  47428. "stm %[r]!, {r3}\n\t"
  47429. "mov r5, #0\n\t"
  47430. /* A[34] * B */
  47431. "ldm %[a]!, {r8}\n\t"
  47432. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  47433. "lsl r6, %[b], #16\n\t"
  47434. "lsl r7, r8, #16\n\t"
  47435. "lsr r6, r6, #16\n\t"
  47436. "lsr r7, r7, #16\n\t"
  47437. "mul r7, r6, r7\n\t"
  47438. "adds r4, r4, r7\n\t"
  47439. "adc r5, r5, #0\n\t"
  47440. "lsr r7, r8, #16\n\t"
  47441. "mul r6, r7, r6\n\t"
  47442. "lsr r7, r6, #16\n\t"
  47443. "lsl r6, r6, #16\n\t"
  47444. "adds r4, r4, r6\n\t"
  47445. "adc r5, r5, r7\n\t"
  47446. "lsr r6, %[b], #16\n\t"
  47447. "lsr r7, r8, #16\n\t"
  47448. "mul r7, r6, r7\n\t"
  47449. "add r5, r5, r7\n\t"
  47450. "lsl r7, r8, #16\n\t"
  47451. "lsr r7, r7, #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. "adc r5, r5, r7\n\t"
  47457. #else
  47458. "umlal r4, r5, %[b], r8\n\t"
  47459. #endif
  47460. "stm %[r]!, {r4}\n\t"
  47461. "mov r3, #0\n\t"
  47462. /* A[35] * B */
  47463. "ldm %[a]!, {r8}\n\t"
  47464. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  47465. "lsl r6, %[b], #16\n\t"
  47466. "lsl r7, r8, #16\n\t"
  47467. "lsr r6, r6, #16\n\t"
  47468. "lsr r7, r7, #16\n\t"
  47469. "mul r7, r6, r7\n\t"
  47470. "adds r5, r5, r7\n\t"
  47471. "adc r3, r3, #0\n\t"
  47472. "lsr r7, r8, #16\n\t"
  47473. "mul r6, r7, r6\n\t"
  47474. "lsr r7, r6, #16\n\t"
  47475. "lsl r6, r6, #16\n\t"
  47476. "adds r5, r5, r6\n\t"
  47477. "adc r3, r3, r7\n\t"
  47478. "lsr r6, %[b], #16\n\t"
  47479. "lsr r7, r8, #16\n\t"
  47480. "mul r7, r6, r7\n\t"
  47481. "add r3, r3, r7\n\t"
  47482. "lsl r7, r8, #16\n\t"
  47483. "lsr r7, r7, #16\n\t"
  47484. "mul r6, r7, r6\n\t"
  47485. "lsr r7, r6, #16\n\t"
  47486. "lsl r6, r6, #16\n\t"
  47487. "adds r5, r5, r6\n\t"
  47488. "adc r3, r3, r7\n\t"
  47489. #else
  47490. "umlal r5, r3, %[b], r8\n\t"
  47491. #endif
  47492. "stm %[r]!, {r5}\n\t"
  47493. "mov r4, #0\n\t"
  47494. /* A[36] * B */
  47495. "ldm %[a]!, {r8}\n\t"
  47496. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  47497. "lsl r6, %[b], #16\n\t"
  47498. "lsl r7, r8, #16\n\t"
  47499. "lsr r6, r6, #16\n\t"
  47500. "lsr r7, r7, #16\n\t"
  47501. "mul r7, r6, r7\n\t"
  47502. "adds r3, r3, r7\n\t"
  47503. "adc r4, r4, #0\n\t"
  47504. "lsr r7, r8, #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 r3, r3, r6\n\t"
  47509. "adc r4, r4, r7\n\t"
  47510. "lsr r6, %[b], #16\n\t"
  47511. "lsr r7, r8, #16\n\t"
  47512. "mul r7, r6, r7\n\t"
  47513. "add r4, r4, r7\n\t"
  47514. "lsl r7, r8, #16\n\t"
  47515. "lsr r7, r7, #16\n\t"
  47516. "mul r6, r7, r6\n\t"
  47517. "lsr r7, r6, #16\n\t"
  47518. "lsl r6, r6, #16\n\t"
  47519. "adds r3, r3, r6\n\t"
  47520. "adc r4, r4, r7\n\t"
  47521. #else
  47522. "umlal r3, r4, %[b], r8\n\t"
  47523. #endif
  47524. "stm %[r]!, {r3}\n\t"
  47525. "mov r5, #0\n\t"
  47526. /* A[37] * B */
  47527. "ldm %[a]!, {r8}\n\t"
  47528. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  47529. "lsl r6, %[b], #16\n\t"
  47530. "lsl r7, r8, #16\n\t"
  47531. "lsr r6, r6, #16\n\t"
  47532. "lsr r7, r7, #16\n\t"
  47533. "mul r7, r6, r7\n\t"
  47534. "adds r4, r4, r7\n\t"
  47535. "adc r5, r5, #0\n\t"
  47536. "lsr r7, r8, #16\n\t"
  47537. "mul r6, r7, r6\n\t"
  47538. "lsr r7, r6, #16\n\t"
  47539. "lsl r6, r6, #16\n\t"
  47540. "adds r4, r4, r6\n\t"
  47541. "adc r5, r5, r7\n\t"
  47542. "lsr r6, %[b], #16\n\t"
  47543. "lsr r7, r8, #16\n\t"
  47544. "mul r7, r6, r7\n\t"
  47545. "add r5, r5, r7\n\t"
  47546. "lsl r7, r8, #16\n\t"
  47547. "lsr r7, r7, #16\n\t"
  47548. "mul r6, r7, r6\n\t"
  47549. "lsr r7, r6, #16\n\t"
  47550. "lsl r6, r6, #16\n\t"
  47551. "adds r4, r4, r6\n\t"
  47552. "adc r5, r5, r7\n\t"
  47553. #else
  47554. "umlal r4, r5, %[b], r8\n\t"
  47555. #endif
  47556. "stm %[r]!, {r4}\n\t"
  47557. "mov r3, #0\n\t"
  47558. /* A[38] * B */
  47559. "ldm %[a]!, {r8}\n\t"
  47560. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  47561. "lsl r6, %[b], #16\n\t"
  47562. "lsl r7, r8, #16\n\t"
  47563. "lsr r6, r6, #16\n\t"
  47564. "lsr r7, r7, #16\n\t"
  47565. "mul r7, r6, r7\n\t"
  47566. "adds r5, r5, r7\n\t"
  47567. "adc r3, r3, #0\n\t"
  47568. "lsr r7, r8, #16\n\t"
  47569. "mul r6, r7, r6\n\t"
  47570. "lsr r7, r6, #16\n\t"
  47571. "lsl r6, r6, #16\n\t"
  47572. "adds r5, r5, r6\n\t"
  47573. "adc r3, r3, r7\n\t"
  47574. "lsr r6, %[b], #16\n\t"
  47575. "lsr r7, r8, #16\n\t"
  47576. "mul r7, r6, r7\n\t"
  47577. "add r3, r3, r7\n\t"
  47578. "lsl r7, r8, #16\n\t"
  47579. "lsr r7, r7, #16\n\t"
  47580. "mul r6, r7, r6\n\t"
  47581. "lsr r7, r6, #16\n\t"
  47582. "lsl r6, r6, #16\n\t"
  47583. "adds r5, r5, r6\n\t"
  47584. "adc r3, r3, r7\n\t"
  47585. #else
  47586. "umlal r5, r3, %[b], r8\n\t"
  47587. #endif
  47588. "stm %[r]!, {r5}\n\t"
  47589. "mov r4, #0\n\t"
  47590. /* A[39] * B */
  47591. "ldm %[a]!, {r8}\n\t"
  47592. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  47593. "lsl r6, %[b], #16\n\t"
  47594. "lsl r7, r8, #16\n\t"
  47595. "lsr r6, r6, #16\n\t"
  47596. "lsr r7, r7, #16\n\t"
  47597. "mul r7, r6, r7\n\t"
  47598. "adds r3, r3, r7\n\t"
  47599. "adc r4, r4, #0\n\t"
  47600. "lsr r7, r8, #16\n\t"
  47601. "mul r6, r7, r6\n\t"
  47602. "lsr r7, r6, #16\n\t"
  47603. "lsl r6, r6, #16\n\t"
  47604. "adds r3, r3, r6\n\t"
  47605. "adc r4, r4, r7\n\t"
  47606. "lsr r6, %[b], #16\n\t"
  47607. "lsr r7, r8, #16\n\t"
  47608. "mul r7, r6, r7\n\t"
  47609. "add r4, r4, r7\n\t"
  47610. "lsl r7, r8, #16\n\t"
  47611. "lsr r7, r7, #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 r3, r3, r6\n\t"
  47616. "adc r4, r4, r7\n\t"
  47617. #else
  47618. "umlal r3, r4, %[b], r8\n\t"
  47619. #endif
  47620. "stm %[r]!, {r3}\n\t"
  47621. "mov r5, #0\n\t"
  47622. /* A[40] * B */
  47623. "ldm %[a]!, {r8}\n\t"
  47624. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  47625. "lsl r6, %[b], #16\n\t"
  47626. "lsl r7, r8, #16\n\t"
  47627. "lsr r6, r6, #16\n\t"
  47628. "lsr r7, r7, #16\n\t"
  47629. "mul r7, r6, r7\n\t"
  47630. "adds r4, r4, r7\n\t"
  47631. "adc r5, r5, #0\n\t"
  47632. "lsr r7, r8, #16\n\t"
  47633. "mul r6, r7, r6\n\t"
  47634. "lsr r7, r6, #16\n\t"
  47635. "lsl r6, r6, #16\n\t"
  47636. "adds r4, r4, r6\n\t"
  47637. "adc r5, r5, r7\n\t"
  47638. "lsr r6, %[b], #16\n\t"
  47639. "lsr r7, r8, #16\n\t"
  47640. "mul r7, r6, r7\n\t"
  47641. "add r5, r5, r7\n\t"
  47642. "lsl r7, r8, #16\n\t"
  47643. "lsr r7, r7, #16\n\t"
  47644. "mul r6, r7, r6\n\t"
  47645. "lsr r7, r6, #16\n\t"
  47646. "lsl r6, r6, #16\n\t"
  47647. "adds r4, r4, r6\n\t"
  47648. "adc r5, r5, r7\n\t"
  47649. #else
  47650. "umlal r4, r5, %[b], r8\n\t"
  47651. #endif
  47652. "stm %[r]!, {r4}\n\t"
  47653. "mov r3, #0\n\t"
  47654. /* A[41] * B */
  47655. "ldm %[a]!, {r8}\n\t"
  47656. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  47657. "lsl r6, %[b], #16\n\t"
  47658. "lsl r7, r8, #16\n\t"
  47659. "lsr r6, r6, #16\n\t"
  47660. "lsr r7, r7, #16\n\t"
  47661. "mul r7, r6, r7\n\t"
  47662. "adds r5, r5, r7\n\t"
  47663. "adc r3, r3, #0\n\t"
  47664. "lsr r7, r8, #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 r5, r5, r6\n\t"
  47669. "adc r3, r3, r7\n\t"
  47670. "lsr r6, %[b], #16\n\t"
  47671. "lsr r7, r8, #16\n\t"
  47672. "mul r7, r6, r7\n\t"
  47673. "add r3, r3, r7\n\t"
  47674. "lsl r7, r8, #16\n\t"
  47675. "lsr r7, r7, #16\n\t"
  47676. "mul r6, r7, r6\n\t"
  47677. "lsr r7, r6, #16\n\t"
  47678. "lsl r6, r6, #16\n\t"
  47679. "adds r5, r5, r6\n\t"
  47680. "adc r3, r3, r7\n\t"
  47681. #else
  47682. "umlal r5, r3, %[b], r8\n\t"
  47683. #endif
  47684. "stm %[r]!, {r5}\n\t"
  47685. "mov r4, #0\n\t"
  47686. /* A[42] * B */
  47687. "ldm %[a]!, {r8}\n\t"
  47688. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  47689. "lsl r6, %[b], #16\n\t"
  47690. "lsl r7, r8, #16\n\t"
  47691. "lsr r6, r6, #16\n\t"
  47692. "lsr r7, r7, #16\n\t"
  47693. "mul r7, r6, r7\n\t"
  47694. "adds r3, r3, r7\n\t"
  47695. "adc r4, r4, #0\n\t"
  47696. "lsr r7, r8, #16\n\t"
  47697. "mul r6, r7, r6\n\t"
  47698. "lsr r7, r6, #16\n\t"
  47699. "lsl r6, r6, #16\n\t"
  47700. "adds r3, r3, r6\n\t"
  47701. "adc r4, r4, r7\n\t"
  47702. "lsr r6, %[b], #16\n\t"
  47703. "lsr r7, r8, #16\n\t"
  47704. "mul r7, r6, r7\n\t"
  47705. "add r4, r4, r7\n\t"
  47706. "lsl r7, r8, #16\n\t"
  47707. "lsr r7, r7, #16\n\t"
  47708. "mul r6, r7, r6\n\t"
  47709. "lsr r7, r6, #16\n\t"
  47710. "lsl r6, r6, #16\n\t"
  47711. "adds r3, r3, r6\n\t"
  47712. "adc r4, r4, r7\n\t"
  47713. #else
  47714. "umlal r3, r4, %[b], r8\n\t"
  47715. #endif
  47716. "stm %[r]!, {r3}\n\t"
  47717. "mov r5, #0\n\t"
  47718. /* A[43] * B */
  47719. "ldm %[a]!, {r8}\n\t"
  47720. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  47721. "lsl r6, %[b], #16\n\t"
  47722. "lsl r7, r8, #16\n\t"
  47723. "lsr r6, r6, #16\n\t"
  47724. "lsr r7, r7, #16\n\t"
  47725. "mul r7, r6, r7\n\t"
  47726. "adds r4, r4, r7\n\t"
  47727. "adc r5, r5, #0\n\t"
  47728. "lsr r7, r8, #16\n\t"
  47729. "mul r6, r7, r6\n\t"
  47730. "lsr r7, r6, #16\n\t"
  47731. "lsl r6, r6, #16\n\t"
  47732. "adds r4, r4, r6\n\t"
  47733. "adc r5, r5, r7\n\t"
  47734. "lsr r6, %[b], #16\n\t"
  47735. "lsr r7, r8, #16\n\t"
  47736. "mul r7, r6, r7\n\t"
  47737. "add r5, r5, r7\n\t"
  47738. "lsl r7, r8, #16\n\t"
  47739. "lsr r7, r7, #16\n\t"
  47740. "mul r6, r7, r6\n\t"
  47741. "lsr r7, r6, #16\n\t"
  47742. "lsl r6, r6, #16\n\t"
  47743. "adds r4, r4, r6\n\t"
  47744. "adc r5, r5, r7\n\t"
  47745. #else
  47746. "umlal r4, r5, %[b], r8\n\t"
  47747. #endif
  47748. "stm %[r]!, {r4}\n\t"
  47749. "mov r3, #0\n\t"
  47750. /* A[44] * B */
  47751. "ldm %[a]!, {r8}\n\t"
  47752. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  47753. "lsl r6, %[b], #16\n\t"
  47754. "lsl r7, r8, #16\n\t"
  47755. "lsr r6, r6, #16\n\t"
  47756. "lsr r7, r7, #16\n\t"
  47757. "mul r7, r6, r7\n\t"
  47758. "adds r5, r5, r7\n\t"
  47759. "adc r3, r3, #0\n\t"
  47760. "lsr r7, r8, #16\n\t"
  47761. "mul r6, r7, r6\n\t"
  47762. "lsr r7, r6, #16\n\t"
  47763. "lsl r6, r6, #16\n\t"
  47764. "adds r5, r5, r6\n\t"
  47765. "adc r3, r3, r7\n\t"
  47766. "lsr r6, %[b], #16\n\t"
  47767. "lsr r7, r8, #16\n\t"
  47768. "mul r7, r6, r7\n\t"
  47769. "add r3, r3, r7\n\t"
  47770. "lsl r7, r8, #16\n\t"
  47771. "lsr r7, r7, #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 r5, r5, r6\n\t"
  47776. "adc r3, r3, r7\n\t"
  47777. #else
  47778. "umlal r5, r3, %[b], r8\n\t"
  47779. #endif
  47780. "stm %[r]!, {r5}\n\t"
  47781. "mov r4, #0\n\t"
  47782. /* A[45] * B */
  47783. "ldm %[a]!, {r8}\n\t"
  47784. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  47785. "lsl r6, %[b], #16\n\t"
  47786. "lsl r7, r8, #16\n\t"
  47787. "lsr r6, r6, #16\n\t"
  47788. "lsr r7, r7, #16\n\t"
  47789. "mul r7, r6, r7\n\t"
  47790. "adds r3, r3, r7\n\t"
  47791. "adc r4, r4, #0\n\t"
  47792. "lsr r7, r8, #16\n\t"
  47793. "mul r6, r7, r6\n\t"
  47794. "lsr r7, r6, #16\n\t"
  47795. "lsl r6, r6, #16\n\t"
  47796. "adds r3, r3, r6\n\t"
  47797. "adc r4, r4, r7\n\t"
  47798. "lsr r6, %[b], #16\n\t"
  47799. "lsr r7, r8, #16\n\t"
  47800. "mul r7, r6, r7\n\t"
  47801. "add r4, r4, r7\n\t"
  47802. "lsl r7, r8, #16\n\t"
  47803. "lsr r7, r7, #16\n\t"
  47804. "mul r6, r7, r6\n\t"
  47805. "lsr r7, r6, #16\n\t"
  47806. "lsl r6, r6, #16\n\t"
  47807. "adds r3, r3, r6\n\t"
  47808. "adc r4, r4, r7\n\t"
  47809. #else
  47810. "umlal r3, r4, %[b], r8\n\t"
  47811. #endif
  47812. "stm %[r]!, {r3}\n\t"
  47813. "mov r5, #0\n\t"
  47814. /* A[46] * B */
  47815. "ldm %[a]!, {r8}\n\t"
  47816. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  47817. "lsl r6, %[b], #16\n\t"
  47818. "lsl r7, r8, #16\n\t"
  47819. "lsr r6, r6, #16\n\t"
  47820. "lsr r7, r7, #16\n\t"
  47821. "mul r7, r6, r7\n\t"
  47822. "adds r4, r4, r7\n\t"
  47823. "adc r5, r5, #0\n\t"
  47824. "lsr r7, r8, #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. "adc r5, r5, r7\n\t"
  47830. "lsr r6, %[b], #16\n\t"
  47831. "lsr r7, r8, #16\n\t"
  47832. "mul r7, r6, r7\n\t"
  47833. "add r5, r5, r7\n\t"
  47834. "lsl r7, r8, #16\n\t"
  47835. "lsr r7, r7, #16\n\t"
  47836. "mul r6, r7, r6\n\t"
  47837. "lsr r7, r6, #16\n\t"
  47838. "lsl r6, r6, #16\n\t"
  47839. "adds r4, r4, r6\n\t"
  47840. "adc r5, r5, r7\n\t"
  47841. #else
  47842. "umlal r4, r5, %[b], r8\n\t"
  47843. #endif
  47844. "stm %[r]!, {r4}\n\t"
  47845. "mov r3, #0\n\t"
  47846. /* A[47] * B */
  47847. "ldm %[a]!, {r8}\n\t"
  47848. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  47849. "lsl r6, %[b], #16\n\t"
  47850. "lsl r7, r8, #16\n\t"
  47851. "lsr r6, r6, #16\n\t"
  47852. "lsr r7, r7, #16\n\t"
  47853. "mul r7, r6, r7\n\t"
  47854. "adds r5, r5, r7\n\t"
  47855. "adc r3, r3, #0\n\t"
  47856. "lsr r7, r8, #16\n\t"
  47857. "mul r6, r7, r6\n\t"
  47858. "lsr r7, r6, #16\n\t"
  47859. "lsl r6, r6, #16\n\t"
  47860. "adds r5, r5, r6\n\t"
  47861. "adc r3, r3, r7\n\t"
  47862. "lsr r6, %[b], #16\n\t"
  47863. "lsr r7, r8, #16\n\t"
  47864. "mul r7, r6, r7\n\t"
  47865. "add r3, r3, r7\n\t"
  47866. "lsl r7, r8, #16\n\t"
  47867. "lsr r7, r7, #16\n\t"
  47868. "mul r6, r7, r6\n\t"
  47869. "lsr r7, r6, #16\n\t"
  47870. "lsl r6, r6, #16\n\t"
  47871. "adds r5, r5, r6\n\t"
  47872. "adc r3, r3, r7\n\t"
  47873. #else
  47874. "umlal r5, r3, %[b], r8\n\t"
  47875. #endif
  47876. "stm %[r]!, {r5}\n\t"
  47877. "mov r4, #0\n\t"
  47878. /* A[48] * B */
  47879. "ldm %[a]!, {r8}\n\t"
  47880. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  47881. "lsl r6, %[b], #16\n\t"
  47882. "lsl r7, r8, #16\n\t"
  47883. "lsr r6, r6, #16\n\t"
  47884. "lsr r7, r7, #16\n\t"
  47885. "mul r7, r6, r7\n\t"
  47886. "adds r3, r3, r7\n\t"
  47887. "adc r4, r4, #0\n\t"
  47888. "lsr r7, r8, #16\n\t"
  47889. "mul r6, r7, r6\n\t"
  47890. "lsr r7, r6, #16\n\t"
  47891. "lsl r6, r6, #16\n\t"
  47892. "adds r3, r3, r6\n\t"
  47893. "adc r4, r4, r7\n\t"
  47894. "lsr r6, %[b], #16\n\t"
  47895. "lsr r7, r8, #16\n\t"
  47896. "mul r7, r6, r7\n\t"
  47897. "add r4, r4, r7\n\t"
  47898. "lsl r7, r8, #16\n\t"
  47899. "lsr r7, r7, #16\n\t"
  47900. "mul r6, r7, r6\n\t"
  47901. "lsr r7, r6, #16\n\t"
  47902. "lsl r6, r6, #16\n\t"
  47903. "adds r3, r3, r6\n\t"
  47904. "adc r4, r4, r7\n\t"
  47905. #else
  47906. "umlal r3, r4, %[b], r8\n\t"
  47907. #endif
  47908. "stm %[r]!, {r3}\n\t"
  47909. "mov r5, #0\n\t"
  47910. /* A[49] * B */
  47911. "ldm %[a]!, {r8}\n\t"
  47912. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  47913. "lsl r6, %[b], #16\n\t"
  47914. "lsl r7, r8, #16\n\t"
  47915. "lsr r6, r6, #16\n\t"
  47916. "lsr r7, r7, #16\n\t"
  47917. "mul r7, r6, r7\n\t"
  47918. "adds r4, r4, r7\n\t"
  47919. "adc r5, r5, #0\n\t"
  47920. "lsr r7, r8, #16\n\t"
  47921. "mul r6, r7, r6\n\t"
  47922. "lsr r7, r6, #16\n\t"
  47923. "lsl r6, r6, #16\n\t"
  47924. "adds r4, r4, r6\n\t"
  47925. "adc r5, r5, r7\n\t"
  47926. "lsr r6, %[b], #16\n\t"
  47927. "lsr r7, r8, #16\n\t"
  47928. "mul r7, r6, r7\n\t"
  47929. "add r5, r5, r7\n\t"
  47930. "lsl r7, r8, #16\n\t"
  47931. "lsr r7, r7, #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. "adc r5, r5, r7\n\t"
  47937. #else
  47938. "umlal r4, r5, %[b], r8\n\t"
  47939. #endif
  47940. "stm %[r]!, {r4}\n\t"
  47941. "mov r3, #0\n\t"
  47942. /* A[50] * B */
  47943. "ldm %[a]!, {r8}\n\t"
  47944. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  47945. "lsl r6, %[b], #16\n\t"
  47946. "lsl r7, r8, #16\n\t"
  47947. "lsr r6, r6, #16\n\t"
  47948. "lsr r7, r7, #16\n\t"
  47949. "mul r7, r6, r7\n\t"
  47950. "adds r5, r5, r7\n\t"
  47951. "adc r3, r3, #0\n\t"
  47952. "lsr r7, r8, #16\n\t"
  47953. "mul r6, r7, r6\n\t"
  47954. "lsr r7, r6, #16\n\t"
  47955. "lsl r6, r6, #16\n\t"
  47956. "adds r5, r5, r6\n\t"
  47957. "adc r3, r3, r7\n\t"
  47958. "lsr r6, %[b], #16\n\t"
  47959. "lsr r7, r8, #16\n\t"
  47960. "mul r7, r6, r7\n\t"
  47961. "add r3, r3, r7\n\t"
  47962. "lsl r7, r8, #16\n\t"
  47963. "lsr r7, r7, #16\n\t"
  47964. "mul r6, r7, r6\n\t"
  47965. "lsr r7, r6, #16\n\t"
  47966. "lsl r6, r6, #16\n\t"
  47967. "adds r5, r5, r6\n\t"
  47968. "adc r3, r3, r7\n\t"
  47969. #else
  47970. "umlal r5, r3, %[b], r8\n\t"
  47971. #endif
  47972. "stm %[r]!, {r5}\n\t"
  47973. "mov r4, #0\n\t"
  47974. /* A[51] * B */
  47975. "ldm %[a]!, {r8}\n\t"
  47976. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  47977. "lsl r6, %[b], #16\n\t"
  47978. "lsl r7, r8, #16\n\t"
  47979. "lsr r6, r6, #16\n\t"
  47980. "lsr r7, r7, #16\n\t"
  47981. "mul r7, r6, r7\n\t"
  47982. "adds r3, r3, r7\n\t"
  47983. "adc r4, r4, #0\n\t"
  47984. "lsr r7, r8, #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 r3, r3, r6\n\t"
  47989. "adc r4, r4, r7\n\t"
  47990. "lsr r6, %[b], #16\n\t"
  47991. "lsr r7, r8, #16\n\t"
  47992. "mul r7, r6, r7\n\t"
  47993. "add r4, r4, r7\n\t"
  47994. "lsl r7, r8, #16\n\t"
  47995. "lsr r7, r7, #16\n\t"
  47996. "mul r6, r7, r6\n\t"
  47997. "lsr r7, r6, #16\n\t"
  47998. "lsl r6, r6, #16\n\t"
  47999. "adds r3, r3, r6\n\t"
  48000. "adc r4, r4, r7\n\t"
  48001. #else
  48002. "umlal r3, r4, %[b], r8\n\t"
  48003. #endif
  48004. "stm %[r]!, {r3}\n\t"
  48005. "mov r5, #0\n\t"
  48006. /* A[52] * B */
  48007. "ldm %[a]!, {r8}\n\t"
  48008. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  48009. "lsl r6, %[b], #16\n\t"
  48010. "lsl r7, r8, #16\n\t"
  48011. "lsr r6, r6, #16\n\t"
  48012. "lsr r7, r7, #16\n\t"
  48013. "mul r7, r6, r7\n\t"
  48014. "adds r4, r4, r7\n\t"
  48015. "adc r5, r5, #0\n\t"
  48016. "lsr r7, r8, #16\n\t"
  48017. "mul r6, r7, r6\n\t"
  48018. "lsr r7, r6, #16\n\t"
  48019. "lsl r6, r6, #16\n\t"
  48020. "adds r4, r4, r6\n\t"
  48021. "adc r5, r5, r7\n\t"
  48022. "lsr r6, %[b], #16\n\t"
  48023. "lsr r7, r8, #16\n\t"
  48024. "mul r7, r6, r7\n\t"
  48025. "add r5, r5, r7\n\t"
  48026. "lsl r7, r8, #16\n\t"
  48027. "lsr r7, r7, #16\n\t"
  48028. "mul r6, r7, r6\n\t"
  48029. "lsr r7, r6, #16\n\t"
  48030. "lsl r6, r6, #16\n\t"
  48031. "adds r4, r4, r6\n\t"
  48032. "adc r5, r5, r7\n\t"
  48033. #else
  48034. "umlal r4, r5, %[b], r8\n\t"
  48035. #endif
  48036. "stm %[r]!, {r4}\n\t"
  48037. "mov r3, #0\n\t"
  48038. /* A[53] * B */
  48039. "ldm %[a]!, {r8}\n\t"
  48040. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  48041. "lsl r6, %[b], #16\n\t"
  48042. "lsl r7, r8, #16\n\t"
  48043. "lsr r6, r6, #16\n\t"
  48044. "lsr r7, r7, #16\n\t"
  48045. "mul r7, r6, r7\n\t"
  48046. "adds r5, r5, r7\n\t"
  48047. "adc r3, r3, #0\n\t"
  48048. "lsr r7, r8, #16\n\t"
  48049. "mul r6, r7, r6\n\t"
  48050. "lsr r7, r6, #16\n\t"
  48051. "lsl r6, r6, #16\n\t"
  48052. "adds r5, r5, r6\n\t"
  48053. "adc r3, r3, r7\n\t"
  48054. "lsr r6, %[b], #16\n\t"
  48055. "lsr r7, r8, #16\n\t"
  48056. "mul r7, r6, r7\n\t"
  48057. "add r3, r3, r7\n\t"
  48058. "lsl r7, r8, #16\n\t"
  48059. "lsr r7, r7, #16\n\t"
  48060. "mul r6, r7, r6\n\t"
  48061. "lsr r7, r6, #16\n\t"
  48062. "lsl r6, r6, #16\n\t"
  48063. "adds r5, r5, r6\n\t"
  48064. "adc r3, r3, r7\n\t"
  48065. #else
  48066. "umlal r5, r3, %[b], r8\n\t"
  48067. #endif
  48068. "stm %[r]!, {r5}\n\t"
  48069. "mov r4, #0\n\t"
  48070. /* A[54] * B */
  48071. "ldm %[a]!, {r8}\n\t"
  48072. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  48073. "lsl r6, %[b], #16\n\t"
  48074. "lsl r7, r8, #16\n\t"
  48075. "lsr r6, r6, #16\n\t"
  48076. "lsr r7, r7, #16\n\t"
  48077. "mul r7, r6, r7\n\t"
  48078. "adds r3, r3, r7\n\t"
  48079. "adc r4, r4, #0\n\t"
  48080. "lsr r7, r8, #16\n\t"
  48081. "mul r6, r7, r6\n\t"
  48082. "lsr r7, r6, #16\n\t"
  48083. "lsl r6, r6, #16\n\t"
  48084. "adds r3, r3, r6\n\t"
  48085. "adc r4, r4, r7\n\t"
  48086. "lsr r6, %[b], #16\n\t"
  48087. "lsr r7, r8, #16\n\t"
  48088. "mul r7, r6, r7\n\t"
  48089. "add r4, r4, r7\n\t"
  48090. "lsl r7, r8, #16\n\t"
  48091. "lsr r7, r7, #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 r3, r3, r6\n\t"
  48096. "adc r4, r4, r7\n\t"
  48097. #else
  48098. "umlal r3, r4, %[b], r8\n\t"
  48099. #endif
  48100. "stm %[r]!, {r3}\n\t"
  48101. "mov r5, #0\n\t"
  48102. /* A[55] * B */
  48103. "ldm %[a]!, {r8}\n\t"
  48104. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  48105. "lsl r6, %[b], #16\n\t"
  48106. "lsl r7, r8, #16\n\t"
  48107. "lsr r6, r6, #16\n\t"
  48108. "lsr r7, r7, #16\n\t"
  48109. "mul r7, r6, r7\n\t"
  48110. "adds r4, r4, r7\n\t"
  48111. "adc r5, r5, #0\n\t"
  48112. "lsr r7, r8, #16\n\t"
  48113. "mul r6, r7, r6\n\t"
  48114. "lsr r7, r6, #16\n\t"
  48115. "lsl r6, r6, #16\n\t"
  48116. "adds r4, r4, r6\n\t"
  48117. "adc r5, r5, r7\n\t"
  48118. "lsr r6, %[b], #16\n\t"
  48119. "lsr r7, r8, #16\n\t"
  48120. "mul r7, r6, r7\n\t"
  48121. "add r5, r5, r7\n\t"
  48122. "lsl r7, r8, #16\n\t"
  48123. "lsr r7, r7, #16\n\t"
  48124. "mul r6, r7, r6\n\t"
  48125. "lsr r7, r6, #16\n\t"
  48126. "lsl r6, r6, #16\n\t"
  48127. "adds r4, r4, r6\n\t"
  48128. "adc r5, r5, r7\n\t"
  48129. #else
  48130. "umlal r4, r5, %[b], r8\n\t"
  48131. #endif
  48132. "stm %[r]!, {r4}\n\t"
  48133. "mov r3, #0\n\t"
  48134. /* A[56] * B */
  48135. "ldm %[a]!, {r8}\n\t"
  48136. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  48137. "lsl r6, %[b], #16\n\t"
  48138. "lsl r7, r8, #16\n\t"
  48139. "lsr r6, r6, #16\n\t"
  48140. "lsr r7, r7, #16\n\t"
  48141. "mul r7, r6, r7\n\t"
  48142. "adds r5, r5, r7\n\t"
  48143. "adc r3, r3, #0\n\t"
  48144. "lsr r7, r8, #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 r5, r5, r6\n\t"
  48149. "adc r3, r3, r7\n\t"
  48150. "lsr r6, %[b], #16\n\t"
  48151. "lsr r7, r8, #16\n\t"
  48152. "mul r7, r6, r7\n\t"
  48153. "add r3, r3, r7\n\t"
  48154. "lsl r7, r8, #16\n\t"
  48155. "lsr r7, r7, #16\n\t"
  48156. "mul r6, r7, r6\n\t"
  48157. "lsr r7, r6, #16\n\t"
  48158. "lsl r6, r6, #16\n\t"
  48159. "adds r5, r5, r6\n\t"
  48160. "adc r3, r3, r7\n\t"
  48161. #else
  48162. "umlal r5, r3, %[b], r8\n\t"
  48163. #endif
  48164. "stm %[r]!, {r5}\n\t"
  48165. "mov r4, #0\n\t"
  48166. /* A[57] * B */
  48167. "ldm %[a]!, {r8}\n\t"
  48168. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  48169. "lsl r6, %[b], #16\n\t"
  48170. "lsl r7, r8, #16\n\t"
  48171. "lsr r6, r6, #16\n\t"
  48172. "lsr r7, r7, #16\n\t"
  48173. "mul r7, r6, r7\n\t"
  48174. "adds r3, r3, r7\n\t"
  48175. "adc r4, r4, #0\n\t"
  48176. "lsr r7, r8, #16\n\t"
  48177. "mul r6, r7, r6\n\t"
  48178. "lsr r7, r6, #16\n\t"
  48179. "lsl r6, r6, #16\n\t"
  48180. "adds r3, r3, r6\n\t"
  48181. "adc r4, r4, r7\n\t"
  48182. "lsr r6, %[b], #16\n\t"
  48183. "lsr r7, r8, #16\n\t"
  48184. "mul r7, r6, r7\n\t"
  48185. "add r4, r4, r7\n\t"
  48186. "lsl r7, r8, #16\n\t"
  48187. "lsr r7, r7, #16\n\t"
  48188. "mul r6, r7, r6\n\t"
  48189. "lsr r7, r6, #16\n\t"
  48190. "lsl r6, r6, #16\n\t"
  48191. "adds r3, r3, r6\n\t"
  48192. "adc r4, r4, r7\n\t"
  48193. #else
  48194. "umlal r3, r4, %[b], r8\n\t"
  48195. #endif
  48196. "stm %[r]!, {r3}\n\t"
  48197. "mov r5, #0\n\t"
  48198. /* A[58] * B */
  48199. "ldm %[a]!, {r8}\n\t"
  48200. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  48201. "lsl r6, %[b], #16\n\t"
  48202. "lsl r7, r8, #16\n\t"
  48203. "lsr r6, r6, #16\n\t"
  48204. "lsr r7, r7, #16\n\t"
  48205. "mul r7, r6, r7\n\t"
  48206. "adds r4, r4, r7\n\t"
  48207. "adc r5, r5, #0\n\t"
  48208. "lsr r7, r8, #16\n\t"
  48209. "mul r6, r7, r6\n\t"
  48210. "lsr r7, r6, #16\n\t"
  48211. "lsl r6, r6, #16\n\t"
  48212. "adds r4, r4, r6\n\t"
  48213. "adc r5, r5, r7\n\t"
  48214. "lsr r6, %[b], #16\n\t"
  48215. "lsr r7, r8, #16\n\t"
  48216. "mul r7, r6, r7\n\t"
  48217. "add r5, r5, r7\n\t"
  48218. "lsl r7, r8, #16\n\t"
  48219. "lsr r7, r7, #16\n\t"
  48220. "mul r6, r7, r6\n\t"
  48221. "lsr r7, r6, #16\n\t"
  48222. "lsl r6, r6, #16\n\t"
  48223. "adds r4, r4, r6\n\t"
  48224. "adc r5, r5, r7\n\t"
  48225. #else
  48226. "umlal r4, r5, %[b], r8\n\t"
  48227. #endif
  48228. "stm %[r]!, {r4}\n\t"
  48229. "mov r3, #0\n\t"
  48230. /* A[59] * B */
  48231. "ldm %[a]!, {r8}\n\t"
  48232. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  48233. "lsl r6, %[b], #16\n\t"
  48234. "lsl r7, r8, #16\n\t"
  48235. "lsr r6, r6, #16\n\t"
  48236. "lsr r7, r7, #16\n\t"
  48237. "mul r7, r6, r7\n\t"
  48238. "adds r5, r5, r7\n\t"
  48239. "adc r3, r3, #0\n\t"
  48240. "lsr r7, r8, #16\n\t"
  48241. "mul r6, r7, r6\n\t"
  48242. "lsr r7, r6, #16\n\t"
  48243. "lsl r6, r6, #16\n\t"
  48244. "adds r5, r5, r6\n\t"
  48245. "adc r3, r3, r7\n\t"
  48246. "lsr r6, %[b], #16\n\t"
  48247. "lsr r7, r8, #16\n\t"
  48248. "mul r7, r6, r7\n\t"
  48249. "add r3, r3, r7\n\t"
  48250. "lsl r7, r8, #16\n\t"
  48251. "lsr r7, r7, #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 r5, r5, r6\n\t"
  48256. "adc r3, r3, r7\n\t"
  48257. #else
  48258. "umlal r5, r3, %[b], r8\n\t"
  48259. #endif
  48260. "stm %[r]!, {r5}\n\t"
  48261. "mov r4, #0\n\t"
  48262. /* A[60] * B */
  48263. "ldm %[a]!, {r8}\n\t"
  48264. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  48265. "lsl r6, %[b], #16\n\t"
  48266. "lsl r7, r8, #16\n\t"
  48267. "lsr r6, r6, #16\n\t"
  48268. "lsr r7, r7, #16\n\t"
  48269. "mul r7, r6, r7\n\t"
  48270. "adds r3, r3, r7\n\t"
  48271. "adc r4, r4, #0\n\t"
  48272. "lsr r7, r8, #16\n\t"
  48273. "mul r6, r7, r6\n\t"
  48274. "lsr r7, r6, #16\n\t"
  48275. "lsl r6, r6, #16\n\t"
  48276. "adds r3, r3, r6\n\t"
  48277. "adc r4, r4, r7\n\t"
  48278. "lsr r6, %[b], #16\n\t"
  48279. "lsr r7, r8, #16\n\t"
  48280. "mul r7, r6, r7\n\t"
  48281. "add r4, r4, r7\n\t"
  48282. "lsl r7, r8, #16\n\t"
  48283. "lsr r7, r7, #16\n\t"
  48284. "mul r6, r7, r6\n\t"
  48285. "lsr r7, r6, #16\n\t"
  48286. "lsl r6, r6, #16\n\t"
  48287. "adds r3, r3, r6\n\t"
  48288. "adc r4, r4, r7\n\t"
  48289. #else
  48290. "umlal r3, r4, %[b], r8\n\t"
  48291. #endif
  48292. "stm %[r]!, {r3}\n\t"
  48293. "mov r5, #0\n\t"
  48294. /* A[61] * B */
  48295. "ldm %[a]!, {r8}\n\t"
  48296. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  48297. "lsl r6, %[b], #16\n\t"
  48298. "lsl r7, r8, #16\n\t"
  48299. "lsr r6, r6, #16\n\t"
  48300. "lsr r7, r7, #16\n\t"
  48301. "mul r7, r6, r7\n\t"
  48302. "adds r4, r4, r7\n\t"
  48303. "adc r5, r5, #0\n\t"
  48304. "lsr r7, r8, #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. "adc r5, r5, r7\n\t"
  48310. "lsr r6, %[b], #16\n\t"
  48311. "lsr r7, r8, #16\n\t"
  48312. "mul r7, r6, r7\n\t"
  48313. "add r5, r5, r7\n\t"
  48314. "lsl r7, r8, #16\n\t"
  48315. "lsr r7, r7, #16\n\t"
  48316. "mul r6, r7, r6\n\t"
  48317. "lsr r7, r6, #16\n\t"
  48318. "lsl r6, r6, #16\n\t"
  48319. "adds r4, r4, r6\n\t"
  48320. "adc r5, r5, r7\n\t"
  48321. #else
  48322. "umlal r4, r5, %[b], r8\n\t"
  48323. #endif
  48324. "stm %[r]!, {r4}\n\t"
  48325. "mov r3, #0\n\t"
  48326. /* A[62] * B */
  48327. "ldm %[a]!, {r8}\n\t"
  48328. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  48329. "lsl r6, %[b], #16\n\t"
  48330. "lsl r7, r8, #16\n\t"
  48331. "lsr r6, r6, #16\n\t"
  48332. "lsr r7, r7, #16\n\t"
  48333. "mul r7, r6, r7\n\t"
  48334. "adds r5, r5, r7\n\t"
  48335. "adc r3, r3, #0\n\t"
  48336. "lsr r7, r8, #16\n\t"
  48337. "mul r6, r7, r6\n\t"
  48338. "lsr r7, r6, #16\n\t"
  48339. "lsl r6, r6, #16\n\t"
  48340. "adds r5, r5, r6\n\t"
  48341. "adc r3, r3, r7\n\t"
  48342. "lsr r6, %[b], #16\n\t"
  48343. "lsr r7, r8, #16\n\t"
  48344. "mul r7, r6, r7\n\t"
  48345. "add r3, r3, r7\n\t"
  48346. "lsl r7, r8, #16\n\t"
  48347. "lsr r7, r7, #16\n\t"
  48348. "mul r6, r7, r6\n\t"
  48349. "lsr r7, r6, #16\n\t"
  48350. "lsl r6, r6, #16\n\t"
  48351. "adds r5, r5, r6\n\t"
  48352. "adc r3, r3, r7\n\t"
  48353. #else
  48354. "umlal r5, r3, %[b], r8\n\t"
  48355. #endif
  48356. "stm %[r]!, {r5}\n\t"
  48357. "mov r4, #0\n\t"
  48358. /* A[63] * B */
  48359. "ldm %[a]!, {r8}\n\t"
  48360. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  48361. "lsl r6, %[b], #16\n\t"
  48362. "lsl r7, r8, #16\n\t"
  48363. "lsr r6, r6, #16\n\t"
  48364. "lsr r7, r7, #16\n\t"
  48365. "mul r7, r6, r7\n\t"
  48366. "adds r3, r3, r7\n\t"
  48367. "adc r4, r4, #0\n\t"
  48368. "lsr r7, r8, #16\n\t"
  48369. "mul r6, r7, r6\n\t"
  48370. "lsr r7, r6, #16\n\t"
  48371. "lsl r6, r6, #16\n\t"
  48372. "adds r3, r3, r6\n\t"
  48373. "adc r4, r4, r7\n\t"
  48374. "lsr r6, %[b], #16\n\t"
  48375. "lsr r7, r8, #16\n\t"
  48376. "mul r7, r6, r7\n\t"
  48377. "add r4, r4, r7\n\t"
  48378. "lsl r7, r8, #16\n\t"
  48379. "lsr r7, r7, #16\n\t"
  48380. "mul r6, r7, r6\n\t"
  48381. "lsr r7, r6, #16\n\t"
  48382. "lsl r6, r6, #16\n\t"
  48383. "adds r3, r3, r6\n\t"
  48384. "adc r4, r4, r7\n\t"
  48385. #else
  48386. "umlal r3, r4, %[b], r8\n\t"
  48387. #endif
  48388. "stm %[r]!, {r3}\n\t"
  48389. "mov r5, #0\n\t"
  48390. /* A[64] * B */
  48391. "ldm %[a]!, {r8}\n\t"
  48392. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  48393. "lsl r6, %[b], #16\n\t"
  48394. "lsl r7, r8, #16\n\t"
  48395. "lsr r6, r6, #16\n\t"
  48396. "lsr r7, r7, #16\n\t"
  48397. "mul r7, r6, r7\n\t"
  48398. "adds r4, r4, r7\n\t"
  48399. "adc r5, r5, #0\n\t"
  48400. "lsr r7, r8, #16\n\t"
  48401. "mul r6, r7, r6\n\t"
  48402. "lsr r7, r6, #16\n\t"
  48403. "lsl r6, r6, #16\n\t"
  48404. "adds r4, r4, r6\n\t"
  48405. "adc r5, r5, r7\n\t"
  48406. "lsr r6, %[b], #16\n\t"
  48407. "lsr r7, r8, #16\n\t"
  48408. "mul r7, r6, r7\n\t"
  48409. "add r5, r5, r7\n\t"
  48410. "lsl r7, r8, #16\n\t"
  48411. "lsr r7, r7, #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. "adc r5, r5, r7\n\t"
  48417. #else
  48418. "umlal r4, r5, %[b], r8\n\t"
  48419. #endif
  48420. "stm %[r]!, {r4}\n\t"
  48421. "mov r3, #0\n\t"
  48422. /* A[65] * B */
  48423. "ldm %[a]!, {r8}\n\t"
  48424. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  48425. "lsl r6, %[b], #16\n\t"
  48426. "lsl r7, r8, #16\n\t"
  48427. "lsr r6, r6, #16\n\t"
  48428. "lsr r7, r7, #16\n\t"
  48429. "mul r7, r6, r7\n\t"
  48430. "adds r5, r5, r7\n\t"
  48431. "adc r3, r3, #0\n\t"
  48432. "lsr r7, r8, #16\n\t"
  48433. "mul r6, r7, r6\n\t"
  48434. "lsr r7, r6, #16\n\t"
  48435. "lsl r6, r6, #16\n\t"
  48436. "adds r5, r5, r6\n\t"
  48437. "adc r3, r3, r7\n\t"
  48438. "lsr r6, %[b], #16\n\t"
  48439. "lsr r7, r8, #16\n\t"
  48440. "mul r7, r6, r7\n\t"
  48441. "add r3, r3, r7\n\t"
  48442. "lsl r7, r8, #16\n\t"
  48443. "lsr r7, r7, #16\n\t"
  48444. "mul r6, r7, r6\n\t"
  48445. "lsr r7, r6, #16\n\t"
  48446. "lsl r6, r6, #16\n\t"
  48447. "adds r5, r5, r6\n\t"
  48448. "adc r3, r3, r7\n\t"
  48449. #else
  48450. "umlal r5, r3, %[b], r8\n\t"
  48451. #endif
  48452. "stm %[r]!, {r5}\n\t"
  48453. "mov r4, #0\n\t"
  48454. /* A[66] * B */
  48455. "ldm %[a]!, {r8}\n\t"
  48456. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  48457. "lsl r6, %[b], #16\n\t"
  48458. "lsl r7, r8, #16\n\t"
  48459. "lsr r6, r6, #16\n\t"
  48460. "lsr r7, r7, #16\n\t"
  48461. "mul r7, r6, r7\n\t"
  48462. "adds r3, r3, r7\n\t"
  48463. "adc r4, r4, #0\n\t"
  48464. "lsr r7, r8, #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 r3, r3, r6\n\t"
  48469. "adc r4, r4, r7\n\t"
  48470. "lsr r6, %[b], #16\n\t"
  48471. "lsr r7, r8, #16\n\t"
  48472. "mul r7, r6, r7\n\t"
  48473. "add r4, r4, r7\n\t"
  48474. "lsl r7, r8, #16\n\t"
  48475. "lsr r7, r7, #16\n\t"
  48476. "mul r6, r7, r6\n\t"
  48477. "lsr r7, r6, #16\n\t"
  48478. "lsl r6, r6, #16\n\t"
  48479. "adds r3, r3, r6\n\t"
  48480. "adc r4, r4, r7\n\t"
  48481. #else
  48482. "umlal r3, r4, %[b], r8\n\t"
  48483. #endif
  48484. "stm %[r]!, {r3}\n\t"
  48485. "mov r5, #0\n\t"
  48486. /* A[67] * B */
  48487. "ldm %[a]!, {r8}\n\t"
  48488. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  48489. "lsl r6, %[b], #16\n\t"
  48490. "lsl r7, r8, #16\n\t"
  48491. "lsr r6, r6, #16\n\t"
  48492. "lsr r7, r7, #16\n\t"
  48493. "mul r7, r6, r7\n\t"
  48494. "adds r4, r4, r7\n\t"
  48495. "adc r5, r5, #0\n\t"
  48496. "lsr r7, r8, #16\n\t"
  48497. "mul r6, r7, r6\n\t"
  48498. "lsr r7, r6, #16\n\t"
  48499. "lsl r6, r6, #16\n\t"
  48500. "adds r4, r4, r6\n\t"
  48501. "adc r5, r5, r7\n\t"
  48502. "lsr r6, %[b], #16\n\t"
  48503. "lsr r7, r8, #16\n\t"
  48504. "mul r7, r6, r7\n\t"
  48505. "add r5, r5, r7\n\t"
  48506. "lsl r7, r8, #16\n\t"
  48507. "lsr r7, r7, #16\n\t"
  48508. "mul r6, r7, r6\n\t"
  48509. "lsr r7, r6, #16\n\t"
  48510. "lsl r6, r6, #16\n\t"
  48511. "adds r4, r4, r6\n\t"
  48512. "adc r5, r5, r7\n\t"
  48513. #else
  48514. "umlal r4, r5, %[b], r8\n\t"
  48515. #endif
  48516. "stm %[r]!, {r4}\n\t"
  48517. "mov r3, #0\n\t"
  48518. /* A[68] * B */
  48519. "ldm %[a]!, {r8}\n\t"
  48520. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  48521. "lsl r6, %[b], #16\n\t"
  48522. "lsl r7, r8, #16\n\t"
  48523. "lsr r6, r6, #16\n\t"
  48524. "lsr r7, r7, #16\n\t"
  48525. "mul r7, r6, r7\n\t"
  48526. "adds r5, r5, r7\n\t"
  48527. "adc r3, r3, #0\n\t"
  48528. "lsr r7, r8, #16\n\t"
  48529. "mul r6, r7, r6\n\t"
  48530. "lsr r7, r6, #16\n\t"
  48531. "lsl r6, r6, #16\n\t"
  48532. "adds r5, r5, r6\n\t"
  48533. "adc r3, r3, r7\n\t"
  48534. "lsr r6, %[b], #16\n\t"
  48535. "lsr r7, r8, #16\n\t"
  48536. "mul r7, r6, r7\n\t"
  48537. "add r3, r3, r7\n\t"
  48538. "lsl r7, r8, #16\n\t"
  48539. "lsr r7, r7, #16\n\t"
  48540. "mul r6, r7, r6\n\t"
  48541. "lsr r7, r6, #16\n\t"
  48542. "lsl r6, r6, #16\n\t"
  48543. "adds r5, r5, r6\n\t"
  48544. "adc r3, r3, r7\n\t"
  48545. #else
  48546. "umlal r5, r3, %[b], r8\n\t"
  48547. #endif
  48548. "stm %[r]!, {r5}\n\t"
  48549. "mov r4, #0\n\t"
  48550. /* A[69] * B */
  48551. "ldm %[a]!, {r8}\n\t"
  48552. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  48553. "lsl r6, %[b], #16\n\t"
  48554. "lsl r7, r8, #16\n\t"
  48555. "lsr r6, r6, #16\n\t"
  48556. "lsr r7, r7, #16\n\t"
  48557. "mul r7, r6, r7\n\t"
  48558. "adds r3, r3, r7\n\t"
  48559. "adc r4, r4, #0\n\t"
  48560. "lsr r7, r8, #16\n\t"
  48561. "mul r6, r7, r6\n\t"
  48562. "lsr r7, r6, #16\n\t"
  48563. "lsl r6, r6, #16\n\t"
  48564. "adds r3, r3, r6\n\t"
  48565. "adc r4, r4, r7\n\t"
  48566. "lsr r6, %[b], #16\n\t"
  48567. "lsr r7, r8, #16\n\t"
  48568. "mul r7, r6, r7\n\t"
  48569. "add r4, r4, r7\n\t"
  48570. "lsl r7, r8, #16\n\t"
  48571. "lsr r7, r7, #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 r3, r3, r6\n\t"
  48576. "adc r4, r4, r7\n\t"
  48577. #else
  48578. "umlal r3, r4, %[b], r8\n\t"
  48579. #endif
  48580. "stm %[r]!, {r3}\n\t"
  48581. "mov r5, #0\n\t"
  48582. /* A[70] * B */
  48583. "ldm %[a]!, {r8}\n\t"
  48584. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  48585. "lsl r6, %[b], #16\n\t"
  48586. "lsl r7, r8, #16\n\t"
  48587. "lsr r6, r6, #16\n\t"
  48588. "lsr r7, r7, #16\n\t"
  48589. "mul r7, r6, r7\n\t"
  48590. "adds r4, r4, r7\n\t"
  48591. "adc r5, r5, #0\n\t"
  48592. "lsr r7, r8, #16\n\t"
  48593. "mul r6, r7, r6\n\t"
  48594. "lsr r7, r6, #16\n\t"
  48595. "lsl r6, r6, #16\n\t"
  48596. "adds r4, r4, r6\n\t"
  48597. "adc r5, r5, r7\n\t"
  48598. "lsr r6, %[b], #16\n\t"
  48599. "lsr r7, r8, #16\n\t"
  48600. "mul r7, r6, r7\n\t"
  48601. "add r5, r5, r7\n\t"
  48602. "lsl r7, r8, #16\n\t"
  48603. "lsr r7, r7, #16\n\t"
  48604. "mul r6, r7, r6\n\t"
  48605. "lsr r7, r6, #16\n\t"
  48606. "lsl r6, r6, #16\n\t"
  48607. "adds r4, r4, r6\n\t"
  48608. "adc r5, r5, r7\n\t"
  48609. #else
  48610. "umlal r4, r5, %[b], r8\n\t"
  48611. #endif
  48612. "stm %[r]!, {r4}\n\t"
  48613. "mov r3, #0\n\t"
  48614. /* A[71] * B */
  48615. "ldm %[a]!, {r8}\n\t"
  48616. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  48617. "lsl r6, %[b], #16\n\t"
  48618. "lsl r7, r8, #16\n\t"
  48619. "lsr r6, r6, #16\n\t"
  48620. "lsr r7, r7, #16\n\t"
  48621. "mul r7, r6, r7\n\t"
  48622. "adds r5, r5, r7\n\t"
  48623. "adc r3, r3, #0\n\t"
  48624. "lsr r7, r8, #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 r5, r5, r6\n\t"
  48629. "adc r3, r3, r7\n\t"
  48630. "lsr r6, %[b], #16\n\t"
  48631. "lsr r7, r8, #16\n\t"
  48632. "mul r7, r6, r7\n\t"
  48633. "add r3, r3, r7\n\t"
  48634. "lsl r7, r8, #16\n\t"
  48635. "lsr r7, r7, #16\n\t"
  48636. "mul r6, r7, r6\n\t"
  48637. "lsr r7, r6, #16\n\t"
  48638. "lsl r6, r6, #16\n\t"
  48639. "adds r5, r5, r6\n\t"
  48640. "adc r3, r3, r7\n\t"
  48641. #else
  48642. "umlal r5, r3, %[b], r8\n\t"
  48643. #endif
  48644. "stm %[r]!, {r5}\n\t"
  48645. "mov r4, #0\n\t"
  48646. /* A[72] * B */
  48647. "ldm %[a]!, {r8}\n\t"
  48648. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  48649. "lsl r6, %[b], #16\n\t"
  48650. "lsl r7, r8, #16\n\t"
  48651. "lsr r6, r6, #16\n\t"
  48652. "lsr r7, r7, #16\n\t"
  48653. "mul r7, r6, r7\n\t"
  48654. "adds r3, r3, r7\n\t"
  48655. "adc r4, r4, #0\n\t"
  48656. "lsr r7, r8, #16\n\t"
  48657. "mul r6, r7, r6\n\t"
  48658. "lsr r7, r6, #16\n\t"
  48659. "lsl r6, r6, #16\n\t"
  48660. "adds r3, r3, r6\n\t"
  48661. "adc r4, r4, r7\n\t"
  48662. "lsr r6, %[b], #16\n\t"
  48663. "lsr r7, r8, #16\n\t"
  48664. "mul r7, r6, r7\n\t"
  48665. "add r4, r4, r7\n\t"
  48666. "lsl r7, r8, #16\n\t"
  48667. "lsr r7, r7, #16\n\t"
  48668. "mul r6, r7, r6\n\t"
  48669. "lsr r7, r6, #16\n\t"
  48670. "lsl r6, r6, #16\n\t"
  48671. "adds r3, r3, r6\n\t"
  48672. "adc r4, r4, r7\n\t"
  48673. #else
  48674. "umlal r3, r4, %[b], r8\n\t"
  48675. #endif
  48676. "stm %[r]!, {r3}\n\t"
  48677. "mov r5, #0\n\t"
  48678. /* A[73] * B */
  48679. "ldm %[a]!, {r8}\n\t"
  48680. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  48681. "lsl r6, %[b], #16\n\t"
  48682. "lsl r7, r8, #16\n\t"
  48683. "lsr r6, r6, #16\n\t"
  48684. "lsr r7, r7, #16\n\t"
  48685. "mul r7, r6, r7\n\t"
  48686. "adds r4, r4, r7\n\t"
  48687. "adc r5, r5, #0\n\t"
  48688. "lsr r7, r8, #16\n\t"
  48689. "mul r6, r7, r6\n\t"
  48690. "lsr r7, r6, #16\n\t"
  48691. "lsl r6, r6, #16\n\t"
  48692. "adds r4, r4, r6\n\t"
  48693. "adc r5, r5, r7\n\t"
  48694. "lsr r6, %[b], #16\n\t"
  48695. "lsr r7, r8, #16\n\t"
  48696. "mul r7, r6, r7\n\t"
  48697. "add r5, r5, r7\n\t"
  48698. "lsl r7, r8, #16\n\t"
  48699. "lsr r7, r7, #16\n\t"
  48700. "mul r6, r7, r6\n\t"
  48701. "lsr r7, r6, #16\n\t"
  48702. "lsl r6, r6, #16\n\t"
  48703. "adds r4, r4, r6\n\t"
  48704. "adc r5, r5, r7\n\t"
  48705. #else
  48706. "umlal r4, r5, %[b], r8\n\t"
  48707. #endif
  48708. "stm %[r]!, {r4}\n\t"
  48709. "mov r3, #0\n\t"
  48710. /* A[74] * B */
  48711. "ldm %[a]!, {r8}\n\t"
  48712. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  48713. "lsl r6, %[b], #16\n\t"
  48714. "lsl r7, r8, #16\n\t"
  48715. "lsr r6, r6, #16\n\t"
  48716. "lsr r7, r7, #16\n\t"
  48717. "mul r7, r6, r7\n\t"
  48718. "adds r5, r5, r7\n\t"
  48719. "adc r3, r3, #0\n\t"
  48720. "lsr r7, r8, #16\n\t"
  48721. "mul r6, r7, r6\n\t"
  48722. "lsr r7, r6, #16\n\t"
  48723. "lsl r6, r6, #16\n\t"
  48724. "adds r5, r5, r6\n\t"
  48725. "adc r3, r3, r7\n\t"
  48726. "lsr r6, %[b], #16\n\t"
  48727. "lsr r7, r8, #16\n\t"
  48728. "mul r7, r6, r7\n\t"
  48729. "add r3, r3, r7\n\t"
  48730. "lsl r7, r8, #16\n\t"
  48731. "lsr r7, r7, #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 r5, r5, r6\n\t"
  48736. "adc r3, r3, r7\n\t"
  48737. #else
  48738. "umlal r5, r3, %[b], r8\n\t"
  48739. #endif
  48740. "stm %[r]!, {r5}\n\t"
  48741. "mov r4, #0\n\t"
  48742. /* A[75] * B */
  48743. "ldm %[a]!, {r8}\n\t"
  48744. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  48745. "lsl r6, %[b], #16\n\t"
  48746. "lsl r7, r8, #16\n\t"
  48747. "lsr r6, r6, #16\n\t"
  48748. "lsr r7, r7, #16\n\t"
  48749. "mul r7, r6, r7\n\t"
  48750. "adds r3, r3, r7\n\t"
  48751. "adc r4, r4, #0\n\t"
  48752. "lsr r7, r8, #16\n\t"
  48753. "mul r6, r7, r6\n\t"
  48754. "lsr r7, r6, #16\n\t"
  48755. "lsl r6, r6, #16\n\t"
  48756. "adds r3, r3, r6\n\t"
  48757. "adc r4, r4, r7\n\t"
  48758. "lsr r6, %[b], #16\n\t"
  48759. "lsr r7, r8, #16\n\t"
  48760. "mul r7, r6, r7\n\t"
  48761. "add r4, r4, r7\n\t"
  48762. "lsl r7, r8, #16\n\t"
  48763. "lsr r7, r7, #16\n\t"
  48764. "mul r6, r7, r6\n\t"
  48765. "lsr r7, r6, #16\n\t"
  48766. "lsl r6, r6, #16\n\t"
  48767. "adds r3, r3, r6\n\t"
  48768. "adc r4, r4, r7\n\t"
  48769. #else
  48770. "umlal r3, r4, %[b], r8\n\t"
  48771. #endif
  48772. "stm %[r]!, {r3}\n\t"
  48773. "mov r5, #0\n\t"
  48774. /* A[76] * B */
  48775. "ldm %[a]!, {r8}\n\t"
  48776. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  48777. "lsl r6, %[b], #16\n\t"
  48778. "lsl r7, r8, #16\n\t"
  48779. "lsr r6, r6, #16\n\t"
  48780. "lsr r7, r7, #16\n\t"
  48781. "mul r7, r6, r7\n\t"
  48782. "adds r4, r4, r7\n\t"
  48783. "adc r5, r5, #0\n\t"
  48784. "lsr r7, r8, #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. "adc r5, r5, r7\n\t"
  48790. "lsr r6, %[b], #16\n\t"
  48791. "lsr r7, r8, #16\n\t"
  48792. "mul r7, r6, r7\n\t"
  48793. "add r5, r5, r7\n\t"
  48794. "lsl r7, r8, #16\n\t"
  48795. "lsr r7, r7, #16\n\t"
  48796. "mul r6, r7, r6\n\t"
  48797. "lsr r7, r6, #16\n\t"
  48798. "lsl r6, r6, #16\n\t"
  48799. "adds r4, r4, r6\n\t"
  48800. "adc r5, r5, r7\n\t"
  48801. #else
  48802. "umlal r4, r5, %[b], r8\n\t"
  48803. #endif
  48804. "stm %[r]!, {r4}\n\t"
  48805. "mov r3, #0\n\t"
  48806. /* A[77] * B */
  48807. "ldm %[a]!, {r8}\n\t"
  48808. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  48809. "lsl r6, %[b], #16\n\t"
  48810. "lsl r7, r8, #16\n\t"
  48811. "lsr r6, r6, #16\n\t"
  48812. "lsr r7, r7, #16\n\t"
  48813. "mul r7, r6, r7\n\t"
  48814. "adds r5, r5, r7\n\t"
  48815. "adc r3, r3, #0\n\t"
  48816. "lsr r7, r8, #16\n\t"
  48817. "mul r6, r7, r6\n\t"
  48818. "lsr r7, r6, #16\n\t"
  48819. "lsl r6, r6, #16\n\t"
  48820. "adds r5, r5, r6\n\t"
  48821. "adc r3, r3, r7\n\t"
  48822. "lsr r6, %[b], #16\n\t"
  48823. "lsr r7, r8, #16\n\t"
  48824. "mul r7, r6, r7\n\t"
  48825. "add r3, r3, r7\n\t"
  48826. "lsl r7, r8, #16\n\t"
  48827. "lsr r7, r7, #16\n\t"
  48828. "mul r6, r7, r6\n\t"
  48829. "lsr r7, r6, #16\n\t"
  48830. "lsl r6, r6, #16\n\t"
  48831. "adds r5, r5, r6\n\t"
  48832. "adc r3, r3, r7\n\t"
  48833. #else
  48834. "umlal r5, r3, %[b], r8\n\t"
  48835. #endif
  48836. "stm %[r]!, {r5}\n\t"
  48837. "mov r4, #0\n\t"
  48838. /* A[78] * B */
  48839. "ldm %[a]!, {r8}\n\t"
  48840. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  48841. "lsl r6, %[b], #16\n\t"
  48842. "lsl r7, r8, #16\n\t"
  48843. "lsr r6, r6, #16\n\t"
  48844. "lsr r7, r7, #16\n\t"
  48845. "mul r7, r6, r7\n\t"
  48846. "adds r3, r3, r7\n\t"
  48847. "adc r4, r4, #0\n\t"
  48848. "lsr r7, r8, #16\n\t"
  48849. "mul r6, r7, r6\n\t"
  48850. "lsr r7, r6, #16\n\t"
  48851. "lsl r6, r6, #16\n\t"
  48852. "adds r3, r3, r6\n\t"
  48853. "adc r4, r4, r7\n\t"
  48854. "lsr r6, %[b], #16\n\t"
  48855. "lsr r7, r8, #16\n\t"
  48856. "mul r7, r6, r7\n\t"
  48857. "add r4, r4, r7\n\t"
  48858. "lsl r7, r8, #16\n\t"
  48859. "lsr r7, r7, #16\n\t"
  48860. "mul r6, r7, r6\n\t"
  48861. "lsr r7, r6, #16\n\t"
  48862. "lsl r6, r6, #16\n\t"
  48863. "adds r3, r3, r6\n\t"
  48864. "adc r4, r4, r7\n\t"
  48865. #else
  48866. "umlal r3, r4, %[b], r8\n\t"
  48867. #endif
  48868. "stm %[r]!, {r3}\n\t"
  48869. "mov r5, #0\n\t"
  48870. /* A[79] * B */
  48871. "ldm %[a]!, {r8}\n\t"
  48872. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  48873. "lsl r6, %[b], #16\n\t"
  48874. "lsl r7, r8, #16\n\t"
  48875. "lsr r6, r6, #16\n\t"
  48876. "lsr r7, r7, #16\n\t"
  48877. "mul r7, r6, r7\n\t"
  48878. "adds r4, r4, r7\n\t"
  48879. "adc r5, r5, #0\n\t"
  48880. "lsr r7, r8, #16\n\t"
  48881. "mul r6, r7, r6\n\t"
  48882. "lsr r7, r6, #16\n\t"
  48883. "lsl r6, r6, #16\n\t"
  48884. "adds r4, r4, r6\n\t"
  48885. "adc r5, r5, r7\n\t"
  48886. "lsr r6, %[b], #16\n\t"
  48887. "lsr r7, r8, #16\n\t"
  48888. "mul r7, r6, r7\n\t"
  48889. "add r5, r5, r7\n\t"
  48890. "lsl r7, r8, #16\n\t"
  48891. "lsr r7, r7, #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. "adc r5, r5, r7\n\t"
  48897. #else
  48898. "umlal r4, r5, %[b], r8\n\t"
  48899. #endif
  48900. "stm %[r]!, {r4}\n\t"
  48901. "mov r3, #0\n\t"
  48902. /* A[80] * B */
  48903. "ldm %[a]!, {r8}\n\t"
  48904. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  48905. "lsl r6, %[b], #16\n\t"
  48906. "lsl r7, r8, #16\n\t"
  48907. "lsr r6, r6, #16\n\t"
  48908. "lsr r7, r7, #16\n\t"
  48909. "mul r7, r6, r7\n\t"
  48910. "adds r5, r5, r7\n\t"
  48911. "adc r3, r3, #0\n\t"
  48912. "lsr r7, r8, #16\n\t"
  48913. "mul r6, r7, r6\n\t"
  48914. "lsr r7, r6, #16\n\t"
  48915. "lsl r6, r6, #16\n\t"
  48916. "adds r5, r5, r6\n\t"
  48917. "adc r3, r3, r7\n\t"
  48918. "lsr r6, %[b], #16\n\t"
  48919. "lsr r7, r8, #16\n\t"
  48920. "mul r7, r6, r7\n\t"
  48921. "add r3, r3, r7\n\t"
  48922. "lsl r7, r8, #16\n\t"
  48923. "lsr r7, r7, #16\n\t"
  48924. "mul r6, r7, r6\n\t"
  48925. "lsr r7, r6, #16\n\t"
  48926. "lsl r6, r6, #16\n\t"
  48927. "adds r5, r5, r6\n\t"
  48928. "adc r3, r3, r7\n\t"
  48929. #else
  48930. "umlal r5, r3, %[b], r8\n\t"
  48931. #endif
  48932. "stm %[r]!, {r5}\n\t"
  48933. "mov r4, #0\n\t"
  48934. /* A[81] * B */
  48935. "ldm %[a]!, {r8}\n\t"
  48936. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  48937. "lsl r6, %[b], #16\n\t"
  48938. "lsl r7, r8, #16\n\t"
  48939. "lsr r6, r6, #16\n\t"
  48940. "lsr r7, r7, #16\n\t"
  48941. "mul r7, r6, r7\n\t"
  48942. "adds r3, r3, r7\n\t"
  48943. "adc r4, r4, #0\n\t"
  48944. "lsr r7, r8, #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 r3, r3, r6\n\t"
  48949. "adc r4, r4, r7\n\t"
  48950. "lsr r6, %[b], #16\n\t"
  48951. "lsr r7, r8, #16\n\t"
  48952. "mul r7, r6, r7\n\t"
  48953. "add r4, r4, r7\n\t"
  48954. "lsl r7, r8, #16\n\t"
  48955. "lsr r7, r7, #16\n\t"
  48956. "mul r6, r7, r6\n\t"
  48957. "lsr r7, r6, #16\n\t"
  48958. "lsl r6, r6, #16\n\t"
  48959. "adds r3, r3, r6\n\t"
  48960. "adc r4, r4, r7\n\t"
  48961. #else
  48962. "umlal r3, r4, %[b], r8\n\t"
  48963. #endif
  48964. "stm %[r]!, {r3}\n\t"
  48965. "mov r5, #0\n\t"
  48966. /* A[82] * B */
  48967. "ldm %[a]!, {r8}\n\t"
  48968. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  48969. "lsl r6, %[b], #16\n\t"
  48970. "lsl r7, r8, #16\n\t"
  48971. "lsr r6, r6, #16\n\t"
  48972. "lsr r7, r7, #16\n\t"
  48973. "mul r7, r6, r7\n\t"
  48974. "adds r4, r4, r7\n\t"
  48975. "adc r5, r5, #0\n\t"
  48976. "lsr r7, r8, #16\n\t"
  48977. "mul r6, r7, r6\n\t"
  48978. "lsr r7, r6, #16\n\t"
  48979. "lsl r6, r6, #16\n\t"
  48980. "adds r4, r4, r6\n\t"
  48981. "adc r5, r5, r7\n\t"
  48982. "lsr r6, %[b], #16\n\t"
  48983. "lsr r7, r8, #16\n\t"
  48984. "mul r7, r6, r7\n\t"
  48985. "add r5, r5, r7\n\t"
  48986. "lsl r7, r8, #16\n\t"
  48987. "lsr r7, r7, #16\n\t"
  48988. "mul r6, r7, r6\n\t"
  48989. "lsr r7, r6, #16\n\t"
  48990. "lsl r6, r6, #16\n\t"
  48991. "adds r4, r4, r6\n\t"
  48992. "adc r5, r5, r7\n\t"
  48993. #else
  48994. "umlal r4, r5, %[b], r8\n\t"
  48995. #endif
  48996. "stm %[r]!, {r4}\n\t"
  48997. "mov r3, #0\n\t"
  48998. /* A[83] * B */
  48999. "ldm %[a]!, {r8}\n\t"
  49000. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  49001. "lsl r6, %[b], #16\n\t"
  49002. "lsl r7, r8, #16\n\t"
  49003. "lsr r6, r6, #16\n\t"
  49004. "lsr r7, r7, #16\n\t"
  49005. "mul r7, r6, r7\n\t"
  49006. "adds r5, r5, r7\n\t"
  49007. "adc r3, r3, #0\n\t"
  49008. "lsr r7, r8, #16\n\t"
  49009. "mul r6, r7, r6\n\t"
  49010. "lsr r7, r6, #16\n\t"
  49011. "lsl r6, r6, #16\n\t"
  49012. "adds r5, r5, r6\n\t"
  49013. "adc r3, r3, r7\n\t"
  49014. "lsr r6, %[b], #16\n\t"
  49015. "lsr r7, r8, #16\n\t"
  49016. "mul r7, r6, r7\n\t"
  49017. "add r3, r3, r7\n\t"
  49018. "lsl r7, r8, #16\n\t"
  49019. "lsr r7, r7, #16\n\t"
  49020. "mul r6, r7, r6\n\t"
  49021. "lsr r7, r6, #16\n\t"
  49022. "lsl r6, r6, #16\n\t"
  49023. "adds r5, r5, r6\n\t"
  49024. "adc r3, r3, r7\n\t"
  49025. #else
  49026. "umlal r5, r3, %[b], r8\n\t"
  49027. #endif
  49028. "stm %[r]!, {r5}\n\t"
  49029. "mov r4, #0\n\t"
  49030. /* A[84] * B */
  49031. "ldm %[a]!, {r8}\n\t"
  49032. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  49033. "lsl r6, %[b], #16\n\t"
  49034. "lsl r7, r8, #16\n\t"
  49035. "lsr r6, r6, #16\n\t"
  49036. "lsr r7, r7, #16\n\t"
  49037. "mul r7, r6, r7\n\t"
  49038. "adds r3, r3, r7\n\t"
  49039. "adc r4, r4, #0\n\t"
  49040. "lsr r7, r8, #16\n\t"
  49041. "mul r6, r7, r6\n\t"
  49042. "lsr r7, r6, #16\n\t"
  49043. "lsl r6, r6, #16\n\t"
  49044. "adds r3, r3, r6\n\t"
  49045. "adc r4, r4, r7\n\t"
  49046. "lsr r6, %[b], #16\n\t"
  49047. "lsr r7, r8, #16\n\t"
  49048. "mul r7, r6, r7\n\t"
  49049. "add r4, r4, r7\n\t"
  49050. "lsl r7, r8, #16\n\t"
  49051. "lsr r7, r7, #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 r3, r3, r6\n\t"
  49056. "adc r4, r4, r7\n\t"
  49057. #else
  49058. "umlal r3, r4, %[b], r8\n\t"
  49059. #endif
  49060. "stm %[r]!, {r3}\n\t"
  49061. "mov r5, #0\n\t"
  49062. /* A[85] * B */
  49063. "ldm %[a]!, {r8}\n\t"
  49064. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  49065. "lsl r6, %[b], #16\n\t"
  49066. "lsl r7, r8, #16\n\t"
  49067. "lsr r6, r6, #16\n\t"
  49068. "lsr r7, r7, #16\n\t"
  49069. "mul r7, r6, r7\n\t"
  49070. "adds r4, r4, r7\n\t"
  49071. "adc r5, r5, #0\n\t"
  49072. "lsr r7, r8, #16\n\t"
  49073. "mul r6, r7, r6\n\t"
  49074. "lsr r7, r6, #16\n\t"
  49075. "lsl r6, r6, #16\n\t"
  49076. "adds r4, r4, r6\n\t"
  49077. "adc r5, r5, r7\n\t"
  49078. "lsr r6, %[b], #16\n\t"
  49079. "lsr r7, r8, #16\n\t"
  49080. "mul r7, r6, r7\n\t"
  49081. "add r5, r5, r7\n\t"
  49082. "lsl r7, r8, #16\n\t"
  49083. "lsr r7, r7, #16\n\t"
  49084. "mul r6, r7, r6\n\t"
  49085. "lsr r7, r6, #16\n\t"
  49086. "lsl r6, r6, #16\n\t"
  49087. "adds r4, r4, r6\n\t"
  49088. "adc r5, r5, r7\n\t"
  49089. #else
  49090. "umlal r4, r5, %[b], r8\n\t"
  49091. #endif
  49092. "stm %[r]!, {r4}\n\t"
  49093. "mov r3, #0\n\t"
  49094. /* A[86] * B */
  49095. "ldm %[a]!, {r8}\n\t"
  49096. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  49097. "lsl r6, %[b], #16\n\t"
  49098. "lsl r7, r8, #16\n\t"
  49099. "lsr r6, r6, #16\n\t"
  49100. "lsr r7, r7, #16\n\t"
  49101. "mul r7, r6, r7\n\t"
  49102. "adds r5, r5, r7\n\t"
  49103. "adc r3, r3, #0\n\t"
  49104. "lsr r7, r8, #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 r5, r5, r6\n\t"
  49109. "adc r3, r3, r7\n\t"
  49110. "lsr r6, %[b], #16\n\t"
  49111. "lsr r7, r8, #16\n\t"
  49112. "mul r7, r6, r7\n\t"
  49113. "add r3, r3, r7\n\t"
  49114. "lsl r7, r8, #16\n\t"
  49115. "lsr r7, r7, #16\n\t"
  49116. "mul r6, r7, r6\n\t"
  49117. "lsr r7, r6, #16\n\t"
  49118. "lsl r6, r6, #16\n\t"
  49119. "adds r5, r5, r6\n\t"
  49120. "adc r3, r3, r7\n\t"
  49121. #else
  49122. "umlal r5, r3, %[b], r8\n\t"
  49123. #endif
  49124. "stm %[r]!, {r5}\n\t"
  49125. "mov r4, #0\n\t"
  49126. /* A[87] * B */
  49127. "ldm %[a]!, {r8}\n\t"
  49128. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  49129. "lsl r6, %[b], #16\n\t"
  49130. "lsl r7, r8, #16\n\t"
  49131. "lsr r6, r6, #16\n\t"
  49132. "lsr r7, r7, #16\n\t"
  49133. "mul r7, r6, r7\n\t"
  49134. "adds r3, r3, r7\n\t"
  49135. "adc r4, r4, #0\n\t"
  49136. "lsr r7, r8, #16\n\t"
  49137. "mul r6, r7, r6\n\t"
  49138. "lsr r7, r6, #16\n\t"
  49139. "lsl r6, r6, #16\n\t"
  49140. "adds r3, r3, r6\n\t"
  49141. "adc r4, r4, r7\n\t"
  49142. "lsr r6, %[b], #16\n\t"
  49143. "lsr r7, r8, #16\n\t"
  49144. "mul r7, r6, r7\n\t"
  49145. "add r4, r4, r7\n\t"
  49146. "lsl r7, r8, #16\n\t"
  49147. "lsr r7, r7, #16\n\t"
  49148. "mul r6, r7, r6\n\t"
  49149. "lsr r7, r6, #16\n\t"
  49150. "lsl r6, r6, #16\n\t"
  49151. "adds r3, r3, r6\n\t"
  49152. "adc r4, r4, r7\n\t"
  49153. #else
  49154. "umlal r3, r4, %[b], r8\n\t"
  49155. #endif
  49156. "stm %[r]!, {r3}\n\t"
  49157. "mov r5, #0\n\t"
  49158. /* A[88] * B */
  49159. "ldm %[a]!, {r8}\n\t"
  49160. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  49161. "lsl r6, %[b], #16\n\t"
  49162. "lsl r7, r8, #16\n\t"
  49163. "lsr r6, r6, #16\n\t"
  49164. "lsr r7, r7, #16\n\t"
  49165. "mul r7, r6, r7\n\t"
  49166. "adds r4, r4, r7\n\t"
  49167. "adc r5, r5, #0\n\t"
  49168. "lsr r7, r8, #16\n\t"
  49169. "mul r6, r7, r6\n\t"
  49170. "lsr r7, r6, #16\n\t"
  49171. "lsl r6, r6, #16\n\t"
  49172. "adds r4, r4, r6\n\t"
  49173. "adc r5, r5, r7\n\t"
  49174. "lsr r6, %[b], #16\n\t"
  49175. "lsr r7, r8, #16\n\t"
  49176. "mul r7, r6, r7\n\t"
  49177. "add r5, r5, r7\n\t"
  49178. "lsl r7, r8, #16\n\t"
  49179. "lsr r7, r7, #16\n\t"
  49180. "mul r6, r7, r6\n\t"
  49181. "lsr r7, r6, #16\n\t"
  49182. "lsl r6, r6, #16\n\t"
  49183. "adds r4, r4, r6\n\t"
  49184. "adc r5, r5, r7\n\t"
  49185. #else
  49186. "umlal r4, r5, %[b], r8\n\t"
  49187. #endif
  49188. "stm %[r]!, {r4}\n\t"
  49189. "mov r3, #0\n\t"
  49190. /* A[89] * B */
  49191. "ldm %[a]!, {r8}\n\t"
  49192. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  49193. "lsl r6, %[b], #16\n\t"
  49194. "lsl r7, r8, #16\n\t"
  49195. "lsr r6, r6, #16\n\t"
  49196. "lsr r7, r7, #16\n\t"
  49197. "mul r7, r6, r7\n\t"
  49198. "adds r5, r5, r7\n\t"
  49199. "adc r3, r3, #0\n\t"
  49200. "lsr r7, r8, #16\n\t"
  49201. "mul r6, r7, r6\n\t"
  49202. "lsr r7, r6, #16\n\t"
  49203. "lsl r6, r6, #16\n\t"
  49204. "adds r5, r5, r6\n\t"
  49205. "adc r3, r3, r7\n\t"
  49206. "lsr r6, %[b], #16\n\t"
  49207. "lsr r7, r8, #16\n\t"
  49208. "mul r7, r6, r7\n\t"
  49209. "add r3, r3, r7\n\t"
  49210. "lsl r7, r8, #16\n\t"
  49211. "lsr r7, r7, #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 r5, r5, r6\n\t"
  49216. "adc r3, r3, r7\n\t"
  49217. #else
  49218. "umlal r5, r3, %[b], r8\n\t"
  49219. #endif
  49220. "stm %[r]!, {r5}\n\t"
  49221. "mov r4, #0\n\t"
  49222. /* A[90] * B */
  49223. "ldm %[a]!, {r8}\n\t"
  49224. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  49225. "lsl r6, %[b], #16\n\t"
  49226. "lsl r7, r8, #16\n\t"
  49227. "lsr r6, r6, #16\n\t"
  49228. "lsr r7, r7, #16\n\t"
  49229. "mul r7, r6, r7\n\t"
  49230. "adds r3, r3, r7\n\t"
  49231. "adc r4, r4, #0\n\t"
  49232. "lsr r7, r8, #16\n\t"
  49233. "mul r6, r7, r6\n\t"
  49234. "lsr r7, r6, #16\n\t"
  49235. "lsl r6, r6, #16\n\t"
  49236. "adds r3, r3, r6\n\t"
  49237. "adc r4, r4, r7\n\t"
  49238. "lsr r6, %[b], #16\n\t"
  49239. "lsr r7, r8, #16\n\t"
  49240. "mul r7, r6, r7\n\t"
  49241. "add r4, r4, r7\n\t"
  49242. "lsl r7, r8, #16\n\t"
  49243. "lsr r7, r7, #16\n\t"
  49244. "mul r6, r7, r6\n\t"
  49245. "lsr r7, r6, #16\n\t"
  49246. "lsl r6, r6, #16\n\t"
  49247. "adds r3, r3, r6\n\t"
  49248. "adc r4, r4, r7\n\t"
  49249. #else
  49250. "umlal r3, r4, %[b], r8\n\t"
  49251. #endif
  49252. "stm %[r]!, {r3}\n\t"
  49253. "mov r5, #0\n\t"
  49254. /* A[91] * B */
  49255. "ldm %[a]!, {r8}\n\t"
  49256. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  49257. "lsl r6, %[b], #16\n\t"
  49258. "lsl r7, r8, #16\n\t"
  49259. "lsr r6, r6, #16\n\t"
  49260. "lsr r7, r7, #16\n\t"
  49261. "mul r7, r6, r7\n\t"
  49262. "adds r4, r4, r7\n\t"
  49263. "adc r5, r5, #0\n\t"
  49264. "lsr r7, r8, #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. "adc r5, r5, r7\n\t"
  49270. "lsr r6, %[b], #16\n\t"
  49271. "lsr r7, r8, #16\n\t"
  49272. "mul r7, r6, r7\n\t"
  49273. "add r5, r5, r7\n\t"
  49274. "lsl r7, r8, #16\n\t"
  49275. "lsr r7, r7, #16\n\t"
  49276. "mul r6, r7, r6\n\t"
  49277. "lsr r7, r6, #16\n\t"
  49278. "lsl r6, r6, #16\n\t"
  49279. "adds r4, r4, r6\n\t"
  49280. "adc r5, r5, r7\n\t"
  49281. #else
  49282. "umlal r4, r5, %[b], r8\n\t"
  49283. #endif
  49284. "stm %[r]!, {r4}\n\t"
  49285. "mov r3, #0\n\t"
  49286. /* A[92] * B */
  49287. "ldm %[a]!, {r8}\n\t"
  49288. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  49289. "lsl r6, %[b], #16\n\t"
  49290. "lsl r7, r8, #16\n\t"
  49291. "lsr r6, r6, #16\n\t"
  49292. "lsr r7, r7, #16\n\t"
  49293. "mul r7, r6, r7\n\t"
  49294. "adds r5, r5, r7\n\t"
  49295. "adc r3, r3, #0\n\t"
  49296. "lsr r7, r8, #16\n\t"
  49297. "mul r6, r7, r6\n\t"
  49298. "lsr r7, r6, #16\n\t"
  49299. "lsl r6, r6, #16\n\t"
  49300. "adds r5, r5, r6\n\t"
  49301. "adc r3, r3, r7\n\t"
  49302. "lsr r6, %[b], #16\n\t"
  49303. "lsr r7, r8, #16\n\t"
  49304. "mul r7, r6, r7\n\t"
  49305. "add r3, r3, r7\n\t"
  49306. "lsl r7, r8, #16\n\t"
  49307. "lsr r7, r7, #16\n\t"
  49308. "mul r6, r7, r6\n\t"
  49309. "lsr r7, r6, #16\n\t"
  49310. "lsl r6, r6, #16\n\t"
  49311. "adds r5, r5, r6\n\t"
  49312. "adc r3, r3, r7\n\t"
  49313. #else
  49314. "umlal r5, r3, %[b], r8\n\t"
  49315. #endif
  49316. "stm %[r]!, {r5}\n\t"
  49317. "mov r4, #0\n\t"
  49318. /* A[93] * B */
  49319. "ldm %[a]!, {r8}\n\t"
  49320. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  49321. "lsl r6, %[b], #16\n\t"
  49322. "lsl r7, r8, #16\n\t"
  49323. "lsr r6, r6, #16\n\t"
  49324. "lsr r7, r7, #16\n\t"
  49325. "mul r7, r6, r7\n\t"
  49326. "adds r3, r3, r7\n\t"
  49327. "adc r4, r4, #0\n\t"
  49328. "lsr r7, r8, #16\n\t"
  49329. "mul r6, r7, r6\n\t"
  49330. "lsr r7, r6, #16\n\t"
  49331. "lsl r6, r6, #16\n\t"
  49332. "adds r3, r3, r6\n\t"
  49333. "adc r4, r4, r7\n\t"
  49334. "lsr r6, %[b], #16\n\t"
  49335. "lsr r7, r8, #16\n\t"
  49336. "mul r7, r6, r7\n\t"
  49337. "add r4, r4, r7\n\t"
  49338. "lsl r7, r8, #16\n\t"
  49339. "lsr r7, r7, #16\n\t"
  49340. "mul r6, r7, r6\n\t"
  49341. "lsr r7, r6, #16\n\t"
  49342. "lsl r6, r6, #16\n\t"
  49343. "adds r3, r3, r6\n\t"
  49344. "adc r4, r4, r7\n\t"
  49345. #else
  49346. "umlal r3, r4, %[b], r8\n\t"
  49347. #endif
  49348. "stm %[r]!, {r3}\n\t"
  49349. "mov r5, #0\n\t"
  49350. /* A[94] * B */
  49351. "ldm %[a]!, {r8}\n\t"
  49352. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  49353. "lsl r6, %[b], #16\n\t"
  49354. "lsl r7, r8, #16\n\t"
  49355. "lsr r6, r6, #16\n\t"
  49356. "lsr r7, r7, #16\n\t"
  49357. "mul r7, r6, r7\n\t"
  49358. "adds r4, r4, r7\n\t"
  49359. "adc r5, r5, #0\n\t"
  49360. "lsr r7, r8, #16\n\t"
  49361. "mul r6, r7, r6\n\t"
  49362. "lsr r7, r6, #16\n\t"
  49363. "lsl r6, r6, #16\n\t"
  49364. "adds r4, r4, r6\n\t"
  49365. "adc r5, r5, r7\n\t"
  49366. "lsr r6, %[b], #16\n\t"
  49367. "lsr r7, r8, #16\n\t"
  49368. "mul r7, r6, r7\n\t"
  49369. "add r5, r5, r7\n\t"
  49370. "lsl r7, r8, #16\n\t"
  49371. "lsr r7, r7, #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. "adc r5, r5, r7\n\t"
  49377. #else
  49378. "umlal r4, r5, %[b], r8\n\t"
  49379. #endif
  49380. "stm %[r]!, {r4}\n\t"
  49381. "mov r3, #0\n\t"
  49382. /* A[95] * B */
  49383. "ldm %[a]!, {r8}\n\t"
  49384. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  49385. "lsl r6, %[b], #16\n\t"
  49386. "lsl r7, r8, #16\n\t"
  49387. "lsr r6, r6, #16\n\t"
  49388. "lsr r7, r7, #16\n\t"
  49389. "mul r7, r6, r7\n\t"
  49390. "adds r5, r5, r7\n\t"
  49391. "adc r3, r3, #0\n\t"
  49392. "lsr r7, r8, #16\n\t"
  49393. "mul r6, r7, r6\n\t"
  49394. "lsr r7, r6, #16\n\t"
  49395. "lsl r6, r6, #16\n\t"
  49396. "adds r5, r5, r6\n\t"
  49397. "adc r3, r3, r7\n\t"
  49398. "lsr r6, %[b], #16\n\t"
  49399. "lsr r7, r8, #16\n\t"
  49400. "mul r7, r6, r7\n\t"
  49401. "add r3, r3, r7\n\t"
  49402. "lsl r7, r8, #16\n\t"
  49403. "lsr r7, r7, #16\n\t"
  49404. "mul r6, r7, r6\n\t"
  49405. "lsr r7, r6, #16\n\t"
  49406. "lsl r6, r6, #16\n\t"
  49407. "adds r5, r5, r6\n\t"
  49408. "adc r3, r3, r7\n\t"
  49409. #else
  49410. "umlal r5, r3, %[b], r8\n\t"
  49411. #endif
  49412. "stm %[r]!, {r5}\n\t"
  49413. "mov r4, #0\n\t"
  49414. /* A[96] * B */
  49415. "ldm %[a]!, {r8}\n\t"
  49416. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  49417. "lsl r6, %[b], #16\n\t"
  49418. "lsl r7, r8, #16\n\t"
  49419. "lsr r6, r6, #16\n\t"
  49420. "lsr r7, r7, #16\n\t"
  49421. "mul r7, r6, r7\n\t"
  49422. "adds r3, r3, r7\n\t"
  49423. "adc r4, r4, #0\n\t"
  49424. "lsr r7, r8, #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 r3, r3, r6\n\t"
  49429. "adc r4, r4, r7\n\t"
  49430. "lsr r6, %[b], #16\n\t"
  49431. "lsr r7, r8, #16\n\t"
  49432. "mul r7, r6, r7\n\t"
  49433. "add r4, r4, r7\n\t"
  49434. "lsl r7, r8, #16\n\t"
  49435. "lsr r7, r7, #16\n\t"
  49436. "mul r6, r7, r6\n\t"
  49437. "lsr r7, r6, #16\n\t"
  49438. "lsl r6, r6, #16\n\t"
  49439. "adds r3, r3, r6\n\t"
  49440. "adc r4, r4, r7\n\t"
  49441. #else
  49442. "umlal r3, r4, %[b], r8\n\t"
  49443. #endif
  49444. "stm %[r]!, {r3}\n\t"
  49445. "mov r5, #0\n\t"
  49446. /* A[97] * B */
  49447. "ldm %[a]!, {r8}\n\t"
  49448. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  49449. "lsl r6, %[b], #16\n\t"
  49450. "lsl r7, r8, #16\n\t"
  49451. "lsr r6, r6, #16\n\t"
  49452. "lsr r7, r7, #16\n\t"
  49453. "mul r7, r6, r7\n\t"
  49454. "adds r4, r4, r7\n\t"
  49455. "adc r5, r5, #0\n\t"
  49456. "lsr r7, r8, #16\n\t"
  49457. "mul r6, r7, r6\n\t"
  49458. "lsr r7, r6, #16\n\t"
  49459. "lsl r6, r6, #16\n\t"
  49460. "adds r4, r4, r6\n\t"
  49461. "adc r5, r5, r7\n\t"
  49462. "lsr r6, %[b], #16\n\t"
  49463. "lsr r7, r8, #16\n\t"
  49464. "mul r7, r6, r7\n\t"
  49465. "add r5, r5, r7\n\t"
  49466. "lsl r7, r8, #16\n\t"
  49467. "lsr r7, r7, #16\n\t"
  49468. "mul r6, r7, r6\n\t"
  49469. "lsr r7, r6, #16\n\t"
  49470. "lsl r6, r6, #16\n\t"
  49471. "adds r4, r4, r6\n\t"
  49472. "adc r5, r5, r7\n\t"
  49473. #else
  49474. "umlal r4, r5, %[b], r8\n\t"
  49475. #endif
  49476. "stm %[r]!, {r4}\n\t"
  49477. "mov r3, #0\n\t"
  49478. /* A[98] * B */
  49479. "ldm %[a]!, {r8}\n\t"
  49480. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  49481. "lsl r6, %[b], #16\n\t"
  49482. "lsl r7, r8, #16\n\t"
  49483. "lsr r6, r6, #16\n\t"
  49484. "lsr r7, r7, #16\n\t"
  49485. "mul r7, r6, r7\n\t"
  49486. "adds r5, r5, r7\n\t"
  49487. "adc r3, r3, #0\n\t"
  49488. "lsr r7, r8, #16\n\t"
  49489. "mul r6, r7, r6\n\t"
  49490. "lsr r7, r6, #16\n\t"
  49491. "lsl r6, r6, #16\n\t"
  49492. "adds r5, r5, r6\n\t"
  49493. "adc r3, r3, r7\n\t"
  49494. "lsr r6, %[b], #16\n\t"
  49495. "lsr r7, r8, #16\n\t"
  49496. "mul r7, r6, r7\n\t"
  49497. "add r3, r3, r7\n\t"
  49498. "lsl r7, r8, #16\n\t"
  49499. "lsr r7, r7, #16\n\t"
  49500. "mul r6, r7, r6\n\t"
  49501. "lsr r7, r6, #16\n\t"
  49502. "lsl r6, r6, #16\n\t"
  49503. "adds r5, r5, r6\n\t"
  49504. "adc r3, r3, r7\n\t"
  49505. #else
  49506. "umlal r5, r3, %[b], r8\n\t"
  49507. #endif
  49508. "stm %[r]!, {r5}\n\t"
  49509. "mov r4, #0\n\t"
  49510. /* A[99] * B */
  49511. "ldm %[a]!, {r8}\n\t"
  49512. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  49513. "lsl r6, %[b], #16\n\t"
  49514. "lsl r7, r8, #16\n\t"
  49515. "lsr r6, r6, #16\n\t"
  49516. "lsr r7, r7, #16\n\t"
  49517. "mul r7, r6, r7\n\t"
  49518. "adds r3, r3, r7\n\t"
  49519. "adc r4, r4, #0\n\t"
  49520. "lsr r7, r8, #16\n\t"
  49521. "mul r6, r7, r6\n\t"
  49522. "lsr r7, r6, #16\n\t"
  49523. "lsl r6, r6, #16\n\t"
  49524. "adds r3, r3, r6\n\t"
  49525. "adc r4, r4, r7\n\t"
  49526. "lsr r6, %[b], #16\n\t"
  49527. "lsr r7, r8, #16\n\t"
  49528. "mul r7, r6, r7\n\t"
  49529. "add r4, r4, r7\n\t"
  49530. "lsl r7, r8, #16\n\t"
  49531. "lsr r7, r7, #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 r3, r3, r6\n\t"
  49536. "adc r4, r4, r7\n\t"
  49537. #else
  49538. "umlal r3, r4, %[b], r8\n\t"
  49539. #endif
  49540. "stm %[r]!, {r3}\n\t"
  49541. "mov r5, #0\n\t"
  49542. /* A[100] * B */
  49543. "ldm %[a]!, {r8}\n\t"
  49544. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  49545. "lsl r6, %[b], #16\n\t"
  49546. "lsl r7, r8, #16\n\t"
  49547. "lsr r6, r6, #16\n\t"
  49548. "lsr r7, r7, #16\n\t"
  49549. "mul r7, r6, r7\n\t"
  49550. "adds r4, r4, r7\n\t"
  49551. "adc r5, r5, #0\n\t"
  49552. "lsr r7, r8, #16\n\t"
  49553. "mul r6, r7, r6\n\t"
  49554. "lsr r7, r6, #16\n\t"
  49555. "lsl r6, r6, #16\n\t"
  49556. "adds r4, r4, r6\n\t"
  49557. "adc r5, r5, r7\n\t"
  49558. "lsr r6, %[b], #16\n\t"
  49559. "lsr r7, r8, #16\n\t"
  49560. "mul r7, r6, r7\n\t"
  49561. "add r5, r5, r7\n\t"
  49562. "lsl r7, r8, #16\n\t"
  49563. "lsr r7, r7, #16\n\t"
  49564. "mul r6, r7, r6\n\t"
  49565. "lsr r7, r6, #16\n\t"
  49566. "lsl r6, r6, #16\n\t"
  49567. "adds r4, r4, r6\n\t"
  49568. "adc r5, r5, r7\n\t"
  49569. #else
  49570. "umlal r4, r5, %[b], r8\n\t"
  49571. #endif
  49572. "stm %[r]!, {r4}\n\t"
  49573. "mov r3, #0\n\t"
  49574. /* A[101] * B */
  49575. "ldm %[a]!, {r8}\n\t"
  49576. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  49577. "lsl r6, %[b], #16\n\t"
  49578. "lsl r7, r8, #16\n\t"
  49579. "lsr r6, r6, #16\n\t"
  49580. "lsr r7, r7, #16\n\t"
  49581. "mul r7, r6, r7\n\t"
  49582. "adds r5, r5, r7\n\t"
  49583. "adc r3, r3, #0\n\t"
  49584. "lsr r7, r8, #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 r5, r5, r6\n\t"
  49589. "adc r3, r3, r7\n\t"
  49590. "lsr r6, %[b], #16\n\t"
  49591. "lsr r7, r8, #16\n\t"
  49592. "mul r7, r6, r7\n\t"
  49593. "add r3, r3, r7\n\t"
  49594. "lsl r7, r8, #16\n\t"
  49595. "lsr r7, r7, #16\n\t"
  49596. "mul r6, r7, r6\n\t"
  49597. "lsr r7, r6, #16\n\t"
  49598. "lsl r6, r6, #16\n\t"
  49599. "adds r5, r5, r6\n\t"
  49600. "adc r3, r3, r7\n\t"
  49601. #else
  49602. "umlal r5, r3, %[b], r8\n\t"
  49603. #endif
  49604. "stm %[r]!, {r5}\n\t"
  49605. "mov r4, #0\n\t"
  49606. /* A[102] * B */
  49607. "ldm %[a]!, {r8}\n\t"
  49608. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  49609. "lsl r6, %[b], #16\n\t"
  49610. "lsl r7, r8, #16\n\t"
  49611. "lsr r6, r6, #16\n\t"
  49612. "lsr r7, r7, #16\n\t"
  49613. "mul r7, r6, r7\n\t"
  49614. "adds r3, r3, r7\n\t"
  49615. "adc r4, r4, #0\n\t"
  49616. "lsr r7, r8, #16\n\t"
  49617. "mul r6, r7, r6\n\t"
  49618. "lsr r7, r6, #16\n\t"
  49619. "lsl r6, r6, #16\n\t"
  49620. "adds r3, r3, r6\n\t"
  49621. "adc r4, r4, r7\n\t"
  49622. "lsr r6, %[b], #16\n\t"
  49623. "lsr r7, r8, #16\n\t"
  49624. "mul r7, r6, r7\n\t"
  49625. "add r4, r4, r7\n\t"
  49626. "lsl r7, r8, #16\n\t"
  49627. "lsr r7, r7, #16\n\t"
  49628. "mul r6, r7, r6\n\t"
  49629. "lsr r7, r6, #16\n\t"
  49630. "lsl r6, r6, #16\n\t"
  49631. "adds r3, r3, r6\n\t"
  49632. "adc r4, r4, r7\n\t"
  49633. #else
  49634. "umlal r3, r4, %[b], r8\n\t"
  49635. #endif
  49636. "stm %[r]!, {r3}\n\t"
  49637. "mov r5, #0\n\t"
  49638. /* A[103] * B */
  49639. "ldm %[a]!, {r8}\n\t"
  49640. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  49641. "lsl r6, %[b], #16\n\t"
  49642. "lsl r7, r8, #16\n\t"
  49643. "lsr r6, r6, #16\n\t"
  49644. "lsr r7, r7, #16\n\t"
  49645. "mul r7, r6, r7\n\t"
  49646. "adds r4, r4, r7\n\t"
  49647. "adc r5, r5, #0\n\t"
  49648. "lsr r7, r8, #16\n\t"
  49649. "mul r6, r7, r6\n\t"
  49650. "lsr r7, r6, #16\n\t"
  49651. "lsl r6, r6, #16\n\t"
  49652. "adds r4, r4, r6\n\t"
  49653. "adc r5, r5, r7\n\t"
  49654. "lsr r6, %[b], #16\n\t"
  49655. "lsr r7, r8, #16\n\t"
  49656. "mul r7, r6, r7\n\t"
  49657. "add r5, r5, r7\n\t"
  49658. "lsl r7, r8, #16\n\t"
  49659. "lsr r7, r7, #16\n\t"
  49660. "mul r6, r7, r6\n\t"
  49661. "lsr r7, r6, #16\n\t"
  49662. "lsl r6, r6, #16\n\t"
  49663. "adds r4, r4, r6\n\t"
  49664. "adc r5, r5, r7\n\t"
  49665. #else
  49666. "umlal r4, r5, %[b], r8\n\t"
  49667. #endif
  49668. "stm %[r]!, {r4}\n\t"
  49669. "mov r3, #0\n\t"
  49670. /* A[104] * B */
  49671. "ldm %[a]!, {r8}\n\t"
  49672. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  49673. "lsl r6, %[b], #16\n\t"
  49674. "lsl r7, r8, #16\n\t"
  49675. "lsr r6, r6, #16\n\t"
  49676. "lsr r7, r7, #16\n\t"
  49677. "mul r7, r6, r7\n\t"
  49678. "adds r5, r5, r7\n\t"
  49679. "adc r3, r3, #0\n\t"
  49680. "lsr r7, r8, #16\n\t"
  49681. "mul r6, r7, r6\n\t"
  49682. "lsr r7, r6, #16\n\t"
  49683. "lsl r6, r6, #16\n\t"
  49684. "adds r5, r5, r6\n\t"
  49685. "adc r3, r3, r7\n\t"
  49686. "lsr r6, %[b], #16\n\t"
  49687. "lsr r7, r8, #16\n\t"
  49688. "mul r7, r6, r7\n\t"
  49689. "add r3, r3, r7\n\t"
  49690. "lsl r7, r8, #16\n\t"
  49691. "lsr r7, r7, #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 r5, r5, r6\n\t"
  49696. "adc r3, r3, r7\n\t"
  49697. #else
  49698. "umlal r5, r3, %[b], r8\n\t"
  49699. #endif
  49700. "stm %[r]!, {r5}\n\t"
  49701. "mov r4, #0\n\t"
  49702. /* A[105] * B */
  49703. "ldm %[a]!, {r8}\n\t"
  49704. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  49705. "lsl r6, %[b], #16\n\t"
  49706. "lsl r7, r8, #16\n\t"
  49707. "lsr r6, r6, #16\n\t"
  49708. "lsr r7, r7, #16\n\t"
  49709. "mul r7, r6, r7\n\t"
  49710. "adds r3, r3, r7\n\t"
  49711. "adc r4, r4, #0\n\t"
  49712. "lsr r7, r8, #16\n\t"
  49713. "mul r6, r7, r6\n\t"
  49714. "lsr r7, r6, #16\n\t"
  49715. "lsl r6, r6, #16\n\t"
  49716. "adds r3, r3, r6\n\t"
  49717. "adc r4, r4, r7\n\t"
  49718. "lsr r6, %[b], #16\n\t"
  49719. "lsr r7, r8, #16\n\t"
  49720. "mul r7, r6, r7\n\t"
  49721. "add r4, r4, r7\n\t"
  49722. "lsl r7, r8, #16\n\t"
  49723. "lsr r7, r7, #16\n\t"
  49724. "mul r6, r7, r6\n\t"
  49725. "lsr r7, r6, #16\n\t"
  49726. "lsl r6, r6, #16\n\t"
  49727. "adds r3, r3, r6\n\t"
  49728. "adc r4, r4, r7\n\t"
  49729. #else
  49730. "umlal r3, r4, %[b], r8\n\t"
  49731. #endif
  49732. "stm %[r]!, {r3}\n\t"
  49733. "mov r5, #0\n\t"
  49734. /* A[106] * B */
  49735. "ldm %[a]!, {r8}\n\t"
  49736. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  49737. "lsl r6, %[b], #16\n\t"
  49738. "lsl r7, r8, #16\n\t"
  49739. "lsr r6, r6, #16\n\t"
  49740. "lsr r7, r7, #16\n\t"
  49741. "mul r7, r6, r7\n\t"
  49742. "adds r4, r4, r7\n\t"
  49743. "adc r5, r5, #0\n\t"
  49744. "lsr r7, r8, #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. "adc r5, r5, r7\n\t"
  49750. "lsr r6, %[b], #16\n\t"
  49751. "lsr r7, r8, #16\n\t"
  49752. "mul r7, r6, r7\n\t"
  49753. "add r5, r5, r7\n\t"
  49754. "lsl r7, r8, #16\n\t"
  49755. "lsr r7, r7, #16\n\t"
  49756. "mul r6, r7, r6\n\t"
  49757. "lsr r7, r6, #16\n\t"
  49758. "lsl r6, r6, #16\n\t"
  49759. "adds r4, r4, r6\n\t"
  49760. "adc r5, r5, r7\n\t"
  49761. #else
  49762. "umlal r4, r5, %[b], r8\n\t"
  49763. #endif
  49764. "stm %[r]!, {r4}\n\t"
  49765. "mov r3, #0\n\t"
  49766. /* A[107] * B */
  49767. "ldm %[a]!, {r8}\n\t"
  49768. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  49769. "lsl r6, %[b], #16\n\t"
  49770. "lsl r7, r8, #16\n\t"
  49771. "lsr r6, r6, #16\n\t"
  49772. "lsr r7, r7, #16\n\t"
  49773. "mul r7, r6, r7\n\t"
  49774. "adds r5, r5, r7\n\t"
  49775. "adc r3, r3, #0\n\t"
  49776. "lsr r7, r8, #16\n\t"
  49777. "mul r6, r7, r6\n\t"
  49778. "lsr r7, r6, #16\n\t"
  49779. "lsl r6, r6, #16\n\t"
  49780. "adds r5, r5, r6\n\t"
  49781. "adc r3, r3, r7\n\t"
  49782. "lsr r6, %[b], #16\n\t"
  49783. "lsr r7, r8, #16\n\t"
  49784. "mul r7, r6, r7\n\t"
  49785. "add r3, r3, r7\n\t"
  49786. "lsl r7, r8, #16\n\t"
  49787. "lsr r7, r7, #16\n\t"
  49788. "mul r6, r7, r6\n\t"
  49789. "lsr r7, r6, #16\n\t"
  49790. "lsl r6, r6, #16\n\t"
  49791. "adds r5, r5, r6\n\t"
  49792. "adc r3, r3, r7\n\t"
  49793. #else
  49794. "umlal r5, r3, %[b], r8\n\t"
  49795. #endif
  49796. "stm %[r]!, {r5}\n\t"
  49797. "mov r4, #0\n\t"
  49798. /* A[108] * B */
  49799. "ldm %[a]!, {r8}\n\t"
  49800. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  49801. "lsl r6, %[b], #16\n\t"
  49802. "lsl r7, r8, #16\n\t"
  49803. "lsr r6, r6, #16\n\t"
  49804. "lsr r7, r7, #16\n\t"
  49805. "mul r7, r6, r7\n\t"
  49806. "adds r3, r3, r7\n\t"
  49807. "adc r4, r4, #0\n\t"
  49808. "lsr r7, r8, #16\n\t"
  49809. "mul r6, r7, r6\n\t"
  49810. "lsr r7, r6, #16\n\t"
  49811. "lsl r6, r6, #16\n\t"
  49812. "adds r3, r3, r6\n\t"
  49813. "adc r4, r4, r7\n\t"
  49814. "lsr r6, %[b], #16\n\t"
  49815. "lsr r7, r8, #16\n\t"
  49816. "mul r7, r6, r7\n\t"
  49817. "add r4, r4, r7\n\t"
  49818. "lsl r7, r8, #16\n\t"
  49819. "lsr r7, r7, #16\n\t"
  49820. "mul r6, r7, r6\n\t"
  49821. "lsr r7, r6, #16\n\t"
  49822. "lsl r6, r6, #16\n\t"
  49823. "adds r3, r3, r6\n\t"
  49824. "adc r4, r4, r7\n\t"
  49825. #else
  49826. "umlal r3, r4, %[b], r8\n\t"
  49827. #endif
  49828. "stm %[r]!, {r3}\n\t"
  49829. "mov r5, #0\n\t"
  49830. /* A[109] * B */
  49831. "ldm %[a]!, {r8}\n\t"
  49832. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  49833. "lsl r6, %[b], #16\n\t"
  49834. "lsl r7, r8, #16\n\t"
  49835. "lsr r6, r6, #16\n\t"
  49836. "lsr r7, r7, #16\n\t"
  49837. "mul r7, r6, r7\n\t"
  49838. "adds r4, r4, r7\n\t"
  49839. "adc r5, r5, #0\n\t"
  49840. "lsr r7, r8, #16\n\t"
  49841. "mul r6, r7, r6\n\t"
  49842. "lsr r7, r6, #16\n\t"
  49843. "lsl r6, r6, #16\n\t"
  49844. "adds r4, r4, r6\n\t"
  49845. "adc r5, r5, r7\n\t"
  49846. "lsr r6, %[b], #16\n\t"
  49847. "lsr r7, r8, #16\n\t"
  49848. "mul r7, r6, r7\n\t"
  49849. "add r5, r5, r7\n\t"
  49850. "lsl r7, r8, #16\n\t"
  49851. "lsr r7, r7, #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. "adc r5, r5, r7\n\t"
  49857. #else
  49858. "umlal r4, r5, %[b], r8\n\t"
  49859. #endif
  49860. "stm %[r]!, {r4}\n\t"
  49861. "mov r3, #0\n\t"
  49862. /* A[110] * B */
  49863. "ldm %[a]!, {r8}\n\t"
  49864. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  49865. "lsl r6, %[b], #16\n\t"
  49866. "lsl r7, r8, #16\n\t"
  49867. "lsr r6, r6, #16\n\t"
  49868. "lsr r7, r7, #16\n\t"
  49869. "mul r7, r6, r7\n\t"
  49870. "adds r5, r5, r7\n\t"
  49871. "adc r3, r3, #0\n\t"
  49872. "lsr r7, r8, #16\n\t"
  49873. "mul r6, r7, r6\n\t"
  49874. "lsr r7, r6, #16\n\t"
  49875. "lsl r6, r6, #16\n\t"
  49876. "adds r5, r5, r6\n\t"
  49877. "adc r3, r3, r7\n\t"
  49878. "lsr r6, %[b], #16\n\t"
  49879. "lsr r7, r8, #16\n\t"
  49880. "mul r7, r6, r7\n\t"
  49881. "add r3, r3, r7\n\t"
  49882. "lsl r7, r8, #16\n\t"
  49883. "lsr r7, r7, #16\n\t"
  49884. "mul r6, r7, r6\n\t"
  49885. "lsr r7, r6, #16\n\t"
  49886. "lsl r6, r6, #16\n\t"
  49887. "adds r5, r5, r6\n\t"
  49888. "adc r3, r3, r7\n\t"
  49889. #else
  49890. "umlal r5, r3, %[b], r8\n\t"
  49891. #endif
  49892. "stm %[r]!, {r5}\n\t"
  49893. "mov r4, #0\n\t"
  49894. /* A[111] * B */
  49895. "ldm %[a]!, {r8}\n\t"
  49896. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  49897. "lsl r6, %[b], #16\n\t"
  49898. "lsl r7, r8, #16\n\t"
  49899. "lsr r6, r6, #16\n\t"
  49900. "lsr r7, r7, #16\n\t"
  49901. "mul r7, r6, r7\n\t"
  49902. "adds r3, r3, r7\n\t"
  49903. "adc r4, r4, #0\n\t"
  49904. "lsr r7, r8, #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 r3, r3, r6\n\t"
  49909. "adc r4, r4, r7\n\t"
  49910. "lsr r6, %[b], #16\n\t"
  49911. "lsr r7, r8, #16\n\t"
  49912. "mul r7, r6, r7\n\t"
  49913. "add r4, r4, r7\n\t"
  49914. "lsl r7, r8, #16\n\t"
  49915. "lsr r7, r7, #16\n\t"
  49916. "mul r6, r7, r6\n\t"
  49917. "lsr r7, r6, #16\n\t"
  49918. "lsl r6, r6, #16\n\t"
  49919. "adds r3, r3, r6\n\t"
  49920. "adc r4, r4, r7\n\t"
  49921. #else
  49922. "umlal r3, r4, %[b], r8\n\t"
  49923. #endif
  49924. "stm %[r]!, {r3}\n\t"
  49925. "mov r5, #0\n\t"
  49926. /* A[112] * B */
  49927. "ldm %[a]!, {r8}\n\t"
  49928. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  49929. "lsl r6, %[b], #16\n\t"
  49930. "lsl r7, r8, #16\n\t"
  49931. "lsr r6, r6, #16\n\t"
  49932. "lsr r7, r7, #16\n\t"
  49933. "mul r7, r6, r7\n\t"
  49934. "adds r4, r4, r7\n\t"
  49935. "adc r5, r5, #0\n\t"
  49936. "lsr r7, r8, #16\n\t"
  49937. "mul r6, r7, r6\n\t"
  49938. "lsr r7, r6, #16\n\t"
  49939. "lsl r6, r6, #16\n\t"
  49940. "adds r4, r4, r6\n\t"
  49941. "adc r5, r5, r7\n\t"
  49942. "lsr r6, %[b], #16\n\t"
  49943. "lsr r7, r8, #16\n\t"
  49944. "mul r7, r6, r7\n\t"
  49945. "add r5, r5, r7\n\t"
  49946. "lsl r7, r8, #16\n\t"
  49947. "lsr r7, r7, #16\n\t"
  49948. "mul r6, r7, r6\n\t"
  49949. "lsr r7, r6, #16\n\t"
  49950. "lsl r6, r6, #16\n\t"
  49951. "adds r4, r4, r6\n\t"
  49952. "adc r5, r5, r7\n\t"
  49953. #else
  49954. "umlal r4, r5, %[b], r8\n\t"
  49955. #endif
  49956. "stm %[r]!, {r4}\n\t"
  49957. "mov r3, #0\n\t"
  49958. /* A[113] * B */
  49959. "ldm %[a]!, {r8}\n\t"
  49960. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  49961. "lsl r6, %[b], #16\n\t"
  49962. "lsl r7, r8, #16\n\t"
  49963. "lsr r6, r6, #16\n\t"
  49964. "lsr r7, r7, #16\n\t"
  49965. "mul r7, r6, r7\n\t"
  49966. "adds r5, r5, r7\n\t"
  49967. "adc r3, r3, #0\n\t"
  49968. "lsr r7, r8, #16\n\t"
  49969. "mul r6, r7, r6\n\t"
  49970. "lsr r7, r6, #16\n\t"
  49971. "lsl r6, r6, #16\n\t"
  49972. "adds r5, r5, r6\n\t"
  49973. "adc r3, r3, r7\n\t"
  49974. "lsr r6, %[b], #16\n\t"
  49975. "lsr r7, r8, #16\n\t"
  49976. "mul r7, r6, r7\n\t"
  49977. "add r3, r3, r7\n\t"
  49978. "lsl r7, r8, #16\n\t"
  49979. "lsr r7, r7, #16\n\t"
  49980. "mul r6, r7, r6\n\t"
  49981. "lsr r7, r6, #16\n\t"
  49982. "lsl r6, r6, #16\n\t"
  49983. "adds r5, r5, r6\n\t"
  49984. "adc r3, r3, r7\n\t"
  49985. #else
  49986. "umlal r5, r3, %[b], r8\n\t"
  49987. #endif
  49988. "stm %[r]!, {r5}\n\t"
  49989. "mov r4, #0\n\t"
  49990. /* A[114] * B */
  49991. "ldm %[a]!, {r8}\n\t"
  49992. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  49993. "lsl r6, %[b], #16\n\t"
  49994. "lsl r7, r8, #16\n\t"
  49995. "lsr r6, r6, #16\n\t"
  49996. "lsr r7, r7, #16\n\t"
  49997. "mul r7, r6, r7\n\t"
  49998. "adds r3, r3, r7\n\t"
  49999. "adc r4, r4, #0\n\t"
  50000. "lsr r7, r8, #16\n\t"
  50001. "mul r6, r7, r6\n\t"
  50002. "lsr r7, r6, #16\n\t"
  50003. "lsl r6, r6, #16\n\t"
  50004. "adds r3, r3, r6\n\t"
  50005. "adc r4, r4, r7\n\t"
  50006. "lsr r6, %[b], #16\n\t"
  50007. "lsr r7, r8, #16\n\t"
  50008. "mul r7, r6, r7\n\t"
  50009. "add r4, r4, r7\n\t"
  50010. "lsl r7, r8, #16\n\t"
  50011. "lsr r7, r7, #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 r3, r3, r6\n\t"
  50016. "adc r4, r4, r7\n\t"
  50017. #else
  50018. "umlal r3, r4, %[b], r8\n\t"
  50019. #endif
  50020. "stm %[r]!, {r3}\n\t"
  50021. "mov r5, #0\n\t"
  50022. /* A[115] * B */
  50023. "ldm %[a]!, {r8}\n\t"
  50024. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  50025. "lsl r6, %[b], #16\n\t"
  50026. "lsl r7, r8, #16\n\t"
  50027. "lsr r6, r6, #16\n\t"
  50028. "lsr r7, r7, #16\n\t"
  50029. "mul r7, r6, r7\n\t"
  50030. "adds r4, r4, r7\n\t"
  50031. "adc r5, r5, #0\n\t"
  50032. "lsr r7, r8, #16\n\t"
  50033. "mul r6, r7, r6\n\t"
  50034. "lsr r7, r6, #16\n\t"
  50035. "lsl r6, r6, #16\n\t"
  50036. "adds r4, r4, r6\n\t"
  50037. "adc r5, r5, r7\n\t"
  50038. "lsr r6, %[b], #16\n\t"
  50039. "lsr r7, r8, #16\n\t"
  50040. "mul r7, r6, r7\n\t"
  50041. "add r5, r5, r7\n\t"
  50042. "lsl r7, r8, #16\n\t"
  50043. "lsr r7, r7, #16\n\t"
  50044. "mul r6, r7, r6\n\t"
  50045. "lsr r7, r6, #16\n\t"
  50046. "lsl r6, r6, #16\n\t"
  50047. "adds r4, r4, r6\n\t"
  50048. "adc r5, r5, r7\n\t"
  50049. #else
  50050. "umlal r4, r5, %[b], r8\n\t"
  50051. #endif
  50052. "stm %[r]!, {r4}\n\t"
  50053. "mov r3, #0\n\t"
  50054. /* A[116] * B */
  50055. "ldm %[a]!, {r8}\n\t"
  50056. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  50057. "lsl r6, %[b], #16\n\t"
  50058. "lsl r7, r8, #16\n\t"
  50059. "lsr r6, r6, #16\n\t"
  50060. "lsr r7, r7, #16\n\t"
  50061. "mul r7, r6, r7\n\t"
  50062. "adds r5, r5, r7\n\t"
  50063. "adc r3, r3, #0\n\t"
  50064. "lsr r7, r8, #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 r5, r5, r6\n\t"
  50069. "adc r3, r3, r7\n\t"
  50070. "lsr r6, %[b], #16\n\t"
  50071. "lsr r7, r8, #16\n\t"
  50072. "mul r7, r6, r7\n\t"
  50073. "add r3, r3, r7\n\t"
  50074. "lsl r7, r8, #16\n\t"
  50075. "lsr r7, r7, #16\n\t"
  50076. "mul r6, r7, r6\n\t"
  50077. "lsr r7, r6, #16\n\t"
  50078. "lsl r6, r6, #16\n\t"
  50079. "adds r5, r5, r6\n\t"
  50080. "adc r3, r3, r7\n\t"
  50081. #else
  50082. "umlal r5, r3, %[b], r8\n\t"
  50083. #endif
  50084. "stm %[r]!, {r5}\n\t"
  50085. "mov r4, #0\n\t"
  50086. /* A[117] * B */
  50087. "ldm %[a]!, {r8}\n\t"
  50088. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  50089. "lsl r6, %[b], #16\n\t"
  50090. "lsl r7, r8, #16\n\t"
  50091. "lsr r6, r6, #16\n\t"
  50092. "lsr r7, r7, #16\n\t"
  50093. "mul r7, r6, r7\n\t"
  50094. "adds r3, r3, r7\n\t"
  50095. "adc r4, r4, #0\n\t"
  50096. "lsr r7, r8, #16\n\t"
  50097. "mul r6, r7, r6\n\t"
  50098. "lsr r7, r6, #16\n\t"
  50099. "lsl r6, r6, #16\n\t"
  50100. "adds r3, r3, r6\n\t"
  50101. "adc r4, r4, r7\n\t"
  50102. "lsr r6, %[b], #16\n\t"
  50103. "lsr r7, r8, #16\n\t"
  50104. "mul r7, r6, r7\n\t"
  50105. "add r4, r4, r7\n\t"
  50106. "lsl r7, r8, #16\n\t"
  50107. "lsr r7, r7, #16\n\t"
  50108. "mul r6, r7, r6\n\t"
  50109. "lsr r7, r6, #16\n\t"
  50110. "lsl r6, r6, #16\n\t"
  50111. "adds r3, r3, r6\n\t"
  50112. "adc r4, r4, r7\n\t"
  50113. #else
  50114. "umlal r3, r4, %[b], r8\n\t"
  50115. #endif
  50116. "stm %[r]!, {r3}\n\t"
  50117. "mov r5, #0\n\t"
  50118. /* A[118] * B */
  50119. "ldm %[a]!, {r8}\n\t"
  50120. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  50121. "lsl r6, %[b], #16\n\t"
  50122. "lsl r7, r8, #16\n\t"
  50123. "lsr r6, r6, #16\n\t"
  50124. "lsr r7, r7, #16\n\t"
  50125. "mul r7, r6, r7\n\t"
  50126. "adds r4, r4, r7\n\t"
  50127. "adc r5, r5, #0\n\t"
  50128. "lsr r7, r8, #16\n\t"
  50129. "mul r6, r7, r6\n\t"
  50130. "lsr r7, r6, #16\n\t"
  50131. "lsl r6, r6, #16\n\t"
  50132. "adds r4, r4, r6\n\t"
  50133. "adc r5, r5, r7\n\t"
  50134. "lsr r6, %[b], #16\n\t"
  50135. "lsr r7, r8, #16\n\t"
  50136. "mul r7, r6, r7\n\t"
  50137. "add r5, r5, r7\n\t"
  50138. "lsl r7, r8, #16\n\t"
  50139. "lsr r7, r7, #16\n\t"
  50140. "mul r6, r7, r6\n\t"
  50141. "lsr r7, r6, #16\n\t"
  50142. "lsl r6, r6, #16\n\t"
  50143. "adds r4, r4, r6\n\t"
  50144. "adc r5, r5, r7\n\t"
  50145. #else
  50146. "umlal r4, r5, %[b], r8\n\t"
  50147. #endif
  50148. "stm %[r]!, {r4}\n\t"
  50149. "mov r3, #0\n\t"
  50150. /* A[119] * B */
  50151. "ldm %[a]!, {r8}\n\t"
  50152. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  50153. "lsl r6, %[b], #16\n\t"
  50154. "lsl r7, r8, #16\n\t"
  50155. "lsr r6, r6, #16\n\t"
  50156. "lsr r7, r7, #16\n\t"
  50157. "mul r7, r6, r7\n\t"
  50158. "adds r5, r5, r7\n\t"
  50159. "adc r3, r3, #0\n\t"
  50160. "lsr r7, r8, #16\n\t"
  50161. "mul r6, r7, r6\n\t"
  50162. "lsr r7, r6, #16\n\t"
  50163. "lsl r6, r6, #16\n\t"
  50164. "adds r5, r5, r6\n\t"
  50165. "adc r3, r3, r7\n\t"
  50166. "lsr r6, %[b], #16\n\t"
  50167. "lsr r7, r8, #16\n\t"
  50168. "mul r7, r6, r7\n\t"
  50169. "add r3, r3, r7\n\t"
  50170. "lsl r7, r8, #16\n\t"
  50171. "lsr r7, r7, #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 r5, r5, r6\n\t"
  50176. "adc r3, r3, r7\n\t"
  50177. #else
  50178. "umlal r5, r3, %[b], r8\n\t"
  50179. #endif
  50180. "stm %[r]!, {r5}\n\t"
  50181. "mov r4, #0\n\t"
  50182. /* A[120] * B */
  50183. "ldm %[a]!, {r8}\n\t"
  50184. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  50185. "lsl r6, %[b], #16\n\t"
  50186. "lsl r7, r8, #16\n\t"
  50187. "lsr r6, r6, #16\n\t"
  50188. "lsr r7, r7, #16\n\t"
  50189. "mul r7, r6, r7\n\t"
  50190. "adds r3, r3, r7\n\t"
  50191. "adc r4, r4, #0\n\t"
  50192. "lsr r7, r8, #16\n\t"
  50193. "mul r6, r7, r6\n\t"
  50194. "lsr r7, r6, #16\n\t"
  50195. "lsl r6, r6, #16\n\t"
  50196. "adds r3, r3, r6\n\t"
  50197. "adc r4, r4, r7\n\t"
  50198. "lsr r6, %[b], #16\n\t"
  50199. "lsr r7, r8, #16\n\t"
  50200. "mul r7, r6, r7\n\t"
  50201. "add r4, r4, r7\n\t"
  50202. "lsl r7, r8, #16\n\t"
  50203. "lsr r7, r7, #16\n\t"
  50204. "mul r6, r7, r6\n\t"
  50205. "lsr r7, r6, #16\n\t"
  50206. "lsl r6, r6, #16\n\t"
  50207. "adds r3, r3, r6\n\t"
  50208. "adc r4, r4, r7\n\t"
  50209. #else
  50210. "umlal r3, r4, %[b], r8\n\t"
  50211. #endif
  50212. "stm %[r]!, {r3}\n\t"
  50213. "mov r5, #0\n\t"
  50214. /* A[121] * B */
  50215. "ldm %[a]!, {r8}\n\t"
  50216. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  50217. "lsl r6, %[b], #16\n\t"
  50218. "lsl r7, r8, #16\n\t"
  50219. "lsr r6, r6, #16\n\t"
  50220. "lsr r7, r7, #16\n\t"
  50221. "mul r7, r6, r7\n\t"
  50222. "adds r4, r4, r7\n\t"
  50223. "adc r5, r5, #0\n\t"
  50224. "lsr r7, r8, #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. "adc r5, r5, r7\n\t"
  50230. "lsr r6, %[b], #16\n\t"
  50231. "lsr r7, r8, #16\n\t"
  50232. "mul r7, r6, r7\n\t"
  50233. "add r5, r5, r7\n\t"
  50234. "lsl r7, r8, #16\n\t"
  50235. "lsr r7, r7, #16\n\t"
  50236. "mul r6, r7, r6\n\t"
  50237. "lsr r7, r6, #16\n\t"
  50238. "lsl r6, r6, #16\n\t"
  50239. "adds r4, r4, r6\n\t"
  50240. "adc r5, r5, r7\n\t"
  50241. #else
  50242. "umlal r4, r5, %[b], r8\n\t"
  50243. #endif
  50244. "stm %[r]!, {r4}\n\t"
  50245. "mov r3, #0\n\t"
  50246. /* A[122] * B */
  50247. "ldm %[a]!, {r8}\n\t"
  50248. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  50249. "lsl r6, %[b], #16\n\t"
  50250. "lsl r7, r8, #16\n\t"
  50251. "lsr r6, r6, #16\n\t"
  50252. "lsr r7, r7, #16\n\t"
  50253. "mul r7, r6, r7\n\t"
  50254. "adds r5, r5, r7\n\t"
  50255. "adc r3, r3, #0\n\t"
  50256. "lsr r7, r8, #16\n\t"
  50257. "mul r6, r7, r6\n\t"
  50258. "lsr r7, r6, #16\n\t"
  50259. "lsl r6, r6, #16\n\t"
  50260. "adds r5, r5, r6\n\t"
  50261. "adc r3, r3, r7\n\t"
  50262. "lsr r6, %[b], #16\n\t"
  50263. "lsr r7, r8, #16\n\t"
  50264. "mul r7, r6, r7\n\t"
  50265. "add r3, r3, r7\n\t"
  50266. "lsl r7, r8, #16\n\t"
  50267. "lsr r7, r7, #16\n\t"
  50268. "mul r6, r7, r6\n\t"
  50269. "lsr r7, r6, #16\n\t"
  50270. "lsl r6, r6, #16\n\t"
  50271. "adds r5, r5, r6\n\t"
  50272. "adc r3, r3, r7\n\t"
  50273. #else
  50274. "umlal r5, r3, %[b], r8\n\t"
  50275. #endif
  50276. "stm %[r]!, {r5}\n\t"
  50277. "mov r4, #0\n\t"
  50278. /* A[123] * B */
  50279. "ldm %[a]!, {r8}\n\t"
  50280. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  50281. "lsl r6, %[b], #16\n\t"
  50282. "lsl r7, r8, #16\n\t"
  50283. "lsr r6, r6, #16\n\t"
  50284. "lsr r7, r7, #16\n\t"
  50285. "mul r7, r6, r7\n\t"
  50286. "adds r3, r3, r7\n\t"
  50287. "adc r4, r4, #0\n\t"
  50288. "lsr r7, r8, #16\n\t"
  50289. "mul r6, r7, r6\n\t"
  50290. "lsr r7, r6, #16\n\t"
  50291. "lsl r6, r6, #16\n\t"
  50292. "adds r3, r3, r6\n\t"
  50293. "adc r4, r4, r7\n\t"
  50294. "lsr r6, %[b], #16\n\t"
  50295. "lsr r7, r8, #16\n\t"
  50296. "mul r7, r6, r7\n\t"
  50297. "add r4, r4, r7\n\t"
  50298. "lsl r7, r8, #16\n\t"
  50299. "lsr r7, r7, #16\n\t"
  50300. "mul r6, r7, r6\n\t"
  50301. "lsr r7, r6, #16\n\t"
  50302. "lsl r6, r6, #16\n\t"
  50303. "adds r3, r3, r6\n\t"
  50304. "adc r4, r4, r7\n\t"
  50305. #else
  50306. "umlal r3, r4, %[b], r8\n\t"
  50307. #endif
  50308. "stm %[r]!, {r3}\n\t"
  50309. "mov r5, #0\n\t"
  50310. /* A[124] * B */
  50311. "ldm %[a]!, {r8}\n\t"
  50312. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  50313. "lsl r6, %[b], #16\n\t"
  50314. "lsl r7, r8, #16\n\t"
  50315. "lsr r6, r6, #16\n\t"
  50316. "lsr r7, r7, #16\n\t"
  50317. "mul r7, r6, r7\n\t"
  50318. "adds r4, r4, r7\n\t"
  50319. "adc r5, r5, #0\n\t"
  50320. "lsr r7, r8, #16\n\t"
  50321. "mul r6, r7, r6\n\t"
  50322. "lsr r7, r6, #16\n\t"
  50323. "lsl r6, r6, #16\n\t"
  50324. "adds r4, r4, r6\n\t"
  50325. "adc r5, r5, r7\n\t"
  50326. "lsr r6, %[b], #16\n\t"
  50327. "lsr r7, r8, #16\n\t"
  50328. "mul r7, r6, r7\n\t"
  50329. "add r5, r5, r7\n\t"
  50330. "lsl r7, r8, #16\n\t"
  50331. "lsr r7, r7, #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. "adc r5, r5, r7\n\t"
  50337. #else
  50338. "umlal r4, r5, %[b], r8\n\t"
  50339. #endif
  50340. "stm %[r]!, {r4}\n\t"
  50341. "mov r3, #0\n\t"
  50342. /* A[125] * B */
  50343. "ldm %[a]!, {r8}\n\t"
  50344. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  50345. "lsl r6, %[b], #16\n\t"
  50346. "lsl r7, r8, #16\n\t"
  50347. "lsr r6, r6, #16\n\t"
  50348. "lsr r7, r7, #16\n\t"
  50349. "mul r7, r6, r7\n\t"
  50350. "adds r5, r5, r7\n\t"
  50351. "adc r3, r3, #0\n\t"
  50352. "lsr r7, r8, #16\n\t"
  50353. "mul r6, r7, r6\n\t"
  50354. "lsr r7, r6, #16\n\t"
  50355. "lsl r6, r6, #16\n\t"
  50356. "adds r5, r5, r6\n\t"
  50357. "adc r3, r3, r7\n\t"
  50358. "lsr r6, %[b], #16\n\t"
  50359. "lsr r7, r8, #16\n\t"
  50360. "mul r7, r6, r7\n\t"
  50361. "add r3, r3, r7\n\t"
  50362. "lsl r7, r8, #16\n\t"
  50363. "lsr r7, r7, #16\n\t"
  50364. "mul r6, r7, r6\n\t"
  50365. "lsr r7, r6, #16\n\t"
  50366. "lsl r6, r6, #16\n\t"
  50367. "adds r5, r5, r6\n\t"
  50368. "adc r3, r3, r7\n\t"
  50369. #else
  50370. "umlal r5, r3, %[b], r8\n\t"
  50371. #endif
  50372. "stm %[r]!, {r5}\n\t"
  50373. "mov r4, #0\n\t"
  50374. /* A[126] * B */
  50375. "ldm %[a]!, {r8}\n\t"
  50376. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  50377. "lsl r6, %[b], #16\n\t"
  50378. "lsl r7, r8, #16\n\t"
  50379. "lsr r6, r6, #16\n\t"
  50380. "lsr r7, r7, #16\n\t"
  50381. "mul r7, r6, r7\n\t"
  50382. "adds r3, r3, r7\n\t"
  50383. "adc r4, r4, #0\n\t"
  50384. "lsr r7, r8, #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 r3, r3, r6\n\t"
  50389. "adc r4, r4, r7\n\t"
  50390. "lsr r6, %[b], #16\n\t"
  50391. "lsr r7, r8, #16\n\t"
  50392. "mul r7, r6, r7\n\t"
  50393. "add r4, r4, r7\n\t"
  50394. "lsl r7, r8, #16\n\t"
  50395. "lsr r7, r7, #16\n\t"
  50396. "mul r6, r7, r6\n\t"
  50397. "lsr r7, r6, #16\n\t"
  50398. "lsl r6, r6, #16\n\t"
  50399. "adds r3, r3, r6\n\t"
  50400. "adc r4, r4, r7\n\t"
  50401. #else
  50402. "umlal r3, r4, %[b], r8\n\t"
  50403. #endif
  50404. "stm %[r]!, {r3}\n\t"
  50405. "mov r5, #0\n\t"
  50406. /* A[127] * B */
  50407. "ldm %[a]!, {r8}\n\t"
  50408. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  50409. "lsl r6, %[b], #16\n\t"
  50410. "lsl r7, r8, #16\n\t"
  50411. "lsr r6, r6, #16\n\t"
  50412. "lsr r7, r7, #16\n\t"
  50413. "mul r7, r6, r7\n\t"
  50414. "adds r4, r4, r7\n\t"
  50415. "adc r5, r5, #0\n\t"
  50416. "lsr r7, r8, #16\n\t"
  50417. "mul r6, r7, r6\n\t"
  50418. "lsr r7, r6, #16\n\t"
  50419. "lsl r6, r6, #16\n\t"
  50420. "adds r4, r4, r6\n\t"
  50421. "adc r5, r5, r7\n\t"
  50422. "lsr r6, %[b], #16\n\t"
  50423. "lsr r7, r8, #16\n\t"
  50424. "mul r7, r6, r7\n\t"
  50425. "add r5, r5, r7\n\t"
  50426. "lsl r7, r8, #16\n\t"
  50427. "lsr r7, r7, #16\n\t"
  50428. "mul r6, r7, r6\n\t"
  50429. "lsr r7, r6, #16\n\t"
  50430. "lsl r6, r6, #16\n\t"
  50431. "adds r4, r4, r6\n\t"
  50432. "adc r5, r5, r7\n\t"
  50433. #else
  50434. "umlal r4, r5, %[b], r8\n\t"
  50435. #endif
  50436. "stm %[r]!, {r4}\n\t"
  50437. "str r5, [%[r]]\n\t"
  50438. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  50439. :
  50440. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "cc"
  50441. );
  50442. }
  50443. #endif /* WOLFSSL_SP_SMALL */
  50444. #if (defined(WOLFSSL_HAVE_SP_RSA) && !defined(WOLFSSL_RSA_PUBLIC_ONLY)) || defined(WOLFSSL_HAVE_SP_DH)
  50445. /* r = 2^n mod m where n is the number of bits to reduce by.
  50446. * Given m must be 4096 bits, just need to subtract.
  50447. *
  50448. * r A single precision number.
  50449. * m A single precision number.
  50450. */
  50451. static void sp_4096_mont_norm_128(sp_digit* r, const sp_digit* m)
  50452. {
  50453. XMEMSET(r, 0, sizeof(sp_digit) * 128);
  50454. /* r = 2^n mod m */
  50455. sp_4096_sub_in_place_128(r, m);
  50456. }
  50457. #endif /* (WOLFSSL_HAVE_SP_RSA & !WOLFSSL_RSA_PUBLIC_ONLY) | WOLFSSL_HAVE_SP_DH */
  50458. #ifdef WOLFSSL_SP_SMALL
  50459. /* Conditionally subtract b from a using the mask m.
  50460. * m is -1 to subtract and 0 when not copying.
  50461. *
  50462. * r A single precision number representing condition subtract result.
  50463. * a A single precision number to subtract from.
  50464. * b A single precision number to subtract.
  50465. * m Mask value to apply.
  50466. */
  50467. 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)
  50468. {
  50469. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  50470. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  50471. register const sp_digit* b asm ("r2") = (const sp_digit*)b_p;
  50472. register sp_digit m asm ("r3") = (sp_digit)m_p;
  50473. __asm__ __volatile__ (
  50474. "mov r6, #0\n\t"
  50475. "mov r12, #0\n\t"
  50476. "mov lr, #0\n\t"
  50477. "\n"
  50478. "L_sp_4096_cond_sub_128_words_%=: \n\t"
  50479. "subs r12, r6, r12\n\t"
  50480. "ldr r4, [%[a], lr]\n\t"
  50481. "ldr r5, [%[b], lr]\n\t"
  50482. "and r5, r5, %[m]\n\t"
  50483. "sbcs r4, r4, r5\n\t"
  50484. "sbc r12, r6, r6\n\t"
  50485. "str r4, [%[r], lr]\n\t"
  50486. "add lr, lr, #4\n\t"
  50487. "cmp lr, #0x200\n\t"
  50488. "blt L_sp_4096_cond_sub_128_words_%=\n\t"
  50489. "mov %[r], r12\n\t"
  50490. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b), [m] "+r" (m)
  50491. :
  50492. : "memory", "r12", "lr", "r4", "r5", "r6", "cc"
  50493. );
  50494. return (uint32_t)(size_t)r;
  50495. }
  50496. #else
  50497. /* Conditionally subtract b from a using the mask m.
  50498. * m is -1 to subtract and 0 when not copying.
  50499. *
  50500. * r A single precision number representing condition subtract result.
  50501. * a A single precision number to subtract from.
  50502. * b A single precision number to subtract.
  50503. * m Mask value to apply.
  50504. */
  50505. 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)
  50506. {
  50507. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  50508. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  50509. register const sp_digit* b asm ("r2") = (const sp_digit*)b_p;
  50510. register sp_digit m asm ("r3") = (sp_digit)m_p;
  50511. __asm__ __volatile__ (
  50512. "mov lr, #0\n\t"
  50513. "ldm %[a]!, {r4, r5}\n\t"
  50514. "ldm %[b]!, {r6, r7}\n\t"
  50515. "and r6, r6, %[m]\n\t"
  50516. "and r7, r7, %[m]\n\t"
  50517. "subs r4, r4, r6\n\t"
  50518. "sbcs r5, r5, r7\n\t"
  50519. "stm %[r]!, {r4, r5}\n\t"
  50520. "ldm %[a]!, {r4, r5}\n\t"
  50521. "ldm %[b]!, {r6, r7}\n\t"
  50522. "and r6, r6, %[m]\n\t"
  50523. "and r7, r7, %[m]\n\t"
  50524. "sbcs r4, r4, r6\n\t"
  50525. "sbcs r5, r5, r7\n\t"
  50526. "stm %[r]!, {r4, r5}\n\t"
  50527. "ldm %[a]!, {r4, r5}\n\t"
  50528. "ldm %[b]!, {r6, r7}\n\t"
  50529. "and r6, r6, %[m]\n\t"
  50530. "and r7, r7, %[m]\n\t"
  50531. "sbcs r4, r4, r6\n\t"
  50532. "sbcs r5, r5, r7\n\t"
  50533. "stm %[r]!, {r4, r5}\n\t"
  50534. "ldm %[a]!, {r4, r5}\n\t"
  50535. "ldm %[b]!, {r6, r7}\n\t"
  50536. "and r6, r6, %[m]\n\t"
  50537. "and r7, r7, %[m]\n\t"
  50538. "sbcs r4, r4, r6\n\t"
  50539. "sbcs r5, r5, r7\n\t"
  50540. "stm %[r]!, {r4, r5}\n\t"
  50541. "ldm %[a]!, {r4, r5}\n\t"
  50542. "ldm %[b]!, {r6, r7}\n\t"
  50543. "and r6, r6, %[m]\n\t"
  50544. "and r7, r7, %[m]\n\t"
  50545. "sbcs r4, r4, r6\n\t"
  50546. "sbcs r5, r5, r7\n\t"
  50547. "stm %[r]!, {r4, r5}\n\t"
  50548. "ldm %[a]!, {r4, r5}\n\t"
  50549. "ldm %[b]!, {r6, r7}\n\t"
  50550. "and r6, r6, %[m]\n\t"
  50551. "and r7, r7, %[m]\n\t"
  50552. "sbcs r4, r4, r6\n\t"
  50553. "sbcs r5, r5, r7\n\t"
  50554. "stm %[r]!, {r4, r5}\n\t"
  50555. "ldm %[a]!, {r4, r5}\n\t"
  50556. "ldm %[b]!, {r6, r7}\n\t"
  50557. "and r6, r6, %[m]\n\t"
  50558. "and r7, r7, %[m]\n\t"
  50559. "sbcs r4, r4, r6\n\t"
  50560. "sbcs r5, r5, r7\n\t"
  50561. "stm %[r]!, {r4, r5}\n\t"
  50562. "ldm %[a]!, {r4, r5}\n\t"
  50563. "ldm %[b]!, {r6, r7}\n\t"
  50564. "and r6, r6, %[m]\n\t"
  50565. "and r7, r7, %[m]\n\t"
  50566. "sbcs r4, r4, r6\n\t"
  50567. "sbcs r5, r5, r7\n\t"
  50568. "stm %[r]!, {r4, r5}\n\t"
  50569. "ldm %[a]!, {r4, r5}\n\t"
  50570. "ldm %[b]!, {r6, r7}\n\t"
  50571. "and r6, r6, %[m]\n\t"
  50572. "and r7, r7, %[m]\n\t"
  50573. "sbcs r4, r4, r6\n\t"
  50574. "sbcs r5, r5, r7\n\t"
  50575. "stm %[r]!, {r4, r5}\n\t"
  50576. "ldm %[a]!, {r4, r5}\n\t"
  50577. "ldm %[b]!, {r6, r7}\n\t"
  50578. "and r6, r6, %[m]\n\t"
  50579. "and r7, r7, %[m]\n\t"
  50580. "sbcs r4, r4, r6\n\t"
  50581. "sbcs r5, r5, r7\n\t"
  50582. "stm %[r]!, {r4, r5}\n\t"
  50583. "ldm %[a]!, {r4, r5}\n\t"
  50584. "ldm %[b]!, {r6, r7}\n\t"
  50585. "and r6, r6, %[m]\n\t"
  50586. "and r7, r7, %[m]\n\t"
  50587. "sbcs r4, r4, r6\n\t"
  50588. "sbcs r5, r5, r7\n\t"
  50589. "stm %[r]!, {r4, r5}\n\t"
  50590. "ldm %[a]!, {r4, r5}\n\t"
  50591. "ldm %[b]!, {r6, r7}\n\t"
  50592. "and r6, r6, %[m]\n\t"
  50593. "and r7, r7, %[m]\n\t"
  50594. "sbcs r4, r4, r6\n\t"
  50595. "sbcs r5, r5, r7\n\t"
  50596. "stm %[r]!, {r4, r5}\n\t"
  50597. "ldm %[a]!, {r4, r5}\n\t"
  50598. "ldm %[b]!, {r6, r7}\n\t"
  50599. "and r6, r6, %[m]\n\t"
  50600. "and r7, r7, %[m]\n\t"
  50601. "sbcs r4, r4, r6\n\t"
  50602. "sbcs r5, r5, r7\n\t"
  50603. "stm %[r]!, {r4, r5}\n\t"
  50604. "ldm %[a]!, {r4, r5}\n\t"
  50605. "ldm %[b]!, {r6, r7}\n\t"
  50606. "and r6, r6, %[m]\n\t"
  50607. "and r7, r7, %[m]\n\t"
  50608. "sbcs r4, r4, r6\n\t"
  50609. "sbcs r5, r5, r7\n\t"
  50610. "stm %[r]!, {r4, r5}\n\t"
  50611. "ldm %[a]!, {r4, r5}\n\t"
  50612. "ldm %[b]!, {r6, r7}\n\t"
  50613. "and r6, r6, %[m]\n\t"
  50614. "and r7, r7, %[m]\n\t"
  50615. "sbcs r4, r4, r6\n\t"
  50616. "sbcs r5, r5, r7\n\t"
  50617. "stm %[r]!, {r4, r5}\n\t"
  50618. "ldm %[a]!, {r4, r5}\n\t"
  50619. "ldm %[b]!, {r6, r7}\n\t"
  50620. "and r6, r6, %[m]\n\t"
  50621. "and r7, r7, %[m]\n\t"
  50622. "sbcs r4, r4, r6\n\t"
  50623. "sbcs r5, r5, r7\n\t"
  50624. "stm %[r]!, {r4, r5}\n\t"
  50625. "ldm %[a]!, {r4, r5}\n\t"
  50626. "ldm %[b]!, {r6, r7}\n\t"
  50627. "and r6, r6, %[m]\n\t"
  50628. "and r7, r7, %[m]\n\t"
  50629. "sbcs r4, r4, r6\n\t"
  50630. "sbcs r5, r5, r7\n\t"
  50631. "stm %[r]!, {r4, r5}\n\t"
  50632. "ldm %[a]!, {r4, r5}\n\t"
  50633. "ldm %[b]!, {r6, r7}\n\t"
  50634. "and r6, r6, %[m]\n\t"
  50635. "and r7, r7, %[m]\n\t"
  50636. "sbcs r4, r4, r6\n\t"
  50637. "sbcs r5, r5, r7\n\t"
  50638. "stm %[r]!, {r4, r5}\n\t"
  50639. "ldm %[a]!, {r4, r5}\n\t"
  50640. "ldm %[b]!, {r6, r7}\n\t"
  50641. "and r6, r6, %[m]\n\t"
  50642. "and r7, r7, %[m]\n\t"
  50643. "sbcs r4, r4, r6\n\t"
  50644. "sbcs r5, r5, r7\n\t"
  50645. "stm %[r]!, {r4, r5}\n\t"
  50646. "ldm %[a]!, {r4, r5}\n\t"
  50647. "ldm %[b]!, {r6, r7}\n\t"
  50648. "and r6, r6, %[m]\n\t"
  50649. "and r7, r7, %[m]\n\t"
  50650. "sbcs r4, r4, r6\n\t"
  50651. "sbcs r5, r5, r7\n\t"
  50652. "stm %[r]!, {r4, r5}\n\t"
  50653. "ldm %[a]!, {r4, r5}\n\t"
  50654. "ldm %[b]!, {r6, r7}\n\t"
  50655. "and r6, r6, %[m]\n\t"
  50656. "and r7, r7, %[m]\n\t"
  50657. "sbcs r4, r4, r6\n\t"
  50658. "sbcs r5, r5, r7\n\t"
  50659. "stm %[r]!, {r4, r5}\n\t"
  50660. "ldm %[a]!, {r4, r5}\n\t"
  50661. "ldm %[b]!, {r6, r7}\n\t"
  50662. "and r6, r6, %[m]\n\t"
  50663. "and r7, r7, %[m]\n\t"
  50664. "sbcs r4, r4, r6\n\t"
  50665. "sbcs r5, r5, r7\n\t"
  50666. "stm %[r]!, {r4, r5}\n\t"
  50667. "ldm %[a]!, {r4, r5}\n\t"
  50668. "ldm %[b]!, {r6, r7}\n\t"
  50669. "and r6, r6, %[m]\n\t"
  50670. "and r7, r7, %[m]\n\t"
  50671. "sbcs r4, r4, r6\n\t"
  50672. "sbcs r5, r5, r7\n\t"
  50673. "stm %[r]!, {r4, r5}\n\t"
  50674. "ldm %[a]!, {r4, r5}\n\t"
  50675. "ldm %[b]!, {r6, r7}\n\t"
  50676. "and r6, r6, %[m]\n\t"
  50677. "and r7, r7, %[m]\n\t"
  50678. "sbcs r4, r4, r6\n\t"
  50679. "sbcs r5, r5, r7\n\t"
  50680. "stm %[r]!, {r4, r5}\n\t"
  50681. "ldm %[a]!, {r4, r5}\n\t"
  50682. "ldm %[b]!, {r6, r7}\n\t"
  50683. "and r6, r6, %[m]\n\t"
  50684. "and r7, r7, %[m]\n\t"
  50685. "sbcs r4, r4, r6\n\t"
  50686. "sbcs r5, r5, r7\n\t"
  50687. "stm %[r]!, {r4, r5}\n\t"
  50688. "ldm %[a]!, {r4, r5}\n\t"
  50689. "ldm %[b]!, {r6, r7}\n\t"
  50690. "and r6, r6, %[m]\n\t"
  50691. "and r7, r7, %[m]\n\t"
  50692. "sbcs r4, r4, r6\n\t"
  50693. "sbcs r5, r5, r7\n\t"
  50694. "stm %[r]!, {r4, r5}\n\t"
  50695. "ldm %[a]!, {r4, r5}\n\t"
  50696. "ldm %[b]!, {r6, r7}\n\t"
  50697. "and r6, r6, %[m]\n\t"
  50698. "and r7, r7, %[m]\n\t"
  50699. "sbcs r4, r4, r6\n\t"
  50700. "sbcs r5, r5, r7\n\t"
  50701. "stm %[r]!, {r4, r5}\n\t"
  50702. "ldm %[a]!, {r4, r5}\n\t"
  50703. "ldm %[b]!, {r6, r7}\n\t"
  50704. "and r6, r6, %[m]\n\t"
  50705. "and r7, r7, %[m]\n\t"
  50706. "sbcs r4, r4, r6\n\t"
  50707. "sbcs r5, r5, r7\n\t"
  50708. "stm %[r]!, {r4, r5}\n\t"
  50709. "ldm %[a]!, {r4, r5}\n\t"
  50710. "ldm %[b]!, {r6, r7}\n\t"
  50711. "and r6, r6, %[m]\n\t"
  50712. "and r7, r7, %[m]\n\t"
  50713. "sbcs r4, r4, r6\n\t"
  50714. "sbcs r5, r5, r7\n\t"
  50715. "stm %[r]!, {r4, r5}\n\t"
  50716. "ldm %[a]!, {r4, r5}\n\t"
  50717. "ldm %[b]!, {r6, r7}\n\t"
  50718. "and r6, r6, %[m]\n\t"
  50719. "and r7, r7, %[m]\n\t"
  50720. "sbcs r4, r4, r6\n\t"
  50721. "sbcs r5, r5, r7\n\t"
  50722. "stm %[r]!, {r4, r5}\n\t"
  50723. "ldm %[a]!, {r4, r5}\n\t"
  50724. "ldm %[b]!, {r6, r7}\n\t"
  50725. "and r6, r6, %[m]\n\t"
  50726. "and r7, r7, %[m]\n\t"
  50727. "sbcs r4, r4, r6\n\t"
  50728. "sbcs r5, r5, r7\n\t"
  50729. "stm %[r]!, {r4, r5}\n\t"
  50730. "ldm %[a]!, {r4, r5}\n\t"
  50731. "ldm %[b]!, {r6, r7}\n\t"
  50732. "and r6, r6, %[m]\n\t"
  50733. "and r7, r7, %[m]\n\t"
  50734. "sbcs r4, r4, r6\n\t"
  50735. "sbcs r5, r5, r7\n\t"
  50736. "stm %[r]!, {r4, r5}\n\t"
  50737. "ldm %[a]!, {r4, r5}\n\t"
  50738. "ldm %[b]!, {r6, r7}\n\t"
  50739. "and r6, r6, %[m]\n\t"
  50740. "and r7, r7, %[m]\n\t"
  50741. "sbcs r4, r4, r6\n\t"
  50742. "sbcs r5, r5, r7\n\t"
  50743. "stm %[r]!, {r4, r5}\n\t"
  50744. "ldm %[a]!, {r4, r5}\n\t"
  50745. "ldm %[b]!, {r6, r7}\n\t"
  50746. "and r6, r6, %[m]\n\t"
  50747. "and r7, r7, %[m]\n\t"
  50748. "sbcs r4, r4, r6\n\t"
  50749. "sbcs r5, r5, r7\n\t"
  50750. "stm %[r]!, {r4, r5}\n\t"
  50751. "ldm %[a]!, {r4, r5}\n\t"
  50752. "ldm %[b]!, {r6, r7}\n\t"
  50753. "and r6, r6, %[m]\n\t"
  50754. "and r7, r7, %[m]\n\t"
  50755. "sbcs r4, r4, r6\n\t"
  50756. "sbcs r5, r5, r7\n\t"
  50757. "stm %[r]!, {r4, r5}\n\t"
  50758. "ldm %[a]!, {r4, r5}\n\t"
  50759. "ldm %[b]!, {r6, r7}\n\t"
  50760. "and r6, r6, %[m]\n\t"
  50761. "and r7, r7, %[m]\n\t"
  50762. "sbcs r4, r4, r6\n\t"
  50763. "sbcs r5, r5, r7\n\t"
  50764. "stm %[r]!, {r4, r5}\n\t"
  50765. "ldm %[a]!, {r4, r5}\n\t"
  50766. "ldm %[b]!, {r6, r7}\n\t"
  50767. "and r6, r6, %[m]\n\t"
  50768. "and r7, r7, %[m]\n\t"
  50769. "sbcs r4, r4, r6\n\t"
  50770. "sbcs r5, r5, r7\n\t"
  50771. "stm %[r]!, {r4, r5}\n\t"
  50772. "ldm %[a]!, {r4, r5}\n\t"
  50773. "ldm %[b]!, {r6, r7}\n\t"
  50774. "and r6, r6, %[m]\n\t"
  50775. "and r7, r7, %[m]\n\t"
  50776. "sbcs r4, r4, r6\n\t"
  50777. "sbcs r5, r5, r7\n\t"
  50778. "stm %[r]!, {r4, r5}\n\t"
  50779. "ldm %[a]!, {r4, r5}\n\t"
  50780. "ldm %[b]!, {r6, r7}\n\t"
  50781. "and r6, r6, %[m]\n\t"
  50782. "and r7, r7, %[m]\n\t"
  50783. "sbcs r4, r4, r6\n\t"
  50784. "sbcs r5, r5, r7\n\t"
  50785. "stm %[r]!, {r4, r5}\n\t"
  50786. "ldm %[a]!, {r4, r5}\n\t"
  50787. "ldm %[b]!, {r6, r7}\n\t"
  50788. "and r6, r6, %[m]\n\t"
  50789. "and r7, r7, %[m]\n\t"
  50790. "sbcs r4, r4, r6\n\t"
  50791. "sbcs r5, r5, r7\n\t"
  50792. "stm %[r]!, {r4, r5}\n\t"
  50793. "ldm %[a]!, {r4, r5}\n\t"
  50794. "ldm %[b]!, {r6, r7}\n\t"
  50795. "and r6, r6, %[m]\n\t"
  50796. "and r7, r7, %[m]\n\t"
  50797. "sbcs r4, r4, r6\n\t"
  50798. "sbcs r5, r5, r7\n\t"
  50799. "stm %[r]!, {r4, r5}\n\t"
  50800. "ldm %[a]!, {r4, r5}\n\t"
  50801. "ldm %[b]!, {r6, r7}\n\t"
  50802. "and r6, r6, %[m]\n\t"
  50803. "and r7, r7, %[m]\n\t"
  50804. "sbcs r4, r4, r6\n\t"
  50805. "sbcs r5, r5, r7\n\t"
  50806. "stm %[r]!, {r4, r5}\n\t"
  50807. "ldm %[a]!, {r4, r5}\n\t"
  50808. "ldm %[b]!, {r6, r7}\n\t"
  50809. "and r6, r6, %[m]\n\t"
  50810. "and r7, r7, %[m]\n\t"
  50811. "sbcs r4, r4, r6\n\t"
  50812. "sbcs r5, r5, r7\n\t"
  50813. "stm %[r]!, {r4, r5}\n\t"
  50814. "ldm %[a]!, {r4, r5}\n\t"
  50815. "ldm %[b]!, {r6, r7}\n\t"
  50816. "and r6, r6, %[m]\n\t"
  50817. "and r7, r7, %[m]\n\t"
  50818. "sbcs r4, r4, r6\n\t"
  50819. "sbcs r5, r5, r7\n\t"
  50820. "stm %[r]!, {r4, r5}\n\t"
  50821. "ldm %[a]!, {r4, r5}\n\t"
  50822. "ldm %[b]!, {r6, r7}\n\t"
  50823. "and r6, r6, %[m]\n\t"
  50824. "and r7, r7, %[m]\n\t"
  50825. "sbcs r4, r4, r6\n\t"
  50826. "sbcs r5, r5, r7\n\t"
  50827. "stm %[r]!, {r4, r5}\n\t"
  50828. "ldm %[a]!, {r4, r5}\n\t"
  50829. "ldm %[b]!, {r6, r7}\n\t"
  50830. "and r6, r6, %[m]\n\t"
  50831. "and r7, r7, %[m]\n\t"
  50832. "sbcs r4, r4, r6\n\t"
  50833. "sbcs r5, r5, r7\n\t"
  50834. "stm %[r]!, {r4, r5}\n\t"
  50835. "ldm %[a]!, {r4, r5}\n\t"
  50836. "ldm %[b]!, {r6, r7}\n\t"
  50837. "and r6, r6, %[m]\n\t"
  50838. "and r7, r7, %[m]\n\t"
  50839. "sbcs r4, r4, r6\n\t"
  50840. "sbcs r5, r5, r7\n\t"
  50841. "stm %[r]!, {r4, r5}\n\t"
  50842. "ldm %[a]!, {r4, r5}\n\t"
  50843. "ldm %[b]!, {r6, r7}\n\t"
  50844. "and r6, r6, %[m]\n\t"
  50845. "and r7, r7, %[m]\n\t"
  50846. "sbcs r4, r4, r6\n\t"
  50847. "sbcs r5, r5, r7\n\t"
  50848. "stm %[r]!, {r4, r5}\n\t"
  50849. "ldm %[a]!, {r4, r5}\n\t"
  50850. "ldm %[b]!, {r6, r7}\n\t"
  50851. "and r6, r6, %[m]\n\t"
  50852. "and r7, r7, %[m]\n\t"
  50853. "sbcs r4, r4, r6\n\t"
  50854. "sbcs r5, r5, r7\n\t"
  50855. "stm %[r]!, {r4, r5}\n\t"
  50856. "ldm %[a]!, {r4, r5}\n\t"
  50857. "ldm %[b]!, {r6, r7}\n\t"
  50858. "and r6, r6, %[m]\n\t"
  50859. "and r7, r7, %[m]\n\t"
  50860. "sbcs r4, r4, r6\n\t"
  50861. "sbcs r5, r5, r7\n\t"
  50862. "stm %[r]!, {r4, r5}\n\t"
  50863. "ldm %[a]!, {r4, r5}\n\t"
  50864. "ldm %[b]!, {r6, r7}\n\t"
  50865. "and r6, r6, %[m]\n\t"
  50866. "and r7, r7, %[m]\n\t"
  50867. "sbcs r4, r4, r6\n\t"
  50868. "sbcs r5, r5, r7\n\t"
  50869. "stm %[r]!, {r4, r5}\n\t"
  50870. "ldm %[a]!, {r4, r5}\n\t"
  50871. "ldm %[b]!, {r6, r7}\n\t"
  50872. "and r6, r6, %[m]\n\t"
  50873. "and r7, r7, %[m]\n\t"
  50874. "sbcs r4, r4, r6\n\t"
  50875. "sbcs r5, r5, r7\n\t"
  50876. "stm %[r]!, {r4, r5}\n\t"
  50877. "ldm %[a]!, {r4, r5}\n\t"
  50878. "ldm %[b]!, {r6, r7}\n\t"
  50879. "and r6, r6, %[m]\n\t"
  50880. "and r7, r7, %[m]\n\t"
  50881. "sbcs r4, r4, r6\n\t"
  50882. "sbcs r5, r5, r7\n\t"
  50883. "stm %[r]!, {r4, r5}\n\t"
  50884. "ldm %[a]!, {r4, r5}\n\t"
  50885. "ldm %[b]!, {r6, r7}\n\t"
  50886. "and r6, r6, %[m]\n\t"
  50887. "and r7, r7, %[m]\n\t"
  50888. "sbcs r4, r4, r6\n\t"
  50889. "sbcs r5, r5, r7\n\t"
  50890. "stm %[r]!, {r4, r5}\n\t"
  50891. "ldm %[a]!, {r4, r5}\n\t"
  50892. "ldm %[b]!, {r6, r7}\n\t"
  50893. "and r6, r6, %[m]\n\t"
  50894. "and r7, r7, %[m]\n\t"
  50895. "sbcs r4, r4, r6\n\t"
  50896. "sbcs r5, r5, r7\n\t"
  50897. "stm %[r]!, {r4, r5}\n\t"
  50898. "ldm %[a]!, {r4, r5}\n\t"
  50899. "ldm %[b]!, {r6, r7}\n\t"
  50900. "and r6, r6, %[m]\n\t"
  50901. "and r7, r7, %[m]\n\t"
  50902. "sbcs r4, r4, r6\n\t"
  50903. "sbcs r5, r5, r7\n\t"
  50904. "stm %[r]!, {r4, r5}\n\t"
  50905. "ldm %[a]!, {r4, r5}\n\t"
  50906. "ldm %[b]!, {r6, r7}\n\t"
  50907. "and r6, r6, %[m]\n\t"
  50908. "and r7, r7, %[m]\n\t"
  50909. "sbcs r4, r4, r6\n\t"
  50910. "sbcs r5, r5, r7\n\t"
  50911. "stm %[r]!, {r4, r5}\n\t"
  50912. "ldm %[a]!, {r4, r5}\n\t"
  50913. "ldm %[b]!, {r6, r7}\n\t"
  50914. "and r6, r6, %[m]\n\t"
  50915. "and r7, r7, %[m]\n\t"
  50916. "sbcs r4, r4, r6\n\t"
  50917. "sbcs r5, r5, r7\n\t"
  50918. "stm %[r]!, {r4, r5}\n\t"
  50919. "ldm %[a]!, {r4, r5}\n\t"
  50920. "ldm %[b]!, {r6, r7}\n\t"
  50921. "and r6, r6, %[m]\n\t"
  50922. "and r7, r7, %[m]\n\t"
  50923. "sbcs r4, r4, r6\n\t"
  50924. "sbcs r5, r5, r7\n\t"
  50925. "stm %[r]!, {r4, r5}\n\t"
  50926. "ldm %[a]!, {r4, r5}\n\t"
  50927. "ldm %[b]!, {r6, r7}\n\t"
  50928. "and r6, r6, %[m]\n\t"
  50929. "and r7, r7, %[m]\n\t"
  50930. "sbcs r4, r4, r6\n\t"
  50931. "sbcs r5, r5, r7\n\t"
  50932. "stm %[r]!, {r4, r5}\n\t"
  50933. "ldm %[a]!, {r4, r5}\n\t"
  50934. "ldm %[b]!, {r6, r7}\n\t"
  50935. "and r6, r6, %[m]\n\t"
  50936. "and r7, r7, %[m]\n\t"
  50937. "sbcs r4, r4, r6\n\t"
  50938. "sbcs r5, r5, r7\n\t"
  50939. "stm %[r]!, {r4, r5}\n\t"
  50940. "ldm %[a]!, {r4, r5}\n\t"
  50941. "ldm %[b]!, {r6, r7}\n\t"
  50942. "and r6, r6, %[m]\n\t"
  50943. "and r7, r7, %[m]\n\t"
  50944. "sbcs r4, r4, r6\n\t"
  50945. "sbcs r5, r5, r7\n\t"
  50946. "stm %[r]!, {r4, r5}\n\t"
  50947. "ldm %[a]!, {r4, r5}\n\t"
  50948. "ldm %[b]!, {r6, r7}\n\t"
  50949. "and r6, r6, %[m]\n\t"
  50950. "and r7, r7, %[m]\n\t"
  50951. "sbcs r4, r4, r6\n\t"
  50952. "sbcs r5, r5, r7\n\t"
  50953. "stm %[r]!, {r4, r5}\n\t"
  50954. "ldm %[a]!, {r4, r5}\n\t"
  50955. "ldm %[b]!, {r6, r7}\n\t"
  50956. "and r6, r6, %[m]\n\t"
  50957. "and r7, r7, %[m]\n\t"
  50958. "sbcs r4, r4, r6\n\t"
  50959. "sbcs r5, r5, r7\n\t"
  50960. "stm %[r]!, {r4, r5}\n\t"
  50961. "sbc %[r], lr, lr\n\t"
  50962. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b), [m] "+r" (m)
  50963. :
  50964. : "memory", "r12", "lr", "r4", "r5", "r6", "r7", "cc"
  50965. );
  50966. return (uint32_t)(size_t)r;
  50967. }
  50968. #endif /* WOLFSSL_SP_SMALL */
  50969. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  50970. /* Reduce the number back to 4096 bits using Montgomery reduction.
  50971. *
  50972. * a A single precision number to reduce in place.
  50973. * m The single precision number representing the modulus.
  50974. * mp The digit representing the negative inverse of m mod 2^n.
  50975. */
  50976. static SP_NOINLINE void sp_4096_mont_reduce_128(sp_digit* a_p, const sp_digit* m_p, sp_digit mp_p)
  50977. {
  50978. register sp_digit* a asm ("r0") = (sp_digit*)a_p;
  50979. register const sp_digit* m asm ("r1") = (const sp_digit*)m_p;
  50980. register sp_digit mp asm ("r2") = (sp_digit)mp_p;
  50981. __asm__ __volatile__ (
  50982. #if !(defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4))
  50983. "ldr r11, [%[m]]\n\t"
  50984. #endif
  50985. /* i = 0 */
  50986. "mov r9, #0\n\t"
  50987. "mov r3, #0\n\t"
  50988. "ldr r12, [%[a]]\n\t"
  50989. "ldr lr, [%[a], #4]\n\t"
  50990. "\n"
  50991. "L_sp_4096_mont_reduce_128_word_%=: \n\t"
  50992. /* mu = a[i] * mp */
  50993. "mul r8, %[mp], r12\n\t"
  50994. /* a[i+0] += m[0] * mu */
  50995. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  50996. "ldr r11, [%[m]]\n\t"
  50997. #endif
  50998. "lsr r7, r11, #16\n\t"
  50999. "lsr r6, r8, #16\n\t"
  51000. "mul r5, r6, r7\n\t"
  51001. "lsl r7, r11, #16\n\t"
  51002. "lsr r7, r7, #16\n\t"
  51003. "mul r6, r7, r6\n\t"
  51004. "lsr r7, r6, #16\n\t"
  51005. "lsl r6, r6, #16\n\t"
  51006. "adds r12, r12, r6\n\t"
  51007. "adc r5, r5, r7\n\t"
  51008. "lsl r6, r8, #16\n\t"
  51009. "lsl r7, r11, #16\n\t"
  51010. "lsr r6, r6, #16\n\t"
  51011. "lsr r7, r7, #16\n\t"
  51012. "mul r7, r6, r7\n\t"
  51013. "adds r12, r12, r7\n\t"
  51014. "adc r5, r5, #0\n\t"
  51015. "lsr r7, r11, #16\n\t"
  51016. "mul r6, r7, r6\n\t"
  51017. "lsr r7, r6, #16\n\t"
  51018. "lsl r6, r6, #16\n\t"
  51019. "adds r12, r12, r6\n\t"
  51020. "adc r5, r5, r7\n\t"
  51021. /* a[i+1] += m[1] * mu */
  51022. "ldr r7, [%[m], #4]\n\t"
  51023. "lsr r10, r7, #16\n\t"
  51024. "lsr r6, r8, #16\n\t"
  51025. "mul r4, r6, r10\n\t"
  51026. "lsl r10, r7, #16\n\t"
  51027. "lsr r10, r10, #16\n\t"
  51028. "mul r6, r10, r6\n\t"
  51029. "lsr r10, r6, #16\n\t"
  51030. "lsl r6, r6, #16\n\t"
  51031. "adds lr, lr, r6\n\t"
  51032. "adc r4, r4, r10\n\t"
  51033. "lsl r6, r8, #16\n\t"
  51034. "lsl r10, r7, #16\n\t"
  51035. "lsr r6, r6, #16\n\t"
  51036. "lsr r10, r10, #16\n\t"
  51037. "mul r10, r6, r10\n\t"
  51038. "adds lr, lr, r10\n\t"
  51039. "adc r4, r4, #0\n\t"
  51040. "lsr r10, r7, #16\n\t"
  51041. "mul r6, r10, r6\n\t"
  51042. "lsr r10, r6, #16\n\t"
  51043. "lsl r6, r6, #16\n\t"
  51044. "adds lr, lr, r6\n\t"
  51045. "adc r4, r4, r10\n\t"
  51046. "mov r12, lr\n\t"
  51047. "adds r12, r12, r5\n\t"
  51048. "adc r4, r4, #0\n\t"
  51049. /* a[i+2] += m[2] * mu */
  51050. "ldr r7, [%[m], #8]\n\t"
  51051. "ldr lr, [%[a], #8]\n\t"
  51052. "lsr r10, r7, #16\n\t"
  51053. "lsr r6, r8, #16\n\t"
  51054. "mul r5, r6, r10\n\t"
  51055. "lsl r10, r7, #16\n\t"
  51056. "lsr r10, r10, #16\n\t"
  51057. "mul r6, r10, r6\n\t"
  51058. "lsr r10, r6, #16\n\t"
  51059. "lsl r6, r6, #16\n\t"
  51060. "adds lr, lr, r6\n\t"
  51061. "adc r5, r5, r10\n\t"
  51062. "lsl r6, r8, #16\n\t"
  51063. "lsl r10, r7, #16\n\t"
  51064. "lsr r6, r6, #16\n\t"
  51065. "lsr r10, r10, #16\n\t"
  51066. "mul r10, r6, r10\n\t"
  51067. "adds lr, lr, r10\n\t"
  51068. "adc r5, r5, #0\n\t"
  51069. "lsr r10, r7, #16\n\t"
  51070. "mul r6, r10, r6\n\t"
  51071. "lsr r10, r6, #16\n\t"
  51072. "lsl r6, r6, #16\n\t"
  51073. "adds lr, lr, r6\n\t"
  51074. "adc r5, r5, r10\n\t"
  51075. "adds lr, lr, r4\n\t"
  51076. "adc r5, r5, #0\n\t"
  51077. /* a[i+3] += m[3] * mu */
  51078. "ldr r7, [%[m], #12]\n\t"
  51079. "ldr r10, [%[a], #12]\n\t"
  51080. "lsr r11, r7, #16\n\t"
  51081. "lsr r6, r8, #16\n\t"
  51082. "mul r4, r6, r11\n\t"
  51083. "lsl r11, r7, #16\n\t"
  51084. "lsr r11, r11, #16\n\t"
  51085. "mul r6, r11, r6\n\t"
  51086. "lsr r11, r6, #16\n\t"
  51087. "lsl r6, r6, #16\n\t"
  51088. "adds r10, r10, r6\n\t"
  51089. "adc r4, r4, r11\n\t"
  51090. "lsl r6, r8, #16\n\t"
  51091. "lsl r11, r7, #16\n\t"
  51092. "lsr r6, r6, #16\n\t"
  51093. "lsr r11, r11, #16\n\t"
  51094. "mul r11, r6, r11\n\t"
  51095. "adds r10, r10, r11\n\t"
  51096. "adc r4, r4, #0\n\t"
  51097. "lsr r11, r7, #16\n\t"
  51098. "mul r6, r11, r6\n\t"
  51099. "lsr r11, r6, #16\n\t"
  51100. "lsl r6, r6, #16\n\t"
  51101. "adds r10, r10, r6\n\t"
  51102. "adc r4, r4, r11\n\t"
  51103. "adds r10, r10, r5\n\t"
  51104. "str r10, [%[a], #12]\n\t"
  51105. "adc r4, r4, #0\n\t"
  51106. /* a[i+4] += m[4] * mu */
  51107. "ldr r7, [%[m], #16]\n\t"
  51108. "ldr r10, [%[a], #16]\n\t"
  51109. "lsr r11, r7, #16\n\t"
  51110. "lsr r6, r8, #16\n\t"
  51111. "mul r5, r6, r11\n\t"
  51112. "lsl r11, r7, #16\n\t"
  51113. "lsr r11, r11, #16\n\t"
  51114. "mul r6, r11, r6\n\t"
  51115. "lsr r11, r6, #16\n\t"
  51116. "lsl r6, r6, #16\n\t"
  51117. "adds r10, r10, r6\n\t"
  51118. "adc r5, r5, r11\n\t"
  51119. "lsl r6, r8, #16\n\t"
  51120. "lsl r11, r7, #16\n\t"
  51121. "lsr r6, r6, #16\n\t"
  51122. "lsr r11, r11, #16\n\t"
  51123. "mul r11, r6, r11\n\t"
  51124. "adds r10, r10, r11\n\t"
  51125. "adc r5, r5, #0\n\t"
  51126. "lsr r11, r7, #16\n\t"
  51127. "mul r6, r11, r6\n\t"
  51128. "lsr r11, r6, #16\n\t"
  51129. "lsl r6, r6, #16\n\t"
  51130. "adds r10, r10, r6\n\t"
  51131. "adc r5, r5, r11\n\t"
  51132. "adds r10, r10, r4\n\t"
  51133. "str r10, [%[a], #16]\n\t"
  51134. "adc r5, r5, #0\n\t"
  51135. /* a[i+5] += m[5] * mu */
  51136. "ldr r7, [%[m], #20]\n\t"
  51137. "ldr r10, [%[a], #20]\n\t"
  51138. "lsr r11, r7, #16\n\t"
  51139. "lsr r6, r8, #16\n\t"
  51140. "mul r4, r6, r11\n\t"
  51141. "lsl r11, r7, #16\n\t"
  51142. "lsr r11, r11, #16\n\t"
  51143. "mul r6, r11, r6\n\t"
  51144. "lsr r11, r6, #16\n\t"
  51145. "lsl r6, r6, #16\n\t"
  51146. "adds r10, r10, r6\n\t"
  51147. "adc r4, r4, r11\n\t"
  51148. "lsl r6, r8, #16\n\t"
  51149. "lsl r11, r7, #16\n\t"
  51150. "lsr r6, r6, #16\n\t"
  51151. "lsr r11, r11, #16\n\t"
  51152. "mul r11, r6, r11\n\t"
  51153. "adds r10, r10, r11\n\t"
  51154. "adc r4, r4, #0\n\t"
  51155. "lsr r11, r7, #16\n\t"
  51156. "mul r6, r11, r6\n\t"
  51157. "lsr r11, r6, #16\n\t"
  51158. "lsl r6, r6, #16\n\t"
  51159. "adds r10, r10, r6\n\t"
  51160. "adc r4, r4, r11\n\t"
  51161. "adds r10, r10, r5\n\t"
  51162. "str r10, [%[a], #20]\n\t"
  51163. "adc r4, r4, #0\n\t"
  51164. /* a[i+6] += m[6] * mu */
  51165. "ldr r7, [%[m], #24]\n\t"
  51166. "ldr r10, [%[a], #24]\n\t"
  51167. "lsr r11, r7, #16\n\t"
  51168. "lsr r6, r8, #16\n\t"
  51169. "mul r5, r6, r11\n\t"
  51170. "lsl r11, r7, #16\n\t"
  51171. "lsr r11, r11, #16\n\t"
  51172. "mul r6, r11, r6\n\t"
  51173. "lsr r11, r6, #16\n\t"
  51174. "lsl r6, r6, #16\n\t"
  51175. "adds r10, r10, r6\n\t"
  51176. "adc r5, r5, r11\n\t"
  51177. "lsl r6, r8, #16\n\t"
  51178. "lsl r11, r7, #16\n\t"
  51179. "lsr r6, r6, #16\n\t"
  51180. "lsr r11, r11, #16\n\t"
  51181. "mul r11, r6, r11\n\t"
  51182. "adds r10, r10, r11\n\t"
  51183. "adc r5, r5, #0\n\t"
  51184. "lsr r11, r7, #16\n\t"
  51185. "mul r6, r11, r6\n\t"
  51186. "lsr r11, r6, #16\n\t"
  51187. "lsl r6, r6, #16\n\t"
  51188. "adds r10, r10, r6\n\t"
  51189. "adc r5, r5, r11\n\t"
  51190. "adds r10, r10, r4\n\t"
  51191. "str r10, [%[a], #24]\n\t"
  51192. "adc r5, r5, #0\n\t"
  51193. /* a[i+7] += m[7] * mu */
  51194. "ldr r7, [%[m], #28]\n\t"
  51195. "ldr r10, [%[a], #28]\n\t"
  51196. "lsr r11, r7, #16\n\t"
  51197. "lsr r6, r8, #16\n\t"
  51198. "mul r4, r6, r11\n\t"
  51199. "lsl r11, r7, #16\n\t"
  51200. "lsr r11, r11, #16\n\t"
  51201. "mul r6, r11, r6\n\t"
  51202. "lsr r11, r6, #16\n\t"
  51203. "lsl r6, r6, #16\n\t"
  51204. "adds r10, r10, r6\n\t"
  51205. "adc r4, r4, r11\n\t"
  51206. "lsl r6, r8, #16\n\t"
  51207. "lsl r11, r7, #16\n\t"
  51208. "lsr r6, r6, #16\n\t"
  51209. "lsr r11, r11, #16\n\t"
  51210. "mul r11, r6, r11\n\t"
  51211. "adds r10, r10, r11\n\t"
  51212. "adc r4, r4, #0\n\t"
  51213. "lsr r11, r7, #16\n\t"
  51214. "mul r6, r11, r6\n\t"
  51215. "lsr r11, r6, #16\n\t"
  51216. "lsl r6, r6, #16\n\t"
  51217. "adds r10, r10, r6\n\t"
  51218. "adc r4, r4, r11\n\t"
  51219. "adds r10, r10, r5\n\t"
  51220. "str r10, [%[a], #28]\n\t"
  51221. "adc r4, r4, #0\n\t"
  51222. /* a[i+8] += m[8] * mu */
  51223. "ldr r7, [%[m], #32]\n\t"
  51224. "ldr r10, [%[a], #32]\n\t"
  51225. "lsr r11, r7, #16\n\t"
  51226. "lsr r6, r8, #16\n\t"
  51227. "mul r5, r6, r11\n\t"
  51228. "lsl r11, r7, #16\n\t"
  51229. "lsr r11, r11, #16\n\t"
  51230. "mul r6, r11, r6\n\t"
  51231. "lsr r11, r6, #16\n\t"
  51232. "lsl r6, r6, #16\n\t"
  51233. "adds r10, r10, r6\n\t"
  51234. "adc r5, r5, r11\n\t"
  51235. "lsl r6, r8, #16\n\t"
  51236. "lsl r11, r7, #16\n\t"
  51237. "lsr r6, r6, #16\n\t"
  51238. "lsr r11, r11, #16\n\t"
  51239. "mul r11, r6, r11\n\t"
  51240. "adds r10, r10, r11\n\t"
  51241. "adc r5, r5, #0\n\t"
  51242. "lsr r11, r7, #16\n\t"
  51243. "mul r6, r11, r6\n\t"
  51244. "lsr r11, r6, #16\n\t"
  51245. "lsl r6, r6, #16\n\t"
  51246. "adds r10, r10, r6\n\t"
  51247. "adc r5, r5, r11\n\t"
  51248. "adds r10, r10, r4\n\t"
  51249. "str r10, [%[a], #32]\n\t"
  51250. "adc r5, r5, #0\n\t"
  51251. /* a[i+9] += m[9] * mu */
  51252. "ldr r7, [%[m], #36]\n\t"
  51253. "ldr r10, [%[a], #36]\n\t"
  51254. "lsr r11, r7, #16\n\t"
  51255. "lsr r6, r8, #16\n\t"
  51256. "mul r4, r6, r11\n\t"
  51257. "lsl r11, r7, #16\n\t"
  51258. "lsr r11, r11, #16\n\t"
  51259. "mul r6, r11, r6\n\t"
  51260. "lsr r11, r6, #16\n\t"
  51261. "lsl r6, r6, #16\n\t"
  51262. "adds r10, r10, r6\n\t"
  51263. "adc r4, r4, r11\n\t"
  51264. "lsl r6, r8, #16\n\t"
  51265. "lsl r11, r7, #16\n\t"
  51266. "lsr r6, r6, #16\n\t"
  51267. "lsr r11, r11, #16\n\t"
  51268. "mul r11, r6, r11\n\t"
  51269. "adds r10, r10, r11\n\t"
  51270. "adc r4, r4, #0\n\t"
  51271. "lsr r11, r7, #16\n\t"
  51272. "mul r6, r11, r6\n\t"
  51273. "lsr r11, r6, #16\n\t"
  51274. "lsl r6, r6, #16\n\t"
  51275. "adds r10, r10, r6\n\t"
  51276. "adc r4, r4, r11\n\t"
  51277. "adds r10, r10, r5\n\t"
  51278. "str r10, [%[a], #36]\n\t"
  51279. "adc r4, r4, #0\n\t"
  51280. /* a[i+10] += m[10] * mu */
  51281. "ldr r7, [%[m], #40]\n\t"
  51282. "ldr r10, [%[a], #40]\n\t"
  51283. "lsr r11, r7, #16\n\t"
  51284. "lsr r6, r8, #16\n\t"
  51285. "mul r5, r6, r11\n\t"
  51286. "lsl r11, r7, #16\n\t"
  51287. "lsr r11, r11, #16\n\t"
  51288. "mul r6, r11, r6\n\t"
  51289. "lsr r11, r6, #16\n\t"
  51290. "lsl r6, r6, #16\n\t"
  51291. "adds r10, r10, r6\n\t"
  51292. "adc r5, r5, r11\n\t"
  51293. "lsl r6, r8, #16\n\t"
  51294. "lsl r11, r7, #16\n\t"
  51295. "lsr r6, r6, #16\n\t"
  51296. "lsr r11, r11, #16\n\t"
  51297. "mul r11, r6, r11\n\t"
  51298. "adds r10, r10, r11\n\t"
  51299. "adc r5, r5, #0\n\t"
  51300. "lsr r11, r7, #16\n\t"
  51301. "mul r6, r11, r6\n\t"
  51302. "lsr r11, r6, #16\n\t"
  51303. "lsl r6, r6, #16\n\t"
  51304. "adds r10, r10, r6\n\t"
  51305. "adc r5, r5, r11\n\t"
  51306. "adds r10, r10, r4\n\t"
  51307. "str r10, [%[a], #40]\n\t"
  51308. "adc r5, r5, #0\n\t"
  51309. /* a[i+11] += m[11] * mu */
  51310. "ldr r7, [%[m], #44]\n\t"
  51311. "ldr r10, [%[a], #44]\n\t"
  51312. "lsr r11, r7, #16\n\t"
  51313. "lsr r6, r8, #16\n\t"
  51314. "mul r4, r6, r11\n\t"
  51315. "lsl r11, r7, #16\n\t"
  51316. "lsr r11, r11, #16\n\t"
  51317. "mul r6, r11, r6\n\t"
  51318. "lsr r11, r6, #16\n\t"
  51319. "lsl r6, r6, #16\n\t"
  51320. "adds r10, r10, r6\n\t"
  51321. "adc r4, r4, r11\n\t"
  51322. "lsl r6, r8, #16\n\t"
  51323. "lsl r11, r7, #16\n\t"
  51324. "lsr r6, r6, #16\n\t"
  51325. "lsr r11, r11, #16\n\t"
  51326. "mul r11, r6, r11\n\t"
  51327. "adds r10, r10, r11\n\t"
  51328. "adc r4, r4, #0\n\t"
  51329. "lsr r11, r7, #16\n\t"
  51330. "mul r6, r11, r6\n\t"
  51331. "lsr r11, r6, #16\n\t"
  51332. "lsl r6, r6, #16\n\t"
  51333. "adds r10, r10, r6\n\t"
  51334. "adc r4, r4, r11\n\t"
  51335. "adds r10, r10, r5\n\t"
  51336. "str r10, [%[a], #44]\n\t"
  51337. "adc r4, r4, #0\n\t"
  51338. /* a[i+12] += m[12] * mu */
  51339. "ldr r7, [%[m], #48]\n\t"
  51340. "ldr r10, [%[a], #48]\n\t"
  51341. "lsr r11, r7, #16\n\t"
  51342. "lsr r6, r8, #16\n\t"
  51343. "mul r5, r6, r11\n\t"
  51344. "lsl r11, r7, #16\n\t"
  51345. "lsr r11, r11, #16\n\t"
  51346. "mul r6, r11, r6\n\t"
  51347. "lsr r11, r6, #16\n\t"
  51348. "lsl r6, r6, #16\n\t"
  51349. "adds r10, r10, r6\n\t"
  51350. "adc r5, r5, r11\n\t"
  51351. "lsl r6, r8, #16\n\t"
  51352. "lsl r11, r7, #16\n\t"
  51353. "lsr r6, r6, #16\n\t"
  51354. "lsr r11, r11, #16\n\t"
  51355. "mul r11, r6, r11\n\t"
  51356. "adds r10, r10, r11\n\t"
  51357. "adc r5, r5, #0\n\t"
  51358. "lsr r11, r7, #16\n\t"
  51359. "mul r6, r11, r6\n\t"
  51360. "lsr r11, r6, #16\n\t"
  51361. "lsl r6, r6, #16\n\t"
  51362. "adds r10, r10, r6\n\t"
  51363. "adc r5, r5, r11\n\t"
  51364. "adds r10, r10, r4\n\t"
  51365. "str r10, [%[a], #48]\n\t"
  51366. "adc r5, r5, #0\n\t"
  51367. /* a[i+13] += m[13] * mu */
  51368. "ldr r7, [%[m], #52]\n\t"
  51369. "ldr r10, [%[a], #52]\n\t"
  51370. "lsr r11, r7, #16\n\t"
  51371. "lsr r6, r8, #16\n\t"
  51372. "mul r4, r6, r11\n\t"
  51373. "lsl r11, r7, #16\n\t"
  51374. "lsr r11, r11, #16\n\t"
  51375. "mul r6, r11, r6\n\t"
  51376. "lsr r11, r6, #16\n\t"
  51377. "lsl r6, r6, #16\n\t"
  51378. "adds r10, r10, r6\n\t"
  51379. "adc r4, r4, r11\n\t"
  51380. "lsl r6, r8, #16\n\t"
  51381. "lsl r11, r7, #16\n\t"
  51382. "lsr r6, r6, #16\n\t"
  51383. "lsr r11, r11, #16\n\t"
  51384. "mul r11, r6, r11\n\t"
  51385. "adds r10, r10, r11\n\t"
  51386. "adc r4, r4, #0\n\t"
  51387. "lsr r11, r7, #16\n\t"
  51388. "mul r6, r11, r6\n\t"
  51389. "lsr r11, r6, #16\n\t"
  51390. "lsl r6, r6, #16\n\t"
  51391. "adds r10, r10, r6\n\t"
  51392. "adc r4, r4, r11\n\t"
  51393. "adds r10, r10, r5\n\t"
  51394. "str r10, [%[a], #52]\n\t"
  51395. "adc r4, r4, #0\n\t"
  51396. /* a[i+14] += m[14] * mu */
  51397. "ldr r7, [%[m], #56]\n\t"
  51398. "ldr r10, [%[a], #56]\n\t"
  51399. "lsr r11, r7, #16\n\t"
  51400. "lsr r6, r8, #16\n\t"
  51401. "mul r5, r6, r11\n\t"
  51402. "lsl r11, r7, #16\n\t"
  51403. "lsr r11, r11, #16\n\t"
  51404. "mul r6, r11, r6\n\t"
  51405. "lsr r11, r6, #16\n\t"
  51406. "lsl r6, r6, #16\n\t"
  51407. "adds r10, r10, r6\n\t"
  51408. "adc r5, r5, r11\n\t"
  51409. "lsl r6, r8, #16\n\t"
  51410. "lsl r11, r7, #16\n\t"
  51411. "lsr r6, r6, #16\n\t"
  51412. "lsr r11, r11, #16\n\t"
  51413. "mul r11, r6, r11\n\t"
  51414. "adds r10, r10, r11\n\t"
  51415. "adc r5, r5, #0\n\t"
  51416. "lsr r11, r7, #16\n\t"
  51417. "mul r6, r11, r6\n\t"
  51418. "lsr r11, r6, #16\n\t"
  51419. "lsl r6, r6, #16\n\t"
  51420. "adds r10, r10, r6\n\t"
  51421. "adc r5, r5, r11\n\t"
  51422. "adds r10, r10, r4\n\t"
  51423. "str r10, [%[a], #56]\n\t"
  51424. "adc r5, r5, #0\n\t"
  51425. /* a[i+15] += m[15] * mu */
  51426. "ldr r7, [%[m], #60]\n\t"
  51427. "ldr r10, [%[a], #60]\n\t"
  51428. "lsr r11, r7, #16\n\t"
  51429. "lsr r6, r8, #16\n\t"
  51430. "mul r4, 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 r4, r4, 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 r4, r4, #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 r4, r4, r11\n\t"
  51451. "adds r10, r10, r5\n\t"
  51452. "str r10, [%[a], #60]\n\t"
  51453. "adc r4, r4, #0\n\t"
  51454. /* a[i+16] += m[16] * mu */
  51455. "ldr r7, [%[m], #64]\n\t"
  51456. "ldr r10, [%[a], #64]\n\t"
  51457. "lsr r11, r7, #16\n\t"
  51458. "lsr r6, r8, #16\n\t"
  51459. "mul r5, r6, r11\n\t"
  51460. "lsl r11, r7, #16\n\t"
  51461. "lsr r11, r11, #16\n\t"
  51462. "mul r6, r11, r6\n\t"
  51463. "lsr r11, r6, #16\n\t"
  51464. "lsl r6, r6, #16\n\t"
  51465. "adds r10, r10, r6\n\t"
  51466. "adc r5, r5, r11\n\t"
  51467. "lsl r6, r8, #16\n\t"
  51468. "lsl r11, r7, #16\n\t"
  51469. "lsr r6, r6, #16\n\t"
  51470. "lsr r11, r11, #16\n\t"
  51471. "mul r11, r6, r11\n\t"
  51472. "adds r10, r10, r11\n\t"
  51473. "adc r5, r5, #0\n\t"
  51474. "lsr r11, r7, #16\n\t"
  51475. "mul r6, r11, r6\n\t"
  51476. "lsr r11, r6, #16\n\t"
  51477. "lsl r6, r6, #16\n\t"
  51478. "adds r10, r10, r6\n\t"
  51479. "adc r5, r5, r11\n\t"
  51480. "adds r10, r10, r4\n\t"
  51481. "str r10, [%[a], #64]\n\t"
  51482. "adc r5, r5, #0\n\t"
  51483. /* a[i+17] += m[17] * mu */
  51484. "ldr r7, [%[m], #68]\n\t"
  51485. "ldr r10, [%[a], #68]\n\t"
  51486. "lsr r11, r7, #16\n\t"
  51487. "lsr r6, r8, #16\n\t"
  51488. "mul r4, r6, r11\n\t"
  51489. "lsl r11, r7, #16\n\t"
  51490. "lsr r11, r11, #16\n\t"
  51491. "mul r6, r11, r6\n\t"
  51492. "lsr r11, r6, #16\n\t"
  51493. "lsl r6, r6, #16\n\t"
  51494. "adds r10, r10, r6\n\t"
  51495. "adc r4, r4, r11\n\t"
  51496. "lsl r6, r8, #16\n\t"
  51497. "lsl r11, r7, #16\n\t"
  51498. "lsr r6, r6, #16\n\t"
  51499. "lsr r11, r11, #16\n\t"
  51500. "mul r11, r6, r11\n\t"
  51501. "adds r10, r10, r11\n\t"
  51502. "adc r4, r4, #0\n\t"
  51503. "lsr r11, r7, #16\n\t"
  51504. "mul r6, r11, r6\n\t"
  51505. "lsr r11, r6, #16\n\t"
  51506. "lsl r6, r6, #16\n\t"
  51507. "adds r10, r10, r6\n\t"
  51508. "adc r4, r4, r11\n\t"
  51509. "adds r10, r10, r5\n\t"
  51510. "str r10, [%[a], #68]\n\t"
  51511. "adc r4, r4, #0\n\t"
  51512. /* a[i+18] += m[18] * mu */
  51513. "ldr r7, [%[m], #72]\n\t"
  51514. "ldr r10, [%[a], #72]\n\t"
  51515. "lsr r11, r7, #16\n\t"
  51516. "lsr r6, r8, #16\n\t"
  51517. "mul r5, r6, r11\n\t"
  51518. "lsl r11, r7, #16\n\t"
  51519. "lsr r11, r11, #16\n\t"
  51520. "mul r6, r11, r6\n\t"
  51521. "lsr r11, r6, #16\n\t"
  51522. "lsl r6, r6, #16\n\t"
  51523. "adds r10, r10, r6\n\t"
  51524. "adc r5, r5, r11\n\t"
  51525. "lsl r6, r8, #16\n\t"
  51526. "lsl r11, r7, #16\n\t"
  51527. "lsr r6, r6, #16\n\t"
  51528. "lsr r11, r11, #16\n\t"
  51529. "mul r11, r6, r11\n\t"
  51530. "adds r10, r10, r11\n\t"
  51531. "adc r5, r5, #0\n\t"
  51532. "lsr r11, r7, #16\n\t"
  51533. "mul r6, r11, r6\n\t"
  51534. "lsr r11, r6, #16\n\t"
  51535. "lsl r6, r6, #16\n\t"
  51536. "adds r10, r10, r6\n\t"
  51537. "adc r5, r5, r11\n\t"
  51538. "adds r10, r10, r4\n\t"
  51539. "str r10, [%[a], #72]\n\t"
  51540. "adc r5, r5, #0\n\t"
  51541. /* a[i+19] += m[19] * mu */
  51542. "ldr r7, [%[m], #76]\n\t"
  51543. "ldr r10, [%[a], #76]\n\t"
  51544. "lsr r11, r7, #16\n\t"
  51545. "lsr r6, r8, #16\n\t"
  51546. "mul r4, r6, r11\n\t"
  51547. "lsl r11, r7, #16\n\t"
  51548. "lsr r11, r11, #16\n\t"
  51549. "mul r6, r11, r6\n\t"
  51550. "lsr r11, r6, #16\n\t"
  51551. "lsl r6, r6, #16\n\t"
  51552. "adds r10, r10, r6\n\t"
  51553. "adc r4, r4, r11\n\t"
  51554. "lsl r6, r8, #16\n\t"
  51555. "lsl r11, r7, #16\n\t"
  51556. "lsr r6, r6, #16\n\t"
  51557. "lsr r11, r11, #16\n\t"
  51558. "mul r11, r6, r11\n\t"
  51559. "adds r10, r10, r11\n\t"
  51560. "adc r4, r4, #0\n\t"
  51561. "lsr r11, r7, #16\n\t"
  51562. "mul r6, r11, r6\n\t"
  51563. "lsr r11, r6, #16\n\t"
  51564. "lsl r6, r6, #16\n\t"
  51565. "adds r10, r10, r6\n\t"
  51566. "adc r4, r4, r11\n\t"
  51567. "adds r10, r10, r5\n\t"
  51568. "str r10, [%[a], #76]\n\t"
  51569. "adc r4, r4, #0\n\t"
  51570. /* a[i+20] += m[20] * mu */
  51571. "ldr r7, [%[m], #80]\n\t"
  51572. "ldr r10, [%[a], #80]\n\t"
  51573. "lsr r11, r7, #16\n\t"
  51574. "lsr r6, r8, #16\n\t"
  51575. "mul r5, r6, r11\n\t"
  51576. "lsl r11, r7, #16\n\t"
  51577. "lsr r11, r11, #16\n\t"
  51578. "mul r6, r11, r6\n\t"
  51579. "lsr r11, r6, #16\n\t"
  51580. "lsl r6, r6, #16\n\t"
  51581. "adds r10, r10, r6\n\t"
  51582. "adc r5, r5, r11\n\t"
  51583. "lsl r6, r8, #16\n\t"
  51584. "lsl r11, r7, #16\n\t"
  51585. "lsr r6, r6, #16\n\t"
  51586. "lsr r11, r11, #16\n\t"
  51587. "mul r11, r6, r11\n\t"
  51588. "adds r10, r10, r11\n\t"
  51589. "adc r5, r5, #0\n\t"
  51590. "lsr r11, r7, #16\n\t"
  51591. "mul r6, r11, r6\n\t"
  51592. "lsr r11, r6, #16\n\t"
  51593. "lsl r6, r6, #16\n\t"
  51594. "adds r10, r10, r6\n\t"
  51595. "adc r5, r5, r11\n\t"
  51596. "adds r10, r10, r4\n\t"
  51597. "str r10, [%[a], #80]\n\t"
  51598. "adc r5, r5, #0\n\t"
  51599. /* a[i+21] += m[21] * mu */
  51600. "ldr r7, [%[m], #84]\n\t"
  51601. "ldr r10, [%[a], #84]\n\t"
  51602. "lsr r11, r7, #16\n\t"
  51603. "lsr r6, r8, #16\n\t"
  51604. "mul r4, r6, r11\n\t"
  51605. "lsl r11, r7, #16\n\t"
  51606. "lsr r11, r11, #16\n\t"
  51607. "mul r6, r11, r6\n\t"
  51608. "lsr r11, r6, #16\n\t"
  51609. "lsl r6, r6, #16\n\t"
  51610. "adds r10, r10, r6\n\t"
  51611. "adc r4, r4, r11\n\t"
  51612. "lsl r6, r8, #16\n\t"
  51613. "lsl r11, r7, #16\n\t"
  51614. "lsr r6, r6, #16\n\t"
  51615. "lsr r11, r11, #16\n\t"
  51616. "mul r11, r6, r11\n\t"
  51617. "adds r10, r10, r11\n\t"
  51618. "adc r4, r4, #0\n\t"
  51619. "lsr r11, r7, #16\n\t"
  51620. "mul r6, r11, r6\n\t"
  51621. "lsr r11, r6, #16\n\t"
  51622. "lsl r6, r6, #16\n\t"
  51623. "adds r10, r10, r6\n\t"
  51624. "adc r4, r4, r11\n\t"
  51625. "adds r10, r10, r5\n\t"
  51626. "str r10, [%[a], #84]\n\t"
  51627. "adc r4, r4, #0\n\t"
  51628. /* a[i+22] += m[22] * mu */
  51629. "ldr r7, [%[m], #88]\n\t"
  51630. "ldr r10, [%[a], #88]\n\t"
  51631. "lsr r11, r7, #16\n\t"
  51632. "lsr r6, r8, #16\n\t"
  51633. "mul r5, r6, r11\n\t"
  51634. "lsl r11, r7, #16\n\t"
  51635. "lsr r11, r11, #16\n\t"
  51636. "mul r6, r11, r6\n\t"
  51637. "lsr r11, r6, #16\n\t"
  51638. "lsl r6, r6, #16\n\t"
  51639. "adds r10, r10, r6\n\t"
  51640. "adc r5, r5, r11\n\t"
  51641. "lsl r6, r8, #16\n\t"
  51642. "lsl r11, r7, #16\n\t"
  51643. "lsr r6, r6, #16\n\t"
  51644. "lsr r11, r11, #16\n\t"
  51645. "mul r11, r6, r11\n\t"
  51646. "adds r10, r10, r11\n\t"
  51647. "adc r5, r5, #0\n\t"
  51648. "lsr r11, r7, #16\n\t"
  51649. "mul r6, r11, r6\n\t"
  51650. "lsr r11, r6, #16\n\t"
  51651. "lsl r6, r6, #16\n\t"
  51652. "adds r10, r10, r6\n\t"
  51653. "adc r5, r5, r11\n\t"
  51654. "adds r10, r10, r4\n\t"
  51655. "str r10, [%[a], #88]\n\t"
  51656. "adc r5, r5, #0\n\t"
  51657. /* a[i+23] += m[23] * mu */
  51658. "ldr r7, [%[m], #92]\n\t"
  51659. "ldr r10, [%[a], #92]\n\t"
  51660. "lsr r11, r7, #16\n\t"
  51661. "lsr r6, r8, #16\n\t"
  51662. "mul r4, r6, r11\n\t"
  51663. "lsl r11, r7, #16\n\t"
  51664. "lsr r11, r11, #16\n\t"
  51665. "mul r6, r11, r6\n\t"
  51666. "lsr r11, r6, #16\n\t"
  51667. "lsl r6, r6, #16\n\t"
  51668. "adds r10, r10, r6\n\t"
  51669. "adc r4, r4, r11\n\t"
  51670. "lsl r6, r8, #16\n\t"
  51671. "lsl r11, r7, #16\n\t"
  51672. "lsr r6, r6, #16\n\t"
  51673. "lsr r11, r11, #16\n\t"
  51674. "mul r11, r6, r11\n\t"
  51675. "adds r10, r10, r11\n\t"
  51676. "adc r4, r4, #0\n\t"
  51677. "lsr r11, r7, #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. "adds r10, r10, r5\n\t"
  51684. "str r10, [%[a], #92]\n\t"
  51685. "adc r4, r4, #0\n\t"
  51686. /* a[i+24] += m[24] * mu */
  51687. "ldr r7, [%[m], #96]\n\t"
  51688. "ldr r10, [%[a], #96]\n\t"
  51689. "lsr r11, r7, #16\n\t"
  51690. "lsr r6, r8, #16\n\t"
  51691. "mul r5, r6, r11\n\t"
  51692. "lsl r11, r7, #16\n\t"
  51693. "lsr r11, r11, #16\n\t"
  51694. "mul r6, r11, r6\n\t"
  51695. "lsr r11, r6, #16\n\t"
  51696. "lsl r6, r6, #16\n\t"
  51697. "adds r10, r10, r6\n\t"
  51698. "adc r5, r5, r11\n\t"
  51699. "lsl r6, r8, #16\n\t"
  51700. "lsl r11, r7, #16\n\t"
  51701. "lsr r6, r6, #16\n\t"
  51702. "lsr r11, r11, #16\n\t"
  51703. "mul r11, r6, r11\n\t"
  51704. "adds r10, r10, r11\n\t"
  51705. "adc r5, r5, #0\n\t"
  51706. "lsr r11, r7, #16\n\t"
  51707. "mul r6, r11, r6\n\t"
  51708. "lsr r11, r6, #16\n\t"
  51709. "lsl r6, r6, #16\n\t"
  51710. "adds r10, r10, r6\n\t"
  51711. "adc r5, r5, r11\n\t"
  51712. "adds r10, r10, r4\n\t"
  51713. "str r10, [%[a], #96]\n\t"
  51714. "adc r5, r5, #0\n\t"
  51715. /* a[i+25] += m[25] * mu */
  51716. "ldr r7, [%[m], #100]\n\t"
  51717. "ldr r10, [%[a], #100]\n\t"
  51718. "lsr r11, r7, #16\n\t"
  51719. "lsr r6, r8, #16\n\t"
  51720. "mul r4, r6, r11\n\t"
  51721. "lsl r11, r7, #16\n\t"
  51722. "lsr r11, r11, #16\n\t"
  51723. "mul r6, r11, r6\n\t"
  51724. "lsr r11, r6, #16\n\t"
  51725. "lsl r6, r6, #16\n\t"
  51726. "adds r10, r10, r6\n\t"
  51727. "adc r4, r4, r11\n\t"
  51728. "lsl r6, r8, #16\n\t"
  51729. "lsl r11, r7, #16\n\t"
  51730. "lsr r6, r6, #16\n\t"
  51731. "lsr r11, r11, #16\n\t"
  51732. "mul r11, r6, r11\n\t"
  51733. "adds r10, r10, r11\n\t"
  51734. "adc r4, r4, #0\n\t"
  51735. "lsr r11, r7, #16\n\t"
  51736. "mul r6, r11, r6\n\t"
  51737. "lsr r11, r6, #16\n\t"
  51738. "lsl r6, r6, #16\n\t"
  51739. "adds r10, r10, r6\n\t"
  51740. "adc r4, r4, r11\n\t"
  51741. "adds r10, r10, r5\n\t"
  51742. "str r10, [%[a], #100]\n\t"
  51743. "adc r4, r4, #0\n\t"
  51744. /* a[i+26] += m[26] * mu */
  51745. "ldr r7, [%[m], #104]\n\t"
  51746. "ldr r10, [%[a], #104]\n\t"
  51747. "lsr r11, r7, #16\n\t"
  51748. "lsr r6, r8, #16\n\t"
  51749. "mul r5, r6, r11\n\t"
  51750. "lsl r11, r7, #16\n\t"
  51751. "lsr r11, r11, #16\n\t"
  51752. "mul r6, r11, r6\n\t"
  51753. "lsr r11, r6, #16\n\t"
  51754. "lsl r6, r6, #16\n\t"
  51755. "adds r10, r10, r6\n\t"
  51756. "adc r5, r5, r11\n\t"
  51757. "lsl r6, r8, #16\n\t"
  51758. "lsl r11, r7, #16\n\t"
  51759. "lsr r6, r6, #16\n\t"
  51760. "lsr r11, r11, #16\n\t"
  51761. "mul r11, r6, r11\n\t"
  51762. "adds r10, r10, r11\n\t"
  51763. "adc r5, r5, #0\n\t"
  51764. "lsr r11, r7, #16\n\t"
  51765. "mul r6, r11, r6\n\t"
  51766. "lsr r11, r6, #16\n\t"
  51767. "lsl r6, r6, #16\n\t"
  51768. "adds r10, r10, r6\n\t"
  51769. "adc r5, r5, r11\n\t"
  51770. "adds r10, r10, r4\n\t"
  51771. "str r10, [%[a], #104]\n\t"
  51772. "adc r5, r5, #0\n\t"
  51773. /* a[i+27] += m[27] * mu */
  51774. "ldr r7, [%[m], #108]\n\t"
  51775. "ldr r10, [%[a], #108]\n\t"
  51776. "lsr r11, r7, #16\n\t"
  51777. "lsr r6, r8, #16\n\t"
  51778. "mul r4, r6, r11\n\t"
  51779. "lsl r11, r7, #16\n\t"
  51780. "lsr r11, r11, #16\n\t"
  51781. "mul r6, r11, r6\n\t"
  51782. "lsr r11, r6, #16\n\t"
  51783. "lsl r6, r6, #16\n\t"
  51784. "adds r10, r10, r6\n\t"
  51785. "adc r4, r4, r11\n\t"
  51786. "lsl r6, r8, #16\n\t"
  51787. "lsl r11, r7, #16\n\t"
  51788. "lsr r6, r6, #16\n\t"
  51789. "lsr r11, r11, #16\n\t"
  51790. "mul r11, r6, r11\n\t"
  51791. "adds r10, r10, r11\n\t"
  51792. "adc r4, r4, #0\n\t"
  51793. "lsr r11, r7, #16\n\t"
  51794. "mul r6, r11, r6\n\t"
  51795. "lsr r11, r6, #16\n\t"
  51796. "lsl r6, r6, #16\n\t"
  51797. "adds r10, r10, r6\n\t"
  51798. "adc r4, r4, r11\n\t"
  51799. "adds r10, r10, r5\n\t"
  51800. "str r10, [%[a], #108]\n\t"
  51801. "adc r4, r4, #0\n\t"
  51802. /* a[i+28] += m[28] * mu */
  51803. "ldr r7, [%[m], #112]\n\t"
  51804. "ldr r10, [%[a], #112]\n\t"
  51805. "lsr r11, r7, #16\n\t"
  51806. "lsr r6, r8, #16\n\t"
  51807. "mul r5, r6, r11\n\t"
  51808. "lsl r11, r7, #16\n\t"
  51809. "lsr r11, r11, #16\n\t"
  51810. "mul r6, r11, r6\n\t"
  51811. "lsr r11, r6, #16\n\t"
  51812. "lsl r6, r6, #16\n\t"
  51813. "adds r10, r10, r6\n\t"
  51814. "adc r5, r5, r11\n\t"
  51815. "lsl r6, r8, #16\n\t"
  51816. "lsl r11, r7, #16\n\t"
  51817. "lsr r6, r6, #16\n\t"
  51818. "lsr r11, r11, #16\n\t"
  51819. "mul r11, r6, r11\n\t"
  51820. "adds r10, r10, r11\n\t"
  51821. "adc r5, r5, #0\n\t"
  51822. "lsr r11, r7, #16\n\t"
  51823. "mul r6, r11, r6\n\t"
  51824. "lsr r11, r6, #16\n\t"
  51825. "lsl r6, r6, #16\n\t"
  51826. "adds r10, r10, r6\n\t"
  51827. "adc r5, r5, r11\n\t"
  51828. "adds r10, r10, r4\n\t"
  51829. "str r10, [%[a], #112]\n\t"
  51830. "adc r5, r5, #0\n\t"
  51831. /* a[i+29] += m[29] * mu */
  51832. "ldr r7, [%[m], #116]\n\t"
  51833. "ldr r10, [%[a], #116]\n\t"
  51834. "lsr r11, r7, #16\n\t"
  51835. "lsr r6, r8, #16\n\t"
  51836. "mul r4, r6, r11\n\t"
  51837. "lsl r11, r7, #16\n\t"
  51838. "lsr r11, r11, #16\n\t"
  51839. "mul r6, r11, r6\n\t"
  51840. "lsr r11, r6, #16\n\t"
  51841. "lsl r6, r6, #16\n\t"
  51842. "adds r10, r10, r6\n\t"
  51843. "adc r4, r4, r11\n\t"
  51844. "lsl r6, r8, #16\n\t"
  51845. "lsl r11, r7, #16\n\t"
  51846. "lsr r6, r6, #16\n\t"
  51847. "lsr r11, r11, #16\n\t"
  51848. "mul r11, r6, r11\n\t"
  51849. "adds r10, r10, r11\n\t"
  51850. "adc r4, r4, #0\n\t"
  51851. "lsr r11, r7, #16\n\t"
  51852. "mul r6, r11, r6\n\t"
  51853. "lsr r11, r6, #16\n\t"
  51854. "lsl r6, r6, #16\n\t"
  51855. "adds r10, r10, r6\n\t"
  51856. "adc r4, r4, r11\n\t"
  51857. "adds r10, r10, r5\n\t"
  51858. "str r10, [%[a], #116]\n\t"
  51859. "adc r4, r4, #0\n\t"
  51860. /* a[i+30] += m[30] * mu */
  51861. "ldr r7, [%[m], #120]\n\t"
  51862. "ldr r10, [%[a], #120]\n\t"
  51863. "lsr r11, r7, #16\n\t"
  51864. "lsr r6, r8, #16\n\t"
  51865. "mul r5, r6, r11\n\t"
  51866. "lsl r11, r7, #16\n\t"
  51867. "lsr r11, r11, #16\n\t"
  51868. "mul r6, r11, r6\n\t"
  51869. "lsr r11, r6, #16\n\t"
  51870. "lsl r6, r6, #16\n\t"
  51871. "adds r10, r10, r6\n\t"
  51872. "adc r5, r5, r11\n\t"
  51873. "lsl r6, r8, #16\n\t"
  51874. "lsl r11, r7, #16\n\t"
  51875. "lsr r6, r6, #16\n\t"
  51876. "lsr r11, r11, #16\n\t"
  51877. "mul r11, r6, r11\n\t"
  51878. "adds r10, r10, r11\n\t"
  51879. "adc r5, r5, #0\n\t"
  51880. "lsr r11, r7, #16\n\t"
  51881. "mul r6, r11, r6\n\t"
  51882. "lsr r11, r6, #16\n\t"
  51883. "lsl r6, r6, #16\n\t"
  51884. "adds r10, r10, r6\n\t"
  51885. "adc r5, r5, r11\n\t"
  51886. "adds r10, r10, r4\n\t"
  51887. "str r10, [%[a], #120]\n\t"
  51888. "adc r5, r5, #0\n\t"
  51889. /* a[i+31] += m[31] * mu */
  51890. "ldr r7, [%[m], #124]\n\t"
  51891. "ldr r10, [%[a], #124]\n\t"
  51892. "lsr r11, r7, #16\n\t"
  51893. "lsr r6, r8, #16\n\t"
  51894. "mul r4, r6, r11\n\t"
  51895. "lsl r11, r7, #16\n\t"
  51896. "lsr r11, r11, #16\n\t"
  51897. "mul r6, r11, r6\n\t"
  51898. "lsr r11, r6, #16\n\t"
  51899. "lsl r6, r6, #16\n\t"
  51900. "adds r10, r10, r6\n\t"
  51901. "adc r4, r4, r11\n\t"
  51902. "lsl r6, r8, #16\n\t"
  51903. "lsl r11, r7, #16\n\t"
  51904. "lsr r6, r6, #16\n\t"
  51905. "lsr r11, r11, #16\n\t"
  51906. "mul r11, r6, r11\n\t"
  51907. "adds r10, r10, r11\n\t"
  51908. "adc r4, r4, #0\n\t"
  51909. "lsr r11, r7, #16\n\t"
  51910. "mul r6, r11, r6\n\t"
  51911. "lsr r11, r6, #16\n\t"
  51912. "lsl r6, r6, #16\n\t"
  51913. "adds r10, r10, r6\n\t"
  51914. "adc r4, r4, r11\n\t"
  51915. "adds r10, r10, r5\n\t"
  51916. "str r10, [%[a], #124]\n\t"
  51917. "adc r4, r4, #0\n\t"
  51918. /* a[i+32] += m[32] * mu */
  51919. "ldr r7, [%[m], #128]\n\t"
  51920. "ldr r10, [%[a], #128]\n\t"
  51921. "lsr r11, r7, #16\n\t"
  51922. "lsr r6, r8, #16\n\t"
  51923. "mul r5, r6, r11\n\t"
  51924. "lsl r11, r7, #16\n\t"
  51925. "lsr r11, r11, #16\n\t"
  51926. "mul r6, r11, r6\n\t"
  51927. "lsr r11, r6, #16\n\t"
  51928. "lsl r6, r6, #16\n\t"
  51929. "adds r10, r10, r6\n\t"
  51930. "adc r5, r5, r11\n\t"
  51931. "lsl r6, r8, #16\n\t"
  51932. "lsl r11, r7, #16\n\t"
  51933. "lsr r6, r6, #16\n\t"
  51934. "lsr r11, r11, #16\n\t"
  51935. "mul r11, r6, r11\n\t"
  51936. "adds r10, r10, r11\n\t"
  51937. "adc r5, r5, #0\n\t"
  51938. "lsr r11, r7, #16\n\t"
  51939. "mul r6, r11, r6\n\t"
  51940. "lsr r11, r6, #16\n\t"
  51941. "lsl r6, r6, #16\n\t"
  51942. "adds r10, r10, r6\n\t"
  51943. "adc r5, r5, r11\n\t"
  51944. "adds r10, r10, r4\n\t"
  51945. "str r10, [%[a], #128]\n\t"
  51946. "adc r5, r5, #0\n\t"
  51947. /* a[i+33] += m[33] * mu */
  51948. "ldr r7, [%[m], #132]\n\t"
  51949. "ldr r10, [%[a], #132]\n\t"
  51950. "lsr r11, r7, #16\n\t"
  51951. "lsr r6, r8, #16\n\t"
  51952. "mul r4, r6, r11\n\t"
  51953. "lsl r11, r7, #16\n\t"
  51954. "lsr r11, r11, #16\n\t"
  51955. "mul r6, r11, r6\n\t"
  51956. "lsr r11, r6, #16\n\t"
  51957. "lsl r6, r6, #16\n\t"
  51958. "adds r10, r10, r6\n\t"
  51959. "adc r4, r4, r11\n\t"
  51960. "lsl r6, r8, #16\n\t"
  51961. "lsl r11, r7, #16\n\t"
  51962. "lsr r6, r6, #16\n\t"
  51963. "lsr r11, r11, #16\n\t"
  51964. "mul r11, r6, r11\n\t"
  51965. "adds r10, r10, r11\n\t"
  51966. "adc r4, r4, #0\n\t"
  51967. "lsr r11, r7, #16\n\t"
  51968. "mul r6, r11, r6\n\t"
  51969. "lsr r11, r6, #16\n\t"
  51970. "lsl r6, r6, #16\n\t"
  51971. "adds r10, r10, r6\n\t"
  51972. "adc r4, r4, r11\n\t"
  51973. "adds r10, r10, r5\n\t"
  51974. "str r10, [%[a], #132]\n\t"
  51975. "adc r4, r4, #0\n\t"
  51976. /* a[i+34] += m[34] * mu */
  51977. "ldr r7, [%[m], #136]\n\t"
  51978. "ldr r10, [%[a], #136]\n\t"
  51979. "lsr r11, r7, #16\n\t"
  51980. "lsr r6, r8, #16\n\t"
  51981. "mul r5, r6, r11\n\t"
  51982. "lsl r11, r7, #16\n\t"
  51983. "lsr r11, r11, #16\n\t"
  51984. "mul r6, r11, r6\n\t"
  51985. "lsr r11, r6, #16\n\t"
  51986. "lsl r6, r6, #16\n\t"
  51987. "adds r10, r10, r6\n\t"
  51988. "adc r5, r5, r11\n\t"
  51989. "lsl r6, r8, #16\n\t"
  51990. "lsl r11, r7, #16\n\t"
  51991. "lsr r6, r6, #16\n\t"
  51992. "lsr r11, r11, #16\n\t"
  51993. "mul r11, r6, r11\n\t"
  51994. "adds r10, r10, r11\n\t"
  51995. "adc r5, r5, #0\n\t"
  51996. "lsr r11, r7, #16\n\t"
  51997. "mul r6, r11, r6\n\t"
  51998. "lsr r11, r6, #16\n\t"
  51999. "lsl r6, r6, #16\n\t"
  52000. "adds r10, r10, r6\n\t"
  52001. "adc r5, r5, r11\n\t"
  52002. "adds r10, r10, r4\n\t"
  52003. "str r10, [%[a], #136]\n\t"
  52004. "adc r5, r5, #0\n\t"
  52005. /* a[i+35] += m[35] * mu */
  52006. "ldr r7, [%[m], #140]\n\t"
  52007. "ldr r10, [%[a], #140]\n\t"
  52008. "lsr r11, r7, #16\n\t"
  52009. "lsr r6, r8, #16\n\t"
  52010. "mul r4, r6, r11\n\t"
  52011. "lsl r11, r7, #16\n\t"
  52012. "lsr r11, r11, #16\n\t"
  52013. "mul r6, r11, r6\n\t"
  52014. "lsr r11, r6, #16\n\t"
  52015. "lsl r6, r6, #16\n\t"
  52016. "adds r10, r10, r6\n\t"
  52017. "adc r4, r4, r11\n\t"
  52018. "lsl r6, r8, #16\n\t"
  52019. "lsl r11, r7, #16\n\t"
  52020. "lsr r6, r6, #16\n\t"
  52021. "lsr r11, r11, #16\n\t"
  52022. "mul r11, r6, r11\n\t"
  52023. "adds r10, r10, r11\n\t"
  52024. "adc r4, r4, #0\n\t"
  52025. "lsr r11, r7, #16\n\t"
  52026. "mul r6, r11, r6\n\t"
  52027. "lsr r11, r6, #16\n\t"
  52028. "lsl r6, r6, #16\n\t"
  52029. "adds r10, r10, r6\n\t"
  52030. "adc r4, r4, r11\n\t"
  52031. "adds r10, r10, r5\n\t"
  52032. "str r10, [%[a], #140]\n\t"
  52033. "adc r4, r4, #0\n\t"
  52034. /* a[i+36] += m[36] * mu */
  52035. "ldr r7, [%[m], #144]\n\t"
  52036. "ldr r10, [%[a], #144]\n\t"
  52037. "lsr r11, r7, #16\n\t"
  52038. "lsr r6, r8, #16\n\t"
  52039. "mul r5, r6, r11\n\t"
  52040. "lsl r11, r7, #16\n\t"
  52041. "lsr r11, r11, #16\n\t"
  52042. "mul r6, r11, r6\n\t"
  52043. "lsr r11, r6, #16\n\t"
  52044. "lsl r6, r6, #16\n\t"
  52045. "adds r10, r10, r6\n\t"
  52046. "adc r5, r5, r11\n\t"
  52047. "lsl r6, r8, #16\n\t"
  52048. "lsl r11, r7, #16\n\t"
  52049. "lsr r6, r6, #16\n\t"
  52050. "lsr r11, r11, #16\n\t"
  52051. "mul r11, r6, r11\n\t"
  52052. "adds r10, r10, r11\n\t"
  52053. "adc r5, r5, #0\n\t"
  52054. "lsr r11, r7, #16\n\t"
  52055. "mul r6, r11, r6\n\t"
  52056. "lsr r11, r6, #16\n\t"
  52057. "lsl r6, r6, #16\n\t"
  52058. "adds r10, r10, r6\n\t"
  52059. "adc r5, r5, r11\n\t"
  52060. "adds r10, r10, r4\n\t"
  52061. "str r10, [%[a], #144]\n\t"
  52062. "adc r5, r5, #0\n\t"
  52063. /* a[i+37] += m[37] * mu */
  52064. "ldr r7, [%[m], #148]\n\t"
  52065. "ldr r10, [%[a], #148]\n\t"
  52066. "lsr r11, r7, #16\n\t"
  52067. "lsr r6, r8, #16\n\t"
  52068. "mul r4, r6, r11\n\t"
  52069. "lsl r11, r7, #16\n\t"
  52070. "lsr r11, r11, #16\n\t"
  52071. "mul r6, r11, r6\n\t"
  52072. "lsr r11, r6, #16\n\t"
  52073. "lsl r6, r6, #16\n\t"
  52074. "adds r10, r10, r6\n\t"
  52075. "adc r4, r4, r11\n\t"
  52076. "lsl r6, r8, #16\n\t"
  52077. "lsl r11, r7, #16\n\t"
  52078. "lsr r6, r6, #16\n\t"
  52079. "lsr r11, r11, #16\n\t"
  52080. "mul r11, r6, r11\n\t"
  52081. "adds r10, r10, r11\n\t"
  52082. "adc r4, r4, #0\n\t"
  52083. "lsr r11, r7, #16\n\t"
  52084. "mul r6, r11, r6\n\t"
  52085. "lsr r11, r6, #16\n\t"
  52086. "lsl r6, r6, #16\n\t"
  52087. "adds r10, r10, r6\n\t"
  52088. "adc r4, r4, r11\n\t"
  52089. "adds r10, r10, r5\n\t"
  52090. "str r10, [%[a], #148]\n\t"
  52091. "adc r4, r4, #0\n\t"
  52092. /* a[i+38] += m[38] * mu */
  52093. "ldr r7, [%[m], #152]\n\t"
  52094. "ldr r10, [%[a], #152]\n\t"
  52095. "lsr r11, r7, #16\n\t"
  52096. "lsr r6, r8, #16\n\t"
  52097. "mul r5, r6, r11\n\t"
  52098. "lsl r11, r7, #16\n\t"
  52099. "lsr r11, r11, #16\n\t"
  52100. "mul r6, r11, r6\n\t"
  52101. "lsr r11, r6, #16\n\t"
  52102. "lsl r6, r6, #16\n\t"
  52103. "adds r10, r10, r6\n\t"
  52104. "adc r5, r5, r11\n\t"
  52105. "lsl r6, r8, #16\n\t"
  52106. "lsl r11, r7, #16\n\t"
  52107. "lsr r6, r6, #16\n\t"
  52108. "lsr r11, r11, #16\n\t"
  52109. "mul r11, r6, r11\n\t"
  52110. "adds r10, r10, r11\n\t"
  52111. "adc r5, r5, #0\n\t"
  52112. "lsr r11, r7, #16\n\t"
  52113. "mul r6, r11, r6\n\t"
  52114. "lsr r11, r6, #16\n\t"
  52115. "lsl r6, r6, #16\n\t"
  52116. "adds r10, r10, r6\n\t"
  52117. "adc r5, r5, r11\n\t"
  52118. "adds r10, r10, r4\n\t"
  52119. "str r10, [%[a], #152]\n\t"
  52120. "adc r5, r5, #0\n\t"
  52121. /* a[i+39] += m[39] * mu */
  52122. "ldr r7, [%[m], #156]\n\t"
  52123. "ldr r10, [%[a], #156]\n\t"
  52124. "lsr r11, r7, #16\n\t"
  52125. "lsr r6, r8, #16\n\t"
  52126. "mul r4, r6, r11\n\t"
  52127. "lsl r11, r7, #16\n\t"
  52128. "lsr r11, r11, #16\n\t"
  52129. "mul r6, r11, r6\n\t"
  52130. "lsr r11, r6, #16\n\t"
  52131. "lsl r6, r6, #16\n\t"
  52132. "adds r10, r10, r6\n\t"
  52133. "adc r4, r4, r11\n\t"
  52134. "lsl r6, r8, #16\n\t"
  52135. "lsl r11, r7, #16\n\t"
  52136. "lsr r6, r6, #16\n\t"
  52137. "lsr r11, r11, #16\n\t"
  52138. "mul r11, r6, r11\n\t"
  52139. "adds r10, r10, r11\n\t"
  52140. "adc r4, r4, #0\n\t"
  52141. "lsr r11, r7, #16\n\t"
  52142. "mul r6, r11, r6\n\t"
  52143. "lsr r11, r6, #16\n\t"
  52144. "lsl r6, r6, #16\n\t"
  52145. "adds r10, r10, r6\n\t"
  52146. "adc r4, r4, r11\n\t"
  52147. "adds r10, r10, r5\n\t"
  52148. "str r10, [%[a], #156]\n\t"
  52149. "adc r4, r4, #0\n\t"
  52150. /* a[i+40] += m[40] * mu */
  52151. "ldr r7, [%[m], #160]\n\t"
  52152. "ldr r10, [%[a], #160]\n\t"
  52153. "lsr r11, r7, #16\n\t"
  52154. "lsr r6, r8, #16\n\t"
  52155. "mul r5, r6, r11\n\t"
  52156. "lsl r11, r7, #16\n\t"
  52157. "lsr r11, r11, #16\n\t"
  52158. "mul r6, r11, r6\n\t"
  52159. "lsr r11, r6, #16\n\t"
  52160. "lsl r6, r6, #16\n\t"
  52161. "adds r10, r10, r6\n\t"
  52162. "adc r5, r5, r11\n\t"
  52163. "lsl r6, r8, #16\n\t"
  52164. "lsl r11, r7, #16\n\t"
  52165. "lsr r6, r6, #16\n\t"
  52166. "lsr r11, r11, #16\n\t"
  52167. "mul r11, r6, r11\n\t"
  52168. "adds r10, r10, r11\n\t"
  52169. "adc r5, r5, #0\n\t"
  52170. "lsr r11, r7, #16\n\t"
  52171. "mul r6, r11, r6\n\t"
  52172. "lsr r11, r6, #16\n\t"
  52173. "lsl r6, r6, #16\n\t"
  52174. "adds r10, r10, r6\n\t"
  52175. "adc r5, r5, r11\n\t"
  52176. "adds r10, r10, r4\n\t"
  52177. "str r10, [%[a], #160]\n\t"
  52178. "adc r5, r5, #0\n\t"
  52179. /* a[i+41] += m[41] * mu */
  52180. "ldr r7, [%[m], #164]\n\t"
  52181. "ldr r10, [%[a], #164]\n\t"
  52182. "lsr r11, r7, #16\n\t"
  52183. "lsr r6, r8, #16\n\t"
  52184. "mul r4, r6, r11\n\t"
  52185. "lsl r11, r7, #16\n\t"
  52186. "lsr r11, r11, #16\n\t"
  52187. "mul r6, r11, r6\n\t"
  52188. "lsr r11, r6, #16\n\t"
  52189. "lsl r6, r6, #16\n\t"
  52190. "adds r10, r10, r6\n\t"
  52191. "adc r4, r4, r11\n\t"
  52192. "lsl r6, r8, #16\n\t"
  52193. "lsl r11, r7, #16\n\t"
  52194. "lsr r6, r6, #16\n\t"
  52195. "lsr r11, r11, #16\n\t"
  52196. "mul r11, r6, r11\n\t"
  52197. "adds r10, r10, r11\n\t"
  52198. "adc r4, r4, #0\n\t"
  52199. "lsr r11, r7, #16\n\t"
  52200. "mul r6, r11, r6\n\t"
  52201. "lsr r11, r6, #16\n\t"
  52202. "lsl r6, r6, #16\n\t"
  52203. "adds r10, r10, r6\n\t"
  52204. "adc r4, r4, r11\n\t"
  52205. "adds r10, r10, r5\n\t"
  52206. "str r10, [%[a], #164]\n\t"
  52207. "adc r4, r4, #0\n\t"
  52208. /* a[i+42] += m[42] * mu */
  52209. "ldr r7, [%[m], #168]\n\t"
  52210. "ldr r10, [%[a], #168]\n\t"
  52211. "lsr r11, r7, #16\n\t"
  52212. "lsr r6, r8, #16\n\t"
  52213. "mul r5, r6, r11\n\t"
  52214. "lsl r11, r7, #16\n\t"
  52215. "lsr r11, r11, #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. "lsl r6, r8, #16\n\t"
  52222. "lsl r11, r7, #16\n\t"
  52223. "lsr r6, r6, #16\n\t"
  52224. "lsr r11, r11, #16\n\t"
  52225. "mul r11, r6, r11\n\t"
  52226. "adds r10, r10, r11\n\t"
  52227. "adc r5, r5, #0\n\t"
  52228. "lsr r11, r7, #16\n\t"
  52229. "mul r6, r11, r6\n\t"
  52230. "lsr r11, r6, #16\n\t"
  52231. "lsl r6, r6, #16\n\t"
  52232. "adds r10, r10, r6\n\t"
  52233. "adc r5, r5, r11\n\t"
  52234. "adds r10, r10, r4\n\t"
  52235. "str r10, [%[a], #168]\n\t"
  52236. "adc r5, r5, #0\n\t"
  52237. /* a[i+43] += m[43] * mu */
  52238. "ldr r7, [%[m], #172]\n\t"
  52239. "ldr r10, [%[a], #172]\n\t"
  52240. "lsr r11, r7, #16\n\t"
  52241. "lsr r6, r8, #16\n\t"
  52242. "mul r4, r6, r11\n\t"
  52243. "lsl r11, r7, #16\n\t"
  52244. "lsr r11, r11, #16\n\t"
  52245. "mul r6, r11, r6\n\t"
  52246. "lsr r11, r6, #16\n\t"
  52247. "lsl r6, r6, #16\n\t"
  52248. "adds r10, r10, r6\n\t"
  52249. "adc r4, r4, r11\n\t"
  52250. "lsl r6, r8, #16\n\t"
  52251. "lsl r11, r7, #16\n\t"
  52252. "lsr r6, r6, #16\n\t"
  52253. "lsr r11, r11, #16\n\t"
  52254. "mul r11, r6, r11\n\t"
  52255. "adds r10, r10, r11\n\t"
  52256. "adc r4, r4, #0\n\t"
  52257. "lsr r11, r7, #16\n\t"
  52258. "mul r6, r11, r6\n\t"
  52259. "lsr r11, r6, #16\n\t"
  52260. "lsl r6, r6, #16\n\t"
  52261. "adds r10, r10, r6\n\t"
  52262. "adc r4, r4, r11\n\t"
  52263. "adds r10, r10, r5\n\t"
  52264. "str r10, [%[a], #172]\n\t"
  52265. "adc r4, r4, #0\n\t"
  52266. /* a[i+44] += m[44] * mu */
  52267. "ldr r7, [%[m], #176]\n\t"
  52268. "ldr r10, [%[a], #176]\n\t"
  52269. "lsr r11, r7, #16\n\t"
  52270. "lsr r6, r8, #16\n\t"
  52271. "mul r5, r6, r11\n\t"
  52272. "lsl r11, r7, #16\n\t"
  52273. "lsr r11, r11, #16\n\t"
  52274. "mul r6, r11, r6\n\t"
  52275. "lsr r11, r6, #16\n\t"
  52276. "lsl r6, r6, #16\n\t"
  52277. "adds r10, r10, r6\n\t"
  52278. "adc r5, r5, r11\n\t"
  52279. "lsl r6, r8, #16\n\t"
  52280. "lsl r11, r7, #16\n\t"
  52281. "lsr r6, r6, #16\n\t"
  52282. "lsr r11, r11, #16\n\t"
  52283. "mul r11, r6, r11\n\t"
  52284. "adds r10, r10, r11\n\t"
  52285. "adc r5, r5, #0\n\t"
  52286. "lsr r11, r7, #16\n\t"
  52287. "mul r6, r11, r6\n\t"
  52288. "lsr r11, r6, #16\n\t"
  52289. "lsl r6, r6, #16\n\t"
  52290. "adds r10, r10, r6\n\t"
  52291. "adc r5, r5, r11\n\t"
  52292. "adds r10, r10, r4\n\t"
  52293. "str r10, [%[a], #176]\n\t"
  52294. "adc r5, r5, #0\n\t"
  52295. /* a[i+45] += m[45] * mu */
  52296. "ldr r7, [%[m], #180]\n\t"
  52297. "ldr r10, [%[a], #180]\n\t"
  52298. "lsr r11, r7, #16\n\t"
  52299. "lsr r6, r8, #16\n\t"
  52300. "mul r4, r6, r11\n\t"
  52301. "lsl r11, r7, #16\n\t"
  52302. "lsr r11, r11, #16\n\t"
  52303. "mul r6, r11, r6\n\t"
  52304. "lsr r11, r6, #16\n\t"
  52305. "lsl r6, r6, #16\n\t"
  52306. "adds r10, r10, r6\n\t"
  52307. "adc r4, r4, r11\n\t"
  52308. "lsl r6, r8, #16\n\t"
  52309. "lsl r11, r7, #16\n\t"
  52310. "lsr r6, r6, #16\n\t"
  52311. "lsr r11, r11, #16\n\t"
  52312. "mul r11, r6, r11\n\t"
  52313. "adds r10, r10, r11\n\t"
  52314. "adc r4, r4, #0\n\t"
  52315. "lsr r11, r7, #16\n\t"
  52316. "mul r6, r11, r6\n\t"
  52317. "lsr r11, r6, #16\n\t"
  52318. "lsl r6, r6, #16\n\t"
  52319. "adds r10, r10, r6\n\t"
  52320. "adc r4, r4, r11\n\t"
  52321. "adds r10, r10, r5\n\t"
  52322. "str r10, [%[a], #180]\n\t"
  52323. "adc r4, r4, #0\n\t"
  52324. /* a[i+46] += m[46] * mu */
  52325. "ldr r7, [%[m], #184]\n\t"
  52326. "ldr r10, [%[a], #184]\n\t"
  52327. "lsr r11, r7, #16\n\t"
  52328. "lsr r6, r8, #16\n\t"
  52329. "mul r5, r6, r11\n\t"
  52330. "lsl r11, r7, #16\n\t"
  52331. "lsr r11, r11, #16\n\t"
  52332. "mul r6, r11, r6\n\t"
  52333. "lsr r11, r6, #16\n\t"
  52334. "lsl r6, r6, #16\n\t"
  52335. "adds r10, r10, r6\n\t"
  52336. "adc r5, r5, r11\n\t"
  52337. "lsl r6, r8, #16\n\t"
  52338. "lsl r11, r7, #16\n\t"
  52339. "lsr r6, r6, #16\n\t"
  52340. "lsr r11, r11, #16\n\t"
  52341. "mul r11, r6, r11\n\t"
  52342. "adds r10, r10, r11\n\t"
  52343. "adc r5, r5, #0\n\t"
  52344. "lsr r11, r7, #16\n\t"
  52345. "mul r6, r11, r6\n\t"
  52346. "lsr r11, r6, #16\n\t"
  52347. "lsl r6, r6, #16\n\t"
  52348. "adds r10, r10, r6\n\t"
  52349. "adc r5, r5, r11\n\t"
  52350. "adds r10, r10, r4\n\t"
  52351. "str r10, [%[a], #184]\n\t"
  52352. "adc r5, r5, #0\n\t"
  52353. /* a[i+47] += m[47] * mu */
  52354. "ldr r7, [%[m], #188]\n\t"
  52355. "ldr r10, [%[a], #188]\n\t"
  52356. "lsr r11, r7, #16\n\t"
  52357. "lsr r6, r8, #16\n\t"
  52358. "mul r4, r6, r11\n\t"
  52359. "lsl r11, r7, #16\n\t"
  52360. "lsr r11, r11, #16\n\t"
  52361. "mul r6, r11, r6\n\t"
  52362. "lsr r11, r6, #16\n\t"
  52363. "lsl r6, r6, #16\n\t"
  52364. "adds r10, r10, r6\n\t"
  52365. "adc r4, r4, r11\n\t"
  52366. "lsl r6, r8, #16\n\t"
  52367. "lsl r11, r7, #16\n\t"
  52368. "lsr r6, r6, #16\n\t"
  52369. "lsr r11, r11, #16\n\t"
  52370. "mul r11, r6, r11\n\t"
  52371. "adds r10, r10, r11\n\t"
  52372. "adc r4, r4, #0\n\t"
  52373. "lsr r11, r7, #16\n\t"
  52374. "mul r6, r11, r6\n\t"
  52375. "lsr r11, r6, #16\n\t"
  52376. "lsl r6, r6, #16\n\t"
  52377. "adds r10, r10, r6\n\t"
  52378. "adc r4, r4, r11\n\t"
  52379. "adds r10, r10, r5\n\t"
  52380. "str r10, [%[a], #188]\n\t"
  52381. "adc r4, r4, #0\n\t"
  52382. /* a[i+48] += m[48] * mu */
  52383. "ldr r7, [%[m], #192]\n\t"
  52384. "ldr r10, [%[a], #192]\n\t"
  52385. "lsr r11, r7, #16\n\t"
  52386. "lsr r6, r8, #16\n\t"
  52387. "mul r5, r6, r11\n\t"
  52388. "lsl r11, r7, #16\n\t"
  52389. "lsr r11, r11, #16\n\t"
  52390. "mul r6, r11, r6\n\t"
  52391. "lsr r11, r6, #16\n\t"
  52392. "lsl r6, r6, #16\n\t"
  52393. "adds r10, r10, r6\n\t"
  52394. "adc r5, r5, r11\n\t"
  52395. "lsl r6, r8, #16\n\t"
  52396. "lsl r11, r7, #16\n\t"
  52397. "lsr r6, r6, #16\n\t"
  52398. "lsr r11, r11, #16\n\t"
  52399. "mul r11, r6, r11\n\t"
  52400. "adds r10, r10, r11\n\t"
  52401. "adc r5, r5, #0\n\t"
  52402. "lsr r11, r7, #16\n\t"
  52403. "mul r6, r11, r6\n\t"
  52404. "lsr r11, r6, #16\n\t"
  52405. "lsl r6, r6, #16\n\t"
  52406. "adds r10, r10, r6\n\t"
  52407. "adc r5, r5, r11\n\t"
  52408. "adds r10, r10, r4\n\t"
  52409. "str r10, [%[a], #192]\n\t"
  52410. "adc r5, r5, #0\n\t"
  52411. /* a[i+49] += m[49] * mu */
  52412. "ldr r7, [%[m], #196]\n\t"
  52413. "ldr r10, [%[a], #196]\n\t"
  52414. "lsr r11, r7, #16\n\t"
  52415. "lsr r6, r8, #16\n\t"
  52416. "mul r4, r6, r11\n\t"
  52417. "lsl r11, r7, #16\n\t"
  52418. "lsr r11, r11, #16\n\t"
  52419. "mul r6, r11, r6\n\t"
  52420. "lsr r11, r6, #16\n\t"
  52421. "lsl r6, r6, #16\n\t"
  52422. "adds r10, r10, r6\n\t"
  52423. "adc r4, r4, r11\n\t"
  52424. "lsl r6, r8, #16\n\t"
  52425. "lsl r11, r7, #16\n\t"
  52426. "lsr r6, r6, #16\n\t"
  52427. "lsr r11, r11, #16\n\t"
  52428. "mul r11, r6, r11\n\t"
  52429. "adds r10, r10, r11\n\t"
  52430. "adc r4, r4, #0\n\t"
  52431. "lsr r11, r7, #16\n\t"
  52432. "mul r6, r11, r6\n\t"
  52433. "lsr r11, r6, #16\n\t"
  52434. "lsl r6, r6, #16\n\t"
  52435. "adds r10, r10, r6\n\t"
  52436. "adc r4, r4, r11\n\t"
  52437. "adds r10, r10, r5\n\t"
  52438. "str r10, [%[a], #196]\n\t"
  52439. "adc r4, r4, #0\n\t"
  52440. /* a[i+50] += m[50] * mu */
  52441. "ldr r7, [%[m], #200]\n\t"
  52442. "ldr r10, [%[a], #200]\n\t"
  52443. "lsr r11, r7, #16\n\t"
  52444. "lsr r6, r8, #16\n\t"
  52445. "mul r5, 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 r5, r5, 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 r5, r5, #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 r5, r5, r11\n\t"
  52466. "adds r10, r10, r4\n\t"
  52467. "str r10, [%[a], #200]\n\t"
  52468. "adc r5, r5, #0\n\t"
  52469. /* a[i+51] += m[51] * mu */
  52470. "ldr r7, [%[m], #204]\n\t"
  52471. "ldr r10, [%[a], #204]\n\t"
  52472. "lsr r11, r7, #16\n\t"
  52473. "lsr r6, r8, #16\n\t"
  52474. "mul r4, r6, r11\n\t"
  52475. "lsl r11, r7, #16\n\t"
  52476. "lsr r11, r11, #16\n\t"
  52477. "mul r6, r11, r6\n\t"
  52478. "lsr r11, r6, #16\n\t"
  52479. "lsl r6, r6, #16\n\t"
  52480. "adds r10, r10, r6\n\t"
  52481. "adc r4, r4, r11\n\t"
  52482. "lsl r6, r8, #16\n\t"
  52483. "lsl r11, r7, #16\n\t"
  52484. "lsr r6, r6, #16\n\t"
  52485. "lsr r11, r11, #16\n\t"
  52486. "mul r11, r6, r11\n\t"
  52487. "adds r10, r10, r11\n\t"
  52488. "adc r4, r4, #0\n\t"
  52489. "lsr r11, r7, #16\n\t"
  52490. "mul r6, r11, r6\n\t"
  52491. "lsr r11, r6, #16\n\t"
  52492. "lsl r6, r6, #16\n\t"
  52493. "adds r10, r10, r6\n\t"
  52494. "adc r4, r4, r11\n\t"
  52495. "adds r10, r10, r5\n\t"
  52496. "str r10, [%[a], #204]\n\t"
  52497. "adc r4, r4, #0\n\t"
  52498. /* a[i+52] += m[52] * mu */
  52499. "ldr r7, [%[m], #208]\n\t"
  52500. "ldr r10, [%[a], #208]\n\t"
  52501. "lsr r11, r7, #16\n\t"
  52502. "lsr r6, r8, #16\n\t"
  52503. "mul r5, r6, r11\n\t"
  52504. "lsl r11, r7, #16\n\t"
  52505. "lsr r11, r11, #16\n\t"
  52506. "mul r6, r11, r6\n\t"
  52507. "lsr r11, r6, #16\n\t"
  52508. "lsl r6, r6, #16\n\t"
  52509. "adds r10, r10, r6\n\t"
  52510. "adc r5, r5, r11\n\t"
  52511. "lsl r6, r8, #16\n\t"
  52512. "lsl r11, r7, #16\n\t"
  52513. "lsr r6, r6, #16\n\t"
  52514. "lsr r11, r11, #16\n\t"
  52515. "mul r11, r6, r11\n\t"
  52516. "adds r10, r10, r11\n\t"
  52517. "adc r5, r5, #0\n\t"
  52518. "lsr r11, r7, #16\n\t"
  52519. "mul r6, r11, r6\n\t"
  52520. "lsr r11, r6, #16\n\t"
  52521. "lsl r6, r6, #16\n\t"
  52522. "adds r10, r10, r6\n\t"
  52523. "adc r5, r5, r11\n\t"
  52524. "adds r10, r10, r4\n\t"
  52525. "str r10, [%[a], #208]\n\t"
  52526. "adc r5, r5, #0\n\t"
  52527. /* a[i+53] += m[53] * mu */
  52528. "ldr r7, [%[m], #212]\n\t"
  52529. "ldr r10, [%[a], #212]\n\t"
  52530. "lsr r11, r7, #16\n\t"
  52531. "lsr r6, r8, #16\n\t"
  52532. "mul r4, r6, r11\n\t"
  52533. "lsl r11, r7, #16\n\t"
  52534. "lsr r11, r11, #16\n\t"
  52535. "mul r6, r11, r6\n\t"
  52536. "lsr r11, r6, #16\n\t"
  52537. "lsl r6, r6, #16\n\t"
  52538. "adds r10, r10, r6\n\t"
  52539. "adc r4, r4, r11\n\t"
  52540. "lsl r6, r8, #16\n\t"
  52541. "lsl r11, r7, #16\n\t"
  52542. "lsr r6, r6, #16\n\t"
  52543. "lsr r11, r11, #16\n\t"
  52544. "mul r11, r6, r11\n\t"
  52545. "adds r10, r10, r11\n\t"
  52546. "adc r4, r4, #0\n\t"
  52547. "lsr r11, r7, #16\n\t"
  52548. "mul r6, r11, r6\n\t"
  52549. "lsr r11, r6, #16\n\t"
  52550. "lsl r6, r6, #16\n\t"
  52551. "adds r10, r10, r6\n\t"
  52552. "adc r4, r4, r11\n\t"
  52553. "adds r10, r10, r5\n\t"
  52554. "str r10, [%[a], #212]\n\t"
  52555. "adc r4, r4, #0\n\t"
  52556. /* a[i+54] += m[54] * mu */
  52557. "ldr r7, [%[m], #216]\n\t"
  52558. "ldr r10, [%[a], #216]\n\t"
  52559. "lsr r11, r7, #16\n\t"
  52560. "lsr r6, r8, #16\n\t"
  52561. "mul r5, r6, r11\n\t"
  52562. "lsl r11, r7, #16\n\t"
  52563. "lsr r11, r11, #16\n\t"
  52564. "mul r6, r11, r6\n\t"
  52565. "lsr r11, r6, #16\n\t"
  52566. "lsl r6, r6, #16\n\t"
  52567. "adds r10, r10, r6\n\t"
  52568. "adc r5, r5, r11\n\t"
  52569. "lsl r6, r8, #16\n\t"
  52570. "lsl r11, r7, #16\n\t"
  52571. "lsr r6, r6, #16\n\t"
  52572. "lsr r11, r11, #16\n\t"
  52573. "mul r11, r6, r11\n\t"
  52574. "adds r10, r10, r11\n\t"
  52575. "adc r5, r5, #0\n\t"
  52576. "lsr r11, r7, #16\n\t"
  52577. "mul r6, r11, r6\n\t"
  52578. "lsr r11, r6, #16\n\t"
  52579. "lsl r6, r6, #16\n\t"
  52580. "adds r10, r10, r6\n\t"
  52581. "adc r5, r5, r11\n\t"
  52582. "adds r10, r10, r4\n\t"
  52583. "str r10, [%[a], #216]\n\t"
  52584. "adc r5, r5, #0\n\t"
  52585. /* a[i+55] += m[55] * mu */
  52586. "ldr r7, [%[m], #220]\n\t"
  52587. "ldr r10, [%[a], #220]\n\t"
  52588. "lsr r11, r7, #16\n\t"
  52589. "lsr r6, r8, #16\n\t"
  52590. "mul r4, r6, r11\n\t"
  52591. "lsl r11, r7, #16\n\t"
  52592. "lsr r11, r11, #16\n\t"
  52593. "mul r6, r11, r6\n\t"
  52594. "lsr r11, r6, #16\n\t"
  52595. "lsl r6, r6, #16\n\t"
  52596. "adds r10, r10, r6\n\t"
  52597. "adc r4, r4, r11\n\t"
  52598. "lsl r6, r8, #16\n\t"
  52599. "lsl r11, r7, #16\n\t"
  52600. "lsr r6, r6, #16\n\t"
  52601. "lsr r11, r11, #16\n\t"
  52602. "mul r11, r6, r11\n\t"
  52603. "adds r10, r10, r11\n\t"
  52604. "adc r4, r4, #0\n\t"
  52605. "lsr r11, r7, #16\n\t"
  52606. "mul r6, r11, r6\n\t"
  52607. "lsr r11, r6, #16\n\t"
  52608. "lsl r6, r6, #16\n\t"
  52609. "adds r10, r10, r6\n\t"
  52610. "adc r4, r4, r11\n\t"
  52611. "adds r10, r10, r5\n\t"
  52612. "str r10, [%[a], #220]\n\t"
  52613. "adc r4, r4, #0\n\t"
  52614. /* a[i+56] += m[56] * mu */
  52615. "ldr r7, [%[m], #224]\n\t"
  52616. "ldr r10, [%[a], #224]\n\t"
  52617. "lsr r11, r7, #16\n\t"
  52618. "lsr r6, r8, #16\n\t"
  52619. "mul r5, r6, r11\n\t"
  52620. "lsl r11, r7, #16\n\t"
  52621. "lsr r11, r11, #16\n\t"
  52622. "mul r6, r11, r6\n\t"
  52623. "lsr r11, r6, #16\n\t"
  52624. "lsl r6, r6, #16\n\t"
  52625. "adds r10, r10, r6\n\t"
  52626. "adc r5, r5, r11\n\t"
  52627. "lsl r6, r8, #16\n\t"
  52628. "lsl r11, r7, #16\n\t"
  52629. "lsr r6, r6, #16\n\t"
  52630. "lsr r11, r11, #16\n\t"
  52631. "mul r11, r6, r11\n\t"
  52632. "adds r10, r10, r11\n\t"
  52633. "adc r5, r5, #0\n\t"
  52634. "lsr r11, r7, #16\n\t"
  52635. "mul r6, r11, r6\n\t"
  52636. "lsr r11, r6, #16\n\t"
  52637. "lsl r6, r6, #16\n\t"
  52638. "adds r10, r10, r6\n\t"
  52639. "adc r5, r5, r11\n\t"
  52640. "adds r10, r10, r4\n\t"
  52641. "str r10, [%[a], #224]\n\t"
  52642. "adc r5, r5, #0\n\t"
  52643. /* a[i+57] += m[57] * mu */
  52644. "ldr r7, [%[m], #228]\n\t"
  52645. "ldr r10, [%[a], #228]\n\t"
  52646. "lsr r11, r7, #16\n\t"
  52647. "lsr r6, r8, #16\n\t"
  52648. "mul r4, r6, r11\n\t"
  52649. "lsl r11, r7, #16\n\t"
  52650. "lsr r11, r11, #16\n\t"
  52651. "mul r6, r11, r6\n\t"
  52652. "lsr r11, r6, #16\n\t"
  52653. "lsl r6, r6, #16\n\t"
  52654. "adds r10, r10, r6\n\t"
  52655. "adc r4, r4, r11\n\t"
  52656. "lsl r6, r8, #16\n\t"
  52657. "lsl r11, r7, #16\n\t"
  52658. "lsr r6, r6, #16\n\t"
  52659. "lsr r11, r11, #16\n\t"
  52660. "mul r11, r6, r11\n\t"
  52661. "adds r10, r10, r11\n\t"
  52662. "adc r4, r4, #0\n\t"
  52663. "lsr r11, r7, #16\n\t"
  52664. "mul r6, r11, r6\n\t"
  52665. "lsr r11, r6, #16\n\t"
  52666. "lsl r6, r6, #16\n\t"
  52667. "adds r10, r10, r6\n\t"
  52668. "adc r4, r4, r11\n\t"
  52669. "adds r10, r10, r5\n\t"
  52670. "str r10, [%[a], #228]\n\t"
  52671. "adc r4, r4, #0\n\t"
  52672. /* a[i+58] += m[58] * mu */
  52673. "ldr r7, [%[m], #232]\n\t"
  52674. "ldr r10, [%[a], #232]\n\t"
  52675. "lsr r11, r7, #16\n\t"
  52676. "lsr r6, r8, #16\n\t"
  52677. "mul r5, r6, r11\n\t"
  52678. "lsl r11, r7, #16\n\t"
  52679. "lsr r11, r11, #16\n\t"
  52680. "mul r6, r11, r6\n\t"
  52681. "lsr r11, r6, #16\n\t"
  52682. "lsl r6, r6, #16\n\t"
  52683. "adds r10, r10, r6\n\t"
  52684. "adc r5, r5, r11\n\t"
  52685. "lsl r6, r8, #16\n\t"
  52686. "lsl r11, r7, #16\n\t"
  52687. "lsr r6, r6, #16\n\t"
  52688. "lsr r11, r11, #16\n\t"
  52689. "mul r11, r6, r11\n\t"
  52690. "adds r10, r10, r11\n\t"
  52691. "adc r5, r5, #0\n\t"
  52692. "lsr r11, r7, #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. "adds r10, r10, r4\n\t"
  52699. "str r10, [%[a], #232]\n\t"
  52700. "adc r5, r5, #0\n\t"
  52701. /* a[i+59] += m[59] * mu */
  52702. "ldr r7, [%[m], #236]\n\t"
  52703. "ldr r10, [%[a], #236]\n\t"
  52704. "lsr r11, r7, #16\n\t"
  52705. "lsr r6, r8, #16\n\t"
  52706. "mul r4, r6, r11\n\t"
  52707. "lsl r11, r7, #16\n\t"
  52708. "lsr r11, r11, #16\n\t"
  52709. "mul r6, r11, r6\n\t"
  52710. "lsr r11, r6, #16\n\t"
  52711. "lsl r6, r6, #16\n\t"
  52712. "adds r10, r10, r6\n\t"
  52713. "adc r4, r4, r11\n\t"
  52714. "lsl r6, r8, #16\n\t"
  52715. "lsl r11, r7, #16\n\t"
  52716. "lsr r6, r6, #16\n\t"
  52717. "lsr r11, r11, #16\n\t"
  52718. "mul r11, r6, r11\n\t"
  52719. "adds r10, r10, r11\n\t"
  52720. "adc r4, r4, #0\n\t"
  52721. "lsr r11, r7, #16\n\t"
  52722. "mul r6, r11, r6\n\t"
  52723. "lsr r11, r6, #16\n\t"
  52724. "lsl r6, r6, #16\n\t"
  52725. "adds r10, r10, r6\n\t"
  52726. "adc r4, r4, r11\n\t"
  52727. "adds r10, r10, r5\n\t"
  52728. "str r10, [%[a], #236]\n\t"
  52729. "adc r4, r4, #0\n\t"
  52730. /* a[i+60] += m[60] * mu */
  52731. "ldr r7, [%[m], #240]\n\t"
  52732. "ldr r10, [%[a], #240]\n\t"
  52733. "lsr r11, r7, #16\n\t"
  52734. "lsr r6, r8, #16\n\t"
  52735. "mul r5, r6, r11\n\t"
  52736. "lsl r11, r7, #16\n\t"
  52737. "lsr r11, r11, #16\n\t"
  52738. "mul r6, r11, r6\n\t"
  52739. "lsr r11, r6, #16\n\t"
  52740. "lsl r6, r6, #16\n\t"
  52741. "adds r10, r10, r6\n\t"
  52742. "adc r5, r5, r11\n\t"
  52743. "lsl r6, r8, #16\n\t"
  52744. "lsl r11, r7, #16\n\t"
  52745. "lsr r6, r6, #16\n\t"
  52746. "lsr r11, r11, #16\n\t"
  52747. "mul r11, r6, r11\n\t"
  52748. "adds r10, r10, r11\n\t"
  52749. "adc r5, r5, #0\n\t"
  52750. "lsr r11, r7, #16\n\t"
  52751. "mul r6, r11, r6\n\t"
  52752. "lsr r11, r6, #16\n\t"
  52753. "lsl r6, r6, #16\n\t"
  52754. "adds r10, r10, r6\n\t"
  52755. "adc r5, r5, r11\n\t"
  52756. "adds r10, r10, r4\n\t"
  52757. "str r10, [%[a], #240]\n\t"
  52758. "adc r5, r5, #0\n\t"
  52759. /* a[i+61] += m[61] * mu */
  52760. "ldr r7, [%[m], #244]\n\t"
  52761. "ldr r10, [%[a], #244]\n\t"
  52762. "lsr r11, r7, #16\n\t"
  52763. "lsr r6, r8, #16\n\t"
  52764. "mul r4, r6, r11\n\t"
  52765. "lsl r11, r7, #16\n\t"
  52766. "lsr r11, r11, #16\n\t"
  52767. "mul r6, r11, r6\n\t"
  52768. "lsr r11, r6, #16\n\t"
  52769. "lsl r6, r6, #16\n\t"
  52770. "adds r10, r10, r6\n\t"
  52771. "adc r4, r4, r11\n\t"
  52772. "lsl r6, r8, #16\n\t"
  52773. "lsl r11, r7, #16\n\t"
  52774. "lsr r6, r6, #16\n\t"
  52775. "lsr r11, r11, #16\n\t"
  52776. "mul r11, r6, r11\n\t"
  52777. "adds r10, r10, r11\n\t"
  52778. "adc r4, r4, #0\n\t"
  52779. "lsr r11, r7, #16\n\t"
  52780. "mul r6, r11, r6\n\t"
  52781. "lsr r11, r6, #16\n\t"
  52782. "lsl r6, r6, #16\n\t"
  52783. "adds r10, r10, r6\n\t"
  52784. "adc r4, r4, r11\n\t"
  52785. "adds r10, r10, r5\n\t"
  52786. "str r10, [%[a], #244]\n\t"
  52787. "adc r4, r4, #0\n\t"
  52788. /* a[i+62] += m[62] * mu */
  52789. "ldr r7, [%[m], #248]\n\t"
  52790. "ldr r10, [%[a], #248]\n\t"
  52791. "lsr r11, r7, #16\n\t"
  52792. "lsr r6, r8, #16\n\t"
  52793. "mul r5, r6, r11\n\t"
  52794. "lsl r11, r7, #16\n\t"
  52795. "lsr r11, r11, #16\n\t"
  52796. "mul r6, r11, r6\n\t"
  52797. "lsr r11, r6, #16\n\t"
  52798. "lsl r6, r6, #16\n\t"
  52799. "adds r10, r10, r6\n\t"
  52800. "adc r5, r5, r11\n\t"
  52801. "lsl r6, r8, #16\n\t"
  52802. "lsl r11, r7, #16\n\t"
  52803. "lsr r6, r6, #16\n\t"
  52804. "lsr r11, r11, #16\n\t"
  52805. "mul r11, r6, r11\n\t"
  52806. "adds r10, r10, r11\n\t"
  52807. "adc r5, r5, #0\n\t"
  52808. "lsr r11, r7, #16\n\t"
  52809. "mul r6, r11, r6\n\t"
  52810. "lsr r11, r6, #16\n\t"
  52811. "lsl r6, r6, #16\n\t"
  52812. "adds r10, r10, r6\n\t"
  52813. "adc r5, r5, r11\n\t"
  52814. "adds r10, r10, r4\n\t"
  52815. "str r10, [%[a], #248]\n\t"
  52816. "adc r5, r5, #0\n\t"
  52817. /* a[i+63] += m[63] * mu */
  52818. "ldr r7, [%[m], #252]\n\t"
  52819. "ldr r10, [%[a], #252]\n\t"
  52820. "lsr r11, r7, #16\n\t"
  52821. "lsr r6, r8, #16\n\t"
  52822. "mul r4, r6, r11\n\t"
  52823. "lsl r11, r7, #16\n\t"
  52824. "lsr r11, r11, #16\n\t"
  52825. "mul r6, r11, r6\n\t"
  52826. "lsr r11, r6, #16\n\t"
  52827. "lsl r6, r6, #16\n\t"
  52828. "adds r10, r10, r6\n\t"
  52829. "adc r4, r4, r11\n\t"
  52830. "lsl r6, r8, #16\n\t"
  52831. "lsl r11, r7, #16\n\t"
  52832. "lsr r6, r6, #16\n\t"
  52833. "lsr r11, r11, #16\n\t"
  52834. "mul r11, r6, r11\n\t"
  52835. "adds r10, r10, r11\n\t"
  52836. "adc r4, r4, #0\n\t"
  52837. "lsr r11, r7, #16\n\t"
  52838. "mul r6, r11, r6\n\t"
  52839. "lsr r11, r6, #16\n\t"
  52840. "lsl r6, r6, #16\n\t"
  52841. "adds r10, r10, r6\n\t"
  52842. "adc r4, r4, r11\n\t"
  52843. "adds r10, r10, r5\n\t"
  52844. "str r10, [%[a], #252]\n\t"
  52845. "adc r4, r4, #0\n\t"
  52846. /* a[i+64] += m[64] * mu */
  52847. "ldr r7, [%[m], #256]\n\t"
  52848. "ldr r10, [%[a], #256]\n\t"
  52849. "lsr r11, r7, #16\n\t"
  52850. "lsr r6, r8, #16\n\t"
  52851. "mul r5, r6, r11\n\t"
  52852. "lsl r11, r7, #16\n\t"
  52853. "lsr r11, r11, #16\n\t"
  52854. "mul r6, r11, r6\n\t"
  52855. "lsr r11, r6, #16\n\t"
  52856. "lsl r6, r6, #16\n\t"
  52857. "adds r10, r10, r6\n\t"
  52858. "adc r5, r5, r11\n\t"
  52859. "lsl r6, r8, #16\n\t"
  52860. "lsl r11, r7, #16\n\t"
  52861. "lsr r6, r6, #16\n\t"
  52862. "lsr r11, r11, #16\n\t"
  52863. "mul r11, r6, r11\n\t"
  52864. "adds r10, r10, r11\n\t"
  52865. "adc r5, r5, #0\n\t"
  52866. "lsr r11, r7, #16\n\t"
  52867. "mul r6, r11, r6\n\t"
  52868. "lsr r11, r6, #16\n\t"
  52869. "lsl r6, r6, #16\n\t"
  52870. "adds r10, r10, r6\n\t"
  52871. "adc r5, r5, r11\n\t"
  52872. "adds r10, r10, r4\n\t"
  52873. "str r10, [%[a], #256]\n\t"
  52874. "adc r5, r5, #0\n\t"
  52875. /* a[i+65] += m[65] * mu */
  52876. "ldr r7, [%[m], #260]\n\t"
  52877. "ldr r10, [%[a], #260]\n\t"
  52878. "lsr r11, r7, #16\n\t"
  52879. "lsr r6, r8, #16\n\t"
  52880. "mul r4, r6, r11\n\t"
  52881. "lsl r11, r7, #16\n\t"
  52882. "lsr r11, r11, #16\n\t"
  52883. "mul r6, r11, r6\n\t"
  52884. "lsr r11, r6, #16\n\t"
  52885. "lsl r6, r6, #16\n\t"
  52886. "adds r10, r10, r6\n\t"
  52887. "adc r4, r4, r11\n\t"
  52888. "lsl r6, r8, #16\n\t"
  52889. "lsl r11, r7, #16\n\t"
  52890. "lsr r6, r6, #16\n\t"
  52891. "lsr r11, r11, #16\n\t"
  52892. "mul r11, r6, r11\n\t"
  52893. "adds r10, r10, r11\n\t"
  52894. "adc r4, r4, #0\n\t"
  52895. "lsr r11, r7, #16\n\t"
  52896. "mul r6, r11, r6\n\t"
  52897. "lsr r11, r6, #16\n\t"
  52898. "lsl r6, r6, #16\n\t"
  52899. "adds r10, r10, r6\n\t"
  52900. "adc r4, r4, r11\n\t"
  52901. "adds r10, r10, r5\n\t"
  52902. "str r10, [%[a], #260]\n\t"
  52903. "adc r4, r4, #0\n\t"
  52904. /* a[i+66] += m[66] * mu */
  52905. "ldr r7, [%[m], #264]\n\t"
  52906. "ldr r10, [%[a], #264]\n\t"
  52907. "lsr r11, r7, #16\n\t"
  52908. "lsr r6, r8, #16\n\t"
  52909. "mul r5, r6, r11\n\t"
  52910. "lsl r11, r7, #16\n\t"
  52911. "lsr r11, r11, #16\n\t"
  52912. "mul r6, r11, r6\n\t"
  52913. "lsr r11, r6, #16\n\t"
  52914. "lsl r6, r6, #16\n\t"
  52915. "adds r10, r10, r6\n\t"
  52916. "adc r5, r5, r11\n\t"
  52917. "lsl r6, r8, #16\n\t"
  52918. "lsl r11, r7, #16\n\t"
  52919. "lsr r6, r6, #16\n\t"
  52920. "lsr r11, r11, #16\n\t"
  52921. "mul r11, r6, r11\n\t"
  52922. "adds r10, r10, r11\n\t"
  52923. "adc r5, r5, #0\n\t"
  52924. "lsr r11, r7, #16\n\t"
  52925. "mul r6, r11, r6\n\t"
  52926. "lsr r11, r6, #16\n\t"
  52927. "lsl r6, r6, #16\n\t"
  52928. "adds r10, r10, r6\n\t"
  52929. "adc r5, r5, r11\n\t"
  52930. "adds r10, r10, r4\n\t"
  52931. "str r10, [%[a], #264]\n\t"
  52932. "adc r5, r5, #0\n\t"
  52933. /* a[i+67] += m[67] * mu */
  52934. "ldr r7, [%[m], #268]\n\t"
  52935. "ldr r10, [%[a], #268]\n\t"
  52936. "lsr r11, r7, #16\n\t"
  52937. "lsr r6, r8, #16\n\t"
  52938. "mul r4, r6, r11\n\t"
  52939. "lsl r11, r7, #16\n\t"
  52940. "lsr r11, r11, #16\n\t"
  52941. "mul r6, r11, r6\n\t"
  52942. "lsr r11, r6, #16\n\t"
  52943. "lsl r6, r6, #16\n\t"
  52944. "adds r10, r10, r6\n\t"
  52945. "adc r4, r4, r11\n\t"
  52946. "lsl r6, r8, #16\n\t"
  52947. "lsl r11, r7, #16\n\t"
  52948. "lsr r6, r6, #16\n\t"
  52949. "lsr r11, r11, #16\n\t"
  52950. "mul r11, r6, r11\n\t"
  52951. "adds r10, r10, r11\n\t"
  52952. "adc r4, r4, #0\n\t"
  52953. "lsr r11, r7, #16\n\t"
  52954. "mul r6, r11, r6\n\t"
  52955. "lsr r11, r6, #16\n\t"
  52956. "lsl r6, r6, #16\n\t"
  52957. "adds r10, r10, r6\n\t"
  52958. "adc r4, r4, r11\n\t"
  52959. "adds r10, r10, r5\n\t"
  52960. "str r10, [%[a], #268]\n\t"
  52961. "adc r4, r4, #0\n\t"
  52962. /* a[i+68] += m[68] * mu */
  52963. "ldr r7, [%[m], #272]\n\t"
  52964. "ldr r10, [%[a], #272]\n\t"
  52965. "lsr r11, r7, #16\n\t"
  52966. "lsr r6, r8, #16\n\t"
  52967. "mul r5, r6, r11\n\t"
  52968. "lsl r11, r7, #16\n\t"
  52969. "lsr r11, r11, #16\n\t"
  52970. "mul r6, r11, r6\n\t"
  52971. "lsr r11, r6, #16\n\t"
  52972. "lsl r6, r6, #16\n\t"
  52973. "adds r10, r10, r6\n\t"
  52974. "adc r5, r5, r11\n\t"
  52975. "lsl r6, r8, #16\n\t"
  52976. "lsl r11, r7, #16\n\t"
  52977. "lsr r6, r6, #16\n\t"
  52978. "lsr r11, r11, #16\n\t"
  52979. "mul r11, r6, r11\n\t"
  52980. "adds r10, r10, r11\n\t"
  52981. "adc r5, r5, #0\n\t"
  52982. "lsr r11, r7, #16\n\t"
  52983. "mul r6, r11, r6\n\t"
  52984. "lsr r11, r6, #16\n\t"
  52985. "lsl r6, r6, #16\n\t"
  52986. "adds r10, r10, r6\n\t"
  52987. "adc r5, r5, r11\n\t"
  52988. "adds r10, r10, r4\n\t"
  52989. "str r10, [%[a], #272]\n\t"
  52990. "adc r5, r5, #0\n\t"
  52991. /* a[i+69] += m[69] * mu */
  52992. "ldr r7, [%[m], #276]\n\t"
  52993. "ldr r10, [%[a], #276]\n\t"
  52994. "lsr r11, r7, #16\n\t"
  52995. "lsr r6, r8, #16\n\t"
  52996. "mul r4, r6, r11\n\t"
  52997. "lsl r11, r7, #16\n\t"
  52998. "lsr r11, r11, #16\n\t"
  52999. "mul r6, r11, r6\n\t"
  53000. "lsr r11, r6, #16\n\t"
  53001. "lsl r6, r6, #16\n\t"
  53002. "adds r10, r10, r6\n\t"
  53003. "adc r4, r4, r11\n\t"
  53004. "lsl r6, r8, #16\n\t"
  53005. "lsl r11, r7, #16\n\t"
  53006. "lsr r6, r6, #16\n\t"
  53007. "lsr r11, r11, #16\n\t"
  53008. "mul r11, r6, r11\n\t"
  53009. "adds r10, r10, r11\n\t"
  53010. "adc r4, r4, #0\n\t"
  53011. "lsr r11, r7, #16\n\t"
  53012. "mul r6, r11, r6\n\t"
  53013. "lsr r11, r6, #16\n\t"
  53014. "lsl r6, r6, #16\n\t"
  53015. "adds r10, r10, r6\n\t"
  53016. "adc r4, r4, r11\n\t"
  53017. "adds r10, r10, r5\n\t"
  53018. "str r10, [%[a], #276]\n\t"
  53019. "adc r4, r4, #0\n\t"
  53020. /* a[i+70] += m[70] * mu */
  53021. "ldr r7, [%[m], #280]\n\t"
  53022. "ldr r10, [%[a], #280]\n\t"
  53023. "lsr r11, r7, #16\n\t"
  53024. "lsr r6, r8, #16\n\t"
  53025. "mul r5, r6, r11\n\t"
  53026. "lsl r11, r7, #16\n\t"
  53027. "lsr r11, r11, #16\n\t"
  53028. "mul r6, r11, r6\n\t"
  53029. "lsr r11, r6, #16\n\t"
  53030. "lsl r6, r6, #16\n\t"
  53031. "adds r10, r10, r6\n\t"
  53032. "adc r5, r5, r11\n\t"
  53033. "lsl r6, r8, #16\n\t"
  53034. "lsl r11, r7, #16\n\t"
  53035. "lsr r6, r6, #16\n\t"
  53036. "lsr r11, r11, #16\n\t"
  53037. "mul r11, r6, r11\n\t"
  53038. "adds r10, r10, r11\n\t"
  53039. "adc r5, r5, #0\n\t"
  53040. "lsr r11, r7, #16\n\t"
  53041. "mul r6, r11, r6\n\t"
  53042. "lsr r11, r6, #16\n\t"
  53043. "lsl r6, r6, #16\n\t"
  53044. "adds r10, r10, r6\n\t"
  53045. "adc r5, r5, r11\n\t"
  53046. "adds r10, r10, r4\n\t"
  53047. "str r10, [%[a], #280]\n\t"
  53048. "adc r5, r5, #0\n\t"
  53049. /* a[i+71] += m[71] * mu */
  53050. "ldr r7, [%[m], #284]\n\t"
  53051. "ldr r10, [%[a], #284]\n\t"
  53052. "lsr r11, r7, #16\n\t"
  53053. "lsr r6, r8, #16\n\t"
  53054. "mul r4, r6, r11\n\t"
  53055. "lsl r11, r7, #16\n\t"
  53056. "lsr r11, r11, #16\n\t"
  53057. "mul r6, r11, r6\n\t"
  53058. "lsr r11, r6, #16\n\t"
  53059. "lsl r6, r6, #16\n\t"
  53060. "adds r10, r10, r6\n\t"
  53061. "adc r4, r4, r11\n\t"
  53062. "lsl r6, r8, #16\n\t"
  53063. "lsl r11, r7, #16\n\t"
  53064. "lsr r6, r6, #16\n\t"
  53065. "lsr r11, r11, #16\n\t"
  53066. "mul r11, r6, r11\n\t"
  53067. "adds r10, r10, r11\n\t"
  53068. "adc r4, r4, #0\n\t"
  53069. "lsr r11, r7, #16\n\t"
  53070. "mul r6, r11, r6\n\t"
  53071. "lsr r11, r6, #16\n\t"
  53072. "lsl r6, r6, #16\n\t"
  53073. "adds r10, r10, r6\n\t"
  53074. "adc r4, r4, r11\n\t"
  53075. "adds r10, r10, r5\n\t"
  53076. "str r10, [%[a], #284]\n\t"
  53077. "adc r4, r4, #0\n\t"
  53078. /* a[i+72] += m[72] * mu */
  53079. "ldr r7, [%[m], #288]\n\t"
  53080. "ldr r10, [%[a], #288]\n\t"
  53081. "lsr r11, r7, #16\n\t"
  53082. "lsr r6, r8, #16\n\t"
  53083. "mul r5, r6, r11\n\t"
  53084. "lsl r11, r7, #16\n\t"
  53085. "lsr r11, r11, #16\n\t"
  53086. "mul r6, r11, r6\n\t"
  53087. "lsr r11, r6, #16\n\t"
  53088. "lsl r6, r6, #16\n\t"
  53089. "adds r10, r10, r6\n\t"
  53090. "adc r5, r5, r11\n\t"
  53091. "lsl r6, r8, #16\n\t"
  53092. "lsl r11, r7, #16\n\t"
  53093. "lsr r6, r6, #16\n\t"
  53094. "lsr r11, r11, #16\n\t"
  53095. "mul r11, r6, r11\n\t"
  53096. "adds r10, r10, r11\n\t"
  53097. "adc r5, r5, #0\n\t"
  53098. "lsr r11, r7, #16\n\t"
  53099. "mul r6, r11, r6\n\t"
  53100. "lsr r11, r6, #16\n\t"
  53101. "lsl r6, r6, #16\n\t"
  53102. "adds r10, r10, r6\n\t"
  53103. "adc r5, r5, r11\n\t"
  53104. "adds r10, r10, r4\n\t"
  53105. "str r10, [%[a], #288]\n\t"
  53106. "adc r5, r5, #0\n\t"
  53107. /* a[i+73] += m[73] * mu */
  53108. "ldr r7, [%[m], #292]\n\t"
  53109. "ldr r10, [%[a], #292]\n\t"
  53110. "lsr r11, r7, #16\n\t"
  53111. "lsr r6, r8, #16\n\t"
  53112. "mul r4, r6, r11\n\t"
  53113. "lsl r11, r7, #16\n\t"
  53114. "lsr r11, r11, #16\n\t"
  53115. "mul r6, r11, r6\n\t"
  53116. "lsr r11, r6, #16\n\t"
  53117. "lsl r6, r6, #16\n\t"
  53118. "adds r10, r10, r6\n\t"
  53119. "adc r4, r4, r11\n\t"
  53120. "lsl r6, r8, #16\n\t"
  53121. "lsl r11, r7, #16\n\t"
  53122. "lsr r6, r6, #16\n\t"
  53123. "lsr r11, r11, #16\n\t"
  53124. "mul r11, r6, r11\n\t"
  53125. "adds r10, r10, r11\n\t"
  53126. "adc r4, r4, #0\n\t"
  53127. "lsr r11, r7, #16\n\t"
  53128. "mul r6, r11, r6\n\t"
  53129. "lsr r11, r6, #16\n\t"
  53130. "lsl r6, r6, #16\n\t"
  53131. "adds r10, r10, r6\n\t"
  53132. "adc r4, r4, r11\n\t"
  53133. "adds r10, r10, r5\n\t"
  53134. "str r10, [%[a], #292]\n\t"
  53135. "adc r4, r4, #0\n\t"
  53136. /* a[i+74] += m[74] * mu */
  53137. "ldr r7, [%[m], #296]\n\t"
  53138. "ldr r10, [%[a], #296]\n\t"
  53139. "lsr r11, r7, #16\n\t"
  53140. "lsr r6, r8, #16\n\t"
  53141. "mul r5, r6, r11\n\t"
  53142. "lsl r11, r7, #16\n\t"
  53143. "lsr r11, r11, #16\n\t"
  53144. "mul r6, r11, r6\n\t"
  53145. "lsr r11, r6, #16\n\t"
  53146. "lsl r6, r6, #16\n\t"
  53147. "adds r10, r10, r6\n\t"
  53148. "adc r5, r5, r11\n\t"
  53149. "lsl r6, r8, #16\n\t"
  53150. "lsl r11, r7, #16\n\t"
  53151. "lsr r6, r6, #16\n\t"
  53152. "lsr r11, r11, #16\n\t"
  53153. "mul r11, r6, r11\n\t"
  53154. "adds r10, r10, r11\n\t"
  53155. "adc r5, r5, #0\n\t"
  53156. "lsr r11, r7, #16\n\t"
  53157. "mul r6, r11, r6\n\t"
  53158. "lsr r11, r6, #16\n\t"
  53159. "lsl r6, r6, #16\n\t"
  53160. "adds r10, r10, r6\n\t"
  53161. "adc r5, r5, r11\n\t"
  53162. "adds r10, r10, r4\n\t"
  53163. "str r10, [%[a], #296]\n\t"
  53164. "adc r5, r5, #0\n\t"
  53165. /* a[i+75] += m[75] * mu */
  53166. "ldr r7, [%[m], #300]\n\t"
  53167. "ldr r10, [%[a], #300]\n\t"
  53168. "lsr r11, r7, #16\n\t"
  53169. "lsr r6, r8, #16\n\t"
  53170. "mul r4, r6, r11\n\t"
  53171. "lsl r11, r7, #16\n\t"
  53172. "lsr r11, r11, #16\n\t"
  53173. "mul r6, r11, r6\n\t"
  53174. "lsr r11, r6, #16\n\t"
  53175. "lsl r6, r6, #16\n\t"
  53176. "adds r10, r10, r6\n\t"
  53177. "adc r4, r4, r11\n\t"
  53178. "lsl r6, r8, #16\n\t"
  53179. "lsl r11, r7, #16\n\t"
  53180. "lsr r6, r6, #16\n\t"
  53181. "lsr r11, r11, #16\n\t"
  53182. "mul r11, r6, r11\n\t"
  53183. "adds r10, r10, r11\n\t"
  53184. "adc r4, r4, #0\n\t"
  53185. "lsr r11, r7, #16\n\t"
  53186. "mul r6, r11, r6\n\t"
  53187. "lsr r11, r6, #16\n\t"
  53188. "lsl r6, r6, #16\n\t"
  53189. "adds r10, r10, r6\n\t"
  53190. "adc r4, r4, r11\n\t"
  53191. "adds r10, r10, r5\n\t"
  53192. "str r10, [%[a], #300]\n\t"
  53193. "adc r4, r4, #0\n\t"
  53194. /* a[i+76] += m[76] * mu */
  53195. "ldr r7, [%[m], #304]\n\t"
  53196. "ldr r10, [%[a], #304]\n\t"
  53197. "lsr r11, r7, #16\n\t"
  53198. "lsr r6, r8, #16\n\t"
  53199. "mul r5, r6, r11\n\t"
  53200. "lsl r11, r7, #16\n\t"
  53201. "lsr r11, r11, #16\n\t"
  53202. "mul r6, r11, r6\n\t"
  53203. "lsr r11, r6, #16\n\t"
  53204. "lsl r6, r6, #16\n\t"
  53205. "adds r10, r10, r6\n\t"
  53206. "adc r5, r5, r11\n\t"
  53207. "lsl r6, r8, #16\n\t"
  53208. "lsl r11, r7, #16\n\t"
  53209. "lsr r6, r6, #16\n\t"
  53210. "lsr r11, r11, #16\n\t"
  53211. "mul r11, r6, r11\n\t"
  53212. "adds r10, r10, r11\n\t"
  53213. "adc r5, r5, #0\n\t"
  53214. "lsr r11, r7, #16\n\t"
  53215. "mul r6, r11, r6\n\t"
  53216. "lsr r11, r6, #16\n\t"
  53217. "lsl r6, r6, #16\n\t"
  53218. "adds r10, r10, r6\n\t"
  53219. "adc r5, r5, r11\n\t"
  53220. "adds r10, r10, r4\n\t"
  53221. "str r10, [%[a], #304]\n\t"
  53222. "adc r5, r5, #0\n\t"
  53223. /* a[i+77] += m[77] * mu */
  53224. "ldr r7, [%[m], #308]\n\t"
  53225. "ldr r10, [%[a], #308]\n\t"
  53226. "lsr r11, r7, #16\n\t"
  53227. "lsr r6, r8, #16\n\t"
  53228. "mul r4, r6, r11\n\t"
  53229. "lsl r11, r7, #16\n\t"
  53230. "lsr r11, r11, #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. "lsl r6, r8, #16\n\t"
  53237. "lsl r11, r7, #16\n\t"
  53238. "lsr r6, r6, #16\n\t"
  53239. "lsr r11, r11, #16\n\t"
  53240. "mul r11, r6, r11\n\t"
  53241. "adds r10, r10, r11\n\t"
  53242. "adc r4, r4, #0\n\t"
  53243. "lsr r11, r7, #16\n\t"
  53244. "mul r6, r11, r6\n\t"
  53245. "lsr r11, r6, #16\n\t"
  53246. "lsl r6, r6, #16\n\t"
  53247. "adds r10, r10, r6\n\t"
  53248. "adc r4, r4, r11\n\t"
  53249. "adds r10, r10, r5\n\t"
  53250. "str r10, [%[a], #308]\n\t"
  53251. "adc r4, r4, #0\n\t"
  53252. /* a[i+78] += m[78] * mu */
  53253. "ldr r7, [%[m], #312]\n\t"
  53254. "ldr r10, [%[a], #312]\n\t"
  53255. "lsr r11, r7, #16\n\t"
  53256. "lsr r6, r8, #16\n\t"
  53257. "mul r5, r6, r11\n\t"
  53258. "lsl r11, r7, #16\n\t"
  53259. "lsr r11, r11, #16\n\t"
  53260. "mul r6, r11, r6\n\t"
  53261. "lsr r11, r6, #16\n\t"
  53262. "lsl r6, r6, #16\n\t"
  53263. "adds r10, r10, r6\n\t"
  53264. "adc r5, r5, r11\n\t"
  53265. "lsl r6, r8, #16\n\t"
  53266. "lsl r11, r7, #16\n\t"
  53267. "lsr r6, r6, #16\n\t"
  53268. "lsr r11, r11, #16\n\t"
  53269. "mul r11, r6, r11\n\t"
  53270. "adds r10, r10, r11\n\t"
  53271. "adc r5, r5, #0\n\t"
  53272. "lsr r11, r7, #16\n\t"
  53273. "mul r6, r11, r6\n\t"
  53274. "lsr r11, r6, #16\n\t"
  53275. "lsl r6, r6, #16\n\t"
  53276. "adds r10, r10, r6\n\t"
  53277. "adc r5, r5, r11\n\t"
  53278. "adds r10, r10, r4\n\t"
  53279. "str r10, [%[a], #312]\n\t"
  53280. "adc r5, r5, #0\n\t"
  53281. /* a[i+79] += m[79] * mu */
  53282. "ldr r7, [%[m], #316]\n\t"
  53283. "ldr r10, [%[a], #316]\n\t"
  53284. "lsr r11, r7, #16\n\t"
  53285. "lsr r6, r8, #16\n\t"
  53286. "mul r4, r6, r11\n\t"
  53287. "lsl r11, r7, #16\n\t"
  53288. "lsr r11, r11, #16\n\t"
  53289. "mul r6, r11, r6\n\t"
  53290. "lsr r11, r6, #16\n\t"
  53291. "lsl r6, r6, #16\n\t"
  53292. "adds r10, r10, r6\n\t"
  53293. "adc r4, r4, r11\n\t"
  53294. "lsl r6, r8, #16\n\t"
  53295. "lsl r11, r7, #16\n\t"
  53296. "lsr r6, r6, #16\n\t"
  53297. "lsr r11, r11, #16\n\t"
  53298. "mul r11, r6, r11\n\t"
  53299. "adds r10, r10, r11\n\t"
  53300. "adc r4, r4, #0\n\t"
  53301. "lsr r11, r7, #16\n\t"
  53302. "mul r6, r11, r6\n\t"
  53303. "lsr r11, r6, #16\n\t"
  53304. "lsl r6, r6, #16\n\t"
  53305. "adds r10, r10, r6\n\t"
  53306. "adc r4, r4, r11\n\t"
  53307. "adds r10, r10, r5\n\t"
  53308. "str r10, [%[a], #316]\n\t"
  53309. "adc r4, r4, #0\n\t"
  53310. /* a[i+80] += m[80] * mu */
  53311. "ldr r7, [%[m], #320]\n\t"
  53312. "ldr r10, [%[a], #320]\n\t"
  53313. "lsr r11, r7, #16\n\t"
  53314. "lsr r6, r8, #16\n\t"
  53315. "mul r5, r6, r11\n\t"
  53316. "lsl r11, r7, #16\n\t"
  53317. "lsr r11, r11, #16\n\t"
  53318. "mul r6, r11, r6\n\t"
  53319. "lsr r11, r6, #16\n\t"
  53320. "lsl r6, r6, #16\n\t"
  53321. "adds r10, r10, r6\n\t"
  53322. "adc r5, r5, r11\n\t"
  53323. "lsl r6, r8, #16\n\t"
  53324. "lsl r11, r7, #16\n\t"
  53325. "lsr r6, r6, #16\n\t"
  53326. "lsr r11, r11, #16\n\t"
  53327. "mul r11, r6, r11\n\t"
  53328. "adds r10, r10, r11\n\t"
  53329. "adc r5, r5, #0\n\t"
  53330. "lsr r11, r7, #16\n\t"
  53331. "mul r6, r11, r6\n\t"
  53332. "lsr r11, r6, #16\n\t"
  53333. "lsl r6, r6, #16\n\t"
  53334. "adds r10, r10, r6\n\t"
  53335. "adc r5, r5, r11\n\t"
  53336. "adds r10, r10, r4\n\t"
  53337. "str r10, [%[a], #320]\n\t"
  53338. "adc r5, r5, #0\n\t"
  53339. /* a[i+81] += m[81] * mu */
  53340. "ldr r7, [%[m], #324]\n\t"
  53341. "ldr r10, [%[a], #324]\n\t"
  53342. "lsr r11, r7, #16\n\t"
  53343. "lsr r6, r8, #16\n\t"
  53344. "mul r4, r6, r11\n\t"
  53345. "lsl r11, r7, #16\n\t"
  53346. "lsr r11, r11, #16\n\t"
  53347. "mul r6, r11, r6\n\t"
  53348. "lsr r11, r6, #16\n\t"
  53349. "lsl r6, r6, #16\n\t"
  53350. "adds r10, r10, r6\n\t"
  53351. "adc r4, r4, r11\n\t"
  53352. "lsl r6, r8, #16\n\t"
  53353. "lsl r11, r7, #16\n\t"
  53354. "lsr r6, r6, #16\n\t"
  53355. "lsr r11, r11, #16\n\t"
  53356. "mul r11, r6, r11\n\t"
  53357. "adds r10, r10, r11\n\t"
  53358. "adc r4, r4, #0\n\t"
  53359. "lsr r11, r7, #16\n\t"
  53360. "mul r6, r11, r6\n\t"
  53361. "lsr r11, r6, #16\n\t"
  53362. "lsl r6, r6, #16\n\t"
  53363. "adds r10, r10, r6\n\t"
  53364. "adc r4, r4, r11\n\t"
  53365. "adds r10, r10, r5\n\t"
  53366. "str r10, [%[a], #324]\n\t"
  53367. "adc r4, r4, #0\n\t"
  53368. /* a[i+82] += m[82] * mu */
  53369. "ldr r7, [%[m], #328]\n\t"
  53370. "ldr r10, [%[a], #328]\n\t"
  53371. "lsr r11, r7, #16\n\t"
  53372. "lsr r6, r8, #16\n\t"
  53373. "mul r5, r6, r11\n\t"
  53374. "lsl r11, r7, #16\n\t"
  53375. "lsr r11, r11, #16\n\t"
  53376. "mul r6, r11, r6\n\t"
  53377. "lsr r11, r6, #16\n\t"
  53378. "lsl r6, r6, #16\n\t"
  53379. "adds r10, r10, r6\n\t"
  53380. "adc r5, r5, r11\n\t"
  53381. "lsl r6, r8, #16\n\t"
  53382. "lsl r11, r7, #16\n\t"
  53383. "lsr r6, r6, #16\n\t"
  53384. "lsr r11, r11, #16\n\t"
  53385. "mul r11, r6, r11\n\t"
  53386. "adds r10, r10, r11\n\t"
  53387. "adc r5, r5, #0\n\t"
  53388. "lsr r11, r7, #16\n\t"
  53389. "mul r6, r11, r6\n\t"
  53390. "lsr r11, r6, #16\n\t"
  53391. "lsl r6, r6, #16\n\t"
  53392. "adds r10, r10, r6\n\t"
  53393. "adc r5, r5, r11\n\t"
  53394. "adds r10, r10, r4\n\t"
  53395. "str r10, [%[a], #328]\n\t"
  53396. "adc r5, r5, #0\n\t"
  53397. /* a[i+83] += m[83] * mu */
  53398. "ldr r7, [%[m], #332]\n\t"
  53399. "ldr r10, [%[a], #332]\n\t"
  53400. "lsr r11, r7, #16\n\t"
  53401. "lsr r6, r8, #16\n\t"
  53402. "mul r4, r6, r11\n\t"
  53403. "lsl r11, r7, #16\n\t"
  53404. "lsr r11, r11, #16\n\t"
  53405. "mul r6, r11, r6\n\t"
  53406. "lsr r11, r6, #16\n\t"
  53407. "lsl r6, r6, #16\n\t"
  53408. "adds r10, r10, r6\n\t"
  53409. "adc r4, r4, r11\n\t"
  53410. "lsl r6, r8, #16\n\t"
  53411. "lsl r11, r7, #16\n\t"
  53412. "lsr r6, r6, #16\n\t"
  53413. "lsr r11, r11, #16\n\t"
  53414. "mul r11, r6, r11\n\t"
  53415. "adds r10, r10, r11\n\t"
  53416. "adc r4, r4, #0\n\t"
  53417. "lsr r11, r7, #16\n\t"
  53418. "mul r6, r11, r6\n\t"
  53419. "lsr r11, r6, #16\n\t"
  53420. "lsl r6, r6, #16\n\t"
  53421. "adds r10, r10, r6\n\t"
  53422. "adc r4, r4, r11\n\t"
  53423. "adds r10, r10, r5\n\t"
  53424. "str r10, [%[a], #332]\n\t"
  53425. "adc r4, r4, #0\n\t"
  53426. /* a[i+84] += m[84] * mu */
  53427. "ldr r7, [%[m], #336]\n\t"
  53428. "ldr r10, [%[a], #336]\n\t"
  53429. "lsr r11, r7, #16\n\t"
  53430. "lsr r6, r8, #16\n\t"
  53431. "mul r5, r6, r11\n\t"
  53432. "lsl r11, r7, #16\n\t"
  53433. "lsr r11, r11, #16\n\t"
  53434. "mul r6, r11, r6\n\t"
  53435. "lsr r11, r6, #16\n\t"
  53436. "lsl r6, r6, #16\n\t"
  53437. "adds r10, r10, r6\n\t"
  53438. "adc r5, r5, r11\n\t"
  53439. "lsl r6, r8, #16\n\t"
  53440. "lsl r11, r7, #16\n\t"
  53441. "lsr r6, r6, #16\n\t"
  53442. "lsr r11, r11, #16\n\t"
  53443. "mul r11, r6, r11\n\t"
  53444. "adds r10, r10, r11\n\t"
  53445. "adc r5, r5, #0\n\t"
  53446. "lsr r11, r7, #16\n\t"
  53447. "mul r6, r11, r6\n\t"
  53448. "lsr r11, r6, #16\n\t"
  53449. "lsl r6, r6, #16\n\t"
  53450. "adds r10, r10, r6\n\t"
  53451. "adc r5, r5, r11\n\t"
  53452. "adds r10, r10, r4\n\t"
  53453. "str r10, [%[a], #336]\n\t"
  53454. "adc r5, r5, #0\n\t"
  53455. /* a[i+85] += m[85] * mu */
  53456. "ldr r7, [%[m], #340]\n\t"
  53457. "ldr r10, [%[a], #340]\n\t"
  53458. "lsr r11, r7, #16\n\t"
  53459. "lsr r6, r8, #16\n\t"
  53460. "mul r4, 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 r4, r4, 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 r4, r4, #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 r4, r4, r11\n\t"
  53481. "adds r10, r10, r5\n\t"
  53482. "str r10, [%[a], #340]\n\t"
  53483. "adc r4, r4, #0\n\t"
  53484. /* a[i+86] += m[86] * mu */
  53485. "ldr r7, [%[m], #344]\n\t"
  53486. "ldr r10, [%[a], #344]\n\t"
  53487. "lsr r11, r7, #16\n\t"
  53488. "lsr r6, r8, #16\n\t"
  53489. "mul r5, r6, r11\n\t"
  53490. "lsl r11, r7, #16\n\t"
  53491. "lsr r11, r11, #16\n\t"
  53492. "mul r6, r11, r6\n\t"
  53493. "lsr r11, r6, #16\n\t"
  53494. "lsl r6, r6, #16\n\t"
  53495. "adds r10, r10, r6\n\t"
  53496. "adc r5, r5, r11\n\t"
  53497. "lsl r6, r8, #16\n\t"
  53498. "lsl r11, r7, #16\n\t"
  53499. "lsr r6, r6, #16\n\t"
  53500. "lsr r11, r11, #16\n\t"
  53501. "mul r11, r6, r11\n\t"
  53502. "adds r10, r10, r11\n\t"
  53503. "adc r5, r5, #0\n\t"
  53504. "lsr r11, r7, #16\n\t"
  53505. "mul r6, r11, r6\n\t"
  53506. "lsr r11, r6, #16\n\t"
  53507. "lsl r6, r6, #16\n\t"
  53508. "adds r10, r10, r6\n\t"
  53509. "adc r5, r5, r11\n\t"
  53510. "adds r10, r10, r4\n\t"
  53511. "str r10, [%[a], #344]\n\t"
  53512. "adc r5, r5, #0\n\t"
  53513. /* a[i+87] += m[87] * mu */
  53514. "ldr r7, [%[m], #348]\n\t"
  53515. "ldr r10, [%[a], #348]\n\t"
  53516. "lsr r11, r7, #16\n\t"
  53517. "lsr r6, r8, #16\n\t"
  53518. "mul r4, r6, r11\n\t"
  53519. "lsl r11, r7, #16\n\t"
  53520. "lsr r11, r11, #16\n\t"
  53521. "mul r6, r11, r6\n\t"
  53522. "lsr r11, r6, #16\n\t"
  53523. "lsl r6, r6, #16\n\t"
  53524. "adds r10, r10, r6\n\t"
  53525. "adc r4, r4, r11\n\t"
  53526. "lsl r6, r8, #16\n\t"
  53527. "lsl r11, r7, #16\n\t"
  53528. "lsr r6, r6, #16\n\t"
  53529. "lsr r11, r11, #16\n\t"
  53530. "mul r11, r6, r11\n\t"
  53531. "adds r10, r10, r11\n\t"
  53532. "adc r4, r4, #0\n\t"
  53533. "lsr r11, r7, #16\n\t"
  53534. "mul r6, r11, r6\n\t"
  53535. "lsr r11, r6, #16\n\t"
  53536. "lsl r6, r6, #16\n\t"
  53537. "adds r10, r10, r6\n\t"
  53538. "adc r4, r4, r11\n\t"
  53539. "adds r10, r10, r5\n\t"
  53540. "str r10, [%[a], #348]\n\t"
  53541. "adc r4, r4, #0\n\t"
  53542. /* a[i+88] += m[88] * mu */
  53543. "ldr r7, [%[m], #352]\n\t"
  53544. "ldr r10, [%[a], #352]\n\t"
  53545. "lsr r11, r7, #16\n\t"
  53546. "lsr r6, r8, #16\n\t"
  53547. "mul r5, r6, r11\n\t"
  53548. "lsl r11, r7, #16\n\t"
  53549. "lsr r11, r11, #16\n\t"
  53550. "mul r6, r11, r6\n\t"
  53551. "lsr r11, r6, #16\n\t"
  53552. "lsl r6, r6, #16\n\t"
  53553. "adds r10, r10, r6\n\t"
  53554. "adc r5, r5, r11\n\t"
  53555. "lsl r6, r8, #16\n\t"
  53556. "lsl r11, r7, #16\n\t"
  53557. "lsr r6, r6, #16\n\t"
  53558. "lsr r11, r11, #16\n\t"
  53559. "mul r11, r6, r11\n\t"
  53560. "adds r10, r10, r11\n\t"
  53561. "adc r5, r5, #0\n\t"
  53562. "lsr r11, r7, #16\n\t"
  53563. "mul r6, r11, r6\n\t"
  53564. "lsr r11, r6, #16\n\t"
  53565. "lsl r6, r6, #16\n\t"
  53566. "adds r10, r10, r6\n\t"
  53567. "adc r5, r5, r11\n\t"
  53568. "adds r10, r10, r4\n\t"
  53569. "str r10, [%[a], #352]\n\t"
  53570. "adc r5, r5, #0\n\t"
  53571. /* a[i+89] += m[89] * mu */
  53572. "ldr r7, [%[m], #356]\n\t"
  53573. "ldr r10, [%[a], #356]\n\t"
  53574. "lsr r11, r7, #16\n\t"
  53575. "lsr r6, r8, #16\n\t"
  53576. "mul r4, r6, r11\n\t"
  53577. "lsl r11, r7, #16\n\t"
  53578. "lsr r11, r11, #16\n\t"
  53579. "mul r6, r11, r6\n\t"
  53580. "lsr r11, r6, #16\n\t"
  53581. "lsl r6, r6, #16\n\t"
  53582. "adds r10, r10, r6\n\t"
  53583. "adc r4, r4, r11\n\t"
  53584. "lsl r6, r8, #16\n\t"
  53585. "lsl r11, r7, #16\n\t"
  53586. "lsr r6, r6, #16\n\t"
  53587. "lsr r11, r11, #16\n\t"
  53588. "mul r11, r6, r11\n\t"
  53589. "adds r10, r10, r11\n\t"
  53590. "adc r4, r4, #0\n\t"
  53591. "lsr r11, r7, #16\n\t"
  53592. "mul r6, r11, r6\n\t"
  53593. "lsr r11, r6, #16\n\t"
  53594. "lsl r6, r6, #16\n\t"
  53595. "adds r10, r10, r6\n\t"
  53596. "adc r4, r4, r11\n\t"
  53597. "adds r10, r10, r5\n\t"
  53598. "str r10, [%[a], #356]\n\t"
  53599. "adc r4, r4, #0\n\t"
  53600. /* a[i+90] += m[90] * mu */
  53601. "ldr r7, [%[m], #360]\n\t"
  53602. "ldr r10, [%[a], #360]\n\t"
  53603. "lsr r11, r7, #16\n\t"
  53604. "lsr r6, r8, #16\n\t"
  53605. "mul r5, r6, r11\n\t"
  53606. "lsl r11, r7, #16\n\t"
  53607. "lsr r11, r11, #16\n\t"
  53608. "mul r6, r11, r6\n\t"
  53609. "lsr r11, r6, #16\n\t"
  53610. "lsl r6, r6, #16\n\t"
  53611. "adds r10, r10, r6\n\t"
  53612. "adc r5, r5, r11\n\t"
  53613. "lsl r6, r8, #16\n\t"
  53614. "lsl r11, r7, #16\n\t"
  53615. "lsr r6, r6, #16\n\t"
  53616. "lsr r11, r11, #16\n\t"
  53617. "mul r11, r6, r11\n\t"
  53618. "adds r10, r10, r11\n\t"
  53619. "adc r5, r5, #0\n\t"
  53620. "lsr r11, r7, #16\n\t"
  53621. "mul r6, r11, r6\n\t"
  53622. "lsr r11, r6, #16\n\t"
  53623. "lsl r6, r6, #16\n\t"
  53624. "adds r10, r10, r6\n\t"
  53625. "adc r5, r5, r11\n\t"
  53626. "adds r10, r10, r4\n\t"
  53627. "str r10, [%[a], #360]\n\t"
  53628. "adc r5, r5, #0\n\t"
  53629. /* a[i+91] += m[91] * mu */
  53630. "ldr r7, [%[m], #364]\n\t"
  53631. "ldr r10, [%[a], #364]\n\t"
  53632. "lsr r11, r7, #16\n\t"
  53633. "lsr r6, r8, #16\n\t"
  53634. "mul r4, r6, r11\n\t"
  53635. "lsl r11, r7, #16\n\t"
  53636. "lsr r11, r11, #16\n\t"
  53637. "mul r6, r11, r6\n\t"
  53638. "lsr r11, r6, #16\n\t"
  53639. "lsl r6, r6, #16\n\t"
  53640. "adds r10, r10, r6\n\t"
  53641. "adc r4, r4, r11\n\t"
  53642. "lsl r6, r8, #16\n\t"
  53643. "lsl r11, r7, #16\n\t"
  53644. "lsr r6, r6, #16\n\t"
  53645. "lsr r11, r11, #16\n\t"
  53646. "mul r11, r6, r11\n\t"
  53647. "adds r10, r10, r11\n\t"
  53648. "adc r4, r4, #0\n\t"
  53649. "lsr r11, r7, #16\n\t"
  53650. "mul r6, r11, r6\n\t"
  53651. "lsr r11, r6, #16\n\t"
  53652. "lsl r6, r6, #16\n\t"
  53653. "adds r10, r10, r6\n\t"
  53654. "adc r4, r4, r11\n\t"
  53655. "adds r10, r10, r5\n\t"
  53656. "str r10, [%[a], #364]\n\t"
  53657. "adc r4, r4, #0\n\t"
  53658. /* a[i+92] += m[92] * mu */
  53659. "ldr r7, [%[m], #368]\n\t"
  53660. "ldr r10, [%[a], #368]\n\t"
  53661. "lsr r11, r7, #16\n\t"
  53662. "lsr r6, r8, #16\n\t"
  53663. "mul r5, r6, r11\n\t"
  53664. "lsl r11, r7, #16\n\t"
  53665. "lsr r11, r11, #16\n\t"
  53666. "mul r6, r11, r6\n\t"
  53667. "lsr r11, r6, #16\n\t"
  53668. "lsl r6, r6, #16\n\t"
  53669. "adds r10, r10, r6\n\t"
  53670. "adc r5, r5, r11\n\t"
  53671. "lsl r6, r8, #16\n\t"
  53672. "lsl r11, r7, #16\n\t"
  53673. "lsr r6, r6, #16\n\t"
  53674. "lsr r11, r11, #16\n\t"
  53675. "mul r11, r6, r11\n\t"
  53676. "adds r10, r10, r11\n\t"
  53677. "adc r5, r5, #0\n\t"
  53678. "lsr r11, r7, #16\n\t"
  53679. "mul r6, r11, r6\n\t"
  53680. "lsr r11, r6, #16\n\t"
  53681. "lsl r6, r6, #16\n\t"
  53682. "adds r10, r10, r6\n\t"
  53683. "adc r5, r5, r11\n\t"
  53684. "adds r10, r10, r4\n\t"
  53685. "str r10, [%[a], #368]\n\t"
  53686. "adc r5, r5, #0\n\t"
  53687. /* a[i+93] += m[93] * mu */
  53688. "ldr r7, [%[m], #372]\n\t"
  53689. "ldr r10, [%[a], #372]\n\t"
  53690. "lsr r11, r7, #16\n\t"
  53691. "lsr r6, r8, #16\n\t"
  53692. "mul r4, r6, r11\n\t"
  53693. "lsl r11, r7, #16\n\t"
  53694. "lsr r11, r11, #16\n\t"
  53695. "mul r6, r11, r6\n\t"
  53696. "lsr r11, r6, #16\n\t"
  53697. "lsl r6, r6, #16\n\t"
  53698. "adds r10, r10, r6\n\t"
  53699. "adc r4, r4, r11\n\t"
  53700. "lsl r6, r8, #16\n\t"
  53701. "lsl r11, r7, #16\n\t"
  53702. "lsr r6, r6, #16\n\t"
  53703. "lsr r11, r11, #16\n\t"
  53704. "mul r11, r6, r11\n\t"
  53705. "adds r10, r10, r11\n\t"
  53706. "adc r4, r4, #0\n\t"
  53707. "lsr r11, r7, #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. "adds r10, r10, r5\n\t"
  53714. "str r10, [%[a], #372]\n\t"
  53715. "adc r4, r4, #0\n\t"
  53716. /* a[i+94] += m[94] * mu */
  53717. "ldr r7, [%[m], #376]\n\t"
  53718. "ldr r10, [%[a], #376]\n\t"
  53719. "lsr r11, r7, #16\n\t"
  53720. "lsr r6, r8, #16\n\t"
  53721. "mul r5, r6, r11\n\t"
  53722. "lsl r11, r7, #16\n\t"
  53723. "lsr r11, r11, #16\n\t"
  53724. "mul r6, r11, r6\n\t"
  53725. "lsr r11, r6, #16\n\t"
  53726. "lsl r6, r6, #16\n\t"
  53727. "adds r10, r10, r6\n\t"
  53728. "adc r5, r5, r11\n\t"
  53729. "lsl r6, r8, #16\n\t"
  53730. "lsl r11, r7, #16\n\t"
  53731. "lsr r6, r6, #16\n\t"
  53732. "lsr r11, r11, #16\n\t"
  53733. "mul r11, r6, r11\n\t"
  53734. "adds r10, r10, r11\n\t"
  53735. "adc r5, r5, #0\n\t"
  53736. "lsr r11, r7, #16\n\t"
  53737. "mul r6, r11, r6\n\t"
  53738. "lsr r11, r6, #16\n\t"
  53739. "lsl r6, r6, #16\n\t"
  53740. "adds r10, r10, r6\n\t"
  53741. "adc r5, r5, r11\n\t"
  53742. "adds r10, r10, r4\n\t"
  53743. "str r10, [%[a], #376]\n\t"
  53744. "adc r5, r5, #0\n\t"
  53745. /* a[i+95] += m[95] * mu */
  53746. "ldr r7, [%[m], #380]\n\t"
  53747. "ldr r10, [%[a], #380]\n\t"
  53748. "lsr r11, r7, #16\n\t"
  53749. "lsr r6, r8, #16\n\t"
  53750. "mul r4, r6, r11\n\t"
  53751. "lsl r11, r7, #16\n\t"
  53752. "lsr r11, r11, #16\n\t"
  53753. "mul r6, r11, r6\n\t"
  53754. "lsr r11, r6, #16\n\t"
  53755. "lsl r6, r6, #16\n\t"
  53756. "adds r10, r10, r6\n\t"
  53757. "adc r4, r4, r11\n\t"
  53758. "lsl r6, r8, #16\n\t"
  53759. "lsl r11, r7, #16\n\t"
  53760. "lsr r6, r6, #16\n\t"
  53761. "lsr r11, r11, #16\n\t"
  53762. "mul r11, r6, r11\n\t"
  53763. "adds r10, r10, r11\n\t"
  53764. "adc r4, r4, #0\n\t"
  53765. "lsr r11, r7, #16\n\t"
  53766. "mul r6, r11, r6\n\t"
  53767. "lsr r11, r6, #16\n\t"
  53768. "lsl r6, r6, #16\n\t"
  53769. "adds r10, r10, r6\n\t"
  53770. "adc r4, r4, r11\n\t"
  53771. "adds r10, r10, r5\n\t"
  53772. "str r10, [%[a], #380]\n\t"
  53773. "adc r4, r4, #0\n\t"
  53774. /* a[i+96] += m[96] * mu */
  53775. "ldr r7, [%[m], #384]\n\t"
  53776. "ldr r10, [%[a], #384]\n\t"
  53777. "lsr r11, r7, #16\n\t"
  53778. "lsr r6, r8, #16\n\t"
  53779. "mul r5, r6, r11\n\t"
  53780. "lsl r11, r7, #16\n\t"
  53781. "lsr r11, r11, #16\n\t"
  53782. "mul r6, r11, r6\n\t"
  53783. "lsr r11, r6, #16\n\t"
  53784. "lsl r6, r6, #16\n\t"
  53785. "adds r10, r10, r6\n\t"
  53786. "adc r5, r5, r11\n\t"
  53787. "lsl r6, r8, #16\n\t"
  53788. "lsl r11, r7, #16\n\t"
  53789. "lsr r6, r6, #16\n\t"
  53790. "lsr r11, r11, #16\n\t"
  53791. "mul r11, r6, r11\n\t"
  53792. "adds r10, r10, r11\n\t"
  53793. "adc r5, r5, #0\n\t"
  53794. "lsr r11, r7, #16\n\t"
  53795. "mul r6, r11, r6\n\t"
  53796. "lsr r11, r6, #16\n\t"
  53797. "lsl r6, r6, #16\n\t"
  53798. "adds r10, r10, r6\n\t"
  53799. "adc r5, r5, r11\n\t"
  53800. "adds r10, r10, r4\n\t"
  53801. "str r10, [%[a], #384]\n\t"
  53802. "adc r5, r5, #0\n\t"
  53803. /* a[i+97] += m[97] * mu */
  53804. "ldr r7, [%[m], #388]\n\t"
  53805. "ldr r10, [%[a], #388]\n\t"
  53806. "lsr r11, r7, #16\n\t"
  53807. "lsr r6, r8, #16\n\t"
  53808. "mul r4, r6, r11\n\t"
  53809. "lsl r11, r7, #16\n\t"
  53810. "lsr r11, r11, #16\n\t"
  53811. "mul r6, r11, r6\n\t"
  53812. "lsr r11, r6, #16\n\t"
  53813. "lsl r6, r6, #16\n\t"
  53814. "adds r10, r10, r6\n\t"
  53815. "adc r4, r4, r11\n\t"
  53816. "lsl r6, r8, #16\n\t"
  53817. "lsl r11, r7, #16\n\t"
  53818. "lsr r6, r6, #16\n\t"
  53819. "lsr r11, r11, #16\n\t"
  53820. "mul r11, r6, r11\n\t"
  53821. "adds r10, r10, r11\n\t"
  53822. "adc r4, r4, #0\n\t"
  53823. "lsr r11, r7, #16\n\t"
  53824. "mul r6, r11, r6\n\t"
  53825. "lsr r11, r6, #16\n\t"
  53826. "lsl r6, r6, #16\n\t"
  53827. "adds r10, r10, r6\n\t"
  53828. "adc r4, r4, r11\n\t"
  53829. "adds r10, r10, r5\n\t"
  53830. "str r10, [%[a], #388]\n\t"
  53831. "adc r4, r4, #0\n\t"
  53832. /* a[i+98] += m[98] * mu */
  53833. "ldr r7, [%[m], #392]\n\t"
  53834. "ldr r10, [%[a], #392]\n\t"
  53835. "lsr r11, r7, #16\n\t"
  53836. "lsr r6, r8, #16\n\t"
  53837. "mul r5, r6, r11\n\t"
  53838. "lsl r11, r7, #16\n\t"
  53839. "lsr r11, r11, #16\n\t"
  53840. "mul r6, r11, r6\n\t"
  53841. "lsr r11, r6, #16\n\t"
  53842. "lsl r6, r6, #16\n\t"
  53843. "adds r10, r10, r6\n\t"
  53844. "adc r5, r5, r11\n\t"
  53845. "lsl r6, r8, #16\n\t"
  53846. "lsl r11, r7, #16\n\t"
  53847. "lsr r6, r6, #16\n\t"
  53848. "lsr r11, r11, #16\n\t"
  53849. "mul r11, r6, r11\n\t"
  53850. "adds r10, r10, r11\n\t"
  53851. "adc r5, r5, #0\n\t"
  53852. "lsr r11, r7, #16\n\t"
  53853. "mul r6, r11, r6\n\t"
  53854. "lsr r11, r6, #16\n\t"
  53855. "lsl r6, r6, #16\n\t"
  53856. "adds r10, r10, r6\n\t"
  53857. "adc r5, r5, r11\n\t"
  53858. "adds r10, r10, r4\n\t"
  53859. "str r10, [%[a], #392]\n\t"
  53860. "adc r5, r5, #0\n\t"
  53861. /* a[i+99] += m[99] * mu */
  53862. "ldr r7, [%[m], #396]\n\t"
  53863. "ldr r10, [%[a], #396]\n\t"
  53864. "lsr r11, r7, #16\n\t"
  53865. "lsr r6, r8, #16\n\t"
  53866. "mul r4, r6, r11\n\t"
  53867. "lsl r11, r7, #16\n\t"
  53868. "lsr r11, r11, #16\n\t"
  53869. "mul r6, r11, r6\n\t"
  53870. "lsr r11, r6, #16\n\t"
  53871. "lsl r6, r6, #16\n\t"
  53872. "adds r10, r10, r6\n\t"
  53873. "adc r4, r4, r11\n\t"
  53874. "lsl r6, r8, #16\n\t"
  53875. "lsl r11, r7, #16\n\t"
  53876. "lsr r6, r6, #16\n\t"
  53877. "lsr r11, r11, #16\n\t"
  53878. "mul r11, r6, r11\n\t"
  53879. "adds r10, r10, r11\n\t"
  53880. "adc r4, r4, #0\n\t"
  53881. "lsr r11, r7, #16\n\t"
  53882. "mul r6, r11, r6\n\t"
  53883. "lsr r11, r6, #16\n\t"
  53884. "lsl r6, r6, #16\n\t"
  53885. "adds r10, r10, r6\n\t"
  53886. "adc r4, r4, r11\n\t"
  53887. "adds r10, r10, r5\n\t"
  53888. "str r10, [%[a], #396]\n\t"
  53889. "adc r4, r4, #0\n\t"
  53890. /* a[i+100] += m[100] * mu */
  53891. "ldr r7, [%[m], #400]\n\t"
  53892. "ldr r10, [%[a], #400]\n\t"
  53893. "lsr r11, r7, #16\n\t"
  53894. "lsr r6, r8, #16\n\t"
  53895. "mul r5, r6, r11\n\t"
  53896. "lsl r11, r7, #16\n\t"
  53897. "lsr r11, r11, #16\n\t"
  53898. "mul r6, r11, r6\n\t"
  53899. "lsr r11, r6, #16\n\t"
  53900. "lsl r6, r6, #16\n\t"
  53901. "adds r10, r10, r6\n\t"
  53902. "adc r5, r5, r11\n\t"
  53903. "lsl r6, r8, #16\n\t"
  53904. "lsl r11, r7, #16\n\t"
  53905. "lsr r6, r6, #16\n\t"
  53906. "lsr r11, r11, #16\n\t"
  53907. "mul r11, r6, r11\n\t"
  53908. "adds r10, r10, r11\n\t"
  53909. "adc r5, r5, #0\n\t"
  53910. "lsr r11, r7, #16\n\t"
  53911. "mul r6, r11, r6\n\t"
  53912. "lsr r11, r6, #16\n\t"
  53913. "lsl r6, r6, #16\n\t"
  53914. "adds r10, r10, r6\n\t"
  53915. "adc r5, r5, r11\n\t"
  53916. "adds r10, r10, r4\n\t"
  53917. "str r10, [%[a], #400]\n\t"
  53918. "adc r5, r5, #0\n\t"
  53919. /* a[i+101] += m[101] * mu */
  53920. "ldr r7, [%[m], #404]\n\t"
  53921. "ldr r10, [%[a], #404]\n\t"
  53922. "lsr r11, r7, #16\n\t"
  53923. "lsr r6, r8, #16\n\t"
  53924. "mul r4, r6, r11\n\t"
  53925. "lsl r11, r7, #16\n\t"
  53926. "lsr r11, r11, #16\n\t"
  53927. "mul r6, r11, r6\n\t"
  53928. "lsr r11, r6, #16\n\t"
  53929. "lsl r6, r6, #16\n\t"
  53930. "adds r10, r10, r6\n\t"
  53931. "adc r4, r4, r11\n\t"
  53932. "lsl r6, r8, #16\n\t"
  53933. "lsl r11, r7, #16\n\t"
  53934. "lsr r6, r6, #16\n\t"
  53935. "lsr r11, r11, #16\n\t"
  53936. "mul r11, r6, r11\n\t"
  53937. "adds r10, r10, r11\n\t"
  53938. "adc r4, r4, #0\n\t"
  53939. "lsr r11, r7, #16\n\t"
  53940. "mul r6, r11, r6\n\t"
  53941. "lsr r11, r6, #16\n\t"
  53942. "lsl r6, r6, #16\n\t"
  53943. "adds r10, r10, r6\n\t"
  53944. "adc r4, r4, r11\n\t"
  53945. "adds r10, r10, r5\n\t"
  53946. "str r10, [%[a], #404]\n\t"
  53947. "adc r4, r4, #0\n\t"
  53948. /* a[i+102] += m[102] * mu */
  53949. "ldr r7, [%[m], #408]\n\t"
  53950. "ldr r10, [%[a], #408]\n\t"
  53951. "lsr r11, r7, #16\n\t"
  53952. "lsr r6, r8, #16\n\t"
  53953. "mul r5, r6, r11\n\t"
  53954. "lsl r11, r7, #16\n\t"
  53955. "lsr r11, r11, #16\n\t"
  53956. "mul r6, r11, r6\n\t"
  53957. "lsr r11, r6, #16\n\t"
  53958. "lsl r6, r6, #16\n\t"
  53959. "adds r10, r10, r6\n\t"
  53960. "adc r5, r5, r11\n\t"
  53961. "lsl r6, r8, #16\n\t"
  53962. "lsl r11, r7, #16\n\t"
  53963. "lsr r6, r6, #16\n\t"
  53964. "lsr r11, r11, #16\n\t"
  53965. "mul r11, r6, r11\n\t"
  53966. "adds r10, r10, r11\n\t"
  53967. "adc r5, r5, #0\n\t"
  53968. "lsr r11, r7, #16\n\t"
  53969. "mul r6, r11, r6\n\t"
  53970. "lsr r11, r6, #16\n\t"
  53971. "lsl r6, r6, #16\n\t"
  53972. "adds r10, r10, r6\n\t"
  53973. "adc r5, r5, r11\n\t"
  53974. "adds r10, r10, r4\n\t"
  53975. "str r10, [%[a], #408]\n\t"
  53976. "adc r5, r5, #0\n\t"
  53977. /* a[i+103] += m[103] * mu */
  53978. "ldr r7, [%[m], #412]\n\t"
  53979. "ldr r10, [%[a], #412]\n\t"
  53980. "lsr r11, r7, #16\n\t"
  53981. "lsr r6, r8, #16\n\t"
  53982. "mul r4, r6, r11\n\t"
  53983. "lsl r11, r7, #16\n\t"
  53984. "lsr r11, r11, #16\n\t"
  53985. "mul r6, r11, r6\n\t"
  53986. "lsr r11, r6, #16\n\t"
  53987. "lsl r6, r6, #16\n\t"
  53988. "adds r10, r10, r6\n\t"
  53989. "adc r4, r4, r11\n\t"
  53990. "lsl r6, r8, #16\n\t"
  53991. "lsl r11, r7, #16\n\t"
  53992. "lsr r6, r6, #16\n\t"
  53993. "lsr r11, r11, #16\n\t"
  53994. "mul r11, r6, r11\n\t"
  53995. "adds r10, r10, r11\n\t"
  53996. "adc r4, r4, #0\n\t"
  53997. "lsr r11, r7, #16\n\t"
  53998. "mul r6, r11, r6\n\t"
  53999. "lsr r11, r6, #16\n\t"
  54000. "lsl r6, r6, #16\n\t"
  54001. "adds r10, r10, r6\n\t"
  54002. "adc r4, r4, r11\n\t"
  54003. "adds r10, r10, r5\n\t"
  54004. "str r10, [%[a], #412]\n\t"
  54005. "adc r4, r4, #0\n\t"
  54006. /* a[i+104] += m[104] * mu */
  54007. "ldr r7, [%[m], #416]\n\t"
  54008. "ldr r10, [%[a], #416]\n\t"
  54009. "lsr r11, r7, #16\n\t"
  54010. "lsr r6, r8, #16\n\t"
  54011. "mul r5, r6, r11\n\t"
  54012. "lsl r11, r7, #16\n\t"
  54013. "lsr r11, r11, #16\n\t"
  54014. "mul r6, r11, r6\n\t"
  54015. "lsr r11, r6, #16\n\t"
  54016. "lsl r6, r6, #16\n\t"
  54017. "adds r10, r10, r6\n\t"
  54018. "adc r5, r5, r11\n\t"
  54019. "lsl r6, r8, #16\n\t"
  54020. "lsl r11, r7, #16\n\t"
  54021. "lsr r6, r6, #16\n\t"
  54022. "lsr r11, r11, #16\n\t"
  54023. "mul r11, r6, r11\n\t"
  54024. "adds r10, r10, r11\n\t"
  54025. "adc r5, r5, #0\n\t"
  54026. "lsr r11, r7, #16\n\t"
  54027. "mul r6, r11, r6\n\t"
  54028. "lsr r11, r6, #16\n\t"
  54029. "lsl r6, r6, #16\n\t"
  54030. "adds r10, r10, r6\n\t"
  54031. "adc r5, r5, r11\n\t"
  54032. "adds r10, r10, r4\n\t"
  54033. "str r10, [%[a], #416]\n\t"
  54034. "adc r5, r5, #0\n\t"
  54035. /* a[i+105] += m[105] * mu */
  54036. "ldr r7, [%[m], #420]\n\t"
  54037. "ldr r10, [%[a], #420]\n\t"
  54038. "lsr r11, r7, #16\n\t"
  54039. "lsr r6, r8, #16\n\t"
  54040. "mul r4, r6, r11\n\t"
  54041. "lsl r11, r7, #16\n\t"
  54042. "lsr r11, r11, #16\n\t"
  54043. "mul r6, r11, r6\n\t"
  54044. "lsr r11, r6, #16\n\t"
  54045. "lsl r6, r6, #16\n\t"
  54046. "adds r10, r10, r6\n\t"
  54047. "adc r4, r4, r11\n\t"
  54048. "lsl r6, r8, #16\n\t"
  54049. "lsl r11, r7, #16\n\t"
  54050. "lsr r6, r6, #16\n\t"
  54051. "lsr r11, r11, #16\n\t"
  54052. "mul r11, r6, r11\n\t"
  54053. "adds r10, r10, r11\n\t"
  54054. "adc r4, r4, #0\n\t"
  54055. "lsr r11, r7, #16\n\t"
  54056. "mul r6, r11, r6\n\t"
  54057. "lsr r11, r6, #16\n\t"
  54058. "lsl r6, r6, #16\n\t"
  54059. "adds r10, r10, r6\n\t"
  54060. "adc r4, r4, r11\n\t"
  54061. "adds r10, r10, r5\n\t"
  54062. "str r10, [%[a], #420]\n\t"
  54063. "adc r4, r4, #0\n\t"
  54064. /* a[i+106] += m[106] * mu */
  54065. "ldr r7, [%[m], #424]\n\t"
  54066. "ldr r10, [%[a], #424]\n\t"
  54067. "lsr r11, r7, #16\n\t"
  54068. "lsr r6, r8, #16\n\t"
  54069. "mul r5, r6, r11\n\t"
  54070. "lsl r11, r7, #16\n\t"
  54071. "lsr r11, r11, #16\n\t"
  54072. "mul r6, r11, r6\n\t"
  54073. "lsr r11, r6, #16\n\t"
  54074. "lsl r6, r6, #16\n\t"
  54075. "adds r10, r10, r6\n\t"
  54076. "adc r5, r5, r11\n\t"
  54077. "lsl r6, r8, #16\n\t"
  54078. "lsl r11, r7, #16\n\t"
  54079. "lsr r6, r6, #16\n\t"
  54080. "lsr r11, r11, #16\n\t"
  54081. "mul r11, r6, r11\n\t"
  54082. "adds r10, r10, r11\n\t"
  54083. "adc r5, r5, #0\n\t"
  54084. "lsr r11, r7, #16\n\t"
  54085. "mul r6, r11, r6\n\t"
  54086. "lsr r11, r6, #16\n\t"
  54087. "lsl r6, r6, #16\n\t"
  54088. "adds r10, r10, r6\n\t"
  54089. "adc r5, r5, r11\n\t"
  54090. "adds r10, r10, r4\n\t"
  54091. "str r10, [%[a], #424]\n\t"
  54092. "adc r5, r5, #0\n\t"
  54093. /* a[i+107] += m[107] * mu */
  54094. "ldr r7, [%[m], #428]\n\t"
  54095. "ldr r10, [%[a], #428]\n\t"
  54096. "lsr r11, r7, #16\n\t"
  54097. "lsr r6, r8, #16\n\t"
  54098. "mul r4, r6, r11\n\t"
  54099. "lsl r11, r7, #16\n\t"
  54100. "lsr r11, r11, #16\n\t"
  54101. "mul r6, r11, r6\n\t"
  54102. "lsr r11, r6, #16\n\t"
  54103. "lsl r6, r6, #16\n\t"
  54104. "adds r10, r10, r6\n\t"
  54105. "adc r4, r4, r11\n\t"
  54106. "lsl r6, r8, #16\n\t"
  54107. "lsl r11, r7, #16\n\t"
  54108. "lsr r6, r6, #16\n\t"
  54109. "lsr r11, r11, #16\n\t"
  54110. "mul r11, r6, r11\n\t"
  54111. "adds r10, r10, r11\n\t"
  54112. "adc r4, r4, #0\n\t"
  54113. "lsr r11, r7, #16\n\t"
  54114. "mul r6, r11, r6\n\t"
  54115. "lsr r11, r6, #16\n\t"
  54116. "lsl r6, r6, #16\n\t"
  54117. "adds r10, r10, r6\n\t"
  54118. "adc r4, r4, r11\n\t"
  54119. "adds r10, r10, r5\n\t"
  54120. "str r10, [%[a], #428]\n\t"
  54121. "adc r4, r4, #0\n\t"
  54122. /* a[i+108] += m[108] * mu */
  54123. "ldr r7, [%[m], #432]\n\t"
  54124. "ldr r10, [%[a], #432]\n\t"
  54125. "lsr r11, r7, #16\n\t"
  54126. "lsr r6, r8, #16\n\t"
  54127. "mul r5, r6, r11\n\t"
  54128. "lsl r11, r7, #16\n\t"
  54129. "lsr r11, r11, #16\n\t"
  54130. "mul r6, r11, r6\n\t"
  54131. "lsr r11, r6, #16\n\t"
  54132. "lsl r6, r6, #16\n\t"
  54133. "adds r10, r10, r6\n\t"
  54134. "adc r5, r5, r11\n\t"
  54135. "lsl r6, r8, #16\n\t"
  54136. "lsl r11, r7, #16\n\t"
  54137. "lsr r6, r6, #16\n\t"
  54138. "lsr r11, r11, #16\n\t"
  54139. "mul r11, r6, r11\n\t"
  54140. "adds r10, r10, r11\n\t"
  54141. "adc r5, r5, #0\n\t"
  54142. "lsr r11, r7, #16\n\t"
  54143. "mul r6, r11, r6\n\t"
  54144. "lsr r11, r6, #16\n\t"
  54145. "lsl r6, r6, #16\n\t"
  54146. "adds r10, r10, r6\n\t"
  54147. "adc r5, r5, r11\n\t"
  54148. "adds r10, r10, r4\n\t"
  54149. "str r10, [%[a], #432]\n\t"
  54150. "adc r5, r5, #0\n\t"
  54151. /* a[i+109] += m[109] * mu */
  54152. "ldr r7, [%[m], #436]\n\t"
  54153. "ldr r10, [%[a], #436]\n\t"
  54154. "lsr r11, r7, #16\n\t"
  54155. "lsr r6, r8, #16\n\t"
  54156. "mul r4, r6, r11\n\t"
  54157. "lsl r11, r7, #16\n\t"
  54158. "lsr r11, r11, #16\n\t"
  54159. "mul r6, r11, r6\n\t"
  54160. "lsr r11, r6, #16\n\t"
  54161. "lsl r6, r6, #16\n\t"
  54162. "adds r10, r10, r6\n\t"
  54163. "adc r4, r4, r11\n\t"
  54164. "lsl r6, r8, #16\n\t"
  54165. "lsl r11, r7, #16\n\t"
  54166. "lsr r6, r6, #16\n\t"
  54167. "lsr r11, r11, #16\n\t"
  54168. "mul r11, r6, r11\n\t"
  54169. "adds r10, r10, r11\n\t"
  54170. "adc r4, r4, #0\n\t"
  54171. "lsr r11, r7, #16\n\t"
  54172. "mul r6, r11, r6\n\t"
  54173. "lsr r11, r6, #16\n\t"
  54174. "lsl r6, r6, #16\n\t"
  54175. "adds r10, r10, r6\n\t"
  54176. "adc r4, r4, r11\n\t"
  54177. "adds r10, r10, r5\n\t"
  54178. "str r10, [%[a], #436]\n\t"
  54179. "adc r4, r4, #0\n\t"
  54180. /* a[i+110] += m[110] * mu */
  54181. "ldr r7, [%[m], #440]\n\t"
  54182. "ldr r10, [%[a], #440]\n\t"
  54183. "lsr r11, r7, #16\n\t"
  54184. "lsr r6, r8, #16\n\t"
  54185. "mul r5, r6, r11\n\t"
  54186. "lsl r11, r7, #16\n\t"
  54187. "lsr r11, r11, #16\n\t"
  54188. "mul r6, r11, r6\n\t"
  54189. "lsr r11, r6, #16\n\t"
  54190. "lsl r6, r6, #16\n\t"
  54191. "adds r10, r10, r6\n\t"
  54192. "adc r5, r5, r11\n\t"
  54193. "lsl r6, r8, #16\n\t"
  54194. "lsl r11, r7, #16\n\t"
  54195. "lsr r6, r6, #16\n\t"
  54196. "lsr r11, r11, #16\n\t"
  54197. "mul r11, r6, r11\n\t"
  54198. "adds r10, r10, r11\n\t"
  54199. "adc r5, r5, #0\n\t"
  54200. "lsr r11, r7, #16\n\t"
  54201. "mul r6, r11, r6\n\t"
  54202. "lsr r11, r6, #16\n\t"
  54203. "lsl r6, r6, #16\n\t"
  54204. "adds r10, r10, r6\n\t"
  54205. "adc r5, r5, r11\n\t"
  54206. "adds r10, r10, r4\n\t"
  54207. "str r10, [%[a], #440]\n\t"
  54208. "adc r5, r5, #0\n\t"
  54209. /* a[i+111] += m[111] * mu */
  54210. "ldr r7, [%[m], #444]\n\t"
  54211. "ldr r10, [%[a], #444]\n\t"
  54212. "lsr r11, r7, #16\n\t"
  54213. "lsr r6, r8, #16\n\t"
  54214. "mul r4, r6, r11\n\t"
  54215. "lsl r11, r7, #16\n\t"
  54216. "lsr r11, r11, #16\n\t"
  54217. "mul r6, r11, r6\n\t"
  54218. "lsr r11, r6, #16\n\t"
  54219. "lsl r6, r6, #16\n\t"
  54220. "adds r10, r10, r6\n\t"
  54221. "adc r4, r4, r11\n\t"
  54222. "lsl r6, r8, #16\n\t"
  54223. "lsl r11, r7, #16\n\t"
  54224. "lsr r6, r6, #16\n\t"
  54225. "lsr r11, r11, #16\n\t"
  54226. "mul r11, r6, r11\n\t"
  54227. "adds r10, r10, r11\n\t"
  54228. "adc r4, r4, #0\n\t"
  54229. "lsr r11, r7, #16\n\t"
  54230. "mul r6, r11, r6\n\t"
  54231. "lsr r11, r6, #16\n\t"
  54232. "lsl r6, r6, #16\n\t"
  54233. "adds r10, r10, r6\n\t"
  54234. "adc r4, r4, r11\n\t"
  54235. "adds r10, r10, r5\n\t"
  54236. "str r10, [%[a], #444]\n\t"
  54237. "adc r4, r4, #0\n\t"
  54238. /* a[i+112] += m[112] * mu */
  54239. "ldr r7, [%[m], #448]\n\t"
  54240. "ldr r10, [%[a], #448]\n\t"
  54241. "lsr r11, r7, #16\n\t"
  54242. "lsr r6, r8, #16\n\t"
  54243. "mul r5, r6, r11\n\t"
  54244. "lsl r11, r7, #16\n\t"
  54245. "lsr r11, r11, #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. "lsl r6, r8, #16\n\t"
  54252. "lsl r11, r7, #16\n\t"
  54253. "lsr r6, r6, #16\n\t"
  54254. "lsr r11, r11, #16\n\t"
  54255. "mul r11, r6, r11\n\t"
  54256. "adds r10, r10, r11\n\t"
  54257. "adc r5, r5, #0\n\t"
  54258. "lsr r11, r7, #16\n\t"
  54259. "mul r6, r11, r6\n\t"
  54260. "lsr r11, r6, #16\n\t"
  54261. "lsl r6, r6, #16\n\t"
  54262. "adds r10, r10, r6\n\t"
  54263. "adc r5, r5, r11\n\t"
  54264. "adds r10, r10, r4\n\t"
  54265. "str r10, [%[a], #448]\n\t"
  54266. "adc r5, r5, #0\n\t"
  54267. /* a[i+113] += m[113] * mu */
  54268. "ldr r7, [%[m], #452]\n\t"
  54269. "ldr r10, [%[a], #452]\n\t"
  54270. "lsr r11, r7, #16\n\t"
  54271. "lsr r6, r8, #16\n\t"
  54272. "mul r4, r6, r11\n\t"
  54273. "lsl r11, r7, #16\n\t"
  54274. "lsr r11, r11, #16\n\t"
  54275. "mul r6, r11, r6\n\t"
  54276. "lsr r11, r6, #16\n\t"
  54277. "lsl r6, r6, #16\n\t"
  54278. "adds r10, r10, r6\n\t"
  54279. "adc r4, r4, r11\n\t"
  54280. "lsl r6, r8, #16\n\t"
  54281. "lsl r11, r7, #16\n\t"
  54282. "lsr r6, r6, #16\n\t"
  54283. "lsr r11, r11, #16\n\t"
  54284. "mul r11, r6, r11\n\t"
  54285. "adds r10, r10, r11\n\t"
  54286. "adc r4, r4, #0\n\t"
  54287. "lsr r11, r7, #16\n\t"
  54288. "mul r6, r11, r6\n\t"
  54289. "lsr r11, r6, #16\n\t"
  54290. "lsl r6, r6, #16\n\t"
  54291. "adds r10, r10, r6\n\t"
  54292. "adc r4, r4, r11\n\t"
  54293. "adds r10, r10, r5\n\t"
  54294. "str r10, [%[a], #452]\n\t"
  54295. "adc r4, r4, #0\n\t"
  54296. /* a[i+114] += m[114] * mu */
  54297. "ldr r7, [%[m], #456]\n\t"
  54298. "ldr r10, [%[a], #456]\n\t"
  54299. "lsr r11, r7, #16\n\t"
  54300. "lsr r6, r8, #16\n\t"
  54301. "mul r5, r6, r11\n\t"
  54302. "lsl r11, r7, #16\n\t"
  54303. "lsr r11, r11, #16\n\t"
  54304. "mul r6, r11, r6\n\t"
  54305. "lsr r11, r6, #16\n\t"
  54306. "lsl r6, r6, #16\n\t"
  54307. "adds r10, r10, r6\n\t"
  54308. "adc r5, r5, r11\n\t"
  54309. "lsl r6, r8, #16\n\t"
  54310. "lsl r11, r7, #16\n\t"
  54311. "lsr r6, r6, #16\n\t"
  54312. "lsr r11, r11, #16\n\t"
  54313. "mul r11, r6, r11\n\t"
  54314. "adds r10, r10, r11\n\t"
  54315. "adc r5, r5, #0\n\t"
  54316. "lsr r11, r7, #16\n\t"
  54317. "mul r6, r11, r6\n\t"
  54318. "lsr r11, r6, #16\n\t"
  54319. "lsl r6, r6, #16\n\t"
  54320. "adds r10, r10, r6\n\t"
  54321. "adc r5, r5, r11\n\t"
  54322. "adds r10, r10, r4\n\t"
  54323. "str r10, [%[a], #456]\n\t"
  54324. "adc r5, r5, #0\n\t"
  54325. /* a[i+115] += m[115] * mu */
  54326. "ldr r7, [%[m], #460]\n\t"
  54327. "ldr r10, [%[a], #460]\n\t"
  54328. "lsr r11, r7, #16\n\t"
  54329. "lsr r6, r8, #16\n\t"
  54330. "mul r4, r6, r11\n\t"
  54331. "lsl r11, r7, #16\n\t"
  54332. "lsr r11, r11, #16\n\t"
  54333. "mul r6, r11, r6\n\t"
  54334. "lsr r11, r6, #16\n\t"
  54335. "lsl r6, r6, #16\n\t"
  54336. "adds r10, r10, r6\n\t"
  54337. "adc r4, r4, r11\n\t"
  54338. "lsl r6, r8, #16\n\t"
  54339. "lsl r11, r7, #16\n\t"
  54340. "lsr r6, r6, #16\n\t"
  54341. "lsr r11, r11, #16\n\t"
  54342. "mul r11, r6, r11\n\t"
  54343. "adds r10, r10, r11\n\t"
  54344. "adc r4, r4, #0\n\t"
  54345. "lsr r11, r7, #16\n\t"
  54346. "mul r6, r11, r6\n\t"
  54347. "lsr r11, r6, #16\n\t"
  54348. "lsl r6, r6, #16\n\t"
  54349. "adds r10, r10, r6\n\t"
  54350. "adc r4, r4, r11\n\t"
  54351. "adds r10, r10, r5\n\t"
  54352. "str r10, [%[a], #460]\n\t"
  54353. "adc r4, r4, #0\n\t"
  54354. /* a[i+116] += m[116] * mu */
  54355. "ldr r7, [%[m], #464]\n\t"
  54356. "ldr r10, [%[a], #464]\n\t"
  54357. "lsr r11, r7, #16\n\t"
  54358. "lsr r6, r8, #16\n\t"
  54359. "mul r5, r6, r11\n\t"
  54360. "lsl r11, r7, #16\n\t"
  54361. "lsr r11, r11, #16\n\t"
  54362. "mul r6, r11, r6\n\t"
  54363. "lsr r11, r6, #16\n\t"
  54364. "lsl r6, r6, #16\n\t"
  54365. "adds r10, r10, r6\n\t"
  54366. "adc r5, r5, r11\n\t"
  54367. "lsl r6, r8, #16\n\t"
  54368. "lsl r11, r7, #16\n\t"
  54369. "lsr r6, r6, #16\n\t"
  54370. "lsr r11, r11, #16\n\t"
  54371. "mul r11, r6, r11\n\t"
  54372. "adds r10, r10, r11\n\t"
  54373. "adc r5, r5, #0\n\t"
  54374. "lsr r11, r7, #16\n\t"
  54375. "mul r6, r11, r6\n\t"
  54376. "lsr r11, r6, #16\n\t"
  54377. "lsl r6, r6, #16\n\t"
  54378. "adds r10, r10, r6\n\t"
  54379. "adc r5, r5, r11\n\t"
  54380. "adds r10, r10, r4\n\t"
  54381. "str r10, [%[a], #464]\n\t"
  54382. "adc r5, r5, #0\n\t"
  54383. /* a[i+117] += m[117] * mu */
  54384. "ldr r7, [%[m], #468]\n\t"
  54385. "ldr r10, [%[a], #468]\n\t"
  54386. "lsr r11, r7, #16\n\t"
  54387. "lsr r6, r8, #16\n\t"
  54388. "mul r4, r6, r11\n\t"
  54389. "lsl r11, r7, #16\n\t"
  54390. "lsr r11, r11, #16\n\t"
  54391. "mul r6, r11, r6\n\t"
  54392. "lsr r11, r6, #16\n\t"
  54393. "lsl r6, r6, #16\n\t"
  54394. "adds r10, r10, r6\n\t"
  54395. "adc r4, r4, r11\n\t"
  54396. "lsl r6, r8, #16\n\t"
  54397. "lsl r11, r7, #16\n\t"
  54398. "lsr r6, r6, #16\n\t"
  54399. "lsr r11, r11, #16\n\t"
  54400. "mul r11, r6, r11\n\t"
  54401. "adds r10, r10, r11\n\t"
  54402. "adc r4, r4, #0\n\t"
  54403. "lsr r11, r7, #16\n\t"
  54404. "mul r6, r11, r6\n\t"
  54405. "lsr r11, r6, #16\n\t"
  54406. "lsl r6, r6, #16\n\t"
  54407. "adds r10, r10, r6\n\t"
  54408. "adc r4, r4, r11\n\t"
  54409. "adds r10, r10, r5\n\t"
  54410. "str r10, [%[a], #468]\n\t"
  54411. "adc r4, r4, #0\n\t"
  54412. /* a[i+118] += m[118] * mu */
  54413. "ldr r7, [%[m], #472]\n\t"
  54414. "ldr r10, [%[a], #472]\n\t"
  54415. "lsr r11, r7, #16\n\t"
  54416. "lsr r6, r8, #16\n\t"
  54417. "mul r5, r6, r11\n\t"
  54418. "lsl r11, r7, #16\n\t"
  54419. "lsr r11, r11, #16\n\t"
  54420. "mul r6, r11, r6\n\t"
  54421. "lsr r11, r6, #16\n\t"
  54422. "lsl r6, r6, #16\n\t"
  54423. "adds r10, r10, r6\n\t"
  54424. "adc r5, r5, r11\n\t"
  54425. "lsl r6, r8, #16\n\t"
  54426. "lsl r11, r7, #16\n\t"
  54427. "lsr r6, r6, #16\n\t"
  54428. "lsr r11, r11, #16\n\t"
  54429. "mul r11, r6, r11\n\t"
  54430. "adds r10, r10, r11\n\t"
  54431. "adc r5, r5, #0\n\t"
  54432. "lsr r11, r7, #16\n\t"
  54433. "mul r6, r11, r6\n\t"
  54434. "lsr r11, r6, #16\n\t"
  54435. "lsl r6, r6, #16\n\t"
  54436. "adds r10, r10, r6\n\t"
  54437. "adc r5, r5, r11\n\t"
  54438. "adds r10, r10, r4\n\t"
  54439. "str r10, [%[a], #472]\n\t"
  54440. "adc r5, r5, #0\n\t"
  54441. /* a[i+119] += m[119] * mu */
  54442. "ldr r7, [%[m], #476]\n\t"
  54443. "ldr r10, [%[a], #476]\n\t"
  54444. "lsr r11, r7, #16\n\t"
  54445. "lsr r6, r8, #16\n\t"
  54446. "mul r4, r6, r11\n\t"
  54447. "lsl r11, r7, #16\n\t"
  54448. "lsr r11, r11, #16\n\t"
  54449. "mul r6, r11, r6\n\t"
  54450. "lsr r11, r6, #16\n\t"
  54451. "lsl r6, r6, #16\n\t"
  54452. "adds r10, r10, r6\n\t"
  54453. "adc r4, r4, r11\n\t"
  54454. "lsl r6, r8, #16\n\t"
  54455. "lsl r11, r7, #16\n\t"
  54456. "lsr r6, r6, #16\n\t"
  54457. "lsr r11, r11, #16\n\t"
  54458. "mul r11, r6, r11\n\t"
  54459. "adds r10, r10, r11\n\t"
  54460. "adc r4, r4, #0\n\t"
  54461. "lsr r11, r7, #16\n\t"
  54462. "mul r6, r11, r6\n\t"
  54463. "lsr r11, r6, #16\n\t"
  54464. "lsl r6, r6, #16\n\t"
  54465. "adds r10, r10, r6\n\t"
  54466. "adc r4, r4, r11\n\t"
  54467. "adds r10, r10, r5\n\t"
  54468. "str r10, [%[a], #476]\n\t"
  54469. "adc r4, r4, #0\n\t"
  54470. /* a[i+120] += m[120] * mu */
  54471. "ldr r7, [%[m], #480]\n\t"
  54472. "ldr r10, [%[a], #480]\n\t"
  54473. "lsr r11, r7, #16\n\t"
  54474. "lsr r6, r8, #16\n\t"
  54475. "mul r5, 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 r5, r5, 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 r5, r5, #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 r5, r5, r11\n\t"
  54496. "adds r10, r10, r4\n\t"
  54497. "str r10, [%[a], #480]\n\t"
  54498. "adc r5, r5, #0\n\t"
  54499. /* a[i+121] += m[121] * mu */
  54500. "ldr r7, [%[m], #484]\n\t"
  54501. "ldr r10, [%[a], #484]\n\t"
  54502. "lsr r11, r7, #16\n\t"
  54503. "lsr r6, r8, #16\n\t"
  54504. "mul r4, r6, r11\n\t"
  54505. "lsl r11, r7, #16\n\t"
  54506. "lsr r11, r11, #16\n\t"
  54507. "mul r6, r11, r6\n\t"
  54508. "lsr r11, r6, #16\n\t"
  54509. "lsl r6, r6, #16\n\t"
  54510. "adds r10, r10, r6\n\t"
  54511. "adc r4, r4, r11\n\t"
  54512. "lsl r6, r8, #16\n\t"
  54513. "lsl r11, r7, #16\n\t"
  54514. "lsr r6, r6, #16\n\t"
  54515. "lsr r11, r11, #16\n\t"
  54516. "mul r11, r6, r11\n\t"
  54517. "adds r10, r10, r11\n\t"
  54518. "adc r4, r4, #0\n\t"
  54519. "lsr r11, r7, #16\n\t"
  54520. "mul r6, r11, r6\n\t"
  54521. "lsr r11, r6, #16\n\t"
  54522. "lsl r6, r6, #16\n\t"
  54523. "adds r10, r10, r6\n\t"
  54524. "adc r4, r4, r11\n\t"
  54525. "adds r10, r10, r5\n\t"
  54526. "str r10, [%[a], #484]\n\t"
  54527. "adc r4, r4, #0\n\t"
  54528. /* a[i+122] += m[122] * mu */
  54529. "ldr r7, [%[m], #488]\n\t"
  54530. "ldr r10, [%[a], #488]\n\t"
  54531. "lsr r11, r7, #16\n\t"
  54532. "lsr r6, r8, #16\n\t"
  54533. "mul r5, r6, r11\n\t"
  54534. "lsl r11, r7, #16\n\t"
  54535. "lsr r11, r11, #16\n\t"
  54536. "mul r6, r11, r6\n\t"
  54537. "lsr r11, r6, #16\n\t"
  54538. "lsl r6, r6, #16\n\t"
  54539. "adds r10, r10, r6\n\t"
  54540. "adc r5, r5, r11\n\t"
  54541. "lsl r6, r8, #16\n\t"
  54542. "lsl r11, r7, #16\n\t"
  54543. "lsr r6, r6, #16\n\t"
  54544. "lsr r11, r11, #16\n\t"
  54545. "mul r11, r6, r11\n\t"
  54546. "adds r10, r10, r11\n\t"
  54547. "adc r5, r5, #0\n\t"
  54548. "lsr r11, r7, #16\n\t"
  54549. "mul r6, r11, r6\n\t"
  54550. "lsr r11, r6, #16\n\t"
  54551. "lsl r6, r6, #16\n\t"
  54552. "adds r10, r10, r6\n\t"
  54553. "adc r5, r5, r11\n\t"
  54554. "adds r10, r10, r4\n\t"
  54555. "str r10, [%[a], #488]\n\t"
  54556. "adc r5, r5, #0\n\t"
  54557. /* a[i+123] += m[123] * mu */
  54558. "ldr r7, [%[m], #492]\n\t"
  54559. "ldr r10, [%[a], #492]\n\t"
  54560. "lsr r11, r7, #16\n\t"
  54561. "lsr r6, r8, #16\n\t"
  54562. "mul r4, r6, r11\n\t"
  54563. "lsl r11, r7, #16\n\t"
  54564. "lsr r11, r11, #16\n\t"
  54565. "mul r6, r11, r6\n\t"
  54566. "lsr r11, r6, #16\n\t"
  54567. "lsl r6, r6, #16\n\t"
  54568. "adds r10, r10, r6\n\t"
  54569. "adc r4, r4, r11\n\t"
  54570. "lsl r6, r8, #16\n\t"
  54571. "lsl r11, r7, #16\n\t"
  54572. "lsr r6, r6, #16\n\t"
  54573. "lsr r11, r11, #16\n\t"
  54574. "mul r11, r6, r11\n\t"
  54575. "adds r10, r10, r11\n\t"
  54576. "adc r4, r4, #0\n\t"
  54577. "lsr r11, r7, #16\n\t"
  54578. "mul r6, r11, r6\n\t"
  54579. "lsr r11, r6, #16\n\t"
  54580. "lsl r6, r6, #16\n\t"
  54581. "adds r10, r10, r6\n\t"
  54582. "adc r4, r4, r11\n\t"
  54583. "adds r10, r10, r5\n\t"
  54584. "str r10, [%[a], #492]\n\t"
  54585. "adc r4, r4, #0\n\t"
  54586. /* a[i+124] += m[124] * mu */
  54587. "ldr r7, [%[m], #496]\n\t"
  54588. "ldr r10, [%[a], #496]\n\t"
  54589. "lsr r11, r7, #16\n\t"
  54590. "lsr r6, r8, #16\n\t"
  54591. "mul r5, r6, r11\n\t"
  54592. "lsl r11, r7, #16\n\t"
  54593. "lsr r11, r11, #16\n\t"
  54594. "mul r6, r11, r6\n\t"
  54595. "lsr r11, r6, #16\n\t"
  54596. "lsl r6, r6, #16\n\t"
  54597. "adds r10, r10, r6\n\t"
  54598. "adc r5, r5, r11\n\t"
  54599. "lsl r6, r8, #16\n\t"
  54600. "lsl r11, r7, #16\n\t"
  54601. "lsr r6, r6, #16\n\t"
  54602. "lsr r11, r11, #16\n\t"
  54603. "mul r11, r6, r11\n\t"
  54604. "adds r10, r10, r11\n\t"
  54605. "adc r5, r5, #0\n\t"
  54606. "lsr r11, r7, #16\n\t"
  54607. "mul r6, r11, r6\n\t"
  54608. "lsr r11, r6, #16\n\t"
  54609. "lsl r6, r6, #16\n\t"
  54610. "adds r10, r10, r6\n\t"
  54611. "adc r5, r5, r11\n\t"
  54612. "adds r10, r10, r4\n\t"
  54613. "str r10, [%[a], #496]\n\t"
  54614. "adc r5, r5, #0\n\t"
  54615. /* a[i+125] += m[125] * mu */
  54616. "ldr r7, [%[m], #500]\n\t"
  54617. "ldr r10, [%[a], #500]\n\t"
  54618. "lsr r11, r7, #16\n\t"
  54619. "lsr r6, r8, #16\n\t"
  54620. "mul r4, r6, r11\n\t"
  54621. "lsl r11, r7, #16\n\t"
  54622. "lsr r11, r11, #16\n\t"
  54623. "mul r6, r11, r6\n\t"
  54624. "lsr r11, r6, #16\n\t"
  54625. "lsl r6, r6, #16\n\t"
  54626. "adds r10, r10, r6\n\t"
  54627. "adc r4, r4, r11\n\t"
  54628. "lsl r6, r8, #16\n\t"
  54629. "lsl r11, r7, #16\n\t"
  54630. "lsr r6, r6, #16\n\t"
  54631. "lsr r11, r11, #16\n\t"
  54632. "mul r11, r6, r11\n\t"
  54633. "adds r10, r10, r11\n\t"
  54634. "adc r4, r4, #0\n\t"
  54635. "lsr r11, r7, #16\n\t"
  54636. "mul r6, r11, r6\n\t"
  54637. "lsr r11, r6, #16\n\t"
  54638. "lsl r6, r6, #16\n\t"
  54639. "adds r10, r10, r6\n\t"
  54640. "adc r4, r4, r11\n\t"
  54641. "adds r10, r10, r5\n\t"
  54642. "str r10, [%[a], #500]\n\t"
  54643. "adc r4, r4, #0\n\t"
  54644. /* a[i+126] += m[126] * mu */
  54645. "ldr r7, [%[m], #504]\n\t"
  54646. "ldr r10, [%[a], #504]\n\t"
  54647. "lsr r11, r7, #16\n\t"
  54648. "lsr r6, r8, #16\n\t"
  54649. "mul r5, r6, r11\n\t"
  54650. "lsl r11, r7, #16\n\t"
  54651. "lsr r11, r11, #16\n\t"
  54652. "mul r6, r11, r6\n\t"
  54653. "lsr r11, r6, #16\n\t"
  54654. "lsl r6, r6, #16\n\t"
  54655. "adds r10, r10, r6\n\t"
  54656. "adc r5, r5, r11\n\t"
  54657. "lsl r6, r8, #16\n\t"
  54658. "lsl r11, r7, #16\n\t"
  54659. "lsr r6, r6, #16\n\t"
  54660. "lsr r11, r11, #16\n\t"
  54661. "mul r11, r6, r11\n\t"
  54662. "adds r10, r10, r11\n\t"
  54663. "adc r5, r5, #0\n\t"
  54664. "lsr r11, r7, #16\n\t"
  54665. "mul r6, r11, r6\n\t"
  54666. "lsr r11, r6, #16\n\t"
  54667. "lsl r6, r6, #16\n\t"
  54668. "adds r10, r10, r6\n\t"
  54669. "adc r5, r5, r11\n\t"
  54670. "adds r10, r10, r4\n\t"
  54671. "str r10, [%[a], #504]\n\t"
  54672. "adc r5, r5, #0\n\t"
  54673. /* a[i+127] += m[127] * mu */
  54674. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  54675. "ldr r11, [%[m], #508]\n\t"
  54676. #else
  54677. "ldr r7, [%[m], #508]\n\t"
  54678. #endif
  54679. "ldr r10, [%[a], #508]\n\t"
  54680. "lsl r6, r8, #16\n\t"
  54681. "lsl r7, r11, #16\n\t"
  54682. "lsr r6, r6, #16\n\t"
  54683. "lsr r7, r7, #16\n\t"
  54684. "mul r7, r6, r7\n\t"
  54685. "adds r5, r5, r7\n\t"
  54686. "adcs r4, r3, #0\n\t"
  54687. "mov r3, #0\n\t"
  54688. "adc r3, r3, r3\n\t"
  54689. "lsr r7, r11, #16\n\t"
  54690. "mul r6, r7, r6\n\t"
  54691. "lsr r7, r6, #16\n\t"
  54692. "lsl r6, r6, #16\n\t"
  54693. "adds r5, r5, r6\n\t"
  54694. "adcs r4, r4, r7\n\t"
  54695. "adc r3, r3, #0\n\t"
  54696. "mov r6, r8\n\t"
  54697. "lsr r7, r11, #16\n\t"
  54698. "lsr r6, r6, #16\n\t"
  54699. "mul r7, r6, r7\n\t"
  54700. "adds r4, r4, r7\n\t"
  54701. "lsl r7, r11, #16\n\t"
  54702. "adc r3, r3, #0\n\t"
  54703. "lsr r7, r7, #16\n\t"
  54704. "mul r6, r7, r6\n\t"
  54705. "lsr r7, r6, #16\n\t"
  54706. "lsl r6, r6, #16\n\t"
  54707. "adds r5, r5, r6\n\t"
  54708. "adcs r4, r4, r7\n\t"
  54709. "adc r3, r3, #0\n\t"
  54710. "adds r10, r10, r5\n\t"
  54711. "str r10, [%[a], #508]\n\t"
  54712. "ldr r10, [%[a], #512]\n\t"
  54713. "adcs r10, r10, r4\n\t"
  54714. "str r10, [%[a], #512]\n\t"
  54715. "adc r3, r3, #0\n\t"
  54716. /* i += 1 */
  54717. "add r9, r9, #4\n\t"
  54718. "add %[a], %[a], #4\n\t"
  54719. "cmp r9, #0x200\n\t"
  54720. "blt L_sp_4096_mont_reduce_128_word_%=\n\t"
  54721. /* Loop Done */
  54722. "str r12, [%[a]]\n\t"
  54723. "str lr, [%[a], #4]\n\t"
  54724. "mov %[mp], r3\n\t"
  54725. : [a] "+r" (a), [m] "+r" (m), [mp] "+r" (mp)
  54726. :
  54727. : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "cc"
  54728. );
  54729. sp_4096_cond_sub_128(a - 128, a, m, (sp_digit)0 - mp);
  54730. }
  54731. #elif defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  54732. /* Reduce the number back to 4096 bits using Montgomery reduction.
  54733. *
  54734. * a A single precision number to reduce in place.
  54735. * m The single precision number representing the modulus.
  54736. * mp The digit representing the negative inverse of m mod 2^n.
  54737. */
  54738. static SP_NOINLINE void sp_4096_mont_reduce_128(sp_digit* a_p, const sp_digit* m_p, sp_digit mp_p)
  54739. {
  54740. register sp_digit* a asm ("r0") = (sp_digit*)a_p;
  54741. register const sp_digit* m asm ("r1") = (const sp_digit*)m_p;
  54742. register sp_digit mp asm ("r2") = (sp_digit)mp_p;
  54743. __asm__ __volatile__ (
  54744. "ldr r11, [%[m]]\n\t"
  54745. /* i = 0 */
  54746. "mov r9, #0\n\t"
  54747. "mov r3, #0\n\t"
  54748. "ldr r12, [%[a]]\n\t"
  54749. "ldr lr, [%[a], #4]\n\t"
  54750. "\n"
  54751. "L_sp_4096_mont_reduce_128_word_%=: \n\t"
  54752. /* mu = a[i] * mp */
  54753. "mul r8, %[mp], r12\n\t"
  54754. /* a[i+0] += m[0] * mu */
  54755. "mov r5, #0\n\t"
  54756. "umlal r12, r5, r8, r11\n\t"
  54757. /* a[i+1] += m[1] * mu */
  54758. "ldr r7, [%[m], #4]\n\t"
  54759. "mov r4, #0\n\t"
  54760. "umlal lr, r4, r8, r7\n\t"
  54761. "mov r12, lr\n\t"
  54762. "adds r12, r12, r5\n\t"
  54763. "adc r4, r4, #0\n\t"
  54764. /* a[i+2] += m[2] * mu */
  54765. "ldr r7, [%[m], #8]\n\t"
  54766. "ldr lr, [%[a], #8]\n\t"
  54767. "mov r5, #0\n\t"
  54768. "umlal lr, r5, r8, r7\n\t"
  54769. "adds lr, lr, r4\n\t"
  54770. "adc r5, r5, #0\n\t"
  54771. /* a[i+3] += m[3] * mu */
  54772. "ldr r7, [%[m], #12]\n\t"
  54773. "ldr r10, [%[a], #12]\n\t"
  54774. "mov r4, #0\n\t"
  54775. "umlal r10, r4, r8, r7\n\t"
  54776. "adds r10, r10, r5\n\t"
  54777. "str r10, [%[a], #12]\n\t"
  54778. "adc r4, r4, #0\n\t"
  54779. /* a[i+4] += m[4] * mu */
  54780. "ldr r7, [%[m], #16]\n\t"
  54781. "ldr r10, [%[a], #16]\n\t"
  54782. "mov r5, #0\n\t"
  54783. "umlal r10, r5, r8, r7\n\t"
  54784. "adds r10, r10, r4\n\t"
  54785. "str r10, [%[a], #16]\n\t"
  54786. "adc r5, r5, #0\n\t"
  54787. /* a[i+5] += m[5] * mu */
  54788. "ldr r7, [%[m], #20]\n\t"
  54789. "ldr r10, [%[a], #20]\n\t"
  54790. "mov r4, #0\n\t"
  54791. "umlal r10, r4, r8, r7\n\t"
  54792. "adds r10, r10, r5\n\t"
  54793. "str r10, [%[a], #20]\n\t"
  54794. "adc r4, r4, #0\n\t"
  54795. /* a[i+6] += m[6] * mu */
  54796. "ldr r7, [%[m], #24]\n\t"
  54797. "ldr r10, [%[a], #24]\n\t"
  54798. "mov r5, #0\n\t"
  54799. "umlal r10, r5, r8, r7\n\t"
  54800. "adds r10, r10, r4\n\t"
  54801. "str r10, [%[a], #24]\n\t"
  54802. "adc r5, r5, #0\n\t"
  54803. /* a[i+7] += m[7] * mu */
  54804. "ldr r7, [%[m], #28]\n\t"
  54805. "ldr r10, [%[a], #28]\n\t"
  54806. "mov r4, #0\n\t"
  54807. "umlal r10, r4, r8, r7\n\t"
  54808. "adds r10, r10, r5\n\t"
  54809. "str r10, [%[a], #28]\n\t"
  54810. "adc r4, r4, #0\n\t"
  54811. /* a[i+8] += m[8] * mu */
  54812. "ldr r7, [%[m], #32]\n\t"
  54813. "ldr r10, [%[a], #32]\n\t"
  54814. "mov r5, #0\n\t"
  54815. "umlal r10, r5, r8, r7\n\t"
  54816. "adds r10, r10, r4\n\t"
  54817. "str r10, [%[a], #32]\n\t"
  54818. "adc r5, r5, #0\n\t"
  54819. /* a[i+9] += m[9] * mu */
  54820. "ldr r7, [%[m], #36]\n\t"
  54821. "ldr r10, [%[a], #36]\n\t"
  54822. "mov r4, #0\n\t"
  54823. "umlal r10, r4, r8, r7\n\t"
  54824. "adds r10, r10, r5\n\t"
  54825. "str r10, [%[a], #36]\n\t"
  54826. "adc r4, r4, #0\n\t"
  54827. /* a[i+10] += m[10] * mu */
  54828. "ldr r7, [%[m], #40]\n\t"
  54829. "ldr r10, [%[a], #40]\n\t"
  54830. "mov r5, #0\n\t"
  54831. "umlal r10, r5, r8, r7\n\t"
  54832. "adds r10, r10, r4\n\t"
  54833. "str r10, [%[a], #40]\n\t"
  54834. "adc r5, r5, #0\n\t"
  54835. /* a[i+11] += m[11] * mu */
  54836. "ldr r7, [%[m], #44]\n\t"
  54837. "ldr r10, [%[a], #44]\n\t"
  54838. "mov r4, #0\n\t"
  54839. "umlal r10, r4, r8, r7\n\t"
  54840. "adds r10, r10, r5\n\t"
  54841. "str r10, [%[a], #44]\n\t"
  54842. "adc r4, r4, #0\n\t"
  54843. /* a[i+12] += m[12] * mu */
  54844. "ldr r7, [%[m], #48]\n\t"
  54845. "ldr r10, [%[a], #48]\n\t"
  54846. "mov r5, #0\n\t"
  54847. "umlal r10, r5, r8, r7\n\t"
  54848. "adds r10, r10, r4\n\t"
  54849. "str r10, [%[a], #48]\n\t"
  54850. "adc r5, r5, #0\n\t"
  54851. /* a[i+13] += m[13] * mu */
  54852. "ldr r7, [%[m], #52]\n\t"
  54853. "ldr r10, [%[a], #52]\n\t"
  54854. "mov r4, #0\n\t"
  54855. "umlal r10, r4, r8, r7\n\t"
  54856. "adds r10, r10, r5\n\t"
  54857. "str r10, [%[a], #52]\n\t"
  54858. "adc r4, r4, #0\n\t"
  54859. /* a[i+14] += m[14] * mu */
  54860. "ldr r7, [%[m], #56]\n\t"
  54861. "ldr r10, [%[a], #56]\n\t"
  54862. "mov r5, #0\n\t"
  54863. "umlal r10, r5, r8, r7\n\t"
  54864. "adds r10, r10, r4\n\t"
  54865. "str r10, [%[a], #56]\n\t"
  54866. "adc r5, r5, #0\n\t"
  54867. /* a[i+15] += m[15] * mu */
  54868. "ldr r7, [%[m], #60]\n\t"
  54869. "ldr r10, [%[a], #60]\n\t"
  54870. "mov r4, #0\n\t"
  54871. "umlal r10, r4, r8, r7\n\t"
  54872. "adds r10, r10, r5\n\t"
  54873. "str r10, [%[a], #60]\n\t"
  54874. "adc r4, r4, #0\n\t"
  54875. /* a[i+16] += m[16] * mu */
  54876. "ldr r7, [%[m], #64]\n\t"
  54877. "ldr r10, [%[a], #64]\n\t"
  54878. "mov r5, #0\n\t"
  54879. "umlal r10, r5, r8, r7\n\t"
  54880. "adds r10, r10, r4\n\t"
  54881. "str r10, [%[a], #64]\n\t"
  54882. "adc r5, r5, #0\n\t"
  54883. /* a[i+17] += m[17] * mu */
  54884. "ldr r7, [%[m], #68]\n\t"
  54885. "ldr r10, [%[a], #68]\n\t"
  54886. "mov r4, #0\n\t"
  54887. "umlal r10, r4, r8, r7\n\t"
  54888. "adds r10, r10, r5\n\t"
  54889. "str r10, [%[a], #68]\n\t"
  54890. "adc r4, r4, #0\n\t"
  54891. /* a[i+18] += m[18] * mu */
  54892. "ldr r7, [%[m], #72]\n\t"
  54893. "ldr r10, [%[a], #72]\n\t"
  54894. "mov r5, #0\n\t"
  54895. "umlal r10, r5, r8, r7\n\t"
  54896. "adds r10, r10, r4\n\t"
  54897. "str r10, [%[a], #72]\n\t"
  54898. "adc r5, r5, #0\n\t"
  54899. /* a[i+19] += m[19] * mu */
  54900. "ldr r7, [%[m], #76]\n\t"
  54901. "ldr r10, [%[a], #76]\n\t"
  54902. "mov r4, #0\n\t"
  54903. "umlal r10, r4, r8, r7\n\t"
  54904. "adds r10, r10, r5\n\t"
  54905. "str r10, [%[a], #76]\n\t"
  54906. "adc r4, r4, #0\n\t"
  54907. /* a[i+20] += m[20] * mu */
  54908. "ldr r7, [%[m], #80]\n\t"
  54909. "ldr r10, [%[a], #80]\n\t"
  54910. "mov r5, #0\n\t"
  54911. "umlal r10, r5, r8, r7\n\t"
  54912. "adds r10, r10, r4\n\t"
  54913. "str r10, [%[a], #80]\n\t"
  54914. "adc r5, r5, #0\n\t"
  54915. /* a[i+21] += m[21] * mu */
  54916. "ldr r7, [%[m], #84]\n\t"
  54917. "ldr r10, [%[a], #84]\n\t"
  54918. "mov r4, #0\n\t"
  54919. "umlal r10, r4, r8, r7\n\t"
  54920. "adds r10, r10, r5\n\t"
  54921. "str r10, [%[a], #84]\n\t"
  54922. "adc r4, r4, #0\n\t"
  54923. /* a[i+22] += m[22] * mu */
  54924. "ldr r7, [%[m], #88]\n\t"
  54925. "ldr r10, [%[a], #88]\n\t"
  54926. "mov r5, #0\n\t"
  54927. "umlal r10, r5, r8, r7\n\t"
  54928. "adds r10, r10, r4\n\t"
  54929. "str r10, [%[a], #88]\n\t"
  54930. "adc r5, r5, #0\n\t"
  54931. /* a[i+23] += m[23] * mu */
  54932. "ldr r7, [%[m], #92]\n\t"
  54933. "ldr r10, [%[a], #92]\n\t"
  54934. "mov r4, #0\n\t"
  54935. "umlal r10, r4, r8, r7\n\t"
  54936. "adds r10, r10, r5\n\t"
  54937. "str r10, [%[a], #92]\n\t"
  54938. "adc r4, r4, #0\n\t"
  54939. /* a[i+24] += m[24] * mu */
  54940. "ldr r7, [%[m], #96]\n\t"
  54941. "ldr r10, [%[a], #96]\n\t"
  54942. "mov r5, #0\n\t"
  54943. "umlal r10, r5, r8, r7\n\t"
  54944. "adds r10, r10, r4\n\t"
  54945. "str r10, [%[a], #96]\n\t"
  54946. "adc r5, r5, #0\n\t"
  54947. /* a[i+25] += m[25] * mu */
  54948. "ldr r7, [%[m], #100]\n\t"
  54949. "ldr r10, [%[a], #100]\n\t"
  54950. "mov r4, #0\n\t"
  54951. "umlal r10, r4, r8, r7\n\t"
  54952. "adds r10, r10, r5\n\t"
  54953. "str r10, [%[a], #100]\n\t"
  54954. "adc r4, r4, #0\n\t"
  54955. /* a[i+26] += m[26] * mu */
  54956. "ldr r7, [%[m], #104]\n\t"
  54957. "ldr r10, [%[a], #104]\n\t"
  54958. "mov r5, #0\n\t"
  54959. "umlal r10, r5, r8, r7\n\t"
  54960. "adds r10, r10, r4\n\t"
  54961. "str r10, [%[a], #104]\n\t"
  54962. "adc r5, r5, #0\n\t"
  54963. /* a[i+27] += m[27] * mu */
  54964. "ldr r7, [%[m], #108]\n\t"
  54965. "ldr r10, [%[a], #108]\n\t"
  54966. "mov r4, #0\n\t"
  54967. "umlal r10, r4, r8, r7\n\t"
  54968. "adds r10, r10, r5\n\t"
  54969. "str r10, [%[a], #108]\n\t"
  54970. "adc r4, r4, #0\n\t"
  54971. /* a[i+28] += m[28] * mu */
  54972. "ldr r7, [%[m], #112]\n\t"
  54973. "ldr r10, [%[a], #112]\n\t"
  54974. "mov r5, #0\n\t"
  54975. "umlal r10, r5, r8, r7\n\t"
  54976. "adds r10, r10, r4\n\t"
  54977. "str r10, [%[a], #112]\n\t"
  54978. "adc r5, r5, #0\n\t"
  54979. /* a[i+29] += m[29] * mu */
  54980. "ldr r7, [%[m], #116]\n\t"
  54981. "ldr r10, [%[a], #116]\n\t"
  54982. "mov r4, #0\n\t"
  54983. "umlal r10, r4, r8, r7\n\t"
  54984. "adds r10, r10, r5\n\t"
  54985. "str r10, [%[a], #116]\n\t"
  54986. "adc r4, r4, #0\n\t"
  54987. /* a[i+30] += m[30] * mu */
  54988. "ldr r7, [%[m], #120]\n\t"
  54989. "ldr r10, [%[a], #120]\n\t"
  54990. "mov r5, #0\n\t"
  54991. "umlal r10, r5, r8, r7\n\t"
  54992. "adds r10, r10, r4\n\t"
  54993. "str r10, [%[a], #120]\n\t"
  54994. "adc r5, r5, #0\n\t"
  54995. /* a[i+31] += m[31] * mu */
  54996. "ldr r7, [%[m], #124]\n\t"
  54997. "ldr r10, [%[a], #124]\n\t"
  54998. "mov r4, #0\n\t"
  54999. "umlal r10, r4, r8, r7\n\t"
  55000. "adds r10, r10, r5\n\t"
  55001. "str r10, [%[a], #124]\n\t"
  55002. "adc r4, r4, #0\n\t"
  55003. /* a[i+32] += m[32] * mu */
  55004. "ldr r7, [%[m], #128]\n\t"
  55005. "ldr r10, [%[a], #128]\n\t"
  55006. "mov r5, #0\n\t"
  55007. "umlal r10, r5, r8, r7\n\t"
  55008. "adds r10, r10, r4\n\t"
  55009. "str r10, [%[a], #128]\n\t"
  55010. "adc r5, r5, #0\n\t"
  55011. /* a[i+33] += m[33] * mu */
  55012. "ldr r7, [%[m], #132]\n\t"
  55013. "ldr r10, [%[a], #132]\n\t"
  55014. "mov r4, #0\n\t"
  55015. "umlal r10, r4, r8, r7\n\t"
  55016. "adds r10, r10, r5\n\t"
  55017. "str r10, [%[a], #132]\n\t"
  55018. "adc r4, r4, #0\n\t"
  55019. /* a[i+34] += m[34] * mu */
  55020. "ldr r7, [%[m], #136]\n\t"
  55021. "ldr r10, [%[a], #136]\n\t"
  55022. "mov r5, #0\n\t"
  55023. "umlal r10, r5, r8, r7\n\t"
  55024. "adds r10, r10, r4\n\t"
  55025. "str r10, [%[a], #136]\n\t"
  55026. "adc r5, r5, #0\n\t"
  55027. /* a[i+35] += m[35] * mu */
  55028. "ldr r7, [%[m], #140]\n\t"
  55029. "ldr r10, [%[a], #140]\n\t"
  55030. "mov r4, #0\n\t"
  55031. "umlal r10, r4, r8, r7\n\t"
  55032. "adds r10, r10, r5\n\t"
  55033. "str r10, [%[a], #140]\n\t"
  55034. "adc r4, r4, #0\n\t"
  55035. /* a[i+36] += m[36] * mu */
  55036. "ldr r7, [%[m], #144]\n\t"
  55037. "ldr r10, [%[a], #144]\n\t"
  55038. "mov r5, #0\n\t"
  55039. "umlal r10, r5, r8, r7\n\t"
  55040. "adds r10, r10, r4\n\t"
  55041. "str r10, [%[a], #144]\n\t"
  55042. "adc r5, r5, #0\n\t"
  55043. /* a[i+37] += m[37] * mu */
  55044. "ldr r7, [%[m], #148]\n\t"
  55045. "ldr r10, [%[a], #148]\n\t"
  55046. "mov r4, #0\n\t"
  55047. "umlal r10, r4, r8, r7\n\t"
  55048. "adds r10, r10, r5\n\t"
  55049. "str r10, [%[a], #148]\n\t"
  55050. "adc r4, r4, #0\n\t"
  55051. /* a[i+38] += m[38] * mu */
  55052. "ldr r7, [%[m], #152]\n\t"
  55053. "ldr r10, [%[a], #152]\n\t"
  55054. "mov r5, #0\n\t"
  55055. "umlal r10, r5, r8, r7\n\t"
  55056. "adds r10, r10, r4\n\t"
  55057. "str r10, [%[a], #152]\n\t"
  55058. "adc r5, r5, #0\n\t"
  55059. /* a[i+39] += m[39] * mu */
  55060. "ldr r7, [%[m], #156]\n\t"
  55061. "ldr r10, [%[a], #156]\n\t"
  55062. "mov r4, #0\n\t"
  55063. "umlal r10, r4, r8, r7\n\t"
  55064. "adds r10, r10, r5\n\t"
  55065. "str r10, [%[a], #156]\n\t"
  55066. "adc r4, r4, #0\n\t"
  55067. /* a[i+40] += m[40] * mu */
  55068. "ldr r7, [%[m], #160]\n\t"
  55069. "ldr r10, [%[a], #160]\n\t"
  55070. "mov r5, #0\n\t"
  55071. "umlal r10, r5, r8, r7\n\t"
  55072. "adds r10, r10, r4\n\t"
  55073. "str r10, [%[a], #160]\n\t"
  55074. "adc r5, r5, #0\n\t"
  55075. /* a[i+41] += m[41] * mu */
  55076. "ldr r7, [%[m], #164]\n\t"
  55077. "ldr r10, [%[a], #164]\n\t"
  55078. "mov r4, #0\n\t"
  55079. "umlal r10, r4, r8, r7\n\t"
  55080. "adds r10, r10, r5\n\t"
  55081. "str r10, [%[a], #164]\n\t"
  55082. "adc r4, r4, #0\n\t"
  55083. /* a[i+42] += m[42] * mu */
  55084. "ldr r7, [%[m], #168]\n\t"
  55085. "ldr r10, [%[a], #168]\n\t"
  55086. "mov r5, #0\n\t"
  55087. "umlal r10, r5, r8, r7\n\t"
  55088. "adds r10, r10, r4\n\t"
  55089. "str r10, [%[a], #168]\n\t"
  55090. "adc r5, r5, #0\n\t"
  55091. /* a[i+43] += m[43] * mu */
  55092. "ldr r7, [%[m], #172]\n\t"
  55093. "ldr r10, [%[a], #172]\n\t"
  55094. "mov r4, #0\n\t"
  55095. "umlal r10, r4, r8, r7\n\t"
  55096. "adds r10, r10, r5\n\t"
  55097. "str r10, [%[a], #172]\n\t"
  55098. "adc r4, r4, #0\n\t"
  55099. /* a[i+44] += m[44] * mu */
  55100. "ldr r7, [%[m], #176]\n\t"
  55101. "ldr r10, [%[a], #176]\n\t"
  55102. "mov r5, #0\n\t"
  55103. "umlal r10, r5, r8, r7\n\t"
  55104. "adds r10, r10, r4\n\t"
  55105. "str r10, [%[a], #176]\n\t"
  55106. "adc r5, r5, #0\n\t"
  55107. /* a[i+45] += m[45] * mu */
  55108. "ldr r7, [%[m], #180]\n\t"
  55109. "ldr r10, [%[a], #180]\n\t"
  55110. "mov r4, #0\n\t"
  55111. "umlal r10, r4, r8, r7\n\t"
  55112. "adds r10, r10, r5\n\t"
  55113. "str r10, [%[a], #180]\n\t"
  55114. "adc r4, r4, #0\n\t"
  55115. /* a[i+46] += m[46] * mu */
  55116. "ldr r7, [%[m], #184]\n\t"
  55117. "ldr r10, [%[a], #184]\n\t"
  55118. "mov r5, #0\n\t"
  55119. "umlal r10, r5, r8, r7\n\t"
  55120. "adds r10, r10, r4\n\t"
  55121. "str r10, [%[a], #184]\n\t"
  55122. "adc r5, r5, #0\n\t"
  55123. /* a[i+47] += m[47] * mu */
  55124. "ldr r7, [%[m], #188]\n\t"
  55125. "ldr r10, [%[a], #188]\n\t"
  55126. "mov r4, #0\n\t"
  55127. "umlal r10, r4, r8, r7\n\t"
  55128. "adds r10, r10, r5\n\t"
  55129. "str r10, [%[a], #188]\n\t"
  55130. "adc r4, r4, #0\n\t"
  55131. /* a[i+48] += m[48] * mu */
  55132. "ldr r7, [%[m], #192]\n\t"
  55133. "ldr r10, [%[a], #192]\n\t"
  55134. "mov r5, #0\n\t"
  55135. "umlal r10, r5, r8, r7\n\t"
  55136. "adds r10, r10, r4\n\t"
  55137. "str r10, [%[a], #192]\n\t"
  55138. "adc r5, r5, #0\n\t"
  55139. /* a[i+49] += m[49] * mu */
  55140. "ldr r7, [%[m], #196]\n\t"
  55141. "ldr r10, [%[a], #196]\n\t"
  55142. "mov r4, #0\n\t"
  55143. "umlal r10, r4, r8, r7\n\t"
  55144. "adds r10, r10, r5\n\t"
  55145. "str r10, [%[a], #196]\n\t"
  55146. "adc r4, r4, #0\n\t"
  55147. /* a[i+50] += m[50] * mu */
  55148. "ldr r7, [%[m], #200]\n\t"
  55149. "ldr r10, [%[a], #200]\n\t"
  55150. "mov r5, #0\n\t"
  55151. "umlal r10, r5, r8, r7\n\t"
  55152. "adds r10, r10, r4\n\t"
  55153. "str r10, [%[a], #200]\n\t"
  55154. "adc r5, r5, #0\n\t"
  55155. /* a[i+51] += m[51] * mu */
  55156. "ldr r7, [%[m], #204]\n\t"
  55157. "ldr r10, [%[a], #204]\n\t"
  55158. "mov r4, #0\n\t"
  55159. "umlal r10, r4, r8, r7\n\t"
  55160. "adds r10, r10, r5\n\t"
  55161. "str r10, [%[a], #204]\n\t"
  55162. "adc r4, r4, #0\n\t"
  55163. /* a[i+52] += m[52] * mu */
  55164. "ldr r7, [%[m], #208]\n\t"
  55165. "ldr r10, [%[a], #208]\n\t"
  55166. "mov r5, #0\n\t"
  55167. "umlal r10, r5, r8, r7\n\t"
  55168. "adds r10, r10, r4\n\t"
  55169. "str r10, [%[a], #208]\n\t"
  55170. "adc r5, r5, #0\n\t"
  55171. /* a[i+53] += m[53] * mu */
  55172. "ldr r7, [%[m], #212]\n\t"
  55173. "ldr r10, [%[a], #212]\n\t"
  55174. "mov r4, #0\n\t"
  55175. "umlal r10, r4, r8, r7\n\t"
  55176. "adds r10, r10, r5\n\t"
  55177. "str r10, [%[a], #212]\n\t"
  55178. "adc r4, r4, #0\n\t"
  55179. /* a[i+54] += m[54] * mu */
  55180. "ldr r7, [%[m], #216]\n\t"
  55181. "ldr r10, [%[a], #216]\n\t"
  55182. "mov r5, #0\n\t"
  55183. "umlal r10, r5, r8, r7\n\t"
  55184. "adds r10, r10, r4\n\t"
  55185. "str r10, [%[a], #216]\n\t"
  55186. "adc r5, r5, #0\n\t"
  55187. /* a[i+55] += m[55] * mu */
  55188. "ldr r7, [%[m], #220]\n\t"
  55189. "ldr r10, [%[a], #220]\n\t"
  55190. "mov r4, #0\n\t"
  55191. "umlal r10, r4, r8, r7\n\t"
  55192. "adds r10, r10, r5\n\t"
  55193. "str r10, [%[a], #220]\n\t"
  55194. "adc r4, r4, #0\n\t"
  55195. /* a[i+56] += m[56] * mu */
  55196. "ldr r7, [%[m], #224]\n\t"
  55197. "ldr r10, [%[a], #224]\n\t"
  55198. "mov r5, #0\n\t"
  55199. "umlal r10, r5, r8, r7\n\t"
  55200. "adds r10, r10, r4\n\t"
  55201. "str r10, [%[a], #224]\n\t"
  55202. "adc r5, r5, #0\n\t"
  55203. /* a[i+57] += m[57] * mu */
  55204. "ldr r7, [%[m], #228]\n\t"
  55205. "ldr r10, [%[a], #228]\n\t"
  55206. "mov r4, #0\n\t"
  55207. "umlal r10, r4, r8, r7\n\t"
  55208. "adds r10, r10, r5\n\t"
  55209. "str r10, [%[a], #228]\n\t"
  55210. "adc r4, r4, #0\n\t"
  55211. /* a[i+58] += m[58] * mu */
  55212. "ldr r7, [%[m], #232]\n\t"
  55213. "ldr r10, [%[a], #232]\n\t"
  55214. "mov r5, #0\n\t"
  55215. "umlal r10, r5, r8, r7\n\t"
  55216. "adds r10, r10, r4\n\t"
  55217. "str r10, [%[a], #232]\n\t"
  55218. "adc r5, r5, #0\n\t"
  55219. /* a[i+59] += m[59] * mu */
  55220. "ldr r7, [%[m], #236]\n\t"
  55221. "ldr r10, [%[a], #236]\n\t"
  55222. "mov r4, #0\n\t"
  55223. "umlal r10, r4, r8, r7\n\t"
  55224. "adds r10, r10, r5\n\t"
  55225. "str r10, [%[a], #236]\n\t"
  55226. "adc r4, r4, #0\n\t"
  55227. /* a[i+60] += m[60] * mu */
  55228. "ldr r7, [%[m], #240]\n\t"
  55229. "ldr r10, [%[a], #240]\n\t"
  55230. "mov r5, #0\n\t"
  55231. "umlal r10, r5, r8, r7\n\t"
  55232. "adds r10, r10, r4\n\t"
  55233. "str r10, [%[a], #240]\n\t"
  55234. "adc r5, r5, #0\n\t"
  55235. /* a[i+61] += m[61] * mu */
  55236. "ldr r7, [%[m], #244]\n\t"
  55237. "ldr r10, [%[a], #244]\n\t"
  55238. "mov r4, #0\n\t"
  55239. "umlal r10, r4, r8, r7\n\t"
  55240. "adds r10, r10, r5\n\t"
  55241. "str r10, [%[a], #244]\n\t"
  55242. "adc r4, r4, #0\n\t"
  55243. /* a[i+62] += m[62] * mu */
  55244. "ldr r7, [%[m], #248]\n\t"
  55245. "ldr r10, [%[a], #248]\n\t"
  55246. "mov r5, #0\n\t"
  55247. "umlal r10, r5, r8, r7\n\t"
  55248. "adds r10, r10, r4\n\t"
  55249. "str r10, [%[a], #248]\n\t"
  55250. "adc r5, r5, #0\n\t"
  55251. /* a[i+63] += m[63] * mu */
  55252. "ldr r7, [%[m], #252]\n\t"
  55253. "ldr r10, [%[a], #252]\n\t"
  55254. "mov r4, #0\n\t"
  55255. "umlal r10, r4, r8, r7\n\t"
  55256. "adds r10, r10, r5\n\t"
  55257. "str r10, [%[a], #252]\n\t"
  55258. "adc r4, r4, #0\n\t"
  55259. /* a[i+64] += m[64] * mu */
  55260. "ldr r7, [%[m], #256]\n\t"
  55261. "ldr r10, [%[a], #256]\n\t"
  55262. "mov r5, #0\n\t"
  55263. "umlal r10, r5, r8, r7\n\t"
  55264. "adds r10, r10, r4\n\t"
  55265. "str r10, [%[a], #256]\n\t"
  55266. "adc r5, r5, #0\n\t"
  55267. /* a[i+65] += m[65] * mu */
  55268. "ldr r7, [%[m], #260]\n\t"
  55269. "ldr r10, [%[a], #260]\n\t"
  55270. "mov r4, #0\n\t"
  55271. "umlal r10, r4, r8, r7\n\t"
  55272. "adds r10, r10, r5\n\t"
  55273. "str r10, [%[a], #260]\n\t"
  55274. "adc r4, r4, #0\n\t"
  55275. /* a[i+66] += m[66] * mu */
  55276. "ldr r7, [%[m], #264]\n\t"
  55277. "ldr r10, [%[a], #264]\n\t"
  55278. "mov r5, #0\n\t"
  55279. "umlal r10, r5, r8, r7\n\t"
  55280. "adds r10, r10, r4\n\t"
  55281. "str r10, [%[a], #264]\n\t"
  55282. "adc r5, r5, #0\n\t"
  55283. /* a[i+67] += m[67] * mu */
  55284. "ldr r7, [%[m], #268]\n\t"
  55285. "ldr r10, [%[a], #268]\n\t"
  55286. "mov r4, #0\n\t"
  55287. "umlal r10, r4, r8, r7\n\t"
  55288. "adds r10, r10, r5\n\t"
  55289. "str r10, [%[a], #268]\n\t"
  55290. "adc r4, r4, #0\n\t"
  55291. /* a[i+68] += m[68] * mu */
  55292. "ldr r7, [%[m], #272]\n\t"
  55293. "ldr r10, [%[a], #272]\n\t"
  55294. "mov r5, #0\n\t"
  55295. "umlal r10, r5, r8, r7\n\t"
  55296. "adds r10, r10, r4\n\t"
  55297. "str r10, [%[a], #272]\n\t"
  55298. "adc r5, r5, #0\n\t"
  55299. /* a[i+69] += m[69] * mu */
  55300. "ldr r7, [%[m], #276]\n\t"
  55301. "ldr r10, [%[a], #276]\n\t"
  55302. "mov r4, #0\n\t"
  55303. "umlal r10, r4, r8, r7\n\t"
  55304. "adds r10, r10, r5\n\t"
  55305. "str r10, [%[a], #276]\n\t"
  55306. "adc r4, r4, #0\n\t"
  55307. /* a[i+70] += m[70] * mu */
  55308. "ldr r7, [%[m], #280]\n\t"
  55309. "ldr r10, [%[a], #280]\n\t"
  55310. "mov r5, #0\n\t"
  55311. "umlal r10, r5, r8, r7\n\t"
  55312. "adds r10, r10, r4\n\t"
  55313. "str r10, [%[a], #280]\n\t"
  55314. "adc r5, r5, #0\n\t"
  55315. /* a[i+71] += m[71] * mu */
  55316. "ldr r7, [%[m], #284]\n\t"
  55317. "ldr r10, [%[a], #284]\n\t"
  55318. "mov r4, #0\n\t"
  55319. "umlal r10, r4, r8, r7\n\t"
  55320. "adds r10, r10, r5\n\t"
  55321. "str r10, [%[a], #284]\n\t"
  55322. "adc r4, r4, #0\n\t"
  55323. /* a[i+72] += m[72] * mu */
  55324. "ldr r7, [%[m], #288]\n\t"
  55325. "ldr r10, [%[a], #288]\n\t"
  55326. "mov r5, #0\n\t"
  55327. "umlal r10, r5, r8, r7\n\t"
  55328. "adds r10, r10, r4\n\t"
  55329. "str r10, [%[a], #288]\n\t"
  55330. "adc r5, r5, #0\n\t"
  55331. /* a[i+73] += m[73] * mu */
  55332. "ldr r7, [%[m], #292]\n\t"
  55333. "ldr r10, [%[a], #292]\n\t"
  55334. "mov r4, #0\n\t"
  55335. "umlal r10, r4, r8, r7\n\t"
  55336. "adds r10, r10, r5\n\t"
  55337. "str r10, [%[a], #292]\n\t"
  55338. "adc r4, r4, #0\n\t"
  55339. /* a[i+74] += m[74] * mu */
  55340. "ldr r7, [%[m], #296]\n\t"
  55341. "ldr r10, [%[a], #296]\n\t"
  55342. "mov r5, #0\n\t"
  55343. "umlal r10, r5, r8, r7\n\t"
  55344. "adds r10, r10, r4\n\t"
  55345. "str r10, [%[a], #296]\n\t"
  55346. "adc r5, r5, #0\n\t"
  55347. /* a[i+75] += m[75] * mu */
  55348. "ldr r7, [%[m], #300]\n\t"
  55349. "ldr r10, [%[a], #300]\n\t"
  55350. "mov r4, #0\n\t"
  55351. "umlal r10, r4, r8, r7\n\t"
  55352. "adds r10, r10, r5\n\t"
  55353. "str r10, [%[a], #300]\n\t"
  55354. "adc r4, r4, #0\n\t"
  55355. /* a[i+76] += m[76] * mu */
  55356. "ldr r7, [%[m], #304]\n\t"
  55357. "ldr r10, [%[a], #304]\n\t"
  55358. "mov r5, #0\n\t"
  55359. "umlal r10, r5, r8, r7\n\t"
  55360. "adds r10, r10, r4\n\t"
  55361. "str r10, [%[a], #304]\n\t"
  55362. "adc r5, r5, #0\n\t"
  55363. /* a[i+77] += m[77] * mu */
  55364. "ldr r7, [%[m], #308]\n\t"
  55365. "ldr r10, [%[a], #308]\n\t"
  55366. "mov r4, #0\n\t"
  55367. "umlal r10, r4, r8, r7\n\t"
  55368. "adds r10, r10, r5\n\t"
  55369. "str r10, [%[a], #308]\n\t"
  55370. "adc r4, r4, #0\n\t"
  55371. /* a[i+78] += m[78] * mu */
  55372. "ldr r7, [%[m], #312]\n\t"
  55373. "ldr r10, [%[a], #312]\n\t"
  55374. "mov r5, #0\n\t"
  55375. "umlal r10, r5, r8, r7\n\t"
  55376. "adds r10, r10, r4\n\t"
  55377. "str r10, [%[a], #312]\n\t"
  55378. "adc r5, r5, #0\n\t"
  55379. /* a[i+79] += m[79] * mu */
  55380. "ldr r7, [%[m], #316]\n\t"
  55381. "ldr r10, [%[a], #316]\n\t"
  55382. "mov r4, #0\n\t"
  55383. "umlal r10, r4, r8, r7\n\t"
  55384. "adds r10, r10, r5\n\t"
  55385. "str r10, [%[a], #316]\n\t"
  55386. "adc r4, r4, #0\n\t"
  55387. /* a[i+80] += m[80] * mu */
  55388. "ldr r7, [%[m], #320]\n\t"
  55389. "ldr r10, [%[a], #320]\n\t"
  55390. "mov r5, #0\n\t"
  55391. "umlal r10, r5, r8, r7\n\t"
  55392. "adds r10, r10, r4\n\t"
  55393. "str r10, [%[a], #320]\n\t"
  55394. "adc r5, r5, #0\n\t"
  55395. /* a[i+81] += m[81] * mu */
  55396. "ldr r7, [%[m], #324]\n\t"
  55397. "ldr r10, [%[a], #324]\n\t"
  55398. "mov r4, #0\n\t"
  55399. "umlal r10, r4, r8, r7\n\t"
  55400. "adds r10, r10, r5\n\t"
  55401. "str r10, [%[a], #324]\n\t"
  55402. "adc r4, r4, #0\n\t"
  55403. /* a[i+82] += m[82] * mu */
  55404. "ldr r7, [%[m], #328]\n\t"
  55405. "ldr r10, [%[a], #328]\n\t"
  55406. "mov r5, #0\n\t"
  55407. "umlal r10, r5, r8, r7\n\t"
  55408. "adds r10, r10, r4\n\t"
  55409. "str r10, [%[a], #328]\n\t"
  55410. "adc r5, r5, #0\n\t"
  55411. /* a[i+83] += m[83] * mu */
  55412. "ldr r7, [%[m], #332]\n\t"
  55413. "ldr r10, [%[a], #332]\n\t"
  55414. "mov r4, #0\n\t"
  55415. "umlal r10, r4, r8, r7\n\t"
  55416. "adds r10, r10, r5\n\t"
  55417. "str r10, [%[a], #332]\n\t"
  55418. "adc r4, r4, #0\n\t"
  55419. /* a[i+84] += m[84] * mu */
  55420. "ldr r7, [%[m], #336]\n\t"
  55421. "ldr r10, [%[a], #336]\n\t"
  55422. "mov r5, #0\n\t"
  55423. "umlal r10, r5, r8, r7\n\t"
  55424. "adds r10, r10, r4\n\t"
  55425. "str r10, [%[a], #336]\n\t"
  55426. "adc r5, r5, #0\n\t"
  55427. /* a[i+85] += m[85] * mu */
  55428. "ldr r7, [%[m], #340]\n\t"
  55429. "ldr r10, [%[a], #340]\n\t"
  55430. "mov r4, #0\n\t"
  55431. "umlal r10, r4, r8, r7\n\t"
  55432. "adds r10, r10, r5\n\t"
  55433. "str r10, [%[a], #340]\n\t"
  55434. "adc r4, r4, #0\n\t"
  55435. /* a[i+86] += m[86] * mu */
  55436. "ldr r7, [%[m], #344]\n\t"
  55437. "ldr r10, [%[a], #344]\n\t"
  55438. "mov r5, #0\n\t"
  55439. "umlal r10, r5, r8, r7\n\t"
  55440. "adds r10, r10, r4\n\t"
  55441. "str r10, [%[a], #344]\n\t"
  55442. "adc r5, r5, #0\n\t"
  55443. /* a[i+87] += m[87] * mu */
  55444. "ldr r7, [%[m], #348]\n\t"
  55445. "ldr r10, [%[a], #348]\n\t"
  55446. "mov r4, #0\n\t"
  55447. "umlal r10, r4, r8, r7\n\t"
  55448. "adds r10, r10, r5\n\t"
  55449. "str r10, [%[a], #348]\n\t"
  55450. "adc r4, r4, #0\n\t"
  55451. /* a[i+88] += m[88] * mu */
  55452. "ldr r7, [%[m], #352]\n\t"
  55453. "ldr r10, [%[a], #352]\n\t"
  55454. "mov r5, #0\n\t"
  55455. "umlal r10, r5, r8, r7\n\t"
  55456. "adds r10, r10, r4\n\t"
  55457. "str r10, [%[a], #352]\n\t"
  55458. "adc r5, r5, #0\n\t"
  55459. /* a[i+89] += m[89] * mu */
  55460. "ldr r7, [%[m], #356]\n\t"
  55461. "ldr r10, [%[a], #356]\n\t"
  55462. "mov r4, #0\n\t"
  55463. "umlal r10, r4, r8, r7\n\t"
  55464. "adds r10, r10, r5\n\t"
  55465. "str r10, [%[a], #356]\n\t"
  55466. "adc r4, r4, #0\n\t"
  55467. /* a[i+90] += m[90] * mu */
  55468. "ldr r7, [%[m], #360]\n\t"
  55469. "ldr r10, [%[a], #360]\n\t"
  55470. "mov r5, #0\n\t"
  55471. "umlal r10, r5, r8, r7\n\t"
  55472. "adds r10, r10, r4\n\t"
  55473. "str r10, [%[a], #360]\n\t"
  55474. "adc r5, r5, #0\n\t"
  55475. /* a[i+91] += m[91] * mu */
  55476. "ldr r7, [%[m], #364]\n\t"
  55477. "ldr r10, [%[a], #364]\n\t"
  55478. "mov r4, #0\n\t"
  55479. "umlal r10, r4, r8, r7\n\t"
  55480. "adds r10, r10, r5\n\t"
  55481. "str r10, [%[a], #364]\n\t"
  55482. "adc r4, r4, #0\n\t"
  55483. /* a[i+92] += m[92] * mu */
  55484. "ldr r7, [%[m], #368]\n\t"
  55485. "ldr r10, [%[a], #368]\n\t"
  55486. "mov r5, #0\n\t"
  55487. "umlal r10, r5, r8, r7\n\t"
  55488. "adds r10, r10, r4\n\t"
  55489. "str r10, [%[a], #368]\n\t"
  55490. "adc r5, r5, #0\n\t"
  55491. /* a[i+93] += m[93] * mu */
  55492. "ldr r7, [%[m], #372]\n\t"
  55493. "ldr r10, [%[a], #372]\n\t"
  55494. "mov r4, #0\n\t"
  55495. "umlal r10, r4, r8, r7\n\t"
  55496. "adds r10, r10, r5\n\t"
  55497. "str r10, [%[a], #372]\n\t"
  55498. "adc r4, r4, #0\n\t"
  55499. /* a[i+94] += m[94] * mu */
  55500. "ldr r7, [%[m], #376]\n\t"
  55501. "ldr r10, [%[a], #376]\n\t"
  55502. "mov r5, #0\n\t"
  55503. "umlal r10, r5, r8, r7\n\t"
  55504. "adds r10, r10, r4\n\t"
  55505. "str r10, [%[a], #376]\n\t"
  55506. "adc r5, r5, #0\n\t"
  55507. /* a[i+95] += m[95] * mu */
  55508. "ldr r7, [%[m], #380]\n\t"
  55509. "ldr r10, [%[a], #380]\n\t"
  55510. "mov r4, #0\n\t"
  55511. "umlal r10, r4, r8, r7\n\t"
  55512. "adds r10, r10, r5\n\t"
  55513. "str r10, [%[a], #380]\n\t"
  55514. "adc r4, r4, #0\n\t"
  55515. /* a[i+96] += m[96] * mu */
  55516. "ldr r7, [%[m], #384]\n\t"
  55517. "ldr r10, [%[a], #384]\n\t"
  55518. "mov r5, #0\n\t"
  55519. "umlal r10, r5, r8, r7\n\t"
  55520. "adds r10, r10, r4\n\t"
  55521. "str r10, [%[a], #384]\n\t"
  55522. "adc r5, r5, #0\n\t"
  55523. /* a[i+97] += m[97] * mu */
  55524. "ldr r7, [%[m], #388]\n\t"
  55525. "ldr r10, [%[a], #388]\n\t"
  55526. "mov r4, #0\n\t"
  55527. "umlal r10, r4, r8, r7\n\t"
  55528. "adds r10, r10, r5\n\t"
  55529. "str r10, [%[a], #388]\n\t"
  55530. "adc r4, r4, #0\n\t"
  55531. /* a[i+98] += m[98] * mu */
  55532. "ldr r7, [%[m], #392]\n\t"
  55533. "ldr r10, [%[a], #392]\n\t"
  55534. "mov r5, #0\n\t"
  55535. "umlal r10, r5, r8, r7\n\t"
  55536. "adds r10, r10, r4\n\t"
  55537. "str r10, [%[a], #392]\n\t"
  55538. "adc r5, r5, #0\n\t"
  55539. /* a[i+99] += m[99] * mu */
  55540. "ldr r7, [%[m], #396]\n\t"
  55541. "ldr r10, [%[a], #396]\n\t"
  55542. "mov r4, #0\n\t"
  55543. "umlal r10, r4, r8, r7\n\t"
  55544. "adds r10, r10, r5\n\t"
  55545. "str r10, [%[a], #396]\n\t"
  55546. "adc r4, r4, #0\n\t"
  55547. /* a[i+100] += m[100] * mu */
  55548. "ldr r7, [%[m], #400]\n\t"
  55549. "ldr r10, [%[a], #400]\n\t"
  55550. "mov r5, #0\n\t"
  55551. "umlal r10, r5, r8, r7\n\t"
  55552. "adds r10, r10, r4\n\t"
  55553. "str r10, [%[a], #400]\n\t"
  55554. "adc r5, r5, #0\n\t"
  55555. /* a[i+101] += m[101] * mu */
  55556. "ldr r7, [%[m], #404]\n\t"
  55557. "ldr r10, [%[a], #404]\n\t"
  55558. "mov r4, #0\n\t"
  55559. "umlal r10, r4, r8, r7\n\t"
  55560. "adds r10, r10, r5\n\t"
  55561. "str r10, [%[a], #404]\n\t"
  55562. "adc r4, r4, #0\n\t"
  55563. /* a[i+102] += m[102] * mu */
  55564. "ldr r7, [%[m], #408]\n\t"
  55565. "ldr r10, [%[a], #408]\n\t"
  55566. "mov r5, #0\n\t"
  55567. "umlal r10, r5, r8, r7\n\t"
  55568. "adds r10, r10, r4\n\t"
  55569. "str r10, [%[a], #408]\n\t"
  55570. "adc r5, r5, #0\n\t"
  55571. /* a[i+103] += m[103] * mu */
  55572. "ldr r7, [%[m], #412]\n\t"
  55573. "ldr r10, [%[a], #412]\n\t"
  55574. "mov r4, #0\n\t"
  55575. "umlal r10, r4, r8, r7\n\t"
  55576. "adds r10, r10, r5\n\t"
  55577. "str r10, [%[a], #412]\n\t"
  55578. "adc r4, r4, #0\n\t"
  55579. /* a[i+104] += m[104] * mu */
  55580. "ldr r7, [%[m], #416]\n\t"
  55581. "ldr r10, [%[a], #416]\n\t"
  55582. "mov r5, #0\n\t"
  55583. "umlal r10, r5, r8, r7\n\t"
  55584. "adds r10, r10, r4\n\t"
  55585. "str r10, [%[a], #416]\n\t"
  55586. "adc r5, r5, #0\n\t"
  55587. /* a[i+105] += m[105] * mu */
  55588. "ldr r7, [%[m], #420]\n\t"
  55589. "ldr r10, [%[a], #420]\n\t"
  55590. "mov r4, #0\n\t"
  55591. "umlal r10, r4, r8, r7\n\t"
  55592. "adds r10, r10, r5\n\t"
  55593. "str r10, [%[a], #420]\n\t"
  55594. "adc r4, r4, #0\n\t"
  55595. /* a[i+106] += m[106] * mu */
  55596. "ldr r7, [%[m], #424]\n\t"
  55597. "ldr r10, [%[a], #424]\n\t"
  55598. "mov r5, #0\n\t"
  55599. "umlal r10, r5, r8, r7\n\t"
  55600. "adds r10, r10, r4\n\t"
  55601. "str r10, [%[a], #424]\n\t"
  55602. "adc r5, r5, #0\n\t"
  55603. /* a[i+107] += m[107] * mu */
  55604. "ldr r7, [%[m], #428]\n\t"
  55605. "ldr r10, [%[a], #428]\n\t"
  55606. "mov r4, #0\n\t"
  55607. "umlal r10, r4, r8, r7\n\t"
  55608. "adds r10, r10, r5\n\t"
  55609. "str r10, [%[a], #428]\n\t"
  55610. "adc r4, r4, #0\n\t"
  55611. /* a[i+108] += m[108] * mu */
  55612. "ldr r7, [%[m], #432]\n\t"
  55613. "ldr r10, [%[a], #432]\n\t"
  55614. "mov r5, #0\n\t"
  55615. "umlal r10, r5, r8, r7\n\t"
  55616. "adds r10, r10, r4\n\t"
  55617. "str r10, [%[a], #432]\n\t"
  55618. "adc r5, r5, #0\n\t"
  55619. /* a[i+109] += m[109] * mu */
  55620. "ldr r7, [%[m], #436]\n\t"
  55621. "ldr r10, [%[a], #436]\n\t"
  55622. "mov r4, #0\n\t"
  55623. "umlal r10, r4, r8, r7\n\t"
  55624. "adds r10, r10, r5\n\t"
  55625. "str r10, [%[a], #436]\n\t"
  55626. "adc r4, r4, #0\n\t"
  55627. /* a[i+110] += m[110] * mu */
  55628. "ldr r7, [%[m], #440]\n\t"
  55629. "ldr r10, [%[a], #440]\n\t"
  55630. "mov r5, #0\n\t"
  55631. "umlal r10, r5, r8, r7\n\t"
  55632. "adds r10, r10, r4\n\t"
  55633. "str r10, [%[a], #440]\n\t"
  55634. "adc r5, r5, #0\n\t"
  55635. /* a[i+111] += m[111] * mu */
  55636. "ldr r7, [%[m], #444]\n\t"
  55637. "ldr r10, [%[a], #444]\n\t"
  55638. "mov r4, #0\n\t"
  55639. "umlal r10, r4, r8, r7\n\t"
  55640. "adds r10, r10, r5\n\t"
  55641. "str r10, [%[a], #444]\n\t"
  55642. "adc r4, r4, #0\n\t"
  55643. /* a[i+112] += m[112] * mu */
  55644. "ldr r7, [%[m], #448]\n\t"
  55645. "ldr r10, [%[a], #448]\n\t"
  55646. "mov r5, #0\n\t"
  55647. "umlal r10, r5, r8, r7\n\t"
  55648. "adds r10, r10, r4\n\t"
  55649. "str r10, [%[a], #448]\n\t"
  55650. "adc r5, r5, #0\n\t"
  55651. /* a[i+113] += m[113] * mu */
  55652. "ldr r7, [%[m], #452]\n\t"
  55653. "ldr r10, [%[a], #452]\n\t"
  55654. "mov r4, #0\n\t"
  55655. "umlal r10, r4, r8, r7\n\t"
  55656. "adds r10, r10, r5\n\t"
  55657. "str r10, [%[a], #452]\n\t"
  55658. "adc r4, r4, #0\n\t"
  55659. /* a[i+114] += m[114] * mu */
  55660. "ldr r7, [%[m], #456]\n\t"
  55661. "ldr r10, [%[a], #456]\n\t"
  55662. "mov r5, #0\n\t"
  55663. "umlal r10, r5, r8, r7\n\t"
  55664. "adds r10, r10, r4\n\t"
  55665. "str r10, [%[a], #456]\n\t"
  55666. "adc r5, r5, #0\n\t"
  55667. /* a[i+115] += m[115] * mu */
  55668. "ldr r7, [%[m], #460]\n\t"
  55669. "ldr r10, [%[a], #460]\n\t"
  55670. "mov r4, #0\n\t"
  55671. "umlal r10, r4, r8, r7\n\t"
  55672. "adds r10, r10, r5\n\t"
  55673. "str r10, [%[a], #460]\n\t"
  55674. "adc r4, r4, #0\n\t"
  55675. /* a[i+116] += m[116] * mu */
  55676. "ldr r7, [%[m], #464]\n\t"
  55677. "ldr r10, [%[a], #464]\n\t"
  55678. "mov r5, #0\n\t"
  55679. "umlal r10, r5, r8, r7\n\t"
  55680. "adds r10, r10, r4\n\t"
  55681. "str r10, [%[a], #464]\n\t"
  55682. "adc r5, r5, #0\n\t"
  55683. /* a[i+117] += m[117] * mu */
  55684. "ldr r7, [%[m], #468]\n\t"
  55685. "ldr r10, [%[a], #468]\n\t"
  55686. "mov r4, #0\n\t"
  55687. "umlal r10, r4, r8, r7\n\t"
  55688. "adds r10, r10, r5\n\t"
  55689. "str r10, [%[a], #468]\n\t"
  55690. "adc r4, r4, #0\n\t"
  55691. /* a[i+118] += m[118] * mu */
  55692. "ldr r7, [%[m], #472]\n\t"
  55693. "ldr r10, [%[a], #472]\n\t"
  55694. "mov r5, #0\n\t"
  55695. "umlal r10, r5, r8, r7\n\t"
  55696. "adds r10, r10, r4\n\t"
  55697. "str r10, [%[a], #472]\n\t"
  55698. "adc r5, r5, #0\n\t"
  55699. /* a[i+119] += m[119] * mu */
  55700. "ldr r7, [%[m], #476]\n\t"
  55701. "ldr r10, [%[a], #476]\n\t"
  55702. "mov r4, #0\n\t"
  55703. "umlal r10, r4, r8, r7\n\t"
  55704. "adds r10, r10, r5\n\t"
  55705. "str r10, [%[a], #476]\n\t"
  55706. "adc r4, r4, #0\n\t"
  55707. /* a[i+120] += m[120] * mu */
  55708. "ldr r7, [%[m], #480]\n\t"
  55709. "ldr r10, [%[a], #480]\n\t"
  55710. "mov r5, #0\n\t"
  55711. "umlal r10, r5, r8, r7\n\t"
  55712. "adds r10, r10, r4\n\t"
  55713. "str r10, [%[a], #480]\n\t"
  55714. "adc r5, r5, #0\n\t"
  55715. /* a[i+121] += m[121] * mu */
  55716. "ldr r7, [%[m], #484]\n\t"
  55717. "ldr r10, [%[a], #484]\n\t"
  55718. "mov r4, #0\n\t"
  55719. "umlal r10, r4, r8, r7\n\t"
  55720. "adds r10, r10, r5\n\t"
  55721. "str r10, [%[a], #484]\n\t"
  55722. "adc r4, r4, #0\n\t"
  55723. /* a[i+122] += m[122] * mu */
  55724. "ldr r7, [%[m], #488]\n\t"
  55725. "ldr r10, [%[a], #488]\n\t"
  55726. "mov r5, #0\n\t"
  55727. "umlal r10, r5, r8, r7\n\t"
  55728. "adds r10, r10, r4\n\t"
  55729. "str r10, [%[a], #488]\n\t"
  55730. "adc r5, r5, #0\n\t"
  55731. /* a[i+123] += m[123] * mu */
  55732. "ldr r7, [%[m], #492]\n\t"
  55733. "ldr r10, [%[a], #492]\n\t"
  55734. "mov r4, #0\n\t"
  55735. "umlal r10, r4, r8, r7\n\t"
  55736. "adds r10, r10, r5\n\t"
  55737. "str r10, [%[a], #492]\n\t"
  55738. "adc r4, r4, #0\n\t"
  55739. /* a[i+124] += m[124] * mu */
  55740. "ldr r7, [%[m], #496]\n\t"
  55741. "ldr r10, [%[a], #496]\n\t"
  55742. "mov r5, #0\n\t"
  55743. "umlal r10, r5, r8, r7\n\t"
  55744. "adds r10, r10, r4\n\t"
  55745. "str r10, [%[a], #496]\n\t"
  55746. "adc r5, r5, #0\n\t"
  55747. /* a[i+125] += m[125] * mu */
  55748. "ldr r7, [%[m], #500]\n\t"
  55749. "ldr r10, [%[a], #500]\n\t"
  55750. "mov r4, #0\n\t"
  55751. "umlal r10, r4, r8, r7\n\t"
  55752. "adds r10, r10, r5\n\t"
  55753. "str r10, [%[a], #500]\n\t"
  55754. "adc r4, r4, #0\n\t"
  55755. /* a[i+126] += m[126] * mu */
  55756. "ldr r7, [%[m], #504]\n\t"
  55757. "ldr r10, [%[a], #504]\n\t"
  55758. "mov r5, #0\n\t"
  55759. "umlal r10, r5, r8, r7\n\t"
  55760. "adds r10, r10, r4\n\t"
  55761. "str r10, [%[a], #504]\n\t"
  55762. "adc r5, r5, #0\n\t"
  55763. /* a[i+127] += m[127] * mu */
  55764. "ldr r7, [%[m], #508]\n\t"
  55765. "ldr r10, [%[a], #508]\n\t"
  55766. "umull r6, r7, r8, r7\n\t"
  55767. "adds r5, r5, r6\n\t"
  55768. "adcs r4, r7, r3\n\t"
  55769. "mov r3, #0\n\t"
  55770. "adc r3, r3, r3\n\t"
  55771. "adds r10, r10, r5\n\t"
  55772. "str r10, [%[a], #508]\n\t"
  55773. "ldr r10, [%[a], #512]\n\t"
  55774. "adcs r10, r10, r4\n\t"
  55775. "str r10, [%[a], #512]\n\t"
  55776. "adc r3, r3, #0\n\t"
  55777. /* i += 1 */
  55778. "add r9, r9, #4\n\t"
  55779. "add %[a], %[a], #4\n\t"
  55780. "cmp r9, #0x200\n\t"
  55781. "blt L_sp_4096_mont_reduce_128_word_%=\n\t"
  55782. /* Loop Done */
  55783. "str r12, [%[a]]\n\t"
  55784. "str lr, [%[a], #4]\n\t"
  55785. "mov %[mp], r3\n\t"
  55786. : [a] "+r" (a), [m] "+r" (m), [mp] "+r" (mp)
  55787. :
  55788. : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "cc"
  55789. );
  55790. sp_4096_cond_sub_128(a - 128, a, m, (sp_digit)0 - mp);
  55791. }
  55792. #else
  55793. /* Reduce the number back to 4096 bits using Montgomery reduction.
  55794. *
  55795. * a A single precision number to reduce in place.
  55796. * m The single precision number representing the modulus.
  55797. * mp The digit representing the negative inverse of m mod 2^n.
  55798. */
  55799. static SP_NOINLINE void sp_4096_mont_reduce_128(sp_digit* a_p, const sp_digit* m_p, sp_digit mp_p)
  55800. {
  55801. register sp_digit* a asm ("r0") = (sp_digit*)a_p;
  55802. register const sp_digit* m asm ("r1") = (const sp_digit*)m_p;
  55803. register sp_digit mp asm ("r2") = (sp_digit)mp_p;
  55804. __asm__ __volatile__ (
  55805. /* i = 0 */
  55806. "mov r12, #0\n\t"
  55807. "mov lr, #0\n\t"
  55808. "ldr r4, [%[a]]\n\t"
  55809. "ldr r5, [%[a], #4]\n\t"
  55810. "ldr r6, [%[a], #8]\n\t"
  55811. "ldr r7, [%[a], #12]\n\t"
  55812. "ldr r8, [%[a], #16]\n\t"
  55813. "\n"
  55814. "L_sp_4096_mont_reduce_128_word_%=: \n\t"
  55815. /* mu = a[i] * mp */
  55816. "mul r11, %[mp], r4\n\t"
  55817. /* a[i+0] += m[0] * mu */
  55818. "ldr r10, [%[m]]\n\t"
  55819. "mov r3, #0\n\t"
  55820. "umaal r4, r3, r11, r10\n\t"
  55821. /* a[i+1] += m[1] * mu */
  55822. "ldr r10, [%[m], #4]\n\t"
  55823. "mov r4, r5\n\t"
  55824. "umaal r4, r3, r11, r10\n\t"
  55825. /* a[i+2] += m[2] * mu */
  55826. "ldr r10, [%[m], #8]\n\t"
  55827. "mov r5, r6\n\t"
  55828. "umaal r5, r3, r11, r10\n\t"
  55829. /* a[i+3] += m[3] * mu */
  55830. "ldr r10, [%[m], #12]\n\t"
  55831. "mov r6, r7\n\t"
  55832. "umaal r6, r3, r11, r10\n\t"
  55833. /* a[i+4] += m[4] * mu */
  55834. "ldr r10, [%[m], #16]\n\t"
  55835. "mov r7, r8\n\t"
  55836. "umaal r7, r3, r11, r10\n\t"
  55837. /* a[i+5] += m[5] * mu */
  55838. "ldr r10, [%[m], #20]\n\t"
  55839. "ldr r8, [%[a], #20]\n\t"
  55840. "umaal r8, r3, r11, r10\n\t"
  55841. /* a[i+6] += m[6] * mu */
  55842. "ldr r10, [%[m], #24]\n\t"
  55843. "ldr r9, [%[a], #24]\n\t"
  55844. "umaal r9, r3, r11, r10\n\t"
  55845. "str r9, [%[a], #24]\n\t"
  55846. /* a[i+7] += m[7] * mu */
  55847. "ldr r10, [%[m], #28]\n\t"
  55848. "ldr r9, [%[a], #28]\n\t"
  55849. "umaal r9, r3, r11, r10\n\t"
  55850. "str r9, [%[a], #28]\n\t"
  55851. /* a[i+8] += m[8] * mu */
  55852. "ldr r10, [%[m], #32]\n\t"
  55853. "ldr r9, [%[a], #32]\n\t"
  55854. "umaal r9, r3, r11, r10\n\t"
  55855. "str r9, [%[a], #32]\n\t"
  55856. /* a[i+9] += m[9] * mu */
  55857. "ldr r10, [%[m], #36]\n\t"
  55858. "ldr r9, [%[a], #36]\n\t"
  55859. "umaal r9, r3, r11, r10\n\t"
  55860. "str r9, [%[a], #36]\n\t"
  55861. /* a[i+10] += m[10] * mu */
  55862. "ldr r10, [%[m], #40]\n\t"
  55863. "ldr r9, [%[a], #40]\n\t"
  55864. "umaal r9, r3, r11, r10\n\t"
  55865. "str r9, [%[a], #40]\n\t"
  55866. /* a[i+11] += m[11] * mu */
  55867. "ldr r10, [%[m], #44]\n\t"
  55868. "ldr r9, [%[a], #44]\n\t"
  55869. "umaal r9, r3, r11, r10\n\t"
  55870. "str r9, [%[a], #44]\n\t"
  55871. /* a[i+12] += m[12] * mu */
  55872. "ldr r10, [%[m], #48]\n\t"
  55873. "ldr r9, [%[a], #48]\n\t"
  55874. "umaal r9, r3, r11, r10\n\t"
  55875. "str r9, [%[a], #48]\n\t"
  55876. /* a[i+13] += m[13] * mu */
  55877. "ldr r10, [%[m], #52]\n\t"
  55878. "ldr r9, [%[a], #52]\n\t"
  55879. "umaal r9, r3, r11, r10\n\t"
  55880. "str r9, [%[a], #52]\n\t"
  55881. /* a[i+14] += m[14] * mu */
  55882. "ldr r10, [%[m], #56]\n\t"
  55883. "ldr r9, [%[a], #56]\n\t"
  55884. "umaal r9, r3, r11, r10\n\t"
  55885. "str r9, [%[a], #56]\n\t"
  55886. /* a[i+15] += m[15] * mu */
  55887. "ldr r10, [%[m], #60]\n\t"
  55888. "ldr r9, [%[a], #60]\n\t"
  55889. "umaal r9, r3, r11, r10\n\t"
  55890. "str r9, [%[a], #60]\n\t"
  55891. /* a[i+16] += m[16] * mu */
  55892. "ldr r10, [%[m], #64]\n\t"
  55893. "ldr r9, [%[a], #64]\n\t"
  55894. "umaal r9, r3, r11, r10\n\t"
  55895. "str r9, [%[a], #64]\n\t"
  55896. /* a[i+17] += m[17] * mu */
  55897. "ldr r10, [%[m], #68]\n\t"
  55898. "ldr r9, [%[a], #68]\n\t"
  55899. "umaal r9, r3, r11, r10\n\t"
  55900. "str r9, [%[a], #68]\n\t"
  55901. /* a[i+18] += m[18] * mu */
  55902. "ldr r10, [%[m], #72]\n\t"
  55903. "ldr r9, [%[a], #72]\n\t"
  55904. "umaal r9, r3, r11, r10\n\t"
  55905. "str r9, [%[a], #72]\n\t"
  55906. /* a[i+19] += m[19] * mu */
  55907. "ldr r10, [%[m], #76]\n\t"
  55908. "ldr r9, [%[a], #76]\n\t"
  55909. "umaal r9, r3, r11, r10\n\t"
  55910. "str r9, [%[a], #76]\n\t"
  55911. /* a[i+20] += m[20] * mu */
  55912. "ldr r10, [%[m], #80]\n\t"
  55913. "ldr r9, [%[a], #80]\n\t"
  55914. "umaal r9, r3, r11, r10\n\t"
  55915. "str r9, [%[a], #80]\n\t"
  55916. /* a[i+21] += m[21] * mu */
  55917. "ldr r10, [%[m], #84]\n\t"
  55918. "ldr r9, [%[a], #84]\n\t"
  55919. "umaal r9, r3, r11, r10\n\t"
  55920. "str r9, [%[a], #84]\n\t"
  55921. /* a[i+22] += m[22] * mu */
  55922. "ldr r10, [%[m], #88]\n\t"
  55923. "ldr r9, [%[a], #88]\n\t"
  55924. "umaal r9, r3, r11, r10\n\t"
  55925. "str r9, [%[a], #88]\n\t"
  55926. /* a[i+23] += m[23] * mu */
  55927. "ldr r10, [%[m], #92]\n\t"
  55928. "ldr r9, [%[a], #92]\n\t"
  55929. "umaal r9, r3, r11, r10\n\t"
  55930. "str r9, [%[a], #92]\n\t"
  55931. /* a[i+24] += m[24] * mu */
  55932. "ldr r10, [%[m], #96]\n\t"
  55933. "ldr r9, [%[a], #96]\n\t"
  55934. "umaal r9, r3, r11, r10\n\t"
  55935. "str r9, [%[a], #96]\n\t"
  55936. /* a[i+25] += m[25] * mu */
  55937. "ldr r10, [%[m], #100]\n\t"
  55938. "ldr r9, [%[a], #100]\n\t"
  55939. "umaal r9, r3, r11, r10\n\t"
  55940. "str r9, [%[a], #100]\n\t"
  55941. /* a[i+26] += m[26] * mu */
  55942. "ldr r10, [%[m], #104]\n\t"
  55943. "ldr r9, [%[a], #104]\n\t"
  55944. "umaal r9, r3, r11, r10\n\t"
  55945. "str r9, [%[a], #104]\n\t"
  55946. /* a[i+27] += m[27] * mu */
  55947. "ldr r10, [%[m], #108]\n\t"
  55948. "ldr r9, [%[a], #108]\n\t"
  55949. "umaal r9, r3, r11, r10\n\t"
  55950. "str r9, [%[a], #108]\n\t"
  55951. /* a[i+28] += m[28] * mu */
  55952. "ldr r10, [%[m], #112]\n\t"
  55953. "ldr r9, [%[a], #112]\n\t"
  55954. "umaal r9, r3, r11, r10\n\t"
  55955. "str r9, [%[a], #112]\n\t"
  55956. /* a[i+29] += m[29] * mu */
  55957. "ldr r10, [%[m], #116]\n\t"
  55958. "ldr r9, [%[a], #116]\n\t"
  55959. "umaal r9, r3, r11, r10\n\t"
  55960. "str r9, [%[a], #116]\n\t"
  55961. /* a[i+30] += m[30] * mu */
  55962. "ldr r10, [%[m], #120]\n\t"
  55963. "ldr r9, [%[a], #120]\n\t"
  55964. "umaal r9, r3, r11, r10\n\t"
  55965. "str r9, [%[a], #120]\n\t"
  55966. /* a[i+31] += m[31] * mu */
  55967. "ldr r10, [%[m], #124]\n\t"
  55968. "ldr r9, [%[a], #124]\n\t"
  55969. "umaal r9, r3, r11, r10\n\t"
  55970. "str r9, [%[a], #124]\n\t"
  55971. /* a[i+32] += m[32] * mu */
  55972. "ldr r10, [%[m], #128]\n\t"
  55973. "ldr r9, [%[a], #128]\n\t"
  55974. "umaal r9, r3, r11, r10\n\t"
  55975. "str r9, [%[a], #128]\n\t"
  55976. /* a[i+33] += m[33] * mu */
  55977. "ldr r10, [%[m], #132]\n\t"
  55978. "ldr r9, [%[a], #132]\n\t"
  55979. "umaal r9, r3, r11, r10\n\t"
  55980. "str r9, [%[a], #132]\n\t"
  55981. /* a[i+34] += m[34] * mu */
  55982. "ldr r10, [%[m], #136]\n\t"
  55983. "ldr r9, [%[a], #136]\n\t"
  55984. "umaal r9, r3, r11, r10\n\t"
  55985. "str r9, [%[a], #136]\n\t"
  55986. /* a[i+35] += m[35] * mu */
  55987. "ldr r10, [%[m], #140]\n\t"
  55988. "ldr r9, [%[a], #140]\n\t"
  55989. "umaal r9, r3, r11, r10\n\t"
  55990. "str r9, [%[a], #140]\n\t"
  55991. /* a[i+36] += m[36] * mu */
  55992. "ldr r10, [%[m], #144]\n\t"
  55993. "ldr r9, [%[a], #144]\n\t"
  55994. "umaal r9, r3, r11, r10\n\t"
  55995. "str r9, [%[a], #144]\n\t"
  55996. /* a[i+37] += m[37] * mu */
  55997. "ldr r10, [%[m], #148]\n\t"
  55998. "ldr r9, [%[a], #148]\n\t"
  55999. "umaal r9, r3, r11, r10\n\t"
  56000. "str r9, [%[a], #148]\n\t"
  56001. /* a[i+38] += m[38] * mu */
  56002. "ldr r10, [%[m], #152]\n\t"
  56003. "ldr r9, [%[a], #152]\n\t"
  56004. "umaal r9, r3, r11, r10\n\t"
  56005. "str r9, [%[a], #152]\n\t"
  56006. /* a[i+39] += m[39] * mu */
  56007. "ldr r10, [%[m], #156]\n\t"
  56008. "ldr r9, [%[a], #156]\n\t"
  56009. "umaal r9, r3, r11, r10\n\t"
  56010. "str r9, [%[a], #156]\n\t"
  56011. /* a[i+40] += m[40] * mu */
  56012. "ldr r10, [%[m], #160]\n\t"
  56013. "ldr r9, [%[a], #160]\n\t"
  56014. "umaal r9, r3, r11, r10\n\t"
  56015. "str r9, [%[a], #160]\n\t"
  56016. /* a[i+41] += m[41] * mu */
  56017. "ldr r10, [%[m], #164]\n\t"
  56018. "ldr r9, [%[a], #164]\n\t"
  56019. "umaal r9, r3, r11, r10\n\t"
  56020. "str r9, [%[a], #164]\n\t"
  56021. /* a[i+42] += m[42] * mu */
  56022. "ldr r10, [%[m], #168]\n\t"
  56023. "ldr r9, [%[a], #168]\n\t"
  56024. "umaal r9, r3, r11, r10\n\t"
  56025. "str r9, [%[a], #168]\n\t"
  56026. /* a[i+43] += m[43] * mu */
  56027. "ldr r10, [%[m], #172]\n\t"
  56028. "ldr r9, [%[a], #172]\n\t"
  56029. "umaal r9, r3, r11, r10\n\t"
  56030. "str r9, [%[a], #172]\n\t"
  56031. /* a[i+44] += m[44] * mu */
  56032. "ldr r10, [%[m], #176]\n\t"
  56033. "ldr r9, [%[a], #176]\n\t"
  56034. "umaal r9, r3, r11, r10\n\t"
  56035. "str r9, [%[a], #176]\n\t"
  56036. /* a[i+45] += m[45] * mu */
  56037. "ldr r10, [%[m], #180]\n\t"
  56038. "ldr r9, [%[a], #180]\n\t"
  56039. "umaal r9, r3, r11, r10\n\t"
  56040. "str r9, [%[a], #180]\n\t"
  56041. /* a[i+46] += m[46] * mu */
  56042. "ldr r10, [%[m], #184]\n\t"
  56043. "ldr r9, [%[a], #184]\n\t"
  56044. "umaal r9, r3, r11, r10\n\t"
  56045. "str r9, [%[a], #184]\n\t"
  56046. /* a[i+47] += m[47] * mu */
  56047. "ldr r10, [%[m], #188]\n\t"
  56048. "ldr r9, [%[a], #188]\n\t"
  56049. "umaal r9, r3, r11, r10\n\t"
  56050. "str r9, [%[a], #188]\n\t"
  56051. /* a[i+48] += m[48] * mu */
  56052. "ldr r10, [%[m], #192]\n\t"
  56053. "ldr r9, [%[a], #192]\n\t"
  56054. "umaal r9, r3, r11, r10\n\t"
  56055. "str r9, [%[a], #192]\n\t"
  56056. /* a[i+49] += m[49] * mu */
  56057. "ldr r10, [%[m], #196]\n\t"
  56058. "ldr r9, [%[a], #196]\n\t"
  56059. "umaal r9, r3, r11, r10\n\t"
  56060. "str r9, [%[a], #196]\n\t"
  56061. /* a[i+50] += m[50] * mu */
  56062. "ldr r10, [%[m], #200]\n\t"
  56063. "ldr r9, [%[a], #200]\n\t"
  56064. "umaal r9, r3, r11, r10\n\t"
  56065. "str r9, [%[a], #200]\n\t"
  56066. /* a[i+51] += m[51] * mu */
  56067. "ldr r10, [%[m], #204]\n\t"
  56068. "ldr r9, [%[a], #204]\n\t"
  56069. "umaal r9, r3, r11, r10\n\t"
  56070. "str r9, [%[a], #204]\n\t"
  56071. /* a[i+52] += m[52] * mu */
  56072. "ldr r10, [%[m], #208]\n\t"
  56073. "ldr r9, [%[a], #208]\n\t"
  56074. "umaal r9, r3, r11, r10\n\t"
  56075. "str r9, [%[a], #208]\n\t"
  56076. /* a[i+53] += m[53] * mu */
  56077. "ldr r10, [%[m], #212]\n\t"
  56078. "ldr r9, [%[a], #212]\n\t"
  56079. "umaal r9, r3, r11, r10\n\t"
  56080. "str r9, [%[a], #212]\n\t"
  56081. /* a[i+54] += m[54] * mu */
  56082. "ldr r10, [%[m], #216]\n\t"
  56083. "ldr r9, [%[a], #216]\n\t"
  56084. "umaal r9, r3, r11, r10\n\t"
  56085. "str r9, [%[a], #216]\n\t"
  56086. /* a[i+55] += m[55] * mu */
  56087. "ldr r10, [%[m], #220]\n\t"
  56088. "ldr r9, [%[a], #220]\n\t"
  56089. "umaal r9, r3, r11, r10\n\t"
  56090. "str r9, [%[a], #220]\n\t"
  56091. /* a[i+56] += m[56] * mu */
  56092. "ldr r10, [%[m], #224]\n\t"
  56093. "ldr r9, [%[a], #224]\n\t"
  56094. "umaal r9, r3, r11, r10\n\t"
  56095. "str r9, [%[a], #224]\n\t"
  56096. /* a[i+57] += m[57] * mu */
  56097. "ldr r10, [%[m], #228]\n\t"
  56098. "ldr r9, [%[a], #228]\n\t"
  56099. "umaal r9, r3, r11, r10\n\t"
  56100. "str r9, [%[a], #228]\n\t"
  56101. /* a[i+58] += m[58] * mu */
  56102. "ldr r10, [%[m], #232]\n\t"
  56103. "ldr r9, [%[a], #232]\n\t"
  56104. "umaal r9, r3, r11, r10\n\t"
  56105. "str r9, [%[a], #232]\n\t"
  56106. /* a[i+59] += m[59] * mu */
  56107. "ldr r10, [%[m], #236]\n\t"
  56108. "ldr r9, [%[a], #236]\n\t"
  56109. "umaal r9, r3, r11, r10\n\t"
  56110. "str r9, [%[a], #236]\n\t"
  56111. /* a[i+60] += m[60] * mu */
  56112. "ldr r10, [%[m], #240]\n\t"
  56113. "ldr r9, [%[a], #240]\n\t"
  56114. "umaal r9, r3, r11, r10\n\t"
  56115. "str r9, [%[a], #240]\n\t"
  56116. /* a[i+61] += m[61] * mu */
  56117. "ldr r10, [%[m], #244]\n\t"
  56118. "ldr r9, [%[a], #244]\n\t"
  56119. "umaal r9, r3, r11, r10\n\t"
  56120. "str r9, [%[a], #244]\n\t"
  56121. /* a[i+62] += m[62] * mu */
  56122. "ldr r10, [%[m], #248]\n\t"
  56123. "ldr r9, [%[a], #248]\n\t"
  56124. "umaal r9, r3, r11, r10\n\t"
  56125. "str r9, [%[a], #248]\n\t"
  56126. /* a[i+63] += m[63] * mu */
  56127. "ldr r10, [%[m], #252]\n\t"
  56128. "ldr r9, [%[a], #252]\n\t"
  56129. "umaal r9, r3, r11, r10\n\t"
  56130. "str r9, [%[a], #252]\n\t"
  56131. /* a[i+64] += m[64] * mu */
  56132. "ldr r10, [%[m], #256]\n\t"
  56133. "ldr r9, [%[a], #256]\n\t"
  56134. "umaal r9, r3, r11, r10\n\t"
  56135. "str r9, [%[a], #256]\n\t"
  56136. /* a[i+65] += m[65] * mu */
  56137. "ldr r10, [%[m], #260]\n\t"
  56138. "ldr r9, [%[a], #260]\n\t"
  56139. "umaal r9, r3, r11, r10\n\t"
  56140. "str r9, [%[a], #260]\n\t"
  56141. /* a[i+66] += m[66] * mu */
  56142. "ldr r10, [%[m], #264]\n\t"
  56143. "ldr r9, [%[a], #264]\n\t"
  56144. "umaal r9, r3, r11, r10\n\t"
  56145. "str r9, [%[a], #264]\n\t"
  56146. /* a[i+67] += m[67] * mu */
  56147. "ldr r10, [%[m], #268]\n\t"
  56148. "ldr r9, [%[a], #268]\n\t"
  56149. "umaal r9, r3, r11, r10\n\t"
  56150. "str r9, [%[a], #268]\n\t"
  56151. /* a[i+68] += m[68] * mu */
  56152. "ldr r10, [%[m], #272]\n\t"
  56153. "ldr r9, [%[a], #272]\n\t"
  56154. "umaal r9, r3, r11, r10\n\t"
  56155. "str r9, [%[a], #272]\n\t"
  56156. /* a[i+69] += m[69] * mu */
  56157. "ldr r10, [%[m], #276]\n\t"
  56158. "ldr r9, [%[a], #276]\n\t"
  56159. "umaal r9, r3, r11, r10\n\t"
  56160. "str r9, [%[a], #276]\n\t"
  56161. /* a[i+70] += m[70] * mu */
  56162. "ldr r10, [%[m], #280]\n\t"
  56163. "ldr r9, [%[a], #280]\n\t"
  56164. "umaal r9, r3, r11, r10\n\t"
  56165. "str r9, [%[a], #280]\n\t"
  56166. /* a[i+71] += m[71] * mu */
  56167. "ldr r10, [%[m], #284]\n\t"
  56168. "ldr r9, [%[a], #284]\n\t"
  56169. "umaal r9, r3, r11, r10\n\t"
  56170. "str r9, [%[a], #284]\n\t"
  56171. /* a[i+72] += m[72] * mu */
  56172. "ldr r10, [%[m], #288]\n\t"
  56173. "ldr r9, [%[a], #288]\n\t"
  56174. "umaal r9, r3, r11, r10\n\t"
  56175. "str r9, [%[a], #288]\n\t"
  56176. /* a[i+73] += m[73] * mu */
  56177. "ldr r10, [%[m], #292]\n\t"
  56178. "ldr r9, [%[a], #292]\n\t"
  56179. "umaal r9, r3, r11, r10\n\t"
  56180. "str r9, [%[a], #292]\n\t"
  56181. /* a[i+74] += m[74] * mu */
  56182. "ldr r10, [%[m], #296]\n\t"
  56183. "ldr r9, [%[a], #296]\n\t"
  56184. "umaal r9, r3, r11, r10\n\t"
  56185. "str r9, [%[a], #296]\n\t"
  56186. /* a[i+75] += m[75] * mu */
  56187. "ldr r10, [%[m], #300]\n\t"
  56188. "ldr r9, [%[a], #300]\n\t"
  56189. "umaal r9, r3, r11, r10\n\t"
  56190. "str r9, [%[a], #300]\n\t"
  56191. /* a[i+76] += m[76] * mu */
  56192. "ldr r10, [%[m], #304]\n\t"
  56193. "ldr r9, [%[a], #304]\n\t"
  56194. "umaal r9, r3, r11, r10\n\t"
  56195. "str r9, [%[a], #304]\n\t"
  56196. /* a[i+77] += m[77] * mu */
  56197. "ldr r10, [%[m], #308]\n\t"
  56198. "ldr r9, [%[a], #308]\n\t"
  56199. "umaal r9, r3, r11, r10\n\t"
  56200. "str r9, [%[a], #308]\n\t"
  56201. /* a[i+78] += m[78] * mu */
  56202. "ldr r10, [%[m], #312]\n\t"
  56203. "ldr r9, [%[a], #312]\n\t"
  56204. "umaal r9, r3, r11, r10\n\t"
  56205. "str r9, [%[a], #312]\n\t"
  56206. /* a[i+79] += m[79] * mu */
  56207. "ldr r10, [%[m], #316]\n\t"
  56208. "ldr r9, [%[a], #316]\n\t"
  56209. "umaal r9, r3, r11, r10\n\t"
  56210. "str r9, [%[a], #316]\n\t"
  56211. /* a[i+80] += m[80] * mu */
  56212. "ldr r10, [%[m], #320]\n\t"
  56213. "ldr r9, [%[a], #320]\n\t"
  56214. "umaal r9, r3, r11, r10\n\t"
  56215. "str r9, [%[a], #320]\n\t"
  56216. /* a[i+81] += m[81] * mu */
  56217. "ldr r10, [%[m], #324]\n\t"
  56218. "ldr r9, [%[a], #324]\n\t"
  56219. "umaal r9, r3, r11, r10\n\t"
  56220. "str r9, [%[a], #324]\n\t"
  56221. /* a[i+82] += m[82] * mu */
  56222. "ldr r10, [%[m], #328]\n\t"
  56223. "ldr r9, [%[a], #328]\n\t"
  56224. "umaal r9, r3, r11, r10\n\t"
  56225. "str r9, [%[a], #328]\n\t"
  56226. /* a[i+83] += m[83] * mu */
  56227. "ldr r10, [%[m], #332]\n\t"
  56228. "ldr r9, [%[a], #332]\n\t"
  56229. "umaal r9, r3, r11, r10\n\t"
  56230. "str r9, [%[a], #332]\n\t"
  56231. /* a[i+84] += m[84] * mu */
  56232. "ldr r10, [%[m], #336]\n\t"
  56233. "ldr r9, [%[a], #336]\n\t"
  56234. "umaal r9, r3, r11, r10\n\t"
  56235. "str r9, [%[a], #336]\n\t"
  56236. /* a[i+85] += m[85] * mu */
  56237. "ldr r10, [%[m], #340]\n\t"
  56238. "ldr r9, [%[a], #340]\n\t"
  56239. "umaal r9, r3, r11, r10\n\t"
  56240. "str r9, [%[a], #340]\n\t"
  56241. /* a[i+86] += m[86] * mu */
  56242. "ldr r10, [%[m], #344]\n\t"
  56243. "ldr r9, [%[a], #344]\n\t"
  56244. "umaal r9, r3, r11, r10\n\t"
  56245. "str r9, [%[a], #344]\n\t"
  56246. /* a[i+87] += m[87] * mu */
  56247. "ldr r10, [%[m], #348]\n\t"
  56248. "ldr r9, [%[a], #348]\n\t"
  56249. "umaal r9, r3, r11, r10\n\t"
  56250. "str r9, [%[a], #348]\n\t"
  56251. /* a[i+88] += m[88] * mu */
  56252. "ldr r10, [%[m], #352]\n\t"
  56253. "ldr r9, [%[a], #352]\n\t"
  56254. "umaal r9, r3, r11, r10\n\t"
  56255. "str r9, [%[a], #352]\n\t"
  56256. /* a[i+89] += m[89] * mu */
  56257. "ldr r10, [%[m], #356]\n\t"
  56258. "ldr r9, [%[a], #356]\n\t"
  56259. "umaal r9, r3, r11, r10\n\t"
  56260. "str r9, [%[a], #356]\n\t"
  56261. /* a[i+90] += m[90] * mu */
  56262. "ldr r10, [%[m], #360]\n\t"
  56263. "ldr r9, [%[a], #360]\n\t"
  56264. "umaal r9, r3, r11, r10\n\t"
  56265. "str r9, [%[a], #360]\n\t"
  56266. /* a[i+91] += m[91] * mu */
  56267. "ldr r10, [%[m], #364]\n\t"
  56268. "ldr r9, [%[a], #364]\n\t"
  56269. "umaal r9, r3, r11, r10\n\t"
  56270. "str r9, [%[a], #364]\n\t"
  56271. /* a[i+92] += m[92] * mu */
  56272. "ldr r10, [%[m], #368]\n\t"
  56273. "ldr r9, [%[a], #368]\n\t"
  56274. "umaal r9, r3, r11, r10\n\t"
  56275. "str r9, [%[a], #368]\n\t"
  56276. /* a[i+93] += m[93] * mu */
  56277. "ldr r10, [%[m], #372]\n\t"
  56278. "ldr r9, [%[a], #372]\n\t"
  56279. "umaal r9, r3, r11, r10\n\t"
  56280. "str r9, [%[a], #372]\n\t"
  56281. /* a[i+94] += m[94] * mu */
  56282. "ldr r10, [%[m], #376]\n\t"
  56283. "ldr r9, [%[a], #376]\n\t"
  56284. "umaal r9, r3, r11, r10\n\t"
  56285. "str r9, [%[a], #376]\n\t"
  56286. /* a[i+95] += m[95] * mu */
  56287. "ldr r10, [%[m], #380]\n\t"
  56288. "ldr r9, [%[a], #380]\n\t"
  56289. "umaal r9, r3, r11, r10\n\t"
  56290. "str r9, [%[a], #380]\n\t"
  56291. /* a[i+96] += m[96] * mu */
  56292. "ldr r10, [%[m], #384]\n\t"
  56293. "ldr r9, [%[a], #384]\n\t"
  56294. "umaal r9, r3, r11, r10\n\t"
  56295. "str r9, [%[a], #384]\n\t"
  56296. /* a[i+97] += m[97] * mu */
  56297. "ldr r10, [%[m], #388]\n\t"
  56298. "ldr r9, [%[a], #388]\n\t"
  56299. "umaal r9, r3, r11, r10\n\t"
  56300. "str r9, [%[a], #388]\n\t"
  56301. /* a[i+98] += m[98] * mu */
  56302. "ldr r10, [%[m], #392]\n\t"
  56303. "ldr r9, [%[a], #392]\n\t"
  56304. "umaal r9, r3, r11, r10\n\t"
  56305. "str r9, [%[a], #392]\n\t"
  56306. /* a[i+99] += m[99] * mu */
  56307. "ldr r10, [%[m], #396]\n\t"
  56308. "ldr r9, [%[a], #396]\n\t"
  56309. "umaal r9, r3, r11, r10\n\t"
  56310. "str r9, [%[a], #396]\n\t"
  56311. /* a[i+100] += m[100] * mu */
  56312. "ldr r10, [%[m], #400]\n\t"
  56313. "ldr r9, [%[a], #400]\n\t"
  56314. "umaal r9, r3, r11, r10\n\t"
  56315. "str r9, [%[a], #400]\n\t"
  56316. /* a[i+101] += m[101] * mu */
  56317. "ldr r10, [%[m], #404]\n\t"
  56318. "ldr r9, [%[a], #404]\n\t"
  56319. "umaal r9, r3, r11, r10\n\t"
  56320. "str r9, [%[a], #404]\n\t"
  56321. /* a[i+102] += m[102] * mu */
  56322. "ldr r10, [%[m], #408]\n\t"
  56323. "ldr r9, [%[a], #408]\n\t"
  56324. "umaal r9, r3, r11, r10\n\t"
  56325. "str r9, [%[a], #408]\n\t"
  56326. /* a[i+103] += m[103] * mu */
  56327. "ldr r10, [%[m], #412]\n\t"
  56328. "ldr r9, [%[a], #412]\n\t"
  56329. "umaal r9, r3, r11, r10\n\t"
  56330. "str r9, [%[a], #412]\n\t"
  56331. /* a[i+104] += m[104] * mu */
  56332. "ldr r10, [%[m], #416]\n\t"
  56333. "ldr r9, [%[a], #416]\n\t"
  56334. "umaal r9, r3, r11, r10\n\t"
  56335. "str r9, [%[a], #416]\n\t"
  56336. /* a[i+105] += m[105] * mu */
  56337. "ldr r10, [%[m], #420]\n\t"
  56338. "ldr r9, [%[a], #420]\n\t"
  56339. "umaal r9, r3, r11, r10\n\t"
  56340. "str r9, [%[a], #420]\n\t"
  56341. /* a[i+106] += m[106] * mu */
  56342. "ldr r10, [%[m], #424]\n\t"
  56343. "ldr r9, [%[a], #424]\n\t"
  56344. "umaal r9, r3, r11, r10\n\t"
  56345. "str r9, [%[a], #424]\n\t"
  56346. /* a[i+107] += m[107] * mu */
  56347. "ldr r10, [%[m], #428]\n\t"
  56348. "ldr r9, [%[a], #428]\n\t"
  56349. "umaal r9, r3, r11, r10\n\t"
  56350. "str r9, [%[a], #428]\n\t"
  56351. /* a[i+108] += m[108] * mu */
  56352. "ldr r10, [%[m], #432]\n\t"
  56353. "ldr r9, [%[a], #432]\n\t"
  56354. "umaal r9, r3, r11, r10\n\t"
  56355. "str r9, [%[a], #432]\n\t"
  56356. /* a[i+109] += m[109] * mu */
  56357. "ldr r10, [%[m], #436]\n\t"
  56358. "ldr r9, [%[a], #436]\n\t"
  56359. "umaal r9, r3, r11, r10\n\t"
  56360. "str r9, [%[a], #436]\n\t"
  56361. /* a[i+110] += m[110] * mu */
  56362. "ldr r10, [%[m], #440]\n\t"
  56363. "ldr r9, [%[a], #440]\n\t"
  56364. "umaal r9, r3, r11, r10\n\t"
  56365. "str r9, [%[a], #440]\n\t"
  56366. /* a[i+111] += m[111] * mu */
  56367. "ldr r10, [%[m], #444]\n\t"
  56368. "ldr r9, [%[a], #444]\n\t"
  56369. "umaal r9, r3, r11, r10\n\t"
  56370. "str r9, [%[a], #444]\n\t"
  56371. /* a[i+112] += m[112] * mu */
  56372. "ldr r10, [%[m], #448]\n\t"
  56373. "ldr r9, [%[a], #448]\n\t"
  56374. "umaal r9, r3, r11, r10\n\t"
  56375. "str r9, [%[a], #448]\n\t"
  56376. /* a[i+113] += m[113] * mu */
  56377. "ldr r10, [%[m], #452]\n\t"
  56378. "ldr r9, [%[a], #452]\n\t"
  56379. "umaal r9, r3, r11, r10\n\t"
  56380. "str r9, [%[a], #452]\n\t"
  56381. /* a[i+114] += m[114] * mu */
  56382. "ldr r10, [%[m], #456]\n\t"
  56383. "ldr r9, [%[a], #456]\n\t"
  56384. "umaal r9, r3, r11, r10\n\t"
  56385. "str r9, [%[a], #456]\n\t"
  56386. /* a[i+115] += m[115] * mu */
  56387. "ldr r10, [%[m], #460]\n\t"
  56388. "ldr r9, [%[a], #460]\n\t"
  56389. "umaal r9, r3, r11, r10\n\t"
  56390. "str r9, [%[a], #460]\n\t"
  56391. /* a[i+116] += m[116] * mu */
  56392. "ldr r10, [%[m], #464]\n\t"
  56393. "ldr r9, [%[a], #464]\n\t"
  56394. "umaal r9, r3, r11, r10\n\t"
  56395. "str r9, [%[a], #464]\n\t"
  56396. /* a[i+117] += m[117] * mu */
  56397. "ldr r10, [%[m], #468]\n\t"
  56398. "ldr r9, [%[a], #468]\n\t"
  56399. "umaal r9, r3, r11, r10\n\t"
  56400. "str r9, [%[a], #468]\n\t"
  56401. /* a[i+118] += m[118] * mu */
  56402. "ldr r10, [%[m], #472]\n\t"
  56403. "ldr r9, [%[a], #472]\n\t"
  56404. "umaal r9, r3, r11, r10\n\t"
  56405. "str r9, [%[a], #472]\n\t"
  56406. /* a[i+119] += m[119] * mu */
  56407. "ldr r10, [%[m], #476]\n\t"
  56408. "ldr r9, [%[a], #476]\n\t"
  56409. "umaal r9, r3, r11, r10\n\t"
  56410. "str r9, [%[a], #476]\n\t"
  56411. /* a[i+120] += m[120] * mu */
  56412. "ldr r10, [%[m], #480]\n\t"
  56413. "ldr r9, [%[a], #480]\n\t"
  56414. "umaal r9, r3, r11, r10\n\t"
  56415. "str r9, [%[a], #480]\n\t"
  56416. /* a[i+121] += m[121] * mu */
  56417. "ldr r10, [%[m], #484]\n\t"
  56418. "ldr r9, [%[a], #484]\n\t"
  56419. "umaal r9, r3, r11, r10\n\t"
  56420. "str r9, [%[a], #484]\n\t"
  56421. /* a[i+122] += m[122] * mu */
  56422. "ldr r10, [%[m], #488]\n\t"
  56423. "ldr r9, [%[a], #488]\n\t"
  56424. "umaal r9, r3, r11, r10\n\t"
  56425. "str r9, [%[a], #488]\n\t"
  56426. /* a[i+123] += m[123] * mu */
  56427. "ldr r10, [%[m], #492]\n\t"
  56428. "ldr r9, [%[a], #492]\n\t"
  56429. "umaal r9, r3, r11, r10\n\t"
  56430. "str r9, [%[a], #492]\n\t"
  56431. /* a[i+124] += m[124] * mu */
  56432. "ldr r10, [%[m], #496]\n\t"
  56433. "ldr r9, [%[a], #496]\n\t"
  56434. "umaal r9, r3, r11, r10\n\t"
  56435. "str r9, [%[a], #496]\n\t"
  56436. /* a[i+125] += m[125] * mu */
  56437. "ldr r10, [%[m], #500]\n\t"
  56438. "ldr r9, [%[a], #500]\n\t"
  56439. "umaal r9, r3, r11, r10\n\t"
  56440. "str r9, [%[a], #500]\n\t"
  56441. /* a[i+126] += m[126] * mu */
  56442. "ldr r10, [%[m], #504]\n\t"
  56443. "ldr r9, [%[a], #504]\n\t"
  56444. "umaal r9, r3, r11, r10\n\t"
  56445. "str r9, [%[a], #504]\n\t"
  56446. /* a[i+127] += m[127] * mu */
  56447. "ldr r10, [%[m], #508]\n\t"
  56448. "ldr r9, [%[a], #508]\n\t"
  56449. "umaal r9, r3, r11, r10\n\t"
  56450. "ldr r11, [%[a], #512]\n\t"
  56451. "mov r10, #0\n\t"
  56452. "umaal r3, r11, r10, r10\n\t"
  56453. "str r9, [%[a], #508]\n\t"
  56454. "adds r3, r3, lr\n\t"
  56455. "adc lr, r11, #0\n\t"
  56456. "str r3, [%[a], #512]\n\t"
  56457. /* i += 1 */
  56458. "add r12, r12, #4\n\t"
  56459. "add %[a], %[a], #4\n\t"
  56460. "cmp r12, #0x200\n\t"
  56461. "blt L_sp_4096_mont_reduce_128_word_%=\n\t"
  56462. /* Loop Done */
  56463. "str r4, [%[a]]\n\t"
  56464. "str r5, [%[a], #4]\n\t"
  56465. "str r6, [%[a], #8]\n\t"
  56466. "str r7, [%[a], #12]\n\t"
  56467. "str r8, [%[a], #16]\n\t"
  56468. "mov %[mp], lr\n\t"
  56469. : [a] "+r" (a), [m] "+r" (m), [mp] "+r" (mp)
  56470. :
  56471. : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "cc"
  56472. );
  56473. sp_4096_cond_sub_128(a - 128, a, m, (sp_digit)0 - mp);
  56474. }
  56475. #endif
  56476. /* Multiply two Montgomery form numbers mod the modulus (prime).
  56477. * (r = a * b mod m)
  56478. *
  56479. * r Result of multiplication.
  56480. * a First number to multiply in Montgomery form.
  56481. * b Second number to multiply in Montgomery form.
  56482. * m Modulus (prime).
  56483. * mp Montgomery multiplier.
  56484. */
  56485. SP_NOINLINE static void sp_4096_mont_mul_128(sp_digit* r, const sp_digit* a,
  56486. const sp_digit* b, const sp_digit* m, sp_digit mp)
  56487. {
  56488. sp_4096_mul_128(r, a, b);
  56489. sp_4096_mont_reduce_128(r, m, mp);
  56490. }
  56491. /* Square the Montgomery form number. (r = a * a mod m)
  56492. *
  56493. * r Result of squaring.
  56494. * a Number to square in Montgomery form.
  56495. * m Modulus (prime).
  56496. * mp Montgomery multiplier.
  56497. */
  56498. SP_NOINLINE static void sp_4096_mont_sqr_128(sp_digit* r, const sp_digit* a,
  56499. const sp_digit* m, sp_digit mp)
  56500. {
  56501. sp_4096_sqr_128(r, a);
  56502. sp_4096_mont_reduce_128(r, m, mp);
  56503. }
  56504. #ifdef WOLFSSL_SP_SMALL
  56505. /* Sub b from a into r. (r = a - b)
  56506. *
  56507. * r A single precision integer.
  56508. * a A single precision integer.
  56509. * b A single precision integer.
  56510. */
  56511. static sp_digit sp_4096_sub_128(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p)
  56512. {
  56513. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  56514. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  56515. register const sp_digit* b asm ("r2") = (const sp_digit*)b_p;
  56516. __asm__ __volatile__ (
  56517. "mov r12, #0\n\t"
  56518. "add lr, %[a], #0x200\n\t"
  56519. "\n"
  56520. "L_sp_4096_sub_128_word_%=: \n\t"
  56521. "rsbs r12, r12, #0\n\t"
  56522. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  56523. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  56524. "sbcs r3, r3, r7\n\t"
  56525. "sbcs r4, r4, r8\n\t"
  56526. "sbcs r5, r5, r9\n\t"
  56527. "sbcs r6, r6, r10\n\t"
  56528. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  56529. "sbc r12, r3, r3\n\t"
  56530. "cmp %[a], lr\n\t"
  56531. "bne L_sp_4096_sub_128_word_%=\n\t"
  56532. "mov %[r], r12\n\t"
  56533. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  56534. :
  56535. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r12", "lr", "cc"
  56536. );
  56537. return (uint32_t)(size_t)r;
  56538. }
  56539. #else
  56540. /* Sub b from a into r. (r = a - b)
  56541. *
  56542. * r A single precision integer.
  56543. * a A single precision integer.
  56544. * b A single precision integer.
  56545. */
  56546. static sp_digit sp_4096_sub_128(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p)
  56547. {
  56548. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  56549. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  56550. register const sp_digit* b asm ("r2") = (const sp_digit*)b_p;
  56551. __asm__ __volatile__ (
  56552. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  56553. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  56554. "subs r3, r3, r7\n\t"
  56555. "sbcs r4, r4, r8\n\t"
  56556. "sbcs r5, r5, r9\n\t"
  56557. "sbcs r6, r6, r10\n\t"
  56558. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  56559. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  56560. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  56561. "sbcs r3, r3, r7\n\t"
  56562. "sbcs r4, r4, r8\n\t"
  56563. "sbcs r5, r5, r9\n\t"
  56564. "sbcs r6, r6, r10\n\t"
  56565. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  56566. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  56567. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  56568. "sbcs r3, r3, r7\n\t"
  56569. "sbcs r4, r4, r8\n\t"
  56570. "sbcs r5, r5, r9\n\t"
  56571. "sbcs r6, r6, r10\n\t"
  56572. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  56573. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  56574. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  56575. "sbcs r3, r3, r7\n\t"
  56576. "sbcs r4, r4, r8\n\t"
  56577. "sbcs r5, r5, r9\n\t"
  56578. "sbcs r6, r6, r10\n\t"
  56579. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  56580. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  56581. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  56582. "sbcs r3, r3, r7\n\t"
  56583. "sbcs r4, r4, r8\n\t"
  56584. "sbcs r5, r5, r9\n\t"
  56585. "sbcs r6, r6, r10\n\t"
  56586. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  56587. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  56588. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  56589. "sbcs r3, r3, r7\n\t"
  56590. "sbcs r4, r4, r8\n\t"
  56591. "sbcs r5, r5, r9\n\t"
  56592. "sbcs r6, r6, r10\n\t"
  56593. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  56594. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  56595. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  56596. "sbcs r3, r3, r7\n\t"
  56597. "sbcs r4, r4, r8\n\t"
  56598. "sbcs r5, r5, r9\n\t"
  56599. "sbcs r6, r6, r10\n\t"
  56600. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  56601. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  56602. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  56603. "sbcs r3, r3, r7\n\t"
  56604. "sbcs r4, r4, r8\n\t"
  56605. "sbcs r5, r5, r9\n\t"
  56606. "sbcs r6, r6, r10\n\t"
  56607. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  56608. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  56609. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  56610. "sbcs r3, r3, r7\n\t"
  56611. "sbcs r4, r4, r8\n\t"
  56612. "sbcs r5, r5, r9\n\t"
  56613. "sbcs r6, r6, r10\n\t"
  56614. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  56615. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  56616. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  56617. "sbcs r3, r3, r7\n\t"
  56618. "sbcs r4, r4, r8\n\t"
  56619. "sbcs r5, r5, r9\n\t"
  56620. "sbcs r6, r6, r10\n\t"
  56621. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  56622. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  56623. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  56624. "sbcs r3, r3, r7\n\t"
  56625. "sbcs r4, r4, r8\n\t"
  56626. "sbcs r5, r5, r9\n\t"
  56627. "sbcs r6, r6, r10\n\t"
  56628. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  56629. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  56630. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  56631. "sbcs r3, r3, r7\n\t"
  56632. "sbcs r4, r4, r8\n\t"
  56633. "sbcs r5, r5, r9\n\t"
  56634. "sbcs r6, r6, r10\n\t"
  56635. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  56636. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  56637. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  56638. "sbcs r3, r3, r7\n\t"
  56639. "sbcs r4, r4, r8\n\t"
  56640. "sbcs r5, r5, r9\n\t"
  56641. "sbcs r6, r6, r10\n\t"
  56642. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  56643. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  56644. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  56645. "sbcs r3, r3, r7\n\t"
  56646. "sbcs r4, r4, r8\n\t"
  56647. "sbcs r5, r5, r9\n\t"
  56648. "sbcs r6, r6, r10\n\t"
  56649. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  56650. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  56651. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  56652. "sbcs r3, r3, r7\n\t"
  56653. "sbcs r4, r4, r8\n\t"
  56654. "sbcs r5, r5, r9\n\t"
  56655. "sbcs r6, r6, r10\n\t"
  56656. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  56657. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  56658. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  56659. "sbcs r3, r3, r7\n\t"
  56660. "sbcs r4, r4, r8\n\t"
  56661. "sbcs r5, r5, r9\n\t"
  56662. "sbcs r6, r6, r10\n\t"
  56663. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  56664. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  56665. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  56666. "sbcs r3, r3, r7\n\t"
  56667. "sbcs r4, r4, r8\n\t"
  56668. "sbcs r5, r5, r9\n\t"
  56669. "sbcs r6, r6, r10\n\t"
  56670. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  56671. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  56672. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  56673. "sbcs r3, r3, r7\n\t"
  56674. "sbcs r4, r4, r8\n\t"
  56675. "sbcs r5, r5, r9\n\t"
  56676. "sbcs r6, r6, r10\n\t"
  56677. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  56678. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  56679. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  56680. "sbcs r3, r3, r7\n\t"
  56681. "sbcs r4, r4, r8\n\t"
  56682. "sbcs r5, r5, r9\n\t"
  56683. "sbcs r6, r6, r10\n\t"
  56684. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  56685. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  56686. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  56687. "sbcs r3, r3, r7\n\t"
  56688. "sbcs r4, r4, r8\n\t"
  56689. "sbcs r5, r5, r9\n\t"
  56690. "sbcs r6, r6, r10\n\t"
  56691. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  56692. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  56693. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  56694. "sbcs r3, r3, r7\n\t"
  56695. "sbcs r4, r4, r8\n\t"
  56696. "sbcs r5, r5, r9\n\t"
  56697. "sbcs r6, r6, r10\n\t"
  56698. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  56699. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  56700. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  56701. "sbcs r3, r3, r7\n\t"
  56702. "sbcs r4, r4, r8\n\t"
  56703. "sbcs r5, r5, r9\n\t"
  56704. "sbcs r6, r6, r10\n\t"
  56705. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  56706. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  56707. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  56708. "sbcs r3, r3, r7\n\t"
  56709. "sbcs r4, r4, r8\n\t"
  56710. "sbcs r5, r5, r9\n\t"
  56711. "sbcs r6, r6, r10\n\t"
  56712. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  56713. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  56714. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  56715. "sbcs r3, r3, r7\n\t"
  56716. "sbcs r4, r4, r8\n\t"
  56717. "sbcs r5, r5, r9\n\t"
  56718. "sbcs r6, r6, r10\n\t"
  56719. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  56720. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  56721. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  56722. "sbcs r3, r3, r7\n\t"
  56723. "sbcs r4, r4, r8\n\t"
  56724. "sbcs r5, r5, r9\n\t"
  56725. "sbcs r6, r6, r10\n\t"
  56726. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  56727. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  56728. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  56729. "sbcs r3, r3, r7\n\t"
  56730. "sbcs r4, r4, r8\n\t"
  56731. "sbcs r5, r5, r9\n\t"
  56732. "sbcs r6, r6, r10\n\t"
  56733. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  56734. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  56735. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  56736. "sbcs r3, r3, r7\n\t"
  56737. "sbcs r4, r4, r8\n\t"
  56738. "sbcs r5, r5, r9\n\t"
  56739. "sbcs r6, r6, r10\n\t"
  56740. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  56741. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  56742. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  56743. "sbcs r3, r3, r7\n\t"
  56744. "sbcs r4, r4, r8\n\t"
  56745. "sbcs r5, r5, r9\n\t"
  56746. "sbcs r6, r6, r10\n\t"
  56747. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  56748. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  56749. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  56750. "sbcs r3, r3, r7\n\t"
  56751. "sbcs r4, r4, r8\n\t"
  56752. "sbcs r5, r5, r9\n\t"
  56753. "sbcs r6, r6, r10\n\t"
  56754. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  56755. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  56756. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  56757. "sbcs r3, r3, r7\n\t"
  56758. "sbcs r4, r4, r8\n\t"
  56759. "sbcs r5, r5, r9\n\t"
  56760. "sbcs r6, r6, r10\n\t"
  56761. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  56762. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  56763. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  56764. "sbcs r3, r3, r7\n\t"
  56765. "sbcs r4, r4, r8\n\t"
  56766. "sbcs r5, r5, r9\n\t"
  56767. "sbcs r6, r6, r10\n\t"
  56768. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  56769. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  56770. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  56771. "sbcs r3, r3, r7\n\t"
  56772. "sbcs r4, r4, r8\n\t"
  56773. "sbcs r5, r5, r9\n\t"
  56774. "sbcs r6, r6, r10\n\t"
  56775. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  56776. "sbc %[r], r6, r6\n\t"
  56777. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  56778. :
  56779. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "cc"
  56780. );
  56781. return (uint32_t)(size_t)r;
  56782. }
  56783. #endif /* WOLFSSL_SP_SMALL */
  56784. #ifdef WOLFSSL_SP_USE_UDIV
  56785. /* Divide the double width number (d1|d0) by the divisor. (d1|d0 / div)
  56786. *
  56787. * d1 The high order half of the number to divide.
  56788. * d0 The low order half of the number to divide.
  56789. * div The divisor.
  56790. * returns the result of the division.
  56791. *
  56792. * Note that this is an approximate div. It may give an answer 1 larger.
  56793. */
  56794. static sp_digit div_4096_word_128(sp_digit d1_p, sp_digit d0_p, sp_digit div_p)
  56795. {
  56796. register sp_digit d1 asm ("r0") = (sp_digit)d1_p;
  56797. register sp_digit d0 asm ("r1") = (sp_digit)d0_p;
  56798. register sp_digit div asm ("r2") = (sp_digit)div_p;
  56799. __asm__ __volatile__ (
  56800. "lsr r6, %[div], #16\n\t"
  56801. "add lr, r6, #1\n\t"
  56802. "udiv r4, %[d1], lr\n\t"
  56803. "lsl r5, %[div], #16\n\t"
  56804. "lsl r4, r4, #16\n\t"
  56805. "umull r3, r12, %[div], r4\n\t"
  56806. "subs %[d0], %[d0], r3\n\t"
  56807. "sbc %[d1], %[d1], r12\n\t"
  56808. "subs r3, %[d1], lr\n\t"
  56809. "sbc r7, r7, r7\n\t"
  56810. "add r7, r7, #1\n\t"
  56811. "rsb r8, r7, #0\n\t"
  56812. "lsl r7, r7, #16\n\t"
  56813. "and r5, r5, r8\n\t"
  56814. "and r6, r6, r8\n\t"
  56815. "subs %[d0], %[d0], r5\n\t"
  56816. "add r4, r4, r7\n\t"
  56817. "sbc %[d1], %[d1], r6\n\t"
  56818. "lsl r12, %[d1], #16\n\t"
  56819. "lsr r3, %[d0], #16\n\t"
  56820. "orr r3, r3, r12\n\t"
  56821. "udiv r3, r3, lr\n\t"
  56822. "add r4, r4, r3\n\t"
  56823. "umull r3, r12, %[div], r3\n\t"
  56824. "subs %[d0], %[d0], r3\n\t"
  56825. "sbc %[d1], %[d1], r12\n\t"
  56826. "lsl r12, %[d1], #16\n\t"
  56827. "lsr r3, %[d0], #16\n\t"
  56828. "orr r3, r3, r12\n\t"
  56829. "udiv r3, r3, lr\n\t"
  56830. "add r4, r4, r3\n\t"
  56831. "mul r3, %[div], r3\n\t"
  56832. "sub %[d0], %[d0], r3\n\t"
  56833. "udiv r3, %[d0], %[div]\n\t"
  56834. "add %[d1], r4, r3\n\t"
  56835. : [d1] "+r" (d1), [d0] "+r" (d0), [div] "+r" (div)
  56836. :
  56837. : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8", "cc"
  56838. );
  56839. return (uint32_t)(size_t)d1;
  56840. }
  56841. #else
  56842. /* Divide the double width number (d1|d0) by the divisor. (d1|d0 / div)
  56843. *
  56844. * d1 The high order half of the number to divide.
  56845. * d0 The low order half of the number to divide.
  56846. * div The divisor.
  56847. * returns the result of the division.
  56848. *
  56849. * Note that this is an approximate div. It may give an answer 1 larger.
  56850. */
  56851. static sp_digit div_4096_word_128(sp_digit d1_p, sp_digit d0_p, sp_digit div_p)
  56852. {
  56853. register sp_digit d1 asm ("r0") = (sp_digit)d1_p;
  56854. register sp_digit d0 asm ("r1") = (sp_digit)d0_p;
  56855. register sp_digit div asm ("r2") = (sp_digit)div_p;
  56856. __asm__ __volatile__ (
  56857. "lsr lr, %[div], #1\n\t"
  56858. "add lr, lr, #1\n\t"
  56859. "mov r4, %[d0]\n\t"
  56860. "mov r5, %[d1]\n\t"
  56861. /* Do top 32 */
  56862. "subs r6, lr, r5\n\t"
  56863. "sbc r6, r6, r6\n\t"
  56864. "mov r3, #0\n\t"
  56865. "sub r3, r3, r6\n\t"
  56866. "and r6, r6, lr\n\t"
  56867. "subs r5, r5, r6\n\t"
  56868. /* Next 30 bits */
  56869. "mov r12, #29\n\t"
  56870. "\n"
  56871. "L_div_4096_word_128_bit_%=: \n\t"
  56872. "lsls r4, r4, #1\n\t"
  56873. "adc r5, r5, r5\n\t"
  56874. "subs r6, lr, r5\n\t"
  56875. "sbc r6, r6, r6\n\t"
  56876. "add r3, r3, r3\n\t"
  56877. "sub r3, r3, r6\n\t"
  56878. "and r6, r6, lr\n\t"
  56879. "subs r5, r5, r6\n\t"
  56880. "subs r12, r12, #1\n\t"
  56881. "bpl L_div_4096_word_128_bit_%=\n\t"
  56882. "add r3, r3, r3\n\t"
  56883. "add r3, r3, #1\n\t"
  56884. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  56885. "lsl r7, r3, #16\n\t"
  56886. "lsl r4, %[div], #16\n\t"
  56887. "lsr r7, r7, #16\n\t"
  56888. "lsr r4, r4, #16\n\t"
  56889. "mul r4, r7, r4\n\t"
  56890. "lsr r8, %[div], #16\n\t"
  56891. "mul r7, r8, r7\n\t"
  56892. "lsr r5, r7, #16\n\t"
  56893. "lsl r7, r7, #16\n\t"
  56894. "adds r4, r4, r7\n\t"
  56895. "adc r5, r5, #0\n\t"
  56896. "lsr r7, r3, #16\n\t"
  56897. "mul r8, r7, r8\n\t"
  56898. "add r5, r5, r8\n\t"
  56899. "lsl r8, %[div], #16\n\t"
  56900. "lsr r8, r8, #16\n\t"
  56901. "mul r7, r8, r7\n\t"
  56902. "lsr r8, r7, #16\n\t"
  56903. "lsl r7, r7, #16\n\t"
  56904. "adds r4, r4, r7\n\t"
  56905. "adc r5, r5, r8\n\t"
  56906. #else
  56907. "umull r4, r5, r3, %[div]\n\t"
  56908. #endif
  56909. "subs r7, %[d0], r4\n\t"
  56910. "sbc r8, %[d1], r5\n\t"
  56911. "add r3, r3, r8\n\t"
  56912. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  56913. "lsl r7, r3, #16\n\t"
  56914. "lsl r4, %[div], #16\n\t"
  56915. "lsr r7, r7, #16\n\t"
  56916. "lsr r4, r4, #16\n\t"
  56917. "mul r4, r7, r4\n\t"
  56918. "lsr r8, %[div], #16\n\t"
  56919. "mul r7, r8, r7\n\t"
  56920. "lsr r5, r7, #16\n\t"
  56921. "lsl r7, r7, #16\n\t"
  56922. "adds r4, r4, r7\n\t"
  56923. "adc r5, r5, #0\n\t"
  56924. "lsr r7, r3, #16\n\t"
  56925. "mul r8, r7, r8\n\t"
  56926. "add r5, r5, r8\n\t"
  56927. "lsl r8, %[div], #16\n\t"
  56928. "lsr r8, r8, #16\n\t"
  56929. "mul r7, r8, r7\n\t"
  56930. "lsr r8, r7, #16\n\t"
  56931. "lsl r7, r7, #16\n\t"
  56932. "adds r4, r4, r7\n\t"
  56933. "adc r5, r5, r8\n\t"
  56934. #else
  56935. "umull r4, r5, r3, %[div]\n\t"
  56936. #endif
  56937. "subs r7, %[d0], r4\n\t"
  56938. "sbc r8, %[d1], r5\n\t"
  56939. "add r3, r3, r8\n\t"
  56940. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  56941. "lsl r7, r3, #16\n\t"
  56942. "lsl r4, %[div], #16\n\t"
  56943. "lsr r7, r7, #16\n\t"
  56944. "lsr r4, r4, #16\n\t"
  56945. "mul r4, r7, r4\n\t"
  56946. "lsr r8, %[div], #16\n\t"
  56947. "mul r7, r8, r7\n\t"
  56948. "lsr r5, r7, #16\n\t"
  56949. "lsl r7, r7, #16\n\t"
  56950. "adds r4, r4, r7\n\t"
  56951. "adc r5, r5, #0\n\t"
  56952. "lsr r7, r3, #16\n\t"
  56953. "mul r8, r7, r8\n\t"
  56954. "add r5, r5, r8\n\t"
  56955. "lsl r8, %[div], #16\n\t"
  56956. "lsr r8, r8, #16\n\t"
  56957. "mul r7, r8, r7\n\t"
  56958. "lsr r8, r7, #16\n\t"
  56959. "lsl r7, r7, #16\n\t"
  56960. "adds r4, r4, r7\n\t"
  56961. "adc r5, r5, r8\n\t"
  56962. #else
  56963. "umull r4, r5, r3, %[div]\n\t"
  56964. #endif
  56965. "subs r7, %[d0], r4\n\t"
  56966. "sbc r8, %[d1], r5\n\t"
  56967. "add r3, r3, r8\n\t"
  56968. "subs r6, %[div], r7\n\t"
  56969. "sbc r6, r6, r6\n\t"
  56970. "sub %[d1], r3, r6\n\t"
  56971. : [d1] "+r" (d1), [d0] "+r" (d0), [div] "+r" (div)
  56972. :
  56973. : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8", "cc"
  56974. );
  56975. return (uint32_t)(size_t)d1;
  56976. }
  56977. #endif
  56978. /* Divide d in a and put remainder into r (m*d + r = a)
  56979. * m is not calculated as it is not needed at this time.
  56980. *
  56981. * a Number to be divided.
  56982. * d Number to divide with.
  56983. * m Multiplier result.
  56984. * r Remainder from the division.
  56985. * returns MP_OKAY indicating success.
  56986. */
  56987. static WC_INLINE int sp_4096_div_128_cond(const sp_digit* a, const sp_digit* d,
  56988. sp_digit* m, sp_digit* r)
  56989. {
  56990. sp_digit t1[256], t2[129];
  56991. sp_digit div, r1;
  56992. int i;
  56993. (void)m;
  56994. div = d[127];
  56995. XMEMCPY(t1, a, sizeof(*t1) * 2 * 128);
  56996. for (i = 127; i > 0; i--) {
  56997. if (t1[i + 128] != d[i])
  56998. break;
  56999. }
  57000. if (t1[i + 128] >= d[i]) {
  57001. sp_4096_sub_in_place_128(&t1[128], d);
  57002. }
  57003. for (i = 127; i >= 0; i--) {
  57004. if (t1[128 + i] == div) {
  57005. r1 = SP_DIGIT_MAX;
  57006. }
  57007. else {
  57008. r1 = div_4096_word_128(t1[128 + i], t1[128 + i - 1], div);
  57009. }
  57010. sp_4096_mul_d_128(t2, d, r1);
  57011. t1[128 + i] += sp_4096_sub_in_place_128(&t1[i], t2);
  57012. t1[128 + i] -= t2[128];
  57013. if (t1[128 + i] != 0) {
  57014. t1[128 + i] += sp_4096_add_128(&t1[i], &t1[i], d);
  57015. if (t1[128 + i] != 0)
  57016. t1[128 + i] += sp_4096_add_128(&t1[i], &t1[i], d);
  57017. }
  57018. }
  57019. for (i = 127; i > 0; i--) {
  57020. if (t1[i] != d[i])
  57021. break;
  57022. }
  57023. if (t1[i] >= d[i]) {
  57024. sp_4096_sub_128(r, t1, d);
  57025. }
  57026. else {
  57027. XMEMCPY(r, t1, sizeof(*t1) * 128);
  57028. }
  57029. return MP_OKAY;
  57030. }
  57031. /* Reduce a modulo m into r. (r = a mod m)
  57032. *
  57033. * r A single precision number that is the reduced result.
  57034. * a A single precision number that is to be reduced.
  57035. * m A single precision number that is the modulus to reduce with.
  57036. * returns MP_OKAY indicating success.
  57037. */
  57038. static WC_INLINE int sp_4096_mod_128_cond(sp_digit* r, const sp_digit* a,
  57039. const sp_digit* m)
  57040. {
  57041. return sp_4096_div_128_cond(a, m, NULL, r);
  57042. }
  57043. #if (defined(WOLFSSL_HAVE_SP_RSA) && !defined(WOLFSSL_RSA_PUBLIC_ONLY)) || defined(WOLFSSL_HAVE_SP_DH)
  57044. #if defined(WOLFSSL_HAVE_SP_DH) || !defined(WOLFSSL_RSA_PUBLIC_ONLY)
  57045. /* AND m into each word of a and store in r.
  57046. *
  57047. * r A single precision integer.
  57048. * a A single precision integer.
  57049. * m Mask to AND against each digit.
  57050. */
  57051. static void sp_4096_mask_128(sp_digit* r, const sp_digit* a, sp_digit m)
  57052. {
  57053. #ifdef WOLFSSL_SP_SMALL
  57054. int i;
  57055. for (i=0; i<128; i++) {
  57056. r[i] = a[i] & m;
  57057. }
  57058. #else
  57059. int i;
  57060. for (i = 0; i < 128; i += 8) {
  57061. r[i+0] = a[i+0] & m;
  57062. r[i+1] = a[i+1] & m;
  57063. r[i+2] = a[i+2] & m;
  57064. r[i+3] = a[i+3] & m;
  57065. r[i+4] = a[i+4] & m;
  57066. r[i+5] = a[i+5] & m;
  57067. r[i+6] = a[i+6] & m;
  57068. r[i+7] = a[i+7] & m;
  57069. }
  57070. #endif
  57071. }
  57072. /* Compare a with b in constant time.
  57073. *
  57074. * a A single precision integer.
  57075. * b A single precision integer.
  57076. * return -ve, 0 or +ve if a is less than, equal to or greater than b
  57077. * respectively.
  57078. */
  57079. static sp_int32 sp_4096_cmp_128(const sp_digit* a_p, const sp_digit* b_p)
  57080. {
  57081. register const sp_digit* a asm ("r0") = (const sp_digit*)a_p;
  57082. register const sp_digit* b asm ("r1") = (const sp_digit*)b_p;
  57083. __asm__ __volatile__ (
  57084. "mov r2, #-1\n\t"
  57085. "mov r6, #1\n\t"
  57086. "mov r5, #0\n\t"
  57087. "mov r3, #-1\n\t"
  57088. #ifdef WOLFSSL_SP_SMALL
  57089. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  57090. "mov r4, #0x1\n\t"
  57091. "lsl r4, r4, #8\n\t"
  57092. "add r4, r4, #0xfc\n\t"
  57093. #else
  57094. "mov r4, #0x1fc\n\t"
  57095. #endif
  57096. "\n"
  57097. "L_sp_4096_cmp_128_words_%=: \n\t"
  57098. "ldr r12, [%[a], r4]\n\t"
  57099. "ldr lr, [%[b], r4]\n\t"
  57100. "and r12, r12, r3\n\t"
  57101. "and lr, lr, r3\n\t"
  57102. "subs r12, r12, lr\n\t"
  57103. "it hi\n\t"
  57104. "movhi r2, r6\n\t"
  57105. "it lo\n\t"
  57106. "movlo r2, r3\n\t"
  57107. "it ne\n\t"
  57108. "movne r3, r5\n\t"
  57109. "subs r4, r4, #4\n\t"
  57110. "bcs L_sp_4096_cmp_128_words_%=\n\t"
  57111. "eor r2, r2, r3\n\t"
  57112. #else
  57113. "ldr r12, [%[a], #508]\n\t"
  57114. "ldr lr, [%[b], #508]\n\t"
  57115. "and r12, r12, r3\n\t"
  57116. "and lr, lr, r3\n\t"
  57117. "subs r12, r12, lr\n\t"
  57118. "it hi\n\t"
  57119. "movhi r2, r6\n\t"
  57120. "it lo\n\t"
  57121. "movlo r2, r3\n\t"
  57122. "it ne\n\t"
  57123. "movne r3, r5\n\t"
  57124. "ldr r12, [%[a], #504]\n\t"
  57125. "ldr lr, [%[b], #504]\n\t"
  57126. "and r12, r12, r3\n\t"
  57127. "and lr, lr, r3\n\t"
  57128. "subs r12, r12, lr\n\t"
  57129. "it hi\n\t"
  57130. "movhi r2, r6\n\t"
  57131. "it lo\n\t"
  57132. "movlo r2, r3\n\t"
  57133. "it ne\n\t"
  57134. "movne r3, r5\n\t"
  57135. "ldr r12, [%[a], #500]\n\t"
  57136. "ldr lr, [%[b], #500]\n\t"
  57137. "and r12, r12, r3\n\t"
  57138. "and lr, lr, r3\n\t"
  57139. "subs r12, r12, lr\n\t"
  57140. "it hi\n\t"
  57141. "movhi r2, r6\n\t"
  57142. "it lo\n\t"
  57143. "movlo r2, r3\n\t"
  57144. "it ne\n\t"
  57145. "movne r3, r5\n\t"
  57146. "ldr r12, [%[a], #496]\n\t"
  57147. "ldr lr, [%[b], #496]\n\t"
  57148. "and r12, r12, r3\n\t"
  57149. "and lr, lr, r3\n\t"
  57150. "subs r12, r12, lr\n\t"
  57151. "it hi\n\t"
  57152. "movhi r2, r6\n\t"
  57153. "it lo\n\t"
  57154. "movlo r2, r3\n\t"
  57155. "it ne\n\t"
  57156. "movne r3, r5\n\t"
  57157. "ldr r12, [%[a], #492]\n\t"
  57158. "ldr lr, [%[b], #492]\n\t"
  57159. "and r12, r12, r3\n\t"
  57160. "and lr, lr, r3\n\t"
  57161. "subs r12, r12, lr\n\t"
  57162. "it hi\n\t"
  57163. "movhi r2, r6\n\t"
  57164. "it lo\n\t"
  57165. "movlo r2, r3\n\t"
  57166. "it ne\n\t"
  57167. "movne r3, r5\n\t"
  57168. "ldr r12, [%[a], #488]\n\t"
  57169. "ldr lr, [%[b], #488]\n\t"
  57170. "and r12, r12, r3\n\t"
  57171. "and lr, lr, r3\n\t"
  57172. "subs r12, r12, lr\n\t"
  57173. "it hi\n\t"
  57174. "movhi r2, r6\n\t"
  57175. "it lo\n\t"
  57176. "movlo r2, r3\n\t"
  57177. "it ne\n\t"
  57178. "movne r3, r5\n\t"
  57179. "ldr r12, [%[a], #484]\n\t"
  57180. "ldr lr, [%[b], #484]\n\t"
  57181. "and r12, r12, r3\n\t"
  57182. "and lr, lr, r3\n\t"
  57183. "subs r12, r12, lr\n\t"
  57184. "it hi\n\t"
  57185. "movhi r2, r6\n\t"
  57186. "it lo\n\t"
  57187. "movlo r2, r3\n\t"
  57188. "it ne\n\t"
  57189. "movne r3, r5\n\t"
  57190. "ldr r12, [%[a], #480]\n\t"
  57191. "ldr lr, [%[b], #480]\n\t"
  57192. "and r12, r12, r3\n\t"
  57193. "and lr, lr, r3\n\t"
  57194. "subs r12, r12, lr\n\t"
  57195. "it hi\n\t"
  57196. "movhi r2, r6\n\t"
  57197. "it lo\n\t"
  57198. "movlo r2, r3\n\t"
  57199. "it ne\n\t"
  57200. "movne r3, r5\n\t"
  57201. "ldr r12, [%[a], #476]\n\t"
  57202. "ldr lr, [%[b], #476]\n\t"
  57203. "and r12, r12, r3\n\t"
  57204. "and lr, lr, r3\n\t"
  57205. "subs r12, r12, lr\n\t"
  57206. "it hi\n\t"
  57207. "movhi r2, r6\n\t"
  57208. "it lo\n\t"
  57209. "movlo r2, r3\n\t"
  57210. "it ne\n\t"
  57211. "movne r3, r5\n\t"
  57212. "ldr r12, [%[a], #472]\n\t"
  57213. "ldr lr, [%[b], #472]\n\t"
  57214. "and r12, r12, r3\n\t"
  57215. "and lr, lr, r3\n\t"
  57216. "subs r12, r12, lr\n\t"
  57217. "it hi\n\t"
  57218. "movhi r2, r6\n\t"
  57219. "it lo\n\t"
  57220. "movlo r2, r3\n\t"
  57221. "it ne\n\t"
  57222. "movne r3, r5\n\t"
  57223. "ldr r12, [%[a], #468]\n\t"
  57224. "ldr lr, [%[b], #468]\n\t"
  57225. "and r12, r12, r3\n\t"
  57226. "and lr, lr, r3\n\t"
  57227. "subs r12, r12, lr\n\t"
  57228. "it hi\n\t"
  57229. "movhi r2, r6\n\t"
  57230. "it lo\n\t"
  57231. "movlo r2, r3\n\t"
  57232. "it ne\n\t"
  57233. "movne r3, r5\n\t"
  57234. "ldr r12, [%[a], #464]\n\t"
  57235. "ldr lr, [%[b], #464]\n\t"
  57236. "and r12, r12, r3\n\t"
  57237. "and lr, lr, r3\n\t"
  57238. "subs r12, r12, lr\n\t"
  57239. "it hi\n\t"
  57240. "movhi r2, r6\n\t"
  57241. "it lo\n\t"
  57242. "movlo r2, r3\n\t"
  57243. "it ne\n\t"
  57244. "movne r3, r5\n\t"
  57245. "ldr r12, [%[a], #460]\n\t"
  57246. "ldr lr, [%[b], #460]\n\t"
  57247. "and r12, r12, r3\n\t"
  57248. "and lr, lr, r3\n\t"
  57249. "subs r12, r12, lr\n\t"
  57250. "it hi\n\t"
  57251. "movhi r2, r6\n\t"
  57252. "it lo\n\t"
  57253. "movlo r2, r3\n\t"
  57254. "it ne\n\t"
  57255. "movne r3, r5\n\t"
  57256. "ldr r12, [%[a], #456]\n\t"
  57257. "ldr lr, [%[b], #456]\n\t"
  57258. "and r12, r12, r3\n\t"
  57259. "and lr, lr, r3\n\t"
  57260. "subs r12, r12, lr\n\t"
  57261. "it hi\n\t"
  57262. "movhi r2, r6\n\t"
  57263. "it lo\n\t"
  57264. "movlo r2, r3\n\t"
  57265. "it ne\n\t"
  57266. "movne r3, r5\n\t"
  57267. "ldr r12, [%[a], #452]\n\t"
  57268. "ldr lr, [%[b], #452]\n\t"
  57269. "and r12, r12, r3\n\t"
  57270. "and lr, lr, r3\n\t"
  57271. "subs r12, r12, lr\n\t"
  57272. "it hi\n\t"
  57273. "movhi r2, r6\n\t"
  57274. "it lo\n\t"
  57275. "movlo r2, r3\n\t"
  57276. "it ne\n\t"
  57277. "movne r3, r5\n\t"
  57278. "ldr r12, [%[a], #448]\n\t"
  57279. "ldr lr, [%[b], #448]\n\t"
  57280. "and r12, r12, r3\n\t"
  57281. "and lr, lr, r3\n\t"
  57282. "subs r12, r12, lr\n\t"
  57283. "it hi\n\t"
  57284. "movhi r2, r6\n\t"
  57285. "it lo\n\t"
  57286. "movlo r2, r3\n\t"
  57287. "it ne\n\t"
  57288. "movne r3, r5\n\t"
  57289. "ldr r12, [%[a], #444]\n\t"
  57290. "ldr lr, [%[b], #444]\n\t"
  57291. "and r12, r12, r3\n\t"
  57292. "and lr, lr, r3\n\t"
  57293. "subs r12, r12, lr\n\t"
  57294. "it hi\n\t"
  57295. "movhi r2, r6\n\t"
  57296. "it lo\n\t"
  57297. "movlo r2, r3\n\t"
  57298. "it ne\n\t"
  57299. "movne r3, r5\n\t"
  57300. "ldr r12, [%[a], #440]\n\t"
  57301. "ldr lr, [%[b], #440]\n\t"
  57302. "and r12, r12, r3\n\t"
  57303. "and lr, lr, r3\n\t"
  57304. "subs r12, r12, lr\n\t"
  57305. "it hi\n\t"
  57306. "movhi r2, r6\n\t"
  57307. "it lo\n\t"
  57308. "movlo r2, r3\n\t"
  57309. "it ne\n\t"
  57310. "movne r3, r5\n\t"
  57311. "ldr r12, [%[a], #436]\n\t"
  57312. "ldr lr, [%[b], #436]\n\t"
  57313. "and r12, r12, r3\n\t"
  57314. "and lr, lr, r3\n\t"
  57315. "subs r12, r12, lr\n\t"
  57316. "it hi\n\t"
  57317. "movhi r2, r6\n\t"
  57318. "it lo\n\t"
  57319. "movlo r2, r3\n\t"
  57320. "it ne\n\t"
  57321. "movne r3, r5\n\t"
  57322. "ldr r12, [%[a], #432]\n\t"
  57323. "ldr lr, [%[b], #432]\n\t"
  57324. "and r12, r12, r3\n\t"
  57325. "and lr, lr, r3\n\t"
  57326. "subs r12, r12, lr\n\t"
  57327. "it hi\n\t"
  57328. "movhi r2, r6\n\t"
  57329. "it lo\n\t"
  57330. "movlo r2, r3\n\t"
  57331. "it ne\n\t"
  57332. "movne r3, r5\n\t"
  57333. "ldr r12, [%[a], #428]\n\t"
  57334. "ldr lr, [%[b], #428]\n\t"
  57335. "and r12, r12, r3\n\t"
  57336. "and lr, lr, r3\n\t"
  57337. "subs r12, r12, lr\n\t"
  57338. "it hi\n\t"
  57339. "movhi r2, r6\n\t"
  57340. "it lo\n\t"
  57341. "movlo r2, r3\n\t"
  57342. "it ne\n\t"
  57343. "movne r3, r5\n\t"
  57344. "ldr r12, [%[a], #424]\n\t"
  57345. "ldr lr, [%[b], #424]\n\t"
  57346. "and r12, r12, r3\n\t"
  57347. "and lr, lr, r3\n\t"
  57348. "subs r12, r12, lr\n\t"
  57349. "it hi\n\t"
  57350. "movhi r2, r6\n\t"
  57351. "it lo\n\t"
  57352. "movlo r2, r3\n\t"
  57353. "it ne\n\t"
  57354. "movne r3, r5\n\t"
  57355. "ldr r12, [%[a], #420]\n\t"
  57356. "ldr lr, [%[b], #420]\n\t"
  57357. "and r12, r12, r3\n\t"
  57358. "and lr, lr, r3\n\t"
  57359. "subs r12, r12, lr\n\t"
  57360. "it hi\n\t"
  57361. "movhi r2, r6\n\t"
  57362. "it lo\n\t"
  57363. "movlo r2, r3\n\t"
  57364. "it ne\n\t"
  57365. "movne r3, r5\n\t"
  57366. "ldr r12, [%[a], #416]\n\t"
  57367. "ldr lr, [%[b], #416]\n\t"
  57368. "and r12, r12, r3\n\t"
  57369. "and lr, lr, r3\n\t"
  57370. "subs r12, r12, lr\n\t"
  57371. "it hi\n\t"
  57372. "movhi r2, r6\n\t"
  57373. "it lo\n\t"
  57374. "movlo r2, r3\n\t"
  57375. "it ne\n\t"
  57376. "movne r3, r5\n\t"
  57377. "ldr r12, [%[a], #412]\n\t"
  57378. "ldr lr, [%[b], #412]\n\t"
  57379. "and r12, r12, r3\n\t"
  57380. "and lr, lr, r3\n\t"
  57381. "subs r12, r12, lr\n\t"
  57382. "it hi\n\t"
  57383. "movhi r2, r6\n\t"
  57384. "it lo\n\t"
  57385. "movlo r2, r3\n\t"
  57386. "it ne\n\t"
  57387. "movne r3, r5\n\t"
  57388. "ldr r12, [%[a], #408]\n\t"
  57389. "ldr lr, [%[b], #408]\n\t"
  57390. "and r12, r12, r3\n\t"
  57391. "and lr, lr, r3\n\t"
  57392. "subs r12, r12, lr\n\t"
  57393. "it hi\n\t"
  57394. "movhi r2, r6\n\t"
  57395. "it lo\n\t"
  57396. "movlo r2, r3\n\t"
  57397. "it ne\n\t"
  57398. "movne r3, r5\n\t"
  57399. "ldr r12, [%[a], #404]\n\t"
  57400. "ldr lr, [%[b], #404]\n\t"
  57401. "and r12, r12, r3\n\t"
  57402. "and lr, lr, r3\n\t"
  57403. "subs r12, r12, lr\n\t"
  57404. "it hi\n\t"
  57405. "movhi r2, r6\n\t"
  57406. "it lo\n\t"
  57407. "movlo r2, r3\n\t"
  57408. "it ne\n\t"
  57409. "movne r3, r5\n\t"
  57410. "ldr r12, [%[a], #400]\n\t"
  57411. "ldr lr, [%[b], #400]\n\t"
  57412. "and r12, r12, r3\n\t"
  57413. "and lr, lr, r3\n\t"
  57414. "subs r12, r12, lr\n\t"
  57415. "it hi\n\t"
  57416. "movhi r2, r6\n\t"
  57417. "it lo\n\t"
  57418. "movlo r2, r3\n\t"
  57419. "it ne\n\t"
  57420. "movne r3, r5\n\t"
  57421. "ldr r12, [%[a], #396]\n\t"
  57422. "ldr lr, [%[b], #396]\n\t"
  57423. "and r12, r12, r3\n\t"
  57424. "and lr, lr, r3\n\t"
  57425. "subs r12, r12, lr\n\t"
  57426. "it hi\n\t"
  57427. "movhi r2, r6\n\t"
  57428. "it lo\n\t"
  57429. "movlo r2, r3\n\t"
  57430. "it ne\n\t"
  57431. "movne r3, r5\n\t"
  57432. "ldr r12, [%[a], #392]\n\t"
  57433. "ldr lr, [%[b], #392]\n\t"
  57434. "and r12, r12, r3\n\t"
  57435. "and lr, lr, r3\n\t"
  57436. "subs r12, r12, lr\n\t"
  57437. "it hi\n\t"
  57438. "movhi r2, r6\n\t"
  57439. "it lo\n\t"
  57440. "movlo r2, r3\n\t"
  57441. "it ne\n\t"
  57442. "movne r3, r5\n\t"
  57443. "ldr r12, [%[a], #388]\n\t"
  57444. "ldr lr, [%[b], #388]\n\t"
  57445. "and r12, r12, r3\n\t"
  57446. "and lr, lr, r3\n\t"
  57447. "subs r12, r12, lr\n\t"
  57448. "it hi\n\t"
  57449. "movhi r2, r6\n\t"
  57450. "it lo\n\t"
  57451. "movlo r2, r3\n\t"
  57452. "it ne\n\t"
  57453. "movne r3, r5\n\t"
  57454. "ldr r12, [%[a], #384]\n\t"
  57455. "ldr lr, [%[b], #384]\n\t"
  57456. "and r12, r12, r3\n\t"
  57457. "and lr, lr, r3\n\t"
  57458. "subs r12, r12, lr\n\t"
  57459. "it hi\n\t"
  57460. "movhi r2, r6\n\t"
  57461. "it lo\n\t"
  57462. "movlo r2, r3\n\t"
  57463. "it ne\n\t"
  57464. "movne r3, r5\n\t"
  57465. "ldr r12, [%[a], #380]\n\t"
  57466. "ldr lr, [%[b], #380]\n\t"
  57467. "and r12, r12, r3\n\t"
  57468. "and lr, lr, r3\n\t"
  57469. "subs r12, r12, lr\n\t"
  57470. "it hi\n\t"
  57471. "movhi r2, r6\n\t"
  57472. "it lo\n\t"
  57473. "movlo r2, r3\n\t"
  57474. "it ne\n\t"
  57475. "movne r3, r5\n\t"
  57476. "ldr r12, [%[a], #376]\n\t"
  57477. "ldr lr, [%[b], #376]\n\t"
  57478. "and r12, r12, r3\n\t"
  57479. "and lr, lr, r3\n\t"
  57480. "subs r12, r12, lr\n\t"
  57481. "it hi\n\t"
  57482. "movhi r2, r6\n\t"
  57483. "it lo\n\t"
  57484. "movlo r2, r3\n\t"
  57485. "it ne\n\t"
  57486. "movne r3, r5\n\t"
  57487. "ldr r12, [%[a], #372]\n\t"
  57488. "ldr lr, [%[b], #372]\n\t"
  57489. "and r12, r12, r3\n\t"
  57490. "and lr, lr, r3\n\t"
  57491. "subs r12, r12, lr\n\t"
  57492. "it hi\n\t"
  57493. "movhi r2, r6\n\t"
  57494. "it lo\n\t"
  57495. "movlo r2, r3\n\t"
  57496. "it ne\n\t"
  57497. "movne r3, r5\n\t"
  57498. "ldr r12, [%[a], #368]\n\t"
  57499. "ldr lr, [%[b], #368]\n\t"
  57500. "and r12, r12, r3\n\t"
  57501. "and lr, lr, r3\n\t"
  57502. "subs r12, r12, lr\n\t"
  57503. "it hi\n\t"
  57504. "movhi r2, r6\n\t"
  57505. "it lo\n\t"
  57506. "movlo r2, r3\n\t"
  57507. "it ne\n\t"
  57508. "movne r3, r5\n\t"
  57509. "ldr r12, [%[a], #364]\n\t"
  57510. "ldr lr, [%[b], #364]\n\t"
  57511. "and r12, r12, r3\n\t"
  57512. "and lr, lr, r3\n\t"
  57513. "subs r12, r12, lr\n\t"
  57514. "it hi\n\t"
  57515. "movhi r2, r6\n\t"
  57516. "it lo\n\t"
  57517. "movlo r2, r3\n\t"
  57518. "it ne\n\t"
  57519. "movne r3, r5\n\t"
  57520. "ldr r12, [%[a], #360]\n\t"
  57521. "ldr lr, [%[b], #360]\n\t"
  57522. "and r12, r12, r3\n\t"
  57523. "and lr, lr, r3\n\t"
  57524. "subs r12, r12, lr\n\t"
  57525. "it hi\n\t"
  57526. "movhi r2, r6\n\t"
  57527. "it lo\n\t"
  57528. "movlo r2, r3\n\t"
  57529. "it ne\n\t"
  57530. "movne r3, r5\n\t"
  57531. "ldr r12, [%[a], #356]\n\t"
  57532. "ldr lr, [%[b], #356]\n\t"
  57533. "and r12, r12, r3\n\t"
  57534. "and lr, lr, r3\n\t"
  57535. "subs r12, r12, lr\n\t"
  57536. "it hi\n\t"
  57537. "movhi r2, r6\n\t"
  57538. "it lo\n\t"
  57539. "movlo r2, r3\n\t"
  57540. "it ne\n\t"
  57541. "movne r3, r5\n\t"
  57542. "ldr r12, [%[a], #352]\n\t"
  57543. "ldr lr, [%[b], #352]\n\t"
  57544. "and r12, r12, r3\n\t"
  57545. "and lr, lr, r3\n\t"
  57546. "subs r12, r12, lr\n\t"
  57547. "it hi\n\t"
  57548. "movhi r2, r6\n\t"
  57549. "it lo\n\t"
  57550. "movlo r2, r3\n\t"
  57551. "it ne\n\t"
  57552. "movne r3, r5\n\t"
  57553. "ldr r12, [%[a], #348]\n\t"
  57554. "ldr lr, [%[b], #348]\n\t"
  57555. "and r12, r12, r3\n\t"
  57556. "and lr, lr, r3\n\t"
  57557. "subs r12, r12, lr\n\t"
  57558. "it hi\n\t"
  57559. "movhi r2, r6\n\t"
  57560. "it lo\n\t"
  57561. "movlo r2, r3\n\t"
  57562. "it ne\n\t"
  57563. "movne r3, r5\n\t"
  57564. "ldr r12, [%[a], #344]\n\t"
  57565. "ldr lr, [%[b], #344]\n\t"
  57566. "and r12, r12, r3\n\t"
  57567. "and lr, lr, r3\n\t"
  57568. "subs r12, r12, lr\n\t"
  57569. "it hi\n\t"
  57570. "movhi r2, r6\n\t"
  57571. "it lo\n\t"
  57572. "movlo r2, r3\n\t"
  57573. "it ne\n\t"
  57574. "movne r3, r5\n\t"
  57575. "ldr r12, [%[a], #340]\n\t"
  57576. "ldr lr, [%[b], #340]\n\t"
  57577. "and r12, r12, r3\n\t"
  57578. "and lr, lr, r3\n\t"
  57579. "subs r12, r12, lr\n\t"
  57580. "it hi\n\t"
  57581. "movhi r2, r6\n\t"
  57582. "it lo\n\t"
  57583. "movlo r2, r3\n\t"
  57584. "it ne\n\t"
  57585. "movne r3, r5\n\t"
  57586. "ldr r12, [%[a], #336]\n\t"
  57587. "ldr lr, [%[b], #336]\n\t"
  57588. "and r12, r12, r3\n\t"
  57589. "and lr, lr, r3\n\t"
  57590. "subs r12, r12, lr\n\t"
  57591. "it hi\n\t"
  57592. "movhi r2, r6\n\t"
  57593. "it lo\n\t"
  57594. "movlo r2, r3\n\t"
  57595. "it ne\n\t"
  57596. "movne r3, r5\n\t"
  57597. "ldr r12, [%[a], #332]\n\t"
  57598. "ldr lr, [%[b], #332]\n\t"
  57599. "and r12, r12, r3\n\t"
  57600. "and lr, lr, r3\n\t"
  57601. "subs r12, r12, lr\n\t"
  57602. "it hi\n\t"
  57603. "movhi r2, r6\n\t"
  57604. "it lo\n\t"
  57605. "movlo r2, r3\n\t"
  57606. "it ne\n\t"
  57607. "movne r3, r5\n\t"
  57608. "ldr r12, [%[a], #328]\n\t"
  57609. "ldr lr, [%[b], #328]\n\t"
  57610. "and r12, r12, r3\n\t"
  57611. "and lr, lr, r3\n\t"
  57612. "subs r12, r12, lr\n\t"
  57613. "it hi\n\t"
  57614. "movhi r2, r6\n\t"
  57615. "it lo\n\t"
  57616. "movlo r2, r3\n\t"
  57617. "it ne\n\t"
  57618. "movne r3, r5\n\t"
  57619. "ldr r12, [%[a], #324]\n\t"
  57620. "ldr lr, [%[b], #324]\n\t"
  57621. "and r12, r12, r3\n\t"
  57622. "and lr, lr, r3\n\t"
  57623. "subs r12, r12, lr\n\t"
  57624. "it hi\n\t"
  57625. "movhi r2, r6\n\t"
  57626. "it lo\n\t"
  57627. "movlo r2, r3\n\t"
  57628. "it ne\n\t"
  57629. "movne r3, r5\n\t"
  57630. "ldr r12, [%[a], #320]\n\t"
  57631. "ldr lr, [%[b], #320]\n\t"
  57632. "and r12, r12, r3\n\t"
  57633. "and lr, lr, r3\n\t"
  57634. "subs r12, r12, lr\n\t"
  57635. "it hi\n\t"
  57636. "movhi r2, r6\n\t"
  57637. "it lo\n\t"
  57638. "movlo r2, r3\n\t"
  57639. "it ne\n\t"
  57640. "movne r3, r5\n\t"
  57641. "ldr r12, [%[a], #316]\n\t"
  57642. "ldr lr, [%[b], #316]\n\t"
  57643. "and r12, r12, r3\n\t"
  57644. "and lr, lr, r3\n\t"
  57645. "subs r12, r12, lr\n\t"
  57646. "it hi\n\t"
  57647. "movhi r2, r6\n\t"
  57648. "it lo\n\t"
  57649. "movlo r2, r3\n\t"
  57650. "it ne\n\t"
  57651. "movne r3, r5\n\t"
  57652. "ldr r12, [%[a], #312]\n\t"
  57653. "ldr lr, [%[b], #312]\n\t"
  57654. "and r12, r12, r3\n\t"
  57655. "and lr, lr, r3\n\t"
  57656. "subs r12, r12, lr\n\t"
  57657. "it hi\n\t"
  57658. "movhi r2, r6\n\t"
  57659. "it lo\n\t"
  57660. "movlo r2, r3\n\t"
  57661. "it ne\n\t"
  57662. "movne r3, r5\n\t"
  57663. "ldr r12, [%[a], #308]\n\t"
  57664. "ldr lr, [%[b], #308]\n\t"
  57665. "and r12, r12, r3\n\t"
  57666. "and lr, lr, r3\n\t"
  57667. "subs r12, r12, lr\n\t"
  57668. "it hi\n\t"
  57669. "movhi r2, r6\n\t"
  57670. "it lo\n\t"
  57671. "movlo r2, r3\n\t"
  57672. "it ne\n\t"
  57673. "movne r3, r5\n\t"
  57674. "ldr r12, [%[a], #304]\n\t"
  57675. "ldr lr, [%[b], #304]\n\t"
  57676. "and r12, r12, r3\n\t"
  57677. "and lr, lr, r3\n\t"
  57678. "subs r12, r12, lr\n\t"
  57679. "it hi\n\t"
  57680. "movhi r2, r6\n\t"
  57681. "it lo\n\t"
  57682. "movlo r2, r3\n\t"
  57683. "it ne\n\t"
  57684. "movne r3, r5\n\t"
  57685. "ldr r12, [%[a], #300]\n\t"
  57686. "ldr lr, [%[b], #300]\n\t"
  57687. "and r12, r12, r3\n\t"
  57688. "and lr, lr, r3\n\t"
  57689. "subs r12, r12, lr\n\t"
  57690. "it hi\n\t"
  57691. "movhi r2, r6\n\t"
  57692. "it lo\n\t"
  57693. "movlo r2, r3\n\t"
  57694. "it ne\n\t"
  57695. "movne r3, r5\n\t"
  57696. "ldr r12, [%[a], #296]\n\t"
  57697. "ldr lr, [%[b], #296]\n\t"
  57698. "and r12, r12, r3\n\t"
  57699. "and lr, lr, r3\n\t"
  57700. "subs r12, r12, lr\n\t"
  57701. "it hi\n\t"
  57702. "movhi r2, r6\n\t"
  57703. "it lo\n\t"
  57704. "movlo r2, r3\n\t"
  57705. "it ne\n\t"
  57706. "movne r3, r5\n\t"
  57707. "ldr r12, [%[a], #292]\n\t"
  57708. "ldr lr, [%[b], #292]\n\t"
  57709. "and r12, r12, r3\n\t"
  57710. "and lr, lr, r3\n\t"
  57711. "subs r12, r12, lr\n\t"
  57712. "it hi\n\t"
  57713. "movhi r2, r6\n\t"
  57714. "it lo\n\t"
  57715. "movlo r2, r3\n\t"
  57716. "it ne\n\t"
  57717. "movne r3, r5\n\t"
  57718. "ldr r12, [%[a], #288]\n\t"
  57719. "ldr lr, [%[b], #288]\n\t"
  57720. "and r12, r12, r3\n\t"
  57721. "and lr, lr, r3\n\t"
  57722. "subs r12, r12, lr\n\t"
  57723. "it hi\n\t"
  57724. "movhi r2, r6\n\t"
  57725. "it lo\n\t"
  57726. "movlo r2, r3\n\t"
  57727. "it ne\n\t"
  57728. "movne r3, r5\n\t"
  57729. "ldr r12, [%[a], #284]\n\t"
  57730. "ldr lr, [%[b], #284]\n\t"
  57731. "and r12, r12, r3\n\t"
  57732. "and lr, lr, r3\n\t"
  57733. "subs r12, r12, lr\n\t"
  57734. "it hi\n\t"
  57735. "movhi r2, r6\n\t"
  57736. "it lo\n\t"
  57737. "movlo r2, r3\n\t"
  57738. "it ne\n\t"
  57739. "movne r3, r5\n\t"
  57740. "ldr r12, [%[a], #280]\n\t"
  57741. "ldr lr, [%[b], #280]\n\t"
  57742. "and r12, r12, r3\n\t"
  57743. "and lr, lr, r3\n\t"
  57744. "subs r12, r12, lr\n\t"
  57745. "it hi\n\t"
  57746. "movhi r2, r6\n\t"
  57747. "it lo\n\t"
  57748. "movlo r2, r3\n\t"
  57749. "it ne\n\t"
  57750. "movne r3, r5\n\t"
  57751. "ldr r12, [%[a], #276]\n\t"
  57752. "ldr lr, [%[b], #276]\n\t"
  57753. "and r12, r12, r3\n\t"
  57754. "and lr, lr, r3\n\t"
  57755. "subs r12, r12, lr\n\t"
  57756. "it hi\n\t"
  57757. "movhi r2, r6\n\t"
  57758. "it lo\n\t"
  57759. "movlo r2, r3\n\t"
  57760. "it ne\n\t"
  57761. "movne r3, r5\n\t"
  57762. "ldr r12, [%[a], #272]\n\t"
  57763. "ldr lr, [%[b], #272]\n\t"
  57764. "and r12, r12, r3\n\t"
  57765. "and lr, lr, r3\n\t"
  57766. "subs r12, r12, lr\n\t"
  57767. "it hi\n\t"
  57768. "movhi r2, r6\n\t"
  57769. "it lo\n\t"
  57770. "movlo r2, r3\n\t"
  57771. "it ne\n\t"
  57772. "movne r3, r5\n\t"
  57773. "ldr r12, [%[a], #268]\n\t"
  57774. "ldr lr, [%[b], #268]\n\t"
  57775. "and r12, r12, r3\n\t"
  57776. "and lr, lr, r3\n\t"
  57777. "subs r12, r12, lr\n\t"
  57778. "it hi\n\t"
  57779. "movhi r2, r6\n\t"
  57780. "it lo\n\t"
  57781. "movlo r2, r3\n\t"
  57782. "it ne\n\t"
  57783. "movne r3, r5\n\t"
  57784. "ldr r12, [%[a], #264]\n\t"
  57785. "ldr lr, [%[b], #264]\n\t"
  57786. "and r12, r12, r3\n\t"
  57787. "and lr, lr, r3\n\t"
  57788. "subs r12, r12, lr\n\t"
  57789. "it hi\n\t"
  57790. "movhi r2, r6\n\t"
  57791. "it lo\n\t"
  57792. "movlo r2, r3\n\t"
  57793. "it ne\n\t"
  57794. "movne r3, r5\n\t"
  57795. "ldr r12, [%[a], #260]\n\t"
  57796. "ldr lr, [%[b], #260]\n\t"
  57797. "and r12, r12, r3\n\t"
  57798. "and lr, lr, r3\n\t"
  57799. "subs r12, r12, lr\n\t"
  57800. "it hi\n\t"
  57801. "movhi r2, r6\n\t"
  57802. "it lo\n\t"
  57803. "movlo r2, r3\n\t"
  57804. "it ne\n\t"
  57805. "movne r3, r5\n\t"
  57806. "ldr r12, [%[a], #256]\n\t"
  57807. "ldr lr, [%[b], #256]\n\t"
  57808. "and r12, r12, r3\n\t"
  57809. "and lr, lr, r3\n\t"
  57810. "subs r12, r12, lr\n\t"
  57811. "it hi\n\t"
  57812. "movhi r2, r6\n\t"
  57813. "it lo\n\t"
  57814. "movlo r2, r3\n\t"
  57815. "it ne\n\t"
  57816. "movne r3, r5\n\t"
  57817. "ldr r12, [%[a], #252]\n\t"
  57818. "ldr lr, [%[b], #252]\n\t"
  57819. "and r12, r12, r3\n\t"
  57820. "and lr, lr, r3\n\t"
  57821. "subs r12, r12, lr\n\t"
  57822. "it hi\n\t"
  57823. "movhi r2, r6\n\t"
  57824. "it lo\n\t"
  57825. "movlo r2, r3\n\t"
  57826. "it ne\n\t"
  57827. "movne r3, r5\n\t"
  57828. "ldr r12, [%[a], #248]\n\t"
  57829. "ldr lr, [%[b], #248]\n\t"
  57830. "and r12, r12, r3\n\t"
  57831. "and lr, lr, r3\n\t"
  57832. "subs r12, r12, lr\n\t"
  57833. "it hi\n\t"
  57834. "movhi r2, r6\n\t"
  57835. "it lo\n\t"
  57836. "movlo r2, r3\n\t"
  57837. "it ne\n\t"
  57838. "movne r3, r5\n\t"
  57839. "ldr r12, [%[a], #244]\n\t"
  57840. "ldr lr, [%[b], #244]\n\t"
  57841. "and r12, r12, r3\n\t"
  57842. "and lr, lr, r3\n\t"
  57843. "subs r12, r12, lr\n\t"
  57844. "it hi\n\t"
  57845. "movhi r2, r6\n\t"
  57846. "it lo\n\t"
  57847. "movlo r2, r3\n\t"
  57848. "it ne\n\t"
  57849. "movne r3, r5\n\t"
  57850. "ldr r12, [%[a], #240]\n\t"
  57851. "ldr lr, [%[b], #240]\n\t"
  57852. "and r12, r12, r3\n\t"
  57853. "and lr, lr, r3\n\t"
  57854. "subs r12, r12, lr\n\t"
  57855. "it hi\n\t"
  57856. "movhi r2, r6\n\t"
  57857. "it lo\n\t"
  57858. "movlo r2, r3\n\t"
  57859. "it ne\n\t"
  57860. "movne r3, r5\n\t"
  57861. "ldr r12, [%[a], #236]\n\t"
  57862. "ldr lr, [%[b], #236]\n\t"
  57863. "and r12, r12, r3\n\t"
  57864. "and lr, lr, r3\n\t"
  57865. "subs r12, r12, lr\n\t"
  57866. "it hi\n\t"
  57867. "movhi r2, r6\n\t"
  57868. "it lo\n\t"
  57869. "movlo r2, r3\n\t"
  57870. "it ne\n\t"
  57871. "movne r3, r5\n\t"
  57872. "ldr r12, [%[a], #232]\n\t"
  57873. "ldr lr, [%[b], #232]\n\t"
  57874. "and r12, r12, r3\n\t"
  57875. "and lr, lr, r3\n\t"
  57876. "subs r12, r12, lr\n\t"
  57877. "it hi\n\t"
  57878. "movhi r2, r6\n\t"
  57879. "it lo\n\t"
  57880. "movlo r2, r3\n\t"
  57881. "it ne\n\t"
  57882. "movne r3, r5\n\t"
  57883. "ldr r12, [%[a], #228]\n\t"
  57884. "ldr lr, [%[b], #228]\n\t"
  57885. "and r12, r12, r3\n\t"
  57886. "and lr, lr, r3\n\t"
  57887. "subs r12, r12, lr\n\t"
  57888. "it hi\n\t"
  57889. "movhi r2, r6\n\t"
  57890. "it lo\n\t"
  57891. "movlo r2, r3\n\t"
  57892. "it ne\n\t"
  57893. "movne r3, r5\n\t"
  57894. "ldr r12, [%[a], #224]\n\t"
  57895. "ldr lr, [%[b], #224]\n\t"
  57896. "and r12, r12, r3\n\t"
  57897. "and lr, lr, r3\n\t"
  57898. "subs r12, r12, lr\n\t"
  57899. "it hi\n\t"
  57900. "movhi r2, r6\n\t"
  57901. "it lo\n\t"
  57902. "movlo r2, r3\n\t"
  57903. "it ne\n\t"
  57904. "movne r3, r5\n\t"
  57905. "ldr r12, [%[a], #220]\n\t"
  57906. "ldr lr, [%[b], #220]\n\t"
  57907. "and r12, r12, r3\n\t"
  57908. "and lr, lr, r3\n\t"
  57909. "subs r12, r12, lr\n\t"
  57910. "it hi\n\t"
  57911. "movhi r2, r6\n\t"
  57912. "it lo\n\t"
  57913. "movlo r2, r3\n\t"
  57914. "it ne\n\t"
  57915. "movne r3, r5\n\t"
  57916. "ldr r12, [%[a], #216]\n\t"
  57917. "ldr lr, [%[b], #216]\n\t"
  57918. "and r12, r12, r3\n\t"
  57919. "and lr, lr, r3\n\t"
  57920. "subs r12, r12, lr\n\t"
  57921. "it hi\n\t"
  57922. "movhi r2, r6\n\t"
  57923. "it lo\n\t"
  57924. "movlo r2, r3\n\t"
  57925. "it ne\n\t"
  57926. "movne r3, r5\n\t"
  57927. "ldr r12, [%[a], #212]\n\t"
  57928. "ldr lr, [%[b], #212]\n\t"
  57929. "and r12, r12, r3\n\t"
  57930. "and lr, lr, r3\n\t"
  57931. "subs r12, r12, lr\n\t"
  57932. "it hi\n\t"
  57933. "movhi r2, r6\n\t"
  57934. "it lo\n\t"
  57935. "movlo r2, r3\n\t"
  57936. "it ne\n\t"
  57937. "movne r3, r5\n\t"
  57938. "ldr r12, [%[a], #208]\n\t"
  57939. "ldr lr, [%[b], #208]\n\t"
  57940. "and r12, r12, r3\n\t"
  57941. "and lr, lr, r3\n\t"
  57942. "subs r12, r12, lr\n\t"
  57943. "it hi\n\t"
  57944. "movhi r2, r6\n\t"
  57945. "it lo\n\t"
  57946. "movlo r2, r3\n\t"
  57947. "it ne\n\t"
  57948. "movne r3, r5\n\t"
  57949. "ldr r12, [%[a], #204]\n\t"
  57950. "ldr lr, [%[b], #204]\n\t"
  57951. "and r12, r12, r3\n\t"
  57952. "and lr, lr, r3\n\t"
  57953. "subs r12, r12, lr\n\t"
  57954. "it hi\n\t"
  57955. "movhi r2, r6\n\t"
  57956. "it lo\n\t"
  57957. "movlo r2, r3\n\t"
  57958. "it ne\n\t"
  57959. "movne r3, r5\n\t"
  57960. "ldr r12, [%[a], #200]\n\t"
  57961. "ldr lr, [%[b], #200]\n\t"
  57962. "and r12, r12, r3\n\t"
  57963. "and lr, lr, r3\n\t"
  57964. "subs r12, r12, lr\n\t"
  57965. "it hi\n\t"
  57966. "movhi r2, r6\n\t"
  57967. "it lo\n\t"
  57968. "movlo r2, r3\n\t"
  57969. "it ne\n\t"
  57970. "movne r3, r5\n\t"
  57971. "ldr r12, [%[a], #196]\n\t"
  57972. "ldr lr, [%[b], #196]\n\t"
  57973. "and r12, r12, r3\n\t"
  57974. "and lr, lr, r3\n\t"
  57975. "subs r12, r12, lr\n\t"
  57976. "it hi\n\t"
  57977. "movhi r2, r6\n\t"
  57978. "it lo\n\t"
  57979. "movlo r2, r3\n\t"
  57980. "it ne\n\t"
  57981. "movne r3, r5\n\t"
  57982. "ldr r12, [%[a], #192]\n\t"
  57983. "ldr lr, [%[b], #192]\n\t"
  57984. "and r12, r12, r3\n\t"
  57985. "and lr, lr, r3\n\t"
  57986. "subs r12, r12, lr\n\t"
  57987. "it hi\n\t"
  57988. "movhi r2, r6\n\t"
  57989. "it lo\n\t"
  57990. "movlo r2, r3\n\t"
  57991. "it ne\n\t"
  57992. "movne r3, r5\n\t"
  57993. "ldr r12, [%[a], #188]\n\t"
  57994. "ldr lr, [%[b], #188]\n\t"
  57995. "and r12, r12, r3\n\t"
  57996. "and lr, lr, r3\n\t"
  57997. "subs r12, r12, lr\n\t"
  57998. "it hi\n\t"
  57999. "movhi r2, r6\n\t"
  58000. "it lo\n\t"
  58001. "movlo r2, r3\n\t"
  58002. "it ne\n\t"
  58003. "movne r3, r5\n\t"
  58004. "ldr r12, [%[a], #184]\n\t"
  58005. "ldr lr, [%[b], #184]\n\t"
  58006. "and r12, r12, r3\n\t"
  58007. "and lr, lr, r3\n\t"
  58008. "subs r12, r12, lr\n\t"
  58009. "it hi\n\t"
  58010. "movhi r2, r6\n\t"
  58011. "it lo\n\t"
  58012. "movlo r2, r3\n\t"
  58013. "it ne\n\t"
  58014. "movne r3, r5\n\t"
  58015. "ldr r12, [%[a], #180]\n\t"
  58016. "ldr lr, [%[b], #180]\n\t"
  58017. "and r12, r12, r3\n\t"
  58018. "and lr, lr, r3\n\t"
  58019. "subs r12, r12, lr\n\t"
  58020. "it hi\n\t"
  58021. "movhi r2, r6\n\t"
  58022. "it lo\n\t"
  58023. "movlo r2, r3\n\t"
  58024. "it ne\n\t"
  58025. "movne r3, r5\n\t"
  58026. "ldr r12, [%[a], #176]\n\t"
  58027. "ldr lr, [%[b], #176]\n\t"
  58028. "and r12, r12, r3\n\t"
  58029. "and lr, lr, r3\n\t"
  58030. "subs r12, r12, lr\n\t"
  58031. "it hi\n\t"
  58032. "movhi r2, r6\n\t"
  58033. "it lo\n\t"
  58034. "movlo r2, r3\n\t"
  58035. "it ne\n\t"
  58036. "movne r3, r5\n\t"
  58037. "ldr r12, [%[a], #172]\n\t"
  58038. "ldr lr, [%[b], #172]\n\t"
  58039. "and r12, r12, r3\n\t"
  58040. "and lr, lr, r3\n\t"
  58041. "subs r12, r12, lr\n\t"
  58042. "it hi\n\t"
  58043. "movhi r2, r6\n\t"
  58044. "it lo\n\t"
  58045. "movlo r2, r3\n\t"
  58046. "it ne\n\t"
  58047. "movne r3, r5\n\t"
  58048. "ldr r12, [%[a], #168]\n\t"
  58049. "ldr lr, [%[b], #168]\n\t"
  58050. "and r12, r12, r3\n\t"
  58051. "and lr, lr, r3\n\t"
  58052. "subs r12, r12, lr\n\t"
  58053. "it hi\n\t"
  58054. "movhi r2, r6\n\t"
  58055. "it lo\n\t"
  58056. "movlo r2, r3\n\t"
  58057. "it ne\n\t"
  58058. "movne r3, r5\n\t"
  58059. "ldr r12, [%[a], #164]\n\t"
  58060. "ldr lr, [%[b], #164]\n\t"
  58061. "and r12, r12, r3\n\t"
  58062. "and lr, lr, r3\n\t"
  58063. "subs r12, r12, lr\n\t"
  58064. "it hi\n\t"
  58065. "movhi r2, r6\n\t"
  58066. "it lo\n\t"
  58067. "movlo r2, r3\n\t"
  58068. "it ne\n\t"
  58069. "movne r3, r5\n\t"
  58070. "ldr r12, [%[a], #160]\n\t"
  58071. "ldr lr, [%[b], #160]\n\t"
  58072. "and r12, r12, r3\n\t"
  58073. "and lr, lr, r3\n\t"
  58074. "subs r12, r12, lr\n\t"
  58075. "it hi\n\t"
  58076. "movhi r2, r6\n\t"
  58077. "it lo\n\t"
  58078. "movlo r2, r3\n\t"
  58079. "it ne\n\t"
  58080. "movne r3, r5\n\t"
  58081. "ldr r12, [%[a], #156]\n\t"
  58082. "ldr lr, [%[b], #156]\n\t"
  58083. "and r12, r12, r3\n\t"
  58084. "and lr, lr, r3\n\t"
  58085. "subs r12, r12, lr\n\t"
  58086. "it hi\n\t"
  58087. "movhi r2, r6\n\t"
  58088. "it lo\n\t"
  58089. "movlo r2, r3\n\t"
  58090. "it ne\n\t"
  58091. "movne r3, r5\n\t"
  58092. "ldr r12, [%[a], #152]\n\t"
  58093. "ldr lr, [%[b], #152]\n\t"
  58094. "and r12, r12, r3\n\t"
  58095. "and lr, lr, r3\n\t"
  58096. "subs r12, r12, lr\n\t"
  58097. "it hi\n\t"
  58098. "movhi r2, r6\n\t"
  58099. "it lo\n\t"
  58100. "movlo r2, r3\n\t"
  58101. "it ne\n\t"
  58102. "movne r3, r5\n\t"
  58103. "ldr r12, [%[a], #148]\n\t"
  58104. "ldr lr, [%[b], #148]\n\t"
  58105. "and r12, r12, r3\n\t"
  58106. "and lr, lr, r3\n\t"
  58107. "subs r12, r12, lr\n\t"
  58108. "it hi\n\t"
  58109. "movhi r2, r6\n\t"
  58110. "it lo\n\t"
  58111. "movlo r2, r3\n\t"
  58112. "it ne\n\t"
  58113. "movne r3, r5\n\t"
  58114. "ldr r12, [%[a], #144]\n\t"
  58115. "ldr lr, [%[b], #144]\n\t"
  58116. "and r12, r12, r3\n\t"
  58117. "and lr, lr, r3\n\t"
  58118. "subs r12, r12, lr\n\t"
  58119. "it hi\n\t"
  58120. "movhi r2, r6\n\t"
  58121. "it lo\n\t"
  58122. "movlo r2, r3\n\t"
  58123. "it ne\n\t"
  58124. "movne r3, r5\n\t"
  58125. "ldr r12, [%[a], #140]\n\t"
  58126. "ldr lr, [%[b], #140]\n\t"
  58127. "and r12, r12, r3\n\t"
  58128. "and lr, lr, r3\n\t"
  58129. "subs r12, r12, lr\n\t"
  58130. "it hi\n\t"
  58131. "movhi r2, r6\n\t"
  58132. "it lo\n\t"
  58133. "movlo r2, r3\n\t"
  58134. "it ne\n\t"
  58135. "movne r3, r5\n\t"
  58136. "ldr r12, [%[a], #136]\n\t"
  58137. "ldr lr, [%[b], #136]\n\t"
  58138. "and r12, r12, r3\n\t"
  58139. "and lr, lr, r3\n\t"
  58140. "subs r12, r12, lr\n\t"
  58141. "it hi\n\t"
  58142. "movhi r2, r6\n\t"
  58143. "it lo\n\t"
  58144. "movlo r2, r3\n\t"
  58145. "it ne\n\t"
  58146. "movne r3, r5\n\t"
  58147. "ldr r12, [%[a], #132]\n\t"
  58148. "ldr lr, [%[b], #132]\n\t"
  58149. "and r12, r12, r3\n\t"
  58150. "and lr, lr, r3\n\t"
  58151. "subs r12, r12, lr\n\t"
  58152. "it hi\n\t"
  58153. "movhi r2, r6\n\t"
  58154. "it lo\n\t"
  58155. "movlo r2, r3\n\t"
  58156. "it ne\n\t"
  58157. "movne r3, r5\n\t"
  58158. "ldr r12, [%[a], #128]\n\t"
  58159. "ldr lr, [%[b], #128]\n\t"
  58160. "and r12, r12, r3\n\t"
  58161. "and lr, lr, r3\n\t"
  58162. "subs r12, r12, lr\n\t"
  58163. "it hi\n\t"
  58164. "movhi r2, r6\n\t"
  58165. "it lo\n\t"
  58166. "movlo r2, r3\n\t"
  58167. "it ne\n\t"
  58168. "movne r3, r5\n\t"
  58169. "ldr r12, [%[a], #124]\n\t"
  58170. "ldr lr, [%[b], #124]\n\t"
  58171. "and r12, r12, r3\n\t"
  58172. "and lr, lr, r3\n\t"
  58173. "subs r12, r12, lr\n\t"
  58174. "it hi\n\t"
  58175. "movhi r2, r6\n\t"
  58176. "it lo\n\t"
  58177. "movlo r2, r3\n\t"
  58178. "it ne\n\t"
  58179. "movne r3, r5\n\t"
  58180. "ldr r12, [%[a], #120]\n\t"
  58181. "ldr lr, [%[b], #120]\n\t"
  58182. "and r12, r12, r3\n\t"
  58183. "and lr, lr, r3\n\t"
  58184. "subs r12, r12, lr\n\t"
  58185. "it hi\n\t"
  58186. "movhi r2, r6\n\t"
  58187. "it lo\n\t"
  58188. "movlo r2, r3\n\t"
  58189. "it ne\n\t"
  58190. "movne r3, r5\n\t"
  58191. "ldr r12, [%[a], #116]\n\t"
  58192. "ldr lr, [%[b], #116]\n\t"
  58193. "and r12, r12, r3\n\t"
  58194. "and lr, lr, r3\n\t"
  58195. "subs r12, r12, lr\n\t"
  58196. "it hi\n\t"
  58197. "movhi r2, r6\n\t"
  58198. "it lo\n\t"
  58199. "movlo r2, r3\n\t"
  58200. "it ne\n\t"
  58201. "movne r3, r5\n\t"
  58202. "ldr r12, [%[a], #112]\n\t"
  58203. "ldr lr, [%[b], #112]\n\t"
  58204. "and r12, r12, r3\n\t"
  58205. "and lr, lr, r3\n\t"
  58206. "subs r12, r12, lr\n\t"
  58207. "it hi\n\t"
  58208. "movhi r2, r6\n\t"
  58209. "it lo\n\t"
  58210. "movlo r2, r3\n\t"
  58211. "it ne\n\t"
  58212. "movne r3, r5\n\t"
  58213. "ldr r12, [%[a], #108]\n\t"
  58214. "ldr lr, [%[b], #108]\n\t"
  58215. "and r12, r12, r3\n\t"
  58216. "and lr, lr, r3\n\t"
  58217. "subs r12, r12, lr\n\t"
  58218. "it hi\n\t"
  58219. "movhi r2, r6\n\t"
  58220. "it lo\n\t"
  58221. "movlo r2, r3\n\t"
  58222. "it ne\n\t"
  58223. "movne r3, r5\n\t"
  58224. "ldr r12, [%[a], #104]\n\t"
  58225. "ldr lr, [%[b], #104]\n\t"
  58226. "and r12, r12, r3\n\t"
  58227. "and lr, lr, r3\n\t"
  58228. "subs r12, r12, lr\n\t"
  58229. "it hi\n\t"
  58230. "movhi r2, r6\n\t"
  58231. "it lo\n\t"
  58232. "movlo r2, r3\n\t"
  58233. "it ne\n\t"
  58234. "movne r3, r5\n\t"
  58235. "ldr r12, [%[a], #100]\n\t"
  58236. "ldr lr, [%[b], #100]\n\t"
  58237. "and r12, r12, r3\n\t"
  58238. "and lr, lr, r3\n\t"
  58239. "subs r12, r12, lr\n\t"
  58240. "it hi\n\t"
  58241. "movhi r2, r6\n\t"
  58242. "it lo\n\t"
  58243. "movlo r2, r3\n\t"
  58244. "it ne\n\t"
  58245. "movne r3, r5\n\t"
  58246. "ldr r12, [%[a], #96]\n\t"
  58247. "ldr lr, [%[b], #96]\n\t"
  58248. "and r12, r12, r3\n\t"
  58249. "and lr, lr, r3\n\t"
  58250. "subs r12, r12, lr\n\t"
  58251. "it hi\n\t"
  58252. "movhi r2, r6\n\t"
  58253. "it lo\n\t"
  58254. "movlo r2, r3\n\t"
  58255. "it ne\n\t"
  58256. "movne r3, r5\n\t"
  58257. "ldr r12, [%[a], #92]\n\t"
  58258. "ldr lr, [%[b], #92]\n\t"
  58259. "and r12, r12, r3\n\t"
  58260. "and lr, lr, r3\n\t"
  58261. "subs r12, r12, lr\n\t"
  58262. "it hi\n\t"
  58263. "movhi r2, r6\n\t"
  58264. "it lo\n\t"
  58265. "movlo r2, r3\n\t"
  58266. "it ne\n\t"
  58267. "movne r3, r5\n\t"
  58268. "ldr r12, [%[a], #88]\n\t"
  58269. "ldr lr, [%[b], #88]\n\t"
  58270. "and r12, r12, r3\n\t"
  58271. "and lr, lr, r3\n\t"
  58272. "subs r12, r12, lr\n\t"
  58273. "it hi\n\t"
  58274. "movhi r2, r6\n\t"
  58275. "it lo\n\t"
  58276. "movlo r2, r3\n\t"
  58277. "it ne\n\t"
  58278. "movne r3, r5\n\t"
  58279. "ldr r12, [%[a], #84]\n\t"
  58280. "ldr lr, [%[b], #84]\n\t"
  58281. "and r12, r12, r3\n\t"
  58282. "and lr, lr, r3\n\t"
  58283. "subs r12, r12, lr\n\t"
  58284. "it hi\n\t"
  58285. "movhi r2, r6\n\t"
  58286. "it lo\n\t"
  58287. "movlo r2, r3\n\t"
  58288. "it ne\n\t"
  58289. "movne r3, r5\n\t"
  58290. "ldr r12, [%[a], #80]\n\t"
  58291. "ldr lr, [%[b], #80]\n\t"
  58292. "and r12, r12, r3\n\t"
  58293. "and lr, lr, r3\n\t"
  58294. "subs r12, r12, lr\n\t"
  58295. "it hi\n\t"
  58296. "movhi r2, r6\n\t"
  58297. "it lo\n\t"
  58298. "movlo r2, r3\n\t"
  58299. "it ne\n\t"
  58300. "movne r3, r5\n\t"
  58301. "ldr r12, [%[a], #76]\n\t"
  58302. "ldr lr, [%[b], #76]\n\t"
  58303. "and r12, r12, r3\n\t"
  58304. "and lr, lr, r3\n\t"
  58305. "subs r12, r12, lr\n\t"
  58306. "it hi\n\t"
  58307. "movhi r2, r6\n\t"
  58308. "it lo\n\t"
  58309. "movlo r2, r3\n\t"
  58310. "it ne\n\t"
  58311. "movne r3, r5\n\t"
  58312. "ldr r12, [%[a], #72]\n\t"
  58313. "ldr lr, [%[b], #72]\n\t"
  58314. "and r12, r12, r3\n\t"
  58315. "and lr, lr, r3\n\t"
  58316. "subs r12, r12, lr\n\t"
  58317. "it hi\n\t"
  58318. "movhi r2, r6\n\t"
  58319. "it lo\n\t"
  58320. "movlo r2, r3\n\t"
  58321. "it ne\n\t"
  58322. "movne r3, r5\n\t"
  58323. "ldr r12, [%[a], #68]\n\t"
  58324. "ldr lr, [%[b], #68]\n\t"
  58325. "and r12, r12, r3\n\t"
  58326. "and lr, lr, r3\n\t"
  58327. "subs r12, r12, lr\n\t"
  58328. "it hi\n\t"
  58329. "movhi r2, r6\n\t"
  58330. "it lo\n\t"
  58331. "movlo r2, r3\n\t"
  58332. "it ne\n\t"
  58333. "movne r3, r5\n\t"
  58334. "ldr r12, [%[a], #64]\n\t"
  58335. "ldr lr, [%[b], #64]\n\t"
  58336. "and r12, r12, r3\n\t"
  58337. "and lr, lr, r3\n\t"
  58338. "subs r12, r12, lr\n\t"
  58339. "it hi\n\t"
  58340. "movhi r2, r6\n\t"
  58341. "it lo\n\t"
  58342. "movlo r2, r3\n\t"
  58343. "it ne\n\t"
  58344. "movne r3, r5\n\t"
  58345. "ldr r12, [%[a], #60]\n\t"
  58346. "ldr lr, [%[b], #60]\n\t"
  58347. "and r12, r12, r3\n\t"
  58348. "and lr, lr, r3\n\t"
  58349. "subs r12, r12, lr\n\t"
  58350. "it hi\n\t"
  58351. "movhi r2, r6\n\t"
  58352. "it lo\n\t"
  58353. "movlo r2, r3\n\t"
  58354. "it ne\n\t"
  58355. "movne r3, r5\n\t"
  58356. "ldr r12, [%[a], #56]\n\t"
  58357. "ldr lr, [%[b], #56]\n\t"
  58358. "and r12, r12, r3\n\t"
  58359. "and lr, lr, r3\n\t"
  58360. "subs r12, r12, lr\n\t"
  58361. "it hi\n\t"
  58362. "movhi r2, r6\n\t"
  58363. "it lo\n\t"
  58364. "movlo r2, r3\n\t"
  58365. "it ne\n\t"
  58366. "movne r3, r5\n\t"
  58367. "ldr r12, [%[a], #52]\n\t"
  58368. "ldr lr, [%[b], #52]\n\t"
  58369. "and r12, r12, r3\n\t"
  58370. "and lr, lr, r3\n\t"
  58371. "subs r12, r12, lr\n\t"
  58372. "it hi\n\t"
  58373. "movhi r2, r6\n\t"
  58374. "it lo\n\t"
  58375. "movlo r2, r3\n\t"
  58376. "it ne\n\t"
  58377. "movne r3, r5\n\t"
  58378. "ldr r12, [%[a], #48]\n\t"
  58379. "ldr lr, [%[b], #48]\n\t"
  58380. "and r12, r12, r3\n\t"
  58381. "and lr, lr, r3\n\t"
  58382. "subs r12, r12, lr\n\t"
  58383. "it hi\n\t"
  58384. "movhi r2, r6\n\t"
  58385. "it lo\n\t"
  58386. "movlo r2, r3\n\t"
  58387. "it ne\n\t"
  58388. "movne r3, r5\n\t"
  58389. "ldr r12, [%[a], #44]\n\t"
  58390. "ldr lr, [%[b], #44]\n\t"
  58391. "and r12, r12, r3\n\t"
  58392. "and lr, lr, r3\n\t"
  58393. "subs r12, r12, lr\n\t"
  58394. "it hi\n\t"
  58395. "movhi r2, r6\n\t"
  58396. "it lo\n\t"
  58397. "movlo r2, r3\n\t"
  58398. "it ne\n\t"
  58399. "movne r3, r5\n\t"
  58400. "ldr r12, [%[a], #40]\n\t"
  58401. "ldr lr, [%[b], #40]\n\t"
  58402. "and r12, r12, r3\n\t"
  58403. "and lr, lr, r3\n\t"
  58404. "subs r12, r12, lr\n\t"
  58405. "it hi\n\t"
  58406. "movhi r2, r6\n\t"
  58407. "it lo\n\t"
  58408. "movlo r2, r3\n\t"
  58409. "it ne\n\t"
  58410. "movne r3, r5\n\t"
  58411. "ldr r12, [%[a], #36]\n\t"
  58412. "ldr lr, [%[b], #36]\n\t"
  58413. "and r12, r12, r3\n\t"
  58414. "and lr, lr, r3\n\t"
  58415. "subs r12, r12, lr\n\t"
  58416. "it hi\n\t"
  58417. "movhi r2, r6\n\t"
  58418. "it lo\n\t"
  58419. "movlo r2, r3\n\t"
  58420. "it ne\n\t"
  58421. "movne r3, r5\n\t"
  58422. "ldr r12, [%[a], #32]\n\t"
  58423. "ldr lr, [%[b], #32]\n\t"
  58424. "and r12, r12, r3\n\t"
  58425. "and lr, lr, r3\n\t"
  58426. "subs r12, r12, lr\n\t"
  58427. "it hi\n\t"
  58428. "movhi r2, r6\n\t"
  58429. "it lo\n\t"
  58430. "movlo r2, r3\n\t"
  58431. "it ne\n\t"
  58432. "movne r3, r5\n\t"
  58433. "ldr r12, [%[a], #28]\n\t"
  58434. "ldr lr, [%[b], #28]\n\t"
  58435. "and r12, r12, r3\n\t"
  58436. "and lr, lr, r3\n\t"
  58437. "subs r12, r12, lr\n\t"
  58438. "it hi\n\t"
  58439. "movhi r2, r6\n\t"
  58440. "it lo\n\t"
  58441. "movlo r2, r3\n\t"
  58442. "it ne\n\t"
  58443. "movne r3, r5\n\t"
  58444. "ldr r12, [%[a], #24]\n\t"
  58445. "ldr lr, [%[b], #24]\n\t"
  58446. "and r12, r12, r3\n\t"
  58447. "and lr, lr, r3\n\t"
  58448. "subs r12, r12, lr\n\t"
  58449. "it hi\n\t"
  58450. "movhi r2, r6\n\t"
  58451. "it lo\n\t"
  58452. "movlo r2, r3\n\t"
  58453. "it ne\n\t"
  58454. "movne r3, r5\n\t"
  58455. "ldr r12, [%[a], #20]\n\t"
  58456. "ldr lr, [%[b], #20]\n\t"
  58457. "and r12, r12, r3\n\t"
  58458. "and lr, lr, r3\n\t"
  58459. "subs r12, r12, lr\n\t"
  58460. "it hi\n\t"
  58461. "movhi r2, r6\n\t"
  58462. "it lo\n\t"
  58463. "movlo r2, r3\n\t"
  58464. "it ne\n\t"
  58465. "movne r3, r5\n\t"
  58466. "ldr r12, [%[a], #16]\n\t"
  58467. "ldr lr, [%[b], #16]\n\t"
  58468. "and r12, r12, r3\n\t"
  58469. "and lr, lr, r3\n\t"
  58470. "subs r12, r12, lr\n\t"
  58471. "it hi\n\t"
  58472. "movhi r2, r6\n\t"
  58473. "it lo\n\t"
  58474. "movlo r2, r3\n\t"
  58475. "it ne\n\t"
  58476. "movne r3, r5\n\t"
  58477. "ldr r12, [%[a], #12]\n\t"
  58478. "ldr lr, [%[b], #12]\n\t"
  58479. "and r12, r12, r3\n\t"
  58480. "and lr, lr, r3\n\t"
  58481. "subs r12, r12, lr\n\t"
  58482. "it hi\n\t"
  58483. "movhi r2, r6\n\t"
  58484. "it lo\n\t"
  58485. "movlo r2, r3\n\t"
  58486. "it ne\n\t"
  58487. "movne r3, r5\n\t"
  58488. "ldr r12, [%[a], #8]\n\t"
  58489. "ldr lr, [%[b], #8]\n\t"
  58490. "and r12, r12, r3\n\t"
  58491. "and lr, lr, r3\n\t"
  58492. "subs r12, r12, lr\n\t"
  58493. "it hi\n\t"
  58494. "movhi r2, r6\n\t"
  58495. "it lo\n\t"
  58496. "movlo r2, r3\n\t"
  58497. "it ne\n\t"
  58498. "movne r3, r5\n\t"
  58499. "ldr r12, [%[a], #4]\n\t"
  58500. "ldr lr, [%[b], #4]\n\t"
  58501. "and r12, r12, r3\n\t"
  58502. "and lr, lr, r3\n\t"
  58503. "subs r12, r12, lr\n\t"
  58504. "it hi\n\t"
  58505. "movhi r2, r6\n\t"
  58506. "it lo\n\t"
  58507. "movlo r2, r3\n\t"
  58508. "it ne\n\t"
  58509. "movne r3, r5\n\t"
  58510. "ldr r12, [%[a]]\n\t"
  58511. "ldr lr, [%[b]]\n\t"
  58512. "and r12, r12, r3\n\t"
  58513. "and lr, lr, r3\n\t"
  58514. "subs r12, r12, lr\n\t"
  58515. "it hi\n\t"
  58516. "movhi r2, r6\n\t"
  58517. "it lo\n\t"
  58518. "movlo r2, r3\n\t"
  58519. "it ne\n\t"
  58520. "movne r3, r5\n\t"
  58521. "eor r2, r2, r3\n\t"
  58522. #endif /*WOLFSSL_SP_SMALL */
  58523. "mov %[a], r2\n\t"
  58524. : [a] "+r" (a), [b] "+r" (b)
  58525. :
  58526. : "memory", "r2", "r3", "r12", "lr", "r4", "r5", "r6", "cc"
  58527. );
  58528. return (uint32_t)(size_t)a;
  58529. }
  58530. /* Divide d in a and put remainder into r (m*d + r = a)
  58531. * m is not calculated as it is not needed at this time.
  58532. *
  58533. * a Number to be divided.
  58534. * d Number to divide with.
  58535. * m Multiplier result.
  58536. * r Remainder from the division.
  58537. * returns MP_OKAY indicating success.
  58538. */
  58539. static WC_INLINE int sp_4096_div_128(const sp_digit* a, const sp_digit* d,
  58540. sp_digit* m, sp_digit* r)
  58541. {
  58542. sp_digit t1[256], t2[129];
  58543. sp_digit div, r1;
  58544. int i;
  58545. (void)m;
  58546. div = d[127];
  58547. XMEMCPY(t1, a, sizeof(*t1) * 2 * 128);
  58548. r1 = sp_4096_cmp_128(&t1[128], d) >= 0;
  58549. sp_4096_cond_sub_128(&t1[128], &t1[128], d, (sp_digit)0 - r1);
  58550. for (i = 127; i >= 0; i--) {
  58551. volatile sp_digit mask = (sp_digit)0 - (t1[128 + i] == div);
  58552. sp_digit hi = t1[128 + i] + mask;
  58553. r1 = div_4096_word_128(hi, t1[128 + i - 1], div);
  58554. r1 |= mask;
  58555. sp_4096_mul_d_128(t2, d, r1);
  58556. t1[128 + i] += sp_4096_sub_in_place_128(&t1[i], t2);
  58557. t1[128 + i] -= t2[128];
  58558. sp_4096_mask_128(t2, d, t1[128 + i]);
  58559. t1[128 + i] += sp_4096_add_128(&t1[i], &t1[i], t2);
  58560. sp_4096_mask_128(t2, d, t1[128 + i]);
  58561. t1[128 + i] += sp_4096_add_128(&t1[i], &t1[i], t2);
  58562. }
  58563. r1 = sp_4096_cmp_128(t1, d) >= 0;
  58564. sp_4096_cond_sub_128(r, t1, d, (sp_digit)0 - r1);
  58565. return MP_OKAY;
  58566. }
  58567. /* Reduce a modulo m into r. (r = a mod m)
  58568. *
  58569. * r A single precision number that is the reduced result.
  58570. * a A single precision number that is to be reduced.
  58571. * m A single precision number that is the modulus to reduce with.
  58572. * returns MP_OKAY indicating success.
  58573. */
  58574. static WC_INLINE int sp_4096_mod_128(sp_digit* r, const sp_digit* a,
  58575. const sp_digit* m)
  58576. {
  58577. return sp_4096_div_128(a, m, NULL, r);
  58578. }
  58579. #endif /* WOLFSSL_HAVE_SP_DH || !WOLFSSL_RSA_PUBLIC_ONLY */
  58580. #if (defined(WOLFSSL_HAVE_SP_RSA) && !defined(WOLFSSL_RSA_PUBLIC_ONLY)) || \
  58581. defined(WOLFSSL_HAVE_SP_DH)
  58582. #ifdef WOLFSSL_SP_SMALL
  58583. /* Modular exponentiate a to the e mod m. (r = a^e mod m)
  58584. *
  58585. * r A single precision number that is the result of the operation.
  58586. * a A single precision number being exponentiated.
  58587. * e A single precision number that is the exponent.
  58588. * bits The number of bits in the exponent.
  58589. * m A single precision number that is the modulus.
  58590. * returns 0 on success.
  58591. * returns MEMORY_E on dynamic memory allocation failure.
  58592. * returns MP_VAL when base is even or exponent is 0.
  58593. */
  58594. static int sp_4096_mod_exp_128(sp_digit* r, const sp_digit* a, const sp_digit* e,
  58595. int bits, const sp_digit* m, int reduceA)
  58596. {
  58597. #ifdef WOLFSSL_SP_SMALL_STACK
  58598. sp_digit* td = NULL;
  58599. #else
  58600. sp_digit td[8 * 256];
  58601. #endif
  58602. sp_digit* t[8];
  58603. sp_digit* norm = NULL;
  58604. sp_digit mp = 1;
  58605. sp_digit n;
  58606. sp_digit mask;
  58607. int i;
  58608. int c;
  58609. byte y;
  58610. int err = MP_OKAY;
  58611. if (bits == 0) {
  58612. err = MP_VAL;
  58613. }
  58614. #ifdef WOLFSSL_SP_SMALL_STACK
  58615. if (err == MP_OKAY) {
  58616. td = (sp_digit*)XMALLOC(sizeof(sp_digit) * (8 * 256), NULL,
  58617. DYNAMIC_TYPE_TMP_BUFFER);
  58618. if (td == NULL)
  58619. err = MEMORY_E;
  58620. }
  58621. #endif
  58622. if (err == MP_OKAY) {
  58623. norm = td;
  58624. for (i=0; i<8; i++) {
  58625. t[i] = td + i * 256;
  58626. }
  58627. sp_4096_mont_setup(m, &mp);
  58628. sp_4096_mont_norm_128(norm, m);
  58629. XMEMSET(t[1], 0, sizeof(sp_digit) * 128U);
  58630. if (reduceA != 0) {
  58631. err = sp_4096_mod_128(t[1] + 128, a, m);
  58632. if (err == MP_OKAY) {
  58633. err = sp_4096_mod_128(t[1], t[1], m);
  58634. }
  58635. }
  58636. else {
  58637. XMEMCPY(t[1] + 128, a, sizeof(sp_digit) * 128);
  58638. err = sp_4096_mod_128(t[1], t[1], m);
  58639. }
  58640. }
  58641. if (err == MP_OKAY) {
  58642. sp_4096_mont_sqr_128(t[ 2], t[ 1], m, mp);
  58643. sp_4096_mont_mul_128(t[ 3], t[ 2], t[ 1], m, mp);
  58644. sp_4096_mont_sqr_128(t[ 4], t[ 2], m, mp);
  58645. sp_4096_mont_mul_128(t[ 5], t[ 3], t[ 2], m, mp);
  58646. sp_4096_mont_sqr_128(t[ 6], t[ 3], m, mp);
  58647. sp_4096_mont_mul_128(t[ 7], t[ 4], t[ 3], m, mp);
  58648. i = (bits - 1) / 32;
  58649. n = e[i--];
  58650. c = bits & 31;
  58651. if (c == 0) {
  58652. c = 32;
  58653. }
  58654. c -= bits % 3;
  58655. if (c == 32) {
  58656. c = 29;
  58657. }
  58658. if (c < 0) {
  58659. /* Number of bits in top word is less than number needed. */
  58660. c = -c;
  58661. y = (byte)(n << c);
  58662. n = e[i--];
  58663. y |= (byte)(n >> (64 - c));
  58664. n <<= c;
  58665. c = 64 - c;
  58666. }
  58667. else if (c == 0) {
  58668. /* All bits in top word used. */
  58669. y = (byte)n;
  58670. }
  58671. else {
  58672. y = (byte)(n >> c);
  58673. n <<= 32 - c;
  58674. }
  58675. XMEMCPY(r, t[y], sizeof(sp_digit) * 128);
  58676. for (; i>=0 || c>=3; ) {
  58677. if (c == 0) {
  58678. n = e[i--];
  58679. y = (byte)(n >> 29);
  58680. n <<= 3;
  58681. c = 29;
  58682. }
  58683. else if (c < 3) {
  58684. y = (byte)(n >> 29);
  58685. n = e[i--];
  58686. c = 3 - c;
  58687. y |= (byte)(n >> (32 - c));
  58688. n <<= c;
  58689. c = 32 - c;
  58690. }
  58691. else {
  58692. y = (byte)((n >> 29) & 0x7);
  58693. n <<= 3;
  58694. c -= 3;
  58695. }
  58696. sp_4096_mont_sqr_128(r, r, m, mp);
  58697. sp_4096_mont_sqr_128(r, r, m, mp);
  58698. sp_4096_mont_sqr_128(r, r, m, mp);
  58699. sp_4096_mont_mul_128(r, r, t[y], m, mp);
  58700. }
  58701. XMEMSET(&r[128], 0, sizeof(sp_digit) * 128U);
  58702. sp_4096_mont_reduce_128(r, m, mp);
  58703. mask = 0 - (sp_4096_cmp_128(r, m) >= 0);
  58704. sp_4096_cond_sub_128(r, r, m, mask);
  58705. }
  58706. #ifdef WOLFSSL_SP_SMALL_STACK
  58707. if (td != NULL)
  58708. XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  58709. #endif
  58710. return err;
  58711. }
  58712. #else
  58713. /* Modular exponentiate a to the e mod m. (r = a^e mod m)
  58714. *
  58715. * r A single precision number that is the result of the operation.
  58716. * a A single precision number being exponentiated.
  58717. * e A single precision number that is the exponent.
  58718. * bits The number of bits in the exponent.
  58719. * m A single precision number that is the modulus.
  58720. * returns 0 on success.
  58721. * returns MEMORY_E on dynamic memory allocation failure.
  58722. * returns MP_VAL when base is even or exponent is 0.
  58723. */
  58724. static int sp_4096_mod_exp_128(sp_digit* r, const sp_digit* a, const sp_digit* e,
  58725. int bits, const sp_digit* m, int reduceA)
  58726. {
  58727. #ifdef WOLFSSL_SP_SMALL_STACK
  58728. sp_digit* td = NULL;
  58729. #else
  58730. sp_digit td[16 * 256];
  58731. #endif
  58732. sp_digit* t[16];
  58733. sp_digit* norm = NULL;
  58734. sp_digit mp = 1;
  58735. sp_digit n;
  58736. sp_digit mask;
  58737. int i;
  58738. int c;
  58739. byte y;
  58740. int err = MP_OKAY;
  58741. if (bits == 0) {
  58742. err = MP_VAL;
  58743. }
  58744. #ifdef WOLFSSL_SP_SMALL_STACK
  58745. if (err == MP_OKAY) {
  58746. td = (sp_digit*)XMALLOC(sizeof(sp_digit) * (16 * 256), NULL,
  58747. DYNAMIC_TYPE_TMP_BUFFER);
  58748. if (td == NULL)
  58749. err = MEMORY_E;
  58750. }
  58751. #endif
  58752. if (err == MP_OKAY) {
  58753. norm = td;
  58754. for (i=0; i<16; i++) {
  58755. t[i] = td + i * 256;
  58756. }
  58757. sp_4096_mont_setup(m, &mp);
  58758. sp_4096_mont_norm_128(norm, m);
  58759. XMEMSET(t[1], 0, sizeof(sp_digit) * 128U);
  58760. if (reduceA != 0) {
  58761. err = sp_4096_mod_128(t[1] + 128, a, m);
  58762. if (err == MP_OKAY) {
  58763. err = sp_4096_mod_128(t[1], t[1], m);
  58764. }
  58765. }
  58766. else {
  58767. XMEMCPY(t[1] + 128, a, sizeof(sp_digit) * 128);
  58768. err = sp_4096_mod_128(t[1], t[1], m);
  58769. }
  58770. }
  58771. if (err == MP_OKAY) {
  58772. sp_4096_mont_sqr_128(t[ 2], t[ 1], m, mp);
  58773. sp_4096_mont_mul_128(t[ 3], t[ 2], t[ 1], m, mp);
  58774. sp_4096_mont_sqr_128(t[ 4], t[ 2], m, mp);
  58775. sp_4096_mont_mul_128(t[ 5], t[ 3], t[ 2], m, mp);
  58776. sp_4096_mont_sqr_128(t[ 6], t[ 3], m, mp);
  58777. sp_4096_mont_mul_128(t[ 7], t[ 4], t[ 3], m, mp);
  58778. sp_4096_mont_sqr_128(t[ 8], t[ 4], m, mp);
  58779. sp_4096_mont_mul_128(t[ 9], t[ 5], t[ 4], m, mp);
  58780. sp_4096_mont_sqr_128(t[10], t[ 5], m, mp);
  58781. sp_4096_mont_mul_128(t[11], t[ 6], t[ 5], m, mp);
  58782. sp_4096_mont_sqr_128(t[12], t[ 6], m, mp);
  58783. sp_4096_mont_mul_128(t[13], t[ 7], t[ 6], m, mp);
  58784. sp_4096_mont_sqr_128(t[14], t[ 7], m, mp);
  58785. sp_4096_mont_mul_128(t[15], t[ 8], t[ 7], m, mp);
  58786. i = (bits - 1) / 32;
  58787. n = e[i--];
  58788. c = bits & 31;
  58789. if (c == 0) {
  58790. c = 32;
  58791. }
  58792. c -= bits % 4;
  58793. if (c == 32) {
  58794. c = 28;
  58795. }
  58796. if (c < 0) {
  58797. /* Number of bits in top word is less than number needed. */
  58798. c = -c;
  58799. y = (byte)(n << c);
  58800. n = e[i--];
  58801. y |= (byte)(n >> (64 - c));
  58802. n <<= c;
  58803. c = 64 - c;
  58804. }
  58805. else if (c == 0) {
  58806. /* All bits in top word used. */
  58807. y = (byte)n;
  58808. }
  58809. else {
  58810. y = (byte)(n >> c);
  58811. n <<= 32 - c;
  58812. }
  58813. XMEMCPY(r, t[y], sizeof(sp_digit) * 128);
  58814. for (; i>=0 || c>=4; ) {
  58815. if (c == 0) {
  58816. n = e[i--];
  58817. y = (byte)(n >> 28);
  58818. n <<= 4;
  58819. c = 28;
  58820. }
  58821. else if (c < 4) {
  58822. y = (byte)(n >> 28);
  58823. n = e[i--];
  58824. c = 4 - c;
  58825. y |= (byte)(n >> (32 - c));
  58826. n <<= c;
  58827. c = 32 - c;
  58828. }
  58829. else {
  58830. y = (byte)((n >> 28) & 0xf);
  58831. n <<= 4;
  58832. c -= 4;
  58833. }
  58834. sp_4096_mont_sqr_128(r, r, m, mp);
  58835. sp_4096_mont_sqr_128(r, r, m, mp);
  58836. sp_4096_mont_sqr_128(r, r, m, mp);
  58837. sp_4096_mont_sqr_128(r, r, m, mp);
  58838. sp_4096_mont_mul_128(r, r, t[y], m, mp);
  58839. }
  58840. XMEMSET(&r[128], 0, sizeof(sp_digit) * 128U);
  58841. sp_4096_mont_reduce_128(r, m, mp);
  58842. mask = 0 - (sp_4096_cmp_128(r, m) >= 0);
  58843. sp_4096_cond_sub_128(r, r, m, mask);
  58844. }
  58845. #ifdef WOLFSSL_SP_SMALL_STACK
  58846. if (td != NULL)
  58847. XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  58848. #endif
  58849. return err;
  58850. }
  58851. #endif /* WOLFSSL_SP_SMALL */
  58852. #endif /* (WOLFSSL_HAVE_SP_RSA && !WOLFSSL_RSA_PUBLIC_ONLY) || WOLFSSL_HAVE_SP_DH */
  58853. #endif /* (WOLFSSL_HAVE_SP_RSA && !WOLFSSL_RSA_PUBLIC_ONLY) || WOLFSSL_HAVE_SP_DH */
  58854. #ifdef WOLFSSL_HAVE_SP_RSA
  58855. /* RSA public key operation.
  58856. *
  58857. * in Array of bytes representing the number to exponentiate, base.
  58858. * inLen Number of bytes in base.
  58859. * em Public exponent.
  58860. * mm Modulus.
  58861. * out Buffer to hold big-endian bytes of exponentiation result.
  58862. * Must be at least 512 bytes long.
  58863. * outLen Number of bytes in result.
  58864. * returns 0 on success, MP_TO_E when the outLen is too small, MP_READ_E when
  58865. * an array is too long and MEMORY_E when dynamic memory allocation fails.
  58866. */
  58867. int sp_RsaPublic_4096(const byte* in, word32 inLen, const mp_int* em,
  58868. const mp_int* mm, byte* out, word32* outLen)
  58869. {
  58870. #ifdef WOLFSSL_SP_SMALL_STACK
  58871. sp_digit* a = NULL;
  58872. #else
  58873. sp_digit a[128 * 5];
  58874. #endif
  58875. sp_digit* m = NULL;
  58876. sp_digit* r = NULL;
  58877. sp_digit *ah = NULL;
  58878. sp_digit e[1] = {0};
  58879. int err = MP_OKAY;
  58880. if (*outLen < 512) {
  58881. err = MP_TO_E;
  58882. }
  58883. else if (mp_count_bits(em) > 32 || inLen > 512 ||
  58884. mp_count_bits(mm) != 4096) {
  58885. err = MP_READ_E;
  58886. }
  58887. else if (mp_iseven(mm)) {
  58888. err = MP_VAL;
  58889. }
  58890. #ifdef WOLFSSL_SP_SMALL_STACK
  58891. if (err == MP_OKAY) {
  58892. a = (sp_digit*)XMALLOC(sizeof(sp_digit) * 128 * 5, NULL,
  58893. DYNAMIC_TYPE_RSA);
  58894. if (a == NULL)
  58895. err = MEMORY_E;
  58896. }
  58897. #endif
  58898. if (err == MP_OKAY) {
  58899. ah = a + 128;
  58900. r = a + 128 * 2;
  58901. m = r + 128 * 2;
  58902. sp_4096_from_bin(ah, 128, in, inLen);
  58903. #if DIGIT_BIT >= 32
  58904. e[0] = em->dp[0];
  58905. #else
  58906. e[0] = em->dp[0];
  58907. if (em->used > 1) {
  58908. e[0] |= ((sp_digit)em->dp[1]) << DIGIT_BIT;
  58909. }
  58910. #endif
  58911. if (e[0] == 0) {
  58912. err = MP_EXPTMOD_E;
  58913. }
  58914. }
  58915. if (err == MP_OKAY) {
  58916. sp_4096_from_mp(m, 128, mm);
  58917. if (e[0] == 0x10001) {
  58918. int i;
  58919. sp_digit mp;
  58920. sp_4096_mont_setup(m, &mp);
  58921. /* Convert to Montgomery form. */
  58922. XMEMSET(a, 0, sizeof(sp_digit) * 128);
  58923. err = sp_4096_mod_128_cond(r, a, m);
  58924. /* Montgomery form: r = a.R mod m */
  58925. if (err == MP_OKAY) {
  58926. /* r = a ^ 0x10000 => r = a squared 16 times */
  58927. for (i = 15; i >= 0; i--) {
  58928. sp_4096_mont_sqr_128(r, r, m, mp);
  58929. }
  58930. /* mont_red(r.R.R) = (r.R.R / R) mod m = r.R mod m
  58931. * mont_red(r.R * a) = (r.R.a / R) mod m = r.a mod m
  58932. */
  58933. sp_4096_mont_mul_128(r, r, ah, m, mp);
  58934. for (i = 127; i > 0; i--) {
  58935. if (r[i] != m[i]) {
  58936. break;
  58937. }
  58938. }
  58939. if (r[i] >= m[i]) {
  58940. sp_4096_sub_in_place_128(r, m);
  58941. }
  58942. }
  58943. }
  58944. else if (e[0] == 0x3) {
  58945. if (err == MP_OKAY) {
  58946. sp_4096_sqr_128(r, ah);
  58947. err = sp_4096_mod_128_cond(r, r, m);
  58948. }
  58949. if (err == MP_OKAY) {
  58950. sp_4096_mul_128(r, ah, r);
  58951. err = sp_4096_mod_128_cond(r, r, m);
  58952. }
  58953. }
  58954. else {
  58955. int i;
  58956. sp_digit mp;
  58957. sp_4096_mont_setup(m, &mp);
  58958. /* Convert to Montgomery form. */
  58959. XMEMSET(a, 0, sizeof(sp_digit) * 128);
  58960. err = sp_4096_mod_128_cond(a, a, m);
  58961. if (err == MP_OKAY) {
  58962. for (i = 31; i >= 0; i--) {
  58963. if (e[0] >> i) {
  58964. break;
  58965. }
  58966. }
  58967. XMEMCPY(r, a, sizeof(sp_digit) * 128);
  58968. for (i--; i >= 0; i--) {
  58969. sp_4096_mont_sqr_128(r, r, m, mp);
  58970. if (((e[0] >> i) & 1) == 1) {
  58971. sp_4096_mont_mul_128(r, r, a, m, mp);
  58972. }
  58973. }
  58974. XMEMSET(&r[128], 0, sizeof(sp_digit) * 128);
  58975. sp_4096_mont_reduce_128(r, m, mp);
  58976. for (i = 127; i > 0; i--) {
  58977. if (r[i] != m[i]) {
  58978. break;
  58979. }
  58980. }
  58981. if (r[i] >= m[i]) {
  58982. sp_4096_sub_in_place_128(r, m);
  58983. }
  58984. }
  58985. }
  58986. }
  58987. if (err == MP_OKAY) {
  58988. sp_4096_to_bin_128(r, out);
  58989. *outLen = 512;
  58990. }
  58991. #ifdef WOLFSSL_SP_SMALL_STACK
  58992. if (a != NULL)
  58993. XFREE(a, NULL, DYNAMIC_TYPE_RSA);
  58994. #endif
  58995. return err;
  58996. }
  58997. #ifndef WOLFSSL_RSA_PUBLIC_ONLY
  58998. #ifdef WOLFSSL_SP_SMALL
  58999. /* Conditionally add a and b using the mask m.
  59000. * m is -1 to add and 0 when not.
  59001. *
  59002. * r A single precision number representing conditional add result.
  59003. * a A single precision number to add with.
  59004. * b A single precision number to add.
  59005. * m Mask value to apply.
  59006. */
  59007. 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)
  59008. {
  59009. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  59010. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  59011. register const sp_digit* b asm ("r2") = (const sp_digit*)b_p;
  59012. register sp_digit m asm ("r3") = (sp_digit)m_p;
  59013. __asm__ __volatile__ (
  59014. "mov lr, #0\n\t"
  59015. "mov r6, #0\n\t"
  59016. "mov r12, #0\n\t"
  59017. "\n"
  59018. "L_sp_4096_cond_add_64_words_%=: \n\t"
  59019. "adds lr, lr, #-1\n\t"
  59020. "ldr r4, [%[a], r12]\n\t"
  59021. "ldr r5, [%[b], r12]\n\t"
  59022. "and r5, r5, %[m]\n\t"
  59023. "adcs r4, r4, r5\n\t"
  59024. "adc lr, r6, r6\n\t"
  59025. "str r4, [%[r], r12]\n\t"
  59026. "add r12, r12, #4\n\t"
  59027. "cmp r12, #0x100\n\t"
  59028. "blt L_sp_4096_cond_add_64_words_%=\n\t"
  59029. "mov %[r], lr\n\t"
  59030. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b), [m] "+r" (m)
  59031. :
  59032. : "memory", "r12", "lr", "r4", "r5", "r6", "cc"
  59033. );
  59034. return (uint32_t)(size_t)r;
  59035. }
  59036. #else
  59037. /* Conditionally add a and b using the mask m.
  59038. * m is -1 to add and 0 when not.
  59039. *
  59040. * r A single precision number representing conditional add result.
  59041. * a A single precision number to add with.
  59042. * b A single precision number to add.
  59043. * m Mask value to apply.
  59044. */
  59045. 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)
  59046. {
  59047. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  59048. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  59049. register const sp_digit* b asm ("r2") = (const sp_digit*)b_p;
  59050. register sp_digit m asm ("r3") = (sp_digit)m_p;
  59051. __asm__ __volatile__ (
  59052. "mov r8, #0\n\t"
  59053. "ldm %[a]!, {r4, r5}\n\t"
  59054. "ldm %[b]!, {r6, r7}\n\t"
  59055. "and r6, r6, %[m]\n\t"
  59056. "and r7, r7, %[m]\n\t"
  59057. "adds r4, r4, r6\n\t"
  59058. "adcs r5, r5, r7\n\t"
  59059. "stm %[r]!, {r4, r5}\n\t"
  59060. "ldm %[a]!, {r4, r5}\n\t"
  59061. "ldm %[b]!, {r6, r7}\n\t"
  59062. "and r6, r6, %[m]\n\t"
  59063. "and r7, r7, %[m]\n\t"
  59064. "adcs r4, r4, r6\n\t"
  59065. "adcs r5, r5, r7\n\t"
  59066. "stm %[r]!, {r4, r5}\n\t"
  59067. "ldm %[a]!, {r4, r5}\n\t"
  59068. "ldm %[b]!, {r6, r7}\n\t"
  59069. "and r6, r6, %[m]\n\t"
  59070. "and r7, r7, %[m]\n\t"
  59071. "adcs r4, r4, r6\n\t"
  59072. "adcs r5, r5, r7\n\t"
  59073. "stm %[r]!, {r4, r5}\n\t"
  59074. "ldm %[a]!, {r4, r5}\n\t"
  59075. "ldm %[b]!, {r6, r7}\n\t"
  59076. "and r6, r6, %[m]\n\t"
  59077. "and r7, r7, %[m]\n\t"
  59078. "adcs r4, r4, r6\n\t"
  59079. "adcs r5, r5, r7\n\t"
  59080. "stm %[r]!, {r4, r5}\n\t"
  59081. "ldm %[a]!, {r4, r5}\n\t"
  59082. "ldm %[b]!, {r6, r7}\n\t"
  59083. "and r6, r6, %[m]\n\t"
  59084. "and r7, r7, %[m]\n\t"
  59085. "adcs r4, r4, r6\n\t"
  59086. "adcs r5, r5, r7\n\t"
  59087. "stm %[r]!, {r4, r5}\n\t"
  59088. "ldm %[a]!, {r4, r5}\n\t"
  59089. "ldm %[b]!, {r6, r7}\n\t"
  59090. "and r6, r6, %[m]\n\t"
  59091. "and r7, r7, %[m]\n\t"
  59092. "adcs r4, r4, r6\n\t"
  59093. "adcs r5, r5, r7\n\t"
  59094. "stm %[r]!, {r4, r5}\n\t"
  59095. "ldm %[a]!, {r4, r5}\n\t"
  59096. "ldm %[b]!, {r6, r7}\n\t"
  59097. "and r6, r6, %[m]\n\t"
  59098. "and r7, r7, %[m]\n\t"
  59099. "adcs r4, r4, r6\n\t"
  59100. "adcs r5, r5, r7\n\t"
  59101. "stm %[r]!, {r4, r5}\n\t"
  59102. "ldm %[a]!, {r4, r5}\n\t"
  59103. "ldm %[b]!, {r6, r7}\n\t"
  59104. "and r6, r6, %[m]\n\t"
  59105. "and r7, r7, %[m]\n\t"
  59106. "adcs r4, r4, r6\n\t"
  59107. "adcs r5, r5, r7\n\t"
  59108. "stm %[r]!, {r4, r5}\n\t"
  59109. "ldm %[a]!, {r4, r5}\n\t"
  59110. "ldm %[b]!, {r6, r7}\n\t"
  59111. "and r6, r6, %[m]\n\t"
  59112. "and r7, r7, %[m]\n\t"
  59113. "adcs r4, r4, r6\n\t"
  59114. "adcs r5, r5, r7\n\t"
  59115. "stm %[r]!, {r4, r5}\n\t"
  59116. "ldm %[a]!, {r4, r5}\n\t"
  59117. "ldm %[b]!, {r6, r7}\n\t"
  59118. "and r6, r6, %[m]\n\t"
  59119. "and r7, r7, %[m]\n\t"
  59120. "adcs r4, r4, r6\n\t"
  59121. "adcs r5, r5, r7\n\t"
  59122. "stm %[r]!, {r4, r5}\n\t"
  59123. "ldm %[a]!, {r4, r5}\n\t"
  59124. "ldm %[b]!, {r6, r7}\n\t"
  59125. "and r6, r6, %[m]\n\t"
  59126. "and r7, r7, %[m]\n\t"
  59127. "adcs r4, r4, r6\n\t"
  59128. "adcs r5, r5, r7\n\t"
  59129. "stm %[r]!, {r4, r5}\n\t"
  59130. "ldm %[a]!, {r4, r5}\n\t"
  59131. "ldm %[b]!, {r6, r7}\n\t"
  59132. "and r6, r6, %[m]\n\t"
  59133. "and r7, r7, %[m]\n\t"
  59134. "adcs r4, r4, r6\n\t"
  59135. "adcs r5, r5, r7\n\t"
  59136. "stm %[r]!, {r4, r5}\n\t"
  59137. "ldm %[a]!, {r4, r5}\n\t"
  59138. "ldm %[b]!, {r6, r7}\n\t"
  59139. "and r6, r6, %[m]\n\t"
  59140. "and r7, r7, %[m]\n\t"
  59141. "adcs r4, r4, r6\n\t"
  59142. "adcs r5, r5, r7\n\t"
  59143. "stm %[r]!, {r4, r5}\n\t"
  59144. "ldm %[a]!, {r4, r5}\n\t"
  59145. "ldm %[b]!, {r6, r7}\n\t"
  59146. "and r6, r6, %[m]\n\t"
  59147. "and r7, r7, %[m]\n\t"
  59148. "adcs r4, r4, r6\n\t"
  59149. "adcs r5, r5, r7\n\t"
  59150. "stm %[r]!, {r4, r5}\n\t"
  59151. "ldm %[a]!, {r4, r5}\n\t"
  59152. "ldm %[b]!, {r6, r7}\n\t"
  59153. "and r6, r6, %[m]\n\t"
  59154. "and r7, r7, %[m]\n\t"
  59155. "adcs r4, r4, r6\n\t"
  59156. "adcs r5, r5, r7\n\t"
  59157. "stm %[r]!, {r4, r5}\n\t"
  59158. "ldm %[a]!, {r4, r5}\n\t"
  59159. "ldm %[b]!, {r6, r7}\n\t"
  59160. "and r6, r6, %[m]\n\t"
  59161. "and r7, r7, %[m]\n\t"
  59162. "adcs r4, r4, r6\n\t"
  59163. "adcs r5, r5, r7\n\t"
  59164. "stm %[r]!, {r4, r5}\n\t"
  59165. "ldm %[a]!, {r4, r5}\n\t"
  59166. "ldm %[b]!, {r6, r7}\n\t"
  59167. "and r6, r6, %[m]\n\t"
  59168. "and r7, r7, %[m]\n\t"
  59169. "adcs r4, r4, r6\n\t"
  59170. "adcs r5, r5, r7\n\t"
  59171. "stm %[r]!, {r4, r5}\n\t"
  59172. "ldm %[a]!, {r4, r5}\n\t"
  59173. "ldm %[b]!, {r6, r7}\n\t"
  59174. "and r6, r6, %[m]\n\t"
  59175. "and r7, r7, %[m]\n\t"
  59176. "adcs r4, r4, r6\n\t"
  59177. "adcs r5, r5, r7\n\t"
  59178. "stm %[r]!, {r4, r5}\n\t"
  59179. "ldm %[a]!, {r4, r5}\n\t"
  59180. "ldm %[b]!, {r6, r7}\n\t"
  59181. "and r6, r6, %[m]\n\t"
  59182. "and r7, r7, %[m]\n\t"
  59183. "adcs r4, r4, r6\n\t"
  59184. "adcs r5, r5, r7\n\t"
  59185. "stm %[r]!, {r4, r5}\n\t"
  59186. "ldm %[a]!, {r4, r5}\n\t"
  59187. "ldm %[b]!, {r6, r7}\n\t"
  59188. "and r6, r6, %[m]\n\t"
  59189. "and r7, r7, %[m]\n\t"
  59190. "adcs r4, r4, r6\n\t"
  59191. "adcs r5, r5, r7\n\t"
  59192. "stm %[r]!, {r4, r5}\n\t"
  59193. "ldm %[a]!, {r4, r5}\n\t"
  59194. "ldm %[b]!, {r6, r7}\n\t"
  59195. "and r6, r6, %[m]\n\t"
  59196. "and r7, r7, %[m]\n\t"
  59197. "adcs r4, r4, r6\n\t"
  59198. "adcs r5, r5, r7\n\t"
  59199. "stm %[r]!, {r4, r5}\n\t"
  59200. "ldm %[a]!, {r4, r5}\n\t"
  59201. "ldm %[b]!, {r6, r7}\n\t"
  59202. "and r6, r6, %[m]\n\t"
  59203. "and r7, r7, %[m]\n\t"
  59204. "adcs r4, r4, r6\n\t"
  59205. "adcs r5, r5, r7\n\t"
  59206. "stm %[r]!, {r4, r5}\n\t"
  59207. "ldm %[a]!, {r4, r5}\n\t"
  59208. "ldm %[b]!, {r6, r7}\n\t"
  59209. "and r6, r6, %[m]\n\t"
  59210. "and r7, r7, %[m]\n\t"
  59211. "adcs r4, r4, r6\n\t"
  59212. "adcs r5, r5, r7\n\t"
  59213. "stm %[r]!, {r4, r5}\n\t"
  59214. "ldm %[a]!, {r4, r5}\n\t"
  59215. "ldm %[b]!, {r6, r7}\n\t"
  59216. "and r6, r6, %[m]\n\t"
  59217. "and r7, r7, %[m]\n\t"
  59218. "adcs r4, r4, r6\n\t"
  59219. "adcs r5, r5, r7\n\t"
  59220. "stm %[r]!, {r4, r5}\n\t"
  59221. "ldm %[a]!, {r4, r5}\n\t"
  59222. "ldm %[b]!, {r6, r7}\n\t"
  59223. "and r6, r6, %[m]\n\t"
  59224. "and r7, r7, %[m]\n\t"
  59225. "adcs r4, r4, r6\n\t"
  59226. "adcs r5, r5, r7\n\t"
  59227. "stm %[r]!, {r4, r5}\n\t"
  59228. "ldm %[a]!, {r4, r5}\n\t"
  59229. "ldm %[b]!, {r6, r7}\n\t"
  59230. "and r6, r6, %[m]\n\t"
  59231. "and r7, r7, %[m]\n\t"
  59232. "adcs r4, r4, r6\n\t"
  59233. "adcs r5, r5, r7\n\t"
  59234. "stm %[r]!, {r4, r5}\n\t"
  59235. "ldm %[a]!, {r4, r5}\n\t"
  59236. "ldm %[b]!, {r6, r7}\n\t"
  59237. "and r6, r6, %[m]\n\t"
  59238. "and r7, r7, %[m]\n\t"
  59239. "adcs r4, r4, r6\n\t"
  59240. "adcs r5, r5, r7\n\t"
  59241. "stm %[r]!, {r4, r5}\n\t"
  59242. "ldm %[a]!, {r4, r5}\n\t"
  59243. "ldm %[b]!, {r6, r7}\n\t"
  59244. "and r6, r6, %[m]\n\t"
  59245. "and r7, r7, %[m]\n\t"
  59246. "adcs r4, r4, r6\n\t"
  59247. "adcs r5, r5, r7\n\t"
  59248. "stm %[r]!, {r4, r5}\n\t"
  59249. "ldm %[a]!, {r4, r5}\n\t"
  59250. "ldm %[b]!, {r6, r7}\n\t"
  59251. "and r6, r6, %[m]\n\t"
  59252. "and r7, r7, %[m]\n\t"
  59253. "adcs r4, r4, r6\n\t"
  59254. "adcs r5, r5, r7\n\t"
  59255. "stm %[r]!, {r4, r5}\n\t"
  59256. "ldm %[a]!, {r4, r5}\n\t"
  59257. "ldm %[b]!, {r6, r7}\n\t"
  59258. "and r6, r6, %[m]\n\t"
  59259. "and r7, r7, %[m]\n\t"
  59260. "adcs r4, r4, r6\n\t"
  59261. "adcs r5, r5, r7\n\t"
  59262. "stm %[r]!, {r4, r5}\n\t"
  59263. "ldm %[a]!, {r4, r5}\n\t"
  59264. "ldm %[b]!, {r6, r7}\n\t"
  59265. "and r6, r6, %[m]\n\t"
  59266. "and r7, r7, %[m]\n\t"
  59267. "adcs r4, r4, r6\n\t"
  59268. "adcs r5, r5, r7\n\t"
  59269. "stm %[r]!, {r4, r5}\n\t"
  59270. "ldm %[a]!, {r4, r5}\n\t"
  59271. "ldm %[b]!, {r6, r7}\n\t"
  59272. "and r6, r6, %[m]\n\t"
  59273. "and r7, r7, %[m]\n\t"
  59274. "adcs r4, r4, r6\n\t"
  59275. "adcs r5, r5, r7\n\t"
  59276. "stm %[r]!, {r4, r5}\n\t"
  59277. "adc %[r], r8, r8\n\t"
  59278. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b), [m] "+r" (m)
  59279. :
  59280. : "memory", "r12", "lr", "r4", "r5", "r6", "r7", "r8", "cc"
  59281. );
  59282. return (uint32_t)(size_t)r;
  59283. }
  59284. #endif /* WOLFSSL_SP_SMALL */
  59285. /* RSA private key operation.
  59286. *
  59287. * in Array of bytes representing the number to exponentiate, base.
  59288. * inLen Number of bytes in base.
  59289. * dm Private exponent.
  59290. * pm First prime.
  59291. * qm Second prime.
  59292. * dpm First prime's CRT exponent.
  59293. * dqm Second prime's CRT exponent.
  59294. * qim Inverse of second prime mod p.
  59295. * mm Modulus.
  59296. * out Buffer to hold big-endian bytes of exponentiation result.
  59297. * Must be at least 512 bytes long.
  59298. * outLen Number of bytes in result.
  59299. * returns 0 on success, MP_TO_E when the outLen is too small, MP_READ_E when
  59300. * an array is too long and MEMORY_E when dynamic memory allocation fails.
  59301. */
  59302. int sp_RsaPrivate_4096(const byte* in, word32 inLen, const mp_int* dm,
  59303. const mp_int* pm, const mp_int* qm, const mp_int* dpm, const mp_int* dqm,
  59304. const mp_int* qim, const mp_int* mm, byte* out, word32* outLen)
  59305. {
  59306. #if defined(SP_RSA_PRIVATE_EXP_D) || defined(RSA_LOW_MEM)
  59307. #ifdef WOLFSSL_SP_SMALL_STACK
  59308. sp_digit* d = NULL;
  59309. #else
  59310. sp_digit d[128 * 4];
  59311. #endif
  59312. sp_digit* a = NULL;
  59313. sp_digit* m = NULL;
  59314. sp_digit* r = NULL;
  59315. int err = MP_OKAY;
  59316. (void)pm;
  59317. (void)qm;
  59318. (void)dpm;
  59319. (void)dqm;
  59320. (void)qim;
  59321. if (*outLen < 512U) {
  59322. err = MP_TO_E;
  59323. }
  59324. if (err == MP_OKAY) {
  59325. if (mp_count_bits(dm) > 4096) {
  59326. err = MP_READ_E;
  59327. }
  59328. else if (inLen > 512) {
  59329. err = MP_READ_E;
  59330. }
  59331. else if (mp_count_bits(mm) != 4096) {
  59332. err = MP_READ_E;
  59333. }
  59334. else if (mp_iseven(mm)) {
  59335. err = MP_VAL;
  59336. }
  59337. }
  59338. #ifdef WOLFSSL_SP_SMALL_STACK
  59339. if (err == MP_OKAY) {
  59340. d = (sp_digit*)XMALLOC(sizeof(sp_digit) * 128 * 4, NULL,
  59341. DYNAMIC_TYPE_RSA);
  59342. if (d == NULL)
  59343. err = MEMORY_E;
  59344. }
  59345. #endif
  59346. if (err == MP_OKAY) {
  59347. a = d + 128;
  59348. m = a + 256;
  59349. r = a;
  59350. sp_4096_from_bin(a, 128, in, inLen);
  59351. sp_4096_from_mp(d, 128, dm);
  59352. sp_4096_from_mp(m, 128, mm);
  59353. err = sp_4096_mod_exp_128(r, a, d, 4096, m, 0);
  59354. }
  59355. if (err == MP_OKAY) {
  59356. sp_4096_to_bin_128(r, out);
  59357. *outLen = 512;
  59358. }
  59359. #ifdef WOLFSSL_SP_SMALL_STACK
  59360. if (d != NULL)
  59361. #endif
  59362. {
  59363. /* only "a" and "r" are sensitive and need zeroized (same pointer) */
  59364. if (a != NULL)
  59365. ForceZero(a, sizeof(sp_digit) * 128);
  59366. #ifdef WOLFSSL_SP_SMALL_STACK
  59367. XFREE(d, NULL, DYNAMIC_TYPE_RSA);
  59368. #endif
  59369. }
  59370. return err;
  59371. #else
  59372. #ifdef WOLFSSL_SP_SMALL_STACK
  59373. sp_digit* a = NULL;
  59374. #else
  59375. sp_digit a[64 * 11];
  59376. #endif
  59377. sp_digit* p = NULL;
  59378. sp_digit* q = NULL;
  59379. sp_digit* dp = NULL;
  59380. sp_digit* tmpa = NULL;
  59381. sp_digit* tmpb = NULL;
  59382. sp_digit* r = NULL;
  59383. sp_digit* qi = NULL;
  59384. sp_digit* dq = NULL;
  59385. sp_digit c;
  59386. int err = MP_OKAY;
  59387. (void)dm;
  59388. (void)mm;
  59389. if (*outLen < 512) {
  59390. err = MP_TO_E;
  59391. }
  59392. else if (inLen > 512 || mp_count_bits(mm) != 4096) {
  59393. err = MP_READ_E;
  59394. }
  59395. else if (mp_iseven(mm)) {
  59396. err = MP_VAL;
  59397. }
  59398. else if (mp_iseven(pm)) {
  59399. err = MP_VAL;
  59400. }
  59401. else if (mp_iseven(qm)) {
  59402. err = MP_VAL;
  59403. }
  59404. #ifdef WOLFSSL_SP_SMALL_STACK
  59405. if (err == MP_OKAY) {
  59406. a = (sp_digit*)XMALLOC(sizeof(sp_digit) * 64 * 11, NULL,
  59407. DYNAMIC_TYPE_RSA);
  59408. if (a == NULL)
  59409. err = MEMORY_E;
  59410. }
  59411. #endif
  59412. if (err == MP_OKAY) {
  59413. p = a + 128 * 2;
  59414. q = p + 64;
  59415. qi = dq = dp = q + 64;
  59416. tmpa = qi + 64;
  59417. tmpb = tmpa + 128;
  59418. r = a;
  59419. sp_4096_from_bin(a, 128, in, inLen);
  59420. sp_4096_from_mp(p, 64, pm);
  59421. sp_4096_from_mp(q, 64, qm);
  59422. sp_4096_from_mp(dp, 64, dpm);
  59423. err = sp_2048_mod_exp_64(tmpa, a, dp, 2048, p, 1);
  59424. }
  59425. if (err == MP_OKAY) {
  59426. sp_4096_from_mp(dq, 64, dqm);
  59427. err = sp_2048_mod_exp_64(tmpb, a, dq, 2048, q, 1);
  59428. }
  59429. if (err == MP_OKAY) {
  59430. c = sp_2048_sub_in_place_64(tmpa, tmpb);
  59431. c += sp_4096_cond_add_64(tmpa, tmpa, p, c);
  59432. sp_4096_cond_add_64(tmpa, tmpa, p, c);
  59433. sp_2048_from_mp(qi, 64, qim);
  59434. sp_2048_mul_64(tmpa, tmpa, qi);
  59435. err = sp_2048_mod_64(tmpa, tmpa, p);
  59436. }
  59437. if (err == MP_OKAY) {
  59438. sp_2048_mul_64(tmpa, q, tmpa);
  59439. XMEMSET(&tmpb[64], 0, sizeof(sp_digit) * 64);
  59440. sp_4096_add_128(r, tmpb, tmpa);
  59441. sp_4096_to_bin_128(r, out);
  59442. *outLen = 512;
  59443. }
  59444. #ifdef WOLFSSL_SP_SMALL_STACK
  59445. if (a != NULL)
  59446. #endif
  59447. {
  59448. ForceZero(a, sizeof(sp_digit) * 64 * 11);
  59449. #ifdef WOLFSSL_SP_SMALL_STACK
  59450. XFREE(a, NULL, DYNAMIC_TYPE_RSA);
  59451. #endif
  59452. }
  59453. #endif /* SP_RSA_PRIVATE_EXP_D || RSA_LOW_MEM */
  59454. return err;
  59455. }
  59456. #endif /* WOLFSSL_RSA_PUBLIC_ONLY */
  59457. #endif /* WOLFSSL_HAVE_SP_RSA */
  59458. #if defined(WOLFSSL_HAVE_SP_DH) || (defined(WOLFSSL_HAVE_SP_RSA) && \
  59459. !defined(WOLFSSL_RSA_PUBLIC_ONLY))
  59460. /* Convert an array of sp_digit to an mp_int.
  59461. *
  59462. * a A single precision integer.
  59463. * r A multi-precision integer.
  59464. */
  59465. static int sp_4096_to_mp(const sp_digit* a, mp_int* r)
  59466. {
  59467. int err;
  59468. err = mp_grow(r, (4096 + DIGIT_BIT - 1) / DIGIT_BIT);
  59469. if (err == MP_OKAY) { /*lint !e774 case where err is always MP_OKAY*/
  59470. #if DIGIT_BIT == 32
  59471. XMEMCPY(r->dp, a, sizeof(sp_digit) * 128);
  59472. r->used = 128;
  59473. mp_clamp(r);
  59474. #elif DIGIT_BIT < 32
  59475. int i;
  59476. int j = 0;
  59477. int s = 0;
  59478. r->dp[0] = 0;
  59479. for (i = 0; i < 128; i++) {
  59480. r->dp[j] |= (mp_digit)(a[i] << s);
  59481. r->dp[j] &= ((sp_digit)1 << DIGIT_BIT) - 1;
  59482. s = DIGIT_BIT - s;
  59483. r->dp[++j] = (mp_digit)(a[i] >> s);
  59484. while (s + DIGIT_BIT <= 32) {
  59485. s += DIGIT_BIT;
  59486. r->dp[j++] &= ((sp_digit)1 << DIGIT_BIT) - 1;
  59487. if (s == SP_WORD_SIZE) {
  59488. r->dp[j] = 0;
  59489. }
  59490. else {
  59491. r->dp[j] = (mp_digit)(a[i] >> s);
  59492. }
  59493. }
  59494. s = 32 - s;
  59495. }
  59496. r->used = (4096 + DIGIT_BIT - 1) / DIGIT_BIT;
  59497. mp_clamp(r);
  59498. #else
  59499. int i;
  59500. int j = 0;
  59501. int s = 0;
  59502. r->dp[0] = 0;
  59503. for (i = 0; i < 128; i++) {
  59504. r->dp[j] |= ((mp_digit)a[i]) << s;
  59505. if (s + 32 >= DIGIT_BIT) {
  59506. #if DIGIT_BIT != 32 && DIGIT_BIT != 64
  59507. r->dp[j] &= ((sp_digit)1 << DIGIT_BIT) - 1;
  59508. #endif
  59509. s = DIGIT_BIT - s;
  59510. r->dp[++j] = a[i] >> s;
  59511. s = 32 - s;
  59512. }
  59513. else {
  59514. s += 32;
  59515. }
  59516. }
  59517. r->used = (4096 + DIGIT_BIT - 1) / DIGIT_BIT;
  59518. mp_clamp(r);
  59519. #endif
  59520. }
  59521. return err;
  59522. }
  59523. /* Perform the modular exponentiation for Diffie-Hellman.
  59524. *
  59525. * base Base. MP integer.
  59526. * exp Exponent. MP integer.
  59527. * mod Modulus. MP integer.
  59528. * res Result. MP integer.
  59529. * returns 0 on success, MP_READ_E if there are too many bytes in an array
  59530. * and MEMORY_E if memory allocation fails.
  59531. */
  59532. int sp_ModExp_4096(const mp_int* base, const mp_int* exp, const mp_int* mod,
  59533. mp_int* res)
  59534. {
  59535. int err = MP_OKAY;
  59536. sp_digit b[256];
  59537. sp_digit e[128];
  59538. sp_digit m[128];
  59539. sp_digit* r = b;
  59540. int expBits = mp_count_bits(exp);
  59541. if (mp_count_bits(base) > 4096) {
  59542. err = MP_READ_E;
  59543. }
  59544. else if (expBits > 4096) {
  59545. err = MP_READ_E;
  59546. }
  59547. else if (mp_count_bits(mod) != 4096) {
  59548. err = MP_READ_E;
  59549. }
  59550. else if (mp_iseven(mod)) {
  59551. err = MP_VAL;
  59552. }
  59553. if (err == MP_OKAY) {
  59554. sp_4096_from_mp(b, 128, base);
  59555. sp_4096_from_mp(e, 128, exp);
  59556. sp_4096_from_mp(m, 128, mod);
  59557. err = sp_4096_mod_exp_128(r, b, e, expBits, m, 0);
  59558. }
  59559. if (err == MP_OKAY) {
  59560. err = sp_4096_to_mp(r, res);
  59561. }
  59562. XMEMSET(e, 0, sizeof(e));
  59563. return err;
  59564. }
  59565. #ifdef WOLFSSL_HAVE_SP_DH
  59566. #ifdef HAVE_FFDHE_4096
  59567. static void sp_4096_lshift_128(sp_digit* r_p, const sp_digit* a_p, byte n_p)
  59568. {
  59569. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  59570. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  59571. register byte n asm ("r2") = (byte)n_p;
  59572. __asm__ __volatile__ (
  59573. "rsb r12, %[n], #31\n\t"
  59574. "ldr r5, [%[a], #508]\n\t"
  59575. "lsr r6, r5, #1\n\t"
  59576. "lsl r5, r5, %[n]\n\t"
  59577. "lsr r6, r6, r12\n\t"
  59578. "ldr r4, [%[a], #504]\n\t"
  59579. "str r6, [%[r], #512]\n\t"
  59580. "lsr r3, r4, #1\n\t"
  59581. "lsl r4, r4, %[n]\n\t"
  59582. "lsr r3, r3, r12\n\t"
  59583. "orr r5, r5, r3\n\t"
  59584. "ldr r6, [%[a], #500]\n\t"
  59585. "str r5, [%[r], #508]\n\t"
  59586. "lsr r3, r6, #1\n\t"
  59587. "lsl r6, r6, %[n]\n\t"
  59588. "lsr r3, r3, r12\n\t"
  59589. "orr r4, r4, r3\n\t"
  59590. "ldr r5, [%[a], #496]\n\t"
  59591. "str r4, [%[r], #504]\n\t"
  59592. "lsr r3, r5, #1\n\t"
  59593. "lsl r5, r5, %[n]\n\t"
  59594. "lsr r3, r3, r12\n\t"
  59595. "orr r6, r6, r3\n\t"
  59596. "ldr r4, [%[a], #492]\n\t"
  59597. "str r6, [%[r], #500]\n\t"
  59598. "lsr r3, r4, #1\n\t"
  59599. "lsl r4, r4, %[n]\n\t"
  59600. "lsr r3, r3, r12\n\t"
  59601. "orr r5, r5, r3\n\t"
  59602. "ldr r6, [%[a], #488]\n\t"
  59603. "str r5, [%[r], #496]\n\t"
  59604. "lsr r3, r6, #1\n\t"
  59605. "lsl r6, r6, %[n]\n\t"
  59606. "lsr r3, r3, r12\n\t"
  59607. "orr r4, r4, r3\n\t"
  59608. "ldr r5, [%[a], #484]\n\t"
  59609. "str r4, [%[r], #492]\n\t"
  59610. "lsr r3, r5, #1\n\t"
  59611. "lsl r5, r5, %[n]\n\t"
  59612. "lsr r3, r3, r12\n\t"
  59613. "orr r6, r6, r3\n\t"
  59614. "ldr r4, [%[a], #480]\n\t"
  59615. "str r6, [%[r], #488]\n\t"
  59616. "lsr r3, r4, #1\n\t"
  59617. "lsl r4, r4, %[n]\n\t"
  59618. "lsr r3, r3, r12\n\t"
  59619. "orr r5, r5, r3\n\t"
  59620. "ldr r6, [%[a], #476]\n\t"
  59621. "str r5, [%[r], #484]\n\t"
  59622. "lsr r3, r6, #1\n\t"
  59623. "lsl r6, r6, %[n]\n\t"
  59624. "lsr r3, r3, r12\n\t"
  59625. "orr r4, r4, r3\n\t"
  59626. "ldr r5, [%[a], #472]\n\t"
  59627. "str r4, [%[r], #480]\n\t"
  59628. "lsr r3, r5, #1\n\t"
  59629. "lsl r5, r5, %[n]\n\t"
  59630. "lsr r3, r3, r12\n\t"
  59631. "orr r6, r6, r3\n\t"
  59632. "ldr r4, [%[a], #468]\n\t"
  59633. "str r6, [%[r], #476]\n\t"
  59634. "lsr r3, r4, #1\n\t"
  59635. "lsl r4, r4, %[n]\n\t"
  59636. "lsr r3, r3, r12\n\t"
  59637. "orr r5, r5, r3\n\t"
  59638. "ldr r6, [%[a], #464]\n\t"
  59639. "str r5, [%[r], #472]\n\t"
  59640. "lsr r3, r6, #1\n\t"
  59641. "lsl r6, r6, %[n]\n\t"
  59642. "lsr r3, r3, r12\n\t"
  59643. "orr r4, r4, r3\n\t"
  59644. "ldr r5, [%[a], #460]\n\t"
  59645. "str r4, [%[r], #468]\n\t"
  59646. "lsr r3, r5, #1\n\t"
  59647. "lsl r5, r5, %[n]\n\t"
  59648. "lsr r3, r3, r12\n\t"
  59649. "orr r6, r6, r3\n\t"
  59650. "ldr r4, [%[a], #456]\n\t"
  59651. "str r6, [%[r], #464]\n\t"
  59652. "lsr r3, r4, #1\n\t"
  59653. "lsl r4, r4, %[n]\n\t"
  59654. "lsr r3, r3, r12\n\t"
  59655. "orr r5, r5, r3\n\t"
  59656. "ldr r6, [%[a], #452]\n\t"
  59657. "str r5, [%[r], #460]\n\t"
  59658. "lsr r3, r6, #1\n\t"
  59659. "lsl r6, r6, %[n]\n\t"
  59660. "lsr r3, r3, r12\n\t"
  59661. "orr r4, r4, r3\n\t"
  59662. "ldr r5, [%[a], #448]\n\t"
  59663. "str r4, [%[r], #456]\n\t"
  59664. "lsr r3, r5, #1\n\t"
  59665. "lsl r5, r5, %[n]\n\t"
  59666. "lsr r3, r3, r12\n\t"
  59667. "orr r6, r6, r3\n\t"
  59668. "ldr r4, [%[a], #444]\n\t"
  59669. "str r6, [%[r], #452]\n\t"
  59670. "lsr r3, r4, #1\n\t"
  59671. "lsl r4, r4, %[n]\n\t"
  59672. "lsr r3, r3, r12\n\t"
  59673. "orr r5, r5, r3\n\t"
  59674. "ldr r6, [%[a], #440]\n\t"
  59675. "str r5, [%[r], #448]\n\t"
  59676. "lsr r3, r6, #1\n\t"
  59677. "lsl r6, r6, %[n]\n\t"
  59678. "lsr r3, r3, r12\n\t"
  59679. "orr r4, r4, r3\n\t"
  59680. "ldr r5, [%[a], #436]\n\t"
  59681. "str r4, [%[r], #444]\n\t"
  59682. "lsr r3, r5, #1\n\t"
  59683. "lsl r5, r5, %[n]\n\t"
  59684. "lsr r3, r3, r12\n\t"
  59685. "orr r6, r6, r3\n\t"
  59686. "ldr r4, [%[a], #432]\n\t"
  59687. "str r6, [%[r], #440]\n\t"
  59688. "lsr r3, r4, #1\n\t"
  59689. "lsl r4, r4, %[n]\n\t"
  59690. "lsr r3, r3, r12\n\t"
  59691. "orr r5, r5, r3\n\t"
  59692. "ldr r6, [%[a], #428]\n\t"
  59693. "str r5, [%[r], #436]\n\t"
  59694. "lsr r3, r6, #1\n\t"
  59695. "lsl r6, r6, %[n]\n\t"
  59696. "lsr r3, r3, r12\n\t"
  59697. "orr r4, r4, r3\n\t"
  59698. "ldr r5, [%[a], #424]\n\t"
  59699. "str r4, [%[r], #432]\n\t"
  59700. "lsr r3, r5, #1\n\t"
  59701. "lsl r5, r5, %[n]\n\t"
  59702. "lsr r3, r3, r12\n\t"
  59703. "orr r6, r6, r3\n\t"
  59704. "ldr r4, [%[a], #420]\n\t"
  59705. "str r6, [%[r], #428]\n\t"
  59706. "lsr r3, r4, #1\n\t"
  59707. "lsl r4, r4, %[n]\n\t"
  59708. "lsr r3, r3, r12\n\t"
  59709. "orr r5, r5, r3\n\t"
  59710. "ldr r6, [%[a], #416]\n\t"
  59711. "str r5, [%[r], #424]\n\t"
  59712. "lsr r3, r6, #1\n\t"
  59713. "lsl r6, r6, %[n]\n\t"
  59714. "lsr r3, r3, r12\n\t"
  59715. "orr r4, r4, r3\n\t"
  59716. "ldr r5, [%[a], #412]\n\t"
  59717. "str r4, [%[r], #420]\n\t"
  59718. "lsr r3, r5, #1\n\t"
  59719. "lsl r5, r5, %[n]\n\t"
  59720. "lsr r3, r3, r12\n\t"
  59721. "orr r6, r6, r3\n\t"
  59722. "ldr r4, [%[a], #408]\n\t"
  59723. "str r6, [%[r], #416]\n\t"
  59724. "lsr r3, r4, #1\n\t"
  59725. "lsl r4, r4, %[n]\n\t"
  59726. "lsr r3, r3, r12\n\t"
  59727. "orr r5, r5, r3\n\t"
  59728. "ldr r6, [%[a], #404]\n\t"
  59729. "str r5, [%[r], #412]\n\t"
  59730. "lsr r3, r6, #1\n\t"
  59731. "lsl r6, r6, %[n]\n\t"
  59732. "lsr r3, r3, r12\n\t"
  59733. "orr r4, r4, r3\n\t"
  59734. "ldr r5, [%[a], #400]\n\t"
  59735. "str r4, [%[r], #408]\n\t"
  59736. "lsr r3, r5, #1\n\t"
  59737. "lsl r5, r5, %[n]\n\t"
  59738. "lsr r3, r3, r12\n\t"
  59739. "orr r6, r6, r3\n\t"
  59740. "ldr r4, [%[a], #396]\n\t"
  59741. "str r6, [%[r], #404]\n\t"
  59742. "lsr r3, r4, #1\n\t"
  59743. "lsl r4, r4, %[n]\n\t"
  59744. "lsr r3, r3, r12\n\t"
  59745. "orr r5, r5, r3\n\t"
  59746. "ldr r6, [%[a], #392]\n\t"
  59747. "str r5, [%[r], #400]\n\t"
  59748. "lsr r3, r6, #1\n\t"
  59749. "lsl r6, r6, %[n]\n\t"
  59750. "lsr r3, r3, r12\n\t"
  59751. "orr r4, r4, r3\n\t"
  59752. "ldr r5, [%[a], #388]\n\t"
  59753. "str r4, [%[r], #396]\n\t"
  59754. "lsr r3, r5, #1\n\t"
  59755. "lsl r5, r5, %[n]\n\t"
  59756. "lsr r3, r3, r12\n\t"
  59757. "orr r6, r6, r3\n\t"
  59758. "ldr r4, [%[a], #384]\n\t"
  59759. "str r6, [%[r], #392]\n\t"
  59760. "lsr r3, r4, #1\n\t"
  59761. "lsl r4, r4, %[n]\n\t"
  59762. "lsr r3, r3, r12\n\t"
  59763. "orr r5, r5, r3\n\t"
  59764. "ldr r6, [%[a], #380]\n\t"
  59765. "str r5, [%[r], #388]\n\t"
  59766. "lsr r3, r6, #1\n\t"
  59767. "lsl r6, r6, %[n]\n\t"
  59768. "lsr r3, r3, r12\n\t"
  59769. "orr r4, r4, r3\n\t"
  59770. "ldr r5, [%[a], #376]\n\t"
  59771. "str r4, [%[r], #384]\n\t"
  59772. "lsr r3, r5, #1\n\t"
  59773. "lsl r5, r5, %[n]\n\t"
  59774. "lsr r3, r3, r12\n\t"
  59775. "orr r6, r6, r3\n\t"
  59776. "ldr r4, [%[a], #372]\n\t"
  59777. "str r6, [%[r], #380]\n\t"
  59778. "lsr r3, r4, #1\n\t"
  59779. "lsl r4, r4, %[n]\n\t"
  59780. "lsr r3, r3, r12\n\t"
  59781. "orr r5, r5, r3\n\t"
  59782. "ldr r6, [%[a], #368]\n\t"
  59783. "str r5, [%[r], #376]\n\t"
  59784. "lsr r3, r6, #1\n\t"
  59785. "lsl r6, r6, %[n]\n\t"
  59786. "lsr r3, r3, r12\n\t"
  59787. "orr r4, r4, r3\n\t"
  59788. "ldr r5, [%[a], #364]\n\t"
  59789. "str r4, [%[r], #372]\n\t"
  59790. "lsr r3, r5, #1\n\t"
  59791. "lsl r5, r5, %[n]\n\t"
  59792. "lsr r3, r3, r12\n\t"
  59793. "orr r6, r6, r3\n\t"
  59794. "ldr r4, [%[a], #360]\n\t"
  59795. "str r6, [%[r], #368]\n\t"
  59796. "lsr r3, r4, #1\n\t"
  59797. "lsl r4, r4, %[n]\n\t"
  59798. "lsr r3, r3, r12\n\t"
  59799. "orr r5, r5, r3\n\t"
  59800. "ldr r6, [%[a], #356]\n\t"
  59801. "str r5, [%[r], #364]\n\t"
  59802. "lsr r3, r6, #1\n\t"
  59803. "lsl r6, r6, %[n]\n\t"
  59804. "lsr r3, r3, r12\n\t"
  59805. "orr r4, r4, r3\n\t"
  59806. "ldr r5, [%[a], #352]\n\t"
  59807. "str r4, [%[r], #360]\n\t"
  59808. "lsr r3, r5, #1\n\t"
  59809. "lsl r5, r5, %[n]\n\t"
  59810. "lsr r3, r3, r12\n\t"
  59811. "orr r6, r6, r3\n\t"
  59812. "ldr r4, [%[a], #348]\n\t"
  59813. "str r6, [%[r], #356]\n\t"
  59814. "lsr r3, r4, #1\n\t"
  59815. "lsl r4, r4, %[n]\n\t"
  59816. "lsr r3, r3, r12\n\t"
  59817. "orr r5, r5, r3\n\t"
  59818. "ldr r6, [%[a], #344]\n\t"
  59819. "str r5, [%[r], #352]\n\t"
  59820. "lsr r3, r6, #1\n\t"
  59821. "lsl r6, r6, %[n]\n\t"
  59822. "lsr r3, r3, r12\n\t"
  59823. "orr r4, r4, r3\n\t"
  59824. "ldr r5, [%[a], #340]\n\t"
  59825. "str r4, [%[r], #348]\n\t"
  59826. "lsr r3, r5, #1\n\t"
  59827. "lsl r5, r5, %[n]\n\t"
  59828. "lsr r3, r3, r12\n\t"
  59829. "orr r6, r6, r3\n\t"
  59830. "ldr r4, [%[a], #336]\n\t"
  59831. "str r6, [%[r], #344]\n\t"
  59832. "lsr r3, r4, #1\n\t"
  59833. "lsl r4, r4, %[n]\n\t"
  59834. "lsr r3, r3, r12\n\t"
  59835. "orr r5, r5, r3\n\t"
  59836. "ldr r6, [%[a], #332]\n\t"
  59837. "str r5, [%[r], #340]\n\t"
  59838. "lsr r3, r6, #1\n\t"
  59839. "lsl r6, r6, %[n]\n\t"
  59840. "lsr r3, r3, r12\n\t"
  59841. "orr r4, r4, r3\n\t"
  59842. "ldr r5, [%[a], #328]\n\t"
  59843. "str r4, [%[r], #336]\n\t"
  59844. "lsr r3, r5, #1\n\t"
  59845. "lsl r5, r5, %[n]\n\t"
  59846. "lsr r3, r3, r12\n\t"
  59847. "orr r6, r6, r3\n\t"
  59848. "ldr r4, [%[a], #324]\n\t"
  59849. "str r6, [%[r], #332]\n\t"
  59850. "lsr r3, r4, #1\n\t"
  59851. "lsl r4, r4, %[n]\n\t"
  59852. "lsr r3, r3, r12\n\t"
  59853. "orr r5, r5, r3\n\t"
  59854. "ldr r6, [%[a], #320]\n\t"
  59855. "str r5, [%[r], #328]\n\t"
  59856. "lsr r3, r6, #1\n\t"
  59857. "lsl r6, r6, %[n]\n\t"
  59858. "lsr r3, r3, r12\n\t"
  59859. "orr r4, r4, r3\n\t"
  59860. "ldr r5, [%[a], #316]\n\t"
  59861. "str r4, [%[r], #324]\n\t"
  59862. "lsr r3, r5, #1\n\t"
  59863. "lsl r5, r5, %[n]\n\t"
  59864. "lsr r3, r3, r12\n\t"
  59865. "orr r6, r6, r3\n\t"
  59866. "ldr r4, [%[a], #312]\n\t"
  59867. "str r6, [%[r], #320]\n\t"
  59868. "lsr r3, r4, #1\n\t"
  59869. "lsl r4, r4, %[n]\n\t"
  59870. "lsr r3, r3, r12\n\t"
  59871. "orr r5, r5, r3\n\t"
  59872. "ldr r6, [%[a], #308]\n\t"
  59873. "str r5, [%[r], #316]\n\t"
  59874. "lsr r3, r6, #1\n\t"
  59875. "lsl r6, r6, %[n]\n\t"
  59876. "lsr r3, r3, r12\n\t"
  59877. "orr r4, r4, r3\n\t"
  59878. "ldr r5, [%[a], #304]\n\t"
  59879. "str r4, [%[r], #312]\n\t"
  59880. "lsr r3, r5, #1\n\t"
  59881. "lsl r5, r5, %[n]\n\t"
  59882. "lsr r3, r3, r12\n\t"
  59883. "orr r6, r6, r3\n\t"
  59884. "ldr r4, [%[a], #300]\n\t"
  59885. "str r6, [%[r], #308]\n\t"
  59886. "lsr r3, r4, #1\n\t"
  59887. "lsl r4, r4, %[n]\n\t"
  59888. "lsr r3, r3, r12\n\t"
  59889. "orr r5, r5, r3\n\t"
  59890. "ldr r6, [%[a], #296]\n\t"
  59891. "str r5, [%[r], #304]\n\t"
  59892. "lsr r3, r6, #1\n\t"
  59893. "lsl r6, r6, %[n]\n\t"
  59894. "lsr r3, r3, r12\n\t"
  59895. "orr r4, r4, r3\n\t"
  59896. "ldr r5, [%[a], #292]\n\t"
  59897. "str r4, [%[r], #300]\n\t"
  59898. "lsr r3, r5, #1\n\t"
  59899. "lsl r5, r5, %[n]\n\t"
  59900. "lsr r3, r3, r12\n\t"
  59901. "orr r6, r6, r3\n\t"
  59902. "ldr r4, [%[a], #288]\n\t"
  59903. "str r6, [%[r], #296]\n\t"
  59904. "lsr r3, r4, #1\n\t"
  59905. "lsl r4, r4, %[n]\n\t"
  59906. "lsr r3, r3, r12\n\t"
  59907. "orr r5, r5, r3\n\t"
  59908. "ldr r6, [%[a], #284]\n\t"
  59909. "str r5, [%[r], #292]\n\t"
  59910. "lsr r3, r6, #1\n\t"
  59911. "lsl r6, r6, %[n]\n\t"
  59912. "lsr r3, r3, r12\n\t"
  59913. "orr r4, r4, r3\n\t"
  59914. "ldr r5, [%[a], #280]\n\t"
  59915. "str r4, [%[r], #288]\n\t"
  59916. "lsr r3, r5, #1\n\t"
  59917. "lsl r5, r5, %[n]\n\t"
  59918. "lsr r3, r3, r12\n\t"
  59919. "orr r6, r6, r3\n\t"
  59920. "ldr r4, [%[a], #276]\n\t"
  59921. "str r6, [%[r], #284]\n\t"
  59922. "lsr r3, r4, #1\n\t"
  59923. "lsl r4, r4, %[n]\n\t"
  59924. "lsr r3, r3, r12\n\t"
  59925. "orr r5, r5, r3\n\t"
  59926. "ldr r6, [%[a], #272]\n\t"
  59927. "str r5, [%[r], #280]\n\t"
  59928. "lsr r3, r6, #1\n\t"
  59929. "lsl r6, r6, %[n]\n\t"
  59930. "lsr r3, r3, r12\n\t"
  59931. "orr r4, r4, r3\n\t"
  59932. "ldr r5, [%[a], #268]\n\t"
  59933. "str r4, [%[r], #276]\n\t"
  59934. "lsr r3, r5, #1\n\t"
  59935. "lsl r5, r5, %[n]\n\t"
  59936. "lsr r3, r3, r12\n\t"
  59937. "orr r6, r6, r3\n\t"
  59938. "ldr r4, [%[a], #264]\n\t"
  59939. "str r6, [%[r], #272]\n\t"
  59940. "lsr r3, r4, #1\n\t"
  59941. "lsl r4, r4, %[n]\n\t"
  59942. "lsr r3, r3, r12\n\t"
  59943. "orr r5, r5, r3\n\t"
  59944. "ldr r6, [%[a], #260]\n\t"
  59945. "str r5, [%[r], #268]\n\t"
  59946. "lsr r3, r6, #1\n\t"
  59947. "lsl r6, r6, %[n]\n\t"
  59948. "lsr r3, r3, r12\n\t"
  59949. "orr r4, r4, r3\n\t"
  59950. "ldr r5, [%[a], #256]\n\t"
  59951. "str r4, [%[r], #264]\n\t"
  59952. "lsr r3, r5, #1\n\t"
  59953. "lsl r5, r5, %[n]\n\t"
  59954. "lsr r3, r3, r12\n\t"
  59955. "orr r6, r6, r3\n\t"
  59956. "ldr r4, [%[a], #252]\n\t"
  59957. "str r6, [%[r], #260]\n\t"
  59958. "lsr r3, r4, #1\n\t"
  59959. "lsl r4, r4, %[n]\n\t"
  59960. "lsr r3, r3, r12\n\t"
  59961. "orr r5, r5, r3\n\t"
  59962. "ldr r6, [%[a], #248]\n\t"
  59963. "str r5, [%[r], #256]\n\t"
  59964. "lsr r3, r6, #1\n\t"
  59965. "lsl r6, r6, %[n]\n\t"
  59966. "lsr r3, r3, r12\n\t"
  59967. "orr r4, r4, r3\n\t"
  59968. "ldr r5, [%[a], #244]\n\t"
  59969. "str r4, [%[r], #252]\n\t"
  59970. "lsr r3, r5, #1\n\t"
  59971. "lsl r5, r5, %[n]\n\t"
  59972. "lsr r3, r3, r12\n\t"
  59973. "orr r6, r6, r3\n\t"
  59974. "ldr r4, [%[a], #240]\n\t"
  59975. "str r6, [%[r], #248]\n\t"
  59976. "lsr r3, r4, #1\n\t"
  59977. "lsl r4, r4, %[n]\n\t"
  59978. "lsr r3, r3, r12\n\t"
  59979. "orr r5, r5, r3\n\t"
  59980. "ldr r6, [%[a], #236]\n\t"
  59981. "str r5, [%[r], #244]\n\t"
  59982. "lsr r3, r6, #1\n\t"
  59983. "lsl r6, r6, %[n]\n\t"
  59984. "lsr r3, r3, r12\n\t"
  59985. "orr r4, r4, r3\n\t"
  59986. "ldr r5, [%[a], #232]\n\t"
  59987. "str r4, [%[r], #240]\n\t"
  59988. "lsr r3, r5, #1\n\t"
  59989. "lsl r5, r5, %[n]\n\t"
  59990. "lsr r3, r3, r12\n\t"
  59991. "orr r6, r6, r3\n\t"
  59992. "ldr r4, [%[a], #228]\n\t"
  59993. "str r6, [%[r], #236]\n\t"
  59994. "lsr r3, r4, #1\n\t"
  59995. "lsl r4, r4, %[n]\n\t"
  59996. "lsr r3, r3, r12\n\t"
  59997. "orr r5, r5, r3\n\t"
  59998. "ldr r6, [%[a], #224]\n\t"
  59999. "str r5, [%[r], #232]\n\t"
  60000. "lsr r3, r6, #1\n\t"
  60001. "lsl r6, r6, %[n]\n\t"
  60002. "lsr r3, r3, r12\n\t"
  60003. "orr r4, r4, r3\n\t"
  60004. "ldr r5, [%[a], #220]\n\t"
  60005. "str r4, [%[r], #228]\n\t"
  60006. "lsr r3, r5, #1\n\t"
  60007. "lsl r5, r5, %[n]\n\t"
  60008. "lsr r3, r3, r12\n\t"
  60009. "orr r6, r6, r3\n\t"
  60010. "ldr r4, [%[a], #216]\n\t"
  60011. "str r6, [%[r], #224]\n\t"
  60012. "lsr r3, r4, #1\n\t"
  60013. "lsl r4, r4, %[n]\n\t"
  60014. "lsr r3, r3, r12\n\t"
  60015. "orr r5, r5, r3\n\t"
  60016. "ldr r6, [%[a], #212]\n\t"
  60017. "str r5, [%[r], #220]\n\t"
  60018. "lsr r3, r6, #1\n\t"
  60019. "lsl r6, r6, %[n]\n\t"
  60020. "lsr r3, r3, r12\n\t"
  60021. "orr r4, r4, r3\n\t"
  60022. "ldr r5, [%[a], #208]\n\t"
  60023. "str r4, [%[r], #216]\n\t"
  60024. "lsr r3, r5, #1\n\t"
  60025. "lsl r5, r5, %[n]\n\t"
  60026. "lsr r3, r3, r12\n\t"
  60027. "orr r6, r6, r3\n\t"
  60028. "ldr r4, [%[a], #204]\n\t"
  60029. "str r6, [%[r], #212]\n\t"
  60030. "lsr r3, r4, #1\n\t"
  60031. "lsl r4, r4, %[n]\n\t"
  60032. "lsr r3, r3, r12\n\t"
  60033. "orr r5, r5, r3\n\t"
  60034. "ldr r6, [%[a], #200]\n\t"
  60035. "str r5, [%[r], #208]\n\t"
  60036. "lsr r3, r6, #1\n\t"
  60037. "lsl r6, r6, %[n]\n\t"
  60038. "lsr r3, r3, r12\n\t"
  60039. "orr r4, r4, r3\n\t"
  60040. "ldr r5, [%[a], #196]\n\t"
  60041. "str r4, [%[r], #204]\n\t"
  60042. "lsr r3, r5, #1\n\t"
  60043. "lsl r5, r5, %[n]\n\t"
  60044. "lsr r3, r3, r12\n\t"
  60045. "orr r6, r6, r3\n\t"
  60046. "ldr r4, [%[a], #192]\n\t"
  60047. "str r6, [%[r], #200]\n\t"
  60048. "lsr r3, r4, #1\n\t"
  60049. "lsl r4, r4, %[n]\n\t"
  60050. "lsr r3, r3, r12\n\t"
  60051. "orr r5, r5, r3\n\t"
  60052. "ldr r6, [%[a], #188]\n\t"
  60053. "str r5, [%[r], #196]\n\t"
  60054. "lsr r3, r6, #1\n\t"
  60055. "lsl r6, r6, %[n]\n\t"
  60056. "lsr r3, r3, r12\n\t"
  60057. "orr r4, r4, r3\n\t"
  60058. "ldr r5, [%[a], #184]\n\t"
  60059. "str r4, [%[r], #192]\n\t"
  60060. "lsr r3, r5, #1\n\t"
  60061. "lsl r5, r5, %[n]\n\t"
  60062. "lsr r3, r3, r12\n\t"
  60063. "orr r6, r6, r3\n\t"
  60064. "ldr r4, [%[a], #180]\n\t"
  60065. "str r6, [%[r], #188]\n\t"
  60066. "lsr r3, r4, #1\n\t"
  60067. "lsl r4, r4, %[n]\n\t"
  60068. "lsr r3, r3, r12\n\t"
  60069. "orr r5, r5, r3\n\t"
  60070. "ldr r6, [%[a], #176]\n\t"
  60071. "str r5, [%[r], #184]\n\t"
  60072. "lsr r3, r6, #1\n\t"
  60073. "lsl r6, r6, %[n]\n\t"
  60074. "lsr r3, r3, r12\n\t"
  60075. "orr r4, r4, r3\n\t"
  60076. "ldr r5, [%[a], #172]\n\t"
  60077. "str r4, [%[r], #180]\n\t"
  60078. "lsr r3, r5, #1\n\t"
  60079. "lsl r5, r5, %[n]\n\t"
  60080. "lsr r3, r3, r12\n\t"
  60081. "orr r6, r6, r3\n\t"
  60082. "ldr r4, [%[a], #168]\n\t"
  60083. "str r6, [%[r], #176]\n\t"
  60084. "lsr r3, r4, #1\n\t"
  60085. "lsl r4, r4, %[n]\n\t"
  60086. "lsr r3, r3, r12\n\t"
  60087. "orr r5, r5, r3\n\t"
  60088. "ldr r6, [%[a], #164]\n\t"
  60089. "str r5, [%[r], #172]\n\t"
  60090. "lsr r3, r6, #1\n\t"
  60091. "lsl r6, r6, %[n]\n\t"
  60092. "lsr r3, r3, r12\n\t"
  60093. "orr r4, r4, r3\n\t"
  60094. "ldr r5, [%[a], #160]\n\t"
  60095. "str r4, [%[r], #168]\n\t"
  60096. "lsr r3, r5, #1\n\t"
  60097. "lsl r5, r5, %[n]\n\t"
  60098. "lsr r3, r3, r12\n\t"
  60099. "orr r6, r6, r3\n\t"
  60100. "ldr r4, [%[a], #156]\n\t"
  60101. "str r6, [%[r], #164]\n\t"
  60102. "lsr r3, r4, #1\n\t"
  60103. "lsl r4, r4, %[n]\n\t"
  60104. "lsr r3, r3, r12\n\t"
  60105. "orr r5, r5, r3\n\t"
  60106. "ldr r6, [%[a], #152]\n\t"
  60107. "str r5, [%[r], #160]\n\t"
  60108. "lsr r3, r6, #1\n\t"
  60109. "lsl r6, r6, %[n]\n\t"
  60110. "lsr r3, r3, r12\n\t"
  60111. "orr r4, r4, r3\n\t"
  60112. "ldr r5, [%[a], #148]\n\t"
  60113. "str r4, [%[r], #156]\n\t"
  60114. "lsr r3, r5, #1\n\t"
  60115. "lsl r5, r5, %[n]\n\t"
  60116. "lsr r3, r3, r12\n\t"
  60117. "orr r6, r6, r3\n\t"
  60118. "ldr r4, [%[a], #144]\n\t"
  60119. "str r6, [%[r], #152]\n\t"
  60120. "lsr r3, r4, #1\n\t"
  60121. "lsl r4, r4, %[n]\n\t"
  60122. "lsr r3, r3, r12\n\t"
  60123. "orr r5, r5, r3\n\t"
  60124. "ldr r6, [%[a], #140]\n\t"
  60125. "str r5, [%[r], #148]\n\t"
  60126. "lsr r3, r6, #1\n\t"
  60127. "lsl r6, r6, %[n]\n\t"
  60128. "lsr r3, r3, r12\n\t"
  60129. "orr r4, r4, r3\n\t"
  60130. "ldr r5, [%[a], #136]\n\t"
  60131. "str r4, [%[r], #144]\n\t"
  60132. "lsr r3, r5, #1\n\t"
  60133. "lsl r5, r5, %[n]\n\t"
  60134. "lsr r3, r3, r12\n\t"
  60135. "orr r6, r6, r3\n\t"
  60136. "ldr r4, [%[a], #132]\n\t"
  60137. "str r6, [%[r], #140]\n\t"
  60138. "lsr r3, r4, #1\n\t"
  60139. "lsl r4, r4, %[n]\n\t"
  60140. "lsr r3, r3, r12\n\t"
  60141. "orr r5, r5, r3\n\t"
  60142. "ldr r6, [%[a], #128]\n\t"
  60143. "str r5, [%[r], #136]\n\t"
  60144. "lsr r3, r6, #1\n\t"
  60145. "lsl r6, r6, %[n]\n\t"
  60146. "lsr r3, r3, r12\n\t"
  60147. "orr r4, r4, r3\n\t"
  60148. "ldr r5, [%[a], #124]\n\t"
  60149. "str r4, [%[r], #132]\n\t"
  60150. "lsr r3, r5, #1\n\t"
  60151. "lsl r5, r5, %[n]\n\t"
  60152. "lsr r3, r3, r12\n\t"
  60153. "orr r6, r6, r3\n\t"
  60154. "ldr r4, [%[a], #120]\n\t"
  60155. "str r6, [%[r], #128]\n\t"
  60156. "lsr r3, r4, #1\n\t"
  60157. "lsl r4, r4, %[n]\n\t"
  60158. "lsr r3, r3, r12\n\t"
  60159. "orr r5, r5, r3\n\t"
  60160. "ldr r6, [%[a], #116]\n\t"
  60161. "str r5, [%[r], #124]\n\t"
  60162. "lsr r3, r6, #1\n\t"
  60163. "lsl r6, r6, %[n]\n\t"
  60164. "lsr r3, r3, r12\n\t"
  60165. "orr r4, r4, r3\n\t"
  60166. "ldr r5, [%[a], #112]\n\t"
  60167. "str r4, [%[r], #120]\n\t"
  60168. "lsr r3, r5, #1\n\t"
  60169. "lsl r5, r5, %[n]\n\t"
  60170. "lsr r3, r3, r12\n\t"
  60171. "orr r6, r6, r3\n\t"
  60172. "ldr r4, [%[a], #108]\n\t"
  60173. "str r6, [%[r], #116]\n\t"
  60174. "lsr r3, r4, #1\n\t"
  60175. "lsl r4, r4, %[n]\n\t"
  60176. "lsr r3, r3, r12\n\t"
  60177. "orr r5, r5, r3\n\t"
  60178. "ldr r6, [%[a], #104]\n\t"
  60179. "str r5, [%[r], #112]\n\t"
  60180. "lsr r3, r6, #1\n\t"
  60181. "lsl r6, r6, %[n]\n\t"
  60182. "lsr r3, r3, r12\n\t"
  60183. "orr r4, r4, r3\n\t"
  60184. "ldr r5, [%[a], #100]\n\t"
  60185. "str r4, [%[r], #108]\n\t"
  60186. "lsr r3, r5, #1\n\t"
  60187. "lsl r5, r5, %[n]\n\t"
  60188. "lsr r3, r3, r12\n\t"
  60189. "orr r6, r6, r3\n\t"
  60190. "ldr r4, [%[a], #96]\n\t"
  60191. "str r6, [%[r], #104]\n\t"
  60192. "lsr r3, r4, #1\n\t"
  60193. "lsl r4, r4, %[n]\n\t"
  60194. "lsr r3, r3, r12\n\t"
  60195. "orr r5, r5, r3\n\t"
  60196. "ldr r6, [%[a], #92]\n\t"
  60197. "str r5, [%[r], #100]\n\t"
  60198. "lsr r3, r6, #1\n\t"
  60199. "lsl r6, r6, %[n]\n\t"
  60200. "lsr r3, r3, r12\n\t"
  60201. "orr r4, r4, r3\n\t"
  60202. "ldr r5, [%[a], #88]\n\t"
  60203. "str r4, [%[r], #96]\n\t"
  60204. "lsr r3, r5, #1\n\t"
  60205. "lsl r5, r5, %[n]\n\t"
  60206. "lsr r3, r3, r12\n\t"
  60207. "orr r6, r6, r3\n\t"
  60208. "ldr r4, [%[a], #84]\n\t"
  60209. "str r6, [%[r], #92]\n\t"
  60210. "lsr r3, r4, #1\n\t"
  60211. "lsl r4, r4, %[n]\n\t"
  60212. "lsr r3, r3, r12\n\t"
  60213. "orr r5, r5, r3\n\t"
  60214. "ldr r6, [%[a], #80]\n\t"
  60215. "str r5, [%[r], #88]\n\t"
  60216. "lsr r3, r6, #1\n\t"
  60217. "lsl r6, r6, %[n]\n\t"
  60218. "lsr r3, r3, r12\n\t"
  60219. "orr r4, r4, r3\n\t"
  60220. "ldr r5, [%[a], #76]\n\t"
  60221. "str r4, [%[r], #84]\n\t"
  60222. "lsr r3, r5, #1\n\t"
  60223. "lsl r5, r5, %[n]\n\t"
  60224. "lsr r3, r3, r12\n\t"
  60225. "orr r6, r6, r3\n\t"
  60226. "ldr r4, [%[a], #72]\n\t"
  60227. "str r6, [%[r], #80]\n\t"
  60228. "lsr r3, r4, #1\n\t"
  60229. "lsl r4, r4, %[n]\n\t"
  60230. "lsr r3, r3, r12\n\t"
  60231. "orr r5, r5, r3\n\t"
  60232. "ldr r6, [%[a], #68]\n\t"
  60233. "str r5, [%[r], #76]\n\t"
  60234. "lsr r3, r6, #1\n\t"
  60235. "lsl r6, r6, %[n]\n\t"
  60236. "lsr r3, r3, r12\n\t"
  60237. "orr r4, r4, r3\n\t"
  60238. "ldr r5, [%[a], #64]\n\t"
  60239. "str r4, [%[r], #72]\n\t"
  60240. "lsr r3, r5, #1\n\t"
  60241. "lsl r5, r5, %[n]\n\t"
  60242. "lsr r3, r3, r12\n\t"
  60243. "orr r6, r6, r3\n\t"
  60244. "ldr r4, [%[a], #60]\n\t"
  60245. "str r6, [%[r], #68]\n\t"
  60246. "lsr r3, r4, #1\n\t"
  60247. "lsl r4, r4, %[n]\n\t"
  60248. "lsr r3, r3, r12\n\t"
  60249. "orr r5, r5, r3\n\t"
  60250. "ldr r6, [%[a], #56]\n\t"
  60251. "str r5, [%[r], #64]\n\t"
  60252. "lsr r3, r6, #1\n\t"
  60253. "lsl r6, r6, %[n]\n\t"
  60254. "lsr r3, r3, r12\n\t"
  60255. "orr r4, r4, r3\n\t"
  60256. "ldr r5, [%[a], #52]\n\t"
  60257. "str r4, [%[r], #60]\n\t"
  60258. "lsr r3, r5, #1\n\t"
  60259. "lsl r5, r5, %[n]\n\t"
  60260. "lsr r3, r3, r12\n\t"
  60261. "orr r6, r6, r3\n\t"
  60262. "ldr r4, [%[a], #48]\n\t"
  60263. "str r6, [%[r], #56]\n\t"
  60264. "lsr r3, r4, #1\n\t"
  60265. "lsl r4, r4, %[n]\n\t"
  60266. "lsr r3, r3, r12\n\t"
  60267. "orr r5, r5, r3\n\t"
  60268. "ldr r6, [%[a], #44]\n\t"
  60269. "str r5, [%[r], #52]\n\t"
  60270. "lsr r3, r6, #1\n\t"
  60271. "lsl r6, r6, %[n]\n\t"
  60272. "lsr r3, r3, r12\n\t"
  60273. "orr r4, r4, r3\n\t"
  60274. "ldr r5, [%[a], #40]\n\t"
  60275. "str r4, [%[r], #48]\n\t"
  60276. "lsr r3, r5, #1\n\t"
  60277. "lsl r5, r5, %[n]\n\t"
  60278. "lsr r3, r3, r12\n\t"
  60279. "orr r6, r6, r3\n\t"
  60280. "ldr r4, [%[a], #36]\n\t"
  60281. "str r6, [%[r], #44]\n\t"
  60282. "lsr r3, r4, #1\n\t"
  60283. "lsl r4, r4, %[n]\n\t"
  60284. "lsr r3, r3, r12\n\t"
  60285. "orr r5, r5, r3\n\t"
  60286. "ldr r6, [%[a], #32]\n\t"
  60287. "str r5, [%[r], #40]\n\t"
  60288. "lsr r3, r6, #1\n\t"
  60289. "lsl r6, r6, %[n]\n\t"
  60290. "lsr r3, r3, r12\n\t"
  60291. "orr r4, r4, r3\n\t"
  60292. "ldr r5, [%[a], #28]\n\t"
  60293. "str r4, [%[r], #36]\n\t"
  60294. "lsr r3, r5, #1\n\t"
  60295. "lsl r5, r5, %[n]\n\t"
  60296. "lsr r3, r3, r12\n\t"
  60297. "orr r6, r6, r3\n\t"
  60298. "ldr r4, [%[a], #24]\n\t"
  60299. "str r6, [%[r], #32]\n\t"
  60300. "lsr r3, r4, #1\n\t"
  60301. "lsl r4, r4, %[n]\n\t"
  60302. "lsr r3, r3, r12\n\t"
  60303. "orr r5, r5, r3\n\t"
  60304. "ldr r6, [%[a], #20]\n\t"
  60305. "str r5, [%[r], #28]\n\t"
  60306. "lsr r3, r6, #1\n\t"
  60307. "lsl r6, r6, %[n]\n\t"
  60308. "lsr r3, r3, r12\n\t"
  60309. "orr r4, r4, r3\n\t"
  60310. "ldr r5, [%[a], #16]\n\t"
  60311. "str r4, [%[r], #24]\n\t"
  60312. "lsr r3, r5, #1\n\t"
  60313. "lsl r5, r5, %[n]\n\t"
  60314. "lsr r3, r3, r12\n\t"
  60315. "orr r6, r6, r3\n\t"
  60316. "ldr r4, [%[a], #12]\n\t"
  60317. "str r6, [%[r], #20]\n\t"
  60318. "lsr r3, r4, #1\n\t"
  60319. "lsl r4, r4, %[n]\n\t"
  60320. "lsr r3, r3, r12\n\t"
  60321. "orr r5, r5, r3\n\t"
  60322. "ldr r6, [%[a], #8]\n\t"
  60323. "str r5, [%[r], #16]\n\t"
  60324. "lsr r3, r6, #1\n\t"
  60325. "lsl r6, r6, %[n]\n\t"
  60326. "lsr r3, r3, r12\n\t"
  60327. "orr r4, r4, r3\n\t"
  60328. "ldr r5, [%[a], #4]\n\t"
  60329. "str r4, [%[r], #12]\n\t"
  60330. "lsr r3, r5, #1\n\t"
  60331. "lsl r5, r5, %[n]\n\t"
  60332. "lsr r3, r3, r12\n\t"
  60333. "orr r6, r6, r3\n\t"
  60334. "ldr r4, [%[a]]\n\t"
  60335. "str r6, [%[r], #8]\n\t"
  60336. "lsr r3, r4, #1\n\t"
  60337. "lsl r4, r4, %[n]\n\t"
  60338. "lsr r3, r3, r12\n\t"
  60339. "orr r5, r5, r3\n\t"
  60340. "str r4, [%[r]]\n\t"
  60341. "str r5, [%[r], #4]\n\t"
  60342. : [r] "+r" (r), [a] "+r" (a), [n] "+r" (n)
  60343. :
  60344. : "memory", "r4", "r5", "r6", "r3", "r12", "cc"
  60345. );
  60346. }
  60347. /* Modular exponentiate 2 to the e mod m. (r = 2^e mod m)
  60348. *
  60349. * r A single precision number that is the result of the operation.
  60350. * e A single precision number that is the exponent.
  60351. * bits The number of bits in the exponent.
  60352. * m A single precision number that is the modulus.
  60353. * returns 0 on success.
  60354. * returns MEMORY_E on dynamic memory allocation failure.
  60355. * returns MP_VAL when base is even.
  60356. */
  60357. static int sp_4096_mod_exp_2_128(sp_digit* r, const sp_digit* e, int bits,
  60358. const sp_digit* m)
  60359. {
  60360. #ifdef WOLFSSL_SP_SMALL_STACK
  60361. sp_digit* td = NULL;
  60362. #else
  60363. sp_digit td[385];
  60364. #endif
  60365. sp_digit* norm = NULL;
  60366. sp_digit* tmp = NULL;
  60367. sp_digit mp = 1;
  60368. sp_digit n;
  60369. sp_digit o;
  60370. sp_digit mask;
  60371. int i;
  60372. int c;
  60373. byte y;
  60374. int err = MP_OKAY;
  60375. if (bits == 0) {
  60376. err = MP_VAL;
  60377. }
  60378. #ifdef WOLFSSL_SP_SMALL_STACK
  60379. if (err == MP_OKAY) {
  60380. td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 385, NULL,
  60381. DYNAMIC_TYPE_TMP_BUFFER);
  60382. if (td == NULL)
  60383. err = MEMORY_E;
  60384. }
  60385. #endif
  60386. if (err == MP_OKAY) {
  60387. norm = td;
  60388. tmp = td + 256;
  60389. sp_4096_mont_setup(m, &mp);
  60390. sp_4096_mont_norm_128(norm, m);
  60391. i = (bits - 1) / 32;
  60392. n = e[i--];
  60393. c = bits & 31;
  60394. if (c == 0) {
  60395. c = 32;
  60396. }
  60397. c -= bits % 5;
  60398. if (c == 32) {
  60399. c = 27;
  60400. }
  60401. if (c < 0) {
  60402. /* Number of bits in top word is less than number needed. */
  60403. c = -c;
  60404. y = (byte)(n << c);
  60405. n = e[i--];
  60406. y |= (byte)(n >> (64 - c));
  60407. n <<= c;
  60408. c = 64 - c;
  60409. }
  60410. else if (c == 0) {
  60411. /* All bits in top word used. */
  60412. y = (byte)n;
  60413. }
  60414. else {
  60415. y = (byte)(n >> c);
  60416. n <<= 32 - c;
  60417. }
  60418. sp_4096_lshift_128(r, norm, y);
  60419. for (; i>=0 || c>=5; ) {
  60420. if (c == 0) {
  60421. n = e[i--];
  60422. y = (byte)(n >> 27);
  60423. n <<= 5;
  60424. c = 27;
  60425. }
  60426. else if (c < 5) {
  60427. y = (byte)(n >> 27);
  60428. n = e[i--];
  60429. c = 5 - c;
  60430. y |= (byte)(n >> (32 - c));
  60431. n <<= c;
  60432. c = 32 - c;
  60433. }
  60434. else {
  60435. y = (byte)((n >> 27) & 0x1f);
  60436. n <<= 5;
  60437. c -= 5;
  60438. }
  60439. sp_4096_mont_sqr_128(r, r, m, mp);
  60440. sp_4096_mont_sqr_128(r, r, m, mp);
  60441. sp_4096_mont_sqr_128(r, r, m, mp);
  60442. sp_4096_mont_sqr_128(r, r, m, mp);
  60443. sp_4096_mont_sqr_128(r, r, m, mp);
  60444. sp_4096_lshift_128(r, r, y);
  60445. sp_4096_mul_d_128(tmp, norm, r[128]);
  60446. r[128] = 0;
  60447. o = sp_4096_add_128(r, r, tmp);
  60448. sp_4096_cond_sub_128(r, r, m, (sp_digit)0 - o);
  60449. }
  60450. XMEMSET(&r[128], 0, sizeof(sp_digit) * 128U);
  60451. sp_4096_mont_reduce_128(r, m, mp);
  60452. mask = 0 - (sp_4096_cmp_128(r, m) >= 0);
  60453. sp_4096_cond_sub_128(r, r, m, mask);
  60454. }
  60455. #ifdef WOLFSSL_SP_SMALL_STACK
  60456. if (td != NULL)
  60457. XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  60458. #endif
  60459. return err;
  60460. }
  60461. #endif /* HAVE_FFDHE_4096 */
  60462. /* Perform the modular exponentiation for Diffie-Hellman.
  60463. *
  60464. * base Base.
  60465. * exp Array of bytes that is the exponent.
  60466. * expLen Length of data, in bytes, in exponent.
  60467. * mod Modulus.
  60468. * out Buffer to hold big-endian bytes of exponentiation result.
  60469. * Must be at least 512 bytes long.
  60470. * outLen Length, in bytes, of exponentiation result.
  60471. * returns 0 on success, MP_READ_E if there are too many bytes in an array
  60472. * and MEMORY_E if memory allocation fails.
  60473. */
  60474. int sp_DhExp_4096(const mp_int* base, const byte* exp, word32 expLen,
  60475. const mp_int* mod, byte* out, word32* outLen)
  60476. {
  60477. int err = MP_OKAY;
  60478. sp_digit b[256];
  60479. sp_digit e[128];
  60480. sp_digit m[128];
  60481. sp_digit* r = b;
  60482. word32 i;
  60483. if (mp_count_bits(base) > 4096) {
  60484. err = MP_READ_E;
  60485. }
  60486. else if (expLen > 512) {
  60487. err = MP_READ_E;
  60488. }
  60489. else if (mp_count_bits(mod) != 4096) {
  60490. err = MP_READ_E;
  60491. }
  60492. else if (mp_iseven(mod)) {
  60493. err = MP_VAL;
  60494. }
  60495. if (err == MP_OKAY) {
  60496. sp_4096_from_mp(b, 128, base);
  60497. sp_4096_from_bin(e, 128, exp, expLen);
  60498. sp_4096_from_mp(m, 128, mod);
  60499. #ifdef HAVE_FFDHE_4096
  60500. if (base->used == 1 && base->dp[0] == 2 && m[127] == (sp_digit)-1)
  60501. err = sp_4096_mod_exp_2_128(r, e, expLen * 8, m);
  60502. else
  60503. #endif
  60504. err = sp_4096_mod_exp_128(r, b, e, expLen * 8, m, 0);
  60505. }
  60506. if (err == MP_OKAY) {
  60507. sp_4096_to_bin_128(r, out);
  60508. *outLen = 512;
  60509. for (i=0; i<512 && out[i] == 0; i++) {
  60510. /* Search for first non-zero. */
  60511. }
  60512. *outLen -= i;
  60513. XMEMMOVE(out, out + i, *outLen);
  60514. }
  60515. XMEMSET(e, 0, sizeof(e));
  60516. return err;
  60517. }
  60518. #endif /* WOLFSSL_HAVE_SP_DH */
  60519. #endif /* WOLFSSL_HAVE_SP_DH | (WOLFSSL_HAVE_SP_RSA & !WOLFSSL_RSA_PUBLIC_ONLY) */
  60520. #endif /* WOLFSSL_SP_4096 */
  60521. #endif /* WOLFSSL_HAVE_SP_RSA | WOLFSSL_HAVE_SP_DH */
  60522. #ifdef WOLFSSL_HAVE_SP_ECC
  60523. #ifndef WOLFSSL_SP_NO_256
  60524. /* Point structure to use. */
  60525. typedef struct sp_point_256 {
  60526. /* X ordinate of point. */
  60527. sp_digit x[2 * 8];
  60528. /* Y ordinate of point. */
  60529. sp_digit y[2 * 8];
  60530. /* Z ordinate of point. */
  60531. sp_digit z[2 * 8];
  60532. /* Indicates point is at infinity. */
  60533. int infinity;
  60534. } sp_point_256;
  60535. /* The modulus (prime) of the curve P256. */
  60536. static const sp_digit p256_mod[8] = {
  60537. 0xffffffff,0xffffffff,0xffffffff,0x00000000,0x00000000,0x00000000,
  60538. 0x00000001,0xffffffff
  60539. };
  60540. /* The Montgomery normalizer for modulus of the curve P256. */
  60541. static const sp_digit p256_norm_mod[8] = {
  60542. 0x00000001,0x00000000,0x00000000,0xffffffff,0xffffffff,0xffffffff,
  60543. 0xfffffffe,0x00000000
  60544. };
  60545. /* The Montgomery multiplier for modulus of the curve P256. */
  60546. static const sp_digit p256_mp_mod = 0x00000001;
  60547. #if defined(WOLFSSL_VALIDATE_ECC_KEYGEN) || defined(HAVE_ECC_SIGN) || \
  60548. defined(HAVE_ECC_VERIFY)
  60549. /* The order of the curve P256. */
  60550. static const sp_digit p256_order[8] = {
  60551. 0xfc632551,0xf3b9cac2,0xa7179e84,0xbce6faad,0xffffffff,0xffffffff,
  60552. 0x00000000,0xffffffff
  60553. };
  60554. #endif
  60555. /* The order of the curve P256 minus 2. */
  60556. static const sp_digit p256_order2[8] = {
  60557. 0xfc63254f,0xf3b9cac2,0xa7179e84,0xbce6faad,0xffffffff,0xffffffff,
  60558. 0x00000000,0xffffffff
  60559. };
  60560. #if defined(HAVE_ECC_SIGN) || defined(HAVE_ECC_VERIFY)
  60561. /* The Montgomery normalizer for order of the curve P256. */
  60562. static const sp_digit p256_norm_order[8] = {
  60563. 0x039cdaaf,0x0c46353d,0x58e8617b,0x43190552,0x00000000,0x00000000,
  60564. 0xffffffff,0x00000000
  60565. };
  60566. #endif
  60567. #if defined(HAVE_ECC_SIGN) || defined(HAVE_ECC_VERIFY)
  60568. /* The Montgomery multiplier for order of the curve P256. */
  60569. static const sp_digit p256_mp_order = 0xee00bc4f;
  60570. #endif
  60571. /* The base point of curve P256. */
  60572. static const sp_point_256 p256_base = {
  60573. /* X ordinate */
  60574. {
  60575. 0xd898c296,0xf4a13945,0x2deb33a0,0x77037d81,0x63a440f2,0xf8bce6e5,
  60576. 0xe12c4247,0x6b17d1f2,
  60577. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  60578. (sp_digit)0, (sp_digit)0, (sp_digit)0
  60579. },
  60580. /* Y ordinate */
  60581. {
  60582. 0x37bf51f5,0xcbb64068,0x6b315ece,0x2bce3357,0x7c0f9e16,0x8ee7eb4a,
  60583. 0xfe1a7f9b,0x4fe342e2,
  60584. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  60585. (sp_digit)0, (sp_digit)0, (sp_digit)0
  60586. },
  60587. /* Z ordinate */
  60588. {
  60589. 0x00000001,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,
  60590. 0x00000000,0x00000000,
  60591. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  60592. (sp_digit)0, (sp_digit)0, (sp_digit)0
  60593. },
  60594. /* infinity */
  60595. 0
  60596. };
  60597. #if defined(HAVE_ECC_CHECK_KEY) || defined(HAVE_COMP_KEY)
  60598. static const sp_digit p256_b[8] = {
  60599. 0x27d2604b,0x3bce3c3e,0xcc53b0f6,0x651d06b0,0x769886bc,0xb3ebbd55,
  60600. 0xaa3a93e7,0x5ac635d8
  60601. };
  60602. #endif
  60603. #ifdef WOLFSSL_SP_SMALL
  60604. /* Multiply a and b into r. (r = a * b)
  60605. *
  60606. * r A single precision integer.
  60607. * a A single precision integer.
  60608. * b A single precision integer.
  60609. */
  60610. static void sp_256_mul_8(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p)
  60611. {
  60612. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  60613. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  60614. register const sp_digit* b asm ("r2") = (const sp_digit*)b_p;
  60615. __asm__ __volatile__ (
  60616. "sub sp, sp, #0x40\n\t"
  60617. "ldr lr, [%[a]]\n\t"
  60618. "ldr r11, [%[b]]\n\t"
  60619. "umull r8, r6, lr, r11\n\t"
  60620. "str r8, [sp]\n\t"
  60621. "mov r7, #0\n\t"
  60622. "mov r8, #0\n\t"
  60623. "mov r5, #4\n\t"
  60624. "\n"
  60625. "L_sp_256_mul_8_outer_%=: \n\t"
  60626. "subs r3, r5, #28\n\t"
  60627. "it cc\n\t"
  60628. "movcc r3, #0\n\t"
  60629. "sub r4, r5, r3\n\t"
  60630. "\n"
  60631. "L_sp_256_mul_8_inner_%=: \n\t"
  60632. "ldr lr, [%[a], r3]\n\t"
  60633. "ldr r11, [%[b], r4]\n\t"
  60634. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  60635. "lsl r9, lr, #16\n\t"
  60636. "lsl r10, r11, #16\n\t"
  60637. "lsr r9, r9, #16\n\t"
  60638. "lsr r10, r10, #16\n\t"
  60639. "mul r10, r9, r10\n\t"
  60640. "adds r6, r6, r10\n\t"
  60641. "adcs r7, r7, #0\n\t"
  60642. "adc r8, r8, #0\n\t"
  60643. "lsr r10, r11, #16\n\t"
  60644. "mul r9, r10, r9\n\t"
  60645. "lsr r10, r9, #16\n\t"
  60646. "lsl r9, r9, #16\n\t"
  60647. "adds r6, r6, r9\n\t"
  60648. "adcs r7, r7, r10\n\t"
  60649. "adc r8, r8, #0\n\t"
  60650. "lsr r9, lr, #16\n\t"
  60651. "lsr r10, r11, #16\n\t"
  60652. "mul r10, r9, r10\n\t"
  60653. "adds r7, r7, r10\n\t"
  60654. "adc r8, r8, #0\n\t"
  60655. "lsl r10, r11, #16\n\t"
  60656. "lsr r10, r10, #16\n\t"
  60657. "mul r9, r10, r9\n\t"
  60658. "lsr r10, r9, #16\n\t"
  60659. "lsl r9, r9, #16\n\t"
  60660. "adds r6, r6, r9\n\t"
  60661. "adcs r7, r7, r10\n\t"
  60662. "adc r8, r8, #0\n\t"
  60663. #else
  60664. "umull r9, r10, lr, r11\n\t"
  60665. "adds r6, r6, r9\n\t"
  60666. "adcs r7, r7, r10\n\t"
  60667. "adc r8, r8, #0\n\t"
  60668. #endif
  60669. "ldr lr, [%[a], r4]\n\t"
  60670. "ldr r11, [%[b], r3]\n\t"
  60671. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  60672. "lsl r9, lr, #16\n\t"
  60673. "lsl r10, r11, #16\n\t"
  60674. "lsr r9, r9, #16\n\t"
  60675. "lsr r10, r10, #16\n\t"
  60676. "mul r10, r9, r10\n\t"
  60677. "adds r6, r6, r10\n\t"
  60678. "adcs r7, r7, #0\n\t"
  60679. "adc r8, r8, #0\n\t"
  60680. "lsr r10, r11, #16\n\t"
  60681. "mul r9, r10, r9\n\t"
  60682. "lsr r10, r9, #16\n\t"
  60683. "lsl r9, r9, #16\n\t"
  60684. "adds r6, r6, r9\n\t"
  60685. "adcs r7, r7, r10\n\t"
  60686. "adc r8, r8, #0\n\t"
  60687. "lsr r9, lr, #16\n\t"
  60688. "lsr r10, r11, #16\n\t"
  60689. "mul r10, r9, r10\n\t"
  60690. "adds r7, r7, r10\n\t"
  60691. "adc r8, r8, #0\n\t"
  60692. "lsl r10, r11, #16\n\t"
  60693. "lsr r10, r10, #16\n\t"
  60694. "mul r9, r10, r9\n\t"
  60695. "lsr r10, r9, #16\n\t"
  60696. "lsl r9, r9, #16\n\t"
  60697. "adds r6, r6, r9\n\t"
  60698. "adcs r7, r7, r10\n\t"
  60699. "adc r8, r8, #0\n\t"
  60700. #else
  60701. "umull r9, r10, lr, r11\n\t"
  60702. "adds r6, r6, r9\n\t"
  60703. "adcs r7, r7, r10\n\t"
  60704. "adc r8, r8, #0\n\t"
  60705. #endif
  60706. "add r3, r3, #4\n\t"
  60707. "sub r4, r4, #4\n\t"
  60708. "cmp r3, r4\n\t"
  60709. "bgt L_sp_256_mul_8_inner_done_%=\n\t"
  60710. "blt L_sp_256_mul_8_inner_%=\n\t"
  60711. "ldr lr, [%[a], r3]\n\t"
  60712. "ldr r11, [%[b], r3]\n\t"
  60713. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  60714. "lsl r9, lr, #16\n\t"
  60715. "lsl r10, r11, #16\n\t"
  60716. "lsr r9, r9, #16\n\t"
  60717. "lsr r10, r10, #16\n\t"
  60718. "mul r10, r9, r10\n\t"
  60719. "adds r6, r6, r10\n\t"
  60720. "adcs r7, r7, #0\n\t"
  60721. "adc r8, r8, #0\n\t"
  60722. "lsr r10, r11, #16\n\t"
  60723. "mul r9, r10, r9\n\t"
  60724. "lsr r10, r9, #16\n\t"
  60725. "lsl r9, r9, #16\n\t"
  60726. "adds r6, r6, r9\n\t"
  60727. "adcs r7, r7, r10\n\t"
  60728. "adc r8, r8, #0\n\t"
  60729. "lsr r9, lr, #16\n\t"
  60730. "lsr r10, r11, #16\n\t"
  60731. "mul r10, r9, r10\n\t"
  60732. "adds r7, r7, r10\n\t"
  60733. "adc r8, r8, #0\n\t"
  60734. "lsl r10, r11, #16\n\t"
  60735. "lsr r10, r10, #16\n\t"
  60736. "mul r9, r10, r9\n\t"
  60737. "lsr r10, r9, #16\n\t"
  60738. "lsl r9, r9, #16\n\t"
  60739. "adds r6, r6, r9\n\t"
  60740. "adcs r7, r7, r10\n\t"
  60741. "adc r8, r8, #0\n\t"
  60742. #else
  60743. "umull r9, r10, lr, r11\n\t"
  60744. "adds r6, r6, r9\n\t"
  60745. "adcs r7, r7, r10\n\t"
  60746. "adc r8, r8, #0\n\t"
  60747. #endif
  60748. "\n"
  60749. "L_sp_256_mul_8_inner_done_%=: \n\t"
  60750. "str r6, [sp, r5]\n\t"
  60751. "mov r6, r7\n\t"
  60752. "mov r7, r8\n\t"
  60753. "mov r8, #0\n\t"
  60754. "add r5, r5, #4\n\t"
  60755. "cmp r5, #52\n\t"
  60756. "ble L_sp_256_mul_8_outer_%=\n\t"
  60757. "ldr lr, [%[a], #28]\n\t"
  60758. "ldr r11, [%[b], #28]\n\t"
  60759. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  60760. "lsl r9, lr, #16\n\t"
  60761. "lsl r10, r11, #16\n\t"
  60762. "lsr r9, r9, #16\n\t"
  60763. "lsr r10, r10, #16\n\t"
  60764. "mul r10, r9, r10\n\t"
  60765. "adds r6, r6, r10\n\t"
  60766. "adc r7, r7, #0\n\t"
  60767. "lsr r10, r11, #16\n\t"
  60768. "mul r9, r10, r9\n\t"
  60769. "lsr r10, r9, #16\n\t"
  60770. "lsl r9, r9, #16\n\t"
  60771. "adds r6, r6, r9\n\t"
  60772. "adc r7, r7, r10\n\t"
  60773. "lsr r9, lr, #16\n\t"
  60774. "lsr r10, r11, #16\n\t"
  60775. "mul r10, r9, r10\n\t"
  60776. "add r7, r7, r10\n\t"
  60777. "lsl r10, r11, #16\n\t"
  60778. "lsr r10, r10, #16\n\t"
  60779. "mul r9, r10, r9\n\t"
  60780. "lsr r10, r9, #16\n\t"
  60781. "lsl r9, r9, #16\n\t"
  60782. "adds r6, r6, r9\n\t"
  60783. "adc r7, r7, r10\n\t"
  60784. #else
  60785. "umlal r6, r7, lr, r11\n\t"
  60786. #endif
  60787. "str r6, [sp, r5]\n\t"
  60788. "add r5, r5, #4\n\t"
  60789. "str r7, [sp, r5]\n\t"
  60790. "\n"
  60791. "L_sp_256_mul_8_store_%=: \n\t"
  60792. "ldm sp!, {r3, r4, r6, r7, r8, r9, r10, r11}\n\t"
  60793. "stm %[r]!, {r3, r4, r6, r7, r8, r9, r10, r11}\n\t"
  60794. "subs r5, r5, #32\n\t"
  60795. "bgt L_sp_256_mul_8_store_%=\n\t"
  60796. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  60797. :
  60798. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "lr", "r11", "cc"
  60799. );
  60800. }
  60801. #else
  60802. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  60803. /* Multiply a and b into r. (r = a * b)
  60804. *
  60805. * r A single precision integer.
  60806. * a A single precision integer.
  60807. * b A single precision integer.
  60808. */
  60809. static void sp_256_mul_8(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p)
  60810. {
  60811. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  60812. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  60813. register const sp_digit* b asm ("r2") = (const sp_digit*)b_p;
  60814. __asm__ __volatile__ (
  60815. "sub sp, sp, #32\n\t"
  60816. /* A[0] * B[0] */
  60817. "ldr r11, [%[a]]\n\t"
  60818. "ldr r12, [%[b]]\n\t"
  60819. "lsl r6, r11, #16\n\t"
  60820. "lsl r3, r12, #16\n\t"
  60821. "lsr r6, r6, #16\n\t"
  60822. "lsr r3, r3, #16\n\t"
  60823. "mul r3, r6, r3\n\t"
  60824. "lsr r7, r12, #16\n\t"
  60825. "mul r6, r7, r6\n\t"
  60826. "lsr r4, r6, #16\n\t"
  60827. "lsl r6, r6, #16\n\t"
  60828. "adds r3, r3, r6\n\t"
  60829. "adc r4, r4, #0\n\t"
  60830. "lsr r6, r11, #16\n\t"
  60831. "mul r7, r6, r7\n\t"
  60832. "add r4, r4, r7\n\t"
  60833. "lsl r7, r12, #16\n\t"
  60834. "lsr r7, r7, #16\n\t"
  60835. "mul r6, r7, r6\n\t"
  60836. "lsr r7, r6, #16\n\t"
  60837. "lsl r6, r6, #16\n\t"
  60838. "adds r3, r3, r6\n\t"
  60839. "adc r4, r4, r7\n\t"
  60840. "mov r5, #0\n\t"
  60841. "str r3, [sp]\n\t"
  60842. /* A[0] * B[1] */
  60843. "ldr r9, [%[b], #4]\n\t"
  60844. "lsl r6, r11, #16\n\t"
  60845. "lsl r7, r9, #16\n\t"
  60846. "lsr r6, r6, #16\n\t"
  60847. "lsr r7, r7, #16\n\t"
  60848. "mul r7, r6, r7\n\t"
  60849. "adds r4, r4, r7\n\t"
  60850. "adcs r5, r5, #0\n\t"
  60851. "mov r3, #0\n\t"
  60852. "adc r3, r3, #0\n\t"
  60853. "lsr r7, r9, #16\n\t"
  60854. "mul r6, r7, r6\n\t"
  60855. "lsr r7, r6, #16\n\t"
  60856. "lsl r6, r6, #16\n\t"
  60857. "adds r4, r4, r6\n\t"
  60858. "adcs r5, r5, r7\n\t"
  60859. "adc r3, r3, #0\n\t"
  60860. "lsr r6, r11, #16\n\t"
  60861. "lsr r7, r9, #16\n\t"
  60862. "mul r7, r6, r7\n\t"
  60863. "adds r5, r5, r7\n\t"
  60864. "adc r3, r3, #0\n\t"
  60865. "lsl r7, r9, #16\n\t"
  60866. "lsr r7, r7, #16\n\t"
  60867. "mul r6, r7, r6\n\t"
  60868. "lsr r7, r6, #16\n\t"
  60869. "lsl r6, r6, #16\n\t"
  60870. "adds r4, r4, r6\n\t"
  60871. "adcs r5, r5, r7\n\t"
  60872. "adc r3, r3, #0\n\t"
  60873. /* A[1] * B[0] */
  60874. "ldr r8, [%[a], #4]\n\t"
  60875. "lsl r6, r8, #16\n\t"
  60876. "lsl r7, r12, #16\n\t"
  60877. "lsr r6, r6, #16\n\t"
  60878. "lsr r7, r7, #16\n\t"
  60879. "mul r7, r6, r7\n\t"
  60880. "adds r4, r4, r7\n\t"
  60881. "adcs r5, r5, #0\n\t"
  60882. "adc r3, r3, #0\n\t"
  60883. "lsr r7, r12, #16\n\t"
  60884. "mul r6, r7, r6\n\t"
  60885. "lsr r7, r6, #16\n\t"
  60886. "lsl r6, r6, #16\n\t"
  60887. "adds r4, r4, r6\n\t"
  60888. "adcs r5, r5, r7\n\t"
  60889. "adc r3, r3, #0\n\t"
  60890. "lsr r6, r8, #16\n\t"
  60891. "lsr r7, r12, #16\n\t"
  60892. "mul r7, r6, r7\n\t"
  60893. "adds r5, r5, r7\n\t"
  60894. "adc r3, r3, #0\n\t"
  60895. "lsl r7, r12, #16\n\t"
  60896. "lsr r7, r7, #16\n\t"
  60897. "mul r6, r7, r6\n\t"
  60898. "lsr r7, r6, #16\n\t"
  60899. "lsl r6, r6, #16\n\t"
  60900. "adds r4, r4, r6\n\t"
  60901. "adcs r5, r5, r7\n\t"
  60902. "adc r3, r3, #0\n\t"
  60903. "str r4, [sp, #4]\n\t"
  60904. /* A[2] * B[0] */
  60905. "ldr r8, [%[a], #8]\n\t"
  60906. "lsl r6, r8, #16\n\t"
  60907. "lsl r7, r12, #16\n\t"
  60908. "lsr r6, r6, #16\n\t"
  60909. "lsr r7, r7, #16\n\t"
  60910. "mul r7, r6, r7\n\t"
  60911. "adds r5, r5, r7\n\t"
  60912. "adcs r3, r3, #0\n\t"
  60913. "mov r4, #0\n\t"
  60914. "adc r4, r4, #0\n\t"
  60915. "lsr r7, r12, #16\n\t"
  60916. "mul r6, r7, r6\n\t"
  60917. "lsr r7, r6, #16\n\t"
  60918. "lsl r6, r6, #16\n\t"
  60919. "adds r5, r5, r6\n\t"
  60920. "adcs r3, r3, r7\n\t"
  60921. "adc r4, r4, #0\n\t"
  60922. "lsr r6, r8, #16\n\t"
  60923. "lsr r7, r12, #16\n\t"
  60924. "mul r7, r6, r7\n\t"
  60925. "adds r3, r3, r7\n\t"
  60926. "adc r4, r4, #0\n\t"
  60927. "lsl r7, r12, #16\n\t"
  60928. "lsr r7, r7, #16\n\t"
  60929. "mul r6, r7, r6\n\t"
  60930. "lsr r7, r6, #16\n\t"
  60931. "lsl r6, r6, #16\n\t"
  60932. "adds r5, r5, r6\n\t"
  60933. "adcs r3, r3, r7\n\t"
  60934. "adc r4, r4, #0\n\t"
  60935. /* A[1] * B[1] */
  60936. "ldr r11, [%[a], #4]\n\t"
  60937. "ldr r12, [%[b], #4]\n\t"
  60938. "lsl r6, r11, #16\n\t"
  60939. "lsl r7, r12, #16\n\t"
  60940. "lsr r6, r6, #16\n\t"
  60941. "lsr r7, r7, #16\n\t"
  60942. "mul r7, r6, r7\n\t"
  60943. "adds r5, r5, r7\n\t"
  60944. "adcs r3, r3, #0\n\t"
  60945. "adc r4, r4, #0\n\t"
  60946. "lsr r7, r12, #16\n\t"
  60947. "mul r6, r7, r6\n\t"
  60948. "lsr r7, r6, #16\n\t"
  60949. "lsl r6, r6, #16\n\t"
  60950. "adds r5, r5, r6\n\t"
  60951. "adcs r3, r3, r7\n\t"
  60952. "adc r4, r4, #0\n\t"
  60953. "lsr r6, r11, #16\n\t"
  60954. "lsr r7, r12, #16\n\t"
  60955. "mul r7, r6, r7\n\t"
  60956. "adds r3, r3, r7\n\t"
  60957. "adc r4, r4, #0\n\t"
  60958. "lsl r7, r12, #16\n\t"
  60959. "lsr r7, r7, #16\n\t"
  60960. "mul r6, r7, r6\n\t"
  60961. "lsr r7, r6, #16\n\t"
  60962. "lsl r6, r6, #16\n\t"
  60963. "adds r5, r5, r6\n\t"
  60964. "adcs r3, r3, r7\n\t"
  60965. "adc r4, r4, #0\n\t"
  60966. /* A[0] * B[2] */
  60967. "ldr r8, [%[a]]\n\t"
  60968. "ldr r9, [%[b], #8]\n\t"
  60969. "lsl r6, r8, #16\n\t"
  60970. "lsl r7, r9, #16\n\t"
  60971. "lsr r6, r6, #16\n\t"
  60972. "lsr r7, r7, #16\n\t"
  60973. "mul r7, r6, r7\n\t"
  60974. "adds r5, r5, r7\n\t"
  60975. "adcs r3, r3, #0\n\t"
  60976. "adc r4, r4, #0\n\t"
  60977. "lsr r7, r9, #16\n\t"
  60978. "mul r6, r7, r6\n\t"
  60979. "lsr r7, r6, #16\n\t"
  60980. "lsl r6, r6, #16\n\t"
  60981. "adds r5, r5, r6\n\t"
  60982. "adcs r3, r3, r7\n\t"
  60983. "adc r4, r4, #0\n\t"
  60984. "lsr r6, r8, #16\n\t"
  60985. "lsr r7, r9, #16\n\t"
  60986. "mul r7, r6, r7\n\t"
  60987. "adds r3, r3, r7\n\t"
  60988. "adc r4, r4, #0\n\t"
  60989. "lsl r7, r9, #16\n\t"
  60990. "lsr r7, r7, #16\n\t"
  60991. "mul r6, r7, r6\n\t"
  60992. "lsr r7, r6, #16\n\t"
  60993. "lsl r6, r6, #16\n\t"
  60994. "adds r5, r5, r6\n\t"
  60995. "adcs r3, r3, r7\n\t"
  60996. "adc r4, r4, #0\n\t"
  60997. "str r5, [sp, #8]\n\t"
  60998. /* A[0] * B[3] */
  60999. "ldr r9, [%[b], #12]\n\t"
  61000. "lsl r6, r8, #16\n\t"
  61001. "lsl r7, r9, #16\n\t"
  61002. "lsr r6, r6, #16\n\t"
  61003. "lsr r7, r7, #16\n\t"
  61004. "mul r7, r6, r7\n\t"
  61005. "adds r3, r3, r7\n\t"
  61006. "adcs r4, r4, #0\n\t"
  61007. "mov r5, #0\n\t"
  61008. "adc r5, r5, #0\n\t"
  61009. "lsr r7, r9, #16\n\t"
  61010. "mul r6, r7, r6\n\t"
  61011. "lsr r7, r6, #16\n\t"
  61012. "lsl r6, r6, #16\n\t"
  61013. "adds r3, r3, r6\n\t"
  61014. "adcs r4, r4, r7\n\t"
  61015. "adc r5, r5, #0\n\t"
  61016. "lsr r6, r8, #16\n\t"
  61017. "lsr r7, r9, #16\n\t"
  61018. "mul r7, r6, r7\n\t"
  61019. "adds r4, r4, r7\n\t"
  61020. "adc r5, r5, #0\n\t"
  61021. "lsl r7, r9, #16\n\t"
  61022. "lsr r7, r7, #16\n\t"
  61023. "mul r6, r7, r6\n\t"
  61024. "lsr r7, r6, #16\n\t"
  61025. "lsl r6, r6, #16\n\t"
  61026. "adds r3, r3, r6\n\t"
  61027. "adcs r4, r4, r7\n\t"
  61028. "adc r5, r5, #0\n\t"
  61029. /* A[1] * B[2] */
  61030. "ldr r9, [%[b], #8]\n\t"
  61031. "lsl r6, r11, #16\n\t"
  61032. "lsl r7, r9, #16\n\t"
  61033. "lsr r6, r6, #16\n\t"
  61034. "lsr r7, r7, #16\n\t"
  61035. "mul r7, r6, r7\n\t"
  61036. "adds r3, r3, r7\n\t"
  61037. "adcs r4, r4, #0\n\t"
  61038. "adc r5, r5, #0\n\t"
  61039. "lsr r7, r9, #16\n\t"
  61040. "mul r6, r7, r6\n\t"
  61041. "lsr r7, r6, #16\n\t"
  61042. "lsl r6, r6, #16\n\t"
  61043. "adds r3, r3, r6\n\t"
  61044. "adcs r4, r4, r7\n\t"
  61045. "adc r5, r5, #0\n\t"
  61046. "lsr r6, r11, #16\n\t"
  61047. "lsr r7, r9, #16\n\t"
  61048. "mul r7, r6, r7\n\t"
  61049. "adds r4, r4, r7\n\t"
  61050. "adc r5, r5, #0\n\t"
  61051. "lsl r7, r9, #16\n\t"
  61052. "lsr r7, r7, #16\n\t"
  61053. "mul r6, r7, r6\n\t"
  61054. "lsr r7, r6, #16\n\t"
  61055. "lsl r6, r6, #16\n\t"
  61056. "adds r3, r3, r6\n\t"
  61057. "adcs r4, r4, r7\n\t"
  61058. "adc r5, r5, #0\n\t"
  61059. /* A[2] * B[1] */
  61060. "ldr r8, [%[a], #8]\n\t"
  61061. "lsl r6, r8, #16\n\t"
  61062. "lsl r7, r12, #16\n\t"
  61063. "lsr r6, r6, #16\n\t"
  61064. "lsr r7, r7, #16\n\t"
  61065. "mul r7, r6, r7\n\t"
  61066. "adds r3, r3, r7\n\t"
  61067. "adcs r4, r4, #0\n\t"
  61068. "adc r5, r5, #0\n\t"
  61069. "lsr r7, r12, #16\n\t"
  61070. "mul r6, r7, r6\n\t"
  61071. "lsr r7, r6, #16\n\t"
  61072. "lsl r6, r6, #16\n\t"
  61073. "adds r3, r3, r6\n\t"
  61074. "adcs r4, r4, r7\n\t"
  61075. "adc r5, r5, #0\n\t"
  61076. "lsr r6, r8, #16\n\t"
  61077. "lsr r7, r12, #16\n\t"
  61078. "mul r7, r6, r7\n\t"
  61079. "adds r4, r4, r7\n\t"
  61080. "adc r5, r5, #0\n\t"
  61081. "lsl r7, r12, #16\n\t"
  61082. "lsr r7, r7, #16\n\t"
  61083. "mul r6, r7, r6\n\t"
  61084. "lsr r7, r6, #16\n\t"
  61085. "lsl r6, r6, #16\n\t"
  61086. "adds r3, r3, r6\n\t"
  61087. "adcs r4, r4, r7\n\t"
  61088. "adc r5, r5, #0\n\t"
  61089. /* A[3] * B[0] */
  61090. "ldr r8, [%[a], #12]\n\t"
  61091. "ldr r9, [%[b]]\n\t"
  61092. "lsl r6, r8, #16\n\t"
  61093. "lsl r7, r9, #16\n\t"
  61094. "lsr r6, r6, #16\n\t"
  61095. "lsr r7, r7, #16\n\t"
  61096. "mul r7, r6, r7\n\t"
  61097. "adds r3, r3, r7\n\t"
  61098. "adcs r4, r4, #0\n\t"
  61099. "adc r5, r5, #0\n\t"
  61100. "lsr r7, r9, #16\n\t"
  61101. "mul r6, r7, r6\n\t"
  61102. "lsr r7, r6, #16\n\t"
  61103. "lsl r6, r6, #16\n\t"
  61104. "adds r3, r3, r6\n\t"
  61105. "adcs r4, r4, r7\n\t"
  61106. "adc r5, r5, #0\n\t"
  61107. "lsr r6, r8, #16\n\t"
  61108. "lsr r7, r9, #16\n\t"
  61109. "mul r7, r6, r7\n\t"
  61110. "adds r4, r4, r7\n\t"
  61111. "adc r5, r5, #0\n\t"
  61112. "lsl r7, r9, #16\n\t"
  61113. "lsr r7, r7, #16\n\t"
  61114. "mul r6, r7, r6\n\t"
  61115. "lsr r7, r6, #16\n\t"
  61116. "lsl r6, r6, #16\n\t"
  61117. "adds r3, r3, r6\n\t"
  61118. "adcs r4, r4, r7\n\t"
  61119. "adc r5, r5, #0\n\t"
  61120. "str r3, [sp, #12]\n\t"
  61121. /* A[4] * B[0] */
  61122. "ldr r8, [%[a], #16]\n\t"
  61123. "lsl r6, r8, #16\n\t"
  61124. "lsl r7, r9, #16\n\t"
  61125. "lsr r6, r6, #16\n\t"
  61126. "lsr r7, r7, #16\n\t"
  61127. "mul r7, r6, r7\n\t"
  61128. "adds r4, r4, r7\n\t"
  61129. "adcs r5, r5, #0\n\t"
  61130. "mov r3, #0\n\t"
  61131. "adc r3, r3, #0\n\t"
  61132. "lsr r7, r9, #16\n\t"
  61133. "mul r6, r7, r6\n\t"
  61134. "lsr r7, r6, #16\n\t"
  61135. "lsl r6, r6, #16\n\t"
  61136. "adds r4, r4, r6\n\t"
  61137. "adcs r5, r5, r7\n\t"
  61138. "adc r3, r3, #0\n\t"
  61139. "lsr r6, r8, #16\n\t"
  61140. "lsr r7, r9, #16\n\t"
  61141. "mul r7, r6, r7\n\t"
  61142. "adds r5, r5, r7\n\t"
  61143. "adc r3, r3, #0\n\t"
  61144. "lsl r7, r9, #16\n\t"
  61145. "lsr r7, r7, #16\n\t"
  61146. "mul r6, r7, r6\n\t"
  61147. "lsr r7, r6, #16\n\t"
  61148. "lsl r6, r6, #16\n\t"
  61149. "adds r4, r4, r6\n\t"
  61150. "adcs r5, r5, r7\n\t"
  61151. "adc r3, r3, #0\n\t"
  61152. /* A[3] * B[1] */
  61153. "ldr r8, [%[a], #12]\n\t"
  61154. "lsl r6, r8, #16\n\t"
  61155. "lsl r7, r12, #16\n\t"
  61156. "lsr r6, r6, #16\n\t"
  61157. "lsr r7, r7, #16\n\t"
  61158. "mul r7, r6, r7\n\t"
  61159. "adds r4, r4, r7\n\t"
  61160. "adcs r5, r5, #0\n\t"
  61161. "adc r3, r3, #0\n\t"
  61162. "lsr r7, r12, #16\n\t"
  61163. "mul r6, r7, r6\n\t"
  61164. "lsr r7, r6, #16\n\t"
  61165. "lsl r6, r6, #16\n\t"
  61166. "adds r4, r4, r6\n\t"
  61167. "adcs r5, r5, r7\n\t"
  61168. "adc r3, r3, #0\n\t"
  61169. "lsr r6, r8, #16\n\t"
  61170. "lsr r7, r12, #16\n\t"
  61171. "mul r7, r6, r7\n\t"
  61172. "adds r5, r5, r7\n\t"
  61173. "adc r3, r3, #0\n\t"
  61174. "lsl r7, r12, #16\n\t"
  61175. "lsr r7, r7, #16\n\t"
  61176. "mul r6, r7, r6\n\t"
  61177. "lsr r7, r6, #16\n\t"
  61178. "lsl r6, r6, #16\n\t"
  61179. "adds r4, r4, r6\n\t"
  61180. "adcs r5, r5, r7\n\t"
  61181. "adc r3, r3, #0\n\t"
  61182. /* A[2] * B[2] */
  61183. "ldr r11, [%[a], #8]\n\t"
  61184. "ldr r12, [%[b], #8]\n\t"
  61185. "lsl r6, r11, #16\n\t"
  61186. "lsl r7, r12, #16\n\t"
  61187. "lsr r6, r6, #16\n\t"
  61188. "lsr r7, r7, #16\n\t"
  61189. "mul r7, r6, r7\n\t"
  61190. "adds r4, r4, r7\n\t"
  61191. "adcs r5, r5, #0\n\t"
  61192. "adc r3, r3, #0\n\t"
  61193. "lsr r7, r12, #16\n\t"
  61194. "mul r6, r7, r6\n\t"
  61195. "lsr r7, r6, #16\n\t"
  61196. "lsl r6, r6, #16\n\t"
  61197. "adds r4, r4, r6\n\t"
  61198. "adcs r5, r5, r7\n\t"
  61199. "adc r3, r3, #0\n\t"
  61200. "lsr r6, r11, #16\n\t"
  61201. "lsr r7, r12, #16\n\t"
  61202. "mul r7, r6, r7\n\t"
  61203. "adds r5, r5, r7\n\t"
  61204. "adc r3, r3, #0\n\t"
  61205. "lsl r7, r12, #16\n\t"
  61206. "lsr r7, r7, #16\n\t"
  61207. "mul r6, r7, r6\n\t"
  61208. "lsr r7, r6, #16\n\t"
  61209. "lsl r6, r6, #16\n\t"
  61210. "adds r4, r4, r6\n\t"
  61211. "adcs r5, r5, r7\n\t"
  61212. "adc r3, r3, #0\n\t"
  61213. /* A[1] * B[3] */
  61214. "ldr r8, [%[a], #4]\n\t"
  61215. "ldr r9, [%[b], #12]\n\t"
  61216. "lsl r6, r8, #16\n\t"
  61217. "lsl r7, r9, #16\n\t"
  61218. "lsr r6, r6, #16\n\t"
  61219. "lsr r7, r7, #16\n\t"
  61220. "mul r7, r6, r7\n\t"
  61221. "adds r4, r4, r7\n\t"
  61222. "adcs r5, r5, #0\n\t"
  61223. "adc r3, r3, #0\n\t"
  61224. "lsr r7, r9, #16\n\t"
  61225. "mul r6, r7, r6\n\t"
  61226. "lsr r7, r6, #16\n\t"
  61227. "lsl r6, r6, #16\n\t"
  61228. "adds r4, r4, r6\n\t"
  61229. "adcs r5, r5, r7\n\t"
  61230. "adc r3, r3, #0\n\t"
  61231. "lsr r6, r8, #16\n\t"
  61232. "lsr r7, r9, #16\n\t"
  61233. "mul r7, r6, r7\n\t"
  61234. "adds r5, r5, r7\n\t"
  61235. "adc r3, r3, #0\n\t"
  61236. "lsl r7, r9, #16\n\t"
  61237. "lsr r7, r7, #16\n\t"
  61238. "mul r6, r7, r6\n\t"
  61239. "lsr r7, r6, #16\n\t"
  61240. "lsl r6, r6, #16\n\t"
  61241. "adds r4, r4, r6\n\t"
  61242. "adcs r5, r5, r7\n\t"
  61243. "adc r3, r3, #0\n\t"
  61244. /* A[0] * B[4] */
  61245. "ldr r8, [%[a]]\n\t"
  61246. "ldr r9, [%[b], #16]\n\t"
  61247. "lsl r6, r8, #16\n\t"
  61248. "lsl r7, r9, #16\n\t"
  61249. "lsr r6, r6, #16\n\t"
  61250. "lsr r7, r7, #16\n\t"
  61251. "mul r7, r6, r7\n\t"
  61252. "adds r4, r4, r7\n\t"
  61253. "adcs r5, r5, #0\n\t"
  61254. "adc r3, r3, #0\n\t"
  61255. "lsr r7, r9, #16\n\t"
  61256. "mul r6, r7, r6\n\t"
  61257. "lsr r7, r6, #16\n\t"
  61258. "lsl r6, r6, #16\n\t"
  61259. "adds r4, r4, r6\n\t"
  61260. "adcs r5, r5, r7\n\t"
  61261. "adc r3, r3, #0\n\t"
  61262. "lsr r6, r8, #16\n\t"
  61263. "lsr r7, r9, #16\n\t"
  61264. "mul r7, r6, r7\n\t"
  61265. "adds r5, r5, r7\n\t"
  61266. "adc r3, r3, #0\n\t"
  61267. "lsl r7, r9, #16\n\t"
  61268. "lsr r7, r7, #16\n\t"
  61269. "mul r6, r7, r6\n\t"
  61270. "lsr r7, r6, #16\n\t"
  61271. "lsl r6, r6, #16\n\t"
  61272. "adds r4, r4, r6\n\t"
  61273. "adcs r5, r5, r7\n\t"
  61274. "adc r3, r3, #0\n\t"
  61275. "str r4, [sp, #16]\n\t"
  61276. /* A[0] * B[5] */
  61277. "ldr r9, [%[b], #20]\n\t"
  61278. "lsl r6, r8, #16\n\t"
  61279. "lsl r7, r9, #16\n\t"
  61280. "lsr r6, r6, #16\n\t"
  61281. "lsr r7, r7, #16\n\t"
  61282. "mul r7, r6, r7\n\t"
  61283. "adds r5, r5, r7\n\t"
  61284. "adcs r3, r3, #0\n\t"
  61285. "mov r4, #0\n\t"
  61286. "adc r4, r4, #0\n\t"
  61287. "lsr r7, r9, #16\n\t"
  61288. "mul r6, r7, r6\n\t"
  61289. "lsr r7, r6, #16\n\t"
  61290. "lsl r6, r6, #16\n\t"
  61291. "adds r5, r5, r6\n\t"
  61292. "adcs r3, r3, r7\n\t"
  61293. "adc r4, r4, #0\n\t"
  61294. "lsr r6, r8, #16\n\t"
  61295. "lsr r7, r9, #16\n\t"
  61296. "mul r7, r6, r7\n\t"
  61297. "adds r3, r3, r7\n\t"
  61298. "adc r4, r4, #0\n\t"
  61299. "lsl r7, r9, #16\n\t"
  61300. "lsr r7, r7, #16\n\t"
  61301. "mul r6, r7, r6\n\t"
  61302. "lsr r7, r6, #16\n\t"
  61303. "lsl r6, r6, #16\n\t"
  61304. "adds r5, r5, r6\n\t"
  61305. "adcs r3, r3, r7\n\t"
  61306. "adc r4, r4, #0\n\t"
  61307. /* A[1] * B[4] */
  61308. "ldr r8, [%[a], #4]\n\t"
  61309. "ldr r9, [%[b], #16]\n\t"
  61310. "lsl r6, r8, #16\n\t"
  61311. "lsl r7, r9, #16\n\t"
  61312. "lsr r6, r6, #16\n\t"
  61313. "lsr r7, r7, #16\n\t"
  61314. "mul r7, r6, r7\n\t"
  61315. "adds r5, r5, r7\n\t"
  61316. "adcs r3, r3, #0\n\t"
  61317. "adc r4, r4, #0\n\t"
  61318. "lsr r7, r9, #16\n\t"
  61319. "mul r6, r7, r6\n\t"
  61320. "lsr r7, r6, #16\n\t"
  61321. "lsl r6, r6, #16\n\t"
  61322. "adds r5, r5, r6\n\t"
  61323. "adcs r3, r3, r7\n\t"
  61324. "adc r4, r4, #0\n\t"
  61325. "lsr r6, r8, #16\n\t"
  61326. "lsr r7, r9, #16\n\t"
  61327. "mul r7, r6, r7\n\t"
  61328. "adds r3, r3, r7\n\t"
  61329. "adc r4, r4, #0\n\t"
  61330. "lsl r7, r9, #16\n\t"
  61331. "lsr r7, r7, #16\n\t"
  61332. "mul r6, r7, r6\n\t"
  61333. "lsr r7, r6, #16\n\t"
  61334. "lsl r6, r6, #16\n\t"
  61335. "adds r5, r5, r6\n\t"
  61336. "adcs r3, r3, r7\n\t"
  61337. "adc r4, r4, #0\n\t"
  61338. /* A[2] * B[3] */
  61339. "ldr r9, [%[b], #12]\n\t"
  61340. "lsl r6, r11, #16\n\t"
  61341. "lsl r7, r9, #16\n\t"
  61342. "lsr r6, r6, #16\n\t"
  61343. "lsr r7, r7, #16\n\t"
  61344. "mul r7, r6, r7\n\t"
  61345. "adds r5, r5, r7\n\t"
  61346. "adcs r3, r3, #0\n\t"
  61347. "adc r4, r4, #0\n\t"
  61348. "lsr r7, r9, #16\n\t"
  61349. "mul r6, r7, r6\n\t"
  61350. "lsr r7, r6, #16\n\t"
  61351. "lsl r6, r6, #16\n\t"
  61352. "adds r5, r5, r6\n\t"
  61353. "adcs r3, r3, r7\n\t"
  61354. "adc r4, r4, #0\n\t"
  61355. "lsr r6, r11, #16\n\t"
  61356. "lsr r7, r9, #16\n\t"
  61357. "mul r7, r6, r7\n\t"
  61358. "adds r3, r3, r7\n\t"
  61359. "adc r4, r4, #0\n\t"
  61360. "lsl r7, r9, #16\n\t"
  61361. "lsr r7, r7, #16\n\t"
  61362. "mul r6, r7, r6\n\t"
  61363. "lsr r7, r6, #16\n\t"
  61364. "lsl r6, r6, #16\n\t"
  61365. "adds r5, r5, r6\n\t"
  61366. "adcs r3, r3, r7\n\t"
  61367. "adc r4, r4, #0\n\t"
  61368. /* A[3] * B[2] */
  61369. "ldr r8, [%[a], #12]\n\t"
  61370. "lsl r6, r8, #16\n\t"
  61371. "lsl r7, r12, #16\n\t"
  61372. "lsr r6, r6, #16\n\t"
  61373. "lsr r7, r7, #16\n\t"
  61374. "mul r7, r6, r7\n\t"
  61375. "adds r5, r5, r7\n\t"
  61376. "adcs r3, r3, #0\n\t"
  61377. "adc r4, r4, #0\n\t"
  61378. "lsr r7, r12, #16\n\t"
  61379. "mul r6, r7, r6\n\t"
  61380. "lsr r7, r6, #16\n\t"
  61381. "lsl r6, r6, #16\n\t"
  61382. "adds r5, r5, r6\n\t"
  61383. "adcs r3, r3, r7\n\t"
  61384. "adc r4, r4, #0\n\t"
  61385. "lsr r6, r8, #16\n\t"
  61386. "lsr r7, r12, #16\n\t"
  61387. "mul r7, r6, r7\n\t"
  61388. "adds r3, r3, r7\n\t"
  61389. "adc r4, r4, #0\n\t"
  61390. "lsl r7, r12, #16\n\t"
  61391. "lsr r7, r7, #16\n\t"
  61392. "mul r6, r7, r6\n\t"
  61393. "lsr r7, r6, #16\n\t"
  61394. "lsl r6, r6, #16\n\t"
  61395. "adds r5, r5, r6\n\t"
  61396. "adcs r3, r3, r7\n\t"
  61397. "adc r4, r4, #0\n\t"
  61398. /* A[4] * B[1] */
  61399. "ldr r8, [%[a], #16]\n\t"
  61400. "ldr r9, [%[b], #4]\n\t"
  61401. "lsl r6, r8, #16\n\t"
  61402. "lsl r7, r9, #16\n\t"
  61403. "lsr r6, r6, #16\n\t"
  61404. "lsr r7, r7, #16\n\t"
  61405. "mul r7, r6, r7\n\t"
  61406. "adds r5, r5, r7\n\t"
  61407. "adcs r3, r3, #0\n\t"
  61408. "adc r4, r4, #0\n\t"
  61409. "lsr r7, r9, #16\n\t"
  61410. "mul r6, r7, r6\n\t"
  61411. "lsr r7, r6, #16\n\t"
  61412. "lsl r6, r6, #16\n\t"
  61413. "adds r5, r5, r6\n\t"
  61414. "adcs r3, r3, r7\n\t"
  61415. "adc r4, r4, #0\n\t"
  61416. "lsr r6, r8, #16\n\t"
  61417. "lsr r7, r9, #16\n\t"
  61418. "mul r7, r6, r7\n\t"
  61419. "adds r3, r3, r7\n\t"
  61420. "adc r4, r4, #0\n\t"
  61421. "lsl r7, r9, #16\n\t"
  61422. "lsr r7, r7, #16\n\t"
  61423. "mul r6, r7, r6\n\t"
  61424. "lsr r7, r6, #16\n\t"
  61425. "lsl r6, r6, #16\n\t"
  61426. "adds r5, r5, r6\n\t"
  61427. "adcs r3, r3, r7\n\t"
  61428. "adc r4, r4, #0\n\t"
  61429. /* A[5] * B[0] */
  61430. "ldr r8, [%[a], #20]\n\t"
  61431. "ldr r9, [%[b]]\n\t"
  61432. "lsl r6, r8, #16\n\t"
  61433. "lsl r7, r9, #16\n\t"
  61434. "lsr r6, r6, #16\n\t"
  61435. "lsr r7, r7, #16\n\t"
  61436. "mul r7, r6, r7\n\t"
  61437. "adds r5, r5, r7\n\t"
  61438. "adcs r3, r3, #0\n\t"
  61439. "adc r4, r4, #0\n\t"
  61440. "lsr r7, r9, #16\n\t"
  61441. "mul r6, r7, r6\n\t"
  61442. "lsr r7, r6, #16\n\t"
  61443. "lsl r6, r6, #16\n\t"
  61444. "adds r5, r5, r6\n\t"
  61445. "adcs r3, r3, r7\n\t"
  61446. "adc r4, r4, #0\n\t"
  61447. "lsr r6, r8, #16\n\t"
  61448. "lsr r7, r9, #16\n\t"
  61449. "mul r7, r6, r7\n\t"
  61450. "adds r3, r3, r7\n\t"
  61451. "adc r4, r4, #0\n\t"
  61452. "lsl r7, r9, #16\n\t"
  61453. "lsr r7, r7, #16\n\t"
  61454. "mul r6, r7, r6\n\t"
  61455. "lsr r7, r6, #16\n\t"
  61456. "lsl r6, r6, #16\n\t"
  61457. "adds r5, r5, r6\n\t"
  61458. "adcs r3, r3, r7\n\t"
  61459. "adc r4, r4, #0\n\t"
  61460. "str r5, [sp, #20]\n\t"
  61461. /* A[6] * B[0] */
  61462. "ldr r8, [%[a], #24]\n\t"
  61463. "lsl r6, r8, #16\n\t"
  61464. "lsl r7, r9, #16\n\t"
  61465. "lsr r6, r6, #16\n\t"
  61466. "lsr r7, r7, #16\n\t"
  61467. "mul r7, r6, r7\n\t"
  61468. "adds r3, r3, r7\n\t"
  61469. "adcs r4, r4, #0\n\t"
  61470. "mov r5, #0\n\t"
  61471. "adc r5, r5, #0\n\t"
  61472. "lsr r7, r9, #16\n\t"
  61473. "mul r6, r7, r6\n\t"
  61474. "lsr r7, r6, #16\n\t"
  61475. "lsl r6, r6, #16\n\t"
  61476. "adds r3, r3, r6\n\t"
  61477. "adcs r4, r4, r7\n\t"
  61478. "adc r5, r5, #0\n\t"
  61479. "lsr r6, r8, #16\n\t"
  61480. "lsr r7, r9, #16\n\t"
  61481. "mul r7, r6, r7\n\t"
  61482. "adds r4, r4, r7\n\t"
  61483. "adc r5, r5, #0\n\t"
  61484. "lsl r7, r9, #16\n\t"
  61485. "lsr r7, r7, #16\n\t"
  61486. "mul r6, r7, r6\n\t"
  61487. "lsr r7, r6, #16\n\t"
  61488. "lsl r6, r6, #16\n\t"
  61489. "adds r3, r3, r6\n\t"
  61490. "adcs r4, r4, r7\n\t"
  61491. "adc r5, r5, #0\n\t"
  61492. /* A[5] * B[1] */
  61493. "ldr r8, [%[a], #20]\n\t"
  61494. "ldr r9, [%[b], #4]\n\t"
  61495. "lsl r6, r8, #16\n\t"
  61496. "lsl r7, r9, #16\n\t"
  61497. "lsr r6, r6, #16\n\t"
  61498. "lsr r7, r7, #16\n\t"
  61499. "mul r7, r6, r7\n\t"
  61500. "adds r3, r3, r7\n\t"
  61501. "adcs r4, r4, #0\n\t"
  61502. "adc r5, r5, #0\n\t"
  61503. "lsr r7, r9, #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 r3, r3, r6\n\t"
  61508. "adcs r4, r4, r7\n\t"
  61509. "adc r5, r5, #0\n\t"
  61510. "lsr r6, r8, #16\n\t"
  61511. "lsr r7, r9, #16\n\t"
  61512. "mul r7, r6, r7\n\t"
  61513. "adds r4, r4, r7\n\t"
  61514. "adc r5, r5, #0\n\t"
  61515. "lsl r7, r9, #16\n\t"
  61516. "lsr r7, r7, #16\n\t"
  61517. "mul r6, r7, r6\n\t"
  61518. "lsr r7, r6, #16\n\t"
  61519. "lsl r6, r6, #16\n\t"
  61520. "adds r3, r3, r6\n\t"
  61521. "adcs r4, r4, r7\n\t"
  61522. "adc r5, r5, #0\n\t"
  61523. /* A[4] * B[2] */
  61524. "ldr r8, [%[a], #16]\n\t"
  61525. "lsl r6, r8, #16\n\t"
  61526. "lsl r7, r12, #16\n\t"
  61527. "lsr r6, r6, #16\n\t"
  61528. "lsr r7, r7, #16\n\t"
  61529. "mul r7, r6, r7\n\t"
  61530. "adds r3, r3, r7\n\t"
  61531. "adcs r4, r4, #0\n\t"
  61532. "adc r5, r5, #0\n\t"
  61533. "lsr r7, r12, #16\n\t"
  61534. "mul r6, r7, r6\n\t"
  61535. "lsr r7, r6, #16\n\t"
  61536. "lsl r6, r6, #16\n\t"
  61537. "adds r3, r3, r6\n\t"
  61538. "adcs r4, r4, r7\n\t"
  61539. "adc r5, r5, #0\n\t"
  61540. "lsr r6, r8, #16\n\t"
  61541. "lsr r7, r12, #16\n\t"
  61542. "mul r7, r6, r7\n\t"
  61543. "adds r4, r4, r7\n\t"
  61544. "adc r5, r5, #0\n\t"
  61545. "lsl r7, r12, #16\n\t"
  61546. "lsr r7, r7, #16\n\t"
  61547. "mul r6, r7, r6\n\t"
  61548. "lsr r7, r6, #16\n\t"
  61549. "lsl r6, r6, #16\n\t"
  61550. "adds r3, r3, r6\n\t"
  61551. "adcs r4, r4, r7\n\t"
  61552. "adc r5, r5, #0\n\t"
  61553. /* A[3] * B[3] */
  61554. "ldr r11, [%[a], #12]\n\t"
  61555. "ldr r12, [%[b], #12]\n\t"
  61556. "lsl r6, r11, #16\n\t"
  61557. "lsl r7, r12, #16\n\t"
  61558. "lsr r6, r6, #16\n\t"
  61559. "lsr r7, r7, #16\n\t"
  61560. "mul r7, r6, r7\n\t"
  61561. "adds r3, r3, r7\n\t"
  61562. "adcs r4, r4, #0\n\t"
  61563. "adc r5, r5, #0\n\t"
  61564. "lsr r7, r12, #16\n\t"
  61565. "mul r6, r7, r6\n\t"
  61566. "lsr r7, r6, #16\n\t"
  61567. "lsl r6, r6, #16\n\t"
  61568. "adds r3, r3, r6\n\t"
  61569. "adcs r4, r4, r7\n\t"
  61570. "adc r5, r5, #0\n\t"
  61571. "lsr r6, r11, #16\n\t"
  61572. "lsr r7, r12, #16\n\t"
  61573. "mul r7, r6, r7\n\t"
  61574. "adds r4, r4, r7\n\t"
  61575. "adc r5, r5, #0\n\t"
  61576. "lsl r7, r12, #16\n\t"
  61577. "lsr r7, r7, #16\n\t"
  61578. "mul r6, r7, r6\n\t"
  61579. "lsr r7, r6, #16\n\t"
  61580. "lsl r6, r6, #16\n\t"
  61581. "adds r3, r3, r6\n\t"
  61582. "adcs r4, r4, r7\n\t"
  61583. "adc r5, r5, #0\n\t"
  61584. /* A[2] * B[4] */
  61585. "ldr r8, [%[a], #8]\n\t"
  61586. "ldr r9, [%[b], #16]\n\t"
  61587. "lsl r6, r8, #16\n\t"
  61588. "lsl r7, r9, #16\n\t"
  61589. "lsr r6, r6, #16\n\t"
  61590. "lsr r7, r7, #16\n\t"
  61591. "mul r7, r6, r7\n\t"
  61592. "adds r3, r3, r7\n\t"
  61593. "adcs r4, r4, #0\n\t"
  61594. "adc r5, r5, #0\n\t"
  61595. "lsr r7, r9, #16\n\t"
  61596. "mul r6, r7, r6\n\t"
  61597. "lsr r7, r6, #16\n\t"
  61598. "lsl r6, r6, #16\n\t"
  61599. "adds r3, r3, r6\n\t"
  61600. "adcs r4, r4, r7\n\t"
  61601. "adc r5, r5, #0\n\t"
  61602. "lsr r6, r8, #16\n\t"
  61603. "lsr r7, r9, #16\n\t"
  61604. "mul r7, r6, r7\n\t"
  61605. "adds r4, r4, r7\n\t"
  61606. "adc r5, r5, #0\n\t"
  61607. "lsl r7, r9, #16\n\t"
  61608. "lsr r7, r7, #16\n\t"
  61609. "mul r6, r7, r6\n\t"
  61610. "lsr r7, r6, #16\n\t"
  61611. "lsl r6, r6, #16\n\t"
  61612. "adds r3, r3, r6\n\t"
  61613. "adcs r4, r4, r7\n\t"
  61614. "adc r5, r5, #0\n\t"
  61615. /* A[1] * B[5] */
  61616. "ldr r8, [%[a], #4]\n\t"
  61617. "ldr r9, [%[b], #20]\n\t"
  61618. "lsl r6, r8, #16\n\t"
  61619. "lsl r7, r9, #16\n\t"
  61620. "lsr r6, r6, #16\n\t"
  61621. "lsr r7, r7, #16\n\t"
  61622. "mul r7, r6, r7\n\t"
  61623. "adds r3, r3, r7\n\t"
  61624. "adcs r4, r4, #0\n\t"
  61625. "adc r5, r5, #0\n\t"
  61626. "lsr r7, r9, #16\n\t"
  61627. "mul r6, r7, r6\n\t"
  61628. "lsr r7, r6, #16\n\t"
  61629. "lsl r6, r6, #16\n\t"
  61630. "adds r3, r3, r6\n\t"
  61631. "adcs r4, r4, r7\n\t"
  61632. "adc r5, r5, #0\n\t"
  61633. "lsr r6, r8, #16\n\t"
  61634. "lsr r7, r9, #16\n\t"
  61635. "mul r7, r6, r7\n\t"
  61636. "adds r4, r4, r7\n\t"
  61637. "adc r5, r5, #0\n\t"
  61638. "lsl r7, r9, #16\n\t"
  61639. "lsr r7, r7, #16\n\t"
  61640. "mul r6, r7, r6\n\t"
  61641. "lsr r7, r6, #16\n\t"
  61642. "lsl r6, r6, #16\n\t"
  61643. "adds r3, r3, r6\n\t"
  61644. "adcs r4, r4, r7\n\t"
  61645. "adc r5, r5, #0\n\t"
  61646. /* A[0] * B[6] */
  61647. "ldr r8, [%[a]]\n\t"
  61648. "ldr r9, [%[b], #24]\n\t"
  61649. "lsl r6, r8, #16\n\t"
  61650. "lsl r7, r9, #16\n\t"
  61651. "lsr r6, r6, #16\n\t"
  61652. "lsr r7, r7, #16\n\t"
  61653. "mul r7, r6, r7\n\t"
  61654. "adds r3, r3, r7\n\t"
  61655. "adcs r4, r4, #0\n\t"
  61656. "adc r5, r5, #0\n\t"
  61657. "lsr r7, r9, #16\n\t"
  61658. "mul r6, r7, r6\n\t"
  61659. "lsr r7, r6, #16\n\t"
  61660. "lsl r6, r6, #16\n\t"
  61661. "adds r3, r3, r6\n\t"
  61662. "adcs r4, r4, r7\n\t"
  61663. "adc r5, r5, #0\n\t"
  61664. "lsr r6, r8, #16\n\t"
  61665. "lsr r7, r9, #16\n\t"
  61666. "mul r7, r6, r7\n\t"
  61667. "adds r4, r4, r7\n\t"
  61668. "adc r5, r5, #0\n\t"
  61669. "lsl r7, r9, #16\n\t"
  61670. "lsr r7, r7, #16\n\t"
  61671. "mul r6, r7, r6\n\t"
  61672. "lsr r7, r6, #16\n\t"
  61673. "lsl r6, r6, #16\n\t"
  61674. "adds r3, r3, r6\n\t"
  61675. "adcs r4, r4, r7\n\t"
  61676. "adc r5, r5, #0\n\t"
  61677. "str r3, [sp, #24]\n\t"
  61678. /* A[0] * B[7] */
  61679. "ldr r9, [%[b], #28]\n\t"
  61680. "lsl r6, r8, #16\n\t"
  61681. "lsl r7, r9, #16\n\t"
  61682. "lsr r6, r6, #16\n\t"
  61683. "lsr r7, r7, #16\n\t"
  61684. "mul r7, r6, r7\n\t"
  61685. "adds r4, r4, r7\n\t"
  61686. "adcs r5, r5, #0\n\t"
  61687. "mov r3, #0\n\t"
  61688. "adc r3, r3, #0\n\t"
  61689. "lsr r7, r9, #16\n\t"
  61690. "mul r6, r7, r6\n\t"
  61691. "lsr r7, r6, #16\n\t"
  61692. "lsl r6, r6, #16\n\t"
  61693. "adds r4, r4, r6\n\t"
  61694. "adcs r5, r5, r7\n\t"
  61695. "adc r3, r3, #0\n\t"
  61696. "lsr r6, r8, #16\n\t"
  61697. "lsr r7, r9, #16\n\t"
  61698. "mul r7, r6, r7\n\t"
  61699. "adds r5, r5, r7\n\t"
  61700. "adc r3, r3, #0\n\t"
  61701. "lsl r7, r9, #16\n\t"
  61702. "lsr r7, r7, #16\n\t"
  61703. "mul r6, r7, r6\n\t"
  61704. "lsr r7, r6, #16\n\t"
  61705. "lsl r6, r6, #16\n\t"
  61706. "adds r4, r4, r6\n\t"
  61707. "adcs r5, r5, r7\n\t"
  61708. "adc r3, r3, #0\n\t"
  61709. /* A[1] * B[6] */
  61710. "ldr r8, [%[a], #4]\n\t"
  61711. "ldr r9, [%[b], #24]\n\t"
  61712. "lsl r6, r8, #16\n\t"
  61713. "lsl r7, r9, #16\n\t"
  61714. "lsr r6, r6, #16\n\t"
  61715. "lsr r7, r7, #16\n\t"
  61716. "mul r7, r6, r7\n\t"
  61717. "adds r4, r4, r7\n\t"
  61718. "adcs r5, r5, #0\n\t"
  61719. "adc r3, r3, #0\n\t"
  61720. "lsr r7, r9, #16\n\t"
  61721. "mul r6, r7, r6\n\t"
  61722. "lsr r7, r6, #16\n\t"
  61723. "lsl r6, r6, #16\n\t"
  61724. "adds r4, r4, r6\n\t"
  61725. "adcs r5, r5, r7\n\t"
  61726. "adc r3, r3, #0\n\t"
  61727. "lsr r6, r8, #16\n\t"
  61728. "lsr r7, r9, #16\n\t"
  61729. "mul r7, r6, r7\n\t"
  61730. "adds r5, r5, r7\n\t"
  61731. "adc r3, r3, #0\n\t"
  61732. "lsl r7, r9, #16\n\t"
  61733. "lsr r7, r7, #16\n\t"
  61734. "mul r6, r7, r6\n\t"
  61735. "lsr r7, r6, #16\n\t"
  61736. "lsl r6, r6, #16\n\t"
  61737. "adds r4, r4, r6\n\t"
  61738. "adcs r5, r5, r7\n\t"
  61739. "adc r3, r3, #0\n\t"
  61740. /* A[2] * B[5] */
  61741. "ldr r8, [%[a], #8]\n\t"
  61742. "ldr r9, [%[b], #20]\n\t"
  61743. "lsl r6, r8, #16\n\t"
  61744. "lsl r7, r9, #16\n\t"
  61745. "lsr r6, r6, #16\n\t"
  61746. "lsr r7, r7, #16\n\t"
  61747. "mul r7, r6, r7\n\t"
  61748. "adds r4, r4, r7\n\t"
  61749. "adcs r5, r5, #0\n\t"
  61750. "adc r3, r3, #0\n\t"
  61751. "lsr r7, r9, #16\n\t"
  61752. "mul r6, r7, r6\n\t"
  61753. "lsr r7, r6, #16\n\t"
  61754. "lsl r6, r6, #16\n\t"
  61755. "adds r4, r4, r6\n\t"
  61756. "adcs r5, r5, r7\n\t"
  61757. "adc r3, r3, #0\n\t"
  61758. "lsr r6, r8, #16\n\t"
  61759. "lsr r7, r9, #16\n\t"
  61760. "mul r7, r6, r7\n\t"
  61761. "adds r5, r5, r7\n\t"
  61762. "adc r3, r3, #0\n\t"
  61763. "lsl r7, r9, #16\n\t"
  61764. "lsr r7, r7, #16\n\t"
  61765. "mul r6, r7, r6\n\t"
  61766. "lsr r7, r6, #16\n\t"
  61767. "lsl r6, r6, #16\n\t"
  61768. "adds r4, r4, r6\n\t"
  61769. "adcs r5, r5, r7\n\t"
  61770. "adc r3, r3, #0\n\t"
  61771. /* A[3] * B[4] */
  61772. "ldr r9, [%[b], #16]\n\t"
  61773. "lsl r6, r11, #16\n\t"
  61774. "lsl r7, r9, #16\n\t"
  61775. "lsr r6, r6, #16\n\t"
  61776. "lsr r7, r7, #16\n\t"
  61777. "mul r7, r6, r7\n\t"
  61778. "adds r4, r4, r7\n\t"
  61779. "adcs r5, r5, #0\n\t"
  61780. "adc r3, r3, #0\n\t"
  61781. "lsr r7, r9, #16\n\t"
  61782. "mul r6, r7, r6\n\t"
  61783. "lsr r7, r6, #16\n\t"
  61784. "lsl r6, r6, #16\n\t"
  61785. "adds r4, r4, r6\n\t"
  61786. "adcs r5, r5, r7\n\t"
  61787. "adc r3, r3, #0\n\t"
  61788. "lsr r6, r11, #16\n\t"
  61789. "lsr r7, r9, #16\n\t"
  61790. "mul r7, r6, r7\n\t"
  61791. "adds r5, r5, r7\n\t"
  61792. "adc r3, r3, #0\n\t"
  61793. "lsl r7, r9, #16\n\t"
  61794. "lsr r7, r7, #16\n\t"
  61795. "mul r6, r7, r6\n\t"
  61796. "lsr r7, r6, #16\n\t"
  61797. "lsl r6, r6, #16\n\t"
  61798. "adds r4, r4, r6\n\t"
  61799. "adcs r5, r5, r7\n\t"
  61800. "adc r3, r3, #0\n\t"
  61801. /* A[4] * B[3] */
  61802. "ldr r8, [%[a], #16]\n\t"
  61803. "lsl r6, r8, #16\n\t"
  61804. "lsl r7, r12, #16\n\t"
  61805. "lsr r6, r6, #16\n\t"
  61806. "lsr r7, r7, #16\n\t"
  61807. "mul r7, r6, r7\n\t"
  61808. "adds r4, r4, r7\n\t"
  61809. "adcs r5, r5, #0\n\t"
  61810. "adc r3, r3, #0\n\t"
  61811. "lsr r7, r12, #16\n\t"
  61812. "mul r6, r7, r6\n\t"
  61813. "lsr r7, r6, #16\n\t"
  61814. "lsl r6, r6, #16\n\t"
  61815. "adds r4, r4, r6\n\t"
  61816. "adcs r5, r5, r7\n\t"
  61817. "adc r3, r3, #0\n\t"
  61818. "lsr r6, r8, #16\n\t"
  61819. "lsr r7, r12, #16\n\t"
  61820. "mul r7, r6, r7\n\t"
  61821. "adds r5, r5, r7\n\t"
  61822. "adc r3, r3, #0\n\t"
  61823. "lsl r7, r12, #16\n\t"
  61824. "lsr r7, r7, #16\n\t"
  61825. "mul r6, r7, r6\n\t"
  61826. "lsr r7, r6, #16\n\t"
  61827. "lsl r6, r6, #16\n\t"
  61828. "adds r4, r4, r6\n\t"
  61829. "adcs r5, r5, r7\n\t"
  61830. "adc r3, r3, #0\n\t"
  61831. /* A[5] * B[2] */
  61832. "ldr r8, [%[a], #20]\n\t"
  61833. "ldr r9, [%[b], #8]\n\t"
  61834. "lsl r6, r8, #16\n\t"
  61835. "lsl r7, r9, #16\n\t"
  61836. "lsr r6, r6, #16\n\t"
  61837. "lsr r7, r7, #16\n\t"
  61838. "mul r7, r6, r7\n\t"
  61839. "adds r4, r4, r7\n\t"
  61840. "adcs r5, r5, #0\n\t"
  61841. "adc r3, r3, #0\n\t"
  61842. "lsr r7, r9, #16\n\t"
  61843. "mul r6, r7, r6\n\t"
  61844. "lsr r7, r6, #16\n\t"
  61845. "lsl r6, r6, #16\n\t"
  61846. "adds r4, r4, r6\n\t"
  61847. "adcs r5, r5, r7\n\t"
  61848. "adc r3, r3, #0\n\t"
  61849. "lsr r6, r8, #16\n\t"
  61850. "lsr r7, r9, #16\n\t"
  61851. "mul r7, r6, r7\n\t"
  61852. "adds r5, r5, r7\n\t"
  61853. "adc r3, r3, #0\n\t"
  61854. "lsl r7, r9, #16\n\t"
  61855. "lsr r7, r7, #16\n\t"
  61856. "mul r6, r7, r6\n\t"
  61857. "lsr r7, r6, #16\n\t"
  61858. "lsl r6, r6, #16\n\t"
  61859. "adds r4, r4, r6\n\t"
  61860. "adcs r5, r5, r7\n\t"
  61861. "adc r3, r3, #0\n\t"
  61862. /* A[6] * B[1] */
  61863. "ldr r8, [%[a], #24]\n\t"
  61864. "ldr r9, [%[b], #4]\n\t"
  61865. "lsl r6, r8, #16\n\t"
  61866. "lsl r7, r9, #16\n\t"
  61867. "lsr r6, r6, #16\n\t"
  61868. "lsr r7, r7, #16\n\t"
  61869. "mul r7, r6, r7\n\t"
  61870. "adds r4, r4, r7\n\t"
  61871. "adcs r5, r5, #0\n\t"
  61872. "adc r3, r3, #0\n\t"
  61873. "lsr r7, r9, #16\n\t"
  61874. "mul r6, r7, r6\n\t"
  61875. "lsr r7, r6, #16\n\t"
  61876. "lsl r6, r6, #16\n\t"
  61877. "adds r4, r4, r6\n\t"
  61878. "adcs r5, r5, r7\n\t"
  61879. "adc r3, r3, #0\n\t"
  61880. "lsr r6, r8, #16\n\t"
  61881. "lsr r7, r9, #16\n\t"
  61882. "mul r7, r6, r7\n\t"
  61883. "adds r5, r5, r7\n\t"
  61884. "adc r3, r3, #0\n\t"
  61885. "lsl r7, r9, #16\n\t"
  61886. "lsr r7, r7, #16\n\t"
  61887. "mul r6, r7, r6\n\t"
  61888. "lsr r7, r6, #16\n\t"
  61889. "lsl r6, r6, #16\n\t"
  61890. "adds r4, r4, r6\n\t"
  61891. "adcs r5, r5, r7\n\t"
  61892. "adc r3, r3, #0\n\t"
  61893. /* A[7] * B[0] */
  61894. "ldr r8, [%[a], #28]\n\t"
  61895. "ldr r9, [%[b]]\n\t"
  61896. "lsl r6, r8, #16\n\t"
  61897. "lsl r7, r9, #16\n\t"
  61898. "lsr r6, r6, #16\n\t"
  61899. "lsr r7, r7, #16\n\t"
  61900. "mul r7, r6, r7\n\t"
  61901. "adds r4, r4, r7\n\t"
  61902. "adcs r5, r5, #0\n\t"
  61903. "adc r3, r3, #0\n\t"
  61904. "lsr r7, r9, #16\n\t"
  61905. "mul r6, r7, r6\n\t"
  61906. "lsr r7, r6, #16\n\t"
  61907. "lsl r6, r6, #16\n\t"
  61908. "adds r4, r4, r6\n\t"
  61909. "adcs r5, r5, r7\n\t"
  61910. "adc r3, r3, #0\n\t"
  61911. "lsr r6, r8, #16\n\t"
  61912. "lsr r7, r9, #16\n\t"
  61913. "mul r7, r6, r7\n\t"
  61914. "adds r5, r5, r7\n\t"
  61915. "adc r3, r3, #0\n\t"
  61916. "lsl r7, r9, #16\n\t"
  61917. "lsr r7, r7, #16\n\t"
  61918. "mul r6, r7, r6\n\t"
  61919. "lsr r7, r6, #16\n\t"
  61920. "lsl r6, r6, #16\n\t"
  61921. "adds r4, r4, r6\n\t"
  61922. "adcs r5, r5, r7\n\t"
  61923. "adc r3, r3, #0\n\t"
  61924. "str r4, [sp, #28]\n\t"
  61925. /* A[7] * B[1] */
  61926. "ldr r9, [%[b], #4]\n\t"
  61927. "lsl r6, r8, #16\n\t"
  61928. "lsl r7, r9, #16\n\t"
  61929. "lsr r6, r6, #16\n\t"
  61930. "lsr r7, r7, #16\n\t"
  61931. "mul r7, r6, r7\n\t"
  61932. "adds r5, r5, r7\n\t"
  61933. "adcs r3, r3, #0\n\t"
  61934. "mov r4, #0\n\t"
  61935. "adc r4, r4, #0\n\t"
  61936. "lsr r7, r9, #16\n\t"
  61937. "mul r6, r7, r6\n\t"
  61938. "lsr r7, r6, #16\n\t"
  61939. "lsl r6, r6, #16\n\t"
  61940. "adds r5, r5, r6\n\t"
  61941. "adcs r3, r3, r7\n\t"
  61942. "adc r4, r4, #0\n\t"
  61943. "lsr r6, r8, #16\n\t"
  61944. "lsr r7, r9, #16\n\t"
  61945. "mul r7, r6, r7\n\t"
  61946. "adds r3, r3, r7\n\t"
  61947. "adc r4, r4, #0\n\t"
  61948. "lsl r7, r9, #16\n\t"
  61949. "lsr r7, r7, #16\n\t"
  61950. "mul r6, r7, r6\n\t"
  61951. "lsr r7, r6, #16\n\t"
  61952. "lsl r6, r6, #16\n\t"
  61953. "adds r5, r5, r6\n\t"
  61954. "adcs r3, r3, r7\n\t"
  61955. "adc r4, r4, #0\n\t"
  61956. /* A[6] * B[2] */
  61957. "ldr r8, [%[a], #24]\n\t"
  61958. "ldr r9, [%[b], #8]\n\t"
  61959. "lsl r6, r8, #16\n\t"
  61960. "lsl r7, r9, #16\n\t"
  61961. "lsr r6, r6, #16\n\t"
  61962. "lsr r7, r7, #16\n\t"
  61963. "mul r7, r6, r7\n\t"
  61964. "adds r5, r5, r7\n\t"
  61965. "adcs r3, r3, #0\n\t"
  61966. "adc r4, r4, #0\n\t"
  61967. "lsr r7, r9, #16\n\t"
  61968. "mul r6, r7, r6\n\t"
  61969. "lsr r7, r6, #16\n\t"
  61970. "lsl r6, r6, #16\n\t"
  61971. "adds r5, r5, r6\n\t"
  61972. "adcs r3, r3, r7\n\t"
  61973. "adc r4, r4, #0\n\t"
  61974. "lsr r6, r8, #16\n\t"
  61975. "lsr r7, r9, #16\n\t"
  61976. "mul r7, r6, r7\n\t"
  61977. "adds r3, r3, r7\n\t"
  61978. "adc r4, r4, #0\n\t"
  61979. "lsl r7, r9, #16\n\t"
  61980. "lsr r7, r7, #16\n\t"
  61981. "mul r6, r7, r6\n\t"
  61982. "lsr r7, r6, #16\n\t"
  61983. "lsl r6, r6, #16\n\t"
  61984. "adds r5, r5, r6\n\t"
  61985. "adcs r3, r3, r7\n\t"
  61986. "adc r4, r4, #0\n\t"
  61987. /* A[5] * B[3] */
  61988. "ldr r8, [%[a], #20]\n\t"
  61989. "lsl r6, r8, #16\n\t"
  61990. "lsl r7, r12, #16\n\t"
  61991. "lsr r6, r6, #16\n\t"
  61992. "lsr r7, r7, #16\n\t"
  61993. "mul r7, r6, r7\n\t"
  61994. "adds r5, r5, r7\n\t"
  61995. "adcs r3, r3, #0\n\t"
  61996. "adc r4, r4, #0\n\t"
  61997. "lsr r7, r12, #16\n\t"
  61998. "mul r6, r7, r6\n\t"
  61999. "lsr r7, r6, #16\n\t"
  62000. "lsl r6, r6, #16\n\t"
  62001. "adds r5, r5, r6\n\t"
  62002. "adcs r3, r3, r7\n\t"
  62003. "adc r4, r4, #0\n\t"
  62004. "lsr r6, r8, #16\n\t"
  62005. "lsr r7, r12, #16\n\t"
  62006. "mul r7, r6, r7\n\t"
  62007. "adds r3, r3, r7\n\t"
  62008. "adc r4, r4, #0\n\t"
  62009. "lsl r7, r12, #16\n\t"
  62010. "lsr r7, r7, #16\n\t"
  62011. "mul r6, r7, r6\n\t"
  62012. "lsr r7, r6, #16\n\t"
  62013. "lsl r6, r6, #16\n\t"
  62014. "adds r5, r5, r6\n\t"
  62015. "adcs r3, r3, r7\n\t"
  62016. "adc r4, r4, #0\n\t"
  62017. /* A[4] * B[4] */
  62018. "ldr r11, [%[a], #16]\n\t"
  62019. "ldr r12, [%[b], #16]\n\t"
  62020. "lsl r6, r11, #16\n\t"
  62021. "lsl r7, r12, #16\n\t"
  62022. "lsr r6, r6, #16\n\t"
  62023. "lsr r7, r7, #16\n\t"
  62024. "mul r7, r6, r7\n\t"
  62025. "adds r5, r5, r7\n\t"
  62026. "adcs r3, r3, #0\n\t"
  62027. "adc r4, r4, #0\n\t"
  62028. "lsr r7, r12, #16\n\t"
  62029. "mul r6, r7, r6\n\t"
  62030. "lsr r7, r6, #16\n\t"
  62031. "lsl r6, r6, #16\n\t"
  62032. "adds r5, r5, r6\n\t"
  62033. "adcs r3, r3, r7\n\t"
  62034. "adc r4, r4, #0\n\t"
  62035. "lsr r6, r11, #16\n\t"
  62036. "lsr r7, r12, #16\n\t"
  62037. "mul r7, r6, r7\n\t"
  62038. "adds r3, r3, r7\n\t"
  62039. "adc r4, r4, #0\n\t"
  62040. "lsl r7, r12, #16\n\t"
  62041. "lsr r7, r7, #16\n\t"
  62042. "mul r6, r7, r6\n\t"
  62043. "lsr r7, r6, #16\n\t"
  62044. "lsl r6, r6, #16\n\t"
  62045. "adds r5, r5, r6\n\t"
  62046. "adcs r3, r3, r7\n\t"
  62047. "adc r4, r4, #0\n\t"
  62048. /* A[3] * B[5] */
  62049. "ldr r8, [%[a], #12]\n\t"
  62050. "ldr r9, [%[b], #20]\n\t"
  62051. "lsl r6, r8, #16\n\t"
  62052. "lsl r7, r9, #16\n\t"
  62053. "lsr r6, r6, #16\n\t"
  62054. "lsr r7, r7, #16\n\t"
  62055. "mul r7, r6, r7\n\t"
  62056. "adds r5, r5, r7\n\t"
  62057. "adcs r3, r3, #0\n\t"
  62058. "adc r4, r4, #0\n\t"
  62059. "lsr r7, r9, #16\n\t"
  62060. "mul r6, r7, r6\n\t"
  62061. "lsr r7, r6, #16\n\t"
  62062. "lsl r6, r6, #16\n\t"
  62063. "adds r5, r5, r6\n\t"
  62064. "adcs r3, r3, r7\n\t"
  62065. "adc r4, r4, #0\n\t"
  62066. "lsr r6, r8, #16\n\t"
  62067. "lsr r7, r9, #16\n\t"
  62068. "mul r7, r6, r7\n\t"
  62069. "adds r3, r3, r7\n\t"
  62070. "adc r4, r4, #0\n\t"
  62071. "lsl r7, r9, #16\n\t"
  62072. "lsr r7, r7, #16\n\t"
  62073. "mul r6, r7, r6\n\t"
  62074. "lsr r7, r6, #16\n\t"
  62075. "lsl r6, r6, #16\n\t"
  62076. "adds r5, r5, r6\n\t"
  62077. "adcs r3, r3, r7\n\t"
  62078. "adc r4, r4, #0\n\t"
  62079. /* A[2] * B[6] */
  62080. "ldr r8, [%[a], #8]\n\t"
  62081. "ldr r9, [%[b], #24]\n\t"
  62082. "lsl r6, r8, #16\n\t"
  62083. "lsl r7, r9, #16\n\t"
  62084. "lsr r6, r6, #16\n\t"
  62085. "lsr r7, r7, #16\n\t"
  62086. "mul r7, r6, r7\n\t"
  62087. "adds r5, r5, r7\n\t"
  62088. "adcs r3, r3, #0\n\t"
  62089. "adc r4, r4, #0\n\t"
  62090. "lsr r7, r9, #16\n\t"
  62091. "mul r6, r7, r6\n\t"
  62092. "lsr r7, r6, #16\n\t"
  62093. "lsl r6, r6, #16\n\t"
  62094. "adds r5, r5, r6\n\t"
  62095. "adcs r3, r3, r7\n\t"
  62096. "adc r4, r4, #0\n\t"
  62097. "lsr r6, r8, #16\n\t"
  62098. "lsr r7, r9, #16\n\t"
  62099. "mul r7, r6, r7\n\t"
  62100. "adds r3, r3, r7\n\t"
  62101. "adc r4, r4, #0\n\t"
  62102. "lsl r7, r9, #16\n\t"
  62103. "lsr r7, r7, #16\n\t"
  62104. "mul r6, r7, r6\n\t"
  62105. "lsr r7, r6, #16\n\t"
  62106. "lsl r6, r6, #16\n\t"
  62107. "adds r5, r5, r6\n\t"
  62108. "adcs r3, r3, r7\n\t"
  62109. "adc r4, r4, #0\n\t"
  62110. /* A[1] * B[7] */
  62111. "ldr r8, [%[a], #4]\n\t"
  62112. "ldr r9, [%[b], #28]\n\t"
  62113. "lsl r6, r8, #16\n\t"
  62114. "lsl r7, r9, #16\n\t"
  62115. "lsr r6, r6, #16\n\t"
  62116. "lsr r7, r7, #16\n\t"
  62117. "mul r7, r6, r7\n\t"
  62118. "adds r5, r5, r7\n\t"
  62119. "adcs r3, r3, #0\n\t"
  62120. "adc r4, r4, #0\n\t"
  62121. "lsr r7, r9, #16\n\t"
  62122. "mul r6, r7, r6\n\t"
  62123. "lsr r7, r6, #16\n\t"
  62124. "lsl r6, r6, #16\n\t"
  62125. "adds r5, r5, r6\n\t"
  62126. "adcs r3, r3, r7\n\t"
  62127. "adc r4, r4, #0\n\t"
  62128. "lsr r6, r8, #16\n\t"
  62129. "lsr r7, r9, #16\n\t"
  62130. "mul r7, r6, r7\n\t"
  62131. "adds r3, r3, r7\n\t"
  62132. "adc r4, r4, #0\n\t"
  62133. "lsl r7, r9, #16\n\t"
  62134. "lsr r7, r7, #16\n\t"
  62135. "mul r6, r7, r6\n\t"
  62136. "lsr r7, r6, #16\n\t"
  62137. "lsl r6, r6, #16\n\t"
  62138. "adds r5, r5, r6\n\t"
  62139. "adcs r3, r3, r7\n\t"
  62140. "adc r4, r4, #0\n\t"
  62141. "str r5, [%[r], #32]\n\t"
  62142. /* A[2] * B[7] */
  62143. "ldr r8, [%[a], #8]\n\t"
  62144. "lsl r6, r8, #16\n\t"
  62145. "lsl r7, r9, #16\n\t"
  62146. "lsr r6, r6, #16\n\t"
  62147. "lsr r7, r7, #16\n\t"
  62148. "mul r7, r6, r7\n\t"
  62149. "adds r3, r3, r7\n\t"
  62150. "adcs r4, r4, #0\n\t"
  62151. "mov r5, #0\n\t"
  62152. "adc r5, r5, #0\n\t"
  62153. "lsr r7, r9, #16\n\t"
  62154. "mul r6, r7, r6\n\t"
  62155. "lsr r7, r6, #16\n\t"
  62156. "lsl r6, r6, #16\n\t"
  62157. "adds r3, r3, r6\n\t"
  62158. "adcs r4, r4, r7\n\t"
  62159. "adc r5, r5, #0\n\t"
  62160. "lsr r6, r8, #16\n\t"
  62161. "lsr r7, r9, #16\n\t"
  62162. "mul r7, r6, r7\n\t"
  62163. "adds r4, r4, r7\n\t"
  62164. "adc r5, r5, #0\n\t"
  62165. "lsl r7, r9, #16\n\t"
  62166. "lsr r7, r7, #16\n\t"
  62167. "mul r6, r7, r6\n\t"
  62168. "lsr r7, r6, #16\n\t"
  62169. "lsl r6, r6, #16\n\t"
  62170. "adds r3, r3, r6\n\t"
  62171. "adcs r4, r4, r7\n\t"
  62172. "adc r5, r5, #0\n\t"
  62173. /* A[3] * B[6] */
  62174. "ldr r8, [%[a], #12]\n\t"
  62175. "ldr r9, [%[b], #24]\n\t"
  62176. "lsl r6, r8, #16\n\t"
  62177. "lsl r7, r9, #16\n\t"
  62178. "lsr r6, r6, #16\n\t"
  62179. "lsr r7, r7, #16\n\t"
  62180. "mul r7, r6, r7\n\t"
  62181. "adds r3, r3, r7\n\t"
  62182. "adcs r4, r4, #0\n\t"
  62183. "adc r5, r5, #0\n\t"
  62184. "lsr r7, r9, #16\n\t"
  62185. "mul r6, r7, r6\n\t"
  62186. "lsr r7, r6, #16\n\t"
  62187. "lsl r6, r6, #16\n\t"
  62188. "adds r3, r3, r6\n\t"
  62189. "adcs r4, r4, r7\n\t"
  62190. "adc r5, r5, #0\n\t"
  62191. "lsr r6, r8, #16\n\t"
  62192. "lsr r7, r9, #16\n\t"
  62193. "mul r7, r6, r7\n\t"
  62194. "adds r4, r4, r7\n\t"
  62195. "adc r5, r5, #0\n\t"
  62196. "lsl r7, r9, #16\n\t"
  62197. "lsr r7, r7, #16\n\t"
  62198. "mul r6, r7, r6\n\t"
  62199. "lsr r7, r6, #16\n\t"
  62200. "lsl r6, r6, #16\n\t"
  62201. "adds r3, r3, r6\n\t"
  62202. "adcs r4, r4, r7\n\t"
  62203. "adc r5, r5, #0\n\t"
  62204. /* A[4] * B[5] */
  62205. "ldr r9, [%[b], #20]\n\t"
  62206. "lsl r6, r11, #16\n\t"
  62207. "lsl r7, r9, #16\n\t"
  62208. "lsr r6, r6, #16\n\t"
  62209. "lsr r7, r7, #16\n\t"
  62210. "mul r7, r6, r7\n\t"
  62211. "adds r3, r3, r7\n\t"
  62212. "adcs r4, r4, #0\n\t"
  62213. "adc r5, r5, #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 r3, r3, r6\n\t"
  62219. "adcs r4, r4, r7\n\t"
  62220. "adc r5, r5, #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 r4, r4, r7\n\t"
  62225. "adc r5, r5, #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 r3, r3, r6\n\t"
  62232. "adcs r4, r4, r7\n\t"
  62233. "adc r5, r5, #0\n\t"
  62234. /* A[5] * B[4] */
  62235. "ldr r8, [%[a], #20]\n\t"
  62236. "lsl r6, r8, #16\n\t"
  62237. "lsl r7, r12, #16\n\t"
  62238. "lsr r6, r6, #16\n\t"
  62239. "lsr r7, r7, #16\n\t"
  62240. "mul r7, r6, r7\n\t"
  62241. "adds r3, r3, r7\n\t"
  62242. "adcs r4, r4, #0\n\t"
  62243. "adc r5, r5, #0\n\t"
  62244. "lsr r7, r12, #16\n\t"
  62245. "mul r6, r7, r6\n\t"
  62246. "lsr r7, r6, #16\n\t"
  62247. "lsl r6, r6, #16\n\t"
  62248. "adds r3, r3, r6\n\t"
  62249. "adcs r4, r4, r7\n\t"
  62250. "adc r5, r5, #0\n\t"
  62251. "lsr r6, r8, #16\n\t"
  62252. "lsr r7, r12, #16\n\t"
  62253. "mul r7, r6, r7\n\t"
  62254. "adds r4, r4, r7\n\t"
  62255. "adc r5, r5, #0\n\t"
  62256. "lsl r7, r12, #16\n\t"
  62257. "lsr r7, r7, #16\n\t"
  62258. "mul r6, r7, r6\n\t"
  62259. "lsr r7, r6, #16\n\t"
  62260. "lsl r6, r6, #16\n\t"
  62261. "adds r3, r3, r6\n\t"
  62262. "adcs r4, r4, r7\n\t"
  62263. "adc r5, r5, #0\n\t"
  62264. /* A[6] * B[3] */
  62265. "ldr r8, [%[a], #24]\n\t"
  62266. "ldr r9, [%[b], #12]\n\t"
  62267. "lsl r6, r8, #16\n\t"
  62268. "lsl r7, r9, #16\n\t"
  62269. "lsr r6, r6, #16\n\t"
  62270. "lsr r7, r7, #16\n\t"
  62271. "mul r7, r6, r7\n\t"
  62272. "adds r3, r3, r7\n\t"
  62273. "adcs r4, r4, #0\n\t"
  62274. "adc r5, r5, #0\n\t"
  62275. "lsr r7, r9, #16\n\t"
  62276. "mul r6, r7, r6\n\t"
  62277. "lsr r7, r6, #16\n\t"
  62278. "lsl r6, r6, #16\n\t"
  62279. "adds r3, r3, r6\n\t"
  62280. "adcs r4, r4, r7\n\t"
  62281. "adc r5, r5, #0\n\t"
  62282. "lsr r6, r8, #16\n\t"
  62283. "lsr r7, r9, #16\n\t"
  62284. "mul r7, r6, r7\n\t"
  62285. "adds r4, r4, r7\n\t"
  62286. "adc r5, r5, #0\n\t"
  62287. "lsl r7, r9, #16\n\t"
  62288. "lsr r7, r7, #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 r3, r3, r6\n\t"
  62293. "adcs r4, r4, r7\n\t"
  62294. "adc r5, r5, #0\n\t"
  62295. /* A[7] * B[2] */
  62296. "ldr r8, [%[a], #28]\n\t"
  62297. "ldr r9, [%[b], #8]\n\t"
  62298. "lsl r6, r8, #16\n\t"
  62299. "lsl r7, r9, #16\n\t"
  62300. "lsr r6, r6, #16\n\t"
  62301. "lsr r7, r7, #16\n\t"
  62302. "mul r7, r6, r7\n\t"
  62303. "adds r3, r3, r7\n\t"
  62304. "adcs r4, r4, #0\n\t"
  62305. "adc r5, r5, #0\n\t"
  62306. "lsr r7, r9, #16\n\t"
  62307. "mul r6, r7, r6\n\t"
  62308. "lsr r7, r6, #16\n\t"
  62309. "lsl r6, r6, #16\n\t"
  62310. "adds r3, r3, r6\n\t"
  62311. "adcs r4, r4, r7\n\t"
  62312. "adc r5, r5, #0\n\t"
  62313. "lsr r6, r8, #16\n\t"
  62314. "lsr r7, r9, #16\n\t"
  62315. "mul r7, r6, r7\n\t"
  62316. "adds r4, r4, r7\n\t"
  62317. "adc r5, r5, #0\n\t"
  62318. "lsl r7, r9, #16\n\t"
  62319. "lsr r7, r7, #16\n\t"
  62320. "mul r6, r7, r6\n\t"
  62321. "lsr r7, r6, #16\n\t"
  62322. "lsl r6, r6, #16\n\t"
  62323. "adds r3, r3, r6\n\t"
  62324. "adcs r4, r4, r7\n\t"
  62325. "adc r5, r5, #0\n\t"
  62326. "str r3, [%[r], #36]\n\t"
  62327. /* A[7] * B[3] */
  62328. "ldr r9, [%[b], #12]\n\t"
  62329. "lsl r6, r8, #16\n\t"
  62330. "lsl r7, r9, #16\n\t"
  62331. "lsr r6, r6, #16\n\t"
  62332. "lsr r7, r7, #16\n\t"
  62333. "mul r7, r6, r7\n\t"
  62334. "adds r4, r4, r7\n\t"
  62335. "adcs r5, r5, #0\n\t"
  62336. "mov r3, #0\n\t"
  62337. "adc r3, r3, #0\n\t"
  62338. "lsr r7, r9, #16\n\t"
  62339. "mul r6, r7, r6\n\t"
  62340. "lsr r7, r6, #16\n\t"
  62341. "lsl r6, r6, #16\n\t"
  62342. "adds r4, r4, r6\n\t"
  62343. "adcs r5, r5, r7\n\t"
  62344. "adc r3, r3, #0\n\t"
  62345. "lsr r6, r8, #16\n\t"
  62346. "lsr r7, r9, #16\n\t"
  62347. "mul r7, r6, r7\n\t"
  62348. "adds r5, r5, r7\n\t"
  62349. "adc r3, r3, #0\n\t"
  62350. "lsl r7, r9, #16\n\t"
  62351. "lsr r7, r7, #16\n\t"
  62352. "mul r6, r7, r6\n\t"
  62353. "lsr r7, r6, #16\n\t"
  62354. "lsl r6, r6, #16\n\t"
  62355. "adds r4, r4, r6\n\t"
  62356. "adcs r5, r5, r7\n\t"
  62357. "adc r3, r3, #0\n\t"
  62358. /* A[6] * B[4] */
  62359. "ldr r8, [%[a], #24]\n\t"
  62360. "lsl r6, r8, #16\n\t"
  62361. "lsl r7, r12, #16\n\t"
  62362. "lsr r6, r6, #16\n\t"
  62363. "lsr r7, r7, #16\n\t"
  62364. "mul r7, r6, r7\n\t"
  62365. "adds r4, r4, r7\n\t"
  62366. "adcs r5, r5, #0\n\t"
  62367. "adc r3, r3, #0\n\t"
  62368. "lsr r7, r12, #16\n\t"
  62369. "mul r6, r7, r6\n\t"
  62370. "lsr r7, r6, #16\n\t"
  62371. "lsl r6, r6, #16\n\t"
  62372. "adds r4, r4, r6\n\t"
  62373. "adcs r5, r5, r7\n\t"
  62374. "adc r3, r3, #0\n\t"
  62375. "lsr r6, r8, #16\n\t"
  62376. "lsr r7, r12, #16\n\t"
  62377. "mul r7, r6, r7\n\t"
  62378. "adds r5, r5, r7\n\t"
  62379. "adc r3, r3, #0\n\t"
  62380. "lsl r7, r12, #16\n\t"
  62381. "lsr r7, r7, #16\n\t"
  62382. "mul r6, r7, r6\n\t"
  62383. "lsr r7, r6, #16\n\t"
  62384. "lsl r6, r6, #16\n\t"
  62385. "adds r4, r4, r6\n\t"
  62386. "adcs r5, r5, r7\n\t"
  62387. "adc r3, r3, #0\n\t"
  62388. /* A[5] * B[5] */
  62389. "ldr r11, [%[a], #20]\n\t"
  62390. "ldr r12, [%[b], #20]\n\t"
  62391. "lsl r6, r11, #16\n\t"
  62392. "lsl r7, r12, #16\n\t"
  62393. "lsr r6, r6, #16\n\t"
  62394. "lsr r7, r7, #16\n\t"
  62395. "mul r7, r6, r7\n\t"
  62396. "adds r4, r4, r7\n\t"
  62397. "adcs r5, r5, #0\n\t"
  62398. "adc r3, r3, #0\n\t"
  62399. "lsr r7, r12, #16\n\t"
  62400. "mul r6, r7, r6\n\t"
  62401. "lsr r7, r6, #16\n\t"
  62402. "lsl r6, r6, #16\n\t"
  62403. "adds r4, r4, r6\n\t"
  62404. "adcs r5, r5, r7\n\t"
  62405. "adc r3, r3, #0\n\t"
  62406. "lsr r6, r11, #16\n\t"
  62407. "lsr r7, r12, #16\n\t"
  62408. "mul r7, r6, r7\n\t"
  62409. "adds r5, r5, r7\n\t"
  62410. "adc r3, r3, #0\n\t"
  62411. "lsl r7, r12, #16\n\t"
  62412. "lsr r7, r7, #16\n\t"
  62413. "mul r6, r7, r6\n\t"
  62414. "lsr r7, r6, #16\n\t"
  62415. "lsl r6, r6, #16\n\t"
  62416. "adds r4, r4, r6\n\t"
  62417. "adcs r5, r5, r7\n\t"
  62418. "adc r3, r3, #0\n\t"
  62419. /* A[4] * B[6] */
  62420. "ldr r8, [%[a], #16]\n\t"
  62421. "ldr r9, [%[b], #24]\n\t"
  62422. "lsl r6, r8, #16\n\t"
  62423. "lsl r7, r9, #16\n\t"
  62424. "lsr r6, r6, #16\n\t"
  62425. "lsr r7, r7, #16\n\t"
  62426. "mul r7, r6, r7\n\t"
  62427. "adds r4, r4, r7\n\t"
  62428. "adcs r5, r5, #0\n\t"
  62429. "adc r3, r3, #0\n\t"
  62430. "lsr r7, r9, #16\n\t"
  62431. "mul r6, r7, r6\n\t"
  62432. "lsr r7, r6, #16\n\t"
  62433. "lsl r6, r6, #16\n\t"
  62434. "adds r4, r4, r6\n\t"
  62435. "adcs r5, r5, r7\n\t"
  62436. "adc r3, r3, #0\n\t"
  62437. "lsr r6, r8, #16\n\t"
  62438. "lsr r7, r9, #16\n\t"
  62439. "mul r7, r6, r7\n\t"
  62440. "adds r5, r5, r7\n\t"
  62441. "adc r3, r3, #0\n\t"
  62442. "lsl r7, r9, #16\n\t"
  62443. "lsr r7, r7, #16\n\t"
  62444. "mul r6, r7, r6\n\t"
  62445. "lsr r7, r6, #16\n\t"
  62446. "lsl r6, r6, #16\n\t"
  62447. "adds r4, r4, r6\n\t"
  62448. "adcs r5, r5, r7\n\t"
  62449. "adc r3, r3, #0\n\t"
  62450. /* A[3] * B[7] */
  62451. "ldr r8, [%[a], #12]\n\t"
  62452. "ldr r9, [%[b], #28]\n\t"
  62453. "lsl r6, r8, #16\n\t"
  62454. "lsl r7, r9, #16\n\t"
  62455. "lsr r6, r6, #16\n\t"
  62456. "lsr r7, r7, #16\n\t"
  62457. "mul r7, r6, r7\n\t"
  62458. "adds r4, r4, r7\n\t"
  62459. "adcs r5, r5, #0\n\t"
  62460. "adc r3, r3, #0\n\t"
  62461. "lsr r7, r9, #16\n\t"
  62462. "mul r6, r7, r6\n\t"
  62463. "lsr r7, r6, #16\n\t"
  62464. "lsl r6, r6, #16\n\t"
  62465. "adds r4, r4, r6\n\t"
  62466. "adcs r5, r5, r7\n\t"
  62467. "adc r3, r3, #0\n\t"
  62468. "lsr r6, r8, #16\n\t"
  62469. "lsr r7, r9, #16\n\t"
  62470. "mul r7, r6, r7\n\t"
  62471. "adds r5, r5, r7\n\t"
  62472. "adc r3, r3, #0\n\t"
  62473. "lsl r7, r9, #16\n\t"
  62474. "lsr r7, r7, #16\n\t"
  62475. "mul r6, r7, r6\n\t"
  62476. "lsr r7, r6, #16\n\t"
  62477. "lsl r6, r6, #16\n\t"
  62478. "adds r4, r4, r6\n\t"
  62479. "adcs r5, r5, r7\n\t"
  62480. "adc r3, r3, #0\n\t"
  62481. "str r4, [%[r], #40]\n\t"
  62482. /* A[4] * B[7] */
  62483. "ldr r8, [%[a], #16]\n\t"
  62484. "lsl r6, r8, #16\n\t"
  62485. "lsl r7, r9, #16\n\t"
  62486. "lsr r6, r6, #16\n\t"
  62487. "lsr r7, r7, #16\n\t"
  62488. "mul r7, r6, r7\n\t"
  62489. "adds r5, r5, r7\n\t"
  62490. "adcs r3, r3, #0\n\t"
  62491. "mov r4, #0\n\t"
  62492. "adc r4, r4, #0\n\t"
  62493. "lsr r7, r9, #16\n\t"
  62494. "mul r6, r7, r6\n\t"
  62495. "lsr r7, r6, #16\n\t"
  62496. "lsl r6, r6, #16\n\t"
  62497. "adds r5, r5, r6\n\t"
  62498. "adcs r3, r3, r7\n\t"
  62499. "adc r4, r4, #0\n\t"
  62500. "lsr r6, r8, #16\n\t"
  62501. "lsr r7, r9, #16\n\t"
  62502. "mul r7, r6, r7\n\t"
  62503. "adds r3, r3, r7\n\t"
  62504. "adc r4, r4, #0\n\t"
  62505. "lsl r7, r9, #16\n\t"
  62506. "lsr r7, r7, #16\n\t"
  62507. "mul r6, r7, r6\n\t"
  62508. "lsr r7, r6, #16\n\t"
  62509. "lsl r6, r6, #16\n\t"
  62510. "adds r5, r5, r6\n\t"
  62511. "adcs r3, r3, r7\n\t"
  62512. "adc r4, r4, #0\n\t"
  62513. /* A[5] * B[6] */
  62514. "ldr r9, [%[b], #24]\n\t"
  62515. "lsl r6, r11, #16\n\t"
  62516. "lsl r7, r9, #16\n\t"
  62517. "lsr r6, r6, #16\n\t"
  62518. "lsr r7, r7, #16\n\t"
  62519. "mul r7, r6, r7\n\t"
  62520. "adds r5, r5, r7\n\t"
  62521. "adcs r3, r3, #0\n\t"
  62522. "adc r4, r4, #0\n\t"
  62523. "lsr r7, r9, #16\n\t"
  62524. "mul r6, r7, r6\n\t"
  62525. "lsr r7, r6, #16\n\t"
  62526. "lsl r6, r6, #16\n\t"
  62527. "adds r5, r5, r6\n\t"
  62528. "adcs r3, r3, r7\n\t"
  62529. "adc r4, r4, #0\n\t"
  62530. "lsr r6, r11, #16\n\t"
  62531. "lsr r7, r9, #16\n\t"
  62532. "mul r7, r6, r7\n\t"
  62533. "adds r3, r3, r7\n\t"
  62534. "adc r4, r4, #0\n\t"
  62535. "lsl r7, r9, #16\n\t"
  62536. "lsr r7, r7, #16\n\t"
  62537. "mul r6, r7, r6\n\t"
  62538. "lsr r7, r6, #16\n\t"
  62539. "lsl r6, r6, #16\n\t"
  62540. "adds r5, r5, r6\n\t"
  62541. "adcs r3, r3, r7\n\t"
  62542. "adc r4, r4, #0\n\t"
  62543. /* A[6] * B[5] */
  62544. "ldr r8, [%[a], #24]\n\t"
  62545. "lsl r6, r8, #16\n\t"
  62546. "lsl r7, r12, #16\n\t"
  62547. "lsr r6, r6, #16\n\t"
  62548. "lsr r7, r7, #16\n\t"
  62549. "mul r7, r6, r7\n\t"
  62550. "adds r5, r5, r7\n\t"
  62551. "adcs r3, r3, #0\n\t"
  62552. "adc r4, r4, #0\n\t"
  62553. "lsr r7, r12, #16\n\t"
  62554. "mul r6, r7, r6\n\t"
  62555. "lsr r7, r6, #16\n\t"
  62556. "lsl r6, r6, #16\n\t"
  62557. "adds r5, r5, r6\n\t"
  62558. "adcs r3, r3, r7\n\t"
  62559. "adc r4, r4, #0\n\t"
  62560. "lsr r6, r8, #16\n\t"
  62561. "lsr r7, r12, #16\n\t"
  62562. "mul r7, r6, r7\n\t"
  62563. "adds r3, r3, r7\n\t"
  62564. "adc r4, r4, #0\n\t"
  62565. "lsl r7, r12, #16\n\t"
  62566. "lsr r7, r7, #16\n\t"
  62567. "mul r6, r7, r6\n\t"
  62568. "lsr r7, r6, #16\n\t"
  62569. "lsl r6, r6, #16\n\t"
  62570. "adds r5, r5, r6\n\t"
  62571. "adcs r3, r3, r7\n\t"
  62572. "adc r4, r4, #0\n\t"
  62573. /* A[7] * B[4] */
  62574. "ldr r8, [%[a], #28]\n\t"
  62575. "ldr r9, [%[b], #16]\n\t"
  62576. "lsl r6, r8, #16\n\t"
  62577. "lsl r7, r9, #16\n\t"
  62578. "lsr r6, r6, #16\n\t"
  62579. "lsr r7, r7, #16\n\t"
  62580. "mul r7, r6, r7\n\t"
  62581. "adds r5, r5, r7\n\t"
  62582. "adcs r3, r3, #0\n\t"
  62583. "adc r4, r4, #0\n\t"
  62584. "lsr r7, r9, #16\n\t"
  62585. "mul r6, r7, r6\n\t"
  62586. "lsr r7, r6, #16\n\t"
  62587. "lsl r6, r6, #16\n\t"
  62588. "adds r5, r5, r6\n\t"
  62589. "adcs r3, r3, r7\n\t"
  62590. "adc r4, r4, #0\n\t"
  62591. "lsr r6, r8, #16\n\t"
  62592. "lsr r7, r9, #16\n\t"
  62593. "mul r7, r6, r7\n\t"
  62594. "adds r3, r3, r7\n\t"
  62595. "adc r4, r4, #0\n\t"
  62596. "lsl r7, r9, #16\n\t"
  62597. "lsr r7, r7, #16\n\t"
  62598. "mul r6, r7, r6\n\t"
  62599. "lsr r7, r6, #16\n\t"
  62600. "lsl r6, r6, #16\n\t"
  62601. "adds r5, r5, r6\n\t"
  62602. "adcs r3, r3, r7\n\t"
  62603. "adc r4, r4, #0\n\t"
  62604. "str r5, [%[r], #44]\n\t"
  62605. /* A[7] * B[5] */
  62606. "lsl r6, r8, #16\n\t"
  62607. "lsl r7, r12, #16\n\t"
  62608. "lsr r6, r6, #16\n\t"
  62609. "lsr r7, r7, #16\n\t"
  62610. "mul r7, r6, r7\n\t"
  62611. "adds r3, r3, r7\n\t"
  62612. "adcs r4, r4, #0\n\t"
  62613. "mov r5, #0\n\t"
  62614. "adc r5, r5, #0\n\t"
  62615. "lsr r7, r12, #16\n\t"
  62616. "mul r6, r7, r6\n\t"
  62617. "lsr r7, r6, #16\n\t"
  62618. "lsl r6, r6, #16\n\t"
  62619. "adds r3, r3, r6\n\t"
  62620. "adcs r4, r4, r7\n\t"
  62621. "adc r5, r5, #0\n\t"
  62622. "lsr r6, r8, #16\n\t"
  62623. "lsr r7, r12, #16\n\t"
  62624. "mul r7, r6, r7\n\t"
  62625. "adds r4, r4, r7\n\t"
  62626. "adc r5, r5, #0\n\t"
  62627. "lsl r7, r12, #16\n\t"
  62628. "lsr r7, r7, #16\n\t"
  62629. "mul r6, r7, r6\n\t"
  62630. "lsr r7, r6, #16\n\t"
  62631. "lsl r6, r6, #16\n\t"
  62632. "adds r3, r3, r6\n\t"
  62633. "adcs r4, r4, r7\n\t"
  62634. "adc r5, r5, #0\n\t"
  62635. /* A[6] * B[6] */
  62636. "ldr r11, [%[a], #24]\n\t"
  62637. "ldr r12, [%[b], #24]\n\t"
  62638. "lsl r6, r11, #16\n\t"
  62639. "lsl r7, r12, #16\n\t"
  62640. "lsr r6, r6, #16\n\t"
  62641. "lsr r7, r7, #16\n\t"
  62642. "mul r7, r6, r7\n\t"
  62643. "adds r3, r3, r7\n\t"
  62644. "adcs r4, r4, #0\n\t"
  62645. "adc r5, r5, #0\n\t"
  62646. "lsr r7, r12, #16\n\t"
  62647. "mul r6, r7, r6\n\t"
  62648. "lsr r7, r6, #16\n\t"
  62649. "lsl r6, r6, #16\n\t"
  62650. "adds r3, r3, r6\n\t"
  62651. "adcs r4, r4, r7\n\t"
  62652. "adc r5, r5, #0\n\t"
  62653. "lsr r6, r11, #16\n\t"
  62654. "lsr r7, r12, #16\n\t"
  62655. "mul r7, r6, r7\n\t"
  62656. "adds r4, r4, r7\n\t"
  62657. "adc r5, r5, #0\n\t"
  62658. "lsl r7, r12, #16\n\t"
  62659. "lsr r7, r7, #16\n\t"
  62660. "mul r6, r7, r6\n\t"
  62661. "lsr r7, r6, #16\n\t"
  62662. "lsl r6, r6, #16\n\t"
  62663. "adds r3, r3, r6\n\t"
  62664. "adcs r4, r4, r7\n\t"
  62665. "adc r5, r5, #0\n\t"
  62666. /* A[5] * B[7] */
  62667. "ldr r8, [%[a], #20]\n\t"
  62668. "ldr r9, [%[b], #28]\n\t"
  62669. "lsl r6, r8, #16\n\t"
  62670. "lsl r7, r9, #16\n\t"
  62671. "lsr r6, r6, #16\n\t"
  62672. "lsr r7, r7, #16\n\t"
  62673. "mul r7, r6, r7\n\t"
  62674. "adds r3, r3, r7\n\t"
  62675. "adcs r4, r4, #0\n\t"
  62676. "adc r5, r5, #0\n\t"
  62677. "lsr r7, r9, #16\n\t"
  62678. "mul r6, r7, r6\n\t"
  62679. "lsr r7, r6, #16\n\t"
  62680. "lsl r6, r6, #16\n\t"
  62681. "adds r3, r3, r6\n\t"
  62682. "adcs r4, r4, r7\n\t"
  62683. "adc r5, r5, #0\n\t"
  62684. "lsr r6, r8, #16\n\t"
  62685. "lsr r7, r9, #16\n\t"
  62686. "mul r7, r6, r7\n\t"
  62687. "adds r4, r4, r7\n\t"
  62688. "adc r5, r5, #0\n\t"
  62689. "lsl r7, r9, #16\n\t"
  62690. "lsr r7, r7, #16\n\t"
  62691. "mul r6, r7, r6\n\t"
  62692. "lsr r7, r6, #16\n\t"
  62693. "lsl r6, r6, #16\n\t"
  62694. "adds r3, r3, r6\n\t"
  62695. "adcs r4, r4, r7\n\t"
  62696. "adc r5, r5, #0\n\t"
  62697. "str r3, [%[r], #48]\n\t"
  62698. /* A[6] * B[7] */
  62699. "lsl r6, r11, #16\n\t"
  62700. "lsl r7, r9, #16\n\t"
  62701. "lsr r6, r6, #16\n\t"
  62702. "lsr r7, r7, #16\n\t"
  62703. "mul r7, r6, r7\n\t"
  62704. "adds r4, r4, r7\n\t"
  62705. "adcs r5, r5, #0\n\t"
  62706. "mov r3, #0\n\t"
  62707. "adc r3, r3, #0\n\t"
  62708. "lsr r7, r9, #16\n\t"
  62709. "mul r6, r7, r6\n\t"
  62710. "lsr r7, r6, #16\n\t"
  62711. "lsl r6, r6, #16\n\t"
  62712. "adds r4, r4, r6\n\t"
  62713. "adcs r5, r5, r7\n\t"
  62714. "adc r3, r3, #0\n\t"
  62715. "lsr r6, r11, #16\n\t"
  62716. "lsr r7, r9, #16\n\t"
  62717. "mul r7, r6, r7\n\t"
  62718. "adds r5, r5, r7\n\t"
  62719. "adc r3, r3, #0\n\t"
  62720. "lsl r7, r9, #16\n\t"
  62721. "lsr r7, r7, #16\n\t"
  62722. "mul r6, r7, r6\n\t"
  62723. "lsr r7, r6, #16\n\t"
  62724. "lsl r6, r6, #16\n\t"
  62725. "adds r4, r4, r6\n\t"
  62726. "adcs r5, r5, r7\n\t"
  62727. "adc r3, r3, #0\n\t"
  62728. /* A[7] * B[6] */
  62729. "ldr r8, [%[a], #28]\n\t"
  62730. "lsl r6, r8, #16\n\t"
  62731. "lsl r7, r12, #16\n\t"
  62732. "lsr r6, r6, #16\n\t"
  62733. "lsr r7, r7, #16\n\t"
  62734. "mul r7, r6, r7\n\t"
  62735. "adds r4, r4, r7\n\t"
  62736. "adcs r5, r5, #0\n\t"
  62737. "adc r3, r3, #0\n\t"
  62738. "lsr r7, r12, #16\n\t"
  62739. "mul r6, r7, r6\n\t"
  62740. "lsr r7, r6, #16\n\t"
  62741. "lsl r6, r6, #16\n\t"
  62742. "adds r4, r4, r6\n\t"
  62743. "adcs r5, r5, r7\n\t"
  62744. "adc r3, r3, #0\n\t"
  62745. "lsr r6, r8, #16\n\t"
  62746. "lsr r7, r12, #16\n\t"
  62747. "mul r7, r6, r7\n\t"
  62748. "adds r5, r5, r7\n\t"
  62749. "adc r3, r3, #0\n\t"
  62750. "lsl r7, r12, #16\n\t"
  62751. "lsr r7, r7, #16\n\t"
  62752. "mul r6, r7, r6\n\t"
  62753. "lsr r7, r6, #16\n\t"
  62754. "lsl r6, r6, #16\n\t"
  62755. "adds r4, r4, r6\n\t"
  62756. "adcs r5, r5, r7\n\t"
  62757. "adc r3, r3, #0\n\t"
  62758. "str r4, [%[r], #52]\n\t"
  62759. /* A[7] * B[7] */
  62760. "lsl r6, r8, #16\n\t"
  62761. "lsl r7, r9, #16\n\t"
  62762. "lsr r6, r6, #16\n\t"
  62763. "lsr r7, r7, #16\n\t"
  62764. "mul r7, r6, r7\n\t"
  62765. "adds r5, r5, r7\n\t"
  62766. "adc r3, r3, #0\n\t"
  62767. "lsr r7, r9, #16\n\t"
  62768. "mul r6, r7, r6\n\t"
  62769. "lsr r7, r6, #16\n\t"
  62770. "lsl r6, r6, #16\n\t"
  62771. "adds r5, r5, r6\n\t"
  62772. "adc r3, r3, r7\n\t"
  62773. "lsr r6, r8, #16\n\t"
  62774. "lsr r7, r9, #16\n\t"
  62775. "mul r7, r6, r7\n\t"
  62776. "add r3, r3, r7\n\t"
  62777. "lsl r7, r9, #16\n\t"
  62778. "lsr r7, r7, #16\n\t"
  62779. "mul r6, r7, r6\n\t"
  62780. "lsr r7, r6, #16\n\t"
  62781. "lsl r6, r6, #16\n\t"
  62782. "adds r5, r5, r6\n\t"
  62783. "adc r3, r3, r7\n\t"
  62784. "str r5, [%[r], #56]\n\t"
  62785. "str r3, [%[r], #60]\n\t"
  62786. "ldm sp!, {r3, r4, r5, r6}\n\t"
  62787. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  62788. "ldm sp!, {r3, r4, r5, r6}\n\t"
  62789. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  62790. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  62791. :
  62792. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r11", "r12", "cc"
  62793. );
  62794. }
  62795. #elif defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  62796. /* Multiply a and b into r. (r = a * b)
  62797. *
  62798. * r A single precision integer.
  62799. * a A single precision integer.
  62800. * b A single precision integer.
  62801. */
  62802. static void sp_256_mul_8(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p)
  62803. {
  62804. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  62805. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  62806. register const sp_digit* b asm ("r2") = (const sp_digit*)b_p;
  62807. __asm__ __volatile__ (
  62808. "sub sp, sp, #36\n\t"
  62809. "str %[r], [sp, #32]\n\t"
  62810. "mov %[r], #0\n\t"
  62811. "ldr r12, [%[a]]\n\t"
  62812. /* A[0] * B[0] */
  62813. "ldr lr, [%[b]]\n\t"
  62814. "umull r3, r4, r12, lr\n\t"
  62815. /* A[0] * B[2] */
  62816. "ldr lr, [%[b], #8]\n\t"
  62817. "umull r5, r6, r12, lr\n\t"
  62818. /* A[0] * B[4] */
  62819. "ldr lr, [%[b], #16]\n\t"
  62820. "umull r7, r8, r12, lr\n\t"
  62821. /* A[0] * B[6] */
  62822. "ldr lr, [%[b], #24]\n\t"
  62823. "umull r9, r10, r12, lr\n\t"
  62824. "str r3, [sp]\n\t"
  62825. /* A[0] * B[1] */
  62826. "ldr lr, [%[b], #4]\n\t"
  62827. "mov r11, %[r]\n\t"
  62828. "umlal r4, r11, r12, lr\n\t"
  62829. "adds r5, r5, r11\n\t"
  62830. /* A[0] * B[3] */
  62831. "ldr lr, [%[b], #12]\n\t"
  62832. "adcs r6, r6, #0\n\t"
  62833. "adc r11, %[r], #0\n\t"
  62834. "umlal r6, r11, r12, lr\n\t"
  62835. "adds r7, r7, r11\n\t"
  62836. /* A[0] * B[5] */
  62837. "ldr lr, [%[b], #20]\n\t"
  62838. "adcs r8, r8, #0\n\t"
  62839. "adc r11, %[r], #0\n\t"
  62840. "umlal r8, r11, r12, lr\n\t"
  62841. "adds r9, r9, r11\n\t"
  62842. /* A[0] * B[7] */
  62843. "ldr lr, [%[b], #28]\n\t"
  62844. "adcs r10, r10, #0\n\t"
  62845. "adc r3, %[r], #0\n\t"
  62846. "umlal r10, r3, r12, lr\n\t"
  62847. /* A[1] * B[0] */
  62848. "ldr r12, [%[a], #4]\n\t"
  62849. "ldr lr, [%[b]]\n\t"
  62850. "mov r11, #0\n\t"
  62851. "umlal r4, r11, r12, lr\n\t"
  62852. "str r4, [sp, #4]\n\t"
  62853. "adds r5, r5, r11\n\t"
  62854. /* A[1] * B[1] */
  62855. "ldr lr, [%[b], #4]\n\t"
  62856. "adc r11, %[r], #0\n\t"
  62857. "umlal r5, r11, r12, lr\n\t"
  62858. "adds r6, r6, r11\n\t"
  62859. /* A[1] * B[2] */
  62860. "ldr lr, [%[b], #8]\n\t"
  62861. "adc r11, %[r], #0\n\t"
  62862. "umlal r6, r11, r12, lr\n\t"
  62863. "adds r7, r7, r11\n\t"
  62864. /* A[1] * B[3] */
  62865. "ldr lr, [%[b], #12]\n\t"
  62866. "adc r11, %[r], #0\n\t"
  62867. "umlal r7, r11, r12, lr\n\t"
  62868. "adds r8, r8, r11\n\t"
  62869. /* A[1] * B[4] */
  62870. "ldr lr, [%[b], #16]\n\t"
  62871. "adc r11, %[r], #0\n\t"
  62872. "umlal r8, r11, r12, lr\n\t"
  62873. "adds r9, r9, r11\n\t"
  62874. /* A[1] * B[5] */
  62875. "ldr lr, [%[b], #20]\n\t"
  62876. "adc r11, %[r], #0\n\t"
  62877. "umlal r9, r11, r12, lr\n\t"
  62878. "adds r10, r10, r11\n\t"
  62879. /* A[1] * B[6] */
  62880. "ldr lr, [%[b], #24]\n\t"
  62881. "adc r11, %[r], #0\n\t"
  62882. "umlal r10, r11, r12, lr\n\t"
  62883. "adds r3, r3, r11\n\t"
  62884. /* A[1] * B[7] */
  62885. "ldr lr, [%[b], #28]\n\t"
  62886. "adc r4, %[r], #0\n\t"
  62887. "umlal r3, r4, r12, lr\n\t"
  62888. /* A[2] * B[0] */
  62889. "ldr r12, [%[a], #8]\n\t"
  62890. "ldr lr, [%[b]]\n\t"
  62891. "mov r11, #0\n\t"
  62892. "umlal r5, r11, r12, lr\n\t"
  62893. "str r5, [sp, #8]\n\t"
  62894. "adds r6, r6, r11\n\t"
  62895. /* A[2] * B[1] */
  62896. "ldr lr, [%[b], #4]\n\t"
  62897. "adc r11, %[r], #0\n\t"
  62898. "umlal r6, r11, r12, lr\n\t"
  62899. "adds r7, r7, r11\n\t"
  62900. /* A[2] * B[2] */
  62901. "ldr lr, [%[b], #8]\n\t"
  62902. "adc r11, %[r], #0\n\t"
  62903. "umlal r7, r11, r12, lr\n\t"
  62904. "adds r8, r8, r11\n\t"
  62905. /* A[2] * B[3] */
  62906. "ldr lr, [%[b], #12]\n\t"
  62907. "adc r11, %[r], #0\n\t"
  62908. "umlal r8, r11, r12, lr\n\t"
  62909. "adds r9, r9, r11\n\t"
  62910. /* A[2] * B[4] */
  62911. "ldr lr, [%[b], #16]\n\t"
  62912. "adc r11, %[r], #0\n\t"
  62913. "umlal r9, r11, r12, lr\n\t"
  62914. "adds r10, r10, r11\n\t"
  62915. /* A[2] * B[5] */
  62916. "ldr lr, [%[b], #20]\n\t"
  62917. "adc r11, %[r], #0\n\t"
  62918. "umlal r10, r11, r12, lr\n\t"
  62919. "adds r3, r3, r11\n\t"
  62920. /* A[2] * B[6] */
  62921. "ldr lr, [%[b], #24]\n\t"
  62922. "adc r11, %[r], #0\n\t"
  62923. "umlal r3, r11, r12, lr\n\t"
  62924. "adds r4, r4, r11\n\t"
  62925. /* A[2] * B[7] */
  62926. "ldr lr, [%[b], #28]\n\t"
  62927. "adc r5, %[r], #0\n\t"
  62928. "umlal r4, r5, r12, lr\n\t"
  62929. /* A[3] * B[0] */
  62930. "ldr r12, [%[a], #12]\n\t"
  62931. "ldr lr, [%[b]]\n\t"
  62932. "mov r11, #0\n\t"
  62933. "umlal r6, r11, r12, lr\n\t"
  62934. "str r6, [sp, #12]\n\t"
  62935. "adds r7, r7, r11\n\t"
  62936. /* A[3] * B[1] */
  62937. "ldr lr, [%[b], #4]\n\t"
  62938. "adc r11, %[r], #0\n\t"
  62939. "umlal r7, r11, r12, lr\n\t"
  62940. "adds r8, r8, r11\n\t"
  62941. /* A[3] * B[2] */
  62942. "ldr lr, [%[b], #8]\n\t"
  62943. "adc r11, %[r], #0\n\t"
  62944. "umlal r8, r11, r12, lr\n\t"
  62945. "adds r9, r9, r11\n\t"
  62946. /* A[3] * B[3] */
  62947. "ldr lr, [%[b], #12]\n\t"
  62948. "adc r11, %[r], #0\n\t"
  62949. "umlal r9, r11, r12, lr\n\t"
  62950. "adds r10, r10, r11\n\t"
  62951. /* A[3] * B[4] */
  62952. "ldr lr, [%[b], #16]\n\t"
  62953. "adc r11, %[r], #0\n\t"
  62954. "umlal r10, r11, r12, lr\n\t"
  62955. "adds r3, r3, r11\n\t"
  62956. /* A[3] * B[5] */
  62957. "ldr lr, [%[b], #20]\n\t"
  62958. "adc r11, %[r], #0\n\t"
  62959. "umlal r3, r11, r12, lr\n\t"
  62960. "adds r4, r4, r11\n\t"
  62961. /* A[3] * B[6] */
  62962. "ldr lr, [%[b], #24]\n\t"
  62963. "adc r11, %[r], #0\n\t"
  62964. "umlal r4, r11, r12, lr\n\t"
  62965. "adds r5, r5, r11\n\t"
  62966. /* A[3] * B[7] */
  62967. "ldr lr, [%[b], #28]\n\t"
  62968. "adc r6, %[r], #0\n\t"
  62969. "umlal r5, r6, r12, lr\n\t"
  62970. /* A[4] * B[0] */
  62971. "ldr r12, [%[a], #16]\n\t"
  62972. "ldr lr, [%[b]]\n\t"
  62973. "mov r11, #0\n\t"
  62974. "umlal r7, r11, r12, lr\n\t"
  62975. "str r7, [sp, #16]\n\t"
  62976. "adds r8, r8, r11\n\t"
  62977. /* A[4] * B[1] */
  62978. "ldr lr, [%[b], #4]\n\t"
  62979. "adc r11, %[r], #0\n\t"
  62980. "umlal r8, r11, r12, lr\n\t"
  62981. "adds r9, r9, r11\n\t"
  62982. /* A[4] * B[2] */
  62983. "ldr lr, [%[b], #8]\n\t"
  62984. "adc r11, %[r], #0\n\t"
  62985. "umlal r9, r11, r12, lr\n\t"
  62986. "adds r10, r10, r11\n\t"
  62987. /* A[4] * B[3] */
  62988. "ldr lr, [%[b], #12]\n\t"
  62989. "adc r11, %[r], #0\n\t"
  62990. "umlal r10, r11, r12, lr\n\t"
  62991. "adds r3, r3, r11\n\t"
  62992. /* A[4] * B[4] */
  62993. "ldr lr, [%[b], #16]\n\t"
  62994. "adc r11, %[r], #0\n\t"
  62995. "umlal r3, r11, r12, lr\n\t"
  62996. "adds r4, r4, r11\n\t"
  62997. /* A[4] * B[5] */
  62998. "ldr lr, [%[b], #20]\n\t"
  62999. "adc r11, %[r], #0\n\t"
  63000. "umlal r4, r11, r12, lr\n\t"
  63001. "adds r5, r5, r11\n\t"
  63002. /* A[4] * B[6] */
  63003. "ldr lr, [%[b], #24]\n\t"
  63004. "adc r11, %[r], #0\n\t"
  63005. "umlal r5, r11, r12, lr\n\t"
  63006. "adds r6, r6, r11\n\t"
  63007. /* A[4] * B[7] */
  63008. "ldr lr, [%[b], #28]\n\t"
  63009. "adc r7, %[r], #0\n\t"
  63010. "umlal r6, r7, r12, lr\n\t"
  63011. /* A[5] * B[0] */
  63012. "ldr r12, [%[a], #20]\n\t"
  63013. "ldr lr, [%[b]]\n\t"
  63014. "mov r11, #0\n\t"
  63015. "umlal r8, r11, r12, lr\n\t"
  63016. "str r8, [sp, #20]\n\t"
  63017. "adds r9, r9, r11\n\t"
  63018. /* A[5] * B[1] */
  63019. "ldr lr, [%[b], #4]\n\t"
  63020. "adc r11, %[r], #0\n\t"
  63021. "umlal r9, r11, r12, lr\n\t"
  63022. "adds r10, r10, r11\n\t"
  63023. /* A[5] * B[2] */
  63024. "ldr lr, [%[b], #8]\n\t"
  63025. "adc r11, %[r], #0\n\t"
  63026. "umlal r10, r11, r12, lr\n\t"
  63027. "adds r3, r3, r11\n\t"
  63028. /* A[5] * B[3] */
  63029. "ldr lr, [%[b], #12]\n\t"
  63030. "adc r11, %[r], #0\n\t"
  63031. "umlal r3, r11, r12, lr\n\t"
  63032. "adds r4, r4, r11\n\t"
  63033. /* A[5] * B[4] */
  63034. "ldr lr, [%[b], #16]\n\t"
  63035. "adc r11, %[r], #0\n\t"
  63036. "umlal r4, r11, r12, lr\n\t"
  63037. "adds r5, r5, r11\n\t"
  63038. /* A[5] * B[5] */
  63039. "ldr lr, [%[b], #20]\n\t"
  63040. "adc r11, %[r], #0\n\t"
  63041. "umlal r5, r11, r12, lr\n\t"
  63042. "adds r6, r6, r11\n\t"
  63043. /* A[5] * B[6] */
  63044. "ldr lr, [%[b], #24]\n\t"
  63045. "adc r11, %[r], #0\n\t"
  63046. "umlal r6, r11, r12, lr\n\t"
  63047. "adds r7, r7, r11\n\t"
  63048. /* A[5] * B[7] */
  63049. "ldr lr, [%[b], #28]\n\t"
  63050. "adc r8, %[r], #0\n\t"
  63051. "umlal r7, r8, r12, lr\n\t"
  63052. /* A[6] * B[0] */
  63053. "ldr r12, [%[a], #24]\n\t"
  63054. "ldr lr, [%[b]]\n\t"
  63055. "mov r11, #0\n\t"
  63056. "umlal r9, r11, r12, lr\n\t"
  63057. "str r9, [sp, #24]\n\t"
  63058. "adds r10, r10, r11\n\t"
  63059. /* A[6] * B[1] */
  63060. "ldr lr, [%[b], #4]\n\t"
  63061. "adc r11, %[r], #0\n\t"
  63062. "umlal r10, r11, r12, lr\n\t"
  63063. "adds r3, r3, r11\n\t"
  63064. /* A[6] * B[2] */
  63065. "ldr lr, [%[b], #8]\n\t"
  63066. "adc r11, %[r], #0\n\t"
  63067. "umlal r3, r11, r12, lr\n\t"
  63068. "adds r4, r4, r11\n\t"
  63069. /* A[6] * B[3] */
  63070. "ldr lr, [%[b], #12]\n\t"
  63071. "adc r11, %[r], #0\n\t"
  63072. "umlal r4, r11, r12, lr\n\t"
  63073. "adds r5, r5, r11\n\t"
  63074. /* A[6] * B[4] */
  63075. "ldr lr, [%[b], #16]\n\t"
  63076. "adc r11, %[r], #0\n\t"
  63077. "umlal r5, r11, r12, lr\n\t"
  63078. "adds r6, r6, r11\n\t"
  63079. /* A[6] * B[5] */
  63080. "ldr lr, [%[b], #20]\n\t"
  63081. "adc r11, %[r], #0\n\t"
  63082. "umlal r6, r11, r12, lr\n\t"
  63083. "adds r7, r7, r11\n\t"
  63084. /* A[6] * B[6] */
  63085. "ldr lr, [%[b], #24]\n\t"
  63086. "adc r11, %[r], #0\n\t"
  63087. "umlal r7, r11, r12, lr\n\t"
  63088. "adds r8, r8, r11\n\t"
  63089. /* A[6] * B[7] */
  63090. "ldr lr, [%[b], #28]\n\t"
  63091. "adc r9, %[r], #0\n\t"
  63092. "umlal r8, r9, r12, lr\n\t"
  63093. /* A[7] * B[0] */
  63094. "ldr r12, [%[a], #28]\n\t"
  63095. "ldr lr, [%[b]]\n\t"
  63096. "mov r11, #0\n\t"
  63097. "umlal r10, r11, r12, lr\n\t"
  63098. "str r10, [sp, #28]\n\t"
  63099. "adds r3, r3, r11\n\t"
  63100. /* A[7] * B[1] */
  63101. "ldr lr, [%[b], #4]\n\t"
  63102. "adc r11, %[r], #0\n\t"
  63103. "umlal r3, r11, r12, lr\n\t"
  63104. "adds r4, r4, r11\n\t"
  63105. /* A[7] * B[2] */
  63106. "ldr lr, [%[b], #8]\n\t"
  63107. "adc r11, %[r], #0\n\t"
  63108. "umlal r4, r11, r12, lr\n\t"
  63109. "adds r5, r5, r11\n\t"
  63110. /* A[7] * B[3] */
  63111. "ldr lr, [%[b], #12]\n\t"
  63112. "adc r11, %[r], #0\n\t"
  63113. "umlal r5, r11, r12, lr\n\t"
  63114. "adds r6, r6, r11\n\t"
  63115. /* A[7] * B[4] */
  63116. "ldr lr, [%[b], #16]\n\t"
  63117. "adc r11, %[r], #0\n\t"
  63118. "umlal r6, r11, r12, lr\n\t"
  63119. "adds r7, r7, r11\n\t"
  63120. /* A[7] * B[5] */
  63121. "ldr lr, [%[b], #20]\n\t"
  63122. "adc r11, %[r], #0\n\t"
  63123. "umlal r7, r11, r12, lr\n\t"
  63124. "adds r8, r8, r11\n\t"
  63125. /* A[7] * B[6] */
  63126. "ldr lr, [%[b], #24]\n\t"
  63127. "adc r11, %[r], #0\n\t"
  63128. "umlal r8, r11, r12, lr\n\t"
  63129. "adds r9, r9, r11\n\t"
  63130. /* A[7] * B[7] */
  63131. "ldr lr, [%[b], #28]\n\t"
  63132. "adc r10, %[r], #0\n\t"
  63133. "umlal r9, r10, r12, lr\n\t"
  63134. "ldr %[r], [sp, #32]\n\t"
  63135. "add %[r], %[r], #32\n\t"
  63136. "stm %[r], {r3, r4, r5, r6, r7, r8, r9, r10}\n\t"
  63137. "ldm sp, {r3, r4, r5, r6, r7, r8, r9, r10}\n\t"
  63138. "sub %[r], %[r], #32\n\t"
  63139. "stm %[r], {r3, r4, r5, r6, r7, r8, r9, r10}\n\t"
  63140. "add sp, sp, #36\n\t"
  63141. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  63142. :
  63143. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "lr", "cc"
  63144. );
  63145. }
  63146. #else
  63147. /* Multiply a and b into r. (r = a * b)
  63148. *
  63149. * r A single precision integer.
  63150. * a A single precision integer.
  63151. * b A single precision integer.
  63152. */
  63153. static void sp_256_mul_8(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p)
  63154. {
  63155. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  63156. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  63157. register const sp_digit* b asm ("r2") = (const sp_digit*)b_p;
  63158. __asm__ __volatile__ (
  63159. "sub sp, sp, #44\n\t"
  63160. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  63161. "str %[r], [sp, #36]\n\t"
  63162. "str %[a], [sp, #40]\n\t"
  63163. #else
  63164. "strd %[r], %[a], [sp, #36]\n\t"
  63165. #endif
  63166. "mov lr, %[b]\n\t"
  63167. "ldm %[a], {%[r], %[a], %[b], r3}\n\t"
  63168. "ldm lr!, {r4, r5, r6}\n\t"
  63169. "umull r10, r11, %[r], r4\n\t"
  63170. "umull r12, r7, %[a], r4\n\t"
  63171. "umaal r11, r12, %[r], r5\n\t"
  63172. "umull r8, r9, %[b], r4\n\t"
  63173. "umaal r12, r8, %[a], r5\n\t"
  63174. "umaal r12, r7, %[r], r6\n\t"
  63175. "umaal r8, r9, r3, r4\n\t"
  63176. "stm sp, {r10, r11, r12}\n\t"
  63177. "umaal r7, r8, %[b], r5\n\t"
  63178. "ldm lr!, {r4}\n\t"
  63179. "umull r10, r11, %[a], r6\n\t"
  63180. "umaal r8, r9, %[b], r6\n\t"
  63181. "umaal r7, r10, %[r], r4\n\t"
  63182. "umaal r8, r11, r3, r5\n\t"
  63183. "str r7, [sp, #12]\n\t"
  63184. "umaal r8, r10, %[a], r4\n\t"
  63185. "umaal r9, r11, r3, r6\n\t"
  63186. "umaal r9, r10, %[b], r4\n\t"
  63187. "umaal r10, r11, r3, r4\n\t"
  63188. "ldm lr, {r4, r5, r6, r7}\n\t"
  63189. "mov r12, #0\n\t"
  63190. "umlal r8, r12, %[r], r4\n\t"
  63191. "umaal r9, r12, %[a], r4\n\t"
  63192. "umaal r10, r12, %[b], r4\n\t"
  63193. "umaal r11, r12, r3, r4\n\t"
  63194. "mov r4, #0\n\t"
  63195. "umlal r9, r4, %[r], r5\n\t"
  63196. "umaal r10, r4, %[a], r5\n\t"
  63197. "umaal r11, r4, %[b], r5\n\t"
  63198. "umaal r12, r4, r3, r5\n\t"
  63199. "mov r5, #0\n\t"
  63200. "umlal r10, r5, %[r], r6\n\t"
  63201. "umaal r11, r5, %[a], r6\n\t"
  63202. "umaal r12, r5, %[b], r6\n\t"
  63203. "umaal r4, r5, r3, r6\n\t"
  63204. "mov r6, #0\n\t"
  63205. "umlal r11, r6, %[r], r7\n\t"
  63206. "ldr %[r], [sp, #40]\n\t"
  63207. "umaal r12, r6, %[a], r7\n\t"
  63208. "add %[r], %[r], #16\n\t"
  63209. "umaal r4, r6, %[b], r7\n\t"
  63210. "sub lr, lr, #16\n\t"
  63211. "umaal r5, r6, r3, r7\n\t"
  63212. "ldm %[r], {%[r], %[a], %[b], r3}\n\t"
  63213. "str r6, [sp, #32]\n\t"
  63214. "ldm lr!, {r6}\n\t"
  63215. "mov r7, #0\n\t"
  63216. "umlal r8, r7, %[r], r6\n\t"
  63217. "umaal r9, r7, %[a], r6\n\t"
  63218. "str r8, [sp, #16]\n\t"
  63219. "umaal r10, r7, %[b], r6\n\t"
  63220. "umaal r11, r7, r3, r6\n\t"
  63221. "ldm lr!, {r6}\n\t"
  63222. "mov r8, #0\n\t"
  63223. "umlal r9, r8, %[r], r6\n\t"
  63224. "umaal r10, r8, %[a], r6\n\t"
  63225. "str r9, [sp, #20]\n\t"
  63226. "umaal r11, r8, %[b], r6\n\t"
  63227. "umaal r12, r8, r3, r6\n\t"
  63228. "ldm lr!, {r6}\n\t"
  63229. "mov r9, #0\n\t"
  63230. "umlal r10, r9, %[r], r6\n\t"
  63231. "umaal r11, r9, %[a], r6\n\t"
  63232. "str r10, [sp, #24]\n\t"
  63233. "umaal r12, r9, %[b], r6\n\t"
  63234. "umaal r4, r9, r3, r6\n\t"
  63235. "ldm lr!, {r6}\n\t"
  63236. "mov r10, #0\n\t"
  63237. "umlal r11, r10, %[r], r6\n\t"
  63238. "umaal r12, r10, %[a], r6\n\t"
  63239. "str r11, [sp, #28]\n\t"
  63240. "umaal r4, r10, %[b], r6\n\t"
  63241. "umaal r5, r10, r3, r6\n\t"
  63242. "ldm lr!, {r11}\n\t"
  63243. "umaal r12, r7, %[r], r11\n\t"
  63244. "umaal r4, r7, %[a], r11\n\t"
  63245. "ldr r6, [sp, #32]\n\t"
  63246. "umaal r5, r7, %[b], r11\n\t"
  63247. "umaal r6, r7, r3, r11\n\t"
  63248. "ldm lr!, {r11}\n\t"
  63249. "umaal r4, r8, %[r], r11\n\t"
  63250. "umaal r5, r8, %[a], r11\n\t"
  63251. "umaal r6, r8, %[b], r11\n\t"
  63252. "umaal r7, r8, r3, r11\n\t"
  63253. "ldm lr, {r11, lr}\n\t"
  63254. "umaal r5, r9, %[r], r11\n\t"
  63255. "umaal r6, r10, %[r], lr\n\t"
  63256. "umaal r6, r9, %[a], r11\n\t"
  63257. "umaal r7, r10, %[a], lr\n\t"
  63258. "umaal r7, r9, %[b], r11\n\t"
  63259. "umaal r8, r10, %[b], lr\n\t"
  63260. "umaal r8, r9, r3, r11\n\t"
  63261. "umaal r9, r10, r3, lr\n\t"
  63262. "mov r3, r12\n\t"
  63263. "ldr lr, [sp, #36]\n\t"
  63264. "add lr, lr, #32\n\t"
  63265. "stm lr, {r3, r4, r5, r6, r7, r8, r9, r10}\n\t"
  63266. "sub lr, lr, #32\n\t"
  63267. "ldm sp, {r3, r4, r5, r6, r7, r8, r9, r10}\n\t"
  63268. "stm lr, {r3, r4, r5, r6, r7, r8, r9, r10}\n\t"
  63269. "add sp, sp, #44\n\t"
  63270. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  63271. :
  63272. : "memory", "r3", "r4", "r5", "r6", "r10", "r11", "r12", "r7", "r8", "r9", "lr", "cc"
  63273. );
  63274. }
  63275. #endif
  63276. #endif /* WOLFSSL_SP_SMALL */
  63277. #ifdef WOLFSSL_SP_SMALL
  63278. /* Square a and put result in r. (r = a * a)
  63279. *
  63280. * r A single precision integer.
  63281. * a A single precision integer.
  63282. */
  63283. static void sp_256_sqr_8(sp_digit* r_p, const sp_digit* a_p)
  63284. {
  63285. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  63286. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  63287. __asm__ __volatile__ (
  63288. "sub sp, sp, #0x40\n\t"
  63289. "ldr lr, [%[a]]\n\t"
  63290. "umull r8, r6, lr, lr\n\t"
  63291. "str r8, [sp]\n\t"
  63292. "mov r7, #0\n\t"
  63293. "mov r8, #0\n\t"
  63294. "mov r5, #4\n\t"
  63295. "\n"
  63296. "L_sp_256_sqr_8_outer_%=: \n\t"
  63297. "subs r3, r5, #28\n\t"
  63298. "it cc\n\t"
  63299. "movcc r3, #0\n\t"
  63300. "sub r4, r5, r3\n\t"
  63301. "\n"
  63302. "L_sp_256_sqr_8_inner_%=: \n\t"
  63303. "ldr lr, [%[a], r3]\n\t"
  63304. "ldr r11, [%[a], r4]\n\t"
  63305. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  63306. "lsl r9, lr, #16\n\t"
  63307. "lsl r10, r11, #16\n\t"
  63308. "lsr r9, r9, #16\n\t"
  63309. "lsr r10, r10, #16\n\t"
  63310. "mul r10, r9, r10\n\t"
  63311. "adds r6, r6, r10\n\t"
  63312. "adcs r7, r7, #0\n\t"
  63313. "adc r8, r8, #0\n\t"
  63314. "adds r6, r6, r10\n\t"
  63315. "adcs r7, r7, #0\n\t"
  63316. "adc r8, r8, #0\n\t"
  63317. "lsr r10, r11, #16\n\t"
  63318. "mul r9, r10, r9\n\t"
  63319. "lsr r10, r9, #16\n\t"
  63320. "lsl r9, r9, #16\n\t"
  63321. "adds r6, r6, r9\n\t"
  63322. "adcs r7, r7, r10\n\t"
  63323. "adc r8, r8, #0\n\t"
  63324. "adds r6, r6, r9\n\t"
  63325. "adcs r7, r7, r10\n\t"
  63326. "adc r8, r8, #0\n\t"
  63327. "lsr r9, lr, #16\n\t"
  63328. "lsr r10, r11, #16\n\t"
  63329. "mul r10, r9, r10\n\t"
  63330. "adds r7, r7, r10\n\t"
  63331. "adc r8, r8, #0\n\t"
  63332. "adds r7, r7, r10\n\t"
  63333. "adc r8, r8, #0\n\t"
  63334. "lsl r10, r11, #16\n\t"
  63335. "lsr r10, r10, #16\n\t"
  63336. "mul r9, r10, r9\n\t"
  63337. "lsr r10, r9, #16\n\t"
  63338. "lsl r9, r9, #16\n\t"
  63339. "adds r6, r6, r9\n\t"
  63340. "adcs r7, r7, r10\n\t"
  63341. "adc r8, r8, #0\n\t"
  63342. "adds r6, r6, r9\n\t"
  63343. "adcs r7, r7, r10\n\t"
  63344. "adc r8, r8, #0\n\t"
  63345. #else
  63346. "umull r9, r10, lr, r11\n\t"
  63347. "adds r6, r6, r9\n\t"
  63348. "adcs r7, r7, r10\n\t"
  63349. "adc r8, r8, #0\n\t"
  63350. "adds r6, r6, r9\n\t"
  63351. "adcs r7, r7, r10\n\t"
  63352. "adc r8, r8, #0\n\t"
  63353. #endif
  63354. "add r3, r3, #4\n\t"
  63355. "sub r4, r4, #4\n\t"
  63356. "cmp r3, r4\n\t"
  63357. "bgt L_sp_256_sqr_8_inner_done_%=\n\t"
  63358. "blt L_sp_256_sqr_8_inner_%=\n\t"
  63359. "ldr lr, [%[a], r3]\n\t"
  63360. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  63361. "lsl r9, lr, #16\n\t"
  63362. "lsr r10, lr, #16\n\t"
  63363. "lsr r9, r9, #16\n\t"
  63364. "mov r11, r9\n\t"
  63365. "mul r9, r11, r9\n\t"
  63366. "mov r11, r10\n\t"
  63367. "mul r10, r11, r10\n\t"
  63368. "adds r6, r6, r9\n\t"
  63369. "adcs r7, r7, r10\n\t"
  63370. "adc r8, r8, #0\n\t"
  63371. "lsr r10, lr, #16\n\t"
  63372. "lsl r9, lr, #16\n\t"
  63373. "lsr r9, r9, #16\n\t"
  63374. "mul r9, r10, r9\n\t"
  63375. "lsr r10, r9, #15\n\t"
  63376. "lsl r9, r9, #17\n\t"
  63377. "adds r6, r6, r9\n\t"
  63378. "adcs r7, r7, r10\n\t"
  63379. "adc r8, r8, #0\n\t"
  63380. #else
  63381. "umull r9, r10, lr, lr\n\t"
  63382. "adds r6, r6, r9\n\t"
  63383. "adcs r7, r7, r10\n\t"
  63384. "adc r8, r8, #0\n\t"
  63385. #endif
  63386. "\n"
  63387. "L_sp_256_sqr_8_inner_done_%=: \n\t"
  63388. "str r6, [sp, r5]\n\t"
  63389. "mov r6, r7\n\t"
  63390. "mov r7, r8\n\t"
  63391. "mov r8, #0\n\t"
  63392. "add r5, r5, #4\n\t"
  63393. "cmp r5, #52\n\t"
  63394. "ble L_sp_256_sqr_8_outer_%=\n\t"
  63395. "ldr lr, [%[a], #28]\n\t"
  63396. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  63397. "lsl r9, lr, #16\n\t"
  63398. "lsr r10, lr, #16\n\t"
  63399. "lsr r9, r9, #16\n\t"
  63400. "mov r11, r9\n\t"
  63401. "mul r9, r11, r9\n\t"
  63402. "mov r11, r10\n\t"
  63403. "mul r10, r11, r10\n\t"
  63404. "adds r6, r6, r9\n\t"
  63405. "adc r7, r7, r10\n\t"
  63406. "lsr r10, lr, #16\n\t"
  63407. "lsl r9, lr, #16\n\t"
  63408. "lsr r9, r9, #16\n\t"
  63409. "mul r9, r10, r9\n\t"
  63410. "lsr r10, r9, #15\n\t"
  63411. "lsl r9, r9, #17\n\t"
  63412. "adds r6, r6, r9\n\t"
  63413. "adc r7, r7, r10\n\t"
  63414. #else
  63415. "umull r9, r10, lr, lr\n\t"
  63416. "adds r6, r6, r9\n\t"
  63417. "adc r7, r7, r10\n\t"
  63418. #endif
  63419. "str r6, [sp, r5]\n\t"
  63420. "add r5, r5, #4\n\t"
  63421. "str r7, [sp, r5]\n\t"
  63422. "\n"
  63423. "L_sp_256_sqr_8_store_%=: \n\t"
  63424. "ldm sp!, {r3, r4, r6, r7, r8, r9, r10, r11}\n\t"
  63425. "stm %[r]!, {r3, r4, r6, r7, r8, r9, r10, r11}\n\t"
  63426. "subs r5, r5, #32\n\t"
  63427. "bgt L_sp_256_sqr_8_store_%=\n\t"
  63428. : [r] "+r" (r), [a] "+r" (a)
  63429. :
  63430. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "lr", "r11", "cc"
  63431. );
  63432. }
  63433. #else
  63434. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  63435. /* Square a and put result in r. (r = a * a)
  63436. *
  63437. * r A single precision integer.
  63438. * a A single precision integer.
  63439. */
  63440. static void sp_256_sqr_8(sp_digit* r_p, const sp_digit* a_p)
  63441. {
  63442. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  63443. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  63444. __asm__ __volatile__ (
  63445. "sub sp, sp, #32\n\t"
  63446. /* A[0] * A[0] */
  63447. "ldr r10, [%[a]]\n\t"
  63448. "lsr r9, r10, #16\n\t"
  63449. "lsl r2, r10, #16\n\t"
  63450. "lsr r2, r2, #16\n\t"
  63451. "mul r8, r2, r2\n\t"
  63452. "mul r3, r9, r9\n\t"
  63453. "mul r2, r9, r2\n\t"
  63454. "lsr r9, r2, #15\n\t"
  63455. "lsl r2, r2, #17\n\t"
  63456. "adds r8, r8, r2\n\t"
  63457. "adc r3, r3, r9\n\t"
  63458. "mov r4, #0\n\t"
  63459. "str r8, [sp]\n\t"
  63460. /* A[0] * A[1] */
  63461. "ldr r10, [%[a], #4]\n\t"
  63462. "ldr r12, [%[a]]\n\t"
  63463. "lsl r8, r10, #16\n\t"
  63464. "lsl r9, r12, #16\n\t"
  63465. "lsr r8, r8, #16\n\t"
  63466. "lsr r9, r9, #16\n\t"
  63467. "mul r9, r8, r9\n\t"
  63468. "adds r3, r3, r9\n\t"
  63469. "adcs r4, r4, #0\n\t"
  63470. "mov r2, #0\n\t"
  63471. "adc r2, r2, #0\n\t"
  63472. "adds r3, r3, r9\n\t"
  63473. "adcs r4, r4, #0\n\t"
  63474. "adc r2, r2, #0\n\t"
  63475. "lsr r9, r12, #16\n\t"
  63476. "mul r8, r9, r8\n\t"
  63477. "lsr r9, r8, #16\n\t"
  63478. "lsl r8, r8, #16\n\t"
  63479. "adds r3, r3, r8\n\t"
  63480. "adcs r4, r4, r9\n\t"
  63481. "adc r2, r2, #0\n\t"
  63482. "adds r3, r3, r8\n\t"
  63483. "adcs r4, r4, r9\n\t"
  63484. "adc r2, r2, #0\n\t"
  63485. "lsr r8, r10, #16\n\t"
  63486. "lsr r9, r12, #16\n\t"
  63487. "mul r9, r8, r9\n\t"
  63488. "adds r4, r4, r9\n\t"
  63489. "adc r2, r2, #0\n\t"
  63490. "adds r4, r4, r9\n\t"
  63491. "adc r2, r2, #0\n\t"
  63492. "lsl r9, r12, #16\n\t"
  63493. "lsr r9, r9, #16\n\t"
  63494. "mul r8, r9, r8\n\t"
  63495. "lsr r9, r8, #16\n\t"
  63496. "lsl r8, r8, #16\n\t"
  63497. "adds r3, r3, r8\n\t"
  63498. "adcs r4, r4, r9\n\t"
  63499. "adc r2, r2, #0\n\t"
  63500. "adds r3, r3, r8\n\t"
  63501. "adcs r4, r4, r9\n\t"
  63502. "adc r2, r2, #0\n\t"
  63503. "str r3, [sp, #4]\n\t"
  63504. /* A[0] * A[2] */
  63505. "ldr r10, [%[a], #8]\n\t"
  63506. "ldr r12, [%[a]]\n\t"
  63507. "lsl r8, r10, #16\n\t"
  63508. "lsl r9, r12, #16\n\t"
  63509. "lsr r8, r8, #16\n\t"
  63510. "lsr r9, r9, #16\n\t"
  63511. "mul r9, r8, r9\n\t"
  63512. "adds r4, r4, r9\n\t"
  63513. "adcs r2, r2, #0\n\t"
  63514. "mov r3, #0\n\t"
  63515. "adc r3, r3, #0\n\t"
  63516. "adds r4, r4, r9\n\t"
  63517. "adcs r2, r2, #0\n\t"
  63518. "adc r3, r3, #0\n\t"
  63519. "lsr r9, r12, #16\n\t"
  63520. "mul r8, r9, r8\n\t"
  63521. "lsr r9, r8, #16\n\t"
  63522. "lsl r8, r8, #16\n\t"
  63523. "adds r4, r4, r8\n\t"
  63524. "adcs r2, r2, r9\n\t"
  63525. "adc r3, r3, #0\n\t"
  63526. "adds r4, r4, r8\n\t"
  63527. "adcs r2, r2, r9\n\t"
  63528. "adc r3, r3, #0\n\t"
  63529. "lsr r8, r10, #16\n\t"
  63530. "lsr r9, r12, #16\n\t"
  63531. "mul r9, r8, r9\n\t"
  63532. "adds r2, r2, r9\n\t"
  63533. "adc r3, r3, #0\n\t"
  63534. "adds r2, r2, r9\n\t"
  63535. "adc r3, r3, #0\n\t"
  63536. "lsl r9, r12, #16\n\t"
  63537. "lsr r9, r9, #16\n\t"
  63538. "mul r8, r9, r8\n\t"
  63539. "lsr r9, r8, #16\n\t"
  63540. "lsl r8, r8, #16\n\t"
  63541. "adds r4, r4, r8\n\t"
  63542. "adcs r2, r2, r9\n\t"
  63543. "adc r3, r3, #0\n\t"
  63544. "adds r4, r4, r8\n\t"
  63545. "adcs r2, r2, r9\n\t"
  63546. "adc r3, r3, #0\n\t"
  63547. /* A[1] * A[1] */
  63548. "ldr r10, [%[a], #4]\n\t"
  63549. "lsl r8, r10, #16\n\t"
  63550. "lsr r9, r10, #16\n\t"
  63551. "lsr r8, r8, #16\n\t"
  63552. "mov r12, r8\n\t"
  63553. "mul r8, r12, r8\n\t"
  63554. "mov r12, r9\n\t"
  63555. "mul r9, r12, r9\n\t"
  63556. "adds r4, r4, r8\n\t"
  63557. "adcs r2, r2, r9\n\t"
  63558. "adc r3, r3, #0\n\t"
  63559. "lsr r9, r10, #16\n\t"
  63560. "lsl r8, r10, #16\n\t"
  63561. "lsr r8, r8, #16\n\t"
  63562. "mul r8, r9, r8\n\t"
  63563. "lsr r9, r8, #15\n\t"
  63564. "lsl r8, r8, #17\n\t"
  63565. "adds r4, r4, r8\n\t"
  63566. "adcs r2, r2, r9\n\t"
  63567. "adc r3, r3, #0\n\t"
  63568. "str r4, [sp, #8]\n\t"
  63569. /* A[0] * A[3] */
  63570. "ldr r10, [%[a], #12]\n\t"
  63571. "ldr r12, [%[a]]\n\t"
  63572. "lsl r8, r10, #16\n\t"
  63573. "lsl r9, r12, #16\n\t"
  63574. "lsr r8, r8, #16\n\t"
  63575. "lsr r9, r9, #16\n\t"
  63576. "mul r9, r8, r9\n\t"
  63577. "adds r2, r2, r9\n\t"
  63578. "adcs r3, r3, #0\n\t"
  63579. "mov r4, #0\n\t"
  63580. "adc r4, r4, #0\n\t"
  63581. "adds r2, r2, r9\n\t"
  63582. "adcs r3, r3, #0\n\t"
  63583. "adc r4, r4, #0\n\t"
  63584. "lsr r9, r12, #16\n\t"
  63585. "mul r8, r9, r8\n\t"
  63586. "lsr r9, r8, #16\n\t"
  63587. "lsl r8, r8, #16\n\t"
  63588. "adds r2, r2, r8\n\t"
  63589. "adcs r3, r3, r9\n\t"
  63590. "adc r4, r4, #0\n\t"
  63591. "adds r2, r2, r8\n\t"
  63592. "adcs r3, r3, r9\n\t"
  63593. "adc r4, r4, #0\n\t"
  63594. "lsr r8, r10, #16\n\t"
  63595. "lsr r9, r12, #16\n\t"
  63596. "mul r9, r8, r9\n\t"
  63597. "adds r3, r3, r9\n\t"
  63598. "adc r4, r4, #0\n\t"
  63599. "adds r3, r3, r9\n\t"
  63600. "adc r4, r4, #0\n\t"
  63601. "lsl r9, r12, #16\n\t"
  63602. "lsr r9, r9, #16\n\t"
  63603. "mul r8, r9, r8\n\t"
  63604. "lsr r9, r8, #16\n\t"
  63605. "lsl r8, r8, #16\n\t"
  63606. "adds r2, r2, r8\n\t"
  63607. "adcs r3, r3, r9\n\t"
  63608. "adc r4, r4, #0\n\t"
  63609. "adds r2, r2, r8\n\t"
  63610. "adcs r3, r3, r9\n\t"
  63611. "adc r4, r4, #0\n\t"
  63612. /* A[1] * A[2] */
  63613. "ldr r10, [%[a], #8]\n\t"
  63614. "ldr r12, [%[a], #4]\n\t"
  63615. "lsl r8, r10, #16\n\t"
  63616. "lsl r9, r12, #16\n\t"
  63617. "lsr r8, r8, #16\n\t"
  63618. "lsr r9, r9, #16\n\t"
  63619. "mul r9, r8, r9\n\t"
  63620. "adds r2, r2, r9\n\t"
  63621. "adcs r3, r3, #0\n\t"
  63622. "adc r4, r4, #0\n\t"
  63623. "adds r2, r2, r9\n\t"
  63624. "adcs r3, r3, #0\n\t"
  63625. "adc r4, r4, #0\n\t"
  63626. "lsr r9, r12, #16\n\t"
  63627. "mul r8, r9, r8\n\t"
  63628. "lsr r9, r8, #16\n\t"
  63629. "lsl r8, r8, #16\n\t"
  63630. "adds r2, r2, r8\n\t"
  63631. "adcs r3, r3, r9\n\t"
  63632. "adc r4, r4, #0\n\t"
  63633. "adds r2, r2, r8\n\t"
  63634. "adcs r3, r3, r9\n\t"
  63635. "adc r4, r4, #0\n\t"
  63636. "lsr r8, r10, #16\n\t"
  63637. "lsr r9, r12, #16\n\t"
  63638. "mul r9, r8, r9\n\t"
  63639. "adds r3, r3, r9\n\t"
  63640. "adc r4, r4, #0\n\t"
  63641. "adds r3, r3, r9\n\t"
  63642. "adc r4, r4, #0\n\t"
  63643. "lsl r9, r12, #16\n\t"
  63644. "lsr r9, r9, #16\n\t"
  63645. "mul r8, r9, r8\n\t"
  63646. "lsr r9, r8, #16\n\t"
  63647. "lsl r8, r8, #16\n\t"
  63648. "adds r2, r2, r8\n\t"
  63649. "adcs r3, r3, r9\n\t"
  63650. "adc r4, r4, #0\n\t"
  63651. "adds r2, r2, r8\n\t"
  63652. "adcs r3, r3, r9\n\t"
  63653. "adc r4, r4, #0\n\t"
  63654. "str r2, [sp, #12]\n\t"
  63655. /* A[0] * A[4] */
  63656. "ldr r10, [%[a], #16]\n\t"
  63657. "ldr r12, [%[a]]\n\t"
  63658. "lsl r8, r10, #16\n\t"
  63659. "lsl r9, r12, #16\n\t"
  63660. "lsr r8, r8, #16\n\t"
  63661. "lsr r9, r9, #16\n\t"
  63662. "mul r9, r8, r9\n\t"
  63663. "adds r3, r3, r9\n\t"
  63664. "adcs r4, r4, #0\n\t"
  63665. "mov r2, #0\n\t"
  63666. "adc r2, r2, #0\n\t"
  63667. "adds r3, r3, r9\n\t"
  63668. "adcs r4, r4, #0\n\t"
  63669. "adc r2, r2, #0\n\t"
  63670. "lsr r9, r12, #16\n\t"
  63671. "mul r8, r9, r8\n\t"
  63672. "lsr r9, r8, #16\n\t"
  63673. "lsl r8, r8, #16\n\t"
  63674. "adds r3, r3, r8\n\t"
  63675. "adcs r4, r4, r9\n\t"
  63676. "adc r2, r2, #0\n\t"
  63677. "adds r3, r3, r8\n\t"
  63678. "adcs r4, r4, r9\n\t"
  63679. "adc r2, r2, #0\n\t"
  63680. "lsr r8, r10, #16\n\t"
  63681. "lsr r9, r12, #16\n\t"
  63682. "mul r9, r8, r9\n\t"
  63683. "adds r4, r4, r9\n\t"
  63684. "adc r2, r2, #0\n\t"
  63685. "adds r4, r4, r9\n\t"
  63686. "adc r2, r2, #0\n\t"
  63687. "lsl r9, r12, #16\n\t"
  63688. "lsr r9, r9, #16\n\t"
  63689. "mul r8, r9, r8\n\t"
  63690. "lsr r9, r8, #16\n\t"
  63691. "lsl r8, r8, #16\n\t"
  63692. "adds r3, r3, r8\n\t"
  63693. "adcs r4, r4, r9\n\t"
  63694. "adc r2, r2, #0\n\t"
  63695. "adds r3, r3, r8\n\t"
  63696. "adcs r4, r4, r9\n\t"
  63697. "adc r2, r2, #0\n\t"
  63698. /* A[1] * A[3] */
  63699. "ldr r10, [%[a], #12]\n\t"
  63700. "ldr r12, [%[a], #4]\n\t"
  63701. "lsl r8, r10, #16\n\t"
  63702. "lsl r9, r12, #16\n\t"
  63703. "lsr r8, r8, #16\n\t"
  63704. "lsr r9, r9, #16\n\t"
  63705. "mul r9, r8, r9\n\t"
  63706. "adds r3, r3, r9\n\t"
  63707. "adcs r4, r4, #0\n\t"
  63708. "adc r2, r2, #0\n\t"
  63709. "adds r3, r3, r9\n\t"
  63710. "adcs r4, r4, #0\n\t"
  63711. "adc r2, r2, #0\n\t"
  63712. "lsr r9, r12, #16\n\t"
  63713. "mul r8, r9, r8\n\t"
  63714. "lsr r9, r8, #16\n\t"
  63715. "lsl r8, r8, #16\n\t"
  63716. "adds r3, r3, r8\n\t"
  63717. "adcs r4, r4, r9\n\t"
  63718. "adc r2, r2, #0\n\t"
  63719. "adds r3, r3, r8\n\t"
  63720. "adcs r4, r4, r9\n\t"
  63721. "adc r2, r2, #0\n\t"
  63722. "lsr r8, r10, #16\n\t"
  63723. "lsr r9, r12, #16\n\t"
  63724. "mul r9, r8, r9\n\t"
  63725. "adds r4, r4, r9\n\t"
  63726. "adc r2, r2, #0\n\t"
  63727. "adds r4, r4, r9\n\t"
  63728. "adc r2, r2, #0\n\t"
  63729. "lsl r9, r12, #16\n\t"
  63730. "lsr r9, r9, #16\n\t"
  63731. "mul r8, r9, r8\n\t"
  63732. "lsr r9, r8, #16\n\t"
  63733. "lsl r8, r8, #16\n\t"
  63734. "adds r3, r3, r8\n\t"
  63735. "adcs r4, r4, r9\n\t"
  63736. "adc r2, r2, #0\n\t"
  63737. "adds r3, r3, r8\n\t"
  63738. "adcs r4, r4, r9\n\t"
  63739. "adc r2, r2, #0\n\t"
  63740. /* A[2] * A[2] */
  63741. "ldr r10, [%[a], #8]\n\t"
  63742. "lsl r8, r10, #16\n\t"
  63743. "lsr r9, r10, #16\n\t"
  63744. "lsr r8, r8, #16\n\t"
  63745. "mov r12, r8\n\t"
  63746. "mul r8, r12, r8\n\t"
  63747. "mov r12, r9\n\t"
  63748. "mul r9, r12, r9\n\t"
  63749. "adds r3, r3, r8\n\t"
  63750. "adcs r4, r4, r9\n\t"
  63751. "adc r2, r2, #0\n\t"
  63752. "lsr r9, r10, #16\n\t"
  63753. "lsl r8, r10, #16\n\t"
  63754. "lsr r8, r8, #16\n\t"
  63755. "mul r8, r9, r8\n\t"
  63756. "lsr r9, r8, #15\n\t"
  63757. "lsl r8, r8, #17\n\t"
  63758. "adds r3, r3, r8\n\t"
  63759. "adcs r4, r4, r9\n\t"
  63760. "adc r2, r2, #0\n\t"
  63761. "str r3, [sp, #16]\n\t"
  63762. /* A[0] * A[5] */
  63763. "ldr r10, [%[a], #20]\n\t"
  63764. "ldr r12, [%[a]]\n\t"
  63765. "lsl r8, r10, #16\n\t"
  63766. "lsl r5, r12, #16\n\t"
  63767. "lsr r8, r8, #16\n\t"
  63768. "lsr r5, r5, #16\n\t"
  63769. "mul r5, r8, r5\n\t"
  63770. "lsr r9, r12, #16\n\t"
  63771. "mul r8, r9, r8\n\t"
  63772. "lsr r6, r8, #16\n\t"
  63773. "lsl r8, r8, #16\n\t"
  63774. "adds r5, r5, r8\n\t"
  63775. "adc r6, r6, #0\n\t"
  63776. "lsr r8, r10, #16\n\t"
  63777. "mul r9, r8, r9\n\t"
  63778. "add r6, r6, r9\n\t"
  63779. "lsl r9, r12, #16\n\t"
  63780. "lsr r9, r9, #16\n\t"
  63781. "mul r8, r9, r8\n\t"
  63782. "lsr r9, r8, #16\n\t"
  63783. "lsl r8, r8, #16\n\t"
  63784. "adds r5, r5, r8\n\t"
  63785. "adc r6, r6, r9\n\t"
  63786. "mov r3, #0\n\t"
  63787. "mov r7, #0\n\t"
  63788. /* A[1] * A[4] */
  63789. "ldr r10, [%[a], #16]\n\t"
  63790. "ldr r12, [%[a], #4]\n\t"
  63791. "lsl r8, r10, #16\n\t"
  63792. "lsl r9, r12, #16\n\t"
  63793. "lsr r8, r8, #16\n\t"
  63794. "lsr r9, r9, #16\n\t"
  63795. "mul r9, r8, r9\n\t"
  63796. "adds r5, r5, r9\n\t"
  63797. "adcs r6, r6, #0\n\t"
  63798. "adc r7, r7, #0\n\t"
  63799. "lsr r9, r12, #16\n\t"
  63800. "mul r8, r9, r8\n\t"
  63801. "lsr r9, r8, #16\n\t"
  63802. "lsl r8, r8, #16\n\t"
  63803. "adds r5, r5, r8\n\t"
  63804. "adcs r6, r6, r9\n\t"
  63805. "adc r7, r7, #0\n\t"
  63806. "lsr r8, r10, #16\n\t"
  63807. "lsr r9, r12, #16\n\t"
  63808. "mul r9, r8, r9\n\t"
  63809. "adds r6, r6, r9\n\t"
  63810. "adc r7, r7, #0\n\t"
  63811. "lsl r9, r12, #16\n\t"
  63812. "lsr r9, r9, #16\n\t"
  63813. "mul r8, r9, r8\n\t"
  63814. "lsr r9, r8, #16\n\t"
  63815. "lsl r8, r8, #16\n\t"
  63816. "adds r5, r5, r8\n\t"
  63817. "adcs r6, r6, r9\n\t"
  63818. "adc r7, r7, #0\n\t"
  63819. /* A[2] * A[3] */
  63820. "ldr r10, [%[a], #12]\n\t"
  63821. "ldr r12, [%[a], #8]\n\t"
  63822. "lsl r8, r10, #16\n\t"
  63823. "lsl r9, r12, #16\n\t"
  63824. "lsr r8, r8, #16\n\t"
  63825. "lsr r9, r9, #16\n\t"
  63826. "mul r9, r8, r9\n\t"
  63827. "adds r5, r5, r9\n\t"
  63828. "adcs r6, r6, #0\n\t"
  63829. "adc r7, r7, #0\n\t"
  63830. "lsr r9, r12, #16\n\t"
  63831. "mul r8, r9, r8\n\t"
  63832. "lsr r9, r8, #16\n\t"
  63833. "lsl r8, r8, #16\n\t"
  63834. "adds r5, r5, r8\n\t"
  63835. "adcs r6, r6, r9\n\t"
  63836. "adc r7, r7, #0\n\t"
  63837. "lsr r8, r10, #16\n\t"
  63838. "lsr r9, r12, #16\n\t"
  63839. "mul r9, r8, r9\n\t"
  63840. "adds r6, r6, r9\n\t"
  63841. "adc r7, r7, #0\n\t"
  63842. "lsl r9, r12, #16\n\t"
  63843. "lsr r9, r9, #16\n\t"
  63844. "mul r8, r9, r8\n\t"
  63845. "lsr r9, r8, #16\n\t"
  63846. "lsl r8, r8, #16\n\t"
  63847. "adds r5, r5, r8\n\t"
  63848. "adcs r6, r6, r9\n\t"
  63849. "adc r7, r7, #0\n\t"
  63850. "adds r5, r5, r5\n\t"
  63851. "adcs r6, r6, r6\n\t"
  63852. "adc r7, r7, r7\n\t"
  63853. "adds r4, r4, r5\n\t"
  63854. "adcs r2, r2, r6\n\t"
  63855. "adc r3, r3, r7\n\t"
  63856. "str r4, [sp, #20]\n\t"
  63857. /* A[0] * A[6] */
  63858. "ldr r10, [%[a], #24]\n\t"
  63859. "ldr r12, [%[a]]\n\t"
  63860. "lsl r8, r10, #16\n\t"
  63861. "lsl r5, r12, #16\n\t"
  63862. "lsr r8, r8, #16\n\t"
  63863. "lsr r5, r5, #16\n\t"
  63864. "mul r5, r8, r5\n\t"
  63865. "lsr r9, r12, #16\n\t"
  63866. "mul r8, r9, r8\n\t"
  63867. "lsr r6, r8, #16\n\t"
  63868. "lsl r8, r8, #16\n\t"
  63869. "adds r5, r5, r8\n\t"
  63870. "adc r6, r6, #0\n\t"
  63871. "lsr r8, r10, #16\n\t"
  63872. "mul r9, r8, r9\n\t"
  63873. "add r6, r6, r9\n\t"
  63874. "lsl r9, r12, #16\n\t"
  63875. "lsr r9, r9, #16\n\t"
  63876. "mul r8, r9, r8\n\t"
  63877. "lsr r9, r8, #16\n\t"
  63878. "lsl r8, r8, #16\n\t"
  63879. "adds r5, r5, r8\n\t"
  63880. "adc r6, r6, r9\n\t"
  63881. "mov r4, #0\n\t"
  63882. "mov r7, #0\n\t"
  63883. /* A[1] * A[5] */
  63884. "ldr r10, [%[a], #20]\n\t"
  63885. "ldr r12, [%[a], #4]\n\t"
  63886. "lsl r8, r10, #16\n\t"
  63887. "lsl r9, r12, #16\n\t"
  63888. "lsr r8, r8, #16\n\t"
  63889. "lsr r9, r9, #16\n\t"
  63890. "mul r9, r8, r9\n\t"
  63891. "adds r5, r5, r9\n\t"
  63892. "adcs r6, r6, #0\n\t"
  63893. "adc r7, r7, #0\n\t"
  63894. "lsr r9, r12, #16\n\t"
  63895. "mul r8, r9, r8\n\t"
  63896. "lsr r9, r8, #16\n\t"
  63897. "lsl r8, r8, #16\n\t"
  63898. "adds r5, r5, r8\n\t"
  63899. "adcs r6, r6, r9\n\t"
  63900. "adc r7, r7, #0\n\t"
  63901. "lsr r8, r10, #16\n\t"
  63902. "lsr r9, r12, #16\n\t"
  63903. "mul r9, r8, r9\n\t"
  63904. "adds r6, r6, r9\n\t"
  63905. "adc r7, r7, #0\n\t"
  63906. "lsl r9, r12, #16\n\t"
  63907. "lsr r9, r9, #16\n\t"
  63908. "mul r8, r9, r8\n\t"
  63909. "lsr r9, r8, #16\n\t"
  63910. "lsl r8, r8, #16\n\t"
  63911. "adds r5, r5, r8\n\t"
  63912. "adcs r6, r6, r9\n\t"
  63913. "adc r7, r7, #0\n\t"
  63914. /* A[2] * A[4] */
  63915. "ldr r10, [%[a], #16]\n\t"
  63916. "ldr r12, [%[a], #8]\n\t"
  63917. "lsl r8, r10, #16\n\t"
  63918. "lsl r9, r12, #16\n\t"
  63919. "lsr r8, r8, #16\n\t"
  63920. "lsr r9, r9, #16\n\t"
  63921. "mul r9, r8, r9\n\t"
  63922. "adds r5, r5, r9\n\t"
  63923. "adcs r6, r6, #0\n\t"
  63924. "adc r7, r7, #0\n\t"
  63925. "lsr r9, r12, #16\n\t"
  63926. "mul r8, r9, r8\n\t"
  63927. "lsr r9, r8, #16\n\t"
  63928. "lsl r8, r8, #16\n\t"
  63929. "adds r5, r5, r8\n\t"
  63930. "adcs r6, r6, r9\n\t"
  63931. "adc r7, r7, #0\n\t"
  63932. "lsr r8, r10, #16\n\t"
  63933. "lsr r9, r12, #16\n\t"
  63934. "mul r9, r8, r9\n\t"
  63935. "adds r6, r6, r9\n\t"
  63936. "adc r7, r7, #0\n\t"
  63937. "lsl r9, r12, #16\n\t"
  63938. "lsr r9, r9, #16\n\t"
  63939. "mul r8, r9, r8\n\t"
  63940. "lsr r9, r8, #16\n\t"
  63941. "lsl r8, r8, #16\n\t"
  63942. "adds r5, r5, r8\n\t"
  63943. "adcs r6, r6, r9\n\t"
  63944. "adc r7, r7, #0\n\t"
  63945. /* A[3] * A[3] */
  63946. "ldr r10, [%[a], #12]\n\t"
  63947. "lsl r8, r10, #16\n\t"
  63948. "lsr r9, r10, #16\n\t"
  63949. "lsr r8, r8, #16\n\t"
  63950. "mov r12, r8\n\t"
  63951. "mul r8, r12, r8\n\t"
  63952. "mov r12, r9\n\t"
  63953. "mul r9, r12, r9\n\t"
  63954. "adds r2, r2, r8\n\t"
  63955. "adcs r3, r3, r9\n\t"
  63956. "adc r4, r4, #0\n\t"
  63957. "lsr r9, r10, #16\n\t"
  63958. "lsl r8, r10, #16\n\t"
  63959. "lsr r8, r8, #16\n\t"
  63960. "mul r8, r9, r8\n\t"
  63961. "lsr r9, r8, #15\n\t"
  63962. "lsl r8, r8, #17\n\t"
  63963. "adds r2, r2, r8\n\t"
  63964. "adcs r3, r3, r9\n\t"
  63965. "adc r4, r4, #0\n\t"
  63966. "adds r5, r5, r5\n\t"
  63967. "adcs r6, r6, r6\n\t"
  63968. "adc r7, r7, r7\n\t"
  63969. "adds r2, r2, r5\n\t"
  63970. "adcs r3, r3, r6\n\t"
  63971. "adc r4, r4, r7\n\t"
  63972. "str r2, [sp, #24]\n\t"
  63973. /* A[0] * A[7] */
  63974. "ldr r10, [%[a], #28]\n\t"
  63975. "ldr r12, [%[a]]\n\t"
  63976. "lsl r8, r10, #16\n\t"
  63977. "lsl r5, r12, #16\n\t"
  63978. "lsr r8, r8, #16\n\t"
  63979. "lsr r5, r5, #16\n\t"
  63980. "mul r5, r8, r5\n\t"
  63981. "lsr r9, r12, #16\n\t"
  63982. "mul r8, r9, r8\n\t"
  63983. "lsr r6, r8, #16\n\t"
  63984. "lsl r8, r8, #16\n\t"
  63985. "adds r5, r5, r8\n\t"
  63986. "adc r6, r6, #0\n\t"
  63987. "lsr r8, r10, #16\n\t"
  63988. "mul r9, r8, r9\n\t"
  63989. "add r6, r6, r9\n\t"
  63990. "lsl r9, r12, #16\n\t"
  63991. "lsr r9, r9, #16\n\t"
  63992. "mul r8, r9, r8\n\t"
  63993. "lsr r9, r8, #16\n\t"
  63994. "lsl r8, r8, #16\n\t"
  63995. "adds r5, r5, r8\n\t"
  63996. "adc r6, r6, r9\n\t"
  63997. "mov r2, #0\n\t"
  63998. "mov r7, #0\n\t"
  63999. /* A[1] * A[6] */
  64000. "ldr r10, [%[a], #24]\n\t"
  64001. "ldr r12, [%[a], #4]\n\t"
  64002. "lsl r8, r10, #16\n\t"
  64003. "lsl r9, r12, #16\n\t"
  64004. "lsr r8, r8, #16\n\t"
  64005. "lsr r9, r9, #16\n\t"
  64006. "mul r9, r8, r9\n\t"
  64007. "adds r5, r5, r9\n\t"
  64008. "adcs r6, r6, #0\n\t"
  64009. "adc r7, r7, #0\n\t"
  64010. "lsr r9, r12, #16\n\t"
  64011. "mul r8, r9, r8\n\t"
  64012. "lsr r9, r8, #16\n\t"
  64013. "lsl r8, r8, #16\n\t"
  64014. "adds r5, r5, r8\n\t"
  64015. "adcs r6, r6, r9\n\t"
  64016. "adc r7, r7, #0\n\t"
  64017. "lsr r8, r10, #16\n\t"
  64018. "lsr r9, r12, #16\n\t"
  64019. "mul r9, r8, r9\n\t"
  64020. "adds r6, r6, r9\n\t"
  64021. "adc r7, r7, #0\n\t"
  64022. "lsl r9, r12, #16\n\t"
  64023. "lsr r9, r9, #16\n\t"
  64024. "mul r8, r9, r8\n\t"
  64025. "lsr r9, r8, #16\n\t"
  64026. "lsl r8, r8, #16\n\t"
  64027. "adds r5, r5, r8\n\t"
  64028. "adcs r6, r6, r9\n\t"
  64029. "adc r7, r7, #0\n\t"
  64030. /* A[2] * A[5] */
  64031. "ldr r10, [%[a], #20]\n\t"
  64032. "ldr r12, [%[a], #8]\n\t"
  64033. "lsl r8, r10, #16\n\t"
  64034. "lsl r9, r12, #16\n\t"
  64035. "lsr r8, r8, #16\n\t"
  64036. "lsr r9, r9, #16\n\t"
  64037. "mul r9, r8, r9\n\t"
  64038. "adds r5, r5, r9\n\t"
  64039. "adcs r6, r6, #0\n\t"
  64040. "adc r7, r7, #0\n\t"
  64041. "lsr r9, r12, #16\n\t"
  64042. "mul r8, r9, r8\n\t"
  64043. "lsr r9, r8, #16\n\t"
  64044. "lsl r8, r8, #16\n\t"
  64045. "adds r5, r5, r8\n\t"
  64046. "adcs r6, r6, r9\n\t"
  64047. "adc r7, r7, #0\n\t"
  64048. "lsr r8, r10, #16\n\t"
  64049. "lsr r9, r12, #16\n\t"
  64050. "mul r9, r8, r9\n\t"
  64051. "adds r6, r6, r9\n\t"
  64052. "adc r7, r7, #0\n\t"
  64053. "lsl r9, r12, #16\n\t"
  64054. "lsr r9, r9, #16\n\t"
  64055. "mul r8, r9, r8\n\t"
  64056. "lsr r9, r8, #16\n\t"
  64057. "lsl r8, r8, #16\n\t"
  64058. "adds r5, r5, r8\n\t"
  64059. "adcs r6, r6, r9\n\t"
  64060. "adc r7, r7, #0\n\t"
  64061. /* A[3] * A[4] */
  64062. "ldr r10, [%[a], #16]\n\t"
  64063. "ldr r12, [%[a], #12]\n\t"
  64064. "lsl r8, r10, #16\n\t"
  64065. "lsl r9, r12, #16\n\t"
  64066. "lsr r8, r8, #16\n\t"
  64067. "lsr r9, r9, #16\n\t"
  64068. "mul r9, r8, r9\n\t"
  64069. "adds r5, r5, r9\n\t"
  64070. "adcs r6, r6, #0\n\t"
  64071. "adc r7, r7, #0\n\t"
  64072. "lsr r9, r12, #16\n\t"
  64073. "mul r8, r9, r8\n\t"
  64074. "lsr r9, r8, #16\n\t"
  64075. "lsl r8, r8, #16\n\t"
  64076. "adds r5, r5, r8\n\t"
  64077. "adcs r6, r6, r9\n\t"
  64078. "adc r7, r7, #0\n\t"
  64079. "lsr r8, r10, #16\n\t"
  64080. "lsr r9, r12, #16\n\t"
  64081. "mul r9, r8, r9\n\t"
  64082. "adds r6, r6, r9\n\t"
  64083. "adc r7, r7, #0\n\t"
  64084. "lsl r9, r12, #16\n\t"
  64085. "lsr r9, r9, #16\n\t"
  64086. "mul r8, r9, r8\n\t"
  64087. "lsr r9, r8, #16\n\t"
  64088. "lsl r8, r8, #16\n\t"
  64089. "adds r5, r5, r8\n\t"
  64090. "adcs r6, r6, r9\n\t"
  64091. "adc r7, r7, #0\n\t"
  64092. "adds r5, r5, r5\n\t"
  64093. "adcs r6, r6, r6\n\t"
  64094. "adc r7, r7, r7\n\t"
  64095. "adds r3, r3, r5\n\t"
  64096. "adcs r4, r4, r6\n\t"
  64097. "adc r2, r2, r7\n\t"
  64098. "str r3, [sp, #28]\n\t"
  64099. /* A[1] * A[7] */
  64100. "ldr r10, [%[a], #28]\n\t"
  64101. "ldr r12, [%[a], #4]\n\t"
  64102. "lsl r8, r10, #16\n\t"
  64103. "lsl r5, r12, #16\n\t"
  64104. "lsr r8, r8, #16\n\t"
  64105. "lsr r5, r5, #16\n\t"
  64106. "mul r5, r8, r5\n\t"
  64107. "lsr r9, r12, #16\n\t"
  64108. "mul r8, r9, r8\n\t"
  64109. "lsr r6, r8, #16\n\t"
  64110. "lsl r8, r8, #16\n\t"
  64111. "adds r5, r5, r8\n\t"
  64112. "adc r6, r6, #0\n\t"
  64113. "lsr r8, r10, #16\n\t"
  64114. "mul r9, r8, r9\n\t"
  64115. "add r6, r6, r9\n\t"
  64116. "lsl r9, r12, #16\n\t"
  64117. "lsr r9, r9, #16\n\t"
  64118. "mul r8, r9, r8\n\t"
  64119. "lsr r9, r8, #16\n\t"
  64120. "lsl r8, r8, #16\n\t"
  64121. "adds r5, r5, r8\n\t"
  64122. "adc r6, r6, r9\n\t"
  64123. "mov r3, #0\n\t"
  64124. "mov r7, #0\n\t"
  64125. /* A[2] * A[6] */
  64126. "ldr r10, [%[a], #24]\n\t"
  64127. "ldr r12, [%[a], #8]\n\t"
  64128. "lsl r8, r10, #16\n\t"
  64129. "lsl r9, r12, #16\n\t"
  64130. "lsr r8, r8, #16\n\t"
  64131. "lsr r9, r9, #16\n\t"
  64132. "mul r9, r8, r9\n\t"
  64133. "adds r5, r5, r9\n\t"
  64134. "adcs r6, r6, #0\n\t"
  64135. "adc r7, r7, #0\n\t"
  64136. "lsr r9, r12, #16\n\t"
  64137. "mul r8, r9, r8\n\t"
  64138. "lsr r9, r8, #16\n\t"
  64139. "lsl r8, r8, #16\n\t"
  64140. "adds r5, r5, r8\n\t"
  64141. "adcs r6, r6, r9\n\t"
  64142. "adc r7, r7, #0\n\t"
  64143. "lsr r8, r10, #16\n\t"
  64144. "lsr r9, r12, #16\n\t"
  64145. "mul r9, r8, r9\n\t"
  64146. "adds r6, r6, r9\n\t"
  64147. "adc r7, r7, #0\n\t"
  64148. "lsl r9, r12, #16\n\t"
  64149. "lsr r9, r9, #16\n\t"
  64150. "mul r8, r9, r8\n\t"
  64151. "lsr r9, r8, #16\n\t"
  64152. "lsl r8, r8, #16\n\t"
  64153. "adds r5, r5, r8\n\t"
  64154. "adcs r6, r6, r9\n\t"
  64155. "adc r7, r7, #0\n\t"
  64156. /* A[3] * A[5] */
  64157. "ldr r10, [%[a], #20]\n\t"
  64158. "ldr r12, [%[a], #12]\n\t"
  64159. "lsl r8, r10, #16\n\t"
  64160. "lsl r9, r12, #16\n\t"
  64161. "lsr r8, r8, #16\n\t"
  64162. "lsr r9, r9, #16\n\t"
  64163. "mul r9, r8, r9\n\t"
  64164. "adds r5, r5, r9\n\t"
  64165. "adcs r6, r6, #0\n\t"
  64166. "adc r7, r7, #0\n\t"
  64167. "lsr r9, r12, #16\n\t"
  64168. "mul r8, r9, r8\n\t"
  64169. "lsr r9, r8, #16\n\t"
  64170. "lsl r8, r8, #16\n\t"
  64171. "adds r5, r5, r8\n\t"
  64172. "adcs r6, r6, r9\n\t"
  64173. "adc r7, r7, #0\n\t"
  64174. "lsr r8, r10, #16\n\t"
  64175. "lsr r9, r12, #16\n\t"
  64176. "mul r9, r8, r9\n\t"
  64177. "adds r6, r6, r9\n\t"
  64178. "adc r7, r7, #0\n\t"
  64179. "lsl r9, r12, #16\n\t"
  64180. "lsr r9, r9, #16\n\t"
  64181. "mul r8, r9, r8\n\t"
  64182. "lsr r9, r8, #16\n\t"
  64183. "lsl r8, r8, #16\n\t"
  64184. "adds r5, r5, r8\n\t"
  64185. "adcs r6, r6, r9\n\t"
  64186. "adc r7, r7, #0\n\t"
  64187. /* A[4] * A[4] */
  64188. "ldr r10, [%[a], #16]\n\t"
  64189. "lsl r8, r10, #16\n\t"
  64190. "lsr r9, r10, #16\n\t"
  64191. "lsr r8, r8, #16\n\t"
  64192. "mov r12, r8\n\t"
  64193. "mul r8, r12, r8\n\t"
  64194. "mov r12, r9\n\t"
  64195. "mul r9, r12, r9\n\t"
  64196. "adds r4, r4, r8\n\t"
  64197. "adcs r2, r2, r9\n\t"
  64198. "adc r3, r3, #0\n\t"
  64199. "lsr r9, r10, #16\n\t"
  64200. "lsl r8, r10, #16\n\t"
  64201. "lsr r8, r8, #16\n\t"
  64202. "mul r8, r9, r8\n\t"
  64203. "lsr r9, r8, #15\n\t"
  64204. "lsl r8, r8, #17\n\t"
  64205. "adds r4, r4, r8\n\t"
  64206. "adcs r2, r2, r9\n\t"
  64207. "adc r3, r3, #0\n\t"
  64208. "adds r5, r5, r5\n\t"
  64209. "adcs r6, r6, r6\n\t"
  64210. "adc r7, r7, r7\n\t"
  64211. "adds r4, r4, r5\n\t"
  64212. "adcs r2, r2, r6\n\t"
  64213. "adc r3, r3, r7\n\t"
  64214. "str r4, [%[r], #32]\n\t"
  64215. /* A[2] * A[7] */
  64216. "ldr r10, [%[a], #28]\n\t"
  64217. "ldr r12, [%[a], #8]\n\t"
  64218. "lsl r8, r10, #16\n\t"
  64219. "lsl r5, r12, #16\n\t"
  64220. "lsr r8, r8, #16\n\t"
  64221. "lsr r5, r5, #16\n\t"
  64222. "mul r5, r8, r5\n\t"
  64223. "lsr r9, r12, #16\n\t"
  64224. "mul r8, r9, r8\n\t"
  64225. "lsr r6, r8, #16\n\t"
  64226. "lsl r8, r8, #16\n\t"
  64227. "adds r5, r5, r8\n\t"
  64228. "adc r6, r6, #0\n\t"
  64229. "lsr r8, r10, #16\n\t"
  64230. "mul r9, r8, r9\n\t"
  64231. "add r6, r6, r9\n\t"
  64232. "lsl r9, r12, #16\n\t"
  64233. "lsr r9, r9, #16\n\t"
  64234. "mul r8, r9, r8\n\t"
  64235. "lsr r9, r8, #16\n\t"
  64236. "lsl r8, r8, #16\n\t"
  64237. "adds r5, r5, r8\n\t"
  64238. "adc r6, r6, r9\n\t"
  64239. "mov r4, #0\n\t"
  64240. "mov r7, #0\n\t"
  64241. /* A[3] * A[6] */
  64242. "ldr r10, [%[a], #24]\n\t"
  64243. "ldr r12, [%[a], #12]\n\t"
  64244. "lsl r8, r10, #16\n\t"
  64245. "lsl r9, r12, #16\n\t"
  64246. "lsr r8, r8, #16\n\t"
  64247. "lsr r9, r9, #16\n\t"
  64248. "mul r9, r8, r9\n\t"
  64249. "adds r5, r5, r9\n\t"
  64250. "adcs r6, r6, #0\n\t"
  64251. "adc r7, r7, #0\n\t"
  64252. "lsr r9, r12, #16\n\t"
  64253. "mul r8, r9, r8\n\t"
  64254. "lsr r9, r8, #16\n\t"
  64255. "lsl r8, r8, #16\n\t"
  64256. "adds r5, r5, r8\n\t"
  64257. "adcs r6, r6, r9\n\t"
  64258. "adc r7, r7, #0\n\t"
  64259. "lsr r8, r10, #16\n\t"
  64260. "lsr r9, r12, #16\n\t"
  64261. "mul r9, r8, r9\n\t"
  64262. "adds r6, r6, r9\n\t"
  64263. "adc r7, r7, #0\n\t"
  64264. "lsl r9, r12, #16\n\t"
  64265. "lsr r9, r9, #16\n\t"
  64266. "mul r8, r9, r8\n\t"
  64267. "lsr r9, r8, #16\n\t"
  64268. "lsl r8, r8, #16\n\t"
  64269. "adds r5, r5, r8\n\t"
  64270. "adcs r6, r6, r9\n\t"
  64271. "adc r7, r7, #0\n\t"
  64272. /* A[4] * A[5] */
  64273. "ldr r10, [%[a], #20]\n\t"
  64274. "ldr r12, [%[a], #16]\n\t"
  64275. "lsl r8, r10, #16\n\t"
  64276. "lsl r9, r12, #16\n\t"
  64277. "lsr r8, r8, #16\n\t"
  64278. "lsr r9, r9, #16\n\t"
  64279. "mul r9, r8, r9\n\t"
  64280. "adds r5, r5, r9\n\t"
  64281. "adcs r6, r6, #0\n\t"
  64282. "adc r7, r7, #0\n\t"
  64283. "lsr r9, r12, #16\n\t"
  64284. "mul r8, r9, r8\n\t"
  64285. "lsr r9, r8, #16\n\t"
  64286. "lsl r8, r8, #16\n\t"
  64287. "adds r5, r5, r8\n\t"
  64288. "adcs r6, r6, r9\n\t"
  64289. "adc r7, r7, #0\n\t"
  64290. "lsr r8, r10, #16\n\t"
  64291. "lsr r9, r12, #16\n\t"
  64292. "mul r9, r8, r9\n\t"
  64293. "adds r6, r6, r9\n\t"
  64294. "adc r7, r7, #0\n\t"
  64295. "lsl r9, r12, #16\n\t"
  64296. "lsr r9, r9, #16\n\t"
  64297. "mul r8, r9, r8\n\t"
  64298. "lsr r9, r8, #16\n\t"
  64299. "lsl r8, r8, #16\n\t"
  64300. "adds r5, r5, r8\n\t"
  64301. "adcs r6, r6, r9\n\t"
  64302. "adc r7, r7, #0\n\t"
  64303. "adds r5, r5, r5\n\t"
  64304. "adcs r6, r6, r6\n\t"
  64305. "adc r7, r7, r7\n\t"
  64306. "adds r2, r2, r5\n\t"
  64307. "adcs r3, r3, r6\n\t"
  64308. "adc r4, r4, r7\n\t"
  64309. "str r2, [%[r], #36]\n\t"
  64310. /* A[3] * A[7] */
  64311. "ldr r10, [%[a], #28]\n\t"
  64312. "ldr r12, [%[a], #12]\n\t"
  64313. "lsl r8, r10, #16\n\t"
  64314. "lsl r9, r12, #16\n\t"
  64315. "lsr r8, r8, #16\n\t"
  64316. "lsr r9, r9, #16\n\t"
  64317. "mul r9, r8, r9\n\t"
  64318. "adds r3, r3, r9\n\t"
  64319. "adcs r4, r4, #0\n\t"
  64320. "mov r2, #0\n\t"
  64321. "adc r2, r2, #0\n\t"
  64322. "adds r3, r3, r9\n\t"
  64323. "adcs r4, r4, #0\n\t"
  64324. "adc r2, r2, #0\n\t"
  64325. "lsr r9, r12, #16\n\t"
  64326. "mul r8, r9, r8\n\t"
  64327. "lsr r9, r8, #16\n\t"
  64328. "lsl r8, r8, #16\n\t"
  64329. "adds r3, r3, r8\n\t"
  64330. "adcs r4, r4, r9\n\t"
  64331. "adc r2, r2, #0\n\t"
  64332. "adds r3, r3, r8\n\t"
  64333. "adcs r4, r4, r9\n\t"
  64334. "adc r2, r2, #0\n\t"
  64335. "lsr r8, r10, #16\n\t"
  64336. "lsr r9, r12, #16\n\t"
  64337. "mul r9, r8, r9\n\t"
  64338. "adds r4, r4, r9\n\t"
  64339. "adc r2, r2, #0\n\t"
  64340. "adds r4, r4, r9\n\t"
  64341. "adc r2, r2, #0\n\t"
  64342. "lsl r9, r12, #16\n\t"
  64343. "lsr r9, r9, #16\n\t"
  64344. "mul r8, r9, r8\n\t"
  64345. "lsr r9, r8, #16\n\t"
  64346. "lsl r8, r8, #16\n\t"
  64347. "adds r3, r3, r8\n\t"
  64348. "adcs r4, r4, r9\n\t"
  64349. "adc r2, r2, #0\n\t"
  64350. "adds r3, r3, r8\n\t"
  64351. "adcs r4, r4, r9\n\t"
  64352. "adc r2, r2, #0\n\t"
  64353. /* A[4] * A[6] */
  64354. "ldr r10, [%[a], #24]\n\t"
  64355. "ldr r12, [%[a], #16]\n\t"
  64356. "lsl r8, r10, #16\n\t"
  64357. "lsl r9, r12, #16\n\t"
  64358. "lsr r8, r8, #16\n\t"
  64359. "lsr r9, r9, #16\n\t"
  64360. "mul r9, r8, r9\n\t"
  64361. "adds r3, r3, r9\n\t"
  64362. "adcs r4, r4, #0\n\t"
  64363. "adc r2, r2, #0\n\t"
  64364. "adds r3, r3, r9\n\t"
  64365. "adcs r4, r4, #0\n\t"
  64366. "adc r2, r2, #0\n\t"
  64367. "lsr r9, r12, #16\n\t"
  64368. "mul r8, r9, r8\n\t"
  64369. "lsr r9, r8, #16\n\t"
  64370. "lsl r8, r8, #16\n\t"
  64371. "adds r3, r3, r8\n\t"
  64372. "adcs r4, r4, r9\n\t"
  64373. "adc r2, r2, #0\n\t"
  64374. "adds r3, r3, r8\n\t"
  64375. "adcs r4, r4, r9\n\t"
  64376. "adc r2, r2, #0\n\t"
  64377. "lsr r8, r10, #16\n\t"
  64378. "lsr r9, r12, #16\n\t"
  64379. "mul r9, r8, r9\n\t"
  64380. "adds r4, r4, r9\n\t"
  64381. "adc r2, r2, #0\n\t"
  64382. "adds r4, r4, r9\n\t"
  64383. "adc r2, r2, #0\n\t"
  64384. "lsl r9, r12, #16\n\t"
  64385. "lsr r9, r9, #16\n\t"
  64386. "mul r8, r9, r8\n\t"
  64387. "lsr r9, r8, #16\n\t"
  64388. "lsl r8, r8, #16\n\t"
  64389. "adds r3, r3, r8\n\t"
  64390. "adcs r4, r4, r9\n\t"
  64391. "adc r2, r2, #0\n\t"
  64392. "adds r3, r3, r8\n\t"
  64393. "adcs r4, r4, r9\n\t"
  64394. "adc r2, r2, #0\n\t"
  64395. /* A[5] * A[5] */
  64396. "ldr r10, [%[a], #20]\n\t"
  64397. "lsl r8, r10, #16\n\t"
  64398. "lsr r9, r10, #16\n\t"
  64399. "lsr r8, r8, #16\n\t"
  64400. "mov r12, r8\n\t"
  64401. "mul r8, r12, r8\n\t"
  64402. "mov r12, r9\n\t"
  64403. "mul r9, r12, r9\n\t"
  64404. "adds r3, r3, r8\n\t"
  64405. "adcs r4, r4, r9\n\t"
  64406. "adc r2, r2, #0\n\t"
  64407. "lsr r9, r10, #16\n\t"
  64408. "lsl r8, r10, #16\n\t"
  64409. "lsr r8, r8, #16\n\t"
  64410. "mul r8, r9, r8\n\t"
  64411. "lsr r9, r8, #15\n\t"
  64412. "lsl r8, r8, #17\n\t"
  64413. "adds r3, r3, r8\n\t"
  64414. "adcs r4, r4, r9\n\t"
  64415. "adc r2, r2, #0\n\t"
  64416. "str r3, [%[r], #40]\n\t"
  64417. /* A[4] * A[7] */
  64418. "ldr r10, [%[a], #28]\n\t"
  64419. "ldr r12, [%[a], #16]\n\t"
  64420. "lsl r8, r10, #16\n\t"
  64421. "lsl r9, r12, #16\n\t"
  64422. "lsr r8, r8, #16\n\t"
  64423. "lsr r9, r9, #16\n\t"
  64424. "mul r9, r8, r9\n\t"
  64425. "adds r4, r4, r9\n\t"
  64426. "adcs r2, r2, #0\n\t"
  64427. "mov r3, #0\n\t"
  64428. "adc r3, r3, #0\n\t"
  64429. "adds r4, r4, r9\n\t"
  64430. "adcs r2, r2, #0\n\t"
  64431. "adc r3, r3, #0\n\t"
  64432. "lsr r9, r12, #16\n\t"
  64433. "mul r8, r9, r8\n\t"
  64434. "lsr r9, r8, #16\n\t"
  64435. "lsl r8, r8, #16\n\t"
  64436. "adds r4, r4, r8\n\t"
  64437. "adcs r2, r2, r9\n\t"
  64438. "adc r3, r3, #0\n\t"
  64439. "adds r4, r4, r8\n\t"
  64440. "adcs r2, r2, r9\n\t"
  64441. "adc r3, r3, #0\n\t"
  64442. "lsr r8, r10, #16\n\t"
  64443. "lsr r9, r12, #16\n\t"
  64444. "mul r9, r8, r9\n\t"
  64445. "adds r2, r2, r9\n\t"
  64446. "adc r3, r3, #0\n\t"
  64447. "adds r2, r2, r9\n\t"
  64448. "adc r3, r3, #0\n\t"
  64449. "lsl r9, r12, #16\n\t"
  64450. "lsr r9, r9, #16\n\t"
  64451. "mul r8, r9, r8\n\t"
  64452. "lsr r9, r8, #16\n\t"
  64453. "lsl r8, r8, #16\n\t"
  64454. "adds r4, r4, r8\n\t"
  64455. "adcs r2, r2, r9\n\t"
  64456. "adc r3, r3, #0\n\t"
  64457. "adds r4, r4, r8\n\t"
  64458. "adcs r2, r2, r9\n\t"
  64459. "adc r3, r3, #0\n\t"
  64460. /* A[5] * A[6] */
  64461. "ldr r10, [%[a], #24]\n\t"
  64462. "ldr r12, [%[a], #20]\n\t"
  64463. "lsl r8, r10, #16\n\t"
  64464. "lsl r9, r12, #16\n\t"
  64465. "lsr r8, r8, #16\n\t"
  64466. "lsr r9, r9, #16\n\t"
  64467. "mul r9, r8, r9\n\t"
  64468. "adds r4, r4, r9\n\t"
  64469. "adcs r2, r2, #0\n\t"
  64470. "adc r3, r3, #0\n\t"
  64471. "adds r4, r4, r9\n\t"
  64472. "adcs r2, r2, #0\n\t"
  64473. "adc r3, r3, #0\n\t"
  64474. "lsr r9, r12, #16\n\t"
  64475. "mul r8, r9, r8\n\t"
  64476. "lsr r9, r8, #16\n\t"
  64477. "lsl r8, r8, #16\n\t"
  64478. "adds r4, r4, r8\n\t"
  64479. "adcs r2, r2, r9\n\t"
  64480. "adc r3, r3, #0\n\t"
  64481. "adds r4, r4, r8\n\t"
  64482. "adcs r2, r2, r9\n\t"
  64483. "adc r3, r3, #0\n\t"
  64484. "lsr r8, r10, #16\n\t"
  64485. "lsr r9, r12, #16\n\t"
  64486. "mul r9, r8, r9\n\t"
  64487. "adds r2, r2, r9\n\t"
  64488. "adc r3, r3, #0\n\t"
  64489. "adds r2, r2, r9\n\t"
  64490. "adc r3, r3, #0\n\t"
  64491. "lsl r9, r12, #16\n\t"
  64492. "lsr r9, r9, #16\n\t"
  64493. "mul r8, r9, r8\n\t"
  64494. "lsr r9, r8, #16\n\t"
  64495. "lsl r8, r8, #16\n\t"
  64496. "adds r4, r4, r8\n\t"
  64497. "adcs r2, r2, r9\n\t"
  64498. "adc r3, r3, #0\n\t"
  64499. "adds r4, r4, r8\n\t"
  64500. "adcs r2, r2, r9\n\t"
  64501. "adc r3, r3, #0\n\t"
  64502. "str r4, [%[r], #44]\n\t"
  64503. /* A[5] * A[7] */
  64504. "ldr r10, [%[a], #28]\n\t"
  64505. "ldr r12, [%[a], #20]\n\t"
  64506. "lsl r8, r10, #16\n\t"
  64507. "lsl r9, r12, #16\n\t"
  64508. "lsr r8, r8, #16\n\t"
  64509. "lsr r9, r9, #16\n\t"
  64510. "mul r9, r8, r9\n\t"
  64511. "adds r2, r2, r9\n\t"
  64512. "adcs r3, r3, #0\n\t"
  64513. "mov r4, #0\n\t"
  64514. "adc r4, r4, #0\n\t"
  64515. "adds r2, r2, r9\n\t"
  64516. "adcs r3, r3, #0\n\t"
  64517. "adc r4, r4, #0\n\t"
  64518. "lsr r9, r12, #16\n\t"
  64519. "mul r8, r9, r8\n\t"
  64520. "lsr r9, r8, #16\n\t"
  64521. "lsl r8, r8, #16\n\t"
  64522. "adds r2, r2, r8\n\t"
  64523. "adcs r3, r3, r9\n\t"
  64524. "adc r4, r4, #0\n\t"
  64525. "adds r2, r2, r8\n\t"
  64526. "adcs r3, r3, r9\n\t"
  64527. "adc r4, r4, #0\n\t"
  64528. "lsr r8, r10, #16\n\t"
  64529. "lsr r9, r12, #16\n\t"
  64530. "mul r9, r8, r9\n\t"
  64531. "adds r3, r3, r9\n\t"
  64532. "adc r4, r4, #0\n\t"
  64533. "adds r3, r3, r9\n\t"
  64534. "adc r4, r4, #0\n\t"
  64535. "lsl r9, r12, #16\n\t"
  64536. "lsr r9, r9, #16\n\t"
  64537. "mul r8, r9, r8\n\t"
  64538. "lsr r9, r8, #16\n\t"
  64539. "lsl r8, r8, #16\n\t"
  64540. "adds r2, r2, r8\n\t"
  64541. "adcs r3, r3, r9\n\t"
  64542. "adc r4, r4, #0\n\t"
  64543. "adds r2, r2, r8\n\t"
  64544. "adcs r3, r3, r9\n\t"
  64545. "adc r4, r4, #0\n\t"
  64546. /* A[6] * A[6] */
  64547. "ldr r10, [%[a], #24]\n\t"
  64548. "lsl r8, r10, #16\n\t"
  64549. "lsr r9, r10, #16\n\t"
  64550. "lsr r8, r8, #16\n\t"
  64551. "mov r12, r8\n\t"
  64552. "mul r8, r12, r8\n\t"
  64553. "mov r12, r9\n\t"
  64554. "mul r9, r12, r9\n\t"
  64555. "adds r2, r2, r8\n\t"
  64556. "adcs r3, r3, r9\n\t"
  64557. "adc r4, r4, #0\n\t"
  64558. "lsr r9, r10, #16\n\t"
  64559. "lsl r8, r10, #16\n\t"
  64560. "lsr r8, r8, #16\n\t"
  64561. "mul r8, r9, r8\n\t"
  64562. "lsr r9, r8, #15\n\t"
  64563. "lsl r8, r8, #17\n\t"
  64564. "adds r2, r2, r8\n\t"
  64565. "adcs r3, r3, r9\n\t"
  64566. "adc r4, r4, #0\n\t"
  64567. "str r2, [%[r], #48]\n\t"
  64568. /* A[6] * A[7] */
  64569. "ldr r10, [%[a], #28]\n\t"
  64570. "ldr r12, [%[a], #24]\n\t"
  64571. "lsl r8, r10, #16\n\t"
  64572. "lsl r9, r12, #16\n\t"
  64573. "lsr r8, r8, #16\n\t"
  64574. "lsr r9, r9, #16\n\t"
  64575. "mul r9, r8, r9\n\t"
  64576. "adds r3, r3, r9\n\t"
  64577. "adcs r4, r4, #0\n\t"
  64578. "mov r2, #0\n\t"
  64579. "adc r2, r2, #0\n\t"
  64580. "adds r3, r3, r9\n\t"
  64581. "adcs r4, r4, #0\n\t"
  64582. "adc r2, r2, #0\n\t"
  64583. "lsr r9, r12, #16\n\t"
  64584. "mul r8, r9, r8\n\t"
  64585. "lsr r9, r8, #16\n\t"
  64586. "lsl r8, r8, #16\n\t"
  64587. "adds r3, r3, r8\n\t"
  64588. "adcs r4, r4, r9\n\t"
  64589. "adc r2, r2, #0\n\t"
  64590. "adds r3, r3, r8\n\t"
  64591. "adcs r4, r4, r9\n\t"
  64592. "adc r2, r2, #0\n\t"
  64593. "lsr r8, r10, #16\n\t"
  64594. "lsr r9, r12, #16\n\t"
  64595. "mul r9, r8, r9\n\t"
  64596. "adds r4, r4, r9\n\t"
  64597. "adc r2, r2, #0\n\t"
  64598. "adds r4, r4, r9\n\t"
  64599. "adc r2, r2, #0\n\t"
  64600. "lsl r9, r12, #16\n\t"
  64601. "lsr r9, r9, #16\n\t"
  64602. "mul r8, r9, r8\n\t"
  64603. "lsr r9, r8, #16\n\t"
  64604. "lsl r8, r8, #16\n\t"
  64605. "adds r3, r3, r8\n\t"
  64606. "adcs r4, r4, r9\n\t"
  64607. "adc r2, r2, #0\n\t"
  64608. "adds r3, r3, r8\n\t"
  64609. "adcs r4, r4, r9\n\t"
  64610. "adc r2, r2, #0\n\t"
  64611. "str r3, [%[r], #52]\n\t"
  64612. /* A[7] * A[7] */
  64613. "ldr r10, [%[a], #28]\n\t"
  64614. "lsl r8, r10, #16\n\t"
  64615. "lsr r9, r10, #16\n\t"
  64616. "lsr r8, r8, #16\n\t"
  64617. "mov r12, r8\n\t"
  64618. "mul r8, r12, r8\n\t"
  64619. "mov r12, r9\n\t"
  64620. "mul r9, r12, r9\n\t"
  64621. "adds r4, r4, r8\n\t"
  64622. "adc r2, r2, r9\n\t"
  64623. "lsr r9, r10, #16\n\t"
  64624. "lsl r8, r10, #16\n\t"
  64625. "lsr r8, r8, #16\n\t"
  64626. "mul r8, r9, r8\n\t"
  64627. "lsr r9, r8, #15\n\t"
  64628. "lsl r8, r8, #17\n\t"
  64629. "adds r4, r4, r8\n\t"
  64630. "adc r2, r2, r9\n\t"
  64631. "str r4, [%[r], #56]\n\t"
  64632. "str r2, [%[r], #60]\n\t"
  64633. "ldm sp!, {r2, r3, r4, r8}\n\t"
  64634. "stm %[r]!, {r2, r3, r4, r8}\n\t"
  64635. "ldm sp!, {r2, r3, r4, r8}\n\t"
  64636. "stm %[r]!, {r2, r3, r4, r8}\n\t"
  64637. : [r] "+r" (r), [a] "+r" (a)
  64638. :
  64639. : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r12", "cc"
  64640. );
  64641. }
  64642. #elif defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  64643. /* Square a and put result in r. (r = a * a)
  64644. *
  64645. * r A single precision integer.
  64646. * a A single precision integer.
  64647. */
  64648. static void sp_256_sqr_8(sp_digit* r_p, const sp_digit* a_p)
  64649. {
  64650. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  64651. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  64652. __asm__ __volatile__ (
  64653. "sub sp, sp, #0x44\n\t"
  64654. "str %[r], [sp, #64]\n\t"
  64655. "mov %[r], #0\n\t"
  64656. "ldr r12, [%[a]]\n\t"
  64657. /* A[0] * A[1] */
  64658. "ldr lr, [%[a], #4]\n\t"
  64659. "umull r4, r5, r12, lr\n\t"
  64660. /* A[0] * A[3] */
  64661. "ldr lr, [%[a], #12]\n\t"
  64662. "umull r6, r7, r12, lr\n\t"
  64663. /* A[0] * A[5] */
  64664. "ldr lr, [%[a], #20]\n\t"
  64665. "umull r8, r9, r12, lr\n\t"
  64666. /* A[0] * A[7] */
  64667. "ldr lr, [%[a], #28]\n\t"
  64668. "umull r10, r3, r12, lr\n\t"
  64669. /* A[0] * A[2] */
  64670. "ldr lr, [%[a], #8]\n\t"
  64671. "mov r11, #0\n\t"
  64672. "umlal r5, r11, r12, lr\n\t"
  64673. "adds r6, r6, r11\n\t"
  64674. /* A[0] * A[4] */
  64675. "ldr lr, [%[a], #16]\n\t"
  64676. "adcs r7, r7, #0\n\t"
  64677. "adc r11, %[r], #0\n\t"
  64678. "umlal r7, r11, r12, lr\n\t"
  64679. "adds r8, r8, r11\n\t"
  64680. /* A[0] * A[6] */
  64681. "ldr lr, [%[a], #24]\n\t"
  64682. "adcs r9, r9, #0\n\t"
  64683. "adc r11, %[r], #0\n\t"
  64684. "umlal r9, r11, r12, lr\n\t"
  64685. "adds r10, r10, r11\n\t"
  64686. "adcs r3, r3, #0\n\t"
  64687. "str r4, [sp, #4]\n\t"
  64688. "str r5, [sp, #8]\n\t"
  64689. /* A[1] * A[2] */
  64690. "ldr r12, [%[a], #4]\n\t"
  64691. "ldr lr, [%[a], #8]\n\t"
  64692. "mov r11, #0\n\t"
  64693. "umlal r6, r11, r12, lr\n\t"
  64694. "str r6, [sp, #12]\n\t"
  64695. "adds r7, r7, r11\n\t"
  64696. /* A[1] * A[3] */
  64697. "ldr lr, [%[a], #12]\n\t"
  64698. "adc r11, %[r], #0\n\t"
  64699. "umlal r7, r11, r12, lr\n\t"
  64700. "str r7, [sp, #16]\n\t"
  64701. "adds r8, r8, r11\n\t"
  64702. /* A[1] * A[4] */
  64703. "ldr lr, [%[a], #16]\n\t"
  64704. "adc r11, %[r], #0\n\t"
  64705. "umlal r8, r11, r12, lr\n\t"
  64706. "adds r9, r9, r11\n\t"
  64707. /* A[1] * A[5] */
  64708. "ldr lr, [%[a], #20]\n\t"
  64709. "adc r11, %[r], #0\n\t"
  64710. "umlal r9, r11, r12, lr\n\t"
  64711. "adds r10, r10, r11\n\t"
  64712. /* A[1] * A[6] */
  64713. "ldr lr, [%[a], #24]\n\t"
  64714. "adc r11, %[r], #0\n\t"
  64715. "umlal r10, r11, r12, lr\n\t"
  64716. "adds r3, r3, r11\n\t"
  64717. /* A[1] * A[7] */
  64718. "ldr lr, [%[a], #28]\n\t"
  64719. "adc r4, %[r], #0\n\t"
  64720. "umlal r3, r4, r12, lr\n\t"
  64721. /* A[2] * A[3] */
  64722. "ldr r12, [%[a], #8]\n\t"
  64723. "ldr lr, [%[a], #12]\n\t"
  64724. "mov r11, #0\n\t"
  64725. "umlal r8, r11, r12, lr\n\t"
  64726. "str r8, [sp, #20]\n\t"
  64727. "adds r9, r9, r11\n\t"
  64728. /* A[2] * A[4] */
  64729. "ldr lr, [%[a], #16]\n\t"
  64730. "adc r11, %[r], #0\n\t"
  64731. "umlal r9, r11, r12, lr\n\t"
  64732. "str r9, [sp, #24]\n\t"
  64733. "adds r10, r10, r11\n\t"
  64734. /* A[2] * A[5] */
  64735. "ldr lr, [%[a], #20]\n\t"
  64736. "adc r11, %[r], #0\n\t"
  64737. "umlal r10, r11, r12, lr\n\t"
  64738. "adds r3, r3, r11\n\t"
  64739. /* A[2] * A[6] */
  64740. "ldr lr, [%[a], #24]\n\t"
  64741. "adc r11, %[r], #0\n\t"
  64742. "umlal r3, r11, r12, lr\n\t"
  64743. "adds r4, r4, r11\n\t"
  64744. /* A[2] * A[7] */
  64745. "ldr lr, [%[a], #28]\n\t"
  64746. "adc r5, %[r], #0\n\t"
  64747. "umlal r4, r5, r12, lr\n\t"
  64748. /* A[3] * A[4] */
  64749. "ldr r12, [%[a], #12]\n\t"
  64750. "ldr lr, [%[a], #16]\n\t"
  64751. "mov r11, #0\n\t"
  64752. "umlal r10, r11, r12, lr\n\t"
  64753. "str r10, [sp, #28]\n\t"
  64754. "adds r3, r3, r11\n\t"
  64755. /* A[3] * A[5] */
  64756. "ldr lr, [%[a], #20]\n\t"
  64757. "adc r11, %[r], #0\n\t"
  64758. "umlal r3, r11, r12, lr\n\t"
  64759. "adds r4, r4, r11\n\t"
  64760. /* A[3] * A[6] */
  64761. "ldr lr, [%[a], #24]\n\t"
  64762. "adc r11, %[r], #0\n\t"
  64763. "umlal r4, r11, r12, lr\n\t"
  64764. "adds r5, r5, r11\n\t"
  64765. /* A[3] * A[7] */
  64766. "ldr lr, [%[a], #28]\n\t"
  64767. "adc r6, %[r], #0\n\t"
  64768. "umlal r5, r6, r12, lr\n\t"
  64769. /* A[4] * A[5] */
  64770. "ldr r12, [%[a], #16]\n\t"
  64771. "ldr lr, [%[a], #20]\n\t"
  64772. "mov r11, #0\n\t"
  64773. "umlal r4, r11, r12, lr\n\t"
  64774. "adds r5, r5, r11\n\t"
  64775. /* A[4] * A[6] */
  64776. "ldr lr, [%[a], #24]\n\t"
  64777. "adc r11, %[r], #0\n\t"
  64778. "umlal r5, r11, r12, lr\n\t"
  64779. "adds r6, r6, r11\n\t"
  64780. /* A[4] * A[7] */
  64781. "ldr lr, [%[a], #28]\n\t"
  64782. "adc r7, %[r], #0\n\t"
  64783. "umlal r6, r7, r12, lr\n\t"
  64784. /* A[5] * A[6] */
  64785. "ldr r12, [%[a], #20]\n\t"
  64786. "ldr lr, [%[a], #24]\n\t"
  64787. "mov r11, #0\n\t"
  64788. "umlal r6, r11, r12, lr\n\t"
  64789. "adds r7, r7, r11\n\t"
  64790. /* A[5] * A[7] */
  64791. "ldr lr, [%[a], #28]\n\t"
  64792. "adc r8, %[r], #0\n\t"
  64793. "umlal r7, r8, r12, lr\n\t"
  64794. /* A[6] * A[7] */
  64795. "ldr r12, [%[a], #24]\n\t"
  64796. "ldr lr, [%[a], #28]\n\t"
  64797. "mov r9, #0\n\t"
  64798. "umlal r8, r9, r12, lr\n\t"
  64799. "add lr, sp, #32\n\t"
  64800. "stm lr, {r3, r4, r5, r6, r7, r8, r9}\n\t"
  64801. "add lr, sp, #4\n\t"
  64802. "ldm lr, {r4, r5, r6, r7, r8, r9, r10}\n\t"
  64803. "adds r4, r4, r4\n\t"
  64804. "adcs r5, r5, r5\n\t"
  64805. "adcs r6, r6, r6\n\t"
  64806. "adcs r7, r7, r7\n\t"
  64807. "adcs r8, r8, r8\n\t"
  64808. "adcs r9, r9, r9\n\t"
  64809. "adcs r10, r10, r10\n\t"
  64810. "stm lr!, {r4, r5, r6, r7, r8, r9, r10}\n\t"
  64811. "ldm lr, {r3, r4, r5, r6, r7, r8, r9}\n\t"
  64812. "adcs r3, r3, r3\n\t"
  64813. "adcs r4, r4, r4\n\t"
  64814. "adcs r5, r5, r5\n\t"
  64815. "adcs r6, r6, r6\n\t"
  64816. "adcs r7, r7, r7\n\t"
  64817. "adcs r8, r8, r8\n\t"
  64818. "adcs r9, r9, r9\n\t"
  64819. "adc r10, %[r], #0\n\t"
  64820. "stm lr, {r3, r4, r5, r6, r7, r8, r9, r10}\n\t"
  64821. "add lr, sp, #4\n\t"
  64822. "ldm lr, {r4, r5, r6, r7, r8, r9, r10}\n\t"
  64823. "mov lr, sp\n\t"
  64824. /* A[0] * A[0] */
  64825. "ldr r12, [%[a]]\n\t"
  64826. "umull r3, r11, r12, r12\n\t"
  64827. "adds r4, r4, r11\n\t"
  64828. /* A[1] * A[1] */
  64829. "ldr r12, [%[a], #4]\n\t"
  64830. "adcs r5, r5, #0\n\t"
  64831. "adc r11, %[r], #0\n\t"
  64832. "umlal r5, r11, r12, r12\n\t"
  64833. "adds r6, r6, r11\n\t"
  64834. /* A[2] * A[2] */
  64835. "ldr r12, [%[a], #8]\n\t"
  64836. "adcs r7, r7, #0\n\t"
  64837. "adc r11, %[r], #0\n\t"
  64838. "umlal r7, r11, r12, r12\n\t"
  64839. "adds r8, r8, r11\n\t"
  64840. /* A[3] * A[3] */
  64841. "ldr r12, [%[a], #12]\n\t"
  64842. "adcs r9, r9, #0\n\t"
  64843. "adc r11, %[r], #0\n\t"
  64844. "umlal r9, r11, r12, r12\n\t"
  64845. "adds r10, r10, r11\n\t"
  64846. "stm lr!, {r3, r4, r5, r6, r7, r8, r9, r10}\n\t"
  64847. "ldm lr, {r3, r4, r5, r6, r7, r8, r9, r10}\n\t"
  64848. /* A[4] * A[4] */
  64849. "ldr r12, [%[a], #16]\n\t"
  64850. "adcs r3, r3, #0\n\t"
  64851. "adc r11, %[r], #0\n\t"
  64852. "umlal r3, r11, r12, r12\n\t"
  64853. "adds r4, r4, r11\n\t"
  64854. /* A[5] * A[5] */
  64855. "ldr r12, [%[a], #20]\n\t"
  64856. "adcs r5, r5, #0\n\t"
  64857. "adc r11, %[r], #0\n\t"
  64858. "umlal r5, r11, r12, r12\n\t"
  64859. "adds r6, r6, r11\n\t"
  64860. /* A[6] * A[6] */
  64861. "ldr r12, [%[a], #24]\n\t"
  64862. "adcs r7, r7, #0\n\t"
  64863. "adc r11, %[r], #0\n\t"
  64864. "umlal r7, r11, r12, r12\n\t"
  64865. "adds r8, r8, r11\n\t"
  64866. /* A[7] * A[7] */
  64867. "ldr r12, [%[a], #28]\n\t"
  64868. "adcs r9, r9, #0\n\t"
  64869. "adc r10, r10, #0\n\t"
  64870. "umlal r9, r10, r12, r12\n\t"
  64871. "ldr %[r], [sp, #64]\n\t"
  64872. "add %[r], %[r], #32\n\t"
  64873. "stm %[r], {r3, r4, r5, r6, r7, r8, r9, r10}\n\t"
  64874. "ldm sp, {r3, r4, r5, r6, r7, r8, r9, r10}\n\t"
  64875. "sub %[r], %[r], #32\n\t"
  64876. "stm %[r], {r3, r4, r5, r6, r7, r8, r9, r10}\n\t"
  64877. "add sp, sp, #0x44\n\t"
  64878. : [r] "+r" (r), [a] "+r" (a)
  64879. :
  64880. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "lr", "cc"
  64881. );
  64882. }
  64883. #else
  64884. /* Square a and put result in r. (r = a * a)
  64885. *
  64886. * r A single precision integer.
  64887. * a A single precision integer.
  64888. */
  64889. static void sp_256_sqr_8(sp_digit* r_p, const sp_digit* a_p)
  64890. {
  64891. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  64892. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  64893. __asm__ __volatile__ (
  64894. "sub sp, sp, #32\n\t"
  64895. "str %[r], [sp, #28]\n\t"
  64896. "ldm %[a], {%[r], %[a], r2, r3, r4, r5, r6, r7}\n\t"
  64897. "umull r9, r10, %[r], %[r]\n\t"
  64898. "umull r11, r12, %[r], %[a]\n\t"
  64899. "adds r11, r11, r11\n\t"
  64900. "mov lr, #0\n\t"
  64901. "umaal r10, r11, lr, lr\n\t"
  64902. "stm sp, {r9, r10}\n\t"
  64903. "mov r8, lr\n\t"
  64904. "umaal r8, r12, %[r], r2\n\t"
  64905. "adcs r8, r8, r8\n\t"
  64906. "umaal r8, r11, %[a], %[a]\n\t"
  64907. "umull r9, r10, %[r], r3\n\t"
  64908. "umaal r9, r12, %[a], r2\n\t"
  64909. "adcs r9, r9, r9\n\t"
  64910. "umaal r9, r11, lr, lr\n\t"
  64911. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  64912. "str r8, [sp, #8]\n\t"
  64913. "str r9, [sp, #12]\n\t"
  64914. #else
  64915. "strd r8, r9, [sp, #8]\n\t"
  64916. #endif
  64917. "mov r9, lr\n\t"
  64918. "umaal r9, r10, %[r], r4\n\t"
  64919. "umaal r9, r12, %[a], r3\n\t"
  64920. "adcs r9, r9, r9\n\t"
  64921. "umaal r9, r11, r2, r2\n\t"
  64922. "str r9, [sp, #16]\n\t"
  64923. "umull r9, r8, %[r], r5\n\t"
  64924. "umaal r9, r12, %[a], r4\n\t"
  64925. "umaal r9, r10, r2, r3\n\t"
  64926. "adcs r9, r9, r9\n\t"
  64927. "umaal r9, r11, lr, lr\n\t"
  64928. "str r9, [sp, #20]\n\t"
  64929. "mov r9, lr\n\t"
  64930. "umaal r9, r8, %[r], r6\n\t"
  64931. "umaal r9, r12, %[a], r5\n\t"
  64932. "umaal r9, r10, r2, r4\n\t"
  64933. "adcs r9, r9, r9\n\t"
  64934. "umaal r9, r11, r3, r3\n\t"
  64935. "str r9, [sp, #24]\n\t"
  64936. "umull %[r], r9, %[r], r7\n\t"
  64937. "umaal %[r], r8, %[a], r6\n\t"
  64938. "umaal %[r], r12, r2, r5\n\t"
  64939. "umaal %[r], r10, r3, r4\n\t"
  64940. "adcs %[r], %[r], %[r]\n\t"
  64941. "umaal %[r], r11, lr, lr\n\t"
  64942. /* R[7] = r0 */
  64943. "umaal r9, r8, %[a], r7\n\t"
  64944. "umaal r9, r10, r2, r6\n\t"
  64945. "umaal r12, r9, r3, r5\n\t"
  64946. "adcs r12, r12, r12\n\t"
  64947. "umaal r12, r11, r4, r4\n\t"
  64948. /* R[8] = r12 */
  64949. "umaal r9, r8, r2, r7\n\t"
  64950. "umaal r10, r9, r3, r6\n\t"
  64951. "mov r2, lr\n\t"
  64952. "umaal r10, r2, r4, r5\n\t"
  64953. "adcs r10, r10, r10\n\t"
  64954. "umaal r11, r10, lr, lr\n\t"
  64955. /* R[9] = r11 */
  64956. "umaal r2, r8, r3, r7\n\t"
  64957. "umaal r2, r9, r4, r6\n\t"
  64958. "adcs r3, r2, r2\n\t"
  64959. "umaal r10, r3, r5, r5\n\t"
  64960. /* R[10] = r10 */
  64961. "mov %[a], lr\n\t"
  64962. "umaal %[a], r8, r4, r7\n\t"
  64963. "umaal %[a], r9, r5, r6\n\t"
  64964. "adcs r4, %[a], %[a]\n\t"
  64965. "umaal r3, r4, lr, lr\n\t"
  64966. /* R[11] = r3 */
  64967. "umaal r8, r9, r5, r7\n\t"
  64968. "adcs r8, r8, r8\n\t"
  64969. "umaal r4, r8, r6, r6\n\t"
  64970. /* R[12] = r4 */
  64971. "mov r5, lr\n\t"
  64972. "umaal r5, r9, r6, r7\n\t"
  64973. "adcs r5, r5, r5\n\t"
  64974. "umaal r8, r5, lr, lr\n\t"
  64975. /* R[13] = r8 */
  64976. "adcs r9, r9, r9\n\t"
  64977. "umaal r9, r5, r7, r7\n\t"
  64978. "adcs r7, r5, lr\n\t"
  64979. /* R[14] = r9 */
  64980. /* R[15] = r7 */
  64981. "ldr lr, [sp, #28]\n\t"
  64982. "add lr, lr, #28\n\t"
  64983. "stm lr!, {%[r], r12}\n\t"
  64984. "stm lr!, {r11}\n\t"
  64985. "stm lr!, {r10}\n\t"
  64986. "stm lr!, {r3, r4, r8, r9}\n\t"
  64987. "stm lr!, {r7}\n\t"
  64988. "sub lr, lr, #0x40\n\t"
  64989. "ldm sp, {%[r], %[a], r2, r3, r4, r5, r6}\n\t"
  64990. "stm lr, {%[r], %[a], r2, r3, r4, r5, r6}\n\t"
  64991. "add sp, sp, #32\n\t"
  64992. : [r] "+r" (r), [a] "+r" (a)
  64993. :
  64994. : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "lr", "cc"
  64995. );
  64996. }
  64997. #endif
  64998. #endif /* WOLFSSL_SP_SMALL */
  64999. #ifdef WOLFSSL_SP_SMALL
  65000. /* Add b to a into r. (r = a + b)
  65001. *
  65002. * r A single precision integer.
  65003. * a A single precision integer.
  65004. * b A single precision integer.
  65005. */
  65006. static sp_digit sp_256_add_8(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p)
  65007. {
  65008. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  65009. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  65010. register const sp_digit* b asm ("r2") = (const sp_digit*)b_p;
  65011. __asm__ __volatile__ (
  65012. "mov r3, #0\n\t"
  65013. "add r12, %[a], #32\n\t"
  65014. "\n"
  65015. "L_sp_256_add_8_word_%=: \n\t"
  65016. "adds r3, r3, #-1\n\t"
  65017. "ldm %[a]!, {r4, r5, r6, r7}\n\t"
  65018. "ldm %[b]!, {r8, r9, r10, r11}\n\t"
  65019. "adcs r4, r4, r8\n\t"
  65020. "adcs r5, r5, r9\n\t"
  65021. "adcs r6, r6, r10\n\t"
  65022. "adcs r7, r7, r11\n\t"
  65023. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  65024. "mov r4, #0\n\t"
  65025. "adc r3, r4, #0\n\t"
  65026. "cmp %[a], r12\n\t"
  65027. "bne L_sp_256_add_8_word_%=\n\t"
  65028. "mov %[r], r3\n\t"
  65029. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  65030. :
  65031. : "memory", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r3", "r12", "cc"
  65032. );
  65033. return (uint32_t)(size_t)r;
  65034. }
  65035. #else
  65036. /* Add b to a into r. (r = a + b)
  65037. *
  65038. * r A single precision integer.
  65039. * a A single precision integer.
  65040. * b A single precision integer.
  65041. */
  65042. static sp_digit sp_256_add_8(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p)
  65043. {
  65044. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  65045. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  65046. register const sp_digit* b asm ("r2") = (const sp_digit*)b_p;
  65047. __asm__ __volatile__ (
  65048. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  65049. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  65050. "adds r3, r3, r7\n\t"
  65051. "adcs r4, r4, r8\n\t"
  65052. "adcs r5, r5, r9\n\t"
  65053. "adcs r6, r6, r10\n\t"
  65054. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  65055. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  65056. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  65057. "adcs r3, r3, r7\n\t"
  65058. "adcs r4, r4, r8\n\t"
  65059. "adcs r5, r5, r9\n\t"
  65060. "adcs r6, r6, r10\n\t"
  65061. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  65062. "mov %[r], #0\n\t"
  65063. "adc %[r], %[r], #0\n\t"
  65064. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  65065. :
  65066. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "cc"
  65067. );
  65068. return (uint32_t)(size_t)r;
  65069. }
  65070. #endif /* WOLFSSL_SP_SMALL */
  65071. /* Multiply a number by Montgomery normalizer mod modulus (prime).
  65072. *
  65073. * r The resulting Montgomery form number.
  65074. * a The number to convert.
  65075. * m The modulus (prime).
  65076. */
  65077. static int sp_256_mod_mul_norm_8(sp_digit* r_p, const sp_digit* a_p, const sp_digit* m_p)
  65078. {
  65079. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  65080. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  65081. __asm__ __volatile__ (
  65082. "sub sp, sp, #24\n\t"
  65083. "ldm %[a], {r2, r3, r4, r5, r6, r7, r8, r9}\n\t"
  65084. /* Clear overflow and underflow */
  65085. "mov lr, #0\n\t"
  65086. "mov r10, #0\n\t"
  65087. "# t[0] = 1 1 0 -1 -1 -1 -1 0\n\t"
  65088. "adds r12, r2, r3\n\t"
  65089. "adc lr, lr, #0\n\t"
  65090. "subs r12, r12, r5\n\t"
  65091. "sbc r10, r10, #0\n\t"
  65092. "subs r12, r12, r6\n\t"
  65093. "sbc r10, r10, #0\n\t"
  65094. "subs r12, r12, r7\n\t"
  65095. "sbc r10, r10, #0\n\t"
  65096. "subs r12, r12, r8\n\t"
  65097. "sbc r10, r10, #0\n\t"
  65098. /* Store t[0] */
  65099. "str r12, [sp]\n\t"
  65100. "neg r10, r10\n\t"
  65101. "mov r12, #0\n\t"
  65102. "# t[1] = 0 1 1 0 -1 -1 -1 -1\n\t"
  65103. "adds lr, lr, r3\n\t"
  65104. "adc r12, r12, #0\n\t"
  65105. "adds lr, lr, r4\n\t"
  65106. "adc r12, r12, #0\n\t"
  65107. "subs lr, lr, r10\n\t"
  65108. "sbc r10, r10, r10\n\t"
  65109. "subs lr, lr, r6\n\t"
  65110. "sbc r10, r10, #0\n\t"
  65111. "subs lr, lr, r7\n\t"
  65112. "sbc r10, r10, #0\n\t"
  65113. "subs lr, lr, r8\n\t"
  65114. "sbc r10, r10, #0\n\t"
  65115. "subs lr, lr, r9\n\t"
  65116. "sbc r10, r10, #0\n\t"
  65117. /* Store t[1] */
  65118. "str lr, [sp, #4]\n\t"
  65119. "neg r10, r10\n\t"
  65120. "mov lr, #0\n\t"
  65121. "# t[2] = 0 0 1 1 0 -1 -1 -1\n\t"
  65122. "adds r12, r12, r4\n\t"
  65123. "adc lr, lr, #0\n\t"
  65124. "adds r12, r12, r5\n\t"
  65125. "adc lr, lr, #0\n\t"
  65126. "subs r12, r12, r10\n\t"
  65127. "sbc r10, r10, r10\n\t"
  65128. "subs r12, r12, r7\n\t"
  65129. "sbc r10, r10, #0\n\t"
  65130. "subs r12, r12, r8\n\t"
  65131. "sbc r10, r10, #0\n\t"
  65132. "subs r12, r12, r9\n\t"
  65133. "sbc r10, r10, #0\n\t"
  65134. /* Store t[2] */
  65135. "str r12, [sp, #8]\n\t"
  65136. "neg r10, r10\n\t"
  65137. "mov r12, #0\n\t"
  65138. "# t[3] = -1 -1 0 2 2 1 0 -1\n\t"
  65139. "adds lr, lr, r5\n\t"
  65140. "adc r12, r12, #0\n\t"
  65141. "adds lr, lr, r5\n\t"
  65142. "adc r12, r12, #0\n\t"
  65143. "adds lr, lr, r6\n\t"
  65144. "adc r12, r12, #0\n\t"
  65145. "adds lr, lr, r6\n\t"
  65146. "adc r12, r12, #0\n\t"
  65147. "adds lr, lr, r7\n\t"
  65148. "adc r12, r12, #0\n\t"
  65149. "subs lr, lr, r10\n\t"
  65150. "sbc r10, r10, r10\n\t"
  65151. "subs lr, lr, r2\n\t"
  65152. "sbc r10, r10, #0\n\t"
  65153. "subs lr, lr, r3\n\t"
  65154. "sbc r10, r10, #0\n\t"
  65155. "subs lr, lr, r9\n\t"
  65156. "sbc r10, r10, #0\n\t"
  65157. /* Store t[3] */
  65158. "str lr, [sp, #12]\n\t"
  65159. "neg r10, r10\n\t"
  65160. "mov lr, #0\n\t"
  65161. "# t[4] = 0 -1 -1 0 2 2 1 0\n\t"
  65162. "adds r12, r12, r6\n\t"
  65163. "adc lr, lr, #0\n\t"
  65164. "adds r12, r12, r6\n\t"
  65165. "adc lr, lr, #0\n\t"
  65166. "adds r12, r12, r7\n\t"
  65167. "adc lr, lr, #0\n\t"
  65168. "adds r12, r12, r7\n\t"
  65169. "adc lr, lr, #0\n\t"
  65170. "adds r12, r12, r8\n\t"
  65171. "adc lr, lr, #0\n\t"
  65172. "subs r12, r12, r10\n\t"
  65173. "sbc r10, r10, r10\n\t"
  65174. "subs r12, r12, r3\n\t"
  65175. "sbc r10, r10, #0\n\t"
  65176. "subs r12, r12, r4\n\t"
  65177. "sbc r10, r10, #0\n\t"
  65178. /* Store t[4] */
  65179. "str r12, [sp, #16]\n\t"
  65180. "neg r10, r10\n\t"
  65181. "mov r12, #0\n\t"
  65182. "# t[5] = 0 0 -1 -1 0 2 2 1\n\t"
  65183. "adds lr, lr, r7\n\t"
  65184. "adc r12, r12, #0\n\t"
  65185. "adds lr, lr, r7\n\t"
  65186. "adc r12, r12, #0\n\t"
  65187. "adds lr, lr, r8\n\t"
  65188. "adc r12, r12, #0\n\t"
  65189. "adds lr, lr, r8\n\t"
  65190. "adc r12, r12, #0\n\t"
  65191. "adds lr, lr, r9\n\t"
  65192. "adc r12, r12, #0\n\t"
  65193. "subs lr, lr, r10\n\t"
  65194. "sbc r10, r10, r10\n\t"
  65195. "subs lr, lr, r4\n\t"
  65196. "sbc r10, r10, #0\n\t"
  65197. "subs lr, lr, r5\n\t"
  65198. "sbc r10, r10, #0\n\t"
  65199. /* Store t[5] */
  65200. "str lr, [sp, #20]\n\t"
  65201. "neg r10, r10\n\t"
  65202. "mov lr, #0\n\t"
  65203. "# t[6] = -1 -1 0 0 0 1 3 2\n\t"
  65204. "adds r12, r12, r7\n\t"
  65205. "adc lr, lr, #0\n\t"
  65206. "adds r12, r12, r8\n\t"
  65207. "adc lr, lr, #0\n\t"
  65208. "adds r12, r12, r8\n\t"
  65209. "adc lr, lr, #0\n\t"
  65210. "adds r12, r12, r8\n\t"
  65211. "adc lr, lr, #0\n\t"
  65212. "adds r12, r12, r9\n\t"
  65213. "adc lr, lr, #0\n\t"
  65214. "adds r12, r12, r9\n\t"
  65215. "adc lr, lr, #0\n\t"
  65216. "subs r12, r12, r10\n\t"
  65217. "sbc r10, r10, r10\n\t"
  65218. "subs r12, r12, r2\n\t"
  65219. "sbc r10, r10, #0\n\t"
  65220. "subs r12, r12, r3\n\t"
  65221. "sbc r10, r10, #0\n\t"
  65222. /* Store t[6] */
  65223. "mov r8, r12\n\t"
  65224. "neg r10, r10\n\t"
  65225. "mov r12, #0\n\t"
  65226. "# t[7] = 1 0 -1 -1 -1 -1 0 3\n\t"
  65227. "adds lr, lr, r2\n\t"
  65228. "adc r12, r12, #0\n\t"
  65229. "adds lr, lr, r9\n\t"
  65230. "adc r12, r12, #0\n\t"
  65231. "adds lr, lr, r9\n\t"
  65232. "adc r12, r12, #0\n\t"
  65233. "adds lr, lr, r9\n\t"
  65234. "adc r12, r12, #0\n\t"
  65235. "subs lr, lr, r10\n\t"
  65236. "sbc r10, r10, r10\n\t"
  65237. "subs lr, lr, r4\n\t"
  65238. "sbc r10, r10, #0\n\t"
  65239. "subs lr, lr, r5\n\t"
  65240. "sbc r10, r10, #0\n\t"
  65241. "subs lr, lr, r6\n\t"
  65242. "sbc r10, r10, #0\n\t"
  65243. "subs lr, lr, r7\n\t"
  65244. "sbc r10, r10, #0\n\t"
  65245. /* Store t[7] */
  65246. /* Load intermediate */
  65247. "ldm sp, {r2, r3, r4, r5, r6, r7}\n\t"
  65248. "neg r10, r10\n\t"
  65249. /* Add overflow */
  65250. /* Subtract underflow - add neg underflow */
  65251. "adds r2, r2, r12\n\t"
  65252. "adcs r3, r3, #0\n\t"
  65253. "adcs r4, r4, #0\n\t"
  65254. "adcs r5, r5, r10\n\t"
  65255. "adcs r6, r6, #0\n\t"
  65256. "adcs r7, r7, #0\n\t"
  65257. "adcs r8, r8, r10\n\t"
  65258. "adcs lr, lr, r12\n\t"
  65259. "mov r9, #0\n\t"
  65260. "adc r9, r9, #0\n\t"
  65261. /* Subtract overflow */
  65262. /* Add underflow - subtract neg underflow */
  65263. "subs r2, r2, r10\n\t"
  65264. "sbcs r3, r3, #0\n\t"
  65265. "sbcs r4, r4, #0\n\t"
  65266. "sbcs r5, r5, r12\n\t"
  65267. "sbcs r6, r6, #0\n\t"
  65268. "sbcs r7, r7, #0\n\t"
  65269. "sbcs r8, r8, r12\n\t"
  65270. "sbcs lr, lr, r10\n\t"
  65271. "mov r10, #0\n\t"
  65272. "sbc r10, r10, #0\n\t"
  65273. "neg r10, r10\n\t"
  65274. /* Add overflow */
  65275. /* Subtract underflow - add neg underflow */
  65276. "adds r2, r2, r9\n\t"
  65277. "adcs r3, r3, #0\n\t"
  65278. "adcs r4, r4, #0\n\t"
  65279. "adcs r5, r5, r10\n\t"
  65280. "adcs r6, r6, #0\n\t"
  65281. "adcs r7, r7, #0\n\t"
  65282. "adcs r8, r8, r10\n\t"
  65283. "adc lr, lr, r9\n\t"
  65284. /* Subtract overflow */
  65285. /* Add underflow - subtract neg underflow */
  65286. "subs r2, r2, r10\n\t"
  65287. "sbcs r3, r3, #0\n\t"
  65288. "sbcs r4, r4, #0\n\t"
  65289. "sbcs r5, r5, r9\n\t"
  65290. "sbcs r6, r6, #0\n\t"
  65291. "sbcs r7, r7, #0\n\t"
  65292. "sbcs r8, r8, r9\n\t"
  65293. "sbc lr, lr, r10\n\t"
  65294. /* Store result */
  65295. "stm %[r], {r2, r3, r4, r5, r6, r7, r8, lr}\n\t"
  65296. "mov %[r], #0\n\t"
  65297. "add sp, sp, #24\n\t"
  65298. : [r] "+r" (r), [a] "+r" (a)
  65299. :
  65300. : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r12", "lr", "r10", "cc"
  65301. );
  65302. (void)m_p;
  65303. return (uint32_t)(size_t)r;
  65304. }
  65305. /* Convert an mp_int to an array of sp_digit.
  65306. *
  65307. * r A single precision integer.
  65308. * size Maximum number of bytes to convert
  65309. * a A multi-precision integer.
  65310. */
  65311. static void sp_256_from_mp(sp_digit* r, int size, const mp_int* a)
  65312. {
  65313. #if DIGIT_BIT == 32
  65314. int i;
  65315. sp_digit j = (sp_digit)0 - (sp_digit)a->used;
  65316. int o = 0;
  65317. for (i = 0; i < size; i++) {
  65318. sp_digit mask = (sp_digit)0 - (j >> 31);
  65319. r[i] = a->dp[o] & mask;
  65320. j++;
  65321. o += (int)(j >> 31);
  65322. }
  65323. #elif DIGIT_BIT > 32
  65324. unsigned int i;
  65325. int j = 0;
  65326. word32 s = 0;
  65327. r[0] = 0;
  65328. for (i = 0; i < (unsigned int)a->used && j < size; i++) {
  65329. r[j] |= ((sp_digit)a->dp[i] << s);
  65330. r[j] &= 0xffffffff;
  65331. s = 32U - s;
  65332. if (j + 1 >= size) {
  65333. break;
  65334. }
  65335. /* lint allow cast of mismatch word32 and mp_digit */
  65336. r[++j] = (sp_digit)(a->dp[i] >> s); /*lint !e9033*/
  65337. while ((s + 32U) <= (word32)DIGIT_BIT) {
  65338. s += 32U;
  65339. r[j] &= 0xffffffff;
  65340. if (j + 1 >= size) {
  65341. break;
  65342. }
  65343. if (s < (word32)DIGIT_BIT) {
  65344. /* lint allow cast of mismatch word32 and mp_digit */
  65345. r[++j] = (sp_digit)(a->dp[i] >> s); /*lint !e9033*/
  65346. }
  65347. else {
  65348. r[++j] = (sp_digit)0;
  65349. }
  65350. }
  65351. s = (word32)DIGIT_BIT - s;
  65352. }
  65353. for (j++; j < size; j++) {
  65354. r[j] = 0;
  65355. }
  65356. #else
  65357. unsigned int i;
  65358. int j = 0;
  65359. int s = 0;
  65360. r[0] = 0;
  65361. for (i = 0; i < (unsigned int)a->used && j < size; i++) {
  65362. r[j] |= ((sp_digit)a->dp[i]) << s;
  65363. if (s + DIGIT_BIT >= 32) {
  65364. r[j] &= 0xffffffff;
  65365. if (j + 1 >= size) {
  65366. break;
  65367. }
  65368. s = 32 - s;
  65369. if (s == DIGIT_BIT) {
  65370. r[++j] = 0;
  65371. s = 0;
  65372. }
  65373. else {
  65374. r[++j] = a->dp[i] >> s;
  65375. s = DIGIT_BIT - s;
  65376. }
  65377. }
  65378. else {
  65379. s += DIGIT_BIT;
  65380. }
  65381. }
  65382. for (j++; j < size; j++) {
  65383. r[j] = 0;
  65384. }
  65385. #endif
  65386. }
  65387. /* Convert a point of type ecc_point to type sp_point_256.
  65388. *
  65389. * p Point of type sp_point_256 (result).
  65390. * pm Point of type ecc_point.
  65391. */
  65392. static void sp_256_point_from_ecc_point_8(sp_point_256* p,
  65393. const ecc_point* pm)
  65394. {
  65395. XMEMSET(p->x, 0, sizeof(p->x));
  65396. XMEMSET(p->y, 0, sizeof(p->y));
  65397. XMEMSET(p->z, 0, sizeof(p->z));
  65398. sp_256_from_mp(p->x, 8, pm->x);
  65399. sp_256_from_mp(p->y, 8, pm->y);
  65400. sp_256_from_mp(p->z, 8, pm->z);
  65401. p->infinity = 0;
  65402. }
  65403. /* Convert an array of sp_digit to an mp_int.
  65404. *
  65405. * a A single precision integer.
  65406. * r A multi-precision integer.
  65407. */
  65408. static int sp_256_to_mp(const sp_digit* a, mp_int* r)
  65409. {
  65410. int err;
  65411. err = mp_grow(r, (256 + DIGIT_BIT - 1) / DIGIT_BIT);
  65412. if (err == MP_OKAY) { /*lint !e774 case where err is always MP_OKAY*/
  65413. #if DIGIT_BIT == 32
  65414. XMEMCPY(r->dp, a, sizeof(sp_digit) * 8);
  65415. r->used = 8;
  65416. mp_clamp(r);
  65417. #elif DIGIT_BIT < 32
  65418. int i;
  65419. int j = 0;
  65420. int s = 0;
  65421. r->dp[0] = 0;
  65422. for (i = 0; i < 8; i++) {
  65423. r->dp[j] |= (mp_digit)(a[i] << s);
  65424. r->dp[j] &= ((sp_digit)1 << DIGIT_BIT) - 1;
  65425. s = DIGIT_BIT - s;
  65426. r->dp[++j] = (mp_digit)(a[i] >> s);
  65427. while (s + DIGIT_BIT <= 32) {
  65428. s += DIGIT_BIT;
  65429. r->dp[j++] &= ((sp_digit)1 << DIGIT_BIT) - 1;
  65430. if (s == SP_WORD_SIZE) {
  65431. r->dp[j] = 0;
  65432. }
  65433. else {
  65434. r->dp[j] = (mp_digit)(a[i] >> s);
  65435. }
  65436. }
  65437. s = 32 - s;
  65438. }
  65439. r->used = (256 + DIGIT_BIT - 1) / DIGIT_BIT;
  65440. mp_clamp(r);
  65441. #else
  65442. int i;
  65443. int j = 0;
  65444. int s = 0;
  65445. r->dp[0] = 0;
  65446. for (i = 0; i < 8; i++) {
  65447. r->dp[j] |= ((mp_digit)a[i]) << s;
  65448. if (s + 32 >= DIGIT_BIT) {
  65449. #if DIGIT_BIT != 32 && DIGIT_BIT != 64
  65450. r->dp[j] &= ((sp_digit)1 << DIGIT_BIT) - 1;
  65451. #endif
  65452. s = DIGIT_BIT - s;
  65453. r->dp[++j] = a[i] >> s;
  65454. s = 32 - s;
  65455. }
  65456. else {
  65457. s += 32;
  65458. }
  65459. }
  65460. r->used = (256 + DIGIT_BIT - 1) / DIGIT_BIT;
  65461. mp_clamp(r);
  65462. #endif
  65463. }
  65464. return err;
  65465. }
  65466. /* Convert a point of type sp_point_256 to type ecc_point.
  65467. *
  65468. * p Point of type sp_point_256.
  65469. * pm Point of type ecc_point (result).
  65470. * returns MEMORY_E when allocation of memory in ecc_point fails otherwise
  65471. * MP_OKAY.
  65472. */
  65473. static int sp_256_point_to_ecc_point_8(const sp_point_256* p, ecc_point* pm)
  65474. {
  65475. int err;
  65476. err = sp_256_to_mp(p->x, pm->x);
  65477. if (err == MP_OKAY) {
  65478. err = sp_256_to_mp(p->y, pm->y);
  65479. }
  65480. if (err == MP_OKAY) {
  65481. err = sp_256_to_mp(p->z, pm->z);
  65482. }
  65483. return err;
  65484. }
  65485. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  65486. /* Multiply two Montgomery form numbers mod the modulus (prime).
  65487. * (r = a * b mod m)
  65488. *
  65489. * r Result of multiplication.
  65490. * a First number to multiply in Montgomery form.
  65491. * b Second number to multiply in Montgomery form.
  65492. * m Modulus (prime).
  65493. * mp Montgomery multiplier.
  65494. */
  65495. 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)
  65496. {
  65497. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  65498. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  65499. register const sp_digit* b asm ("r2") = (const sp_digit*)b_p;
  65500. __asm__ __volatile__ (
  65501. "sub sp, sp, #0x44\n\t"
  65502. "mov r5, #0\n\t"
  65503. /* A[0] * B[0] */
  65504. "ldr r6, [%[a]]\n\t"
  65505. "ldr r7, [%[b]]\n\t"
  65506. "lsl r3, r6, #16\n\t"
  65507. "lsl r8, r7, #16\n\t"
  65508. "lsr r3, r3, #16\n\t"
  65509. "lsr r8, r8, #16\n\t"
  65510. "mul r8, r3, r8\n\t"
  65511. "lsr r4, r7, #16\n\t"
  65512. "mul r3, r4, r3\n\t"
  65513. "lsr r9, r3, #16\n\t"
  65514. "lsl r3, r3, #16\n\t"
  65515. "adds r8, r8, r3\n\t"
  65516. "adc r9, r9, #0\n\t"
  65517. "lsr r3, r6, #16\n\t"
  65518. "mul r4, r3, r4\n\t"
  65519. "add r9, r9, r4\n\t"
  65520. "lsl r4, r7, #16\n\t"
  65521. "lsr r4, r4, #16\n\t"
  65522. "mul r3, r4, r3\n\t"
  65523. "lsr r4, r3, #16\n\t"
  65524. "lsl r3, r3, #16\n\t"
  65525. "adds r8, r8, r3\n\t"
  65526. "adc r9, r9, r4\n\t"
  65527. "str r8, [sp]\n\t"
  65528. /* A[0] * B[1] */
  65529. "ldr r7, [%[b], #4]\n\t"
  65530. "lsl r3, r6, #16\n\t"
  65531. "lsl r4, r7, #16\n\t"
  65532. "lsr r3, r3, #16\n\t"
  65533. "lsr r4, r4, #16\n\t"
  65534. "mul r4, r3, r4\n\t"
  65535. "mov r10, #0\n\t"
  65536. "adds r9, r9, r4\n\t"
  65537. "adc r10, r10, #0\n\t"
  65538. "lsr r4, r7, #16\n\t"
  65539. "mul r3, r4, r3\n\t"
  65540. "lsr r4, r3, #16\n\t"
  65541. "lsl r3, r3, #16\n\t"
  65542. "adds r9, r9, r3\n\t"
  65543. "adc r10, r10, r4\n\t"
  65544. "lsr r3, r6, #16\n\t"
  65545. "lsr r4, r7, #16\n\t"
  65546. "mul r4, r3, r4\n\t"
  65547. "add r10, r10, r4\n\t"
  65548. "lsl r4, r7, #16\n\t"
  65549. "lsr r4, r4, #16\n\t"
  65550. "mul r3, r4, r3\n\t"
  65551. "lsr r4, r3, #16\n\t"
  65552. "lsl r3, r3, #16\n\t"
  65553. "adds r9, r9, r3\n\t"
  65554. "adc r10, r10, r4\n\t"
  65555. /* A[1] * B[0] */
  65556. "ldr r6, [%[a], #4]\n\t"
  65557. "ldr r7, [%[b]]\n\t"
  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 r9, r9, r4\n\t"
  65564. "adcs r10, r10, #0\n\t"
  65565. "adc lr, 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 r9, r9, r3\n\t"
  65571. "adcs r10, r10, r4\n\t"
  65572. "adc lr, lr, #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 r10, r10, r4\n\t"
  65577. "adc lr, lr, #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 r9, r9, r3\n\t"
  65584. "adcs r10, r10, r4\n\t"
  65585. "adc lr, lr, #0\n\t"
  65586. "str r9, [sp, #4]\n\t"
  65587. /* A[2] * B[0] */
  65588. "ldr r6, [%[a], #8]\n\t"
  65589. "lsl r3, r6, #16\n\t"
  65590. "lsl r4, r7, #16\n\t"
  65591. "lsr r3, r3, #16\n\t"
  65592. "lsr r4, r4, #16\n\t"
  65593. "mul r4, r3, r4\n\t"
  65594. "adds r10, r10, r4\n\t"
  65595. "adc lr, lr, #0\n\t"
  65596. "lsr r4, r7, #16\n\t"
  65597. "mul r3, r4, r3\n\t"
  65598. "lsr r4, r3, #16\n\t"
  65599. "lsl r3, r3, #16\n\t"
  65600. "adds r10, r10, r3\n\t"
  65601. "adc lr, lr, r4\n\t"
  65602. "lsr r3, r6, #16\n\t"
  65603. "lsr r4, r7, #16\n\t"
  65604. "mul r4, r3, r4\n\t"
  65605. "add lr, lr, r4\n\t"
  65606. "lsl r4, r7, #16\n\t"
  65607. "lsr r4, r4, #16\n\t"
  65608. "mul r3, r4, r3\n\t"
  65609. "lsr r4, r3, #16\n\t"
  65610. "lsl r3, r3, #16\n\t"
  65611. "adds r10, r10, r3\n\t"
  65612. "adc lr, lr, r4\n\t"
  65613. /* A[1] * B[1] */
  65614. "ldr r6, [%[a], #4]\n\t"
  65615. "ldr r7, [%[b], #4]\n\t"
  65616. "lsl r3, r6, #16\n\t"
  65617. "lsl r4, r7, #16\n\t"
  65618. "lsr r3, r3, #16\n\t"
  65619. "lsr r4, r4, #16\n\t"
  65620. "mul r4, r3, r4\n\t"
  65621. "adds r10, r10, r4\n\t"
  65622. "adcs lr, lr, #0\n\t"
  65623. "adc r8, r5, #0\n\t"
  65624. "lsr r4, r7, #16\n\t"
  65625. "mul r3, r4, r3\n\t"
  65626. "lsr r4, r3, #16\n\t"
  65627. "lsl r3, r3, #16\n\t"
  65628. "adds r10, r10, r3\n\t"
  65629. "adcs lr, lr, r4\n\t"
  65630. "adc r8, r8, #0\n\t"
  65631. "lsr r3, r6, #16\n\t"
  65632. "lsr r4, r7, #16\n\t"
  65633. "mul r4, r3, r4\n\t"
  65634. "adds lr, lr, r4\n\t"
  65635. "adc r8, r8, #0\n\t"
  65636. "lsl r4, r7, #16\n\t"
  65637. "lsr r4, r4, #16\n\t"
  65638. "mul r3, r4, r3\n\t"
  65639. "lsr r4, r3, #16\n\t"
  65640. "lsl r3, r3, #16\n\t"
  65641. "adds r10, r10, r3\n\t"
  65642. "adcs lr, lr, r4\n\t"
  65643. "adc r8, r8, #0\n\t"
  65644. /* A[0] * B[2] */
  65645. "ldr r6, [%[a]]\n\t"
  65646. "ldr r7, [%[b], #8]\n\t"
  65647. "lsl r3, r6, #16\n\t"
  65648. "lsl r4, r7, #16\n\t"
  65649. "lsr r3, r3, #16\n\t"
  65650. "lsr r4, r4, #16\n\t"
  65651. "mul r4, r3, r4\n\t"
  65652. "adds r10, r10, r4\n\t"
  65653. "adcs lr, lr, #0\n\t"
  65654. "adc r8, r5, r8\n\t"
  65655. "lsr r4, r7, #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 r10, r10, r3\n\t"
  65660. "adcs lr, lr, r4\n\t"
  65661. "adc r8, r8, #0\n\t"
  65662. "lsr r3, r6, #16\n\t"
  65663. "lsr r4, r7, #16\n\t"
  65664. "mul r4, r3, r4\n\t"
  65665. "adds lr, lr, r4\n\t"
  65666. "adc r8, r8, #0\n\t"
  65667. "lsl r4, r7, #16\n\t"
  65668. "lsr r4, r4, #16\n\t"
  65669. "mul r3, r4, r3\n\t"
  65670. "lsr r4, r3, #16\n\t"
  65671. "lsl r3, r3, #16\n\t"
  65672. "adds r10, r10, r3\n\t"
  65673. "adcs lr, lr, r4\n\t"
  65674. "adc r8, r8, #0\n\t"
  65675. "str r10, [sp, #8]\n\t"
  65676. /* A[0] * B[3] */
  65677. "ldr r7, [%[b], #12]\n\t"
  65678. "lsl r3, r6, #16\n\t"
  65679. "lsl r4, r7, #16\n\t"
  65680. "lsr r3, r3, #16\n\t"
  65681. "lsr r4, r4, #16\n\t"
  65682. "mul r4, r3, r4\n\t"
  65683. "adds lr, lr, r4\n\t"
  65684. "adcs r8, r8, #0\n\t"
  65685. "adc r9, r5, #0\n\t"
  65686. "lsr r4, r7, #16\n\t"
  65687. "mul r3, r4, r3\n\t"
  65688. "lsr r4, r3, #16\n\t"
  65689. "lsl r3, r3, #16\n\t"
  65690. "adds lr, lr, r3\n\t"
  65691. "adcs r8, r8, r4\n\t"
  65692. "adc r9, r9, #0\n\t"
  65693. "lsr r3, r6, #16\n\t"
  65694. "lsr r4, r7, #16\n\t"
  65695. "mul r4, r3, r4\n\t"
  65696. "adds r8, r8, r4\n\t"
  65697. "adc r9, r9, #0\n\t"
  65698. "lsl r4, r7, #16\n\t"
  65699. "lsr r4, r4, #16\n\t"
  65700. "mul r3, r4, r3\n\t"
  65701. "lsr r4, r3, #16\n\t"
  65702. "lsl r3, r3, #16\n\t"
  65703. "adds lr, lr, r3\n\t"
  65704. "adcs r8, r8, r4\n\t"
  65705. "adc r9, r9, #0\n\t"
  65706. /* A[1] * B[2] */
  65707. "ldr r6, [%[a], #4]\n\t"
  65708. "ldr r7, [%[b], #8]\n\t"
  65709. "lsl r3, r6, #16\n\t"
  65710. "lsl r4, r7, #16\n\t"
  65711. "lsr r3, r3, #16\n\t"
  65712. "lsr r4, r4, #16\n\t"
  65713. "mul r4, r3, r4\n\t"
  65714. "adds lr, lr, r4\n\t"
  65715. "adcs r8, r8, #0\n\t"
  65716. "adc r9, r5, r9\n\t"
  65717. "lsr r4, r7, #16\n\t"
  65718. "mul r3, r4, r3\n\t"
  65719. "lsr r4, r3, #16\n\t"
  65720. "lsl r3, r3, #16\n\t"
  65721. "adds lr, lr, r3\n\t"
  65722. "adcs r8, r8, r4\n\t"
  65723. "adc r9, r9, #0\n\t"
  65724. "lsr r3, r6, #16\n\t"
  65725. "lsr r4, r7, #16\n\t"
  65726. "mul r4, r3, r4\n\t"
  65727. "adds r8, r8, r4\n\t"
  65728. "adc r9, r9, #0\n\t"
  65729. "lsl r4, r7, #16\n\t"
  65730. "lsr r4, r4, #16\n\t"
  65731. "mul r3, r4, r3\n\t"
  65732. "lsr r4, r3, #16\n\t"
  65733. "lsl r3, r3, #16\n\t"
  65734. "adds lr, lr, r3\n\t"
  65735. "adcs r8, r8, r4\n\t"
  65736. "adc r9, r9, #0\n\t"
  65737. /* A[2] * B[1] */
  65738. "ldr r6, [%[a], #8]\n\t"
  65739. "ldr r7, [%[b], #4]\n\t"
  65740. "lsl r3, r6, #16\n\t"
  65741. "lsl r4, r7, #16\n\t"
  65742. "lsr r3, r3, #16\n\t"
  65743. "lsr r4, r4, #16\n\t"
  65744. "mul r4, r3, r4\n\t"
  65745. "adds lr, lr, r4\n\t"
  65746. "adcs r8, r8, #0\n\t"
  65747. "adc r9, r5, r9\n\t"
  65748. "lsr r4, r7, #16\n\t"
  65749. "mul r3, r4, r3\n\t"
  65750. "lsr r4, r3, #16\n\t"
  65751. "lsl r3, r3, #16\n\t"
  65752. "adds lr, lr, r3\n\t"
  65753. "adcs r8, r8, r4\n\t"
  65754. "adc r9, r9, #0\n\t"
  65755. "lsr r3, r6, #16\n\t"
  65756. "lsr r4, r7, #16\n\t"
  65757. "mul r4, r3, r4\n\t"
  65758. "adds r8, r8, r4\n\t"
  65759. "adc r9, r9, #0\n\t"
  65760. "lsl r4, r7, #16\n\t"
  65761. "lsr r4, r4, #16\n\t"
  65762. "mul r3, r4, r3\n\t"
  65763. "lsr r4, r3, #16\n\t"
  65764. "lsl r3, r3, #16\n\t"
  65765. "adds lr, lr, r3\n\t"
  65766. "adcs r8, r8, r4\n\t"
  65767. "adc r9, r9, #0\n\t"
  65768. /* A[3] * B[0] */
  65769. "ldr r6, [%[a], #12]\n\t"
  65770. "ldr r7, [%[b]]\n\t"
  65771. "lsl r3, r6, #16\n\t"
  65772. "lsl r4, r7, #16\n\t"
  65773. "lsr r3, r3, #16\n\t"
  65774. "lsr r4, r4, #16\n\t"
  65775. "mul r4, r3, r4\n\t"
  65776. "adds lr, lr, r4\n\t"
  65777. "adcs r8, r8, #0\n\t"
  65778. "adc r9, r5, r9\n\t"
  65779. "lsr r4, r7, #16\n\t"
  65780. "mul r3, r4, r3\n\t"
  65781. "lsr r4, r3, #16\n\t"
  65782. "lsl r3, r3, #16\n\t"
  65783. "adds lr, lr, r3\n\t"
  65784. "adcs r8, r8, r4\n\t"
  65785. "adc r9, r9, #0\n\t"
  65786. "lsr r3, r6, #16\n\t"
  65787. "lsr r4, r7, #16\n\t"
  65788. "mul r4, r3, r4\n\t"
  65789. "adds r8, r8, r4\n\t"
  65790. "adc r9, r9, #0\n\t"
  65791. "lsl r4, r7, #16\n\t"
  65792. "lsr r4, r4, #16\n\t"
  65793. "mul r3, r4, r3\n\t"
  65794. "lsr r4, r3, #16\n\t"
  65795. "lsl r3, r3, #16\n\t"
  65796. "adds lr, lr, r3\n\t"
  65797. "adcs r8, r8, r4\n\t"
  65798. "adc r9, r9, #0\n\t"
  65799. "str lr, [sp, #12]\n\t"
  65800. /* A[4] * B[0] */
  65801. "ldr r6, [%[a], #16]\n\t"
  65802. "lsl r3, r6, #16\n\t"
  65803. "lsl r4, r7, #16\n\t"
  65804. "lsr r3, r3, #16\n\t"
  65805. "lsr r4, r4, #16\n\t"
  65806. "mul r4, r3, r4\n\t"
  65807. "adds r8, r8, r4\n\t"
  65808. "adcs r9, r9, #0\n\t"
  65809. "adc r10, r5, #0\n\t"
  65810. "lsr r4, r7, #16\n\t"
  65811. "mul r3, r4, r3\n\t"
  65812. "lsr r4, r3, #16\n\t"
  65813. "lsl r3, r3, #16\n\t"
  65814. "adds r8, r8, r3\n\t"
  65815. "adcs r9, r9, r4\n\t"
  65816. "adc r10, r10, #0\n\t"
  65817. "lsr r3, r6, #16\n\t"
  65818. "lsr r4, r7, #16\n\t"
  65819. "mul r4, r3, r4\n\t"
  65820. "adds r9, r9, r4\n\t"
  65821. "adc r10, r10, #0\n\t"
  65822. "lsl r4, r7, #16\n\t"
  65823. "lsr r4, r4, #16\n\t"
  65824. "mul r3, r4, r3\n\t"
  65825. "lsr r4, r3, #16\n\t"
  65826. "lsl r3, r3, #16\n\t"
  65827. "adds r8, r8, r3\n\t"
  65828. "adcs r9, r9, r4\n\t"
  65829. "adc r10, r10, #0\n\t"
  65830. /* A[3] * B[1] */
  65831. "ldr r6, [%[a], #12]\n\t"
  65832. "ldr r7, [%[b], #4]\n\t"
  65833. "lsl r3, r6, #16\n\t"
  65834. "lsl r4, r7, #16\n\t"
  65835. "lsr r3, r3, #16\n\t"
  65836. "lsr r4, r4, #16\n\t"
  65837. "mul r4, r3, r4\n\t"
  65838. "adds r8, r8, r4\n\t"
  65839. "adcs r9, r9, #0\n\t"
  65840. "adc r10, r5, r10\n\t"
  65841. "lsr r4, r7, #16\n\t"
  65842. "mul r3, r4, r3\n\t"
  65843. "lsr r4, r3, #16\n\t"
  65844. "lsl r3, r3, #16\n\t"
  65845. "adds r8, r8, r3\n\t"
  65846. "adcs r9, r9, r4\n\t"
  65847. "adc r10, r10, #0\n\t"
  65848. "lsr r3, r6, #16\n\t"
  65849. "lsr r4, r7, #16\n\t"
  65850. "mul r4, r3, r4\n\t"
  65851. "adds r9, r9, r4\n\t"
  65852. "adc r10, r10, #0\n\t"
  65853. "lsl r4, r7, #16\n\t"
  65854. "lsr r4, r4, #16\n\t"
  65855. "mul r3, r4, r3\n\t"
  65856. "lsr r4, r3, #16\n\t"
  65857. "lsl r3, r3, #16\n\t"
  65858. "adds r8, r8, r3\n\t"
  65859. "adcs r9, r9, r4\n\t"
  65860. "adc r10, r10, #0\n\t"
  65861. /* A[2] * B[2] */
  65862. "ldr r6, [%[a], #8]\n\t"
  65863. "ldr r7, [%[b], #8]\n\t"
  65864. "lsl r3, r6, #16\n\t"
  65865. "lsl r4, r7, #16\n\t"
  65866. "lsr r3, r3, #16\n\t"
  65867. "lsr r4, r4, #16\n\t"
  65868. "mul r4, r3, r4\n\t"
  65869. "adds r8, r8, r4\n\t"
  65870. "adcs r9, r9, #0\n\t"
  65871. "adc r10, r5, r10\n\t"
  65872. "lsr r4, r7, #16\n\t"
  65873. "mul r3, r4, r3\n\t"
  65874. "lsr r4, r3, #16\n\t"
  65875. "lsl r3, r3, #16\n\t"
  65876. "adds r8, r8, r3\n\t"
  65877. "adcs r9, r9, r4\n\t"
  65878. "adc r10, r10, #0\n\t"
  65879. "lsr r3, r6, #16\n\t"
  65880. "lsr r4, r7, #16\n\t"
  65881. "mul r4, r3, r4\n\t"
  65882. "adds r9, r9, r4\n\t"
  65883. "adc r10, r10, #0\n\t"
  65884. "lsl r4, r7, #16\n\t"
  65885. "lsr r4, r4, #16\n\t"
  65886. "mul r3, r4, r3\n\t"
  65887. "lsr r4, r3, #16\n\t"
  65888. "lsl r3, r3, #16\n\t"
  65889. "adds r8, r8, r3\n\t"
  65890. "adcs r9, r9, r4\n\t"
  65891. "adc r10, r10, #0\n\t"
  65892. /* A[1] * B[3] */
  65893. "ldr r6, [%[a], #4]\n\t"
  65894. "ldr r7, [%[b], #12]\n\t"
  65895. "lsl r3, r6, #16\n\t"
  65896. "lsl r4, r7, #16\n\t"
  65897. "lsr r3, r3, #16\n\t"
  65898. "lsr r4, r4, #16\n\t"
  65899. "mul r4, r3, r4\n\t"
  65900. "adds r8, r8, r4\n\t"
  65901. "adcs r9, r9, #0\n\t"
  65902. "adc r10, r5, r10\n\t"
  65903. "lsr r4, r7, #16\n\t"
  65904. "mul r3, r4, r3\n\t"
  65905. "lsr r4, r3, #16\n\t"
  65906. "lsl r3, r3, #16\n\t"
  65907. "adds r8, r8, r3\n\t"
  65908. "adcs r9, r9, r4\n\t"
  65909. "adc r10, r10, #0\n\t"
  65910. "lsr r3, r6, #16\n\t"
  65911. "lsr r4, r7, #16\n\t"
  65912. "mul r4, r3, r4\n\t"
  65913. "adds r9, r9, r4\n\t"
  65914. "adc r10, r10, #0\n\t"
  65915. "lsl r4, r7, #16\n\t"
  65916. "lsr r4, r4, #16\n\t"
  65917. "mul r3, r4, r3\n\t"
  65918. "lsr r4, r3, #16\n\t"
  65919. "lsl r3, r3, #16\n\t"
  65920. "adds r8, r8, r3\n\t"
  65921. "adcs r9, r9, r4\n\t"
  65922. "adc r10, r10, #0\n\t"
  65923. /* A[0] * B[4] */
  65924. "ldr r6, [%[a]]\n\t"
  65925. "ldr r7, [%[b], #16]\n\t"
  65926. "lsl r3, r6, #16\n\t"
  65927. "lsl r4, r7, #16\n\t"
  65928. "lsr r3, r3, #16\n\t"
  65929. "lsr r4, r4, #16\n\t"
  65930. "mul r4, r3, r4\n\t"
  65931. "adds r8, r8, r4\n\t"
  65932. "adcs r9, r9, #0\n\t"
  65933. "adc r10, r5, r10\n\t"
  65934. "lsr r4, r7, #16\n\t"
  65935. "mul r3, r4, r3\n\t"
  65936. "lsr r4, r3, #16\n\t"
  65937. "lsl r3, r3, #16\n\t"
  65938. "adds r8, r8, r3\n\t"
  65939. "adcs r9, r9, r4\n\t"
  65940. "adc r10, r10, #0\n\t"
  65941. "lsr r3, r6, #16\n\t"
  65942. "lsr r4, r7, #16\n\t"
  65943. "mul r4, r3, r4\n\t"
  65944. "adds r9, r9, r4\n\t"
  65945. "adc r10, r10, #0\n\t"
  65946. "lsl r4, r7, #16\n\t"
  65947. "lsr r4, r4, #16\n\t"
  65948. "mul r3, r4, r3\n\t"
  65949. "lsr r4, r3, #16\n\t"
  65950. "lsl r3, r3, #16\n\t"
  65951. "adds r8, r8, r3\n\t"
  65952. "adcs r9, r9, r4\n\t"
  65953. "adc r10, r10, #0\n\t"
  65954. "str r8, [sp, #16]\n\t"
  65955. /* A[0] * B[5] */
  65956. "ldr r7, [%[b], #20]\n\t"
  65957. "lsl r3, r6, #16\n\t"
  65958. "lsl r4, r7, #16\n\t"
  65959. "lsr r3, r3, #16\n\t"
  65960. "lsr r4, r4, #16\n\t"
  65961. "mul r4, r3, r4\n\t"
  65962. "adds r9, r9, r4\n\t"
  65963. "adcs r10, r10, #0\n\t"
  65964. "adc lr, r5, #0\n\t"
  65965. "lsr r4, r7, #16\n\t"
  65966. "mul r3, r4, r3\n\t"
  65967. "lsr r4, r3, #16\n\t"
  65968. "lsl r3, r3, #16\n\t"
  65969. "adds r9, r9, r3\n\t"
  65970. "adcs r10, r10, r4\n\t"
  65971. "adc lr, lr, #0\n\t"
  65972. "lsr r3, r6, #16\n\t"
  65973. "lsr r4, r7, #16\n\t"
  65974. "mul r4, r3, r4\n\t"
  65975. "adds r10, r10, r4\n\t"
  65976. "adc lr, lr, #0\n\t"
  65977. "lsl r4, r7, #16\n\t"
  65978. "lsr r4, r4, #16\n\t"
  65979. "mul r3, r4, r3\n\t"
  65980. "lsr r4, r3, #16\n\t"
  65981. "lsl r3, r3, #16\n\t"
  65982. "adds r9, r9, r3\n\t"
  65983. "adcs r10, r10, r4\n\t"
  65984. "adc lr, lr, #0\n\t"
  65985. /* A[1] * B[4] */
  65986. "ldr r6, [%[a], #4]\n\t"
  65987. "ldr r7, [%[b], #16]\n\t"
  65988. "lsl r3, r6, #16\n\t"
  65989. "lsl r4, r7, #16\n\t"
  65990. "lsr r3, r3, #16\n\t"
  65991. "lsr r4, r4, #16\n\t"
  65992. "mul r4, r3, r4\n\t"
  65993. "adds r9, r9, r4\n\t"
  65994. "adcs r10, r10, #0\n\t"
  65995. "adc lr, r5, lr\n\t"
  65996. "lsr r4, r7, #16\n\t"
  65997. "mul r3, r4, r3\n\t"
  65998. "lsr r4, r3, #16\n\t"
  65999. "lsl r3, r3, #16\n\t"
  66000. "adds r9, r9, r3\n\t"
  66001. "adcs r10, r10, r4\n\t"
  66002. "adc lr, lr, #0\n\t"
  66003. "lsr r3, r6, #16\n\t"
  66004. "lsr r4, r7, #16\n\t"
  66005. "mul r4, r3, r4\n\t"
  66006. "adds r10, r10, r4\n\t"
  66007. "adc lr, lr, #0\n\t"
  66008. "lsl r4, r7, #16\n\t"
  66009. "lsr r4, r4, #16\n\t"
  66010. "mul r3, r4, r3\n\t"
  66011. "lsr r4, r3, #16\n\t"
  66012. "lsl r3, r3, #16\n\t"
  66013. "adds r9, r9, r3\n\t"
  66014. "adcs r10, r10, r4\n\t"
  66015. "adc lr, lr, #0\n\t"
  66016. /* A[2] * B[3] */
  66017. "ldr r6, [%[a], #8]\n\t"
  66018. "ldr r7, [%[b], #12]\n\t"
  66019. "lsl r3, r6, #16\n\t"
  66020. "lsl r4, r7, #16\n\t"
  66021. "lsr r3, r3, #16\n\t"
  66022. "lsr r4, r4, #16\n\t"
  66023. "mul r4, r3, r4\n\t"
  66024. "adds r9, r9, r4\n\t"
  66025. "adcs r10, r10, #0\n\t"
  66026. "adc lr, r5, lr\n\t"
  66027. "lsr r4, r7, #16\n\t"
  66028. "mul r3, r4, r3\n\t"
  66029. "lsr r4, r3, #16\n\t"
  66030. "lsl r3, r3, #16\n\t"
  66031. "adds r9, r9, r3\n\t"
  66032. "adcs r10, r10, r4\n\t"
  66033. "adc lr, lr, #0\n\t"
  66034. "lsr r3, r6, #16\n\t"
  66035. "lsr r4, r7, #16\n\t"
  66036. "mul r4, r3, r4\n\t"
  66037. "adds r10, r10, r4\n\t"
  66038. "adc lr, lr, #0\n\t"
  66039. "lsl r4, r7, #16\n\t"
  66040. "lsr r4, r4, #16\n\t"
  66041. "mul r3, r4, r3\n\t"
  66042. "lsr r4, r3, #16\n\t"
  66043. "lsl r3, r3, #16\n\t"
  66044. "adds r9, r9, r3\n\t"
  66045. "adcs r10, r10, r4\n\t"
  66046. "adc lr, lr, #0\n\t"
  66047. /* A[3] * B[2] */
  66048. "ldr r6, [%[a], #12]\n\t"
  66049. "ldr r7, [%[b], #8]\n\t"
  66050. "lsl r3, r6, #16\n\t"
  66051. "lsl r4, r7, #16\n\t"
  66052. "lsr r3, r3, #16\n\t"
  66053. "lsr r4, r4, #16\n\t"
  66054. "mul r4, r3, r4\n\t"
  66055. "adds r9, r9, r4\n\t"
  66056. "adcs r10, r10, #0\n\t"
  66057. "adc lr, r5, lr\n\t"
  66058. "lsr r4, r7, #16\n\t"
  66059. "mul r3, r4, r3\n\t"
  66060. "lsr r4, r3, #16\n\t"
  66061. "lsl r3, r3, #16\n\t"
  66062. "adds r9, r9, r3\n\t"
  66063. "adcs r10, r10, r4\n\t"
  66064. "adc lr, lr, #0\n\t"
  66065. "lsr r3, r6, #16\n\t"
  66066. "lsr r4, r7, #16\n\t"
  66067. "mul r4, r3, r4\n\t"
  66068. "adds r10, r10, r4\n\t"
  66069. "adc lr, lr, #0\n\t"
  66070. "lsl r4, r7, #16\n\t"
  66071. "lsr r4, r4, #16\n\t"
  66072. "mul r3, r4, r3\n\t"
  66073. "lsr r4, r3, #16\n\t"
  66074. "lsl r3, r3, #16\n\t"
  66075. "adds r9, r9, r3\n\t"
  66076. "adcs r10, r10, r4\n\t"
  66077. "adc lr, lr, #0\n\t"
  66078. /* A[4] * B[1] */
  66079. "ldr r6, [%[a], #16]\n\t"
  66080. "ldr r7, [%[b], #4]\n\t"
  66081. "lsl r3, r6, #16\n\t"
  66082. "lsl r4, r7, #16\n\t"
  66083. "lsr r3, r3, #16\n\t"
  66084. "lsr r4, r4, #16\n\t"
  66085. "mul r4, r3, r4\n\t"
  66086. "adds r9, r9, r4\n\t"
  66087. "adcs r10, r10, #0\n\t"
  66088. "adc lr, r5, lr\n\t"
  66089. "lsr r4, r7, #16\n\t"
  66090. "mul r3, r4, r3\n\t"
  66091. "lsr r4, r3, #16\n\t"
  66092. "lsl r3, r3, #16\n\t"
  66093. "adds r9, r9, r3\n\t"
  66094. "adcs r10, r10, r4\n\t"
  66095. "adc lr, lr, #0\n\t"
  66096. "lsr r3, r6, #16\n\t"
  66097. "lsr r4, r7, #16\n\t"
  66098. "mul r4, r3, r4\n\t"
  66099. "adds r10, r10, r4\n\t"
  66100. "adc lr, lr, #0\n\t"
  66101. "lsl r4, r7, #16\n\t"
  66102. "lsr r4, r4, #16\n\t"
  66103. "mul r3, r4, r3\n\t"
  66104. "lsr r4, r3, #16\n\t"
  66105. "lsl r3, r3, #16\n\t"
  66106. "adds r9, r9, r3\n\t"
  66107. "adcs r10, r10, r4\n\t"
  66108. "adc lr, lr, #0\n\t"
  66109. /* A[5] * B[0] */
  66110. "ldr r6, [%[a], #20]\n\t"
  66111. "ldr r7, [%[b]]\n\t"
  66112. "lsl r3, r6, #16\n\t"
  66113. "lsl r4, r7, #16\n\t"
  66114. "lsr r3, r3, #16\n\t"
  66115. "lsr r4, r4, #16\n\t"
  66116. "mul r4, r3, r4\n\t"
  66117. "adds r9, r9, r4\n\t"
  66118. "adcs r10, r10, #0\n\t"
  66119. "adc lr, r5, lr\n\t"
  66120. "lsr r4, r7, #16\n\t"
  66121. "mul r3, r4, r3\n\t"
  66122. "lsr r4, r3, #16\n\t"
  66123. "lsl r3, r3, #16\n\t"
  66124. "adds r9, r9, r3\n\t"
  66125. "adcs r10, r10, r4\n\t"
  66126. "adc lr, lr, #0\n\t"
  66127. "lsr r3, r6, #16\n\t"
  66128. "lsr r4, r7, #16\n\t"
  66129. "mul r4, r3, r4\n\t"
  66130. "adds r10, r10, r4\n\t"
  66131. "adc lr, lr, #0\n\t"
  66132. "lsl r4, r7, #16\n\t"
  66133. "lsr r4, r4, #16\n\t"
  66134. "mul r3, r4, r3\n\t"
  66135. "lsr r4, r3, #16\n\t"
  66136. "lsl r3, r3, #16\n\t"
  66137. "adds r9, r9, r3\n\t"
  66138. "adcs r10, r10, r4\n\t"
  66139. "adc lr, lr, #0\n\t"
  66140. "str r9, [sp, #20]\n\t"
  66141. /* A[6] * B[0] */
  66142. "ldr r6, [%[a], #24]\n\t"
  66143. "lsl r3, r6, #16\n\t"
  66144. "lsl r4, r7, #16\n\t"
  66145. "lsr r3, r3, #16\n\t"
  66146. "lsr r4, r4, #16\n\t"
  66147. "mul r4, r3, r4\n\t"
  66148. "adds r10, r10, r4\n\t"
  66149. "adcs lr, lr, #0\n\t"
  66150. "adc r8, r5, #0\n\t"
  66151. "lsr r4, r7, #16\n\t"
  66152. "mul r3, r4, r3\n\t"
  66153. "lsr r4, r3, #16\n\t"
  66154. "lsl r3, r3, #16\n\t"
  66155. "adds r10, r10, r3\n\t"
  66156. "adcs lr, lr, r4\n\t"
  66157. "adc r8, r8, #0\n\t"
  66158. "lsr r3, r6, #16\n\t"
  66159. "lsr r4, r7, #16\n\t"
  66160. "mul r4, r3, r4\n\t"
  66161. "adds lr, lr, r4\n\t"
  66162. "adc r8, r8, #0\n\t"
  66163. "lsl r4, r7, #16\n\t"
  66164. "lsr r4, r4, #16\n\t"
  66165. "mul r3, r4, r3\n\t"
  66166. "lsr r4, r3, #16\n\t"
  66167. "lsl r3, r3, #16\n\t"
  66168. "adds r10, r10, r3\n\t"
  66169. "adcs lr, lr, r4\n\t"
  66170. "adc r8, r8, #0\n\t"
  66171. /* A[5] * B[1] */
  66172. "ldr r6, [%[a], #20]\n\t"
  66173. "ldr r7, [%[b], #4]\n\t"
  66174. "lsl r3, r6, #16\n\t"
  66175. "lsl r4, r7, #16\n\t"
  66176. "lsr r3, r3, #16\n\t"
  66177. "lsr r4, r4, #16\n\t"
  66178. "mul r4, r3, r4\n\t"
  66179. "adds r10, r10, r4\n\t"
  66180. "adcs lr, lr, #0\n\t"
  66181. "adc r8, r5, r8\n\t"
  66182. "lsr r4, r7, #16\n\t"
  66183. "mul r3, r4, r3\n\t"
  66184. "lsr r4, r3, #16\n\t"
  66185. "lsl r3, r3, #16\n\t"
  66186. "adds r10, r10, r3\n\t"
  66187. "adcs lr, lr, r4\n\t"
  66188. "adc r8, r8, #0\n\t"
  66189. "lsr r3, r6, #16\n\t"
  66190. "lsr r4, r7, #16\n\t"
  66191. "mul r4, r3, r4\n\t"
  66192. "adds lr, lr, r4\n\t"
  66193. "adc r8, r8, #0\n\t"
  66194. "lsl r4, r7, #16\n\t"
  66195. "lsr r4, r4, #16\n\t"
  66196. "mul r3, r4, r3\n\t"
  66197. "lsr r4, r3, #16\n\t"
  66198. "lsl r3, r3, #16\n\t"
  66199. "adds r10, r10, r3\n\t"
  66200. "adcs lr, lr, r4\n\t"
  66201. "adc r8, r8, #0\n\t"
  66202. /* A[4] * B[2] */
  66203. "ldr r6, [%[a], #16]\n\t"
  66204. "ldr r7, [%[b], #8]\n\t"
  66205. "lsl r3, r6, #16\n\t"
  66206. "lsl r4, r7, #16\n\t"
  66207. "lsr r3, r3, #16\n\t"
  66208. "lsr r4, r4, #16\n\t"
  66209. "mul r4, r3, r4\n\t"
  66210. "adds r10, r10, r4\n\t"
  66211. "adcs lr, lr, #0\n\t"
  66212. "adc r8, r5, r8\n\t"
  66213. "lsr r4, r7, #16\n\t"
  66214. "mul r3, r4, r3\n\t"
  66215. "lsr r4, r3, #16\n\t"
  66216. "lsl r3, r3, #16\n\t"
  66217. "adds r10, r10, r3\n\t"
  66218. "adcs lr, lr, r4\n\t"
  66219. "adc r8, r8, #0\n\t"
  66220. "lsr r3, r6, #16\n\t"
  66221. "lsr r4, r7, #16\n\t"
  66222. "mul r4, r3, r4\n\t"
  66223. "adds lr, lr, r4\n\t"
  66224. "adc r8, r8, #0\n\t"
  66225. "lsl r4, r7, #16\n\t"
  66226. "lsr r4, r4, #16\n\t"
  66227. "mul r3, r4, r3\n\t"
  66228. "lsr r4, r3, #16\n\t"
  66229. "lsl r3, r3, #16\n\t"
  66230. "adds r10, r10, r3\n\t"
  66231. "adcs lr, lr, r4\n\t"
  66232. "adc r8, r8, #0\n\t"
  66233. /* A[3] * B[3] */
  66234. "ldr r6, [%[a], #12]\n\t"
  66235. "ldr r7, [%[b], #12]\n\t"
  66236. "lsl r3, r6, #16\n\t"
  66237. "lsl r4, r7, #16\n\t"
  66238. "lsr r3, r3, #16\n\t"
  66239. "lsr r4, r4, #16\n\t"
  66240. "mul r4, r3, r4\n\t"
  66241. "adds r10, r10, r4\n\t"
  66242. "adcs lr, lr, #0\n\t"
  66243. "adc r8, r5, r8\n\t"
  66244. "lsr r4, r7, #16\n\t"
  66245. "mul r3, r4, r3\n\t"
  66246. "lsr r4, r3, #16\n\t"
  66247. "lsl r3, r3, #16\n\t"
  66248. "adds r10, r10, r3\n\t"
  66249. "adcs lr, lr, r4\n\t"
  66250. "adc r8, r8, #0\n\t"
  66251. "lsr r3, r6, #16\n\t"
  66252. "lsr r4, r7, #16\n\t"
  66253. "mul r4, r3, r4\n\t"
  66254. "adds lr, lr, r4\n\t"
  66255. "adc r8, r8, #0\n\t"
  66256. "lsl r4, r7, #16\n\t"
  66257. "lsr r4, r4, #16\n\t"
  66258. "mul r3, r4, r3\n\t"
  66259. "lsr r4, r3, #16\n\t"
  66260. "lsl r3, r3, #16\n\t"
  66261. "adds r10, r10, r3\n\t"
  66262. "adcs lr, lr, r4\n\t"
  66263. "adc r8, r8, #0\n\t"
  66264. /* A[2] * B[4] */
  66265. "ldr r6, [%[a], #8]\n\t"
  66266. "ldr r7, [%[b], #16]\n\t"
  66267. "lsl r3, r6, #16\n\t"
  66268. "lsl r4, r7, #16\n\t"
  66269. "lsr r3, r3, #16\n\t"
  66270. "lsr r4, r4, #16\n\t"
  66271. "mul r4, r3, r4\n\t"
  66272. "adds r10, r10, r4\n\t"
  66273. "adcs lr, lr, #0\n\t"
  66274. "adc r8, r5, r8\n\t"
  66275. "lsr r4, r7, #16\n\t"
  66276. "mul r3, r4, r3\n\t"
  66277. "lsr r4, r3, #16\n\t"
  66278. "lsl r3, r3, #16\n\t"
  66279. "adds r10, r10, r3\n\t"
  66280. "adcs lr, lr, r4\n\t"
  66281. "adc r8, r8, #0\n\t"
  66282. "lsr r3, r6, #16\n\t"
  66283. "lsr r4, r7, #16\n\t"
  66284. "mul r4, r3, r4\n\t"
  66285. "adds lr, lr, r4\n\t"
  66286. "adc r8, r8, #0\n\t"
  66287. "lsl r4, r7, #16\n\t"
  66288. "lsr r4, r4, #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 r10, r10, r3\n\t"
  66293. "adcs lr, lr, r4\n\t"
  66294. "adc r8, r8, #0\n\t"
  66295. /* A[1] * B[5] */
  66296. "ldr r6, [%[a], #4]\n\t"
  66297. "ldr r7, [%[b], #20]\n\t"
  66298. "lsl r3, r6, #16\n\t"
  66299. "lsl r4, r7, #16\n\t"
  66300. "lsr r3, r3, #16\n\t"
  66301. "lsr r4, r4, #16\n\t"
  66302. "mul r4, r3, r4\n\t"
  66303. "adds r10, r10, r4\n\t"
  66304. "adcs lr, lr, #0\n\t"
  66305. "adc r8, r5, r8\n\t"
  66306. "lsr r4, r7, #16\n\t"
  66307. "mul r3, r4, r3\n\t"
  66308. "lsr r4, r3, #16\n\t"
  66309. "lsl r3, r3, #16\n\t"
  66310. "adds r10, r10, r3\n\t"
  66311. "adcs lr, lr, r4\n\t"
  66312. "adc r8, r8, #0\n\t"
  66313. "lsr r3, r6, #16\n\t"
  66314. "lsr r4, r7, #16\n\t"
  66315. "mul r4, r3, r4\n\t"
  66316. "adds lr, lr, r4\n\t"
  66317. "adc r8, r8, #0\n\t"
  66318. "lsl r4, r7, #16\n\t"
  66319. "lsr r4, r4, #16\n\t"
  66320. "mul r3, r4, r3\n\t"
  66321. "lsr r4, r3, #16\n\t"
  66322. "lsl r3, r3, #16\n\t"
  66323. "adds r10, r10, r3\n\t"
  66324. "adcs lr, lr, r4\n\t"
  66325. "adc r8, r8, #0\n\t"
  66326. /* A[0] * B[6] */
  66327. "ldr r6, [%[a]]\n\t"
  66328. "ldr r7, [%[b], #24]\n\t"
  66329. "lsl r3, r6, #16\n\t"
  66330. "lsl r4, r7, #16\n\t"
  66331. "lsr r3, r3, #16\n\t"
  66332. "lsr r4, r4, #16\n\t"
  66333. "mul r4, r3, r4\n\t"
  66334. "adds r10, r10, r4\n\t"
  66335. "adcs lr, lr, #0\n\t"
  66336. "adc r8, r5, r8\n\t"
  66337. "lsr r4, r7, #16\n\t"
  66338. "mul r3, r4, r3\n\t"
  66339. "lsr r4, r3, #16\n\t"
  66340. "lsl r3, r3, #16\n\t"
  66341. "adds r10, r10, r3\n\t"
  66342. "adcs lr, lr, r4\n\t"
  66343. "adc r8, r8, #0\n\t"
  66344. "lsr r3, r6, #16\n\t"
  66345. "lsr r4, r7, #16\n\t"
  66346. "mul r4, r3, r4\n\t"
  66347. "adds lr, lr, r4\n\t"
  66348. "adc r8, r8, #0\n\t"
  66349. "lsl r4, r7, #16\n\t"
  66350. "lsr r4, r4, #16\n\t"
  66351. "mul r3, r4, r3\n\t"
  66352. "lsr r4, r3, #16\n\t"
  66353. "lsl r3, r3, #16\n\t"
  66354. "adds r10, r10, r3\n\t"
  66355. "adcs lr, lr, r4\n\t"
  66356. "adc r8, r8, #0\n\t"
  66357. "str r10, [sp, #24]\n\t"
  66358. /* A[0] * B[7] */
  66359. "ldr r7, [%[b], #28]\n\t"
  66360. "lsl r3, r6, #16\n\t"
  66361. "lsl r4, r7, #16\n\t"
  66362. "lsr r3, r3, #16\n\t"
  66363. "lsr r4, r4, #16\n\t"
  66364. "mul r4, r3, r4\n\t"
  66365. "adds lr, lr, r4\n\t"
  66366. "adcs r8, r8, #0\n\t"
  66367. "adc r9, r5, #0\n\t"
  66368. "lsr r4, r7, #16\n\t"
  66369. "mul r3, r4, r3\n\t"
  66370. "lsr r4, r3, #16\n\t"
  66371. "lsl r3, r3, #16\n\t"
  66372. "adds lr, lr, r3\n\t"
  66373. "adcs r8, r8, r4\n\t"
  66374. "adc r9, r9, #0\n\t"
  66375. "lsr r3, r6, #16\n\t"
  66376. "lsr r4, r7, #16\n\t"
  66377. "mul r4, r3, r4\n\t"
  66378. "adds r8, r8, r4\n\t"
  66379. "adc r9, r9, #0\n\t"
  66380. "lsl r4, r7, #16\n\t"
  66381. "lsr r4, r4, #16\n\t"
  66382. "mul r3, r4, r3\n\t"
  66383. "lsr r4, r3, #16\n\t"
  66384. "lsl r3, r3, #16\n\t"
  66385. "adds lr, lr, r3\n\t"
  66386. "adcs r8, r8, r4\n\t"
  66387. "adc r9, r9, #0\n\t"
  66388. /* A[1] * B[6] */
  66389. "ldr r6, [%[a], #4]\n\t"
  66390. "ldr r7, [%[b], #24]\n\t"
  66391. "lsl r3, r6, #16\n\t"
  66392. "lsl r4, r7, #16\n\t"
  66393. "lsr r3, r3, #16\n\t"
  66394. "lsr r4, r4, #16\n\t"
  66395. "mul r4, r3, r4\n\t"
  66396. "adds lr, lr, r4\n\t"
  66397. "adcs r8, r8, #0\n\t"
  66398. "adc r9, r5, r9\n\t"
  66399. "lsr r4, r7, #16\n\t"
  66400. "mul r3, r4, r3\n\t"
  66401. "lsr r4, r3, #16\n\t"
  66402. "lsl r3, r3, #16\n\t"
  66403. "adds lr, lr, r3\n\t"
  66404. "adcs r8, r8, r4\n\t"
  66405. "adc r9, r9, #0\n\t"
  66406. "lsr r3, r6, #16\n\t"
  66407. "lsr r4, r7, #16\n\t"
  66408. "mul r4, r3, r4\n\t"
  66409. "adds r8, r8, r4\n\t"
  66410. "adc r9, r9, #0\n\t"
  66411. "lsl r4, r7, #16\n\t"
  66412. "lsr r4, r4, #16\n\t"
  66413. "mul r3, r4, r3\n\t"
  66414. "lsr r4, r3, #16\n\t"
  66415. "lsl r3, r3, #16\n\t"
  66416. "adds lr, lr, r3\n\t"
  66417. "adcs r8, r8, r4\n\t"
  66418. "adc r9, r9, #0\n\t"
  66419. /* A[2] * B[5] */
  66420. "ldr r6, [%[a], #8]\n\t"
  66421. "ldr r7, [%[b], #20]\n\t"
  66422. "lsl r3, r6, #16\n\t"
  66423. "lsl r4, r7, #16\n\t"
  66424. "lsr r3, r3, #16\n\t"
  66425. "lsr r4, r4, #16\n\t"
  66426. "mul r4, r3, r4\n\t"
  66427. "adds lr, lr, r4\n\t"
  66428. "adcs r8, r8, #0\n\t"
  66429. "adc r9, r5, r9\n\t"
  66430. "lsr r4, r7, #16\n\t"
  66431. "mul r3, r4, r3\n\t"
  66432. "lsr r4, r3, #16\n\t"
  66433. "lsl r3, r3, #16\n\t"
  66434. "adds lr, lr, r3\n\t"
  66435. "adcs r8, r8, r4\n\t"
  66436. "adc r9, r9, #0\n\t"
  66437. "lsr r3, r6, #16\n\t"
  66438. "lsr r4, r7, #16\n\t"
  66439. "mul r4, r3, r4\n\t"
  66440. "adds r8, r8, r4\n\t"
  66441. "adc r9, r9, #0\n\t"
  66442. "lsl r4, r7, #16\n\t"
  66443. "lsr r4, r4, #16\n\t"
  66444. "mul r3, r4, r3\n\t"
  66445. "lsr r4, r3, #16\n\t"
  66446. "lsl r3, r3, #16\n\t"
  66447. "adds lr, lr, r3\n\t"
  66448. "adcs r8, r8, r4\n\t"
  66449. "adc r9, r9, #0\n\t"
  66450. /* A[3] * B[4] */
  66451. "ldr r6, [%[a], #12]\n\t"
  66452. "ldr r7, [%[b], #16]\n\t"
  66453. "lsl r3, r6, #16\n\t"
  66454. "lsl r4, r7, #16\n\t"
  66455. "lsr r3, r3, #16\n\t"
  66456. "lsr r4, r4, #16\n\t"
  66457. "mul r4, r3, r4\n\t"
  66458. "adds lr, lr, r4\n\t"
  66459. "adcs r8, r8, #0\n\t"
  66460. "adc r9, r5, r9\n\t"
  66461. "lsr r4, r7, #16\n\t"
  66462. "mul r3, r4, r3\n\t"
  66463. "lsr r4, r3, #16\n\t"
  66464. "lsl r3, r3, #16\n\t"
  66465. "adds lr, lr, r3\n\t"
  66466. "adcs r8, r8, r4\n\t"
  66467. "adc r9, r9, #0\n\t"
  66468. "lsr r3, r6, #16\n\t"
  66469. "lsr r4, r7, #16\n\t"
  66470. "mul r4, r3, r4\n\t"
  66471. "adds r8, r8, r4\n\t"
  66472. "adc r9, r9, #0\n\t"
  66473. "lsl r4, r7, #16\n\t"
  66474. "lsr r4, r4, #16\n\t"
  66475. "mul r3, r4, r3\n\t"
  66476. "lsr r4, r3, #16\n\t"
  66477. "lsl r3, r3, #16\n\t"
  66478. "adds lr, lr, r3\n\t"
  66479. "adcs r8, r8, r4\n\t"
  66480. "adc r9, r9, #0\n\t"
  66481. /* A[4] * B[3] */
  66482. "ldr r6, [%[a], #16]\n\t"
  66483. "ldr r7, [%[b], #12]\n\t"
  66484. "lsl r3, r6, #16\n\t"
  66485. "lsl r4, r7, #16\n\t"
  66486. "lsr r3, r3, #16\n\t"
  66487. "lsr r4, r4, #16\n\t"
  66488. "mul r4, r3, r4\n\t"
  66489. "adds lr, lr, r4\n\t"
  66490. "adcs r8, r8, #0\n\t"
  66491. "adc r9, r5, r9\n\t"
  66492. "lsr r4, r7, #16\n\t"
  66493. "mul r3, r4, r3\n\t"
  66494. "lsr r4, r3, #16\n\t"
  66495. "lsl r3, r3, #16\n\t"
  66496. "adds lr, lr, r3\n\t"
  66497. "adcs r8, r8, r4\n\t"
  66498. "adc r9, r9, #0\n\t"
  66499. "lsr r3, r6, #16\n\t"
  66500. "lsr r4, r7, #16\n\t"
  66501. "mul r4, r3, r4\n\t"
  66502. "adds r8, r8, r4\n\t"
  66503. "adc r9, r9, #0\n\t"
  66504. "lsl r4, r7, #16\n\t"
  66505. "lsr r4, r4, #16\n\t"
  66506. "mul r3, r4, r3\n\t"
  66507. "lsr r4, r3, #16\n\t"
  66508. "lsl r3, r3, #16\n\t"
  66509. "adds lr, lr, r3\n\t"
  66510. "adcs r8, r8, r4\n\t"
  66511. "adc r9, r9, #0\n\t"
  66512. /* A[5] * B[2] */
  66513. "ldr r6, [%[a], #20]\n\t"
  66514. "ldr r7, [%[b], #8]\n\t"
  66515. "lsl r3, r6, #16\n\t"
  66516. "lsl r4, r7, #16\n\t"
  66517. "lsr r3, r3, #16\n\t"
  66518. "lsr r4, r4, #16\n\t"
  66519. "mul r4, r3, r4\n\t"
  66520. "adds lr, lr, r4\n\t"
  66521. "adcs r8, r8, #0\n\t"
  66522. "adc r9, r5, r9\n\t"
  66523. "lsr r4, r7, #16\n\t"
  66524. "mul r3, r4, r3\n\t"
  66525. "lsr r4, r3, #16\n\t"
  66526. "lsl r3, r3, #16\n\t"
  66527. "adds lr, lr, r3\n\t"
  66528. "adcs r8, r8, r4\n\t"
  66529. "adc r9, r9, #0\n\t"
  66530. "lsr r3, r6, #16\n\t"
  66531. "lsr r4, r7, #16\n\t"
  66532. "mul r4, r3, r4\n\t"
  66533. "adds r8, r8, r4\n\t"
  66534. "adc r9, r9, #0\n\t"
  66535. "lsl r4, r7, #16\n\t"
  66536. "lsr r4, r4, #16\n\t"
  66537. "mul r3, r4, r3\n\t"
  66538. "lsr r4, r3, #16\n\t"
  66539. "lsl r3, r3, #16\n\t"
  66540. "adds lr, lr, r3\n\t"
  66541. "adcs r8, r8, r4\n\t"
  66542. "adc r9, r9, #0\n\t"
  66543. /* A[6] * B[1] */
  66544. "ldr r6, [%[a], #24]\n\t"
  66545. "ldr r7, [%[b], #4]\n\t"
  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, r9\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. /* A[7] * B[0] */
  66575. "ldr r6, [%[a], #28]\n\t"
  66576. "ldr r7, [%[b]]\n\t"
  66577. "lsl r3, r6, #16\n\t"
  66578. "lsl r4, r7, #16\n\t"
  66579. "lsr r3, r3, #16\n\t"
  66580. "lsr r4, r4, #16\n\t"
  66581. "mul r4, r3, r4\n\t"
  66582. "adds lr, lr, r4\n\t"
  66583. "adcs r8, r8, #0\n\t"
  66584. "adc r9, r5, r9\n\t"
  66585. "lsr r4, r7, #16\n\t"
  66586. "mul r3, r4, r3\n\t"
  66587. "lsr r4, r3, #16\n\t"
  66588. "lsl r3, r3, #16\n\t"
  66589. "adds lr, lr, r3\n\t"
  66590. "adcs r8, r8, r4\n\t"
  66591. "adc r9, r9, #0\n\t"
  66592. "lsr r3, r6, #16\n\t"
  66593. "lsr r4, r7, #16\n\t"
  66594. "mul r4, r3, r4\n\t"
  66595. "adds r8, r8, r4\n\t"
  66596. "adc r9, r9, #0\n\t"
  66597. "lsl r4, r7, #16\n\t"
  66598. "lsr r4, r4, #16\n\t"
  66599. "mul r3, r4, r3\n\t"
  66600. "lsr r4, r3, #16\n\t"
  66601. "lsl r3, r3, #16\n\t"
  66602. "adds lr, lr, r3\n\t"
  66603. "adcs r8, r8, r4\n\t"
  66604. "adc r9, r9, #0\n\t"
  66605. "str lr, [sp, #28]\n\t"
  66606. /* A[7] * B[1] */
  66607. "ldr r7, [%[b], #4]\n\t"
  66608. "lsl r3, r6, #16\n\t"
  66609. "lsl r4, r7, #16\n\t"
  66610. "lsr r3, r3, #16\n\t"
  66611. "lsr r4, r4, #16\n\t"
  66612. "mul r4, r3, r4\n\t"
  66613. "adds r8, r8, r4\n\t"
  66614. "adcs r9, r9, #0\n\t"
  66615. "adc r10, r5, #0\n\t"
  66616. "lsr r4, r7, #16\n\t"
  66617. "mul r3, r4, r3\n\t"
  66618. "lsr r4, r3, #16\n\t"
  66619. "lsl r3, r3, #16\n\t"
  66620. "adds r8, r8, r3\n\t"
  66621. "adcs r9, r9, r4\n\t"
  66622. "adc r10, r10, #0\n\t"
  66623. "lsr r3, r6, #16\n\t"
  66624. "lsr r4, r7, #16\n\t"
  66625. "mul r4, r3, r4\n\t"
  66626. "adds r9, r9, r4\n\t"
  66627. "adc r10, r10, #0\n\t"
  66628. "lsl r4, r7, #16\n\t"
  66629. "lsr r4, r4, #16\n\t"
  66630. "mul r3, r4, r3\n\t"
  66631. "lsr r4, r3, #16\n\t"
  66632. "lsl r3, r3, #16\n\t"
  66633. "adds r8, r8, r3\n\t"
  66634. "adcs r9, r9, r4\n\t"
  66635. "adc r10, r10, #0\n\t"
  66636. /* A[6] * B[2] */
  66637. "ldr r6, [%[a], #24]\n\t"
  66638. "ldr r7, [%[b], #8]\n\t"
  66639. "lsl r3, r6, #16\n\t"
  66640. "lsl r4, r7, #16\n\t"
  66641. "lsr r3, r3, #16\n\t"
  66642. "lsr r4, r4, #16\n\t"
  66643. "mul r4, r3, r4\n\t"
  66644. "adds r8, r8, r4\n\t"
  66645. "adcs r9, r9, #0\n\t"
  66646. "adc r10, r5, r10\n\t"
  66647. "lsr r4, r7, #16\n\t"
  66648. "mul r3, r4, r3\n\t"
  66649. "lsr r4, r3, #16\n\t"
  66650. "lsl r3, r3, #16\n\t"
  66651. "adds r8, r8, r3\n\t"
  66652. "adcs r9, r9, r4\n\t"
  66653. "adc r10, r10, #0\n\t"
  66654. "lsr r3, r6, #16\n\t"
  66655. "lsr r4, r7, #16\n\t"
  66656. "mul r4, r3, r4\n\t"
  66657. "adds r9, r9, r4\n\t"
  66658. "adc r10, r10, #0\n\t"
  66659. "lsl r4, r7, #16\n\t"
  66660. "lsr r4, r4, #16\n\t"
  66661. "mul r3, r4, r3\n\t"
  66662. "lsr r4, r3, #16\n\t"
  66663. "lsl r3, r3, #16\n\t"
  66664. "adds r8, r8, r3\n\t"
  66665. "adcs r9, r9, r4\n\t"
  66666. "adc r10, r10, #0\n\t"
  66667. /* A[5] * B[3] */
  66668. "ldr r6, [%[a], #20]\n\t"
  66669. "ldr r7, [%[b], #12]\n\t"
  66670. "lsl r3, r6, #16\n\t"
  66671. "lsl r4, r7, #16\n\t"
  66672. "lsr r3, r3, #16\n\t"
  66673. "lsr r4, r4, #16\n\t"
  66674. "mul r4, r3, r4\n\t"
  66675. "adds r8, r8, r4\n\t"
  66676. "adcs r9, r9, #0\n\t"
  66677. "adc r10, r5, r10\n\t"
  66678. "lsr r4, r7, #16\n\t"
  66679. "mul r3, r4, r3\n\t"
  66680. "lsr r4, r3, #16\n\t"
  66681. "lsl r3, r3, #16\n\t"
  66682. "adds r8, r8, r3\n\t"
  66683. "adcs r9, r9, r4\n\t"
  66684. "adc r10, r10, #0\n\t"
  66685. "lsr r3, r6, #16\n\t"
  66686. "lsr r4, r7, #16\n\t"
  66687. "mul r4, r3, r4\n\t"
  66688. "adds r9, r9, r4\n\t"
  66689. "adc r10, r10, #0\n\t"
  66690. "lsl r4, r7, #16\n\t"
  66691. "lsr r4, r4, #16\n\t"
  66692. "mul r3, r4, r3\n\t"
  66693. "lsr r4, r3, #16\n\t"
  66694. "lsl r3, r3, #16\n\t"
  66695. "adds r8, r8, r3\n\t"
  66696. "adcs r9, r9, r4\n\t"
  66697. "adc r10, r10, #0\n\t"
  66698. /* A[4] * B[4] */
  66699. "ldr r6, [%[a], #16]\n\t"
  66700. "ldr r7, [%[b], #16]\n\t"
  66701. "lsl r3, r6, #16\n\t"
  66702. "lsl r4, r7, #16\n\t"
  66703. "lsr r3, r3, #16\n\t"
  66704. "lsr r4, r4, #16\n\t"
  66705. "mul r4, r3, r4\n\t"
  66706. "adds r8, r8, r4\n\t"
  66707. "adcs r9, r9, #0\n\t"
  66708. "adc r10, r5, r10\n\t"
  66709. "lsr r4, r7, #16\n\t"
  66710. "mul r3, r4, r3\n\t"
  66711. "lsr r4, r3, #16\n\t"
  66712. "lsl r3, r3, #16\n\t"
  66713. "adds r8, r8, r3\n\t"
  66714. "adcs r9, r9, r4\n\t"
  66715. "adc r10, r10, #0\n\t"
  66716. "lsr r3, r6, #16\n\t"
  66717. "lsr r4, r7, #16\n\t"
  66718. "mul r4, r3, r4\n\t"
  66719. "adds r9, r9, r4\n\t"
  66720. "adc r10, r10, #0\n\t"
  66721. "lsl r4, r7, #16\n\t"
  66722. "lsr r4, r4, #16\n\t"
  66723. "mul r3, r4, r3\n\t"
  66724. "lsr r4, r3, #16\n\t"
  66725. "lsl r3, r3, #16\n\t"
  66726. "adds r8, r8, r3\n\t"
  66727. "adcs r9, r9, r4\n\t"
  66728. "adc r10, r10, #0\n\t"
  66729. /* A[3] * B[5] */
  66730. "ldr r6, [%[a], #12]\n\t"
  66731. "ldr r7, [%[b], #20]\n\t"
  66732. "lsl r3, r6, #16\n\t"
  66733. "lsl r4, r7, #16\n\t"
  66734. "lsr r3, r3, #16\n\t"
  66735. "lsr r4, r4, #16\n\t"
  66736. "mul r4, r3, r4\n\t"
  66737. "adds r8, r8, r4\n\t"
  66738. "adcs r9, r9, #0\n\t"
  66739. "adc r10, r5, r10\n\t"
  66740. "lsr r4, r7, #16\n\t"
  66741. "mul r3, r4, r3\n\t"
  66742. "lsr r4, r3, #16\n\t"
  66743. "lsl r3, r3, #16\n\t"
  66744. "adds r8, r8, r3\n\t"
  66745. "adcs r9, r9, r4\n\t"
  66746. "adc r10, r10, #0\n\t"
  66747. "lsr r3, r6, #16\n\t"
  66748. "lsr r4, r7, #16\n\t"
  66749. "mul r4, r3, r4\n\t"
  66750. "adds r9, r9, r4\n\t"
  66751. "adc r10, r10, #0\n\t"
  66752. "lsl r4, r7, #16\n\t"
  66753. "lsr r4, r4, #16\n\t"
  66754. "mul r3, r4, r3\n\t"
  66755. "lsr r4, r3, #16\n\t"
  66756. "lsl r3, r3, #16\n\t"
  66757. "adds r8, r8, r3\n\t"
  66758. "adcs r9, r9, r4\n\t"
  66759. "adc r10, r10, #0\n\t"
  66760. /* A[2] * B[6] */
  66761. "ldr r6, [%[a], #8]\n\t"
  66762. "ldr r7, [%[b], #24]\n\t"
  66763. "lsl r3, r6, #16\n\t"
  66764. "lsl r4, r7, #16\n\t"
  66765. "lsr r3, r3, #16\n\t"
  66766. "lsr r4, r4, #16\n\t"
  66767. "mul r4, r3, r4\n\t"
  66768. "adds r8, r8, r4\n\t"
  66769. "adcs r9, r9, #0\n\t"
  66770. "adc r10, r5, r10\n\t"
  66771. "lsr r4, r7, #16\n\t"
  66772. "mul r3, r4, r3\n\t"
  66773. "lsr r4, r3, #16\n\t"
  66774. "lsl r3, r3, #16\n\t"
  66775. "adds r8, r8, r3\n\t"
  66776. "adcs r9, r9, r4\n\t"
  66777. "adc r10, r10, #0\n\t"
  66778. "lsr r3, r6, #16\n\t"
  66779. "lsr r4, r7, #16\n\t"
  66780. "mul r4, r3, r4\n\t"
  66781. "adds r9, r9, r4\n\t"
  66782. "adc r10, r10, #0\n\t"
  66783. "lsl r4, r7, #16\n\t"
  66784. "lsr r4, r4, #16\n\t"
  66785. "mul r3, r4, r3\n\t"
  66786. "lsr r4, r3, #16\n\t"
  66787. "lsl r3, r3, #16\n\t"
  66788. "adds r8, r8, r3\n\t"
  66789. "adcs r9, r9, r4\n\t"
  66790. "adc r10, r10, #0\n\t"
  66791. /* A[1] * B[7] */
  66792. "ldr r6, [%[a], #4]\n\t"
  66793. "ldr r7, [%[b], #28]\n\t"
  66794. "lsl r3, r6, #16\n\t"
  66795. "lsl r4, r7, #16\n\t"
  66796. "lsr r3, r3, #16\n\t"
  66797. "lsr r4, r4, #16\n\t"
  66798. "mul r4, r3, r4\n\t"
  66799. "adds r8, r8, r4\n\t"
  66800. "adcs r9, r9, #0\n\t"
  66801. "adc r10, r5, r10\n\t"
  66802. "lsr r4, r7, #16\n\t"
  66803. "mul r3, r4, r3\n\t"
  66804. "lsr r4, r3, #16\n\t"
  66805. "lsl r3, r3, #16\n\t"
  66806. "adds r8, r8, r3\n\t"
  66807. "adcs r9, r9, r4\n\t"
  66808. "adc r10, r10, #0\n\t"
  66809. "lsr r3, r6, #16\n\t"
  66810. "lsr r4, r7, #16\n\t"
  66811. "mul r4, r3, r4\n\t"
  66812. "adds r9, r9, r4\n\t"
  66813. "adc r10, r10, #0\n\t"
  66814. "lsl r4, r7, #16\n\t"
  66815. "lsr r4, r4, #16\n\t"
  66816. "mul r3, r4, r3\n\t"
  66817. "lsr r4, r3, #16\n\t"
  66818. "lsl r3, r3, #16\n\t"
  66819. "adds r8, r8, r3\n\t"
  66820. "adcs r9, r9, r4\n\t"
  66821. "adc r10, r10, #0\n\t"
  66822. "str r8, [sp, #32]\n\t"
  66823. /* A[2] * B[7] */
  66824. "ldr r6, [%[a], #8]\n\t"
  66825. "lsl r3, r6, #16\n\t"
  66826. "lsl r4, r7, #16\n\t"
  66827. "lsr r3, r3, #16\n\t"
  66828. "lsr r4, r4, #16\n\t"
  66829. "mul r4, r3, r4\n\t"
  66830. "adds r9, r9, r4\n\t"
  66831. "adcs r10, r10, #0\n\t"
  66832. "adc lr, r5, #0\n\t"
  66833. "lsr r4, r7, #16\n\t"
  66834. "mul r3, r4, r3\n\t"
  66835. "lsr r4, r3, #16\n\t"
  66836. "lsl r3, r3, #16\n\t"
  66837. "adds r9, r9, r3\n\t"
  66838. "adcs r10, r10, r4\n\t"
  66839. "adc lr, lr, #0\n\t"
  66840. "lsr r3, r6, #16\n\t"
  66841. "lsr r4, r7, #16\n\t"
  66842. "mul r4, r3, r4\n\t"
  66843. "adds r10, r10, r4\n\t"
  66844. "adc lr, lr, #0\n\t"
  66845. "lsl r4, r7, #16\n\t"
  66846. "lsr r4, r4, #16\n\t"
  66847. "mul r3, r4, r3\n\t"
  66848. "lsr r4, r3, #16\n\t"
  66849. "lsl r3, r3, #16\n\t"
  66850. "adds r9, r9, r3\n\t"
  66851. "adcs r10, r10, r4\n\t"
  66852. "adc lr, lr, #0\n\t"
  66853. /* A[3] * B[6] */
  66854. "ldr r6, [%[a], #12]\n\t"
  66855. "ldr r7, [%[b], #24]\n\t"
  66856. "lsl r3, r6, #16\n\t"
  66857. "lsl r4, r7, #16\n\t"
  66858. "lsr r3, r3, #16\n\t"
  66859. "lsr r4, r4, #16\n\t"
  66860. "mul r4, r3, r4\n\t"
  66861. "adds r9, r9, r4\n\t"
  66862. "adcs r10, r10, #0\n\t"
  66863. "adc lr, r5, lr\n\t"
  66864. "lsr r4, r7, #16\n\t"
  66865. "mul r3, r4, r3\n\t"
  66866. "lsr r4, r3, #16\n\t"
  66867. "lsl r3, r3, #16\n\t"
  66868. "adds r9, r9, r3\n\t"
  66869. "adcs r10, r10, r4\n\t"
  66870. "adc lr, lr, #0\n\t"
  66871. "lsr r3, r6, #16\n\t"
  66872. "lsr r4, r7, #16\n\t"
  66873. "mul r4, r3, r4\n\t"
  66874. "adds r10, r10, r4\n\t"
  66875. "adc lr, lr, #0\n\t"
  66876. "lsl r4, r7, #16\n\t"
  66877. "lsr r4, r4, #16\n\t"
  66878. "mul r3, r4, r3\n\t"
  66879. "lsr r4, r3, #16\n\t"
  66880. "lsl r3, r3, #16\n\t"
  66881. "adds r9, r9, r3\n\t"
  66882. "adcs r10, r10, r4\n\t"
  66883. "adc lr, lr, #0\n\t"
  66884. /* A[4] * B[5] */
  66885. "ldr r6, [%[a], #16]\n\t"
  66886. "ldr r7, [%[b], #20]\n\t"
  66887. "lsl r3, r6, #16\n\t"
  66888. "lsl r4, r7, #16\n\t"
  66889. "lsr r3, r3, #16\n\t"
  66890. "lsr r4, r4, #16\n\t"
  66891. "mul r4, r3, r4\n\t"
  66892. "adds r9, r9, r4\n\t"
  66893. "adcs r10, r10, #0\n\t"
  66894. "adc lr, r5, lr\n\t"
  66895. "lsr r4, r7, #16\n\t"
  66896. "mul r3, r4, r3\n\t"
  66897. "lsr r4, r3, #16\n\t"
  66898. "lsl r3, r3, #16\n\t"
  66899. "adds r9, r9, r3\n\t"
  66900. "adcs r10, r10, r4\n\t"
  66901. "adc lr, lr, #0\n\t"
  66902. "lsr r3, r6, #16\n\t"
  66903. "lsr r4, r7, #16\n\t"
  66904. "mul r4, r3, r4\n\t"
  66905. "adds r10, r10, r4\n\t"
  66906. "adc lr, lr, #0\n\t"
  66907. "lsl r4, r7, #16\n\t"
  66908. "lsr r4, r4, #16\n\t"
  66909. "mul r3, r4, r3\n\t"
  66910. "lsr r4, r3, #16\n\t"
  66911. "lsl r3, r3, #16\n\t"
  66912. "adds r9, r9, r3\n\t"
  66913. "adcs r10, r10, r4\n\t"
  66914. "adc lr, lr, #0\n\t"
  66915. /* A[5] * B[4] */
  66916. "ldr r6, [%[a], #20]\n\t"
  66917. "ldr r7, [%[b], #16]\n\t"
  66918. "lsl r3, r6, #16\n\t"
  66919. "lsl r4, r7, #16\n\t"
  66920. "lsr r3, r3, #16\n\t"
  66921. "lsr r4, r4, #16\n\t"
  66922. "mul r4, r3, r4\n\t"
  66923. "adds r9, r9, r4\n\t"
  66924. "adcs r10, r10, #0\n\t"
  66925. "adc lr, r5, lr\n\t"
  66926. "lsr r4, r7, #16\n\t"
  66927. "mul r3, r4, r3\n\t"
  66928. "lsr r4, r3, #16\n\t"
  66929. "lsl r3, r3, #16\n\t"
  66930. "adds r9, r9, r3\n\t"
  66931. "adcs r10, r10, r4\n\t"
  66932. "adc lr, lr, #0\n\t"
  66933. "lsr r3, r6, #16\n\t"
  66934. "lsr r4, r7, #16\n\t"
  66935. "mul r4, r3, r4\n\t"
  66936. "adds r10, r10, r4\n\t"
  66937. "adc lr, lr, #0\n\t"
  66938. "lsl r4, r7, #16\n\t"
  66939. "lsr r4, r4, #16\n\t"
  66940. "mul r3, r4, r3\n\t"
  66941. "lsr r4, r3, #16\n\t"
  66942. "lsl r3, r3, #16\n\t"
  66943. "adds r9, r9, r3\n\t"
  66944. "adcs r10, r10, r4\n\t"
  66945. "adc lr, lr, #0\n\t"
  66946. /* A[6] * B[3] */
  66947. "ldr r6, [%[a], #24]\n\t"
  66948. "ldr r7, [%[b], #12]\n\t"
  66949. "lsl r3, r6, #16\n\t"
  66950. "lsl r4, r7, #16\n\t"
  66951. "lsr r3, r3, #16\n\t"
  66952. "lsr r4, r4, #16\n\t"
  66953. "mul r4, r3, r4\n\t"
  66954. "adds r9, r9, r4\n\t"
  66955. "adcs r10, r10, #0\n\t"
  66956. "adc lr, r5, lr\n\t"
  66957. "lsr r4, r7, #16\n\t"
  66958. "mul r3, r4, r3\n\t"
  66959. "lsr r4, r3, #16\n\t"
  66960. "lsl r3, r3, #16\n\t"
  66961. "adds r9, r9, r3\n\t"
  66962. "adcs r10, r10, r4\n\t"
  66963. "adc lr, lr, #0\n\t"
  66964. "lsr r3, r6, #16\n\t"
  66965. "lsr r4, r7, #16\n\t"
  66966. "mul r4, r3, r4\n\t"
  66967. "adds r10, r10, r4\n\t"
  66968. "adc lr, lr, #0\n\t"
  66969. "lsl r4, r7, #16\n\t"
  66970. "lsr r4, r4, #16\n\t"
  66971. "mul r3, r4, r3\n\t"
  66972. "lsr r4, r3, #16\n\t"
  66973. "lsl r3, r3, #16\n\t"
  66974. "adds r9, r9, r3\n\t"
  66975. "adcs r10, r10, r4\n\t"
  66976. "adc lr, lr, #0\n\t"
  66977. /* A[7] * B[2] */
  66978. "ldr r6, [%[a], #28]\n\t"
  66979. "ldr r7, [%[b], #8]\n\t"
  66980. "lsl r3, r6, #16\n\t"
  66981. "lsl r4, r7, #16\n\t"
  66982. "lsr r3, r3, #16\n\t"
  66983. "lsr r4, r4, #16\n\t"
  66984. "mul r4, r3, r4\n\t"
  66985. "adds r9, r9, r4\n\t"
  66986. "adcs r10, r10, #0\n\t"
  66987. "adc lr, r5, lr\n\t"
  66988. "lsr r4, r7, #16\n\t"
  66989. "mul r3, r4, r3\n\t"
  66990. "lsr r4, r3, #16\n\t"
  66991. "lsl r3, r3, #16\n\t"
  66992. "adds r9, r9, r3\n\t"
  66993. "adcs r10, r10, r4\n\t"
  66994. "adc lr, lr, #0\n\t"
  66995. "lsr r3, r6, #16\n\t"
  66996. "lsr r4, r7, #16\n\t"
  66997. "mul r4, r3, r4\n\t"
  66998. "adds r10, r10, r4\n\t"
  66999. "adc lr, lr, #0\n\t"
  67000. "lsl r4, r7, #16\n\t"
  67001. "lsr r4, r4, #16\n\t"
  67002. "mul r3, r4, r3\n\t"
  67003. "lsr r4, r3, #16\n\t"
  67004. "lsl r3, r3, #16\n\t"
  67005. "adds r9, r9, r3\n\t"
  67006. "adcs r10, r10, r4\n\t"
  67007. "adc lr, lr, #0\n\t"
  67008. "str r9, [sp, #36]\n\t"
  67009. /* A[7] * B[3] */
  67010. "ldr r7, [%[b], #12]\n\t"
  67011. "lsl r3, r6, #16\n\t"
  67012. "lsl r4, r7, #16\n\t"
  67013. "lsr r3, r3, #16\n\t"
  67014. "lsr r4, r4, #16\n\t"
  67015. "mul r4, r3, r4\n\t"
  67016. "adds r10, r10, r4\n\t"
  67017. "adcs lr, lr, #0\n\t"
  67018. "adc r8, r5, #0\n\t"
  67019. "lsr r4, r7, #16\n\t"
  67020. "mul r3, r4, r3\n\t"
  67021. "lsr r4, r3, #16\n\t"
  67022. "lsl r3, r3, #16\n\t"
  67023. "adds r10, r10, r3\n\t"
  67024. "adcs lr, lr, r4\n\t"
  67025. "adc r8, r8, #0\n\t"
  67026. "lsr r3, r6, #16\n\t"
  67027. "lsr r4, r7, #16\n\t"
  67028. "mul r4, r3, r4\n\t"
  67029. "adds lr, lr, r4\n\t"
  67030. "adc r8, r8, #0\n\t"
  67031. "lsl r4, r7, #16\n\t"
  67032. "lsr r4, r4, #16\n\t"
  67033. "mul r3, r4, r3\n\t"
  67034. "lsr r4, r3, #16\n\t"
  67035. "lsl r3, r3, #16\n\t"
  67036. "adds r10, r10, r3\n\t"
  67037. "adcs lr, lr, r4\n\t"
  67038. "adc r8, r8, #0\n\t"
  67039. /* A[6] * B[4] */
  67040. "ldr r6, [%[a], #24]\n\t"
  67041. "ldr r7, [%[b], #16]\n\t"
  67042. "lsl r3, r6, #16\n\t"
  67043. "lsl r4, r7, #16\n\t"
  67044. "lsr r3, r3, #16\n\t"
  67045. "lsr r4, r4, #16\n\t"
  67046. "mul r4, r3, r4\n\t"
  67047. "adds r10, r10, r4\n\t"
  67048. "adcs lr, lr, #0\n\t"
  67049. "adc r8, r5, r8\n\t"
  67050. "lsr r4, r7, #16\n\t"
  67051. "mul r3, r4, r3\n\t"
  67052. "lsr r4, r3, #16\n\t"
  67053. "lsl r3, r3, #16\n\t"
  67054. "adds r10, r10, r3\n\t"
  67055. "adcs lr, lr, r4\n\t"
  67056. "adc r8, r8, #0\n\t"
  67057. "lsr r3, r6, #16\n\t"
  67058. "lsr r4, r7, #16\n\t"
  67059. "mul r4, r3, r4\n\t"
  67060. "adds lr, lr, r4\n\t"
  67061. "adc r8, r8, #0\n\t"
  67062. "lsl r4, r7, #16\n\t"
  67063. "lsr r4, r4, #16\n\t"
  67064. "mul r3, r4, r3\n\t"
  67065. "lsr r4, r3, #16\n\t"
  67066. "lsl r3, r3, #16\n\t"
  67067. "adds r10, r10, r3\n\t"
  67068. "adcs lr, lr, r4\n\t"
  67069. "adc r8, r8, #0\n\t"
  67070. /* A[5] * B[5] */
  67071. "ldr r6, [%[a], #20]\n\t"
  67072. "ldr r7, [%[b], #20]\n\t"
  67073. "lsl r3, r6, #16\n\t"
  67074. "lsl r4, r7, #16\n\t"
  67075. "lsr r3, r3, #16\n\t"
  67076. "lsr r4, r4, #16\n\t"
  67077. "mul r4, r3, r4\n\t"
  67078. "adds r10, r10, r4\n\t"
  67079. "adcs lr, lr, #0\n\t"
  67080. "adc r8, r5, r8\n\t"
  67081. "lsr r4, r7, #16\n\t"
  67082. "mul r3, r4, r3\n\t"
  67083. "lsr r4, r3, #16\n\t"
  67084. "lsl r3, r3, #16\n\t"
  67085. "adds r10, r10, r3\n\t"
  67086. "adcs lr, lr, r4\n\t"
  67087. "adc r8, r8, #0\n\t"
  67088. "lsr r3, r6, #16\n\t"
  67089. "lsr r4, r7, #16\n\t"
  67090. "mul r4, r3, r4\n\t"
  67091. "adds lr, lr, r4\n\t"
  67092. "adc r8, r8, #0\n\t"
  67093. "lsl r4, r7, #16\n\t"
  67094. "lsr r4, r4, #16\n\t"
  67095. "mul r3, r4, r3\n\t"
  67096. "lsr r4, r3, #16\n\t"
  67097. "lsl r3, r3, #16\n\t"
  67098. "adds r10, r10, r3\n\t"
  67099. "adcs lr, lr, r4\n\t"
  67100. "adc r8, r8, #0\n\t"
  67101. /* A[4] * B[6] */
  67102. "ldr r6, [%[a], #16]\n\t"
  67103. "ldr r7, [%[b], #24]\n\t"
  67104. "lsl r3, r6, #16\n\t"
  67105. "lsl r4, r7, #16\n\t"
  67106. "lsr r3, r3, #16\n\t"
  67107. "lsr r4, r4, #16\n\t"
  67108. "mul r4, r3, r4\n\t"
  67109. "adds r10, r10, r4\n\t"
  67110. "adcs lr, lr, #0\n\t"
  67111. "adc r8, r5, r8\n\t"
  67112. "lsr r4, r7, #16\n\t"
  67113. "mul r3, r4, r3\n\t"
  67114. "lsr r4, r3, #16\n\t"
  67115. "lsl r3, r3, #16\n\t"
  67116. "adds r10, r10, r3\n\t"
  67117. "adcs lr, lr, r4\n\t"
  67118. "adc r8, r8, #0\n\t"
  67119. "lsr r3, r6, #16\n\t"
  67120. "lsr r4, r7, #16\n\t"
  67121. "mul r4, r3, r4\n\t"
  67122. "adds lr, lr, r4\n\t"
  67123. "adc r8, r8, #0\n\t"
  67124. "lsl r4, r7, #16\n\t"
  67125. "lsr r4, r4, #16\n\t"
  67126. "mul r3, r4, r3\n\t"
  67127. "lsr r4, r3, #16\n\t"
  67128. "lsl r3, r3, #16\n\t"
  67129. "adds r10, r10, r3\n\t"
  67130. "adcs lr, lr, r4\n\t"
  67131. "adc r8, r8, #0\n\t"
  67132. /* A[3] * B[7] */
  67133. "ldr r6, [%[a], #12]\n\t"
  67134. "ldr r7, [%[b], #28]\n\t"
  67135. "lsl r3, r6, #16\n\t"
  67136. "lsl r4, r7, #16\n\t"
  67137. "lsr r3, r3, #16\n\t"
  67138. "lsr r4, r4, #16\n\t"
  67139. "mul r4, r3, r4\n\t"
  67140. "adds r10, r10, r4\n\t"
  67141. "adcs lr, lr, #0\n\t"
  67142. "adc r8, r5, r8\n\t"
  67143. "lsr r4, r7, #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. "adcs lr, lr, r4\n\t"
  67149. "adc r8, r8, #0\n\t"
  67150. "lsr r3, r6, #16\n\t"
  67151. "lsr r4, r7, #16\n\t"
  67152. "mul r4, r3, r4\n\t"
  67153. "adds lr, lr, r4\n\t"
  67154. "adc r8, r8, #0\n\t"
  67155. "lsl r4, r7, #16\n\t"
  67156. "lsr r4, r4, #16\n\t"
  67157. "mul r3, r4, r3\n\t"
  67158. "lsr r4, r3, #16\n\t"
  67159. "lsl r3, r3, #16\n\t"
  67160. "adds r10, r10, r3\n\t"
  67161. "adcs lr, lr, r4\n\t"
  67162. "adc r8, r8, #0\n\t"
  67163. "str r10, [sp, #40]\n\t"
  67164. /* A[4] * B[7] */
  67165. "ldr r6, [%[a], #16]\n\t"
  67166. "lsl r3, r6, #16\n\t"
  67167. "lsl r4, r7, #16\n\t"
  67168. "lsr r3, r3, #16\n\t"
  67169. "lsr r4, r4, #16\n\t"
  67170. "mul r4, r3, r4\n\t"
  67171. "adds lr, lr, r4\n\t"
  67172. "adcs r8, r8, #0\n\t"
  67173. "adc r9, r5, #0\n\t"
  67174. "lsr r4, r7, #16\n\t"
  67175. "mul r3, r4, r3\n\t"
  67176. "lsr r4, r3, #16\n\t"
  67177. "lsl r3, r3, #16\n\t"
  67178. "adds lr, lr, r3\n\t"
  67179. "adcs r8, r8, r4\n\t"
  67180. "adc r9, r9, #0\n\t"
  67181. "lsr r3, r6, #16\n\t"
  67182. "lsr r4, r7, #16\n\t"
  67183. "mul r4, r3, r4\n\t"
  67184. "adds r8, r8, r4\n\t"
  67185. "adc r9, r9, #0\n\t"
  67186. "lsl r4, r7, #16\n\t"
  67187. "lsr r4, r4, #16\n\t"
  67188. "mul r3, r4, r3\n\t"
  67189. "lsr r4, r3, #16\n\t"
  67190. "lsl r3, r3, #16\n\t"
  67191. "adds lr, lr, r3\n\t"
  67192. "adcs r8, r8, r4\n\t"
  67193. "adc r9, r9, #0\n\t"
  67194. /* A[5] * B[6] */
  67195. "ldr r6, [%[a], #20]\n\t"
  67196. "ldr r7, [%[b], #24]\n\t"
  67197. "lsl r3, r6, #16\n\t"
  67198. "lsl r4, r7, #16\n\t"
  67199. "lsr r3, r3, #16\n\t"
  67200. "lsr r4, r4, #16\n\t"
  67201. "mul r4, r3, r4\n\t"
  67202. "adds lr, lr, r4\n\t"
  67203. "adcs r8, r8, #0\n\t"
  67204. "adc r9, r5, r9\n\t"
  67205. "lsr r4, r7, #16\n\t"
  67206. "mul r3, r4, r3\n\t"
  67207. "lsr r4, r3, #16\n\t"
  67208. "lsl r3, r3, #16\n\t"
  67209. "adds lr, lr, r3\n\t"
  67210. "adcs r8, r8, r4\n\t"
  67211. "adc r9, r9, #0\n\t"
  67212. "lsr r3, r6, #16\n\t"
  67213. "lsr r4, r7, #16\n\t"
  67214. "mul r4, r3, r4\n\t"
  67215. "adds r8, r8, r4\n\t"
  67216. "adc r9, r9, #0\n\t"
  67217. "lsl r4, r7, #16\n\t"
  67218. "lsr r4, r4, #16\n\t"
  67219. "mul r3, r4, r3\n\t"
  67220. "lsr r4, r3, #16\n\t"
  67221. "lsl r3, r3, #16\n\t"
  67222. "adds lr, lr, r3\n\t"
  67223. "adcs r8, r8, r4\n\t"
  67224. "adc r9, r9, #0\n\t"
  67225. /* A[6] * B[5] */
  67226. "ldr r6, [%[a], #24]\n\t"
  67227. "ldr r7, [%[b], #20]\n\t"
  67228. "lsl r3, r6, #16\n\t"
  67229. "lsl r4, r7, #16\n\t"
  67230. "lsr r3, r3, #16\n\t"
  67231. "lsr r4, r4, #16\n\t"
  67232. "mul r4, r3, r4\n\t"
  67233. "adds lr, lr, r4\n\t"
  67234. "adcs r8, r8, #0\n\t"
  67235. "adc r9, r5, r9\n\t"
  67236. "lsr r4, r7, #16\n\t"
  67237. "mul r3, r4, r3\n\t"
  67238. "lsr r4, r3, #16\n\t"
  67239. "lsl r3, r3, #16\n\t"
  67240. "adds lr, lr, r3\n\t"
  67241. "adcs r8, r8, r4\n\t"
  67242. "adc r9, r9, #0\n\t"
  67243. "lsr r3, r6, #16\n\t"
  67244. "lsr r4, r7, #16\n\t"
  67245. "mul r4, r3, r4\n\t"
  67246. "adds r8, r8, r4\n\t"
  67247. "adc r9, r9, #0\n\t"
  67248. "lsl r4, r7, #16\n\t"
  67249. "lsr r4, r4, #16\n\t"
  67250. "mul r3, r4, r3\n\t"
  67251. "lsr r4, r3, #16\n\t"
  67252. "lsl r3, r3, #16\n\t"
  67253. "adds lr, lr, r3\n\t"
  67254. "adcs r8, r8, r4\n\t"
  67255. "adc r9, r9, #0\n\t"
  67256. /* A[7] * B[4] */
  67257. "ldr r6, [%[a], #28]\n\t"
  67258. "ldr r7, [%[b], #16]\n\t"
  67259. "lsl r3, r6, #16\n\t"
  67260. "lsl r4, r7, #16\n\t"
  67261. "lsr r3, r3, #16\n\t"
  67262. "lsr r4, r4, #16\n\t"
  67263. "mul r4, r3, r4\n\t"
  67264. "adds lr, lr, r4\n\t"
  67265. "adcs r8, r8, #0\n\t"
  67266. "adc r9, r5, r9\n\t"
  67267. "lsr r4, r7, #16\n\t"
  67268. "mul r3, r4, r3\n\t"
  67269. "lsr r4, r3, #16\n\t"
  67270. "lsl r3, r3, #16\n\t"
  67271. "adds lr, lr, r3\n\t"
  67272. "adcs r8, r8, r4\n\t"
  67273. "adc r9, r9, #0\n\t"
  67274. "lsr r3, r6, #16\n\t"
  67275. "lsr r4, r7, #16\n\t"
  67276. "mul r4, r3, r4\n\t"
  67277. "adds r8, r8, r4\n\t"
  67278. "adc r9, r9, #0\n\t"
  67279. "lsl r4, r7, #16\n\t"
  67280. "lsr r4, r4, #16\n\t"
  67281. "mul r3, r4, r3\n\t"
  67282. "lsr r4, r3, #16\n\t"
  67283. "lsl r3, r3, #16\n\t"
  67284. "adds lr, lr, r3\n\t"
  67285. "adcs r8, r8, r4\n\t"
  67286. "adc r9, r9, #0\n\t"
  67287. "str lr, [sp, #44]\n\t"
  67288. /* A[7] * B[5] */
  67289. "ldr r7, [%[b], #20]\n\t"
  67290. "lsl r3, r6, #16\n\t"
  67291. "lsl r4, r7, #16\n\t"
  67292. "lsr r3, r3, #16\n\t"
  67293. "lsr r4, r4, #16\n\t"
  67294. "mul r4, r3, r4\n\t"
  67295. "adds r8, r8, r4\n\t"
  67296. "adcs r9, r9, #0\n\t"
  67297. "adc r10, r5, #0\n\t"
  67298. "lsr r4, r7, #16\n\t"
  67299. "mul r3, r4, r3\n\t"
  67300. "lsr r4, r3, #16\n\t"
  67301. "lsl r3, r3, #16\n\t"
  67302. "adds r8, r8, r3\n\t"
  67303. "adcs r9, r9, r4\n\t"
  67304. "adc r10, r10, #0\n\t"
  67305. "lsr r3, r6, #16\n\t"
  67306. "lsr r4, r7, #16\n\t"
  67307. "mul r4, r3, r4\n\t"
  67308. "adds r9, r9, r4\n\t"
  67309. "adc r10, r10, #0\n\t"
  67310. "lsl r4, r7, #16\n\t"
  67311. "lsr r4, r4, #16\n\t"
  67312. "mul r3, r4, r3\n\t"
  67313. "lsr r4, r3, #16\n\t"
  67314. "lsl r3, r3, #16\n\t"
  67315. "adds r8, r8, r3\n\t"
  67316. "adcs r9, r9, r4\n\t"
  67317. "adc r10, r10, #0\n\t"
  67318. /* A[6] * B[6] */
  67319. "ldr r6, [%[a], #24]\n\t"
  67320. "ldr r7, [%[b], #24]\n\t"
  67321. "lsl r3, r6, #16\n\t"
  67322. "lsl r4, r7, #16\n\t"
  67323. "lsr r3, r3, #16\n\t"
  67324. "lsr r4, r4, #16\n\t"
  67325. "mul r4, r3, r4\n\t"
  67326. "adds r8, r8, r4\n\t"
  67327. "adcs r9, r9, #0\n\t"
  67328. "adc r10, r5, r10\n\t"
  67329. "lsr r4, r7, #16\n\t"
  67330. "mul r3, r4, r3\n\t"
  67331. "lsr r4, r3, #16\n\t"
  67332. "lsl r3, r3, #16\n\t"
  67333. "adds r8, r8, r3\n\t"
  67334. "adcs r9, r9, r4\n\t"
  67335. "adc r10, r10, #0\n\t"
  67336. "lsr r3, r6, #16\n\t"
  67337. "lsr r4, r7, #16\n\t"
  67338. "mul r4, r3, r4\n\t"
  67339. "adds r9, r9, r4\n\t"
  67340. "adc r10, r10, #0\n\t"
  67341. "lsl r4, r7, #16\n\t"
  67342. "lsr r4, r4, #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 r8, r8, r3\n\t"
  67347. "adcs r9, r9, r4\n\t"
  67348. "adc r10, r10, #0\n\t"
  67349. /* A[5] * B[7] */
  67350. "ldr r6, [%[a], #20]\n\t"
  67351. "ldr r7, [%[b], #28]\n\t"
  67352. "lsl r3, r6, #16\n\t"
  67353. "lsl r4, r7, #16\n\t"
  67354. "lsr r3, r3, #16\n\t"
  67355. "lsr r4, r4, #16\n\t"
  67356. "mul r4, r3, r4\n\t"
  67357. "adds r8, r8, r4\n\t"
  67358. "adcs r9, r9, #0\n\t"
  67359. "adc r10, r5, r10\n\t"
  67360. "lsr r4, r7, #16\n\t"
  67361. "mul r3, r4, r3\n\t"
  67362. "lsr r4, r3, #16\n\t"
  67363. "lsl r3, r3, #16\n\t"
  67364. "adds r8, r8, r3\n\t"
  67365. "adcs r9, r9, r4\n\t"
  67366. "adc r10, r10, #0\n\t"
  67367. "lsr r3, r6, #16\n\t"
  67368. "lsr r4, r7, #16\n\t"
  67369. "mul r4, r3, r4\n\t"
  67370. "adds r9, r9, r4\n\t"
  67371. "adc r10, r10, #0\n\t"
  67372. "lsl r4, r7, #16\n\t"
  67373. "lsr r4, r4, #16\n\t"
  67374. "mul r3, r4, r3\n\t"
  67375. "lsr r4, r3, #16\n\t"
  67376. "lsl r3, r3, #16\n\t"
  67377. "adds r8, r8, r3\n\t"
  67378. "adcs r9, r9, r4\n\t"
  67379. "adc r10, r10, #0\n\t"
  67380. /* A[6] * B[7] */
  67381. "ldr r6, [%[a], #24]\n\t"
  67382. "lsl r3, r6, #16\n\t"
  67383. "lsl r4, r7, #16\n\t"
  67384. "lsr r3, r3, #16\n\t"
  67385. "lsr r4, r4, #16\n\t"
  67386. "mul r4, r3, r4\n\t"
  67387. "adds r9, r9, r4\n\t"
  67388. "adcs r10, r10, #0\n\t"
  67389. "adc lr, r5, #0\n\t"
  67390. "lsr r4, r7, #16\n\t"
  67391. "mul r3, r4, r3\n\t"
  67392. "lsr r4, r3, #16\n\t"
  67393. "lsl r3, r3, #16\n\t"
  67394. "adds r9, r9, r3\n\t"
  67395. "adcs r10, r10, r4\n\t"
  67396. "adc lr, lr, #0\n\t"
  67397. "lsr r3, r6, #16\n\t"
  67398. "lsr r4, r7, #16\n\t"
  67399. "mul r4, r3, r4\n\t"
  67400. "adds r10, r10, r4\n\t"
  67401. "adc lr, lr, #0\n\t"
  67402. "lsl r4, r7, #16\n\t"
  67403. "lsr r4, r4, #16\n\t"
  67404. "mul r3, r4, r3\n\t"
  67405. "lsr r4, r3, #16\n\t"
  67406. "lsl r3, r3, #16\n\t"
  67407. "adds r9, r9, r3\n\t"
  67408. "adcs r10, r10, r4\n\t"
  67409. "adc lr, lr, #0\n\t"
  67410. /* A[7] * B[6] */
  67411. "ldr r6, [%[a], #28]\n\t"
  67412. "ldr r7, [%[b], #24]\n\t"
  67413. "lsl r3, r6, #16\n\t"
  67414. "lsl r4, r7, #16\n\t"
  67415. "lsr r3, r3, #16\n\t"
  67416. "lsr r4, r4, #16\n\t"
  67417. "mul r4, r3, r4\n\t"
  67418. "adds r9, r9, r4\n\t"
  67419. "adcs r10, r10, #0\n\t"
  67420. "adc lr, r5, lr\n\t"
  67421. "lsr r4, r7, #16\n\t"
  67422. "mul r3, r4, r3\n\t"
  67423. "lsr r4, r3, #16\n\t"
  67424. "lsl r3, r3, #16\n\t"
  67425. "adds r9, r9, r3\n\t"
  67426. "adcs r10, r10, r4\n\t"
  67427. "adc lr, lr, #0\n\t"
  67428. "lsr r3, r6, #16\n\t"
  67429. "lsr r4, r7, #16\n\t"
  67430. "mul r4, r3, r4\n\t"
  67431. "adds r10, r10, r4\n\t"
  67432. "adc lr, lr, #0\n\t"
  67433. "lsl r4, r7, #16\n\t"
  67434. "lsr r4, r4, #16\n\t"
  67435. "mul r3, r4, r3\n\t"
  67436. "lsr r4, r3, #16\n\t"
  67437. "lsl r3, r3, #16\n\t"
  67438. "adds r9, r9, r3\n\t"
  67439. "adcs r10, r10, r4\n\t"
  67440. "adc lr, lr, #0\n\t"
  67441. /* A[7] * B[7] */
  67442. "ldr r7, [%[b], #28]\n\t"
  67443. "lsl r3, r6, #16\n\t"
  67444. "lsl r4, r7, #16\n\t"
  67445. "lsr r3, r3, #16\n\t"
  67446. "lsr r4, r4, #16\n\t"
  67447. "mul r4, r3, r4\n\t"
  67448. "adds r10, r10, r4\n\t"
  67449. "adc lr, lr, #0\n\t"
  67450. "lsr r4, r7, #16\n\t"
  67451. "mul r3, r4, r3\n\t"
  67452. "lsr r4, r3, #16\n\t"
  67453. "lsl r3, r3, #16\n\t"
  67454. "adds r10, r10, r3\n\t"
  67455. "adc lr, lr, r4\n\t"
  67456. "lsr r3, r6, #16\n\t"
  67457. "lsr r4, r7, #16\n\t"
  67458. "mul r4, r3, r4\n\t"
  67459. "add lr, lr, r4\n\t"
  67460. "lsl r4, r7, #16\n\t"
  67461. "lsr r4, r4, #16\n\t"
  67462. "mul r3, r4, r3\n\t"
  67463. "lsr r4, r3, #16\n\t"
  67464. "lsl r3, r3, #16\n\t"
  67465. "adds r10, r10, r3\n\t"
  67466. "adc lr, lr, r4\n\t"
  67467. "str r8, [sp, #48]\n\t"
  67468. "str r9, [sp, #52]\n\t"
  67469. "str r10, [sp, #56]\n\t"
  67470. "str lr, [sp, #60]\n\t"
  67471. "str %[r], [sp, #64]\n\t"
  67472. /* Start Reduction */
  67473. "ldm sp, {r5, r6, r7, r8, r9, r10, r11, r12}\n\t"
  67474. "mov r3, r11\n\t"
  67475. "mov r4, r12\n\t"
  67476. /* mu = a[0]-a[7] + a[0]-a[4] << 96 + (a[0]-a[1] * 2) << 192 */
  67477. /* - a[0] << 224 */
  67478. /* + (a[0]-a[1] * 2) << (6 * 32) */
  67479. "adds r11, r11, r5\n\t"
  67480. "adc r12, r12, r6\n\t"
  67481. "adds r11, r11, r5\n\t"
  67482. "adc r12, r12, r6\n\t"
  67483. /* - a[0] << (7 * 32) */
  67484. "sub r12, r12, r5\n\t"
  67485. /* + a[0]-a[4] << (3 * 32) */
  67486. "mov r0, r8\n\t"
  67487. "mov r1, r9\n\t"
  67488. "mov r2, r10\n\t"
  67489. "adds r8, r8, r5\n\t"
  67490. "adcs r9, r9, r6\n\t"
  67491. "adcs r10, r10, r7\n\t"
  67492. "adcs r11, r11, r0\n\t"
  67493. "adc r12, r12, r1\n\t"
  67494. /* a += mu * m */
  67495. /* += mu * ((1 << 256) - (1 << 224) + (1 << 192) + (1 << 96) - 1) */
  67496. /* a[0] = = t[0] */
  67497. /* a[1] = = t[1] */
  67498. /* a[2] = = t[2] */
  67499. /* a[3] += t[0] = t[3] */
  67500. /* a[4] += t[1] = t[4] */
  67501. /* a[5] += t[2] = t[5] */
  67502. /* a[6] += t[0] + t[3] = t[6] */
  67503. /* a[7] += t[1] + t[4] = t[7] + t[0] */
  67504. "adds r0, r0, r5\n\t"
  67505. "adcs r1, r1, r6\n\t"
  67506. "adcs r2, r2, r7\n\t"
  67507. "adcs r3, r3, r8\n\t"
  67508. "adcs r4, r4, r9\n\t"
  67509. "mov lr, #0\n\t"
  67510. "adc lr, lr, #0\n\t"
  67511. "adds r3, r3, r5\n\t"
  67512. "adcs r4, r4, r6\n\t"
  67513. "adc lr, lr, #0\n\t"
  67514. "str r4, [sp, #28]\n\t"
  67515. /* a[8] += t[0] + t[2] + t[5] + carry */
  67516. /* a[9] += t[1] + t[3] + t[6] */
  67517. /* a[10] += t[2] + t[4] + t[7] */
  67518. "add r0, sp, #32\n\t"
  67519. "ldm r0, {r2, r3, r4}\n\t"
  67520. "adds r2, r2, lr\n\t"
  67521. "adcs r3, r3, #0\n\t"
  67522. "adcs r4, r4, #0\n\t"
  67523. "mov lr, #0\n\t"
  67524. "adc lr, lr, #0\n\t"
  67525. "adds r2, r2, r5\n\t"
  67526. "adcs r3, r3, r6\n\t"
  67527. "adcs r4, r4, r7\n\t"
  67528. "adc lr, lr, #0\n\t"
  67529. "adds r2, r2, r7\n\t"
  67530. "adcs r3, r3, r8\n\t"
  67531. "adcs r4, r4, r9\n\t"
  67532. "adc lr, lr, #0\n\t"
  67533. "adds r2, r2, r10\n\t"
  67534. "adcs r3, r3, r11\n\t"
  67535. "adcs r4, r4, r12\n\t"
  67536. "adc lr, lr, #0\n\t"
  67537. "stm r0!, {r2, r3, r4}\n\t"
  67538. /* a[11] += t[3] + t[5] + carry */
  67539. /* a[12] += t[4] + t[6] */
  67540. /* a[13] += t[5] + t[7] */
  67541. /* a[14] += t[6] */
  67542. /* a[15] += t[7] */
  67543. "ldm r0, {r0, r1, r2, r3, r4}\n\t"
  67544. "adds r0, r0, lr\n\t"
  67545. "adcs r1, r1, #0\n\t"
  67546. "adcs r2, r2, #0\n\t"
  67547. "adcs r3, r3, #0\n\t"
  67548. "adcs r4, r4, #0\n\t"
  67549. "mov lr, #0\n\t"
  67550. "adc lr, lr, #0\n\t"
  67551. "adds r0, r0, r8\n\t"
  67552. "adcs r1, r1, r9\n\t"
  67553. "adcs r2, r2, r10\n\t"
  67554. "adcs r3, r3, r11\n\t"
  67555. "adcs r4, r4, r12\n\t"
  67556. "adc lr, lr, #0\n\t"
  67557. "adds r0, r0, r10\n\t"
  67558. "adcs r1, r1, r11\n\t"
  67559. "adcs r2, r2, r12\n\t"
  67560. "adcs r3, r3, #0\n\t"
  67561. "adcs r4, r4, #0\n\t"
  67562. "adc lr, lr, #0\n\t"
  67563. "str r0, [sp, #44]\n\t"
  67564. "str r1, [sp, #48]\n\t"
  67565. "str r2, [sp, #52]\n\t"
  67566. "str r3, [sp, #56]\n\t"
  67567. /* a[7..15] - t[0..7] */
  67568. "add r0, sp, #28\n\t"
  67569. "ldm r0, {r0, r1, r2, r3}\n\t"
  67570. "subs r0, r0, r5\n\t"
  67571. "sbcs r1, r1, r6\n\t"
  67572. "sbcs r2, r2, r7\n\t"
  67573. "sbcs r3, r3, r8\n\t"
  67574. "add r0, sp, #44\n\t"
  67575. "mov r8, r4\n\t"
  67576. "ldm r0, {r4, r5, r6, r7}\n\t"
  67577. "sbcs r4, r4, r9\n\t"
  67578. "sbcs r5, r5, r10\n\t"
  67579. "sbcs r6, r6, r11\n\t"
  67580. "sbcs r7, r7, r12\n\t"
  67581. "sbcs r8, r8, #0\n\t"
  67582. "sbc lr, lr, #0\n\t"
  67583. /* mask m and sub from result if overflow */
  67584. "rsb lr, lr, #0\n\t"
  67585. "subs r1, r1, lr\n\t"
  67586. "sbcs r2, r2, lr\n\t"
  67587. "sbcs r3, r3, lr\n\t"
  67588. "sbcs r4, r4, #0\n\t"
  67589. "sbcs r5, r5, #0\n\t"
  67590. "sbcs r6, r6, #0\n\t"
  67591. "sbcs r7, r7, lr, lsr #31\n\t"
  67592. "sbc r8, r8, lr\n\t"
  67593. "ldr %[r], [sp, #64]\n\t"
  67594. "stm %[r], {r1, r2, r3, r4, r5, r6, r7, r8}\n\t"
  67595. "add sp, sp, #0x44\n\t"
  67596. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  67597. :
  67598. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "lr", "r12", "cc"
  67599. );
  67600. (void)m_p;
  67601. (void)mp_p;
  67602. }
  67603. #elif defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  67604. /* Multiply two Montgomery form numbers mod the modulus (prime).
  67605. * (r = a * b mod m)
  67606. *
  67607. * r Result of multiplication.
  67608. * a First number to multiply in Montgomery form.
  67609. * b Second number to multiply in Montgomery form.
  67610. * m Modulus (prime).
  67611. * mp Montgomery multiplier.
  67612. */
  67613. 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)
  67614. {
  67615. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  67616. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  67617. register const sp_digit* b asm ("r2") = (const sp_digit*)b_p;
  67618. __asm__ __volatile__ (
  67619. "sub sp, sp, #0x44\n\t"
  67620. "str %[r], [sp, #64]\n\t"
  67621. "mov %[r], #0\n\t"
  67622. "ldr r12, [%[a]]\n\t"
  67623. /* A[0] * B[0] */
  67624. "ldr lr, [%[b]]\n\t"
  67625. "umull r3, r4, r12, lr\n\t"
  67626. /* A[0] * B[2] */
  67627. "ldr lr, [%[b], #8]\n\t"
  67628. "umull r5, r6, r12, lr\n\t"
  67629. /* A[0] * B[4] */
  67630. "ldr lr, [%[b], #16]\n\t"
  67631. "umull r7, r8, r12, lr\n\t"
  67632. /* A[0] * B[6] */
  67633. "ldr lr, [%[b], #24]\n\t"
  67634. "umull r9, r10, r12, lr\n\t"
  67635. "str r3, [sp]\n\t"
  67636. /* A[0] * B[1] */
  67637. "ldr lr, [%[b], #4]\n\t"
  67638. "mov r11, %[r]\n\t"
  67639. "umlal r4, r11, r12, lr\n\t"
  67640. "adds r5, r5, r11\n\t"
  67641. /* A[0] * B[3] */
  67642. "ldr lr, [%[b], #12]\n\t"
  67643. "adcs r6, r6, #0\n\t"
  67644. "adc r11, %[r], #0\n\t"
  67645. "umlal r6, r11, r12, lr\n\t"
  67646. "adds r7, r7, r11\n\t"
  67647. /* A[0] * B[5] */
  67648. "ldr lr, [%[b], #20]\n\t"
  67649. "adcs r8, r8, #0\n\t"
  67650. "adc r11, %[r], #0\n\t"
  67651. "umlal r8, r11, r12, lr\n\t"
  67652. "adds r9, r9, r11\n\t"
  67653. /* A[0] * B[7] */
  67654. "ldr lr, [%[b], #28]\n\t"
  67655. "adcs r10, r10, #0\n\t"
  67656. "adc r3, %[r], #0\n\t"
  67657. "umlal r10, r3, r12, lr\n\t"
  67658. /* A[1] * B[0] */
  67659. "ldr r12, [%[a], #4]\n\t"
  67660. "ldr lr, [%[b]]\n\t"
  67661. "mov r11, #0\n\t"
  67662. "umlal r4, r11, r12, lr\n\t"
  67663. "str r4, [sp, #4]\n\t"
  67664. "adds r5, r5, r11\n\t"
  67665. /* A[1] * B[1] */
  67666. "ldr lr, [%[b], #4]\n\t"
  67667. "adc r11, %[r], #0\n\t"
  67668. "umlal r5, r11, r12, lr\n\t"
  67669. "adds r6, r6, r11\n\t"
  67670. /* A[1] * B[2] */
  67671. "ldr lr, [%[b], #8]\n\t"
  67672. "adc r11, %[r], #0\n\t"
  67673. "umlal r6, r11, r12, lr\n\t"
  67674. "adds r7, r7, r11\n\t"
  67675. /* A[1] * B[3] */
  67676. "ldr lr, [%[b], #12]\n\t"
  67677. "adc r11, %[r], #0\n\t"
  67678. "umlal r7, r11, r12, lr\n\t"
  67679. "adds r8, r8, r11\n\t"
  67680. /* A[1] * B[4] */
  67681. "ldr lr, [%[b], #16]\n\t"
  67682. "adc r11, %[r], #0\n\t"
  67683. "umlal r8, r11, r12, lr\n\t"
  67684. "adds r9, r9, r11\n\t"
  67685. /* A[1] * B[5] */
  67686. "ldr lr, [%[b], #20]\n\t"
  67687. "adc r11, %[r], #0\n\t"
  67688. "umlal r9, r11, r12, lr\n\t"
  67689. "adds r10, r10, r11\n\t"
  67690. /* A[1] * B[6] */
  67691. "ldr lr, [%[b], #24]\n\t"
  67692. "adc r11, %[r], #0\n\t"
  67693. "umlal r10, r11, r12, lr\n\t"
  67694. "adds r3, r3, r11\n\t"
  67695. /* A[1] * B[7] */
  67696. "ldr lr, [%[b], #28]\n\t"
  67697. "adc r4, %[r], #0\n\t"
  67698. "umlal r3, r4, r12, lr\n\t"
  67699. /* A[2] * B[0] */
  67700. "ldr r12, [%[a], #8]\n\t"
  67701. "ldr lr, [%[b]]\n\t"
  67702. "mov r11, #0\n\t"
  67703. "umlal r5, r11, r12, lr\n\t"
  67704. "str r5, [sp, #8]\n\t"
  67705. "adds r6, r6, r11\n\t"
  67706. /* A[2] * B[1] */
  67707. "ldr lr, [%[b], #4]\n\t"
  67708. "adc r11, %[r], #0\n\t"
  67709. "umlal r6, r11, r12, lr\n\t"
  67710. "adds r7, r7, r11\n\t"
  67711. /* A[2] * B[2] */
  67712. "ldr lr, [%[b], #8]\n\t"
  67713. "adc r11, %[r], #0\n\t"
  67714. "umlal r7, r11, r12, lr\n\t"
  67715. "adds r8, r8, r11\n\t"
  67716. /* A[2] * B[3] */
  67717. "ldr lr, [%[b], #12]\n\t"
  67718. "adc r11, %[r], #0\n\t"
  67719. "umlal r8, r11, r12, lr\n\t"
  67720. "adds r9, r9, r11\n\t"
  67721. /* A[2] * B[4] */
  67722. "ldr lr, [%[b], #16]\n\t"
  67723. "adc r11, %[r], #0\n\t"
  67724. "umlal r9, r11, r12, lr\n\t"
  67725. "adds r10, r10, r11\n\t"
  67726. /* A[2] * B[5] */
  67727. "ldr lr, [%[b], #20]\n\t"
  67728. "adc r11, %[r], #0\n\t"
  67729. "umlal r10, r11, r12, lr\n\t"
  67730. "adds r3, r3, r11\n\t"
  67731. /* A[2] * B[6] */
  67732. "ldr lr, [%[b], #24]\n\t"
  67733. "adc r11, %[r], #0\n\t"
  67734. "umlal r3, r11, r12, lr\n\t"
  67735. "adds r4, r4, r11\n\t"
  67736. /* A[2] * B[7] */
  67737. "ldr lr, [%[b], #28]\n\t"
  67738. "adc r5, %[r], #0\n\t"
  67739. "umlal r4, r5, r12, lr\n\t"
  67740. /* A[3] * B[0] */
  67741. "ldr r12, [%[a], #12]\n\t"
  67742. "ldr lr, [%[b]]\n\t"
  67743. "mov r11, #0\n\t"
  67744. "umlal r6, r11, r12, lr\n\t"
  67745. "str r6, [sp, #12]\n\t"
  67746. "adds r7, r7, r11\n\t"
  67747. /* A[3] * B[1] */
  67748. "ldr lr, [%[b], #4]\n\t"
  67749. "adc r11, %[r], #0\n\t"
  67750. "umlal r7, r11, r12, lr\n\t"
  67751. "adds r8, r8, r11\n\t"
  67752. /* A[3] * B[2] */
  67753. "ldr lr, [%[b], #8]\n\t"
  67754. "adc r11, %[r], #0\n\t"
  67755. "umlal r8, r11, r12, lr\n\t"
  67756. "adds r9, r9, r11\n\t"
  67757. /* A[3] * B[3] */
  67758. "ldr lr, [%[b], #12]\n\t"
  67759. "adc r11, %[r], #0\n\t"
  67760. "umlal r9, r11, r12, lr\n\t"
  67761. "adds r10, r10, r11\n\t"
  67762. /* A[3] * B[4] */
  67763. "ldr lr, [%[b], #16]\n\t"
  67764. "adc r11, %[r], #0\n\t"
  67765. "umlal r10, r11, r12, lr\n\t"
  67766. "adds r3, r3, r11\n\t"
  67767. /* A[3] * B[5] */
  67768. "ldr lr, [%[b], #20]\n\t"
  67769. "adc r11, %[r], #0\n\t"
  67770. "umlal r3, r11, r12, lr\n\t"
  67771. "adds r4, r4, r11\n\t"
  67772. /* A[3] * B[6] */
  67773. "ldr lr, [%[b], #24]\n\t"
  67774. "adc r11, %[r], #0\n\t"
  67775. "umlal r4, r11, r12, lr\n\t"
  67776. "adds r5, r5, r11\n\t"
  67777. /* A[3] * B[7] */
  67778. "ldr lr, [%[b], #28]\n\t"
  67779. "adc r6, %[r], #0\n\t"
  67780. "umlal r5, r6, r12, lr\n\t"
  67781. /* A[4] * B[0] */
  67782. "ldr r12, [%[a], #16]\n\t"
  67783. "ldr lr, [%[b]]\n\t"
  67784. "mov r11, #0\n\t"
  67785. "umlal r7, r11, r12, lr\n\t"
  67786. "str r7, [sp, #16]\n\t"
  67787. "adds r8, r8, r11\n\t"
  67788. /* A[4] * B[1] */
  67789. "ldr lr, [%[b], #4]\n\t"
  67790. "adc r11, %[r], #0\n\t"
  67791. "umlal r8, r11, r12, lr\n\t"
  67792. "adds r9, r9, r11\n\t"
  67793. /* A[4] * B[2] */
  67794. "ldr lr, [%[b], #8]\n\t"
  67795. "adc r11, %[r], #0\n\t"
  67796. "umlal r9, r11, r12, lr\n\t"
  67797. "adds r10, r10, r11\n\t"
  67798. /* A[4] * B[3] */
  67799. "ldr lr, [%[b], #12]\n\t"
  67800. "adc r11, %[r], #0\n\t"
  67801. "umlal r10, r11, r12, lr\n\t"
  67802. "adds r3, r3, r11\n\t"
  67803. /* A[4] * B[4] */
  67804. "ldr lr, [%[b], #16]\n\t"
  67805. "adc r11, %[r], #0\n\t"
  67806. "umlal r3, r11, r12, lr\n\t"
  67807. "adds r4, r4, r11\n\t"
  67808. /* A[4] * B[5] */
  67809. "ldr lr, [%[b], #20]\n\t"
  67810. "adc r11, %[r], #0\n\t"
  67811. "umlal r4, r11, r12, lr\n\t"
  67812. "adds r5, r5, r11\n\t"
  67813. /* A[4] * B[6] */
  67814. "ldr lr, [%[b], #24]\n\t"
  67815. "adc r11, %[r], #0\n\t"
  67816. "umlal r5, r11, r12, lr\n\t"
  67817. "adds r6, r6, r11\n\t"
  67818. /* A[4] * B[7] */
  67819. "ldr lr, [%[b], #28]\n\t"
  67820. "adc r7, %[r], #0\n\t"
  67821. "umlal r6, r7, r12, lr\n\t"
  67822. /* A[5] * B[0] */
  67823. "ldr r12, [%[a], #20]\n\t"
  67824. "ldr lr, [%[b]]\n\t"
  67825. "mov r11, #0\n\t"
  67826. "umlal r8, r11, r12, lr\n\t"
  67827. "str r8, [sp, #20]\n\t"
  67828. "adds r9, r9, r11\n\t"
  67829. /* A[5] * B[1] */
  67830. "ldr lr, [%[b], #4]\n\t"
  67831. "adc r11, %[r], #0\n\t"
  67832. "umlal r9, r11, r12, lr\n\t"
  67833. "adds r10, r10, r11\n\t"
  67834. /* A[5] * B[2] */
  67835. "ldr lr, [%[b], #8]\n\t"
  67836. "adc r11, %[r], #0\n\t"
  67837. "umlal r10, r11, r12, lr\n\t"
  67838. "adds r3, r3, r11\n\t"
  67839. /* A[5] * B[3] */
  67840. "ldr lr, [%[b], #12]\n\t"
  67841. "adc r11, %[r], #0\n\t"
  67842. "umlal r3, r11, r12, lr\n\t"
  67843. "adds r4, r4, r11\n\t"
  67844. /* A[5] * B[4] */
  67845. "ldr lr, [%[b], #16]\n\t"
  67846. "adc r11, %[r], #0\n\t"
  67847. "umlal r4, r11, r12, lr\n\t"
  67848. "adds r5, r5, r11\n\t"
  67849. /* A[5] * B[5] */
  67850. "ldr lr, [%[b], #20]\n\t"
  67851. "adc r11, %[r], #0\n\t"
  67852. "umlal r5, r11, r12, lr\n\t"
  67853. "adds r6, r6, r11\n\t"
  67854. /* A[5] * B[6] */
  67855. "ldr lr, [%[b], #24]\n\t"
  67856. "adc r11, %[r], #0\n\t"
  67857. "umlal r6, r11, r12, lr\n\t"
  67858. "adds r7, r7, r11\n\t"
  67859. /* A[5] * B[7] */
  67860. "ldr lr, [%[b], #28]\n\t"
  67861. "adc r8, %[r], #0\n\t"
  67862. "umlal r7, r8, r12, lr\n\t"
  67863. /* A[6] * B[0] */
  67864. "ldr r12, [%[a], #24]\n\t"
  67865. "ldr lr, [%[b]]\n\t"
  67866. "mov r11, #0\n\t"
  67867. "umlal r9, r11, r12, lr\n\t"
  67868. "str r9, [sp, #24]\n\t"
  67869. "adds r10, r10, r11\n\t"
  67870. /* A[6] * B[1] */
  67871. "ldr lr, [%[b], #4]\n\t"
  67872. "adc r11, %[r], #0\n\t"
  67873. "umlal r10, r11, r12, lr\n\t"
  67874. "adds r3, r3, r11\n\t"
  67875. /* A[6] * B[2] */
  67876. "ldr lr, [%[b], #8]\n\t"
  67877. "adc r11, %[r], #0\n\t"
  67878. "umlal r3, r11, r12, lr\n\t"
  67879. "adds r4, r4, r11\n\t"
  67880. /* A[6] * B[3] */
  67881. "ldr lr, [%[b], #12]\n\t"
  67882. "adc r11, %[r], #0\n\t"
  67883. "umlal r4, r11, r12, lr\n\t"
  67884. "adds r5, r5, r11\n\t"
  67885. /* A[6] * B[4] */
  67886. "ldr lr, [%[b], #16]\n\t"
  67887. "adc r11, %[r], #0\n\t"
  67888. "umlal r5, r11, r12, lr\n\t"
  67889. "adds r6, r6, r11\n\t"
  67890. /* A[6] * B[5] */
  67891. "ldr lr, [%[b], #20]\n\t"
  67892. "adc r11, %[r], #0\n\t"
  67893. "umlal r6, r11, r12, lr\n\t"
  67894. "adds r7, r7, r11\n\t"
  67895. /* A[6] * B[6] */
  67896. "ldr lr, [%[b], #24]\n\t"
  67897. "adc r11, %[r], #0\n\t"
  67898. "umlal r7, r11, r12, lr\n\t"
  67899. "adds r8, r8, r11\n\t"
  67900. /* A[6] * B[7] */
  67901. "ldr lr, [%[b], #28]\n\t"
  67902. "adc r9, %[r], #0\n\t"
  67903. "umlal r8, r9, r12, lr\n\t"
  67904. /* A[7] * B[0] */
  67905. "ldr r12, [%[a], #28]\n\t"
  67906. "ldr lr, [%[b]]\n\t"
  67907. "mov r11, #0\n\t"
  67908. "umlal r10, r11, r12, lr\n\t"
  67909. "str r10, [sp, #28]\n\t"
  67910. "adds r3, r3, r11\n\t"
  67911. /* A[7] * B[1] */
  67912. "ldr lr, [%[b], #4]\n\t"
  67913. "adc r11, %[r], #0\n\t"
  67914. "umlal r3, r11, r12, lr\n\t"
  67915. "adds r4, r4, r11\n\t"
  67916. /* A[7] * B[2] */
  67917. "ldr lr, [%[b], #8]\n\t"
  67918. "adc r11, %[r], #0\n\t"
  67919. "umlal r4, r11, r12, lr\n\t"
  67920. "adds r5, r5, r11\n\t"
  67921. /* A[7] * B[3] */
  67922. "ldr lr, [%[b], #12]\n\t"
  67923. "adc r11, %[r], #0\n\t"
  67924. "umlal r5, r11, r12, lr\n\t"
  67925. "adds r6, r6, r11\n\t"
  67926. /* A[7] * B[4] */
  67927. "ldr lr, [%[b], #16]\n\t"
  67928. "adc r11, %[r], #0\n\t"
  67929. "umlal r6, r11, r12, lr\n\t"
  67930. "adds r7, r7, r11\n\t"
  67931. /* A[7] * B[5] */
  67932. "ldr lr, [%[b], #20]\n\t"
  67933. "adc r11, %[r], #0\n\t"
  67934. "umlal r7, r11, r12, lr\n\t"
  67935. "adds r8, r8, r11\n\t"
  67936. /* A[7] * B[6] */
  67937. "ldr lr, [%[b], #24]\n\t"
  67938. "adc r11, %[r], #0\n\t"
  67939. "umlal r8, r11, r12, lr\n\t"
  67940. "adds r9, r9, r11\n\t"
  67941. /* A[7] * B[7] */
  67942. "ldr lr, [%[b], #28]\n\t"
  67943. "adc r10, %[r], #0\n\t"
  67944. "umlal r9, r10, r12, lr\n\t"
  67945. "add lr, sp, #32\n\t"
  67946. "stm lr, {r3, r4, r5, r6, r7, r8, r9, r10}\n\t"
  67947. /* Start Reduction */
  67948. "ldm sp, {r5, r6, r7, r8, r9, r10, r11, r12}\n\t"
  67949. "mov r3, r11\n\t"
  67950. "mov r4, r12\n\t"
  67951. /* mu = a[0]-a[7] + a[0]-a[4] << 96 + (a[0]-a[1] * 2) << 192 */
  67952. /* - a[0] << 224 */
  67953. /* + (a[0]-a[1] * 2) << (6 * 32) */
  67954. "adds r11, r11, r5\n\t"
  67955. "adc r12, r12, r6\n\t"
  67956. "adds r11, r11, r5\n\t"
  67957. "adc r12, r12, r6\n\t"
  67958. /* - a[0] << (7 * 32) */
  67959. "sub r12, r12, r5\n\t"
  67960. /* + a[0]-a[4] << (3 * 32) */
  67961. "mov r0, r8\n\t"
  67962. "mov r1, r9\n\t"
  67963. "mov r2, r10\n\t"
  67964. "adds r8, r8, r5\n\t"
  67965. "adcs r9, r9, r6\n\t"
  67966. "adcs r10, r10, r7\n\t"
  67967. "adcs r11, r11, r0\n\t"
  67968. "adc r12, r12, r1\n\t"
  67969. /* a += mu * m */
  67970. /* += mu * ((1 << 256) - (1 << 224) + (1 << 192) + (1 << 96) - 1) */
  67971. /* a[0] = = t[0] */
  67972. /* a[1] = = t[1] */
  67973. /* a[2] = = t[2] */
  67974. /* a[3] += t[0] = t[3] */
  67975. /* a[4] += t[1] = t[4] */
  67976. /* a[5] += t[2] = t[5] */
  67977. /* a[6] += t[0] + t[3] = t[6] */
  67978. /* a[7] += t[1] + t[4] = t[7] + t[0] */
  67979. "adds r0, r0, r5\n\t"
  67980. "adcs r1, r1, r6\n\t"
  67981. "adcs r2, r2, r7\n\t"
  67982. "adcs r3, r3, r8\n\t"
  67983. "adcs r4, r4, r9\n\t"
  67984. "mov lr, #0\n\t"
  67985. "adc lr, lr, #0\n\t"
  67986. "adds r3, r3, r5\n\t"
  67987. "adcs r4, r4, r6\n\t"
  67988. "adc lr, lr, #0\n\t"
  67989. "str r4, [sp, #28]\n\t"
  67990. /* a[8] += t[0] + t[2] + t[5] + carry */
  67991. /* a[9] += t[1] + t[3] + t[6] */
  67992. /* a[10] += t[2] + t[4] + t[7] */
  67993. "add r0, sp, #32\n\t"
  67994. "ldm r0, {r2, r3, r4}\n\t"
  67995. "adds r2, r2, lr\n\t"
  67996. "adcs r3, r3, #0\n\t"
  67997. "adcs r4, r4, #0\n\t"
  67998. "mov lr, #0\n\t"
  67999. "adc lr, lr, #0\n\t"
  68000. "adds r2, r2, r5\n\t"
  68001. "adcs r3, r3, r6\n\t"
  68002. "adcs r4, r4, r7\n\t"
  68003. "adc lr, lr, #0\n\t"
  68004. "adds r2, r2, r7\n\t"
  68005. "adcs r3, r3, r8\n\t"
  68006. "adcs r4, r4, r9\n\t"
  68007. "adc lr, lr, #0\n\t"
  68008. "adds r2, r2, r10\n\t"
  68009. "adcs r3, r3, r11\n\t"
  68010. "adcs r4, r4, r12\n\t"
  68011. "adc lr, lr, #0\n\t"
  68012. "stm r0!, {r2, r3, r4}\n\t"
  68013. /* a[11] += t[3] + t[5] + carry */
  68014. /* a[12] += t[4] + t[6] */
  68015. /* a[13] += t[5] + t[7] */
  68016. /* a[14] += t[6] */
  68017. /* a[15] += t[7] */
  68018. "ldm r0, {r0, r1, r2, r3, r4}\n\t"
  68019. "adds r0, r0, lr\n\t"
  68020. "adcs r1, r1, #0\n\t"
  68021. "adcs r2, r2, #0\n\t"
  68022. "adcs r3, r3, #0\n\t"
  68023. "adcs r4, r4, #0\n\t"
  68024. "mov lr, #0\n\t"
  68025. "adc lr, lr, #0\n\t"
  68026. "adds r0, r0, r8\n\t"
  68027. "adcs r1, r1, r9\n\t"
  68028. "adcs r2, r2, r10\n\t"
  68029. "adcs r3, r3, r11\n\t"
  68030. "adcs r4, r4, r12\n\t"
  68031. "adc lr, lr, #0\n\t"
  68032. "adds r0, r0, r10\n\t"
  68033. "adcs r1, r1, r11\n\t"
  68034. "adcs r2, r2, r12\n\t"
  68035. "adcs r3, r3, #0\n\t"
  68036. "adcs r4, r4, #0\n\t"
  68037. "adc lr, lr, #0\n\t"
  68038. "str r0, [sp, #44]\n\t"
  68039. "str r1, [sp, #48]\n\t"
  68040. "str r2, [sp, #52]\n\t"
  68041. "str r3, [sp, #56]\n\t"
  68042. /* a[7..15] - t[0..7] */
  68043. "add r0, sp, #28\n\t"
  68044. "ldm r0, {r0, r1, r2, r3}\n\t"
  68045. "subs r0, r0, r5\n\t"
  68046. "sbcs r1, r1, r6\n\t"
  68047. "sbcs r2, r2, r7\n\t"
  68048. "sbcs r3, r3, r8\n\t"
  68049. "add r0, sp, #44\n\t"
  68050. "mov r8, r4\n\t"
  68051. "ldm r0, {r4, r5, r6, r7}\n\t"
  68052. "sbcs r4, r4, r9\n\t"
  68053. "sbcs r5, r5, r10\n\t"
  68054. "sbcs r6, r6, r11\n\t"
  68055. "sbcs r7, r7, r12\n\t"
  68056. "sbcs r8, r8, #0\n\t"
  68057. "sbc lr, lr, #0\n\t"
  68058. /* mask m and sub from result if overflow */
  68059. "rsb lr, lr, #0\n\t"
  68060. "subs r1, r1, lr\n\t"
  68061. "sbcs r2, r2, lr\n\t"
  68062. "sbcs r3, r3, lr\n\t"
  68063. "sbcs r4, r4, #0\n\t"
  68064. "sbcs r5, r5, #0\n\t"
  68065. "sbcs r6, r6, #0\n\t"
  68066. "sbcs r7, r7, lr, lsr #31\n\t"
  68067. "sbc r8, r8, lr\n\t"
  68068. "ldr %[r], [sp, #64]\n\t"
  68069. "stm %[r], {r1, r2, r3, r4, r5, r6, r7, r8}\n\t"
  68070. "add sp, sp, #0x44\n\t"
  68071. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  68072. :
  68073. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "lr", "cc"
  68074. );
  68075. (void)m_p;
  68076. (void)mp_p;
  68077. }
  68078. #else
  68079. /* Multiply two Montgomery form numbers mod the modulus (prime).
  68080. * (r = a * b mod m)
  68081. *
  68082. * r Result of multiplication.
  68083. * a First number to multiply in Montgomery form.
  68084. * b Second number to multiply in Montgomery form.
  68085. * m Modulus (prime).
  68086. * mp Montgomery multiplier.
  68087. */
  68088. 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)
  68089. {
  68090. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  68091. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  68092. register const sp_digit* b asm ("r2") = (const sp_digit*)b_p;
  68093. __asm__ __volatile__ (
  68094. "sub sp, sp, #0x4c\n\t"
  68095. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  68096. "str %[r], [sp, #68]\n\t"
  68097. "str %[a], [sp, #72]\n\t"
  68098. #else
  68099. "strd %[r], %[a], [sp, #68]\n\t"
  68100. #endif
  68101. "mov lr, %[b]\n\t"
  68102. "ldm %[a], {%[r], %[a], %[b], r3}\n\t"
  68103. "ldm lr!, {r4, r5, r6}\n\t"
  68104. "umull r10, r11, %[r], r4\n\t"
  68105. "umull r12, r7, %[a], r4\n\t"
  68106. "umaal r11, r12, %[r], r5\n\t"
  68107. "umull r8, r9, %[b], r4\n\t"
  68108. "umaal r12, r8, %[a], r5\n\t"
  68109. "umaal r12, r7, %[r], r6\n\t"
  68110. "umaal r8, r9, r3, r4\n\t"
  68111. "stm sp, {r10, r11, r12}\n\t"
  68112. "umaal r7, r8, %[b], r5\n\t"
  68113. "ldm lr!, {r4}\n\t"
  68114. "umull r10, r11, %[a], r6\n\t"
  68115. "umaal r8, r9, %[b], r6\n\t"
  68116. "umaal r7, r10, %[r], r4\n\t"
  68117. "umaal r8, r11, r3, r5\n\t"
  68118. "str r7, [sp, #12]\n\t"
  68119. "umaal r8, r10, %[a], r4\n\t"
  68120. "umaal r9, r11, r3, r6\n\t"
  68121. "umaal r9, r10, %[b], r4\n\t"
  68122. "umaal r10, r11, r3, r4\n\t"
  68123. "ldm lr, {r4, r5, r6, r7}\n\t"
  68124. "mov r12, #0\n\t"
  68125. "umlal r8, r12, %[r], r4\n\t"
  68126. "umaal r9, r12, %[a], r4\n\t"
  68127. "umaal r10, r12, %[b], r4\n\t"
  68128. "umaal r11, r12, r3, r4\n\t"
  68129. "mov r4, #0\n\t"
  68130. "umlal r9, r4, %[r], r5\n\t"
  68131. "umaal r10, r4, %[a], r5\n\t"
  68132. "umaal r11, r4, %[b], r5\n\t"
  68133. "umaal r12, r4, r3, r5\n\t"
  68134. "mov r5, #0\n\t"
  68135. "umlal r10, r5, %[r], r6\n\t"
  68136. "umaal r11, r5, %[a], r6\n\t"
  68137. "umaal r12, r5, %[b], r6\n\t"
  68138. "umaal r4, r5, r3, r6\n\t"
  68139. "mov r6, #0\n\t"
  68140. "umlal r11, r6, %[r], r7\n\t"
  68141. "ldr %[r], [sp, #72]\n\t"
  68142. "umaal r12, r6, %[a], r7\n\t"
  68143. "add %[r], %[r], #16\n\t"
  68144. "umaal r4, r6, %[b], r7\n\t"
  68145. "sub lr, lr, #16\n\t"
  68146. "umaal r5, r6, r3, r7\n\t"
  68147. "ldm %[r], {%[r], %[a], %[b], r3}\n\t"
  68148. "str r6, [sp, #64]\n\t"
  68149. "ldm lr!, {r6}\n\t"
  68150. "mov r7, #0\n\t"
  68151. "umlal r8, r7, %[r], r6\n\t"
  68152. "umaal r9, r7, %[a], r6\n\t"
  68153. "str r8, [sp, #16]\n\t"
  68154. "umaal r10, r7, %[b], r6\n\t"
  68155. "umaal r11, r7, r3, r6\n\t"
  68156. "ldm lr!, {r6}\n\t"
  68157. "mov r8, #0\n\t"
  68158. "umlal r9, r8, %[r], r6\n\t"
  68159. "umaal r10, r8, %[a], r6\n\t"
  68160. "str r9, [sp, #20]\n\t"
  68161. "umaal r11, r8, %[b], r6\n\t"
  68162. "umaal r12, r8, r3, r6\n\t"
  68163. "ldm lr!, {r6}\n\t"
  68164. "mov r9, #0\n\t"
  68165. "umlal r10, r9, %[r], r6\n\t"
  68166. "umaal r11, r9, %[a], r6\n\t"
  68167. "str r10, [sp, #24]\n\t"
  68168. "umaal r12, r9, %[b], r6\n\t"
  68169. "umaal r4, r9, r3, r6\n\t"
  68170. "ldm lr!, {r6}\n\t"
  68171. "mov r10, #0\n\t"
  68172. "umlal r11, r10, %[r], r6\n\t"
  68173. "umaal r12, r10, %[a], r6\n\t"
  68174. "str r11, [sp, #28]\n\t"
  68175. "umaal r4, r10, %[b], r6\n\t"
  68176. "umaal r5, r10, r3, r6\n\t"
  68177. "ldm lr!, {r11}\n\t"
  68178. "umaal r12, r7, %[r], r11\n\t"
  68179. "umaal r4, r7, %[a], r11\n\t"
  68180. "ldr r6, [sp, #64]\n\t"
  68181. "umaal r5, r7, %[b], r11\n\t"
  68182. "umaal r6, r7, r3, r11\n\t"
  68183. "ldm lr!, {r11}\n\t"
  68184. "umaal r4, r8, %[r], r11\n\t"
  68185. "umaal r5, r8, %[a], r11\n\t"
  68186. "umaal r6, r8, %[b], r11\n\t"
  68187. "umaal r7, r8, r3, r11\n\t"
  68188. "ldm lr, {r11, lr}\n\t"
  68189. "umaal r5, r9, %[r], r11\n\t"
  68190. "umaal r6, r10, %[r], lr\n\t"
  68191. "umaal r6, r9, %[a], r11\n\t"
  68192. "umaal r7, r10, %[a], lr\n\t"
  68193. "umaal r7, r9, %[b], r11\n\t"
  68194. "umaal r8, r10, %[b], lr\n\t"
  68195. "umaal r8, r9, r3, r11\n\t"
  68196. "umaal r9, r10, r3, lr\n\t"
  68197. "mov r3, r12\n\t"
  68198. "add lr, sp, #32\n\t"
  68199. "stm lr, {r3, r4, r5, r6, r7, r8, r9, r10}\n\t"
  68200. /* Start Reduction */
  68201. "ldm sp, {r5, r6, r7, r8, r9, r10, r11, r12}\n\t"
  68202. "mov r3, r11\n\t"
  68203. "mov r4, r12\n\t"
  68204. /* mu = a[0]-a[7] + a[0]-a[4] << 96 + (a[0]-a[1] * 2) << 192 */
  68205. /* - a[0] << 224 */
  68206. /* + (a[0]-a[1] * 2) << (6 * 32) */
  68207. "adds r11, r11, r5\n\t"
  68208. "adc r12, r12, r6\n\t"
  68209. "adds r11, r11, r5\n\t"
  68210. "adc r12, r12, r6\n\t"
  68211. /* - a[0] << (7 * 32) */
  68212. "sub r12, r12, r5\n\t"
  68213. /* + a[0]-a[4] << (3 * 32) */
  68214. "mov r0, r8\n\t"
  68215. "mov r1, r9\n\t"
  68216. "mov r2, r10\n\t"
  68217. "adds r8, r8, r5\n\t"
  68218. "adcs r9, r9, r6\n\t"
  68219. "adcs r10, r10, r7\n\t"
  68220. "adcs r11, r11, r0\n\t"
  68221. "adc r12, r12, r1\n\t"
  68222. /* a += mu * m */
  68223. /* += mu * ((1 << 256) - (1 << 224) + (1 << 192) + (1 << 96) - 1) */
  68224. /* a[0] = = t[0] */
  68225. /* a[1] = = t[1] */
  68226. /* a[2] = = t[2] */
  68227. /* a[3] += t[0] = t[3] */
  68228. /* a[4] += t[1] = t[4] */
  68229. /* a[5] += t[2] = t[5] */
  68230. /* a[6] += t[0] + t[3] = t[6] */
  68231. /* a[7] += t[1] + t[4] = t[7] + t[0] */
  68232. "adds r0, r0, r5\n\t"
  68233. "adcs r1, r1, r6\n\t"
  68234. "adcs r2, r2, r7\n\t"
  68235. "adcs r3, r3, r8\n\t"
  68236. "adcs r4, r4, r9\n\t"
  68237. "mov lr, #0\n\t"
  68238. "adc lr, lr, #0\n\t"
  68239. "adds r3, r3, r5\n\t"
  68240. "adcs r4, r4, r6\n\t"
  68241. "adc lr, lr, #0\n\t"
  68242. "str r4, [sp, #28]\n\t"
  68243. /* a[8] += t[0] + t[2] + t[5] + carry */
  68244. /* a[9] += t[1] + t[3] + t[6] */
  68245. /* a[10] += t[2] + t[4] + t[7] */
  68246. "add r0, sp, #32\n\t"
  68247. "ldm r0, {r2, r3, r4}\n\t"
  68248. "adds r2, r2, lr\n\t"
  68249. "adcs r3, r3, #0\n\t"
  68250. "adcs r4, r4, #0\n\t"
  68251. "mov lr, #0\n\t"
  68252. "adc lr, lr, #0\n\t"
  68253. "adds r2, r2, r5\n\t"
  68254. "adcs r3, r3, r6\n\t"
  68255. "adcs r4, r4, r7\n\t"
  68256. "adc lr, lr, #0\n\t"
  68257. "adds r2, r2, r7\n\t"
  68258. "adcs r3, r3, r8\n\t"
  68259. "adcs r4, r4, r9\n\t"
  68260. "adc lr, lr, #0\n\t"
  68261. "adds r2, r2, r10\n\t"
  68262. "adcs r3, r3, r11\n\t"
  68263. "adcs r4, r4, r12\n\t"
  68264. "adc lr, lr, #0\n\t"
  68265. "stm r0!, {r2, r3, r4}\n\t"
  68266. /* a[11] += t[3] + t[5] + carry */
  68267. /* a[12] += t[4] + t[6] */
  68268. /* a[13] += t[5] + t[7] */
  68269. /* a[14] += t[6] */
  68270. /* a[15] += t[7] */
  68271. "ldm r0, {r0, r1, r2, r3, r4}\n\t"
  68272. "adds r0, r0, lr\n\t"
  68273. "adcs r1, r1, #0\n\t"
  68274. "adcs r2, r2, #0\n\t"
  68275. "adcs r3, r3, #0\n\t"
  68276. "adcs r4, r4, #0\n\t"
  68277. "mov lr, #0\n\t"
  68278. "adc lr, lr, #0\n\t"
  68279. "adds r0, r0, r8\n\t"
  68280. "adcs r1, r1, r9\n\t"
  68281. "adcs r2, r2, r10\n\t"
  68282. "adcs r3, r3, r11\n\t"
  68283. "adcs r4, r4, r12\n\t"
  68284. "adc lr, lr, #0\n\t"
  68285. "adds r0, r0, r10\n\t"
  68286. "adcs r1, r1, r11\n\t"
  68287. "adcs r2, r2, r12\n\t"
  68288. "adcs r3, r3, #0\n\t"
  68289. "adcs r4, r4, #0\n\t"
  68290. "adc lr, lr, #0\n\t"
  68291. "str r0, [sp, #44]\n\t"
  68292. "str r1, [sp, #48]\n\t"
  68293. "str r2, [sp, #52]\n\t"
  68294. "str r3, [sp, #56]\n\t"
  68295. /* a[7..15] - t[0..7] */
  68296. "add r0, sp, #28\n\t"
  68297. "ldm r0, {r0, r1, r2, r3}\n\t"
  68298. "subs r0, r0, r5\n\t"
  68299. "sbcs r1, r1, r6\n\t"
  68300. "sbcs r2, r2, r7\n\t"
  68301. "sbcs r3, r3, r8\n\t"
  68302. "add r0, sp, #44\n\t"
  68303. "mov r8, r4\n\t"
  68304. "ldm r0, {r4, r5, r6, r7}\n\t"
  68305. "sbcs r4, r4, r9\n\t"
  68306. "sbcs r5, r5, r10\n\t"
  68307. "sbcs r6, r6, r11\n\t"
  68308. "sbcs r7, r7, r12\n\t"
  68309. "sbcs r8, r8, #0\n\t"
  68310. "sbc lr, lr, #0\n\t"
  68311. /* mask m and sub from result if overflow */
  68312. "rsb lr, lr, #0\n\t"
  68313. "subs r1, r1, lr\n\t"
  68314. "sbcs r2, r2, lr\n\t"
  68315. "sbcs r3, r3, lr\n\t"
  68316. "sbcs r4, r4, #0\n\t"
  68317. "sbcs r5, r5, #0\n\t"
  68318. "sbcs r6, r6, #0\n\t"
  68319. "sbcs r7, r7, lr, lsr #31\n\t"
  68320. "sbc r8, r8, lr\n\t"
  68321. "ldr %[r], [sp, #68]\n\t"
  68322. "stm %[r], {r1, r2, r3, r4, r5, r6, r7, r8}\n\t"
  68323. "add sp, sp, #0x4c\n\t"
  68324. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  68325. :
  68326. : "memory", "r3", "r4", "r5", "r6", "r10", "r11", "r12", "r7", "r8", "r9", "lr", "cc"
  68327. );
  68328. (void)m_p;
  68329. (void)mp_p;
  68330. }
  68331. #endif
  68332. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  68333. /* Square the Montgomery form number mod the modulus (prime). (r = a * a mod m)
  68334. *
  68335. * r Result of squaring.
  68336. * a Number to square in Montgomery form.
  68337. * m Modulus (prime).
  68338. * mp Montgomery multiplier.
  68339. */
  68340. 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)
  68341. {
  68342. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  68343. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  68344. __asm__ __volatile__ (
  68345. "sub sp, sp, #0x44\n\t"
  68346. "sub sp, sp, #0x44\n\t"
  68347. "mov r5, #0\n\t"
  68348. /* A[0] * A[1] */
  68349. "ldr r6, [%[a]]\n\t"
  68350. "ldr r7, [%[a], #4]\n\t"
  68351. "lsl r3, r6, #16\n\t"
  68352. "lsl r9, r7, #16\n\t"
  68353. "lsr r3, r3, #16\n\t"
  68354. "lsr r9, r9, #16\n\t"
  68355. "mul r9, r3, r9\n\t"
  68356. "lsr r4, r7, #16\n\t"
  68357. "mul r3, r4, r3\n\t"
  68358. "lsr r10, r3, #16\n\t"
  68359. "lsl r3, r3, #16\n\t"
  68360. "adds r9, r9, r3\n\t"
  68361. "adc r10, r10, #0\n\t"
  68362. "lsr r3, r6, #16\n\t"
  68363. "mul r4, r3, r4\n\t"
  68364. "add r10, r10, r4\n\t"
  68365. "lsl r4, r7, #16\n\t"
  68366. "lsr r4, r4, #16\n\t"
  68367. "mul r3, r4, r3\n\t"
  68368. "lsr r4, r3, #16\n\t"
  68369. "lsl r3, r3, #16\n\t"
  68370. "adds r9, r9, r3\n\t"
  68371. "adc r10, r10, r4\n\t"
  68372. "str r9, [sp, #4]\n\t"
  68373. /* A[0] * A[2] */
  68374. "ldr r7, [%[a], #8]\n\t"
  68375. "lsl r3, r6, #16\n\t"
  68376. "lsl r4, r7, #16\n\t"
  68377. "lsr r3, r3, #16\n\t"
  68378. "lsr r4, r4, #16\n\t"
  68379. "mul r4, r3, r4\n\t"
  68380. "mov lr, #0\n\t"
  68381. "adds r10, r10, r4\n\t"
  68382. "adc lr, lr, #0\n\t"
  68383. "lsr r4, r7, #16\n\t"
  68384. "mul r3, r4, r3\n\t"
  68385. "lsr r4, r3, #16\n\t"
  68386. "lsl r3, r3, #16\n\t"
  68387. "adds r10, r10, r3\n\t"
  68388. "adc lr, lr, r4\n\t"
  68389. "lsr r3, r6, #16\n\t"
  68390. "lsr r4, r7, #16\n\t"
  68391. "mul r4, r3, r4\n\t"
  68392. "add lr, lr, r4\n\t"
  68393. "lsl r4, r7, #16\n\t"
  68394. "lsr r4, r4, #16\n\t"
  68395. "mul r3, r4, r3\n\t"
  68396. "lsr r4, r3, #16\n\t"
  68397. "lsl r3, r3, #16\n\t"
  68398. "adds r10, r10, r3\n\t"
  68399. "adc lr, lr, r4\n\t"
  68400. "str r10, [sp, #8]\n\t"
  68401. /* A[0] * A[3] */
  68402. "ldr r7, [%[a], #12]\n\t"
  68403. "lsl r3, r6, #16\n\t"
  68404. "lsl r4, r7, #16\n\t"
  68405. "lsr r3, r3, #16\n\t"
  68406. "lsr r4, r4, #16\n\t"
  68407. "mul r4, r3, r4\n\t"
  68408. "mov r8, #0\n\t"
  68409. "adds lr, lr, r4\n\t"
  68410. "adc r8, r8, #0\n\t"
  68411. "lsr r4, r7, #16\n\t"
  68412. "mul r3, r4, r3\n\t"
  68413. "lsr r4, r3, #16\n\t"
  68414. "lsl r3, r3, #16\n\t"
  68415. "adds lr, lr, r3\n\t"
  68416. "adc r8, r8, r4\n\t"
  68417. "lsr r3, r6, #16\n\t"
  68418. "lsr r4, r7, #16\n\t"
  68419. "mul r4, r3, r4\n\t"
  68420. "add r8, r8, r4\n\t"
  68421. "lsl r4, r7, #16\n\t"
  68422. "lsr r4, r4, #16\n\t"
  68423. "mul r3, r4, r3\n\t"
  68424. "lsr r4, r3, #16\n\t"
  68425. "lsl r3, r3, #16\n\t"
  68426. "adds lr, lr, r3\n\t"
  68427. "adc r8, r8, r4\n\t"
  68428. /* A[1] * A[2] */
  68429. "ldr r6, [%[a], #4]\n\t"
  68430. "ldr r7, [%[a], #8]\n\t"
  68431. "lsl r3, r6, #16\n\t"
  68432. "lsl r4, r7, #16\n\t"
  68433. "lsr r3, r3, #16\n\t"
  68434. "lsr r4, r4, #16\n\t"
  68435. "mul r4, r3, r4\n\t"
  68436. "adds lr, lr, r4\n\t"
  68437. "adcs r8, r8, #0\n\t"
  68438. "adc r9, r5, #0\n\t"
  68439. "lsr r4, r7, #16\n\t"
  68440. "mul r3, r4, r3\n\t"
  68441. "lsr r4, r3, #16\n\t"
  68442. "lsl r3, r3, #16\n\t"
  68443. "adds lr, lr, r3\n\t"
  68444. "adcs r8, r8, r4\n\t"
  68445. "adc r9, r9, #0\n\t"
  68446. "lsr r3, r6, #16\n\t"
  68447. "lsr r4, r7, #16\n\t"
  68448. "mul r4, r3, r4\n\t"
  68449. "adds r8, r8, r4\n\t"
  68450. "adc r9, r9, #0\n\t"
  68451. "lsl r4, r7, #16\n\t"
  68452. "lsr r4, r4, #16\n\t"
  68453. "mul r3, r4, r3\n\t"
  68454. "lsr r4, r3, #16\n\t"
  68455. "lsl r3, r3, #16\n\t"
  68456. "adds lr, lr, r3\n\t"
  68457. "adcs r8, r8, r4\n\t"
  68458. "adc r9, r9, #0\n\t"
  68459. "str lr, [sp, #12]\n\t"
  68460. /* A[1] * A[3] */
  68461. "ldr r7, [%[a], #12]\n\t"
  68462. "lsl r3, r6, #16\n\t"
  68463. "lsl r4, r7, #16\n\t"
  68464. "lsr r3, r3, #16\n\t"
  68465. "lsr r4, r4, #16\n\t"
  68466. "mul r4, r3, r4\n\t"
  68467. "adds r8, r8, r4\n\t"
  68468. "adc r9, r9, #0\n\t"
  68469. "lsr r4, r7, #16\n\t"
  68470. "mul r3, r4, r3\n\t"
  68471. "lsr r4, r3, #16\n\t"
  68472. "lsl r3, r3, #16\n\t"
  68473. "adds r8, r8, r3\n\t"
  68474. "adc r9, r9, r4\n\t"
  68475. "lsr r3, r6, #16\n\t"
  68476. "lsr r4, r7, #16\n\t"
  68477. "mul r4, r3, r4\n\t"
  68478. "add r9, r9, r4\n\t"
  68479. "lsl r4, r7, #16\n\t"
  68480. "lsr r4, r4, #16\n\t"
  68481. "mul r3, r4, r3\n\t"
  68482. "lsr r4, r3, #16\n\t"
  68483. "lsl r3, r3, #16\n\t"
  68484. "adds r8, r8, r3\n\t"
  68485. "adc r9, r9, r4\n\t"
  68486. /* A[0] * A[4] */
  68487. "ldr r6, [%[a]]\n\t"
  68488. "ldr r7, [%[a], #16]\n\t"
  68489. "lsl r3, r6, #16\n\t"
  68490. "lsl r4, r7, #16\n\t"
  68491. "lsr r3, r3, #16\n\t"
  68492. "lsr r4, r4, #16\n\t"
  68493. "mul r4, r3, r4\n\t"
  68494. "adds r8, r8, r4\n\t"
  68495. "adcs r9, r9, #0\n\t"
  68496. "adc r10, r5, #0\n\t"
  68497. "lsr r4, r7, #16\n\t"
  68498. "mul r3, r4, r3\n\t"
  68499. "lsr r4, r3, #16\n\t"
  68500. "lsl r3, r3, #16\n\t"
  68501. "adds r8, r8, r3\n\t"
  68502. "adcs r9, r9, r4\n\t"
  68503. "adc r10, r10, #0\n\t"
  68504. "lsr r3, r6, #16\n\t"
  68505. "lsr r4, r7, #16\n\t"
  68506. "mul r4, r3, r4\n\t"
  68507. "adds r9, r9, r4\n\t"
  68508. "adc r10, r10, #0\n\t"
  68509. "lsl r4, r7, #16\n\t"
  68510. "lsr r4, r4, #16\n\t"
  68511. "mul r3, r4, r3\n\t"
  68512. "lsr r4, r3, #16\n\t"
  68513. "lsl r3, r3, #16\n\t"
  68514. "adds r8, r8, r3\n\t"
  68515. "adcs r9, r9, r4\n\t"
  68516. "adc r10, r10, #0\n\t"
  68517. "str r8, [sp, #16]\n\t"
  68518. /* A[0] * A[5] */
  68519. "ldr r7, [%[a], #20]\n\t"
  68520. "lsl r3, r6, #16\n\t"
  68521. "lsl r4, r7, #16\n\t"
  68522. "lsr r3, r3, #16\n\t"
  68523. "lsr r4, r4, #16\n\t"
  68524. "mul r4, r3, r4\n\t"
  68525. "adds r9, r9, r4\n\t"
  68526. "adc r10, r10, #0\n\t"
  68527. "lsr r4, r7, #16\n\t"
  68528. "mul r3, r4, r3\n\t"
  68529. "lsr r4, r3, #16\n\t"
  68530. "lsl r3, r3, #16\n\t"
  68531. "adds r9, r9, r3\n\t"
  68532. "adc r10, r10, r4\n\t"
  68533. "lsr r3, r6, #16\n\t"
  68534. "lsr r4, r7, #16\n\t"
  68535. "mul r4, r3, r4\n\t"
  68536. "add r10, r10, r4\n\t"
  68537. "lsl r4, r7, #16\n\t"
  68538. "lsr r4, r4, #16\n\t"
  68539. "mul r3, r4, r3\n\t"
  68540. "lsr r4, r3, #16\n\t"
  68541. "lsl r3, r3, #16\n\t"
  68542. "adds r9, r9, r3\n\t"
  68543. "adc r10, r10, r4\n\t"
  68544. /* A[1] * A[4] */
  68545. "ldr r6, [%[a], #4]\n\t"
  68546. "ldr r7, [%[a], #16]\n\t"
  68547. "lsl r3, r6, #16\n\t"
  68548. "lsl r4, r7, #16\n\t"
  68549. "lsr r3, r3, #16\n\t"
  68550. "lsr r4, r4, #16\n\t"
  68551. "mul r4, r3, r4\n\t"
  68552. "adds r9, r9, r4\n\t"
  68553. "adcs r10, r10, #0\n\t"
  68554. "adc lr, r5, #0\n\t"
  68555. "lsr r4, r7, #16\n\t"
  68556. "mul r3, r4, r3\n\t"
  68557. "lsr r4, r3, #16\n\t"
  68558. "lsl r3, r3, #16\n\t"
  68559. "adds r9, r9, r3\n\t"
  68560. "adcs r10, r10, r4\n\t"
  68561. "adc lr, lr, #0\n\t"
  68562. "lsr r3, r6, #16\n\t"
  68563. "lsr r4, r7, #16\n\t"
  68564. "mul r4, r3, r4\n\t"
  68565. "adds r10, r10, r4\n\t"
  68566. "adc lr, lr, #0\n\t"
  68567. "lsl r4, r7, #16\n\t"
  68568. "lsr r4, r4, #16\n\t"
  68569. "mul r3, r4, r3\n\t"
  68570. "lsr r4, r3, #16\n\t"
  68571. "lsl r3, r3, #16\n\t"
  68572. "adds r9, r9, r3\n\t"
  68573. "adcs r10, r10, r4\n\t"
  68574. "adc lr, lr, #0\n\t"
  68575. /* A[2] * A[3] */
  68576. "ldr r6, [%[a], #8]\n\t"
  68577. "ldr r7, [%[a], #12]\n\t"
  68578. "lsl r3, r6, #16\n\t"
  68579. "lsl r4, r7, #16\n\t"
  68580. "lsr r3, r3, #16\n\t"
  68581. "lsr r4, r4, #16\n\t"
  68582. "mul r4, r3, r4\n\t"
  68583. "adds r9, r9, r4\n\t"
  68584. "adcs r10, r10, #0\n\t"
  68585. "adc lr, r5, lr\n\t"
  68586. "lsr r4, r7, #16\n\t"
  68587. "mul r3, r4, r3\n\t"
  68588. "lsr r4, r3, #16\n\t"
  68589. "lsl r3, r3, #16\n\t"
  68590. "adds r9, r9, r3\n\t"
  68591. "adcs r10, r10, r4\n\t"
  68592. "adc lr, lr, #0\n\t"
  68593. "lsr r3, r6, #16\n\t"
  68594. "lsr r4, r7, #16\n\t"
  68595. "mul r4, r3, r4\n\t"
  68596. "adds r10, r10, r4\n\t"
  68597. "adc lr, lr, #0\n\t"
  68598. "lsl r4, r7, #16\n\t"
  68599. "lsr r4, r4, #16\n\t"
  68600. "mul r3, r4, r3\n\t"
  68601. "lsr r4, r3, #16\n\t"
  68602. "lsl r3, r3, #16\n\t"
  68603. "adds r9, r9, r3\n\t"
  68604. "adcs r10, r10, r4\n\t"
  68605. "adc lr, lr, #0\n\t"
  68606. "str r9, [sp, #20]\n\t"
  68607. /* A[2] * A[4] */
  68608. "ldr r7, [%[a], #16]\n\t"
  68609. "lsl r3, r6, #16\n\t"
  68610. "lsl r4, r7, #16\n\t"
  68611. "lsr r3, r3, #16\n\t"
  68612. "lsr r4, r4, #16\n\t"
  68613. "mul r4, r3, r4\n\t"
  68614. "adds r10, r10, r4\n\t"
  68615. "adcs lr, lr, #0\n\t"
  68616. "adc r8, r5, #0\n\t"
  68617. "lsr r4, r7, #16\n\t"
  68618. "mul r3, r4, r3\n\t"
  68619. "lsr r4, r3, #16\n\t"
  68620. "lsl r3, r3, #16\n\t"
  68621. "adds r10, r10, r3\n\t"
  68622. "adcs lr, lr, r4\n\t"
  68623. "adc r8, r8, #0\n\t"
  68624. "lsr r3, r6, #16\n\t"
  68625. "lsr r4, r7, #16\n\t"
  68626. "mul r4, r3, r4\n\t"
  68627. "adds lr, lr, r4\n\t"
  68628. "adc r8, r8, #0\n\t"
  68629. "lsl r4, r7, #16\n\t"
  68630. "lsr r4, r4, #16\n\t"
  68631. "mul r3, r4, r3\n\t"
  68632. "lsr r4, r3, #16\n\t"
  68633. "lsl r3, r3, #16\n\t"
  68634. "adds r10, r10, r3\n\t"
  68635. "adcs lr, lr, r4\n\t"
  68636. "adc r8, r8, #0\n\t"
  68637. /* A[1] * A[5] */
  68638. "ldr r6, [%[a], #4]\n\t"
  68639. "ldr r7, [%[a], #20]\n\t"
  68640. "lsl r3, r6, #16\n\t"
  68641. "lsl r4, r7, #16\n\t"
  68642. "lsr r3, r3, #16\n\t"
  68643. "lsr r4, r4, #16\n\t"
  68644. "mul r4, r3, r4\n\t"
  68645. "adds r10, r10, r4\n\t"
  68646. "adcs lr, lr, #0\n\t"
  68647. "adc r8, r5, r8\n\t"
  68648. "lsr r4, r7, #16\n\t"
  68649. "mul r3, r4, r3\n\t"
  68650. "lsr r4, r3, #16\n\t"
  68651. "lsl r3, r3, #16\n\t"
  68652. "adds r10, r10, r3\n\t"
  68653. "adcs lr, lr, r4\n\t"
  68654. "adc r8, r8, #0\n\t"
  68655. "lsr r3, r6, #16\n\t"
  68656. "lsr r4, r7, #16\n\t"
  68657. "mul r4, r3, r4\n\t"
  68658. "adds lr, lr, r4\n\t"
  68659. "adc r8, r8, #0\n\t"
  68660. "lsl r4, r7, #16\n\t"
  68661. "lsr r4, r4, #16\n\t"
  68662. "mul r3, r4, r3\n\t"
  68663. "lsr r4, r3, #16\n\t"
  68664. "lsl r3, r3, #16\n\t"
  68665. "adds r10, r10, r3\n\t"
  68666. "adcs lr, lr, r4\n\t"
  68667. "adc r8, r8, #0\n\t"
  68668. /* A[0] * A[6] */
  68669. "ldr r6, [%[a]]\n\t"
  68670. "ldr r7, [%[a], #24]\n\t"
  68671. "lsl r3, r6, #16\n\t"
  68672. "lsl r4, r7, #16\n\t"
  68673. "lsr r3, r3, #16\n\t"
  68674. "lsr r4, r4, #16\n\t"
  68675. "mul r4, r3, r4\n\t"
  68676. "adds r10, r10, r4\n\t"
  68677. "adcs lr, lr, #0\n\t"
  68678. "adc r8, r5, r8\n\t"
  68679. "lsr r4, r7, #16\n\t"
  68680. "mul r3, r4, r3\n\t"
  68681. "lsr r4, r3, #16\n\t"
  68682. "lsl r3, r3, #16\n\t"
  68683. "adds r10, r10, r3\n\t"
  68684. "adcs lr, lr, r4\n\t"
  68685. "adc r8, r8, #0\n\t"
  68686. "lsr r3, r6, #16\n\t"
  68687. "lsr r4, r7, #16\n\t"
  68688. "mul r4, r3, r4\n\t"
  68689. "adds lr, lr, r4\n\t"
  68690. "adc r8, r8, #0\n\t"
  68691. "lsl r4, r7, #16\n\t"
  68692. "lsr r4, r4, #16\n\t"
  68693. "mul r3, r4, r3\n\t"
  68694. "lsr r4, r3, #16\n\t"
  68695. "lsl r3, r3, #16\n\t"
  68696. "adds r10, r10, r3\n\t"
  68697. "adcs lr, lr, r4\n\t"
  68698. "adc r8, r8, #0\n\t"
  68699. "str r10, [sp, #24]\n\t"
  68700. /* A[0] * A[7] */
  68701. "ldr r7, [%[a], #28]\n\t"
  68702. "lsl r3, r6, #16\n\t"
  68703. "lsl r4, r7, #16\n\t"
  68704. "lsr r3, r3, #16\n\t"
  68705. "lsr r4, r4, #16\n\t"
  68706. "mul r4, r3, r4\n\t"
  68707. "adds lr, lr, r4\n\t"
  68708. "adcs r8, r8, #0\n\t"
  68709. "adc r9, r5, #0\n\t"
  68710. "lsr r4, r7, #16\n\t"
  68711. "mul r3, r4, r3\n\t"
  68712. "lsr r4, r3, #16\n\t"
  68713. "lsl r3, r3, #16\n\t"
  68714. "adds lr, lr, r3\n\t"
  68715. "adcs r8, r8, r4\n\t"
  68716. "adc r9, r9, #0\n\t"
  68717. "lsr r3, r6, #16\n\t"
  68718. "lsr r4, r7, #16\n\t"
  68719. "mul r4, r3, r4\n\t"
  68720. "adds r8, r8, r4\n\t"
  68721. "adc r9, r9, #0\n\t"
  68722. "lsl r4, r7, #16\n\t"
  68723. "lsr r4, r4, #16\n\t"
  68724. "mul r3, r4, r3\n\t"
  68725. "lsr r4, r3, #16\n\t"
  68726. "lsl r3, r3, #16\n\t"
  68727. "adds lr, lr, r3\n\t"
  68728. "adcs r8, r8, r4\n\t"
  68729. "adc r9, r9, #0\n\t"
  68730. /* A[1] * A[6] */
  68731. "ldr r6, [%[a], #4]\n\t"
  68732. "ldr r7, [%[a], #24]\n\t"
  68733. "lsl r3, r6, #16\n\t"
  68734. "lsl r4, r7, #16\n\t"
  68735. "lsr r3, r3, #16\n\t"
  68736. "lsr r4, r4, #16\n\t"
  68737. "mul r4, r3, r4\n\t"
  68738. "adds lr, lr, r4\n\t"
  68739. "adcs r8, r8, #0\n\t"
  68740. "adc r9, r5, r9\n\t"
  68741. "lsr r4, r7, #16\n\t"
  68742. "mul r3, r4, r3\n\t"
  68743. "lsr r4, r3, #16\n\t"
  68744. "lsl r3, r3, #16\n\t"
  68745. "adds lr, lr, r3\n\t"
  68746. "adcs r8, r8, r4\n\t"
  68747. "adc r9, r9, #0\n\t"
  68748. "lsr r3, r6, #16\n\t"
  68749. "lsr r4, r7, #16\n\t"
  68750. "mul r4, r3, r4\n\t"
  68751. "adds r8, r8, r4\n\t"
  68752. "adc r9, r9, #0\n\t"
  68753. "lsl r4, r7, #16\n\t"
  68754. "lsr r4, r4, #16\n\t"
  68755. "mul r3, r4, r3\n\t"
  68756. "lsr r4, r3, #16\n\t"
  68757. "lsl r3, r3, #16\n\t"
  68758. "adds lr, lr, r3\n\t"
  68759. "adcs r8, r8, r4\n\t"
  68760. "adc r9, r9, #0\n\t"
  68761. /* A[2] * A[5] */
  68762. "ldr r6, [%[a], #8]\n\t"
  68763. "ldr r7, [%[a], #20]\n\t"
  68764. "lsl r3, r6, #16\n\t"
  68765. "lsl r4, r7, #16\n\t"
  68766. "lsr r3, r3, #16\n\t"
  68767. "lsr r4, r4, #16\n\t"
  68768. "mul r4, r3, r4\n\t"
  68769. "adds lr, lr, r4\n\t"
  68770. "adcs r8, r8, #0\n\t"
  68771. "adc r9, r5, r9\n\t"
  68772. "lsr r4, r7, #16\n\t"
  68773. "mul r3, r4, r3\n\t"
  68774. "lsr r4, r3, #16\n\t"
  68775. "lsl r3, r3, #16\n\t"
  68776. "adds lr, lr, r3\n\t"
  68777. "adcs r8, r8, r4\n\t"
  68778. "adc r9, r9, #0\n\t"
  68779. "lsr r3, r6, #16\n\t"
  68780. "lsr r4, r7, #16\n\t"
  68781. "mul r4, r3, r4\n\t"
  68782. "adds r8, r8, r4\n\t"
  68783. "adc r9, r9, #0\n\t"
  68784. "lsl r4, r7, #16\n\t"
  68785. "lsr r4, r4, #16\n\t"
  68786. "mul r3, r4, r3\n\t"
  68787. "lsr r4, r3, #16\n\t"
  68788. "lsl r3, r3, #16\n\t"
  68789. "adds lr, lr, r3\n\t"
  68790. "adcs r8, r8, r4\n\t"
  68791. "adc r9, r9, #0\n\t"
  68792. /* A[3] * A[4] */
  68793. "ldr r6, [%[a], #12]\n\t"
  68794. "ldr r7, [%[a], #16]\n\t"
  68795. "lsl r3, r6, #16\n\t"
  68796. "lsl r4, r7, #16\n\t"
  68797. "lsr r3, r3, #16\n\t"
  68798. "lsr r4, r4, #16\n\t"
  68799. "mul r4, r3, r4\n\t"
  68800. "adds lr, lr, r4\n\t"
  68801. "adcs r8, r8, #0\n\t"
  68802. "adc r9, r5, r9\n\t"
  68803. "lsr r4, r7, #16\n\t"
  68804. "mul r3, r4, r3\n\t"
  68805. "lsr r4, r3, #16\n\t"
  68806. "lsl r3, r3, #16\n\t"
  68807. "adds lr, lr, r3\n\t"
  68808. "adcs r8, r8, r4\n\t"
  68809. "adc r9, r9, #0\n\t"
  68810. "lsr r3, r6, #16\n\t"
  68811. "lsr r4, r7, #16\n\t"
  68812. "mul r4, r3, r4\n\t"
  68813. "adds r8, r8, r4\n\t"
  68814. "adc r9, r9, #0\n\t"
  68815. "lsl r4, r7, #16\n\t"
  68816. "lsr r4, r4, #16\n\t"
  68817. "mul r3, r4, r3\n\t"
  68818. "lsr r4, r3, #16\n\t"
  68819. "lsl r3, r3, #16\n\t"
  68820. "adds lr, lr, r3\n\t"
  68821. "adcs r8, r8, r4\n\t"
  68822. "adc r9, r9, #0\n\t"
  68823. "str lr, [sp, #28]\n\t"
  68824. /* A[3] * A[5] */
  68825. "ldr r7, [%[a], #20]\n\t"
  68826. "lsl r3, r6, #16\n\t"
  68827. "lsl r4, r7, #16\n\t"
  68828. "lsr r3, r3, #16\n\t"
  68829. "lsr r4, r4, #16\n\t"
  68830. "mul r4, r3, r4\n\t"
  68831. "adds r8, r8, r4\n\t"
  68832. "adcs r9, r9, #0\n\t"
  68833. "adc r10, r5, #0\n\t"
  68834. "lsr r4, r7, #16\n\t"
  68835. "mul r3, r4, r3\n\t"
  68836. "lsr r4, r3, #16\n\t"
  68837. "lsl r3, r3, #16\n\t"
  68838. "adds r8, r8, r3\n\t"
  68839. "adcs r9, r9, r4\n\t"
  68840. "adc r10, r10, #0\n\t"
  68841. "lsr r3, r6, #16\n\t"
  68842. "lsr r4, r7, #16\n\t"
  68843. "mul r4, r3, r4\n\t"
  68844. "adds r9, r9, r4\n\t"
  68845. "adc r10, r10, #0\n\t"
  68846. "lsl r4, r7, #16\n\t"
  68847. "lsr r4, r4, #16\n\t"
  68848. "mul r3, r4, r3\n\t"
  68849. "lsr r4, r3, #16\n\t"
  68850. "lsl r3, r3, #16\n\t"
  68851. "adds r8, r8, r3\n\t"
  68852. "adcs r9, r9, r4\n\t"
  68853. "adc r10, r10, #0\n\t"
  68854. /* A[2] * A[6] */
  68855. "ldr r6, [%[a], #8]\n\t"
  68856. "ldr r7, [%[a], #24]\n\t"
  68857. "lsl r3, r6, #16\n\t"
  68858. "lsl r4, r7, #16\n\t"
  68859. "lsr r3, r3, #16\n\t"
  68860. "lsr r4, r4, #16\n\t"
  68861. "mul r4, r3, r4\n\t"
  68862. "adds r8, r8, r4\n\t"
  68863. "adcs r9, r9, #0\n\t"
  68864. "adc r10, r5, r10\n\t"
  68865. "lsr r4, r7, #16\n\t"
  68866. "mul r3, r4, r3\n\t"
  68867. "lsr r4, r3, #16\n\t"
  68868. "lsl r3, r3, #16\n\t"
  68869. "adds r8, r8, r3\n\t"
  68870. "adcs r9, r9, r4\n\t"
  68871. "adc r10, r10, #0\n\t"
  68872. "lsr r3, r6, #16\n\t"
  68873. "lsr r4, r7, #16\n\t"
  68874. "mul r4, r3, r4\n\t"
  68875. "adds r9, r9, r4\n\t"
  68876. "adc r10, r10, #0\n\t"
  68877. "lsl r4, r7, #16\n\t"
  68878. "lsr r4, r4, #16\n\t"
  68879. "mul r3, r4, r3\n\t"
  68880. "lsr r4, r3, #16\n\t"
  68881. "lsl r3, r3, #16\n\t"
  68882. "adds r8, r8, r3\n\t"
  68883. "adcs r9, r9, r4\n\t"
  68884. "adc r10, r10, #0\n\t"
  68885. /* A[1] * A[7] */
  68886. "ldr r6, [%[a], #4]\n\t"
  68887. "ldr r7, [%[a], #28]\n\t"
  68888. "lsl r3, r6, #16\n\t"
  68889. "lsl r4, r7, #16\n\t"
  68890. "lsr r3, r3, #16\n\t"
  68891. "lsr r4, r4, #16\n\t"
  68892. "mul r4, r3, r4\n\t"
  68893. "adds r8, r8, r4\n\t"
  68894. "adcs r9, r9, #0\n\t"
  68895. "adc r10, r5, r10\n\t"
  68896. "lsr r4, r7, #16\n\t"
  68897. "mul r3, r4, r3\n\t"
  68898. "lsr r4, r3, #16\n\t"
  68899. "lsl r3, r3, #16\n\t"
  68900. "adds r8, r8, r3\n\t"
  68901. "adcs r9, r9, r4\n\t"
  68902. "adc r10, r10, #0\n\t"
  68903. "lsr r3, r6, #16\n\t"
  68904. "lsr r4, r7, #16\n\t"
  68905. "mul r4, r3, r4\n\t"
  68906. "adds r9, r9, r4\n\t"
  68907. "adc r10, r10, #0\n\t"
  68908. "lsl r4, r7, #16\n\t"
  68909. "lsr r4, r4, #16\n\t"
  68910. "mul r3, r4, r3\n\t"
  68911. "lsr r4, r3, #16\n\t"
  68912. "lsl r3, r3, #16\n\t"
  68913. "adds r8, r8, r3\n\t"
  68914. "adcs r9, r9, r4\n\t"
  68915. "adc r10, r10, #0\n\t"
  68916. "str r8, [sp, #32]\n\t"
  68917. /* A[2] * A[7] */
  68918. "ldr r6, [%[a], #8]\n\t"
  68919. "lsl r3, r6, #16\n\t"
  68920. "lsl r4, r7, #16\n\t"
  68921. "lsr r3, r3, #16\n\t"
  68922. "lsr r4, r4, #16\n\t"
  68923. "mul r4, r3, r4\n\t"
  68924. "adds r9, r9, r4\n\t"
  68925. "adcs r10, r10, #0\n\t"
  68926. "adc lr, r5, #0\n\t"
  68927. "lsr r4, r7, #16\n\t"
  68928. "mul r3, r4, r3\n\t"
  68929. "lsr r4, r3, #16\n\t"
  68930. "lsl r3, r3, #16\n\t"
  68931. "adds r9, r9, r3\n\t"
  68932. "adcs r10, r10, r4\n\t"
  68933. "adc lr, lr, #0\n\t"
  68934. "lsr r3, r6, #16\n\t"
  68935. "lsr r4, r7, #16\n\t"
  68936. "mul r4, r3, r4\n\t"
  68937. "adds r10, r10, r4\n\t"
  68938. "adc lr, lr, #0\n\t"
  68939. "lsl r4, r7, #16\n\t"
  68940. "lsr r4, r4, #16\n\t"
  68941. "mul r3, r4, r3\n\t"
  68942. "lsr r4, r3, #16\n\t"
  68943. "lsl r3, r3, #16\n\t"
  68944. "adds r9, r9, r3\n\t"
  68945. "adcs r10, r10, r4\n\t"
  68946. "adc lr, lr, #0\n\t"
  68947. /* A[3] * A[6] */
  68948. "ldr r6, [%[a], #12]\n\t"
  68949. "ldr r7, [%[a], #24]\n\t"
  68950. "lsl r3, r6, #16\n\t"
  68951. "lsl r4, r7, #16\n\t"
  68952. "lsr r3, r3, #16\n\t"
  68953. "lsr r4, r4, #16\n\t"
  68954. "mul r4, r3, r4\n\t"
  68955. "adds r9, r9, r4\n\t"
  68956. "adcs r10, r10, #0\n\t"
  68957. "adc lr, r5, lr\n\t"
  68958. "lsr r4, r7, #16\n\t"
  68959. "mul r3, r4, r3\n\t"
  68960. "lsr r4, r3, #16\n\t"
  68961. "lsl r3, r3, #16\n\t"
  68962. "adds r9, r9, r3\n\t"
  68963. "adcs r10, r10, r4\n\t"
  68964. "adc lr, lr, #0\n\t"
  68965. "lsr r3, r6, #16\n\t"
  68966. "lsr r4, r7, #16\n\t"
  68967. "mul r4, r3, r4\n\t"
  68968. "adds r10, r10, r4\n\t"
  68969. "adc lr, lr, #0\n\t"
  68970. "lsl r4, r7, #16\n\t"
  68971. "lsr r4, r4, #16\n\t"
  68972. "mul r3, r4, r3\n\t"
  68973. "lsr r4, r3, #16\n\t"
  68974. "lsl r3, r3, #16\n\t"
  68975. "adds r9, r9, r3\n\t"
  68976. "adcs r10, r10, r4\n\t"
  68977. "adc lr, lr, #0\n\t"
  68978. /* A[4] * A[5] */
  68979. "ldr r6, [%[a], #16]\n\t"
  68980. "ldr r7, [%[a], #20]\n\t"
  68981. "lsl r3, r6, #16\n\t"
  68982. "lsl r4, r7, #16\n\t"
  68983. "lsr r3, r3, #16\n\t"
  68984. "lsr r4, r4, #16\n\t"
  68985. "mul r4, r3, r4\n\t"
  68986. "adds r9, r9, r4\n\t"
  68987. "adcs r10, r10, #0\n\t"
  68988. "adc lr, r5, lr\n\t"
  68989. "lsr r4, r7, #16\n\t"
  68990. "mul r3, r4, r3\n\t"
  68991. "lsr r4, r3, #16\n\t"
  68992. "lsl r3, r3, #16\n\t"
  68993. "adds r9, r9, r3\n\t"
  68994. "adcs r10, r10, r4\n\t"
  68995. "adc lr, lr, #0\n\t"
  68996. "lsr r3, r6, #16\n\t"
  68997. "lsr r4, r7, #16\n\t"
  68998. "mul r4, r3, r4\n\t"
  68999. "adds r10, r10, r4\n\t"
  69000. "adc lr, lr, #0\n\t"
  69001. "lsl r4, r7, #16\n\t"
  69002. "lsr r4, r4, #16\n\t"
  69003. "mul r3, r4, r3\n\t"
  69004. "lsr r4, r3, #16\n\t"
  69005. "lsl r3, r3, #16\n\t"
  69006. "adds r9, r9, r3\n\t"
  69007. "adcs r10, r10, r4\n\t"
  69008. "adc lr, lr, #0\n\t"
  69009. "str r9, [sp, #36]\n\t"
  69010. /* A[4] * A[6] */
  69011. "ldr r7, [%[a], #24]\n\t"
  69012. "lsl r3, r6, #16\n\t"
  69013. "lsl r4, r7, #16\n\t"
  69014. "lsr r3, r3, #16\n\t"
  69015. "lsr r4, r4, #16\n\t"
  69016. "mul r4, r3, r4\n\t"
  69017. "adds r10, r10, r4\n\t"
  69018. "adcs lr, lr, #0\n\t"
  69019. "adc r8, r5, #0\n\t"
  69020. "lsr r4, r7, #16\n\t"
  69021. "mul r3, r4, r3\n\t"
  69022. "lsr r4, r3, #16\n\t"
  69023. "lsl r3, r3, #16\n\t"
  69024. "adds r10, r10, r3\n\t"
  69025. "adcs lr, lr, r4\n\t"
  69026. "adc r8, r8, #0\n\t"
  69027. "lsr r3, r6, #16\n\t"
  69028. "lsr r4, r7, #16\n\t"
  69029. "mul r4, r3, r4\n\t"
  69030. "adds lr, lr, r4\n\t"
  69031. "adc r8, r8, #0\n\t"
  69032. "lsl r4, r7, #16\n\t"
  69033. "lsr r4, r4, #16\n\t"
  69034. "mul r3, r4, r3\n\t"
  69035. "lsr r4, r3, #16\n\t"
  69036. "lsl r3, r3, #16\n\t"
  69037. "adds r10, r10, r3\n\t"
  69038. "adcs lr, lr, r4\n\t"
  69039. "adc r8, r8, #0\n\t"
  69040. /* A[3] * A[7] */
  69041. "ldr r6, [%[a], #12]\n\t"
  69042. "ldr r7, [%[a], #28]\n\t"
  69043. "lsl r3, r6, #16\n\t"
  69044. "lsl r4, r7, #16\n\t"
  69045. "lsr r3, r3, #16\n\t"
  69046. "lsr r4, r4, #16\n\t"
  69047. "mul r4, r3, r4\n\t"
  69048. "adds r10, r10, r4\n\t"
  69049. "adcs lr, lr, #0\n\t"
  69050. "adc r8, r5, r8\n\t"
  69051. "lsr r4, r7, #16\n\t"
  69052. "mul r3, r4, r3\n\t"
  69053. "lsr r4, r3, #16\n\t"
  69054. "lsl r3, r3, #16\n\t"
  69055. "adds r10, r10, r3\n\t"
  69056. "adcs lr, lr, r4\n\t"
  69057. "adc r8, r8, #0\n\t"
  69058. "lsr r3, r6, #16\n\t"
  69059. "lsr r4, r7, #16\n\t"
  69060. "mul r4, r3, r4\n\t"
  69061. "adds lr, lr, r4\n\t"
  69062. "adc r8, r8, #0\n\t"
  69063. "lsl r4, r7, #16\n\t"
  69064. "lsr r4, r4, #16\n\t"
  69065. "mul r3, r4, r3\n\t"
  69066. "lsr r4, r3, #16\n\t"
  69067. "lsl r3, r3, #16\n\t"
  69068. "adds r10, r10, r3\n\t"
  69069. "adcs lr, lr, r4\n\t"
  69070. "adc r8, r8, #0\n\t"
  69071. "str r10, [sp, #40]\n\t"
  69072. /* A[4] * A[7] */
  69073. "ldr r6, [%[a], #16]\n\t"
  69074. "lsl r3, r6, #16\n\t"
  69075. "lsl r4, r7, #16\n\t"
  69076. "lsr r3, r3, #16\n\t"
  69077. "lsr r4, r4, #16\n\t"
  69078. "mul r4, r3, r4\n\t"
  69079. "adds lr, lr, r4\n\t"
  69080. "adcs r8, r8, #0\n\t"
  69081. "adc r9, r5, #0\n\t"
  69082. "lsr r4, r7, #16\n\t"
  69083. "mul r3, r4, r3\n\t"
  69084. "lsr r4, r3, #16\n\t"
  69085. "lsl r3, r3, #16\n\t"
  69086. "adds lr, lr, r3\n\t"
  69087. "adcs r8, r8, r4\n\t"
  69088. "adc r9, r9, #0\n\t"
  69089. "lsr r3, r6, #16\n\t"
  69090. "lsr r4, r7, #16\n\t"
  69091. "mul r4, r3, r4\n\t"
  69092. "adds r8, r8, r4\n\t"
  69093. "adc r9, r9, #0\n\t"
  69094. "lsl r4, r7, #16\n\t"
  69095. "lsr r4, r4, #16\n\t"
  69096. "mul r3, r4, r3\n\t"
  69097. "lsr r4, r3, #16\n\t"
  69098. "lsl r3, r3, #16\n\t"
  69099. "adds lr, lr, r3\n\t"
  69100. "adcs r8, r8, r4\n\t"
  69101. "adc r9, r9, #0\n\t"
  69102. /* A[5] * A[6] */
  69103. "ldr r6, [%[a], #20]\n\t"
  69104. "ldr r7, [%[a], #24]\n\t"
  69105. "lsl r3, r6, #16\n\t"
  69106. "lsl r4, r7, #16\n\t"
  69107. "lsr r3, r3, #16\n\t"
  69108. "lsr r4, r4, #16\n\t"
  69109. "mul r4, r3, r4\n\t"
  69110. "adds lr, lr, r4\n\t"
  69111. "adcs r8, r8, #0\n\t"
  69112. "adc r9, r5, r9\n\t"
  69113. "lsr r4, r7, #16\n\t"
  69114. "mul r3, r4, r3\n\t"
  69115. "lsr r4, r3, #16\n\t"
  69116. "lsl r3, r3, #16\n\t"
  69117. "adds lr, lr, r3\n\t"
  69118. "adcs r8, r8, r4\n\t"
  69119. "adc r9, r9, #0\n\t"
  69120. "lsr r3, r6, #16\n\t"
  69121. "lsr r4, r7, #16\n\t"
  69122. "mul r4, r3, r4\n\t"
  69123. "adds r8, r8, r4\n\t"
  69124. "adc r9, r9, #0\n\t"
  69125. "lsl r4, r7, #16\n\t"
  69126. "lsr r4, r4, #16\n\t"
  69127. "mul r3, r4, r3\n\t"
  69128. "lsr r4, r3, #16\n\t"
  69129. "lsl r3, r3, #16\n\t"
  69130. "adds lr, lr, r3\n\t"
  69131. "adcs r8, r8, r4\n\t"
  69132. "adc r9, r9, #0\n\t"
  69133. "str lr, [sp, #44]\n\t"
  69134. /* A[5] * A[7] */
  69135. "ldr r7, [%[a], #28]\n\t"
  69136. "lsl r3, r6, #16\n\t"
  69137. "lsl r4, r7, #16\n\t"
  69138. "lsr r3, r3, #16\n\t"
  69139. "lsr r4, r4, #16\n\t"
  69140. "mul r4, r3, r4\n\t"
  69141. "adds r8, r8, r4\n\t"
  69142. "adcs r9, r9, #0\n\t"
  69143. "adc r10, r5, #0\n\t"
  69144. "lsr r4, r7, #16\n\t"
  69145. "mul r3, r4, r3\n\t"
  69146. "lsr r4, r3, #16\n\t"
  69147. "lsl r3, r3, #16\n\t"
  69148. "adds r8, r8, r3\n\t"
  69149. "adcs r9, r9, r4\n\t"
  69150. "adc r10, r10, #0\n\t"
  69151. "lsr r3, r6, #16\n\t"
  69152. "lsr r4, r7, #16\n\t"
  69153. "mul r4, r3, r4\n\t"
  69154. "adds r9, r9, r4\n\t"
  69155. "adc r10, r10, #0\n\t"
  69156. "lsl r4, r7, #16\n\t"
  69157. "lsr r4, r4, #16\n\t"
  69158. "mul r3, r4, r3\n\t"
  69159. "lsr r4, r3, #16\n\t"
  69160. "lsl r3, r3, #16\n\t"
  69161. "adds r8, r8, r3\n\t"
  69162. "adcs r9, r9, r4\n\t"
  69163. "adc r10, r10, #0\n\t"
  69164. "str r8, [sp, #48]\n\t"
  69165. /* A[6] * A[7] */
  69166. "ldr r6, [%[a], #24]\n\t"
  69167. "lsl r3, r6, #16\n\t"
  69168. "lsl r4, r7, #16\n\t"
  69169. "lsr r3, r3, #16\n\t"
  69170. "lsr r4, r4, #16\n\t"
  69171. "mul r4, r3, r4\n\t"
  69172. "adds r9, r9, r4\n\t"
  69173. "adc r10, r10, #0\n\t"
  69174. "lsr r4, r7, #16\n\t"
  69175. "mul r3, r4, r3\n\t"
  69176. "lsr r4, r3, #16\n\t"
  69177. "lsl r3, r3, #16\n\t"
  69178. "adds r9, r9, r3\n\t"
  69179. "adc r10, r10, r4\n\t"
  69180. "lsr r3, r6, #16\n\t"
  69181. "lsr r4, r7, #16\n\t"
  69182. "mul r4, r3, r4\n\t"
  69183. "add r10, r10, r4\n\t"
  69184. "lsl r4, r7, #16\n\t"
  69185. "lsr r4, r4, #16\n\t"
  69186. "mul r3, r4, r3\n\t"
  69187. "lsr r4, r3, #16\n\t"
  69188. "lsl r3, r3, #16\n\t"
  69189. "adds r9, r9, r3\n\t"
  69190. "adc r10, r10, r4\n\t"
  69191. "str r9, [sp, #52]\n\t"
  69192. "str r10, [sp, #56]\n\t"
  69193. /* Double */
  69194. "ldr r4, [sp, #4]\n\t"
  69195. "ldr r6, [sp, #8]\n\t"
  69196. "ldr r7, [sp, #12]\n\t"
  69197. "ldr r8, [sp, #16]\n\t"
  69198. "ldr r9, [sp, #20]\n\t"
  69199. "ldr r10, [sp, #24]\n\t"
  69200. "ldr lr, [sp, #28]\n\t"
  69201. "ldr r12, [sp, #32]\n\t"
  69202. "ldr r3, [sp, #36]\n\t"
  69203. "adds r4, r4, r4\n\t"
  69204. "adcs r6, r6, r6\n\t"
  69205. "adcs r7, r7, r7\n\t"
  69206. "adcs r8, r8, r8\n\t"
  69207. "adcs r9, r9, r9\n\t"
  69208. "adcs r10, r10, r10\n\t"
  69209. "adcs lr, lr, lr\n\t"
  69210. "adcs r12, r12, r12\n\t"
  69211. "adcs r3, r3, r3\n\t"
  69212. "str r4, [sp, #4]\n\t"
  69213. "str r6, [sp, #8]\n\t"
  69214. "str r7, [sp, #12]\n\t"
  69215. "str r8, [sp, #16]\n\t"
  69216. "str r9, [sp, #20]\n\t"
  69217. "str r10, [sp, #24]\n\t"
  69218. "str lr, [sp, #28]\n\t"
  69219. "str r12, [sp, #32]\n\t"
  69220. "str r3, [sp, #36]\n\t"
  69221. "ldr r4, [sp, #40]\n\t"
  69222. "ldr r6, [sp, #44]\n\t"
  69223. "ldr r7, [sp, #48]\n\t"
  69224. "ldr r8, [sp, #52]\n\t"
  69225. "ldr r9, [sp, #56]\n\t"
  69226. "adcs r4, r4, r4\n\t"
  69227. "adcs r6, r6, r6\n\t"
  69228. "adcs r7, r7, r7\n\t"
  69229. "adcs r8, r8, r8\n\t"
  69230. "adcs r9, r9, r9\n\t"
  69231. "str r4, [sp, #40]\n\t"
  69232. "str r6, [sp, #44]\n\t"
  69233. "str r7, [sp, #48]\n\t"
  69234. "str r8, [sp, #52]\n\t"
  69235. "str r9, [sp, #56]\n\t"
  69236. "adc r10, r5, #0\n\t"
  69237. "str r10, [sp, #60]\n\t"
  69238. "ldr r4, [sp, #4]\n\t"
  69239. "ldr r5, [sp, #8]\n\t"
  69240. "ldr r12, [sp, #12]\n\t"
  69241. /* A[0] * A[0] */
  69242. "ldr r6, [%[a]]\n\t"
  69243. "lsr r7, r6, #16\n\t"
  69244. "lsl r6, r6, #16\n\t"
  69245. "lsr r6, r6, #16\n\t"
  69246. "mul r8, r6, r6\n\t"
  69247. "mul r9, r7, r7\n\t"
  69248. "mul r6, r7, r6\n\t"
  69249. "lsr r7, r6, #15\n\t"
  69250. "lsl r6, r6, #17\n\t"
  69251. "adds r8, r8, r6\n\t"
  69252. "adc r9, r9, r7\n\t"
  69253. /* A[1] * A[1] */
  69254. "ldr r6, [%[a], #4]\n\t"
  69255. "lsr r7, r6, #16\n\t"
  69256. "lsl r6, r6, #16\n\t"
  69257. "lsr r6, r6, #16\n\t"
  69258. "mul r10, r6, r6\n\t"
  69259. "mul lr, r7, r7\n\t"
  69260. "mul r6, r7, r6\n\t"
  69261. "lsr r7, r6, #15\n\t"
  69262. "lsl r6, r6, #17\n\t"
  69263. "adds r10, r10, r6\n\t"
  69264. "adc lr, lr, r7\n\t"
  69265. "adds r9, r9, r4\n\t"
  69266. "adcs r10, r10, r5\n\t"
  69267. "adcs lr, lr, r12\n\t"
  69268. "str r8, [sp]\n\t"
  69269. "str r9, [sp, #4]\n\t"
  69270. "str r10, [sp, #8]\n\t"
  69271. "str lr, [sp, #12]\n\t"
  69272. "ldr r3, [sp, #16]\n\t"
  69273. "ldr r4, [sp, #20]\n\t"
  69274. "ldr r5, [sp, #24]\n\t"
  69275. "ldr r12, [sp, #28]\n\t"
  69276. /* A[2] * A[2] */
  69277. "ldr r6, [%[a], #8]\n\t"
  69278. "lsr r7, r6, #16\n\t"
  69279. "lsl r6, r6, #16\n\t"
  69280. "lsr r6, r6, #16\n\t"
  69281. "mul r8, r6, r6\n\t"
  69282. "mul r9, r7, r7\n\t"
  69283. "mul r6, r7, r6\n\t"
  69284. "lsr r7, r6, #15\n\t"
  69285. "lsl r6, r6, #17\n\t"
  69286. "adcs r8, r8, r6\n\t"
  69287. "adc r9, r9, r7\n\t"
  69288. /* A[3] * A[3] */
  69289. "ldr r6, [%[a], #12]\n\t"
  69290. "lsr r7, r6, #16\n\t"
  69291. "lsl r6, r6, #16\n\t"
  69292. "lsr r6, r6, #16\n\t"
  69293. "mul r10, r6, r6\n\t"
  69294. "mul lr, r7, r7\n\t"
  69295. "mul r6, r7, r6\n\t"
  69296. "lsr r7, r6, #15\n\t"
  69297. "lsl r6, r6, #17\n\t"
  69298. "adds r10, r10, r6\n\t"
  69299. "adc lr, lr, r7\n\t"
  69300. #if !(defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4))
  69301. "adcs r8, r8, r3\n\t"
  69302. "adcs r9, r9, r4\n\t"
  69303. #else
  69304. "adds r8, r8, r3\n\t"
  69305. "adcs r9, r9, r4\n\t"
  69306. #endif
  69307. "adcs r10, r10, r5\n\t"
  69308. "adcs lr, lr, r12\n\t"
  69309. "str r8, [sp, #16]\n\t"
  69310. "str r9, [sp, #20]\n\t"
  69311. "str r10, [sp, #24]\n\t"
  69312. "str lr, [sp, #28]\n\t"
  69313. "ldr r3, [sp, #32]\n\t"
  69314. "ldr r4, [sp, #36]\n\t"
  69315. "ldr r5, [sp, #40]\n\t"
  69316. "ldr r12, [sp, #44]\n\t"
  69317. /* A[4] * A[4] */
  69318. "ldr r6, [%[a], #16]\n\t"
  69319. "lsr r7, r6, #16\n\t"
  69320. "lsl r6, r6, #16\n\t"
  69321. "lsr r6, r6, #16\n\t"
  69322. "mul r8, r6, r6\n\t"
  69323. "mul r9, r7, r7\n\t"
  69324. "mul r6, r7, r6\n\t"
  69325. "lsr r7, r6, #15\n\t"
  69326. "lsl r6, r6, #17\n\t"
  69327. "adcs r8, r8, r6\n\t"
  69328. "adc r9, r9, r7\n\t"
  69329. /* A[5] * A[5] */
  69330. "ldr r6, [%[a], #20]\n\t"
  69331. "lsr r7, r6, #16\n\t"
  69332. "lsl r6, r6, #16\n\t"
  69333. "lsr r6, r6, #16\n\t"
  69334. "mul r10, r6, r6\n\t"
  69335. "mul lr, r7, r7\n\t"
  69336. "mul r6, r7, r6\n\t"
  69337. "lsr r7, r6, #15\n\t"
  69338. "lsl r6, r6, #17\n\t"
  69339. "adds r10, r10, r6\n\t"
  69340. "adc lr, lr, r7\n\t"
  69341. #if !(defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4))
  69342. "adcs r8, r8, r3\n\t"
  69343. "adcs r9, r9, r4\n\t"
  69344. #else
  69345. "adds r8, r8, r3\n\t"
  69346. "adcs r9, r9, r4\n\t"
  69347. #endif
  69348. "adcs r10, r10, r5\n\t"
  69349. "adcs lr, lr, r12\n\t"
  69350. "str r8, [sp, #32]\n\t"
  69351. "str r9, [sp, #36]\n\t"
  69352. "str r10, [sp, #40]\n\t"
  69353. "str lr, [sp, #44]\n\t"
  69354. "ldr r3, [sp, #48]\n\t"
  69355. "ldr r4, [sp, #52]\n\t"
  69356. "ldr r5, [sp, #56]\n\t"
  69357. "ldr r12, [sp, #60]\n\t"
  69358. /* A[6] * A[6] */
  69359. "ldr r6, [%[a], #24]\n\t"
  69360. "lsr r7, r6, #16\n\t"
  69361. "lsl r6, r6, #16\n\t"
  69362. "lsr r6, r6, #16\n\t"
  69363. "mul r8, r6, r6\n\t"
  69364. "mul r9, r7, r7\n\t"
  69365. "mul r6, r7, r6\n\t"
  69366. "lsr r7, r6, #15\n\t"
  69367. "lsl r6, r6, #17\n\t"
  69368. "adcs r8, r8, r6\n\t"
  69369. "adc r9, r9, r7\n\t"
  69370. /* A[7] * A[7] */
  69371. "ldr r6, [%[a], #28]\n\t"
  69372. "lsr r7, r6, #16\n\t"
  69373. "lsl r6, r6, #16\n\t"
  69374. "lsr r6, r6, #16\n\t"
  69375. "mul r10, r6, r6\n\t"
  69376. "mul lr, r7, r7\n\t"
  69377. "mul r6, r7, r6\n\t"
  69378. "lsr r7, r6, #15\n\t"
  69379. "lsl r6, r6, #17\n\t"
  69380. "adds r10, r10, r6\n\t"
  69381. "adc lr, lr, r7\n\t"
  69382. #if !(defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4))
  69383. "adcs r8, r8, r3\n\t"
  69384. "adcs r9, r9, r4\n\t"
  69385. #else
  69386. "adds r8, r8, r3\n\t"
  69387. "adcs r9, r9, r4\n\t"
  69388. #endif
  69389. "adcs r10, r10, r5\n\t"
  69390. "adc lr, lr, r12\n\t"
  69391. "str r8, [sp, #48]\n\t"
  69392. "str r9, [sp, #52]\n\t"
  69393. "str r10, [sp, #56]\n\t"
  69394. "str lr, [sp, #60]\n\t"
  69395. "str %[r], [sp, #64]\n\t"
  69396. /* Start Reduction */
  69397. "ldm sp, {r5, r6, r7, r8, r9, r10, r11, r12}\n\t"
  69398. "mov r3, r11\n\t"
  69399. "mov r4, r12\n\t"
  69400. /* mu = a[0]-a[7] + a[0]-a[4] << 96 + (a[0]-a[1] * 2) << 192 */
  69401. /* - a[0] << 224 */
  69402. /* + (a[0]-a[1] * 2) << (6 * 32) */
  69403. "adds r11, r11, r5\n\t"
  69404. "adc r12, r12, r6\n\t"
  69405. "adds r11, r11, r5\n\t"
  69406. "adc r12, r12, r6\n\t"
  69407. /* - a[0] << (7 * 32) */
  69408. "sub r12, r12, r5\n\t"
  69409. /* + a[0]-a[4] << (3 * 32) */
  69410. "mov r0, r8\n\t"
  69411. "mov r1, r9\n\t"
  69412. "mov r2, r10\n\t"
  69413. "adds r8, r8, r5\n\t"
  69414. "adcs r9, r9, r6\n\t"
  69415. "adcs r10, r10, r7\n\t"
  69416. "adcs r11, r11, r0\n\t"
  69417. "adc r12, r12, r1\n\t"
  69418. /* a += mu * m */
  69419. /* += mu * ((1 << 256) - (1 << 224) + (1 << 192) + (1 << 96) - 1) */
  69420. /* a[0] = = t[0] */
  69421. /* a[1] = = t[1] */
  69422. /* a[2] = = t[2] */
  69423. /* a[3] += t[0] = t[3] */
  69424. /* a[4] += t[1] = t[4] */
  69425. /* a[5] += t[2] = t[5] */
  69426. /* a[6] += t[0] + t[3] = t[6] */
  69427. /* a[7] += t[1] + t[4] = t[7] + t[0] */
  69428. "adds r0, r0, r5\n\t"
  69429. "adcs r1, r1, r6\n\t"
  69430. "adcs r2, r2, r7\n\t"
  69431. "adcs r3, r3, r8\n\t"
  69432. "adcs r4, r4, r9\n\t"
  69433. "mov lr, #0\n\t"
  69434. "adc lr, lr, #0\n\t"
  69435. "adds r3, r3, r5\n\t"
  69436. "adcs r4, r4, r6\n\t"
  69437. "adc lr, lr, #0\n\t"
  69438. "str r4, [sp, #28]\n\t"
  69439. /* a[8] += t[0] + t[2] + t[5] + carry */
  69440. /* a[9] += t[1] + t[3] + t[6] */
  69441. /* a[10] += t[2] + t[4] + t[7] */
  69442. "add r0, sp, #32\n\t"
  69443. "ldm r0, {r2, r3, r4}\n\t"
  69444. "adds r2, r2, lr\n\t"
  69445. "adcs r3, r3, #0\n\t"
  69446. "adcs r4, r4, #0\n\t"
  69447. "mov lr, #0\n\t"
  69448. "adc lr, lr, #0\n\t"
  69449. "adds r2, r2, r5\n\t"
  69450. "adcs r3, r3, r6\n\t"
  69451. "adcs r4, r4, r7\n\t"
  69452. "adc lr, lr, #0\n\t"
  69453. "adds r2, r2, r7\n\t"
  69454. "adcs r3, r3, r8\n\t"
  69455. "adcs r4, r4, r9\n\t"
  69456. "adc lr, lr, #0\n\t"
  69457. "adds r2, r2, r10\n\t"
  69458. "adcs r3, r3, r11\n\t"
  69459. "adcs r4, r4, r12\n\t"
  69460. "adc lr, lr, #0\n\t"
  69461. "stm r0!, {r2, r3, r4}\n\t"
  69462. /* a[11] += t[3] + t[5] + carry */
  69463. /* a[12] += t[4] + t[6] */
  69464. /* a[13] += t[5] + t[7] */
  69465. /* a[14] += t[6] */
  69466. /* a[15] += t[7] */
  69467. "ldm r0, {r0, r1, r2, r3, r4}\n\t"
  69468. "adds r0, r0, lr\n\t"
  69469. "adcs r1, r1, #0\n\t"
  69470. "adcs r2, r2, #0\n\t"
  69471. "adcs r3, r3, #0\n\t"
  69472. "adcs r4, r4, #0\n\t"
  69473. "mov lr, #0\n\t"
  69474. "adc lr, lr, #0\n\t"
  69475. "adds r0, r0, r8\n\t"
  69476. "adcs r1, r1, r9\n\t"
  69477. "adcs r2, r2, r10\n\t"
  69478. "adcs r3, r3, r11\n\t"
  69479. "adcs r4, r4, r12\n\t"
  69480. "adc lr, lr, #0\n\t"
  69481. "adds r0, r0, r10\n\t"
  69482. "adcs r1, r1, r11\n\t"
  69483. "adcs r2, r2, r12\n\t"
  69484. "adcs r3, r3, #0\n\t"
  69485. "adcs r4, r4, #0\n\t"
  69486. "adc lr, lr, #0\n\t"
  69487. "str r0, [sp, #44]\n\t"
  69488. "str r1, [sp, #48]\n\t"
  69489. "str r2, [sp, #52]\n\t"
  69490. "str r3, [sp, #56]\n\t"
  69491. /* a[7..15] - t[0..7] */
  69492. "add r0, sp, #28\n\t"
  69493. "ldm r0, {r0, r1, r2, r3}\n\t"
  69494. "subs r0, r0, r5\n\t"
  69495. "sbcs r1, r1, r6\n\t"
  69496. "sbcs r2, r2, r7\n\t"
  69497. "sbcs r3, r3, r8\n\t"
  69498. "add r0, sp, #44\n\t"
  69499. "mov r8, r4\n\t"
  69500. "ldm r0, {r4, r5, r6, r7}\n\t"
  69501. "sbcs r4, r4, r9\n\t"
  69502. "sbcs r5, r5, r10\n\t"
  69503. "sbcs r6, r6, r11\n\t"
  69504. "sbcs r7, r7, r12\n\t"
  69505. "sbcs r8, r8, #0\n\t"
  69506. "sbc lr, lr, #0\n\t"
  69507. /* mask m and sub from result if overflow */
  69508. "rsb lr, lr, #0\n\t"
  69509. "subs r1, r1, lr\n\t"
  69510. "sbcs r2, r2, lr\n\t"
  69511. "sbcs r3, r3, lr\n\t"
  69512. "sbcs r4, r4, #0\n\t"
  69513. "sbcs r5, r5, #0\n\t"
  69514. "sbcs r6, r6, #0\n\t"
  69515. "sbcs r7, r7, lr, lsr #31\n\t"
  69516. "sbc r8, r8, lr\n\t"
  69517. "ldr %[r], [sp, #64]\n\t"
  69518. "stm %[r], {r1, r2, r3, r4, r5, r6, r7, r8}\n\t"
  69519. "add sp, sp, #0x44\n\t"
  69520. : [r] "+r" (r), [a] "+r" (a)
  69521. :
  69522. : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r12", "r8", "r9", "r10", "lr", "cc"
  69523. );
  69524. (void)m_p;
  69525. (void)mp_p;
  69526. }
  69527. #elif defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  69528. /* Square the Montgomery form number mod the modulus (prime). (r = a * a mod m)
  69529. *
  69530. * r Result of squaring.
  69531. * a Number to square in Montgomery form.
  69532. * m Modulus (prime).
  69533. * mp Montgomery multiplier.
  69534. */
  69535. 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)
  69536. {
  69537. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  69538. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  69539. __asm__ __volatile__ (
  69540. "sub sp, sp, #0x44\n\t"
  69541. "str %[r], [sp, #64]\n\t"
  69542. "mov %[r], #0\n\t"
  69543. "ldr r12, [%[a]]\n\t"
  69544. /* A[0] * A[1] */
  69545. "ldr lr, [%[a], #4]\n\t"
  69546. "umull r4, r5, r12, lr\n\t"
  69547. /* A[0] * A[3] */
  69548. "ldr lr, [%[a], #12]\n\t"
  69549. "umull r6, r7, r12, lr\n\t"
  69550. /* A[0] * A[5] */
  69551. "ldr lr, [%[a], #20]\n\t"
  69552. "umull r8, r9, r12, lr\n\t"
  69553. /* A[0] * A[7] */
  69554. "ldr lr, [%[a], #28]\n\t"
  69555. "umull r10, r3, r12, lr\n\t"
  69556. /* A[0] * A[2] */
  69557. "ldr lr, [%[a], #8]\n\t"
  69558. "mov r11, #0\n\t"
  69559. "umlal r5, r11, r12, lr\n\t"
  69560. "adds r6, r6, r11\n\t"
  69561. /* A[0] * A[4] */
  69562. "ldr lr, [%[a], #16]\n\t"
  69563. "adcs r7, r7, #0\n\t"
  69564. "adc r11, %[r], #0\n\t"
  69565. "umlal r7, r11, r12, lr\n\t"
  69566. "adds r8, r8, r11\n\t"
  69567. /* A[0] * A[6] */
  69568. "ldr lr, [%[a], #24]\n\t"
  69569. "adcs r9, r9, #0\n\t"
  69570. "adc r11, %[r], #0\n\t"
  69571. "umlal r9, r11, r12, lr\n\t"
  69572. "adds r10, r10, r11\n\t"
  69573. "adcs r3, r3, #0\n\t"
  69574. "str r4, [sp, #4]\n\t"
  69575. "str r5, [sp, #8]\n\t"
  69576. /* A[1] * A[2] */
  69577. "ldr r12, [%[a], #4]\n\t"
  69578. "ldr lr, [%[a], #8]\n\t"
  69579. "mov r11, #0\n\t"
  69580. "umlal r6, r11, r12, lr\n\t"
  69581. "str r6, [sp, #12]\n\t"
  69582. "adds r7, r7, r11\n\t"
  69583. /* A[1] * A[3] */
  69584. "ldr lr, [%[a], #12]\n\t"
  69585. "adc r11, %[r], #0\n\t"
  69586. "umlal r7, r11, r12, lr\n\t"
  69587. "str r7, [sp, #16]\n\t"
  69588. "adds r8, r8, r11\n\t"
  69589. /* A[1] * A[4] */
  69590. "ldr lr, [%[a], #16]\n\t"
  69591. "adc r11, %[r], #0\n\t"
  69592. "umlal r8, r11, r12, lr\n\t"
  69593. "adds r9, r9, r11\n\t"
  69594. /* A[1] * A[5] */
  69595. "ldr lr, [%[a], #20]\n\t"
  69596. "adc r11, %[r], #0\n\t"
  69597. "umlal r9, r11, r12, lr\n\t"
  69598. "adds r10, r10, r11\n\t"
  69599. /* A[1] * A[6] */
  69600. "ldr lr, [%[a], #24]\n\t"
  69601. "adc r11, %[r], #0\n\t"
  69602. "umlal r10, r11, r12, lr\n\t"
  69603. "adds r3, r3, r11\n\t"
  69604. /* A[1] * A[7] */
  69605. "ldr lr, [%[a], #28]\n\t"
  69606. "adc r4, %[r], #0\n\t"
  69607. "umlal r3, r4, r12, lr\n\t"
  69608. /* A[2] * A[3] */
  69609. "ldr r12, [%[a], #8]\n\t"
  69610. "ldr lr, [%[a], #12]\n\t"
  69611. "mov r11, #0\n\t"
  69612. "umlal r8, r11, r12, lr\n\t"
  69613. "str r8, [sp, #20]\n\t"
  69614. "adds r9, r9, r11\n\t"
  69615. /* A[2] * A[4] */
  69616. "ldr lr, [%[a], #16]\n\t"
  69617. "adc r11, %[r], #0\n\t"
  69618. "umlal r9, r11, r12, lr\n\t"
  69619. "str r9, [sp, #24]\n\t"
  69620. "adds r10, r10, r11\n\t"
  69621. /* A[2] * A[5] */
  69622. "ldr lr, [%[a], #20]\n\t"
  69623. "adc r11, %[r], #0\n\t"
  69624. "umlal r10, r11, r12, lr\n\t"
  69625. "adds r3, r3, r11\n\t"
  69626. /* A[2] * A[6] */
  69627. "ldr lr, [%[a], #24]\n\t"
  69628. "adc r11, %[r], #0\n\t"
  69629. "umlal r3, r11, r12, lr\n\t"
  69630. "adds r4, r4, r11\n\t"
  69631. /* A[2] * A[7] */
  69632. "ldr lr, [%[a], #28]\n\t"
  69633. "adc r5, %[r], #0\n\t"
  69634. "umlal r4, r5, r12, lr\n\t"
  69635. /* A[3] * A[4] */
  69636. "ldr r12, [%[a], #12]\n\t"
  69637. "ldr lr, [%[a], #16]\n\t"
  69638. "mov r11, #0\n\t"
  69639. "umlal r10, r11, r12, lr\n\t"
  69640. "str r10, [sp, #28]\n\t"
  69641. "adds r3, r3, r11\n\t"
  69642. /* A[3] * A[5] */
  69643. "ldr lr, [%[a], #20]\n\t"
  69644. "adc r11, %[r], #0\n\t"
  69645. "umlal r3, r11, r12, lr\n\t"
  69646. "adds r4, r4, r11\n\t"
  69647. /* A[3] * A[6] */
  69648. "ldr lr, [%[a], #24]\n\t"
  69649. "adc r11, %[r], #0\n\t"
  69650. "umlal r4, r11, r12, lr\n\t"
  69651. "adds r5, r5, r11\n\t"
  69652. /* A[3] * A[7] */
  69653. "ldr lr, [%[a], #28]\n\t"
  69654. "adc r6, %[r], #0\n\t"
  69655. "umlal r5, r6, r12, lr\n\t"
  69656. /* A[4] * A[5] */
  69657. "ldr r12, [%[a], #16]\n\t"
  69658. "ldr lr, [%[a], #20]\n\t"
  69659. "mov r11, #0\n\t"
  69660. "umlal r4, r11, r12, lr\n\t"
  69661. "adds r5, r5, r11\n\t"
  69662. /* A[4] * A[6] */
  69663. "ldr lr, [%[a], #24]\n\t"
  69664. "adc r11, %[r], #0\n\t"
  69665. "umlal r5, r11, r12, lr\n\t"
  69666. "adds r6, r6, r11\n\t"
  69667. /* A[4] * A[7] */
  69668. "ldr lr, [%[a], #28]\n\t"
  69669. "adc r7, %[r], #0\n\t"
  69670. "umlal r6, r7, r12, lr\n\t"
  69671. /* A[5] * A[6] */
  69672. "ldr r12, [%[a], #20]\n\t"
  69673. "ldr lr, [%[a], #24]\n\t"
  69674. "mov r11, #0\n\t"
  69675. "umlal r6, r11, r12, lr\n\t"
  69676. "adds r7, r7, r11\n\t"
  69677. /* A[5] * A[7] */
  69678. "ldr lr, [%[a], #28]\n\t"
  69679. "adc r8, %[r], #0\n\t"
  69680. "umlal r7, r8, r12, lr\n\t"
  69681. /* A[6] * A[7] */
  69682. "ldr r12, [%[a], #24]\n\t"
  69683. "ldr lr, [%[a], #28]\n\t"
  69684. "mov r9, #0\n\t"
  69685. "umlal r8, r9, r12, lr\n\t"
  69686. "add lr, sp, #32\n\t"
  69687. "stm lr, {r3, r4, r5, r6, r7, r8, r9}\n\t"
  69688. "add lr, sp, #4\n\t"
  69689. "ldm lr, {r4, r5, r6, r7, r8, r9, r10}\n\t"
  69690. "adds r4, r4, r4\n\t"
  69691. "adcs r5, r5, r5\n\t"
  69692. "adcs r6, r6, r6\n\t"
  69693. "adcs r7, r7, r7\n\t"
  69694. "adcs r8, r8, r8\n\t"
  69695. "adcs r9, r9, r9\n\t"
  69696. "adcs r10, r10, r10\n\t"
  69697. "stm lr!, {r4, r5, r6, r7, r8, r9, r10}\n\t"
  69698. "ldm lr, {r3, r4, r5, r6, r7, r8, r9}\n\t"
  69699. "adcs r3, r3, r3\n\t"
  69700. "adcs r4, r4, r4\n\t"
  69701. "adcs r5, r5, r5\n\t"
  69702. "adcs r6, r6, r6\n\t"
  69703. "adcs r7, r7, r7\n\t"
  69704. "adcs r8, r8, r8\n\t"
  69705. "adcs r9, r9, r9\n\t"
  69706. "adc r10, %[r], #0\n\t"
  69707. "stm lr, {r3, r4, r5, r6, r7, r8, r9, r10}\n\t"
  69708. "add lr, sp, #4\n\t"
  69709. "ldm lr, {r4, r5, r6, r7, r8, r9, r10}\n\t"
  69710. "mov lr, sp\n\t"
  69711. /* A[0] * A[0] */
  69712. "ldr r12, [%[a]]\n\t"
  69713. "umull r3, r11, r12, r12\n\t"
  69714. "adds r4, r4, r11\n\t"
  69715. /* A[1] * A[1] */
  69716. "ldr r12, [%[a], #4]\n\t"
  69717. "adcs r5, r5, #0\n\t"
  69718. "adc r11, %[r], #0\n\t"
  69719. "umlal r5, r11, r12, r12\n\t"
  69720. "adds r6, r6, r11\n\t"
  69721. /* A[2] * A[2] */
  69722. "ldr r12, [%[a], #8]\n\t"
  69723. "adcs r7, r7, #0\n\t"
  69724. "adc r11, %[r], #0\n\t"
  69725. "umlal r7, r11, r12, r12\n\t"
  69726. "adds r8, r8, r11\n\t"
  69727. /* A[3] * A[3] */
  69728. "ldr r12, [%[a], #12]\n\t"
  69729. "adcs r9, r9, #0\n\t"
  69730. "adc r11, %[r], #0\n\t"
  69731. "umlal r9, r11, r12, r12\n\t"
  69732. "adds r10, r10, r11\n\t"
  69733. "stm lr!, {r3, r4, r5, r6, r7, r8, r9, r10}\n\t"
  69734. "ldm lr, {r3, r4, r5, r6, r7, r8, r9, r10}\n\t"
  69735. /* A[4] * A[4] */
  69736. "ldr r12, [%[a], #16]\n\t"
  69737. "adcs r3, r3, #0\n\t"
  69738. "adc r11, %[r], #0\n\t"
  69739. "umlal r3, r11, r12, r12\n\t"
  69740. "adds r4, r4, r11\n\t"
  69741. /* A[5] * A[5] */
  69742. "ldr r12, [%[a], #20]\n\t"
  69743. "adcs r5, r5, #0\n\t"
  69744. "adc r11, %[r], #0\n\t"
  69745. "umlal r5, r11, r12, r12\n\t"
  69746. "adds r6, r6, r11\n\t"
  69747. /* A[6] * A[6] */
  69748. "ldr r12, [%[a], #24]\n\t"
  69749. "adcs r7, r7, #0\n\t"
  69750. "adc r11, %[r], #0\n\t"
  69751. "umlal r7, r11, r12, r12\n\t"
  69752. "adds r8, r8, r11\n\t"
  69753. /* A[7] * A[7] */
  69754. "ldr r12, [%[a], #28]\n\t"
  69755. "adcs r9, r9, #0\n\t"
  69756. "adc r10, r10, #0\n\t"
  69757. "umlal r9, r10, r12, r12\n\t"
  69758. "add lr, sp, #32\n\t"
  69759. "stm lr, {r3, r4, r5, r6, r7, r8, r9, r10}\n\t"
  69760. /* Start Reduction */
  69761. "ldm sp, {r5, r6, r7, r8, r9, r10, r11, r12}\n\t"
  69762. "mov r3, r11\n\t"
  69763. "mov r4, r12\n\t"
  69764. /* mu = a[0]-a[7] + a[0]-a[4] << 96 + (a[0]-a[1] * 2) << 192 */
  69765. /* - a[0] << 224 */
  69766. /* + (a[0]-a[1] * 2) << (6 * 32) */
  69767. "adds r11, r11, r5\n\t"
  69768. "adc r12, r12, r6\n\t"
  69769. "adds r11, r11, r5\n\t"
  69770. "adc r12, r12, r6\n\t"
  69771. /* - a[0] << (7 * 32) */
  69772. "sub r12, r12, r5\n\t"
  69773. /* + a[0]-a[4] << (3 * 32) */
  69774. "mov r0, r8\n\t"
  69775. "mov r1, r9\n\t"
  69776. "mov r2, r10\n\t"
  69777. "adds r8, r8, r5\n\t"
  69778. "adcs r9, r9, r6\n\t"
  69779. "adcs r10, r10, r7\n\t"
  69780. "adcs r11, r11, r0\n\t"
  69781. "adc r12, r12, r1\n\t"
  69782. /* a += mu * m */
  69783. /* += mu * ((1 << 256) - (1 << 224) + (1 << 192) + (1 << 96) - 1) */
  69784. /* a[0] = = t[0] */
  69785. /* a[1] = = t[1] */
  69786. /* a[2] = = t[2] */
  69787. /* a[3] += t[0] = t[3] */
  69788. /* a[4] += t[1] = t[4] */
  69789. /* a[5] += t[2] = t[5] */
  69790. /* a[6] += t[0] + t[3] = t[6] */
  69791. /* a[7] += t[1] + t[4] = t[7] + t[0] */
  69792. "adds r0, r0, r5\n\t"
  69793. "adcs r1, r1, r6\n\t"
  69794. "adcs r2, r2, r7\n\t"
  69795. "adcs r3, r3, r8\n\t"
  69796. "adcs r4, r4, r9\n\t"
  69797. "mov lr, #0\n\t"
  69798. "adc lr, lr, #0\n\t"
  69799. "adds r3, r3, r5\n\t"
  69800. "adcs r4, r4, r6\n\t"
  69801. "adc lr, lr, #0\n\t"
  69802. "str r4, [sp, #28]\n\t"
  69803. /* a[8] += t[0] + t[2] + t[5] + carry */
  69804. /* a[9] += t[1] + t[3] + t[6] */
  69805. /* a[10] += t[2] + t[4] + t[7] */
  69806. "add r0, sp, #32\n\t"
  69807. "ldm r0, {r2, r3, r4}\n\t"
  69808. "adds r2, r2, lr\n\t"
  69809. "adcs r3, r3, #0\n\t"
  69810. "adcs r4, r4, #0\n\t"
  69811. "mov lr, #0\n\t"
  69812. "adc lr, lr, #0\n\t"
  69813. "adds r2, r2, r5\n\t"
  69814. "adcs r3, r3, r6\n\t"
  69815. "adcs r4, r4, r7\n\t"
  69816. "adc lr, lr, #0\n\t"
  69817. "adds r2, r2, r7\n\t"
  69818. "adcs r3, r3, r8\n\t"
  69819. "adcs r4, r4, r9\n\t"
  69820. "adc lr, lr, #0\n\t"
  69821. "adds r2, r2, r10\n\t"
  69822. "adcs r3, r3, r11\n\t"
  69823. "adcs r4, r4, r12\n\t"
  69824. "adc lr, lr, #0\n\t"
  69825. "stm r0!, {r2, r3, r4}\n\t"
  69826. /* a[11] += t[3] + t[5] + carry */
  69827. /* a[12] += t[4] + t[6] */
  69828. /* a[13] += t[5] + t[7] */
  69829. /* a[14] += t[6] */
  69830. /* a[15] += t[7] */
  69831. "ldm r0, {r0, r1, r2, r3, r4}\n\t"
  69832. "adds r0, r0, lr\n\t"
  69833. "adcs r1, r1, #0\n\t"
  69834. "adcs r2, r2, #0\n\t"
  69835. "adcs r3, r3, #0\n\t"
  69836. "adcs r4, r4, #0\n\t"
  69837. "mov lr, #0\n\t"
  69838. "adc lr, lr, #0\n\t"
  69839. "adds r0, r0, r8\n\t"
  69840. "adcs r1, r1, r9\n\t"
  69841. "adcs r2, r2, r10\n\t"
  69842. "adcs r3, r3, r11\n\t"
  69843. "adcs r4, r4, r12\n\t"
  69844. "adc lr, lr, #0\n\t"
  69845. "adds r0, r0, r10\n\t"
  69846. "adcs r1, r1, r11\n\t"
  69847. "adcs r2, r2, r12\n\t"
  69848. "adcs r3, r3, #0\n\t"
  69849. "adcs r4, r4, #0\n\t"
  69850. "adc lr, lr, #0\n\t"
  69851. "str r0, [sp, #44]\n\t"
  69852. "str r1, [sp, #48]\n\t"
  69853. "str r2, [sp, #52]\n\t"
  69854. "str r3, [sp, #56]\n\t"
  69855. /* a[7..15] - t[0..7] */
  69856. "add r0, sp, #28\n\t"
  69857. "ldm r0, {r0, r1, r2, r3}\n\t"
  69858. "subs r0, r0, r5\n\t"
  69859. "sbcs r1, r1, r6\n\t"
  69860. "sbcs r2, r2, r7\n\t"
  69861. "sbcs r3, r3, r8\n\t"
  69862. "add r0, sp, #44\n\t"
  69863. "mov r8, r4\n\t"
  69864. "ldm r0, {r4, r5, r6, r7}\n\t"
  69865. "sbcs r4, r4, r9\n\t"
  69866. "sbcs r5, r5, r10\n\t"
  69867. "sbcs r6, r6, r11\n\t"
  69868. "sbcs r7, r7, r12\n\t"
  69869. "sbcs r8, r8, #0\n\t"
  69870. "sbc lr, lr, #0\n\t"
  69871. /* mask m and sub from result if overflow */
  69872. "rsb lr, lr, #0\n\t"
  69873. "subs r1, r1, lr\n\t"
  69874. "sbcs r2, r2, lr\n\t"
  69875. "sbcs r3, r3, lr\n\t"
  69876. "sbcs r4, r4, #0\n\t"
  69877. "sbcs r5, r5, #0\n\t"
  69878. "sbcs r6, r6, #0\n\t"
  69879. "sbcs r7, r7, lr, lsr #31\n\t"
  69880. "sbc r8, r8, lr\n\t"
  69881. "ldr %[r], [sp, #64]\n\t"
  69882. "stm %[r], {r1, r2, r3, r4, r5, r6, r7, r8}\n\t"
  69883. "add sp, sp, #0x44\n\t"
  69884. : [r] "+r" (r), [a] "+r" (a)
  69885. :
  69886. : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "lr", "cc"
  69887. );
  69888. (void)m_p;
  69889. (void)mp_p;
  69890. }
  69891. #else
  69892. /* Square the Montgomery form number mod the modulus (prime). (r = a * a mod m)
  69893. *
  69894. * r Result of squaring.
  69895. * a Number to square in Montgomery form.
  69896. * m Modulus (prime).
  69897. * mp Montgomery multiplier.
  69898. */
  69899. 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)
  69900. {
  69901. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  69902. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  69903. __asm__ __volatile__ (
  69904. "sub sp, sp, #0x44\n\t"
  69905. "str %[r], [sp, #64]\n\t"
  69906. "ldm %[a], {%[r], %[a], r2, r3, r4, r5, r6, r7}\n\t"
  69907. "umull r9, r10, %[r], %[r]\n\t"
  69908. "umull r11, r12, %[r], %[a]\n\t"
  69909. "adds r11, r11, r11\n\t"
  69910. "mov lr, #0\n\t"
  69911. "umaal r10, r11, lr, lr\n\t"
  69912. "stm sp, {r9, r10}\n\t"
  69913. "mov r8, lr\n\t"
  69914. "umaal r8, r12, %[r], r2\n\t"
  69915. "adcs r8, r8, r8\n\t"
  69916. "umaal r8, r11, %[a], %[a]\n\t"
  69917. "umull r9, r10, %[r], r3\n\t"
  69918. "umaal r9, r12, %[a], r2\n\t"
  69919. "adcs r9, r9, r9\n\t"
  69920. "umaal r9, r11, lr, lr\n\t"
  69921. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  69922. "str r8, [sp, #8]\n\t"
  69923. "str r9, [sp, #12]\n\t"
  69924. #else
  69925. "strd r8, r9, [sp, #8]\n\t"
  69926. #endif
  69927. "mov r9, lr\n\t"
  69928. "umaal r9, r10, %[r], r4\n\t"
  69929. "umaal r9, r12, %[a], r3\n\t"
  69930. "adcs r9, r9, r9\n\t"
  69931. "umaal r9, r11, r2, r2\n\t"
  69932. "str r9, [sp, #16]\n\t"
  69933. "umull r9, r8, %[r], r5\n\t"
  69934. "umaal r9, r12, %[a], r4\n\t"
  69935. "umaal r9, r10, r2, r3\n\t"
  69936. "adcs r9, r9, r9\n\t"
  69937. "umaal r9, r11, lr, lr\n\t"
  69938. "str r9, [sp, #20]\n\t"
  69939. "mov r9, lr\n\t"
  69940. "umaal r9, r8, %[r], r6\n\t"
  69941. "umaal r9, r12, %[a], r5\n\t"
  69942. "umaal r9, r10, r2, r4\n\t"
  69943. "adcs r9, r9, r9\n\t"
  69944. "umaal r9, r11, r3, r3\n\t"
  69945. "str r9, [sp, #24]\n\t"
  69946. "umull %[r], r9, %[r], r7\n\t"
  69947. "umaal %[r], r8, %[a], r6\n\t"
  69948. "umaal %[r], r12, r2, r5\n\t"
  69949. "umaal %[r], r10, r3, r4\n\t"
  69950. "adcs %[r], %[r], %[r]\n\t"
  69951. "umaal %[r], r11, lr, lr\n\t"
  69952. /* R[7] = r0 */
  69953. "umaal r9, r8, %[a], r7\n\t"
  69954. "umaal r9, r10, r2, r6\n\t"
  69955. "umaal r12, r9, r3, r5\n\t"
  69956. "adcs r12, r12, r12\n\t"
  69957. "umaal r12, r11, r4, r4\n\t"
  69958. /* R[8] = r12 */
  69959. "umaal r9, r8, r2, r7\n\t"
  69960. "umaal r10, r9, r3, r6\n\t"
  69961. "mov r2, lr\n\t"
  69962. "umaal r10, r2, r4, r5\n\t"
  69963. "adcs r10, r10, r10\n\t"
  69964. "umaal r11, r10, lr, lr\n\t"
  69965. /* R[9] = r11 */
  69966. "umaal r2, r8, r3, r7\n\t"
  69967. "umaal r2, r9, r4, r6\n\t"
  69968. "adcs r3, r2, r2\n\t"
  69969. "umaal r10, r3, r5, r5\n\t"
  69970. /* R[10] = r10 */
  69971. "mov %[a], lr\n\t"
  69972. "umaal %[a], r8, r4, r7\n\t"
  69973. "umaal %[a], r9, r5, r6\n\t"
  69974. "adcs r4, %[a], %[a]\n\t"
  69975. "umaal r3, r4, lr, lr\n\t"
  69976. /* R[11] = r3 */
  69977. "umaal r8, r9, r5, r7\n\t"
  69978. "adcs r8, r8, r8\n\t"
  69979. "umaal r4, r8, r6, r6\n\t"
  69980. /* R[12] = r4 */
  69981. "mov r5, lr\n\t"
  69982. "umaal r5, r9, r6, r7\n\t"
  69983. "adcs r5, r5, r5\n\t"
  69984. "umaal r8, r5, lr, lr\n\t"
  69985. /* R[13] = r8 */
  69986. "adcs r9, r9, r9\n\t"
  69987. "umaal r9, r5, r7, r7\n\t"
  69988. "adcs r7, r5, lr\n\t"
  69989. /* R[14] = r9 */
  69990. /* R[15] = r7 */
  69991. "mov lr, sp\n\t"
  69992. "add lr, lr, #28\n\t"
  69993. "stm lr!, {%[r], r12}\n\t"
  69994. "stm lr!, {r11}\n\t"
  69995. "stm lr!, {r10}\n\t"
  69996. "stm lr!, {r3, r4, r8, r9}\n\t"
  69997. "stm lr!, {r7}\n\t"
  69998. /* Start Reduction */
  69999. "ldm sp, {r5, r6, r7, r8, r9, r10, r11, r12}\n\t"
  70000. "mov r3, r11\n\t"
  70001. "mov r4, r12\n\t"
  70002. /* mu = a[0]-a[7] + a[0]-a[4] << 96 + (a[0]-a[1] * 2) << 192 */
  70003. /* - a[0] << 224 */
  70004. /* + (a[0]-a[1] * 2) << (6 * 32) */
  70005. "adds r11, r11, r5\n\t"
  70006. "adc r12, r12, r6\n\t"
  70007. "adds r11, r11, r5\n\t"
  70008. "adc r12, r12, r6\n\t"
  70009. /* - a[0] << (7 * 32) */
  70010. "sub r12, r12, r5\n\t"
  70011. /* + a[0]-a[4] << (3 * 32) */
  70012. "mov r0, r8\n\t"
  70013. "mov r1, r9\n\t"
  70014. "mov r2, r10\n\t"
  70015. "adds r8, r8, r5\n\t"
  70016. "adcs r9, r9, r6\n\t"
  70017. "adcs r10, r10, r7\n\t"
  70018. "adcs r11, r11, r0\n\t"
  70019. "adc r12, r12, r1\n\t"
  70020. /* a += mu * m */
  70021. /* += mu * ((1 << 256) - (1 << 224) + (1 << 192) + (1 << 96) - 1) */
  70022. /* a[0] = = t[0] */
  70023. /* a[1] = = t[1] */
  70024. /* a[2] = = t[2] */
  70025. /* a[3] += t[0] = t[3] */
  70026. /* a[4] += t[1] = t[4] */
  70027. /* a[5] += t[2] = t[5] */
  70028. /* a[6] += t[0] + t[3] = t[6] */
  70029. /* a[7] += t[1] + t[4] = t[7] + t[0] */
  70030. "adds r0, r0, r5\n\t"
  70031. "adcs r1, r1, r6\n\t"
  70032. "adcs r2, r2, r7\n\t"
  70033. "adcs r3, r3, r8\n\t"
  70034. "adcs r4, r4, r9\n\t"
  70035. "mov lr, #0\n\t"
  70036. "adc lr, lr, #0\n\t"
  70037. "adds r3, r3, r5\n\t"
  70038. "adcs r4, r4, r6\n\t"
  70039. "adc lr, lr, #0\n\t"
  70040. "str r4, [sp, #28]\n\t"
  70041. /* a[8] += t[0] + t[2] + t[5] + carry */
  70042. /* a[9] += t[1] + t[3] + t[6] */
  70043. /* a[10] += t[2] + t[4] + t[7] */
  70044. "add r0, sp, #32\n\t"
  70045. "ldm r0, {r2, r3, r4}\n\t"
  70046. "adds r2, r2, lr\n\t"
  70047. "adcs r3, r3, #0\n\t"
  70048. "adcs r4, r4, #0\n\t"
  70049. "mov lr, #0\n\t"
  70050. "adc lr, lr, #0\n\t"
  70051. "adds r2, r2, r5\n\t"
  70052. "adcs r3, r3, r6\n\t"
  70053. "adcs r4, r4, r7\n\t"
  70054. "adc lr, lr, #0\n\t"
  70055. "adds r2, r2, r7\n\t"
  70056. "adcs r3, r3, r8\n\t"
  70057. "adcs r4, r4, r9\n\t"
  70058. "adc lr, lr, #0\n\t"
  70059. "adds r2, r2, r10\n\t"
  70060. "adcs r3, r3, r11\n\t"
  70061. "adcs r4, r4, r12\n\t"
  70062. "adc lr, lr, #0\n\t"
  70063. "stm r0!, {r2, r3, r4}\n\t"
  70064. /* a[11] += t[3] + t[5] + carry */
  70065. /* a[12] += t[4] + t[6] */
  70066. /* a[13] += t[5] + t[7] */
  70067. /* a[14] += t[6] */
  70068. /* a[15] += t[7] */
  70069. "ldm r0, {r0, r1, r2, r3, r4}\n\t"
  70070. "adds r0, r0, lr\n\t"
  70071. "adcs r1, r1, #0\n\t"
  70072. "adcs r2, r2, #0\n\t"
  70073. "adcs r3, r3, #0\n\t"
  70074. "adcs r4, r4, #0\n\t"
  70075. "mov lr, #0\n\t"
  70076. "adc lr, lr, #0\n\t"
  70077. "adds r0, r0, r8\n\t"
  70078. "adcs r1, r1, r9\n\t"
  70079. "adcs r2, r2, r10\n\t"
  70080. "adcs r3, r3, r11\n\t"
  70081. "adcs r4, r4, r12\n\t"
  70082. "adc lr, lr, #0\n\t"
  70083. "adds r0, r0, r10\n\t"
  70084. "adcs r1, r1, r11\n\t"
  70085. "adcs r2, r2, r12\n\t"
  70086. "adcs r3, r3, #0\n\t"
  70087. "adcs r4, r4, #0\n\t"
  70088. "adc lr, lr, #0\n\t"
  70089. "str r0, [sp, #44]\n\t"
  70090. "str r1, [sp, #48]\n\t"
  70091. "str r2, [sp, #52]\n\t"
  70092. "str r3, [sp, #56]\n\t"
  70093. /* a[7..15] - t[0..7] */
  70094. "add r0, sp, #28\n\t"
  70095. "ldm r0, {r0, r1, r2, r3}\n\t"
  70096. "subs r0, r0, r5\n\t"
  70097. "sbcs r1, r1, r6\n\t"
  70098. "sbcs r2, r2, r7\n\t"
  70099. "sbcs r3, r3, r8\n\t"
  70100. "add r0, sp, #44\n\t"
  70101. "mov r8, r4\n\t"
  70102. "ldm r0, {r4, r5, r6, r7}\n\t"
  70103. "sbcs r4, r4, r9\n\t"
  70104. "sbcs r5, r5, r10\n\t"
  70105. "sbcs r6, r6, r11\n\t"
  70106. "sbcs r7, r7, r12\n\t"
  70107. "sbcs r8, r8, #0\n\t"
  70108. "sbc lr, lr, #0\n\t"
  70109. /* mask m and sub from result if overflow */
  70110. "rsb lr, lr, #0\n\t"
  70111. "subs r1, r1, lr\n\t"
  70112. "sbcs r2, r2, lr\n\t"
  70113. "sbcs r3, r3, lr\n\t"
  70114. "sbcs r4, r4, #0\n\t"
  70115. "sbcs r5, r5, #0\n\t"
  70116. "sbcs r6, r6, #0\n\t"
  70117. "sbcs r7, r7, lr, lsr #31\n\t"
  70118. "sbc r8, r8, lr\n\t"
  70119. "ldr %[r], [sp, #64]\n\t"
  70120. "stm %[r], {r1, r2, r3, r4, r5, r6, r7, r8}\n\t"
  70121. "add sp, sp, #0x44\n\t"
  70122. : [r] "+r" (r), [a] "+r" (a)
  70123. :
  70124. : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "lr", "cc"
  70125. );
  70126. (void)m_p;
  70127. (void)mp_p;
  70128. }
  70129. #endif
  70130. #if !defined(WOLFSSL_SP_SMALL) || defined(HAVE_COMP_KEY)
  70131. /* Square the Montgomery form number a number of times. (r = a ^ n mod m)
  70132. *
  70133. * r Result of squaring.
  70134. * a Number to square in Montgomery form.
  70135. * n Number of times to square.
  70136. * m Modulus (prime).
  70137. * mp Montgomery multiplier.
  70138. */
  70139. SP_NOINLINE static void sp_256_mont_sqr_n_8(sp_digit* r,
  70140. const sp_digit* a, int n, const sp_digit* m, sp_digit mp)
  70141. {
  70142. sp_256_mont_sqr_8(r, a, m, mp);
  70143. for (; n > 1; n--) {
  70144. sp_256_mont_sqr_8(r, r, m, mp);
  70145. }
  70146. }
  70147. #endif /* !WOLFSSL_SP_SMALL || HAVE_COMP_KEY */
  70148. #ifdef WOLFSSL_SP_SMALL
  70149. /* Mod-2 for the P256 curve. */
  70150. static const uint32_t p256_mod_minus_2[8] = {
  70151. 0xfffffffdU,0xffffffffU,0xffffffffU,0x00000000U,0x00000000U,0x00000000U,
  70152. 0x00000001U,0xffffffffU
  70153. };
  70154. #endif /* !WOLFSSL_SP_SMALL */
  70155. /* Invert the number, in Montgomery form, modulo the modulus (prime) of the
  70156. * P256 curve. (r = 1 / a mod m)
  70157. *
  70158. * r Inverse result.
  70159. * a Number to invert.
  70160. * td Temporary data.
  70161. */
  70162. static void sp_256_mont_inv_8(sp_digit* r, const sp_digit* a, sp_digit* td)
  70163. {
  70164. #ifdef WOLFSSL_SP_SMALL
  70165. sp_digit* t = td;
  70166. int i;
  70167. XMEMCPY(t, a, sizeof(sp_digit) * 8);
  70168. for (i=254; i>=0; i--) {
  70169. sp_256_mont_sqr_8(t, t, p256_mod, p256_mp_mod);
  70170. if (p256_mod_minus_2[i / 32] & ((sp_digit)1 << (i % 32)))
  70171. sp_256_mont_mul_8(t, t, a, p256_mod, p256_mp_mod);
  70172. }
  70173. XMEMCPY(r, t, sizeof(sp_digit) * 8);
  70174. #else
  70175. sp_digit* t1 = td;
  70176. sp_digit* t2 = td + 2 * 8;
  70177. sp_digit* t3 = td + 4 * 8;
  70178. /* 0x2 */
  70179. sp_256_mont_sqr_8(t1, a, p256_mod, p256_mp_mod);
  70180. /* 0x3 */
  70181. sp_256_mont_mul_8(t2, t1, a, p256_mod, p256_mp_mod);
  70182. /* 0xc */
  70183. sp_256_mont_sqr_n_8(t1, t2, 2, p256_mod, p256_mp_mod);
  70184. /* 0xd */
  70185. sp_256_mont_mul_8(t3, t1, a, p256_mod, p256_mp_mod);
  70186. /* 0xf */
  70187. sp_256_mont_mul_8(t2, t2, t1, p256_mod, p256_mp_mod);
  70188. /* 0xf0 */
  70189. sp_256_mont_sqr_n_8(t1, t2, 4, p256_mod, p256_mp_mod);
  70190. /* 0xfd */
  70191. sp_256_mont_mul_8(t3, t3, t1, p256_mod, p256_mp_mod);
  70192. /* 0xff */
  70193. sp_256_mont_mul_8(t2, t2, t1, p256_mod, p256_mp_mod);
  70194. /* 0xff00 */
  70195. sp_256_mont_sqr_n_8(t1, t2, 8, p256_mod, p256_mp_mod);
  70196. /* 0xfffd */
  70197. sp_256_mont_mul_8(t3, t3, t1, p256_mod, p256_mp_mod);
  70198. /* 0xffff */
  70199. sp_256_mont_mul_8(t2, t2, t1, p256_mod, p256_mp_mod);
  70200. /* 0xffff0000 */
  70201. sp_256_mont_sqr_n_8(t1, t2, 16, p256_mod, p256_mp_mod);
  70202. /* 0xfffffffd */
  70203. sp_256_mont_mul_8(t3, t3, t1, p256_mod, p256_mp_mod);
  70204. /* 0xffffffff */
  70205. sp_256_mont_mul_8(t2, t2, t1, p256_mod, p256_mp_mod);
  70206. /* 0xffffffff00000000 */
  70207. sp_256_mont_sqr_n_8(t1, t2, 32, p256_mod, p256_mp_mod);
  70208. /* 0xffffffffffffffff */
  70209. sp_256_mont_mul_8(t2, t2, t1, p256_mod, p256_mp_mod);
  70210. /* 0xffffffff00000001 */
  70211. sp_256_mont_mul_8(r, t1, a, p256_mod, p256_mp_mod);
  70212. /* 0xffffffff000000010000000000000000000000000000000000000000 */
  70213. sp_256_mont_sqr_n_8(r, r, 160, p256_mod, p256_mp_mod);
  70214. /* 0xffffffff00000001000000000000000000000000ffffffffffffffff */
  70215. sp_256_mont_mul_8(r, r, t2, p256_mod, p256_mp_mod);
  70216. /* 0xffffffff00000001000000000000000000000000ffffffffffffffff00000000 */
  70217. sp_256_mont_sqr_n_8(r, r, 32, p256_mod, p256_mp_mod);
  70218. /* 0xffffffff00000001000000000000000000000000fffffffffffffffffffffffd */
  70219. sp_256_mont_mul_8(r, r, t3, p256_mod, p256_mp_mod);
  70220. #endif /* WOLFSSL_SP_SMALL */
  70221. }
  70222. /* Compare a with b in constant time.
  70223. *
  70224. * a A single precision integer.
  70225. * b A single precision integer.
  70226. * return -ve, 0 or +ve if a is less than, equal to or greater than b
  70227. * respectively.
  70228. */
  70229. static sp_int32 sp_256_cmp_8(const sp_digit* a_p, const sp_digit* b_p)
  70230. {
  70231. register const sp_digit* a asm ("r0") = (const sp_digit*)a_p;
  70232. register const sp_digit* b asm ("r1") = (const sp_digit*)b_p;
  70233. __asm__ __volatile__ (
  70234. "mov r2, #-1\n\t"
  70235. "mov r6, #1\n\t"
  70236. "mov r5, #0\n\t"
  70237. "mov r3, #-1\n\t"
  70238. #ifdef WOLFSSL_SP_SMALL
  70239. "mov r4, #28\n\t"
  70240. "\n"
  70241. "L_sp_256_cmp_8_words_%=: \n\t"
  70242. "ldr r12, [%[a], r4]\n\t"
  70243. "ldr lr, [%[b], r4]\n\t"
  70244. "and r12, r12, r3\n\t"
  70245. "and lr, lr, r3\n\t"
  70246. "subs r12, r12, lr\n\t"
  70247. "it hi\n\t"
  70248. "movhi r2, r6\n\t"
  70249. "it lo\n\t"
  70250. "movlo r2, r3\n\t"
  70251. "it ne\n\t"
  70252. "movne r3, r5\n\t"
  70253. "subs r4, r4, #4\n\t"
  70254. "bcs L_sp_256_cmp_8_words_%=\n\t"
  70255. "eor r2, r2, r3\n\t"
  70256. #else
  70257. "ldr r12, [%[a], #28]\n\t"
  70258. "ldr lr, [%[b], #28]\n\t"
  70259. "and r12, r12, r3\n\t"
  70260. "and lr, lr, r3\n\t"
  70261. "subs r12, r12, lr\n\t"
  70262. "it hi\n\t"
  70263. "movhi r2, r6\n\t"
  70264. "it lo\n\t"
  70265. "movlo r2, r3\n\t"
  70266. "it ne\n\t"
  70267. "movne r3, r5\n\t"
  70268. "ldr r12, [%[a], #24]\n\t"
  70269. "ldr lr, [%[b], #24]\n\t"
  70270. "and r12, r12, r3\n\t"
  70271. "and lr, lr, r3\n\t"
  70272. "subs r12, r12, lr\n\t"
  70273. "it hi\n\t"
  70274. "movhi r2, r6\n\t"
  70275. "it lo\n\t"
  70276. "movlo r2, r3\n\t"
  70277. "it ne\n\t"
  70278. "movne r3, r5\n\t"
  70279. "ldr r12, [%[a], #20]\n\t"
  70280. "ldr lr, [%[b], #20]\n\t"
  70281. "and r12, r12, r3\n\t"
  70282. "and lr, lr, r3\n\t"
  70283. "subs r12, r12, lr\n\t"
  70284. "it hi\n\t"
  70285. "movhi r2, r6\n\t"
  70286. "it lo\n\t"
  70287. "movlo r2, r3\n\t"
  70288. "it ne\n\t"
  70289. "movne r3, r5\n\t"
  70290. "ldr r12, [%[a], #16]\n\t"
  70291. "ldr lr, [%[b], #16]\n\t"
  70292. "and r12, r12, r3\n\t"
  70293. "and lr, lr, r3\n\t"
  70294. "subs r12, r12, lr\n\t"
  70295. "it hi\n\t"
  70296. "movhi r2, r6\n\t"
  70297. "it lo\n\t"
  70298. "movlo r2, r3\n\t"
  70299. "it ne\n\t"
  70300. "movne r3, r5\n\t"
  70301. "ldr r12, [%[a], #12]\n\t"
  70302. "ldr lr, [%[b], #12]\n\t"
  70303. "and r12, r12, r3\n\t"
  70304. "and lr, lr, r3\n\t"
  70305. "subs r12, r12, lr\n\t"
  70306. "it hi\n\t"
  70307. "movhi r2, r6\n\t"
  70308. "it lo\n\t"
  70309. "movlo r2, r3\n\t"
  70310. "it ne\n\t"
  70311. "movne r3, r5\n\t"
  70312. "ldr r12, [%[a], #8]\n\t"
  70313. "ldr lr, [%[b], #8]\n\t"
  70314. "and r12, r12, r3\n\t"
  70315. "and lr, lr, r3\n\t"
  70316. "subs r12, r12, lr\n\t"
  70317. "it hi\n\t"
  70318. "movhi r2, r6\n\t"
  70319. "it lo\n\t"
  70320. "movlo r2, r3\n\t"
  70321. "it ne\n\t"
  70322. "movne r3, r5\n\t"
  70323. "ldr r12, [%[a], #4]\n\t"
  70324. "ldr lr, [%[b], #4]\n\t"
  70325. "and r12, r12, r3\n\t"
  70326. "and lr, lr, r3\n\t"
  70327. "subs r12, r12, lr\n\t"
  70328. "it hi\n\t"
  70329. "movhi r2, r6\n\t"
  70330. "it lo\n\t"
  70331. "movlo r2, r3\n\t"
  70332. "it ne\n\t"
  70333. "movne r3, r5\n\t"
  70334. "ldr r12, [%[a]]\n\t"
  70335. "ldr lr, [%[b]]\n\t"
  70336. "and r12, r12, r3\n\t"
  70337. "and lr, lr, r3\n\t"
  70338. "subs r12, r12, lr\n\t"
  70339. "it hi\n\t"
  70340. "movhi r2, r6\n\t"
  70341. "it lo\n\t"
  70342. "movlo r2, r3\n\t"
  70343. "it ne\n\t"
  70344. "movne r3, r5\n\t"
  70345. "eor r2, r2, r3\n\t"
  70346. #endif /*WOLFSSL_SP_SMALL */
  70347. "mov %[a], r2\n\t"
  70348. : [a] "+r" (a), [b] "+r" (b)
  70349. :
  70350. : "memory", "r2", "r3", "r12", "lr", "r4", "r5", "r6", "cc"
  70351. );
  70352. return (uint32_t)(size_t)a;
  70353. }
  70354. /* Normalize the values in each word to 32.
  70355. *
  70356. * a Array of sp_digit to normalize.
  70357. */
  70358. #define sp_256_norm_8(a)
  70359. #ifdef WOLFSSL_SP_SMALL
  70360. /* Conditionally subtract b from a using the mask m.
  70361. * m is -1 to subtract and 0 when not copying.
  70362. *
  70363. * r A single precision number representing condition subtract result.
  70364. * a A single precision number to subtract from.
  70365. * b A single precision number to subtract.
  70366. * m Mask value to apply.
  70367. */
  70368. 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)
  70369. {
  70370. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  70371. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  70372. register const sp_digit* b asm ("r2") = (const sp_digit*)b_p;
  70373. register sp_digit m asm ("r3") = (sp_digit)m_p;
  70374. __asm__ __volatile__ (
  70375. "mov r6, #0\n\t"
  70376. "mov r12, #0\n\t"
  70377. "mov lr, #0\n\t"
  70378. "\n"
  70379. "L_sp_256_cond_sub_8_words_%=: \n\t"
  70380. "subs r12, r6, r12\n\t"
  70381. "ldr r4, [%[a], lr]\n\t"
  70382. "ldr r5, [%[b], lr]\n\t"
  70383. "and r5, r5, %[m]\n\t"
  70384. "sbcs r4, r4, r5\n\t"
  70385. "sbc r12, r6, r6\n\t"
  70386. "str r4, [%[r], lr]\n\t"
  70387. "add lr, lr, #4\n\t"
  70388. "cmp lr, #32\n\t"
  70389. "blt L_sp_256_cond_sub_8_words_%=\n\t"
  70390. "mov %[r], r12\n\t"
  70391. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b), [m] "+r" (m)
  70392. :
  70393. : "memory", "r12", "lr", "r4", "r5", "r6", "cc"
  70394. );
  70395. return (uint32_t)(size_t)r;
  70396. }
  70397. #else
  70398. /* Conditionally subtract b from a using the mask m.
  70399. * m is -1 to subtract and 0 when not copying.
  70400. *
  70401. * r A single precision number representing condition subtract result.
  70402. * a A single precision number to subtract from.
  70403. * b A single precision number to subtract.
  70404. * m Mask value to apply.
  70405. */
  70406. 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)
  70407. {
  70408. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  70409. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  70410. register const sp_digit* b asm ("r2") = (const sp_digit*)b_p;
  70411. register sp_digit m asm ("r3") = (sp_digit)m_p;
  70412. __asm__ __volatile__ (
  70413. "mov lr, #0\n\t"
  70414. "ldm %[a]!, {r4, r5}\n\t"
  70415. "ldm %[b]!, {r6, r7}\n\t"
  70416. "and r6, r6, %[m]\n\t"
  70417. "and r7, r7, %[m]\n\t"
  70418. "subs r4, r4, r6\n\t"
  70419. "sbcs r5, r5, r7\n\t"
  70420. "stm %[r]!, {r4, r5}\n\t"
  70421. "ldm %[a]!, {r4, r5}\n\t"
  70422. "ldm %[b]!, {r6, r7}\n\t"
  70423. "and r6, r6, %[m]\n\t"
  70424. "and r7, r7, %[m]\n\t"
  70425. "sbcs r4, r4, r6\n\t"
  70426. "sbcs r5, r5, r7\n\t"
  70427. "stm %[r]!, {r4, r5}\n\t"
  70428. "ldm %[a]!, {r4, r5}\n\t"
  70429. "ldm %[b]!, {r6, r7}\n\t"
  70430. "and r6, r6, %[m]\n\t"
  70431. "and r7, r7, %[m]\n\t"
  70432. "sbcs r4, r4, r6\n\t"
  70433. "sbcs r5, r5, r7\n\t"
  70434. "stm %[r]!, {r4, r5}\n\t"
  70435. "ldm %[a]!, {r4, r5}\n\t"
  70436. "ldm %[b]!, {r6, r7}\n\t"
  70437. "and r6, r6, %[m]\n\t"
  70438. "and r7, r7, %[m]\n\t"
  70439. "sbcs r4, r4, r6\n\t"
  70440. "sbcs r5, r5, r7\n\t"
  70441. "stm %[r]!, {r4, r5}\n\t"
  70442. "sbc %[r], lr, lr\n\t"
  70443. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b), [m] "+r" (m)
  70444. :
  70445. : "memory", "r12", "lr", "r4", "r5", "r6", "r7", "cc"
  70446. );
  70447. return (uint32_t)(size_t)r;
  70448. }
  70449. #endif /* WOLFSSL_SP_SMALL */
  70450. #ifndef WOLFSSL_SP_SMALL
  70451. #define sp_256_mont_reduce_order_8 sp_256_mont_reduce_8
  70452. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  70453. /* Reduce the number back to 256 bits using Montgomery reduction.
  70454. *
  70455. * a A single precision number to reduce in place.
  70456. * m The single precision number representing the modulus.
  70457. * mp The digit representing the negative inverse of m mod 2^n.
  70458. */
  70459. static SP_NOINLINE void sp_256_mont_reduce_8(sp_digit* a_p, const sp_digit* m_p, sp_digit mp_p)
  70460. {
  70461. register sp_digit* a asm ("r0") = (sp_digit*)a_p;
  70462. register const sp_digit* m asm ("r1") = (const sp_digit*)m_p;
  70463. register sp_digit mp asm ("r2") = (sp_digit)mp_p;
  70464. __asm__ __volatile__ (
  70465. #if !(defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4))
  70466. "ldr r11, [%[m]]\n\t"
  70467. #endif
  70468. /* i = 0 */
  70469. "mov r9, #0\n\t"
  70470. "mov r3, #0\n\t"
  70471. "ldr r12, [%[a]]\n\t"
  70472. "ldr lr, [%[a], #4]\n\t"
  70473. "\n"
  70474. "L_sp_256_mont_reduce_8_word_%=: \n\t"
  70475. /* mu = a[i] * mp */
  70476. "mul r8, %[mp], r12\n\t"
  70477. /* a[i+0] += m[0] * mu */
  70478. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  70479. "ldr r11, [%[m]]\n\t"
  70480. #endif
  70481. "lsr r7, r11, #16\n\t"
  70482. "lsr r6, r8, #16\n\t"
  70483. "mul r5, r6, r7\n\t"
  70484. "lsl r7, r11, #16\n\t"
  70485. "lsr r7, r7, #16\n\t"
  70486. "mul r6, r7, r6\n\t"
  70487. "lsr r7, r6, #16\n\t"
  70488. "lsl r6, r6, #16\n\t"
  70489. "adds r12, r12, r6\n\t"
  70490. "adc r5, r5, r7\n\t"
  70491. "lsl r6, r8, #16\n\t"
  70492. "lsl r7, r11, #16\n\t"
  70493. "lsr r6, r6, #16\n\t"
  70494. "lsr r7, r7, #16\n\t"
  70495. "mul r7, r6, r7\n\t"
  70496. "adds r12, r12, r7\n\t"
  70497. "adc r5, r5, #0\n\t"
  70498. "lsr r7, r11, #16\n\t"
  70499. "mul r6, r7, r6\n\t"
  70500. "lsr r7, r6, #16\n\t"
  70501. "lsl r6, r6, #16\n\t"
  70502. "adds r12, r12, r6\n\t"
  70503. "adc r5, r5, r7\n\t"
  70504. /* a[i+1] += m[1] * mu */
  70505. "ldr r7, [%[m], #4]\n\t"
  70506. "lsr r10, r7, #16\n\t"
  70507. "lsr r6, r8, #16\n\t"
  70508. "mul r4, r6, r10\n\t"
  70509. "lsl r10, r7, #16\n\t"
  70510. "lsr r10, r10, #16\n\t"
  70511. "mul r6, r10, r6\n\t"
  70512. "lsr r10, r6, #16\n\t"
  70513. "lsl r6, r6, #16\n\t"
  70514. "adds lr, lr, r6\n\t"
  70515. "adc r4, r4, r10\n\t"
  70516. "lsl r6, r8, #16\n\t"
  70517. "lsl r10, r7, #16\n\t"
  70518. "lsr r6, r6, #16\n\t"
  70519. "lsr r10, r10, #16\n\t"
  70520. "mul r10, r6, r10\n\t"
  70521. "adds lr, lr, r10\n\t"
  70522. "adc r4, r4, #0\n\t"
  70523. "lsr r10, r7, #16\n\t"
  70524. "mul r6, r10, r6\n\t"
  70525. "lsr r10, r6, #16\n\t"
  70526. "lsl r6, r6, #16\n\t"
  70527. "adds lr, lr, r6\n\t"
  70528. "adc r4, r4, r10\n\t"
  70529. "mov r12, lr\n\t"
  70530. "adds r12, r12, r5\n\t"
  70531. "adc r4, r4, #0\n\t"
  70532. /* a[i+2] += m[2] * mu */
  70533. "ldr r7, [%[m], #8]\n\t"
  70534. "ldr lr, [%[a], #8]\n\t"
  70535. "lsr r10, r7, #16\n\t"
  70536. "lsr r6, r8, #16\n\t"
  70537. "mul r5, r6, r10\n\t"
  70538. "lsl r10, r7, #16\n\t"
  70539. "lsr r10, r10, #16\n\t"
  70540. "mul r6, r10, r6\n\t"
  70541. "lsr r10, r6, #16\n\t"
  70542. "lsl r6, r6, #16\n\t"
  70543. "adds lr, lr, r6\n\t"
  70544. "adc r5, r5, r10\n\t"
  70545. "lsl r6, r8, #16\n\t"
  70546. "lsl r10, r7, #16\n\t"
  70547. "lsr r6, r6, #16\n\t"
  70548. "lsr r10, r10, #16\n\t"
  70549. "mul r10, r6, r10\n\t"
  70550. "adds lr, lr, r10\n\t"
  70551. "adc r5, r5, #0\n\t"
  70552. "lsr r10, r7, #16\n\t"
  70553. "mul r6, r10, r6\n\t"
  70554. "lsr r10, r6, #16\n\t"
  70555. "lsl r6, r6, #16\n\t"
  70556. "adds lr, lr, r6\n\t"
  70557. "adc r5, r5, r10\n\t"
  70558. "adds lr, lr, r4\n\t"
  70559. "adc r5, r5, #0\n\t"
  70560. /* a[i+3] += m[3] * mu */
  70561. "ldr r7, [%[m], #12]\n\t"
  70562. "ldr r10, [%[a], #12]\n\t"
  70563. "lsr r11, r7, #16\n\t"
  70564. "lsr r6, r8, #16\n\t"
  70565. "mul r4, r6, r11\n\t"
  70566. "lsl r11, r7, #16\n\t"
  70567. "lsr r11, r11, #16\n\t"
  70568. "mul r6, r11, r6\n\t"
  70569. "lsr r11, r6, #16\n\t"
  70570. "lsl r6, r6, #16\n\t"
  70571. "adds r10, r10, r6\n\t"
  70572. "adc r4, r4, r11\n\t"
  70573. "lsl r6, r8, #16\n\t"
  70574. "lsl r11, r7, #16\n\t"
  70575. "lsr r6, r6, #16\n\t"
  70576. "lsr r11, r11, #16\n\t"
  70577. "mul r11, r6, r11\n\t"
  70578. "adds r10, r10, r11\n\t"
  70579. "adc r4, r4, #0\n\t"
  70580. "lsr r11, r7, #16\n\t"
  70581. "mul r6, r11, r6\n\t"
  70582. "lsr r11, r6, #16\n\t"
  70583. "lsl r6, r6, #16\n\t"
  70584. "adds r10, r10, r6\n\t"
  70585. "adc r4, r4, r11\n\t"
  70586. "adds r10, r10, r5\n\t"
  70587. "str r10, [%[a], #12]\n\t"
  70588. "adc r4, r4, #0\n\t"
  70589. /* a[i+4] += m[4] * mu */
  70590. "ldr r7, [%[m], #16]\n\t"
  70591. "ldr r10, [%[a], #16]\n\t"
  70592. "lsr r11, r7, #16\n\t"
  70593. "lsr r6, r8, #16\n\t"
  70594. "mul r5, r6, r11\n\t"
  70595. "lsl r11, r7, #16\n\t"
  70596. "lsr r11, r11, #16\n\t"
  70597. "mul r6, r11, r6\n\t"
  70598. "lsr r11, r6, #16\n\t"
  70599. "lsl r6, r6, #16\n\t"
  70600. "adds r10, r10, r6\n\t"
  70601. "adc r5, r5, r11\n\t"
  70602. "lsl r6, r8, #16\n\t"
  70603. "lsl r11, r7, #16\n\t"
  70604. "lsr r6, r6, #16\n\t"
  70605. "lsr r11, r11, #16\n\t"
  70606. "mul r11, r6, r11\n\t"
  70607. "adds r10, r10, r11\n\t"
  70608. "adc r5, r5, #0\n\t"
  70609. "lsr r11, r7, #16\n\t"
  70610. "mul r6, r11, r6\n\t"
  70611. "lsr r11, r6, #16\n\t"
  70612. "lsl r6, r6, #16\n\t"
  70613. "adds r10, r10, r6\n\t"
  70614. "adc r5, r5, r11\n\t"
  70615. "adds r10, r10, r4\n\t"
  70616. "str r10, [%[a], #16]\n\t"
  70617. "adc r5, r5, #0\n\t"
  70618. /* a[i+5] += m[5] * mu */
  70619. "ldr r7, [%[m], #20]\n\t"
  70620. "ldr r10, [%[a], #20]\n\t"
  70621. "lsr r11, r7, #16\n\t"
  70622. "lsr r6, r8, #16\n\t"
  70623. "mul r4, r6, r11\n\t"
  70624. "lsl r11, r7, #16\n\t"
  70625. "lsr r11, r11, #16\n\t"
  70626. "mul r6, r11, r6\n\t"
  70627. "lsr r11, r6, #16\n\t"
  70628. "lsl r6, r6, #16\n\t"
  70629. "adds r10, r10, r6\n\t"
  70630. "adc r4, r4, r11\n\t"
  70631. "lsl r6, r8, #16\n\t"
  70632. "lsl r11, r7, #16\n\t"
  70633. "lsr r6, r6, #16\n\t"
  70634. "lsr r11, r11, #16\n\t"
  70635. "mul r11, r6, r11\n\t"
  70636. "adds r10, r10, r11\n\t"
  70637. "adc r4, r4, #0\n\t"
  70638. "lsr r11, r7, #16\n\t"
  70639. "mul r6, r11, r6\n\t"
  70640. "lsr r11, r6, #16\n\t"
  70641. "lsl r6, r6, #16\n\t"
  70642. "adds r10, r10, r6\n\t"
  70643. "adc r4, r4, r11\n\t"
  70644. "adds r10, r10, r5\n\t"
  70645. "str r10, [%[a], #20]\n\t"
  70646. "adc r4, r4, #0\n\t"
  70647. /* a[i+6] += m[6] * mu */
  70648. "ldr r7, [%[m], #24]\n\t"
  70649. "ldr r10, [%[a], #24]\n\t"
  70650. "lsr r11, r7, #16\n\t"
  70651. "lsr r6, r8, #16\n\t"
  70652. "mul r5, r6, r11\n\t"
  70653. "lsl r11, r7, #16\n\t"
  70654. "lsr r11, r11, #16\n\t"
  70655. "mul r6, r11, r6\n\t"
  70656. "lsr r11, r6, #16\n\t"
  70657. "lsl r6, r6, #16\n\t"
  70658. "adds r10, r10, r6\n\t"
  70659. "adc r5, r5, r11\n\t"
  70660. "lsl r6, r8, #16\n\t"
  70661. "lsl r11, r7, #16\n\t"
  70662. "lsr r6, r6, #16\n\t"
  70663. "lsr r11, r11, #16\n\t"
  70664. "mul r11, r6, r11\n\t"
  70665. "adds r10, r10, r11\n\t"
  70666. "adc r5, r5, #0\n\t"
  70667. "lsr r11, r7, #16\n\t"
  70668. "mul r6, r11, r6\n\t"
  70669. "lsr r11, r6, #16\n\t"
  70670. "lsl r6, r6, #16\n\t"
  70671. "adds r10, r10, r6\n\t"
  70672. "adc r5, r5, r11\n\t"
  70673. "adds r10, r10, r4\n\t"
  70674. "str r10, [%[a], #24]\n\t"
  70675. "adc r5, r5, #0\n\t"
  70676. /* a[i+7] += m[7] * mu */
  70677. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  70678. "ldr r11, [%[m], #28]\n\t"
  70679. #else
  70680. "ldr r7, [%[m], #28]\n\t"
  70681. #endif
  70682. "ldr r10, [%[a], #28]\n\t"
  70683. "lsl r6, r8, #16\n\t"
  70684. "lsl r7, r11, #16\n\t"
  70685. "lsr r6, r6, #16\n\t"
  70686. "lsr r7, r7, #16\n\t"
  70687. "mul r7, r6, r7\n\t"
  70688. "adds r5, r5, r7\n\t"
  70689. "adcs r4, r3, #0\n\t"
  70690. "mov r3, #0\n\t"
  70691. "adc r3, r3, r3\n\t"
  70692. "lsr r7, r11, #16\n\t"
  70693. "mul r6, r7, r6\n\t"
  70694. "lsr r7, r6, #16\n\t"
  70695. "lsl r6, r6, #16\n\t"
  70696. "adds r5, r5, r6\n\t"
  70697. "adcs r4, r4, r7\n\t"
  70698. "adc r3, r3, #0\n\t"
  70699. "mov r6, r8\n\t"
  70700. "lsr r7, r11, #16\n\t"
  70701. "lsr r6, r6, #16\n\t"
  70702. "mul r7, r6, r7\n\t"
  70703. "adds r4, r4, r7\n\t"
  70704. "lsl r7, r11, #16\n\t"
  70705. "adc r3, r3, #0\n\t"
  70706. "lsr r7, r7, #16\n\t"
  70707. "mul r6, r7, r6\n\t"
  70708. "lsr r7, r6, #16\n\t"
  70709. "lsl r6, r6, #16\n\t"
  70710. "adds r5, r5, r6\n\t"
  70711. "adcs r4, r4, r7\n\t"
  70712. "adc r3, r3, #0\n\t"
  70713. "adds r10, r10, r5\n\t"
  70714. "str r10, [%[a], #28]\n\t"
  70715. "ldr r10, [%[a], #32]\n\t"
  70716. "adcs r10, r10, r4\n\t"
  70717. "str r10, [%[a], #32]\n\t"
  70718. "adc r3, r3, #0\n\t"
  70719. /* i += 1 */
  70720. "add r9, r9, #4\n\t"
  70721. "add %[a], %[a], #4\n\t"
  70722. "cmp r9, #32\n\t"
  70723. "blt L_sp_256_mont_reduce_8_word_%=\n\t"
  70724. /* Loop Done */
  70725. "str r12, [%[a]]\n\t"
  70726. "str lr, [%[a], #4]\n\t"
  70727. "mov %[mp], r3\n\t"
  70728. : [a] "+r" (a), [m] "+r" (m), [mp] "+r" (mp)
  70729. :
  70730. : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "cc"
  70731. );
  70732. sp_256_cond_sub_8(a - 8, a, m, (sp_digit)0 - mp);
  70733. }
  70734. #elif defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  70735. /* Reduce the number back to 256 bits using Montgomery reduction.
  70736. *
  70737. * a A single precision number to reduce in place.
  70738. * m The single precision number representing the modulus.
  70739. * mp The digit representing the negative inverse of m mod 2^n.
  70740. */
  70741. static SP_NOINLINE void sp_256_mont_reduce_8(sp_digit* a_p, const sp_digit* m_p, sp_digit mp_p)
  70742. {
  70743. register sp_digit* a asm ("r0") = (sp_digit*)a_p;
  70744. register const sp_digit* m asm ("r1") = (const sp_digit*)m_p;
  70745. register sp_digit mp asm ("r2") = (sp_digit)mp_p;
  70746. __asm__ __volatile__ (
  70747. "ldr r11, [%[m]]\n\t"
  70748. /* i = 0 */
  70749. "mov r9, #0\n\t"
  70750. "mov r3, #0\n\t"
  70751. "ldr r12, [%[a]]\n\t"
  70752. "ldr lr, [%[a], #4]\n\t"
  70753. "\n"
  70754. "L_sp_256_mont_reduce_8_word_%=: \n\t"
  70755. /* mu = a[i] * mp */
  70756. "mul r8, %[mp], r12\n\t"
  70757. /* a[i+0] += m[0] * mu */
  70758. "mov r5, #0\n\t"
  70759. "umlal r12, r5, r8, r11\n\t"
  70760. /* a[i+1] += m[1] * mu */
  70761. "ldr r7, [%[m], #4]\n\t"
  70762. "mov r4, #0\n\t"
  70763. "umlal lr, r4, r8, r7\n\t"
  70764. "mov r12, lr\n\t"
  70765. "adds r12, r12, r5\n\t"
  70766. "adc r4, r4, #0\n\t"
  70767. /* a[i+2] += m[2] * mu */
  70768. "ldr r7, [%[m], #8]\n\t"
  70769. "ldr lr, [%[a], #8]\n\t"
  70770. "mov r5, #0\n\t"
  70771. "umlal lr, r5, r8, r7\n\t"
  70772. "adds lr, lr, r4\n\t"
  70773. "adc r5, r5, #0\n\t"
  70774. /* a[i+3] += m[3] * mu */
  70775. "ldr r7, [%[m], #12]\n\t"
  70776. "ldr r10, [%[a], #12]\n\t"
  70777. "mov r4, #0\n\t"
  70778. "umlal r10, r4, r8, r7\n\t"
  70779. "adds r10, r10, r5\n\t"
  70780. "str r10, [%[a], #12]\n\t"
  70781. "adc r4, r4, #0\n\t"
  70782. /* a[i+4] += m[4] * mu */
  70783. "ldr r7, [%[m], #16]\n\t"
  70784. "ldr r10, [%[a], #16]\n\t"
  70785. "mov r5, #0\n\t"
  70786. "umlal r10, r5, r8, r7\n\t"
  70787. "adds r10, r10, r4\n\t"
  70788. "str r10, [%[a], #16]\n\t"
  70789. "adc r5, r5, #0\n\t"
  70790. /* a[i+5] += m[5] * mu */
  70791. "ldr r7, [%[m], #20]\n\t"
  70792. "ldr r10, [%[a], #20]\n\t"
  70793. "mov r4, #0\n\t"
  70794. "umlal r10, r4, r8, r7\n\t"
  70795. "adds r10, r10, r5\n\t"
  70796. "str r10, [%[a], #20]\n\t"
  70797. "adc r4, r4, #0\n\t"
  70798. /* a[i+6] += m[6] * mu */
  70799. "ldr r7, [%[m], #24]\n\t"
  70800. "ldr r10, [%[a], #24]\n\t"
  70801. "mov r5, #0\n\t"
  70802. "umlal r10, r5, r8, r7\n\t"
  70803. "adds r10, r10, r4\n\t"
  70804. "str r10, [%[a], #24]\n\t"
  70805. "adc r5, r5, #0\n\t"
  70806. /* a[i+7] += m[7] * mu */
  70807. "ldr r7, [%[m], #28]\n\t"
  70808. "ldr r10, [%[a], #28]\n\t"
  70809. "umull r6, r7, r8, r7\n\t"
  70810. "adds r5, r5, r6\n\t"
  70811. "adcs r4, r7, r3\n\t"
  70812. "mov r3, #0\n\t"
  70813. "adc r3, r3, r3\n\t"
  70814. "adds r10, r10, r5\n\t"
  70815. "str r10, [%[a], #28]\n\t"
  70816. "ldr r10, [%[a], #32]\n\t"
  70817. "adcs r10, r10, r4\n\t"
  70818. "str r10, [%[a], #32]\n\t"
  70819. "adc r3, r3, #0\n\t"
  70820. /* i += 1 */
  70821. "add r9, r9, #4\n\t"
  70822. "add %[a], %[a], #4\n\t"
  70823. "cmp r9, #32\n\t"
  70824. "blt L_sp_256_mont_reduce_8_word_%=\n\t"
  70825. /* Loop Done */
  70826. "str r12, [%[a]]\n\t"
  70827. "str lr, [%[a], #4]\n\t"
  70828. "mov %[mp], r3\n\t"
  70829. : [a] "+r" (a), [m] "+r" (m), [mp] "+r" (mp)
  70830. :
  70831. : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "cc"
  70832. );
  70833. sp_256_cond_sub_8(a - 8, a, m, (sp_digit)0 - mp);
  70834. }
  70835. #else
  70836. /* Reduce the number back to 256 bits using Montgomery reduction.
  70837. *
  70838. * a A single precision number to reduce in place.
  70839. * m The single precision number representing the modulus.
  70840. * mp The digit representing the negative inverse of m mod 2^n.
  70841. */
  70842. static SP_NOINLINE void sp_256_mont_reduce_8(sp_digit* a_p, const sp_digit* m_p, sp_digit mp_p)
  70843. {
  70844. register sp_digit* a asm ("r0") = (sp_digit*)a_p;
  70845. register const sp_digit* m asm ("r1") = (const sp_digit*)m_p;
  70846. register sp_digit mp asm ("r2") = (sp_digit)mp_p;
  70847. __asm__ __volatile__ (
  70848. /* i = 0 */
  70849. "mov r12, #0\n\t"
  70850. "mov lr, #0\n\t"
  70851. "ldr r4, [%[a]]\n\t"
  70852. "ldr r5, [%[a], #4]\n\t"
  70853. "ldr r6, [%[a], #8]\n\t"
  70854. "ldr r7, [%[a], #12]\n\t"
  70855. "ldr r8, [%[a], #16]\n\t"
  70856. "\n"
  70857. "L_sp_256_mont_reduce_8_word_%=: \n\t"
  70858. /* mu = a[i] * mp */
  70859. "mul r11, %[mp], r4\n\t"
  70860. /* a[i+0] += m[0] * mu */
  70861. "ldr r10, [%[m]]\n\t"
  70862. "mov r3, #0\n\t"
  70863. "umaal r4, r3, r11, r10\n\t"
  70864. /* a[i+1] += m[1] * mu */
  70865. "ldr r10, [%[m], #4]\n\t"
  70866. "mov r4, r5\n\t"
  70867. "umaal r4, r3, r11, r10\n\t"
  70868. /* a[i+2] += m[2] * mu */
  70869. "ldr r10, [%[m], #8]\n\t"
  70870. "mov r5, r6\n\t"
  70871. "umaal r5, r3, r11, r10\n\t"
  70872. /* a[i+3] += m[3] * mu */
  70873. "ldr r10, [%[m], #12]\n\t"
  70874. "mov r6, r7\n\t"
  70875. "umaal r6, r3, r11, r10\n\t"
  70876. /* a[i+4] += m[4] * mu */
  70877. "ldr r10, [%[m], #16]\n\t"
  70878. "mov r7, r8\n\t"
  70879. "umaal r7, r3, r11, r10\n\t"
  70880. /* a[i+5] += m[5] * mu */
  70881. "ldr r10, [%[m], #20]\n\t"
  70882. "ldr r8, [%[a], #20]\n\t"
  70883. "umaal r8, r3, r11, r10\n\t"
  70884. /* a[i+6] += m[6] * mu */
  70885. "ldr r10, [%[m], #24]\n\t"
  70886. "ldr r9, [%[a], #24]\n\t"
  70887. "umaal r9, r3, r11, r10\n\t"
  70888. "str r9, [%[a], #24]\n\t"
  70889. /* a[i+7] += m[7] * mu */
  70890. "ldr r10, [%[m], #28]\n\t"
  70891. "ldr r9, [%[a], #28]\n\t"
  70892. "umaal r9, r3, r11, r10\n\t"
  70893. "ldr r11, [%[a], #32]\n\t"
  70894. "mov r10, #0\n\t"
  70895. "umaal r3, r11, r10, r10\n\t"
  70896. "str r9, [%[a], #28]\n\t"
  70897. "adds r3, r3, lr\n\t"
  70898. "adc lr, r11, #0\n\t"
  70899. "str r3, [%[a], #32]\n\t"
  70900. /* i += 1 */
  70901. "add r12, r12, #4\n\t"
  70902. "add %[a], %[a], #4\n\t"
  70903. "cmp r12, #32\n\t"
  70904. "blt L_sp_256_mont_reduce_8_word_%=\n\t"
  70905. /* Loop Done */
  70906. "str r4, [%[a]]\n\t"
  70907. "str r5, [%[a], #4]\n\t"
  70908. "str r6, [%[a], #8]\n\t"
  70909. "str r7, [%[a], #12]\n\t"
  70910. "str r8, [%[a], #16]\n\t"
  70911. "mov %[mp], lr\n\t"
  70912. : [a] "+r" (a), [m] "+r" (m), [mp] "+r" (mp)
  70913. :
  70914. : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "cc"
  70915. );
  70916. sp_256_cond_sub_8(a - 8, a, m, (sp_digit)0 - mp);
  70917. }
  70918. #endif
  70919. #else
  70920. /* Reduce the number back to 256 bits using Montgomery reduction.
  70921. *
  70922. * a A single precision number to reduce in place.
  70923. * m The single precision number representing the modulus.
  70924. * mp The digit representing the negative inverse of m mod 2^n.
  70925. */
  70926. static SP_NOINLINE void sp_256_mont_reduce_8(sp_digit* a_p, const sp_digit* m_p, sp_digit mp_p)
  70927. {
  70928. register sp_digit* a asm ("r0") = (sp_digit*)a_p;
  70929. __asm__ __volatile__ (
  70930. "sub sp, sp, #0x44\n\t"
  70931. "str %[a], [sp, #64]\n\t"
  70932. "mov lr, sp\n\t"
  70933. "ldm %[a]!, {r1, r2, r3, r4, r5, r6, r7, r8}\n\t"
  70934. "stm lr!, {r1, r2, r3, r4, r5, r6, r7, r8}\n\t"
  70935. "ldm %[a], {r1, r2, r3, r4, r5, r6, r7, r8}\n\t"
  70936. "stm lr, {r1, r2, r3, r4, r5, r6, r7, r8}\n\t"
  70937. /* Start Reduction */
  70938. "ldm sp, {r5, r6, r7, r8, r9, r10, r11, r12}\n\t"
  70939. "mov r3, r11\n\t"
  70940. "mov r4, r12\n\t"
  70941. /* mu = a[0]-a[7] + a[0]-a[4] << 96 + (a[0]-a[1] * 2) << 192 */
  70942. /* - a[0] << 224 */
  70943. /* + (a[0]-a[1] * 2) << (6 * 32) */
  70944. "adds r11, r11, r5\n\t"
  70945. "adc r12, r12, r6\n\t"
  70946. "adds r11, r11, r5\n\t"
  70947. "adc r12, r12, r6\n\t"
  70948. /* - a[0] << (7 * 32) */
  70949. "sub r12, r12, r5\n\t"
  70950. /* + a[0]-a[4] << (3 * 32) */
  70951. "mov r0, r8\n\t"
  70952. "mov r1, r9\n\t"
  70953. "mov r2, r10\n\t"
  70954. "adds r8, r8, r5\n\t"
  70955. "adcs r9, r9, r6\n\t"
  70956. "adcs r10, r10, r7\n\t"
  70957. "adcs r11, r11, r0\n\t"
  70958. "adc r12, r12, r1\n\t"
  70959. /* a += mu * m */
  70960. /* += mu * ((1 << 256) - (1 << 224) + (1 << 192) + (1 << 96) - 1) */
  70961. /* a[0] = = t[0] */
  70962. /* a[1] = = t[1] */
  70963. /* a[2] = = t[2] */
  70964. /* a[3] += t[0] = t[3] */
  70965. /* a[4] += t[1] = t[4] */
  70966. /* a[5] += t[2] = t[5] */
  70967. /* a[6] += t[0] + t[3] = t[6] */
  70968. /* a[7] += t[1] + t[4] = t[7] + t[0] */
  70969. "adds r0, r0, r5\n\t"
  70970. "adcs r1, r1, r6\n\t"
  70971. "adcs r2, r2, r7\n\t"
  70972. "adcs r3, r3, r8\n\t"
  70973. "adcs r4, r4, r9\n\t"
  70974. "mov lr, #0\n\t"
  70975. "adc lr, lr, #0\n\t"
  70976. "adds r3, r3, r5\n\t"
  70977. "adcs r4, r4, r6\n\t"
  70978. "adc lr, lr, #0\n\t"
  70979. "str r4, [sp, #28]\n\t"
  70980. /* a[8] += t[0] + t[2] + t[5] + carry */
  70981. /* a[9] += t[1] + t[3] + t[6] */
  70982. /* a[10] += t[2] + t[4] + t[7] */
  70983. "add r0, sp, #32\n\t"
  70984. "ldm r0, {r2, r3, r4}\n\t"
  70985. "adds r2, r2, lr\n\t"
  70986. "adcs r3, r3, #0\n\t"
  70987. "adcs r4, r4, #0\n\t"
  70988. "mov lr, #0\n\t"
  70989. "adc lr, lr, #0\n\t"
  70990. "adds r2, r2, r5\n\t"
  70991. "adcs r3, r3, r6\n\t"
  70992. "adcs r4, r4, r7\n\t"
  70993. "adc lr, lr, #0\n\t"
  70994. "adds r2, r2, r7\n\t"
  70995. "adcs r3, r3, r8\n\t"
  70996. "adcs r4, r4, r9\n\t"
  70997. "adc lr, lr, #0\n\t"
  70998. "adds r2, r2, r10\n\t"
  70999. "adcs r3, r3, r11\n\t"
  71000. "adcs r4, r4, r12\n\t"
  71001. "adc lr, lr, #0\n\t"
  71002. "stm r0!, {r2, r3, r4}\n\t"
  71003. /* a[11] += t[3] + t[5] + carry */
  71004. /* a[12] += t[4] + t[6] */
  71005. /* a[13] += t[5] + t[7] */
  71006. /* a[14] += t[6] */
  71007. /* a[15] += t[7] */
  71008. "ldm r0, {r0, r1, r2, r3, r4}\n\t"
  71009. "adds r0, r0, lr\n\t"
  71010. "adcs r1, r1, #0\n\t"
  71011. "adcs r2, r2, #0\n\t"
  71012. "adcs r3, r3, #0\n\t"
  71013. "adcs r4, r4, #0\n\t"
  71014. "mov lr, #0\n\t"
  71015. "adc lr, lr, #0\n\t"
  71016. "adds r0, r0, r8\n\t"
  71017. "adcs r1, r1, r9\n\t"
  71018. "adcs r2, r2, r10\n\t"
  71019. "adcs r3, r3, r11\n\t"
  71020. "adcs r4, r4, r12\n\t"
  71021. "adc lr, lr, #0\n\t"
  71022. "adds r0, r0, r10\n\t"
  71023. "adcs r1, r1, r11\n\t"
  71024. "adcs r2, r2, r12\n\t"
  71025. "adcs r3, r3, #0\n\t"
  71026. "adcs r4, r4, #0\n\t"
  71027. "adc lr, lr, #0\n\t"
  71028. "str r0, [sp, #44]\n\t"
  71029. "str r1, [sp, #48]\n\t"
  71030. "str r2, [sp, #52]\n\t"
  71031. "str r3, [sp, #56]\n\t"
  71032. /* a[7..15] - t[0..7] */
  71033. "add r0, sp, #28\n\t"
  71034. "ldm r0, {r0, r1, r2, r3}\n\t"
  71035. "subs r0, r0, r5\n\t"
  71036. "sbcs r1, r1, r6\n\t"
  71037. "sbcs r2, r2, r7\n\t"
  71038. "sbcs r3, r3, r8\n\t"
  71039. "add r0, sp, #44\n\t"
  71040. "mov r8, r4\n\t"
  71041. "ldm r0, {r4, r5, r6, r7}\n\t"
  71042. "sbcs r4, r4, r9\n\t"
  71043. "sbcs r5, r5, r10\n\t"
  71044. "sbcs r6, r6, r11\n\t"
  71045. "sbcs r7, r7, r12\n\t"
  71046. "sbcs r8, r8, #0\n\t"
  71047. "sbc lr, lr, #0\n\t"
  71048. /* mask m and sub from result if overflow */
  71049. "rsb lr, lr, #0\n\t"
  71050. "subs r1, r1, lr\n\t"
  71051. "sbcs r2, r2, lr\n\t"
  71052. "sbcs r3, r3, lr\n\t"
  71053. "sbcs r4, r4, #0\n\t"
  71054. "sbcs r5, r5, #0\n\t"
  71055. "sbcs r6, r6, #0\n\t"
  71056. "sbcs r7, r7, lr, lsr #31\n\t"
  71057. "sbc r8, r8, lr\n\t"
  71058. "ldr %[a], [sp, #64]\n\t"
  71059. "stm %[a], {r1, r2, r3, r4, r5, r6, r7, r8}\n\t"
  71060. "add sp, sp, #0x44\n\t"
  71061. : [a] "+r" (a)
  71062. :
  71063. : "memory", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "lr", "cc"
  71064. );
  71065. (void)m_p;
  71066. (void)mp_p;
  71067. }
  71068. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  71069. /* Reduce the number back to 256 bits using Montgomery reduction.
  71070. *
  71071. * a A single precision number to reduce in place.
  71072. * m The single precision number representing the modulus.
  71073. * mp The digit representing the negative inverse of m mod 2^n.
  71074. */
  71075. static SP_NOINLINE void sp_256_mont_reduce_order_8(sp_digit* a_p, const sp_digit* m_p, sp_digit mp_p)
  71076. {
  71077. register sp_digit* a asm ("r0") = (sp_digit*)a_p;
  71078. register const sp_digit* m asm ("r1") = (const sp_digit*)m_p;
  71079. register sp_digit mp asm ("r2") = (sp_digit)mp_p;
  71080. __asm__ __volatile__ (
  71081. #if !(defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4))
  71082. "ldr r11, [%[m]]\n\t"
  71083. #endif
  71084. /* i = 0 */
  71085. "mov r9, #0\n\t"
  71086. "mov r3, #0\n\t"
  71087. "ldr r12, [%[a]]\n\t"
  71088. "ldr lr, [%[a], #4]\n\t"
  71089. "\n"
  71090. "L_sp_256_mont_reduce_order_8_word_%=: \n\t"
  71091. /* mu = a[i] * mp */
  71092. "mul r8, %[mp], r12\n\t"
  71093. /* a[i+0] += m[0] * mu */
  71094. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  71095. "ldr r11, [%[m]]\n\t"
  71096. #endif
  71097. "lsr r7, r11, #16\n\t"
  71098. "lsr r6, r8, #16\n\t"
  71099. "mul r5, r6, r7\n\t"
  71100. "lsl r7, r11, #16\n\t"
  71101. "lsr r7, r7, #16\n\t"
  71102. "mul r6, r7, r6\n\t"
  71103. "lsr r7, r6, #16\n\t"
  71104. "lsl r6, r6, #16\n\t"
  71105. "adds r12, r12, r6\n\t"
  71106. "adc r5, r5, r7\n\t"
  71107. "lsl r6, r8, #16\n\t"
  71108. "lsl r7, r11, #16\n\t"
  71109. "lsr r6, r6, #16\n\t"
  71110. "lsr r7, r7, #16\n\t"
  71111. "mul r7, r6, r7\n\t"
  71112. "adds r12, r12, r7\n\t"
  71113. "adc r5, r5, #0\n\t"
  71114. "lsr r7, r11, #16\n\t"
  71115. "mul r6, r7, r6\n\t"
  71116. "lsr r7, r6, #16\n\t"
  71117. "lsl r6, r6, #16\n\t"
  71118. "adds r12, r12, r6\n\t"
  71119. "adc r5, r5, r7\n\t"
  71120. /* a[i+1] += m[1] * mu */
  71121. "ldr r7, [%[m], #4]\n\t"
  71122. "lsr r10, r7, #16\n\t"
  71123. "lsr r6, r8, #16\n\t"
  71124. "mul r4, r6, r10\n\t"
  71125. "lsl r10, r7, #16\n\t"
  71126. "lsr r10, r10, #16\n\t"
  71127. "mul r6, r10, r6\n\t"
  71128. "lsr r10, r6, #16\n\t"
  71129. "lsl r6, r6, #16\n\t"
  71130. "adds lr, lr, r6\n\t"
  71131. "adc r4, r4, r10\n\t"
  71132. "lsl r6, r8, #16\n\t"
  71133. "lsl r10, r7, #16\n\t"
  71134. "lsr r6, r6, #16\n\t"
  71135. "lsr r10, r10, #16\n\t"
  71136. "mul r10, r6, r10\n\t"
  71137. "adds lr, lr, r10\n\t"
  71138. "adc r4, r4, #0\n\t"
  71139. "lsr r10, r7, #16\n\t"
  71140. "mul r6, r10, r6\n\t"
  71141. "lsr r10, r6, #16\n\t"
  71142. "lsl r6, r6, #16\n\t"
  71143. "adds lr, lr, r6\n\t"
  71144. "adc r4, r4, r10\n\t"
  71145. "mov r12, lr\n\t"
  71146. "adds r12, r12, r5\n\t"
  71147. "adc r4, r4, #0\n\t"
  71148. /* a[i+2] += m[2] * mu */
  71149. "ldr r7, [%[m], #8]\n\t"
  71150. "ldr lr, [%[a], #8]\n\t"
  71151. "lsr r10, r7, #16\n\t"
  71152. "lsr r6, r8, #16\n\t"
  71153. "mul r5, r6, r10\n\t"
  71154. "lsl r10, r7, #16\n\t"
  71155. "lsr r10, r10, #16\n\t"
  71156. "mul r6, r10, r6\n\t"
  71157. "lsr r10, r6, #16\n\t"
  71158. "lsl r6, r6, #16\n\t"
  71159. "adds lr, lr, r6\n\t"
  71160. "adc r5, r5, r10\n\t"
  71161. "lsl r6, r8, #16\n\t"
  71162. "lsl r10, r7, #16\n\t"
  71163. "lsr r6, r6, #16\n\t"
  71164. "lsr r10, r10, #16\n\t"
  71165. "mul r10, r6, r10\n\t"
  71166. "adds lr, lr, r10\n\t"
  71167. "adc r5, r5, #0\n\t"
  71168. "lsr r10, r7, #16\n\t"
  71169. "mul r6, r10, r6\n\t"
  71170. "lsr r10, r6, #16\n\t"
  71171. "lsl r6, r6, #16\n\t"
  71172. "adds lr, lr, r6\n\t"
  71173. "adc r5, r5, r10\n\t"
  71174. "adds lr, lr, r4\n\t"
  71175. "adc r5, r5, #0\n\t"
  71176. /* a[i+3] += m[3] * mu */
  71177. "ldr r7, [%[m], #12]\n\t"
  71178. "ldr r10, [%[a], #12]\n\t"
  71179. "lsr r11, r7, #16\n\t"
  71180. "lsr r6, r8, #16\n\t"
  71181. "mul r4, r6, r11\n\t"
  71182. "lsl r11, r7, #16\n\t"
  71183. "lsr r11, r11, #16\n\t"
  71184. "mul r6, r11, r6\n\t"
  71185. "lsr r11, r6, #16\n\t"
  71186. "lsl r6, r6, #16\n\t"
  71187. "adds r10, r10, r6\n\t"
  71188. "adc r4, r4, r11\n\t"
  71189. "lsl r6, r8, #16\n\t"
  71190. "lsl r11, r7, #16\n\t"
  71191. "lsr r6, r6, #16\n\t"
  71192. "lsr r11, r11, #16\n\t"
  71193. "mul r11, r6, r11\n\t"
  71194. "adds r10, r10, r11\n\t"
  71195. "adc r4, r4, #0\n\t"
  71196. "lsr r11, r7, #16\n\t"
  71197. "mul r6, r11, r6\n\t"
  71198. "lsr r11, r6, #16\n\t"
  71199. "lsl r6, r6, #16\n\t"
  71200. "adds r10, r10, r6\n\t"
  71201. "adc r4, r4, r11\n\t"
  71202. "adds r10, r10, r5\n\t"
  71203. "str r10, [%[a], #12]\n\t"
  71204. "adc r4, r4, #0\n\t"
  71205. /* a[i+4] += m[4] * mu */
  71206. "ldr r7, [%[m], #16]\n\t"
  71207. "ldr r10, [%[a], #16]\n\t"
  71208. "lsr r11, r7, #16\n\t"
  71209. "lsr r6, r8, #16\n\t"
  71210. "mul r5, r6, r11\n\t"
  71211. "lsl r11, r7, #16\n\t"
  71212. "lsr r11, r11, #16\n\t"
  71213. "mul r6, r11, r6\n\t"
  71214. "lsr r11, r6, #16\n\t"
  71215. "lsl r6, r6, #16\n\t"
  71216. "adds r10, r10, r6\n\t"
  71217. "adc r5, r5, r11\n\t"
  71218. "lsl r6, r8, #16\n\t"
  71219. "lsl r11, r7, #16\n\t"
  71220. "lsr r6, r6, #16\n\t"
  71221. "lsr r11, r11, #16\n\t"
  71222. "mul r11, r6, r11\n\t"
  71223. "adds r10, r10, r11\n\t"
  71224. "adc r5, r5, #0\n\t"
  71225. "lsr r11, r7, #16\n\t"
  71226. "mul r6, r11, r6\n\t"
  71227. "lsr r11, r6, #16\n\t"
  71228. "lsl r6, r6, #16\n\t"
  71229. "adds r10, r10, r6\n\t"
  71230. "adc r5, r5, r11\n\t"
  71231. "adds r10, r10, r4\n\t"
  71232. "str r10, [%[a], #16]\n\t"
  71233. "adc r5, r5, #0\n\t"
  71234. /* a[i+5] += m[5] * mu */
  71235. "ldr r7, [%[m], #20]\n\t"
  71236. "ldr r10, [%[a], #20]\n\t"
  71237. "lsr r11, r7, #16\n\t"
  71238. "lsr r6, r8, #16\n\t"
  71239. "mul r4, r6, r11\n\t"
  71240. "lsl r11, r7, #16\n\t"
  71241. "lsr r11, r11, #16\n\t"
  71242. "mul r6, r11, r6\n\t"
  71243. "lsr r11, r6, #16\n\t"
  71244. "lsl r6, r6, #16\n\t"
  71245. "adds r10, r10, r6\n\t"
  71246. "adc r4, r4, r11\n\t"
  71247. "lsl r6, r8, #16\n\t"
  71248. "lsl r11, r7, #16\n\t"
  71249. "lsr r6, r6, #16\n\t"
  71250. "lsr r11, r11, #16\n\t"
  71251. "mul r11, r6, r11\n\t"
  71252. "adds r10, r10, r11\n\t"
  71253. "adc r4, r4, #0\n\t"
  71254. "lsr r11, r7, #16\n\t"
  71255. "mul r6, r11, r6\n\t"
  71256. "lsr r11, r6, #16\n\t"
  71257. "lsl r6, r6, #16\n\t"
  71258. "adds r10, r10, r6\n\t"
  71259. "adc r4, r4, r11\n\t"
  71260. "adds r10, r10, r5\n\t"
  71261. "str r10, [%[a], #20]\n\t"
  71262. "adc r4, r4, #0\n\t"
  71263. /* a[i+6] += m[6] * mu */
  71264. "ldr r7, [%[m], #24]\n\t"
  71265. "ldr r10, [%[a], #24]\n\t"
  71266. "lsr r11, r7, #16\n\t"
  71267. "lsr r6, r8, #16\n\t"
  71268. "mul r5, r6, r11\n\t"
  71269. "lsl r11, r7, #16\n\t"
  71270. "lsr r11, r11, #16\n\t"
  71271. "mul r6, r11, r6\n\t"
  71272. "lsr r11, r6, #16\n\t"
  71273. "lsl r6, r6, #16\n\t"
  71274. "adds r10, r10, r6\n\t"
  71275. "adc r5, r5, r11\n\t"
  71276. "lsl r6, r8, #16\n\t"
  71277. "lsl r11, r7, #16\n\t"
  71278. "lsr r6, r6, #16\n\t"
  71279. "lsr r11, r11, #16\n\t"
  71280. "mul r11, r6, r11\n\t"
  71281. "adds r10, r10, r11\n\t"
  71282. "adc r5, r5, #0\n\t"
  71283. "lsr r11, r7, #16\n\t"
  71284. "mul r6, r11, r6\n\t"
  71285. "lsr r11, r6, #16\n\t"
  71286. "lsl r6, r6, #16\n\t"
  71287. "adds r10, r10, r6\n\t"
  71288. "adc r5, r5, r11\n\t"
  71289. "adds r10, r10, r4\n\t"
  71290. "str r10, [%[a], #24]\n\t"
  71291. "adc r5, r5, #0\n\t"
  71292. /* a[i+7] += m[7] * mu */
  71293. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  71294. "ldr r11, [%[m], #28]\n\t"
  71295. #else
  71296. "ldr r7, [%[m], #28]\n\t"
  71297. #endif
  71298. "ldr r10, [%[a], #28]\n\t"
  71299. "lsl r6, r8, #16\n\t"
  71300. "lsl r7, r11, #16\n\t"
  71301. "lsr r6, r6, #16\n\t"
  71302. "lsr r7, r7, #16\n\t"
  71303. "mul r7, r6, r7\n\t"
  71304. "adds r5, r5, r7\n\t"
  71305. "adcs r4, r3, #0\n\t"
  71306. "mov r3, #0\n\t"
  71307. "adc r3, r3, r3\n\t"
  71308. "lsr r7, r11, #16\n\t"
  71309. "mul r6, r7, r6\n\t"
  71310. "lsr r7, r6, #16\n\t"
  71311. "lsl r6, r6, #16\n\t"
  71312. "adds r5, r5, r6\n\t"
  71313. "adcs r4, r4, r7\n\t"
  71314. "adc r3, r3, #0\n\t"
  71315. "mov r6, r8\n\t"
  71316. "lsr r7, r11, #16\n\t"
  71317. "lsr r6, r6, #16\n\t"
  71318. "mul r7, r6, r7\n\t"
  71319. "adds r4, r4, r7\n\t"
  71320. "lsl r7, r11, #16\n\t"
  71321. "adc r3, r3, #0\n\t"
  71322. "lsr r7, r7, #16\n\t"
  71323. "mul r6, r7, r6\n\t"
  71324. "lsr r7, r6, #16\n\t"
  71325. "lsl r6, r6, #16\n\t"
  71326. "adds r5, r5, r6\n\t"
  71327. "adcs r4, r4, r7\n\t"
  71328. "adc r3, r3, #0\n\t"
  71329. "adds r10, r10, r5\n\t"
  71330. "str r10, [%[a], #28]\n\t"
  71331. "ldr r10, [%[a], #32]\n\t"
  71332. "adcs r10, r10, r4\n\t"
  71333. "str r10, [%[a], #32]\n\t"
  71334. "adc r3, r3, #0\n\t"
  71335. /* i += 1 */
  71336. "add r9, r9, #4\n\t"
  71337. "add %[a], %[a], #4\n\t"
  71338. "cmp r9, #32\n\t"
  71339. "blt L_sp_256_mont_reduce_order_8_word_%=\n\t"
  71340. /* Loop Done */
  71341. "str r12, [%[a]]\n\t"
  71342. "str lr, [%[a], #4]\n\t"
  71343. "mov %[mp], r3\n\t"
  71344. : [a] "+r" (a), [m] "+r" (m), [mp] "+r" (mp)
  71345. :
  71346. : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "cc"
  71347. );
  71348. sp_256_cond_sub_8(a - 8, a, m, (sp_digit)0 - mp);
  71349. }
  71350. #elif defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  71351. /* Reduce the number back to 256 bits using Montgomery reduction.
  71352. *
  71353. * a A single precision number to reduce in place.
  71354. * m The single precision number representing the modulus.
  71355. * mp The digit representing the negative inverse of m mod 2^n.
  71356. */
  71357. static SP_NOINLINE void sp_256_mont_reduce_order_8(sp_digit* a_p, const sp_digit* m_p, sp_digit mp_p)
  71358. {
  71359. register sp_digit* a asm ("r0") = (sp_digit*)a_p;
  71360. register const sp_digit* m asm ("r1") = (const sp_digit*)m_p;
  71361. register sp_digit mp asm ("r2") = (sp_digit)mp_p;
  71362. __asm__ __volatile__ (
  71363. "ldr r11, [%[m]]\n\t"
  71364. /* i = 0 */
  71365. "mov r9, #0\n\t"
  71366. "mov r3, #0\n\t"
  71367. "ldr r12, [%[a]]\n\t"
  71368. "ldr lr, [%[a], #4]\n\t"
  71369. "\n"
  71370. "L_sp_256_mont_reduce_order_8_word_%=: \n\t"
  71371. /* mu = a[i] * mp */
  71372. "mul r8, %[mp], r12\n\t"
  71373. /* a[i+0] += m[0] * mu */
  71374. "mov r5, #0\n\t"
  71375. "umlal r12, r5, r8, r11\n\t"
  71376. /* a[i+1] += m[1] * mu */
  71377. "ldr r7, [%[m], #4]\n\t"
  71378. "mov r4, #0\n\t"
  71379. "umlal lr, r4, r8, r7\n\t"
  71380. "mov r12, lr\n\t"
  71381. "adds r12, r12, r5\n\t"
  71382. "adc r4, r4, #0\n\t"
  71383. /* a[i+2] += m[2] * mu */
  71384. "ldr r7, [%[m], #8]\n\t"
  71385. "ldr lr, [%[a], #8]\n\t"
  71386. "mov r5, #0\n\t"
  71387. "umlal lr, r5, r8, r7\n\t"
  71388. "adds lr, lr, r4\n\t"
  71389. "adc r5, r5, #0\n\t"
  71390. /* a[i+3] += m[3] * mu */
  71391. "ldr r7, [%[m], #12]\n\t"
  71392. "ldr r10, [%[a], #12]\n\t"
  71393. "mov r4, #0\n\t"
  71394. "umlal r10, r4, r8, r7\n\t"
  71395. "adds r10, r10, r5\n\t"
  71396. "str r10, [%[a], #12]\n\t"
  71397. "adc r4, r4, #0\n\t"
  71398. /* a[i+4] += m[4] * mu */
  71399. "ldr r7, [%[m], #16]\n\t"
  71400. "ldr r10, [%[a], #16]\n\t"
  71401. "mov r5, #0\n\t"
  71402. "umlal r10, r5, r8, r7\n\t"
  71403. "adds r10, r10, r4\n\t"
  71404. "str r10, [%[a], #16]\n\t"
  71405. "adc r5, r5, #0\n\t"
  71406. /* a[i+5] += m[5] * mu */
  71407. "ldr r7, [%[m], #20]\n\t"
  71408. "ldr r10, [%[a], #20]\n\t"
  71409. "mov r4, #0\n\t"
  71410. "umlal r10, r4, r8, r7\n\t"
  71411. "adds r10, r10, r5\n\t"
  71412. "str r10, [%[a], #20]\n\t"
  71413. "adc r4, r4, #0\n\t"
  71414. /* a[i+6] += m[6] * mu */
  71415. "ldr r7, [%[m], #24]\n\t"
  71416. "ldr r10, [%[a], #24]\n\t"
  71417. "mov r5, #0\n\t"
  71418. "umlal r10, r5, r8, r7\n\t"
  71419. "adds r10, r10, r4\n\t"
  71420. "str r10, [%[a], #24]\n\t"
  71421. "adc r5, r5, #0\n\t"
  71422. /* a[i+7] += m[7] * mu */
  71423. "ldr r7, [%[m], #28]\n\t"
  71424. "ldr r10, [%[a], #28]\n\t"
  71425. "umull r6, r7, r8, r7\n\t"
  71426. "adds r5, r5, r6\n\t"
  71427. "adcs r4, r7, r3\n\t"
  71428. "mov r3, #0\n\t"
  71429. "adc r3, r3, r3\n\t"
  71430. "adds r10, r10, r5\n\t"
  71431. "str r10, [%[a], #28]\n\t"
  71432. "ldr r10, [%[a], #32]\n\t"
  71433. "adcs r10, r10, r4\n\t"
  71434. "str r10, [%[a], #32]\n\t"
  71435. "adc r3, r3, #0\n\t"
  71436. /* i += 1 */
  71437. "add r9, r9, #4\n\t"
  71438. "add %[a], %[a], #4\n\t"
  71439. "cmp r9, #32\n\t"
  71440. "blt L_sp_256_mont_reduce_order_8_word_%=\n\t"
  71441. /* Loop Done */
  71442. "str r12, [%[a]]\n\t"
  71443. "str lr, [%[a], #4]\n\t"
  71444. "mov %[mp], r3\n\t"
  71445. : [a] "+r" (a), [m] "+r" (m), [mp] "+r" (mp)
  71446. :
  71447. : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "cc"
  71448. );
  71449. sp_256_cond_sub_8(a - 8, a, m, (sp_digit)0 - mp);
  71450. }
  71451. #else
  71452. /* Reduce the number back to 256 bits using Montgomery reduction.
  71453. *
  71454. * a A single precision number to reduce in place.
  71455. * m The single precision number representing the modulus.
  71456. * mp The digit representing the negative inverse of m mod 2^n.
  71457. */
  71458. static SP_NOINLINE void sp_256_mont_reduce_order_8(sp_digit* a_p, const sp_digit* m_p, sp_digit mp_p)
  71459. {
  71460. register sp_digit* a asm ("r0") = (sp_digit*)a_p;
  71461. register const sp_digit* m asm ("r1") = (const sp_digit*)m_p;
  71462. register sp_digit mp asm ("r2") = (sp_digit)mp_p;
  71463. __asm__ __volatile__ (
  71464. /* i = 0 */
  71465. "mov r12, #0\n\t"
  71466. "mov lr, #0\n\t"
  71467. "ldr r4, [%[a]]\n\t"
  71468. "ldr r5, [%[a], #4]\n\t"
  71469. "ldr r6, [%[a], #8]\n\t"
  71470. "ldr r7, [%[a], #12]\n\t"
  71471. "ldr r8, [%[a], #16]\n\t"
  71472. "\n"
  71473. "L_sp_256_mont_reduce_order_8_word_%=: \n\t"
  71474. /* mu = a[i] * mp */
  71475. "mul r11, %[mp], r4\n\t"
  71476. /* a[i+0] += m[0] * mu */
  71477. "ldr r10, [%[m]]\n\t"
  71478. "mov r3, #0\n\t"
  71479. "umaal r4, r3, r11, r10\n\t"
  71480. /* a[i+1] += m[1] * mu */
  71481. "ldr r10, [%[m], #4]\n\t"
  71482. "mov r4, r5\n\t"
  71483. "umaal r4, r3, r11, r10\n\t"
  71484. /* a[i+2] += m[2] * mu */
  71485. "ldr r10, [%[m], #8]\n\t"
  71486. "mov r5, r6\n\t"
  71487. "umaal r5, r3, r11, r10\n\t"
  71488. /* a[i+3] += m[3] * mu */
  71489. "ldr r10, [%[m], #12]\n\t"
  71490. "mov r6, r7\n\t"
  71491. "umaal r6, r3, r11, r10\n\t"
  71492. /* a[i+4] += m[4] * mu */
  71493. "ldr r10, [%[m], #16]\n\t"
  71494. "mov r7, r8\n\t"
  71495. "umaal r7, r3, r11, r10\n\t"
  71496. /* a[i+5] += m[5] * mu */
  71497. "ldr r10, [%[m], #20]\n\t"
  71498. "ldr r8, [%[a], #20]\n\t"
  71499. "umaal r8, r3, r11, r10\n\t"
  71500. /* a[i+6] += m[6] * mu */
  71501. "ldr r10, [%[m], #24]\n\t"
  71502. "ldr r9, [%[a], #24]\n\t"
  71503. "umaal r9, r3, r11, r10\n\t"
  71504. "str r9, [%[a], #24]\n\t"
  71505. /* a[i+7] += m[7] * mu */
  71506. "ldr r10, [%[m], #28]\n\t"
  71507. "ldr r9, [%[a], #28]\n\t"
  71508. "umaal r9, r3, r11, r10\n\t"
  71509. "ldr r11, [%[a], #32]\n\t"
  71510. "mov r10, #0\n\t"
  71511. "umaal r3, r11, r10, r10\n\t"
  71512. "str r9, [%[a], #28]\n\t"
  71513. "adds r3, r3, lr\n\t"
  71514. "adc lr, r11, #0\n\t"
  71515. "str r3, [%[a], #32]\n\t"
  71516. /* i += 1 */
  71517. "add r12, r12, #4\n\t"
  71518. "add %[a], %[a], #4\n\t"
  71519. "cmp r12, #32\n\t"
  71520. "blt L_sp_256_mont_reduce_order_8_word_%=\n\t"
  71521. /* Loop Done */
  71522. "str r4, [%[a]]\n\t"
  71523. "str r5, [%[a], #4]\n\t"
  71524. "str r6, [%[a], #8]\n\t"
  71525. "str r7, [%[a], #12]\n\t"
  71526. "str r8, [%[a], #16]\n\t"
  71527. "mov %[mp], lr\n\t"
  71528. : [a] "+r" (a), [m] "+r" (m), [mp] "+r" (mp)
  71529. :
  71530. : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "cc"
  71531. );
  71532. sp_256_cond_sub_8(a - 8, a, m, (sp_digit)0 - mp);
  71533. }
  71534. #endif
  71535. #endif /* WOLFSSL_SP_SMALL */
  71536. /* Map the Montgomery form projective coordinate point to an affine point.
  71537. *
  71538. * r Resulting affine coordinate point.
  71539. * p Montgomery form projective coordinate point.
  71540. * t Temporary ordinate data.
  71541. */
  71542. static void sp_256_map_8(sp_point_256* r, const sp_point_256* p,
  71543. sp_digit* t)
  71544. {
  71545. sp_digit* t1 = t;
  71546. sp_digit* t2 = t + 2*8;
  71547. sp_int32 n;
  71548. sp_256_mont_inv_8(t1, p->z, t + 2*8);
  71549. sp_256_mont_sqr_8(t2, t1, p256_mod, p256_mp_mod);
  71550. sp_256_mont_mul_8(t1, t2, t1, p256_mod, p256_mp_mod);
  71551. /* x /= z^2 */
  71552. sp_256_mont_mul_8(r->x, p->x, t2, p256_mod, p256_mp_mod);
  71553. XMEMSET(r->x + 8, 0, sizeof(sp_digit) * 8U);
  71554. sp_256_mont_reduce_8(r->x, p256_mod, p256_mp_mod);
  71555. /* Reduce x to less than modulus */
  71556. n = sp_256_cmp_8(r->x, p256_mod);
  71557. sp_256_cond_sub_8(r->x, r->x, p256_mod, ~(n >> 31));
  71558. sp_256_norm_8(r->x);
  71559. /* y /= z^3 */
  71560. sp_256_mont_mul_8(r->y, p->y, t1, p256_mod, p256_mp_mod);
  71561. XMEMSET(r->y + 8, 0, sizeof(sp_digit) * 8U);
  71562. sp_256_mont_reduce_8(r->y, p256_mod, p256_mp_mod);
  71563. /* Reduce y to less than modulus */
  71564. n = sp_256_cmp_8(r->y, p256_mod);
  71565. sp_256_cond_sub_8(r->y, r->y, p256_mod, ~(n >> 31));
  71566. sp_256_norm_8(r->y);
  71567. XMEMSET(r->z, 0, sizeof(r->z) / 2);
  71568. r->z[0] = 1;
  71569. }
  71570. /* Add two Montgomery form numbers (r = a + b % m).
  71571. *
  71572. * r Result of addition.
  71573. * a First number to add in Montgomery form.
  71574. * b Second number to add in Montgomery form.
  71575. * m Modulus (prime).
  71576. */
  71577. 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)
  71578. {
  71579. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  71580. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  71581. register const sp_digit* b asm ("r2") = (const sp_digit*)b_p;
  71582. __asm__ __volatile__ (
  71583. "mov lr, #0\n\t"
  71584. "ldm %[a], {r5, r6, r7, r8, r9, r10, r11, r12}\n\t"
  71585. "ldm %[b]!, {r3, r4}\n\t"
  71586. "adds r5, r5, r3\n\t"
  71587. "adcs r6, r6, r4\n\t"
  71588. "ldm %[b]!, {r3, r4}\n\t"
  71589. "adcs r7, r7, r3\n\t"
  71590. "adcs r8, r8, r4\n\t"
  71591. "ldm %[b]!, {r3, r4}\n\t"
  71592. "adcs r9, r9, r3\n\t"
  71593. "adcs r10, r10, r4\n\t"
  71594. "ldm %[b]!, {r3, r4}\n\t"
  71595. "adcs r11, r11, r3\n\t"
  71596. "adcs r12, r12, r4\n\t"
  71597. "adc lr, lr, #0\n\t"
  71598. "rsb lr, lr, #0\n\t"
  71599. "subs r5, r5, lr\n\t"
  71600. "sbcs r6, r6, lr\n\t"
  71601. "sbcs r7, r7, lr\n\t"
  71602. "sbcs r8, r8, #0\n\t"
  71603. "sbcs r9, r9, #0\n\t"
  71604. "sbcs r10, r10, #0\n\t"
  71605. "sbcs r11, r11, lr, lsr #31\n\t"
  71606. "sbcs r12, r12, lr\n\t"
  71607. "sbc %[b], %[b], %[b]\n\t"
  71608. "sub lr, lr, %[b]\n\t"
  71609. "subs r5, r5, lr\n\t"
  71610. "sbcs r6, r6, lr\n\t"
  71611. "sbcs r7, r7, lr\n\t"
  71612. "sbcs r8, r8, #0\n\t"
  71613. "sbcs r9, r9, #0\n\t"
  71614. "sbcs r10, r10, #0\n\t"
  71615. "sbcs r11, r11, lr, lsr #31\n\t"
  71616. "sbc r12, r12, lr\n\t"
  71617. "stm %[r], {r5, r6, r7, r8, r9, r10, r11, r12}\n\t"
  71618. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  71619. :
  71620. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "lr", "cc"
  71621. );
  71622. (void)m_p;
  71623. }
  71624. /* Double a Montgomery form number (r = a + a % m).
  71625. *
  71626. * r Result of doubling.
  71627. * a Number to double in Montgomery form.
  71628. * m Modulus (prime).
  71629. */
  71630. static void sp_256_mont_dbl_8(sp_digit* r_p, const sp_digit* a_p, const sp_digit* m_p)
  71631. {
  71632. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  71633. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  71634. __asm__ __volatile__ (
  71635. "mov r2, #0\n\t"
  71636. "ldm %[a], {r4, r5, r6, r7, r8, r9, r10, r11}\n\t"
  71637. "adds r4, r4, r4\n\t"
  71638. "adcs r5, r5, r5\n\t"
  71639. "adcs r6, r6, r6\n\t"
  71640. "adcs r7, r7, r7\n\t"
  71641. "adcs r8, r8, r8\n\t"
  71642. "adcs r9, r9, r9\n\t"
  71643. "adcs r10, r10, r10\n\t"
  71644. "adcs r11, r11, r11\n\t"
  71645. "adc r2, r2, #0\n\t"
  71646. "rsb r2, r2, #0\n\t"
  71647. "subs r4, r4, r2\n\t"
  71648. "sbcs r5, r5, r2\n\t"
  71649. "sbcs r6, r6, r2\n\t"
  71650. "sbcs r7, r7, #0\n\t"
  71651. "sbcs r8, r8, #0\n\t"
  71652. "sbcs r9, r9, #0\n\t"
  71653. "sbcs r10, r10, r2, lsr #31\n\t"
  71654. "sbcs r11, r11, r2\n\t"
  71655. "sbc %[a], %[a], %[a]\n\t"
  71656. "sub r2, r2, %[a]\n\t"
  71657. "subs r4, r4, r2\n\t"
  71658. "sbcs r5, r5, r2\n\t"
  71659. "sbcs r6, r6, r2\n\t"
  71660. "sbcs r7, r7, #0\n\t"
  71661. "sbcs r8, r8, #0\n\t"
  71662. "sbcs r9, r9, #0\n\t"
  71663. "sbcs r10, r10, r2, lsr #31\n\t"
  71664. "sbc r11, r11, r2\n\t"
  71665. "stm %[r], {r4, r5, r6, r7, r8, r9, r10, r11}\n\t"
  71666. : [r] "+r" (r), [a] "+r" (a)
  71667. :
  71668. : "memory", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r2", "cc"
  71669. );
  71670. (void)m_p;
  71671. }
  71672. /* Triple a Montgomery form number (r = a + a + a % m).
  71673. *
  71674. * r Result of Tripling.
  71675. * a Number to triple in Montgomery form.
  71676. * m Modulus (prime).
  71677. */
  71678. static void sp_256_mont_tpl_8(sp_digit* r_p, const sp_digit* a_p, const sp_digit* m_p)
  71679. {
  71680. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  71681. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  71682. __asm__ __volatile__ (
  71683. "mov r12, #0\n\t"
  71684. "ldm %[a], {r4, r5, r6, r7, r8, r9, r10, r11}\n\t"
  71685. "adds r4, r4, r4\n\t"
  71686. "adcs r5, r5, r5\n\t"
  71687. "adcs r6, r6, r6\n\t"
  71688. "adcs r7, r7, r7\n\t"
  71689. "adcs r8, r8, r8\n\t"
  71690. "adcs r9, r9, r9\n\t"
  71691. "adcs r10, r10, r10\n\t"
  71692. "adcs r11, r11, r11\n\t"
  71693. "adc r12, r12, #0\n\t"
  71694. "rsb r12, r12, #0\n\t"
  71695. "subs r4, r4, r12\n\t"
  71696. "sbcs r5, r5, r12\n\t"
  71697. "sbcs r6, r6, r12\n\t"
  71698. "sbcs r7, r7, #0\n\t"
  71699. "sbcs r8, r8, #0\n\t"
  71700. "sbcs r9, r9, #0\n\t"
  71701. "sbcs r10, r10, r12, lsr #31\n\t"
  71702. "sbcs r11, r11, r12\n\t"
  71703. "sbc r2, r2, r2\n\t"
  71704. "sub r12, r12, r2\n\t"
  71705. "subs r4, r4, r12\n\t"
  71706. "sbcs r5, r5, r12\n\t"
  71707. "sbcs r6, r6, r12\n\t"
  71708. "sbcs r7, r7, #0\n\t"
  71709. "sbcs r8, r8, #0\n\t"
  71710. "sbcs r9, r9, #0\n\t"
  71711. "sbcs r10, r10, r12, lsr #31\n\t"
  71712. "sbc r11, r11, r12\n\t"
  71713. "ldm %[a]!, {r2, r3}\n\t"
  71714. "adds r4, r4, r2\n\t"
  71715. "adcs r5, r5, r3\n\t"
  71716. "ldm %[a]!, {r2, r3}\n\t"
  71717. "adcs r6, r6, r2\n\t"
  71718. "adcs r7, r7, r3\n\t"
  71719. "ldm %[a]!, {r2, r3}\n\t"
  71720. "adcs r8, r8, r2\n\t"
  71721. "adcs r9, r9, r3\n\t"
  71722. "ldm %[a]!, {r2, r3}\n\t"
  71723. "adcs r10, r10, r2\n\t"
  71724. "adcs r11, r11, r3\n\t"
  71725. "adc r12, r12, #0\n\t"
  71726. "rsb r12, r12, #0\n\t"
  71727. "subs r4, r4, r12\n\t"
  71728. "sbcs r5, r5, r12\n\t"
  71729. "sbcs r6, r6, r12\n\t"
  71730. "sbcs r7, r7, #0\n\t"
  71731. "sbcs r8, r8, #0\n\t"
  71732. "sbcs r9, r9, #0\n\t"
  71733. "sbcs r10, r10, r12, lsr #31\n\t"
  71734. "sbcs r11, r11, r12\n\t"
  71735. "sbc r2, r2, r2\n\t"
  71736. "sub r12, r12, r2\n\t"
  71737. "subs r4, r4, r12\n\t"
  71738. "sbcs r5, r5, r12\n\t"
  71739. "sbcs r6, r6, r12\n\t"
  71740. "sbcs r7, r7, #0\n\t"
  71741. "sbcs r8, r8, #0\n\t"
  71742. "sbcs r9, r9, #0\n\t"
  71743. "sbcs r10, r10, r12, lsr #31\n\t"
  71744. "sbc r11, r11, r12\n\t"
  71745. "stm %[r], {r4, r5, r6, r7, r8, r9, r10, r11}\n\t"
  71746. : [r] "+r" (r), [a] "+r" (a)
  71747. :
  71748. : "memory", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r2", "r3", "r12", "cc"
  71749. );
  71750. (void)m_p;
  71751. }
  71752. /* Subtract two Montgomery form numbers (r = a - b % m).
  71753. *
  71754. * r Result of subtration.
  71755. * a Number to subtract from in Montgomery form.
  71756. * b Number to subtract with in Montgomery form.
  71757. * m Modulus (prime).
  71758. */
  71759. 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)
  71760. {
  71761. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  71762. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  71763. register const sp_digit* b asm ("r2") = (const sp_digit*)b_p;
  71764. __asm__ __volatile__ (
  71765. "mov lr, #0\n\t"
  71766. "ldm %[a], {r5, r6, r7, r8, r9, r10, r11, r12}\n\t"
  71767. "ldm %[b]!, {r3, r4}\n\t"
  71768. "subs r5, r5, r3\n\t"
  71769. "sbcs r6, r6, r4\n\t"
  71770. "ldm %[b]!, {r3, r4}\n\t"
  71771. "sbcs r7, r7, r3\n\t"
  71772. "sbcs r8, r8, r4\n\t"
  71773. "ldm %[b]!, {r3, r4}\n\t"
  71774. "sbcs r9, r9, r3\n\t"
  71775. "sbcs r10, r10, r4\n\t"
  71776. "ldm %[b]!, {r3, r4}\n\t"
  71777. "sbcs r11, r11, r3\n\t"
  71778. "sbcs r12, r12, r4\n\t"
  71779. "sbc lr, lr, #0\n\t"
  71780. "adds r5, r5, lr\n\t"
  71781. "adcs r6, r6, lr\n\t"
  71782. "adcs r7, r7, lr\n\t"
  71783. "adcs r8, r8, #0\n\t"
  71784. "adcs r9, r9, #0\n\t"
  71785. "adcs r10, r10, #0\n\t"
  71786. "adcs r11, r11, lr, lsr #31\n\t"
  71787. "adcs r12, r12, lr\n\t"
  71788. "adc lr, lr, #0\n\t"
  71789. "adds r5, r5, lr\n\t"
  71790. "adcs r6, r6, lr\n\t"
  71791. "adcs r7, r7, lr\n\t"
  71792. "adcs r8, r8, #0\n\t"
  71793. "adcs r9, r9, #0\n\t"
  71794. "adcs r10, r10, #0\n\t"
  71795. "adcs r11, r11, lr, lsr #31\n\t"
  71796. "adc r12, r12, lr\n\t"
  71797. "stm %[r], {r5, r6, r7, r8, r9, r10, r11, r12}\n\t"
  71798. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  71799. :
  71800. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "lr", "cc"
  71801. );
  71802. (void)m_p;
  71803. }
  71804. /* Divide the number by 2 mod the modulus (prime). (r = a / 2 % m)
  71805. *
  71806. * r Result of division by 2.
  71807. * a Number to divide.
  71808. * m Modulus (prime).
  71809. */
  71810. static void sp_256_mont_div2_8(sp_digit* r_p, const sp_digit* a_p, const sp_digit* m_p)
  71811. {
  71812. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  71813. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  71814. register const sp_digit* m asm ("r2") = (const sp_digit*)m_p;
  71815. __asm__ __volatile__ (
  71816. "ldm %[a], {r4, r5, r6, r7}\n\t"
  71817. "and r3, r4, #1\n\t"
  71818. "rsb r8, r3, #0\n\t"
  71819. "adds r4, r4, r8\n\t"
  71820. "adcs r5, r5, r8\n\t"
  71821. "adcs r6, r6, r8\n\t"
  71822. "adcs r7, r7, #0\n\t"
  71823. "stm %[r], {r4, r5, r6, r7}\n\t"
  71824. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  71825. "ldr r4, [%[a], #16]\n\t"
  71826. "ldr r5, [%[a], #20]\n\t"
  71827. #else
  71828. "ldrd r4, r5, [%[a], #16]\n\t"
  71829. #endif
  71830. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  71831. "ldr r6, [%[a], #24]\n\t"
  71832. "ldr r7, [%[a], #28]\n\t"
  71833. #else
  71834. "ldrd r6, r7, [%[a], #24]\n\t"
  71835. #endif
  71836. "adcs r4, r4, #0\n\t"
  71837. "adcs r5, r5, #0\n\t"
  71838. "adcs r6, r6, r8, lsr #31\n\t"
  71839. "adcs r7, r7, r8\n\t"
  71840. "mov r3, #0\n\t"
  71841. "adc r3, r3, #0\n\t"
  71842. "lsr r8, r4, #1\n\t"
  71843. "lsr r9, r5, #1\n\t"
  71844. "lsr r10, r6, #1\n\t"
  71845. "lsr r11, r7, #1\n\t"
  71846. "orr r8, r8, r5, lsl #31\n\t"
  71847. "orr r9, r9, r6, lsl #31\n\t"
  71848. "orr r10, r10, r7, lsl #31\n\t"
  71849. "orr r11, r11, r3, lsl #31\n\t"
  71850. "mov r3, r4\n\t"
  71851. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  71852. "str r8, [%[r], #16]\n\t"
  71853. "str r9, [%[r], #20]\n\t"
  71854. #else
  71855. "strd r8, r9, [%[r], #16]\n\t"
  71856. #endif
  71857. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  71858. "str r10, [%[r], #24]\n\t"
  71859. "str r11, [%[r], #28]\n\t"
  71860. #else
  71861. "strd r10, r11, [%[r], #24]\n\t"
  71862. #endif
  71863. "ldm %[r], {r4, r5, r6, r7}\n\t"
  71864. "lsr r8, r4, #1\n\t"
  71865. "lsr r9, r5, #1\n\t"
  71866. "lsr r10, r6, #1\n\t"
  71867. "lsr r11, r7, #1\n\t"
  71868. "orr r8, r8, r5, lsl #31\n\t"
  71869. "orr r9, r9, r6, lsl #31\n\t"
  71870. "orr r10, r10, r7, lsl #31\n\t"
  71871. "orr r11, r11, r3, lsl #31\n\t"
  71872. "stm %[r], {r8, r9, r10, r11}\n\t"
  71873. : [r] "+r" (r), [a] "+r" (a), [m] "+r" (m)
  71874. :
  71875. : "memory", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r3", "cc"
  71876. );
  71877. }
  71878. /* Double the Montgomery form projective point p.
  71879. *
  71880. * r Result of doubling point.
  71881. * p Point to double.
  71882. * t Temporary ordinate data.
  71883. */
  71884. static void sp_256_proj_point_dbl_8(sp_point_256* r, const sp_point_256* p,
  71885. sp_digit* t)
  71886. {
  71887. sp_digit* t1 = t;
  71888. sp_digit* t2 = t + 2*8;
  71889. sp_digit* x;
  71890. sp_digit* y;
  71891. sp_digit* z;
  71892. x = r->x;
  71893. y = r->y;
  71894. z = r->z;
  71895. /* Put infinity into result. */
  71896. if (r != p) {
  71897. r->infinity = p->infinity;
  71898. }
  71899. /* T1 = Z * Z */
  71900. sp_256_mont_sqr_8(t1, p->z, p256_mod, p256_mp_mod);
  71901. /* Z = Y * Z */
  71902. sp_256_mont_mul_8(z, p->y, p->z, p256_mod, p256_mp_mod);
  71903. /* Z = 2Z */
  71904. sp_256_mont_dbl_8(z, z, p256_mod);
  71905. /* T2 = X - T1 */
  71906. sp_256_mont_sub_8(t2, p->x, t1, p256_mod);
  71907. /* T1 = X + T1 */
  71908. sp_256_mont_add_8(t1, p->x, t1, p256_mod);
  71909. /* T2 = T1 * T2 */
  71910. sp_256_mont_mul_8(t2, t1, t2, p256_mod, p256_mp_mod);
  71911. /* T1 = 3T2 */
  71912. sp_256_mont_tpl_8(t1, t2, p256_mod);
  71913. /* Y = 2Y */
  71914. sp_256_mont_dbl_8(y, p->y, p256_mod);
  71915. /* Y = Y * Y */
  71916. sp_256_mont_sqr_8(y, y, p256_mod, p256_mp_mod);
  71917. /* T2 = Y * Y */
  71918. sp_256_mont_sqr_8(t2, y, p256_mod, p256_mp_mod);
  71919. /* T2 = T2/2 */
  71920. sp_256_mont_div2_8(t2, t2, p256_mod);
  71921. /* Y = Y * X */
  71922. sp_256_mont_mul_8(y, y, p->x, p256_mod, p256_mp_mod);
  71923. /* X = T1 * T1 */
  71924. sp_256_mont_sqr_8(x, t1, p256_mod, p256_mp_mod);
  71925. /* X = X - Y */
  71926. sp_256_mont_sub_8(x, x, y, p256_mod);
  71927. /* X = X - Y */
  71928. sp_256_mont_sub_8(x, x, y, p256_mod);
  71929. /* Y = Y - X */
  71930. sp_256_mont_sub_8(y, y, x, p256_mod);
  71931. /* Y = Y * T1 */
  71932. sp_256_mont_mul_8(y, y, t1, p256_mod, p256_mp_mod);
  71933. /* Y = Y - T2 */
  71934. sp_256_mont_sub_8(y, y, t2, p256_mod);
  71935. }
  71936. #ifdef WOLFSSL_SP_NONBLOCK
  71937. typedef struct sp_256_proj_point_dbl_8_ctx {
  71938. int state;
  71939. sp_digit* t1;
  71940. sp_digit* t2;
  71941. sp_digit* x;
  71942. sp_digit* y;
  71943. sp_digit* z;
  71944. } sp_256_proj_point_dbl_8_ctx;
  71945. /* Double the Montgomery form projective point p.
  71946. *
  71947. * r Result of doubling point.
  71948. * p Point to double.
  71949. * t Temporary ordinate data.
  71950. */
  71951. static int sp_256_proj_point_dbl_8_nb(sp_ecc_ctx_t* sp_ctx, sp_point_256* r,
  71952. const sp_point_256* p, sp_digit* t)
  71953. {
  71954. int err = FP_WOULDBLOCK;
  71955. sp_256_proj_point_dbl_8_ctx* ctx = (sp_256_proj_point_dbl_8_ctx*)sp_ctx->data;
  71956. typedef char ctx_size_test[sizeof(sp_256_proj_point_dbl_8_ctx) >= sizeof(*sp_ctx) ? -1 : 1];
  71957. (void)sizeof(ctx_size_test);
  71958. switch (ctx->state) {
  71959. case 0:
  71960. ctx->t1 = t;
  71961. ctx->t2 = t + 2*8;
  71962. ctx->x = r->x;
  71963. ctx->y = r->y;
  71964. ctx->z = r->z;
  71965. /* Put infinity into result. */
  71966. if (r != p) {
  71967. r->infinity = p->infinity;
  71968. }
  71969. ctx->state = 1;
  71970. break;
  71971. case 1:
  71972. /* T1 = Z * Z */
  71973. sp_256_mont_sqr_8(ctx->t1, p->z, p256_mod, p256_mp_mod);
  71974. ctx->state = 2;
  71975. break;
  71976. case 2:
  71977. /* Z = Y * Z */
  71978. sp_256_mont_mul_8(ctx->z, p->y, p->z, p256_mod, p256_mp_mod);
  71979. ctx->state = 3;
  71980. break;
  71981. case 3:
  71982. /* Z = 2Z */
  71983. sp_256_mont_dbl_8(ctx->z, ctx->z, p256_mod);
  71984. ctx->state = 4;
  71985. break;
  71986. case 4:
  71987. /* T2 = X - T1 */
  71988. sp_256_mont_sub_8(ctx->t2, p->x, ctx->t1, p256_mod);
  71989. ctx->state = 5;
  71990. break;
  71991. case 5:
  71992. /* T1 = X + T1 */
  71993. sp_256_mont_add_8(ctx->t1, p->x, ctx->t1, p256_mod);
  71994. ctx->state = 6;
  71995. break;
  71996. case 6:
  71997. /* T2 = T1 * T2 */
  71998. sp_256_mont_mul_8(ctx->t2, ctx->t1, ctx->t2, p256_mod, p256_mp_mod);
  71999. ctx->state = 7;
  72000. break;
  72001. case 7:
  72002. /* T1 = 3T2 */
  72003. sp_256_mont_tpl_8(ctx->t1, ctx->t2, p256_mod);
  72004. ctx->state = 8;
  72005. break;
  72006. case 8:
  72007. /* Y = 2Y */
  72008. sp_256_mont_dbl_8(ctx->y, p->y, p256_mod);
  72009. ctx->state = 9;
  72010. break;
  72011. case 9:
  72012. /* Y = Y * Y */
  72013. sp_256_mont_sqr_8(ctx->y, ctx->y, p256_mod, p256_mp_mod);
  72014. ctx->state = 10;
  72015. break;
  72016. case 10:
  72017. /* T2 = Y * Y */
  72018. sp_256_mont_sqr_8(ctx->t2, ctx->y, p256_mod, p256_mp_mod);
  72019. ctx->state = 11;
  72020. break;
  72021. case 11:
  72022. /* T2 = T2/2 */
  72023. sp_256_mont_div2_8(ctx->t2, ctx->t2, p256_mod);
  72024. ctx->state = 12;
  72025. break;
  72026. case 12:
  72027. /* Y = Y * X */
  72028. sp_256_mont_mul_8(ctx->y, ctx->y, p->x, p256_mod, p256_mp_mod);
  72029. ctx->state = 13;
  72030. break;
  72031. case 13:
  72032. /* X = T1 * T1 */
  72033. sp_256_mont_sqr_8(ctx->x, ctx->t1, p256_mod, p256_mp_mod);
  72034. ctx->state = 14;
  72035. break;
  72036. case 14:
  72037. /* X = X - Y */
  72038. sp_256_mont_sub_8(ctx->x, ctx->x, ctx->y, p256_mod);
  72039. ctx->state = 15;
  72040. break;
  72041. case 15:
  72042. /* X = X - Y */
  72043. sp_256_mont_sub_8(ctx->x, ctx->x, ctx->y, p256_mod);
  72044. ctx->state = 16;
  72045. break;
  72046. case 16:
  72047. /* Y = Y - X */
  72048. sp_256_mont_sub_8(ctx->y, ctx->y, ctx->x, p256_mod);
  72049. ctx->state = 17;
  72050. break;
  72051. case 17:
  72052. /* Y = Y * T1 */
  72053. sp_256_mont_mul_8(ctx->y, ctx->y, ctx->t1, p256_mod, p256_mp_mod);
  72054. ctx->state = 18;
  72055. break;
  72056. case 18:
  72057. /* Y = Y - T2 */
  72058. sp_256_mont_sub_8(ctx->y, ctx->y, ctx->t2, p256_mod);
  72059. ctx->state = 19;
  72060. /* fall-through */
  72061. case 19:
  72062. err = MP_OKAY;
  72063. break;
  72064. }
  72065. if (err == MP_OKAY && ctx->state != 19) {
  72066. err = FP_WOULDBLOCK;
  72067. }
  72068. return err;
  72069. }
  72070. #endif /* WOLFSSL_SP_NONBLOCK */
  72071. /* Compare two numbers to determine if they are equal.
  72072. * Constant time implementation.
  72073. *
  72074. * a First number to compare.
  72075. * b Second number to compare.
  72076. * returns 1 when equal and 0 otherwise.
  72077. */
  72078. static int sp_256_cmp_equal_8(const sp_digit* a, const sp_digit* b)
  72079. {
  72080. return ((a[0] ^ b[0]) | (a[1] ^ b[1]) | (a[2] ^ b[2]) |
  72081. (a[3] ^ b[3]) | (a[4] ^ b[4]) | (a[5] ^ b[5]) |
  72082. (a[6] ^ b[6]) | (a[7] ^ b[7])) == 0;
  72083. }
  72084. /* Returns 1 if the number of zero.
  72085. * Implementation is constant time.
  72086. *
  72087. * a Number to check.
  72088. * returns 1 if the number is zero and 0 otherwise.
  72089. */
  72090. static int sp_256_iszero_8(const sp_digit* a)
  72091. {
  72092. return (a[0] | a[1] | a[2] | a[3] | a[4] | a[5] | a[6] | a[7]) == 0;
  72093. }
  72094. /* Add two Montgomery form projective points.
  72095. *
  72096. * r Result of addition.
  72097. * p First point to add.
  72098. * q Second point to add.
  72099. * t Temporary ordinate data.
  72100. */
  72101. static void sp_256_proj_point_add_8(sp_point_256* r,
  72102. const sp_point_256* p, const sp_point_256* q, sp_digit* t)
  72103. {
  72104. sp_digit* t6 = t;
  72105. sp_digit* t1 = t + 2*8;
  72106. sp_digit* t2 = t + 4*8;
  72107. sp_digit* t3 = t + 6*8;
  72108. sp_digit* t4 = t + 8*8;
  72109. sp_digit* t5 = t + 10*8;
  72110. /* U1 = X1*Z2^2 */
  72111. sp_256_mont_sqr_8(t1, q->z, p256_mod, p256_mp_mod);
  72112. sp_256_mont_mul_8(t3, t1, q->z, p256_mod, p256_mp_mod);
  72113. sp_256_mont_mul_8(t1, t1, p->x, p256_mod, p256_mp_mod);
  72114. /* U2 = X2*Z1^2 */
  72115. sp_256_mont_sqr_8(t2, p->z, p256_mod, p256_mp_mod);
  72116. sp_256_mont_mul_8(t4, t2, p->z, p256_mod, p256_mp_mod);
  72117. sp_256_mont_mul_8(t2, t2, q->x, p256_mod, p256_mp_mod);
  72118. /* S1 = Y1*Z2^3 */
  72119. sp_256_mont_mul_8(t3, t3, p->y, p256_mod, p256_mp_mod);
  72120. /* S2 = Y2*Z1^3 */
  72121. sp_256_mont_mul_8(t4, t4, q->y, p256_mod, p256_mp_mod);
  72122. /* Check double */
  72123. if ((~p->infinity) & (~q->infinity) &
  72124. sp_256_cmp_equal_8(t2, t1) &
  72125. sp_256_cmp_equal_8(t4, t3)) {
  72126. sp_256_proj_point_dbl_8(r, p, t);
  72127. }
  72128. else {
  72129. sp_digit* x = t6;
  72130. sp_digit* y = t1;
  72131. sp_digit* z = t2;
  72132. /* H = U2 - U1 */
  72133. sp_256_mont_sub_8(t2, t2, t1, p256_mod);
  72134. /* R = S2 - S1 */
  72135. sp_256_mont_sub_8(t4, t4, t3, p256_mod);
  72136. /* X3 = R^2 - H^3 - 2*U1*H^2 */
  72137. sp_256_mont_sqr_8(t5, t2, p256_mod, p256_mp_mod);
  72138. sp_256_mont_mul_8(y, t1, t5, p256_mod, p256_mp_mod);
  72139. sp_256_mont_mul_8(t5, t5, t2, p256_mod, p256_mp_mod);
  72140. /* Z3 = H*Z1*Z2 */
  72141. sp_256_mont_mul_8(z, p->z, t2, p256_mod, p256_mp_mod);
  72142. sp_256_mont_mul_8(z, z, q->z, p256_mod, p256_mp_mod);
  72143. sp_256_mont_sqr_8(x, t4, p256_mod, p256_mp_mod);
  72144. sp_256_mont_sub_8(x, x, t5, p256_mod);
  72145. sp_256_mont_mul_8(t5, t5, t3, p256_mod, p256_mp_mod);
  72146. sp_256_mont_dbl_8(t3, y, p256_mod);
  72147. sp_256_mont_sub_8(x, x, t3, p256_mod);
  72148. /* Y3 = R*(U1*H^2 - X3) - S1*H^3 */
  72149. sp_256_mont_sub_8(y, y, x, p256_mod);
  72150. sp_256_mont_mul_8(y, y, t4, p256_mod, p256_mp_mod);
  72151. sp_256_mont_sub_8(y, y, t5, p256_mod);
  72152. {
  72153. int i;
  72154. sp_digit maskp = 0 - (q->infinity & (!p->infinity));
  72155. sp_digit maskq = 0 - (p->infinity & (!q->infinity));
  72156. sp_digit maskt = ~(maskp | maskq);
  72157. sp_digit inf = (sp_digit)(p->infinity & q->infinity);
  72158. for (i = 0; i < 8; i++) {
  72159. r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) |
  72160. (x[i] & maskt);
  72161. }
  72162. for (i = 0; i < 8; i++) {
  72163. r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) |
  72164. (y[i] & maskt);
  72165. }
  72166. for (i = 0; i < 8; i++) {
  72167. r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) |
  72168. (z[i] & maskt);
  72169. }
  72170. r->z[0] |= inf;
  72171. r->infinity = (word32)inf;
  72172. }
  72173. }
  72174. }
  72175. #ifdef WOLFSSL_SP_NONBLOCK
  72176. typedef struct sp_256_proj_point_add_8_ctx {
  72177. int state;
  72178. sp_256_proj_point_dbl_8_ctx dbl_ctx;
  72179. const sp_point_256* ap[2];
  72180. sp_point_256* rp[2];
  72181. sp_digit* t1;
  72182. sp_digit* t2;
  72183. sp_digit* t3;
  72184. sp_digit* t4;
  72185. sp_digit* t5;
  72186. sp_digit* t6;
  72187. sp_digit* x;
  72188. sp_digit* y;
  72189. sp_digit* z;
  72190. } sp_256_proj_point_add_8_ctx;
  72191. /* Add two Montgomery form projective points.
  72192. *
  72193. * r Result of addition.
  72194. * p First point to add.
  72195. * q Second point to add.
  72196. * t Temporary ordinate data.
  72197. */
  72198. static int sp_256_proj_point_add_8_nb(sp_ecc_ctx_t* sp_ctx, sp_point_256* r,
  72199. const sp_point_256* p, const sp_point_256* q, sp_digit* t)
  72200. {
  72201. int err = FP_WOULDBLOCK;
  72202. sp_256_proj_point_add_8_ctx* ctx = (sp_256_proj_point_add_8_ctx*)sp_ctx->data;
  72203. /* Ensure only the first point is the same as the result. */
  72204. if (q == r) {
  72205. const sp_point_256* a = p;
  72206. p = q;
  72207. q = a;
  72208. }
  72209. typedef char ctx_size_test[sizeof(sp_256_proj_point_add_8_ctx) >= sizeof(*sp_ctx) ? -1 : 1];
  72210. (void)sizeof(ctx_size_test);
  72211. switch (ctx->state) {
  72212. case 0: /* INIT */
  72213. ctx->t6 = t;
  72214. ctx->t1 = t + 2*8;
  72215. ctx->t2 = t + 4*8;
  72216. ctx->t3 = t + 6*8;
  72217. ctx->t4 = t + 8*8;
  72218. ctx->t5 = t + 10*8;
  72219. ctx->x = ctx->t6;
  72220. ctx->y = ctx->t1;
  72221. ctx->z = ctx->t2;
  72222. ctx->state = 1;
  72223. break;
  72224. case 1:
  72225. /* U1 = X1*Z2^2 */
  72226. sp_256_mont_sqr_8(ctx->t1, q->z, p256_mod, p256_mp_mod);
  72227. ctx->state = 2;
  72228. break;
  72229. case 2:
  72230. sp_256_mont_mul_8(ctx->t3, ctx->t1, q->z, p256_mod, p256_mp_mod);
  72231. ctx->state = 3;
  72232. break;
  72233. case 3:
  72234. sp_256_mont_mul_8(ctx->t1, ctx->t1, p->x, p256_mod, p256_mp_mod);
  72235. ctx->state = 4;
  72236. break;
  72237. case 4:
  72238. /* U2 = X2*Z1^2 */
  72239. sp_256_mont_sqr_8(ctx->t2, p->z, p256_mod, p256_mp_mod);
  72240. ctx->state = 5;
  72241. break;
  72242. case 5:
  72243. sp_256_mont_mul_8(ctx->t4, ctx->t2, p->z, p256_mod, p256_mp_mod);
  72244. ctx->state = 6;
  72245. break;
  72246. case 6:
  72247. sp_256_mont_mul_8(ctx->t2, ctx->t2, q->x, p256_mod, p256_mp_mod);
  72248. ctx->state = 7;
  72249. break;
  72250. case 7:
  72251. /* S1 = Y1*Z2^3 */
  72252. sp_256_mont_mul_8(ctx->t3, ctx->t3, p->y, p256_mod, p256_mp_mod);
  72253. ctx->state = 8;
  72254. break;
  72255. case 8:
  72256. /* S2 = Y2*Z1^3 */
  72257. sp_256_mont_mul_8(ctx->t4, ctx->t4, q->y, p256_mod, p256_mp_mod);
  72258. ctx->state = 9;
  72259. break;
  72260. case 9:
  72261. /* Check double */
  72262. if ((~p->infinity) & (~q->infinity) &
  72263. sp_256_cmp_equal_8(ctx->t2, ctx->t1) &
  72264. sp_256_cmp_equal_8(ctx->t4, ctx->t3)) {
  72265. XMEMSET(&ctx->dbl_ctx, 0, sizeof(ctx->dbl_ctx));
  72266. sp_256_proj_point_dbl_8(r, p, t);
  72267. ctx->state = 25;
  72268. }
  72269. else {
  72270. ctx->state = 10;
  72271. }
  72272. break;
  72273. case 10:
  72274. /* H = U2 - U1 */
  72275. sp_256_mont_sub_8(ctx->t2, ctx->t2, ctx->t1, p256_mod);
  72276. ctx->state = 11;
  72277. break;
  72278. case 11:
  72279. /* R = S2 - S1 */
  72280. sp_256_mont_sub_8(ctx->t4, ctx->t4, ctx->t3, p256_mod);
  72281. ctx->state = 12;
  72282. break;
  72283. case 12:
  72284. /* X3 = R^2 - H^3 - 2*U1*H^2 */
  72285. sp_256_mont_sqr_8(ctx->t5, ctx->t2, p256_mod, p256_mp_mod);
  72286. ctx->state = 13;
  72287. break;
  72288. case 13:
  72289. sp_256_mont_mul_8(ctx->y, ctx->t1, ctx->t5, p256_mod, p256_mp_mod);
  72290. ctx->state = 14;
  72291. break;
  72292. case 14:
  72293. sp_256_mont_mul_8(ctx->t5, ctx->t5, ctx->t2, p256_mod, p256_mp_mod);
  72294. ctx->state = 15;
  72295. break;
  72296. case 15:
  72297. /* Z3 = H*Z1*Z2 */
  72298. sp_256_mont_mul_8(ctx->z, p->z, ctx->t2, p256_mod, p256_mp_mod);
  72299. ctx->state = 16;
  72300. break;
  72301. case 16:
  72302. sp_256_mont_mul_8(ctx->z, ctx->z, q->z, p256_mod, p256_mp_mod);
  72303. ctx->state = 17;
  72304. break;
  72305. case 17:
  72306. sp_256_mont_sqr_8(ctx->x, ctx->t4, p256_mod, p256_mp_mod);
  72307. ctx->state = 18;
  72308. break;
  72309. case 18:
  72310. sp_256_mont_sub_8(ctx->x, ctx->x, ctx->t5, p256_mod);
  72311. ctx->state = 19;
  72312. break;
  72313. case 19:
  72314. sp_256_mont_mul_8(ctx->t5, ctx->t5, ctx->t3, p256_mod, p256_mp_mod);
  72315. ctx->state = 20;
  72316. break;
  72317. case 20:
  72318. sp_256_mont_dbl_8(ctx->t3, ctx->y, p256_mod);
  72319. sp_256_mont_sub_8(ctx->x, ctx->x, ctx->t3, p256_mod);
  72320. ctx->state = 21;
  72321. break;
  72322. case 21:
  72323. /* Y3 = R*(U1*H^2 - X3) - S1*H^3 */
  72324. sp_256_mont_sub_8(ctx->y, ctx->y, ctx->x, p256_mod);
  72325. ctx->state = 22;
  72326. break;
  72327. case 22:
  72328. sp_256_mont_mul_8(ctx->y, ctx->y, ctx->t4, p256_mod, p256_mp_mod);
  72329. ctx->state = 23;
  72330. break;
  72331. case 23:
  72332. sp_256_mont_sub_8(ctx->y, ctx->y, ctx->t5, p256_mod);
  72333. ctx->state = 24;
  72334. break;
  72335. case 24:
  72336. {
  72337. {
  72338. int i;
  72339. sp_digit maskp = 0 - (q->infinity & (!p->infinity));
  72340. sp_digit maskq = 0 - (p->infinity & (!q->infinity));
  72341. sp_digit maskt = ~(maskp | maskq);
  72342. sp_digit inf = (sp_digit)(p->infinity & q->infinity);
  72343. for (i = 0; i < 8; i++) {
  72344. r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) |
  72345. (ctx->x[i] & maskt);
  72346. }
  72347. for (i = 0; i < 8; i++) {
  72348. r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) |
  72349. (ctx->y[i] & maskt);
  72350. }
  72351. for (i = 0; i < 8; i++) {
  72352. r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) |
  72353. (ctx->z[i] & maskt);
  72354. }
  72355. r->z[0] |= inf;
  72356. r->infinity = (word32)inf;
  72357. }
  72358. ctx->state = 25;
  72359. break;
  72360. }
  72361. case 25:
  72362. err = MP_OKAY;
  72363. break;
  72364. }
  72365. if (err == MP_OKAY && ctx->state != 25) {
  72366. err = FP_WOULDBLOCK;
  72367. }
  72368. return err;
  72369. }
  72370. #endif /* WOLFSSL_SP_NONBLOCK */
  72371. #ifndef WC_NO_CACHE_RESISTANT
  72372. /* Touch each possible point that could be being copied.
  72373. *
  72374. * r Point to copy into.
  72375. * table Table - start of the entries to access
  72376. * idx Index of entry to retrieve.
  72377. */
  72378. static void sp_256_get_point_16_8(sp_point_256* r, const sp_point_256* table,
  72379. int idx)
  72380. {
  72381. int i;
  72382. sp_digit mask;
  72383. r->x[0] = 0;
  72384. r->x[1] = 0;
  72385. r->x[2] = 0;
  72386. r->x[3] = 0;
  72387. r->x[4] = 0;
  72388. r->x[5] = 0;
  72389. r->x[6] = 0;
  72390. r->x[7] = 0;
  72391. r->y[0] = 0;
  72392. r->y[1] = 0;
  72393. r->y[2] = 0;
  72394. r->y[3] = 0;
  72395. r->y[4] = 0;
  72396. r->y[5] = 0;
  72397. r->y[6] = 0;
  72398. r->y[7] = 0;
  72399. r->z[0] = 0;
  72400. r->z[1] = 0;
  72401. r->z[2] = 0;
  72402. r->z[3] = 0;
  72403. r->z[4] = 0;
  72404. r->z[5] = 0;
  72405. r->z[6] = 0;
  72406. r->z[7] = 0;
  72407. for (i = 1; i < 16; i++) {
  72408. mask = 0 - (i == idx);
  72409. r->x[0] |= mask & table[i].x[0];
  72410. r->x[1] |= mask & table[i].x[1];
  72411. r->x[2] |= mask & table[i].x[2];
  72412. r->x[3] |= mask & table[i].x[3];
  72413. r->x[4] |= mask & table[i].x[4];
  72414. r->x[5] |= mask & table[i].x[5];
  72415. r->x[6] |= mask & table[i].x[6];
  72416. r->x[7] |= mask & table[i].x[7];
  72417. r->y[0] |= mask & table[i].y[0];
  72418. r->y[1] |= mask & table[i].y[1];
  72419. r->y[2] |= mask & table[i].y[2];
  72420. r->y[3] |= mask & table[i].y[3];
  72421. r->y[4] |= mask & table[i].y[4];
  72422. r->y[5] |= mask & table[i].y[5];
  72423. r->y[6] |= mask & table[i].y[6];
  72424. r->y[7] |= mask & table[i].y[7];
  72425. r->z[0] |= mask & table[i].z[0];
  72426. r->z[1] |= mask & table[i].z[1];
  72427. r->z[2] |= mask & table[i].z[2];
  72428. r->z[3] |= mask & table[i].z[3];
  72429. r->z[4] |= mask & table[i].z[4];
  72430. r->z[5] |= mask & table[i].z[5];
  72431. r->z[6] |= mask & table[i].z[6];
  72432. r->z[7] |= mask & table[i].z[7];
  72433. }
  72434. }
  72435. #endif /* !WC_NO_CACHE_RESISTANT */
  72436. /* Multiply the point by the scalar and return the result.
  72437. * If map is true then convert result to affine coordinates.
  72438. *
  72439. * Fast implementation that generates a pre-computation table.
  72440. * 4 bits of window (no sliding!).
  72441. * Uses add and double for calculating table.
  72442. * 256 doubles.
  72443. * 76 adds.
  72444. *
  72445. * r Resulting point.
  72446. * g Point to multiply.
  72447. * k Scalar to multiply by.
  72448. * map Indicates whether to convert result to affine.
  72449. * ct Constant time required.
  72450. * heap Heap to use for allocation.
  72451. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  72452. */
  72453. static int sp_256_ecc_mulmod_fast_8(sp_point_256* r, const sp_point_256* g, const sp_digit* k,
  72454. int map, int ct, void* heap)
  72455. {
  72456. #ifdef WOLFSSL_SP_SMALL_STACK
  72457. sp_point_256* t = NULL;
  72458. sp_digit* tmp = NULL;
  72459. #else
  72460. sp_point_256 t[16 + 1];
  72461. sp_digit tmp[2 * 8 * 6];
  72462. #endif
  72463. sp_point_256* rt = NULL;
  72464. #ifndef WC_NO_CACHE_RESISTANT
  72465. #ifdef WOLFSSL_SP_SMALL_STACK
  72466. sp_point_256* p = NULL;
  72467. #else
  72468. sp_point_256 p[1];
  72469. #endif
  72470. #endif /* !WC_NO_CACHE_RESISTANT */
  72471. sp_digit n;
  72472. int i;
  72473. int c;
  72474. int y;
  72475. int err = MP_OKAY;
  72476. /* Constant time used for cache attack resistance implementation. */
  72477. (void)ct;
  72478. (void)heap;
  72479. #ifdef WOLFSSL_SP_SMALL_STACK
  72480. t = (sp_point_256*)XMALLOC(sizeof(sp_point_256) * (16 + 1),
  72481. heap, DYNAMIC_TYPE_ECC);
  72482. if (t == NULL)
  72483. err = MEMORY_E;
  72484. #ifndef WC_NO_CACHE_RESISTANT
  72485. if (err == MP_OKAY) {
  72486. p = (sp_point_256*)XMALLOC(sizeof(sp_point_256),
  72487. heap, DYNAMIC_TYPE_ECC);
  72488. if (p == NULL)
  72489. err = MEMORY_E;
  72490. }
  72491. #endif
  72492. if (err == MP_OKAY) {
  72493. tmp = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 8 * 6, heap,
  72494. DYNAMIC_TYPE_ECC);
  72495. if (tmp == NULL)
  72496. err = MEMORY_E;
  72497. }
  72498. #endif
  72499. if (err == MP_OKAY) {
  72500. rt = t + 16;
  72501. /* t[0] = {0, 0, 1} * norm */
  72502. XMEMSET(&t[0], 0, sizeof(t[0]));
  72503. t[0].infinity = 1;
  72504. /* t[1] = {g->x, g->y, g->z} * norm */
  72505. (void)sp_256_mod_mul_norm_8(t[1].x, g->x, p256_mod);
  72506. (void)sp_256_mod_mul_norm_8(t[1].y, g->y, p256_mod);
  72507. (void)sp_256_mod_mul_norm_8(t[1].z, g->z, p256_mod);
  72508. t[1].infinity = 0;
  72509. sp_256_proj_point_dbl_8(&t[ 2], &t[ 1], tmp);
  72510. t[ 2].infinity = 0;
  72511. sp_256_proj_point_add_8(&t[ 3], &t[ 2], &t[ 1], tmp);
  72512. t[ 3].infinity = 0;
  72513. sp_256_proj_point_dbl_8(&t[ 4], &t[ 2], tmp);
  72514. t[ 4].infinity = 0;
  72515. sp_256_proj_point_add_8(&t[ 5], &t[ 3], &t[ 2], tmp);
  72516. t[ 5].infinity = 0;
  72517. sp_256_proj_point_dbl_8(&t[ 6], &t[ 3], tmp);
  72518. t[ 6].infinity = 0;
  72519. sp_256_proj_point_add_8(&t[ 7], &t[ 4], &t[ 3], tmp);
  72520. t[ 7].infinity = 0;
  72521. sp_256_proj_point_dbl_8(&t[ 8], &t[ 4], tmp);
  72522. t[ 8].infinity = 0;
  72523. sp_256_proj_point_add_8(&t[ 9], &t[ 5], &t[ 4], tmp);
  72524. t[ 9].infinity = 0;
  72525. sp_256_proj_point_dbl_8(&t[10], &t[ 5], tmp);
  72526. t[10].infinity = 0;
  72527. sp_256_proj_point_add_8(&t[11], &t[ 6], &t[ 5], tmp);
  72528. t[11].infinity = 0;
  72529. sp_256_proj_point_dbl_8(&t[12], &t[ 6], tmp);
  72530. t[12].infinity = 0;
  72531. sp_256_proj_point_add_8(&t[13], &t[ 7], &t[ 6], tmp);
  72532. t[13].infinity = 0;
  72533. sp_256_proj_point_dbl_8(&t[14], &t[ 7], tmp);
  72534. t[14].infinity = 0;
  72535. sp_256_proj_point_add_8(&t[15], &t[ 8], &t[ 7], tmp);
  72536. t[15].infinity = 0;
  72537. i = 6;
  72538. n = k[i+1] << 0;
  72539. c = 28;
  72540. y = (int)(n >> 28);
  72541. #ifndef WC_NO_CACHE_RESISTANT
  72542. if (ct) {
  72543. sp_256_get_point_16_8(rt, t, y);
  72544. rt->infinity = !y;
  72545. }
  72546. else
  72547. #endif
  72548. {
  72549. XMEMCPY(rt, &t[y], sizeof(sp_point_256));
  72550. }
  72551. n <<= 4;
  72552. for (; i>=0 || c>=4; ) {
  72553. if (c < 4) {
  72554. n |= k[i--];
  72555. c += 32;
  72556. }
  72557. y = (n >> 28) & 0xf;
  72558. n <<= 4;
  72559. c -= 4;
  72560. sp_256_proj_point_dbl_8(rt, rt, tmp);
  72561. sp_256_proj_point_dbl_8(rt, rt, tmp);
  72562. sp_256_proj_point_dbl_8(rt, rt, tmp);
  72563. sp_256_proj_point_dbl_8(rt, rt, tmp);
  72564. #ifndef WC_NO_CACHE_RESISTANT
  72565. if (ct) {
  72566. sp_256_get_point_16_8(p, t, y);
  72567. p->infinity = !y;
  72568. sp_256_proj_point_add_8(rt, rt, p, tmp);
  72569. }
  72570. else
  72571. #endif
  72572. {
  72573. sp_256_proj_point_add_8(rt, rt, &t[y], tmp);
  72574. }
  72575. }
  72576. if (map != 0) {
  72577. sp_256_map_8(r, rt, tmp);
  72578. }
  72579. else {
  72580. XMEMCPY(r, rt, sizeof(sp_point_256));
  72581. }
  72582. }
  72583. #ifdef WOLFSSL_SP_SMALL_STACK
  72584. if (tmp != NULL)
  72585. #endif
  72586. {
  72587. ForceZero(tmp, sizeof(sp_digit) * 2 * 8 * 6);
  72588. #ifdef WOLFSSL_SP_SMALL_STACK
  72589. XFREE(tmp, heap, DYNAMIC_TYPE_ECC);
  72590. #endif
  72591. }
  72592. #ifndef WC_NO_CACHE_RESISTANT
  72593. #ifdef WOLFSSL_SP_SMALL_STACK
  72594. if (p != NULL)
  72595. #endif
  72596. {
  72597. ForceZero(p, sizeof(sp_point_256));
  72598. #ifdef WOLFSSL_SP_SMALL_STACK
  72599. XFREE(p, heap, DYNAMIC_TYPE_ECC);
  72600. #endif
  72601. }
  72602. #endif /* !WC_NO_CACHE_RESISTANT */
  72603. #ifdef WOLFSSL_SP_SMALL_STACK
  72604. if (t != NULL)
  72605. #endif
  72606. {
  72607. ForceZero(t, sizeof(sp_point_256) * 17);
  72608. #ifdef WOLFSSL_SP_SMALL_STACK
  72609. XFREE(t, heap, DYNAMIC_TYPE_ECC);
  72610. #endif
  72611. }
  72612. return err;
  72613. }
  72614. #ifdef FP_ECC
  72615. /* Double the Montgomery form projective point p a number of times.
  72616. *
  72617. * r Result of repeated doubling of point.
  72618. * p Point to double.
  72619. * n Number of times to double
  72620. * t Temporary ordinate data.
  72621. */
  72622. static void sp_256_proj_point_dbl_n_8(sp_point_256* p, int i,
  72623. sp_digit* t)
  72624. {
  72625. sp_digit* w = t;
  72626. sp_digit* a = t + 2*8;
  72627. sp_digit* b = t + 4*8;
  72628. sp_digit* t1 = t + 6*8;
  72629. sp_digit* t2 = t + 8*8;
  72630. sp_digit* x;
  72631. sp_digit* y;
  72632. sp_digit* z;
  72633. volatile int n = i;
  72634. x = p->x;
  72635. y = p->y;
  72636. z = p->z;
  72637. /* Y = 2*Y */
  72638. sp_256_mont_dbl_8(y, y, p256_mod);
  72639. /* W = Z^4 */
  72640. sp_256_mont_sqr_8(w, z, p256_mod, p256_mp_mod);
  72641. sp_256_mont_sqr_8(w, w, p256_mod, p256_mp_mod);
  72642. #ifndef WOLFSSL_SP_SMALL
  72643. while (--n > 0)
  72644. #else
  72645. while (--n >= 0)
  72646. #endif
  72647. {
  72648. /* A = 3*(X^2 - W) */
  72649. sp_256_mont_sqr_8(t1, x, p256_mod, p256_mp_mod);
  72650. sp_256_mont_sub_8(t1, t1, w, p256_mod);
  72651. sp_256_mont_tpl_8(a, t1, p256_mod);
  72652. /* B = X*Y^2 */
  72653. sp_256_mont_sqr_8(t1, y, p256_mod, p256_mp_mod);
  72654. sp_256_mont_mul_8(b, t1, x, p256_mod, p256_mp_mod);
  72655. /* X = A^2 - 2B */
  72656. sp_256_mont_sqr_8(x, a, p256_mod, p256_mp_mod);
  72657. sp_256_mont_dbl_8(t2, b, p256_mod);
  72658. sp_256_mont_sub_8(x, x, t2, p256_mod);
  72659. /* B = 2.(B - X) */
  72660. sp_256_mont_sub_8(t2, b, x, p256_mod);
  72661. sp_256_mont_dbl_8(b, t2, p256_mod);
  72662. /* Z = Z*Y */
  72663. sp_256_mont_mul_8(z, z, y, p256_mod, p256_mp_mod);
  72664. /* t1 = Y^4 */
  72665. sp_256_mont_sqr_8(t1, t1, p256_mod, p256_mp_mod);
  72666. #ifdef WOLFSSL_SP_SMALL
  72667. if (n != 0)
  72668. #endif
  72669. {
  72670. /* W = W*Y^4 */
  72671. sp_256_mont_mul_8(w, w, t1, p256_mod, p256_mp_mod);
  72672. }
  72673. /* y = 2*A*(B - X) - Y^4 */
  72674. sp_256_mont_mul_8(y, b, a, p256_mod, p256_mp_mod);
  72675. sp_256_mont_sub_8(y, y, t1, p256_mod);
  72676. }
  72677. #ifndef WOLFSSL_SP_SMALL
  72678. /* A = 3*(X^2 - W) */
  72679. sp_256_mont_sqr_8(t1, x, p256_mod, p256_mp_mod);
  72680. sp_256_mont_sub_8(t1, t1, w, p256_mod);
  72681. sp_256_mont_tpl_8(a, t1, p256_mod);
  72682. /* B = X*Y^2 */
  72683. sp_256_mont_sqr_8(t1, y, p256_mod, p256_mp_mod);
  72684. sp_256_mont_mul_8(b, t1, x, p256_mod, p256_mp_mod);
  72685. /* X = A^2 - 2B */
  72686. sp_256_mont_sqr_8(x, a, p256_mod, p256_mp_mod);
  72687. sp_256_mont_dbl_8(t2, b, p256_mod);
  72688. sp_256_mont_sub_8(x, x, t2, p256_mod);
  72689. /* B = 2.(B - X) */
  72690. sp_256_mont_sub_8(t2, b, x, p256_mod);
  72691. sp_256_mont_dbl_8(b, t2, p256_mod);
  72692. /* Z = Z*Y */
  72693. sp_256_mont_mul_8(z, z, y, p256_mod, p256_mp_mod);
  72694. /* t1 = Y^4 */
  72695. sp_256_mont_sqr_8(t1, t1, p256_mod, p256_mp_mod);
  72696. /* y = 2*A*(B - X) - Y^4 */
  72697. sp_256_mont_mul_8(y, b, a, p256_mod, p256_mp_mod);
  72698. sp_256_mont_sub_8(y, y, t1, p256_mod);
  72699. #endif /* WOLFSSL_SP_SMALL */
  72700. /* Y = Y/2 */
  72701. sp_256_mont_div2_8(y, y, p256_mod);
  72702. }
  72703. /* Convert the projective point to affine.
  72704. * Ordinates are in Montgomery form.
  72705. *
  72706. * a Point to convert.
  72707. * t Temporary data.
  72708. */
  72709. static void sp_256_proj_to_affine_8(sp_point_256* a, sp_digit* t)
  72710. {
  72711. sp_digit* t1 = t;
  72712. sp_digit* t2 = t + 2 * 8;
  72713. sp_digit* tmp = t + 4 * 8;
  72714. sp_256_mont_inv_8(t1, a->z, tmp);
  72715. sp_256_mont_sqr_8(t2, t1, p256_mod, p256_mp_mod);
  72716. sp_256_mont_mul_8(t1, t2, t1, p256_mod, p256_mp_mod);
  72717. sp_256_mont_mul_8(a->x, a->x, t2, p256_mod, p256_mp_mod);
  72718. sp_256_mont_mul_8(a->y, a->y, t1, p256_mod, p256_mp_mod);
  72719. XMEMCPY(a->z, p256_norm_mod, sizeof(p256_norm_mod));
  72720. }
  72721. #endif /* FP_ECC */
  72722. /* A table entry for pre-computed points. */
  72723. typedef struct sp_table_entry_256 {
  72724. sp_digit x[8];
  72725. sp_digit y[8];
  72726. } sp_table_entry_256;
  72727. #ifdef FP_ECC
  72728. #endif /* FP_ECC */
  72729. /* Add two Montgomery form projective points. The second point has a q value of
  72730. * one.
  72731. * Only the first point can be the same pointer as the result point.
  72732. *
  72733. * r Result of addition.
  72734. * p First point to add.
  72735. * q Second point to add.
  72736. * t Temporary ordinate data.
  72737. */
  72738. static void sp_256_proj_point_add_qz1_8(sp_point_256* r,
  72739. const sp_point_256* p, const sp_point_256* q, sp_digit* t)
  72740. {
  72741. sp_digit* t2 = t;
  72742. sp_digit* t3 = t + 2*8;
  72743. sp_digit* t6 = t + 4*8;
  72744. sp_digit* t1 = t + 6*8;
  72745. sp_digit* t4 = t + 8*8;
  72746. sp_digit* t5 = t + 10*8;
  72747. /* Calculate values to subtract from P->x and P->y. */
  72748. /* U2 = X2*Z1^2 */
  72749. sp_256_mont_sqr_8(t2, p->z, p256_mod, p256_mp_mod);
  72750. sp_256_mont_mul_8(t4, t2, p->z, p256_mod, p256_mp_mod);
  72751. sp_256_mont_mul_8(t2, t2, q->x, p256_mod, p256_mp_mod);
  72752. /* S2 = Y2*Z1^3 */
  72753. sp_256_mont_mul_8(t4, t4, q->y, p256_mod, p256_mp_mod);
  72754. if ((~p->infinity) & (~q->infinity) &
  72755. sp_256_cmp_equal_8(p->x, t2) &
  72756. sp_256_cmp_equal_8(p->y, t4)) {
  72757. sp_256_proj_point_dbl_8(r, p, t);
  72758. }
  72759. else {
  72760. sp_digit* x = t2;
  72761. sp_digit* y = t3;
  72762. sp_digit* z = t6;
  72763. /* H = U2 - X1 */
  72764. sp_256_mont_sub_8(t2, t2, p->x, p256_mod);
  72765. /* R = S2 - Y1 */
  72766. sp_256_mont_sub_8(t4, t4, p->y, p256_mod);
  72767. /* Z3 = H*Z1 */
  72768. sp_256_mont_mul_8(z, p->z, t2, p256_mod, p256_mp_mod);
  72769. /* X3 = R^2 - H^3 - 2*X1*H^2 */
  72770. sp_256_mont_sqr_8(t1, t2, p256_mod, p256_mp_mod);
  72771. sp_256_mont_mul_8(t3, p->x, t1, p256_mod, p256_mp_mod);
  72772. sp_256_mont_mul_8(t1, t1, t2, p256_mod, p256_mp_mod);
  72773. sp_256_mont_sqr_8(t2, t4, p256_mod, p256_mp_mod);
  72774. sp_256_mont_sub_8(t2, t2, t1, p256_mod);
  72775. sp_256_mont_dbl_8(t5, t3, p256_mod);
  72776. sp_256_mont_sub_8(x, t2, t5, p256_mod);
  72777. /* Y3 = R*(X1*H^2 - X3) - Y1*H^3 */
  72778. sp_256_mont_sub_8(t3, t3, x, p256_mod);
  72779. sp_256_mont_mul_8(t3, t3, t4, p256_mod, p256_mp_mod);
  72780. sp_256_mont_mul_8(t1, t1, p->y, p256_mod, p256_mp_mod);
  72781. sp_256_mont_sub_8(y, t3, t1, p256_mod);
  72782. {
  72783. int i;
  72784. sp_digit maskp = 0 - (q->infinity & (!p->infinity));
  72785. sp_digit maskq = 0 - (p->infinity & (!q->infinity));
  72786. sp_digit maskt = ~(maskp | maskq);
  72787. sp_digit inf = (sp_digit)(p->infinity & q->infinity);
  72788. for (i = 0; i < 8; i++) {
  72789. r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) |
  72790. (x[i] & maskt);
  72791. }
  72792. for (i = 0; i < 8; i++) {
  72793. r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) |
  72794. (y[i] & maskt);
  72795. }
  72796. for (i = 0; i < 8; i++) {
  72797. r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) |
  72798. (z[i] & maskt);
  72799. }
  72800. r->z[0] |= inf;
  72801. r->infinity = (word32)inf;
  72802. }
  72803. }
  72804. }
  72805. #ifdef WOLFSSL_SP_SMALL
  72806. #ifdef FP_ECC
  72807. /* Generate the pre-computed table of points for the base point.
  72808. *
  72809. * width = 4
  72810. * 16 entries
  72811. * 64 bits between
  72812. *
  72813. * a The base point.
  72814. * table Place to store generated point data.
  72815. * tmp Temporary data.
  72816. * heap Heap to use for allocation.
  72817. */
  72818. static int sp_256_gen_stripe_table_8(const sp_point_256* a,
  72819. sp_table_entry_256* table, sp_digit* tmp, void* heap)
  72820. {
  72821. #ifdef WOLFSSL_SP_SMALL_STACK
  72822. sp_point_256* t = NULL;
  72823. #else
  72824. sp_point_256 t[3];
  72825. #endif
  72826. sp_point_256* s1 = NULL;
  72827. sp_point_256* s2 = NULL;
  72828. int i;
  72829. int j;
  72830. int err = MP_OKAY;
  72831. (void)heap;
  72832. #ifdef WOLFSSL_SP_SMALL_STACK
  72833. t = (sp_point_256*)XMALLOC(sizeof(sp_point_256) * 3, heap,
  72834. DYNAMIC_TYPE_ECC);
  72835. if (t == NULL)
  72836. err = MEMORY_E;
  72837. #endif
  72838. if (err == MP_OKAY) {
  72839. s1 = t + 1;
  72840. s2 = t + 2;
  72841. err = sp_256_mod_mul_norm_8(t->x, a->x, p256_mod);
  72842. }
  72843. if (err == MP_OKAY) {
  72844. err = sp_256_mod_mul_norm_8(t->y, a->y, p256_mod);
  72845. }
  72846. if (err == MP_OKAY) {
  72847. err = sp_256_mod_mul_norm_8(t->z, a->z, p256_mod);
  72848. }
  72849. if (err == MP_OKAY) {
  72850. t->infinity = 0;
  72851. sp_256_proj_to_affine_8(t, tmp);
  72852. XMEMCPY(s1->z, p256_norm_mod, sizeof(p256_norm_mod));
  72853. s1->infinity = 0;
  72854. XMEMCPY(s2->z, p256_norm_mod, sizeof(p256_norm_mod));
  72855. s2->infinity = 0;
  72856. /* table[0] = {0, 0, infinity} */
  72857. XMEMSET(&table[0], 0, sizeof(sp_table_entry_256));
  72858. /* table[1] = Affine version of 'a' in Montgomery form */
  72859. XMEMCPY(table[1].x, t->x, sizeof(table->x));
  72860. XMEMCPY(table[1].y, t->y, sizeof(table->y));
  72861. for (i=1; i<4; i++) {
  72862. sp_256_proj_point_dbl_n_8(t, 64, tmp);
  72863. sp_256_proj_to_affine_8(t, tmp);
  72864. XMEMCPY(table[1<<i].x, t->x, sizeof(table->x));
  72865. XMEMCPY(table[1<<i].y, t->y, sizeof(table->y));
  72866. }
  72867. for (i=1; i<4; i++) {
  72868. XMEMCPY(s1->x, table[1<<i].x, sizeof(table->x));
  72869. XMEMCPY(s1->y, table[1<<i].y, sizeof(table->y));
  72870. for (j=(1<<i)+1; j<(1<<(i+1)); j++) {
  72871. XMEMCPY(s2->x, table[j-(1<<i)].x, sizeof(table->x));
  72872. XMEMCPY(s2->y, table[j-(1<<i)].y, sizeof(table->y));
  72873. sp_256_proj_point_add_qz1_8(t, s1, s2, tmp);
  72874. sp_256_proj_to_affine_8(t, tmp);
  72875. XMEMCPY(table[j].x, t->x, sizeof(table->x));
  72876. XMEMCPY(table[j].y, t->y, sizeof(table->y));
  72877. }
  72878. }
  72879. }
  72880. #ifdef WOLFSSL_SP_SMALL_STACK
  72881. if (t != NULL)
  72882. XFREE(t, heap, DYNAMIC_TYPE_ECC);
  72883. #endif
  72884. return err;
  72885. }
  72886. #endif /* FP_ECC */
  72887. #ifndef WC_NO_CACHE_RESISTANT
  72888. /* Touch each possible entry that could be being copied.
  72889. *
  72890. * r Point to copy into.
  72891. * table Table - start of the entries to access
  72892. * idx Index of entry to retrieve.
  72893. */
  72894. static void sp_256_get_entry_16_8(sp_point_256* r,
  72895. const sp_table_entry_256* table, int idx)
  72896. {
  72897. int i;
  72898. sp_digit mask;
  72899. r->x[0] = 0;
  72900. r->x[1] = 0;
  72901. r->x[2] = 0;
  72902. r->x[3] = 0;
  72903. r->x[4] = 0;
  72904. r->x[5] = 0;
  72905. r->x[6] = 0;
  72906. r->x[7] = 0;
  72907. r->y[0] = 0;
  72908. r->y[1] = 0;
  72909. r->y[2] = 0;
  72910. r->y[3] = 0;
  72911. r->y[4] = 0;
  72912. r->y[5] = 0;
  72913. r->y[6] = 0;
  72914. r->y[7] = 0;
  72915. for (i = 1; i < 16; i++) {
  72916. mask = 0 - (i == idx);
  72917. r->x[0] |= mask & table[i].x[0];
  72918. r->x[1] |= mask & table[i].x[1];
  72919. r->x[2] |= mask & table[i].x[2];
  72920. r->x[3] |= mask & table[i].x[3];
  72921. r->x[4] |= mask & table[i].x[4];
  72922. r->x[5] |= mask & table[i].x[5];
  72923. r->x[6] |= mask & table[i].x[6];
  72924. r->x[7] |= mask & table[i].x[7];
  72925. r->y[0] |= mask & table[i].y[0];
  72926. r->y[1] |= mask & table[i].y[1];
  72927. r->y[2] |= mask & table[i].y[2];
  72928. r->y[3] |= mask & table[i].y[3];
  72929. r->y[4] |= mask & table[i].y[4];
  72930. r->y[5] |= mask & table[i].y[5];
  72931. r->y[6] |= mask & table[i].y[6];
  72932. r->y[7] |= mask & table[i].y[7];
  72933. }
  72934. }
  72935. #endif /* !WC_NO_CACHE_RESISTANT */
  72936. /* Multiply the point by the scalar and return the result.
  72937. * If map is true then convert result to affine coordinates.
  72938. *
  72939. * Stripe implementation.
  72940. * Pre-generated: 2^0, 2^64, ...
  72941. * Pre-generated: products of all combinations of above.
  72942. * 4 doubles and adds (with qz=1)
  72943. *
  72944. * r Resulting point.
  72945. * k Scalar to multiply by.
  72946. * table Pre-computed table.
  72947. * map Indicates whether to convert result to affine.
  72948. * ct Constant time required.
  72949. * heap Heap to use for allocation.
  72950. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  72951. */
  72952. static int sp_256_ecc_mulmod_stripe_8(sp_point_256* r, const sp_point_256* g,
  72953. const sp_table_entry_256* table, const sp_digit* k, int map,
  72954. int ct, void* heap)
  72955. {
  72956. #ifdef WOLFSSL_SP_SMALL_STACK
  72957. sp_point_256* rt = NULL;
  72958. sp_digit* t = NULL;
  72959. #else
  72960. sp_point_256 rt[2];
  72961. sp_digit t[2 * 8 * 6];
  72962. #endif
  72963. sp_point_256* p = NULL;
  72964. int i;
  72965. int j;
  72966. int y;
  72967. int x;
  72968. int err = MP_OKAY;
  72969. (void)g;
  72970. /* Constant time used for cache attack resistance implementation. */
  72971. (void)ct;
  72972. (void)heap;
  72973. #ifdef WOLFSSL_SP_SMALL_STACK
  72974. rt = (sp_point_256*)XMALLOC(sizeof(sp_point_256) * 2, heap,
  72975. DYNAMIC_TYPE_ECC);
  72976. if (rt == NULL)
  72977. err = MEMORY_E;
  72978. if (err == MP_OKAY) {
  72979. t = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 8 * 6, heap,
  72980. DYNAMIC_TYPE_ECC);
  72981. if (t == NULL)
  72982. err = MEMORY_E;
  72983. }
  72984. #endif
  72985. if (err == MP_OKAY) {
  72986. p = rt + 1;
  72987. XMEMCPY(p->z, p256_norm_mod, sizeof(p256_norm_mod));
  72988. XMEMCPY(rt->z, p256_norm_mod, sizeof(p256_norm_mod));
  72989. y = 0;
  72990. x = 63;
  72991. for (j=0; j<4; j++) {
  72992. y |= (int)(((k[x / 32] >> (x % 32)) & 1) << j);
  72993. x += 64;
  72994. }
  72995. #ifndef WC_NO_CACHE_RESISTANT
  72996. if (ct) {
  72997. sp_256_get_entry_16_8(rt, table, y);
  72998. } else
  72999. #endif
  73000. {
  73001. XMEMCPY(rt->x, table[y].x, sizeof(table[y].x));
  73002. XMEMCPY(rt->y, table[y].y, sizeof(table[y].y));
  73003. }
  73004. rt->infinity = !y;
  73005. for (i=62; i>=0; i--) {
  73006. y = 0;
  73007. x = i;
  73008. for (j=0; j<4; j++) {
  73009. y |= (int)(((k[x / 32] >> (x % 32)) & 1) << j);
  73010. x += 64;
  73011. }
  73012. sp_256_proj_point_dbl_8(rt, rt, t);
  73013. #ifndef WC_NO_CACHE_RESISTANT
  73014. if (ct) {
  73015. sp_256_get_entry_16_8(p, table, y);
  73016. }
  73017. else
  73018. #endif
  73019. {
  73020. XMEMCPY(p->x, table[y].x, sizeof(table[y].x));
  73021. XMEMCPY(p->y, table[y].y, sizeof(table[y].y));
  73022. }
  73023. p->infinity = !y;
  73024. sp_256_proj_point_add_qz1_8(rt, rt, p, t);
  73025. }
  73026. if (map != 0) {
  73027. sp_256_map_8(r, rt, t);
  73028. }
  73029. else {
  73030. XMEMCPY(r, rt, sizeof(sp_point_256));
  73031. }
  73032. }
  73033. #ifdef WOLFSSL_SP_SMALL_STACK
  73034. if (t != NULL)
  73035. XFREE(t, heap, DYNAMIC_TYPE_ECC);
  73036. if (rt != NULL)
  73037. XFREE(rt, heap, DYNAMIC_TYPE_ECC);
  73038. #endif
  73039. return err;
  73040. }
  73041. #ifdef FP_ECC
  73042. #ifndef FP_ENTRIES
  73043. #define FP_ENTRIES 16
  73044. #endif
  73045. /* Cache entry - holds precomputation tables for a point. */
  73046. typedef struct sp_cache_256_t {
  73047. /* X ordinate of point that table was generated from. */
  73048. sp_digit x[8];
  73049. /* Y ordinate of point that table was generated from. */
  73050. sp_digit y[8];
  73051. /* Precomputation table for point. */
  73052. sp_table_entry_256 table[16];
  73053. /* Count of entries in table. */
  73054. uint32_t cnt;
  73055. /* Point and table set in entry. */
  73056. int set;
  73057. } sp_cache_256_t;
  73058. /* Cache of tables. */
  73059. static THREAD_LS_T sp_cache_256_t sp_cache_256[FP_ENTRIES];
  73060. /* Index of last entry in cache. */
  73061. static THREAD_LS_T int sp_cache_256_last = -1;
  73062. /* Cache has been initialized. */
  73063. static THREAD_LS_T int sp_cache_256_inited = 0;
  73064. #ifndef HAVE_THREAD_LS
  73065. static volatile int initCacheMutex_256 = 0;
  73066. static wolfSSL_Mutex sp_cache_256_lock;
  73067. #endif
  73068. /* Get the cache entry for the point.
  73069. *
  73070. * g [in] Point scalar multiplying.
  73071. * cache [out] Cache table to use.
  73072. */
  73073. static void sp_ecc_get_cache_256(const sp_point_256* g, sp_cache_256_t** cache)
  73074. {
  73075. int i;
  73076. int j;
  73077. uint32_t least;
  73078. if (sp_cache_256_inited == 0) {
  73079. for (i=0; i<FP_ENTRIES; i++) {
  73080. sp_cache_256[i].set = 0;
  73081. }
  73082. sp_cache_256_inited = 1;
  73083. }
  73084. /* Compare point with those in cache. */
  73085. for (i=0; i<FP_ENTRIES; i++) {
  73086. if (!sp_cache_256[i].set)
  73087. continue;
  73088. if (sp_256_cmp_equal_8(g->x, sp_cache_256[i].x) &
  73089. sp_256_cmp_equal_8(g->y, sp_cache_256[i].y)) {
  73090. sp_cache_256[i].cnt++;
  73091. break;
  73092. }
  73093. }
  73094. /* No match. */
  73095. if (i == FP_ENTRIES) {
  73096. /* Find empty entry. */
  73097. i = (sp_cache_256_last + 1) % FP_ENTRIES;
  73098. for (; i != sp_cache_256_last; i=(i+1)%FP_ENTRIES) {
  73099. if (!sp_cache_256[i].set) {
  73100. break;
  73101. }
  73102. }
  73103. /* Evict least used. */
  73104. if (i == sp_cache_256_last) {
  73105. least = sp_cache_256[0].cnt;
  73106. for (j=1; j<FP_ENTRIES; j++) {
  73107. if (sp_cache_256[j].cnt < least) {
  73108. i = j;
  73109. least = sp_cache_256[i].cnt;
  73110. }
  73111. }
  73112. }
  73113. XMEMCPY(sp_cache_256[i].x, g->x, sizeof(sp_cache_256[i].x));
  73114. XMEMCPY(sp_cache_256[i].y, g->y, sizeof(sp_cache_256[i].y));
  73115. sp_cache_256[i].set = 1;
  73116. sp_cache_256[i].cnt = 1;
  73117. }
  73118. *cache = &sp_cache_256[i];
  73119. sp_cache_256_last = i;
  73120. }
  73121. #endif /* FP_ECC */
  73122. /* Multiply the base point of P256 by the scalar and return the result.
  73123. * If map is true then convert result to affine coordinates.
  73124. *
  73125. * r Resulting point.
  73126. * g Point to multiply.
  73127. * k Scalar to multiply by.
  73128. * map Indicates whether to convert result to affine.
  73129. * ct Constant time required.
  73130. * heap Heap to use for allocation.
  73131. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  73132. */
  73133. static int sp_256_ecc_mulmod_8(sp_point_256* r, const sp_point_256* g,
  73134. const sp_digit* k, int map, int ct, void* heap)
  73135. {
  73136. #ifndef FP_ECC
  73137. return sp_256_ecc_mulmod_fast_8(r, g, k, map, ct, heap);
  73138. #else
  73139. #ifdef WOLFSSL_SP_SMALL_STACK
  73140. sp_digit* tmp;
  73141. #else
  73142. sp_digit tmp[2 * 8 * 6];
  73143. #endif
  73144. sp_cache_256_t* cache;
  73145. int err = MP_OKAY;
  73146. #ifdef WOLFSSL_SP_SMALL_STACK
  73147. tmp = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 8 * 6, heap, DYNAMIC_TYPE_ECC);
  73148. if (tmp == NULL) {
  73149. err = MEMORY_E;
  73150. }
  73151. #endif
  73152. #ifndef HAVE_THREAD_LS
  73153. if (err == MP_OKAY) {
  73154. if (initCacheMutex_256 == 0) {
  73155. wc_InitMutex(&sp_cache_256_lock);
  73156. initCacheMutex_256 = 1;
  73157. }
  73158. if (wc_LockMutex(&sp_cache_256_lock) != 0) {
  73159. err = BAD_MUTEX_E;
  73160. }
  73161. }
  73162. #endif /* HAVE_THREAD_LS */
  73163. if (err == MP_OKAY) {
  73164. sp_ecc_get_cache_256(g, &cache);
  73165. if (cache->cnt == 2)
  73166. sp_256_gen_stripe_table_8(g, cache->table, tmp, heap);
  73167. #ifndef HAVE_THREAD_LS
  73168. wc_UnLockMutex(&sp_cache_256_lock);
  73169. #endif /* HAVE_THREAD_LS */
  73170. if (cache->cnt < 2) {
  73171. err = sp_256_ecc_mulmod_fast_8(r, g, k, map, ct, heap);
  73172. }
  73173. else {
  73174. err = sp_256_ecc_mulmod_stripe_8(r, g, cache->table, k,
  73175. map, ct, heap);
  73176. }
  73177. }
  73178. #ifdef WOLFSSL_SP_SMALL_STACK
  73179. XFREE(tmp, heap, DYNAMIC_TYPE_ECC);
  73180. #endif
  73181. return err;
  73182. #endif
  73183. }
  73184. #else
  73185. #ifdef FP_ECC
  73186. /* Generate the pre-computed table of points for the base point.
  73187. *
  73188. * width = 8
  73189. * 256 entries
  73190. * 32 bits between
  73191. *
  73192. * a The base point.
  73193. * table Place to store generated point data.
  73194. * tmp Temporary data.
  73195. * heap Heap to use for allocation.
  73196. */
  73197. static int sp_256_gen_stripe_table_8(const sp_point_256* a,
  73198. sp_table_entry_256* table, sp_digit* tmp, void* heap)
  73199. {
  73200. #ifdef WOLFSSL_SP_SMALL_STACK
  73201. sp_point_256* t = NULL;
  73202. #else
  73203. sp_point_256 t[3];
  73204. #endif
  73205. sp_point_256* s1 = NULL;
  73206. sp_point_256* s2 = NULL;
  73207. int i;
  73208. int j;
  73209. int err = MP_OKAY;
  73210. (void)heap;
  73211. #ifdef WOLFSSL_SP_SMALL_STACK
  73212. t = (sp_point_256*)XMALLOC(sizeof(sp_point_256) * 3, heap,
  73213. DYNAMIC_TYPE_ECC);
  73214. if (t == NULL)
  73215. err = MEMORY_E;
  73216. #endif
  73217. if (err == MP_OKAY) {
  73218. s1 = t + 1;
  73219. s2 = t + 2;
  73220. err = sp_256_mod_mul_norm_8(t->x, a->x, p256_mod);
  73221. }
  73222. if (err == MP_OKAY) {
  73223. err = sp_256_mod_mul_norm_8(t->y, a->y, p256_mod);
  73224. }
  73225. if (err == MP_OKAY) {
  73226. err = sp_256_mod_mul_norm_8(t->z, a->z, p256_mod);
  73227. }
  73228. if (err == MP_OKAY) {
  73229. t->infinity = 0;
  73230. sp_256_proj_to_affine_8(t, tmp);
  73231. XMEMCPY(s1->z, p256_norm_mod, sizeof(p256_norm_mod));
  73232. s1->infinity = 0;
  73233. XMEMCPY(s2->z, p256_norm_mod, sizeof(p256_norm_mod));
  73234. s2->infinity = 0;
  73235. /* table[0] = {0, 0, infinity} */
  73236. XMEMSET(&table[0], 0, sizeof(sp_table_entry_256));
  73237. /* table[1] = Affine version of 'a' in Montgomery form */
  73238. XMEMCPY(table[1].x, t->x, sizeof(table->x));
  73239. XMEMCPY(table[1].y, t->y, sizeof(table->y));
  73240. for (i=1; i<8; i++) {
  73241. sp_256_proj_point_dbl_n_8(t, 32, tmp);
  73242. sp_256_proj_to_affine_8(t, tmp);
  73243. XMEMCPY(table[1<<i].x, t->x, sizeof(table->x));
  73244. XMEMCPY(table[1<<i].y, t->y, sizeof(table->y));
  73245. }
  73246. for (i=1; i<8; i++) {
  73247. XMEMCPY(s1->x, table[1<<i].x, sizeof(table->x));
  73248. XMEMCPY(s1->y, table[1<<i].y, sizeof(table->y));
  73249. for (j=(1<<i)+1; j<(1<<(i+1)); j++) {
  73250. XMEMCPY(s2->x, table[j-(1<<i)].x, sizeof(table->x));
  73251. XMEMCPY(s2->y, table[j-(1<<i)].y, sizeof(table->y));
  73252. sp_256_proj_point_add_qz1_8(t, s1, s2, tmp);
  73253. sp_256_proj_to_affine_8(t, tmp);
  73254. XMEMCPY(table[j].x, t->x, sizeof(table->x));
  73255. XMEMCPY(table[j].y, t->y, sizeof(table->y));
  73256. }
  73257. }
  73258. }
  73259. #ifdef WOLFSSL_SP_SMALL_STACK
  73260. if (t != NULL)
  73261. XFREE(t, heap, DYNAMIC_TYPE_ECC);
  73262. #endif
  73263. return err;
  73264. }
  73265. #endif /* FP_ECC */
  73266. #ifndef WC_NO_CACHE_RESISTANT
  73267. /* Touch each possible entry that could be being copied.
  73268. *
  73269. * r Point to copy into.
  73270. * table Table - start of the entries to access
  73271. * idx Index of entry to retrieve.
  73272. */
  73273. static void sp_256_get_entry_256_8(sp_point_256* r,
  73274. const sp_table_entry_256* table, int idx)
  73275. {
  73276. int i;
  73277. sp_digit mask;
  73278. r->x[0] = 0;
  73279. r->x[1] = 0;
  73280. r->x[2] = 0;
  73281. r->x[3] = 0;
  73282. r->x[4] = 0;
  73283. r->x[5] = 0;
  73284. r->x[6] = 0;
  73285. r->x[7] = 0;
  73286. r->y[0] = 0;
  73287. r->y[1] = 0;
  73288. r->y[2] = 0;
  73289. r->y[3] = 0;
  73290. r->y[4] = 0;
  73291. r->y[5] = 0;
  73292. r->y[6] = 0;
  73293. r->y[7] = 0;
  73294. for (i = 1; i < 256; i++) {
  73295. mask = 0 - (i == idx);
  73296. r->x[0] |= mask & table[i].x[0];
  73297. r->x[1] |= mask & table[i].x[1];
  73298. r->x[2] |= mask & table[i].x[2];
  73299. r->x[3] |= mask & table[i].x[3];
  73300. r->x[4] |= mask & table[i].x[4];
  73301. r->x[5] |= mask & table[i].x[5];
  73302. r->x[6] |= mask & table[i].x[6];
  73303. r->x[7] |= mask & table[i].x[7];
  73304. r->y[0] |= mask & table[i].y[0];
  73305. r->y[1] |= mask & table[i].y[1];
  73306. r->y[2] |= mask & table[i].y[2];
  73307. r->y[3] |= mask & table[i].y[3];
  73308. r->y[4] |= mask & table[i].y[4];
  73309. r->y[5] |= mask & table[i].y[5];
  73310. r->y[6] |= mask & table[i].y[6];
  73311. r->y[7] |= mask & table[i].y[7];
  73312. }
  73313. }
  73314. #endif /* !WC_NO_CACHE_RESISTANT */
  73315. /* Multiply the point by the scalar and return the result.
  73316. * If map is true then convert result to affine coordinates.
  73317. *
  73318. * Stripe implementation.
  73319. * Pre-generated: 2^0, 2^32, ...
  73320. * Pre-generated: products of all combinations of above.
  73321. * 8 doubles and adds (with qz=1)
  73322. *
  73323. * r Resulting point.
  73324. * k Scalar to multiply by.
  73325. * table Pre-computed table.
  73326. * map Indicates whether to convert result to affine.
  73327. * ct Constant time required.
  73328. * heap Heap to use for allocation.
  73329. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  73330. */
  73331. static int sp_256_ecc_mulmod_stripe_8(sp_point_256* r, const sp_point_256* g,
  73332. const sp_table_entry_256* table, const sp_digit* k, int map,
  73333. int ct, void* heap)
  73334. {
  73335. #ifdef WOLFSSL_SP_SMALL_STACK
  73336. sp_point_256* rt = NULL;
  73337. sp_digit* t = NULL;
  73338. #else
  73339. sp_point_256 rt[2];
  73340. sp_digit t[2 * 8 * 6];
  73341. #endif
  73342. sp_point_256* p = NULL;
  73343. int i;
  73344. int j;
  73345. int y;
  73346. int x;
  73347. int err = MP_OKAY;
  73348. (void)g;
  73349. /* Constant time used for cache attack resistance implementation. */
  73350. (void)ct;
  73351. (void)heap;
  73352. #ifdef WOLFSSL_SP_SMALL_STACK
  73353. rt = (sp_point_256*)XMALLOC(sizeof(sp_point_256) * 2, heap,
  73354. DYNAMIC_TYPE_ECC);
  73355. if (rt == NULL)
  73356. err = MEMORY_E;
  73357. if (err == MP_OKAY) {
  73358. t = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 8 * 6, heap,
  73359. DYNAMIC_TYPE_ECC);
  73360. if (t == NULL)
  73361. err = MEMORY_E;
  73362. }
  73363. #endif
  73364. if (err == MP_OKAY) {
  73365. p = rt + 1;
  73366. XMEMCPY(p->z, p256_norm_mod, sizeof(p256_norm_mod));
  73367. XMEMCPY(rt->z, p256_norm_mod, sizeof(p256_norm_mod));
  73368. y = 0;
  73369. x = 31;
  73370. for (j=0; j<8; j++) {
  73371. y |= (int)(((k[x / 32] >> (x % 32)) & 1) << j);
  73372. x += 32;
  73373. }
  73374. #ifndef WC_NO_CACHE_RESISTANT
  73375. if (ct) {
  73376. sp_256_get_entry_256_8(rt, table, y);
  73377. } else
  73378. #endif
  73379. {
  73380. XMEMCPY(rt->x, table[y].x, sizeof(table[y].x));
  73381. XMEMCPY(rt->y, table[y].y, sizeof(table[y].y));
  73382. }
  73383. rt->infinity = !y;
  73384. for (i=30; i>=0; i--) {
  73385. y = 0;
  73386. x = i;
  73387. for (j=0; j<8; j++) {
  73388. y |= (int)(((k[x / 32] >> (x % 32)) & 1) << j);
  73389. x += 32;
  73390. }
  73391. sp_256_proj_point_dbl_8(rt, rt, t);
  73392. #ifndef WC_NO_CACHE_RESISTANT
  73393. if (ct) {
  73394. sp_256_get_entry_256_8(p, table, y);
  73395. }
  73396. else
  73397. #endif
  73398. {
  73399. XMEMCPY(p->x, table[y].x, sizeof(table[y].x));
  73400. XMEMCPY(p->y, table[y].y, sizeof(table[y].y));
  73401. }
  73402. p->infinity = !y;
  73403. sp_256_proj_point_add_qz1_8(rt, rt, p, t);
  73404. }
  73405. if (map != 0) {
  73406. sp_256_map_8(r, rt, t);
  73407. }
  73408. else {
  73409. XMEMCPY(r, rt, sizeof(sp_point_256));
  73410. }
  73411. }
  73412. #ifdef WOLFSSL_SP_SMALL_STACK
  73413. if (t != NULL)
  73414. XFREE(t, heap, DYNAMIC_TYPE_ECC);
  73415. if (rt != NULL)
  73416. XFREE(rt, heap, DYNAMIC_TYPE_ECC);
  73417. #endif
  73418. return err;
  73419. }
  73420. #ifdef FP_ECC
  73421. #ifndef FP_ENTRIES
  73422. #define FP_ENTRIES 16
  73423. #endif
  73424. /* Cache entry - holds precomputation tables for a point. */
  73425. typedef struct sp_cache_256_t {
  73426. /* X ordinate of point that table was generated from. */
  73427. sp_digit x[8];
  73428. /* Y ordinate of point that table was generated from. */
  73429. sp_digit y[8];
  73430. /* Precomputation table for point. */
  73431. sp_table_entry_256 table[256];
  73432. /* Count of entries in table. */
  73433. uint32_t cnt;
  73434. /* Point and table set in entry. */
  73435. int set;
  73436. } sp_cache_256_t;
  73437. /* Cache of tables. */
  73438. static THREAD_LS_T sp_cache_256_t sp_cache_256[FP_ENTRIES];
  73439. /* Index of last entry in cache. */
  73440. static THREAD_LS_T int sp_cache_256_last = -1;
  73441. /* Cache has been initialized. */
  73442. static THREAD_LS_T int sp_cache_256_inited = 0;
  73443. #ifndef HAVE_THREAD_LS
  73444. static volatile int initCacheMutex_256 = 0;
  73445. static wolfSSL_Mutex sp_cache_256_lock;
  73446. #endif
  73447. /* Get the cache entry for the point.
  73448. *
  73449. * g [in] Point scalar multiplying.
  73450. * cache [out] Cache table to use.
  73451. */
  73452. static void sp_ecc_get_cache_256(const sp_point_256* g, sp_cache_256_t** cache)
  73453. {
  73454. int i;
  73455. int j;
  73456. uint32_t least;
  73457. if (sp_cache_256_inited == 0) {
  73458. for (i=0; i<FP_ENTRIES; i++) {
  73459. sp_cache_256[i].set = 0;
  73460. }
  73461. sp_cache_256_inited = 1;
  73462. }
  73463. /* Compare point with those in cache. */
  73464. for (i=0; i<FP_ENTRIES; i++) {
  73465. if (!sp_cache_256[i].set)
  73466. continue;
  73467. if (sp_256_cmp_equal_8(g->x, sp_cache_256[i].x) &
  73468. sp_256_cmp_equal_8(g->y, sp_cache_256[i].y)) {
  73469. sp_cache_256[i].cnt++;
  73470. break;
  73471. }
  73472. }
  73473. /* No match. */
  73474. if (i == FP_ENTRIES) {
  73475. /* Find empty entry. */
  73476. i = (sp_cache_256_last + 1) % FP_ENTRIES;
  73477. for (; i != sp_cache_256_last; i=(i+1)%FP_ENTRIES) {
  73478. if (!sp_cache_256[i].set) {
  73479. break;
  73480. }
  73481. }
  73482. /* Evict least used. */
  73483. if (i == sp_cache_256_last) {
  73484. least = sp_cache_256[0].cnt;
  73485. for (j=1; j<FP_ENTRIES; j++) {
  73486. if (sp_cache_256[j].cnt < least) {
  73487. i = j;
  73488. least = sp_cache_256[i].cnt;
  73489. }
  73490. }
  73491. }
  73492. XMEMCPY(sp_cache_256[i].x, g->x, sizeof(sp_cache_256[i].x));
  73493. XMEMCPY(sp_cache_256[i].y, g->y, sizeof(sp_cache_256[i].y));
  73494. sp_cache_256[i].set = 1;
  73495. sp_cache_256[i].cnt = 1;
  73496. }
  73497. *cache = &sp_cache_256[i];
  73498. sp_cache_256_last = i;
  73499. }
  73500. #endif /* FP_ECC */
  73501. /* Multiply the base point of P256 by the scalar and return the result.
  73502. * If map is true then convert result to affine coordinates.
  73503. *
  73504. * r Resulting point.
  73505. * g Point to multiply.
  73506. * k Scalar to multiply by.
  73507. * map Indicates whether to convert result to affine.
  73508. * ct Constant time required.
  73509. * heap Heap to use for allocation.
  73510. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  73511. */
  73512. static int sp_256_ecc_mulmod_8(sp_point_256* r, const sp_point_256* g,
  73513. const sp_digit* k, int map, int ct, void* heap)
  73514. {
  73515. #ifndef FP_ECC
  73516. return sp_256_ecc_mulmod_fast_8(r, g, k, map, ct, heap);
  73517. #else
  73518. #ifdef WOLFSSL_SP_SMALL_STACK
  73519. sp_digit* tmp;
  73520. #else
  73521. sp_digit tmp[2 * 8 * 6];
  73522. #endif
  73523. sp_cache_256_t* cache;
  73524. int err = MP_OKAY;
  73525. #ifdef WOLFSSL_SP_SMALL_STACK
  73526. tmp = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 8 * 6, heap, DYNAMIC_TYPE_ECC);
  73527. if (tmp == NULL) {
  73528. err = MEMORY_E;
  73529. }
  73530. #endif
  73531. #ifndef HAVE_THREAD_LS
  73532. if (err == MP_OKAY) {
  73533. if (initCacheMutex_256 == 0) {
  73534. wc_InitMutex(&sp_cache_256_lock);
  73535. initCacheMutex_256 = 1;
  73536. }
  73537. if (wc_LockMutex(&sp_cache_256_lock) != 0) {
  73538. err = BAD_MUTEX_E;
  73539. }
  73540. }
  73541. #endif /* HAVE_THREAD_LS */
  73542. if (err == MP_OKAY) {
  73543. sp_ecc_get_cache_256(g, &cache);
  73544. if (cache->cnt == 2)
  73545. sp_256_gen_stripe_table_8(g, cache->table, tmp, heap);
  73546. #ifndef HAVE_THREAD_LS
  73547. wc_UnLockMutex(&sp_cache_256_lock);
  73548. #endif /* HAVE_THREAD_LS */
  73549. if (cache->cnt < 2) {
  73550. err = sp_256_ecc_mulmod_fast_8(r, g, k, map, ct, heap);
  73551. }
  73552. else {
  73553. err = sp_256_ecc_mulmod_stripe_8(r, g, cache->table, k,
  73554. map, ct, heap);
  73555. }
  73556. }
  73557. #ifdef WOLFSSL_SP_SMALL_STACK
  73558. XFREE(tmp, heap, DYNAMIC_TYPE_ECC);
  73559. #endif
  73560. return err;
  73561. #endif
  73562. }
  73563. #endif /* WOLFSSL_SP_SMALL */
  73564. /* Multiply the point by the scalar and return the result.
  73565. * If map is true then convert result to affine coordinates.
  73566. *
  73567. * km Scalar to multiply by.
  73568. * p Point to multiply.
  73569. * r Resulting point.
  73570. * map Indicates whether to convert result to affine.
  73571. * heap Heap to use for allocation.
  73572. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  73573. */
  73574. int sp_ecc_mulmod_256(const mp_int* km, const ecc_point* gm, ecc_point* r,
  73575. int map, void* heap)
  73576. {
  73577. #ifdef WOLFSSL_SP_SMALL_STACK
  73578. sp_point_256* point = NULL;
  73579. sp_digit* k = NULL;
  73580. #else
  73581. sp_point_256 point[1];
  73582. sp_digit k[8];
  73583. #endif
  73584. int err = MP_OKAY;
  73585. #ifdef WOLFSSL_SP_SMALL_STACK
  73586. point = (sp_point_256*)XMALLOC(sizeof(sp_point_256), heap,
  73587. DYNAMIC_TYPE_ECC);
  73588. if (point == NULL)
  73589. err = MEMORY_E;
  73590. if (err == MP_OKAY) {
  73591. k = (sp_digit*)XMALLOC(sizeof(sp_digit) * 8, heap,
  73592. DYNAMIC_TYPE_ECC);
  73593. if (k == NULL)
  73594. err = MEMORY_E;
  73595. }
  73596. #endif
  73597. if (err == MP_OKAY) {
  73598. sp_256_from_mp(k, 8, km);
  73599. sp_256_point_from_ecc_point_8(point, gm);
  73600. err = sp_256_ecc_mulmod_8(point, point, k, map, 1, heap);
  73601. }
  73602. if (err == MP_OKAY) {
  73603. err = sp_256_point_to_ecc_point_8(point, r);
  73604. }
  73605. #ifdef WOLFSSL_SP_SMALL_STACK
  73606. if (k != NULL)
  73607. XFREE(k, heap, DYNAMIC_TYPE_ECC);
  73608. if (point != NULL)
  73609. XFREE(point, heap, DYNAMIC_TYPE_ECC);
  73610. #endif
  73611. return err;
  73612. }
  73613. /* Multiply the point by the scalar, add point a and return the result.
  73614. * If map is true then convert result to affine coordinates.
  73615. *
  73616. * km Scalar to multiply by.
  73617. * p Point to multiply.
  73618. * am Point to add to scalar multiply result.
  73619. * inMont Point to add is in montgomery form.
  73620. * r Resulting point.
  73621. * map Indicates whether to convert result to affine.
  73622. * heap Heap to use for allocation.
  73623. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  73624. */
  73625. int sp_ecc_mulmod_add_256(const mp_int* km, const ecc_point* gm,
  73626. const ecc_point* am, int inMont, ecc_point* r, int map, void* heap)
  73627. {
  73628. #ifdef WOLFSSL_SP_SMALL_STACK
  73629. sp_point_256* point = NULL;
  73630. sp_digit* k = NULL;
  73631. #else
  73632. sp_point_256 point[2];
  73633. sp_digit k[8 + 8 * 2 * 6];
  73634. #endif
  73635. sp_point_256* addP = NULL;
  73636. sp_digit* tmp = NULL;
  73637. int err = MP_OKAY;
  73638. #ifdef WOLFSSL_SP_SMALL_STACK
  73639. point = (sp_point_256*)XMALLOC(sizeof(sp_point_256) * 2, heap,
  73640. DYNAMIC_TYPE_ECC);
  73641. if (point == NULL)
  73642. err = MEMORY_E;
  73643. if (err == MP_OKAY) {
  73644. k = (sp_digit*)XMALLOC(
  73645. sizeof(sp_digit) * (8 + 8 * 2 * 6), heap,
  73646. DYNAMIC_TYPE_ECC);
  73647. if (k == NULL)
  73648. err = MEMORY_E;
  73649. }
  73650. #endif
  73651. if (err == MP_OKAY) {
  73652. addP = point + 1;
  73653. tmp = k + 8;
  73654. sp_256_from_mp(k, 8, km);
  73655. sp_256_point_from_ecc_point_8(point, gm);
  73656. sp_256_point_from_ecc_point_8(addP, am);
  73657. }
  73658. if ((err == MP_OKAY) && (!inMont)) {
  73659. err = sp_256_mod_mul_norm_8(addP->x, addP->x, p256_mod);
  73660. }
  73661. if ((err == MP_OKAY) && (!inMont)) {
  73662. err = sp_256_mod_mul_norm_8(addP->y, addP->y, p256_mod);
  73663. }
  73664. if ((err == MP_OKAY) && (!inMont)) {
  73665. err = sp_256_mod_mul_norm_8(addP->z, addP->z, p256_mod);
  73666. }
  73667. if (err == MP_OKAY) {
  73668. err = sp_256_ecc_mulmod_8(point, point, k, 0, 0, heap);
  73669. }
  73670. if (err == MP_OKAY) {
  73671. sp_256_proj_point_add_8(point, point, addP, tmp);
  73672. if (map) {
  73673. sp_256_map_8(point, point, tmp);
  73674. }
  73675. err = sp_256_point_to_ecc_point_8(point, r);
  73676. }
  73677. #ifdef WOLFSSL_SP_SMALL_STACK
  73678. if (k != NULL)
  73679. XFREE(k, heap, DYNAMIC_TYPE_ECC);
  73680. if (point != NULL)
  73681. XFREE(point, heap, DYNAMIC_TYPE_ECC);
  73682. #endif
  73683. return err;
  73684. }
  73685. #ifdef WOLFSSL_SP_SMALL
  73686. /* Striping precomputation table.
  73687. * 4 points combined into a table of 16 points.
  73688. * Distance of 64 between points.
  73689. */
  73690. static const sp_table_entry_256 p256_table[16] = {
  73691. /* 0 */
  73692. { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
  73693. { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },
  73694. /* 1 */
  73695. { { 0x18a9143c,0x79e730d4,0x5fedb601,0x75ba95fc,0x77622510,0x79fb732b,
  73696. 0xa53755c6,0x18905f76 },
  73697. { 0xce95560a,0xddf25357,0xba19e45c,0x8b4ab8e4,0xdd21f325,0xd2e88688,
  73698. 0x25885d85,0x8571ff18 } },
  73699. /* 2 */
  73700. { { 0x16a0d2bb,0x4f922fc5,0x1a623499,0x0d5cc16c,0x57c62c8b,0x9241cf3a,
  73701. 0xfd1b667f,0x2f5e6961 },
  73702. { 0xf5a01797,0x5c15c70b,0x60956192,0x3d20b44d,0x071fdb52,0x04911b37,
  73703. 0x8d6f0f7b,0xf648f916 } },
  73704. /* 3 */
  73705. { { 0xe137bbbc,0x9e566847,0x8a6a0bec,0xe434469e,0x79d73463,0xb1c42761,
  73706. 0x133d0015,0x5abe0285 },
  73707. { 0xc04c7dab,0x92aa837c,0x43260c07,0x573d9f4c,0x78e6cc37,0x0c931562,
  73708. 0x6b6f7383,0x94bb725b } },
  73709. /* 4 */
  73710. { { 0xbfe20925,0x62a8c244,0x8fdce867,0x91c19ac3,0xdd387063,0x5a96a5d5,
  73711. 0x21d324f6,0x61d587d4 },
  73712. { 0xa37173ea,0xe87673a2,0x53778b65,0x23848008,0x05bab43e,0x10f8441e,
  73713. 0x4621efbe,0xfa11fe12 } },
  73714. /* 5 */
  73715. { { 0x2cb19ffd,0x1c891f2b,0xb1923c23,0x01ba8d5b,0x8ac5ca8e,0xb6d03d67,
  73716. 0x1f13bedc,0x586eb04c },
  73717. { 0x27e8ed09,0x0c35c6e5,0x1819ede2,0x1e81a33c,0x56c652fa,0x278fd6c0,
  73718. 0x70864f11,0x19d5ac08 } },
  73719. /* 6 */
  73720. { { 0xd2b533d5,0x62577734,0xa1bdddc0,0x673b8af6,0xa79ec293,0x577e7c9a,
  73721. 0xc3b266b1,0xbb6de651 },
  73722. { 0xb65259b3,0xe7e9303a,0xd03a7480,0xd6a0afd3,0x9b3cfc27,0xc5ac83d1,
  73723. 0x5d18b99b,0x60b4619a } },
  73724. /* 7 */
  73725. { { 0x1ae5aa1c,0xbd6a38e1,0x49e73658,0xb8b7652b,0xee5f87ed,0x0b130014,
  73726. 0xaeebffcd,0x9d0f27b2 },
  73727. { 0x7a730a55,0xca924631,0xddbbc83a,0x9c955b2f,0xac019a71,0x07c1dfe0,
  73728. 0x356ec48d,0x244a566d } },
  73729. /* 8 */
  73730. { { 0xf4f8b16a,0x56f8410e,0xc47b266a,0x97241afe,0x6d9c87c1,0x0a406b8e,
  73731. 0xcd42ab1b,0x803f3e02 },
  73732. { 0x04dbec69,0x7f0309a8,0x3bbad05f,0xa83b85f7,0xad8e197f,0xc6097273,
  73733. 0x5067adc1,0xc097440e } },
  73734. /* 9 */
  73735. { { 0xc379ab34,0x846a56f2,0x841df8d1,0xa8ee068b,0x176c68ef,0x20314459,
  73736. 0x915f1f30,0xf1af32d5 },
  73737. { 0x5d75bd50,0x99c37531,0xf72f67bc,0x837cffba,0x48d7723f,0x0613a418,
  73738. 0xe2d41c8b,0x23d0f130 } },
  73739. /* 10 */
  73740. { { 0xd5be5a2b,0xed93e225,0x5934f3c6,0x6fe79983,0x22626ffc,0x43140926,
  73741. 0x7990216a,0x50bbb4d9 },
  73742. { 0xe57ec63e,0x378191c6,0x181dcdb2,0x65422c40,0x0236e0f6,0x41a8099b,
  73743. 0x01fe49c3,0x2b100118 } },
  73744. /* 11 */
  73745. { { 0x9b391593,0xfc68b5c5,0x598270fc,0xc385f5a2,0xd19adcbb,0x7144f3aa,
  73746. 0x83fbae0c,0xdd558999 },
  73747. { 0x74b82ff4,0x93b88b8e,0x71e734c9,0xd2e03c40,0x43c0322a,0x9a7a9eaf,
  73748. 0x149d6041,0xe6e4c551 } },
  73749. /* 12 */
  73750. { { 0x80ec21fe,0x5fe14bfe,0xc255be82,0xf6ce116a,0x2f4a5d67,0x98bc5a07,
  73751. 0xdb7e63af,0xfad27148 },
  73752. { 0x29ab05b3,0x90c0b6ac,0x4e251ae6,0x37a9a83c,0xc2aade7d,0x0a7dc875,
  73753. 0x9f0e1a84,0x77387de3 } },
  73754. /* 13 */
  73755. { { 0xa56c0dd7,0x1e9ecc49,0x46086c74,0xa5cffcd8,0xf505aece,0x8f7a1408,
  73756. 0xbef0c47e,0xb37b85c0 },
  73757. { 0xcc0e6a8f,0x3596b6e4,0x6b388f23,0xfd6d4bbf,0xc39cef4e,0xaba453fa,
  73758. 0xf9f628d5,0x9c135ac8 } },
  73759. /* 14 */
  73760. { { 0x95c8f8be,0x0a1c7294,0x3bf362bf,0x2961c480,0xdf63d4ac,0x9e418403,
  73761. 0x91ece900,0xc109f9cb },
  73762. { 0x58945705,0xc2d095d0,0xddeb85c0,0xb9083d96,0x7a40449b,0x84692b8d,
  73763. 0x2eee1ee1,0x9bc3344f } },
  73764. /* 15 */
  73765. { { 0x42913074,0x0d5ae356,0x48a542b1,0x55491b27,0xb310732a,0x469ca665,
  73766. 0x5f1a4cc1,0x29591d52 },
  73767. { 0xb84f983f,0xe76f5b6b,0x9f5f84e1,0xbe7eef41,0x80baa189,0x1200d496,
  73768. 0x18ef332c,0x6376551f } },
  73769. };
  73770. /* Multiply the base point of P256 by the scalar and return the result.
  73771. * If map is true then convert result to affine coordinates.
  73772. *
  73773. * Stripe implementation.
  73774. * Pre-generated: 2^0, 2^64, ...
  73775. * Pre-generated: products of all combinations of above.
  73776. * 4 doubles and adds (with qz=1)
  73777. *
  73778. * r Resulting point.
  73779. * k Scalar to multiply by.
  73780. * map Indicates whether to convert result to affine.
  73781. * ct Constant time required.
  73782. * heap Heap to use for allocation.
  73783. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  73784. */
  73785. static int sp_256_ecc_mulmod_base_8(sp_point_256* r, const sp_digit* k,
  73786. int map, int ct, void* heap)
  73787. {
  73788. return sp_256_ecc_mulmod_stripe_8(r, &p256_base, p256_table,
  73789. k, map, ct, heap);
  73790. }
  73791. #else
  73792. /* Striping precomputation table.
  73793. * 8 points combined into a table of 256 points.
  73794. * Distance of 32 between points.
  73795. */
  73796. static const sp_table_entry_256 p256_table[256] = {
  73797. /* 0 */
  73798. { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
  73799. { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },
  73800. /* 1 */
  73801. { { 0x18a9143c,0x79e730d4,0x5fedb601,0x75ba95fc,0x77622510,0x79fb732b,
  73802. 0xa53755c6,0x18905f76 },
  73803. { 0xce95560a,0xddf25357,0xba19e45c,0x8b4ab8e4,0xdd21f325,0xd2e88688,
  73804. 0x25885d85,0x8571ff18 } },
  73805. /* 2 */
  73806. { { 0x4147519a,0x20288602,0x26b372f0,0xd0981eac,0xa785ebc8,0xa9d4a7ca,
  73807. 0xdbdf58e9,0xd953c50d },
  73808. { 0xfd590f8f,0x9d6361cc,0x44e6c917,0x72e9626b,0x22eb64cf,0x7fd96110,
  73809. 0x9eb288f3,0x863ebb7e } },
  73810. /* 3 */
  73811. { { 0x5cdb6485,0x7856b623,0x2f0a2f97,0x808f0ea2,0x4f7e300b,0x3e68d954,
  73812. 0xb5ff80a0,0x00076055 },
  73813. { 0x838d2010,0x7634eb9b,0x3243708a,0x54014fbb,0x842a6606,0xe0e47d39,
  73814. 0x34373ee0,0x83087761 } },
  73815. /* 4 */
  73816. { { 0x16a0d2bb,0x4f922fc5,0x1a623499,0x0d5cc16c,0x57c62c8b,0x9241cf3a,
  73817. 0xfd1b667f,0x2f5e6961 },
  73818. { 0xf5a01797,0x5c15c70b,0x60956192,0x3d20b44d,0x071fdb52,0x04911b37,
  73819. 0x8d6f0f7b,0xf648f916 } },
  73820. /* 5 */
  73821. { { 0xe137bbbc,0x9e566847,0x8a6a0bec,0xe434469e,0x79d73463,0xb1c42761,
  73822. 0x133d0015,0x5abe0285 },
  73823. { 0xc04c7dab,0x92aa837c,0x43260c07,0x573d9f4c,0x78e6cc37,0x0c931562,
  73824. 0x6b6f7383,0x94bb725b } },
  73825. /* 6 */
  73826. { { 0x720f141c,0xbbf9b48f,0x2df5bc74,0x6199b3cd,0x411045c4,0xdc3f6129,
  73827. 0x2f7dc4ef,0xcdd6bbcb },
  73828. { 0xeaf436fd,0xcca6700b,0xb99326be,0x6f647f6d,0x014f2522,0x0c0fa792,
  73829. 0x4bdae5f6,0xa361bebd } },
  73830. /* 7 */
  73831. { { 0x597c13c7,0x28aa2558,0x50b7c3e1,0xc38d635f,0xf3c09d1d,0x07039aec,
  73832. 0xc4b5292c,0xba12ca09 },
  73833. { 0x59f91dfd,0x9e408fa4,0xceea07fb,0x3af43b66,0x9d780b29,0x1eceb089,
  73834. 0x701fef4b,0x53ebb99d } },
  73835. /* 8 */
  73836. { { 0xb0e63d34,0x4fe7ee31,0xa9e54fab,0xf4600572,0xd5e7b5a4,0xc0493334,
  73837. 0x06d54831,0x8589fb92 },
  73838. { 0x6583553a,0xaa70f5cc,0xe25649e5,0x0879094a,0x10044652,0xcc904507,
  73839. 0x02541c4f,0xebb0696d } },
  73840. /* 9 */
  73841. { { 0xac1647c5,0x4616ca15,0xc4cf5799,0xb8127d47,0x764dfbac,0xdc666aa3,
  73842. 0xd1b27da3,0xeb2820cb },
  73843. { 0x6a87e008,0x9406f8d8,0x922378f3,0xd87dfa9d,0x80ccecb2,0x56ed2e42,
  73844. 0x55a7da1d,0x1f28289b } },
  73845. /* 10 */
  73846. { { 0x3b89da99,0xabbaa0c0,0xb8284022,0xa6f2d79e,0xb81c05e8,0x27847862,
  73847. 0x05e54d63,0x337a4b59 },
  73848. { 0x21f7794a,0x3c67500d,0x7d6d7f61,0x207005b7,0x04cfd6e8,0x0a5a3781,
  73849. 0xf4c2fbd6,0x0d65e0d5 } },
  73850. /* 11 */
  73851. { { 0xb5275d38,0xd9d09bbe,0x0be0a358,0x4268a745,0x973eb265,0xf0762ff4,
  73852. 0x52f4a232,0xc23da242 },
  73853. { 0x0b94520c,0x5da1b84f,0xb05bd78e,0x09666763,0x94d29ea1,0x3a4dcb86,
  73854. 0xc790cff1,0x19de3b8c } },
  73855. /* 12 */
  73856. { { 0x26c5fe04,0x183a716c,0x3bba1bdb,0x3b28de0b,0xa4cb712c,0x7432c586,
  73857. 0x91fccbfd,0xe34dcbd4 },
  73858. { 0xaaa58403,0xb408d46b,0x82e97a53,0x9a697486,0x36aaa8af,0x9e390127,
  73859. 0x7b4e0f7f,0xe7641f44 } },
  73860. /* 13 */
  73861. { { 0xdf64ba59,0x7d753941,0x0b0242fc,0xd33f10ec,0xa1581859,0x4f06dfc6,
  73862. 0x052a57bf,0x4a12df57 },
  73863. { 0x9439dbd0,0xbfa6338f,0xbde53e1f,0xd3c24bd4,0x21f1b314,0xfd5e4ffa,
  73864. 0xbb5bea46,0x6af5aa93 } },
  73865. /* 14 */
  73866. { { 0x10c91999,0xda10b699,0x2a580491,0x0a24b440,0xb8cc2090,0x3e0094b4,
  73867. 0x66a44013,0x5fe3475a },
  73868. { 0xf93e7b4b,0xb0f8cabd,0x7c23f91a,0x292b501a,0xcd1e6263,0x42e889ae,
  73869. 0xecfea916,0xb544e308 } },
  73870. /* 15 */
  73871. { { 0x16ddfdce,0x6478c6e9,0xf89179e6,0x2c329166,0x4d4e67e1,0x4e8d6e76,
  73872. 0xa6b0c20b,0xe0b6b2bd },
  73873. { 0xbb7efb57,0x0d312df2,0x790c4007,0x1aac0dde,0x679bc944,0xf90336ad,
  73874. 0x25a63774,0x71c023de } },
  73875. /* 16 */
  73876. { { 0xbfe20925,0x62a8c244,0x8fdce867,0x91c19ac3,0xdd387063,0x5a96a5d5,
  73877. 0x21d324f6,0x61d587d4 },
  73878. { 0xa37173ea,0xe87673a2,0x53778b65,0x23848008,0x05bab43e,0x10f8441e,
  73879. 0x4621efbe,0xfa11fe12 } },
  73880. /* 17 */
  73881. { { 0x2cb19ffd,0x1c891f2b,0xb1923c23,0x01ba8d5b,0x8ac5ca8e,0xb6d03d67,
  73882. 0x1f13bedc,0x586eb04c },
  73883. { 0x27e8ed09,0x0c35c6e5,0x1819ede2,0x1e81a33c,0x56c652fa,0x278fd6c0,
  73884. 0x70864f11,0x19d5ac08 } },
  73885. /* 18 */
  73886. { { 0x309a4e1f,0x1e99f581,0xe9270074,0xab7de71b,0xefd28d20,0x26a5ef0b,
  73887. 0x7f9c563f,0xe7c0073f },
  73888. { 0x0ef59f76,0x1f6d663a,0x20fcb050,0x669b3b54,0x7a6602d4,0xc08c1f7a,
  73889. 0xc65b3c0a,0xe08504fe } },
  73890. /* 19 */
  73891. { { 0xa031b3ca,0xf098f68d,0xe6da6d66,0x6d1cab9e,0x94f246e8,0x5bfd81fa,
  73892. 0x5b0996b4,0x78f01882 },
  73893. { 0x3a25787f,0xb7eefde4,0x1dccac9b,0x8016f80d,0xb35bfc36,0x0cea4877,
  73894. 0x7e94747a,0x43a773b8 } },
  73895. /* 20 */
  73896. { { 0xd2b533d5,0x62577734,0xa1bdddc0,0x673b8af6,0xa79ec293,0x577e7c9a,
  73897. 0xc3b266b1,0xbb6de651 },
  73898. { 0xb65259b3,0xe7e9303a,0xd03a7480,0xd6a0afd3,0x9b3cfc27,0xc5ac83d1,
  73899. 0x5d18b99b,0x60b4619a } },
  73900. /* 21 */
  73901. { { 0x1ae5aa1c,0xbd6a38e1,0x49e73658,0xb8b7652b,0xee5f87ed,0x0b130014,
  73902. 0xaeebffcd,0x9d0f27b2 },
  73903. { 0x7a730a55,0xca924631,0xddbbc83a,0x9c955b2f,0xac019a71,0x07c1dfe0,
  73904. 0x356ec48d,0x244a566d } },
  73905. /* 22 */
  73906. { { 0xeacf1f96,0x6db0394a,0x024c271c,0x9f2122a9,0x82cbd3b9,0x2626ac1b,
  73907. 0x3581ef69,0x45e58c87 },
  73908. { 0xa38f9dbc,0xd3ff479d,0xe888a040,0xa8aaf146,0x46e0bed7,0x945adfb2,
  73909. 0xc1e4b7a4,0xc040e21c } },
  73910. /* 23 */
  73911. { { 0x6f8117b6,0x847af000,0x73a35433,0x651969ff,0x1d9475eb,0x482b3576,
  73912. 0x682c6ec7,0x1cdf5c97 },
  73913. { 0x11f04839,0x7db775b4,0x48de1698,0x7dbeacf4,0xb70b3219,0xb2921dd1,
  73914. 0xa92dff3d,0x046755f8 } },
  73915. /* 24 */
  73916. { { 0xbce8ffcd,0xcc8ac5d2,0x2fe61a82,0x0d53c48b,0x7202d6c7,0xf6f16172,
  73917. 0x3b83a5f3,0x046e5e11 },
  73918. { 0xd8007f01,0xe7b8ff64,0x5af43183,0x7fb1ef12,0x35e1a03c,0x045c5ea6,
  73919. 0x303d005b,0x6e0106c3 } },
  73920. /* 25 */
  73921. { { 0x88dd73b1,0x48c73584,0x995ed0d9,0x7670708f,0xc56a2ab7,0x38385ea8,
  73922. 0xe901cf1f,0x442594ed },
  73923. { 0x12d4b65b,0xf8faa2c9,0x96c90c37,0x94c2343b,0x5e978d1f,0xd326e4a1,
  73924. 0x4c2ee68e,0xa796fa51 } },
  73925. /* 26 */
  73926. { { 0x823addd7,0x359fb604,0xe56693b3,0x9e2a6183,0x3cbf3c80,0xf885b78e,
  73927. 0xc69766e9,0xe4ad2da9 },
  73928. { 0x8e048a61,0x357f7f42,0xc092d9a0,0x082d198c,0xc03ed8ef,0xfc3a1af4,
  73929. 0xc37b5143,0xc5e94046 } },
  73930. /* 27 */
  73931. { { 0x2be75f9e,0x476a538c,0xcb123a78,0x6fd1a9e8,0xb109c04b,0xd85e4df0,
  73932. 0xdb464747,0x63283daf },
  73933. { 0xbaf2df15,0xce728cf7,0x0ad9a7f4,0xe592c455,0xe834bcc3,0xfab226ad,
  73934. 0x1981a938,0x68bd19ab } },
  73935. /* 28 */
  73936. { { 0x1887d659,0xc08ead51,0xb359305a,0x3374d5f4,0xcfe74fe3,0x96986981,
  73937. 0x3c6fdfd6,0x495292f5 },
  73938. { 0x1acec896,0x4a878c9e,0xec5b4484,0xd964b210,0x664d60a7,0x6696f7e2,
  73939. 0x26036837,0x0ec7530d } },
  73940. /* 29 */
  73941. { { 0xad2687bb,0x2da13a05,0xf32e21fa,0xa1f83b6a,0x1dd4607b,0x390f5ef5,
  73942. 0x64863f0b,0x0f6207a6 },
  73943. { 0x0f138233,0xbd67e3bb,0x272aa718,0xdd66b96c,0x26ec88ae,0x8ed00407,
  73944. 0x08ed6dcf,0xff0db072 } },
  73945. /* 30 */
  73946. { { 0x4c95d553,0x749fa101,0x5d680a8a,0xa44052fd,0xff3b566f,0x183b4317,
  73947. 0x88740ea3,0x313b513c },
  73948. { 0x08d11549,0xb402e2ac,0xb4dee21c,0x071ee10b,0x47f2320e,0x26b987dd,
  73949. 0x86f19f81,0x2d3abcf9 } },
  73950. /* 31 */
  73951. { { 0x815581a2,0x4c288501,0x632211af,0x9a0a6d56,0x0cab2e99,0x19ba7a0f,
  73952. 0xded98cdf,0xc036fa10 },
  73953. { 0xc1fbd009,0x29ae08ba,0x06d15816,0x0b68b190,0x9b9e0d8f,0xc2eb3277,
  73954. 0xb6d40194,0xa6b2a2c4 } },
  73955. /* 32 */
  73956. { { 0x6d3549cf,0xd433e50f,0xfacd665e,0x6f33696f,0xce11fcb4,0x695bfdac,
  73957. 0xaf7c9860,0x810ee252 },
  73958. { 0x7159bb2c,0x65450fe1,0x758b357b,0xf7dfbebe,0xd69fea72,0x2b057e74,
  73959. 0x92731745,0xd485717a } },
  73960. /* 33 */
  73961. { { 0xf0cb5a98,0x11741a8a,0x1f3110bf,0xd3da8f93,0xab382adf,0x1994e2cb,
  73962. 0x2f9a604e,0x6a6045a7 },
  73963. { 0xa2b2411d,0x170c0d3f,0x510e96e0,0xbe0eb83e,0x8865b3cc,0x3bcc9f73,
  73964. 0xf9e15790,0xd3e45cfa } },
  73965. /* 34 */
  73966. { { 0xe83f7669,0xce1f69bb,0x72877d6b,0x09f8ae82,0x3244278d,0x9548ae54,
  73967. 0xe3c2c19c,0x207755de },
  73968. { 0x6fef1945,0x87bd61d9,0xb12d28c3,0x18813cef,0x72df64aa,0x9fbcd1d6,
  73969. 0x7154b00d,0x48dc5ee5 } },
  73970. /* 35 */
  73971. { { 0xf7e5a199,0x123790bf,0x989ccbb7,0xe0efb8cf,0x0a519c79,0xc27a2bfe,
  73972. 0xdff6f445,0xf2fb0aed },
  73973. { 0xf0b5025f,0x41c09575,0x40fa9f22,0x550543d7,0x380bfbd0,0x8fa3c8ad,
  73974. 0xdb28d525,0xa13e9015 } },
  73975. /* 36 */
  73976. { { 0xa2b65cbc,0xf9f7a350,0x2a464226,0x0b04b972,0xe23f07a1,0x265ce241,
  73977. 0x1497526f,0x2bf0d6b0 },
  73978. { 0x4b216fb7,0xd3d4dd3f,0xfbdda26a,0xf7d7b867,0x6708505c,0xaeb7b83f,
  73979. 0x162fe89f,0x42a94a5a } },
  73980. /* 37 */
  73981. { { 0xeaadf191,0x5846ad0b,0x25a268d7,0x0f8a4890,0x494dc1f6,0xe8603050,
  73982. 0xc65ede3d,0x2c2dd969 },
  73983. { 0x93849c17,0x6d02171d,0x1da250dd,0x460488ba,0x3c3a5485,0x4810c706,
  73984. 0x42c56dbc,0xf437fa1f } },
  73985. /* 38 */
  73986. { { 0x4a0f7dab,0x6aa0d714,0x1776e9ac,0x0f049793,0xf5f39786,0x52c0a050,
  73987. 0x54707aa8,0xaaf45b33 },
  73988. { 0xc18d364a,0x85e37c33,0x3e497165,0xd40b9b06,0x15ec5444,0xf4171681,
  73989. 0xf4f272bc,0xcdf6310d } },
  73990. /* 39 */
  73991. { { 0x8ea8b7ef,0x7473c623,0x85bc2287,0x08e93518,0x2bda8e34,0x41956772,
  73992. 0xda9e2ff2,0xf0d008ba },
  73993. { 0x2414d3b1,0x2912671d,0xb019ea76,0xb3754985,0x453bcbdb,0x5c61b96d,
  73994. 0xca887b8b,0x5bd5c2f5 } },
  73995. /* 40 */
  73996. { { 0xf49a3154,0xef0f469e,0x6e2b2e9a,0x3e85a595,0xaa924a9c,0x45aaec1e,
  73997. 0xa09e4719,0xaa12dfc8 },
  73998. { 0x4df69f1d,0x26f27227,0xa2ff5e73,0xe0e4c82c,0xb7a9dd44,0xb9d8ce73,
  73999. 0xe48ca901,0x6c036e73 } },
  74000. /* 41 */
  74001. { { 0x0f6e3138,0x5cfae12a,0x25ad345a,0x6966ef00,0x45672bc5,0x8993c64b,
  74002. 0x96afbe24,0x292ff658 },
  74003. { 0x5e213402,0xd5250d44,0x4392c9fe,0xf6580e27,0xda1c72e8,0x097b397f,
  74004. 0x311b7276,0x644e0c90 } },
  74005. /* 42 */
  74006. { { 0xa47153f0,0xe1e421e1,0x920418c9,0xb86c3b79,0x705d7672,0x93bdce87,
  74007. 0xcab79a77,0xf25ae793 },
  74008. { 0x6d869d0c,0x1f3194a3,0x4986c264,0x9d55c882,0x096e945e,0x49fb5ea3,
  74009. 0x13db0a3e,0x39b8e653 } },
  74010. /* 43 */
  74011. { { 0xb6fd2e59,0x37754200,0x9255c98f,0x35e2c066,0x0e2a5739,0xd9dab21a,
  74012. 0x0f19db06,0x39122f2f },
  74013. { 0x03cad53c,0xcfbce1e0,0xe65c17e3,0x225b2c0f,0x9aa13877,0x72baf1d2,
  74014. 0xce80ff8d,0x8de80af8 } },
  74015. /* 44 */
  74016. { { 0x207bbb76,0xafbea8d9,0x21782758,0x921c7e7c,0x1c0436b1,0xdfa2b74b,
  74017. 0x2e368c04,0x87194906 },
  74018. { 0xa3993df5,0xb5f928bb,0xf3b3d26a,0x639d75b5,0x85b55050,0x011aa78a,
  74019. 0x5b74fde1,0xfc315e6a } },
  74020. /* 45 */
  74021. { { 0xe8d6ecfa,0x561fd41a,0x1aec7f86,0x5f8c44f6,0x4924741d,0x98452a7b,
  74022. 0xee389088,0xe6d4a7ad },
  74023. { 0x4593c75d,0x60552ed1,0xdd271162,0x70a70da4,0x7ba2c7db,0xd2aede93,
  74024. 0x9be2ae57,0x35dfaf9a } },
  74025. /* 46 */
  74026. { { 0xaa736636,0x6b956fcd,0xae2cab7e,0x09f51d97,0x0f349966,0xfb10bf41,
  74027. 0x1c830d2b,0x1da5c7d7 },
  74028. { 0x3cce6825,0x5c41e483,0xf9573c3b,0x15ad118f,0xf23036b8,0xa28552c7,
  74029. 0xdbf4b9d6,0x7077c0fd } },
  74030. /* 47 */
  74031. { { 0x46b9661c,0xbf63ff8d,0x0d2cfd71,0xa1dfd36b,0xa847f8f7,0x0373e140,
  74032. 0xe50efe44,0x53a8632e },
  74033. { 0x696d8051,0x0976ff68,0xc74f468a,0xdaec0c95,0x5e4e26bd,0x62994dc3,
  74034. 0x34e1fcc1,0x028ca76d } },
  74035. /* 48 */
  74036. { { 0xfc9877ee,0xd11d47dc,0x801d0002,0xc8b36210,0x54c260b6,0xd002c117,
  74037. 0x6962f046,0x04c17cd8 },
  74038. { 0xb0daddf5,0x6d9bd094,0x24ce55c0,0xbea23575,0x72da03b5,0x663356e6,
  74039. 0xfed97474,0xf7ba4de9 } },
  74040. /* 49 */
  74041. { { 0xebe1263f,0xd0dbfa34,0x71ae7ce6,0x55763735,0x82a6f523,0xd2440553,
  74042. 0x52131c41,0xe31f9600 },
  74043. { 0xea6b6ec6,0xd1bb9216,0x73c2fc44,0x37a1d12e,0x89d0a294,0xc10e7eac,
  74044. 0xce34d47b,0xaa3a6259 } },
  74045. /* 50 */
  74046. { { 0x36f3dcd3,0xfbcf9df5,0xd2bf7360,0x6ceded50,0xdf504f5b,0x491710fa,
  74047. 0x7e79daee,0x2398dd62 },
  74048. { 0x6d09569e,0xcf4705a3,0x5149f769,0xea0619bb,0x35f6034c,0xff9c0377,
  74049. 0x1c046210,0x5717f5b2 } },
  74050. /* 51 */
  74051. { { 0x21dd895e,0x9fe229c9,0x40c28451,0x8e518500,0x1d637ecd,0xfa13d239,
  74052. 0x0e3c28de,0x660a2c56 },
  74053. { 0xd67fcbd0,0x9cca88ae,0x0ea9f096,0xc8472478,0x72e92b4d,0x32b2f481,
  74054. 0x4f522453,0x624ee54c } },
  74055. /* 52 */
  74056. { { 0xd897eccc,0x09549ce4,0x3f9880aa,0x4d49d1d9,0x043a7c20,0x723c2423,
  74057. 0x92bdfbc0,0x4f392afb },
  74058. { 0x7de44fd9,0x6969f8fa,0x57b32156,0xb66cfbe4,0x368ebc3c,0xdb2fa803,
  74059. 0xccdb399c,0x8a3e7977 } },
  74060. /* 53 */
  74061. { { 0x06c4b125,0xdde1881f,0xf6e3ca8c,0xae34e300,0x5c7a13e9,0xef6999de,
  74062. 0x70c24404,0x3888d023 },
  74063. { 0x44f91081,0x76280356,0x5f015504,0x3d9fcf61,0x632cd36e,0x1827edc8,
  74064. 0x18102336,0xa5e62e47 } },
  74065. /* 54 */
  74066. { { 0x2facd6c8,0x1a825ee3,0x54bcbc66,0x699c6354,0x98df9931,0x0ce3edf7,
  74067. 0x466a5adc,0x2c4768e6 },
  74068. { 0x90a64bc9,0xb346ff8c,0xe4779f5c,0x630a6020,0xbc05e884,0xd949d064,
  74069. 0xf9e652a0,0x7b5e6441 } },
  74070. /* 55 */
  74071. { { 0x1d28444a,0x2169422c,0xbe136a39,0xe996c5d8,0xfb0c7fce,0x2387afe5,
  74072. 0x0c8d744a,0xb8af73cb },
  74073. { 0x338b86fd,0x5fde83aa,0xa58a5cff,0xfee3f158,0x20ac9433,0xc9ee8f6f,
  74074. 0x7f3f0895,0xa036395f } },
  74075. /* 56 */
  74076. { { 0xa10f7770,0x8c73c6bb,0xa12a0e24,0xa6f16d81,0x51bc2b9f,0x100df682,
  74077. 0x875fb533,0x4be36b01 },
  74078. { 0x9fb56dbb,0x9226086e,0x07e7a4f8,0x306fef8b,0x66d52f20,0xeeaccc05,
  74079. 0x1bdc00c0,0x8cbc9a87 } },
  74080. /* 57 */
  74081. { { 0xc0dac4ab,0xe131895c,0x712ff112,0xa874a440,0x6a1cee57,0x6332ae7c,
  74082. 0x0c0835f8,0x44e7553e },
  74083. { 0x7734002d,0x6d503fff,0x0b34425c,0x9d35cb8b,0x0e8738b5,0x95f70276,
  74084. 0x5eb8fc18,0x470a683a } },
  74085. /* 58 */
  74086. { { 0x90513482,0x81b761dc,0x01e9276a,0x0287202a,0x0ce73083,0xcda441ee,
  74087. 0xc63dc6ef,0x16410690 },
  74088. { 0x6d06a2ed,0xf5034a06,0x189b100b,0xdd4d7745,0xab8218c9,0xd914ae72,
  74089. 0x7abcbb4f,0xd73479fd } },
  74090. /* 59 */
  74091. { { 0x5ad4c6e5,0x7edefb16,0x5b06d04d,0x262cf08f,0x8575cb14,0x12ed5bb1,
  74092. 0x0771666b,0x816469e3 },
  74093. { 0x561e291e,0xd7ab9d79,0xc1de1661,0xeb9daf22,0x135e0513,0xf49827eb,
  74094. 0xf0dd3f9c,0x0a36dd23 } },
  74095. /* 60 */
  74096. { { 0x41d5533c,0x098d32c7,0x8684628f,0x7c5f5a9e,0xe349bd11,0x39a228ad,
  74097. 0xfdbab118,0xe331dfd6 },
  74098. { 0x6bcc6ed8,0x5100ab68,0xef7a260e,0x7160c3bd,0xbce850d7,0x9063d9a7,
  74099. 0x492e3389,0xd3b4782a } },
  74100. /* 61 */
  74101. { { 0xf3821f90,0xa149b6e8,0x66eb7aad,0x92edd9ed,0x1a013116,0x0bb66953,
  74102. 0x4c86a5bd,0x7281275a },
  74103. { 0xd3ff47e5,0x503858f7,0x61016441,0x5e1616bc,0x7dfd9bb1,0x62b0f11a,
  74104. 0xce145059,0x2c062e7e } },
  74105. /* 62 */
  74106. { { 0x0159ac2e,0xa76f996f,0xcbdb2713,0x281e7736,0x08e46047,0x2ad6d288,
  74107. 0x2c4e7ef1,0x282a35f9 },
  74108. { 0xc0ce5cd2,0x9c354b1e,0x1379c229,0xcf99efc9,0x3e82c11e,0x992caf38,
  74109. 0x554d2abd,0xc71cd513 } },
  74110. /* 63 */
  74111. { { 0x09b578f4,0x4885de9c,0xe3affa7a,0x1884e258,0x59182f1f,0x8f76b1b7,
  74112. 0xcf47f3a3,0xc50f6740 },
  74113. { 0x374b68ea,0xa9c4adf3,0x69965fe2,0xa406f323,0x85a53050,0x2f86a222,
  74114. 0x212958dc,0xb9ecb3a7 } },
  74115. /* 64 */
  74116. { { 0xf4f8b16a,0x56f8410e,0xc47b266a,0x97241afe,0x6d9c87c1,0x0a406b8e,
  74117. 0xcd42ab1b,0x803f3e02 },
  74118. { 0x04dbec69,0x7f0309a8,0x3bbad05f,0xa83b85f7,0xad8e197f,0xc6097273,
  74119. 0x5067adc1,0xc097440e } },
  74120. /* 65 */
  74121. { { 0xc379ab34,0x846a56f2,0x841df8d1,0xa8ee068b,0x176c68ef,0x20314459,
  74122. 0x915f1f30,0xf1af32d5 },
  74123. { 0x5d75bd50,0x99c37531,0xf72f67bc,0x837cffba,0x48d7723f,0x0613a418,
  74124. 0xe2d41c8b,0x23d0f130 } },
  74125. /* 66 */
  74126. { { 0xf41500d9,0x857ab6ed,0xfcbeada8,0x0d890ae5,0x89725951,0x52fe8648,
  74127. 0xc0a3fadd,0xb0288dd6 },
  74128. { 0x650bcb08,0x85320f30,0x695d6e16,0x71af6313,0xb989aa76,0x31f520a7,
  74129. 0xf408c8d2,0xffd3724f } },
  74130. /* 67 */
  74131. { { 0xb458e6cb,0x53968e64,0x317a5d28,0x992dad20,0x7aa75f56,0x3814ae0b,
  74132. 0xd78c26df,0xf5590f4a },
  74133. { 0xcf0ba55a,0x0fc24bd3,0x0c778bae,0x0fc4724a,0x683b674a,0x1ce9864f,
  74134. 0xf6f74a20,0x18d6da54 } },
  74135. /* 68 */
  74136. { { 0xd5be5a2b,0xed93e225,0x5934f3c6,0x6fe79983,0x22626ffc,0x43140926,
  74137. 0x7990216a,0x50bbb4d9 },
  74138. { 0xe57ec63e,0x378191c6,0x181dcdb2,0x65422c40,0x0236e0f6,0x41a8099b,
  74139. 0x01fe49c3,0x2b100118 } },
  74140. /* 69 */
  74141. { { 0x9b391593,0xfc68b5c5,0x598270fc,0xc385f5a2,0xd19adcbb,0x7144f3aa,
  74142. 0x83fbae0c,0xdd558999 },
  74143. { 0x74b82ff4,0x93b88b8e,0x71e734c9,0xd2e03c40,0x43c0322a,0x9a7a9eaf,
  74144. 0x149d6041,0xe6e4c551 } },
  74145. /* 70 */
  74146. { { 0x1e9af288,0x55f655bb,0xf7ada931,0x647e1a64,0xcb2820e5,0x43697e4b,
  74147. 0x07ed56ff,0x51e00db1 },
  74148. { 0x771c327e,0x43d169b8,0x4a96c2ad,0x29cdb20b,0x3deb4779,0xc07d51f5,
  74149. 0x49829177,0xe22f4241 } },
  74150. /* 71 */
  74151. { { 0x635f1abb,0xcd45e8f4,0x68538874,0x7edc0cb5,0xb5a8034d,0xc9472c1f,
  74152. 0x52dc48c9,0xf709373d },
  74153. { 0xa8af30d6,0x401966bb,0xf137b69c,0x95bf5f4a,0x9361c47e,0x3966162a,
  74154. 0xe7275b11,0xbd52d288 } },
  74155. /* 72 */
  74156. { { 0x9c5fa877,0xab155c7a,0x7d3a3d48,0x17dad672,0x73d189d8,0x43f43f9e,
  74157. 0xc8aa77a6,0xa0d0f8e4 },
  74158. { 0xcc94f92d,0x0bbeafd8,0x0c4ddb3a,0xd818c8be,0xb82eba14,0x22cc65f8,
  74159. 0x946d6a00,0xa56c78c7 } },
  74160. /* 73 */
  74161. { { 0x0dd09529,0x2962391b,0x3daddfcf,0x803e0ea6,0x5b5bf481,0x2c77351f,
  74162. 0x731a367a,0xd8befdf8 },
  74163. { 0xfc0157f4,0xab919d42,0xfec8e650,0xf51caed7,0x02d48b0a,0xcdf9cb40,
  74164. 0xce9f6478,0x854a68a5 } },
  74165. /* 74 */
  74166. { { 0x63506ea5,0xdc35f67b,0xa4fe0d66,0x9286c489,0xfe95cd4d,0x3f101d3b,
  74167. 0x98846a95,0x5cacea0b },
  74168. { 0x9ceac44d,0xa90df60c,0x354d1c3a,0x3db29af4,0xad5dbabe,0x08dd3de8,
  74169. 0x35e4efa9,0xe4982d12 } },
  74170. /* 75 */
  74171. { { 0xc34cd55e,0x23104a22,0x2680d132,0x58695bb3,0x1fa1d943,0xfb345afa,
  74172. 0x16b20499,0x8046b7f6 },
  74173. { 0x38e7d098,0xb533581e,0xf46f0b70,0xd7f61e8d,0x44cb78c4,0x30dea9ea,
  74174. 0x9082af55,0xeb17ca7b } },
  74175. /* 76 */
  74176. { { 0x76a145b9,0x1751b598,0xc1bc71ec,0xa5cf6b0f,0x392715bb,0xd3e03565,
  74177. 0xfab5e131,0x097b00ba },
  74178. { 0x565f69e1,0xaa66c8e9,0xb5be5199,0x77e8f75a,0xda4fd984,0x6033ba11,
  74179. 0xafdbcc9e,0xf95c747b } },
  74180. /* 77 */
  74181. { { 0xbebae45e,0x558f01d3,0xc4bc6955,0xa8ebe9f0,0xdbc64fc6,0xaeb705b1,
  74182. 0x566ed837,0x3512601e },
  74183. { 0xfa1161cd,0x9336f1e1,0x4c65ef87,0x328ab8d5,0x724f21e5,0x4757eee2,
  74184. 0x6068ab6b,0x0ef97123 } },
  74185. /* 78 */
  74186. { { 0x54ca4226,0x02598cf7,0xf8642c8e,0x5eede138,0x468e1790,0x48963f74,
  74187. 0x3b4fbc95,0xfc16d933 },
  74188. { 0xe7c800ca,0xbe96fb31,0x2678adaa,0x13806331,0x6ff3e8b5,0x3d624497,
  74189. 0xb95d7a17,0x14ca4af1 } },
  74190. /* 79 */
  74191. { { 0xbd2f81d5,0x7a4771ba,0x01f7d196,0x1a5f9d69,0xcad9c907,0xd898bef7,
  74192. 0xf59c231d,0x4057b063 },
  74193. { 0x89c05c0a,0xbffd82fe,0x1dc0df85,0xe4911c6f,0xa35a16db,0x3befccae,
  74194. 0xf1330b13,0x1c3b5d64 } },
  74195. /* 80 */
  74196. { { 0x80ec21fe,0x5fe14bfe,0xc255be82,0xf6ce116a,0x2f4a5d67,0x98bc5a07,
  74197. 0xdb7e63af,0xfad27148 },
  74198. { 0x29ab05b3,0x90c0b6ac,0x4e251ae6,0x37a9a83c,0xc2aade7d,0x0a7dc875,
  74199. 0x9f0e1a84,0x77387de3 } },
  74200. /* 81 */
  74201. { { 0xa56c0dd7,0x1e9ecc49,0x46086c74,0xa5cffcd8,0xf505aece,0x8f7a1408,
  74202. 0xbef0c47e,0xb37b85c0 },
  74203. { 0xcc0e6a8f,0x3596b6e4,0x6b388f23,0xfd6d4bbf,0xc39cef4e,0xaba453fa,
  74204. 0xf9f628d5,0x9c135ac8 } },
  74205. /* 82 */
  74206. { { 0x84e35743,0x32aa3202,0x85a3cdef,0x320d6ab1,0x1df19819,0xb821b176,
  74207. 0xc433851f,0x5721361f },
  74208. { 0x71fc9168,0x1f0db36a,0x5e5c403c,0x5f98ba73,0x37bcd8f5,0xf64ca87e,
  74209. 0xe6bb11bd,0xdcbac3c9 } },
  74210. /* 83 */
  74211. { { 0x4518cbe2,0xf01d9968,0x9c9eb04e,0xd242fc18,0xe47feebf,0x727663c7,
  74212. 0x2d626862,0xb8c1c89e },
  74213. { 0xc8e1d569,0x51a58bdd,0xb7d88cd0,0x563809c8,0xf11f31eb,0x26c27fd9,
  74214. 0x2f9422d4,0x5d23bbda } },
  74215. /* 84 */
  74216. { { 0x95c8f8be,0x0a1c7294,0x3bf362bf,0x2961c480,0xdf63d4ac,0x9e418403,
  74217. 0x91ece900,0xc109f9cb },
  74218. { 0x58945705,0xc2d095d0,0xddeb85c0,0xb9083d96,0x7a40449b,0x84692b8d,
  74219. 0x2eee1ee1,0x9bc3344f } },
  74220. /* 85 */
  74221. { { 0x42913074,0x0d5ae356,0x48a542b1,0x55491b27,0xb310732a,0x469ca665,
  74222. 0x5f1a4cc1,0x29591d52 },
  74223. { 0xb84f983f,0xe76f5b6b,0x9f5f84e1,0xbe7eef41,0x80baa189,0x1200d496,
  74224. 0x18ef332c,0x6376551f } },
  74225. /* 86 */
  74226. { { 0x562976cc,0xbda5f14e,0x0ef12c38,0x22bca3e6,0x6cca9852,0xbbfa3064,
  74227. 0x08e2987a,0xbdb79dc8 },
  74228. { 0xcb06a772,0xfd2cb5c9,0xfe536dce,0x38f475aa,0x7c2b5db8,0xc2a3e022,
  74229. 0xadd3c14a,0x8ee86001 } },
  74230. /* 87 */
  74231. { { 0xa4ade873,0xcbe96981,0xc4fba48c,0x7ee9aa4d,0x5a054ba5,0x2cee2899,
  74232. 0x6f77aa4b,0x92e51d7a },
  74233. { 0x7190a34d,0x948bafa8,0xf6bd1ed1,0xd698f75b,0x0caf1144,0xd00ee6e3,
  74234. 0x0a56aaaa,0x5182f86f } },
  74235. /* 88 */
  74236. { { 0x7a4cc99c,0xfba6212c,0x3e6d9ca1,0xff609b68,0x5ac98c5a,0x5dbb27cb,
  74237. 0x4073a6f2,0x91dcab5d },
  74238. { 0x5f575a70,0x01b6cc3d,0x6f8d87fa,0x0cb36139,0x89981736,0x165d4e8c,
  74239. 0x97974f2b,0x17a0cedb } },
  74240. /* 89 */
  74241. { { 0x076c8d3a,0x38861e2a,0x210f924b,0x701aad39,0x13a835d9,0x94d0eae4,
  74242. 0x7f4cdf41,0x2e8ce36c },
  74243. { 0x037a862b,0x91273dab,0x60e4c8fa,0x01ba9bb7,0x33baf2dd,0xf9645388,
  74244. 0x34f668f3,0xf4ccc6cb } },
  74245. /* 90 */
  74246. { { 0xf1f79687,0x44ef525c,0x92efa815,0x7c595495,0xa5c78d29,0xe1231741,
  74247. 0x9a0df3c9,0xac0db488 },
  74248. { 0xdf01747f,0x86bfc711,0xef17df13,0x592b9358,0x5ccb6bb5,0xe5880e4f,
  74249. 0x94c974a2,0x95a64a61 } },
  74250. /* 91 */
  74251. { { 0xc15a4c93,0x72c1efda,0x82585141,0x40269b73,0x16cb0bad,0x6a8dfb1c,
  74252. 0x29210677,0x231e54ba },
  74253. { 0x8ae6d2dc,0xa70df917,0x39112918,0x4d6aa63f,0x5e5b7223,0xf627726b,
  74254. 0xd8a731e1,0xab0be032 } },
  74255. /* 92 */
  74256. { { 0x8d131f2d,0x097ad0e9,0x3b04f101,0x637f09e3,0xd5e9a748,0x1ac86196,
  74257. 0x2cf6a679,0xf1bcc880 },
  74258. { 0xe8daacb4,0x25c69140,0x60f65009,0x3c4e4055,0x477937a6,0x591cc8fc,
  74259. 0x5aebb271,0x85169469 } },
  74260. /* 93 */
  74261. { { 0xf1dcf593,0xde35c143,0xb018be3b,0x78202b29,0x9bdd9d3d,0xe9cdadc2,
  74262. 0xdaad55d8,0x8f67d9d2 },
  74263. { 0x7481ea5f,0x84111656,0xe34c590c,0xe7d2dde9,0x05053fa8,0xffdd43f4,
  74264. 0xc0728b5d,0xf84572b9 } },
  74265. /* 94 */
  74266. { { 0x97af71c9,0x5e1a7a71,0x7a736565,0xa1449444,0x0e1d5063,0xa1b4ae07,
  74267. 0x616b2c19,0xedee2710 },
  74268. { 0x11734121,0xb2f034f5,0x4a25e9f0,0x1cac6e55,0xa40c2ecf,0x8dc148f3,
  74269. 0x44ebd7f4,0x9fd27e9b } },
  74270. /* 95 */
  74271. { { 0xf6e2cb16,0x3cc7658a,0xfe5919b6,0xe3eb7d2c,0x168d5583,0x5a8c5816,
  74272. 0x958ff387,0xa40c2fb6 },
  74273. { 0xfedcc158,0x8c9ec560,0x55f23056,0x7ad804c6,0x9a307e12,0xd9396704,
  74274. 0x7dc6decf,0x99bc9bb8 } },
  74275. /* 96 */
  74276. { { 0x927dafc6,0x84a9521d,0x5c09cd19,0x52c1fb69,0xf9366dde,0x9d9581a0,
  74277. 0xa16d7e64,0x9abe210b },
  74278. { 0x48915220,0x480af84a,0x4dd816c6,0xfa73176a,0x1681ca5a,0xc7d53987,
  74279. 0x87f344b0,0x7881c257 } },
  74280. /* 97 */
  74281. { { 0xe0bcf3ff,0x93399b51,0x127f74f6,0x0d02cbc5,0xdd01d968,0x8fb465a2,
  74282. 0xa30e8940,0x15e6e319 },
  74283. { 0x3e0e05f4,0x646d6e0d,0x43588404,0xfad7bddc,0xc4f850d3,0xbe61c7d1,
  74284. 0x191172ce,0x0e55facf } },
  74285. /* 98 */
  74286. { { 0xf8787564,0x7e9d9806,0x31e85ce6,0x1a331721,0xb819e8d6,0x6b0158ca,
  74287. 0x6fe96577,0xd73d0976 },
  74288. { 0x1eb7206e,0x42483425,0xc618bb42,0xa519290f,0x5e30a520,0x5dcbb859,
  74289. 0x8f15a50b,0x9250a374 } },
  74290. /* 99 */
  74291. { { 0xbe577410,0xcaff08f8,0x5077a8c6,0xfd408a03,0xec0a63a4,0xf1f63289,
  74292. 0xc1cc8c0b,0x77414082 },
  74293. { 0xeb0991cd,0x05a40fa6,0x49fdc296,0xc1ca0866,0xb324fd40,0x3a68a3c7,
  74294. 0x12eb20b9,0x8cb04f4d } },
  74295. /* 100 */
  74296. { { 0x6906171c,0xb1c2d055,0xb0240c3f,0x9073e9cd,0xd8906841,0xdb8e6b4f,
  74297. 0x47123b51,0xe4e429ef },
  74298. { 0x38ec36f4,0x0b8dd53c,0xff4b6a27,0xf9d2dc01,0x879a9a48,0x5d066e07,
  74299. 0x3c6e6552,0x37bca2ff } },
  74300. /* 101 */
  74301. { { 0xdf562470,0x4cd2e3c7,0xc0964ac9,0x44f272a2,0x80c793be,0x7c6d5df9,
  74302. 0x3002b22a,0x59913edc },
  74303. { 0x5750592a,0x7a139a83,0xe783de02,0x99e01d80,0xea05d64f,0xcf8c0375,
  74304. 0xb013e226,0x43786e4a } },
  74305. /* 102 */
  74306. { { 0x9e56b5a6,0xff32b0ed,0xd9fc68f9,0x0750d9a6,0x597846a7,0xec15e845,
  74307. 0xb7e79e7a,0x8638ca98 },
  74308. { 0x0afc24b2,0x2f5ae096,0x4dace8f2,0x05398eaf,0xaecba78f,0x3b765dd0,
  74309. 0x7b3aa6f0,0x1ecdd36a } },
  74310. /* 103 */
  74311. { { 0x6c5ff2f3,0x5d3acd62,0x2873a978,0xa2d516c0,0xd2110d54,0xad94c9fa,
  74312. 0xd459f32d,0xd85d0f85 },
  74313. { 0x10b11da3,0x9f700b8d,0xa78318c4,0xd2c22c30,0x9208decd,0x556988f4,
  74314. 0xb4ed3c62,0xa04f19c3 } },
  74315. /* 104 */
  74316. { { 0xed7f93bd,0x087924c8,0x392f51f6,0xcb64ac5d,0x821b71af,0x7cae330a,
  74317. 0x5c0950b0,0x92b2eeea },
  74318. { 0x85b6e235,0x85ac4c94,0x2936c0f0,0xab2ca4a9,0xe0508891,0x80faa6b3,
  74319. 0x5834276c,0x1ee78221 } },
  74320. /* 105 */
  74321. { { 0xe63e79f7,0xa60a2e00,0xf399d906,0xf590e7b2,0x6607c09d,0x9021054a,
  74322. 0x57a6e150,0xf3f2ced8 },
  74323. { 0xf10d9b55,0x200510f3,0xd8642648,0x9d2fcfac,0xe8bd0e7c,0xe5631aa7,
  74324. 0x3da3e210,0x0f56a454 } },
  74325. /* 106 */
  74326. { { 0x1043e0df,0x5b21bffa,0x9c007e6d,0x6c74b6cc,0xd4a8517a,0x1a656ec0,
  74327. 0x1969e263,0xbd8f1741 },
  74328. { 0xbeb7494a,0x8a9bbb86,0x45f3b838,0x1567d46f,0xa4e5a79a,0xdf7a12a7,
  74329. 0x30ccfa09,0x2d1a1c35 } },
  74330. /* 107 */
  74331. { { 0x506508da,0x192e3813,0xa1d795a7,0x336180c4,0x7a9944b3,0xcddb5949,
  74332. 0xb91fba46,0xa107a65e },
  74333. { 0x0f94d639,0xe6d1d1c5,0x8a58b7d7,0x8b4af375,0xbd37ca1c,0x1a7c5584,
  74334. 0xf87a9af2,0x183d760a } },
  74335. /* 108 */
  74336. { { 0x0dde59a4,0x29d69711,0x0e8bef87,0xf1ad8d07,0x4f2ebe78,0x229b4963,
  74337. 0xc269d754,0x1d44179d },
  74338. { 0x8390d30e,0xb32dc0cf,0x0de8110c,0x0a3b2753,0x2bc0339a,0x31af1dc5,
  74339. 0x9606d262,0x771f9cc2 } },
  74340. /* 109 */
  74341. { { 0x85040739,0x99993e77,0x8026a939,0x44539db9,0xf5f8fc26,0xcf40f6f2,
  74342. 0x0362718e,0x64427a31 },
  74343. { 0x85428aa8,0x4f4f2d87,0xebfb49a8,0x7b7adc3f,0xf23d01ac,0x201b2c6d,
  74344. 0x6ae90d6d,0x49d9b749 } },
  74345. /* 110 */
  74346. { { 0x435d1099,0xcc78d8bc,0x8e8d1a08,0x2adbcd4e,0x2cb68a41,0x02c2e2a0,
  74347. 0x3f605445,0x9037d81b },
  74348. { 0x074c7b61,0x7cdbac27,0x57bfd72e,0xfe2031ab,0x596d5352,0x61ccec96,
  74349. 0x7cc0639c,0x08c3de6a } },
  74350. /* 111 */
  74351. { { 0xf6d552ab,0x20fdd020,0x05cd81f1,0x56baff98,0x91351291,0x06fb7c3e,
  74352. 0x45796b2f,0xc6909442 },
  74353. { 0x41231bd1,0x17b3ae9c,0x5cc58205,0x1eac6e87,0xf9d6a122,0x208837ab,
  74354. 0xcafe3ac0,0x3fa3db02 } },
  74355. /* 112 */
  74356. { { 0x05058880,0xd75a3e65,0x643943f2,0x7da365ef,0xfab24925,0x4147861c,
  74357. 0xfdb808ff,0xc5c4bdb0 },
  74358. { 0xb272b56b,0x73513e34,0x11b9043a,0xc8327e95,0xf8844969,0xfd8ce37d,
  74359. 0x46c2b6b5,0x2d56db94 } },
  74360. /* 113 */
  74361. { { 0xff46ac6b,0x2461782f,0x07a2e425,0xd19f7926,0x09a48de1,0xfafea3c4,
  74362. 0xe503ba42,0x0f56bd9d },
  74363. { 0x345cda49,0x137d4ed1,0x816f299d,0x821158fc,0xaeb43402,0xe7c6a54a,
  74364. 0x1173b5f1,0x4003bb9d } },
  74365. /* 114 */
  74366. { { 0xa0803387,0x3b8e8189,0x39cbd404,0xece115f5,0xd2877f21,0x4297208d,
  74367. 0xa07f2f9e,0x53765522 },
  74368. { 0xa8a4182d,0xa4980a21,0x3219df79,0xa2bbd07a,0x1a19a2d4,0x674d0a2e,
  74369. 0x6c5d4549,0x7a056f58 } },
  74370. /* 115 */
  74371. { { 0x9d8a2a47,0x646b2558,0xc3df2773,0x5b582948,0xabf0d539,0x51ec000e,
  74372. 0x7a1a2675,0x77d482f1 },
  74373. { 0x87853948,0xb8a1bd95,0x6cfbffee,0xa6f817bd,0x80681e47,0xab6ec057,
  74374. 0x2b38b0e4,0x4115012b } },
  74375. /* 116 */
  74376. { { 0x6de28ced,0x3c73f0f4,0x9b13ec47,0x1d5da760,0x6e5c6392,0x61b8ce9e,
  74377. 0xfbea0946,0xcdf04572 },
  74378. { 0x6c53c3b0,0x1cb3c58b,0x447b843c,0x97fe3c10,0x2cb9780e,0xfb2b8ae1,
  74379. 0x97383109,0xee703dda } },
  74380. /* 117 */
  74381. { { 0xff57e43a,0x34515140,0xb1b811b8,0xd44660d3,0x8f42b986,0x2b3b5dff,
  74382. 0xa162ce21,0x2a0ad89d },
  74383. { 0x6bc277ba,0x64e4a694,0xc141c276,0xc788c954,0xcabf6274,0x141aa64c,
  74384. 0xac2b4659,0xd62d0b67 } },
  74385. /* 118 */
  74386. { { 0x2c054ac4,0x39c5d87b,0xf27df788,0x57005859,0xb18128d6,0xedf7cbf3,
  74387. 0x991c2426,0xb39a23f2 },
  74388. { 0xf0b16ae5,0x95284a15,0xa136f51b,0x0c6a05b1,0xf2700783,0x1d63c137,
  74389. 0xc0674cc5,0x04ed0092 } },
  74390. /* 119 */
  74391. { { 0x9ae90393,0x1f4185d1,0x4a3d64e6,0x3047b429,0x9854fc14,0xae0001a6,
  74392. 0x0177c387,0xa0a91fc1 },
  74393. { 0xae2c831e,0xff0a3f01,0x2b727e16,0xbb76ae82,0x5a3075b4,0x8f12c8a1,
  74394. 0x9ed20c41,0x084cf988 } },
  74395. /* 120 */
  74396. { { 0xfca6becf,0xd98509de,0x7dffb328,0x2fceae80,0x4778e8b9,0x5d8a15c4,
  74397. 0x73abf77e,0xd57955b2 },
  74398. { 0x31b5d4f1,0x210da79e,0x3cfa7a1c,0xaa52f04b,0xdc27c20b,0xd4d12089,
  74399. 0x02d141f1,0x8e14ea42 } },
  74400. /* 121 */
  74401. { { 0xf2897042,0xeed50345,0x43402c4a,0x8d05331f,0xc8bdfb21,0xc8d9c194,
  74402. 0x2aa4d158,0x597e1a37 },
  74403. { 0xcf0bd68c,0x0327ec1a,0xab024945,0x6d4be0dc,0xc9fe3e84,0x5b9c8d7a,
  74404. 0x199b4dea,0xca3f0236 } },
  74405. /* 122 */
  74406. { { 0x6170bd20,0x592a10b5,0x6d3f5de7,0x0ea897f1,0x44b2ade2,0xa3363ff1,
  74407. 0x309c07e4,0xbde7fd7e },
  74408. { 0xb8f5432c,0x516bb6d2,0xe043444b,0x210dc1cb,0xf8f95b5a,0x3db01e6f,
  74409. 0x0a7dd198,0xb623ad0e } },
  74410. /* 123 */
  74411. { { 0x60c7b65b,0xa75bd675,0x23a4a289,0xab8c5590,0xd7b26795,0xf8220fd0,
  74412. 0x58ec137b,0xd6aa2e46 },
  74413. { 0x5138bb85,0x10abc00b,0xd833a95c,0x8c31d121,0x1702a32e,0xb24ff00b,
  74414. 0x2dcc513a,0x111662e0 } },
  74415. /* 124 */
  74416. { { 0xefb42b87,0x78114015,0x1b6c4dff,0xbd9f5d70,0xa7d7c129,0x66ecccd7,
  74417. 0x94b750f8,0xdb3ee1cb },
  74418. { 0xf34837cf,0xb26f3db0,0xb9578d4f,0xe7eed18b,0x7c56657d,0x5d2cdf93,
  74419. 0x52206a59,0x886a6442 } },
  74420. /* 125 */
  74421. { { 0x65b569ea,0x3c234cfb,0xf72119c1,0x20011141,0xa15a619e,0x8badc85d,
  74422. 0x018a17bc,0xa70cf4eb },
  74423. { 0x8c4a6a65,0x224f97ae,0x0134378f,0x36e5cf27,0x4f7e0960,0xbe3a609e,
  74424. 0xd1747b77,0xaa4772ab } },
  74425. /* 126 */
  74426. { { 0x7aa60cc0,0x67676131,0x0368115f,0xc7916361,0xbbc1bb5a,0xded98bb4,
  74427. 0x30faf974,0x611a6ddc },
  74428. { 0xc15ee47a,0x30e78cbc,0x4e0d96a5,0x2e896282,0x3dd9ed88,0x36f35adf,
  74429. 0x16429c88,0x5cfffaf8 } },
  74430. /* 127 */
  74431. { { 0x9b7a99cd,0xc0d54cff,0x843c45a1,0x7bf3b99d,0x62c739e1,0x038a908f,
  74432. 0x7dc1994c,0x6e5a6b23 },
  74433. { 0x0ba5db77,0xef8b454e,0xacf60d63,0xb7b8807f,0x76608378,0xe591c0c6,
  74434. 0x242dabcc,0x481a238d } },
  74435. /* 128 */
  74436. { { 0x35d0b34a,0xe3417bc0,0x8327c0a7,0x440b386b,0xac0362d1,0x8fb7262d,
  74437. 0xe0cdf943,0x2c41114c },
  74438. { 0xad95a0b1,0x2ba5cef1,0x67d54362,0xc09b37a8,0x01e486c9,0x26d6cdd2,
  74439. 0x42ff9297,0x20477abf } },
  74440. /* 129 */
  74441. { { 0x18d65dbf,0x2f75173c,0x339edad8,0x77bf940e,0xdcf1001c,0x7022d26b,
  74442. 0xc77396b6,0xac66409a },
  74443. { 0xc6261cc3,0x8b0bb36f,0x190e7e90,0x213f7bc9,0xa45e6c10,0x6541ceba,
  74444. 0xcc122f85,0xce8e6975 } },
  74445. /* 130 */
  74446. { { 0xbc0a67d2,0x0f121b41,0x444d248a,0x62d4760a,0x659b4737,0x0e044f1d,
  74447. 0x250bb4a8,0x08fde365 },
  74448. { 0x848bf287,0xaceec3da,0xd3369d6e,0xc2a62182,0x92449482,0x3582dfdc,
  74449. 0x565d6cd7,0x2f7e2fd2 } },
  74450. /* 131 */
  74451. { { 0xc3770fa7,0xae4b92db,0x379043f9,0x095e8d5c,0x17761171,0x54f34e9d,
  74452. 0x907702ae,0xc65be92e },
  74453. { 0xf6fd0a40,0x2758a303,0xbcce784b,0xe7d822e3,0x4f9767bf,0x7ae4f585,
  74454. 0xd1193b3a,0x4bff8e47 } },
  74455. /* 132 */
  74456. { { 0x00ff1480,0xcd41d21f,0x0754db16,0x2ab8fb7d,0xbbe0f3ea,0xac81d2ef,
  74457. 0x5772967d,0x3e4e4ae6 },
  74458. { 0x3c5303e6,0x7e18f36d,0x92262397,0x3bd9994b,0x1324c3c0,0x9ed70e26,
  74459. 0x58ec6028,0x5388aefd } },
  74460. /* 133 */
  74461. { { 0x5e5d7713,0xad1317eb,0x75de49da,0x09b985ee,0xc74fb261,0x32f5bc4f,
  74462. 0x4f75be0e,0x5cf908d1 },
  74463. { 0x8e657b12,0x76043510,0xb96ed9e6,0xbfd421a5,0x8970ccc2,0x0e29f51f,
  74464. 0x60f00ce2,0xa698ba40 } },
  74465. /* 134 */
  74466. { { 0xef748fec,0x73db1686,0x7e9d2cf9,0xe6e755a2,0xce265eff,0x630b6544,
  74467. 0x7aebad8d,0xb142ef8a },
  74468. { 0x17d5770a,0xad31af9f,0x2cb3412f,0x66af3b67,0xdf3359de,0x6bd60d1b,
  74469. 0x58515075,0xd1896a96 } },
  74470. /* 135 */
  74471. { { 0x33c41c08,0xec5957ab,0x5468e2e1,0x87de94ac,0xac472f6c,0x18816b73,
  74472. 0x7981da39,0x267b0e0b },
  74473. { 0x8e62b988,0x6e554e5d,0x116d21e7,0xd8ddc755,0x3d2a6f99,0x4610faf0,
  74474. 0xa1119393,0xb54e287a } },
  74475. /* 136 */
  74476. { { 0x178a876b,0x0a0122b5,0x085104b4,0x51ff96ff,0x14f29f76,0x050b31ab,
  74477. 0x5f87d4e6,0x84abb28b },
  74478. { 0x8270790a,0xd5ed439f,0x85e3f46b,0x2d6cb59d,0x6c1e2212,0x75f55c1b,
  74479. 0x17655640,0xe5436f67 } },
  74480. /* 137 */
  74481. { { 0x2286e8d5,0x53f9025e,0x864453be,0x353c95b4,0xe408e3a0,0xd832f5bd,
  74482. 0x5b9ce99e,0x0404f68b },
  74483. { 0xa781e8e5,0xcad33bde,0x163c2f5b,0x3cdf5018,0x0119caa3,0x57576960,
  74484. 0x0ac1c701,0x3a4263df } },
  74485. /* 138 */
  74486. { { 0x9aeb596d,0xc2965ecc,0x023c92b4,0x01ea03e7,0x2e013961,0x4704b4b6,
  74487. 0x905ea367,0x0ca8fd3f },
  74488. { 0x551b2b61,0x92523a42,0x390fcd06,0x1eb7a89c,0x0392a63e,0xe7f1d2be,
  74489. 0x4ddb0c33,0x96dca264 } },
  74490. /* 139 */
  74491. { { 0x387510af,0x203bb43a,0xa9a36a01,0x846feaa8,0x2f950378,0xd23a5770,
  74492. 0x3aad59dc,0x4363e212 },
  74493. { 0x40246a47,0xca43a1c7,0xe55dd24d,0xb362b8d2,0x5d8faf96,0xf9b08604,
  74494. 0xd8bb98c4,0x840e115c } },
  74495. /* 140 */
  74496. { { 0x1023e8a7,0xf12205e2,0xd8dc7a0b,0xc808a8cd,0x163a5ddf,0xe292a272,
  74497. 0x30ded6d4,0x5e0d6abd },
  74498. { 0x7cfc0f64,0x07a721c2,0x0e55ed88,0x42eec01d,0x1d1f9db2,0x26a7bef9,
  74499. 0x2945a25a,0x7dea48f4 } },
  74500. /* 141 */
  74501. { { 0xe5060a81,0xabdf6f1c,0xf8f95615,0xe79f9c72,0x06ac268b,0xcfd36c54,
  74502. 0xebfd16d1,0xabc2a2be },
  74503. { 0xd3e2eac7,0x8ac66f91,0xd2dd0466,0x6f10ba63,0x0282d31b,0x6790e377,
  74504. 0x6c7eefc1,0x4ea35394 } },
  74505. /* 142 */
  74506. { { 0x5266309d,0xed8a2f8d,0x81945a3e,0x0a51c6c0,0x578c5dc1,0xcecaf45a,
  74507. 0x1c94ffc3,0x3a76e689 },
  74508. { 0x7d7b0d0f,0x9aace8a4,0x8f584a5f,0x963ace96,0x4e697fbe,0x51a30c72,
  74509. 0x465e6464,0x8212a10a } },
  74510. /* 143 */
  74511. { { 0xcfab8caa,0xef7c61c3,0x0e142390,0x18eb8e84,0x7e9733ca,0xcd1dff67,
  74512. 0x599cb164,0xaa7cab71 },
  74513. { 0xbc837bd1,0x02fc9273,0xc36af5d7,0xc06407d0,0xf423da49,0x17621292,
  74514. 0xfe0617c3,0x40e38073 } },
  74515. /* 144 */
  74516. { { 0xa7bf9b7c,0xf4f80824,0x3fbe30d0,0x365d2320,0x97cf9ce3,0xbfbe5320,
  74517. 0xb3055526,0xe3604700 },
  74518. { 0x6cc6c2c7,0x4dcb9911,0xba4cbee6,0x72683708,0x637ad9ec,0xdcded434,
  74519. 0xa3dee15f,0x6542d677 } },
  74520. /* 145 */
  74521. { { 0x7b6c377a,0x3f32b6d0,0x903448be,0x6cb03847,0x20da8af7,0xd6fdd3a8,
  74522. 0x09bb6f21,0xa6534aee },
  74523. { 0x1035facf,0x30a1780d,0x9dcb47e6,0x35e55a33,0xc447f393,0x6ea50fe1,
  74524. 0xdc9aef22,0xf3cb672f } },
  74525. /* 146 */
  74526. { { 0x3b55fd83,0xeb3719fe,0x875ddd10,0xe0d7a46c,0x05cea784,0x33ac9fa9,
  74527. 0xaae870e7,0x7cafaa2e },
  74528. { 0x1d53b338,0x9b814d04,0xef87e6c6,0xe0acc0a0,0x11672b0f,0xfb93d108,
  74529. 0xb9bd522e,0x0aab13c1 } },
  74530. /* 147 */
  74531. { { 0xd2681297,0xddcce278,0xb509546a,0xcb350eb1,0x7661aaf2,0x2dc43173,
  74532. 0x847012e9,0x4b91a602 },
  74533. { 0x72f8ddcf,0xdcff1095,0x9a911af4,0x08ebf61e,0xc372430e,0x48f4360a,
  74534. 0x72321cab,0x49534c53 } },
  74535. /* 148 */
  74536. { { 0xf07b7e9d,0x83df7d71,0x13cd516f,0xa478efa3,0x6c047ee3,0x78ef264b,
  74537. 0xd65ac5ee,0xcaf46c4f },
  74538. { 0x92aa8266,0xa04d0c77,0x913684bb,0xedf45466,0xae4b16b0,0x56e65168,
  74539. 0x04c6770f,0x14ce9e57 } },
  74540. /* 149 */
  74541. { { 0x965e8f91,0x99445e3e,0xcb0f2492,0xd3aca1ba,0x90c8a0a0,0xd31cc70f,
  74542. 0x3e4c9a71,0x1bb708a5 },
  74543. { 0x558bdd7a,0xd5ca9e69,0x018a26b1,0x734a0508,0x4c9cf1ec,0xb093aa71,
  74544. 0xda300102,0xf9d126f2 } },
  74545. /* 150 */
  74546. { { 0xaff9563e,0x749bca7a,0xb49914a0,0xdd077afe,0xbf5f1671,0xe27a0311,
  74547. 0x729ecc69,0x807afcb9 },
  74548. { 0xc9b08b77,0x7f8a9337,0x443c7e38,0x86c3a785,0x476fd8ba,0x85fafa59,
  74549. 0x6568cd8c,0x751adcd1 } },
  74550. /* 151 */
  74551. { { 0x10715c0d,0x8aea38b4,0x8f7697f7,0xd113ea71,0x93fbf06d,0x665eab14,
  74552. 0x2537743f,0x29ec4468 },
  74553. { 0xb50bebbc,0x3d94719c,0xe4505422,0x399ee5bf,0x8d2dedb1,0x90cd5b3a,
  74554. 0x92a4077d,0xff9370e3 } },
  74555. /* 152 */
  74556. { { 0xc6b75b65,0x59a2d69b,0x266651c5,0x4188f8d5,0x3de9d7d2,0x28a9f33e,
  74557. 0xa2a9d01a,0x9776478b },
  74558. { 0x929af2c7,0x8852622d,0x4e690923,0x334f5d6d,0xa89a51e9,0xce6cc7e5,
  74559. 0xac2f82fa,0x74a6313f } },
  74560. /* 153 */
  74561. { { 0xb75f079c,0xb2f4dfdd,0x18e36fbb,0x85b07c95,0xe7cd36dd,0x1b6cfcf0,
  74562. 0x0ff4863d,0xab75be15 },
  74563. { 0x173fc9b7,0x81b367c0,0xd2594fd0,0xb90a7420,0xc4091236,0x15fdbf03,
  74564. 0x0b4459f6,0x4ebeac2e } },
  74565. /* 154 */
  74566. { { 0x5c9f2c53,0xeb6c5fe7,0x8eae9411,0xd2522011,0xf95ac5d8,0xc8887633,
  74567. 0x2c1baffc,0xdf99887b },
  74568. { 0x850aaecb,0xbb78eed2,0x01d6a272,0x9d49181b,0xb1cdbcac,0x978dd511,
  74569. 0x779f4058,0x27b040a7 } },
  74570. /* 155 */
  74571. { { 0xf73b2eb2,0x90405db7,0x8e1b2118,0xe0df8508,0x5962327e,0x501b7152,
  74572. 0xe4cfa3f5,0xb393dd37 },
  74573. { 0x3fd75165,0xa1230e7b,0xbcd33554,0xd66344c2,0x0f7b5022,0x6c36f1be,
  74574. 0xd0463419,0x09588c12 } },
  74575. /* 156 */
  74576. { { 0x02601c3b,0xe086093f,0xcf5c335f,0xfb0252f8,0x894aff28,0x955cf280,
  74577. 0xdb9f648b,0x81c879a9 },
  74578. { 0xc6f56c51,0x040e687c,0x3f17618c,0xfed47169,0x9059353b,0x44f88a41,
  74579. 0x5fc11bc4,0xfa0d48f5 } },
  74580. /* 157 */
  74581. { { 0xe1608e4d,0xbc6e1c9d,0x3582822c,0x010dda11,0x157ec2d7,0xf6b7ddc1,
  74582. 0xb6a367d6,0x8ea0e156 },
  74583. { 0x2383b3b4,0xa354e02f,0x3f01f53c,0x69966b94,0x2de03ca5,0x4ff6632b,
  74584. 0xfa00b5ac,0x3f5ab924 } },
  74585. /* 158 */
  74586. { { 0x59739efb,0x337bb0d9,0xe7ebec0d,0xc751b0f4,0x411a67d1,0x2da52dd6,
  74587. 0x2b74256e,0x8bc76887 },
  74588. { 0x82d3d253,0xa5be3b72,0xf58d779f,0xa9f679a1,0xe16767bb,0xa1cac168,
  74589. 0x60fcf34f,0xb386f190 } },
  74590. /* 159 */
  74591. { { 0x2fedcfc2,0x31f3c135,0x62f8af0d,0x5396bf62,0xe57288c2,0x9a02b4ea,
  74592. 0x1b069c4d,0x4cb460f7 },
  74593. { 0x5b8095ea,0xae67b4d3,0x6fc07603,0x92bbf859,0xb614a165,0xe1475f66,
  74594. 0x95ef5223,0x52c0d508 } },
  74595. /* 160 */
  74596. { { 0x15339848,0x231c210e,0x70778c8d,0xe87a28e8,0x6956e170,0x9d1de661,
  74597. 0x2bb09c0b,0x4ac3c938 },
  74598. { 0x6998987d,0x19be0551,0xae09f4d6,0x8b2376c4,0x1a3f933d,0x1de0b765,
  74599. 0xe39705f4,0x380d94c7 } },
  74600. /* 161 */
  74601. { { 0x81542e75,0x01a355aa,0xee01b9b7,0x96c724a1,0x624d7087,0x6b3a2977,
  74602. 0xde2637af,0x2ce3e171 },
  74603. { 0xf5d5bc1a,0xcfefeb49,0x2777e2b5,0xa655607e,0x9513756c,0x4feaac2f,
  74604. 0x0b624e4d,0x2e6cd852 } },
  74605. /* 162 */
  74606. { { 0x8c31c31d,0x3685954b,0x5bf21a0c,0x68533d00,0x75c79ec9,0x0bd7626e,
  74607. 0x42c69d54,0xca177547 },
  74608. { 0xf6d2dbb2,0xcc6edaff,0x174a9d18,0xfd0d8cbd,0xaa4578e8,0x875e8793,
  74609. 0x9cab2ce6,0xa976a713 } },
  74610. /* 163 */
  74611. { { 0x93fb353d,0x0a651f1b,0x57fcfa72,0xd75cab8b,0x31b15281,0xaa88cfa7,
  74612. 0x0a1f4999,0x8720a717 },
  74613. { 0x693e1b90,0x8c3e8d37,0x16f6dfc3,0xd345dc0b,0xb52a8742,0x8ea8d00a,
  74614. 0xc769893c,0x9719ef29 } },
  74615. /* 164 */
  74616. { { 0x58e35909,0x820eed8d,0x33ddc116,0x9366d8dc,0x6e205026,0xd7f999d0,
  74617. 0xe15704c1,0xa5072976 },
  74618. { 0xc4e70b2e,0x002a37ea,0x6890aa8a,0x84dcf657,0x645b2a5c,0xcd71bf18,
  74619. 0xf7b77725,0x99389c9d } },
  74620. /* 165 */
  74621. { { 0x7ada7a4b,0x238c08f2,0xfd389366,0x3abe9d03,0x766f512c,0x6b672e89,
  74622. 0x202c82e4,0xa88806aa },
  74623. { 0xd380184e,0x6602044a,0x126a8b85,0xa8cb78c4,0xad844f17,0x79d670c0,
  74624. 0x4738dcfe,0x0043bffb } },
  74625. /* 166 */
  74626. { { 0x36d5192e,0x8d59b5dc,0x4590b2af,0xacf885d3,0x11601781,0x83566d0a,
  74627. 0xba6c4866,0x52f3ef01 },
  74628. { 0x0edcb64d,0x3986732a,0x8068379f,0x0a482c23,0x7040f309,0x16cbe5fa,
  74629. 0x9ef27e75,0x3296bd89 } },
  74630. /* 167 */
  74631. { { 0x454d81d7,0x476aba89,0x51eb9b3c,0x9eade7ef,0x81c57986,0x619a21cd,
  74632. 0xaee571e9,0x3b90febf },
  74633. { 0x5496f7cb,0x9393023e,0x7fb51bc4,0x55be41d8,0x99beb5ce,0x03f1dd48,
  74634. 0x9f810b18,0x6e88069d } },
  74635. /* 168 */
  74636. { { 0xb43ea1db,0xce37ab11,0x5259d292,0x0a7ff1a9,0x8f84f186,0x851b0221,
  74637. 0xdefaad13,0xa7222bea },
  74638. { 0x2b0a9144,0xa2ac78ec,0xf2fa59c5,0x5a024051,0x6147ce38,0x91d1eca5,
  74639. 0xbc2ac690,0xbe94d523 } },
  74640. /* 169 */
  74641. { { 0x0b226ce7,0x72f4945e,0x967e8b70,0xb8afd747,0x85a6c63e,0xedea46f1,
  74642. 0x9be8c766,0x7782defe },
  74643. { 0x3db38626,0x760d2aa4,0x76f67ad1,0x460ae787,0x54499cdb,0x341b86fc,
  74644. 0xa2892e4b,0x03838567 } },
  74645. /* 170 */
  74646. { { 0x79ec1a0f,0x2d8daefd,0xceb39c97,0x3bbcd6fd,0x58f61a95,0xf5575ffc,
  74647. 0xadf7b420,0xdbd986c4 },
  74648. { 0x15f39eb7,0x81aa8814,0xb98d976c,0x6ee2fcf5,0xcf2f717d,0x5465475d,
  74649. 0x6860bbd0,0x8e24d3c4 } },
  74650. /* 171 */
  74651. { { 0x9a587390,0x749d8e54,0x0cbec588,0x12bb194f,0xb25983c6,0x46e07da4,
  74652. 0x407bafc8,0x541a99c4 },
  74653. { 0x624c8842,0xdb241692,0xd86c05ff,0x6044c12a,0x4f7fcf62,0xc59d14b4,
  74654. 0xf57d35d1,0xc0092c49 } },
  74655. /* 172 */
  74656. { { 0xdf2e61ef,0xd3cc75c3,0x2e1b35ca,0x7e8841c8,0x909f29f4,0xc62d30d1,
  74657. 0x7286944d,0x75e40634 },
  74658. { 0xbbc237d0,0xe7d41fc5,0xec4f01c9,0xc9537bf0,0x282bd534,0x91c51a16,
  74659. 0xc7848586,0x5b7cb658 } },
  74660. /* 173 */
  74661. { { 0x8a28ead1,0x964a7084,0xfd3b47f6,0x802dc508,0x767e5b39,0x9ae4bfd1,
  74662. 0x8df097a1,0x7ae13eba },
  74663. { 0xeadd384e,0xfd216ef8,0xb6b2ff06,0x0361a2d9,0x4bcdb5f3,0x204b9878,
  74664. 0xe2a8e3fd,0x787d8074 } },
  74665. /* 174 */
  74666. { { 0x757fbb1c,0xc5e25d6b,0xca201deb,0xe47bddb2,0x6d2233ff,0x4a55e9a3,
  74667. 0x9ef28484,0x5c222819 },
  74668. { 0x88315250,0x773d4a85,0x827097c1,0x21b21a2b,0xdef5d33f,0xab7c4ea1,
  74669. 0xbaf0f2b0,0xe45d37ab } },
  74670. /* 175 */
  74671. { { 0x28511c8a,0xd2df1e34,0xbdca6cd3,0xebb229c8,0x627c39a7,0x578a71a7,
  74672. 0x84dfb9d3,0xed7bc122 },
  74673. { 0x93dea561,0xcf22a6df,0xd48f0ed1,0x5443f18d,0x5bad23e8,0xd8b86140,
  74674. 0x45ca6d27,0xaac97cc9 } },
  74675. /* 176 */
  74676. { { 0xa16bd00a,0xeb54ea74,0xf5c0bcc1,0xd839e9ad,0x1f9bfc06,0x092bb7f1,
  74677. 0x1163dc4e,0x318f97b3 },
  74678. { 0xc30d7138,0xecc0c5be,0xabc30220,0x44e8df23,0xb0223606,0x2bb7972f,
  74679. 0x9a84ff4d,0xfa41faa1 } },
  74680. /* 177 */
  74681. { { 0xa6642269,0x4402d974,0x9bb783bd,0xc81814ce,0x7941e60b,0x398d38e4,
  74682. 0x1d26e9e2,0x38bb6b2c },
  74683. { 0x6a577f87,0xc64e4a25,0xdc11fe1c,0x8b52d253,0x62280728,0xff336abf,
  74684. 0xce7601a5,0x94dd0905 } },
  74685. /* 178 */
  74686. { { 0xde93f92a,0x156cf7dc,0x89b5f315,0xa01333cb,0xc995e750,0x02404df9,
  74687. 0xd25c2ae9,0x92077867 },
  74688. { 0x0bf39d44,0xe2471e01,0x96bb53d7,0x5f2c9020,0x5c9c3d8f,0x4c44b7b3,
  74689. 0xd29beb51,0x81e8428b } },
  74690. /* 179 */
  74691. { { 0xc477199f,0x6dd9c2ba,0x6b5ecdd9,0x8cb8eeee,0xee40fd0e,0x8af7db3f,
  74692. 0xdbbfa4b1,0x1b94ab62 },
  74693. { 0xce47f143,0x44f0d8b3,0x63f46163,0x51e623fc,0xcc599383,0xf18f270f,
  74694. 0x055590ee,0x06a38e28 } },
  74695. /* 180 */
  74696. { { 0xb3355b49,0x2e5b0139,0xb4ebf99b,0x20e26560,0xd269f3dc,0xc08ffa6b,
  74697. 0x83d9d4f8,0xa7b36c20 },
  74698. { 0x1b3e8830,0x64d15c3a,0xa89f9c0b,0xd5fceae1,0xe2d16930,0xcfeee4a2,
  74699. 0xa2822a20,0xbe54c6b4 } },
  74700. /* 181 */
  74701. { { 0x8d91167c,0xd6cdb3df,0xe7a6625e,0x517c3f79,0x346ac7f4,0x7105648f,
  74702. 0xeae022bb,0xbf30a5ab },
  74703. { 0x93828a68,0x8e7785be,0x7f3ef036,0x5161c332,0x592146b2,0xe11b5feb,
  74704. 0x2732d13a,0xd1c820de } },
  74705. /* 182 */
  74706. { { 0x9038b363,0x043e1347,0x6b05e519,0x58c11f54,0x6026cad1,0x4fe57abe,
  74707. 0x68a18da3,0xb7d17bed },
  74708. { 0xe29c2559,0x44ca5891,0x5bfffd84,0x4f7a0376,0x74e46948,0x498de4af,
  74709. 0x6412cc64,0x3997fd5e } },
  74710. /* 183 */
  74711. { { 0x8bd61507,0xf2074682,0x34a64d2a,0x29e132d5,0x8a8a15e3,0xffeddfb0,
  74712. 0x3c6c13e8,0x0eeb8929 },
  74713. { 0xa7e259f8,0xe9b69a3e,0xd13e7e67,0xce1db7e6,0xad1fa685,0x277318f6,
  74714. 0xc922b6ef,0x228916f8 } },
  74715. /* 184 */
  74716. { { 0x0a12ab5b,0x959ae25b,0x957bc136,0xcc11171f,0xd16e2b0c,0x8058429e,
  74717. 0x6e93097e,0xec05ad1d },
  74718. { 0xac3f3708,0x157ba5be,0x30b59d77,0x31baf935,0x118234e5,0x47b55237,
  74719. 0x7ff11b37,0x7d314156 } },
  74720. /* 185 */
  74721. { { 0xf6dfefab,0x7bd9c05c,0xdcb37707,0xbe2f2268,0x3a38bb95,0xe53ead97,
  74722. 0x9bc1d7a3,0xe9ce66fc },
  74723. { 0x6f6a02a1,0x75aa1576,0x60e600ed,0x38c087df,0x68cdc1b9,0xf8947f34,
  74724. 0x72280651,0xd9650b01 } },
  74725. /* 186 */
  74726. { { 0x5a057e60,0x504b4c4a,0x8def25e4,0xcbccc3be,0x17c1ccbd,0xa6353208,
  74727. 0x804eb7a2,0x14d6699a },
  74728. { 0xdb1f411a,0x2c8a8415,0xf80d769c,0x09fbaf0b,0x1c2f77ad,0xb4deef90,
  74729. 0x0d43598a,0x6f4c6841 } },
  74730. /* 187 */
  74731. { { 0x96c24a96,0x8726df4e,0xfcbd99a3,0x534dbc85,0x8b2ae30a,0x3c466ef2,
  74732. 0x61189abb,0x4c4350fd },
  74733. { 0xf855b8da,0x2967f716,0x463c38a1,0x41a42394,0xeae93343,0xc37e1413,
  74734. 0x5a3118b5,0xa726d242 } },
  74735. /* 188 */
  74736. { { 0x948c1086,0xdae6b3ee,0xcbd3a2e1,0xf1de503d,0x03d022f3,0x3f35ed3f,
  74737. 0xcc6cf392,0x13639e82 },
  74738. { 0xcdafaa86,0x9ac938fb,0x2654a258,0xf45bc5fb,0x45051329,0x1963b26e,
  74739. 0xc1a335a3,0xca9365e1 } },
  74740. /* 189 */
  74741. { { 0x4c3b2d20,0x3615ac75,0x904e241b,0x742a5417,0xcc9d071d,0xb08521c4,
  74742. 0x970b72a5,0x9ce29c34 },
  74743. { 0x6d3e0ad6,0x8cc81f73,0xf2f8434c,0x8060da9e,0x6ce862d9,0x35ed1d1a,
  74744. 0xab42af98,0x48c4abd7 } },
  74745. /* 190 */
  74746. { { 0x40c7485a,0xd221b0cc,0xe5274dbf,0xead455bb,0x9263d2e8,0x493c7698,
  74747. 0xf67b33cb,0x78017c32 },
  74748. { 0x930cb5ee,0xb9d35769,0x0c408ed2,0xc0d14e94,0x272f1a4d,0xf8b7bf55,
  74749. 0xde5c1c04,0x53cd0454 } },
  74750. /* 191 */
  74751. { { 0x5d28ccac,0xbcd585fa,0x005b746e,0x5f823e56,0xcd0123aa,0x7c79f0a1,
  74752. 0xd3d7fa8f,0xeea465c1 },
  74753. { 0x0551803b,0x7810659f,0x7ce6af70,0x6c0b599f,0x29288e70,0x4195a770,
  74754. 0x7ae69193,0x1b6e42a4 } },
  74755. /* 192 */
  74756. { { 0xf67d04c3,0x2e80937c,0x89eeb811,0x1e312be2,0x92594d60,0x56b5d887,
  74757. 0x187fbd3d,0x0224da14 },
  74758. { 0x0c5fe36f,0x87abb863,0x4ef51f5f,0x580f3c60,0xb3b429ec,0x964fb1bf,
  74759. 0x42bfff33,0x60838ef0 } },
  74760. /* 193 */
  74761. { { 0x7e0bbe99,0x432cb2f2,0x04aa39ee,0x7bda44f3,0x9fa93903,0x5f497c7a,
  74762. 0x2d331643,0x636eb202 },
  74763. { 0x93ae00aa,0xfcfd0e61,0x31ae6d2f,0x875a00fe,0x9f93901c,0xf43658a2,
  74764. 0x39218bac,0x8844eeb6 } },
  74765. /* 194 */
  74766. { { 0x6b3bae58,0x114171d2,0x17e39f3e,0x7db3df71,0x81a8eada,0xcd37bc7f,
  74767. 0x51fb789e,0x27ba83dc },
  74768. { 0xfbf54de5,0xa7df439f,0xb5fe1a71,0x7277030b,0xdb297a48,0x42ee8e35,
  74769. 0x87f3a4ab,0xadb62d34 } },
  74770. /* 195 */
  74771. { { 0xa175df2a,0x9b1168a2,0x618c32e9,0x082aa04f,0x146b0916,0xc9e4f2e7,
  74772. 0x75e7c8b2,0xb990fd76 },
  74773. { 0x4df37313,0x0829d96b,0xd0b40789,0x1c205579,0x78087711,0x66c9ae4a,
  74774. 0x4d10d18d,0x81707ef9 } },
  74775. /* 196 */
  74776. { { 0x03d6ff96,0x97d7cab2,0x0d843360,0x5b851bfc,0xd042db4b,0x268823c4,
  74777. 0xd5a8aa5c,0x3792daea },
  74778. { 0x941afa0b,0x52818865,0x42d83671,0xf3e9e741,0x5be4e0a7,0x17c82527,
  74779. 0x94b001ba,0x5abd635e } },
  74780. /* 197 */
  74781. { { 0x0ac4927c,0x727fa84e,0xa7c8cf23,0xe3886035,0x4adca0df,0xa4bcd5ea,
  74782. 0x846ab610,0x5995bf21 },
  74783. { 0x829dfa33,0xe90f860b,0x958fc18b,0xcaafe2ae,0x78630366,0x9b3baf44,
  74784. 0xd483411e,0x44c32ca2 } },
  74785. /* 198 */
  74786. { { 0xe40ed80c,0xa74a97f1,0x31d2ca82,0x5f938cb1,0x7c2d6ad9,0x53f2124b,
  74787. 0x8082a54c,0x1f2162fb },
  74788. { 0x720b173e,0x7e467cc5,0x085f12f9,0x40e8a666,0x4c9d65dc,0x8cebc20e,
  74789. 0xc3e907c9,0x8f1d402b } },
  74790. /* 199 */
  74791. { { 0xfbc4058a,0x4f592f9c,0x292f5670,0xb15e14b6,0xbc1d8c57,0xc55cfe37,
  74792. 0x926edbf9,0xb1980f43 },
  74793. { 0x32c76b09,0x98c33e09,0x33b07f78,0x1df5279d,0x863bb461,0x6f08ead4,
  74794. 0x37448e45,0x2828ad9b } },
  74795. /* 200 */
  74796. { { 0xc4cf4ac5,0x696722c4,0xdde64afb,0xf5ac1a3f,0xe0890832,0x0551baa2,
  74797. 0x5a14b390,0x4973f127 },
  74798. { 0x322eac5d,0xe59d8335,0x0bd9b568,0x5e07eef5,0xa2588393,0xab36720f,
  74799. 0xdb168ac7,0x6dac8ed0 } },
  74800. /* 201 */
  74801. { { 0xeda835ef,0xf7b545ae,0x1d10ed51,0x4aa113d2,0x13741b09,0x035a65e0,
  74802. 0x20b9de4c,0x4b23ef59 },
  74803. { 0x3c4c7341,0xe82bb680,0x3f58bc37,0xd457706d,0xa51e3ee8,0x73527863,
  74804. 0xddf49a4e,0x4dd71534 } },
  74805. /* 202 */
  74806. { { 0x95476cd9,0xbf944672,0xe31a725b,0x648d072f,0xfc4b67e0,0x1441c8b8,
  74807. 0x2f4a4dbb,0xfd317000 },
  74808. { 0x8995d0e1,0x1cb43ff4,0x0ef729aa,0x76e695d1,0x41798982,0xe0d5f976,
  74809. 0x9569f365,0x14fac58c } },
  74810. /* 203 */
  74811. { { 0xf312ae18,0xad9a0065,0xfcc93fc9,0x51958dc0,0x8a7d2846,0xd9a14240,
  74812. 0x36abda50,0xed7c7651 },
  74813. { 0x25d4abbc,0x46270f1a,0xf1a113ea,0x9b5dd8f3,0x5b51952f,0xc609b075,
  74814. 0x4d2e9f53,0xfefcb7f7 } },
  74815. /* 204 */
  74816. { { 0xba119185,0xbd09497a,0xaac45ba4,0xd54e8c30,0xaa521179,0x492479de,
  74817. 0x87e0d80b,0x1801a57e },
  74818. { 0xfcafffb0,0x073d3f8d,0xae255240,0x6cf33c0b,0x5b5fdfbc,0x781d763b,
  74819. 0x1ead1064,0x9f8fc11e } },
  74820. /* 205 */
  74821. { { 0x5e69544c,0x1583a171,0xf04b7813,0x0eaf8567,0x278a4c32,0x1e22a8fd,
  74822. 0x3d3a69a9,0xa9d3809d },
  74823. { 0x59a2da3b,0x936c2c2c,0x1895c847,0x38ccbcf6,0x63d50869,0x5e65244e,
  74824. 0xe1178ef7,0x3006b9ae } },
  74825. /* 206 */
  74826. { { 0xc9eead28,0x0bb1f2b0,0x89f4dfbc,0x7eef635d,0xb2ce8939,0x074757fd,
  74827. 0x45f8f761,0x0ab85fd7 },
  74828. { 0x3e5b4549,0xecda7c93,0x97922f21,0x4be2bb5c,0xb43b8040,0x261a1274,
  74829. 0x11e942c2,0xb122d675 } },
  74830. /* 207 */
  74831. { { 0x66a5ae7a,0x3be607be,0x76adcbe3,0x01e703fa,0x4eb6e5c5,0xaf904301,
  74832. 0x097dbaec,0x9f599dc1 },
  74833. { 0x0ff250ed,0x6d75b718,0x349a20dc,0x8eb91574,0x10b227a3,0x425605a4,
  74834. 0x8a294b78,0x7d5528e0 } },
  74835. /* 208 */
  74836. { { 0x20c26def,0xf0f58f66,0x582b2d1e,0x025585ea,0x01ce3881,0xfbe7d79b,
  74837. 0x303f1730,0x28ccea01 },
  74838. { 0x79644ba5,0xd1dabcd1,0x06fff0b8,0x1fc643e8,0x66b3e17b,0xa60a76fc,
  74839. 0xa1d013bf,0xc18baf48 } },
  74840. /* 209 */
  74841. { { 0x5dc4216d,0x34e638c8,0x206142ac,0x00c01067,0x95f5064a,0xd453a171,
  74842. 0xb7a9596b,0x9def809d },
  74843. { 0x67ab8d2c,0x41e8642e,0x6237a2b6,0xb4240433,0x64c4218b,0x7d506a6d,
  74844. 0x68808ce5,0x0357f8b0 } },
  74845. /* 210 */
  74846. { { 0x4cd2cc88,0x8e9dbe64,0xf0b8f39d,0xcc61c28d,0xcd30a0c8,0x4a309874,
  74847. 0x1b489887,0xe4a01add },
  74848. { 0xf57cd8f9,0x2ed1eeac,0xbd594c48,0x1b767d3e,0x7bd2f787,0xa7295c71,
  74849. 0xce10cc30,0x466d7d79 } },
  74850. /* 211 */
  74851. { { 0x9dada2c7,0x47d31892,0x8f9aa27d,0x4fa0a6c3,0x820a59e1,0x90e4fd28,
  74852. 0x451ead1a,0xc672a522 },
  74853. { 0x5d86b655,0x30607cc8,0xf9ad4af1,0xf0235d3b,0x571172a6,0x99a08680,
  74854. 0xf2a67513,0x5e3d64fa } },
  74855. /* 212 */
  74856. { { 0x9b3b4416,0xaa6410c7,0xeab26d99,0xcd8fcf85,0xdb656a74,0x5ebff74a,
  74857. 0xeb8e42fc,0x6c8a7a95 },
  74858. { 0xb02a63bd,0x10c60ba7,0x8b8f0047,0x6b2f2303,0x312d90b0,0x8c6c3738,
  74859. 0xad82ca91,0x348ae422 } },
  74860. /* 213 */
  74861. { { 0x5ccda2fb,0x7f474663,0x8e0726d2,0x22accaa1,0x492b1f20,0x85adf782,
  74862. 0xd9ef2d2e,0xc1074de0 },
  74863. { 0xae9a65b3,0xfcf3ce44,0x05d7151b,0xfd71e4ac,0xce6a9788,0xd4711f50,
  74864. 0xc9e54ffc,0xfbadfbdb } },
  74865. /* 214 */
  74866. { { 0x20a99363,0x1713f1cd,0x6cf22775,0xb915658f,0x24d359b2,0x968175cd,
  74867. 0x83716fcd,0xb7f976b4 },
  74868. { 0x5d6dbf74,0x5758e24d,0x71c3af36,0x8d23bafd,0x0243dfe3,0x48f47760,
  74869. 0xcafcc805,0xf4d41b2e } },
  74870. /* 215 */
  74871. { { 0xfdabd48d,0x51f1cf28,0x32c078a4,0xce81be36,0x117146e9,0x6ace2974,
  74872. 0xe0160f10,0x180824ea },
  74873. { 0x66e58358,0x0387698b,0xce6ca358,0x63568752,0x5e41e6c5,0x82380e34,
  74874. 0x83cf6d25,0x67e5f639 } },
  74875. /* 216 */
  74876. { { 0xcf4899ef,0xf89ccb8d,0x9ebb44c0,0x949015f0,0xb2598ec9,0x546f9276,
  74877. 0x04c11fc6,0x9fef789a },
  74878. { 0x53d2a071,0x6d367ecf,0xa4519b09,0xb10e1a7f,0x611e2eef,0xca6b3fb0,
  74879. 0xa99c4e20,0xbc80c181 } },
  74880. /* 217 */
  74881. { { 0xe5eb82e6,0x972536f8,0xf56cb920,0x1a484fc7,0x50b5da5e,0xc78e2171,
  74882. 0x9f8cdf10,0x49270e62 },
  74883. { 0xea6b50ad,0x1a39b7bb,0xa2388ffc,0x9a0284c1,0x8107197b,0x5403eb17,
  74884. 0x61372f7f,0xd2ee52f9 } },
  74885. /* 218 */
  74886. { { 0x88e0362a,0xd37cd285,0x8fa5d94d,0x442fa8a7,0xa434a526,0xaff836e5,
  74887. 0xe5abb733,0xdfb478be },
  74888. { 0x673eede6,0xa91f1ce7,0x2b5b2f04,0xa5390ad4,0x5530da2f,0x5e66f7bf,
  74889. 0x08df473a,0xd9a140b4 } },
  74890. /* 219 */
  74891. { { 0x6e8ea498,0x0e0221b5,0x3563ee09,0x62347829,0x335d2ade,0xe06b8391,
  74892. 0x623f4b1a,0x760c058d },
  74893. { 0xc198aa79,0x0b89b58c,0xf07aba7f,0xf74890d2,0xfde2556a,0x4e204110,
  74894. 0x8f190409,0x7141982d } },
  74895. /* 220 */
  74896. { { 0x4d4b0f45,0x6f0a0e33,0x392a94e1,0xd9280b38,0xb3c61d5e,0x3af324c6,
  74897. 0x89d54e47,0x3af9d1ce },
  74898. { 0x20930371,0xfd8f7981,0x21c17097,0xeda2664c,0xdc42309b,0x0e9545dc,
  74899. 0x73957dd6,0xb1f815c3 } },
  74900. /* 221 */
  74901. { { 0x89fec44a,0x84faa78e,0x3caa4caf,0xc8c2ae47,0xc1b6a624,0x691c807d,
  74902. 0x1543f052,0xa41aed14 },
  74903. { 0x7d5ffe04,0x42435399,0x625b6e20,0x8bacb2df,0x87817775,0x85d660be,
  74904. 0x86fb60ef,0xd6e9c1dd } },
  74905. /* 222 */
  74906. { { 0xc6853264,0x3aa2e97e,0xe2304a0b,0x771533b7,0xb8eae9be,0x1b912bb7,
  74907. 0xae9bf8c2,0x9c9c6e10 },
  74908. { 0xe030b74c,0xa2309a59,0x6a631e90,0x4ed7494d,0xa49b79f2,0x89f44b23,
  74909. 0x40fa61b6,0x566bd596 } },
  74910. /* 223 */
  74911. { { 0xc18061f3,0x066c0118,0x7c83fc70,0x190b25d3,0x27273245,0xf05fc8e0,
  74912. 0xf525345e,0xcf2c7390 },
  74913. { 0x10eb30cf,0xa09bceb4,0x0d77703a,0xcfd2ebba,0x150ff255,0xe842c43a,
  74914. 0x8aa20979,0x02f51755 } },
  74915. /* 224 */
  74916. { { 0xaddb7d07,0x396ef794,0x24455500,0x0b4fc742,0xc78aa3ce,0xfaff8eac,
  74917. 0xe8d4d97d,0x14e9ada5 },
  74918. { 0x2f7079e2,0xdaa480a1,0xe4b0800e,0x45baa3cd,0x7838157d,0x01765e2d,
  74919. 0x8e9d9ae8,0xa0ad4fab } },
  74920. /* 225 */
  74921. { { 0x4a653618,0x0bfb7621,0x31eaaa5f,0x1872813c,0x44949d5e,0x1553e737,
  74922. 0x6e56ed1e,0xbcd530b8 },
  74923. { 0x32e9c47b,0x169be853,0xb50059ab,0xdc2776fe,0x192bfbb4,0xcdba9761,
  74924. 0x6979341d,0x909283cf } },
  74925. /* 226 */
  74926. { { 0x76e81a13,0x67b00324,0x62171239,0x9bee1a99,0xd32e19d6,0x08ed361b,
  74927. 0xace1549a,0x35eeb7c9 },
  74928. { 0x7e4e5bdc,0x1280ae5a,0xb6ceec6e,0x2dcd2cd3,0x6e266bc1,0x52e4224c,
  74929. 0x448ae864,0x9a8b2cf4 } },
  74930. /* 227 */
  74931. { { 0x09d03b59,0xf6471bf2,0xb65af2ab,0xc90e62a3,0xebd5eec9,0xff7ff168,
  74932. 0xd4491379,0x6bdb60f4 },
  74933. { 0x8a55bc30,0xdadafebc,0x10097fe0,0xc79ead16,0x4c1e3bdd,0x42e19741,
  74934. 0x94ba08a9,0x01ec3cfd } },
  74935. /* 228 */
  74936. { { 0xdc9485c2,0xba6277eb,0x22fb10c7,0x48cc9a79,0x70a28d8a,0x4f61d60f,
  74937. 0x475464f6,0xd1acb1c0 },
  74938. { 0x26f36612,0xd26902b1,0xe0618d8b,0x59c3a44e,0x308357ee,0x4df8a813,
  74939. 0x405626c2,0x7dcd079d } },
  74940. /* 229 */
  74941. { { 0xf05a4b48,0x5ce7d4d3,0x37230772,0xadcd2952,0x812a915a,0xd18f7971,
  74942. 0x377d19b8,0x0bf53589 },
  74943. { 0x6c68ea73,0x35ecd95a,0x823a584d,0xc7f3bbca,0xf473a723,0x9fb674c6,
  74944. 0xe16686fc,0xd28be4d9 } },
  74945. /* 230 */
  74946. { { 0x38fa8e4b,0x5d2b9906,0x893fd8fc,0x559f186e,0x436fb6fc,0x3a6de2aa,
  74947. 0x510f88ce,0xd76007aa },
  74948. { 0x523a4988,0x2d10aab6,0x74dd0273,0xb455cf44,0xa3407278,0x7f467082,
  74949. 0xb303bb01,0xf2b52f68 } },
  74950. /* 231 */
  74951. { { 0x9835b4ca,0x0d57eafa,0xbb669cbc,0x2d2232fc,0xc6643198,0x8eeeb680,
  74952. 0xcc5aed3a,0xd8dbe98e },
  74953. { 0xc5a02709,0xcba9be3f,0xf5ba1fa8,0x30be68e5,0xf10ea852,0xfebd43cd,
  74954. 0xee559705,0xe01593a3 } },
  74955. /* 232 */
  74956. { { 0xea75a0a6,0xd3e5af50,0x57858033,0x512226ac,0xd0176406,0x6fe6d50f,
  74957. 0xaeb8ef06,0xafec07b1 },
  74958. { 0x80bb0a31,0x7fb99567,0x37309aae,0x6f1af3cc,0x01abf389,0x9153a15a,
  74959. 0x6e2dbfdd,0xa71b9354 } },
  74960. /* 233 */
  74961. { { 0x18f593d2,0xbf8e12e0,0xa078122b,0xd1a90428,0x0ba4f2ad,0x150505db,
  74962. 0x628523d9,0x53a2005c },
  74963. { 0xe7f2b935,0x07c8b639,0xc182961a,0x2bff975a,0x7518ca2c,0x86bceea7,
  74964. 0x3d588e3d,0xbf47d19b } },
  74965. /* 234 */
  74966. { { 0xdd7665d5,0x672967a7,0x2f2f4de5,0x4e303057,0x80d4903f,0x144005ae,
  74967. 0x39c9a1b6,0x001c2c7f },
  74968. { 0x69efc6d6,0x143a8014,0x7bc7a724,0xc810bdaa,0xa78150a4,0x5f65670b,
  74969. 0x86ffb99b,0xfdadf8e7 } },
  74970. /* 235 */
  74971. { { 0xffc00785,0xfd38cb88,0x3b48eb67,0x77fa7591,0xbf368fbc,0x0454d055,
  74972. 0x5aa43c94,0x3a838e4d },
  74973. { 0x3e97bb9a,0x56166329,0x441d94d9,0x9eb93363,0x0adb2a83,0x515591a6,
  74974. 0x873e1da3,0x3cdb8257 } },
  74975. /* 236 */
  74976. { { 0x7de77eab,0x137140a9,0x41648109,0xf7e1c50d,0xceb1d0df,0x762dcad2,
  74977. 0xf1f57fba,0x5a60cc89 },
  74978. { 0x40d45673,0x80b36382,0x5913c655,0x1b82be19,0xdd64b741,0x057284b8,
  74979. 0xdbfd8fc0,0x922ff56f } },
  74980. /* 237 */
  74981. { { 0xc9a129a1,0x1b265dee,0xcc284e04,0xa5b1ce57,0xcebfbe3c,0x04380c46,
  74982. 0xf6c5cd62,0x72919a7d },
  74983. { 0x8fb90f9a,0x298f453a,0x88e4031b,0xd719c00b,0x796f1856,0xe32c0e77,
  74984. 0x3624089a,0x5e791780 } },
  74985. /* 238 */
  74986. { { 0x7f63cdfb,0x5c16ec55,0xf1cae4fd,0x8e6a3571,0x560597ca,0xfce26bea,
  74987. 0xe24c2fab,0x4e0a5371 },
  74988. { 0xa5765357,0x276a40d3,0x0d73a2b4,0x3c89af44,0x41d11a32,0xb8f370ae,
  74989. 0xd56604ee,0xf5ff7818 } },
  74990. /* 239 */
  74991. { { 0x1a09df21,0xfbf3e3fe,0xe66e8e47,0x26d5d28e,0x29c89015,0x2096bd0a,
  74992. 0x533f5e64,0xe41df0e9 },
  74993. { 0xb3ba9e3f,0x305fda40,0x2604d895,0xf2340ceb,0x7f0367c7,0x0866e192,
  74994. 0xac4f155f,0x8edd7d6e } },
  74995. /* 240 */
  74996. { { 0x0bfc8ff3,0xc9a1dc0e,0xe936f42f,0x14efd82b,0xcca381ef,0x67016f7c,
  74997. 0xed8aee96,0x1432c1ca },
  74998. { 0x70b23c26,0xec684829,0x0735b273,0xa64fe873,0xeaef0f5a,0xe389f6e5,
  74999. 0x5ac8d2c6,0xcaef480b } },
  75000. /* 241 */
  75001. { { 0x75315922,0x5245c978,0x3063cca5,0xd8295171,0xb64ef2cb,0xf3ce60d0,
  75002. 0x8efae236,0xd0ba177e },
  75003. { 0xb1b3af60,0x53a9ae8f,0x3d2da20e,0x1a796ae5,0xdf9eef28,0x01d63605,
  75004. 0x1c54ae16,0xf31c957c } },
  75005. /* 242 */
  75006. { { 0x49cc4597,0xc0f58d52,0xbae0a028,0xdc5015b0,0x734a814a,0xefc5fc55,
  75007. 0x96e17c3a,0x013404cb },
  75008. { 0xc9a824bf,0xb29e2585,0x001eaed7,0xd593185e,0x61ef68ac,0x8d6ee682,
  75009. 0x91933e6c,0x6f377c4b } },
  75010. /* 243 */
  75011. { { 0xa8333fd2,0x9f93bad1,0x5a2a95b8,0xa8930202,0xeaf75ace,0x211e5037,
  75012. 0xd2d09506,0x6dba3e4e },
  75013. { 0xd04399cd,0xa48ef98c,0xe6b73ade,0x1811c66e,0xc17ecaf3,0x72f60752,
  75014. 0x3becf4a7,0xf13cf342 } },
  75015. /* 244 */
  75016. { { 0xa919e2eb,0xceeb9ec0,0xf62c0f68,0x83a9a195,0x7aba2299,0xcfba3bb6,
  75017. 0x274bbad3,0xc83fa9a9 },
  75018. { 0x62fa1ce0,0x0d7d1b0b,0x3418efbf,0xe58b60f5,0x52706f04,0xbfa8ef9e,
  75019. 0x5d702683,0xb49d70f4 } },
  75020. /* 245 */
  75021. { { 0xfad5513b,0x914c7510,0xb1751e2d,0x05f32eec,0xd9fb9d59,0x6d850418,
  75022. 0x0c30f1cf,0x59cfadbb },
  75023. { 0x55cb7fd6,0xe167ac23,0x820426a3,0x249367b8,0x90a78864,0xeaeec58c,
  75024. 0x354a4b67,0x5babf362 } },
  75025. /* 246 */
  75026. { { 0xee424865,0x37c981d1,0xf2e5577f,0x8b002878,0xb9e0c058,0x702970f1,
  75027. 0x9026c8f0,0x6188c6a7 },
  75028. { 0xd0f244da,0x06f9a19b,0xfb080873,0x1ecced5c,0x9f213637,0x35470f9b,
  75029. 0xdf50b9d9,0x993fe475 } },
  75030. /* 247 */
  75031. { { 0x9b2c3609,0x68e31cdf,0x2c46d4ea,0x84eb19c0,0x9a775101,0x7ac9ec1a,
  75032. 0x4c80616b,0x81f76466 },
  75033. { 0x75fbe978,0x1d7c2a5a,0xf183b356,0x6743fed3,0x501dd2bf,0x838d1f04,
  75034. 0x5fe9060d,0x564a812a } },
  75035. /* 248 */
  75036. { { 0xfa817d1d,0x7a5a64f4,0xbea82e0f,0x55f96844,0xcd57f9aa,0xb5ff5a0f,
  75037. 0x00e51d6c,0x226bf3cf },
  75038. { 0x2f2833cf,0xd6d1a9f9,0x4f4f89a8,0x20a0a35a,0x8f3f7f77,0x11536c49,
  75039. 0xff257836,0x68779f47 } },
  75040. /* 249 */
  75041. { { 0x73043d08,0x79b0c1c1,0x1fc020fa,0xa5446774,0x9a6d26d0,0xd3767e28,
  75042. 0xeb092e0b,0x97bcb0d1 },
  75043. { 0xf32ed3c3,0x2ab6eaa8,0xb281bc48,0xc8a4f151,0xbfa178f3,0x4d1bf4f3,
  75044. 0x0a784655,0xa872ffe8 } },
  75045. /* 250 */
  75046. { { 0xa32b2086,0xb1ab7935,0x8160f486,0xe1eb710e,0x3b6ae6be,0x9bd0cd91,
  75047. 0xb732a36a,0x02812bfc },
  75048. { 0xcf605318,0xa63fd7ca,0xfdfd6d1d,0x646e5d50,0x2102d619,0xa1d68398,
  75049. 0xfe5396af,0x07391cc9 } },
  75050. /* 251 */
  75051. { { 0x8b80d02b,0xc50157f0,0x62877f7f,0x6b8333d1,0x78d542ae,0x7aca1af8,
  75052. 0x7e6d2a08,0x355d2adc },
  75053. { 0x287386e1,0xb41f335a,0xf8e43275,0xfd272a94,0xe79989ea,0x286ca2cd,
  75054. 0x7c2a3a79,0x3dc2b1e3 } },
  75055. /* 252 */
  75056. { { 0x04581352,0xd689d21c,0x376782be,0x0a00c825,0x9fed701f,0x203bd590,
  75057. 0x3ccd846b,0xc4786910 },
  75058. { 0x24c768ed,0x5dba7708,0x6841f657,0x72feea02,0x6accce0e,0x73313ed5,
  75059. 0xd5bb4d32,0xccc42968 } },
  75060. /* 253 */
  75061. { { 0x3d7620b9,0x94e50de1,0x5992a56a,0xd89a5c8a,0x675487c9,0xdc007640,
  75062. 0xaa4871cf,0xe147eb42 },
  75063. { 0xacf3ae46,0x274ab4ee,0x50350fbe,0xfd4936fb,0x48c840ea,0xdf2afe47,
  75064. 0x080e96e3,0x239ac047 } },
  75065. /* 254 */
  75066. { { 0x2bfee8d4,0x481d1f35,0xfa7b0fec,0xce80b5cf,0x2ce9af3c,0x105c4c9e,
  75067. 0xf5f7e59d,0xc55fa1a3 },
  75068. { 0x8257c227,0x3186f14e,0x342be00b,0xc5b1653f,0xaa904fb2,0x09afc998,
  75069. 0xd4f4b699,0x094cd99c } },
  75070. /* 255 */
  75071. { { 0xd703beba,0x8a981c84,0x32ceb291,0x8631d150,0xe3bd49ec,0xa445f2c9,
  75072. 0x42abad33,0xb90a30b6 },
  75073. { 0xb4a5abf9,0xb465404f,0x75db7603,0x004750c3,0xca35d89f,0x6f9a42cc,
  75074. 0x1b7924f7,0x019f8b9a } },
  75075. };
  75076. /* Multiply the base point of P256 by the scalar and return the result.
  75077. * If map is true then convert result to affine coordinates.
  75078. *
  75079. * Stripe implementation.
  75080. * Pre-generated: 2^0, 2^32, ...
  75081. * Pre-generated: products of all combinations of above.
  75082. * 8 doubles and adds (with qz=1)
  75083. *
  75084. * r Resulting point.
  75085. * k Scalar to multiply by.
  75086. * map Indicates whether to convert result to affine.
  75087. * ct Constant time required.
  75088. * heap Heap to use for allocation.
  75089. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  75090. */
  75091. static int sp_256_ecc_mulmod_base_8(sp_point_256* r, const sp_digit* k,
  75092. int map, int ct, void* heap)
  75093. {
  75094. return sp_256_ecc_mulmod_stripe_8(r, &p256_base, p256_table,
  75095. k, map, ct, heap);
  75096. }
  75097. #endif
  75098. /* Multiply the base point of P256 by the scalar and return the result.
  75099. * If map is true then convert result to affine coordinates.
  75100. *
  75101. * km Scalar to multiply by.
  75102. * r Resulting point.
  75103. * map Indicates whether to convert result to affine.
  75104. * heap Heap to use for allocation.
  75105. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  75106. */
  75107. int sp_ecc_mulmod_base_256(const mp_int* km, ecc_point* r, int map, void* heap)
  75108. {
  75109. #ifdef WOLFSSL_SP_SMALL_STACK
  75110. sp_point_256* point = NULL;
  75111. sp_digit* k = NULL;
  75112. #else
  75113. sp_point_256 point[1];
  75114. sp_digit k[8];
  75115. #endif
  75116. int err = MP_OKAY;
  75117. #ifdef WOLFSSL_SP_SMALL_STACK
  75118. point = (sp_point_256*)XMALLOC(sizeof(sp_point_256), heap,
  75119. DYNAMIC_TYPE_ECC);
  75120. if (point == NULL)
  75121. err = MEMORY_E;
  75122. if (err == MP_OKAY) {
  75123. k = (sp_digit*)XMALLOC(sizeof(sp_digit) * 8, heap,
  75124. DYNAMIC_TYPE_ECC);
  75125. if (k == NULL)
  75126. err = MEMORY_E;
  75127. }
  75128. #endif
  75129. if (err == MP_OKAY) {
  75130. sp_256_from_mp(k, 8, km);
  75131. err = sp_256_ecc_mulmod_base_8(point, k, map, 1, heap);
  75132. }
  75133. if (err == MP_OKAY) {
  75134. err = sp_256_point_to_ecc_point_8(point, r);
  75135. }
  75136. #ifdef WOLFSSL_SP_SMALL_STACK
  75137. if (k != NULL)
  75138. XFREE(k, heap, DYNAMIC_TYPE_ECC);
  75139. if (point != NULL)
  75140. XFREE(point, heap, DYNAMIC_TYPE_ECC);
  75141. #endif
  75142. return err;
  75143. }
  75144. /* Multiply the base point of P256 by the scalar, add point a and return
  75145. * the result. If map is true then convert result to affine coordinates.
  75146. *
  75147. * km Scalar to multiply by.
  75148. * am Point to add to scalar multiply result.
  75149. * inMont Point to add is in montgomery form.
  75150. * r Resulting point.
  75151. * map Indicates whether to convert result to affine.
  75152. * heap Heap to use for allocation.
  75153. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  75154. */
  75155. int sp_ecc_mulmod_base_add_256(const mp_int* km, const ecc_point* am,
  75156. int inMont, ecc_point* r, int map, void* heap)
  75157. {
  75158. #ifdef WOLFSSL_SP_SMALL_STACK
  75159. sp_point_256* point = NULL;
  75160. sp_digit* k = NULL;
  75161. #else
  75162. sp_point_256 point[2];
  75163. sp_digit k[8 + 8 * 2 * 6];
  75164. #endif
  75165. sp_point_256* addP = NULL;
  75166. sp_digit* tmp = NULL;
  75167. int err = MP_OKAY;
  75168. #ifdef WOLFSSL_SP_SMALL_STACK
  75169. point = (sp_point_256*)XMALLOC(sizeof(sp_point_256) * 2, heap,
  75170. DYNAMIC_TYPE_ECC);
  75171. if (point == NULL)
  75172. err = MEMORY_E;
  75173. if (err == MP_OKAY) {
  75174. k = (sp_digit*)XMALLOC(
  75175. sizeof(sp_digit) * (8 + 8 * 2 * 6),
  75176. heap, DYNAMIC_TYPE_ECC);
  75177. if (k == NULL)
  75178. err = MEMORY_E;
  75179. }
  75180. #endif
  75181. if (err == MP_OKAY) {
  75182. addP = point + 1;
  75183. tmp = k + 8;
  75184. sp_256_from_mp(k, 8, km);
  75185. sp_256_point_from_ecc_point_8(addP, am);
  75186. }
  75187. if ((err == MP_OKAY) && (!inMont)) {
  75188. err = sp_256_mod_mul_norm_8(addP->x, addP->x, p256_mod);
  75189. }
  75190. if ((err == MP_OKAY) && (!inMont)) {
  75191. err = sp_256_mod_mul_norm_8(addP->y, addP->y, p256_mod);
  75192. }
  75193. if ((err == MP_OKAY) && (!inMont)) {
  75194. err = sp_256_mod_mul_norm_8(addP->z, addP->z, p256_mod);
  75195. }
  75196. if (err == MP_OKAY) {
  75197. err = sp_256_ecc_mulmod_base_8(point, k, 0, 0, heap);
  75198. }
  75199. if (err == MP_OKAY) {
  75200. sp_256_proj_point_add_8(point, point, addP, tmp);
  75201. if (map) {
  75202. sp_256_map_8(point, point, tmp);
  75203. }
  75204. err = sp_256_point_to_ecc_point_8(point, r);
  75205. }
  75206. #ifdef WOLFSSL_SP_SMALL_STACK
  75207. if (k != NULL)
  75208. XFREE(k, heap, DYNAMIC_TYPE_ECC);
  75209. if (point)
  75210. XFREE(point, heap, DYNAMIC_TYPE_ECC);
  75211. #endif
  75212. return err;
  75213. }
  75214. #if defined(WOLFSSL_VALIDATE_ECC_KEYGEN) || defined(HAVE_ECC_SIGN) || \
  75215. defined(HAVE_ECC_VERIFY)
  75216. #endif /* WOLFSSL_VALIDATE_ECC_KEYGEN | HAVE_ECC_SIGN | HAVE_ECC_VERIFY */
  75217. /* Add 1 to a. (a = a + 1)
  75218. *
  75219. * a A single precision integer.
  75220. */
  75221. static void sp_256_add_one_8(sp_digit* a_p)
  75222. {
  75223. register sp_digit* a asm ("r0") = (sp_digit*)a_p;
  75224. __asm__ __volatile__ (
  75225. "ldm %[a], {r1, r2, r3, r4}\n\t"
  75226. "adds r1, r1, #1\n\t"
  75227. "adcs r2, r2, #0\n\t"
  75228. "adcs r3, r3, #0\n\t"
  75229. "adcs r4, r4, #0\n\t"
  75230. "stm %[a]!, {r1, r2, r3, r4}\n\t"
  75231. "ldm %[a], {r1, r2, r3, r4}\n\t"
  75232. "adcs r1, r1, #0\n\t"
  75233. "adcs r2, r2, #0\n\t"
  75234. "adcs r3, r3, #0\n\t"
  75235. "adcs r4, r4, #0\n\t"
  75236. "stm %[a]!, {r1, r2, r3, r4}\n\t"
  75237. : [a] "+r" (a)
  75238. :
  75239. : "memory", "r1", "r2", "r3", "r4", "cc"
  75240. );
  75241. }
  75242. /* Read big endian unsigned byte array into r.
  75243. *
  75244. * r A single precision integer.
  75245. * size Maximum number of bytes to convert
  75246. * a Byte array.
  75247. * n Number of bytes in array to read.
  75248. */
  75249. static void sp_256_from_bin(sp_digit* r, int size, const byte* a, int n)
  75250. {
  75251. int i;
  75252. int j;
  75253. byte* d;
  75254. for (i = n - 1,j = 0; i >= 3; i -= 4) {
  75255. r[j] = ((sp_digit)a[i - 0] << 0) |
  75256. ((sp_digit)a[i - 1] << 8) |
  75257. ((sp_digit)a[i - 2] << 16) |
  75258. ((sp_digit)a[i - 3] << 24);
  75259. j++;
  75260. }
  75261. if (i >= 0) {
  75262. r[j] = 0;
  75263. d = (byte*)r;
  75264. switch (i) {
  75265. case 2: d[n - 1 - 2] = a[2]; //fallthrough
  75266. case 1: d[n - 1 - 1] = a[1]; //fallthrough
  75267. case 0: d[n - 1 - 0] = a[0]; //fallthrough
  75268. }
  75269. j++;
  75270. }
  75271. for (; j < size; j++) {
  75272. r[j] = 0;
  75273. }
  75274. }
  75275. /* Generates a scalar that is in the range 1..order-1.
  75276. *
  75277. * rng Random number generator.
  75278. * k Scalar value.
  75279. * returns RNG failures, MEMORY_E when memory allocation fails and
  75280. * MP_OKAY on success.
  75281. */
  75282. static int sp_256_ecc_gen_k_8(WC_RNG* rng, sp_digit* k)
  75283. {
  75284. int err;
  75285. byte buf[32];
  75286. do {
  75287. err = wc_RNG_GenerateBlock(rng, buf, sizeof(buf));
  75288. if (err == 0) {
  75289. sp_256_from_bin(k, 8, buf, (int)sizeof(buf));
  75290. if (sp_256_cmp_8(k, p256_order2) <= 0) {
  75291. sp_256_add_one_8(k);
  75292. break;
  75293. }
  75294. }
  75295. }
  75296. while (err == 0);
  75297. return err;
  75298. }
  75299. /* Makes a random EC key pair.
  75300. *
  75301. * rng Random number generator.
  75302. * priv Generated private value.
  75303. * pub Generated public point.
  75304. * heap Heap to use for allocation.
  75305. * returns ECC_INF_E when the point does not have the correct order, RNG
  75306. * failures, MEMORY_E when memory allocation fails and MP_OKAY on success.
  75307. */
  75308. int sp_ecc_make_key_256(WC_RNG* rng, mp_int* priv, ecc_point* pub, void* heap)
  75309. {
  75310. #ifdef WOLFSSL_SP_SMALL_STACK
  75311. sp_point_256* point = NULL;
  75312. sp_digit* k = NULL;
  75313. #else
  75314. #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN
  75315. sp_point_256 point[2];
  75316. #else
  75317. sp_point_256 point[1];
  75318. #endif
  75319. sp_digit k[8];
  75320. #endif
  75321. #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN
  75322. sp_point_256* infinity = NULL;
  75323. #endif
  75324. int err = MP_OKAY;
  75325. (void)heap;
  75326. #ifdef WOLFSSL_SP_SMALL_STACK
  75327. #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN
  75328. point = (sp_point_256*)XMALLOC(sizeof(sp_point_256) * 2, heap, DYNAMIC_TYPE_ECC);
  75329. #else
  75330. point = (sp_point_256*)XMALLOC(sizeof(sp_point_256), heap, DYNAMIC_TYPE_ECC);
  75331. #endif
  75332. if (point == NULL)
  75333. err = MEMORY_E;
  75334. if (err == MP_OKAY) {
  75335. k = (sp_digit*)XMALLOC(sizeof(sp_digit) * 8, heap,
  75336. DYNAMIC_TYPE_ECC);
  75337. if (k == NULL)
  75338. err = MEMORY_E;
  75339. }
  75340. #endif
  75341. if (err == MP_OKAY) {
  75342. #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN
  75343. infinity = point + 1;
  75344. #endif
  75345. err = sp_256_ecc_gen_k_8(rng, k);
  75346. }
  75347. if (err == MP_OKAY) {
  75348. err = sp_256_ecc_mulmod_base_8(point, k, 1, 1, NULL);
  75349. }
  75350. #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN
  75351. if (err == MP_OKAY) {
  75352. err = sp_256_ecc_mulmod_8(infinity, point, p256_order, 1, 1, NULL);
  75353. }
  75354. if (err == MP_OKAY) {
  75355. if (sp_256_iszero_8(point->x) || sp_256_iszero_8(point->y)) {
  75356. err = ECC_INF_E;
  75357. }
  75358. }
  75359. #endif
  75360. if (err == MP_OKAY) {
  75361. err = sp_256_to_mp(k, priv);
  75362. }
  75363. if (err == MP_OKAY) {
  75364. err = sp_256_point_to_ecc_point_8(point, pub);
  75365. }
  75366. #ifdef WOLFSSL_SP_SMALL_STACK
  75367. if (k != NULL)
  75368. XFREE(k, heap, DYNAMIC_TYPE_ECC);
  75369. if (point != NULL) {
  75370. /* point is not sensitive, so no need to zeroize */
  75371. XFREE(point, heap, DYNAMIC_TYPE_ECC);
  75372. }
  75373. #endif
  75374. return err;
  75375. }
  75376. #ifdef WOLFSSL_SP_NONBLOCK
  75377. typedef struct sp_ecc_key_gen_256_ctx {
  75378. int state;
  75379. sp_256_ecc_mulmod_8_ctx mulmod_ctx;
  75380. sp_digit k[8];
  75381. #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN
  75382. sp_point_256 point[2];
  75383. #else
  75384. sp_point_256 point[1];
  75385. #endif /* WOLFSSL_VALIDATE_ECC_KEYGEN */
  75386. } sp_ecc_key_gen_256_ctx;
  75387. int sp_ecc_make_key_256_nb(sp_ecc_ctx_t* sp_ctx, WC_RNG* rng, mp_int* priv,
  75388. ecc_point* pub, void* heap)
  75389. {
  75390. int err = FP_WOULDBLOCK;
  75391. sp_ecc_key_gen_256_ctx* ctx = (sp_ecc_key_gen_256_ctx*)sp_ctx->data;
  75392. #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN
  75393. sp_point_256* infinity = ctx->point + 1;
  75394. #endif /* WOLFSSL_VALIDATE_ECC_KEYGEN */
  75395. typedef char ctx_size_test[sizeof(sp_ecc_key_gen_256_ctx)
  75396. >= sizeof(*sp_ctx) ? -1 : 1];
  75397. (void)sizeof(ctx_size_test);
  75398. switch (ctx->state) {
  75399. case 0:
  75400. err = sp_256_ecc_gen_k_8(rng, ctx->k);
  75401. if (err == MP_OKAY) {
  75402. err = FP_WOULDBLOCK;
  75403. ctx->state = 1;
  75404. }
  75405. break;
  75406. case 1:
  75407. err = sp_256_ecc_mulmod_base_8_nb((sp_ecc_ctx_t*)&ctx->mulmod_ctx,
  75408. ctx->point, ctx->k, 1, 1, heap);
  75409. if (err == MP_OKAY) {
  75410. err = FP_WOULDBLOCK;
  75411. #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN
  75412. XMEMSET(&ctx->mulmod_ctx, 0, sizeof(ctx->mulmod_ctx));
  75413. ctx->state = 2;
  75414. #else
  75415. ctx->state = 3;
  75416. #endif
  75417. }
  75418. break;
  75419. #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN
  75420. case 2:
  75421. err = sp_256_ecc_mulmod_8_nb((sp_ecc_ctx_t*)&ctx->mulmod_ctx,
  75422. infinity, ctx->point, p256_order, 1, 1);
  75423. if (err == MP_OKAY) {
  75424. if (sp_256_iszero_8(ctx->point->x) ||
  75425. sp_256_iszero_8(ctx->point->y)) {
  75426. err = ECC_INF_E;
  75427. }
  75428. else {
  75429. err = FP_WOULDBLOCK;
  75430. ctx->state = 3;
  75431. }
  75432. }
  75433. break;
  75434. #endif /* WOLFSSL_VALIDATE_ECC_KEYGEN */
  75435. case 3:
  75436. err = sp_256_to_mp(ctx->k, priv);
  75437. if (err == MP_OKAY) {
  75438. err = sp_256_point_to_ecc_point_8(ctx->point, pub);
  75439. }
  75440. break;
  75441. }
  75442. if (err != FP_WOULDBLOCK) {
  75443. XMEMSET(ctx, 0, sizeof(sp_ecc_key_gen_256_ctx));
  75444. }
  75445. return err;
  75446. }
  75447. #endif /* WOLFSSL_SP_NONBLOCK */
  75448. #ifdef HAVE_ECC_DHE
  75449. /* Write r as big endian to byte array.
  75450. * Fixed length number of bytes written: 32
  75451. *
  75452. * r A single precision integer.
  75453. * a Byte array.
  75454. */
  75455. static void sp_256_to_bin_8(sp_digit* r, byte* a)
  75456. {
  75457. int i;
  75458. int j = 0;
  75459. for (i = 7; i >= 0; i--) {
  75460. a[j++] = r[i] >> 24;
  75461. a[j++] = r[i] >> 16;
  75462. a[j++] = r[i] >> 8;
  75463. a[j++] = r[i] >> 0;
  75464. }
  75465. }
  75466. /* Multiply the point by the scalar and serialize the X ordinate.
  75467. * The number is 0 padded to maximum size on output.
  75468. *
  75469. * priv Scalar to multiply the point by.
  75470. * pub Point to multiply.
  75471. * out Buffer to hold X ordinate.
  75472. * outLen On entry, size of the buffer in bytes.
  75473. * On exit, length of data in buffer in bytes.
  75474. * heap Heap to use for allocation.
  75475. * returns BUFFER_E if the buffer is to small for output size,
  75476. * MEMORY_E when memory allocation fails and MP_OKAY on success.
  75477. */
  75478. int sp_ecc_secret_gen_256(const mp_int* priv, const ecc_point* pub, byte* out,
  75479. word32* outLen, void* heap)
  75480. {
  75481. #ifdef WOLFSSL_SP_SMALL_STACK
  75482. sp_point_256* point = NULL;
  75483. sp_digit* k = NULL;
  75484. #else
  75485. sp_point_256 point[1];
  75486. sp_digit k[8];
  75487. #endif
  75488. int err = MP_OKAY;
  75489. if (*outLen < 32U) {
  75490. err = BUFFER_E;
  75491. }
  75492. #ifdef WOLFSSL_SP_SMALL_STACK
  75493. if (err == MP_OKAY) {
  75494. point = (sp_point_256*)XMALLOC(sizeof(sp_point_256), heap,
  75495. DYNAMIC_TYPE_ECC);
  75496. if (point == NULL)
  75497. err = MEMORY_E;
  75498. }
  75499. if (err == MP_OKAY) {
  75500. k = (sp_digit*)XMALLOC(sizeof(sp_digit) * 8, heap,
  75501. DYNAMIC_TYPE_ECC);
  75502. if (k == NULL)
  75503. err = MEMORY_E;
  75504. }
  75505. #endif
  75506. if (err == MP_OKAY) {
  75507. sp_256_from_mp(k, 8, priv);
  75508. sp_256_point_from_ecc_point_8(point, pub);
  75509. err = sp_256_ecc_mulmod_8(point, point, k, 1, 1, heap);
  75510. }
  75511. if (err == MP_OKAY) {
  75512. sp_256_to_bin_8(point->x, out);
  75513. *outLen = 32;
  75514. }
  75515. #ifdef WOLFSSL_SP_SMALL_STACK
  75516. if (k != NULL)
  75517. XFREE(k, heap, DYNAMIC_TYPE_ECC);
  75518. if (point != NULL)
  75519. XFREE(point, heap, DYNAMIC_TYPE_ECC);
  75520. #endif
  75521. return err;
  75522. }
  75523. #ifdef WOLFSSL_SP_NONBLOCK
  75524. typedef struct sp_ecc_sec_gen_256_ctx {
  75525. int state;
  75526. union {
  75527. sp_256_ecc_mulmod_8_ctx mulmod_ctx;
  75528. };
  75529. sp_digit k[8];
  75530. sp_point_256 point;
  75531. } sp_ecc_sec_gen_256_ctx;
  75532. int sp_ecc_secret_gen_256_nb(sp_ecc_ctx_t* sp_ctx, const mp_int* priv,
  75533. const ecc_point* pub, byte* out, word32* outLen, void* heap)
  75534. {
  75535. int err = FP_WOULDBLOCK;
  75536. sp_ecc_sec_gen_256_ctx* ctx = (sp_ecc_sec_gen_256_ctx*)sp_ctx->data;
  75537. typedef char ctx_size_test[sizeof(sp_ecc_sec_gen_256_ctx) >= sizeof(*sp_ctx) ? -1 : 1];
  75538. (void)sizeof(ctx_size_test);
  75539. if (*outLen < 32U) {
  75540. err = BUFFER_E;
  75541. }
  75542. switch (ctx->state) {
  75543. case 0:
  75544. sp_256_from_mp(ctx->k, 8, priv);
  75545. sp_256_point_from_ecc_point_8(&ctx->point, pub);
  75546. ctx->state = 1;
  75547. break;
  75548. case 1:
  75549. err = sp_256_ecc_mulmod_8_nb((sp_ecc_ctx_t*)&ctx->mulmod_ctx,
  75550. &ctx->point, &ctx->point, ctx->k, 1, 1, heap);
  75551. if (err == MP_OKAY) {
  75552. sp_256_to_bin_8(ctx->point.x, out);
  75553. *outLen = 32;
  75554. }
  75555. break;
  75556. }
  75557. if (err == MP_OKAY && ctx->state != 1) {
  75558. err = FP_WOULDBLOCK;
  75559. }
  75560. if (err != FP_WOULDBLOCK) {
  75561. XMEMSET(ctx, 0, sizeof(sp_ecc_sec_gen_256_ctx));
  75562. }
  75563. return err;
  75564. }
  75565. #endif /* WOLFSSL_SP_NONBLOCK */
  75566. #endif /* HAVE_ECC_DHE */
  75567. #if defined(HAVE_ECC_SIGN) || defined(HAVE_ECC_VERIFY)
  75568. #endif
  75569. #if defined(HAVE_ECC_SIGN) || defined(HAVE_ECC_VERIFY)
  75570. #endif
  75571. #if defined(HAVE_ECC_SIGN) || defined(HAVE_ECC_VERIFY)
  75572. #ifdef WOLFSSL_SP_SMALL
  75573. /* Sub b from a into a. (a -= b)
  75574. *
  75575. * a A single precision integer.
  75576. * b A single precision integer.
  75577. */
  75578. static sp_digit sp_256_sub_in_place_8(sp_digit* a_p, const sp_digit* b_p)
  75579. {
  75580. register sp_digit* a asm ("r0") = (sp_digit*)a_p;
  75581. register const sp_digit* b asm ("r1") = (const sp_digit*)b_p;
  75582. __asm__ __volatile__ (
  75583. "mov r12, #0\n\t"
  75584. "add lr, %[a], #32\n\t"
  75585. "\n"
  75586. "L_sp_256_sub_in_pkace_8_word_%=: \n\t"
  75587. "rsbs r12, r12, #0\n\t"
  75588. "ldm %[a], {r2, r3, r4, r5}\n\t"
  75589. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  75590. "sbcs r2, r2, r6\n\t"
  75591. "sbcs r3, r3, r7\n\t"
  75592. "sbcs r4, r4, r8\n\t"
  75593. "sbcs r5, r5, r9\n\t"
  75594. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  75595. "sbc r12, r12, r12\n\t"
  75596. "cmp %[a], lr\n\t"
  75597. "bne L_sp_256_sub_in_pkace_8_word_%=\n\t"
  75598. "mov %[a], r12\n\t"
  75599. : [a] "+r" (a), [b] "+r" (b)
  75600. :
  75601. : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r12", "lr", "cc"
  75602. );
  75603. return (uint32_t)(size_t)a;
  75604. }
  75605. #else
  75606. /* Sub b from a into a. (a -= b)
  75607. *
  75608. * a A single precision integer and result.
  75609. * b A single precision integer.
  75610. */
  75611. static sp_digit sp_256_sub_in_place_8(sp_digit* a_p, const sp_digit* b_p)
  75612. {
  75613. register sp_digit* a asm ("r0") = (sp_digit*)a_p;
  75614. register const sp_digit* b asm ("r1") = (const sp_digit*)b_p;
  75615. __asm__ __volatile__ (
  75616. "ldm %[a], {r2, r3, r4, r5}\n\t"
  75617. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  75618. "subs r2, r2, r6\n\t"
  75619. "sbcs r3, r3, r7\n\t"
  75620. "sbcs r4, r4, r8\n\t"
  75621. "sbcs r5, r5, r9\n\t"
  75622. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  75623. "ldm %[a], {r2, r3, r4, r5}\n\t"
  75624. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  75625. "sbcs r2, r2, r6\n\t"
  75626. "sbcs r3, r3, r7\n\t"
  75627. "sbcs r4, r4, r8\n\t"
  75628. "sbcs r5, r5, r9\n\t"
  75629. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  75630. "sbc %[a], r9, r9\n\t"
  75631. : [a] "+r" (a), [b] "+r" (b)
  75632. :
  75633. : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "cc"
  75634. );
  75635. return (uint32_t)(size_t)a;
  75636. }
  75637. #endif /* WOLFSSL_SP_SMALL */
  75638. #ifdef WOLFSSL_SP_SMALL
  75639. /* Mul a by digit b into r. (r = a * b)
  75640. *
  75641. * r A single precision integer.
  75642. * a A single precision integer.
  75643. * b A single precision digit.
  75644. */
  75645. static void sp_256_mul_d_8(sp_digit* r_p, const sp_digit* a_p, sp_digit b_p)
  75646. {
  75647. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  75648. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  75649. register sp_digit b asm ("r2") = (sp_digit)b_p;
  75650. __asm__ __volatile__ (
  75651. /* A[0] * B */
  75652. "ldr r8, [%[a]]\n\t"
  75653. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  75654. "lsl r6, %[b], #16\n\t"
  75655. "lsl r5, r8, #16\n\t"
  75656. "lsr r6, r6, #16\n\t"
  75657. "lsr r5, r5, #16\n\t"
  75658. "mul r5, r6, r5\n\t"
  75659. "lsr r7, r8, #16\n\t"
  75660. "mul r6, r7, r6\n\t"
  75661. "lsr r3, r6, #16\n\t"
  75662. "lsl r6, r6, #16\n\t"
  75663. "adds r5, r5, r6\n\t"
  75664. "adc r3, r3, #0\n\t"
  75665. "lsr r6, %[b], #16\n\t"
  75666. "mul r7, r6, r7\n\t"
  75667. "add r3, r3, r7\n\t"
  75668. "lsl r7, r8, #16\n\t"
  75669. "lsr r7, r7, #16\n\t"
  75670. "mul r6, r7, r6\n\t"
  75671. "lsr r7, r6, #16\n\t"
  75672. "lsl r6, r6, #16\n\t"
  75673. "adds r5, r5, r6\n\t"
  75674. "adc r3, r3, r7\n\t"
  75675. #else
  75676. "umull r5, r3, %[b], r8\n\t"
  75677. #endif
  75678. "mov r4, #0\n\t"
  75679. "str r5, [%[r]]\n\t"
  75680. "mov r5, #0\n\t"
  75681. "mov r9, #4\n\t"
  75682. "\n"
  75683. "L_sp_256_mul_d_8_word_%=: \n\t"
  75684. /* A[i] * B */
  75685. "ldr r8, [%[a], r9]\n\t"
  75686. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  75687. "lsl r6, %[b], #16\n\t"
  75688. "lsl r7, r8, #16\n\t"
  75689. "lsr r6, r6, #16\n\t"
  75690. "lsr r7, r7, #16\n\t"
  75691. "mul r7, r6, r7\n\t"
  75692. "adds r3, r3, r7\n\t"
  75693. "adcs r4, r4, #0\n\t"
  75694. "adc r5, r5, #0\n\t"
  75695. "lsr r7, r8, #16\n\t"
  75696. "mul r6, r7, r6\n\t"
  75697. "lsr r7, r6, #16\n\t"
  75698. "lsl r6, r6, #16\n\t"
  75699. "adds r3, r3, r6\n\t"
  75700. "adcs r4, r4, r7\n\t"
  75701. "adc r5, r5, #0\n\t"
  75702. "lsr r6, %[b], #16\n\t"
  75703. "lsr r7, r8, #16\n\t"
  75704. "mul r7, r6, r7\n\t"
  75705. "adds r4, r4, r7\n\t"
  75706. "adc r5, r5, #0\n\t"
  75707. "lsl r7, r8, #16\n\t"
  75708. "lsr r7, r7, #16\n\t"
  75709. "mul r6, r7, r6\n\t"
  75710. "lsr r7, r6, #16\n\t"
  75711. "lsl r6, r6, #16\n\t"
  75712. "adds r3, r3, r6\n\t"
  75713. "adcs r4, r4, r7\n\t"
  75714. "adc r5, r5, #0\n\t"
  75715. #else
  75716. "umull r6, r7, %[b], r8\n\t"
  75717. "adds r3, r3, r6\n\t"
  75718. "adcs r4, r4, r7\n\t"
  75719. "adc r5, r5, #0\n\t"
  75720. #endif
  75721. "str r3, [%[r], r9]\n\t"
  75722. "mov r3, r4\n\t"
  75723. "mov r4, r5\n\t"
  75724. "mov r5, #0\n\t"
  75725. "add r9, r9, #4\n\t"
  75726. "cmp r9, #32\n\t"
  75727. "blt L_sp_256_mul_d_8_word_%=\n\t"
  75728. "str r3, [%[r], #32]\n\t"
  75729. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  75730. :
  75731. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "cc"
  75732. );
  75733. }
  75734. #else
  75735. /* Mul a by digit b into r. (r = a * b)
  75736. *
  75737. * r A single precision integer.
  75738. * a A single precision integer.
  75739. * b A single precision digit.
  75740. */
  75741. static void sp_256_mul_d_8(sp_digit* r_p, const sp_digit* a_p, sp_digit b_p)
  75742. {
  75743. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  75744. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  75745. register sp_digit b asm ("r2") = (sp_digit)b_p;
  75746. __asm__ __volatile__ (
  75747. /* A[0] * B */
  75748. "ldm %[a]!, {r8}\n\t"
  75749. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  75750. "lsl r6, %[b], #16\n\t"
  75751. "lsl r3, r8, #16\n\t"
  75752. "lsr r6, r6, #16\n\t"
  75753. "lsr r3, r3, #16\n\t"
  75754. "mul r3, r6, r3\n\t"
  75755. "lsr r7, r8, #16\n\t"
  75756. "mul r6, r7, r6\n\t"
  75757. "lsr r4, r6, #16\n\t"
  75758. "lsl r6, r6, #16\n\t"
  75759. "adds r3, r3, r6\n\t"
  75760. "adc r4, r4, #0\n\t"
  75761. "lsr r6, %[b], #16\n\t"
  75762. "mul r7, r6, r7\n\t"
  75763. "add r4, r4, r7\n\t"
  75764. "lsl r7, r8, #16\n\t"
  75765. "lsr r7, r7, #16\n\t"
  75766. "mul r6, r7, r6\n\t"
  75767. "lsr r7, r6, #16\n\t"
  75768. "lsl r6, r6, #16\n\t"
  75769. "adds r3, r3, r6\n\t"
  75770. "adc r4, r4, r7\n\t"
  75771. #else
  75772. "umull r3, r4, %[b], r8\n\t"
  75773. #endif
  75774. "stm %[r]!, {r3}\n\t"
  75775. "mov r5, #0\n\t"
  75776. /* A[1] * B */
  75777. "ldm %[a]!, {r8}\n\t"
  75778. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  75779. "lsl r6, %[b], #16\n\t"
  75780. "lsl r7, r8, #16\n\t"
  75781. "lsr r6, r6, #16\n\t"
  75782. "lsr r7, r7, #16\n\t"
  75783. "mul r7, r6, r7\n\t"
  75784. "adds r4, r4, r7\n\t"
  75785. "adc r5, r5, #0\n\t"
  75786. "lsr r7, r8, #16\n\t"
  75787. "mul r6, r7, r6\n\t"
  75788. "lsr r7, r6, #16\n\t"
  75789. "lsl r6, r6, #16\n\t"
  75790. "adds r4, r4, r6\n\t"
  75791. "adc r5, r5, r7\n\t"
  75792. "lsr r6, %[b], #16\n\t"
  75793. "lsr r7, r8, #16\n\t"
  75794. "mul r7, r6, r7\n\t"
  75795. "add r5, r5, r7\n\t"
  75796. "lsl r7, r8, #16\n\t"
  75797. "lsr r7, r7, #16\n\t"
  75798. "mul r6, r7, r6\n\t"
  75799. "lsr r7, r6, #16\n\t"
  75800. "lsl r6, r6, #16\n\t"
  75801. "adds r4, r4, r6\n\t"
  75802. "adc r5, r5, r7\n\t"
  75803. #else
  75804. "umlal r4, r5, %[b], r8\n\t"
  75805. #endif
  75806. "stm %[r]!, {r4}\n\t"
  75807. "mov r3, #0\n\t"
  75808. /* A[2] * B */
  75809. "ldm %[a]!, {r8}\n\t"
  75810. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  75811. "lsl r6, %[b], #16\n\t"
  75812. "lsl r7, r8, #16\n\t"
  75813. "lsr r6, r6, #16\n\t"
  75814. "lsr r7, r7, #16\n\t"
  75815. "mul r7, r6, r7\n\t"
  75816. "adds r5, r5, r7\n\t"
  75817. "adc r3, r3, #0\n\t"
  75818. "lsr r7, r8, #16\n\t"
  75819. "mul r6, r7, r6\n\t"
  75820. "lsr r7, r6, #16\n\t"
  75821. "lsl r6, r6, #16\n\t"
  75822. "adds r5, r5, r6\n\t"
  75823. "adc r3, r3, r7\n\t"
  75824. "lsr r6, %[b], #16\n\t"
  75825. "lsr r7, r8, #16\n\t"
  75826. "mul r7, r6, r7\n\t"
  75827. "add r3, r3, r7\n\t"
  75828. "lsl r7, r8, #16\n\t"
  75829. "lsr r7, r7, #16\n\t"
  75830. "mul r6, r7, r6\n\t"
  75831. "lsr r7, r6, #16\n\t"
  75832. "lsl r6, r6, #16\n\t"
  75833. "adds r5, r5, r6\n\t"
  75834. "adc r3, r3, r7\n\t"
  75835. #else
  75836. "umlal r5, r3, %[b], r8\n\t"
  75837. #endif
  75838. "stm %[r]!, {r5}\n\t"
  75839. "mov r4, #0\n\t"
  75840. /* A[3] * B */
  75841. "ldm %[a]!, {r8}\n\t"
  75842. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  75843. "lsl r6, %[b], #16\n\t"
  75844. "lsl r7, r8, #16\n\t"
  75845. "lsr r6, r6, #16\n\t"
  75846. "lsr r7, r7, #16\n\t"
  75847. "mul r7, r6, r7\n\t"
  75848. "adds r3, r3, r7\n\t"
  75849. "adc r4, r4, #0\n\t"
  75850. "lsr r7, r8, #16\n\t"
  75851. "mul r6, r7, r6\n\t"
  75852. "lsr r7, r6, #16\n\t"
  75853. "lsl r6, r6, #16\n\t"
  75854. "adds r3, r3, r6\n\t"
  75855. "adc r4, r4, r7\n\t"
  75856. "lsr r6, %[b], #16\n\t"
  75857. "lsr r7, r8, #16\n\t"
  75858. "mul r7, r6, r7\n\t"
  75859. "add r4, r4, r7\n\t"
  75860. "lsl r7, r8, #16\n\t"
  75861. "lsr r7, r7, #16\n\t"
  75862. "mul r6, r7, r6\n\t"
  75863. "lsr r7, r6, #16\n\t"
  75864. "lsl r6, r6, #16\n\t"
  75865. "adds r3, r3, r6\n\t"
  75866. "adc r4, r4, r7\n\t"
  75867. #else
  75868. "umlal r3, r4, %[b], r8\n\t"
  75869. #endif
  75870. "stm %[r]!, {r3}\n\t"
  75871. "mov r5, #0\n\t"
  75872. /* A[4] * B */
  75873. "ldm %[a]!, {r8}\n\t"
  75874. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  75875. "lsl r6, %[b], #16\n\t"
  75876. "lsl r7, r8, #16\n\t"
  75877. "lsr r6, r6, #16\n\t"
  75878. "lsr r7, r7, #16\n\t"
  75879. "mul r7, r6, r7\n\t"
  75880. "adds r4, r4, r7\n\t"
  75881. "adc r5, r5, #0\n\t"
  75882. "lsr r7, r8, #16\n\t"
  75883. "mul r6, r7, r6\n\t"
  75884. "lsr r7, r6, #16\n\t"
  75885. "lsl r6, r6, #16\n\t"
  75886. "adds r4, r4, r6\n\t"
  75887. "adc r5, r5, r7\n\t"
  75888. "lsr r6, %[b], #16\n\t"
  75889. "lsr r7, r8, #16\n\t"
  75890. "mul r7, r6, r7\n\t"
  75891. "add r5, r5, r7\n\t"
  75892. "lsl r7, r8, #16\n\t"
  75893. "lsr r7, r7, #16\n\t"
  75894. "mul r6, r7, r6\n\t"
  75895. "lsr r7, r6, #16\n\t"
  75896. "lsl r6, r6, #16\n\t"
  75897. "adds r4, r4, r6\n\t"
  75898. "adc r5, r5, r7\n\t"
  75899. #else
  75900. "umlal r4, r5, %[b], r8\n\t"
  75901. #endif
  75902. "stm %[r]!, {r4}\n\t"
  75903. "mov r3, #0\n\t"
  75904. /* A[5] * B */
  75905. "ldm %[a]!, {r8}\n\t"
  75906. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  75907. "lsl r6, %[b], #16\n\t"
  75908. "lsl r7, r8, #16\n\t"
  75909. "lsr r6, r6, #16\n\t"
  75910. "lsr r7, r7, #16\n\t"
  75911. "mul r7, r6, r7\n\t"
  75912. "adds r5, r5, r7\n\t"
  75913. "adc r3, r3, #0\n\t"
  75914. "lsr r7, r8, #16\n\t"
  75915. "mul r6, r7, r6\n\t"
  75916. "lsr r7, r6, #16\n\t"
  75917. "lsl r6, r6, #16\n\t"
  75918. "adds r5, r5, r6\n\t"
  75919. "adc r3, r3, r7\n\t"
  75920. "lsr r6, %[b], #16\n\t"
  75921. "lsr r7, r8, #16\n\t"
  75922. "mul r7, r6, r7\n\t"
  75923. "add r3, r3, r7\n\t"
  75924. "lsl r7, r8, #16\n\t"
  75925. "lsr r7, r7, #16\n\t"
  75926. "mul r6, r7, r6\n\t"
  75927. "lsr r7, r6, #16\n\t"
  75928. "lsl r6, r6, #16\n\t"
  75929. "adds r5, r5, r6\n\t"
  75930. "adc r3, r3, r7\n\t"
  75931. #else
  75932. "umlal r5, r3, %[b], r8\n\t"
  75933. #endif
  75934. "stm %[r]!, {r5}\n\t"
  75935. "mov r4, #0\n\t"
  75936. /* A[6] * B */
  75937. "ldm %[a]!, {r8}\n\t"
  75938. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  75939. "lsl r6, %[b], #16\n\t"
  75940. "lsl r7, r8, #16\n\t"
  75941. "lsr r6, r6, #16\n\t"
  75942. "lsr r7, r7, #16\n\t"
  75943. "mul r7, r6, r7\n\t"
  75944. "adds r3, r3, r7\n\t"
  75945. "adc r4, r4, #0\n\t"
  75946. "lsr r7, r8, #16\n\t"
  75947. "mul r6, r7, r6\n\t"
  75948. "lsr r7, r6, #16\n\t"
  75949. "lsl r6, r6, #16\n\t"
  75950. "adds r3, r3, r6\n\t"
  75951. "adc r4, r4, r7\n\t"
  75952. "lsr r6, %[b], #16\n\t"
  75953. "lsr r7, r8, #16\n\t"
  75954. "mul r7, r6, r7\n\t"
  75955. "add r4, r4, r7\n\t"
  75956. "lsl r7, r8, #16\n\t"
  75957. "lsr r7, r7, #16\n\t"
  75958. "mul r6, r7, r6\n\t"
  75959. "lsr r7, r6, #16\n\t"
  75960. "lsl r6, r6, #16\n\t"
  75961. "adds r3, r3, r6\n\t"
  75962. "adc r4, r4, r7\n\t"
  75963. #else
  75964. "umlal r3, r4, %[b], r8\n\t"
  75965. #endif
  75966. "stm %[r]!, {r3}\n\t"
  75967. "mov r5, #0\n\t"
  75968. /* A[7] * B */
  75969. "ldm %[a]!, {r8}\n\t"
  75970. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  75971. "lsl r6, %[b], #16\n\t"
  75972. "lsl r7, r8, #16\n\t"
  75973. "lsr r6, r6, #16\n\t"
  75974. "lsr r7, r7, #16\n\t"
  75975. "mul r7, r6, r7\n\t"
  75976. "adds r4, r4, r7\n\t"
  75977. "adc r5, r5, #0\n\t"
  75978. "lsr r7, r8, #16\n\t"
  75979. "mul r6, r7, r6\n\t"
  75980. "lsr r7, r6, #16\n\t"
  75981. "lsl r6, r6, #16\n\t"
  75982. "adds r4, r4, r6\n\t"
  75983. "adc r5, r5, r7\n\t"
  75984. "lsr r6, %[b], #16\n\t"
  75985. "lsr r7, r8, #16\n\t"
  75986. "mul r7, r6, r7\n\t"
  75987. "add r5, r5, r7\n\t"
  75988. "lsl r7, r8, #16\n\t"
  75989. "lsr r7, r7, #16\n\t"
  75990. "mul r6, r7, r6\n\t"
  75991. "lsr r7, r6, #16\n\t"
  75992. "lsl r6, r6, #16\n\t"
  75993. "adds r4, r4, r6\n\t"
  75994. "adc r5, r5, r7\n\t"
  75995. #else
  75996. "umlal r4, r5, %[b], r8\n\t"
  75997. #endif
  75998. "stm %[r]!, {r4}\n\t"
  75999. "str r5, [%[r]]\n\t"
  76000. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  76001. :
  76002. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "cc"
  76003. );
  76004. }
  76005. #endif /* WOLFSSL_SP_SMALL */
  76006. #ifdef WOLFSSL_SP_USE_UDIV
  76007. /* Divide the double width number (d1|d0) by the divisor. (d1|d0 / div)
  76008. *
  76009. * d1 The high order half of the number to divide.
  76010. * d0 The low order half of the number to divide.
  76011. * div The divisor.
  76012. * returns the result of the division.
  76013. *
  76014. * Note that this is an approximate div. It may give an answer 1 larger.
  76015. */
  76016. static sp_digit div_256_word_8(sp_digit d1_p, sp_digit d0_p, sp_digit div_p)
  76017. {
  76018. register sp_digit d1 asm ("r0") = (sp_digit)d1_p;
  76019. register sp_digit d0 asm ("r1") = (sp_digit)d0_p;
  76020. register sp_digit div asm ("r2") = (sp_digit)div_p;
  76021. __asm__ __volatile__ (
  76022. "lsr r6, %[div], #16\n\t"
  76023. "add lr, r6, #1\n\t"
  76024. "udiv r4, %[d1], lr\n\t"
  76025. "lsl r5, %[div], #16\n\t"
  76026. "lsl r4, r4, #16\n\t"
  76027. "umull r3, r12, %[div], r4\n\t"
  76028. "subs %[d0], %[d0], r3\n\t"
  76029. "sbc %[d1], %[d1], r12\n\t"
  76030. "subs r3, %[d1], lr\n\t"
  76031. "sbc r7, r7, r7\n\t"
  76032. "add r7, r7, #1\n\t"
  76033. "rsb r8, r7, #0\n\t"
  76034. "lsl r7, r7, #16\n\t"
  76035. "and r5, r5, r8\n\t"
  76036. "and r6, r6, r8\n\t"
  76037. "subs %[d0], %[d0], r5\n\t"
  76038. "add r4, r4, r7\n\t"
  76039. "sbc %[d1], %[d1], r6\n\t"
  76040. "lsl r12, %[d1], #16\n\t"
  76041. "lsr r3, %[d0], #16\n\t"
  76042. "orr r3, r3, r12\n\t"
  76043. "udiv r3, r3, lr\n\t"
  76044. "add r4, r4, r3\n\t"
  76045. "umull r3, r12, %[div], r3\n\t"
  76046. "subs %[d0], %[d0], r3\n\t"
  76047. "sbc %[d1], %[d1], r12\n\t"
  76048. "lsl r12, %[d1], #16\n\t"
  76049. "lsr r3, %[d0], #16\n\t"
  76050. "orr r3, r3, r12\n\t"
  76051. "udiv r3, r3, lr\n\t"
  76052. "add r4, r4, r3\n\t"
  76053. "mul r3, %[div], r3\n\t"
  76054. "sub %[d0], %[d0], r3\n\t"
  76055. "udiv r3, %[d0], %[div]\n\t"
  76056. "add %[d1], r4, r3\n\t"
  76057. : [d1] "+r" (d1), [d0] "+r" (d0), [div] "+r" (div)
  76058. :
  76059. : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8", "cc"
  76060. );
  76061. return (uint32_t)(size_t)d1;
  76062. }
  76063. #else
  76064. /* Divide the double width number (d1|d0) by the divisor. (d1|d0 / div)
  76065. *
  76066. * d1 The high order half of the number to divide.
  76067. * d0 The low order half of the number to divide.
  76068. * div The divisor.
  76069. * returns the result of the division.
  76070. *
  76071. * Note that this is an approximate div. It may give an answer 1 larger.
  76072. */
  76073. static sp_digit div_256_word_8(sp_digit d1_p, sp_digit d0_p, sp_digit div_p)
  76074. {
  76075. register sp_digit d1 asm ("r0") = (sp_digit)d1_p;
  76076. register sp_digit d0 asm ("r1") = (sp_digit)d0_p;
  76077. register sp_digit div asm ("r2") = (sp_digit)div_p;
  76078. __asm__ __volatile__ (
  76079. "lsr lr, %[div], #1\n\t"
  76080. "add lr, lr, #1\n\t"
  76081. "mov r4, %[d0]\n\t"
  76082. "mov r5, %[d1]\n\t"
  76083. /* Do top 32 */
  76084. "subs r6, lr, r5\n\t"
  76085. "sbc r6, r6, r6\n\t"
  76086. "mov r3, #0\n\t"
  76087. "sub r3, r3, r6\n\t"
  76088. "and r6, r6, lr\n\t"
  76089. "subs r5, r5, r6\n\t"
  76090. /* Next 30 bits */
  76091. "mov r12, #29\n\t"
  76092. "\n"
  76093. "L_div_256_word_8_bit_%=: \n\t"
  76094. "lsls r4, r4, #1\n\t"
  76095. "adc r5, r5, r5\n\t"
  76096. "subs r6, lr, r5\n\t"
  76097. "sbc r6, r6, r6\n\t"
  76098. "add r3, r3, r3\n\t"
  76099. "sub r3, r3, r6\n\t"
  76100. "and r6, r6, lr\n\t"
  76101. "subs r5, r5, r6\n\t"
  76102. "subs r12, r12, #1\n\t"
  76103. "bpl L_div_256_word_8_bit_%=\n\t"
  76104. "add r3, r3, r3\n\t"
  76105. "add r3, r3, #1\n\t"
  76106. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  76107. "lsl r7, r3, #16\n\t"
  76108. "lsl r4, %[div], #16\n\t"
  76109. "lsr r7, r7, #16\n\t"
  76110. "lsr r4, r4, #16\n\t"
  76111. "mul r4, r7, r4\n\t"
  76112. "lsr r8, %[div], #16\n\t"
  76113. "mul r7, r8, r7\n\t"
  76114. "lsr r5, r7, #16\n\t"
  76115. "lsl r7, r7, #16\n\t"
  76116. "adds r4, r4, r7\n\t"
  76117. "adc r5, r5, #0\n\t"
  76118. "lsr r7, r3, #16\n\t"
  76119. "mul r8, r7, r8\n\t"
  76120. "add r5, r5, r8\n\t"
  76121. "lsl r8, %[div], #16\n\t"
  76122. "lsr r8, r8, #16\n\t"
  76123. "mul r7, r8, r7\n\t"
  76124. "lsr r8, r7, #16\n\t"
  76125. "lsl r7, r7, #16\n\t"
  76126. "adds r4, r4, r7\n\t"
  76127. "adc r5, r5, r8\n\t"
  76128. #else
  76129. "umull r4, r5, r3, %[div]\n\t"
  76130. #endif
  76131. "subs r7, %[d0], r4\n\t"
  76132. "sbc r8, %[d1], r5\n\t"
  76133. "add r3, r3, r8\n\t"
  76134. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  76135. "lsl r7, r3, #16\n\t"
  76136. "lsl r4, %[div], #16\n\t"
  76137. "lsr r7, r7, #16\n\t"
  76138. "lsr r4, r4, #16\n\t"
  76139. "mul r4, r7, r4\n\t"
  76140. "lsr r8, %[div], #16\n\t"
  76141. "mul r7, r8, r7\n\t"
  76142. "lsr r5, r7, #16\n\t"
  76143. "lsl r7, r7, #16\n\t"
  76144. "adds r4, r4, r7\n\t"
  76145. "adc r5, r5, #0\n\t"
  76146. "lsr r7, r3, #16\n\t"
  76147. "mul r8, r7, r8\n\t"
  76148. "add r5, r5, r8\n\t"
  76149. "lsl r8, %[div], #16\n\t"
  76150. "lsr r8, r8, #16\n\t"
  76151. "mul r7, r8, r7\n\t"
  76152. "lsr r8, r7, #16\n\t"
  76153. "lsl r7, r7, #16\n\t"
  76154. "adds r4, r4, r7\n\t"
  76155. "adc r5, r5, r8\n\t"
  76156. #else
  76157. "umull r4, r5, r3, %[div]\n\t"
  76158. #endif
  76159. "subs r7, %[d0], r4\n\t"
  76160. "sbc r8, %[d1], r5\n\t"
  76161. "add r3, r3, r8\n\t"
  76162. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  76163. "lsl r7, r3, #16\n\t"
  76164. "lsl r4, %[div], #16\n\t"
  76165. "lsr r7, r7, #16\n\t"
  76166. "lsr r4, r4, #16\n\t"
  76167. "mul r4, r7, r4\n\t"
  76168. "lsr r8, %[div], #16\n\t"
  76169. "mul r7, r8, r7\n\t"
  76170. "lsr r5, r7, #16\n\t"
  76171. "lsl r7, r7, #16\n\t"
  76172. "adds r4, r4, r7\n\t"
  76173. "adc r5, r5, #0\n\t"
  76174. "lsr r7, r3, #16\n\t"
  76175. "mul r8, r7, r8\n\t"
  76176. "add r5, r5, r8\n\t"
  76177. "lsl r8, %[div], #16\n\t"
  76178. "lsr r8, r8, #16\n\t"
  76179. "mul r7, r8, r7\n\t"
  76180. "lsr r8, r7, #16\n\t"
  76181. "lsl r7, r7, #16\n\t"
  76182. "adds r4, r4, r7\n\t"
  76183. "adc r5, r5, r8\n\t"
  76184. #else
  76185. "umull r4, r5, r3, %[div]\n\t"
  76186. #endif
  76187. "subs r7, %[d0], r4\n\t"
  76188. "sbc r8, %[d1], r5\n\t"
  76189. "add r3, r3, r8\n\t"
  76190. "subs r6, %[div], r7\n\t"
  76191. "sbc r6, r6, r6\n\t"
  76192. "sub %[d1], r3, r6\n\t"
  76193. : [d1] "+r" (d1), [d0] "+r" (d0), [div] "+r" (div)
  76194. :
  76195. : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8", "cc"
  76196. );
  76197. return (uint32_t)(size_t)d1;
  76198. }
  76199. #endif
  76200. /* AND m into each word of a and store in r.
  76201. *
  76202. * r A single precision integer.
  76203. * a A single precision integer.
  76204. * m Mask to AND against each digit.
  76205. */
  76206. static void sp_256_mask_8(sp_digit* r, const sp_digit* a, sp_digit m)
  76207. {
  76208. #ifdef WOLFSSL_SP_SMALL
  76209. int i;
  76210. for (i=0; i<8; i++) {
  76211. r[i] = a[i] & m;
  76212. }
  76213. #else
  76214. r[0] = a[0] & m;
  76215. r[1] = a[1] & m;
  76216. r[2] = a[2] & m;
  76217. r[3] = a[3] & m;
  76218. r[4] = a[4] & m;
  76219. r[5] = a[5] & m;
  76220. r[6] = a[6] & m;
  76221. r[7] = a[7] & m;
  76222. #endif
  76223. }
  76224. /* Divide d in a and put remainder into r (m*d + r = a)
  76225. * m is not calculated as it is not needed at this time.
  76226. *
  76227. * a Number to be divided.
  76228. * d Number to divide with.
  76229. * m Multiplier result.
  76230. * r Remainder from the division.
  76231. * returns MP_OKAY indicating success.
  76232. */
  76233. static WC_INLINE int sp_256_div_8(const sp_digit* a, const sp_digit* d,
  76234. sp_digit* m, sp_digit* r)
  76235. {
  76236. sp_digit t1[16], t2[9];
  76237. sp_digit div, r1;
  76238. int i;
  76239. (void)m;
  76240. div = d[7];
  76241. XMEMCPY(t1, a, sizeof(*t1) * 2 * 8);
  76242. r1 = sp_256_cmp_8(&t1[8], d) >= 0;
  76243. sp_256_cond_sub_8(&t1[8], &t1[8], d, (sp_digit)0 - r1);
  76244. for (i = 7; i >= 0; i--) {
  76245. volatile sp_digit mask = (sp_digit)0 - (t1[8 + i] == div);
  76246. sp_digit hi = t1[8 + i] + mask;
  76247. r1 = div_256_word_8(hi, t1[8 + i - 1], div);
  76248. r1 |= mask;
  76249. sp_256_mul_d_8(t2, d, r1);
  76250. t1[8 + i] += sp_256_sub_in_place_8(&t1[i], t2);
  76251. t1[8 + i] -= t2[8];
  76252. sp_256_mask_8(t2, d, t1[8 + i]);
  76253. t1[8 + i] += sp_256_add_8(&t1[i], &t1[i], t2);
  76254. sp_256_mask_8(t2, d, t1[8 + i]);
  76255. t1[8 + i] += sp_256_add_8(&t1[i], &t1[i], t2);
  76256. }
  76257. r1 = sp_256_cmp_8(t1, d) >= 0;
  76258. sp_256_cond_sub_8(r, t1, d, (sp_digit)0 - r1);
  76259. return MP_OKAY;
  76260. }
  76261. /* Reduce a modulo m into r. (r = a mod m)
  76262. *
  76263. * r A single precision number that is the reduced result.
  76264. * a A single precision number that is to be reduced.
  76265. * m A single precision number that is the modulus to reduce with.
  76266. * returns MP_OKAY indicating success.
  76267. */
  76268. static WC_INLINE int sp_256_mod_8(sp_digit* r, const sp_digit* a,
  76269. const sp_digit* m)
  76270. {
  76271. return sp_256_div_8(a, m, NULL, r);
  76272. }
  76273. #endif
  76274. #if defined(HAVE_ECC_SIGN) || defined(HAVE_ECC_VERIFY)
  76275. /* Multiply two number mod the order of P256 curve. (r = a * b mod order)
  76276. *
  76277. * r Result of the multiplication.
  76278. * a First operand of the multiplication.
  76279. * b Second operand of the multiplication.
  76280. */
  76281. static void sp_256_mont_mul_order_8(sp_digit* r, const sp_digit* a, const sp_digit* b)
  76282. {
  76283. sp_256_mul_8(r, a, b);
  76284. sp_256_mont_reduce_order_8(r, p256_order, p256_mp_order);
  76285. }
  76286. #if defined(HAVE_ECC_SIGN) || (defined(HAVE_ECC_VERIFY) && defined(WOLFSSL_SP_SMALL))
  76287. #ifdef WOLFSSL_SP_SMALL
  76288. /* Order-2 for the P256 curve. */
  76289. static const uint32_t p256_order_minus_2[8] = {
  76290. 0xfc63254fU,0xf3b9cac2U,0xa7179e84U,0xbce6faadU,0xffffffffU,0xffffffffU,
  76291. 0x00000000U,0xffffffffU
  76292. };
  76293. #else
  76294. /* The low half of the order-2 of the P256 curve. */
  76295. static const sp_int_digit p256_order_low[4] = {
  76296. 0xfc63254fU,0xf3b9cac2U,0xa7179e84U,0xbce6faadU
  76297. };
  76298. #endif /* WOLFSSL_SP_SMALL */
  76299. /* Square number mod the order of P256 curve. (r = a * a mod order)
  76300. *
  76301. * r Result of the squaring.
  76302. * a Number to square.
  76303. */
  76304. static void sp_256_mont_sqr_order_8(sp_digit* r, const sp_digit* a)
  76305. {
  76306. sp_256_sqr_8(r, a);
  76307. sp_256_mont_reduce_order_8(r, p256_order, p256_mp_order);
  76308. }
  76309. #ifndef WOLFSSL_SP_SMALL
  76310. /* Square number mod the order of P256 curve a number of times.
  76311. * (r = a ^ n mod order)
  76312. *
  76313. * r Result of the squaring.
  76314. * a Number to square.
  76315. */
  76316. static void sp_256_mont_sqr_n_order_8(sp_digit* r, const sp_digit* a, int n)
  76317. {
  76318. int i;
  76319. sp_256_mont_sqr_order_8(r, a);
  76320. for (i=1; i<n; i++) {
  76321. sp_256_mont_sqr_order_8(r, r);
  76322. }
  76323. }
  76324. #endif /* !WOLFSSL_SP_SMALL */
  76325. /* Invert the number, in Montgomery form, modulo the order of the P256 curve.
  76326. * (r = 1 / a mod order)
  76327. *
  76328. * r Inverse result.
  76329. * a Number to invert.
  76330. * td Temporary data.
  76331. */
  76332. #ifdef WOLFSSL_SP_NONBLOCK
  76333. typedef struct sp_256_mont_inv_order_8_ctx {
  76334. int state;
  76335. int i;
  76336. } sp_256_mont_inv_order_8_ctx;
  76337. static int sp_256_mont_inv_order_8_nb(sp_ecc_ctx_t* sp_ctx, sp_digit* r, const sp_digit* a,
  76338. sp_digit* t)
  76339. {
  76340. int err = FP_WOULDBLOCK;
  76341. sp_256_mont_inv_order_8_ctx* ctx = (sp_256_mont_inv_order_8_ctx*)sp_ctx;
  76342. typedef char ctx_size_test[sizeof(sp_256_mont_inv_order_8_ctx) >= sizeof(*sp_ctx) ? -1 : 1];
  76343. (void)sizeof(ctx_size_test);
  76344. switch (ctx->state) {
  76345. case 0:
  76346. XMEMCPY(t, a, sizeof(sp_digit) * 8);
  76347. ctx->i = 254;
  76348. ctx->state = 1;
  76349. break;
  76350. case 1:
  76351. sp_256_mont_sqr_order_8(t, t);
  76352. ctx->state = 2;
  76353. break;
  76354. case 2:
  76355. if ((p256_order_minus_2[ctx->i / 32] & ((sp_int_digit)1 << (ctx->i % 32))) != 0) {
  76356. sp_256_mont_mul_order_8(t, t, a);
  76357. }
  76358. ctx->i--;
  76359. ctx->state = (ctx->i == 0) ? 3 : 1;
  76360. break;
  76361. case 3:
  76362. XMEMCPY(r, t, sizeof(sp_digit) * 8U);
  76363. err = MP_OKAY;
  76364. break;
  76365. }
  76366. return err;
  76367. }
  76368. #endif /* WOLFSSL_SP_NONBLOCK */
  76369. static void sp_256_mont_inv_order_8(sp_digit* r, const sp_digit* a,
  76370. sp_digit* td)
  76371. {
  76372. #ifdef WOLFSSL_SP_SMALL
  76373. sp_digit* t = td;
  76374. int i;
  76375. XMEMCPY(t, a, sizeof(sp_digit) * 8);
  76376. for (i=254; i>=0; i--) {
  76377. sp_256_mont_sqr_order_8(t, t);
  76378. if ((p256_order_minus_2[i / 32] & ((sp_int_digit)1 << (i % 32))) != 0) {
  76379. sp_256_mont_mul_order_8(t, t, a);
  76380. }
  76381. }
  76382. XMEMCPY(r, t, sizeof(sp_digit) * 8U);
  76383. #else
  76384. sp_digit* t = td;
  76385. sp_digit* t2 = td + 2 * 8;
  76386. sp_digit* t3 = td + 4 * 8;
  76387. int i;
  76388. /* t = a^2 */
  76389. sp_256_mont_sqr_order_8(t, a);
  76390. /* t = a^3 = t * a */
  76391. sp_256_mont_mul_order_8(t, t, a);
  76392. /* t2= a^c = t ^ 2 ^ 2 */
  76393. sp_256_mont_sqr_n_order_8(t2, t, 2);
  76394. /* t3= a^f = t2 * t */
  76395. sp_256_mont_mul_order_8(t3, t2, t);
  76396. /* t2= a^f0 = t3 ^ 2 ^ 4 */
  76397. sp_256_mont_sqr_n_order_8(t2, t3, 4);
  76398. /* t = a^ff = t2 * t3 */
  76399. sp_256_mont_mul_order_8(t, t2, t3);
  76400. /* t2= a^ff00 = t ^ 2 ^ 8 */
  76401. sp_256_mont_sqr_n_order_8(t2, t, 8);
  76402. /* t = a^ffff = t2 * t */
  76403. sp_256_mont_mul_order_8(t, t2, t);
  76404. /* t2= a^ffff0000 = t ^ 2 ^ 16 */
  76405. sp_256_mont_sqr_n_order_8(t2, t, 16);
  76406. /* t = a^ffffffff = t2 * t */
  76407. sp_256_mont_mul_order_8(t, t2, t);
  76408. /* t2= a^ffffffff0000000000000000 = t ^ 2 ^ 64 */
  76409. sp_256_mont_sqr_n_order_8(t2, t, 64);
  76410. /* t2= a^ffffffff00000000ffffffff = t2 * t */
  76411. sp_256_mont_mul_order_8(t2, t2, t);
  76412. /* t2= a^ffffffff00000000ffffffff00000000 = t2 ^ 2 ^ 32 */
  76413. sp_256_mont_sqr_n_order_8(t2, t2, 32);
  76414. /* t2= a^ffffffff00000000ffffffffffffffff = t2 * t */
  76415. sp_256_mont_mul_order_8(t2, t2, t);
  76416. /* t2= a^ffffffff00000000ffffffffffffffffbce6 */
  76417. sp_256_mont_sqr_order_8(t2, t2);
  76418. sp_256_mont_mul_order_8(t2, t2, a);
  76419. sp_256_mont_sqr_n_order_8(t2, t2, 5);
  76420. sp_256_mont_mul_order_8(t2, t2, t3);
  76421. for (i=121; i>=112; i--) {
  76422. sp_256_mont_sqr_order_8(t2, t2);
  76423. if ((p256_order_low[i / 32] & ((sp_int_digit)1 << (i % 32))) != 0) {
  76424. sp_256_mont_mul_order_8(t2, t2, a);
  76425. }
  76426. }
  76427. /* t2= a^ffffffff00000000ffffffffffffffffbce6f */
  76428. sp_256_mont_sqr_n_order_8(t2, t2, 4);
  76429. sp_256_mont_mul_order_8(t2, t2, t3);
  76430. /* t2= a^ffffffff00000000ffffffffffffffffbce6faada7179e84 */
  76431. for (i=107; i>=64; i--) {
  76432. sp_256_mont_sqr_order_8(t2, t2);
  76433. if ((p256_order_low[i / 32] & ((sp_int_digit)1 << (i % 32))) != 0) {
  76434. sp_256_mont_mul_order_8(t2, t2, a);
  76435. }
  76436. }
  76437. /* t2= a^ffffffff00000000ffffffffffffffffbce6faada7179e84f */
  76438. sp_256_mont_sqr_n_order_8(t2, t2, 4);
  76439. sp_256_mont_mul_order_8(t2, t2, t3);
  76440. /* t2= a^ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2 */
  76441. for (i=59; i>=32; i--) {
  76442. sp_256_mont_sqr_order_8(t2, t2);
  76443. if ((p256_order_low[i / 32] & ((sp_int_digit)1 << (i % 32))) != 0) {
  76444. sp_256_mont_mul_order_8(t2, t2, a);
  76445. }
  76446. }
  76447. /* t2= a^ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2f */
  76448. sp_256_mont_sqr_n_order_8(t2, t2, 4);
  76449. sp_256_mont_mul_order_8(t2, t2, t3);
  76450. /* t2= a^ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254 */
  76451. for (i=27; i>=0; i--) {
  76452. sp_256_mont_sqr_order_8(t2, t2);
  76453. if ((p256_order_low[i / 32] & ((sp_int_digit)1 << (i % 32))) != 0) {
  76454. sp_256_mont_mul_order_8(t2, t2, a);
  76455. }
  76456. }
  76457. /* t2= a^ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632540 */
  76458. sp_256_mont_sqr_n_order_8(t2, t2, 4);
  76459. /* r = a^ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254f */
  76460. sp_256_mont_mul_order_8(r, t2, t3);
  76461. #endif /* WOLFSSL_SP_SMALL */
  76462. }
  76463. #endif /* HAVE_ECC_SIGN || (HAVE_ECC_VERIFY && WOLFSSL_SP_SMALL) */
  76464. #endif /* HAVE_ECC_SIGN | HAVE_ECC_VERIFY */
  76465. #ifdef HAVE_ECC_SIGN
  76466. #ifndef SP_ECC_MAX_SIG_GEN
  76467. #define SP_ECC_MAX_SIG_GEN 64
  76468. #endif
  76469. /* Calculate second signature value S from R, k and private value.
  76470. *
  76471. * s = (r * x + e) / k
  76472. *
  76473. * s Signature value.
  76474. * r First signature value.
  76475. * k Ephemeral private key.
  76476. * x Private key as a number.
  76477. * e Hash of message as a number.
  76478. * tmp Temporary storage for intermediate numbers.
  76479. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  76480. */
  76481. static int sp_256_calc_s_8(sp_digit* s, const sp_digit* r, sp_digit* k,
  76482. sp_digit* x, const sp_digit* e, sp_digit* tmp)
  76483. {
  76484. int err;
  76485. sp_digit carry;
  76486. sp_int32 c;
  76487. sp_digit* kInv = k;
  76488. /* Conv k to Montgomery form (mod order) */
  76489. sp_256_mul_8(k, k, p256_norm_order);
  76490. err = sp_256_mod_8(k, k, p256_order);
  76491. if (err == MP_OKAY) {
  76492. sp_256_norm_8(k);
  76493. /* kInv = 1/k mod order */
  76494. sp_256_mont_inv_order_8(kInv, k, tmp);
  76495. sp_256_norm_8(kInv);
  76496. /* s = r * x + e */
  76497. sp_256_mul_8(x, x, r);
  76498. err = sp_256_mod_8(x, x, p256_order);
  76499. }
  76500. if (err == MP_OKAY) {
  76501. sp_256_norm_8(x);
  76502. carry = sp_256_add_8(s, e, x);
  76503. sp_256_cond_sub_8(s, s, p256_order, 0 - carry);
  76504. sp_256_norm_8(s);
  76505. c = sp_256_cmp_8(s, p256_order);
  76506. sp_256_cond_sub_8(s, s, p256_order,
  76507. (sp_digit)0 - (sp_digit)(c >= 0));
  76508. sp_256_norm_8(s);
  76509. /* s = s * k^-1 mod order */
  76510. sp_256_mont_mul_order_8(s, s, kInv);
  76511. sp_256_norm_8(s);
  76512. }
  76513. return err;
  76514. }
  76515. /* Sign the hash using the private key.
  76516. * e = [hash, 256 bits] from binary
  76517. * r = (k.G)->x mod order
  76518. * s = (r * x + e) / k mod order
  76519. * The hash is truncated to the first 256 bits.
  76520. *
  76521. * hash Hash to sign.
  76522. * hashLen Length of the hash data.
  76523. * rng Random number generator.
  76524. * priv Private part of key - scalar.
  76525. * rm First part of result as an mp_int.
  76526. * sm Sirst part of result as an mp_int.
  76527. * heap Heap to use for allocation.
  76528. * returns RNG failures, MEMORY_E when memory allocation fails and
  76529. * MP_OKAY on success.
  76530. */
  76531. int sp_ecc_sign_256(const byte* hash, word32 hashLen, WC_RNG* rng,
  76532. const mp_int* priv, mp_int* rm, mp_int* sm, mp_int* km, void* heap)
  76533. {
  76534. #ifdef WOLFSSL_SP_SMALL_STACK
  76535. sp_digit* e = NULL;
  76536. sp_point_256* point = NULL;
  76537. #else
  76538. sp_digit e[7 * 2 * 8];
  76539. sp_point_256 point[1];
  76540. #endif
  76541. sp_digit* x = NULL;
  76542. sp_digit* k = NULL;
  76543. sp_digit* r = NULL;
  76544. sp_digit* tmp = NULL;
  76545. sp_digit* s = NULL;
  76546. sp_int32 c;
  76547. int err = MP_OKAY;
  76548. int i;
  76549. (void)heap;
  76550. #ifdef WOLFSSL_SP_SMALL_STACK
  76551. if (err == MP_OKAY) {
  76552. point = (sp_point_256*)XMALLOC(sizeof(sp_point_256), heap,
  76553. DYNAMIC_TYPE_ECC);
  76554. if (point == NULL)
  76555. err = MEMORY_E;
  76556. }
  76557. if (err == MP_OKAY) {
  76558. e = (sp_digit*)XMALLOC(sizeof(sp_digit) * 7 * 2 * 8, heap,
  76559. DYNAMIC_TYPE_ECC);
  76560. if (e == NULL)
  76561. err = MEMORY_E;
  76562. }
  76563. #endif
  76564. if (err == MP_OKAY) {
  76565. x = e + 2 * 8;
  76566. k = e + 4 * 8;
  76567. r = e + 6 * 8;
  76568. tmp = e + 8 * 8;
  76569. s = e;
  76570. if (hashLen > 32U) {
  76571. hashLen = 32U;
  76572. }
  76573. }
  76574. for (i = SP_ECC_MAX_SIG_GEN; err == MP_OKAY && i > 0; i--) {
  76575. /* New random point. */
  76576. if (km == NULL || mp_iszero(km)) {
  76577. err = sp_256_ecc_gen_k_8(rng, k);
  76578. }
  76579. else {
  76580. sp_256_from_mp(k, 8, km);
  76581. mp_zero(km);
  76582. }
  76583. if (err == MP_OKAY) {
  76584. err = sp_256_ecc_mulmod_base_8(point, k, 1, 1, heap);
  76585. }
  76586. if (err == MP_OKAY) {
  76587. /* r = point->x mod order */
  76588. XMEMCPY(r, point->x, sizeof(sp_digit) * 8U);
  76589. sp_256_norm_8(r);
  76590. c = sp_256_cmp_8(r, p256_order);
  76591. sp_256_cond_sub_8(r, r, p256_order,
  76592. (sp_digit)0 - (sp_digit)(c >= 0));
  76593. sp_256_norm_8(r);
  76594. if (!sp_256_iszero_8(r)) {
  76595. /* x is modified in calculation of s. */
  76596. sp_256_from_mp(x, 8, priv);
  76597. /* s ptr == e ptr, e is modified in calculation of s. */
  76598. sp_256_from_bin(e, 8, hash, (int)hashLen);
  76599. err = sp_256_calc_s_8(s, r, k, x, e, tmp);
  76600. /* Check that signature is usable. */
  76601. if ((err == MP_OKAY) && (!sp_256_iszero_8(s))) {
  76602. break;
  76603. }
  76604. }
  76605. }
  76606. #ifdef WOLFSSL_ECDSA_SET_K_ONE_LOOP
  76607. i = 1;
  76608. #endif
  76609. }
  76610. if (i == 0) {
  76611. err = RNG_FAILURE_E;
  76612. }
  76613. if (err == MP_OKAY) {
  76614. err = sp_256_to_mp(r, rm);
  76615. }
  76616. if (err == MP_OKAY) {
  76617. err = sp_256_to_mp(s, sm);
  76618. }
  76619. #ifdef WOLFSSL_SP_SMALL_STACK
  76620. if (e != NULL)
  76621. #endif
  76622. {
  76623. ForceZero(e, sizeof(sp_digit) * 7 * 2 * 8);
  76624. #ifdef WOLFSSL_SP_SMALL_STACK
  76625. XFREE(e, heap, DYNAMIC_TYPE_ECC);
  76626. #endif
  76627. }
  76628. #ifdef WOLFSSL_SP_SMALL_STACK
  76629. if (point != NULL)
  76630. #endif
  76631. {
  76632. ForceZero(point, sizeof(sp_point_256));
  76633. #ifdef WOLFSSL_SP_SMALL_STACK
  76634. XFREE(point, heap, DYNAMIC_TYPE_ECC);
  76635. #endif
  76636. }
  76637. return err;
  76638. }
  76639. #ifdef WOLFSSL_SP_NONBLOCK
  76640. typedef struct sp_ecc_sign_256_ctx {
  76641. int state;
  76642. union {
  76643. sp_256_ecc_mulmod_8_ctx mulmod_ctx;
  76644. sp_256_mont_inv_order_8_ctx mont_inv_order_ctx;
  76645. };
  76646. sp_digit e[2*8];
  76647. sp_digit x[2*8];
  76648. sp_digit k[2*8];
  76649. sp_digit r[2*8];
  76650. sp_digit tmp[3 * 2*8];
  76651. sp_point_256 point;
  76652. sp_digit* s;
  76653. sp_digit* kInv;
  76654. int i;
  76655. } sp_ecc_sign_256_ctx;
  76656. int sp_ecc_sign_256_nb(sp_ecc_ctx_t* sp_ctx, const byte* hash, word32 hashLen, WC_RNG* rng,
  76657. mp_int* priv, mp_int* rm, mp_int* sm, mp_int* km, void* heap)
  76658. {
  76659. int err = FP_WOULDBLOCK;
  76660. sp_ecc_sign_256_ctx* ctx = (sp_ecc_sign_256_ctx*)sp_ctx->data;
  76661. typedef char ctx_size_test[sizeof(sp_ecc_sign_256_ctx) >= sizeof(*sp_ctx) ? -1 : 1];
  76662. (void)sizeof(ctx_size_test);
  76663. switch (ctx->state) {
  76664. case 0: /* INIT */
  76665. ctx->s = ctx->e;
  76666. ctx->kInv = ctx->k;
  76667. ctx->i = SP_ECC_MAX_SIG_GEN;
  76668. ctx->state = 1;
  76669. break;
  76670. case 1: /* GEN */
  76671. /* New random point. */
  76672. if (km == NULL || mp_iszero(km)) {
  76673. err = sp_256_ecc_gen_k_8(rng, ctx->k);
  76674. }
  76675. else {
  76676. sp_256_from_mp(ctx->k, 8, km);
  76677. mp_zero(km);
  76678. }
  76679. XMEMSET(&ctx->mulmod_ctx, 0, sizeof(ctx->mulmod_ctx));
  76680. ctx->state = 2;
  76681. break;
  76682. case 2: /* MULMOD */
  76683. err = sp_256_ecc_mulmod_8_nb((sp_ecc_ctx_t*)&ctx->mulmod_ctx,
  76684. &ctx->point, &p256_base, ctx->k, 1, 1, heap);
  76685. if (err == MP_OKAY) {
  76686. ctx->state = 3;
  76687. }
  76688. break;
  76689. case 3: /* MODORDER */
  76690. {
  76691. sp_int32 c;
  76692. /* r = point->x mod order */
  76693. XMEMCPY(ctx->r, ctx->point.x, sizeof(sp_digit) * 8U);
  76694. sp_256_norm_8(ctx->r);
  76695. c = sp_256_cmp_8(ctx->r, p256_order);
  76696. sp_256_cond_sub_8(ctx->r, ctx->r, p256_order,
  76697. (sp_digit)0 - (sp_digit)(c >= 0));
  76698. sp_256_norm_8(ctx->r);
  76699. if (hashLen > 32U) {
  76700. hashLen = 32U;
  76701. }
  76702. sp_256_from_mp(ctx->x, 8, priv);
  76703. sp_256_from_bin(ctx->e, 8, hash, (int)hashLen);
  76704. ctx->state = 4;
  76705. break;
  76706. }
  76707. case 4: /* KMODORDER */
  76708. /* Conv k to Montgomery form (mod order) */
  76709. sp_256_mul_8(ctx->k, ctx->k, p256_norm_order);
  76710. err = sp_256_mod_8(ctx->k, ctx->k, p256_order);
  76711. if (err == MP_OKAY) {
  76712. sp_256_norm_8(ctx->k);
  76713. XMEMSET(&ctx->mont_inv_order_ctx, 0, sizeof(ctx->mont_inv_order_ctx));
  76714. ctx->state = 5;
  76715. }
  76716. break;
  76717. case 5: /* KINV */
  76718. /* kInv = 1/k mod order */
  76719. err = sp_256_mont_inv_order_8_nb((sp_ecc_ctx_t*)&ctx->mont_inv_order_ctx, ctx->kInv, ctx->k, ctx->tmp);
  76720. if (err == MP_OKAY) {
  76721. XMEMSET(&ctx->mont_inv_order_ctx, 0, sizeof(ctx->mont_inv_order_ctx));
  76722. ctx->state = 6;
  76723. }
  76724. break;
  76725. case 6: /* KINVNORM */
  76726. sp_256_norm_8(ctx->kInv);
  76727. ctx->state = 7;
  76728. break;
  76729. case 7: /* R */
  76730. /* s = r * x + e */
  76731. sp_256_mul_8(ctx->x, ctx->x, ctx->r);
  76732. ctx->state = 8;
  76733. break;
  76734. case 8: /* S1 */
  76735. err = sp_256_mod_8(ctx->x, ctx->x, p256_order);
  76736. if (err == MP_OKAY)
  76737. ctx->state = 9;
  76738. break;
  76739. case 9: /* S2 */
  76740. {
  76741. sp_digit carry;
  76742. sp_int32 c;
  76743. sp_256_norm_8(ctx->x);
  76744. carry = sp_256_add_8(ctx->s, ctx->e, ctx->x);
  76745. sp_256_cond_sub_8(ctx->s, ctx->s,
  76746. p256_order, 0 - carry);
  76747. sp_256_norm_8(ctx->s);
  76748. c = sp_256_cmp_8(ctx->s, p256_order);
  76749. sp_256_cond_sub_8(ctx->s, ctx->s, p256_order,
  76750. (sp_digit)0 - (sp_digit)(c >= 0));
  76751. sp_256_norm_8(ctx->s);
  76752. /* s = s * k^-1 mod order */
  76753. sp_256_mont_mul_order_8(ctx->s, ctx->s, ctx->kInv);
  76754. sp_256_norm_8(ctx->s);
  76755. /* Check that signature is usable. */
  76756. if (sp_256_iszero_8(ctx->s) == 0) {
  76757. ctx->state = 10;
  76758. break;
  76759. }
  76760. #ifdef WOLFSSL_ECDSA_SET_K_ONE_LOOP
  76761. ctx->i = 1;
  76762. #endif
  76763. /* not usable gen, try again */
  76764. ctx->i--;
  76765. if (ctx->i == 0) {
  76766. err = RNG_FAILURE_E;
  76767. }
  76768. ctx->state = 1;
  76769. break;
  76770. }
  76771. case 10: /* RES */
  76772. err = sp_256_to_mp(ctx->r, rm);
  76773. if (err == MP_OKAY) {
  76774. err = sp_256_to_mp(ctx->s, sm);
  76775. }
  76776. break;
  76777. }
  76778. if (err == MP_OKAY && ctx->state != 10) {
  76779. err = FP_WOULDBLOCK;
  76780. }
  76781. if (err != FP_WOULDBLOCK) {
  76782. XMEMSET(ctx->e, 0, sizeof(sp_digit) * 2U * 8U);
  76783. XMEMSET(ctx->x, 0, sizeof(sp_digit) * 2U * 8U);
  76784. XMEMSET(ctx->k, 0, sizeof(sp_digit) * 2U * 8U);
  76785. XMEMSET(ctx->r, 0, sizeof(sp_digit) * 2U * 8U);
  76786. XMEMSET(ctx->tmp, 0, sizeof(sp_digit) * 3U * 2U * 8U);
  76787. }
  76788. return err;
  76789. }
  76790. #endif /* WOLFSSL_SP_NONBLOCK */
  76791. #endif /* HAVE_ECC_SIGN */
  76792. #ifndef WOLFSSL_SP_SMALL
  76793. #ifdef WOLFSSL_SP_SMALL
  76794. /* Sub b from a into r. (r = a - b)
  76795. *
  76796. * r A single precision integer.
  76797. * a A single precision integer.
  76798. * b A single precision integer.
  76799. */
  76800. static sp_digit sp_256_sub_8(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p)
  76801. {
  76802. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  76803. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  76804. register const sp_digit* b asm ("r2") = (const sp_digit*)b_p;
  76805. __asm__ __volatile__ (
  76806. "mov r12, #0\n\t"
  76807. "add lr, %[a], #32\n\t"
  76808. "\n"
  76809. "L_sp_256_sub_8_word_%=: \n\t"
  76810. "rsbs r12, r12, #0\n\t"
  76811. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  76812. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  76813. "sbcs r3, r3, r7\n\t"
  76814. "sbcs r4, r4, r8\n\t"
  76815. "sbcs r5, r5, r9\n\t"
  76816. "sbcs r6, r6, r10\n\t"
  76817. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  76818. "sbc r12, r3, r3\n\t"
  76819. "cmp %[a], lr\n\t"
  76820. "bne L_sp_256_sub_8_word_%=\n\t"
  76821. "mov %[r], r12\n\t"
  76822. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  76823. :
  76824. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r12", "lr", "cc"
  76825. );
  76826. return (uint32_t)(size_t)r;
  76827. }
  76828. #else
  76829. /* Sub b from a into r. (r = a - b)
  76830. *
  76831. * r A single precision integer.
  76832. * a A single precision integer.
  76833. * b A single precision integer.
  76834. */
  76835. static sp_digit sp_256_sub_8(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p)
  76836. {
  76837. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  76838. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  76839. register const sp_digit* b asm ("r2") = (const sp_digit*)b_p;
  76840. __asm__ __volatile__ (
  76841. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  76842. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  76843. "subs r3, r3, r7\n\t"
  76844. "sbcs r4, r4, r8\n\t"
  76845. "sbcs r5, r5, r9\n\t"
  76846. "sbcs r6, r6, r10\n\t"
  76847. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  76848. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  76849. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  76850. "sbcs r3, r3, r7\n\t"
  76851. "sbcs r4, r4, r8\n\t"
  76852. "sbcs r5, r5, r9\n\t"
  76853. "sbcs r6, r6, r10\n\t"
  76854. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  76855. "sbc %[r], r6, r6\n\t"
  76856. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  76857. :
  76858. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "cc"
  76859. );
  76860. return (uint32_t)(size_t)r;
  76861. }
  76862. #endif /* WOLFSSL_SP_SMALL */
  76863. static void sp_256_rshift1_8(sp_digit* r_p, const sp_digit* a_p)
  76864. {
  76865. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  76866. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  76867. __asm__ __volatile__ (
  76868. "mov r12, #0\n\t"
  76869. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  76870. "ldr r2, [%[a], #16]\n\t"
  76871. "ldr r3, [%[a], #20]\n\t"
  76872. #else
  76873. "ldrd r2, r3, [%[a], #16]\n\t"
  76874. #endif
  76875. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  76876. "ldr r4, [%[a], #24]\n\t"
  76877. "ldr r5, [%[a], #28]\n\t"
  76878. #else
  76879. "ldrd r4, r5, [%[a], #24]\n\t"
  76880. #endif
  76881. "lsr r6, r2, #1\n\t"
  76882. "lsr r7, r3, #1\n\t"
  76883. "lsr r8, r4, #1\n\t"
  76884. "lsr r9, r5, #1\n\t"
  76885. "orr r6, r6, r3, lsl #31\n\t"
  76886. "orr r7, r7, r4, lsl #31\n\t"
  76887. "orr r8, r8, r5, lsl #31\n\t"
  76888. "orr r9, r9, r12, lsl #31\n\t"
  76889. "mov r12, r2\n\t"
  76890. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  76891. "str r6, [%[r], #16]\n\t"
  76892. "str r7, [%[r], #20]\n\t"
  76893. #else
  76894. "strd r6, r7, [%[r], #16]\n\t"
  76895. #endif
  76896. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  76897. "str r8, [%[r], #24]\n\t"
  76898. "str r9, [%[r], #28]\n\t"
  76899. #else
  76900. "strd r8, r9, [%[r], #24]\n\t"
  76901. #endif
  76902. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  76903. "ldr r2, [%[a]]\n\t"
  76904. "ldr r3, [%[a], #4]\n\t"
  76905. #else
  76906. "ldrd r2, r3, [%[a]]\n\t"
  76907. #endif
  76908. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  76909. "ldr r4, [%[a], #8]\n\t"
  76910. "ldr r5, [%[a], #12]\n\t"
  76911. #else
  76912. "ldrd r4, r5, [%[a], #8]\n\t"
  76913. #endif
  76914. "lsr r6, r2, #1\n\t"
  76915. "lsr r7, r3, #1\n\t"
  76916. "lsr r8, r4, #1\n\t"
  76917. "lsr r9, r5, #1\n\t"
  76918. "orr r6, r6, r3, lsl #31\n\t"
  76919. "orr r7, r7, r4, lsl #31\n\t"
  76920. "orr r8, r8, r5, lsl #31\n\t"
  76921. "orr r9, r9, r12, lsl #31\n\t"
  76922. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  76923. "str r6, [%[r]]\n\t"
  76924. "str r7, [%[r], #4]\n\t"
  76925. #else
  76926. "strd r6, r7, [%[r]]\n\t"
  76927. #endif
  76928. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  76929. "str r8, [%[r], #8]\n\t"
  76930. "str r9, [%[r], #12]\n\t"
  76931. #else
  76932. "strd r8, r9, [%[r], #8]\n\t"
  76933. #endif
  76934. : [r] "+r" (r), [a] "+r" (a)
  76935. :
  76936. : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r12", "lr", "r10", "cc"
  76937. );
  76938. }
  76939. /* Divide the number by 2 mod the modulus. (r = a / 2 % m)
  76940. *
  76941. * r Result of division by 2.
  76942. * a Number to divide.
  76943. * m Modulus.
  76944. */
  76945. static void sp_256_div2_mod_8(sp_digit* r_p, const sp_digit* a_p, const sp_digit* m_p)
  76946. {
  76947. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  76948. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  76949. register const sp_digit* m asm ("r2") = (const sp_digit*)m_p;
  76950. __asm__ __volatile__ (
  76951. "mov r12, #0\n\t"
  76952. "ldm %[a]!, {r4}\n\t"
  76953. "ands r3, r4, #1\n\t"
  76954. "beq L_sp_256_div2_mod_8_even_%=\n\t"
  76955. "ldm %[a]!, {r5, r6, r7}\n\t"
  76956. "ldm %[m]!, {r8, r9, r10, r11}\n\t"
  76957. "adds r4, r4, r8\n\t"
  76958. "adcs r5, r5, r9\n\t"
  76959. "adcs r6, r6, r10\n\t"
  76960. "adcs r7, r7, r11\n\t"
  76961. "stm %[r], {r4, r5, r6, r7}\n\t"
  76962. "ldm %[a]!, {r4, r5, r6, r7}\n\t"
  76963. "ldm %[m]!, {r8, r9, r10, r11}\n\t"
  76964. "adcs r4, r4, r8\n\t"
  76965. "adcs r5, r5, r9\n\t"
  76966. "adcs r6, r6, r10\n\t"
  76967. "adcs r7, r7, r11\n\t"
  76968. "adc r3, r12, r12\n\t"
  76969. "b L_sp_256_div2_mod_8_div2_%=\n\t"
  76970. "\n"
  76971. "L_sp_256_div2_mod_8_even_%=: \n\t"
  76972. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  76973. "ldr r4, [%[a], #12]\n\t"
  76974. "ldr r5, [%[a], #16]\n\t"
  76975. #else
  76976. "ldrd r4, r5, [%[a], #12]\n\t"
  76977. #endif
  76978. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  76979. "ldr r6, [%[a], #20]\n\t"
  76980. "ldr r7, [%[a], #24]\n\t"
  76981. #else
  76982. "ldrd r6, r7, [%[a], #20]\n\t"
  76983. #endif
  76984. "\n"
  76985. "L_sp_256_div2_mod_8_div2_%=: \n\t"
  76986. "lsr r8, r4, #1\n\t"
  76987. "and r4, r4, #1\n\t"
  76988. "lsr r9, r5, #1\n\t"
  76989. "lsr r10, r6, #1\n\t"
  76990. "lsr r11, r7, #1\n\t"
  76991. "orr r8, r8, r5, lsl #31\n\t"
  76992. "orr r9, r9, r6, lsl #31\n\t"
  76993. "orr r10, r10, r7, lsl #31\n\t"
  76994. "orr r11, r11, r3, lsl #31\n\t"
  76995. "mov r3, r4\n\t"
  76996. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  76997. "str r8, [%[r], #16]\n\t"
  76998. "str r9, [%[r], #20]\n\t"
  76999. #else
  77000. "strd r8, r9, [%[r], #16]\n\t"
  77001. #endif
  77002. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  77003. "str r10, [%[r], #24]\n\t"
  77004. "str r11, [%[r], #28]\n\t"
  77005. #else
  77006. "strd r10, r11, [%[r], #24]\n\t"
  77007. #endif
  77008. "ldm %[r], {r4, r5, r6, r7}\n\t"
  77009. "lsr r8, r4, #1\n\t"
  77010. "lsr r9, r5, #1\n\t"
  77011. "lsr r10, r6, #1\n\t"
  77012. "lsr r11, r7, #1\n\t"
  77013. "orr r8, r8, r5, lsl #31\n\t"
  77014. "orr r9, r9, r6, lsl #31\n\t"
  77015. "orr r10, r10, r7, lsl #31\n\t"
  77016. "orr r11, r11, r3, lsl #31\n\t"
  77017. "stm %[r], {r8, r9, r10, r11}\n\t"
  77018. : [r] "+r" (r), [a] "+r" (a), [m] "+r" (m)
  77019. :
  77020. : "memory", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r3", "r12", "cc"
  77021. );
  77022. }
  77023. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  77024. static const unsigned char L_sp_256_num_bits_8_table[] = {
  77025. 0x00, 0x01, 0x02, 0x02, 0x03, 0x03, 0x03, 0x03,
  77026. 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04,
  77027. 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05,
  77028. 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05,
  77029. 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
  77030. 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
  77031. 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
  77032. 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
  77033. 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07,
  77034. 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07,
  77035. 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07,
  77036. 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07,
  77037. 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07,
  77038. 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07,
  77039. 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07,
  77040. 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07,
  77041. 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
  77042. 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
  77043. 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
  77044. 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
  77045. 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
  77046. 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
  77047. 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
  77048. 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
  77049. 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
  77050. 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
  77051. 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
  77052. 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
  77053. 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
  77054. 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
  77055. 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
  77056. 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
  77057. };
  77058. static int sp_256_num_bits_8(const sp_digit* a_p)
  77059. {
  77060. register const sp_digit* a asm ("r0") = (const sp_digit*)a_p;
  77061. register unsigned char* L_sp_256_num_bits_8_table_c asm ("r1") = (unsigned char*)&L_sp_256_num_bits_8_table;
  77062. __asm__ __volatile__ (
  77063. "mov lr, %[L_sp_256_num_bits_8_table]\n\t"
  77064. "ldr r1, [%[a], #28]\n\t"
  77065. "cmp r1, #0\n\t"
  77066. "beq L_sp_256_num_bits_8_7_%=\n\t"
  77067. "lsr r3, r1, #24\n\t"
  77068. "cmp r3, #0\n\t"
  77069. "beq L_sp_256_num_bits_8_7_3_%=\n\t"
  77070. "mov r2, #0xf8\n\t"
  77071. "ldrb r12, [lr, r3]\n\t"
  77072. "add r12, r2, r12\n\t"
  77073. "b L_sp_256_num_bits_8_9_%=\n\t"
  77074. "\n"
  77075. "L_sp_256_num_bits_8_7_3_%=: \n\t"
  77076. "lsr r3, r1, #16\n\t"
  77077. "and r3, r3, #0xff\n\t"
  77078. "cmp r3, #0\n\t"
  77079. "beq L_sp_256_num_bits_8_7_2_%=\n\t"
  77080. "mov r2, #0xf0\n\t"
  77081. "ldrb r12, [lr, r3]\n\t"
  77082. "add r12, r2, r12\n\t"
  77083. "b L_sp_256_num_bits_8_9_%=\n\t"
  77084. "\n"
  77085. "L_sp_256_num_bits_8_7_2_%=: \n\t"
  77086. "lsr r3, r1, #8\n\t"
  77087. "and r3, r3, #0xff\n\t"
  77088. "cmp r3, #0\n\t"
  77089. "beq L_sp_256_num_bits_8_7_1_%=\n\t"
  77090. "mov r2, #0xe8\n\t"
  77091. "ldrb r12, [lr, r3]\n\t"
  77092. "add r12, r2, r12\n\t"
  77093. "b L_sp_256_num_bits_8_9_%=\n\t"
  77094. "\n"
  77095. "L_sp_256_num_bits_8_7_1_%=: \n\t"
  77096. "and r3, r1, #0xff\n\t"
  77097. "mov r2, #0xe0\n\t"
  77098. "ldrb r12, [lr, r3]\n\t"
  77099. "add r12, r2, r12\n\t"
  77100. "b L_sp_256_num_bits_8_9_%=\n\t"
  77101. "\n"
  77102. "L_sp_256_num_bits_8_7_%=: \n\t"
  77103. "ldr r1, [%[a], #24]\n\t"
  77104. "cmp r1, #0\n\t"
  77105. "beq L_sp_256_num_bits_8_6_%=\n\t"
  77106. "lsr r3, r1, #24\n\t"
  77107. "cmp r3, #0\n\t"
  77108. "beq L_sp_256_num_bits_8_6_3_%=\n\t"
  77109. "mov r2, #0xd8\n\t"
  77110. "ldrb r12, [lr, r3]\n\t"
  77111. "add r12, r2, r12\n\t"
  77112. "b L_sp_256_num_bits_8_9_%=\n\t"
  77113. "\n"
  77114. "L_sp_256_num_bits_8_6_3_%=: \n\t"
  77115. "lsr r3, r1, #16\n\t"
  77116. "and r3, r3, #0xff\n\t"
  77117. "cmp r3, #0\n\t"
  77118. "beq L_sp_256_num_bits_8_6_2_%=\n\t"
  77119. "mov r2, #0xd0\n\t"
  77120. "ldrb r12, [lr, r3]\n\t"
  77121. "add r12, r2, r12\n\t"
  77122. "b L_sp_256_num_bits_8_9_%=\n\t"
  77123. "\n"
  77124. "L_sp_256_num_bits_8_6_2_%=: \n\t"
  77125. "lsr r3, r1, #8\n\t"
  77126. "and r3, r3, #0xff\n\t"
  77127. "cmp r3, #0\n\t"
  77128. "beq L_sp_256_num_bits_8_6_1_%=\n\t"
  77129. "mov r2, #0xc8\n\t"
  77130. "ldrb r12, [lr, r3]\n\t"
  77131. "add r12, r2, r12\n\t"
  77132. "b L_sp_256_num_bits_8_9_%=\n\t"
  77133. "\n"
  77134. "L_sp_256_num_bits_8_6_1_%=: \n\t"
  77135. "and r3, r1, #0xff\n\t"
  77136. "mov r2, #0xc0\n\t"
  77137. "ldrb r12, [lr, r3]\n\t"
  77138. "add r12, r2, r12\n\t"
  77139. "b L_sp_256_num_bits_8_9_%=\n\t"
  77140. "\n"
  77141. "L_sp_256_num_bits_8_6_%=: \n\t"
  77142. "ldr r1, [%[a], #20]\n\t"
  77143. "cmp r1, #0\n\t"
  77144. "beq L_sp_256_num_bits_8_5_%=\n\t"
  77145. "lsr r3, r1, #24\n\t"
  77146. "cmp r3, #0\n\t"
  77147. "beq L_sp_256_num_bits_8_5_3_%=\n\t"
  77148. "mov r2, #0xb8\n\t"
  77149. "ldrb r12, [lr, r3]\n\t"
  77150. "add r12, r2, r12\n\t"
  77151. "b L_sp_256_num_bits_8_9_%=\n\t"
  77152. "\n"
  77153. "L_sp_256_num_bits_8_5_3_%=: \n\t"
  77154. "lsr r3, r1, #16\n\t"
  77155. "and r3, r3, #0xff\n\t"
  77156. "cmp r3, #0\n\t"
  77157. "beq L_sp_256_num_bits_8_5_2_%=\n\t"
  77158. "mov r2, #0xb0\n\t"
  77159. "ldrb r12, [lr, r3]\n\t"
  77160. "add r12, r2, r12\n\t"
  77161. "b L_sp_256_num_bits_8_9_%=\n\t"
  77162. "\n"
  77163. "L_sp_256_num_bits_8_5_2_%=: \n\t"
  77164. "lsr r3, r1, #8\n\t"
  77165. "and r3, r3, #0xff\n\t"
  77166. "cmp r3, #0\n\t"
  77167. "beq L_sp_256_num_bits_8_5_1_%=\n\t"
  77168. "mov r2, #0xa8\n\t"
  77169. "ldrb r12, [lr, r3]\n\t"
  77170. "add r12, r2, r12\n\t"
  77171. "b L_sp_256_num_bits_8_9_%=\n\t"
  77172. "\n"
  77173. "L_sp_256_num_bits_8_5_1_%=: \n\t"
  77174. "and r3, r1, #0xff\n\t"
  77175. "mov r2, #0xa0\n\t"
  77176. "ldrb r12, [lr, r3]\n\t"
  77177. "add r12, r2, r12\n\t"
  77178. "b L_sp_256_num_bits_8_9_%=\n\t"
  77179. "\n"
  77180. "L_sp_256_num_bits_8_5_%=: \n\t"
  77181. "ldr r1, [%[a], #16]\n\t"
  77182. "cmp r1, #0\n\t"
  77183. "beq L_sp_256_num_bits_8_4_%=\n\t"
  77184. "lsr r3, r1, #24\n\t"
  77185. "cmp r3, #0\n\t"
  77186. "beq L_sp_256_num_bits_8_4_3_%=\n\t"
  77187. "mov r2, #0x98\n\t"
  77188. "ldrb r12, [lr, r3]\n\t"
  77189. "add r12, r2, r12\n\t"
  77190. "b L_sp_256_num_bits_8_9_%=\n\t"
  77191. "\n"
  77192. "L_sp_256_num_bits_8_4_3_%=: \n\t"
  77193. "lsr r3, r1, #16\n\t"
  77194. "and r3, r3, #0xff\n\t"
  77195. "cmp r3, #0\n\t"
  77196. "beq L_sp_256_num_bits_8_4_2_%=\n\t"
  77197. "mov r2, #0x90\n\t"
  77198. "ldrb r12, [lr, r3]\n\t"
  77199. "add r12, r2, r12\n\t"
  77200. "b L_sp_256_num_bits_8_9_%=\n\t"
  77201. "\n"
  77202. "L_sp_256_num_bits_8_4_2_%=: \n\t"
  77203. "lsr r3, r1, #8\n\t"
  77204. "and r3, r3, #0xff\n\t"
  77205. "cmp r3, #0\n\t"
  77206. "beq L_sp_256_num_bits_8_4_1_%=\n\t"
  77207. "mov r2, #0x88\n\t"
  77208. "ldrb r12, [lr, r3]\n\t"
  77209. "add r12, r2, r12\n\t"
  77210. "b L_sp_256_num_bits_8_9_%=\n\t"
  77211. "\n"
  77212. "L_sp_256_num_bits_8_4_1_%=: \n\t"
  77213. "and r3, r1, #0xff\n\t"
  77214. "mov r2, #0x80\n\t"
  77215. "ldrb r12, [lr, r3]\n\t"
  77216. "add r12, r2, r12\n\t"
  77217. "b L_sp_256_num_bits_8_9_%=\n\t"
  77218. "\n"
  77219. "L_sp_256_num_bits_8_4_%=: \n\t"
  77220. "ldr r1, [%[a], #12]\n\t"
  77221. "cmp r1, #0\n\t"
  77222. "beq L_sp_256_num_bits_8_3_%=\n\t"
  77223. "lsr r3, r1, #24\n\t"
  77224. "cmp r3, #0\n\t"
  77225. "beq L_sp_256_num_bits_8_3_3_%=\n\t"
  77226. "mov r2, #0x78\n\t"
  77227. "ldrb r12, [lr, r3]\n\t"
  77228. "add r12, r2, r12\n\t"
  77229. "b L_sp_256_num_bits_8_9_%=\n\t"
  77230. "\n"
  77231. "L_sp_256_num_bits_8_3_3_%=: \n\t"
  77232. "lsr r3, r1, #16\n\t"
  77233. "and r3, r3, #0xff\n\t"
  77234. "cmp r3, #0\n\t"
  77235. "beq L_sp_256_num_bits_8_3_2_%=\n\t"
  77236. "mov r2, #0x70\n\t"
  77237. "ldrb r12, [lr, r3]\n\t"
  77238. "add r12, r2, r12\n\t"
  77239. "b L_sp_256_num_bits_8_9_%=\n\t"
  77240. "\n"
  77241. "L_sp_256_num_bits_8_3_2_%=: \n\t"
  77242. "lsr r3, r1, #8\n\t"
  77243. "and r3, r3, #0xff\n\t"
  77244. "cmp r3, #0\n\t"
  77245. "beq L_sp_256_num_bits_8_3_1_%=\n\t"
  77246. "mov r2, #0x68\n\t"
  77247. "ldrb r12, [lr, r3]\n\t"
  77248. "add r12, r2, r12\n\t"
  77249. "b L_sp_256_num_bits_8_9_%=\n\t"
  77250. "\n"
  77251. "L_sp_256_num_bits_8_3_1_%=: \n\t"
  77252. "and r3, r1, #0xff\n\t"
  77253. "mov r2, #0x60\n\t"
  77254. "ldrb r12, [lr, r3]\n\t"
  77255. "add r12, r2, r12\n\t"
  77256. "b L_sp_256_num_bits_8_9_%=\n\t"
  77257. "\n"
  77258. "L_sp_256_num_bits_8_3_%=: \n\t"
  77259. "ldr r1, [%[a], #8]\n\t"
  77260. "cmp r1, #0\n\t"
  77261. "beq L_sp_256_num_bits_8_2_%=\n\t"
  77262. "lsr r3, r1, #24\n\t"
  77263. "cmp r3, #0\n\t"
  77264. "beq L_sp_256_num_bits_8_2_3_%=\n\t"
  77265. "mov r2, #0x58\n\t"
  77266. "ldrb r12, [lr, r3]\n\t"
  77267. "add r12, r2, r12\n\t"
  77268. "b L_sp_256_num_bits_8_9_%=\n\t"
  77269. "\n"
  77270. "L_sp_256_num_bits_8_2_3_%=: \n\t"
  77271. "lsr r3, r1, #16\n\t"
  77272. "and r3, r3, #0xff\n\t"
  77273. "cmp r3, #0\n\t"
  77274. "beq L_sp_256_num_bits_8_2_2_%=\n\t"
  77275. "mov r2, #0x50\n\t"
  77276. "ldrb r12, [lr, r3]\n\t"
  77277. "add r12, r2, r12\n\t"
  77278. "b L_sp_256_num_bits_8_9_%=\n\t"
  77279. "\n"
  77280. "L_sp_256_num_bits_8_2_2_%=: \n\t"
  77281. "lsr r3, r1, #8\n\t"
  77282. "and r3, r3, #0xff\n\t"
  77283. "cmp r3, #0\n\t"
  77284. "beq L_sp_256_num_bits_8_2_1_%=\n\t"
  77285. "mov r2, #0x48\n\t"
  77286. "ldrb r12, [lr, r3]\n\t"
  77287. "add r12, r2, r12\n\t"
  77288. "b L_sp_256_num_bits_8_9_%=\n\t"
  77289. "\n"
  77290. "L_sp_256_num_bits_8_2_1_%=: \n\t"
  77291. "and r3, r1, #0xff\n\t"
  77292. "mov r2, #0x40\n\t"
  77293. "ldrb r12, [lr, r3]\n\t"
  77294. "add r12, r2, r12\n\t"
  77295. "b L_sp_256_num_bits_8_9_%=\n\t"
  77296. "\n"
  77297. "L_sp_256_num_bits_8_2_%=: \n\t"
  77298. "ldr r1, [%[a], #4]\n\t"
  77299. "cmp r1, #0\n\t"
  77300. "beq L_sp_256_num_bits_8_1_%=\n\t"
  77301. "lsr r3, r1, #24\n\t"
  77302. "cmp r3, #0\n\t"
  77303. "beq L_sp_256_num_bits_8_1_3_%=\n\t"
  77304. "mov r2, #56\n\t"
  77305. "ldrb r12, [lr, r3]\n\t"
  77306. "add r12, r2, r12\n\t"
  77307. "b L_sp_256_num_bits_8_9_%=\n\t"
  77308. "\n"
  77309. "L_sp_256_num_bits_8_1_3_%=: \n\t"
  77310. "lsr r3, r1, #16\n\t"
  77311. "and r3, r3, #0xff\n\t"
  77312. "cmp r3, #0\n\t"
  77313. "beq L_sp_256_num_bits_8_1_2_%=\n\t"
  77314. "mov r2, #48\n\t"
  77315. "ldrb r12, [lr, r3]\n\t"
  77316. "add r12, r2, r12\n\t"
  77317. "b L_sp_256_num_bits_8_9_%=\n\t"
  77318. "\n"
  77319. "L_sp_256_num_bits_8_1_2_%=: \n\t"
  77320. "lsr r3, r1, #8\n\t"
  77321. "and r3, r3, #0xff\n\t"
  77322. "cmp r3, #0\n\t"
  77323. "beq L_sp_256_num_bits_8_1_1_%=\n\t"
  77324. "mov r2, #40\n\t"
  77325. "ldrb r12, [lr, r3]\n\t"
  77326. "add r12, r2, r12\n\t"
  77327. "b L_sp_256_num_bits_8_9_%=\n\t"
  77328. "\n"
  77329. "L_sp_256_num_bits_8_1_1_%=: \n\t"
  77330. "and r3, r1, #0xff\n\t"
  77331. "mov r2, #32\n\t"
  77332. "ldrb r12, [lr, r3]\n\t"
  77333. "add r12, r2, r12\n\t"
  77334. "b L_sp_256_num_bits_8_9_%=\n\t"
  77335. "\n"
  77336. "L_sp_256_num_bits_8_1_%=: \n\t"
  77337. "ldr r1, [%[a]]\n\t"
  77338. "lsr r3, r1, #24\n\t"
  77339. "cmp r3, #0\n\t"
  77340. "beq L_sp_256_num_bits_8_0_3_%=\n\t"
  77341. "mov r2, #24\n\t"
  77342. "ldrb r12, [lr, r3]\n\t"
  77343. "add r12, r2, r12\n\t"
  77344. "b L_sp_256_num_bits_8_9_%=\n\t"
  77345. "\n"
  77346. "L_sp_256_num_bits_8_0_3_%=: \n\t"
  77347. "lsr r3, r1, #16\n\t"
  77348. "and r3, r3, #0xff\n\t"
  77349. "cmp r3, #0\n\t"
  77350. "beq L_sp_256_num_bits_8_0_2_%=\n\t"
  77351. "mov r2, #16\n\t"
  77352. "ldrb r12, [lr, r3]\n\t"
  77353. "add r12, r2, r12\n\t"
  77354. "b L_sp_256_num_bits_8_9_%=\n\t"
  77355. "\n"
  77356. "L_sp_256_num_bits_8_0_2_%=: \n\t"
  77357. "lsr r3, r1, #8\n\t"
  77358. "and r3, r3, #0xff\n\t"
  77359. "cmp r3, #0\n\t"
  77360. "beq L_sp_256_num_bits_8_0_1_%=\n\t"
  77361. "mov r2, #8\n\t"
  77362. "ldrb r12, [lr, r3]\n\t"
  77363. "add r12, r2, r12\n\t"
  77364. "b L_sp_256_num_bits_8_9_%=\n\t"
  77365. "\n"
  77366. "L_sp_256_num_bits_8_0_1_%=: \n\t"
  77367. "and r3, r1, #0xff\n\t"
  77368. "ldrb r12, [lr, r3]\n\t"
  77369. "\n"
  77370. "L_sp_256_num_bits_8_9_%=: \n\t"
  77371. "mov %[a], r12\n\t"
  77372. : [a] "+r" (a), [L_sp_256_num_bits_8_table] "+r" (L_sp_256_num_bits_8_table_c)
  77373. :
  77374. : "memory", "r2", "r3", "r12", "lr", "cc"
  77375. );
  77376. return (uint32_t)(size_t)a;
  77377. }
  77378. #else
  77379. static int sp_256_num_bits_8(const sp_digit* a_p)
  77380. {
  77381. register const sp_digit* a asm ("r0") = (const sp_digit*)a_p;
  77382. __asm__ __volatile__ (
  77383. "ldr r1, [%[a], #28]\n\t"
  77384. "cmp r1, #0\n\t"
  77385. "beq L_sp_256_num_bits_8_7_%=\n\t"
  77386. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  77387. "mov r2, #0x1\n\t"
  77388. "lsl r2, r2, #8\n\t"
  77389. "add r2, r2, #0x0\n\t"
  77390. #else
  77391. "mov r2, #0x100\n\t"
  77392. #endif
  77393. "clz r12, r1\n\t"
  77394. "sub r12, r2, r12\n\t"
  77395. "b L_sp_256_num_bits_8_9_%=\n\t"
  77396. "\n"
  77397. "L_sp_256_num_bits_8_7_%=: \n\t"
  77398. "ldr r1, [%[a], #24]\n\t"
  77399. "cmp r1, #0\n\t"
  77400. "beq L_sp_256_num_bits_8_6_%=\n\t"
  77401. "mov r2, #0xe0\n\t"
  77402. "clz r12, r1\n\t"
  77403. "sub r12, r2, r12\n\t"
  77404. "b L_sp_256_num_bits_8_9_%=\n\t"
  77405. "\n"
  77406. "L_sp_256_num_bits_8_6_%=: \n\t"
  77407. "ldr r1, [%[a], #20]\n\t"
  77408. "cmp r1, #0\n\t"
  77409. "beq L_sp_256_num_bits_8_5_%=\n\t"
  77410. "mov r2, #0xc0\n\t"
  77411. "clz r12, r1\n\t"
  77412. "sub r12, r2, r12\n\t"
  77413. "b L_sp_256_num_bits_8_9_%=\n\t"
  77414. "\n"
  77415. "L_sp_256_num_bits_8_5_%=: \n\t"
  77416. "ldr r1, [%[a], #16]\n\t"
  77417. "cmp r1, #0\n\t"
  77418. "beq L_sp_256_num_bits_8_4_%=\n\t"
  77419. "mov r2, #0xa0\n\t"
  77420. "clz r12, r1\n\t"
  77421. "sub r12, r2, r12\n\t"
  77422. "b L_sp_256_num_bits_8_9_%=\n\t"
  77423. "\n"
  77424. "L_sp_256_num_bits_8_4_%=: \n\t"
  77425. "ldr r1, [%[a], #12]\n\t"
  77426. "cmp r1, #0\n\t"
  77427. "beq L_sp_256_num_bits_8_3_%=\n\t"
  77428. "mov r2, #0x80\n\t"
  77429. "clz r12, r1\n\t"
  77430. "sub r12, r2, r12\n\t"
  77431. "b L_sp_256_num_bits_8_9_%=\n\t"
  77432. "\n"
  77433. "L_sp_256_num_bits_8_3_%=: \n\t"
  77434. "ldr r1, [%[a], #8]\n\t"
  77435. "cmp r1, #0\n\t"
  77436. "beq L_sp_256_num_bits_8_2_%=\n\t"
  77437. "mov r2, #0x60\n\t"
  77438. "clz r12, r1\n\t"
  77439. "sub r12, r2, r12\n\t"
  77440. "b L_sp_256_num_bits_8_9_%=\n\t"
  77441. "\n"
  77442. "L_sp_256_num_bits_8_2_%=: \n\t"
  77443. "ldr r1, [%[a], #4]\n\t"
  77444. "cmp r1, #0\n\t"
  77445. "beq L_sp_256_num_bits_8_1_%=\n\t"
  77446. "mov r2, #0x40\n\t"
  77447. "clz r12, r1\n\t"
  77448. "sub r12, r2, r12\n\t"
  77449. "b L_sp_256_num_bits_8_9_%=\n\t"
  77450. "\n"
  77451. "L_sp_256_num_bits_8_1_%=: \n\t"
  77452. "ldr r1, [%[a]]\n\t"
  77453. "mov r2, #32\n\t"
  77454. "clz r12, r1\n\t"
  77455. "sub r12, r2, r12\n\t"
  77456. "\n"
  77457. "L_sp_256_num_bits_8_9_%=: \n\t"
  77458. "mov %[a], r12\n\t"
  77459. : [a] "+r" (a)
  77460. :
  77461. : "memory", "r1", "r2", "r3", "r12", "lr", "cc"
  77462. );
  77463. return (uint32_t)(size_t)a;
  77464. }
  77465. #endif /* WOLFSSL_ARM_ARCH && (WOLFSSL_ARM_ARCH < 7) */
  77466. /* Non-constant time modular inversion.
  77467. *
  77468. * @param [out] r Resulting number.
  77469. * @param [in] a Number to invert.
  77470. * @param [in] m Modulus.
  77471. * @return MP_OKAY on success.
  77472. */
  77473. static int sp_256_mod_inv_8(sp_digit* r, const sp_digit* a, const sp_digit* m)
  77474. {
  77475. sp_digit u[8];
  77476. sp_digit v[8];
  77477. sp_digit b[8];
  77478. sp_digit d[8];
  77479. int ut, vt;
  77480. sp_digit o;
  77481. XMEMCPY(u, m, sizeof(u));
  77482. XMEMCPY(v, a, sizeof(v));
  77483. ut = sp_256_num_bits_8(u);
  77484. vt = sp_256_num_bits_8(v);
  77485. XMEMSET(b, 0, sizeof(b));
  77486. if ((v[0] & 1) == 0) {
  77487. sp_256_rshift1_8(v, v);
  77488. XMEMCPY(d, m, sizeof(u));
  77489. d[0] += 1;
  77490. sp_256_rshift1_8(d, d);
  77491. vt--;
  77492. while ((v[0] & 1) == 0) {
  77493. sp_256_rshift1_8(v, v);
  77494. sp_256_div2_mod_8(d, d, m);
  77495. vt--;
  77496. }
  77497. }
  77498. else {
  77499. XMEMSET(d+1, 0, sizeof(d)-sizeof(sp_digit));
  77500. d[0] = 1;
  77501. }
  77502. while (ut > 1 && vt > 1) {
  77503. if ((ut > vt) || ((ut == vt) && (sp_256_cmp_8(u, v) >= 0))) {
  77504. sp_256_sub_8(u, u, v);
  77505. o = sp_256_sub_8(b, b, d);
  77506. if (o != 0)
  77507. sp_256_add_8(b, b, m);
  77508. ut = sp_256_num_bits_8(u);
  77509. do {
  77510. sp_256_rshift1_8(u, u);
  77511. sp_256_div2_mod_8(b, b, m);
  77512. ut--;
  77513. }
  77514. while (ut > 0 && (u[0] & 1) == 0);
  77515. }
  77516. else {
  77517. sp_256_sub_8(v, v, u);
  77518. o = sp_256_sub_8(d, d, b);
  77519. if (o != 0)
  77520. sp_256_add_8(d, d, m);
  77521. vt = sp_256_num_bits_8(v);
  77522. do {
  77523. sp_256_rshift1_8(v, v);
  77524. sp_256_div2_mod_8(d, d, m);
  77525. vt--;
  77526. }
  77527. while (vt > 0 && (v[0] & 1) == 0);
  77528. }
  77529. }
  77530. if (ut == 1)
  77531. XMEMCPY(r, b, sizeof(b));
  77532. else
  77533. XMEMCPY(r, d, sizeof(d));
  77534. return MP_OKAY;
  77535. }
  77536. #endif /* WOLFSSL_SP_SMALL */
  77537. /* Add point p1 into point p2. Handles p1 == p2 and result at infinity.
  77538. *
  77539. * p1 First point to add and holds result.
  77540. * p2 Second point to add.
  77541. * tmp Temporary storage for intermediate numbers.
  77542. */
  77543. static void sp_256_add_points_8(sp_point_256* p1, const sp_point_256* p2,
  77544. sp_digit* tmp)
  77545. {
  77546. sp_256_proj_point_add_8(p1, p1, p2, tmp);
  77547. if (sp_256_iszero_8(p1->z)) {
  77548. if (sp_256_iszero_8(p1->x) && sp_256_iszero_8(p1->y)) {
  77549. sp_256_proj_point_dbl_8(p1, p2, tmp);
  77550. }
  77551. else {
  77552. /* Y ordinate is not used from here - don't set. */
  77553. p1->x[0] = 0;
  77554. p1->x[1] = 0;
  77555. p1->x[2] = 0;
  77556. p1->x[3] = 0;
  77557. p1->x[4] = 0;
  77558. p1->x[5] = 0;
  77559. p1->x[6] = 0;
  77560. p1->x[7] = 0;
  77561. XMEMCPY(p1->z, p256_norm_mod, sizeof(p256_norm_mod));
  77562. }
  77563. }
  77564. }
  77565. /* Calculate the verification point: [e/s]G + [r/s]Q
  77566. *
  77567. * p1 Calculated point.
  77568. * p2 Public point and temporary.
  77569. * s Second part of signature as a number.
  77570. * u1 Temporary number.
  77571. * u2 Temporary number.
  77572. * heap Heap to use for allocation.
  77573. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  77574. */
  77575. static int sp_256_calc_vfy_point_8(sp_point_256* p1, sp_point_256* p2,
  77576. sp_digit* s, sp_digit* u1, sp_digit* u2, sp_digit* tmp, void* heap)
  77577. {
  77578. int err;
  77579. #ifndef WOLFSSL_SP_SMALL
  77580. err = sp_256_mod_inv_8(s, s, p256_order);
  77581. if (err == MP_OKAY)
  77582. #endif /* !WOLFSSL_SP_SMALL */
  77583. {
  77584. sp_256_mul_8(s, s, p256_norm_order);
  77585. err = sp_256_mod_8(s, s, p256_order);
  77586. }
  77587. if (err == MP_OKAY) {
  77588. sp_256_norm_8(s);
  77589. #ifdef WOLFSSL_SP_SMALL
  77590. {
  77591. sp_256_mont_inv_order_8(s, s, tmp);
  77592. sp_256_mont_mul_order_8(u1, u1, s);
  77593. sp_256_mont_mul_order_8(u2, u2, s);
  77594. }
  77595. #else
  77596. {
  77597. sp_256_mont_mul_order_8(u1, u1, s);
  77598. sp_256_mont_mul_order_8(u2, u2, s);
  77599. }
  77600. #endif /* WOLFSSL_SP_SMALL */
  77601. {
  77602. err = sp_256_ecc_mulmod_base_8(p1, u1, 0, 0, heap);
  77603. }
  77604. }
  77605. if ((err == MP_OKAY) && sp_256_iszero_8(p1->z)) {
  77606. p1->infinity = 1;
  77607. }
  77608. if (err == MP_OKAY) {
  77609. err = sp_256_ecc_mulmod_8(p2, p2, u2, 0, 0, heap);
  77610. }
  77611. if ((err == MP_OKAY) && sp_256_iszero_8(p2->z)) {
  77612. p2->infinity = 1;
  77613. }
  77614. if (err == MP_OKAY) {
  77615. sp_256_add_points_8(p1, p2, tmp);
  77616. }
  77617. return err;
  77618. }
  77619. #ifdef HAVE_ECC_VERIFY
  77620. /* Verify the signature values with the hash and public key.
  77621. * e = Truncate(hash, 256)
  77622. * u1 = e/s mod order
  77623. * u2 = r/s mod order
  77624. * r == (u1.G + u2.Q)->x mod order
  77625. * Optimization: Leave point in projective form.
  77626. * (x, y, 1) == (x' / z'*z', y' / z'*z'*z', z' / z')
  77627. * (r + n*order).z'.z' mod prime == (u1.G + u2.Q)->x'
  77628. * The hash is truncated to the first 256 bits.
  77629. *
  77630. * hash Hash to sign.
  77631. * hashLen Length of the hash data.
  77632. * rng Random number generator.
  77633. * priv Private part of key - scalar.
  77634. * rm First part of result as an mp_int.
  77635. * sm Sirst part of result as an mp_int.
  77636. * heap Heap to use for allocation.
  77637. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  77638. */
  77639. int sp_ecc_verify_256(const byte* hash, word32 hashLen, const mp_int* pX,
  77640. const mp_int* pY, const mp_int* pZ, const mp_int* rm, const mp_int* sm,
  77641. int* res, void* heap)
  77642. {
  77643. #ifdef WOLFSSL_SP_SMALL_STACK
  77644. sp_digit* u1 = NULL;
  77645. sp_point_256* p1 = NULL;
  77646. #else
  77647. sp_digit u1[18 * 8];
  77648. sp_point_256 p1[2];
  77649. #endif
  77650. sp_digit* u2 = NULL;
  77651. sp_digit* s = NULL;
  77652. sp_digit* tmp = NULL;
  77653. sp_point_256* p2 = NULL;
  77654. sp_digit carry;
  77655. sp_int32 c = 0;
  77656. int err = MP_OKAY;
  77657. #ifdef WOLFSSL_SP_SMALL_STACK
  77658. if (err == MP_OKAY) {
  77659. p1 = (sp_point_256*)XMALLOC(sizeof(sp_point_256) * 2, heap,
  77660. DYNAMIC_TYPE_ECC);
  77661. if (p1 == NULL)
  77662. err = MEMORY_E;
  77663. }
  77664. if (err == MP_OKAY) {
  77665. u1 = (sp_digit*)XMALLOC(sizeof(sp_digit) * 18 * 8, heap,
  77666. DYNAMIC_TYPE_ECC);
  77667. if (u1 == NULL)
  77668. err = MEMORY_E;
  77669. }
  77670. #endif
  77671. if (err == MP_OKAY) {
  77672. u2 = u1 + 2 * 8;
  77673. s = u1 + 4 * 8;
  77674. tmp = u1 + 6 * 8;
  77675. p2 = p1 + 1;
  77676. if (hashLen > 32U) {
  77677. hashLen = 32U;
  77678. }
  77679. sp_256_from_bin(u1, 8, hash, (int)hashLen);
  77680. sp_256_from_mp(u2, 8, rm);
  77681. sp_256_from_mp(s, 8, sm);
  77682. sp_256_from_mp(p2->x, 8, pX);
  77683. sp_256_from_mp(p2->y, 8, pY);
  77684. sp_256_from_mp(p2->z, 8, pZ);
  77685. err = sp_256_calc_vfy_point_8(p1, p2, s, u1, u2, tmp, heap);
  77686. }
  77687. if (err == MP_OKAY) {
  77688. /* (r + n*order).z'.z' mod prime == (u1.G + u2.Q)->x' */
  77689. /* Reload r and convert to Montgomery form. */
  77690. sp_256_from_mp(u2, 8, rm);
  77691. err = sp_256_mod_mul_norm_8(u2, u2, p256_mod);
  77692. }
  77693. if (err == MP_OKAY) {
  77694. /* u1 = r.z'.z' mod prime */
  77695. sp_256_mont_sqr_8(p1->z, p1->z, p256_mod, p256_mp_mod);
  77696. sp_256_mont_mul_8(u1, u2, p1->z, p256_mod, p256_mp_mod);
  77697. *res = (int)(sp_256_cmp_8(p1->x, u1) == 0);
  77698. if (*res == 0) {
  77699. /* Reload r and add order. */
  77700. sp_256_from_mp(u2, 8, rm);
  77701. carry = sp_256_add_8(u2, u2, p256_order);
  77702. /* Carry means result is greater than mod and is not valid. */
  77703. if (carry == 0) {
  77704. sp_256_norm_8(u2);
  77705. /* Compare with mod and if greater or equal then not valid. */
  77706. c = sp_256_cmp_8(u2, p256_mod);
  77707. }
  77708. }
  77709. if ((*res == 0) && (c < 0)) {
  77710. /* Convert to Montogomery form */
  77711. err = sp_256_mod_mul_norm_8(u2, u2, p256_mod);
  77712. if (err == MP_OKAY) {
  77713. /* u1 = (r + 1*order).z'.z' mod prime */
  77714. {
  77715. sp_256_mont_mul_8(u1, u2, p1->z, p256_mod, p256_mp_mod);
  77716. }
  77717. *res = (sp_256_cmp_8(p1->x, u1) == 0);
  77718. }
  77719. }
  77720. }
  77721. #ifdef WOLFSSL_SP_SMALL_STACK
  77722. if (u1 != NULL)
  77723. XFREE(u1, heap, DYNAMIC_TYPE_ECC);
  77724. if (p1 != NULL)
  77725. XFREE(p1, heap, DYNAMIC_TYPE_ECC);
  77726. #endif
  77727. return err;
  77728. }
  77729. #ifdef WOLFSSL_SP_NONBLOCK
  77730. typedef struct sp_ecc_verify_256_ctx {
  77731. int state;
  77732. union {
  77733. sp_256_ecc_mulmod_8_ctx mulmod_ctx;
  77734. sp_256_mont_inv_order_8_ctx mont_inv_order_ctx;
  77735. sp_256_proj_point_dbl_8_ctx dbl_ctx;
  77736. sp_256_proj_point_add_8_ctx add_ctx;
  77737. };
  77738. sp_digit u1[2*8];
  77739. sp_digit u2[2*8];
  77740. sp_digit s[2*8];
  77741. sp_digit tmp[2*8 * 6];
  77742. sp_point_256 p1;
  77743. sp_point_256 p2;
  77744. } sp_ecc_verify_256_ctx;
  77745. int sp_ecc_verify_256_nb(sp_ecc_ctx_t* sp_ctx, const byte* hash,
  77746. word32 hashLen, const mp_int* pX, const mp_int* pY, const mp_int* pZ,
  77747. const mp_int* rm, const mp_int* sm, int* res, void* heap)
  77748. {
  77749. int err = FP_WOULDBLOCK;
  77750. sp_ecc_verify_256_ctx* ctx = (sp_ecc_verify_256_ctx*)sp_ctx->data;
  77751. typedef char ctx_size_test[sizeof(sp_ecc_verify_256_ctx) >= sizeof(*sp_ctx) ? -1 : 1];
  77752. (void)sizeof(ctx_size_test);
  77753. switch (ctx->state) {
  77754. case 0: /* INIT */
  77755. if (hashLen > 32U) {
  77756. hashLen = 32U;
  77757. }
  77758. sp_256_from_bin(ctx->u1, 8, hash, (int)hashLen);
  77759. sp_256_from_mp(ctx->u2, 8, rm);
  77760. sp_256_from_mp(ctx->s, 8, sm);
  77761. sp_256_from_mp(ctx->p2.x, 8, pX);
  77762. sp_256_from_mp(ctx->p2.y, 8, pY);
  77763. sp_256_from_mp(ctx->p2.z, 8, pZ);
  77764. ctx->state = 1;
  77765. break;
  77766. case 1: /* NORMS0 */
  77767. sp_256_mul_8(ctx->s, ctx->s, p256_norm_order);
  77768. err = sp_256_mod_8(ctx->s, ctx->s, p256_order);
  77769. if (err == MP_OKAY)
  77770. ctx->state = 2;
  77771. break;
  77772. case 2: /* NORMS1 */
  77773. sp_256_norm_8(ctx->s);
  77774. XMEMSET(&ctx->mont_inv_order_ctx, 0, sizeof(ctx->mont_inv_order_ctx));
  77775. ctx->state = 3;
  77776. break;
  77777. case 3: /* NORMS2 */
  77778. err = sp_256_mont_inv_order_8_nb((sp_ecc_ctx_t*)&ctx->mont_inv_order_ctx, ctx->s, ctx->s, ctx->tmp);
  77779. if (err == MP_OKAY) {
  77780. ctx->state = 4;
  77781. }
  77782. break;
  77783. case 4: /* NORMS3 */
  77784. sp_256_mont_mul_order_8(ctx->u1, ctx->u1, ctx->s);
  77785. ctx->state = 5;
  77786. break;
  77787. case 5: /* NORMS4 */
  77788. sp_256_mont_mul_order_8(ctx->u2, ctx->u2, ctx->s);
  77789. XMEMSET(&ctx->mulmod_ctx, 0, sizeof(ctx->mulmod_ctx));
  77790. ctx->state = 6;
  77791. break;
  77792. case 6: /* MULBASE */
  77793. err = sp_256_ecc_mulmod_8_nb((sp_ecc_ctx_t*)&ctx->mulmod_ctx, &ctx->p1, &p256_base, ctx->u1, 0, 0, heap);
  77794. if (err == MP_OKAY) {
  77795. if (sp_256_iszero_8(ctx->p1.z)) {
  77796. ctx->p1.infinity = 1;
  77797. }
  77798. XMEMSET(&ctx->mulmod_ctx, 0, sizeof(ctx->mulmod_ctx));
  77799. ctx->state = 7;
  77800. }
  77801. break;
  77802. case 7: /* MULMOD */
  77803. err = sp_256_ecc_mulmod_8_nb((sp_ecc_ctx_t*)&ctx->mulmod_ctx, &ctx->p2, &ctx->p2, ctx->u2, 0, 0, heap);
  77804. if (err == MP_OKAY) {
  77805. if (sp_256_iszero_8(ctx->p2.z)) {
  77806. ctx->p2.infinity = 1;
  77807. }
  77808. XMEMSET(&ctx->add_ctx, 0, sizeof(ctx->add_ctx));
  77809. ctx->state = 8;
  77810. }
  77811. break;
  77812. case 8: /* ADD */
  77813. err = sp_256_proj_point_add_8_nb((sp_ecc_ctx_t*)&ctx->add_ctx, &ctx->p1, &ctx->p1, &ctx->p2, ctx->tmp);
  77814. if (err == MP_OKAY)
  77815. ctx->state = 9;
  77816. break;
  77817. case 9: /* MONT */
  77818. /* (r + n*order).z'.z' mod prime == (u1.G + u2.Q)->x' */
  77819. /* Reload r and convert to Montgomery form. */
  77820. sp_256_from_mp(ctx->u2, 8, rm);
  77821. err = sp_256_mod_mul_norm_8(ctx->u2, ctx->u2, p256_mod);
  77822. if (err == MP_OKAY)
  77823. ctx->state = 10;
  77824. break;
  77825. case 10: /* SQR */
  77826. /* u1 = r.z'.z' mod prime */
  77827. sp_256_mont_sqr_8(ctx->p1.z, ctx->p1.z, p256_mod, p256_mp_mod);
  77828. ctx->state = 11;
  77829. break;
  77830. case 11: /* MUL */
  77831. sp_256_mont_mul_8(ctx->u1, ctx->u2, ctx->p1.z, p256_mod, p256_mp_mod);
  77832. ctx->state = 12;
  77833. break;
  77834. case 12: /* RES */
  77835. {
  77836. sp_int32 c = 0;
  77837. err = MP_OKAY; /* math okay, now check result */
  77838. *res = (int)(sp_256_cmp_8(ctx->p1.x, ctx->u1) == 0);
  77839. if (*res == 0) {
  77840. sp_digit carry;
  77841. /* Reload r and add order. */
  77842. sp_256_from_mp(ctx->u2, 8, rm);
  77843. carry = sp_256_add_8(ctx->u2, ctx->u2, p256_order);
  77844. /* Carry means result is greater than mod and is not valid. */
  77845. if (carry == 0) {
  77846. sp_256_norm_8(ctx->u2);
  77847. /* Compare with mod and if greater or equal then not valid. */
  77848. c = sp_256_cmp_8(ctx->u2, p256_mod);
  77849. }
  77850. }
  77851. if ((*res == 0) && (c < 0)) {
  77852. /* Convert to Montogomery form */
  77853. err = sp_256_mod_mul_norm_8(ctx->u2, ctx->u2, p256_mod);
  77854. if (err == MP_OKAY) {
  77855. /* u1 = (r + 1*order).z'.z' mod prime */
  77856. sp_256_mont_mul_8(ctx->u1, ctx->u2, ctx->p1.z, p256_mod,
  77857. p256_mp_mod);
  77858. *res = (int)(sp_256_cmp_8(ctx->p1.x, ctx->u1) == 0);
  77859. }
  77860. }
  77861. break;
  77862. }
  77863. } /* switch */
  77864. if (err == MP_OKAY && ctx->state != 12) {
  77865. err = FP_WOULDBLOCK;
  77866. }
  77867. return err;
  77868. }
  77869. #endif /* WOLFSSL_SP_NONBLOCK */
  77870. #endif /* HAVE_ECC_VERIFY */
  77871. #ifdef HAVE_ECC_CHECK_KEY
  77872. /* Check that the x and y ordinates are a valid point on the curve.
  77873. *
  77874. * point EC point.
  77875. * heap Heap to use if dynamically allocating.
  77876. * returns MEMORY_E if dynamic memory allocation fails, MP_VAL if the point is
  77877. * not on the curve and MP_OKAY otherwise.
  77878. */
  77879. static int sp_256_ecc_is_point_8(const sp_point_256* point,
  77880. void* heap)
  77881. {
  77882. #ifdef WOLFSSL_SP_SMALL_STACK
  77883. sp_digit* t1 = NULL;
  77884. #else
  77885. sp_digit t1[8 * 4];
  77886. #endif
  77887. sp_digit* t2 = NULL;
  77888. int err = MP_OKAY;
  77889. #ifdef WOLFSSL_SP_SMALL_STACK
  77890. t1 = (sp_digit*)XMALLOC(sizeof(sp_digit) * 8 * 4, heap, DYNAMIC_TYPE_ECC);
  77891. if (t1 == NULL)
  77892. err = MEMORY_E;
  77893. #endif
  77894. (void)heap;
  77895. if (err == MP_OKAY) {
  77896. t2 = t1 + 2 * 8;
  77897. /* y^2 - x^3 - a.x = b */
  77898. sp_256_sqr_8(t1, point->y);
  77899. (void)sp_256_mod_8(t1, t1, p256_mod);
  77900. sp_256_sqr_8(t2, point->x);
  77901. (void)sp_256_mod_8(t2, t2, p256_mod);
  77902. sp_256_mul_8(t2, t2, point->x);
  77903. (void)sp_256_mod_8(t2, t2, p256_mod);
  77904. sp_256_mont_sub_8(t1, t1, t2, p256_mod);
  77905. /* y^2 - x^3 + 3.x = b, when a = -3 */
  77906. sp_256_mont_add_8(t1, t1, point->x, p256_mod);
  77907. sp_256_mont_add_8(t1, t1, point->x, p256_mod);
  77908. sp_256_mont_add_8(t1, t1, point->x, p256_mod);
  77909. if (sp_256_cmp_8(t1, p256_b) != 0) {
  77910. err = MP_VAL;
  77911. }
  77912. }
  77913. #ifdef WOLFSSL_SP_SMALL_STACK
  77914. if (t1 != NULL)
  77915. XFREE(t1, heap, DYNAMIC_TYPE_ECC);
  77916. #endif
  77917. return err;
  77918. }
  77919. /* Check that the x and y ordinates are a valid point on the curve.
  77920. *
  77921. * pX X ordinate of EC point.
  77922. * pY Y ordinate of EC point.
  77923. * returns MEMORY_E if dynamic memory allocation fails, MP_VAL if the point is
  77924. * not on the curve and MP_OKAY otherwise.
  77925. */
  77926. int sp_ecc_is_point_256(const mp_int* pX, const mp_int* pY)
  77927. {
  77928. #ifdef WOLFSSL_SP_SMALL_STACK
  77929. sp_point_256* pub = NULL;
  77930. #else
  77931. sp_point_256 pub[1];
  77932. #endif
  77933. const byte one[1] = { 1 };
  77934. int err = MP_OKAY;
  77935. #ifdef WOLFSSL_SP_SMALL_STACK
  77936. pub = (sp_point_256*)XMALLOC(sizeof(sp_point_256), NULL,
  77937. DYNAMIC_TYPE_ECC);
  77938. if (pub == NULL)
  77939. err = MEMORY_E;
  77940. #endif
  77941. if (err == MP_OKAY) {
  77942. sp_256_from_mp(pub->x, 8, pX);
  77943. sp_256_from_mp(pub->y, 8, pY);
  77944. sp_256_from_bin(pub->z, 8, one, (int)sizeof(one));
  77945. err = sp_256_ecc_is_point_8(pub, NULL);
  77946. }
  77947. #ifdef WOLFSSL_SP_SMALL_STACK
  77948. if (pub != NULL)
  77949. XFREE(pub, NULL, DYNAMIC_TYPE_ECC);
  77950. #endif
  77951. return err;
  77952. }
  77953. /* Check that the private scalar generates the EC point (px, py), the point is
  77954. * on the curve and the point has the correct order.
  77955. *
  77956. * pX X ordinate of EC point.
  77957. * pY Y ordinate of EC point.
  77958. * privm Private scalar that generates EC point.
  77959. * returns MEMORY_E if dynamic memory allocation fails, MP_VAL if the point is
  77960. * not on the curve, ECC_INF_E if the point does not have the correct order,
  77961. * ECC_PRIV_KEY_E when the private scalar doesn't generate the EC point and
  77962. * MP_OKAY otherwise.
  77963. */
  77964. int sp_ecc_check_key_256(const mp_int* pX, const mp_int* pY,
  77965. const mp_int* privm, void* heap)
  77966. {
  77967. #ifdef WOLFSSL_SP_SMALL_STACK
  77968. sp_digit* priv = NULL;
  77969. sp_point_256* pub = NULL;
  77970. #else
  77971. sp_digit priv[8];
  77972. sp_point_256 pub[2];
  77973. #endif
  77974. sp_point_256* p = NULL;
  77975. const byte one[1] = { 1 };
  77976. int err = MP_OKAY;
  77977. /* Quick check the lengs of public key ordinates and private key are in
  77978. * range. Proper check later.
  77979. */
  77980. if (((mp_count_bits(pX) > 256) ||
  77981. (mp_count_bits(pY) > 256) ||
  77982. ((privm != NULL) && (mp_count_bits(privm) > 256)))) {
  77983. err = ECC_OUT_OF_RANGE_E;
  77984. }
  77985. #ifdef WOLFSSL_SP_SMALL_STACK
  77986. if (err == MP_OKAY) {
  77987. pub = (sp_point_256*)XMALLOC(sizeof(sp_point_256) * 2, heap,
  77988. DYNAMIC_TYPE_ECC);
  77989. if (pub == NULL)
  77990. err = MEMORY_E;
  77991. }
  77992. if (err == MP_OKAY && privm) {
  77993. priv = (sp_digit*)XMALLOC(sizeof(sp_digit) * 8, heap,
  77994. DYNAMIC_TYPE_ECC);
  77995. if (priv == NULL)
  77996. err = MEMORY_E;
  77997. }
  77998. #endif
  77999. if (err == MP_OKAY) {
  78000. p = pub + 1;
  78001. sp_256_from_mp(pub->x, 8, pX);
  78002. sp_256_from_mp(pub->y, 8, pY);
  78003. sp_256_from_bin(pub->z, 8, one, (int)sizeof(one));
  78004. if (privm)
  78005. sp_256_from_mp(priv, 8, privm);
  78006. /* Check point at infinitiy. */
  78007. if ((sp_256_iszero_8(pub->x) != 0) &&
  78008. (sp_256_iszero_8(pub->y) != 0)) {
  78009. err = ECC_INF_E;
  78010. }
  78011. }
  78012. /* Check range of X and Y */
  78013. if ((err == MP_OKAY) &&
  78014. ((sp_256_cmp_8(pub->x, p256_mod) >= 0) ||
  78015. (sp_256_cmp_8(pub->y, p256_mod) >= 0))) {
  78016. err = ECC_OUT_OF_RANGE_E;
  78017. }
  78018. if (err == MP_OKAY) {
  78019. /* Check point is on curve */
  78020. err = sp_256_ecc_is_point_8(pub, heap);
  78021. }
  78022. if (err == MP_OKAY) {
  78023. /* Point * order = infinity */
  78024. err = sp_256_ecc_mulmod_8(p, pub, p256_order, 1, 1, heap);
  78025. }
  78026. /* Check result is infinity */
  78027. if ((err == MP_OKAY) && ((sp_256_iszero_8(p->x) == 0) ||
  78028. (sp_256_iszero_8(p->y) == 0))) {
  78029. err = ECC_INF_E;
  78030. }
  78031. if (privm) {
  78032. if (err == MP_OKAY) {
  78033. /* Base * private = point */
  78034. err = sp_256_ecc_mulmod_base_8(p, priv, 1, 1, heap);
  78035. }
  78036. /* Check result is public key */
  78037. if ((err == MP_OKAY) &&
  78038. ((sp_256_cmp_8(p->x, pub->x) != 0) ||
  78039. (sp_256_cmp_8(p->y, pub->y) != 0))) {
  78040. err = ECC_PRIV_KEY_E;
  78041. }
  78042. }
  78043. #ifdef WOLFSSL_SP_SMALL_STACK
  78044. if (pub != NULL)
  78045. XFREE(pub, heap, DYNAMIC_TYPE_ECC);
  78046. if (priv != NULL)
  78047. XFREE(priv, heap, DYNAMIC_TYPE_ECC);
  78048. #endif
  78049. return err;
  78050. }
  78051. #endif
  78052. #ifdef WOLFSSL_PUBLIC_ECC_ADD_DBL
  78053. /* Add two projective EC points together.
  78054. * (pX, pY, pZ) + (qX, qY, qZ) = (rX, rY, rZ)
  78055. *
  78056. * pX First EC point's X ordinate.
  78057. * pY First EC point's Y ordinate.
  78058. * pZ First EC point's Z ordinate.
  78059. * qX Second EC point's X ordinate.
  78060. * qY Second EC point's Y ordinate.
  78061. * qZ Second EC point's Z ordinate.
  78062. * rX Resultant EC point's X ordinate.
  78063. * rY Resultant EC point's Y ordinate.
  78064. * rZ Resultant EC point's Z ordinate.
  78065. * returns MEMORY_E if dynamic memory allocation fails and MP_OKAY otherwise.
  78066. */
  78067. int sp_ecc_proj_add_point_256(mp_int* pX, mp_int* pY, mp_int* pZ,
  78068. mp_int* qX, mp_int* qY, mp_int* qZ,
  78069. mp_int* rX, mp_int* rY, mp_int* rZ)
  78070. {
  78071. #ifdef WOLFSSL_SP_SMALL_STACK
  78072. sp_digit* tmp = NULL;
  78073. sp_point_256* p = NULL;
  78074. #else
  78075. sp_digit tmp[2 * 8 * 6];
  78076. sp_point_256 p[2];
  78077. #endif
  78078. sp_point_256* q = NULL;
  78079. int err = MP_OKAY;
  78080. #ifdef WOLFSSL_SP_SMALL_STACK
  78081. if (err == MP_OKAY) {
  78082. p = (sp_point_256*)XMALLOC(sizeof(sp_point_256) * 2, NULL,
  78083. DYNAMIC_TYPE_ECC);
  78084. if (p == NULL)
  78085. err = MEMORY_E;
  78086. }
  78087. if (err == MP_OKAY) {
  78088. tmp = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 8 * 6, NULL,
  78089. DYNAMIC_TYPE_ECC);
  78090. if (tmp == NULL) {
  78091. err = MEMORY_E;
  78092. }
  78093. }
  78094. #endif
  78095. if (err == MP_OKAY) {
  78096. q = p + 1;
  78097. sp_256_from_mp(p->x, 8, pX);
  78098. sp_256_from_mp(p->y, 8, pY);
  78099. sp_256_from_mp(p->z, 8, pZ);
  78100. sp_256_from_mp(q->x, 8, qX);
  78101. sp_256_from_mp(q->y, 8, qY);
  78102. sp_256_from_mp(q->z, 8, qZ);
  78103. p->infinity = sp_256_iszero_8(p->x) &
  78104. sp_256_iszero_8(p->y);
  78105. q->infinity = sp_256_iszero_8(q->x) &
  78106. sp_256_iszero_8(q->y);
  78107. sp_256_proj_point_add_8(p, p, q, tmp);
  78108. }
  78109. if (err == MP_OKAY) {
  78110. err = sp_256_to_mp(p->x, rX);
  78111. }
  78112. if (err == MP_OKAY) {
  78113. err = sp_256_to_mp(p->y, rY);
  78114. }
  78115. if (err == MP_OKAY) {
  78116. err = sp_256_to_mp(p->z, rZ);
  78117. }
  78118. #ifdef WOLFSSL_SP_SMALL_STACK
  78119. if (tmp != NULL)
  78120. XFREE(tmp, NULL, DYNAMIC_TYPE_ECC);
  78121. if (p != NULL)
  78122. XFREE(p, NULL, DYNAMIC_TYPE_ECC);
  78123. #endif
  78124. return err;
  78125. }
  78126. /* Double a projective EC point.
  78127. * (pX, pY, pZ) + (pX, pY, pZ) = (rX, rY, rZ)
  78128. *
  78129. * pX EC point's X ordinate.
  78130. * pY EC point's Y ordinate.
  78131. * pZ EC point's Z ordinate.
  78132. * rX Resultant EC point's X ordinate.
  78133. * rY Resultant EC point's Y ordinate.
  78134. * rZ Resultant EC point's Z ordinate.
  78135. * returns MEMORY_E if dynamic memory allocation fails and MP_OKAY otherwise.
  78136. */
  78137. int sp_ecc_proj_dbl_point_256(mp_int* pX, mp_int* pY, mp_int* pZ,
  78138. mp_int* rX, mp_int* rY, mp_int* rZ)
  78139. {
  78140. #ifdef WOLFSSL_SP_SMALL_STACK
  78141. sp_digit* tmp = NULL;
  78142. sp_point_256* p = NULL;
  78143. #else
  78144. sp_digit tmp[2 * 8 * 2];
  78145. sp_point_256 p[1];
  78146. #endif
  78147. int err = MP_OKAY;
  78148. #ifdef WOLFSSL_SP_SMALL_STACK
  78149. if (err == MP_OKAY) {
  78150. p = (sp_point_256*)XMALLOC(sizeof(sp_point_256), NULL,
  78151. DYNAMIC_TYPE_ECC);
  78152. if (p == NULL)
  78153. err = MEMORY_E;
  78154. }
  78155. if (err == MP_OKAY) {
  78156. tmp = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 8 * 2, NULL,
  78157. DYNAMIC_TYPE_ECC);
  78158. if (tmp == NULL)
  78159. err = MEMORY_E;
  78160. }
  78161. #endif
  78162. if (err == MP_OKAY) {
  78163. sp_256_from_mp(p->x, 8, pX);
  78164. sp_256_from_mp(p->y, 8, pY);
  78165. sp_256_from_mp(p->z, 8, pZ);
  78166. p->infinity = sp_256_iszero_8(p->x) &
  78167. sp_256_iszero_8(p->y);
  78168. sp_256_proj_point_dbl_8(p, p, tmp);
  78169. }
  78170. if (err == MP_OKAY) {
  78171. err = sp_256_to_mp(p->x, rX);
  78172. }
  78173. if (err == MP_OKAY) {
  78174. err = sp_256_to_mp(p->y, rY);
  78175. }
  78176. if (err == MP_OKAY) {
  78177. err = sp_256_to_mp(p->z, rZ);
  78178. }
  78179. #ifdef WOLFSSL_SP_SMALL_STACK
  78180. if (tmp != NULL)
  78181. XFREE(tmp, NULL, DYNAMIC_TYPE_ECC);
  78182. if (p != NULL)
  78183. XFREE(p, NULL, DYNAMIC_TYPE_ECC);
  78184. #endif
  78185. return err;
  78186. }
  78187. /* Map a projective EC point to affine in place.
  78188. * pZ will be one.
  78189. *
  78190. * pX EC point's X ordinate.
  78191. * pY EC point's Y ordinate.
  78192. * pZ EC point's Z ordinate.
  78193. * returns MEMORY_E if dynamic memory allocation fails and MP_OKAY otherwise.
  78194. */
  78195. int sp_ecc_map_256(mp_int* pX, mp_int* pY, mp_int* pZ)
  78196. {
  78197. #ifdef WOLFSSL_SP_SMALL_STACK
  78198. sp_digit* tmp = NULL;
  78199. sp_point_256* p = NULL;
  78200. #else
  78201. sp_digit tmp[2 * 8 * 4];
  78202. sp_point_256 p[1];
  78203. #endif
  78204. int err = MP_OKAY;
  78205. #ifdef WOLFSSL_SP_SMALL_STACK
  78206. if (err == MP_OKAY) {
  78207. p = (sp_point_256*)XMALLOC(sizeof(sp_point_256), NULL,
  78208. DYNAMIC_TYPE_ECC);
  78209. if (p == NULL)
  78210. err = MEMORY_E;
  78211. }
  78212. if (err == MP_OKAY) {
  78213. tmp = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 8 * 4, NULL,
  78214. DYNAMIC_TYPE_ECC);
  78215. if (tmp == NULL)
  78216. err = MEMORY_E;
  78217. }
  78218. #endif
  78219. if (err == MP_OKAY) {
  78220. sp_256_from_mp(p->x, 8, pX);
  78221. sp_256_from_mp(p->y, 8, pY);
  78222. sp_256_from_mp(p->z, 8, pZ);
  78223. p->infinity = sp_256_iszero_8(p->x) &
  78224. sp_256_iszero_8(p->y);
  78225. sp_256_map_8(p, p, tmp);
  78226. }
  78227. if (err == MP_OKAY) {
  78228. err = sp_256_to_mp(p->x, pX);
  78229. }
  78230. if (err == MP_OKAY) {
  78231. err = sp_256_to_mp(p->y, pY);
  78232. }
  78233. if (err == MP_OKAY) {
  78234. err = sp_256_to_mp(p->z, pZ);
  78235. }
  78236. #ifdef WOLFSSL_SP_SMALL_STACK
  78237. if (tmp != NULL)
  78238. XFREE(tmp, NULL, DYNAMIC_TYPE_ECC);
  78239. if (p != NULL)
  78240. XFREE(p, NULL, DYNAMIC_TYPE_ECC);
  78241. #endif
  78242. return err;
  78243. }
  78244. #endif /* WOLFSSL_PUBLIC_ECC_ADD_DBL */
  78245. #ifdef HAVE_COMP_KEY
  78246. /* Find the square root of a number mod the prime of the curve.
  78247. *
  78248. * y The number to operate on and the result.
  78249. * returns MEMORY_E if dynamic memory allocation fails and MP_OKAY otherwise.
  78250. */
  78251. static int sp_256_mont_sqrt_8(sp_digit* y)
  78252. {
  78253. #ifdef WOLFSSL_SP_SMALL_STACK
  78254. sp_digit* t1 = NULL;
  78255. #else
  78256. sp_digit t1[4 * 8];
  78257. #endif
  78258. sp_digit* t2 = NULL;
  78259. int err = MP_OKAY;
  78260. #ifdef WOLFSSL_SP_SMALL_STACK
  78261. t1 = (sp_digit*)XMALLOC(sizeof(sp_digit) * 4 * 8, NULL, DYNAMIC_TYPE_ECC);
  78262. if (t1 == NULL) {
  78263. err = MEMORY_E;
  78264. }
  78265. #endif
  78266. if (err == MP_OKAY) {
  78267. t2 = t1 + 2 * 8;
  78268. {
  78269. /* t2 = y ^ 0x2 */
  78270. sp_256_mont_sqr_8(t2, y, p256_mod, p256_mp_mod);
  78271. /* t1 = y ^ 0x3 */
  78272. sp_256_mont_mul_8(t1, t2, y, p256_mod, p256_mp_mod);
  78273. /* t2 = y ^ 0xc */
  78274. sp_256_mont_sqr_n_8(t2, t1, 2, p256_mod, p256_mp_mod);
  78275. /* t1 = y ^ 0xf */
  78276. sp_256_mont_mul_8(t1, t1, t2, p256_mod, p256_mp_mod);
  78277. /* t2 = y ^ 0xf0 */
  78278. sp_256_mont_sqr_n_8(t2, t1, 4, p256_mod, p256_mp_mod);
  78279. /* t1 = y ^ 0xff */
  78280. sp_256_mont_mul_8(t1, t1, t2, p256_mod, p256_mp_mod);
  78281. /* t2 = y ^ 0xff00 */
  78282. sp_256_mont_sqr_n_8(t2, t1, 8, p256_mod, p256_mp_mod);
  78283. /* t1 = y ^ 0xffff */
  78284. sp_256_mont_mul_8(t1, t1, t2, p256_mod, p256_mp_mod);
  78285. /* t2 = y ^ 0xffff0000 */
  78286. sp_256_mont_sqr_n_8(t2, t1, 16, p256_mod, p256_mp_mod);
  78287. /* t1 = y ^ 0xffffffff */
  78288. sp_256_mont_mul_8(t1, t1, t2, p256_mod, p256_mp_mod);
  78289. /* t1 = y ^ 0xffffffff00000000 */
  78290. sp_256_mont_sqr_n_8(t1, t1, 32, p256_mod, p256_mp_mod);
  78291. /* t1 = y ^ 0xffffffff00000001 */
  78292. sp_256_mont_mul_8(t1, t1, y, p256_mod, p256_mp_mod);
  78293. /* t1 = y ^ 0xffffffff00000001000000000000000000000000 */
  78294. sp_256_mont_sqr_n_8(t1, t1, 96, p256_mod, p256_mp_mod);
  78295. /* t1 = y ^ 0xffffffff00000001000000000000000000000001 */
  78296. sp_256_mont_mul_8(t1, t1, y, p256_mod, p256_mp_mod);
  78297. sp_256_mont_sqr_n_8(y, t1, 94, p256_mod, p256_mp_mod);
  78298. }
  78299. }
  78300. #ifdef WOLFSSL_SP_SMALL_STACK
  78301. if (t1 != NULL)
  78302. XFREE(t1, NULL, DYNAMIC_TYPE_ECC);
  78303. #endif
  78304. return err;
  78305. }
  78306. /* Uncompress the point given the X ordinate.
  78307. *
  78308. * xm X ordinate.
  78309. * odd Whether the Y ordinate is odd.
  78310. * ym Calculated Y ordinate.
  78311. * returns MEMORY_E if dynamic memory allocation fails and MP_OKAY otherwise.
  78312. */
  78313. int sp_ecc_uncompress_256(mp_int* xm, int odd, mp_int* ym)
  78314. {
  78315. #ifdef WOLFSSL_SP_SMALL_STACK
  78316. sp_digit* x = NULL;
  78317. #else
  78318. sp_digit x[4 * 8];
  78319. #endif
  78320. sp_digit* y = NULL;
  78321. int err = MP_OKAY;
  78322. #ifdef WOLFSSL_SP_SMALL_STACK
  78323. x = (sp_digit*)XMALLOC(sizeof(sp_digit) * 4 * 8, NULL, DYNAMIC_TYPE_ECC);
  78324. if (x == NULL)
  78325. err = MEMORY_E;
  78326. #endif
  78327. if (err == MP_OKAY) {
  78328. y = x + 2 * 8;
  78329. sp_256_from_mp(x, 8, xm);
  78330. err = sp_256_mod_mul_norm_8(x, x, p256_mod);
  78331. }
  78332. if (err == MP_OKAY) {
  78333. /* y = x^3 */
  78334. {
  78335. sp_256_mont_sqr_8(y, x, p256_mod, p256_mp_mod);
  78336. sp_256_mont_mul_8(y, y, x, p256_mod, p256_mp_mod);
  78337. }
  78338. /* y = x^3 - 3x */
  78339. sp_256_mont_sub_8(y, y, x, p256_mod);
  78340. sp_256_mont_sub_8(y, y, x, p256_mod);
  78341. sp_256_mont_sub_8(y, y, x, p256_mod);
  78342. /* y = x^3 - 3x + b */
  78343. err = sp_256_mod_mul_norm_8(x, p256_b, p256_mod);
  78344. }
  78345. if (err == MP_OKAY) {
  78346. sp_256_mont_add_8(y, y, x, p256_mod);
  78347. /* y = sqrt(x^3 - 3x + b) */
  78348. err = sp_256_mont_sqrt_8(y);
  78349. }
  78350. if (err == MP_OKAY) {
  78351. XMEMSET(y + 8, 0, 8U * sizeof(sp_digit));
  78352. sp_256_mont_reduce_8(y, p256_mod, p256_mp_mod);
  78353. if ((((word32)y[0] ^ (word32)odd) & 1U) != 0U) {
  78354. sp_256_mont_sub_8(y, p256_mod, y, p256_mod);
  78355. }
  78356. err = sp_256_to_mp(y, ym);
  78357. }
  78358. #ifdef WOLFSSL_SP_SMALL_STACK
  78359. if (x != NULL)
  78360. XFREE(x, NULL, DYNAMIC_TYPE_ECC);
  78361. #endif
  78362. return err;
  78363. }
  78364. #endif
  78365. #endif /* !WOLFSSL_SP_NO_256 */
  78366. #ifdef WOLFSSL_SP_384
  78367. /* Point structure to use. */
  78368. typedef struct sp_point_384 {
  78369. /* X ordinate of point. */
  78370. sp_digit x[2 * 12];
  78371. /* Y ordinate of point. */
  78372. sp_digit y[2 * 12];
  78373. /* Z ordinate of point. */
  78374. sp_digit z[2 * 12];
  78375. /* Indicates point is at infinity. */
  78376. int infinity;
  78377. } sp_point_384;
  78378. /* The modulus (prime) of the curve P384. */
  78379. static const sp_digit p384_mod[12] = {
  78380. 0xffffffff,0x00000000,0x00000000,0xffffffff,0xfffffffe,0xffffffff,
  78381. 0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff
  78382. };
  78383. /* The Montgomery normalizer for modulus of the curve P384. */
  78384. static const sp_digit p384_norm_mod[12] = {
  78385. 0x00000001,0xffffffff,0xffffffff,0x00000000,0x00000001,0x00000000,
  78386. 0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000
  78387. };
  78388. /* The Montgomery multiplier for modulus of the curve P384. */
  78389. static sp_digit p384_mp_mod = 0x00000001;
  78390. #if defined(WOLFSSL_VALIDATE_ECC_KEYGEN) || defined(HAVE_ECC_SIGN) || \
  78391. defined(HAVE_ECC_VERIFY)
  78392. /* The order of the curve P384. */
  78393. static const sp_digit p384_order[12] = {
  78394. 0xccc52973,0xecec196a,0x48b0a77a,0x581a0db2,0xf4372ddf,0xc7634d81,
  78395. 0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff
  78396. };
  78397. #endif
  78398. /* The order of the curve P384 minus 2. */
  78399. static const sp_digit p384_order2[12] = {
  78400. 0xccc52971,0xecec196a,0x48b0a77a,0x581a0db2,0xf4372ddf,0xc7634d81,
  78401. 0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff
  78402. };
  78403. #if defined(HAVE_ECC_SIGN) || defined(HAVE_ECC_VERIFY)
  78404. /* The Montgomery normalizer for order of the curve P384. */
  78405. static const sp_digit p384_norm_order[12] = {
  78406. 0x333ad68d,0x1313e695,0xb74f5885,0xa7e5f24d,0x0bc8d220,0x389cb27e,
  78407. 0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000
  78408. };
  78409. #endif
  78410. #if defined(HAVE_ECC_SIGN) || defined(HAVE_ECC_VERIFY)
  78411. /* The Montgomery multiplier for order of the curve P384. */
  78412. static sp_digit p384_mp_order = 0xe88fdc45;
  78413. #endif
  78414. /* The base point of curve P384. */
  78415. static const sp_point_384 p384_base = {
  78416. /* X ordinate */
  78417. {
  78418. 0x72760ab7,0x3a545e38,0xbf55296c,0x5502f25d,0x82542a38,0x59f741e0,
  78419. 0x8ba79b98,0x6e1d3b62,0xf320ad74,0x8eb1c71e,0xbe8b0537,0xaa87ca22,
  78420. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  78421. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  78422. (sp_digit)0, (sp_digit)0
  78423. },
  78424. /* Y ordinate */
  78425. {
  78426. 0x90ea0e5f,0x7a431d7c,0x1d7e819d,0x0a60b1ce,0xb5f0b8c0,0xe9da3113,
  78427. 0x289a147c,0xf8f41dbd,0x9292dc29,0x5d9e98bf,0x96262c6f,0x3617de4a,
  78428. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  78429. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  78430. (sp_digit)0, (sp_digit)0
  78431. },
  78432. /* Z ordinate */
  78433. {
  78434. 0x00000001,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,
  78435. 0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,
  78436. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  78437. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  78438. (sp_digit)0, (sp_digit)0
  78439. },
  78440. /* infinity */
  78441. 0
  78442. };
  78443. #if defined(HAVE_ECC_CHECK_KEY) || defined(HAVE_COMP_KEY)
  78444. static const sp_digit p384_b[12] = {
  78445. 0xd3ec2aef,0x2a85c8ed,0x8a2ed19d,0xc656398d,0x5013875a,0x0314088f,
  78446. 0xfe814112,0x181d9c6e,0xe3f82d19,0x988e056b,0xe23ee7e4,0xb3312fa7
  78447. };
  78448. #endif
  78449. #ifdef WOLFSSL_SP_SMALL
  78450. /* Multiply a and b into r. (r = a * b)
  78451. *
  78452. * r A single precision integer.
  78453. * a A single precision integer.
  78454. * b A single precision integer.
  78455. */
  78456. static void sp_384_mul_12(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p)
  78457. {
  78458. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  78459. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  78460. register const sp_digit* b asm ("r2") = (const sp_digit*)b_p;
  78461. __asm__ __volatile__ (
  78462. "sub sp, sp, #0x60\n\t"
  78463. "ldr lr, [%[a]]\n\t"
  78464. "ldr r11, [%[b]]\n\t"
  78465. "umull r8, r6, lr, r11\n\t"
  78466. "str r8, [sp]\n\t"
  78467. "mov r7, #0\n\t"
  78468. "mov r8, #0\n\t"
  78469. "mov r5, #4\n\t"
  78470. "\n"
  78471. "L_sp_384_mul_12_outer_%=: \n\t"
  78472. "subs r3, r5, #44\n\t"
  78473. "it cc\n\t"
  78474. "movcc r3, #0\n\t"
  78475. "sub r4, r5, r3\n\t"
  78476. "\n"
  78477. "L_sp_384_mul_12_inner_%=: \n\t"
  78478. "ldr lr, [%[a], r3]\n\t"
  78479. "ldr r11, [%[b], r4]\n\t"
  78480. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  78481. "lsl r9, lr, #16\n\t"
  78482. "lsl r10, r11, #16\n\t"
  78483. "lsr r9, r9, #16\n\t"
  78484. "lsr r10, r10, #16\n\t"
  78485. "mul r10, r9, r10\n\t"
  78486. "adds r6, r6, r10\n\t"
  78487. "adcs r7, r7, #0\n\t"
  78488. "adc r8, r8, #0\n\t"
  78489. "lsr r10, r11, #16\n\t"
  78490. "mul r9, r10, r9\n\t"
  78491. "lsr r10, r9, #16\n\t"
  78492. "lsl r9, r9, #16\n\t"
  78493. "adds r6, r6, r9\n\t"
  78494. "adcs r7, r7, r10\n\t"
  78495. "adc r8, r8, #0\n\t"
  78496. "lsr r9, lr, #16\n\t"
  78497. "lsr r10, r11, #16\n\t"
  78498. "mul r10, r9, r10\n\t"
  78499. "adds r7, r7, r10\n\t"
  78500. "adc r8, r8, #0\n\t"
  78501. "lsl r10, r11, #16\n\t"
  78502. "lsr r10, r10, #16\n\t"
  78503. "mul r9, r10, r9\n\t"
  78504. "lsr r10, r9, #16\n\t"
  78505. "lsl r9, r9, #16\n\t"
  78506. "adds r6, r6, r9\n\t"
  78507. "adcs r7, r7, r10\n\t"
  78508. "adc r8, r8, #0\n\t"
  78509. #else
  78510. "umull r9, r10, lr, r11\n\t"
  78511. "adds r6, r6, r9\n\t"
  78512. "adcs r7, r7, r10\n\t"
  78513. "adc r8, r8, #0\n\t"
  78514. #endif
  78515. "ldr lr, [%[a], r4]\n\t"
  78516. "ldr r11, [%[b], r3]\n\t"
  78517. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  78518. "lsl r9, lr, #16\n\t"
  78519. "lsl r10, r11, #16\n\t"
  78520. "lsr r9, r9, #16\n\t"
  78521. "lsr r10, r10, #16\n\t"
  78522. "mul r10, r9, r10\n\t"
  78523. "adds r6, r6, r10\n\t"
  78524. "adcs r7, r7, #0\n\t"
  78525. "adc r8, r8, #0\n\t"
  78526. "lsr r10, r11, #16\n\t"
  78527. "mul r9, r10, r9\n\t"
  78528. "lsr r10, r9, #16\n\t"
  78529. "lsl r9, r9, #16\n\t"
  78530. "adds r6, r6, r9\n\t"
  78531. "adcs r7, r7, r10\n\t"
  78532. "adc r8, r8, #0\n\t"
  78533. "lsr r9, lr, #16\n\t"
  78534. "lsr r10, r11, #16\n\t"
  78535. "mul r10, r9, r10\n\t"
  78536. "adds r7, r7, r10\n\t"
  78537. "adc r8, r8, #0\n\t"
  78538. "lsl r10, r11, #16\n\t"
  78539. "lsr r10, r10, #16\n\t"
  78540. "mul r9, r10, r9\n\t"
  78541. "lsr r10, r9, #16\n\t"
  78542. "lsl r9, r9, #16\n\t"
  78543. "adds r6, r6, r9\n\t"
  78544. "adcs r7, r7, r10\n\t"
  78545. "adc r8, r8, #0\n\t"
  78546. #else
  78547. "umull r9, r10, lr, r11\n\t"
  78548. "adds r6, r6, r9\n\t"
  78549. "adcs r7, r7, r10\n\t"
  78550. "adc r8, r8, #0\n\t"
  78551. #endif
  78552. "add r3, r3, #4\n\t"
  78553. "sub r4, r4, #4\n\t"
  78554. "cmp r3, r4\n\t"
  78555. "bgt L_sp_384_mul_12_inner_done_%=\n\t"
  78556. "blt L_sp_384_mul_12_inner_%=\n\t"
  78557. "ldr lr, [%[a], r3]\n\t"
  78558. "ldr r11, [%[b], r3]\n\t"
  78559. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  78560. "lsl r9, lr, #16\n\t"
  78561. "lsl r10, r11, #16\n\t"
  78562. "lsr r9, r9, #16\n\t"
  78563. "lsr r10, r10, #16\n\t"
  78564. "mul r10, r9, r10\n\t"
  78565. "adds r6, r6, r10\n\t"
  78566. "adcs r7, r7, #0\n\t"
  78567. "adc r8, r8, #0\n\t"
  78568. "lsr r10, r11, #16\n\t"
  78569. "mul r9, r10, r9\n\t"
  78570. "lsr r10, r9, #16\n\t"
  78571. "lsl r9, r9, #16\n\t"
  78572. "adds r6, r6, r9\n\t"
  78573. "adcs r7, r7, r10\n\t"
  78574. "adc r8, r8, #0\n\t"
  78575. "lsr r9, lr, #16\n\t"
  78576. "lsr r10, r11, #16\n\t"
  78577. "mul r10, r9, r10\n\t"
  78578. "adds r7, r7, r10\n\t"
  78579. "adc r8, r8, #0\n\t"
  78580. "lsl r10, r11, #16\n\t"
  78581. "lsr r10, r10, #16\n\t"
  78582. "mul r9, r10, r9\n\t"
  78583. "lsr r10, r9, #16\n\t"
  78584. "lsl r9, r9, #16\n\t"
  78585. "adds r6, r6, r9\n\t"
  78586. "adcs r7, r7, r10\n\t"
  78587. "adc r8, r8, #0\n\t"
  78588. #else
  78589. "umull r9, r10, lr, r11\n\t"
  78590. "adds r6, r6, r9\n\t"
  78591. "adcs r7, r7, r10\n\t"
  78592. "adc r8, r8, #0\n\t"
  78593. #endif
  78594. "\n"
  78595. "L_sp_384_mul_12_inner_done_%=: \n\t"
  78596. "str r6, [sp, r5]\n\t"
  78597. "mov r6, r7\n\t"
  78598. "mov r7, r8\n\t"
  78599. "mov r8, #0\n\t"
  78600. "add r5, r5, #4\n\t"
  78601. "cmp r5, #0x54\n\t"
  78602. "ble L_sp_384_mul_12_outer_%=\n\t"
  78603. "ldr lr, [%[a], #44]\n\t"
  78604. "ldr r11, [%[b], #44]\n\t"
  78605. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  78606. "lsl r9, lr, #16\n\t"
  78607. "lsl r10, r11, #16\n\t"
  78608. "lsr r9, r9, #16\n\t"
  78609. "lsr r10, r10, #16\n\t"
  78610. "mul r10, r9, r10\n\t"
  78611. "adds r6, r6, r10\n\t"
  78612. "adc r7, r7, #0\n\t"
  78613. "lsr r10, r11, #16\n\t"
  78614. "mul r9, r10, r9\n\t"
  78615. "lsr r10, r9, #16\n\t"
  78616. "lsl r9, r9, #16\n\t"
  78617. "adds r6, r6, r9\n\t"
  78618. "adc r7, r7, r10\n\t"
  78619. "lsr r9, lr, #16\n\t"
  78620. "lsr r10, r11, #16\n\t"
  78621. "mul r10, r9, r10\n\t"
  78622. "add r7, r7, r10\n\t"
  78623. "lsl r10, r11, #16\n\t"
  78624. "lsr r10, r10, #16\n\t"
  78625. "mul r9, r10, r9\n\t"
  78626. "lsr r10, r9, #16\n\t"
  78627. "lsl r9, r9, #16\n\t"
  78628. "adds r6, r6, r9\n\t"
  78629. "adc r7, r7, r10\n\t"
  78630. #else
  78631. "umlal r6, r7, lr, r11\n\t"
  78632. #endif
  78633. "str r6, [sp, r5]\n\t"
  78634. "add r5, r5, #4\n\t"
  78635. "str r7, [sp, r5]\n\t"
  78636. "\n"
  78637. "L_sp_384_mul_12_store_%=: \n\t"
  78638. "ldm sp!, {r3, r4, r6, r7, r8, r9, r10, r11}\n\t"
  78639. "stm %[r]!, {r3, r4, r6, r7, r8, r9, r10, r11}\n\t"
  78640. "subs r5, r5, #32\n\t"
  78641. "bgt L_sp_384_mul_12_store_%=\n\t"
  78642. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  78643. :
  78644. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "lr", "r11", "cc"
  78645. );
  78646. }
  78647. #else
  78648. /* Multiply a and b into r. (r = a * b)
  78649. *
  78650. * r A single precision integer.
  78651. * a A single precision integer.
  78652. * b A single precision integer.
  78653. */
  78654. static void sp_384_mul_12(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p)
  78655. {
  78656. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  78657. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  78658. register const sp_digit* b asm ("r2") = (const sp_digit*)b_p;
  78659. __asm__ __volatile__ (
  78660. "sub sp, sp, #48\n\t"
  78661. /* A[0] * B[0] */
  78662. "ldr r11, [%[a]]\n\t"
  78663. "ldr r12, [%[b]]\n\t"
  78664. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  78665. "lsl r6, r11, #16\n\t"
  78666. "lsl r3, r12, #16\n\t"
  78667. "lsr r6, r6, #16\n\t"
  78668. "lsr r3, r3, #16\n\t"
  78669. "mul r3, r6, r3\n\t"
  78670. "lsr r7, r12, #16\n\t"
  78671. "mul r6, r7, r6\n\t"
  78672. "lsr r4, r6, #16\n\t"
  78673. "lsl r6, r6, #16\n\t"
  78674. "adds r3, r3, r6\n\t"
  78675. "adc r4, r4, #0\n\t"
  78676. "lsr r6, r11, #16\n\t"
  78677. "mul r7, r6, r7\n\t"
  78678. "add r4, r4, r7\n\t"
  78679. "lsl r7, r12, #16\n\t"
  78680. "lsr r7, r7, #16\n\t"
  78681. "mul r6, r7, r6\n\t"
  78682. "lsr r7, r6, #16\n\t"
  78683. "lsl r6, r6, #16\n\t"
  78684. "adds r3, r3, r6\n\t"
  78685. "adc r4, r4, r7\n\t"
  78686. "mov r5, #0\n\t"
  78687. #else
  78688. "umull r3, r4, r11, r12\n\t"
  78689. "mov r5, #0\n\t"
  78690. #endif
  78691. "str r3, [sp]\n\t"
  78692. /* A[0] * B[1] */
  78693. "ldr r9, [%[b], #4]\n\t"
  78694. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  78695. "lsl r6, r11, #16\n\t"
  78696. "lsl r7, r9, #16\n\t"
  78697. "lsr r6, r6, #16\n\t"
  78698. "lsr r7, r7, #16\n\t"
  78699. "mul r7, r6, r7\n\t"
  78700. "adds r4, r4, r7\n\t"
  78701. "adcs r5, r5, #0\n\t"
  78702. "mov r3, #0\n\t"
  78703. "adc r3, r3, #0\n\t"
  78704. "lsr r7, r9, #16\n\t"
  78705. "mul r6, r7, r6\n\t"
  78706. "lsr r7, r6, #16\n\t"
  78707. "lsl r6, r6, #16\n\t"
  78708. "adds r4, r4, r6\n\t"
  78709. "adcs r5, r5, r7\n\t"
  78710. "adc r3, r3, #0\n\t"
  78711. "lsr r6, r11, #16\n\t"
  78712. "lsr r7, r9, #16\n\t"
  78713. "mul r7, r6, r7\n\t"
  78714. "adds r5, r5, r7\n\t"
  78715. "adc r3, r3, #0\n\t"
  78716. "lsl r7, r9, #16\n\t"
  78717. "lsr r7, r7, #16\n\t"
  78718. "mul r6, r7, r6\n\t"
  78719. "lsr r7, r6, #16\n\t"
  78720. "lsl r6, r6, #16\n\t"
  78721. "adds r4, r4, r6\n\t"
  78722. "adcs r5, r5, r7\n\t"
  78723. "adc r3, r3, #0\n\t"
  78724. #else
  78725. "umull r6, r7, r11, r9\n\t"
  78726. "adds r4, r4, r6\n\t"
  78727. "adcs r5, r5, r7\n\t"
  78728. "mov r3, #0\n\t"
  78729. "adc r3, r3, #0\n\t"
  78730. #endif
  78731. /* A[1] * B[0] */
  78732. "ldr r8, [%[a], #4]\n\t"
  78733. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  78734. "lsl r6, r8, #16\n\t"
  78735. "lsl r7, r12, #16\n\t"
  78736. "lsr r6, r6, #16\n\t"
  78737. "lsr r7, r7, #16\n\t"
  78738. "mul r7, r6, r7\n\t"
  78739. "adds r4, r4, r7\n\t"
  78740. "adcs r5, r5, #0\n\t"
  78741. "adc r3, r3, #0\n\t"
  78742. "lsr r7, r12, #16\n\t"
  78743. "mul r6, r7, r6\n\t"
  78744. "lsr r7, r6, #16\n\t"
  78745. "lsl r6, r6, #16\n\t"
  78746. "adds r4, r4, r6\n\t"
  78747. "adcs r5, r5, r7\n\t"
  78748. "adc r3, r3, #0\n\t"
  78749. "lsr r6, r8, #16\n\t"
  78750. "lsr r7, r12, #16\n\t"
  78751. "mul r7, r6, r7\n\t"
  78752. "adds r5, r5, r7\n\t"
  78753. "adc r3, r3, #0\n\t"
  78754. "lsl r7, r12, #16\n\t"
  78755. "lsr r7, r7, #16\n\t"
  78756. "mul r6, r7, r6\n\t"
  78757. "lsr r7, r6, #16\n\t"
  78758. "lsl r6, r6, #16\n\t"
  78759. "adds r4, r4, r6\n\t"
  78760. "adcs r5, r5, r7\n\t"
  78761. "adc r3, r3, #0\n\t"
  78762. #else
  78763. "umull r6, r7, r8, r12\n\t"
  78764. "adds r4, r4, r6\n\t"
  78765. "adcs r5, r5, r7\n\t"
  78766. "adc r3, r3, #0\n\t"
  78767. #endif
  78768. "str r4, [sp, #4]\n\t"
  78769. /* A[2] * B[0] */
  78770. "ldr r8, [%[a], #8]\n\t"
  78771. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  78772. "lsl r6, r8, #16\n\t"
  78773. "lsl r7, r12, #16\n\t"
  78774. "lsr r6, r6, #16\n\t"
  78775. "lsr r7, r7, #16\n\t"
  78776. "mul r7, r6, r7\n\t"
  78777. "adds r5, r5, r7\n\t"
  78778. "adcs r3, r3, #0\n\t"
  78779. "mov r4, #0\n\t"
  78780. "adc r4, r4, #0\n\t"
  78781. "lsr r7, r12, #16\n\t"
  78782. "mul r6, r7, r6\n\t"
  78783. "lsr r7, r6, #16\n\t"
  78784. "lsl r6, r6, #16\n\t"
  78785. "adds r5, r5, r6\n\t"
  78786. "adcs r3, r3, r7\n\t"
  78787. "adc r4, r4, #0\n\t"
  78788. "lsr r6, r8, #16\n\t"
  78789. "lsr r7, r12, #16\n\t"
  78790. "mul r7, r6, r7\n\t"
  78791. "adds r3, r3, r7\n\t"
  78792. "adc r4, r4, #0\n\t"
  78793. "lsl r7, r12, #16\n\t"
  78794. "lsr r7, r7, #16\n\t"
  78795. "mul r6, r7, r6\n\t"
  78796. "lsr r7, r6, #16\n\t"
  78797. "lsl r6, r6, #16\n\t"
  78798. "adds r5, r5, r6\n\t"
  78799. "adcs r3, r3, r7\n\t"
  78800. "adc r4, r4, #0\n\t"
  78801. #else
  78802. "umull r6, r7, r8, r12\n\t"
  78803. "adds r5, r5, r6\n\t"
  78804. "adcs r3, r3, r7\n\t"
  78805. "mov r4, #0\n\t"
  78806. "adc r4, r4, #0\n\t"
  78807. #endif
  78808. /* A[1] * B[1] */
  78809. "ldr r11, [%[a], #4]\n\t"
  78810. "ldr r12, [%[b], #4]\n\t"
  78811. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  78812. "lsl r6, r11, #16\n\t"
  78813. "lsl r7, r12, #16\n\t"
  78814. "lsr r6, r6, #16\n\t"
  78815. "lsr r7, r7, #16\n\t"
  78816. "mul r7, r6, r7\n\t"
  78817. "adds r5, r5, r7\n\t"
  78818. "adcs r3, r3, #0\n\t"
  78819. "adc r4, r4, #0\n\t"
  78820. "lsr r7, r12, #16\n\t"
  78821. "mul r6, r7, r6\n\t"
  78822. "lsr r7, r6, #16\n\t"
  78823. "lsl r6, r6, #16\n\t"
  78824. "adds r5, r5, r6\n\t"
  78825. "adcs r3, r3, r7\n\t"
  78826. "adc r4, r4, #0\n\t"
  78827. "lsr r6, r11, #16\n\t"
  78828. "lsr r7, r12, #16\n\t"
  78829. "mul r7, r6, r7\n\t"
  78830. "adds r3, r3, r7\n\t"
  78831. "adc r4, r4, #0\n\t"
  78832. "lsl r7, r12, #16\n\t"
  78833. "lsr r7, r7, #16\n\t"
  78834. "mul r6, r7, r6\n\t"
  78835. "lsr r7, r6, #16\n\t"
  78836. "lsl r6, r6, #16\n\t"
  78837. "adds r5, r5, r6\n\t"
  78838. "adcs r3, r3, r7\n\t"
  78839. "adc r4, r4, #0\n\t"
  78840. #else
  78841. "umull r6, r7, r11, r12\n\t"
  78842. "adds r5, r5, r6\n\t"
  78843. "adcs r3, r3, r7\n\t"
  78844. "adc r4, r4, #0\n\t"
  78845. #endif
  78846. /* A[0] * B[2] */
  78847. "ldr r8, [%[a]]\n\t"
  78848. "ldr r9, [%[b], #8]\n\t"
  78849. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  78850. "lsl r6, r8, #16\n\t"
  78851. "lsl r7, r9, #16\n\t"
  78852. "lsr r6, r6, #16\n\t"
  78853. "lsr r7, r7, #16\n\t"
  78854. "mul r7, r6, r7\n\t"
  78855. "adds r5, r5, r7\n\t"
  78856. "adcs r3, r3, #0\n\t"
  78857. "adc r4, r4, #0\n\t"
  78858. "lsr r7, r9, #16\n\t"
  78859. "mul r6, r7, r6\n\t"
  78860. "lsr r7, r6, #16\n\t"
  78861. "lsl r6, r6, #16\n\t"
  78862. "adds r5, r5, r6\n\t"
  78863. "adcs r3, r3, r7\n\t"
  78864. "adc r4, r4, #0\n\t"
  78865. "lsr r6, r8, #16\n\t"
  78866. "lsr r7, r9, #16\n\t"
  78867. "mul r7, r6, r7\n\t"
  78868. "adds r3, r3, r7\n\t"
  78869. "adc r4, r4, #0\n\t"
  78870. "lsl r7, r9, #16\n\t"
  78871. "lsr r7, r7, #16\n\t"
  78872. "mul r6, r7, r6\n\t"
  78873. "lsr r7, r6, #16\n\t"
  78874. "lsl r6, r6, #16\n\t"
  78875. "adds r5, r5, r6\n\t"
  78876. "adcs r3, r3, r7\n\t"
  78877. "adc r4, r4, #0\n\t"
  78878. #else
  78879. "umull r6, r7, r8, r9\n\t"
  78880. "adds r5, r5, r6\n\t"
  78881. "adcs r3, r3, r7\n\t"
  78882. "adc r4, r4, #0\n\t"
  78883. #endif
  78884. "str r5, [sp, #8]\n\t"
  78885. /* A[0] * B[3] */
  78886. "ldr r9, [%[b], #12]\n\t"
  78887. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  78888. "lsl r6, r8, #16\n\t"
  78889. "lsl r7, r9, #16\n\t"
  78890. "lsr r6, r6, #16\n\t"
  78891. "lsr r7, r7, #16\n\t"
  78892. "mul r7, r6, r7\n\t"
  78893. "adds r3, r3, r7\n\t"
  78894. "adcs r4, r4, #0\n\t"
  78895. "mov r5, #0\n\t"
  78896. "adc r5, r5, #0\n\t"
  78897. "lsr r7, r9, #16\n\t"
  78898. "mul r6, r7, r6\n\t"
  78899. "lsr r7, r6, #16\n\t"
  78900. "lsl r6, r6, #16\n\t"
  78901. "adds r3, r3, r6\n\t"
  78902. "adcs r4, r4, r7\n\t"
  78903. "adc r5, r5, #0\n\t"
  78904. "lsr r6, r8, #16\n\t"
  78905. "lsr r7, r9, #16\n\t"
  78906. "mul r7, r6, r7\n\t"
  78907. "adds r4, r4, r7\n\t"
  78908. "adc r5, r5, #0\n\t"
  78909. "lsl r7, r9, #16\n\t"
  78910. "lsr r7, r7, #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 r3, r3, r6\n\t"
  78915. "adcs r4, r4, r7\n\t"
  78916. "adc r5, r5, #0\n\t"
  78917. #else
  78918. "umull r6, r7, r8, r9\n\t"
  78919. "adds r3, r3, r6\n\t"
  78920. "adcs r4, r4, r7\n\t"
  78921. "mov r5, #0\n\t"
  78922. "adc r5, r5, #0\n\t"
  78923. #endif
  78924. /* A[1] * B[2] */
  78925. "ldr r9, [%[b], #8]\n\t"
  78926. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  78927. "lsl r6, r11, #16\n\t"
  78928. "lsl r7, r9, #16\n\t"
  78929. "lsr r6, r6, #16\n\t"
  78930. "lsr r7, r7, #16\n\t"
  78931. "mul r7, r6, r7\n\t"
  78932. "adds r3, r3, r7\n\t"
  78933. "adcs r4, r4, #0\n\t"
  78934. "adc r5, r5, #0\n\t"
  78935. "lsr r7, r9, #16\n\t"
  78936. "mul r6, r7, r6\n\t"
  78937. "lsr r7, r6, #16\n\t"
  78938. "lsl r6, r6, #16\n\t"
  78939. "adds r3, r3, r6\n\t"
  78940. "adcs r4, r4, r7\n\t"
  78941. "adc r5, r5, #0\n\t"
  78942. "lsr r6, r11, #16\n\t"
  78943. "lsr r7, r9, #16\n\t"
  78944. "mul r7, r6, r7\n\t"
  78945. "adds r4, r4, r7\n\t"
  78946. "adc r5, r5, #0\n\t"
  78947. "lsl r7, r9, #16\n\t"
  78948. "lsr r7, r7, #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 r3, r3, r6\n\t"
  78953. "adcs r4, r4, r7\n\t"
  78954. "adc r5, r5, #0\n\t"
  78955. #else
  78956. "umull r6, r7, r11, r9\n\t"
  78957. "adds r3, r3, r6\n\t"
  78958. "adcs r4, r4, r7\n\t"
  78959. "adc r5, r5, #0\n\t"
  78960. #endif
  78961. /* A[2] * B[1] */
  78962. "ldr r8, [%[a], #8]\n\t"
  78963. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  78964. "lsl r6, r8, #16\n\t"
  78965. "lsl r7, r12, #16\n\t"
  78966. "lsr r6, r6, #16\n\t"
  78967. "lsr r7, r7, #16\n\t"
  78968. "mul r7, r6, r7\n\t"
  78969. "adds r3, r3, r7\n\t"
  78970. "adcs r4, r4, #0\n\t"
  78971. "adc r5, r5, #0\n\t"
  78972. "lsr r7, r12, #16\n\t"
  78973. "mul r6, r7, r6\n\t"
  78974. "lsr r7, r6, #16\n\t"
  78975. "lsl r6, r6, #16\n\t"
  78976. "adds r3, r3, r6\n\t"
  78977. "adcs r4, r4, r7\n\t"
  78978. "adc r5, r5, #0\n\t"
  78979. "lsr r6, r8, #16\n\t"
  78980. "lsr r7, r12, #16\n\t"
  78981. "mul r7, r6, r7\n\t"
  78982. "adds r4, r4, r7\n\t"
  78983. "adc r5, r5, #0\n\t"
  78984. "lsl r7, r12, #16\n\t"
  78985. "lsr r7, r7, #16\n\t"
  78986. "mul r6, r7, r6\n\t"
  78987. "lsr r7, r6, #16\n\t"
  78988. "lsl r6, r6, #16\n\t"
  78989. "adds r3, r3, r6\n\t"
  78990. "adcs r4, r4, r7\n\t"
  78991. "adc r5, r5, #0\n\t"
  78992. #else
  78993. "umull r6, r7, r8, r12\n\t"
  78994. "adds r3, r3, r6\n\t"
  78995. "adcs r4, r4, r7\n\t"
  78996. "adc r5, r5, #0\n\t"
  78997. #endif
  78998. /* A[3] * B[0] */
  78999. "ldr r8, [%[a], #12]\n\t"
  79000. "ldr r9, [%[b]]\n\t"
  79001. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  79002. "lsl r6, r8, #16\n\t"
  79003. "lsl r7, r9, #16\n\t"
  79004. "lsr r6, r6, #16\n\t"
  79005. "lsr r7, r7, #16\n\t"
  79006. "mul r7, r6, r7\n\t"
  79007. "adds r3, r3, r7\n\t"
  79008. "adcs r4, r4, #0\n\t"
  79009. "adc r5, r5, #0\n\t"
  79010. "lsr r7, r9, #16\n\t"
  79011. "mul r6, r7, r6\n\t"
  79012. "lsr r7, r6, #16\n\t"
  79013. "lsl r6, r6, #16\n\t"
  79014. "adds r3, r3, r6\n\t"
  79015. "adcs r4, r4, r7\n\t"
  79016. "adc r5, r5, #0\n\t"
  79017. "lsr r6, r8, #16\n\t"
  79018. "lsr r7, r9, #16\n\t"
  79019. "mul r7, r6, r7\n\t"
  79020. "adds r4, r4, r7\n\t"
  79021. "adc r5, r5, #0\n\t"
  79022. "lsl r7, r9, #16\n\t"
  79023. "lsr r7, r7, #16\n\t"
  79024. "mul r6, r7, r6\n\t"
  79025. "lsr r7, r6, #16\n\t"
  79026. "lsl r6, r6, #16\n\t"
  79027. "adds r3, r3, r6\n\t"
  79028. "adcs r4, r4, r7\n\t"
  79029. "adc r5, r5, #0\n\t"
  79030. #else
  79031. "umull r6, r7, r8, r9\n\t"
  79032. "adds r3, r3, r6\n\t"
  79033. "adcs r4, r4, r7\n\t"
  79034. "adc r5, r5, #0\n\t"
  79035. #endif
  79036. "str r3, [sp, #12]\n\t"
  79037. /* A[4] * B[0] */
  79038. "ldr r8, [%[a], #16]\n\t"
  79039. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  79040. "lsl r6, r8, #16\n\t"
  79041. "lsl r7, r9, #16\n\t"
  79042. "lsr r6, r6, #16\n\t"
  79043. "lsr r7, r7, #16\n\t"
  79044. "mul r7, r6, r7\n\t"
  79045. "adds r4, r4, r7\n\t"
  79046. "adcs r5, r5, #0\n\t"
  79047. "mov r3, #0\n\t"
  79048. "adc r3, r3, #0\n\t"
  79049. "lsr r7, r9, #16\n\t"
  79050. "mul r6, r7, r6\n\t"
  79051. "lsr r7, r6, #16\n\t"
  79052. "lsl r6, r6, #16\n\t"
  79053. "adds r4, r4, r6\n\t"
  79054. "adcs r5, r5, r7\n\t"
  79055. "adc r3, r3, #0\n\t"
  79056. "lsr r6, r8, #16\n\t"
  79057. "lsr r7, r9, #16\n\t"
  79058. "mul r7, r6, r7\n\t"
  79059. "adds r5, r5, r7\n\t"
  79060. "adc r3, r3, #0\n\t"
  79061. "lsl r7, r9, #16\n\t"
  79062. "lsr r7, r7, #16\n\t"
  79063. "mul r6, r7, r6\n\t"
  79064. "lsr r7, r6, #16\n\t"
  79065. "lsl r6, r6, #16\n\t"
  79066. "adds r4, r4, r6\n\t"
  79067. "adcs r5, r5, r7\n\t"
  79068. "adc r3, r3, #0\n\t"
  79069. #else
  79070. "umull r6, r7, r8, r9\n\t"
  79071. "adds r4, r4, r6\n\t"
  79072. "adcs r5, r5, r7\n\t"
  79073. "mov r3, #0\n\t"
  79074. "adc r3, r3, #0\n\t"
  79075. #endif
  79076. /* A[3] * B[1] */
  79077. "ldr r8, [%[a], #12]\n\t"
  79078. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  79079. "lsl r6, r8, #16\n\t"
  79080. "lsl r7, r12, #16\n\t"
  79081. "lsr r6, r6, #16\n\t"
  79082. "lsr r7, r7, #16\n\t"
  79083. "mul r7, r6, r7\n\t"
  79084. "adds r4, r4, r7\n\t"
  79085. "adcs r5, r5, #0\n\t"
  79086. "adc r3, r3, #0\n\t"
  79087. "lsr r7, r12, #16\n\t"
  79088. "mul r6, r7, r6\n\t"
  79089. "lsr r7, r6, #16\n\t"
  79090. "lsl r6, r6, #16\n\t"
  79091. "adds r4, r4, r6\n\t"
  79092. "adcs r5, r5, r7\n\t"
  79093. "adc r3, r3, #0\n\t"
  79094. "lsr r6, r8, #16\n\t"
  79095. "lsr r7, r12, #16\n\t"
  79096. "mul r7, r6, r7\n\t"
  79097. "adds r5, r5, r7\n\t"
  79098. "adc r3, r3, #0\n\t"
  79099. "lsl r7, r12, #16\n\t"
  79100. "lsr r7, r7, #16\n\t"
  79101. "mul r6, r7, r6\n\t"
  79102. "lsr r7, r6, #16\n\t"
  79103. "lsl r6, r6, #16\n\t"
  79104. "adds r4, r4, r6\n\t"
  79105. "adcs r5, r5, r7\n\t"
  79106. "adc r3, r3, #0\n\t"
  79107. #else
  79108. "umull r6, r7, r8, r12\n\t"
  79109. "adds r4, r4, r6\n\t"
  79110. "adcs r5, r5, r7\n\t"
  79111. "adc r3, r3, #0\n\t"
  79112. #endif
  79113. /* A[2] * B[2] */
  79114. "ldr r11, [%[a], #8]\n\t"
  79115. "ldr r12, [%[b], #8]\n\t"
  79116. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  79117. "lsl r6, r11, #16\n\t"
  79118. "lsl r7, r12, #16\n\t"
  79119. "lsr r6, r6, #16\n\t"
  79120. "lsr r7, r7, #16\n\t"
  79121. "mul r7, r6, r7\n\t"
  79122. "adds r4, r4, r7\n\t"
  79123. "adcs r5, r5, #0\n\t"
  79124. "adc r3, r3, #0\n\t"
  79125. "lsr r7, r12, #16\n\t"
  79126. "mul r6, r7, r6\n\t"
  79127. "lsr r7, r6, #16\n\t"
  79128. "lsl r6, r6, #16\n\t"
  79129. "adds r4, r4, r6\n\t"
  79130. "adcs r5, r5, r7\n\t"
  79131. "adc r3, r3, #0\n\t"
  79132. "lsr r6, r11, #16\n\t"
  79133. "lsr r7, r12, #16\n\t"
  79134. "mul r7, r6, r7\n\t"
  79135. "adds r5, r5, r7\n\t"
  79136. "adc r3, r3, #0\n\t"
  79137. "lsl r7, r12, #16\n\t"
  79138. "lsr r7, r7, #16\n\t"
  79139. "mul r6, r7, r6\n\t"
  79140. "lsr r7, r6, #16\n\t"
  79141. "lsl r6, r6, #16\n\t"
  79142. "adds r4, r4, r6\n\t"
  79143. "adcs r5, r5, r7\n\t"
  79144. "adc r3, r3, #0\n\t"
  79145. #else
  79146. "umull r6, r7, r11, r12\n\t"
  79147. "adds r4, r4, r6\n\t"
  79148. "adcs r5, r5, r7\n\t"
  79149. "adc r3, r3, #0\n\t"
  79150. #endif
  79151. /* A[1] * B[3] */
  79152. "ldr r8, [%[a], #4]\n\t"
  79153. "ldr r9, [%[b], #12]\n\t"
  79154. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  79155. "lsl r6, r8, #16\n\t"
  79156. "lsl r7, r9, #16\n\t"
  79157. "lsr r6, r6, #16\n\t"
  79158. "lsr r7, r7, #16\n\t"
  79159. "mul r7, r6, r7\n\t"
  79160. "adds r4, r4, r7\n\t"
  79161. "adcs r5, r5, #0\n\t"
  79162. "adc r3, r3, #0\n\t"
  79163. "lsr r7, r9, #16\n\t"
  79164. "mul r6, r7, r6\n\t"
  79165. "lsr r7, r6, #16\n\t"
  79166. "lsl r6, r6, #16\n\t"
  79167. "adds r4, r4, r6\n\t"
  79168. "adcs r5, r5, r7\n\t"
  79169. "adc r3, r3, #0\n\t"
  79170. "lsr r6, r8, #16\n\t"
  79171. "lsr r7, r9, #16\n\t"
  79172. "mul r7, r6, r7\n\t"
  79173. "adds r5, r5, r7\n\t"
  79174. "adc r3, r3, #0\n\t"
  79175. "lsl r7, r9, #16\n\t"
  79176. "lsr r7, r7, #16\n\t"
  79177. "mul r6, r7, r6\n\t"
  79178. "lsr r7, r6, #16\n\t"
  79179. "lsl r6, r6, #16\n\t"
  79180. "adds r4, r4, r6\n\t"
  79181. "adcs r5, r5, r7\n\t"
  79182. "adc r3, r3, #0\n\t"
  79183. #else
  79184. "umull r6, r7, r8, r9\n\t"
  79185. "adds r4, r4, r6\n\t"
  79186. "adcs r5, r5, r7\n\t"
  79187. "adc r3, r3, #0\n\t"
  79188. #endif
  79189. /* A[0] * B[4] */
  79190. "ldr r8, [%[a]]\n\t"
  79191. "ldr r9, [%[b], #16]\n\t"
  79192. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  79193. "lsl r6, r8, #16\n\t"
  79194. "lsl r7, r9, #16\n\t"
  79195. "lsr r6, r6, #16\n\t"
  79196. "lsr r7, r7, #16\n\t"
  79197. "mul r7, r6, r7\n\t"
  79198. "adds r4, r4, r7\n\t"
  79199. "adcs r5, r5, #0\n\t"
  79200. "adc r3, r3, #0\n\t"
  79201. "lsr r7, r9, #16\n\t"
  79202. "mul r6, r7, r6\n\t"
  79203. "lsr r7, r6, #16\n\t"
  79204. "lsl r6, r6, #16\n\t"
  79205. "adds r4, r4, r6\n\t"
  79206. "adcs r5, r5, r7\n\t"
  79207. "adc r3, r3, #0\n\t"
  79208. "lsr r6, r8, #16\n\t"
  79209. "lsr r7, r9, #16\n\t"
  79210. "mul r7, r6, r7\n\t"
  79211. "adds r5, r5, r7\n\t"
  79212. "adc r3, r3, #0\n\t"
  79213. "lsl r7, r9, #16\n\t"
  79214. "lsr r7, r7, #16\n\t"
  79215. "mul r6, r7, r6\n\t"
  79216. "lsr r7, r6, #16\n\t"
  79217. "lsl r6, r6, #16\n\t"
  79218. "adds r4, r4, r6\n\t"
  79219. "adcs r5, r5, r7\n\t"
  79220. "adc r3, r3, #0\n\t"
  79221. #else
  79222. "umull r6, r7, r8, r9\n\t"
  79223. "adds r4, r4, r6\n\t"
  79224. "adcs r5, r5, r7\n\t"
  79225. "adc r3, r3, #0\n\t"
  79226. #endif
  79227. "str r4, [sp, #16]\n\t"
  79228. /* A[0] * B[5] */
  79229. "ldr r9, [%[b], #20]\n\t"
  79230. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  79231. "lsl r6, r8, #16\n\t"
  79232. "lsl r7, r9, #16\n\t"
  79233. "lsr r6, r6, #16\n\t"
  79234. "lsr r7, r7, #16\n\t"
  79235. "mul r7, r6, r7\n\t"
  79236. "adds r5, r5, r7\n\t"
  79237. "adcs r3, r3, #0\n\t"
  79238. "mov r4, #0\n\t"
  79239. "adc r4, r4, #0\n\t"
  79240. "lsr r7, r9, #16\n\t"
  79241. "mul r6, r7, r6\n\t"
  79242. "lsr r7, r6, #16\n\t"
  79243. "lsl r6, r6, #16\n\t"
  79244. "adds r5, r5, r6\n\t"
  79245. "adcs r3, r3, r7\n\t"
  79246. "adc r4, r4, #0\n\t"
  79247. "lsr r6, r8, #16\n\t"
  79248. "lsr r7, r9, #16\n\t"
  79249. "mul r7, r6, r7\n\t"
  79250. "adds r3, r3, r7\n\t"
  79251. "adc r4, r4, #0\n\t"
  79252. "lsl r7, r9, #16\n\t"
  79253. "lsr r7, r7, #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. #else
  79261. "umull r6, r7, r8, r9\n\t"
  79262. "adds r5, r5, r6\n\t"
  79263. "adcs r3, r3, r7\n\t"
  79264. "mov r4, #0\n\t"
  79265. "adc r4, r4, #0\n\t"
  79266. #endif
  79267. /* A[1] * B[4] */
  79268. "ldr r8, [%[a], #4]\n\t"
  79269. "ldr r9, [%[b], #16]\n\t"
  79270. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  79271. "lsl r6, r8, #16\n\t"
  79272. "lsl r7, r9, #16\n\t"
  79273. "lsr r6, r6, #16\n\t"
  79274. "lsr r7, r7, #16\n\t"
  79275. "mul r7, r6, r7\n\t"
  79276. "adds r5, r5, r7\n\t"
  79277. "adcs r3, r3, #0\n\t"
  79278. "adc r4, r4, #0\n\t"
  79279. "lsr r7, r9, #16\n\t"
  79280. "mul r6, r7, r6\n\t"
  79281. "lsr r7, r6, #16\n\t"
  79282. "lsl r6, r6, #16\n\t"
  79283. "adds r5, r5, r6\n\t"
  79284. "adcs r3, r3, r7\n\t"
  79285. "adc r4, r4, #0\n\t"
  79286. "lsr r6, r8, #16\n\t"
  79287. "lsr r7, r9, #16\n\t"
  79288. "mul r7, r6, r7\n\t"
  79289. "adds r3, r3, r7\n\t"
  79290. "adc r4, r4, #0\n\t"
  79291. "lsl r7, r9, #16\n\t"
  79292. "lsr r7, r7, #16\n\t"
  79293. "mul r6, r7, r6\n\t"
  79294. "lsr r7, r6, #16\n\t"
  79295. "lsl r6, r6, #16\n\t"
  79296. "adds r5, r5, r6\n\t"
  79297. "adcs r3, r3, r7\n\t"
  79298. "adc r4, r4, #0\n\t"
  79299. #else
  79300. "umull r6, r7, r8, r9\n\t"
  79301. "adds r5, r5, r6\n\t"
  79302. "adcs r3, r3, r7\n\t"
  79303. "adc r4, r4, #0\n\t"
  79304. #endif
  79305. /* A[2] * B[3] */
  79306. "ldr r9, [%[b], #12]\n\t"
  79307. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  79308. "lsl r6, r11, #16\n\t"
  79309. "lsl r7, r9, #16\n\t"
  79310. "lsr r6, r6, #16\n\t"
  79311. "lsr r7, r7, #16\n\t"
  79312. "mul r7, r6, r7\n\t"
  79313. "adds r5, r5, r7\n\t"
  79314. "adcs r3, r3, #0\n\t"
  79315. "adc r4, r4, #0\n\t"
  79316. "lsr r7, r9, #16\n\t"
  79317. "mul r6, r7, r6\n\t"
  79318. "lsr r7, r6, #16\n\t"
  79319. "lsl r6, r6, #16\n\t"
  79320. "adds r5, r5, r6\n\t"
  79321. "adcs r3, r3, r7\n\t"
  79322. "adc r4, r4, #0\n\t"
  79323. "lsr r6, r11, #16\n\t"
  79324. "lsr r7, r9, #16\n\t"
  79325. "mul r7, r6, r7\n\t"
  79326. "adds r3, r3, r7\n\t"
  79327. "adc r4, r4, #0\n\t"
  79328. "lsl r7, r9, #16\n\t"
  79329. "lsr r7, r7, #16\n\t"
  79330. "mul r6, r7, r6\n\t"
  79331. "lsr r7, r6, #16\n\t"
  79332. "lsl r6, r6, #16\n\t"
  79333. "adds r5, r5, r6\n\t"
  79334. "adcs r3, r3, r7\n\t"
  79335. "adc r4, r4, #0\n\t"
  79336. #else
  79337. "umull r6, r7, r11, r9\n\t"
  79338. "adds r5, r5, r6\n\t"
  79339. "adcs r3, r3, r7\n\t"
  79340. "adc r4, r4, #0\n\t"
  79341. #endif
  79342. /* A[3] * B[2] */
  79343. "ldr r8, [%[a], #12]\n\t"
  79344. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  79345. "lsl r6, r8, #16\n\t"
  79346. "lsl r7, r12, #16\n\t"
  79347. "lsr r6, r6, #16\n\t"
  79348. "lsr r7, r7, #16\n\t"
  79349. "mul r7, r6, r7\n\t"
  79350. "adds r5, r5, r7\n\t"
  79351. "adcs r3, r3, #0\n\t"
  79352. "adc r4, r4, #0\n\t"
  79353. "lsr r7, r12, #16\n\t"
  79354. "mul r6, r7, r6\n\t"
  79355. "lsr r7, r6, #16\n\t"
  79356. "lsl r6, r6, #16\n\t"
  79357. "adds r5, r5, r6\n\t"
  79358. "adcs r3, r3, r7\n\t"
  79359. "adc r4, r4, #0\n\t"
  79360. "lsr r6, r8, #16\n\t"
  79361. "lsr r7, r12, #16\n\t"
  79362. "mul r7, r6, r7\n\t"
  79363. "adds r3, r3, r7\n\t"
  79364. "adc r4, r4, #0\n\t"
  79365. "lsl r7, r12, #16\n\t"
  79366. "lsr r7, r7, #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. #else
  79374. "umull r6, r7, r8, r12\n\t"
  79375. "adds r5, r5, r6\n\t"
  79376. "adcs r3, r3, r7\n\t"
  79377. "adc r4, r4, #0\n\t"
  79378. #endif
  79379. /* A[4] * B[1] */
  79380. "ldr r8, [%[a], #16]\n\t"
  79381. "ldr r9, [%[b], #4]\n\t"
  79382. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  79383. "lsl r6, r8, #16\n\t"
  79384. "lsl r7, r9, #16\n\t"
  79385. "lsr r6, r6, #16\n\t"
  79386. "lsr r7, r7, #16\n\t"
  79387. "mul r7, r6, r7\n\t"
  79388. "adds r5, r5, r7\n\t"
  79389. "adcs r3, r3, #0\n\t"
  79390. "adc r4, r4, #0\n\t"
  79391. "lsr r7, r9, #16\n\t"
  79392. "mul r6, r7, r6\n\t"
  79393. "lsr r7, r6, #16\n\t"
  79394. "lsl r6, r6, #16\n\t"
  79395. "adds r5, r5, r6\n\t"
  79396. "adcs r3, r3, r7\n\t"
  79397. "adc r4, r4, #0\n\t"
  79398. "lsr r6, r8, #16\n\t"
  79399. "lsr r7, r9, #16\n\t"
  79400. "mul r7, r6, r7\n\t"
  79401. "adds r3, r3, r7\n\t"
  79402. "adc r4, r4, #0\n\t"
  79403. "lsl r7, r9, #16\n\t"
  79404. "lsr r7, r7, #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. #else
  79412. "umull r6, r7, r8, r9\n\t"
  79413. "adds r5, r5, r6\n\t"
  79414. "adcs r3, r3, r7\n\t"
  79415. "adc r4, r4, #0\n\t"
  79416. #endif
  79417. /* A[5] * B[0] */
  79418. "ldr r8, [%[a], #20]\n\t"
  79419. "ldr r9, [%[b]]\n\t"
  79420. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  79421. "lsl r6, r8, #16\n\t"
  79422. "lsl r7, r9, #16\n\t"
  79423. "lsr r6, r6, #16\n\t"
  79424. "lsr r7, r7, #16\n\t"
  79425. "mul r7, r6, r7\n\t"
  79426. "adds r5, r5, r7\n\t"
  79427. "adcs r3, r3, #0\n\t"
  79428. "adc r4, r4, #0\n\t"
  79429. "lsr r7, r9, #16\n\t"
  79430. "mul r6, r7, r6\n\t"
  79431. "lsr r7, r6, #16\n\t"
  79432. "lsl r6, r6, #16\n\t"
  79433. "adds r5, r5, r6\n\t"
  79434. "adcs r3, r3, r7\n\t"
  79435. "adc r4, r4, #0\n\t"
  79436. "lsr r6, r8, #16\n\t"
  79437. "lsr r7, r9, #16\n\t"
  79438. "mul r7, r6, r7\n\t"
  79439. "adds r3, r3, r7\n\t"
  79440. "adc r4, r4, #0\n\t"
  79441. "lsl r7, r9, #16\n\t"
  79442. "lsr r7, r7, #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. #else
  79450. "umull r6, r7, r8, r9\n\t"
  79451. "adds r5, r5, r6\n\t"
  79452. "adcs r3, r3, r7\n\t"
  79453. "adc r4, r4, #0\n\t"
  79454. #endif
  79455. "str r5, [sp, #20]\n\t"
  79456. /* A[6] * B[0] */
  79457. "ldr r8, [%[a], #24]\n\t"
  79458. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  79459. "lsl r6, r8, #16\n\t"
  79460. "lsl r7, r9, #16\n\t"
  79461. "lsr r6, r6, #16\n\t"
  79462. "lsr r7, r7, #16\n\t"
  79463. "mul r7, r6, r7\n\t"
  79464. "adds r3, r3, r7\n\t"
  79465. "adcs r4, r4, #0\n\t"
  79466. "mov r5, #0\n\t"
  79467. "adc r5, r5, #0\n\t"
  79468. "lsr r7, r9, #16\n\t"
  79469. "mul r6, r7, r6\n\t"
  79470. "lsr r7, r6, #16\n\t"
  79471. "lsl r6, r6, #16\n\t"
  79472. "adds r3, r3, r6\n\t"
  79473. "adcs r4, r4, r7\n\t"
  79474. "adc r5, r5, #0\n\t"
  79475. "lsr r6, r8, #16\n\t"
  79476. "lsr r7, r9, #16\n\t"
  79477. "mul r7, r6, r7\n\t"
  79478. "adds r4, r4, r7\n\t"
  79479. "adc r5, r5, #0\n\t"
  79480. "lsl r7, r9, #16\n\t"
  79481. "lsr r7, r7, #16\n\t"
  79482. "mul r6, r7, r6\n\t"
  79483. "lsr r7, r6, #16\n\t"
  79484. "lsl r6, r6, #16\n\t"
  79485. "adds r3, r3, r6\n\t"
  79486. "adcs r4, r4, r7\n\t"
  79487. "adc r5, r5, #0\n\t"
  79488. #else
  79489. "umull r6, r7, r8, r9\n\t"
  79490. "adds r3, r3, r6\n\t"
  79491. "adcs r4, r4, r7\n\t"
  79492. "mov r5, #0\n\t"
  79493. "adc r5, r5, #0\n\t"
  79494. #endif
  79495. /* A[5] * B[1] */
  79496. "ldr r8, [%[a], #20]\n\t"
  79497. "ldr r9, [%[b], #4]\n\t"
  79498. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  79499. "lsl r6, r8, #16\n\t"
  79500. "lsl r7, r9, #16\n\t"
  79501. "lsr r6, r6, #16\n\t"
  79502. "lsr r7, r7, #16\n\t"
  79503. "mul r7, r6, r7\n\t"
  79504. "adds r3, r3, r7\n\t"
  79505. "adcs r4, r4, #0\n\t"
  79506. "adc r5, r5, #0\n\t"
  79507. "lsr r7, r9, #16\n\t"
  79508. "mul r6, r7, r6\n\t"
  79509. "lsr r7, r6, #16\n\t"
  79510. "lsl r6, r6, #16\n\t"
  79511. "adds r3, r3, r6\n\t"
  79512. "adcs r4, r4, r7\n\t"
  79513. "adc r5, r5, #0\n\t"
  79514. "lsr r6, r8, #16\n\t"
  79515. "lsr r7, r9, #16\n\t"
  79516. "mul r7, r6, r7\n\t"
  79517. "adds r4, r4, r7\n\t"
  79518. "adc r5, r5, #0\n\t"
  79519. "lsl r7, r9, #16\n\t"
  79520. "lsr r7, r7, #16\n\t"
  79521. "mul r6, r7, r6\n\t"
  79522. "lsr r7, r6, #16\n\t"
  79523. "lsl r6, r6, #16\n\t"
  79524. "adds r3, r3, r6\n\t"
  79525. "adcs r4, r4, r7\n\t"
  79526. "adc r5, r5, #0\n\t"
  79527. #else
  79528. "umull r6, r7, r8, r9\n\t"
  79529. "adds r3, r3, r6\n\t"
  79530. "adcs r4, r4, r7\n\t"
  79531. "adc r5, r5, #0\n\t"
  79532. #endif
  79533. /* A[4] * B[2] */
  79534. "ldr r8, [%[a], #16]\n\t"
  79535. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  79536. "lsl r6, r8, #16\n\t"
  79537. "lsl r7, r12, #16\n\t"
  79538. "lsr r6, r6, #16\n\t"
  79539. "lsr r7, r7, #16\n\t"
  79540. "mul r7, r6, r7\n\t"
  79541. "adds r3, r3, r7\n\t"
  79542. "adcs r4, r4, #0\n\t"
  79543. "adc r5, r5, #0\n\t"
  79544. "lsr r7, r12, #16\n\t"
  79545. "mul r6, r7, r6\n\t"
  79546. "lsr r7, r6, #16\n\t"
  79547. "lsl r6, r6, #16\n\t"
  79548. "adds r3, r3, r6\n\t"
  79549. "adcs r4, r4, r7\n\t"
  79550. "adc r5, r5, #0\n\t"
  79551. "lsr r6, r8, #16\n\t"
  79552. "lsr r7, r12, #16\n\t"
  79553. "mul r7, r6, r7\n\t"
  79554. "adds r4, r4, r7\n\t"
  79555. "adc r5, r5, #0\n\t"
  79556. "lsl r7, r12, #16\n\t"
  79557. "lsr r7, r7, #16\n\t"
  79558. "mul r6, r7, r6\n\t"
  79559. "lsr r7, r6, #16\n\t"
  79560. "lsl r6, r6, #16\n\t"
  79561. "adds r3, r3, r6\n\t"
  79562. "adcs r4, r4, r7\n\t"
  79563. "adc r5, r5, #0\n\t"
  79564. #else
  79565. "umull r6, r7, r8, r12\n\t"
  79566. "adds r3, r3, r6\n\t"
  79567. "adcs r4, r4, r7\n\t"
  79568. "adc r5, r5, #0\n\t"
  79569. #endif
  79570. /* A[3] * B[3] */
  79571. "ldr r11, [%[a], #12]\n\t"
  79572. "ldr r12, [%[b], #12]\n\t"
  79573. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  79574. "lsl r6, r11, #16\n\t"
  79575. "lsl r7, r12, #16\n\t"
  79576. "lsr r6, r6, #16\n\t"
  79577. "lsr r7, r7, #16\n\t"
  79578. "mul r7, r6, r7\n\t"
  79579. "adds r3, r3, r7\n\t"
  79580. "adcs r4, r4, #0\n\t"
  79581. "adc r5, r5, #0\n\t"
  79582. "lsr r7, r12, #16\n\t"
  79583. "mul r6, r7, r6\n\t"
  79584. "lsr r7, r6, #16\n\t"
  79585. "lsl r6, r6, #16\n\t"
  79586. "adds r3, r3, r6\n\t"
  79587. "adcs r4, r4, r7\n\t"
  79588. "adc r5, r5, #0\n\t"
  79589. "lsr r6, r11, #16\n\t"
  79590. "lsr r7, r12, #16\n\t"
  79591. "mul r7, r6, r7\n\t"
  79592. "adds r4, r4, r7\n\t"
  79593. "adc r5, r5, #0\n\t"
  79594. "lsl r7, r12, #16\n\t"
  79595. "lsr r7, r7, #16\n\t"
  79596. "mul r6, r7, r6\n\t"
  79597. "lsr r7, r6, #16\n\t"
  79598. "lsl r6, r6, #16\n\t"
  79599. "adds r3, r3, r6\n\t"
  79600. "adcs r4, r4, r7\n\t"
  79601. "adc r5, r5, #0\n\t"
  79602. #else
  79603. "umull r6, r7, r11, r12\n\t"
  79604. "adds r3, r3, r6\n\t"
  79605. "adcs r4, r4, r7\n\t"
  79606. "adc r5, r5, #0\n\t"
  79607. #endif
  79608. /* A[2] * B[4] */
  79609. "ldr r8, [%[a], #8]\n\t"
  79610. "ldr r9, [%[b], #16]\n\t"
  79611. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  79612. "lsl r6, r8, #16\n\t"
  79613. "lsl r7, r9, #16\n\t"
  79614. "lsr r6, r6, #16\n\t"
  79615. "lsr r7, r7, #16\n\t"
  79616. "mul r7, r6, r7\n\t"
  79617. "adds r3, r3, r7\n\t"
  79618. "adcs r4, r4, #0\n\t"
  79619. "adc r5, r5, #0\n\t"
  79620. "lsr r7, r9, #16\n\t"
  79621. "mul r6, r7, r6\n\t"
  79622. "lsr r7, r6, #16\n\t"
  79623. "lsl r6, r6, #16\n\t"
  79624. "adds r3, r3, r6\n\t"
  79625. "adcs r4, r4, r7\n\t"
  79626. "adc r5, r5, #0\n\t"
  79627. "lsr r6, r8, #16\n\t"
  79628. "lsr r7, r9, #16\n\t"
  79629. "mul r7, r6, r7\n\t"
  79630. "adds r4, r4, r7\n\t"
  79631. "adc r5, r5, #0\n\t"
  79632. "lsl r7, r9, #16\n\t"
  79633. "lsr r7, r7, #16\n\t"
  79634. "mul r6, r7, r6\n\t"
  79635. "lsr r7, r6, #16\n\t"
  79636. "lsl r6, r6, #16\n\t"
  79637. "adds r3, r3, r6\n\t"
  79638. "adcs r4, r4, r7\n\t"
  79639. "adc r5, r5, #0\n\t"
  79640. #else
  79641. "umull r6, r7, r8, r9\n\t"
  79642. "adds r3, r3, r6\n\t"
  79643. "adcs r4, r4, r7\n\t"
  79644. "adc r5, r5, #0\n\t"
  79645. #endif
  79646. /* A[1] * B[5] */
  79647. "ldr r8, [%[a], #4]\n\t"
  79648. "ldr r9, [%[b], #20]\n\t"
  79649. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  79650. "lsl r6, r8, #16\n\t"
  79651. "lsl r7, r9, #16\n\t"
  79652. "lsr r6, r6, #16\n\t"
  79653. "lsr r7, r7, #16\n\t"
  79654. "mul r7, r6, r7\n\t"
  79655. "adds r3, r3, r7\n\t"
  79656. "adcs r4, r4, #0\n\t"
  79657. "adc r5, r5, #0\n\t"
  79658. "lsr r7, r9, #16\n\t"
  79659. "mul r6, r7, r6\n\t"
  79660. "lsr r7, r6, #16\n\t"
  79661. "lsl r6, r6, #16\n\t"
  79662. "adds r3, r3, r6\n\t"
  79663. "adcs r4, r4, r7\n\t"
  79664. "adc r5, r5, #0\n\t"
  79665. "lsr r6, r8, #16\n\t"
  79666. "lsr r7, r9, #16\n\t"
  79667. "mul r7, r6, r7\n\t"
  79668. "adds r4, r4, r7\n\t"
  79669. "adc r5, r5, #0\n\t"
  79670. "lsl r7, r9, #16\n\t"
  79671. "lsr r7, r7, #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. #else
  79679. "umull r6, r7, r8, r9\n\t"
  79680. "adds r3, r3, r6\n\t"
  79681. "adcs r4, r4, r7\n\t"
  79682. "adc r5, r5, #0\n\t"
  79683. #endif
  79684. /* A[0] * B[6] */
  79685. "ldr r8, [%[a]]\n\t"
  79686. "ldr r9, [%[b], #24]\n\t"
  79687. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  79688. "lsl r6, r8, #16\n\t"
  79689. "lsl r7, r9, #16\n\t"
  79690. "lsr r6, r6, #16\n\t"
  79691. "lsr r7, r7, #16\n\t"
  79692. "mul r7, r6, r7\n\t"
  79693. "adds r3, r3, r7\n\t"
  79694. "adcs r4, r4, #0\n\t"
  79695. "adc r5, r5, #0\n\t"
  79696. "lsr r7, r9, #16\n\t"
  79697. "mul r6, r7, r6\n\t"
  79698. "lsr r7, r6, #16\n\t"
  79699. "lsl r6, r6, #16\n\t"
  79700. "adds r3, r3, r6\n\t"
  79701. "adcs r4, r4, r7\n\t"
  79702. "adc r5, r5, #0\n\t"
  79703. "lsr r6, r8, #16\n\t"
  79704. "lsr r7, r9, #16\n\t"
  79705. "mul r7, r6, r7\n\t"
  79706. "adds r4, r4, r7\n\t"
  79707. "adc r5, r5, #0\n\t"
  79708. "lsl r7, r9, #16\n\t"
  79709. "lsr r7, r7, #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. #else
  79717. "umull r6, r7, r8, r9\n\t"
  79718. "adds r3, r3, r6\n\t"
  79719. "adcs r4, r4, r7\n\t"
  79720. "adc r5, r5, #0\n\t"
  79721. #endif
  79722. "str r3, [sp, #24]\n\t"
  79723. /* A[0] * B[7] */
  79724. "ldr r9, [%[b], #28]\n\t"
  79725. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  79726. "lsl r6, r8, #16\n\t"
  79727. "lsl r7, r9, #16\n\t"
  79728. "lsr r6, r6, #16\n\t"
  79729. "lsr r7, r7, #16\n\t"
  79730. "mul r7, r6, r7\n\t"
  79731. "adds r4, r4, r7\n\t"
  79732. "adcs r5, r5, #0\n\t"
  79733. "mov r3, #0\n\t"
  79734. "adc r3, r3, #0\n\t"
  79735. "lsr r7, r9, #16\n\t"
  79736. "mul r6, r7, r6\n\t"
  79737. "lsr r7, r6, #16\n\t"
  79738. "lsl r6, r6, #16\n\t"
  79739. "adds r4, r4, r6\n\t"
  79740. "adcs r5, r5, r7\n\t"
  79741. "adc r3, r3, #0\n\t"
  79742. "lsr r6, r8, #16\n\t"
  79743. "lsr r7, r9, #16\n\t"
  79744. "mul r7, r6, r7\n\t"
  79745. "adds r5, r5, r7\n\t"
  79746. "adc r3, r3, #0\n\t"
  79747. "lsl r7, r9, #16\n\t"
  79748. "lsr r7, r7, #16\n\t"
  79749. "mul r6, r7, r6\n\t"
  79750. "lsr r7, r6, #16\n\t"
  79751. "lsl r6, r6, #16\n\t"
  79752. "adds r4, r4, r6\n\t"
  79753. "adcs r5, r5, r7\n\t"
  79754. "adc r3, r3, #0\n\t"
  79755. #else
  79756. "umull r6, r7, r8, r9\n\t"
  79757. "adds r4, r4, r6\n\t"
  79758. "adcs r5, r5, r7\n\t"
  79759. "mov r3, #0\n\t"
  79760. "adc r3, r3, #0\n\t"
  79761. #endif
  79762. /* A[1] * B[6] */
  79763. "ldr r8, [%[a], #4]\n\t"
  79764. "ldr r9, [%[b], #24]\n\t"
  79765. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  79766. "lsl r6, r8, #16\n\t"
  79767. "lsl r7, r9, #16\n\t"
  79768. "lsr r6, r6, #16\n\t"
  79769. "lsr r7, r7, #16\n\t"
  79770. "mul r7, r6, r7\n\t"
  79771. "adds r4, r4, r7\n\t"
  79772. "adcs r5, r5, #0\n\t"
  79773. "adc r3, r3, #0\n\t"
  79774. "lsr r7, r9, #16\n\t"
  79775. "mul r6, r7, r6\n\t"
  79776. "lsr r7, r6, #16\n\t"
  79777. "lsl r6, r6, #16\n\t"
  79778. "adds r4, r4, r6\n\t"
  79779. "adcs r5, r5, r7\n\t"
  79780. "adc r3, r3, #0\n\t"
  79781. "lsr r6, r8, #16\n\t"
  79782. "lsr r7, r9, #16\n\t"
  79783. "mul r7, r6, r7\n\t"
  79784. "adds r5, r5, r7\n\t"
  79785. "adc r3, r3, #0\n\t"
  79786. "lsl r7, r9, #16\n\t"
  79787. "lsr r7, r7, #16\n\t"
  79788. "mul r6, r7, r6\n\t"
  79789. "lsr r7, r6, #16\n\t"
  79790. "lsl r6, r6, #16\n\t"
  79791. "adds r4, r4, r6\n\t"
  79792. "adcs r5, r5, r7\n\t"
  79793. "adc r3, r3, #0\n\t"
  79794. #else
  79795. "umull r6, r7, r8, r9\n\t"
  79796. "adds r4, r4, r6\n\t"
  79797. "adcs r5, r5, r7\n\t"
  79798. "adc r3, r3, #0\n\t"
  79799. #endif
  79800. /* A[2] * B[5] */
  79801. "ldr r8, [%[a], #8]\n\t"
  79802. "ldr r9, [%[b], #20]\n\t"
  79803. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  79804. "lsl r6, r8, #16\n\t"
  79805. "lsl r7, r9, #16\n\t"
  79806. "lsr r6, r6, #16\n\t"
  79807. "lsr r7, r7, #16\n\t"
  79808. "mul r7, r6, r7\n\t"
  79809. "adds r4, r4, r7\n\t"
  79810. "adcs r5, r5, #0\n\t"
  79811. "adc r3, r3, #0\n\t"
  79812. "lsr r7, r9, #16\n\t"
  79813. "mul r6, r7, r6\n\t"
  79814. "lsr r7, r6, #16\n\t"
  79815. "lsl r6, r6, #16\n\t"
  79816. "adds r4, r4, r6\n\t"
  79817. "adcs r5, r5, r7\n\t"
  79818. "adc r3, r3, #0\n\t"
  79819. "lsr r6, r8, #16\n\t"
  79820. "lsr r7, r9, #16\n\t"
  79821. "mul r7, r6, r7\n\t"
  79822. "adds r5, r5, r7\n\t"
  79823. "adc r3, r3, #0\n\t"
  79824. "lsl r7, r9, #16\n\t"
  79825. "lsr r7, r7, #16\n\t"
  79826. "mul r6, r7, r6\n\t"
  79827. "lsr r7, r6, #16\n\t"
  79828. "lsl r6, r6, #16\n\t"
  79829. "adds r4, r4, r6\n\t"
  79830. "adcs r5, r5, r7\n\t"
  79831. "adc r3, r3, #0\n\t"
  79832. #else
  79833. "umull r6, r7, r8, r9\n\t"
  79834. "adds r4, r4, r6\n\t"
  79835. "adcs r5, r5, r7\n\t"
  79836. "adc r3, r3, #0\n\t"
  79837. #endif
  79838. /* A[3] * B[4] */
  79839. "ldr r9, [%[b], #16]\n\t"
  79840. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  79841. "lsl r6, r11, #16\n\t"
  79842. "lsl r7, r9, #16\n\t"
  79843. "lsr r6, r6, #16\n\t"
  79844. "lsr r7, r7, #16\n\t"
  79845. "mul r7, r6, r7\n\t"
  79846. "adds r4, r4, r7\n\t"
  79847. "adcs r5, r5, #0\n\t"
  79848. "adc r3, r3, #0\n\t"
  79849. "lsr r7, r9, #16\n\t"
  79850. "mul r6, r7, r6\n\t"
  79851. "lsr r7, r6, #16\n\t"
  79852. "lsl r6, r6, #16\n\t"
  79853. "adds r4, r4, r6\n\t"
  79854. "adcs r5, r5, r7\n\t"
  79855. "adc r3, r3, #0\n\t"
  79856. "lsr r6, r11, #16\n\t"
  79857. "lsr r7, r9, #16\n\t"
  79858. "mul r7, r6, r7\n\t"
  79859. "adds r5, r5, r7\n\t"
  79860. "adc r3, r3, #0\n\t"
  79861. "lsl r7, r9, #16\n\t"
  79862. "lsr r7, r7, #16\n\t"
  79863. "mul r6, r7, r6\n\t"
  79864. "lsr r7, r6, #16\n\t"
  79865. "lsl r6, r6, #16\n\t"
  79866. "adds r4, r4, r6\n\t"
  79867. "adcs r5, r5, r7\n\t"
  79868. "adc r3, r3, #0\n\t"
  79869. #else
  79870. "umull r6, r7, r11, r9\n\t"
  79871. "adds r4, r4, r6\n\t"
  79872. "adcs r5, r5, r7\n\t"
  79873. "adc r3, r3, #0\n\t"
  79874. #endif
  79875. /* A[4] * B[3] */
  79876. "ldr r8, [%[a], #16]\n\t"
  79877. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  79878. "lsl r6, r8, #16\n\t"
  79879. "lsl r7, r12, #16\n\t"
  79880. "lsr r6, r6, #16\n\t"
  79881. "lsr r7, r7, #16\n\t"
  79882. "mul r7, r6, r7\n\t"
  79883. "adds r4, r4, r7\n\t"
  79884. "adcs r5, r5, #0\n\t"
  79885. "adc r3, r3, #0\n\t"
  79886. "lsr r7, r12, #16\n\t"
  79887. "mul r6, r7, r6\n\t"
  79888. "lsr r7, r6, #16\n\t"
  79889. "lsl r6, r6, #16\n\t"
  79890. "adds r4, r4, r6\n\t"
  79891. "adcs r5, r5, r7\n\t"
  79892. "adc r3, r3, #0\n\t"
  79893. "lsr r6, r8, #16\n\t"
  79894. "lsr r7, r12, #16\n\t"
  79895. "mul r7, r6, r7\n\t"
  79896. "adds r5, r5, r7\n\t"
  79897. "adc r3, r3, #0\n\t"
  79898. "lsl r7, r12, #16\n\t"
  79899. "lsr r7, r7, #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 r4, r4, r6\n\t"
  79904. "adcs r5, r5, r7\n\t"
  79905. "adc r3, r3, #0\n\t"
  79906. #else
  79907. "umull r6, r7, r8, r12\n\t"
  79908. "adds r4, r4, r6\n\t"
  79909. "adcs r5, r5, r7\n\t"
  79910. "adc r3, r3, #0\n\t"
  79911. #endif
  79912. /* A[5] * B[2] */
  79913. "ldr r8, [%[a], #20]\n\t"
  79914. "ldr r9, [%[b], #8]\n\t"
  79915. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  79916. "lsl r6, r8, #16\n\t"
  79917. "lsl r7, r9, #16\n\t"
  79918. "lsr r6, r6, #16\n\t"
  79919. "lsr r7, r7, #16\n\t"
  79920. "mul r7, r6, r7\n\t"
  79921. "adds r4, r4, r7\n\t"
  79922. "adcs r5, r5, #0\n\t"
  79923. "adc r3, r3, #0\n\t"
  79924. "lsr r7, r9, #16\n\t"
  79925. "mul r6, r7, r6\n\t"
  79926. "lsr r7, r6, #16\n\t"
  79927. "lsl r6, r6, #16\n\t"
  79928. "adds r4, r4, r6\n\t"
  79929. "adcs r5, r5, r7\n\t"
  79930. "adc r3, r3, #0\n\t"
  79931. "lsr r6, r8, #16\n\t"
  79932. "lsr r7, r9, #16\n\t"
  79933. "mul r7, r6, r7\n\t"
  79934. "adds r5, r5, r7\n\t"
  79935. "adc r3, r3, #0\n\t"
  79936. "lsl r7, r9, #16\n\t"
  79937. "lsr r7, r7, #16\n\t"
  79938. "mul r6, r7, r6\n\t"
  79939. "lsr r7, r6, #16\n\t"
  79940. "lsl r6, r6, #16\n\t"
  79941. "adds r4, r4, r6\n\t"
  79942. "adcs r5, r5, r7\n\t"
  79943. "adc r3, r3, #0\n\t"
  79944. #else
  79945. "umull r6, r7, r8, r9\n\t"
  79946. "adds r4, r4, r6\n\t"
  79947. "adcs r5, r5, r7\n\t"
  79948. "adc r3, r3, #0\n\t"
  79949. #endif
  79950. /* A[6] * B[1] */
  79951. "ldr r8, [%[a], #24]\n\t"
  79952. "ldr r9, [%[b], #4]\n\t"
  79953. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  79954. "lsl r6, r8, #16\n\t"
  79955. "lsl r7, r9, #16\n\t"
  79956. "lsr r6, r6, #16\n\t"
  79957. "lsr r7, r7, #16\n\t"
  79958. "mul r7, r6, r7\n\t"
  79959. "adds r4, r4, r7\n\t"
  79960. "adcs r5, r5, #0\n\t"
  79961. "adc r3, r3, #0\n\t"
  79962. "lsr r7, r9, #16\n\t"
  79963. "mul r6, r7, r6\n\t"
  79964. "lsr r7, r6, #16\n\t"
  79965. "lsl r6, r6, #16\n\t"
  79966. "adds r4, r4, r6\n\t"
  79967. "adcs r5, r5, r7\n\t"
  79968. "adc r3, r3, #0\n\t"
  79969. "lsr r6, r8, #16\n\t"
  79970. "lsr r7, r9, #16\n\t"
  79971. "mul r7, r6, r7\n\t"
  79972. "adds r5, r5, r7\n\t"
  79973. "adc r3, r3, #0\n\t"
  79974. "lsl r7, r9, #16\n\t"
  79975. "lsr r7, r7, #16\n\t"
  79976. "mul r6, r7, r6\n\t"
  79977. "lsr r7, r6, #16\n\t"
  79978. "lsl r6, r6, #16\n\t"
  79979. "adds r4, r4, r6\n\t"
  79980. "adcs r5, r5, r7\n\t"
  79981. "adc r3, r3, #0\n\t"
  79982. #else
  79983. "umull r6, r7, r8, r9\n\t"
  79984. "adds r4, r4, r6\n\t"
  79985. "adcs r5, r5, r7\n\t"
  79986. "adc r3, r3, #0\n\t"
  79987. #endif
  79988. /* A[7] * B[0] */
  79989. "ldr r8, [%[a], #28]\n\t"
  79990. "ldr r9, [%[b]]\n\t"
  79991. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  79992. "lsl r6, r8, #16\n\t"
  79993. "lsl r7, r9, #16\n\t"
  79994. "lsr r6, r6, #16\n\t"
  79995. "lsr r7, r7, #16\n\t"
  79996. "mul r7, r6, r7\n\t"
  79997. "adds r4, r4, r7\n\t"
  79998. "adcs r5, r5, #0\n\t"
  79999. "adc r3, r3, #0\n\t"
  80000. "lsr r7, r9, #16\n\t"
  80001. "mul r6, r7, r6\n\t"
  80002. "lsr r7, r6, #16\n\t"
  80003. "lsl r6, r6, #16\n\t"
  80004. "adds r4, r4, r6\n\t"
  80005. "adcs r5, r5, r7\n\t"
  80006. "adc r3, r3, #0\n\t"
  80007. "lsr r6, r8, #16\n\t"
  80008. "lsr r7, r9, #16\n\t"
  80009. "mul r7, r6, r7\n\t"
  80010. "adds r5, r5, r7\n\t"
  80011. "adc r3, r3, #0\n\t"
  80012. "lsl r7, r9, #16\n\t"
  80013. "lsr r7, r7, #16\n\t"
  80014. "mul r6, r7, r6\n\t"
  80015. "lsr r7, r6, #16\n\t"
  80016. "lsl r6, r6, #16\n\t"
  80017. "adds r4, r4, r6\n\t"
  80018. "adcs r5, r5, r7\n\t"
  80019. "adc r3, r3, #0\n\t"
  80020. #else
  80021. "umull r6, r7, r8, r9\n\t"
  80022. "adds r4, r4, r6\n\t"
  80023. "adcs r5, r5, r7\n\t"
  80024. "adc r3, r3, #0\n\t"
  80025. #endif
  80026. "str r4, [sp, #28]\n\t"
  80027. /* A[8] * B[0] */
  80028. "ldr r8, [%[a], #32]\n\t"
  80029. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  80030. "lsl r6, r8, #16\n\t"
  80031. "lsl r7, r9, #16\n\t"
  80032. "lsr r6, r6, #16\n\t"
  80033. "lsr r7, r7, #16\n\t"
  80034. "mul r7, r6, r7\n\t"
  80035. "adds r5, r5, r7\n\t"
  80036. "adcs r3, r3, #0\n\t"
  80037. "mov r4, #0\n\t"
  80038. "adc r4, r4, #0\n\t"
  80039. "lsr r7, r9, #16\n\t"
  80040. "mul r6, r7, r6\n\t"
  80041. "lsr r7, r6, #16\n\t"
  80042. "lsl r6, r6, #16\n\t"
  80043. "adds r5, r5, r6\n\t"
  80044. "adcs r3, r3, r7\n\t"
  80045. "adc r4, r4, #0\n\t"
  80046. "lsr r6, r8, #16\n\t"
  80047. "lsr r7, r9, #16\n\t"
  80048. "mul r7, r6, r7\n\t"
  80049. "adds r3, r3, r7\n\t"
  80050. "adc r4, r4, #0\n\t"
  80051. "lsl r7, r9, #16\n\t"
  80052. "lsr r7, r7, #16\n\t"
  80053. "mul r6, r7, r6\n\t"
  80054. "lsr r7, r6, #16\n\t"
  80055. "lsl r6, r6, #16\n\t"
  80056. "adds r5, r5, r6\n\t"
  80057. "adcs r3, r3, r7\n\t"
  80058. "adc r4, r4, #0\n\t"
  80059. #else
  80060. "umull r6, r7, r8, r9\n\t"
  80061. "adds r5, r5, r6\n\t"
  80062. "adcs r3, r3, r7\n\t"
  80063. "mov r4, #0\n\t"
  80064. "adc r4, r4, #0\n\t"
  80065. #endif
  80066. /* A[7] * B[1] */
  80067. "ldr r8, [%[a], #28]\n\t"
  80068. "ldr r9, [%[b], #4]\n\t"
  80069. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  80070. "lsl r6, r8, #16\n\t"
  80071. "lsl r7, r9, #16\n\t"
  80072. "lsr r6, r6, #16\n\t"
  80073. "lsr r7, r7, #16\n\t"
  80074. "mul r7, r6, r7\n\t"
  80075. "adds r5, r5, r7\n\t"
  80076. "adcs r3, r3, #0\n\t"
  80077. "adc r4, r4, #0\n\t"
  80078. "lsr r7, r9, #16\n\t"
  80079. "mul r6, r7, r6\n\t"
  80080. "lsr r7, r6, #16\n\t"
  80081. "lsl r6, r6, #16\n\t"
  80082. "adds r5, r5, r6\n\t"
  80083. "adcs r3, r3, r7\n\t"
  80084. "adc r4, r4, #0\n\t"
  80085. "lsr r6, r8, #16\n\t"
  80086. "lsr r7, r9, #16\n\t"
  80087. "mul r7, r6, r7\n\t"
  80088. "adds r3, r3, r7\n\t"
  80089. "adc r4, r4, #0\n\t"
  80090. "lsl r7, r9, #16\n\t"
  80091. "lsr r7, r7, #16\n\t"
  80092. "mul r6, r7, r6\n\t"
  80093. "lsr r7, r6, #16\n\t"
  80094. "lsl r6, r6, #16\n\t"
  80095. "adds r5, r5, r6\n\t"
  80096. "adcs r3, r3, r7\n\t"
  80097. "adc r4, r4, #0\n\t"
  80098. #else
  80099. "umull r6, r7, r8, r9\n\t"
  80100. "adds r5, r5, r6\n\t"
  80101. "adcs r3, r3, r7\n\t"
  80102. "adc r4, r4, #0\n\t"
  80103. #endif
  80104. /* A[6] * B[2] */
  80105. "ldr r8, [%[a], #24]\n\t"
  80106. "ldr r9, [%[b], #8]\n\t"
  80107. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  80108. "lsl r6, r8, #16\n\t"
  80109. "lsl r7, r9, #16\n\t"
  80110. "lsr r6, r6, #16\n\t"
  80111. "lsr r7, r7, #16\n\t"
  80112. "mul r7, r6, r7\n\t"
  80113. "adds r5, r5, r7\n\t"
  80114. "adcs r3, r3, #0\n\t"
  80115. "adc r4, r4, #0\n\t"
  80116. "lsr r7, r9, #16\n\t"
  80117. "mul r6, r7, r6\n\t"
  80118. "lsr r7, r6, #16\n\t"
  80119. "lsl r6, r6, #16\n\t"
  80120. "adds r5, r5, r6\n\t"
  80121. "adcs r3, r3, r7\n\t"
  80122. "adc r4, r4, #0\n\t"
  80123. "lsr r6, r8, #16\n\t"
  80124. "lsr r7, r9, #16\n\t"
  80125. "mul r7, r6, r7\n\t"
  80126. "adds r3, r3, r7\n\t"
  80127. "adc r4, r4, #0\n\t"
  80128. "lsl r7, r9, #16\n\t"
  80129. "lsr r7, r7, #16\n\t"
  80130. "mul r6, r7, r6\n\t"
  80131. "lsr r7, r6, #16\n\t"
  80132. "lsl r6, r6, #16\n\t"
  80133. "adds r5, r5, r6\n\t"
  80134. "adcs r3, r3, r7\n\t"
  80135. "adc r4, r4, #0\n\t"
  80136. #else
  80137. "umull r6, r7, r8, r9\n\t"
  80138. "adds r5, r5, r6\n\t"
  80139. "adcs r3, r3, r7\n\t"
  80140. "adc r4, r4, #0\n\t"
  80141. #endif
  80142. /* A[5] * B[3] */
  80143. "ldr r8, [%[a], #20]\n\t"
  80144. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  80145. "lsl r6, r8, #16\n\t"
  80146. "lsl r7, r12, #16\n\t"
  80147. "lsr r6, r6, #16\n\t"
  80148. "lsr r7, r7, #16\n\t"
  80149. "mul r7, r6, r7\n\t"
  80150. "adds r5, r5, r7\n\t"
  80151. "adcs r3, r3, #0\n\t"
  80152. "adc r4, r4, #0\n\t"
  80153. "lsr r7, r12, #16\n\t"
  80154. "mul r6, r7, r6\n\t"
  80155. "lsr r7, r6, #16\n\t"
  80156. "lsl r6, r6, #16\n\t"
  80157. "adds r5, r5, r6\n\t"
  80158. "adcs r3, r3, r7\n\t"
  80159. "adc r4, r4, #0\n\t"
  80160. "lsr r6, r8, #16\n\t"
  80161. "lsr r7, r12, #16\n\t"
  80162. "mul r7, r6, r7\n\t"
  80163. "adds r3, r3, r7\n\t"
  80164. "adc r4, r4, #0\n\t"
  80165. "lsl r7, r12, #16\n\t"
  80166. "lsr r7, r7, #16\n\t"
  80167. "mul r6, r7, r6\n\t"
  80168. "lsr r7, r6, #16\n\t"
  80169. "lsl r6, r6, #16\n\t"
  80170. "adds r5, r5, r6\n\t"
  80171. "adcs r3, r3, r7\n\t"
  80172. "adc r4, r4, #0\n\t"
  80173. #else
  80174. "umull r6, r7, r8, r12\n\t"
  80175. "adds r5, r5, r6\n\t"
  80176. "adcs r3, r3, r7\n\t"
  80177. "adc r4, r4, #0\n\t"
  80178. #endif
  80179. /* A[4] * B[4] */
  80180. "ldr r11, [%[a], #16]\n\t"
  80181. "ldr r12, [%[b], #16]\n\t"
  80182. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  80183. "lsl r6, r11, #16\n\t"
  80184. "lsl r7, r12, #16\n\t"
  80185. "lsr r6, r6, #16\n\t"
  80186. "lsr r7, r7, #16\n\t"
  80187. "mul r7, r6, r7\n\t"
  80188. "adds r5, r5, r7\n\t"
  80189. "adcs r3, r3, #0\n\t"
  80190. "adc r4, r4, #0\n\t"
  80191. "lsr r7, r12, #16\n\t"
  80192. "mul r6, r7, r6\n\t"
  80193. "lsr r7, r6, #16\n\t"
  80194. "lsl r6, r6, #16\n\t"
  80195. "adds r5, r5, r6\n\t"
  80196. "adcs r3, r3, r7\n\t"
  80197. "adc r4, r4, #0\n\t"
  80198. "lsr r6, r11, #16\n\t"
  80199. "lsr r7, r12, #16\n\t"
  80200. "mul r7, r6, r7\n\t"
  80201. "adds r3, r3, r7\n\t"
  80202. "adc r4, r4, #0\n\t"
  80203. "lsl r7, r12, #16\n\t"
  80204. "lsr r7, r7, #16\n\t"
  80205. "mul r6, r7, r6\n\t"
  80206. "lsr r7, r6, #16\n\t"
  80207. "lsl r6, r6, #16\n\t"
  80208. "adds r5, r5, r6\n\t"
  80209. "adcs r3, r3, r7\n\t"
  80210. "adc r4, r4, #0\n\t"
  80211. #else
  80212. "umull r6, r7, r11, r12\n\t"
  80213. "adds r5, r5, r6\n\t"
  80214. "adcs r3, r3, r7\n\t"
  80215. "adc r4, r4, #0\n\t"
  80216. #endif
  80217. /* A[3] * B[5] */
  80218. "ldr r8, [%[a], #12]\n\t"
  80219. "ldr r9, [%[b], #20]\n\t"
  80220. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  80221. "lsl r6, r8, #16\n\t"
  80222. "lsl r7, r9, #16\n\t"
  80223. "lsr r6, r6, #16\n\t"
  80224. "lsr r7, r7, #16\n\t"
  80225. "mul r7, r6, r7\n\t"
  80226. "adds r5, r5, r7\n\t"
  80227. "adcs r3, r3, #0\n\t"
  80228. "adc r4, r4, #0\n\t"
  80229. "lsr r7, r9, #16\n\t"
  80230. "mul r6, r7, r6\n\t"
  80231. "lsr r7, r6, #16\n\t"
  80232. "lsl r6, r6, #16\n\t"
  80233. "adds r5, r5, r6\n\t"
  80234. "adcs r3, r3, r7\n\t"
  80235. "adc r4, r4, #0\n\t"
  80236. "lsr r6, r8, #16\n\t"
  80237. "lsr r7, r9, #16\n\t"
  80238. "mul r7, r6, r7\n\t"
  80239. "adds r3, r3, r7\n\t"
  80240. "adc r4, r4, #0\n\t"
  80241. "lsl r7, r9, #16\n\t"
  80242. "lsr r7, r7, #16\n\t"
  80243. "mul r6, r7, r6\n\t"
  80244. "lsr r7, r6, #16\n\t"
  80245. "lsl r6, r6, #16\n\t"
  80246. "adds r5, r5, r6\n\t"
  80247. "adcs r3, r3, r7\n\t"
  80248. "adc r4, r4, #0\n\t"
  80249. #else
  80250. "umull r6, r7, r8, r9\n\t"
  80251. "adds r5, r5, r6\n\t"
  80252. "adcs r3, r3, r7\n\t"
  80253. "adc r4, r4, #0\n\t"
  80254. #endif
  80255. /* A[2] * B[6] */
  80256. "ldr r8, [%[a], #8]\n\t"
  80257. "ldr r9, [%[b], #24]\n\t"
  80258. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  80259. "lsl r6, r8, #16\n\t"
  80260. "lsl r7, r9, #16\n\t"
  80261. "lsr r6, r6, #16\n\t"
  80262. "lsr r7, r7, #16\n\t"
  80263. "mul r7, r6, r7\n\t"
  80264. "adds r5, r5, r7\n\t"
  80265. "adcs r3, r3, #0\n\t"
  80266. "adc r4, r4, #0\n\t"
  80267. "lsr r7, r9, #16\n\t"
  80268. "mul r6, r7, r6\n\t"
  80269. "lsr r7, r6, #16\n\t"
  80270. "lsl r6, r6, #16\n\t"
  80271. "adds r5, r5, r6\n\t"
  80272. "adcs r3, r3, r7\n\t"
  80273. "adc r4, r4, #0\n\t"
  80274. "lsr r6, r8, #16\n\t"
  80275. "lsr r7, r9, #16\n\t"
  80276. "mul r7, r6, r7\n\t"
  80277. "adds r3, r3, r7\n\t"
  80278. "adc r4, r4, #0\n\t"
  80279. "lsl r7, r9, #16\n\t"
  80280. "lsr r7, r7, #16\n\t"
  80281. "mul r6, r7, r6\n\t"
  80282. "lsr r7, r6, #16\n\t"
  80283. "lsl r6, r6, #16\n\t"
  80284. "adds r5, r5, r6\n\t"
  80285. "adcs r3, r3, r7\n\t"
  80286. "adc r4, r4, #0\n\t"
  80287. #else
  80288. "umull r6, r7, r8, r9\n\t"
  80289. "adds r5, r5, r6\n\t"
  80290. "adcs r3, r3, r7\n\t"
  80291. "adc r4, r4, #0\n\t"
  80292. #endif
  80293. /* A[1] * B[7] */
  80294. "ldr r8, [%[a], #4]\n\t"
  80295. "ldr r9, [%[b], #28]\n\t"
  80296. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  80297. "lsl r6, r8, #16\n\t"
  80298. "lsl r7, r9, #16\n\t"
  80299. "lsr r6, r6, #16\n\t"
  80300. "lsr r7, r7, #16\n\t"
  80301. "mul r7, r6, r7\n\t"
  80302. "adds r5, r5, r7\n\t"
  80303. "adcs r3, r3, #0\n\t"
  80304. "adc r4, r4, #0\n\t"
  80305. "lsr r7, r9, #16\n\t"
  80306. "mul r6, r7, r6\n\t"
  80307. "lsr r7, r6, #16\n\t"
  80308. "lsl r6, r6, #16\n\t"
  80309. "adds r5, r5, r6\n\t"
  80310. "adcs r3, r3, r7\n\t"
  80311. "adc r4, r4, #0\n\t"
  80312. "lsr r6, r8, #16\n\t"
  80313. "lsr r7, r9, #16\n\t"
  80314. "mul r7, r6, r7\n\t"
  80315. "adds r3, r3, r7\n\t"
  80316. "adc r4, r4, #0\n\t"
  80317. "lsl r7, r9, #16\n\t"
  80318. "lsr r7, r7, #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. #else
  80326. "umull r6, r7, r8, r9\n\t"
  80327. "adds r5, r5, r6\n\t"
  80328. "adcs r3, r3, r7\n\t"
  80329. "adc r4, r4, #0\n\t"
  80330. #endif
  80331. /* A[0] * B[8] */
  80332. "ldr r8, [%[a]]\n\t"
  80333. "ldr r9, [%[b], #32]\n\t"
  80334. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  80335. "lsl r6, r8, #16\n\t"
  80336. "lsl r7, r9, #16\n\t"
  80337. "lsr r6, r6, #16\n\t"
  80338. "lsr r7, r7, #16\n\t"
  80339. "mul r7, r6, r7\n\t"
  80340. "adds r5, r5, r7\n\t"
  80341. "adcs r3, r3, #0\n\t"
  80342. "adc r4, r4, #0\n\t"
  80343. "lsr r7, r9, #16\n\t"
  80344. "mul r6, r7, r6\n\t"
  80345. "lsr r7, r6, #16\n\t"
  80346. "lsl r6, r6, #16\n\t"
  80347. "adds r5, r5, r6\n\t"
  80348. "adcs r3, r3, r7\n\t"
  80349. "adc r4, r4, #0\n\t"
  80350. "lsr r6, r8, #16\n\t"
  80351. "lsr r7, r9, #16\n\t"
  80352. "mul r7, r6, r7\n\t"
  80353. "adds r3, r3, r7\n\t"
  80354. "adc r4, r4, #0\n\t"
  80355. "lsl r7, r9, #16\n\t"
  80356. "lsr r7, r7, #16\n\t"
  80357. "mul r6, r7, r6\n\t"
  80358. "lsr r7, r6, #16\n\t"
  80359. "lsl r6, r6, #16\n\t"
  80360. "adds r5, r5, r6\n\t"
  80361. "adcs r3, r3, r7\n\t"
  80362. "adc r4, r4, #0\n\t"
  80363. #else
  80364. "umull r6, r7, r8, r9\n\t"
  80365. "adds r5, r5, r6\n\t"
  80366. "adcs r3, r3, r7\n\t"
  80367. "adc r4, r4, #0\n\t"
  80368. #endif
  80369. "str r5, [sp, #32]\n\t"
  80370. /* A[0] * B[9] */
  80371. "ldr r9, [%[b], #36]\n\t"
  80372. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  80373. "lsl r6, r8, #16\n\t"
  80374. "lsl r7, r9, #16\n\t"
  80375. "lsr r6, r6, #16\n\t"
  80376. "lsr r7, r7, #16\n\t"
  80377. "mul r7, r6, r7\n\t"
  80378. "adds r3, r3, r7\n\t"
  80379. "adcs r4, r4, #0\n\t"
  80380. "mov r5, #0\n\t"
  80381. "adc r5, r5, #0\n\t"
  80382. "lsr r7, r9, #16\n\t"
  80383. "mul r6, r7, r6\n\t"
  80384. "lsr r7, r6, #16\n\t"
  80385. "lsl r6, r6, #16\n\t"
  80386. "adds r3, r3, r6\n\t"
  80387. "adcs r4, r4, r7\n\t"
  80388. "adc r5, r5, #0\n\t"
  80389. "lsr r6, r8, #16\n\t"
  80390. "lsr r7, r9, #16\n\t"
  80391. "mul r7, r6, r7\n\t"
  80392. "adds r4, r4, r7\n\t"
  80393. "adc r5, r5, #0\n\t"
  80394. "lsl r7, r9, #16\n\t"
  80395. "lsr r7, r7, #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 r3, r3, r6\n\t"
  80400. "adcs r4, r4, r7\n\t"
  80401. "adc r5, r5, #0\n\t"
  80402. #else
  80403. "umull r6, r7, r8, r9\n\t"
  80404. "adds r3, r3, r6\n\t"
  80405. "adcs r4, r4, r7\n\t"
  80406. "mov r5, #0\n\t"
  80407. "adc r5, r5, #0\n\t"
  80408. #endif
  80409. /* A[1] * B[8] */
  80410. "ldr r8, [%[a], #4]\n\t"
  80411. "ldr r9, [%[b], #32]\n\t"
  80412. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  80413. "lsl r6, r8, #16\n\t"
  80414. "lsl r7, r9, #16\n\t"
  80415. "lsr r6, r6, #16\n\t"
  80416. "lsr r7, r7, #16\n\t"
  80417. "mul r7, r6, r7\n\t"
  80418. "adds r3, r3, r7\n\t"
  80419. "adcs r4, r4, #0\n\t"
  80420. "adc r5, r5, #0\n\t"
  80421. "lsr r7, r9, #16\n\t"
  80422. "mul r6, r7, r6\n\t"
  80423. "lsr r7, r6, #16\n\t"
  80424. "lsl r6, r6, #16\n\t"
  80425. "adds r3, r3, r6\n\t"
  80426. "adcs r4, r4, r7\n\t"
  80427. "adc r5, r5, #0\n\t"
  80428. "lsr r6, r8, #16\n\t"
  80429. "lsr r7, r9, #16\n\t"
  80430. "mul r7, r6, r7\n\t"
  80431. "adds r4, r4, r7\n\t"
  80432. "adc r5, r5, #0\n\t"
  80433. "lsl r7, r9, #16\n\t"
  80434. "lsr r7, r7, #16\n\t"
  80435. "mul r6, r7, r6\n\t"
  80436. "lsr r7, r6, #16\n\t"
  80437. "lsl r6, r6, #16\n\t"
  80438. "adds r3, r3, r6\n\t"
  80439. "adcs r4, r4, r7\n\t"
  80440. "adc r5, r5, #0\n\t"
  80441. #else
  80442. "umull r6, r7, r8, r9\n\t"
  80443. "adds r3, r3, r6\n\t"
  80444. "adcs r4, r4, r7\n\t"
  80445. "adc r5, r5, #0\n\t"
  80446. #endif
  80447. /* A[2] * B[7] */
  80448. "ldr r8, [%[a], #8]\n\t"
  80449. "ldr r9, [%[b], #28]\n\t"
  80450. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  80451. "lsl r6, r8, #16\n\t"
  80452. "lsl r7, r9, #16\n\t"
  80453. "lsr r6, r6, #16\n\t"
  80454. "lsr r7, r7, #16\n\t"
  80455. "mul r7, r6, r7\n\t"
  80456. "adds r3, r3, r7\n\t"
  80457. "adcs r4, r4, #0\n\t"
  80458. "adc r5, r5, #0\n\t"
  80459. "lsr r7, r9, #16\n\t"
  80460. "mul r6, r7, r6\n\t"
  80461. "lsr r7, r6, #16\n\t"
  80462. "lsl r6, r6, #16\n\t"
  80463. "adds r3, r3, r6\n\t"
  80464. "adcs r4, r4, r7\n\t"
  80465. "adc r5, r5, #0\n\t"
  80466. "lsr r6, r8, #16\n\t"
  80467. "lsr r7, r9, #16\n\t"
  80468. "mul r7, r6, r7\n\t"
  80469. "adds r4, r4, r7\n\t"
  80470. "adc r5, r5, #0\n\t"
  80471. "lsl r7, r9, #16\n\t"
  80472. "lsr r7, r7, #16\n\t"
  80473. "mul r6, r7, r6\n\t"
  80474. "lsr r7, r6, #16\n\t"
  80475. "lsl r6, r6, #16\n\t"
  80476. "adds r3, r3, r6\n\t"
  80477. "adcs r4, r4, r7\n\t"
  80478. "adc r5, r5, #0\n\t"
  80479. #else
  80480. "umull r6, r7, r8, r9\n\t"
  80481. "adds r3, r3, r6\n\t"
  80482. "adcs r4, r4, r7\n\t"
  80483. "adc r5, r5, #0\n\t"
  80484. #endif
  80485. /* A[3] * B[6] */
  80486. "ldr r8, [%[a], #12]\n\t"
  80487. "ldr r9, [%[b], #24]\n\t"
  80488. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  80489. "lsl r6, r8, #16\n\t"
  80490. "lsl r7, r9, #16\n\t"
  80491. "lsr r6, r6, #16\n\t"
  80492. "lsr r7, r7, #16\n\t"
  80493. "mul r7, r6, r7\n\t"
  80494. "adds r3, r3, r7\n\t"
  80495. "adcs r4, r4, #0\n\t"
  80496. "adc r5, r5, #0\n\t"
  80497. "lsr r7, r9, #16\n\t"
  80498. "mul r6, r7, r6\n\t"
  80499. "lsr r7, r6, #16\n\t"
  80500. "lsl r6, r6, #16\n\t"
  80501. "adds r3, r3, r6\n\t"
  80502. "adcs r4, r4, r7\n\t"
  80503. "adc r5, r5, #0\n\t"
  80504. "lsr r6, r8, #16\n\t"
  80505. "lsr r7, r9, #16\n\t"
  80506. "mul r7, r6, r7\n\t"
  80507. "adds r4, r4, r7\n\t"
  80508. "adc r5, r5, #0\n\t"
  80509. "lsl r7, r9, #16\n\t"
  80510. "lsr r7, r7, #16\n\t"
  80511. "mul r6, r7, r6\n\t"
  80512. "lsr r7, r6, #16\n\t"
  80513. "lsl r6, r6, #16\n\t"
  80514. "adds r3, r3, r6\n\t"
  80515. "adcs r4, r4, r7\n\t"
  80516. "adc r5, r5, #0\n\t"
  80517. #else
  80518. "umull r6, r7, r8, r9\n\t"
  80519. "adds r3, r3, r6\n\t"
  80520. "adcs r4, r4, r7\n\t"
  80521. "adc r5, r5, #0\n\t"
  80522. #endif
  80523. /* A[4] * B[5] */
  80524. "ldr r9, [%[b], #20]\n\t"
  80525. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  80526. "lsl r6, r11, #16\n\t"
  80527. "lsl r7, r9, #16\n\t"
  80528. "lsr r6, r6, #16\n\t"
  80529. "lsr r7, r7, #16\n\t"
  80530. "mul r7, r6, r7\n\t"
  80531. "adds r3, r3, r7\n\t"
  80532. "adcs r4, r4, #0\n\t"
  80533. "adc r5, r5, #0\n\t"
  80534. "lsr r7, r9, #16\n\t"
  80535. "mul r6, r7, r6\n\t"
  80536. "lsr r7, r6, #16\n\t"
  80537. "lsl r6, r6, #16\n\t"
  80538. "adds r3, r3, r6\n\t"
  80539. "adcs r4, r4, r7\n\t"
  80540. "adc r5, r5, #0\n\t"
  80541. "lsr r6, r11, #16\n\t"
  80542. "lsr r7, r9, #16\n\t"
  80543. "mul r7, r6, r7\n\t"
  80544. "adds r4, r4, r7\n\t"
  80545. "adc r5, r5, #0\n\t"
  80546. "lsl r7, r9, #16\n\t"
  80547. "lsr r7, r7, #16\n\t"
  80548. "mul r6, r7, r6\n\t"
  80549. "lsr r7, r6, #16\n\t"
  80550. "lsl r6, r6, #16\n\t"
  80551. "adds r3, r3, r6\n\t"
  80552. "adcs r4, r4, r7\n\t"
  80553. "adc r5, r5, #0\n\t"
  80554. #else
  80555. "umull r6, r7, r11, r9\n\t"
  80556. "adds r3, r3, r6\n\t"
  80557. "adcs r4, r4, r7\n\t"
  80558. "adc r5, r5, #0\n\t"
  80559. #endif
  80560. /* A[5] * B[4] */
  80561. "ldr r8, [%[a], #20]\n\t"
  80562. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  80563. "lsl r6, r8, #16\n\t"
  80564. "lsl r7, r12, #16\n\t"
  80565. "lsr r6, r6, #16\n\t"
  80566. "lsr r7, r7, #16\n\t"
  80567. "mul r7, r6, r7\n\t"
  80568. "adds r3, r3, r7\n\t"
  80569. "adcs r4, r4, #0\n\t"
  80570. "adc r5, r5, #0\n\t"
  80571. "lsr r7, r12, #16\n\t"
  80572. "mul r6, r7, r6\n\t"
  80573. "lsr r7, r6, #16\n\t"
  80574. "lsl r6, r6, #16\n\t"
  80575. "adds r3, r3, r6\n\t"
  80576. "adcs r4, r4, r7\n\t"
  80577. "adc r5, r5, #0\n\t"
  80578. "lsr r6, r8, #16\n\t"
  80579. "lsr r7, r12, #16\n\t"
  80580. "mul r7, r6, r7\n\t"
  80581. "adds r4, r4, r7\n\t"
  80582. "adc r5, r5, #0\n\t"
  80583. "lsl r7, r12, #16\n\t"
  80584. "lsr r7, r7, #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 r3, r3, r6\n\t"
  80589. "adcs r4, r4, r7\n\t"
  80590. "adc r5, r5, #0\n\t"
  80591. #else
  80592. "umull r6, r7, r8, r12\n\t"
  80593. "adds r3, r3, r6\n\t"
  80594. "adcs r4, r4, r7\n\t"
  80595. "adc r5, r5, #0\n\t"
  80596. #endif
  80597. /* A[6] * B[3] */
  80598. "ldr r8, [%[a], #24]\n\t"
  80599. "ldr r9, [%[b], #12]\n\t"
  80600. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  80601. "lsl r6, r8, #16\n\t"
  80602. "lsl r7, r9, #16\n\t"
  80603. "lsr r6, r6, #16\n\t"
  80604. "lsr r7, r7, #16\n\t"
  80605. "mul r7, r6, r7\n\t"
  80606. "adds r3, r3, r7\n\t"
  80607. "adcs r4, r4, #0\n\t"
  80608. "adc r5, r5, #0\n\t"
  80609. "lsr r7, r9, #16\n\t"
  80610. "mul r6, r7, r6\n\t"
  80611. "lsr r7, r6, #16\n\t"
  80612. "lsl r6, r6, #16\n\t"
  80613. "adds r3, r3, r6\n\t"
  80614. "adcs r4, r4, r7\n\t"
  80615. "adc r5, r5, #0\n\t"
  80616. "lsr r6, r8, #16\n\t"
  80617. "lsr r7, r9, #16\n\t"
  80618. "mul r7, r6, r7\n\t"
  80619. "adds r4, r4, r7\n\t"
  80620. "adc r5, r5, #0\n\t"
  80621. "lsl r7, r9, #16\n\t"
  80622. "lsr r7, r7, #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 r3, r3, r6\n\t"
  80627. "adcs r4, r4, r7\n\t"
  80628. "adc r5, r5, #0\n\t"
  80629. #else
  80630. "umull r6, r7, r8, r9\n\t"
  80631. "adds r3, r3, r6\n\t"
  80632. "adcs r4, r4, r7\n\t"
  80633. "adc r5, r5, #0\n\t"
  80634. #endif
  80635. /* A[7] * B[2] */
  80636. "ldr r8, [%[a], #28]\n\t"
  80637. "ldr r9, [%[b], #8]\n\t"
  80638. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  80639. "lsl r6, r8, #16\n\t"
  80640. "lsl r7, r9, #16\n\t"
  80641. "lsr r6, r6, #16\n\t"
  80642. "lsr r7, r7, #16\n\t"
  80643. "mul r7, r6, r7\n\t"
  80644. "adds r3, r3, r7\n\t"
  80645. "adcs r4, r4, #0\n\t"
  80646. "adc r5, r5, #0\n\t"
  80647. "lsr r7, r9, #16\n\t"
  80648. "mul r6, r7, r6\n\t"
  80649. "lsr r7, r6, #16\n\t"
  80650. "lsl r6, r6, #16\n\t"
  80651. "adds r3, r3, r6\n\t"
  80652. "adcs r4, r4, r7\n\t"
  80653. "adc r5, r5, #0\n\t"
  80654. "lsr r6, r8, #16\n\t"
  80655. "lsr r7, r9, #16\n\t"
  80656. "mul r7, r6, r7\n\t"
  80657. "adds r4, r4, r7\n\t"
  80658. "adc r5, r5, #0\n\t"
  80659. "lsl r7, r9, #16\n\t"
  80660. "lsr r7, r7, #16\n\t"
  80661. "mul r6, r7, r6\n\t"
  80662. "lsr r7, r6, #16\n\t"
  80663. "lsl r6, r6, #16\n\t"
  80664. "adds r3, r3, r6\n\t"
  80665. "adcs r4, r4, r7\n\t"
  80666. "adc r5, r5, #0\n\t"
  80667. #else
  80668. "umull r6, r7, r8, r9\n\t"
  80669. "adds r3, r3, r6\n\t"
  80670. "adcs r4, r4, r7\n\t"
  80671. "adc r5, r5, #0\n\t"
  80672. #endif
  80673. /* A[8] * B[1] */
  80674. "ldr r8, [%[a], #32]\n\t"
  80675. "ldr r9, [%[b], #4]\n\t"
  80676. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  80677. "lsl r6, r8, #16\n\t"
  80678. "lsl r7, r9, #16\n\t"
  80679. "lsr r6, r6, #16\n\t"
  80680. "lsr r7, r7, #16\n\t"
  80681. "mul r7, r6, r7\n\t"
  80682. "adds r3, r3, r7\n\t"
  80683. "adcs r4, r4, #0\n\t"
  80684. "adc r5, r5, #0\n\t"
  80685. "lsr r7, r9, #16\n\t"
  80686. "mul r6, r7, r6\n\t"
  80687. "lsr r7, r6, #16\n\t"
  80688. "lsl r6, r6, #16\n\t"
  80689. "adds r3, r3, r6\n\t"
  80690. "adcs r4, r4, r7\n\t"
  80691. "adc r5, r5, #0\n\t"
  80692. "lsr r6, r8, #16\n\t"
  80693. "lsr r7, r9, #16\n\t"
  80694. "mul r7, r6, r7\n\t"
  80695. "adds r4, r4, r7\n\t"
  80696. "adc r5, r5, #0\n\t"
  80697. "lsl r7, r9, #16\n\t"
  80698. "lsr r7, r7, #16\n\t"
  80699. "mul r6, r7, r6\n\t"
  80700. "lsr r7, r6, #16\n\t"
  80701. "lsl r6, r6, #16\n\t"
  80702. "adds r3, r3, r6\n\t"
  80703. "adcs r4, r4, r7\n\t"
  80704. "adc r5, r5, #0\n\t"
  80705. #else
  80706. "umull r6, r7, r8, r9\n\t"
  80707. "adds r3, r3, r6\n\t"
  80708. "adcs r4, r4, r7\n\t"
  80709. "adc r5, r5, #0\n\t"
  80710. #endif
  80711. /* A[9] * B[0] */
  80712. "ldr r8, [%[a], #36]\n\t"
  80713. "ldr r9, [%[b]]\n\t"
  80714. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  80715. "lsl r6, r8, #16\n\t"
  80716. "lsl r7, r9, #16\n\t"
  80717. "lsr r6, r6, #16\n\t"
  80718. "lsr r7, r7, #16\n\t"
  80719. "mul r7, r6, r7\n\t"
  80720. "adds r3, r3, r7\n\t"
  80721. "adcs r4, r4, #0\n\t"
  80722. "adc r5, r5, #0\n\t"
  80723. "lsr r7, r9, #16\n\t"
  80724. "mul r6, r7, r6\n\t"
  80725. "lsr r7, r6, #16\n\t"
  80726. "lsl r6, r6, #16\n\t"
  80727. "adds r3, r3, r6\n\t"
  80728. "adcs r4, r4, r7\n\t"
  80729. "adc r5, r5, #0\n\t"
  80730. "lsr r6, r8, #16\n\t"
  80731. "lsr r7, r9, #16\n\t"
  80732. "mul r7, r6, r7\n\t"
  80733. "adds r4, r4, r7\n\t"
  80734. "adc r5, r5, #0\n\t"
  80735. "lsl r7, r9, #16\n\t"
  80736. "lsr r7, r7, #16\n\t"
  80737. "mul r6, r7, r6\n\t"
  80738. "lsr r7, r6, #16\n\t"
  80739. "lsl r6, r6, #16\n\t"
  80740. "adds r3, r3, r6\n\t"
  80741. "adcs r4, r4, r7\n\t"
  80742. "adc r5, r5, #0\n\t"
  80743. #else
  80744. "umull r6, r7, r8, r9\n\t"
  80745. "adds r3, r3, r6\n\t"
  80746. "adcs r4, r4, r7\n\t"
  80747. "adc r5, r5, #0\n\t"
  80748. #endif
  80749. "str r3, [sp, #36]\n\t"
  80750. /* A[10] * B[0] */
  80751. "ldr r8, [%[a], #40]\n\t"
  80752. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  80753. "lsl r6, r8, #16\n\t"
  80754. "lsl r7, r9, #16\n\t"
  80755. "lsr r6, r6, #16\n\t"
  80756. "lsr r7, r7, #16\n\t"
  80757. "mul r7, r6, r7\n\t"
  80758. "adds r4, r4, r7\n\t"
  80759. "adcs r5, r5, #0\n\t"
  80760. "mov r3, #0\n\t"
  80761. "adc r3, r3, #0\n\t"
  80762. "lsr r7, r9, #16\n\t"
  80763. "mul r6, r7, r6\n\t"
  80764. "lsr r7, r6, #16\n\t"
  80765. "lsl r6, r6, #16\n\t"
  80766. "adds r4, r4, r6\n\t"
  80767. "adcs r5, r5, r7\n\t"
  80768. "adc r3, r3, #0\n\t"
  80769. "lsr r6, r8, #16\n\t"
  80770. "lsr r7, r9, #16\n\t"
  80771. "mul r7, r6, r7\n\t"
  80772. "adds r5, r5, r7\n\t"
  80773. "adc r3, r3, #0\n\t"
  80774. "lsl r7, r9, #16\n\t"
  80775. "lsr r7, r7, #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 r4, r4, r6\n\t"
  80780. "adcs r5, r5, r7\n\t"
  80781. "adc r3, r3, #0\n\t"
  80782. #else
  80783. "umull r6, r7, r8, r9\n\t"
  80784. "adds r4, r4, r6\n\t"
  80785. "adcs r5, r5, r7\n\t"
  80786. "mov r3, #0\n\t"
  80787. "adc r3, r3, #0\n\t"
  80788. #endif
  80789. /* A[9] * B[1] */
  80790. "ldr r8, [%[a], #36]\n\t"
  80791. "ldr r9, [%[b], #4]\n\t"
  80792. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  80793. "lsl r6, r8, #16\n\t"
  80794. "lsl r7, r9, #16\n\t"
  80795. "lsr r6, r6, #16\n\t"
  80796. "lsr r7, r7, #16\n\t"
  80797. "mul r7, r6, r7\n\t"
  80798. "adds r4, r4, r7\n\t"
  80799. "adcs r5, r5, #0\n\t"
  80800. "adc r3, r3, #0\n\t"
  80801. "lsr r7, r9, #16\n\t"
  80802. "mul r6, r7, r6\n\t"
  80803. "lsr r7, r6, #16\n\t"
  80804. "lsl r6, r6, #16\n\t"
  80805. "adds r4, r4, r6\n\t"
  80806. "adcs r5, r5, r7\n\t"
  80807. "adc r3, r3, #0\n\t"
  80808. "lsr r6, r8, #16\n\t"
  80809. "lsr r7, r9, #16\n\t"
  80810. "mul r7, r6, r7\n\t"
  80811. "adds r5, r5, r7\n\t"
  80812. "adc r3, r3, #0\n\t"
  80813. "lsl r7, r9, #16\n\t"
  80814. "lsr r7, r7, #16\n\t"
  80815. "mul r6, r7, r6\n\t"
  80816. "lsr r7, r6, #16\n\t"
  80817. "lsl r6, r6, #16\n\t"
  80818. "adds r4, r4, r6\n\t"
  80819. "adcs r5, r5, r7\n\t"
  80820. "adc r3, r3, #0\n\t"
  80821. #else
  80822. "umull r6, r7, r8, r9\n\t"
  80823. "adds r4, r4, r6\n\t"
  80824. "adcs r5, r5, r7\n\t"
  80825. "adc r3, r3, #0\n\t"
  80826. #endif
  80827. /* A[8] * B[2] */
  80828. "ldr r8, [%[a], #32]\n\t"
  80829. "ldr r9, [%[b], #8]\n\t"
  80830. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  80831. "lsl r6, r8, #16\n\t"
  80832. "lsl r7, r9, #16\n\t"
  80833. "lsr r6, r6, #16\n\t"
  80834. "lsr r7, r7, #16\n\t"
  80835. "mul r7, r6, r7\n\t"
  80836. "adds r4, r4, r7\n\t"
  80837. "adcs r5, r5, #0\n\t"
  80838. "adc r3, r3, #0\n\t"
  80839. "lsr r7, r9, #16\n\t"
  80840. "mul r6, r7, r6\n\t"
  80841. "lsr r7, r6, #16\n\t"
  80842. "lsl r6, r6, #16\n\t"
  80843. "adds r4, r4, r6\n\t"
  80844. "adcs r5, r5, r7\n\t"
  80845. "adc r3, r3, #0\n\t"
  80846. "lsr r6, r8, #16\n\t"
  80847. "lsr r7, r9, #16\n\t"
  80848. "mul r7, r6, r7\n\t"
  80849. "adds r5, r5, r7\n\t"
  80850. "adc r3, r3, #0\n\t"
  80851. "lsl r7, r9, #16\n\t"
  80852. "lsr r7, r7, #16\n\t"
  80853. "mul r6, r7, r6\n\t"
  80854. "lsr r7, r6, #16\n\t"
  80855. "lsl r6, r6, #16\n\t"
  80856. "adds r4, r4, r6\n\t"
  80857. "adcs r5, r5, r7\n\t"
  80858. "adc r3, r3, #0\n\t"
  80859. #else
  80860. "umull r6, r7, r8, r9\n\t"
  80861. "adds r4, r4, r6\n\t"
  80862. "adcs r5, r5, r7\n\t"
  80863. "adc r3, r3, #0\n\t"
  80864. #endif
  80865. /* A[7] * B[3] */
  80866. "ldr r8, [%[a], #28]\n\t"
  80867. "ldr r9, [%[b], #12]\n\t"
  80868. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  80869. "lsl r6, r8, #16\n\t"
  80870. "lsl r7, r9, #16\n\t"
  80871. "lsr r6, r6, #16\n\t"
  80872. "lsr r7, r7, #16\n\t"
  80873. "mul r7, r6, r7\n\t"
  80874. "adds r4, r4, r7\n\t"
  80875. "adcs r5, r5, #0\n\t"
  80876. "adc r3, r3, #0\n\t"
  80877. "lsr r7, r9, #16\n\t"
  80878. "mul r6, r7, r6\n\t"
  80879. "lsr r7, r6, #16\n\t"
  80880. "lsl r6, r6, #16\n\t"
  80881. "adds r4, r4, r6\n\t"
  80882. "adcs r5, r5, r7\n\t"
  80883. "adc r3, r3, #0\n\t"
  80884. "lsr r6, r8, #16\n\t"
  80885. "lsr r7, r9, #16\n\t"
  80886. "mul r7, r6, r7\n\t"
  80887. "adds r5, r5, r7\n\t"
  80888. "adc r3, r3, #0\n\t"
  80889. "lsl r7, r9, #16\n\t"
  80890. "lsr r7, r7, #16\n\t"
  80891. "mul r6, r7, r6\n\t"
  80892. "lsr r7, r6, #16\n\t"
  80893. "lsl r6, r6, #16\n\t"
  80894. "adds r4, r4, r6\n\t"
  80895. "adcs r5, r5, r7\n\t"
  80896. "adc r3, r3, #0\n\t"
  80897. #else
  80898. "umull r6, r7, r8, r9\n\t"
  80899. "adds r4, r4, r6\n\t"
  80900. "adcs r5, r5, r7\n\t"
  80901. "adc r3, r3, #0\n\t"
  80902. #endif
  80903. /* A[6] * B[4] */
  80904. "ldr r8, [%[a], #24]\n\t"
  80905. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  80906. "lsl r6, r8, #16\n\t"
  80907. "lsl r7, r12, #16\n\t"
  80908. "lsr r6, r6, #16\n\t"
  80909. "lsr r7, r7, #16\n\t"
  80910. "mul r7, r6, r7\n\t"
  80911. "adds r4, r4, r7\n\t"
  80912. "adcs r5, r5, #0\n\t"
  80913. "adc r3, r3, #0\n\t"
  80914. "lsr r7, r12, #16\n\t"
  80915. "mul r6, r7, r6\n\t"
  80916. "lsr r7, r6, #16\n\t"
  80917. "lsl r6, r6, #16\n\t"
  80918. "adds r4, r4, r6\n\t"
  80919. "adcs r5, r5, r7\n\t"
  80920. "adc r3, r3, #0\n\t"
  80921. "lsr r6, r8, #16\n\t"
  80922. "lsr r7, r12, #16\n\t"
  80923. "mul r7, r6, r7\n\t"
  80924. "adds r5, r5, r7\n\t"
  80925. "adc r3, r3, #0\n\t"
  80926. "lsl r7, r12, #16\n\t"
  80927. "lsr r7, r7, #16\n\t"
  80928. "mul r6, r7, r6\n\t"
  80929. "lsr r7, r6, #16\n\t"
  80930. "lsl r6, r6, #16\n\t"
  80931. "adds r4, r4, r6\n\t"
  80932. "adcs r5, r5, r7\n\t"
  80933. "adc r3, r3, #0\n\t"
  80934. #else
  80935. "umull r6, r7, r8, r12\n\t"
  80936. "adds r4, r4, r6\n\t"
  80937. "adcs r5, r5, r7\n\t"
  80938. "adc r3, r3, #0\n\t"
  80939. #endif
  80940. /* A[5] * B[5] */
  80941. "ldr r11, [%[a], #20]\n\t"
  80942. "ldr r12, [%[b], #20]\n\t"
  80943. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  80944. "lsl r6, r11, #16\n\t"
  80945. "lsl r7, r12, #16\n\t"
  80946. "lsr r6, r6, #16\n\t"
  80947. "lsr r7, r7, #16\n\t"
  80948. "mul r7, r6, r7\n\t"
  80949. "adds r4, r4, r7\n\t"
  80950. "adcs r5, r5, #0\n\t"
  80951. "adc r3, r3, #0\n\t"
  80952. "lsr r7, r12, #16\n\t"
  80953. "mul r6, r7, r6\n\t"
  80954. "lsr r7, r6, #16\n\t"
  80955. "lsl r6, r6, #16\n\t"
  80956. "adds r4, r4, r6\n\t"
  80957. "adcs r5, r5, r7\n\t"
  80958. "adc r3, r3, #0\n\t"
  80959. "lsr r6, r11, #16\n\t"
  80960. "lsr r7, r12, #16\n\t"
  80961. "mul r7, r6, r7\n\t"
  80962. "adds r5, r5, r7\n\t"
  80963. "adc r3, r3, #0\n\t"
  80964. "lsl r7, r12, #16\n\t"
  80965. "lsr r7, r7, #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. #else
  80973. "umull r6, r7, r11, r12\n\t"
  80974. "adds r4, r4, r6\n\t"
  80975. "adcs r5, r5, r7\n\t"
  80976. "adc r3, r3, #0\n\t"
  80977. #endif
  80978. /* A[4] * B[6] */
  80979. "ldr r8, [%[a], #16]\n\t"
  80980. "ldr r9, [%[b], #24]\n\t"
  80981. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  80982. "lsl r6, r8, #16\n\t"
  80983. "lsl r7, r9, #16\n\t"
  80984. "lsr r6, r6, #16\n\t"
  80985. "lsr r7, r7, #16\n\t"
  80986. "mul r7, r6, r7\n\t"
  80987. "adds r4, r4, r7\n\t"
  80988. "adcs r5, r5, #0\n\t"
  80989. "adc r3, r3, #0\n\t"
  80990. "lsr r7, r9, #16\n\t"
  80991. "mul r6, r7, r6\n\t"
  80992. "lsr r7, r6, #16\n\t"
  80993. "lsl r6, r6, #16\n\t"
  80994. "adds r4, r4, r6\n\t"
  80995. "adcs r5, r5, r7\n\t"
  80996. "adc r3, r3, #0\n\t"
  80997. "lsr r6, r8, #16\n\t"
  80998. "lsr r7, r9, #16\n\t"
  80999. "mul r7, r6, r7\n\t"
  81000. "adds r5, r5, r7\n\t"
  81001. "adc r3, r3, #0\n\t"
  81002. "lsl r7, r9, #16\n\t"
  81003. "lsr r7, r7, #16\n\t"
  81004. "mul r6, r7, r6\n\t"
  81005. "lsr r7, r6, #16\n\t"
  81006. "lsl r6, r6, #16\n\t"
  81007. "adds r4, r4, r6\n\t"
  81008. "adcs r5, r5, r7\n\t"
  81009. "adc r3, r3, #0\n\t"
  81010. #else
  81011. "umull r6, r7, r8, r9\n\t"
  81012. "adds r4, r4, r6\n\t"
  81013. "adcs r5, r5, r7\n\t"
  81014. "adc r3, r3, #0\n\t"
  81015. #endif
  81016. /* A[3] * B[7] */
  81017. "ldr r8, [%[a], #12]\n\t"
  81018. "ldr r9, [%[b], #28]\n\t"
  81019. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  81020. "lsl r6, r8, #16\n\t"
  81021. "lsl r7, r9, #16\n\t"
  81022. "lsr r6, r6, #16\n\t"
  81023. "lsr r7, r7, #16\n\t"
  81024. "mul r7, r6, r7\n\t"
  81025. "adds r4, r4, r7\n\t"
  81026. "adcs r5, r5, #0\n\t"
  81027. "adc r3, r3, #0\n\t"
  81028. "lsr r7, r9, #16\n\t"
  81029. "mul r6, r7, r6\n\t"
  81030. "lsr r7, r6, #16\n\t"
  81031. "lsl r6, r6, #16\n\t"
  81032. "adds r4, r4, r6\n\t"
  81033. "adcs r5, r5, r7\n\t"
  81034. "adc r3, r3, #0\n\t"
  81035. "lsr r6, r8, #16\n\t"
  81036. "lsr r7, r9, #16\n\t"
  81037. "mul r7, r6, r7\n\t"
  81038. "adds r5, r5, r7\n\t"
  81039. "adc r3, r3, #0\n\t"
  81040. "lsl r7, r9, #16\n\t"
  81041. "lsr r7, r7, #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. #else
  81049. "umull r6, r7, r8, r9\n\t"
  81050. "adds r4, r4, r6\n\t"
  81051. "adcs r5, r5, r7\n\t"
  81052. "adc r3, r3, #0\n\t"
  81053. #endif
  81054. /* A[2] * B[8] */
  81055. "ldr r8, [%[a], #8]\n\t"
  81056. "ldr r9, [%[b], #32]\n\t"
  81057. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  81058. "lsl r6, r8, #16\n\t"
  81059. "lsl r7, r9, #16\n\t"
  81060. "lsr r6, r6, #16\n\t"
  81061. "lsr r7, r7, #16\n\t"
  81062. "mul r7, r6, r7\n\t"
  81063. "adds r4, r4, r7\n\t"
  81064. "adcs r5, r5, #0\n\t"
  81065. "adc r3, r3, #0\n\t"
  81066. "lsr r7, r9, #16\n\t"
  81067. "mul r6, r7, r6\n\t"
  81068. "lsr r7, r6, #16\n\t"
  81069. "lsl r6, r6, #16\n\t"
  81070. "adds r4, r4, r6\n\t"
  81071. "adcs r5, r5, r7\n\t"
  81072. "adc r3, r3, #0\n\t"
  81073. "lsr r6, r8, #16\n\t"
  81074. "lsr r7, r9, #16\n\t"
  81075. "mul r7, r6, r7\n\t"
  81076. "adds r5, r5, r7\n\t"
  81077. "adc r3, r3, #0\n\t"
  81078. "lsl r7, r9, #16\n\t"
  81079. "lsr r7, r7, #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. #else
  81087. "umull r6, r7, r8, r9\n\t"
  81088. "adds r4, r4, r6\n\t"
  81089. "adcs r5, r5, r7\n\t"
  81090. "adc r3, r3, #0\n\t"
  81091. #endif
  81092. /* A[1] * B[9] */
  81093. "ldr r8, [%[a], #4]\n\t"
  81094. "ldr r9, [%[b], #36]\n\t"
  81095. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  81096. "lsl r6, r8, #16\n\t"
  81097. "lsl r7, r9, #16\n\t"
  81098. "lsr r6, r6, #16\n\t"
  81099. "lsr r7, r7, #16\n\t"
  81100. "mul r7, r6, r7\n\t"
  81101. "adds r4, r4, r7\n\t"
  81102. "adcs r5, r5, #0\n\t"
  81103. "adc r3, r3, #0\n\t"
  81104. "lsr r7, r9, #16\n\t"
  81105. "mul r6, r7, r6\n\t"
  81106. "lsr r7, r6, #16\n\t"
  81107. "lsl r6, r6, #16\n\t"
  81108. "adds r4, r4, r6\n\t"
  81109. "adcs r5, r5, r7\n\t"
  81110. "adc r3, r3, #0\n\t"
  81111. "lsr r6, r8, #16\n\t"
  81112. "lsr r7, r9, #16\n\t"
  81113. "mul r7, r6, r7\n\t"
  81114. "adds r5, r5, r7\n\t"
  81115. "adc r3, r3, #0\n\t"
  81116. "lsl r7, r9, #16\n\t"
  81117. "lsr r7, r7, #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. #else
  81125. "umull r6, r7, r8, r9\n\t"
  81126. "adds r4, r4, r6\n\t"
  81127. "adcs r5, r5, r7\n\t"
  81128. "adc r3, r3, #0\n\t"
  81129. #endif
  81130. /* A[0] * B[10] */
  81131. "ldr r8, [%[a]]\n\t"
  81132. "ldr r9, [%[b], #40]\n\t"
  81133. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  81134. "lsl r6, r8, #16\n\t"
  81135. "lsl r7, r9, #16\n\t"
  81136. "lsr r6, r6, #16\n\t"
  81137. "lsr r7, r7, #16\n\t"
  81138. "mul r7, r6, r7\n\t"
  81139. "adds r4, r4, r7\n\t"
  81140. "adcs r5, r5, #0\n\t"
  81141. "adc r3, r3, #0\n\t"
  81142. "lsr r7, r9, #16\n\t"
  81143. "mul r6, r7, r6\n\t"
  81144. "lsr r7, r6, #16\n\t"
  81145. "lsl r6, r6, #16\n\t"
  81146. "adds r4, r4, r6\n\t"
  81147. "adcs r5, r5, r7\n\t"
  81148. "adc r3, r3, #0\n\t"
  81149. "lsr r6, r8, #16\n\t"
  81150. "lsr r7, r9, #16\n\t"
  81151. "mul r7, r6, r7\n\t"
  81152. "adds r5, r5, r7\n\t"
  81153. "adc r3, r3, #0\n\t"
  81154. "lsl r7, r9, #16\n\t"
  81155. "lsr r7, r7, #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. #else
  81163. "umull r6, r7, r8, r9\n\t"
  81164. "adds r4, r4, r6\n\t"
  81165. "adcs r5, r5, r7\n\t"
  81166. "adc r3, r3, #0\n\t"
  81167. #endif
  81168. "str r4, [sp, #40]\n\t"
  81169. /* A[0] * B[11] */
  81170. "ldr r9, [%[b], #44]\n\t"
  81171. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  81172. "lsl r6, r8, #16\n\t"
  81173. "lsl r7, r9, #16\n\t"
  81174. "lsr r6, r6, #16\n\t"
  81175. "lsr r7, r7, #16\n\t"
  81176. "mul r7, r6, r7\n\t"
  81177. "adds r5, r5, r7\n\t"
  81178. "adcs r3, r3, #0\n\t"
  81179. "mov r4, #0\n\t"
  81180. "adc r4, r4, #0\n\t"
  81181. "lsr r7, r9, #16\n\t"
  81182. "mul r6, r7, r6\n\t"
  81183. "lsr r7, r6, #16\n\t"
  81184. "lsl r6, r6, #16\n\t"
  81185. "adds r5, r5, r6\n\t"
  81186. "adcs r3, r3, r7\n\t"
  81187. "adc r4, r4, #0\n\t"
  81188. "lsr r6, r8, #16\n\t"
  81189. "lsr r7, r9, #16\n\t"
  81190. "mul r7, r6, r7\n\t"
  81191. "adds r3, r3, r7\n\t"
  81192. "adc r4, r4, #0\n\t"
  81193. "lsl r7, r9, #16\n\t"
  81194. "lsr r7, r7, #16\n\t"
  81195. "mul r6, r7, r6\n\t"
  81196. "lsr r7, r6, #16\n\t"
  81197. "lsl r6, r6, #16\n\t"
  81198. "adds r5, r5, r6\n\t"
  81199. "adcs r3, r3, r7\n\t"
  81200. "adc r4, r4, #0\n\t"
  81201. #else
  81202. "umull r6, r7, r8, r9\n\t"
  81203. "adds r5, r5, r6\n\t"
  81204. "adcs r3, r3, r7\n\t"
  81205. "mov r4, #0\n\t"
  81206. "adc r4, r4, #0\n\t"
  81207. #endif
  81208. /* A[1] * B[10] */
  81209. "ldr r8, [%[a], #4]\n\t"
  81210. "ldr r9, [%[b], #40]\n\t"
  81211. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  81212. "lsl r6, r8, #16\n\t"
  81213. "lsl r7, r9, #16\n\t"
  81214. "lsr r6, r6, #16\n\t"
  81215. "lsr r7, r7, #16\n\t"
  81216. "mul r7, r6, r7\n\t"
  81217. "adds r5, r5, r7\n\t"
  81218. "adcs r3, r3, #0\n\t"
  81219. "adc r4, r4, #0\n\t"
  81220. "lsr r7, r9, #16\n\t"
  81221. "mul r6, r7, r6\n\t"
  81222. "lsr r7, r6, #16\n\t"
  81223. "lsl r6, r6, #16\n\t"
  81224. "adds r5, r5, r6\n\t"
  81225. "adcs r3, r3, r7\n\t"
  81226. "adc r4, r4, #0\n\t"
  81227. "lsr r6, r8, #16\n\t"
  81228. "lsr r7, r9, #16\n\t"
  81229. "mul r7, r6, r7\n\t"
  81230. "adds r3, r3, r7\n\t"
  81231. "adc r4, r4, #0\n\t"
  81232. "lsl r7, r9, #16\n\t"
  81233. "lsr r7, r7, #16\n\t"
  81234. "mul r6, r7, r6\n\t"
  81235. "lsr r7, r6, #16\n\t"
  81236. "lsl r6, r6, #16\n\t"
  81237. "adds r5, r5, r6\n\t"
  81238. "adcs r3, r3, r7\n\t"
  81239. "adc r4, r4, #0\n\t"
  81240. #else
  81241. "umull r6, r7, r8, r9\n\t"
  81242. "adds r5, r5, r6\n\t"
  81243. "adcs r3, r3, r7\n\t"
  81244. "adc r4, r4, #0\n\t"
  81245. #endif
  81246. /* A[2] * B[9] */
  81247. "ldr r8, [%[a], #8]\n\t"
  81248. "ldr r9, [%[b], #36]\n\t"
  81249. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  81250. "lsl r6, r8, #16\n\t"
  81251. "lsl r7, r9, #16\n\t"
  81252. "lsr r6, r6, #16\n\t"
  81253. "lsr r7, r7, #16\n\t"
  81254. "mul r7, r6, r7\n\t"
  81255. "adds r5, r5, r7\n\t"
  81256. "adcs r3, r3, #0\n\t"
  81257. "adc r4, r4, #0\n\t"
  81258. "lsr r7, r9, #16\n\t"
  81259. "mul r6, r7, r6\n\t"
  81260. "lsr r7, r6, #16\n\t"
  81261. "lsl r6, r6, #16\n\t"
  81262. "adds r5, r5, r6\n\t"
  81263. "adcs r3, r3, r7\n\t"
  81264. "adc r4, r4, #0\n\t"
  81265. "lsr r6, r8, #16\n\t"
  81266. "lsr r7, r9, #16\n\t"
  81267. "mul r7, r6, r7\n\t"
  81268. "adds r3, r3, r7\n\t"
  81269. "adc r4, r4, #0\n\t"
  81270. "lsl r7, r9, #16\n\t"
  81271. "lsr r7, r7, #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. #else
  81279. "umull r6, r7, r8, r9\n\t"
  81280. "adds r5, r5, r6\n\t"
  81281. "adcs r3, r3, r7\n\t"
  81282. "adc r4, r4, #0\n\t"
  81283. #endif
  81284. /* A[3] * B[8] */
  81285. "ldr r8, [%[a], #12]\n\t"
  81286. "ldr r9, [%[b], #32]\n\t"
  81287. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  81288. "lsl r6, r8, #16\n\t"
  81289. "lsl r7, r9, #16\n\t"
  81290. "lsr r6, r6, #16\n\t"
  81291. "lsr r7, r7, #16\n\t"
  81292. "mul r7, r6, r7\n\t"
  81293. "adds r5, r5, r7\n\t"
  81294. "adcs r3, r3, #0\n\t"
  81295. "adc r4, r4, #0\n\t"
  81296. "lsr r7, r9, #16\n\t"
  81297. "mul r6, r7, r6\n\t"
  81298. "lsr r7, r6, #16\n\t"
  81299. "lsl r6, r6, #16\n\t"
  81300. "adds r5, r5, r6\n\t"
  81301. "adcs r3, r3, r7\n\t"
  81302. "adc r4, r4, #0\n\t"
  81303. "lsr r6, r8, #16\n\t"
  81304. "lsr r7, r9, #16\n\t"
  81305. "mul r7, r6, r7\n\t"
  81306. "adds r3, r3, r7\n\t"
  81307. "adc r4, r4, #0\n\t"
  81308. "lsl r7, r9, #16\n\t"
  81309. "lsr r7, r7, #16\n\t"
  81310. "mul r6, r7, r6\n\t"
  81311. "lsr r7, r6, #16\n\t"
  81312. "lsl r6, r6, #16\n\t"
  81313. "adds r5, r5, r6\n\t"
  81314. "adcs r3, r3, r7\n\t"
  81315. "adc r4, r4, #0\n\t"
  81316. #else
  81317. "umull r6, r7, r8, r9\n\t"
  81318. "adds r5, r5, r6\n\t"
  81319. "adcs r3, r3, r7\n\t"
  81320. "adc r4, r4, #0\n\t"
  81321. #endif
  81322. /* A[4] * B[7] */
  81323. "ldr r8, [%[a], #16]\n\t"
  81324. "ldr r9, [%[b], #28]\n\t"
  81325. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  81326. "lsl r6, r8, #16\n\t"
  81327. "lsl r7, r9, #16\n\t"
  81328. "lsr r6, r6, #16\n\t"
  81329. "lsr r7, r7, #16\n\t"
  81330. "mul r7, r6, r7\n\t"
  81331. "adds r5, r5, r7\n\t"
  81332. "adcs r3, r3, #0\n\t"
  81333. "adc r4, r4, #0\n\t"
  81334. "lsr r7, r9, #16\n\t"
  81335. "mul r6, r7, r6\n\t"
  81336. "lsr r7, r6, #16\n\t"
  81337. "lsl r6, r6, #16\n\t"
  81338. "adds r5, r5, r6\n\t"
  81339. "adcs r3, r3, r7\n\t"
  81340. "adc r4, r4, #0\n\t"
  81341. "lsr r6, r8, #16\n\t"
  81342. "lsr r7, r9, #16\n\t"
  81343. "mul r7, r6, r7\n\t"
  81344. "adds r3, r3, r7\n\t"
  81345. "adc r4, r4, #0\n\t"
  81346. "lsl r7, r9, #16\n\t"
  81347. "lsr r7, r7, #16\n\t"
  81348. "mul r6, r7, r6\n\t"
  81349. "lsr r7, r6, #16\n\t"
  81350. "lsl r6, r6, #16\n\t"
  81351. "adds r5, r5, r6\n\t"
  81352. "adcs r3, r3, r7\n\t"
  81353. "adc r4, r4, #0\n\t"
  81354. #else
  81355. "umull r6, r7, r8, r9\n\t"
  81356. "adds r5, r5, r6\n\t"
  81357. "adcs r3, r3, r7\n\t"
  81358. "adc r4, r4, #0\n\t"
  81359. #endif
  81360. /* A[5] * B[6] */
  81361. "ldr r9, [%[b], #24]\n\t"
  81362. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  81363. "lsl r6, r11, #16\n\t"
  81364. "lsl r7, r9, #16\n\t"
  81365. "lsr r6, r6, #16\n\t"
  81366. "lsr r7, r7, #16\n\t"
  81367. "mul r7, r6, r7\n\t"
  81368. "adds r5, r5, r7\n\t"
  81369. "adcs r3, r3, #0\n\t"
  81370. "adc r4, r4, #0\n\t"
  81371. "lsr r7, r9, #16\n\t"
  81372. "mul r6, r7, r6\n\t"
  81373. "lsr r7, r6, #16\n\t"
  81374. "lsl r6, r6, #16\n\t"
  81375. "adds r5, r5, r6\n\t"
  81376. "adcs r3, r3, r7\n\t"
  81377. "adc r4, r4, #0\n\t"
  81378. "lsr r6, r11, #16\n\t"
  81379. "lsr r7, r9, #16\n\t"
  81380. "mul r7, r6, r7\n\t"
  81381. "adds r3, r3, r7\n\t"
  81382. "adc r4, r4, #0\n\t"
  81383. "lsl r7, r9, #16\n\t"
  81384. "lsr r7, r7, #16\n\t"
  81385. "mul r6, r7, r6\n\t"
  81386. "lsr r7, r6, #16\n\t"
  81387. "lsl r6, r6, #16\n\t"
  81388. "adds r5, r5, r6\n\t"
  81389. "adcs r3, r3, r7\n\t"
  81390. "adc r4, r4, #0\n\t"
  81391. #else
  81392. "umull r6, r7, r11, r9\n\t"
  81393. "adds r5, r5, r6\n\t"
  81394. "adcs r3, r3, r7\n\t"
  81395. "adc r4, r4, #0\n\t"
  81396. #endif
  81397. /* A[6] * B[5] */
  81398. "ldr r8, [%[a], #24]\n\t"
  81399. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  81400. "lsl r6, r8, #16\n\t"
  81401. "lsl r7, r12, #16\n\t"
  81402. "lsr r6, r6, #16\n\t"
  81403. "lsr r7, r7, #16\n\t"
  81404. "mul r7, r6, r7\n\t"
  81405. "adds r5, r5, r7\n\t"
  81406. "adcs r3, r3, #0\n\t"
  81407. "adc r4, r4, #0\n\t"
  81408. "lsr r7, r12, #16\n\t"
  81409. "mul r6, r7, r6\n\t"
  81410. "lsr r7, r6, #16\n\t"
  81411. "lsl r6, r6, #16\n\t"
  81412. "adds r5, r5, r6\n\t"
  81413. "adcs r3, r3, r7\n\t"
  81414. "adc r4, r4, #0\n\t"
  81415. "lsr r6, r8, #16\n\t"
  81416. "lsr r7, r12, #16\n\t"
  81417. "mul r7, r6, r7\n\t"
  81418. "adds r3, r3, r7\n\t"
  81419. "adc r4, r4, #0\n\t"
  81420. "lsl r7, r12, #16\n\t"
  81421. "lsr r7, r7, #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. #else
  81429. "umull r6, r7, r8, r12\n\t"
  81430. "adds r5, r5, r6\n\t"
  81431. "adcs r3, r3, r7\n\t"
  81432. "adc r4, r4, #0\n\t"
  81433. #endif
  81434. /* A[7] * B[4] */
  81435. "ldr r8, [%[a], #28]\n\t"
  81436. "ldr r9, [%[b], #16]\n\t"
  81437. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  81438. "lsl r6, r8, #16\n\t"
  81439. "lsl r7, r9, #16\n\t"
  81440. "lsr r6, r6, #16\n\t"
  81441. "lsr r7, r7, #16\n\t"
  81442. "mul r7, r6, r7\n\t"
  81443. "adds r5, r5, r7\n\t"
  81444. "adcs r3, r3, #0\n\t"
  81445. "adc r4, r4, #0\n\t"
  81446. "lsr r7, r9, #16\n\t"
  81447. "mul r6, r7, r6\n\t"
  81448. "lsr r7, r6, #16\n\t"
  81449. "lsl r6, r6, #16\n\t"
  81450. "adds r5, r5, r6\n\t"
  81451. "adcs r3, r3, r7\n\t"
  81452. "adc r4, r4, #0\n\t"
  81453. "lsr r6, r8, #16\n\t"
  81454. "lsr r7, r9, #16\n\t"
  81455. "mul r7, r6, r7\n\t"
  81456. "adds r3, r3, r7\n\t"
  81457. "adc r4, r4, #0\n\t"
  81458. "lsl r7, r9, #16\n\t"
  81459. "lsr r7, r7, #16\n\t"
  81460. "mul r6, r7, r6\n\t"
  81461. "lsr r7, r6, #16\n\t"
  81462. "lsl r6, r6, #16\n\t"
  81463. "adds r5, r5, r6\n\t"
  81464. "adcs r3, r3, r7\n\t"
  81465. "adc r4, r4, #0\n\t"
  81466. #else
  81467. "umull r6, r7, r8, r9\n\t"
  81468. "adds r5, r5, r6\n\t"
  81469. "adcs r3, r3, r7\n\t"
  81470. "adc r4, r4, #0\n\t"
  81471. #endif
  81472. /* A[8] * B[3] */
  81473. "ldr r8, [%[a], #32]\n\t"
  81474. "ldr r9, [%[b], #12]\n\t"
  81475. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  81476. "lsl r6, r8, #16\n\t"
  81477. "lsl r7, r9, #16\n\t"
  81478. "lsr r6, r6, #16\n\t"
  81479. "lsr r7, r7, #16\n\t"
  81480. "mul r7, r6, r7\n\t"
  81481. "adds r5, r5, r7\n\t"
  81482. "adcs r3, r3, #0\n\t"
  81483. "adc r4, r4, #0\n\t"
  81484. "lsr r7, r9, #16\n\t"
  81485. "mul r6, r7, r6\n\t"
  81486. "lsr r7, r6, #16\n\t"
  81487. "lsl r6, r6, #16\n\t"
  81488. "adds r5, r5, r6\n\t"
  81489. "adcs r3, r3, r7\n\t"
  81490. "adc r4, r4, #0\n\t"
  81491. "lsr r6, r8, #16\n\t"
  81492. "lsr r7, r9, #16\n\t"
  81493. "mul r7, r6, r7\n\t"
  81494. "adds r3, r3, r7\n\t"
  81495. "adc r4, r4, #0\n\t"
  81496. "lsl r7, r9, #16\n\t"
  81497. "lsr r7, r7, #16\n\t"
  81498. "mul r6, r7, r6\n\t"
  81499. "lsr r7, r6, #16\n\t"
  81500. "lsl r6, r6, #16\n\t"
  81501. "adds r5, r5, r6\n\t"
  81502. "adcs r3, r3, r7\n\t"
  81503. "adc r4, r4, #0\n\t"
  81504. #else
  81505. "umull r6, r7, r8, r9\n\t"
  81506. "adds r5, r5, r6\n\t"
  81507. "adcs r3, r3, r7\n\t"
  81508. "adc r4, r4, #0\n\t"
  81509. #endif
  81510. /* A[9] * B[2] */
  81511. "ldr r8, [%[a], #36]\n\t"
  81512. "ldr r9, [%[b], #8]\n\t"
  81513. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  81514. "lsl r6, r8, #16\n\t"
  81515. "lsl r7, r9, #16\n\t"
  81516. "lsr r6, r6, #16\n\t"
  81517. "lsr r7, r7, #16\n\t"
  81518. "mul r7, r6, r7\n\t"
  81519. "adds r5, r5, r7\n\t"
  81520. "adcs r3, r3, #0\n\t"
  81521. "adc r4, r4, #0\n\t"
  81522. "lsr r7, r9, #16\n\t"
  81523. "mul r6, r7, r6\n\t"
  81524. "lsr r7, r6, #16\n\t"
  81525. "lsl r6, r6, #16\n\t"
  81526. "adds r5, r5, r6\n\t"
  81527. "adcs r3, r3, r7\n\t"
  81528. "adc r4, r4, #0\n\t"
  81529. "lsr r6, r8, #16\n\t"
  81530. "lsr r7, r9, #16\n\t"
  81531. "mul r7, r6, r7\n\t"
  81532. "adds r3, r3, r7\n\t"
  81533. "adc r4, r4, #0\n\t"
  81534. "lsl r7, r9, #16\n\t"
  81535. "lsr r7, r7, #16\n\t"
  81536. "mul r6, r7, r6\n\t"
  81537. "lsr r7, r6, #16\n\t"
  81538. "lsl r6, r6, #16\n\t"
  81539. "adds r5, r5, r6\n\t"
  81540. "adcs r3, r3, r7\n\t"
  81541. "adc r4, r4, #0\n\t"
  81542. #else
  81543. "umull r6, r7, r8, r9\n\t"
  81544. "adds r5, r5, r6\n\t"
  81545. "adcs r3, r3, r7\n\t"
  81546. "adc r4, r4, #0\n\t"
  81547. #endif
  81548. /* A[10] * B[1] */
  81549. "ldr r8, [%[a], #40]\n\t"
  81550. "ldr r9, [%[b], #4]\n\t"
  81551. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  81552. "lsl r6, r8, #16\n\t"
  81553. "lsl r7, r9, #16\n\t"
  81554. "lsr r6, r6, #16\n\t"
  81555. "lsr r7, r7, #16\n\t"
  81556. "mul r7, r6, r7\n\t"
  81557. "adds r5, r5, r7\n\t"
  81558. "adcs r3, r3, #0\n\t"
  81559. "adc r4, r4, #0\n\t"
  81560. "lsr r7, r9, #16\n\t"
  81561. "mul r6, r7, r6\n\t"
  81562. "lsr r7, r6, #16\n\t"
  81563. "lsl r6, r6, #16\n\t"
  81564. "adds r5, r5, r6\n\t"
  81565. "adcs r3, r3, r7\n\t"
  81566. "adc r4, r4, #0\n\t"
  81567. "lsr r6, r8, #16\n\t"
  81568. "lsr r7, r9, #16\n\t"
  81569. "mul r7, r6, r7\n\t"
  81570. "adds r3, r3, r7\n\t"
  81571. "adc r4, r4, #0\n\t"
  81572. "lsl r7, r9, #16\n\t"
  81573. "lsr r7, r7, #16\n\t"
  81574. "mul r6, r7, r6\n\t"
  81575. "lsr r7, r6, #16\n\t"
  81576. "lsl r6, r6, #16\n\t"
  81577. "adds r5, r5, r6\n\t"
  81578. "adcs r3, r3, r7\n\t"
  81579. "adc r4, r4, #0\n\t"
  81580. #else
  81581. "umull r6, r7, r8, r9\n\t"
  81582. "adds r5, r5, r6\n\t"
  81583. "adcs r3, r3, r7\n\t"
  81584. "adc r4, r4, #0\n\t"
  81585. #endif
  81586. /* A[11] * B[0] */
  81587. "ldr r8, [%[a], #44]\n\t"
  81588. "ldr r9, [%[b]]\n\t"
  81589. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  81590. "lsl r6, r8, #16\n\t"
  81591. "lsl r7, r9, #16\n\t"
  81592. "lsr r6, r6, #16\n\t"
  81593. "lsr r7, r7, #16\n\t"
  81594. "mul r7, r6, r7\n\t"
  81595. "adds r5, r5, r7\n\t"
  81596. "adcs r3, r3, #0\n\t"
  81597. "adc r4, r4, #0\n\t"
  81598. "lsr r7, r9, #16\n\t"
  81599. "mul r6, r7, r6\n\t"
  81600. "lsr r7, r6, #16\n\t"
  81601. "lsl r6, r6, #16\n\t"
  81602. "adds r5, r5, r6\n\t"
  81603. "adcs r3, r3, r7\n\t"
  81604. "adc r4, r4, #0\n\t"
  81605. "lsr r6, r8, #16\n\t"
  81606. "lsr r7, r9, #16\n\t"
  81607. "mul r7, r6, r7\n\t"
  81608. "adds r3, r3, r7\n\t"
  81609. "adc r4, r4, #0\n\t"
  81610. "lsl r7, r9, #16\n\t"
  81611. "lsr r7, r7, #16\n\t"
  81612. "mul r6, r7, r6\n\t"
  81613. "lsr r7, r6, #16\n\t"
  81614. "lsl r6, r6, #16\n\t"
  81615. "adds r5, r5, r6\n\t"
  81616. "adcs r3, r3, r7\n\t"
  81617. "adc r4, r4, #0\n\t"
  81618. #else
  81619. "umull r6, r7, r8, r9\n\t"
  81620. "adds r5, r5, r6\n\t"
  81621. "adcs r3, r3, r7\n\t"
  81622. "adc r4, r4, #0\n\t"
  81623. #endif
  81624. "str r5, [sp, #44]\n\t"
  81625. /* A[11] * B[1] */
  81626. "ldr r9, [%[b], #4]\n\t"
  81627. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  81628. "lsl r6, r8, #16\n\t"
  81629. "lsl r7, r9, #16\n\t"
  81630. "lsr r6, r6, #16\n\t"
  81631. "lsr r7, r7, #16\n\t"
  81632. "mul r7, r6, r7\n\t"
  81633. "adds r3, r3, r7\n\t"
  81634. "adcs r4, r4, #0\n\t"
  81635. "mov r5, #0\n\t"
  81636. "adc r5, r5, #0\n\t"
  81637. "lsr r7, r9, #16\n\t"
  81638. "mul r6, r7, r6\n\t"
  81639. "lsr r7, r6, #16\n\t"
  81640. "lsl r6, r6, #16\n\t"
  81641. "adds r3, r3, r6\n\t"
  81642. "adcs r4, r4, r7\n\t"
  81643. "adc r5, r5, #0\n\t"
  81644. "lsr r6, r8, #16\n\t"
  81645. "lsr r7, r9, #16\n\t"
  81646. "mul r7, r6, r7\n\t"
  81647. "adds r4, r4, r7\n\t"
  81648. "adc r5, r5, #0\n\t"
  81649. "lsl r7, r9, #16\n\t"
  81650. "lsr r7, r7, #16\n\t"
  81651. "mul r6, r7, r6\n\t"
  81652. "lsr r7, r6, #16\n\t"
  81653. "lsl r6, r6, #16\n\t"
  81654. "adds r3, r3, r6\n\t"
  81655. "adcs r4, r4, r7\n\t"
  81656. "adc r5, r5, #0\n\t"
  81657. #else
  81658. "umull r6, r7, r8, r9\n\t"
  81659. "adds r3, r3, r6\n\t"
  81660. "adcs r4, r4, r7\n\t"
  81661. "mov r5, #0\n\t"
  81662. "adc r5, r5, #0\n\t"
  81663. #endif
  81664. /* A[10] * B[2] */
  81665. "ldr r8, [%[a], #40]\n\t"
  81666. "ldr r9, [%[b], #8]\n\t"
  81667. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  81668. "lsl r6, r8, #16\n\t"
  81669. "lsl r7, r9, #16\n\t"
  81670. "lsr r6, r6, #16\n\t"
  81671. "lsr r7, r7, #16\n\t"
  81672. "mul r7, r6, r7\n\t"
  81673. "adds r3, r3, r7\n\t"
  81674. "adcs r4, r4, #0\n\t"
  81675. "adc r5, r5, #0\n\t"
  81676. "lsr r7, r9, #16\n\t"
  81677. "mul r6, r7, r6\n\t"
  81678. "lsr r7, r6, #16\n\t"
  81679. "lsl r6, r6, #16\n\t"
  81680. "adds r3, r3, r6\n\t"
  81681. "adcs r4, r4, r7\n\t"
  81682. "adc r5, r5, #0\n\t"
  81683. "lsr r6, r8, #16\n\t"
  81684. "lsr r7, r9, #16\n\t"
  81685. "mul r7, r6, r7\n\t"
  81686. "adds r4, r4, r7\n\t"
  81687. "adc r5, r5, #0\n\t"
  81688. "lsl r7, r9, #16\n\t"
  81689. "lsr r7, r7, #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 r3, r3, r6\n\t"
  81694. "adcs r4, r4, r7\n\t"
  81695. "adc r5, r5, #0\n\t"
  81696. #else
  81697. "umull r6, r7, r8, r9\n\t"
  81698. "adds r3, r3, r6\n\t"
  81699. "adcs r4, r4, r7\n\t"
  81700. "adc r5, r5, #0\n\t"
  81701. #endif
  81702. /* A[9] * B[3] */
  81703. "ldr r8, [%[a], #36]\n\t"
  81704. "ldr r9, [%[b], #12]\n\t"
  81705. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  81706. "lsl r6, r8, #16\n\t"
  81707. "lsl r7, r9, #16\n\t"
  81708. "lsr r6, r6, #16\n\t"
  81709. "lsr r7, r7, #16\n\t"
  81710. "mul r7, r6, r7\n\t"
  81711. "adds r3, r3, r7\n\t"
  81712. "adcs r4, r4, #0\n\t"
  81713. "adc r5, r5, #0\n\t"
  81714. "lsr r7, r9, #16\n\t"
  81715. "mul r6, r7, r6\n\t"
  81716. "lsr r7, r6, #16\n\t"
  81717. "lsl r6, r6, #16\n\t"
  81718. "adds r3, r3, r6\n\t"
  81719. "adcs r4, r4, r7\n\t"
  81720. "adc r5, r5, #0\n\t"
  81721. "lsr r6, r8, #16\n\t"
  81722. "lsr r7, r9, #16\n\t"
  81723. "mul r7, r6, r7\n\t"
  81724. "adds r4, r4, r7\n\t"
  81725. "adc r5, r5, #0\n\t"
  81726. "lsl r7, r9, #16\n\t"
  81727. "lsr r7, r7, #16\n\t"
  81728. "mul r6, r7, r6\n\t"
  81729. "lsr r7, r6, #16\n\t"
  81730. "lsl r6, r6, #16\n\t"
  81731. "adds r3, r3, r6\n\t"
  81732. "adcs r4, r4, r7\n\t"
  81733. "adc r5, r5, #0\n\t"
  81734. #else
  81735. "umull r6, r7, r8, r9\n\t"
  81736. "adds r3, r3, r6\n\t"
  81737. "adcs r4, r4, r7\n\t"
  81738. "adc r5, r5, #0\n\t"
  81739. #endif
  81740. /* A[8] * B[4] */
  81741. "ldr r8, [%[a], #32]\n\t"
  81742. "ldr r9, [%[b], #16]\n\t"
  81743. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  81744. "lsl r6, r8, #16\n\t"
  81745. "lsl r7, r9, #16\n\t"
  81746. "lsr r6, r6, #16\n\t"
  81747. "lsr r7, r7, #16\n\t"
  81748. "mul r7, r6, r7\n\t"
  81749. "adds r3, r3, r7\n\t"
  81750. "adcs r4, r4, #0\n\t"
  81751. "adc r5, r5, #0\n\t"
  81752. "lsr r7, r9, #16\n\t"
  81753. "mul r6, r7, r6\n\t"
  81754. "lsr r7, r6, #16\n\t"
  81755. "lsl r6, r6, #16\n\t"
  81756. "adds r3, r3, r6\n\t"
  81757. "adcs r4, r4, r7\n\t"
  81758. "adc r5, r5, #0\n\t"
  81759. "lsr r6, r8, #16\n\t"
  81760. "lsr r7, r9, #16\n\t"
  81761. "mul r7, r6, r7\n\t"
  81762. "adds r4, r4, r7\n\t"
  81763. "adc r5, r5, #0\n\t"
  81764. "lsl r7, r9, #16\n\t"
  81765. "lsr r7, r7, #16\n\t"
  81766. "mul r6, r7, r6\n\t"
  81767. "lsr r7, r6, #16\n\t"
  81768. "lsl r6, r6, #16\n\t"
  81769. "adds r3, r3, r6\n\t"
  81770. "adcs r4, r4, r7\n\t"
  81771. "adc r5, r5, #0\n\t"
  81772. #else
  81773. "umull r6, r7, r8, r9\n\t"
  81774. "adds r3, r3, r6\n\t"
  81775. "adcs r4, r4, r7\n\t"
  81776. "adc r5, r5, #0\n\t"
  81777. #endif
  81778. /* A[7] * B[5] */
  81779. "ldr r8, [%[a], #28]\n\t"
  81780. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  81781. "lsl r6, r8, #16\n\t"
  81782. "lsl r7, r12, #16\n\t"
  81783. "lsr r6, r6, #16\n\t"
  81784. "lsr r7, r7, #16\n\t"
  81785. "mul r7, r6, r7\n\t"
  81786. "adds r3, r3, r7\n\t"
  81787. "adcs r4, r4, #0\n\t"
  81788. "adc r5, r5, #0\n\t"
  81789. "lsr r7, r12, #16\n\t"
  81790. "mul r6, r7, r6\n\t"
  81791. "lsr r7, r6, #16\n\t"
  81792. "lsl r6, r6, #16\n\t"
  81793. "adds r3, r3, r6\n\t"
  81794. "adcs r4, r4, r7\n\t"
  81795. "adc r5, r5, #0\n\t"
  81796. "lsr r6, r8, #16\n\t"
  81797. "lsr r7, r12, #16\n\t"
  81798. "mul r7, r6, r7\n\t"
  81799. "adds r4, r4, r7\n\t"
  81800. "adc r5, r5, #0\n\t"
  81801. "lsl r7, r12, #16\n\t"
  81802. "lsr r7, r7, #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 r3, r3, r6\n\t"
  81807. "adcs r4, r4, r7\n\t"
  81808. "adc r5, r5, #0\n\t"
  81809. #else
  81810. "umull r6, r7, r8, r12\n\t"
  81811. "adds r3, r3, r6\n\t"
  81812. "adcs r4, r4, r7\n\t"
  81813. "adc r5, r5, #0\n\t"
  81814. #endif
  81815. /* A[6] * B[6] */
  81816. "ldr r11, [%[a], #24]\n\t"
  81817. "ldr r12, [%[b], #24]\n\t"
  81818. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  81819. "lsl r6, r11, #16\n\t"
  81820. "lsl r7, r12, #16\n\t"
  81821. "lsr r6, r6, #16\n\t"
  81822. "lsr r7, r7, #16\n\t"
  81823. "mul r7, r6, r7\n\t"
  81824. "adds r3, r3, r7\n\t"
  81825. "adcs r4, r4, #0\n\t"
  81826. "adc r5, r5, #0\n\t"
  81827. "lsr r7, r12, #16\n\t"
  81828. "mul r6, r7, r6\n\t"
  81829. "lsr r7, r6, #16\n\t"
  81830. "lsl r6, r6, #16\n\t"
  81831. "adds r3, r3, r6\n\t"
  81832. "adcs r4, r4, r7\n\t"
  81833. "adc r5, r5, #0\n\t"
  81834. "lsr r6, r11, #16\n\t"
  81835. "lsr r7, r12, #16\n\t"
  81836. "mul r7, r6, r7\n\t"
  81837. "adds r4, r4, r7\n\t"
  81838. "adc r5, r5, #0\n\t"
  81839. "lsl r7, r12, #16\n\t"
  81840. "lsr r7, r7, #16\n\t"
  81841. "mul r6, r7, r6\n\t"
  81842. "lsr r7, r6, #16\n\t"
  81843. "lsl r6, r6, #16\n\t"
  81844. "adds r3, r3, r6\n\t"
  81845. "adcs r4, r4, r7\n\t"
  81846. "adc r5, r5, #0\n\t"
  81847. #else
  81848. "umull r6, r7, r11, r12\n\t"
  81849. "adds r3, r3, r6\n\t"
  81850. "adcs r4, r4, r7\n\t"
  81851. "adc r5, r5, #0\n\t"
  81852. #endif
  81853. /* A[5] * B[7] */
  81854. "ldr r8, [%[a], #20]\n\t"
  81855. "ldr r9, [%[b], #28]\n\t"
  81856. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  81857. "lsl r6, r8, #16\n\t"
  81858. "lsl r7, r9, #16\n\t"
  81859. "lsr r6, r6, #16\n\t"
  81860. "lsr r7, r7, #16\n\t"
  81861. "mul r7, r6, r7\n\t"
  81862. "adds r3, r3, r7\n\t"
  81863. "adcs r4, r4, #0\n\t"
  81864. "adc r5, r5, #0\n\t"
  81865. "lsr r7, r9, #16\n\t"
  81866. "mul r6, r7, r6\n\t"
  81867. "lsr r7, r6, #16\n\t"
  81868. "lsl r6, r6, #16\n\t"
  81869. "adds r3, r3, r6\n\t"
  81870. "adcs r4, r4, r7\n\t"
  81871. "adc r5, r5, #0\n\t"
  81872. "lsr r6, r8, #16\n\t"
  81873. "lsr r7, r9, #16\n\t"
  81874. "mul r7, r6, r7\n\t"
  81875. "adds r4, r4, r7\n\t"
  81876. "adc r5, r5, #0\n\t"
  81877. "lsl r7, r9, #16\n\t"
  81878. "lsr r7, r7, #16\n\t"
  81879. "mul r6, r7, r6\n\t"
  81880. "lsr r7, r6, #16\n\t"
  81881. "lsl r6, r6, #16\n\t"
  81882. "adds r3, r3, r6\n\t"
  81883. "adcs r4, r4, r7\n\t"
  81884. "adc r5, r5, #0\n\t"
  81885. #else
  81886. "umull r6, r7, r8, r9\n\t"
  81887. "adds r3, r3, r6\n\t"
  81888. "adcs r4, r4, r7\n\t"
  81889. "adc r5, r5, #0\n\t"
  81890. #endif
  81891. /* A[4] * B[8] */
  81892. "ldr r8, [%[a], #16]\n\t"
  81893. "ldr r9, [%[b], #32]\n\t"
  81894. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  81895. "lsl r6, r8, #16\n\t"
  81896. "lsl r7, r9, #16\n\t"
  81897. "lsr r6, r6, #16\n\t"
  81898. "lsr r7, r7, #16\n\t"
  81899. "mul r7, r6, r7\n\t"
  81900. "adds r3, r3, r7\n\t"
  81901. "adcs r4, r4, #0\n\t"
  81902. "adc r5, r5, #0\n\t"
  81903. "lsr r7, r9, #16\n\t"
  81904. "mul r6, r7, r6\n\t"
  81905. "lsr r7, r6, #16\n\t"
  81906. "lsl r6, r6, #16\n\t"
  81907. "adds r3, r3, r6\n\t"
  81908. "adcs r4, r4, r7\n\t"
  81909. "adc r5, r5, #0\n\t"
  81910. "lsr r6, r8, #16\n\t"
  81911. "lsr r7, r9, #16\n\t"
  81912. "mul r7, r6, r7\n\t"
  81913. "adds r4, r4, r7\n\t"
  81914. "adc r5, r5, #0\n\t"
  81915. "lsl r7, r9, #16\n\t"
  81916. "lsr r7, r7, #16\n\t"
  81917. "mul r6, r7, r6\n\t"
  81918. "lsr r7, r6, #16\n\t"
  81919. "lsl r6, r6, #16\n\t"
  81920. "adds r3, r3, r6\n\t"
  81921. "adcs r4, r4, r7\n\t"
  81922. "adc r5, r5, #0\n\t"
  81923. #else
  81924. "umull r6, r7, r8, r9\n\t"
  81925. "adds r3, r3, r6\n\t"
  81926. "adcs r4, r4, r7\n\t"
  81927. "adc r5, r5, #0\n\t"
  81928. #endif
  81929. /* A[3] * B[9] */
  81930. "ldr r8, [%[a], #12]\n\t"
  81931. "ldr r9, [%[b], #36]\n\t"
  81932. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  81933. "lsl r6, r8, #16\n\t"
  81934. "lsl r7, r9, #16\n\t"
  81935. "lsr r6, r6, #16\n\t"
  81936. "lsr r7, r7, #16\n\t"
  81937. "mul r7, r6, r7\n\t"
  81938. "adds r3, r3, r7\n\t"
  81939. "adcs r4, r4, #0\n\t"
  81940. "adc r5, r5, #0\n\t"
  81941. "lsr r7, r9, #16\n\t"
  81942. "mul r6, r7, r6\n\t"
  81943. "lsr r7, r6, #16\n\t"
  81944. "lsl r6, r6, #16\n\t"
  81945. "adds r3, r3, r6\n\t"
  81946. "adcs r4, r4, r7\n\t"
  81947. "adc r5, r5, #0\n\t"
  81948. "lsr r6, r8, #16\n\t"
  81949. "lsr r7, r9, #16\n\t"
  81950. "mul r7, r6, r7\n\t"
  81951. "adds r4, r4, r7\n\t"
  81952. "adc r5, r5, #0\n\t"
  81953. "lsl r7, r9, #16\n\t"
  81954. "lsr r7, r7, #16\n\t"
  81955. "mul r6, r7, r6\n\t"
  81956. "lsr r7, r6, #16\n\t"
  81957. "lsl r6, r6, #16\n\t"
  81958. "adds r3, r3, r6\n\t"
  81959. "adcs r4, r4, r7\n\t"
  81960. "adc r5, r5, #0\n\t"
  81961. #else
  81962. "umull r6, r7, r8, r9\n\t"
  81963. "adds r3, r3, r6\n\t"
  81964. "adcs r4, r4, r7\n\t"
  81965. "adc r5, r5, #0\n\t"
  81966. #endif
  81967. /* A[2] * B[10] */
  81968. "ldr r8, [%[a], #8]\n\t"
  81969. "ldr r9, [%[b], #40]\n\t"
  81970. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  81971. "lsl r6, r8, #16\n\t"
  81972. "lsl r7, r9, #16\n\t"
  81973. "lsr r6, r6, #16\n\t"
  81974. "lsr r7, r7, #16\n\t"
  81975. "mul r7, r6, r7\n\t"
  81976. "adds r3, r3, r7\n\t"
  81977. "adcs r4, r4, #0\n\t"
  81978. "adc r5, r5, #0\n\t"
  81979. "lsr r7, r9, #16\n\t"
  81980. "mul r6, r7, r6\n\t"
  81981. "lsr r7, r6, #16\n\t"
  81982. "lsl r6, r6, #16\n\t"
  81983. "adds r3, r3, r6\n\t"
  81984. "adcs r4, r4, r7\n\t"
  81985. "adc r5, r5, #0\n\t"
  81986. "lsr r6, r8, #16\n\t"
  81987. "lsr r7, r9, #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. "lsl r7, r9, #16\n\t"
  81992. "lsr r7, r7, #16\n\t"
  81993. "mul r6, r7, r6\n\t"
  81994. "lsr r7, r6, #16\n\t"
  81995. "lsl r6, r6, #16\n\t"
  81996. "adds r3, r3, r6\n\t"
  81997. "adcs r4, r4, r7\n\t"
  81998. "adc r5, r5, #0\n\t"
  81999. #else
  82000. "umull r6, r7, r8, r9\n\t"
  82001. "adds r3, r3, r6\n\t"
  82002. "adcs r4, r4, r7\n\t"
  82003. "adc r5, r5, #0\n\t"
  82004. #endif
  82005. /* A[1] * B[11] */
  82006. "ldr r8, [%[a], #4]\n\t"
  82007. "ldr r9, [%[b], #44]\n\t"
  82008. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  82009. "lsl r6, r8, #16\n\t"
  82010. "lsl r7, r9, #16\n\t"
  82011. "lsr r6, r6, #16\n\t"
  82012. "lsr r7, r7, #16\n\t"
  82013. "mul r7, r6, r7\n\t"
  82014. "adds r3, r3, r7\n\t"
  82015. "adcs r4, r4, #0\n\t"
  82016. "adc r5, r5, #0\n\t"
  82017. "lsr r7, r9, #16\n\t"
  82018. "mul r6, r7, r6\n\t"
  82019. "lsr r7, r6, #16\n\t"
  82020. "lsl r6, r6, #16\n\t"
  82021. "adds r3, r3, r6\n\t"
  82022. "adcs r4, r4, r7\n\t"
  82023. "adc r5, r5, #0\n\t"
  82024. "lsr r6, r8, #16\n\t"
  82025. "lsr r7, r9, #16\n\t"
  82026. "mul r7, r6, r7\n\t"
  82027. "adds r4, r4, r7\n\t"
  82028. "adc r5, r5, #0\n\t"
  82029. "lsl r7, r9, #16\n\t"
  82030. "lsr r7, r7, #16\n\t"
  82031. "mul r6, r7, r6\n\t"
  82032. "lsr r7, r6, #16\n\t"
  82033. "lsl r6, r6, #16\n\t"
  82034. "adds r3, r3, r6\n\t"
  82035. "adcs r4, r4, r7\n\t"
  82036. "adc r5, r5, #0\n\t"
  82037. #else
  82038. "umull r6, r7, r8, r9\n\t"
  82039. "adds r3, r3, r6\n\t"
  82040. "adcs r4, r4, r7\n\t"
  82041. "adc r5, r5, #0\n\t"
  82042. #endif
  82043. "str r3, [%[r], #48]\n\t"
  82044. /* A[2] * B[11] */
  82045. "ldr r8, [%[a], #8]\n\t"
  82046. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  82047. "lsl r6, r8, #16\n\t"
  82048. "lsl r7, r9, #16\n\t"
  82049. "lsr r6, r6, #16\n\t"
  82050. "lsr r7, r7, #16\n\t"
  82051. "mul r7, r6, r7\n\t"
  82052. "adds r4, r4, r7\n\t"
  82053. "adcs r5, r5, #0\n\t"
  82054. "mov r3, #0\n\t"
  82055. "adc r3, r3, #0\n\t"
  82056. "lsr r7, r9, #16\n\t"
  82057. "mul r6, r7, r6\n\t"
  82058. "lsr r7, r6, #16\n\t"
  82059. "lsl r6, r6, #16\n\t"
  82060. "adds r4, r4, r6\n\t"
  82061. "adcs r5, r5, r7\n\t"
  82062. "adc r3, r3, #0\n\t"
  82063. "lsr r6, r8, #16\n\t"
  82064. "lsr r7, r9, #16\n\t"
  82065. "mul r7, r6, r7\n\t"
  82066. "adds r5, r5, r7\n\t"
  82067. "adc r3, r3, #0\n\t"
  82068. "lsl r7, r9, #16\n\t"
  82069. "lsr r7, r7, #16\n\t"
  82070. "mul r6, r7, r6\n\t"
  82071. "lsr r7, r6, #16\n\t"
  82072. "lsl r6, r6, #16\n\t"
  82073. "adds r4, r4, r6\n\t"
  82074. "adcs r5, r5, r7\n\t"
  82075. "adc r3, r3, #0\n\t"
  82076. #else
  82077. "umull r6, r7, r8, r9\n\t"
  82078. "adds r4, r4, r6\n\t"
  82079. "adcs r5, r5, r7\n\t"
  82080. "mov r3, #0\n\t"
  82081. "adc r3, r3, #0\n\t"
  82082. #endif
  82083. /* A[3] * B[10] */
  82084. "ldr r8, [%[a], #12]\n\t"
  82085. "ldr r9, [%[b], #40]\n\t"
  82086. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  82087. "lsl r6, r8, #16\n\t"
  82088. "lsl r7, r9, #16\n\t"
  82089. "lsr r6, r6, #16\n\t"
  82090. "lsr r7, r7, #16\n\t"
  82091. "mul r7, r6, r7\n\t"
  82092. "adds r4, r4, r7\n\t"
  82093. "adcs r5, r5, #0\n\t"
  82094. "adc r3, r3, #0\n\t"
  82095. "lsr r7, r9, #16\n\t"
  82096. "mul r6, r7, r6\n\t"
  82097. "lsr r7, r6, #16\n\t"
  82098. "lsl r6, r6, #16\n\t"
  82099. "adds r4, r4, r6\n\t"
  82100. "adcs r5, r5, r7\n\t"
  82101. "adc r3, r3, #0\n\t"
  82102. "lsr r6, r8, #16\n\t"
  82103. "lsr r7, r9, #16\n\t"
  82104. "mul r7, r6, r7\n\t"
  82105. "adds r5, r5, r7\n\t"
  82106. "adc r3, r3, #0\n\t"
  82107. "lsl r7, r9, #16\n\t"
  82108. "lsr r7, r7, #16\n\t"
  82109. "mul r6, r7, r6\n\t"
  82110. "lsr r7, r6, #16\n\t"
  82111. "lsl r6, r6, #16\n\t"
  82112. "adds r4, r4, r6\n\t"
  82113. "adcs r5, r5, r7\n\t"
  82114. "adc r3, r3, #0\n\t"
  82115. #else
  82116. "umull r6, r7, r8, r9\n\t"
  82117. "adds r4, r4, r6\n\t"
  82118. "adcs r5, r5, r7\n\t"
  82119. "adc r3, r3, #0\n\t"
  82120. #endif
  82121. /* A[4] * B[9] */
  82122. "ldr r8, [%[a], #16]\n\t"
  82123. "ldr r9, [%[b], #36]\n\t"
  82124. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  82125. "lsl r6, r8, #16\n\t"
  82126. "lsl r7, r9, #16\n\t"
  82127. "lsr r6, r6, #16\n\t"
  82128. "lsr r7, r7, #16\n\t"
  82129. "mul r7, r6, r7\n\t"
  82130. "adds r4, r4, r7\n\t"
  82131. "adcs r5, r5, #0\n\t"
  82132. "adc r3, r3, #0\n\t"
  82133. "lsr r7, r9, #16\n\t"
  82134. "mul r6, r7, r6\n\t"
  82135. "lsr r7, r6, #16\n\t"
  82136. "lsl r6, r6, #16\n\t"
  82137. "adds r4, r4, r6\n\t"
  82138. "adcs r5, r5, r7\n\t"
  82139. "adc r3, r3, #0\n\t"
  82140. "lsr r6, r8, #16\n\t"
  82141. "lsr r7, r9, #16\n\t"
  82142. "mul r7, r6, r7\n\t"
  82143. "adds r5, r5, r7\n\t"
  82144. "adc r3, r3, #0\n\t"
  82145. "lsl r7, r9, #16\n\t"
  82146. "lsr r7, r7, #16\n\t"
  82147. "mul r6, r7, r6\n\t"
  82148. "lsr r7, r6, #16\n\t"
  82149. "lsl r6, r6, #16\n\t"
  82150. "adds r4, r4, r6\n\t"
  82151. "adcs r5, r5, r7\n\t"
  82152. "adc r3, r3, #0\n\t"
  82153. #else
  82154. "umull r6, r7, r8, r9\n\t"
  82155. "adds r4, r4, r6\n\t"
  82156. "adcs r5, r5, r7\n\t"
  82157. "adc r3, r3, #0\n\t"
  82158. #endif
  82159. /* A[5] * B[8] */
  82160. "ldr r8, [%[a], #20]\n\t"
  82161. "ldr r9, [%[b], #32]\n\t"
  82162. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  82163. "lsl r6, r8, #16\n\t"
  82164. "lsl r7, r9, #16\n\t"
  82165. "lsr r6, r6, #16\n\t"
  82166. "lsr r7, r7, #16\n\t"
  82167. "mul r7, r6, r7\n\t"
  82168. "adds r4, r4, r7\n\t"
  82169. "adcs r5, r5, #0\n\t"
  82170. "adc r3, r3, #0\n\t"
  82171. "lsr r7, r9, #16\n\t"
  82172. "mul r6, r7, r6\n\t"
  82173. "lsr r7, r6, #16\n\t"
  82174. "lsl r6, r6, #16\n\t"
  82175. "adds r4, r4, r6\n\t"
  82176. "adcs r5, r5, r7\n\t"
  82177. "adc r3, r3, #0\n\t"
  82178. "lsr r6, r8, #16\n\t"
  82179. "lsr r7, r9, #16\n\t"
  82180. "mul r7, r6, r7\n\t"
  82181. "adds r5, r5, r7\n\t"
  82182. "adc r3, r3, #0\n\t"
  82183. "lsl r7, r9, #16\n\t"
  82184. "lsr r7, r7, #16\n\t"
  82185. "mul r6, r7, r6\n\t"
  82186. "lsr r7, r6, #16\n\t"
  82187. "lsl r6, r6, #16\n\t"
  82188. "adds r4, r4, r6\n\t"
  82189. "adcs r5, r5, r7\n\t"
  82190. "adc r3, r3, #0\n\t"
  82191. #else
  82192. "umull r6, r7, r8, r9\n\t"
  82193. "adds r4, r4, r6\n\t"
  82194. "adcs r5, r5, r7\n\t"
  82195. "adc r3, r3, #0\n\t"
  82196. #endif
  82197. /* A[6] * B[7] */
  82198. "ldr r9, [%[b], #28]\n\t"
  82199. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  82200. "lsl r6, r11, #16\n\t"
  82201. "lsl r7, r9, #16\n\t"
  82202. "lsr r6, r6, #16\n\t"
  82203. "lsr r7, r7, #16\n\t"
  82204. "mul r7, r6, r7\n\t"
  82205. "adds r4, r4, r7\n\t"
  82206. "adcs r5, r5, #0\n\t"
  82207. "adc r3, r3, #0\n\t"
  82208. "lsr r7, r9, #16\n\t"
  82209. "mul r6, r7, r6\n\t"
  82210. "lsr r7, r6, #16\n\t"
  82211. "lsl r6, r6, #16\n\t"
  82212. "adds r4, r4, r6\n\t"
  82213. "adcs r5, r5, r7\n\t"
  82214. "adc r3, r3, #0\n\t"
  82215. "lsr r6, r11, #16\n\t"
  82216. "lsr r7, r9, #16\n\t"
  82217. "mul r7, r6, r7\n\t"
  82218. "adds r5, r5, r7\n\t"
  82219. "adc r3, r3, #0\n\t"
  82220. "lsl r7, r9, #16\n\t"
  82221. "lsr r7, r7, #16\n\t"
  82222. "mul r6, r7, r6\n\t"
  82223. "lsr r7, r6, #16\n\t"
  82224. "lsl r6, r6, #16\n\t"
  82225. "adds r4, r4, r6\n\t"
  82226. "adcs r5, r5, r7\n\t"
  82227. "adc r3, r3, #0\n\t"
  82228. #else
  82229. "umull r6, r7, r11, r9\n\t"
  82230. "adds r4, r4, r6\n\t"
  82231. "adcs r5, r5, r7\n\t"
  82232. "adc r3, r3, #0\n\t"
  82233. #endif
  82234. /* A[7] * B[6] */
  82235. "ldr r8, [%[a], #28]\n\t"
  82236. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  82237. "lsl r6, r8, #16\n\t"
  82238. "lsl r7, r12, #16\n\t"
  82239. "lsr r6, r6, #16\n\t"
  82240. "lsr r7, r7, #16\n\t"
  82241. "mul r7, r6, r7\n\t"
  82242. "adds r4, r4, r7\n\t"
  82243. "adcs r5, r5, #0\n\t"
  82244. "adc r3, r3, #0\n\t"
  82245. "lsr r7, r12, #16\n\t"
  82246. "mul r6, r7, r6\n\t"
  82247. "lsr r7, r6, #16\n\t"
  82248. "lsl r6, r6, #16\n\t"
  82249. "adds r4, r4, r6\n\t"
  82250. "adcs r5, r5, r7\n\t"
  82251. "adc r3, r3, #0\n\t"
  82252. "lsr r6, r8, #16\n\t"
  82253. "lsr r7, r12, #16\n\t"
  82254. "mul r7, r6, r7\n\t"
  82255. "adds r5, r5, r7\n\t"
  82256. "adc r3, r3, #0\n\t"
  82257. "lsl r7, r12, #16\n\t"
  82258. "lsr r7, r7, #16\n\t"
  82259. "mul r6, r7, r6\n\t"
  82260. "lsr r7, r6, #16\n\t"
  82261. "lsl r6, r6, #16\n\t"
  82262. "adds r4, r4, r6\n\t"
  82263. "adcs r5, r5, r7\n\t"
  82264. "adc r3, r3, #0\n\t"
  82265. #else
  82266. "umull r6, r7, r8, r12\n\t"
  82267. "adds r4, r4, r6\n\t"
  82268. "adcs r5, r5, r7\n\t"
  82269. "adc r3, r3, #0\n\t"
  82270. #endif
  82271. /* A[8] * B[5] */
  82272. "ldr r8, [%[a], #32]\n\t"
  82273. "ldr r9, [%[b], #20]\n\t"
  82274. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  82275. "lsl r6, r8, #16\n\t"
  82276. "lsl r7, r9, #16\n\t"
  82277. "lsr r6, r6, #16\n\t"
  82278. "lsr r7, r7, #16\n\t"
  82279. "mul r7, r6, r7\n\t"
  82280. "adds r4, r4, r7\n\t"
  82281. "adcs r5, r5, #0\n\t"
  82282. "adc r3, r3, #0\n\t"
  82283. "lsr r7, r9, #16\n\t"
  82284. "mul r6, r7, r6\n\t"
  82285. "lsr r7, r6, #16\n\t"
  82286. "lsl r6, r6, #16\n\t"
  82287. "adds r4, r4, r6\n\t"
  82288. "adcs r5, r5, r7\n\t"
  82289. "adc r3, r3, #0\n\t"
  82290. "lsr r6, r8, #16\n\t"
  82291. "lsr r7, r9, #16\n\t"
  82292. "mul r7, r6, r7\n\t"
  82293. "adds r5, r5, r7\n\t"
  82294. "adc r3, r3, #0\n\t"
  82295. "lsl r7, r9, #16\n\t"
  82296. "lsr r7, r7, #16\n\t"
  82297. "mul r6, r7, r6\n\t"
  82298. "lsr r7, r6, #16\n\t"
  82299. "lsl r6, r6, #16\n\t"
  82300. "adds r4, r4, r6\n\t"
  82301. "adcs r5, r5, r7\n\t"
  82302. "adc r3, r3, #0\n\t"
  82303. #else
  82304. "umull r6, r7, r8, r9\n\t"
  82305. "adds r4, r4, r6\n\t"
  82306. "adcs r5, r5, r7\n\t"
  82307. "adc r3, r3, #0\n\t"
  82308. #endif
  82309. /* A[9] * B[4] */
  82310. "ldr r8, [%[a], #36]\n\t"
  82311. "ldr r9, [%[b], #16]\n\t"
  82312. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  82313. "lsl r6, r8, #16\n\t"
  82314. "lsl r7, r9, #16\n\t"
  82315. "lsr r6, r6, #16\n\t"
  82316. "lsr r7, r7, #16\n\t"
  82317. "mul r7, r6, r7\n\t"
  82318. "adds r4, r4, r7\n\t"
  82319. "adcs r5, r5, #0\n\t"
  82320. "adc r3, r3, #0\n\t"
  82321. "lsr r7, r9, #16\n\t"
  82322. "mul r6, r7, r6\n\t"
  82323. "lsr r7, r6, #16\n\t"
  82324. "lsl r6, r6, #16\n\t"
  82325. "adds r4, r4, r6\n\t"
  82326. "adcs r5, r5, r7\n\t"
  82327. "adc r3, r3, #0\n\t"
  82328. "lsr r6, r8, #16\n\t"
  82329. "lsr r7, r9, #16\n\t"
  82330. "mul r7, r6, r7\n\t"
  82331. "adds r5, r5, r7\n\t"
  82332. "adc r3, r3, #0\n\t"
  82333. "lsl r7, r9, #16\n\t"
  82334. "lsr r7, r7, #16\n\t"
  82335. "mul r6, r7, r6\n\t"
  82336. "lsr r7, r6, #16\n\t"
  82337. "lsl r6, r6, #16\n\t"
  82338. "adds r4, r4, r6\n\t"
  82339. "adcs r5, r5, r7\n\t"
  82340. "adc r3, r3, #0\n\t"
  82341. #else
  82342. "umull r6, r7, r8, r9\n\t"
  82343. "adds r4, r4, r6\n\t"
  82344. "adcs r5, r5, r7\n\t"
  82345. "adc r3, r3, #0\n\t"
  82346. #endif
  82347. /* A[10] * B[3] */
  82348. "ldr r8, [%[a], #40]\n\t"
  82349. "ldr r9, [%[b], #12]\n\t"
  82350. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  82351. "lsl r6, r8, #16\n\t"
  82352. "lsl r7, r9, #16\n\t"
  82353. "lsr r6, r6, #16\n\t"
  82354. "lsr r7, r7, #16\n\t"
  82355. "mul r7, r6, r7\n\t"
  82356. "adds r4, r4, r7\n\t"
  82357. "adcs r5, r5, #0\n\t"
  82358. "adc r3, r3, #0\n\t"
  82359. "lsr r7, r9, #16\n\t"
  82360. "mul r6, r7, r6\n\t"
  82361. "lsr r7, r6, #16\n\t"
  82362. "lsl r6, r6, #16\n\t"
  82363. "adds r4, r4, r6\n\t"
  82364. "adcs r5, r5, r7\n\t"
  82365. "adc r3, r3, #0\n\t"
  82366. "lsr r6, r8, #16\n\t"
  82367. "lsr r7, r9, #16\n\t"
  82368. "mul r7, r6, r7\n\t"
  82369. "adds r5, r5, r7\n\t"
  82370. "adc r3, r3, #0\n\t"
  82371. "lsl r7, r9, #16\n\t"
  82372. "lsr r7, r7, #16\n\t"
  82373. "mul r6, r7, r6\n\t"
  82374. "lsr r7, r6, #16\n\t"
  82375. "lsl r6, r6, #16\n\t"
  82376. "adds r4, r4, r6\n\t"
  82377. "adcs r5, r5, r7\n\t"
  82378. "adc r3, r3, #0\n\t"
  82379. #else
  82380. "umull r6, r7, r8, r9\n\t"
  82381. "adds r4, r4, r6\n\t"
  82382. "adcs r5, r5, r7\n\t"
  82383. "adc r3, r3, #0\n\t"
  82384. #endif
  82385. /* A[11] * B[2] */
  82386. "ldr r8, [%[a], #44]\n\t"
  82387. "ldr r9, [%[b], #8]\n\t"
  82388. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  82389. "lsl r6, r8, #16\n\t"
  82390. "lsl r7, r9, #16\n\t"
  82391. "lsr r6, r6, #16\n\t"
  82392. "lsr r7, r7, #16\n\t"
  82393. "mul r7, r6, r7\n\t"
  82394. "adds r4, r4, r7\n\t"
  82395. "adcs r5, r5, #0\n\t"
  82396. "adc r3, r3, #0\n\t"
  82397. "lsr r7, r9, #16\n\t"
  82398. "mul r6, r7, r6\n\t"
  82399. "lsr r7, r6, #16\n\t"
  82400. "lsl r6, r6, #16\n\t"
  82401. "adds r4, r4, r6\n\t"
  82402. "adcs r5, r5, r7\n\t"
  82403. "adc r3, r3, #0\n\t"
  82404. "lsr r6, r8, #16\n\t"
  82405. "lsr r7, r9, #16\n\t"
  82406. "mul r7, r6, r7\n\t"
  82407. "adds r5, r5, r7\n\t"
  82408. "adc r3, r3, #0\n\t"
  82409. "lsl r7, r9, #16\n\t"
  82410. "lsr r7, r7, #16\n\t"
  82411. "mul r6, r7, r6\n\t"
  82412. "lsr r7, r6, #16\n\t"
  82413. "lsl r6, r6, #16\n\t"
  82414. "adds r4, r4, r6\n\t"
  82415. "adcs r5, r5, r7\n\t"
  82416. "adc r3, r3, #0\n\t"
  82417. #else
  82418. "umull r6, r7, r8, r9\n\t"
  82419. "adds r4, r4, r6\n\t"
  82420. "adcs r5, r5, r7\n\t"
  82421. "adc r3, r3, #0\n\t"
  82422. #endif
  82423. "str r4, [%[r], #52]\n\t"
  82424. /* A[11] * B[3] */
  82425. "ldr r9, [%[b], #12]\n\t"
  82426. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  82427. "lsl r6, r8, #16\n\t"
  82428. "lsl r7, r9, #16\n\t"
  82429. "lsr r6, r6, #16\n\t"
  82430. "lsr r7, r7, #16\n\t"
  82431. "mul r7, r6, r7\n\t"
  82432. "adds r5, r5, r7\n\t"
  82433. "adcs r3, r3, #0\n\t"
  82434. "mov r4, #0\n\t"
  82435. "adc r4, r4, #0\n\t"
  82436. "lsr r7, r9, #16\n\t"
  82437. "mul r6, r7, r6\n\t"
  82438. "lsr r7, r6, #16\n\t"
  82439. "lsl r6, r6, #16\n\t"
  82440. "adds r5, r5, r6\n\t"
  82441. "adcs r3, r3, r7\n\t"
  82442. "adc r4, r4, #0\n\t"
  82443. "lsr r6, r8, #16\n\t"
  82444. "lsr r7, r9, #16\n\t"
  82445. "mul r7, r6, r7\n\t"
  82446. "adds r3, r3, r7\n\t"
  82447. "adc r4, r4, #0\n\t"
  82448. "lsl r7, r9, #16\n\t"
  82449. "lsr r7, r7, #16\n\t"
  82450. "mul r6, r7, r6\n\t"
  82451. "lsr r7, r6, #16\n\t"
  82452. "lsl r6, r6, #16\n\t"
  82453. "adds r5, r5, r6\n\t"
  82454. "adcs r3, r3, r7\n\t"
  82455. "adc r4, r4, #0\n\t"
  82456. #else
  82457. "umull r6, r7, r8, r9\n\t"
  82458. "adds r5, r5, r6\n\t"
  82459. "adcs r3, r3, r7\n\t"
  82460. "mov r4, #0\n\t"
  82461. "adc r4, r4, #0\n\t"
  82462. #endif
  82463. /* A[10] * B[4] */
  82464. "ldr r8, [%[a], #40]\n\t"
  82465. "ldr r9, [%[b], #16]\n\t"
  82466. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  82467. "lsl r6, r8, #16\n\t"
  82468. "lsl r7, r9, #16\n\t"
  82469. "lsr r6, r6, #16\n\t"
  82470. "lsr r7, r7, #16\n\t"
  82471. "mul r7, r6, r7\n\t"
  82472. "adds r5, r5, r7\n\t"
  82473. "adcs r3, r3, #0\n\t"
  82474. "adc r4, r4, #0\n\t"
  82475. "lsr r7, r9, #16\n\t"
  82476. "mul r6, r7, r6\n\t"
  82477. "lsr r7, r6, #16\n\t"
  82478. "lsl r6, r6, #16\n\t"
  82479. "adds r5, r5, r6\n\t"
  82480. "adcs r3, r3, r7\n\t"
  82481. "adc r4, r4, #0\n\t"
  82482. "lsr r6, r8, #16\n\t"
  82483. "lsr r7, r9, #16\n\t"
  82484. "mul r7, r6, r7\n\t"
  82485. "adds r3, r3, r7\n\t"
  82486. "adc r4, r4, #0\n\t"
  82487. "lsl r7, r9, #16\n\t"
  82488. "lsr r7, r7, #16\n\t"
  82489. "mul r6, r7, r6\n\t"
  82490. "lsr r7, r6, #16\n\t"
  82491. "lsl r6, r6, #16\n\t"
  82492. "adds r5, r5, r6\n\t"
  82493. "adcs r3, r3, r7\n\t"
  82494. "adc r4, r4, #0\n\t"
  82495. #else
  82496. "umull r6, r7, r8, r9\n\t"
  82497. "adds r5, r5, r6\n\t"
  82498. "adcs r3, r3, r7\n\t"
  82499. "adc r4, r4, #0\n\t"
  82500. #endif
  82501. /* A[9] * B[5] */
  82502. "ldr r8, [%[a], #36]\n\t"
  82503. "ldr r9, [%[b], #20]\n\t"
  82504. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  82505. "lsl r6, r8, #16\n\t"
  82506. "lsl r7, r9, #16\n\t"
  82507. "lsr r6, r6, #16\n\t"
  82508. "lsr r7, r7, #16\n\t"
  82509. "mul r7, r6, r7\n\t"
  82510. "adds r5, r5, r7\n\t"
  82511. "adcs r3, r3, #0\n\t"
  82512. "adc r4, r4, #0\n\t"
  82513. "lsr r7, r9, #16\n\t"
  82514. "mul r6, r7, r6\n\t"
  82515. "lsr r7, r6, #16\n\t"
  82516. "lsl r6, r6, #16\n\t"
  82517. "adds r5, r5, r6\n\t"
  82518. "adcs r3, r3, r7\n\t"
  82519. "adc r4, r4, #0\n\t"
  82520. "lsr r6, r8, #16\n\t"
  82521. "lsr r7, r9, #16\n\t"
  82522. "mul r7, r6, r7\n\t"
  82523. "adds r3, r3, r7\n\t"
  82524. "adc r4, r4, #0\n\t"
  82525. "lsl r7, r9, #16\n\t"
  82526. "lsr r7, r7, #16\n\t"
  82527. "mul r6, r7, r6\n\t"
  82528. "lsr r7, r6, #16\n\t"
  82529. "lsl r6, r6, #16\n\t"
  82530. "adds r5, r5, r6\n\t"
  82531. "adcs r3, r3, r7\n\t"
  82532. "adc r4, r4, #0\n\t"
  82533. #else
  82534. "umull r6, r7, r8, r9\n\t"
  82535. "adds r5, r5, r6\n\t"
  82536. "adcs r3, r3, r7\n\t"
  82537. "adc r4, r4, #0\n\t"
  82538. #endif
  82539. /* A[8] * B[6] */
  82540. "ldr r8, [%[a], #32]\n\t"
  82541. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  82542. "lsl r6, r8, #16\n\t"
  82543. "lsl r7, r12, #16\n\t"
  82544. "lsr r6, r6, #16\n\t"
  82545. "lsr r7, r7, #16\n\t"
  82546. "mul r7, r6, r7\n\t"
  82547. "adds r5, r5, r7\n\t"
  82548. "adcs r3, r3, #0\n\t"
  82549. "adc r4, r4, #0\n\t"
  82550. "lsr r7, r12, #16\n\t"
  82551. "mul r6, r7, r6\n\t"
  82552. "lsr r7, r6, #16\n\t"
  82553. "lsl r6, r6, #16\n\t"
  82554. "adds r5, r5, r6\n\t"
  82555. "adcs r3, r3, r7\n\t"
  82556. "adc r4, r4, #0\n\t"
  82557. "lsr r6, r8, #16\n\t"
  82558. "lsr r7, r12, #16\n\t"
  82559. "mul r7, r6, r7\n\t"
  82560. "adds r3, r3, r7\n\t"
  82561. "adc r4, r4, #0\n\t"
  82562. "lsl r7, r12, #16\n\t"
  82563. "lsr r7, r7, #16\n\t"
  82564. "mul r6, r7, r6\n\t"
  82565. "lsr r7, r6, #16\n\t"
  82566. "lsl r6, r6, #16\n\t"
  82567. "adds r5, r5, r6\n\t"
  82568. "adcs r3, r3, r7\n\t"
  82569. "adc r4, r4, #0\n\t"
  82570. #else
  82571. "umull r6, r7, r8, r12\n\t"
  82572. "adds r5, r5, r6\n\t"
  82573. "adcs r3, r3, r7\n\t"
  82574. "adc r4, r4, #0\n\t"
  82575. #endif
  82576. /* A[7] * B[7] */
  82577. "ldr r11, [%[a], #28]\n\t"
  82578. "ldr r12, [%[b], #28]\n\t"
  82579. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  82580. "lsl r6, r11, #16\n\t"
  82581. "lsl r7, r12, #16\n\t"
  82582. "lsr r6, r6, #16\n\t"
  82583. "lsr r7, r7, #16\n\t"
  82584. "mul r7, r6, r7\n\t"
  82585. "adds r5, r5, r7\n\t"
  82586. "adcs r3, r3, #0\n\t"
  82587. "adc r4, r4, #0\n\t"
  82588. "lsr r7, r12, #16\n\t"
  82589. "mul r6, r7, r6\n\t"
  82590. "lsr r7, r6, #16\n\t"
  82591. "lsl r6, r6, #16\n\t"
  82592. "adds r5, r5, r6\n\t"
  82593. "adcs r3, r3, r7\n\t"
  82594. "adc r4, r4, #0\n\t"
  82595. "lsr r6, r11, #16\n\t"
  82596. "lsr r7, r12, #16\n\t"
  82597. "mul r7, r6, r7\n\t"
  82598. "adds r3, r3, r7\n\t"
  82599. "adc r4, r4, #0\n\t"
  82600. "lsl r7, r12, #16\n\t"
  82601. "lsr r7, r7, #16\n\t"
  82602. "mul r6, r7, r6\n\t"
  82603. "lsr r7, r6, #16\n\t"
  82604. "lsl r6, r6, #16\n\t"
  82605. "adds r5, r5, r6\n\t"
  82606. "adcs r3, r3, r7\n\t"
  82607. "adc r4, r4, #0\n\t"
  82608. #else
  82609. "umull r6, r7, r11, r12\n\t"
  82610. "adds r5, r5, r6\n\t"
  82611. "adcs r3, r3, r7\n\t"
  82612. "adc r4, r4, #0\n\t"
  82613. #endif
  82614. /* A[6] * B[8] */
  82615. "ldr r8, [%[a], #24]\n\t"
  82616. "ldr r9, [%[b], #32]\n\t"
  82617. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  82618. "lsl r6, r8, #16\n\t"
  82619. "lsl r7, r9, #16\n\t"
  82620. "lsr r6, r6, #16\n\t"
  82621. "lsr r7, r7, #16\n\t"
  82622. "mul r7, r6, r7\n\t"
  82623. "adds r5, r5, r7\n\t"
  82624. "adcs r3, r3, #0\n\t"
  82625. "adc r4, r4, #0\n\t"
  82626. "lsr r7, r9, #16\n\t"
  82627. "mul r6, r7, r6\n\t"
  82628. "lsr r7, r6, #16\n\t"
  82629. "lsl r6, r6, #16\n\t"
  82630. "adds r5, r5, r6\n\t"
  82631. "adcs r3, r3, r7\n\t"
  82632. "adc r4, r4, #0\n\t"
  82633. "lsr r6, r8, #16\n\t"
  82634. "lsr r7, r9, #16\n\t"
  82635. "mul r7, r6, r7\n\t"
  82636. "adds r3, r3, r7\n\t"
  82637. "adc r4, r4, #0\n\t"
  82638. "lsl r7, r9, #16\n\t"
  82639. "lsr r7, r7, #16\n\t"
  82640. "mul r6, r7, r6\n\t"
  82641. "lsr r7, r6, #16\n\t"
  82642. "lsl r6, r6, #16\n\t"
  82643. "adds r5, r5, r6\n\t"
  82644. "adcs r3, r3, r7\n\t"
  82645. "adc r4, r4, #0\n\t"
  82646. #else
  82647. "umull r6, r7, r8, r9\n\t"
  82648. "adds r5, r5, r6\n\t"
  82649. "adcs r3, r3, r7\n\t"
  82650. "adc r4, r4, #0\n\t"
  82651. #endif
  82652. /* A[5] * B[9] */
  82653. "ldr r8, [%[a], #20]\n\t"
  82654. "ldr r9, [%[b], #36]\n\t"
  82655. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  82656. "lsl r6, r8, #16\n\t"
  82657. "lsl r7, r9, #16\n\t"
  82658. "lsr r6, r6, #16\n\t"
  82659. "lsr r7, r7, #16\n\t"
  82660. "mul r7, r6, r7\n\t"
  82661. "adds r5, r5, r7\n\t"
  82662. "adcs r3, r3, #0\n\t"
  82663. "adc r4, r4, #0\n\t"
  82664. "lsr r7, r9, #16\n\t"
  82665. "mul r6, r7, r6\n\t"
  82666. "lsr r7, r6, #16\n\t"
  82667. "lsl r6, r6, #16\n\t"
  82668. "adds r5, r5, r6\n\t"
  82669. "adcs r3, r3, r7\n\t"
  82670. "adc r4, r4, #0\n\t"
  82671. "lsr r6, r8, #16\n\t"
  82672. "lsr r7, r9, #16\n\t"
  82673. "mul r7, r6, r7\n\t"
  82674. "adds r3, r3, r7\n\t"
  82675. "adc r4, r4, #0\n\t"
  82676. "lsl r7, r9, #16\n\t"
  82677. "lsr r7, r7, #16\n\t"
  82678. "mul r6, r7, r6\n\t"
  82679. "lsr r7, r6, #16\n\t"
  82680. "lsl r6, r6, #16\n\t"
  82681. "adds r5, r5, r6\n\t"
  82682. "adcs r3, r3, r7\n\t"
  82683. "adc r4, r4, #0\n\t"
  82684. #else
  82685. "umull r6, r7, r8, r9\n\t"
  82686. "adds r5, r5, r6\n\t"
  82687. "adcs r3, r3, r7\n\t"
  82688. "adc r4, r4, #0\n\t"
  82689. #endif
  82690. /* A[4] * B[10] */
  82691. "ldr r8, [%[a], #16]\n\t"
  82692. "ldr r9, [%[b], #40]\n\t"
  82693. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  82694. "lsl r6, r8, #16\n\t"
  82695. "lsl r7, r9, #16\n\t"
  82696. "lsr r6, r6, #16\n\t"
  82697. "lsr r7, r7, #16\n\t"
  82698. "mul r7, r6, r7\n\t"
  82699. "adds r5, r5, r7\n\t"
  82700. "adcs r3, r3, #0\n\t"
  82701. "adc r4, r4, #0\n\t"
  82702. "lsr r7, r9, #16\n\t"
  82703. "mul r6, r7, r6\n\t"
  82704. "lsr r7, r6, #16\n\t"
  82705. "lsl r6, r6, #16\n\t"
  82706. "adds r5, r5, r6\n\t"
  82707. "adcs r3, r3, r7\n\t"
  82708. "adc r4, r4, #0\n\t"
  82709. "lsr r6, r8, #16\n\t"
  82710. "lsr r7, r9, #16\n\t"
  82711. "mul r7, r6, r7\n\t"
  82712. "adds r3, r3, r7\n\t"
  82713. "adc r4, r4, #0\n\t"
  82714. "lsl r7, r9, #16\n\t"
  82715. "lsr r7, r7, #16\n\t"
  82716. "mul r6, r7, r6\n\t"
  82717. "lsr r7, r6, #16\n\t"
  82718. "lsl r6, r6, #16\n\t"
  82719. "adds r5, r5, r6\n\t"
  82720. "adcs r3, r3, r7\n\t"
  82721. "adc r4, r4, #0\n\t"
  82722. #else
  82723. "umull r6, r7, r8, r9\n\t"
  82724. "adds r5, r5, r6\n\t"
  82725. "adcs r3, r3, r7\n\t"
  82726. "adc r4, r4, #0\n\t"
  82727. #endif
  82728. /* A[3] * B[11] */
  82729. "ldr r8, [%[a], #12]\n\t"
  82730. "ldr r9, [%[b], #44]\n\t"
  82731. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  82732. "lsl r6, r8, #16\n\t"
  82733. "lsl r7, r9, #16\n\t"
  82734. "lsr r6, r6, #16\n\t"
  82735. "lsr r7, r7, #16\n\t"
  82736. "mul r7, r6, r7\n\t"
  82737. "adds r5, r5, r7\n\t"
  82738. "adcs r3, r3, #0\n\t"
  82739. "adc r4, r4, #0\n\t"
  82740. "lsr r7, r9, #16\n\t"
  82741. "mul r6, r7, r6\n\t"
  82742. "lsr r7, r6, #16\n\t"
  82743. "lsl r6, r6, #16\n\t"
  82744. "adds r5, r5, r6\n\t"
  82745. "adcs r3, r3, r7\n\t"
  82746. "adc r4, r4, #0\n\t"
  82747. "lsr r6, r8, #16\n\t"
  82748. "lsr r7, r9, #16\n\t"
  82749. "mul r7, r6, r7\n\t"
  82750. "adds r3, r3, r7\n\t"
  82751. "adc r4, r4, #0\n\t"
  82752. "lsl r7, r9, #16\n\t"
  82753. "lsr r7, r7, #16\n\t"
  82754. "mul r6, r7, r6\n\t"
  82755. "lsr r7, r6, #16\n\t"
  82756. "lsl r6, r6, #16\n\t"
  82757. "adds r5, r5, r6\n\t"
  82758. "adcs r3, r3, r7\n\t"
  82759. "adc r4, r4, #0\n\t"
  82760. #else
  82761. "umull r6, r7, r8, r9\n\t"
  82762. "adds r5, r5, r6\n\t"
  82763. "adcs r3, r3, r7\n\t"
  82764. "adc r4, r4, #0\n\t"
  82765. #endif
  82766. "str r5, [%[r], #56]\n\t"
  82767. /* A[4] * B[11] */
  82768. "ldr r8, [%[a], #16]\n\t"
  82769. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  82770. "lsl r6, r8, #16\n\t"
  82771. "lsl r7, r9, #16\n\t"
  82772. "lsr r6, r6, #16\n\t"
  82773. "lsr r7, r7, #16\n\t"
  82774. "mul r7, r6, r7\n\t"
  82775. "adds r3, r3, r7\n\t"
  82776. "adcs r4, r4, #0\n\t"
  82777. "mov r5, #0\n\t"
  82778. "adc r5, r5, #0\n\t"
  82779. "lsr r7, r9, #16\n\t"
  82780. "mul r6, r7, r6\n\t"
  82781. "lsr r7, r6, #16\n\t"
  82782. "lsl r6, r6, #16\n\t"
  82783. "adds r3, r3, r6\n\t"
  82784. "adcs r4, r4, r7\n\t"
  82785. "adc r5, r5, #0\n\t"
  82786. "lsr r6, r8, #16\n\t"
  82787. "lsr r7, r9, #16\n\t"
  82788. "mul r7, r6, r7\n\t"
  82789. "adds r4, r4, r7\n\t"
  82790. "adc r5, r5, #0\n\t"
  82791. "lsl r7, r9, #16\n\t"
  82792. "lsr r7, r7, #16\n\t"
  82793. "mul r6, r7, r6\n\t"
  82794. "lsr r7, r6, #16\n\t"
  82795. "lsl r6, r6, #16\n\t"
  82796. "adds r3, r3, r6\n\t"
  82797. "adcs r4, r4, r7\n\t"
  82798. "adc r5, r5, #0\n\t"
  82799. #else
  82800. "umull r6, r7, r8, r9\n\t"
  82801. "adds r3, r3, r6\n\t"
  82802. "adcs r4, r4, r7\n\t"
  82803. "mov r5, #0\n\t"
  82804. "adc r5, r5, #0\n\t"
  82805. #endif
  82806. /* A[5] * B[10] */
  82807. "ldr r8, [%[a], #20]\n\t"
  82808. "ldr r9, [%[b], #40]\n\t"
  82809. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  82810. "lsl r6, r8, #16\n\t"
  82811. "lsl r7, r9, #16\n\t"
  82812. "lsr r6, r6, #16\n\t"
  82813. "lsr r7, r7, #16\n\t"
  82814. "mul r7, r6, r7\n\t"
  82815. "adds r3, r3, r7\n\t"
  82816. "adcs r4, r4, #0\n\t"
  82817. "adc r5, r5, #0\n\t"
  82818. "lsr r7, r9, #16\n\t"
  82819. "mul r6, r7, r6\n\t"
  82820. "lsr r7, r6, #16\n\t"
  82821. "lsl r6, r6, #16\n\t"
  82822. "adds r3, r3, r6\n\t"
  82823. "adcs r4, r4, r7\n\t"
  82824. "adc r5, r5, #0\n\t"
  82825. "lsr r6, r8, #16\n\t"
  82826. "lsr r7, r9, #16\n\t"
  82827. "mul r7, r6, r7\n\t"
  82828. "adds r4, r4, r7\n\t"
  82829. "adc r5, r5, #0\n\t"
  82830. "lsl r7, r9, #16\n\t"
  82831. "lsr r7, r7, #16\n\t"
  82832. "mul r6, r7, r6\n\t"
  82833. "lsr r7, r6, #16\n\t"
  82834. "lsl r6, r6, #16\n\t"
  82835. "adds r3, r3, r6\n\t"
  82836. "adcs r4, r4, r7\n\t"
  82837. "adc r5, r5, #0\n\t"
  82838. #else
  82839. "umull r6, r7, r8, r9\n\t"
  82840. "adds r3, r3, r6\n\t"
  82841. "adcs r4, r4, r7\n\t"
  82842. "adc r5, r5, #0\n\t"
  82843. #endif
  82844. /* A[6] * B[9] */
  82845. "ldr r8, [%[a], #24]\n\t"
  82846. "ldr r9, [%[b], #36]\n\t"
  82847. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  82848. "lsl r6, r8, #16\n\t"
  82849. "lsl r7, r9, #16\n\t"
  82850. "lsr r6, r6, #16\n\t"
  82851. "lsr r7, r7, #16\n\t"
  82852. "mul r7, r6, r7\n\t"
  82853. "adds r3, r3, r7\n\t"
  82854. "adcs r4, r4, #0\n\t"
  82855. "adc r5, r5, #0\n\t"
  82856. "lsr r7, r9, #16\n\t"
  82857. "mul r6, r7, r6\n\t"
  82858. "lsr r7, r6, #16\n\t"
  82859. "lsl r6, r6, #16\n\t"
  82860. "adds r3, r3, r6\n\t"
  82861. "adcs r4, r4, r7\n\t"
  82862. "adc r5, r5, #0\n\t"
  82863. "lsr r6, r8, #16\n\t"
  82864. "lsr r7, r9, #16\n\t"
  82865. "mul r7, r6, r7\n\t"
  82866. "adds r4, r4, r7\n\t"
  82867. "adc r5, r5, #0\n\t"
  82868. "lsl r7, r9, #16\n\t"
  82869. "lsr r7, r7, #16\n\t"
  82870. "mul r6, r7, r6\n\t"
  82871. "lsr r7, r6, #16\n\t"
  82872. "lsl r6, r6, #16\n\t"
  82873. "adds r3, r3, r6\n\t"
  82874. "adcs r4, r4, r7\n\t"
  82875. "adc r5, r5, #0\n\t"
  82876. #else
  82877. "umull r6, r7, r8, r9\n\t"
  82878. "adds r3, r3, r6\n\t"
  82879. "adcs r4, r4, r7\n\t"
  82880. "adc r5, r5, #0\n\t"
  82881. #endif
  82882. /* A[7] * B[8] */
  82883. "ldr r9, [%[b], #32]\n\t"
  82884. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  82885. "lsl r6, r11, #16\n\t"
  82886. "lsl r7, r9, #16\n\t"
  82887. "lsr r6, r6, #16\n\t"
  82888. "lsr r7, r7, #16\n\t"
  82889. "mul r7, r6, r7\n\t"
  82890. "adds r3, r3, r7\n\t"
  82891. "adcs r4, r4, #0\n\t"
  82892. "adc r5, r5, #0\n\t"
  82893. "lsr r7, r9, #16\n\t"
  82894. "mul r6, r7, r6\n\t"
  82895. "lsr r7, r6, #16\n\t"
  82896. "lsl r6, r6, #16\n\t"
  82897. "adds r3, r3, r6\n\t"
  82898. "adcs r4, r4, r7\n\t"
  82899. "adc r5, r5, #0\n\t"
  82900. "lsr r6, r11, #16\n\t"
  82901. "lsr r7, r9, #16\n\t"
  82902. "mul r7, r6, r7\n\t"
  82903. "adds r4, r4, r7\n\t"
  82904. "adc r5, r5, #0\n\t"
  82905. "lsl r7, r9, #16\n\t"
  82906. "lsr r7, r7, #16\n\t"
  82907. "mul r6, r7, r6\n\t"
  82908. "lsr r7, r6, #16\n\t"
  82909. "lsl r6, r6, #16\n\t"
  82910. "adds r3, r3, r6\n\t"
  82911. "adcs r4, r4, r7\n\t"
  82912. "adc r5, r5, #0\n\t"
  82913. #else
  82914. "umull r6, r7, r11, r9\n\t"
  82915. "adds r3, r3, r6\n\t"
  82916. "adcs r4, r4, r7\n\t"
  82917. "adc r5, r5, #0\n\t"
  82918. #endif
  82919. /* A[8] * B[7] */
  82920. "ldr r8, [%[a], #32]\n\t"
  82921. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  82922. "lsl r6, r8, #16\n\t"
  82923. "lsl r7, r12, #16\n\t"
  82924. "lsr r6, r6, #16\n\t"
  82925. "lsr r7, r7, #16\n\t"
  82926. "mul r7, r6, r7\n\t"
  82927. "adds r3, r3, r7\n\t"
  82928. "adcs r4, r4, #0\n\t"
  82929. "adc r5, r5, #0\n\t"
  82930. "lsr r7, r12, #16\n\t"
  82931. "mul r6, r7, r6\n\t"
  82932. "lsr r7, r6, #16\n\t"
  82933. "lsl r6, r6, #16\n\t"
  82934. "adds r3, r3, r6\n\t"
  82935. "adcs r4, r4, r7\n\t"
  82936. "adc r5, r5, #0\n\t"
  82937. "lsr r6, r8, #16\n\t"
  82938. "lsr r7, r12, #16\n\t"
  82939. "mul r7, r6, r7\n\t"
  82940. "adds r4, r4, r7\n\t"
  82941. "adc r5, r5, #0\n\t"
  82942. "lsl r7, r12, #16\n\t"
  82943. "lsr r7, r7, #16\n\t"
  82944. "mul r6, r7, r6\n\t"
  82945. "lsr r7, r6, #16\n\t"
  82946. "lsl r6, r6, #16\n\t"
  82947. "adds r3, r3, r6\n\t"
  82948. "adcs r4, r4, r7\n\t"
  82949. "adc r5, r5, #0\n\t"
  82950. #else
  82951. "umull r6, r7, r8, r12\n\t"
  82952. "adds r3, r3, r6\n\t"
  82953. "adcs r4, r4, r7\n\t"
  82954. "adc r5, r5, #0\n\t"
  82955. #endif
  82956. /* A[9] * B[6] */
  82957. "ldr r8, [%[a], #36]\n\t"
  82958. "ldr r9, [%[b], #24]\n\t"
  82959. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  82960. "lsl r6, r8, #16\n\t"
  82961. "lsl r7, r9, #16\n\t"
  82962. "lsr r6, r6, #16\n\t"
  82963. "lsr r7, r7, #16\n\t"
  82964. "mul r7, r6, r7\n\t"
  82965. "adds r3, r3, r7\n\t"
  82966. "adcs r4, r4, #0\n\t"
  82967. "adc r5, r5, #0\n\t"
  82968. "lsr r7, r9, #16\n\t"
  82969. "mul r6, r7, r6\n\t"
  82970. "lsr r7, r6, #16\n\t"
  82971. "lsl r6, r6, #16\n\t"
  82972. "adds r3, r3, r6\n\t"
  82973. "adcs r4, r4, r7\n\t"
  82974. "adc r5, r5, #0\n\t"
  82975. "lsr r6, r8, #16\n\t"
  82976. "lsr r7, r9, #16\n\t"
  82977. "mul r7, r6, r7\n\t"
  82978. "adds r4, r4, r7\n\t"
  82979. "adc r5, r5, #0\n\t"
  82980. "lsl r7, r9, #16\n\t"
  82981. "lsr r7, r7, #16\n\t"
  82982. "mul r6, r7, r6\n\t"
  82983. "lsr r7, r6, #16\n\t"
  82984. "lsl r6, r6, #16\n\t"
  82985. "adds r3, r3, r6\n\t"
  82986. "adcs r4, r4, r7\n\t"
  82987. "adc r5, r5, #0\n\t"
  82988. #else
  82989. "umull r6, r7, r8, r9\n\t"
  82990. "adds r3, r3, r6\n\t"
  82991. "adcs r4, r4, r7\n\t"
  82992. "adc r5, r5, #0\n\t"
  82993. #endif
  82994. /* A[10] * B[5] */
  82995. "ldr r8, [%[a], #40]\n\t"
  82996. "ldr r9, [%[b], #20]\n\t"
  82997. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  82998. "lsl r6, r8, #16\n\t"
  82999. "lsl r7, r9, #16\n\t"
  83000. "lsr r6, r6, #16\n\t"
  83001. "lsr r7, r7, #16\n\t"
  83002. "mul r7, r6, r7\n\t"
  83003. "adds r3, r3, r7\n\t"
  83004. "adcs r4, r4, #0\n\t"
  83005. "adc r5, r5, #0\n\t"
  83006. "lsr r7, r9, #16\n\t"
  83007. "mul r6, r7, r6\n\t"
  83008. "lsr r7, r6, #16\n\t"
  83009. "lsl r6, r6, #16\n\t"
  83010. "adds r3, r3, r6\n\t"
  83011. "adcs r4, r4, r7\n\t"
  83012. "adc r5, r5, #0\n\t"
  83013. "lsr r6, r8, #16\n\t"
  83014. "lsr r7, r9, #16\n\t"
  83015. "mul r7, r6, r7\n\t"
  83016. "adds r4, r4, r7\n\t"
  83017. "adc r5, r5, #0\n\t"
  83018. "lsl r7, r9, #16\n\t"
  83019. "lsr r7, r7, #16\n\t"
  83020. "mul r6, r7, r6\n\t"
  83021. "lsr r7, r6, #16\n\t"
  83022. "lsl r6, r6, #16\n\t"
  83023. "adds r3, r3, r6\n\t"
  83024. "adcs r4, r4, r7\n\t"
  83025. "adc r5, r5, #0\n\t"
  83026. #else
  83027. "umull r6, r7, r8, r9\n\t"
  83028. "adds r3, r3, r6\n\t"
  83029. "adcs r4, r4, r7\n\t"
  83030. "adc r5, r5, #0\n\t"
  83031. #endif
  83032. /* A[11] * B[4] */
  83033. "ldr r8, [%[a], #44]\n\t"
  83034. "ldr r9, [%[b], #16]\n\t"
  83035. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  83036. "lsl r6, r8, #16\n\t"
  83037. "lsl r7, r9, #16\n\t"
  83038. "lsr r6, r6, #16\n\t"
  83039. "lsr r7, r7, #16\n\t"
  83040. "mul r7, r6, r7\n\t"
  83041. "adds r3, r3, r7\n\t"
  83042. "adcs r4, r4, #0\n\t"
  83043. "adc r5, r5, #0\n\t"
  83044. "lsr r7, r9, #16\n\t"
  83045. "mul r6, r7, r6\n\t"
  83046. "lsr r7, r6, #16\n\t"
  83047. "lsl r6, r6, #16\n\t"
  83048. "adds r3, r3, r6\n\t"
  83049. "adcs r4, r4, r7\n\t"
  83050. "adc r5, r5, #0\n\t"
  83051. "lsr r6, r8, #16\n\t"
  83052. "lsr r7, r9, #16\n\t"
  83053. "mul r7, r6, r7\n\t"
  83054. "adds r4, r4, r7\n\t"
  83055. "adc r5, r5, #0\n\t"
  83056. "lsl r7, r9, #16\n\t"
  83057. "lsr r7, r7, #16\n\t"
  83058. "mul r6, r7, r6\n\t"
  83059. "lsr r7, r6, #16\n\t"
  83060. "lsl r6, r6, #16\n\t"
  83061. "adds r3, r3, r6\n\t"
  83062. "adcs r4, r4, r7\n\t"
  83063. "adc r5, r5, #0\n\t"
  83064. #else
  83065. "umull r6, r7, r8, r9\n\t"
  83066. "adds r3, r3, r6\n\t"
  83067. "adcs r4, r4, r7\n\t"
  83068. "adc r5, r5, #0\n\t"
  83069. #endif
  83070. "str r3, [%[r], #60]\n\t"
  83071. /* A[11] * B[5] */
  83072. "ldr r9, [%[b], #20]\n\t"
  83073. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  83074. "lsl r6, r8, #16\n\t"
  83075. "lsl r7, r9, #16\n\t"
  83076. "lsr r6, r6, #16\n\t"
  83077. "lsr r7, r7, #16\n\t"
  83078. "mul r7, r6, r7\n\t"
  83079. "adds r4, r4, r7\n\t"
  83080. "adcs r5, r5, #0\n\t"
  83081. "mov r3, #0\n\t"
  83082. "adc r3, r3, #0\n\t"
  83083. "lsr r7, r9, #16\n\t"
  83084. "mul r6, r7, r6\n\t"
  83085. "lsr r7, r6, #16\n\t"
  83086. "lsl r6, r6, #16\n\t"
  83087. "adds r4, r4, r6\n\t"
  83088. "adcs r5, r5, r7\n\t"
  83089. "adc r3, r3, #0\n\t"
  83090. "lsr r6, r8, #16\n\t"
  83091. "lsr r7, r9, #16\n\t"
  83092. "mul r7, r6, r7\n\t"
  83093. "adds r5, r5, r7\n\t"
  83094. "adc r3, r3, #0\n\t"
  83095. "lsl r7, r9, #16\n\t"
  83096. "lsr r7, r7, #16\n\t"
  83097. "mul r6, r7, r6\n\t"
  83098. "lsr r7, r6, #16\n\t"
  83099. "lsl r6, r6, #16\n\t"
  83100. "adds r4, r4, r6\n\t"
  83101. "adcs r5, r5, r7\n\t"
  83102. "adc r3, r3, #0\n\t"
  83103. #else
  83104. "umull r6, r7, r8, r9\n\t"
  83105. "adds r4, r4, r6\n\t"
  83106. "adcs r5, r5, r7\n\t"
  83107. "mov r3, #0\n\t"
  83108. "adc r3, r3, #0\n\t"
  83109. #endif
  83110. /* A[10] * B[6] */
  83111. "ldr r8, [%[a], #40]\n\t"
  83112. "ldr r9, [%[b], #24]\n\t"
  83113. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  83114. "lsl r6, r8, #16\n\t"
  83115. "lsl r7, r9, #16\n\t"
  83116. "lsr r6, r6, #16\n\t"
  83117. "lsr r7, r7, #16\n\t"
  83118. "mul r7, r6, r7\n\t"
  83119. "adds r4, r4, r7\n\t"
  83120. "adcs r5, r5, #0\n\t"
  83121. "adc r3, r3, #0\n\t"
  83122. "lsr r7, r9, #16\n\t"
  83123. "mul r6, r7, r6\n\t"
  83124. "lsr r7, r6, #16\n\t"
  83125. "lsl r6, r6, #16\n\t"
  83126. "adds r4, r4, r6\n\t"
  83127. "adcs r5, r5, r7\n\t"
  83128. "adc r3, r3, #0\n\t"
  83129. "lsr r6, r8, #16\n\t"
  83130. "lsr r7, r9, #16\n\t"
  83131. "mul r7, r6, r7\n\t"
  83132. "adds r5, r5, r7\n\t"
  83133. "adc r3, r3, #0\n\t"
  83134. "lsl r7, r9, #16\n\t"
  83135. "lsr r7, r7, #16\n\t"
  83136. "mul r6, r7, r6\n\t"
  83137. "lsr r7, r6, #16\n\t"
  83138. "lsl r6, r6, #16\n\t"
  83139. "adds r4, r4, r6\n\t"
  83140. "adcs r5, r5, r7\n\t"
  83141. "adc r3, r3, #0\n\t"
  83142. #else
  83143. "umull r6, r7, r8, r9\n\t"
  83144. "adds r4, r4, r6\n\t"
  83145. "adcs r5, r5, r7\n\t"
  83146. "adc r3, r3, #0\n\t"
  83147. #endif
  83148. /* A[9] * B[7] */
  83149. "ldr r8, [%[a], #36]\n\t"
  83150. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  83151. "lsl r6, r8, #16\n\t"
  83152. "lsl r7, r12, #16\n\t"
  83153. "lsr r6, r6, #16\n\t"
  83154. "lsr r7, r7, #16\n\t"
  83155. "mul r7, r6, r7\n\t"
  83156. "adds r4, r4, r7\n\t"
  83157. "adcs r5, r5, #0\n\t"
  83158. "adc r3, r3, #0\n\t"
  83159. "lsr r7, r12, #16\n\t"
  83160. "mul r6, r7, r6\n\t"
  83161. "lsr r7, r6, #16\n\t"
  83162. "lsl r6, r6, #16\n\t"
  83163. "adds r4, r4, r6\n\t"
  83164. "adcs r5, r5, r7\n\t"
  83165. "adc r3, r3, #0\n\t"
  83166. "lsr r6, r8, #16\n\t"
  83167. "lsr r7, r12, #16\n\t"
  83168. "mul r7, r6, r7\n\t"
  83169. "adds r5, r5, r7\n\t"
  83170. "adc r3, r3, #0\n\t"
  83171. "lsl r7, r12, #16\n\t"
  83172. "lsr r7, r7, #16\n\t"
  83173. "mul r6, r7, r6\n\t"
  83174. "lsr r7, r6, #16\n\t"
  83175. "lsl r6, r6, #16\n\t"
  83176. "adds r4, r4, r6\n\t"
  83177. "adcs r5, r5, r7\n\t"
  83178. "adc r3, r3, #0\n\t"
  83179. #else
  83180. "umull r6, r7, r8, r12\n\t"
  83181. "adds r4, r4, r6\n\t"
  83182. "adcs r5, r5, r7\n\t"
  83183. "adc r3, r3, #0\n\t"
  83184. #endif
  83185. /* A[8] * B[8] */
  83186. "ldr r11, [%[a], #32]\n\t"
  83187. "ldr r12, [%[b], #32]\n\t"
  83188. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  83189. "lsl r6, r11, #16\n\t"
  83190. "lsl r7, r12, #16\n\t"
  83191. "lsr r6, r6, #16\n\t"
  83192. "lsr r7, r7, #16\n\t"
  83193. "mul r7, r6, r7\n\t"
  83194. "adds r4, r4, r7\n\t"
  83195. "adcs r5, r5, #0\n\t"
  83196. "adc r3, r3, #0\n\t"
  83197. "lsr r7, r12, #16\n\t"
  83198. "mul r6, r7, r6\n\t"
  83199. "lsr r7, r6, #16\n\t"
  83200. "lsl r6, r6, #16\n\t"
  83201. "adds r4, r4, r6\n\t"
  83202. "adcs r5, r5, r7\n\t"
  83203. "adc r3, r3, #0\n\t"
  83204. "lsr r6, r11, #16\n\t"
  83205. "lsr r7, r12, #16\n\t"
  83206. "mul r7, r6, r7\n\t"
  83207. "adds r5, r5, r7\n\t"
  83208. "adc r3, r3, #0\n\t"
  83209. "lsl r7, r12, #16\n\t"
  83210. "lsr r7, r7, #16\n\t"
  83211. "mul r6, r7, r6\n\t"
  83212. "lsr r7, r6, #16\n\t"
  83213. "lsl r6, r6, #16\n\t"
  83214. "adds r4, r4, r6\n\t"
  83215. "adcs r5, r5, r7\n\t"
  83216. "adc r3, r3, #0\n\t"
  83217. #else
  83218. "umull r6, r7, r11, r12\n\t"
  83219. "adds r4, r4, r6\n\t"
  83220. "adcs r5, r5, r7\n\t"
  83221. "adc r3, r3, #0\n\t"
  83222. #endif
  83223. /* A[7] * B[9] */
  83224. "ldr r8, [%[a], #28]\n\t"
  83225. "ldr r9, [%[b], #36]\n\t"
  83226. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  83227. "lsl r6, r8, #16\n\t"
  83228. "lsl r7, r9, #16\n\t"
  83229. "lsr r6, r6, #16\n\t"
  83230. "lsr r7, r7, #16\n\t"
  83231. "mul r7, r6, r7\n\t"
  83232. "adds r4, r4, r7\n\t"
  83233. "adcs r5, r5, #0\n\t"
  83234. "adc r3, r3, #0\n\t"
  83235. "lsr r7, r9, #16\n\t"
  83236. "mul r6, r7, r6\n\t"
  83237. "lsr r7, r6, #16\n\t"
  83238. "lsl r6, r6, #16\n\t"
  83239. "adds r4, r4, r6\n\t"
  83240. "adcs r5, r5, r7\n\t"
  83241. "adc r3, r3, #0\n\t"
  83242. "lsr r6, r8, #16\n\t"
  83243. "lsr r7, r9, #16\n\t"
  83244. "mul r7, r6, r7\n\t"
  83245. "adds r5, r5, r7\n\t"
  83246. "adc r3, r3, #0\n\t"
  83247. "lsl r7, r9, #16\n\t"
  83248. "lsr r7, r7, #16\n\t"
  83249. "mul r6, r7, r6\n\t"
  83250. "lsr r7, r6, #16\n\t"
  83251. "lsl r6, r6, #16\n\t"
  83252. "adds r4, r4, r6\n\t"
  83253. "adcs r5, r5, r7\n\t"
  83254. "adc r3, r3, #0\n\t"
  83255. #else
  83256. "umull r6, r7, r8, r9\n\t"
  83257. "adds r4, r4, r6\n\t"
  83258. "adcs r5, r5, r7\n\t"
  83259. "adc r3, r3, #0\n\t"
  83260. #endif
  83261. /* A[6] * B[10] */
  83262. "ldr r8, [%[a], #24]\n\t"
  83263. "ldr r9, [%[b], #40]\n\t"
  83264. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  83265. "lsl r6, r8, #16\n\t"
  83266. "lsl r7, r9, #16\n\t"
  83267. "lsr r6, r6, #16\n\t"
  83268. "lsr r7, r7, #16\n\t"
  83269. "mul r7, r6, r7\n\t"
  83270. "adds r4, r4, r7\n\t"
  83271. "adcs r5, r5, #0\n\t"
  83272. "adc r3, r3, #0\n\t"
  83273. "lsr r7, r9, #16\n\t"
  83274. "mul r6, r7, r6\n\t"
  83275. "lsr r7, r6, #16\n\t"
  83276. "lsl r6, r6, #16\n\t"
  83277. "adds r4, r4, r6\n\t"
  83278. "adcs r5, r5, r7\n\t"
  83279. "adc r3, r3, #0\n\t"
  83280. "lsr r6, r8, #16\n\t"
  83281. "lsr r7, r9, #16\n\t"
  83282. "mul r7, r6, r7\n\t"
  83283. "adds r5, r5, r7\n\t"
  83284. "adc r3, r3, #0\n\t"
  83285. "lsl r7, r9, #16\n\t"
  83286. "lsr r7, r7, #16\n\t"
  83287. "mul r6, r7, r6\n\t"
  83288. "lsr r7, r6, #16\n\t"
  83289. "lsl r6, r6, #16\n\t"
  83290. "adds r4, r4, r6\n\t"
  83291. "adcs r5, r5, r7\n\t"
  83292. "adc r3, r3, #0\n\t"
  83293. #else
  83294. "umull r6, r7, r8, r9\n\t"
  83295. "adds r4, r4, r6\n\t"
  83296. "adcs r5, r5, r7\n\t"
  83297. "adc r3, r3, #0\n\t"
  83298. #endif
  83299. /* A[5] * B[11] */
  83300. "ldr r8, [%[a], #20]\n\t"
  83301. "ldr r9, [%[b], #44]\n\t"
  83302. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  83303. "lsl r6, r8, #16\n\t"
  83304. "lsl r7, r9, #16\n\t"
  83305. "lsr r6, r6, #16\n\t"
  83306. "lsr r7, r7, #16\n\t"
  83307. "mul r7, r6, r7\n\t"
  83308. "adds r4, r4, r7\n\t"
  83309. "adcs r5, r5, #0\n\t"
  83310. "adc r3, r3, #0\n\t"
  83311. "lsr r7, r9, #16\n\t"
  83312. "mul r6, r7, r6\n\t"
  83313. "lsr r7, r6, #16\n\t"
  83314. "lsl r6, r6, #16\n\t"
  83315. "adds r4, r4, r6\n\t"
  83316. "adcs r5, r5, r7\n\t"
  83317. "adc r3, r3, #0\n\t"
  83318. "lsr r6, r8, #16\n\t"
  83319. "lsr r7, r9, #16\n\t"
  83320. "mul r7, r6, r7\n\t"
  83321. "adds r5, r5, r7\n\t"
  83322. "adc r3, r3, #0\n\t"
  83323. "lsl r7, r9, #16\n\t"
  83324. "lsr r7, r7, #16\n\t"
  83325. "mul r6, r7, r6\n\t"
  83326. "lsr r7, r6, #16\n\t"
  83327. "lsl r6, r6, #16\n\t"
  83328. "adds r4, r4, r6\n\t"
  83329. "adcs r5, r5, r7\n\t"
  83330. "adc r3, r3, #0\n\t"
  83331. #else
  83332. "umull r6, r7, r8, r9\n\t"
  83333. "adds r4, r4, r6\n\t"
  83334. "adcs r5, r5, r7\n\t"
  83335. "adc r3, r3, #0\n\t"
  83336. #endif
  83337. "str r4, [%[r], #64]\n\t"
  83338. /* A[6] * B[11] */
  83339. "ldr r8, [%[a], #24]\n\t"
  83340. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  83341. "lsl r6, r8, #16\n\t"
  83342. "lsl r7, r9, #16\n\t"
  83343. "lsr r6, r6, #16\n\t"
  83344. "lsr r7, r7, #16\n\t"
  83345. "mul r7, r6, r7\n\t"
  83346. "adds r5, r5, r7\n\t"
  83347. "adcs r3, r3, #0\n\t"
  83348. "mov r4, #0\n\t"
  83349. "adc r4, r4, #0\n\t"
  83350. "lsr r7, r9, #16\n\t"
  83351. "mul r6, r7, r6\n\t"
  83352. "lsr r7, r6, #16\n\t"
  83353. "lsl r6, r6, #16\n\t"
  83354. "adds r5, r5, r6\n\t"
  83355. "adcs r3, r3, r7\n\t"
  83356. "adc r4, r4, #0\n\t"
  83357. "lsr r6, r8, #16\n\t"
  83358. "lsr r7, r9, #16\n\t"
  83359. "mul r7, r6, r7\n\t"
  83360. "adds r3, r3, r7\n\t"
  83361. "adc r4, r4, #0\n\t"
  83362. "lsl r7, r9, #16\n\t"
  83363. "lsr r7, r7, #16\n\t"
  83364. "mul r6, r7, r6\n\t"
  83365. "lsr r7, r6, #16\n\t"
  83366. "lsl r6, r6, #16\n\t"
  83367. "adds r5, r5, r6\n\t"
  83368. "adcs r3, r3, r7\n\t"
  83369. "adc r4, r4, #0\n\t"
  83370. #else
  83371. "umull r6, r7, r8, r9\n\t"
  83372. "adds r5, r5, r6\n\t"
  83373. "adcs r3, r3, r7\n\t"
  83374. "mov r4, #0\n\t"
  83375. "adc r4, r4, #0\n\t"
  83376. #endif
  83377. /* A[7] * B[10] */
  83378. "ldr r8, [%[a], #28]\n\t"
  83379. "ldr r9, [%[b], #40]\n\t"
  83380. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  83381. "lsl r6, r8, #16\n\t"
  83382. "lsl r7, r9, #16\n\t"
  83383. "lsr r6, r6, #16\n\t"
  83384. "lsr r7, r7, #16\n\t"
  83385. "mul r7, r6, r7\n\t"
  83386. "adds r5, r5, r7\n\t"
  83387. "adcs r3, r3, #0\n\t"
  83388. "adc r4, r4, #0\n\t"
  83389. "lsr r7, r9, #16\n\t"
  83390. "mul r6, r7, r6\n\t"
  83391. "lsr r7, r6, #16\n\t"
  83392. "lsl r6, r6, #16\n\t"
  83393. "adds r5, r5, r6\n\t"
  83394. "adcs r3, r3, r7\n\t"
  83395. "adc r4, r4, #0\n\t"
  83396. "lsr r6, r8, #16\n\t"
  83397. "lsr r7, r9, #16\n\t"
  83398. "mul r7, r6, r7\n\t"
  83399. "adds r3, r3, r7\n\t"
  83400. "adc r4, r4, #0\n\t"
  83401. "lsl r7, r9, #16\n\t"
  83402. "lsr r7, r7, #16\n\t"
  83403. "mul r6, r7, r6\n\t"
  83404. "lsr r7, r6, #16\n\t"
  83405. "lsl r6, r6, #16\n\t"
  83406. "adds r5, r5, r6\n\t"
  83407. "adcs r3, r3, r7\n\t"
  83408. "adc r4, r4, #0\n\t"
  83409. #else
  83410. "umull r6, r7, r8, r9\n\t"
  83411. "adds r5, r5, r6\n\t"
  83412. "adcs r3, r3, r7\n\t"
  83413. "adc r4, r4, #0\n\t"
  83414. #endif
  83415. /* A[8] * B[9] */
  83416. "ldr r9, [%[b], #36]\n\t"
  83417. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  83418. "lsl r6, r11, #16\n\t"
  83419. "lsl r7, r9, #16\n\t"
  83420. "lsr r6, r6, #16\n\t"
  83421. "lsr r7, r7, #16\n\t"
  83422. "mul r7, r6, r7\n\t"
  83423. "adds r5, r5, r7\n\t"
  83424. "adcs r3, r3, #0\n\t"
  83425. "adc r4, r4, #0\n\t"
  83426. "lsr r7, r9, #16\n\t"
  83427. "mul r6, r7, r6\n\t"
  83428. "lsr r7, r6, #16\n\t"
  83429. "lsl r6, r6, #16\n\t"
  83430. "adds r5, r5, r6\n\t"
  83431. "adcs r3, r3, r7\n\t"
  83432. "adc r4, r4, #0\n\t"
  83433. "lsr r6, r11, #16\n\t"
  83434. "lsr r7, r9, #16\n\t"
  83435. "mul r7, r6, r7\n\t"
  83436. "adds r3, r3, r7\n\t"
  83437. "adc r4, r4, #0\n\t"
  83438. "lsl r7, r9, #16\n\t"
  83439. "lsr r7, r7, #16\n\t"
  83440. "mul r6, r7, r6\n\t"
  83441. "lsr r7, r6, #16\n\t"
  83442. "lsl r6, r6, #16\n\t"
  83443. "adds r5, r5, r6\n\t"
  83444. "adcs r3, r3, r7\n\t"
  83445. "adc r4, r4, #0\n\t"
  83446. #else
  83447. "umull r6, r7, r11, r9\n\t"
  83448. "adds r5, r5, r6\n\t"
  83449. "adcs r3, r3, r7\n\t"
  83450. "adc r4, r4, #0\n\t"
  83451. #endif
  83452. /* A[9] * B[8] */
  83453. "ldr r8, [%[a], #36]\n\t"
  83454. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  83455. "lsl r6, r8, #16\n\t"
  83456. "lsl r7, r12, #16\n\t"
  83457. "lsr r6, r6, #16\n\t"
  83458. "lsr r7, r7, #16\n\t"
  83459. "mul r7, r6, r7\n\t"
  83460. "adds r5, r5, r7\n\t"
  83461. "adcs r3, r3, #0\n\t"
  83462. "adc r4, r4, #0\n\t"
  83463. "lsr r7, r12, #16\n\t"
  83464. "mul r6, r7, r6\n\t"
  83465. "lsr r7, r6, #16\n\t"
  83466. "lsl r6, r6, #16\n\t"
  83467. "adds r5, r5, r6\n\t"
  83468. "adcs r3, r3, r7\n\t"
  83469. "adc r4, r4, #0\n\t"
  83470. "lsr r6, r8, #16\n\t"
  83471. "lsr r7, r12, #16\n\t"
  83472. "mul r7, r6, r7\n\t"
  83473. "adds r3, r3, r7\n\t"
  83474. "adc r4, r4, #0\n\t"
  83475. "lsl r7, r12, #16\n\t"
  83476. "lsr r7, r7, #16\n\t"
  83477. "mul r6, r7, r6\n\t"
  83478. "lsr r7, r6, #16\n\t"
  83479. "lsl r6, r6, #16\n\t"
  83480. "adds r5, r5, r6\n\t"
  83481. "adcs r3, r3, r7\n\t"
  83482. "adc r4, r4, #0\n\t"
  83483. #else
  83484. "umull r6, r7, r8, r12\n\t"
  83485. "adds r5, r5, r6\n\t"
  83486. "adcs r3, r3, r7\n\t"
  83487. "adc r4, r4, #0\n\t"
  83488. #endif
  83489. /* A[10] * B[7] */
  83490. "ldr r8, [%[a], #40]\n\t"
  83491. "ldr r9, [%[b], #28]\n\t"
  83492. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  83493. "lsl r6, r8, #16\n\t"
  83494. "lsl r7, r9, #16\n\t"
  83495. "lsr r6, r6, #16\n\t"
  83496. "lsr r7, r7, #16\n\t"
  83497. "mul r7, r6, r7\n\t"
  83498. "adds r5, r5, r7\n\t"
  83499. "adcs r3, r3, #0\n\t"
  83500. "adc r4, r4, #0\n\t"
  83501. "lsr r7, r9, #16\n\t"
  83502. "mul r6, r7, r6\n\t"
  83503. "lsr r7, r6, #16\n\t"
  83504. "lsl r6, r6, #16\n\t"
  83505. "adds r5, r5, r6\n\t"
  83506. "adcs r3, r3, r7\n\t"
  83507. "adc r4, r4, #0\n\t"
  83508. "lsr r6, r8, #16\n\t"
  83509. "lsr r7, r9, #16\n\t"
  83510. "mul r7, r6, r7\n\t"
  83511. "adds r3, r3, r7\n\t"
  83512. "adc r4, r4, #0\n\t"
  83513. "lsl r7, r9, #16\n\t"
  83514. "lsr r7, r7, #16\n\t"
  83515. "mul r6, r7, r6\n\t"
  83516. "lsr r7, r6, #16\n\t"
  83517. "lsl r6, r6, #16\n\t"
  83518. "adds r5, r5, r6\n\t"
  83519. "adcs r3, r3, r7\n\t"
  83520. "adc r4, r4, #0\n\t"
  83521. #else
  83522. "umull r6, r7, r8, r9\n\t"
  83523. "adds r5, r5, r6\n\t"
  83524. "adcs r3, r3, r7\n\t"
  83525. "adc r4, r4, #0\n\t"
  83526. #endif
  83527. /* A[11] * B[6] */
  83528. "ldr r8, [%[a], #44]\n\t"
  83529. "ldr r9, [%[b], #24]\n\t"
  83530. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  83531. "lsl r6, r8, #16\n\t"
  83532. "lsl r7, r9, #16\n\t"
  83533. "lsr r6, r6, #16\n\t"
  83534. "lsr r7, r7, #16\n\t"
  83535. "mul r7, r6, r7\n\t"
  83536. "adds r5, r5, r7\n\t"
  83537. "adcs r3, r3, #0\n\t"
  83538. "adc r4, r4, #0\n\t"
  83539. "lsr r7, r9, #16\n\t"
  83540. "mul r6, r7, r6\n\t"
  83541. "lsr r7, r6, #16\n\t"
  83542. "lsl r6, r6, #16\n\t"
  83543. "adds r5, r5, r6\n\t"
  83544. "adcs r3, r3, r7\n\t"
  83545. "adc r4, r4, #0\n\t"
  83546. "lsr r6, r8, #16\n\t"
  83547. "lsr r7, r9, #16\n\t"
  83548. "mul r7, r6, r7\n\t"
  83549. "adds r3, r3, r7\n\t"
  83550. "adc r4, r4, #0\n\t"
  83551. "lsl r7, r9, #16\n\t"
  83552. "lsr r7, r7, #16\n\t"
  83553. "mul r6, r7, r6\n\t"
  83554. "lsr r7, r6, #16\n\t"
  83555. "lsl r6, r6, #16\n\t"
  83556. "adds r5, r5, r6\n\t"
  83557. "adcs r3, r3, r7\n\t"
  83558. "adc r4, r4, #0\n\t"
  83559. #else
  83560. "umull r6, r7, r8, r9\n\t"
  83561. "adds r5, r5, r6\n\t"
  83562. "adcs r3, r3, r7\n\t"
  83563. "adc r4, r4, #0\n\t"
  83564. #endif
  83565. "str r5, [%[r], #68]\n\t"
  83566. /* A[11] * B[7] */
  83567. "ldr r9, [%[b], #28]\n\t"
  83568. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  83569. "lsl r6, r8, #16\n\t"
  83570. "lsl r7, r9, #16\n\t"
  83571. "lsr r6, r6, #16\n\t"
  83572. "lsr r7, r7, #16\n\t"
  83573. "mul r7, r6, r7\n\t"
  83574. "adds r3, r3, r7\n\t"
  83575. "adcs r4, r4, #0\n\t"
  83576. "mov r5, #0\n\t"
  83577. "adc r5, r5, #0\n\t"
  83578. "lsr r7, r9, #16\n\t"
  83579. "mul r6, r7, r6\n\t"
  83580. "lsr r7, r6, #16\n\t"
  83581. "lsl r6, r6, #16\n\t"
  83582. "adds r3, r3, r6\n\t"
  83583. "adcs r4, r4, r7\n\t"
  83584. "adc r5, r5, #0\n\t"
  83585. "lsr r6, r8, #16\n\t"
  83586. "lsr r7, r9, #16\n\t"
  83587. "mul r7, r6, r7\n\t"
  83588. "adds r4, r4, r7\n\t"
  83589. "adc r5, r5, #0\n\t"
  83590. "lsl r7, r9, #16\n\t"
  83591. "lsr r7, r7, #16\n\t"
  83592. "mul r6, r7, r6\n\t"
  83593. "lsr r7, r6, #16\n\t"
  83594. "lsl r6, r6, #16\n\t"
  83595. "adds r3, r3, r6\n\t"
  83596. "adcs r4, r4, r7\n\t"
  83597. "adc r5, r5, #0\n\t"
  83598. #else
  83599. "umull r6, r7, r8, r9\n\t"
  83600. "adds r3, r3, r6\n\t"
  83601. "adcs r4, r4, r7\n\t"
  83602. "mov r5, #0\n\t"
  83603. "adc r5, r5, #0\n\t"
  83604. #endif
  83605. /* A[10] * B[8] */
  83606. "ldr r8, [%[a], #40]\n\t"
  83607. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  83608. "lsl r6, r8, #16\n\t"
  83609. "lsl r7, r12, #16\n\t"
  83610. "lsr r6, r6, #16\n\t"
  83611. "lsr r7, r7, #16\n\t"
  83612. "mul r7, r6, r7\n\t"
  83613. "adds r3, r3, r7\n\t"
  83614. "adcs r4, r4, #0\n\t"
  83615. "adc r5, r5, #0\n\t"
  83616. "lsr r7, r12, #16\n\t"
  83617. "mul r6, r7, r6\n\t"
  83618. "lsr r7, r6, #16\n\t"
  83619. "lsl r6, r6, #16\n\t"
  83620. "adds r3, r3, r6\n\t"
  83621. "adcs r4, r4, r7\n\t"
  83622. "adc r5, r5, #0\n\t"
  83623. "lsr r6, r8, #16\n\t"
  83624. "lsr r7, r12, #16\n\t"
  83625. "mul r7, r6, r7\n\t"
  83626. "adds r4, r4, r7\n\t"
  83627. "adc r5, r5, #0\n\t"
  83628. "lsl r7, r12, #16\n\t"
  83629. "lsr r7, r7, #16\n\t"
  83630. "mul r6, r7, r6\n\t"
  83631. "lsr r7, r6, #16\n\t"
  83632. "lsl r6, r6, #16\n\t"
  83633. "adds r3, r3, r6\n\t"
  83634. "adcs r4, r4, r7\n\t"
  83635. "adc r5, r5, #0\n\t"
  83636. #else
  83637. "umull r6, r7, r8, r12\n\t"
  83638. "adds r3, r3, r6\n\t"
  83639. "adcs r4, r4, r7\n\t"
  83640. "adc r5, r5, #0\n\t"
  83641. #endif
  83642. /* A[9] * B[9] */
  83643. "ldr r11, [%[a], #36]\n\t"
  83644. "ldr r12, [%[b], #36]\n\t"
  83645. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  83646. "lsl r6, r11, #16\n\t"
  83647. "lsl r7, r12, #16\n\t"
  83648. "lsr r6, r6, #16\n\t"
  83649. "lsr r7, r7, #16\n\t"
  83650. "mul r7, r6, r7\n\t"
  83651. "adds r3, r3, r7\n\t"
  83652. "adcs r4, r4, #0\n\t"
  83653. "adc r5, r5, #0\n\t"
  83654. "lsr r7, r12, #16\n\t"
  83655. "mul r6, r7, r6\n\t"
  83656. "lsr r7, r6, #16\n\t"
  83657. "lsl r6, r6, #16\n\t"
  83658. "adds r3, r3, r6\n\t"
  83659. "adcs r4, r4, r7\n\t"
  83660. "adc r5, r5, #0\n\t"
  83661. "lsr r6, r11, #16\n\t"
  83662. "lsr r7, r12, #16\n\t"
  83663. "mul r7, r6, r7\n\t"
  83664. "adds r4, r4, r7\n\t"
  83665. "adc r5, r5, #0\n\t"
  83666. "lsl r7, r12, #16\n\t"
  83667. "lsr r7, r7, #16\n\t"
  83668. "mul r6, r7, r6\n\t"
  83669. "lsr r7, r6, #16\n\t"
  83670. "lsl r6, r6, #16\n\t"
  83671. "adds r3, r3, r6\n\t"
  83672. "adcs r4, r4, r7\n\t"
  83673. "adc r5, r5, #0\n\t"
  83674. #else
  83675. "umull r6, r7, r11, r12\n\t"
  83676. "adds r3, r3, r6\n\t"
  83677. "adcs r4, r4, r7\n\t"
  83678. "adc r5, r5, #0\n\t"
  83679. #endif
  83680. /* A[8] * B[10] */
  83681. "ldr r8, [%[a], #32]\n\t"
  83682. "ldr r9, [%[b], #40]\n\t"
  83683. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  83684. "lsl r6, r8, #16\n\t"
  83685. "lsl r7, r9, #16\n\t"
  83686. "lsr r6, r6, #16\n\t"
  83687. "lsr r7, r7, #16\n\t"
  83688. "mul r7, r6, r7\n\t"
  83689. "adds r3, r3, r7\n\t"
  83690. "adcs r4, r4, #0\n\t"
  83691. "adc r5, r5, #0\n\t"
  83692. "lsr r7, r9, #16\n\t"
  83693. "mul r6, r7, r6\n\t"
  83694. "lsr r7, r6, #16\n\t"
  83695. "lsl r6, r6, #16\n\t"
  83696. "adds r3, r3, r6\n\t"
  83697. "adcs r4, r4, r7\n\t"
  83698. "adc r5, r5, #0\n\t"
  83699. "lsr r6, r8, #16\n\t"
  83700. "lsr r7, r9, #16\n\t"
  83701. "mul r7, r6, r7\n\t"
  83702. "adds r4, r4, r7\n\t"
  83703. "adc r5, r5, #0\n\t"
  83704. "lsl r7, r9, #16\n\t"
  83705. "lsr r7, r7, #16\n\t"
  83706. "mul r6, r7, r6\n\t"
  83707. "lsr r7, r6, #16\n\t"
  83708. "lsl r6, r6, #16\n\t"
  83709. "adds r3, r3, r6\n\t"
  83710. "adcs r4, r4, r7\n\t"
  83711. "adc r5, r5, #0\n\t"
  83712. #else
  83713. "umull r6, r7, r8, r9\n\t"
  83714. "adds r3, r3, r6\n\t"
  83715. "adcs r4, r4, r7\n\t"
  83716. "adc r5, r5, #0\n\t"
  83717. #endif
  83718. /* A[7] * B[11] */
  83719. "ldr r8, [%[a], #28]\n\t"
  83720. "ldr r9, [%[b], #44]\n\t"
  83721. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  83722. "lsl r6, r8, #16\n\t"
  83723. "lsl r7, r9, #16\n\t"
  83724. "lsr r6, r6, #16\n\t"
  83725. "lsr r7, r7, #16\n\t"
  83726. "mul r7, r6, r7\n\t"
  83727. "adds r3, r3, r7\n\t"
  83728. "adcs r4, r4, #0\n\t"
  83729. "adc r5, r5, #0\n\t"
  83730. "lsr r7, r9, #16\n\t"
  83731. "mul r6, r7, r6\n\t"
  83732. "lsr r7, r6, #16\n\t"
  83733. "lsl r6, r6, #16\n\t"
  83734. "adds r3, r3, r6\n\t"
  83735. "adcs r4, r4, r7\n\t"
  83736. "adc r5, r5, #0\n\t"
  83737. "lsr r6, r8, #16\n\t"
  83738. "lsr r7, r9, #16\n\t"
  83739. "mul r7, r6, r7\n\t"
  83740. "adds r4, r4, r7\n\t"
  83741. "adc r5, r5, #0\n\t"
  83742. "lsl r7, r9, #16\n\t"
  83743. "lsr r7, r7, #16\n\t"
  83744. "mul r6, r7, r6\n\t"
  83745. "lsr r7, r6, #16\n\t"
  83746. "lsl r6, r6, #16\n\t"
  83747. "adds r3, r3, r6\n\t"
  83748. "adcs r4, r4, r7\n\t"
  83749. "adc r5, r5, #0\n\t"
  83750. #else
  83751. "umull r6, r7, r8, r9\n\t"
  83752. "adds r3, r3, r6\n\t"
  83753. "adcs r4, r4, r7\n\t"
  83754. "adc r5, r5, #0\n\t"
  83755. #endif
  83756. "str r3, [%[r], #72]\n\t"
  83757. /* A[8] * B[11] */
  83758. "ldr r8, [%[a], #32]\n\t"
  83759. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  83760. "lsl r6, r8, #16\n\t"
  83761. "lsl r7, r9, #16\n\t"
  83762. "lsr r6, r6, #16\n\t"
  83763. "lsr r7, r7, #16\n\t"
  83764. "mul r7, r6, r7\n\t"
  83765. "adds r4, r4, r7\n\t"
  83766. "adcs r5, r5, #0\n\t"
  83767. "mov r3, #0\n\t"
  83768. "adc r3, r3, #0\n\t"
  83769. "lsr r7, r9, #16\n\t"
  83770. "mul r6, r7, r6\n\t"
  83771. "lsr r7, r6, #16\n\t"
  83772. "lsl r6, r6, #16\n\t"
  83773. "adds r4, r4, r6\n\t"
  83774. "adcs r5, r5, r7\n\t"
  83775. "adc r3, r3, #0\n\t"
  83776. "lsr r6, r8, #16\n\t"
  83777. "lsr r7, r9, #16\n\t"
  83778. "mul r7, r6, r7\n\t"
  83779. "adds r5, r5, r7\n\t"
  83780. "adc r3, r3, #0\n\t"
  83781. "lsl r7, r9, #16\n\t"
  83782. "lsr r7, r7, #16\n\t"
  83783. "mul r6, r7, r6\n\t"
  83784. "lsr r7, r6, #16\n\t"
  83785. "lsl r6, r6, #16\n\t"
  83786. "adds r4, r4, r6\n\t"
  83787. "adcs r5, r5, r7\n\t"
  83788. "adc r3, r3, #0\n\t"
  83789. #else
  83790. "umull r6, r7, r8, r9\n\t"
  83791. "adds r4, r4, r6\n\t"
  83792. "adcs r5, r5, r7\n\t"
  83793. "mov r3, #0\n\t"
  83794. "adc r3, r3, #0\n\t"
  83795. #endif
  83796. /* A[9] * B[10] */
  83797. "ldr r9, [%[b], #40]\n\t"
  83798. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  83799. "lsl r6, r11, #16\n\t"
  83800. "lsl r7, r9, #16\n\t"
  83801. "lsr r6, r6, #16\n\t"
  83802. "lsr r7, r7, #16\n\t"
  83803. "mul r7, r6, r7\n\t"
  83804. "adds r4, r4, r7\n\t"
  83805. "adcs r5, r5, #0\n\t"
  83806. "adc r3, r3, #0\n\t"
  83807. "lsr r7, r9, #16\n\t"
  83808. "mul r6, r7, r6\n\t"
  83809. "lsr r7, r6, #16\n\t"
  83810. "lsl r6, r6, #16\n\t"
  83811. "adds r4, r4, r6\n\t"
  83812. "adcs r5, r5, r7\n\t"
  83813. "adc r3, r3, #0\n\t"
  83814. "lsr r6, r11, #16\n\t"
  83815. "lsr r7, r9, #16\n\t"
  83816. "mul r7, r6, r7\n\t"
  83817. "adds r5, r5, r7\n\t"
  83818. "adc r3, r3, #0\n\t"
  83819. "lsl r7, r9, #16\n\t"
  83820. "lsr r7, r7, #16\n\t"
  83821. "mul r6, r7, r6\n\t"
  83822. "lsr r7, r6, #16\n\t"
  83823. "lsl r6, r6, #16\n\t"
  83824. "adds r4, r4, r6\n\t"
  83825. "adcs r5, r5, r7\n\t"
  83826. "adc r3, r3, #0\n\t"
  83827. #else
  83828. "umull r6, r7, r11, r9\n\t"
  83829. "adds r4, r4, r6\n\t"
  83830. "adcs r5, r5, r7\n\t"
  83831. "adc r3, r3, #0\n\t"
  83832. #endif
  83833. /* A[10] * B[9] */
  83834. "ldr r8, [%[a], #40]\n\t"
  83835. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  83836. "lsl r6, r8, #16\n\t"
  83837. "lsl r7, r12, #16\n\t"
  83838. "lsr r6, r6, #16\n\t"
  83839. "lsr r7, r7, #16\n\t"
  83840. "mul r7, r6, r7\n\t"
  83841. "adds r4, r4, r7\n\t"
  83842. "adcs r5, r5, #0\n\t"
  83843. "adc r3, r3, #0\n\t"
  83844. "lsr r7, r12, #16\n\t"
  83845. "mul r6, r7, r6\n\t"
  83846. "lsr r7, r6, #16\n\t"
  83847. "lsl r6, r6, #16\n\t"
  83848. "adds r4, r4, r6\n\t"
  83849. "adcs r5, r5, r7\n\t"
  83850. "adc r3, r3, #0\n\t"
  83851. "lsr r6, r8, #16\n\t"
  83852. "lsr r7, r12, #16\n\t"
  83853. "mul r7, r6, r7\n\t"
  83854. "adds r5, r5, r7\n\t"
  83855. "adc r3, r3, #0\n\t"
  83856. "lsl r7, r12, #16\n\t"
  83857. "lsr r7, r7, #16\n\t"
  83858. "mul r6, r7, r6\n\t"
  83859. "lsr r7, r6, #16\n\t"
  83860. "lsl r6, r6, #16\n\t"
  83861. "adds r4, r4, r6\n\t"
  83862. "adcs r5, r5, r7\n\t"
  83863. "adc r3, r3, #0\n\t"
  83864. #else
  83865. "umull r6, r7, r8, r12\n\t"
  83866. "adds r4, r4, r6\n\t"
  83867. "adcs r5, r5, r7\n\t"
  83868. "adc r3, r3, #0\n\t"
  83869. #endif
  83870. /* A[11] * B[8] */
  83871. "ldr r8, [%[a], #44]\n\t"
  83872. "ldr r9, [%[b], #32]\n\t"
  83873. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  83874. "lsl r6, r8, #16\n\t"
  83875. "lsl r7, r9, #16\n\t"
  83876. "lsr r6, r6, #16\n\t"
  83877. "lsr r7, r7, #16\n\t"
  83878. "mul r7, r6, r7\n\t"
  83879. "adds r4, r4, r7\n\t"
  83880. "adcs r5, r5, #0\n\t"
  83881. "adc r3, r3, #0\n\t"
  83882. "lsr r7, r9, #16\n\t"
  83883. "mul r6, r7, r6\n\t"
  83884. "lsr r7, r6, #16\n\t"
  83885. "lsl r6, r6, #16\n\t"
  83886. "adds r4, r4, r6\n\t"
  83887. "adcs r5, r5, r7\n\t"
  83888. "adc r3, r3, #0\n\t"
  83889. "lsr r6, r8, #16\n\t"
  83890. "lsr r7, r9, #16\n\t"
  83891. "mul r7, r6, r7\n\t"
  83892. "adds r5, r5, r7\n\t"
  83893. "adc r3, r3, #0\n\t"
  83894. "lsl r7, r9, #16\n\t"
  83895. "lsr r7, r7, #16\n\t"
  83896. "mul r6, r7, r6\n\t"
  83897. "lsr r7, r6, #16\n\t"
  83898. "lsl r6, r6, #16\n\t"
  83899. "adds r4, r4, r6\n\t"
  83900. "adcs r5, r5, r7\n\t"
  83901. "adc r3, r3, #0\n\t"
  83902. #else
  83903. "umull r6, r7, r8, r9\n\t"
  83904. "adds r4, r4, r6\n\t"
  83905. "adcs r5, r5, r7\n\t"
  83906. "adc r3, r3, #0\n\t"
  83907. #endif
  83908. "str r4, [%[r], #76]\n\t"
  83909. /* A[11] * B[9] */
  83910. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  83911. "lsl r6, r8, #16\n\t"
  83912. "lsl r7, r12, #16\n\t"
  83913. "lsr r6, r6, #16\n\t"
  83914. "lsr r7, r7, #16\n\t"
  83915. "mul r7, r6, r7\n\t"
  83916. "adds r5, r5, r7\n\t"
  83917. "adcs r3, r3, #0\n\t"
  83918. "mov r4, #0\n\t"
  83919. "adc r4, r4, #0\n\t"
  83920. "lsr r7, r12, #16\n\t"
  83921. "mul r6, r7, r6\n\t"
  83922. "lsr r7, r6, #16\n\t"
  83923. "lsl r6, r6, #16\n\t"
  83924. "adds r5, r5, r6\n\t"
  83925. "adcs r3, r3, r7\n\t"
  83926. "adc r4, r4, #0\n\t"
  83927. "lsr r6, r8, #16\n\t"
  83928. "lsr r7, r12, #16\n\t"
  83929. "mul r7, r6, r7\n\t"
  83930. "adds r3, r3, r7\n\t"
  83931. "adc r4, r4, #0\n\t"
  83932. "lsl r7, r12, #16\n\t"
  83933. "lsr r7, r7, #16\n\t"
  83934. "mul r6, r7, r6\n\t"
  83935. "lsr r7, r6, #16\n\t"
  83936. "lsl r6, r6, #16\n\t"
  83937. "adds r5, r5, r6\n\t"
  83938. "adcs r3, r3, r7\n\t"
  83939. "adc r4, r4, #0\n\t"
  83940. #else
  83941. "umull r6, r7, r8, r12\n\t"
  83942. "adds r5, r5, r6\n\t"
  83943. "adcs r3, r3, r7\n\t"
  83944. "mov r4, #0\n\t"
  83945. "adc r4, r4, #0\n\t"
  83946. #endif
  83947. /* A[10] * B[10] */
  83948. "ldr r11, [%[a], #40]\n\t"
  83949. "ldr r12, [%[b], #40]\n\t"
  83950. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  83951. "lsl r6, r11, #16\n\t"
  83952. "lsl r7, r12, #16\n\t"
  83953. "lsr r6, r6, #16\n\t"
  83954. "lsr r7, r7, #16\n\t"
  83955. "mul r7, r6, r7\n\t"
  83956. "adds r5, r5, r7\n\t"
  83957. "adcs r3, r3, #0\n\t"
  83958. "adc r4, r4, #0\n\t"
  83959. "lsr r7, r12, #16\n\t"
  83960. "mul r6, r7, r6\n\t"
  83961. "lsr r7, r6, #16\n\t"
  83962. "lsl r6, r6, #16\n\t"
  83963. "adds r5, r5, r6\n\t"
  83964. "adcs r3, r3, r7\n\t"
  83965. "adc r4, r4, #0\n\t"
  83966. "lsr r6, r11, #16\n\t"
  83967. "lsr r7, r12, #16\n\t"
  83968. "mul r7, r6, r7\n\t"
  83969. "adds r3, r3, r7\n\t"
  83970. "adc r4, r4, #0\n\t"
  83971. "lsl r7, r12, #16\n\t"
  83972. "lsr r7, r7, #16\n\t"
  83973. "mul r6, r7, r6\n\t"
  83974. "lsr r7, r6, #16\n\t"
  83975. "lsl r6, r6, #16\n\t"
  83976. "adds r5, r5, r6\n\t"
  83977. "adcs r3, r3, r7\n\t"
  83978. "adc r4, r4, #0\n\t"
  83979. #else
  83980. "umull r6, r7, r11, r12\n\t"
  83981. "adds r5, r5, r6\n\t"
  83982. "adcs r3, r3, r7\n\t"
  83983. "adc r4, r4, #0\n\t"
  83984. #endif
  83985. /* A[9] * B[11] */
  83986. "ldr r8, [%[a], #36]\n\t"
  83987. "ldr r9, [%[b], #44]\n\t"
  83988. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  83989. "lsl r6, r8, #16\n\t"
  83990. "lsl r7, r9, #16\n\t"
  83991. "lsr r6, r6, #16\n\t"
  83992. "lsr r7, r7, #16\n\t"
  83993. "mul r7, r6, r7\n\t"
  83994. "adds r5, r5, r7\n\t"
  83995. "adcs r3, r3, #0\n\t"
  83996. "adc r4, r4, #0\n\t"
  83997. "lsr r7, r9, #16\n\t"
  83998. "mul r6, r7, r6\n\t"
  83999. "lsr r7, r6, #16\n\t"
  84000. "lsl r6, r6, #16\n\t"
  84001. "adds r5, r5, r6\n\t"
  84002. "adcs r3, r3, r7\n\t"
  84003. "adc r4, r4, #0\n\t"
  84004. "lsr r6, r8, #16\n\t"
  84005. "lsr r7, r9, #16\n\t"
  84006. "mul r7, r6, r7\n\t"
  84007. "adds r3, r3, r7\n\t"
  84008. "adc r4, r4, #0\n\t"
  84009. "lsl r7, r9, #16\n\t"
  84010. "lsr r7, r7, #16\n\t"
  84011. "mul r6, r7, r6\n\t"
  84012. "lsr r7, r6, #16\n\t"
  84013. "lsl r6, r6, #16\n\t"
  84014. "adds r5, r5, r6\n\t"
  84015. "adcs r3, r3, r7\n\t"
  84016. "adc r4, r4, #0\n\t"
  84017. #else
  84018. "umull r6, r7, r8, r9\n\t"
  84019. "adds r5, r5, r6\n\t"
  84020. "adcs r3, r3, r7\n\t"
  84021. "adc r4, r4, #0\n\t"
  84022. #endif
  84023. "str r5, [%[r], #80]\n\t"
  84024. /* A[10] * B[11] */
  84025. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  84026. "lsl r6, r11, #16\n\t"
  84027. "lsl r7, r9, #16\n\t"
  84028. "lsr r6, r6, #16\n\t"
  84029. "lsr r7, r7, #16\n\t"
  84030. "mul r7, r6, r7\n\t"
  84031. "adds r3, r3, r7\n\t"
  84032. "adcs r4, r4, #0\n\t"
  84033. "mov r5, #0\n\t"
  84034. "adc r5, r5, #0\n\t"
  84035. "lsr r7, r9, #16\n\t"
  84036. "mul r6, r7, r6\n\t"
  84037. "lsr r7, r6, #16\n\t"
  84038. "lsl r6, r6, #16\n\t"
  84039. "adds r3, r3, r6\n\t"
  84040. "adcs r4, r4, r7\n\t"
  84041. "adc r5, r5, #0\n\t"
  84042. "lsr r6, r11, #16\n\t"
  84043. "lsr r7, r9, #16\n\t"
  84044. "mul r7, r6, r7\n\t"
  84045. "adds r4, r4, r7\n\t"
  84046. "adc r5, r5, #0\n\t"
  84047. "lsl r7, r9, #16\n\t"
  84048. "lsr r7, r7, #16\n\t"
  84049. "mul r6, r7, r6\n\t"
  84050. "lsr r7, r6, #16\n\t"
  84051. "lsl r6, r6, #16\n\t"
  84052. "adds r3, r3, r6\n\t"
  84053. "adcs r4, r4, r7\n\t"
  84054. "adc r5, r5, #0\n\t"
  84055. #else
  84056. "umull r6, r7, r11, r9\n\t"
  84057. "adds r3, r3, r6\n\t"
  84058. "adcs r4, r4, r7\n\t"
  84059. "mov r5, #0\n\t"
  84060. "adc r5, r5, #0\n\t"
  84061. #endif
  84062. /* A[11] * B[10] */
  84063. "ldr r8, [%[a], #44]\n\t"
  84064. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  84065. "lsl r6, r8, #16\n\t"
  84066. "lsl r7, r12, #16\n\t"
  84067. "lsr r6, r6, #16\n\t"
  84068. "lsr r7, r7, #16\n\t"
  84069. "mul r7, r6, r7\n\t"
  84070. "adds r3, r3, r7\n\t"
  84071. "adcs r4, r4, #0\n\t"
  84072. "adc r5, r5, #0\n\t"
  84073. "lsr r7, r12, #16\n\t"
  84074. "mul r6, r7, r6\n\t"
  84075. "lsr r7, r6, #16\n\t"
  84076. "lsl r6, r6, #16\n\t"
  84077. "adds r3, r3, r6\n\t"
  84078. "adcs r4, r4, r7\n\t"
  84079. "adc r5, r5, #0\n\t"
  84080. "lsr r6, r8, #16\n\t"
  84081. "lsr r7, r12, #16\n\t"
  84082. "mul r7, r6, r7\n\t"
  84083. "adds r4, r4, r7\n\t"
  84084. "adc r5, r5, #0\n\t"
  84085. "lsl r7, r12, #16\n\t"
  84086. "lsr r7, r7, #16\n\t"
  84087. "mul r6, r7, r6\n\t"
  84088. "lsr r7, r6, #16\n\t"
  84089. "lsl r6, r6, #16\n\t"
  84090. "adds r3, r3, r6\n\t"
  84091. "adcs r4, r4, r7\n\t"
  84092. "adc r5, r5, #0\n\t"
  84093. #else
  84094. "umull r6, r7, r8, r12\n\t"
  84095. "adds r3, r3, r6\n\t"
  84096. "adcs r4, r4, r7\n\t"
  84097. "adc r5, r5, #0\n\t"
  84098. #endif
  84099. "str r3, [%[r], #84]\n\t"
  84100. /* A[11] * B[11] */
  84101. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  84102. "lsl r6, r8, #16\n\t"
  84103. "lsl r7, r9, #16\n\t"
  84104. "lsr r6, r6, #16\n\t"
  84105. "lsr r7, r7, #16\n\t"
  84106. "mul r7, r6, r7\n\t"
  84107. "adds r4, r4, r7\n\t"
  84108. "adc r5, r5, #0\n\t"
  84109. "lsr r7, r9, #16\n\t"
  84110. "mul r6, r7, r6\n\t"
  84111. "lsr r7, r6, #16\n\t"
  84112. "lsl r6, r6, #16\n\t"
  84113. "adds r4, r4, r6\n\t"
  84114. "adc r5, r5, r7\n\t"
  84115. "lsr r6, r8, #16\n\t"
  84116. "lsr r7, r9, #16\n\t"
  84117. "mul r7, r6, r7\n\t"
  84118. "add r5, r5, r7\n\t"
  84119. "lsl r7, r9, #16\n\t"
  84120. "lsr r7, r7, #16\n\t"
  84121. "mul r6, r7, r6\n\t"
  84122. "lsr r7, r6, #16\n\t"
  84123. "lsl r6, r6, #16\n\t"
  84124. "adds r4, r4, r6\n\t"
  84125. "adc r5, r5, r7\n\t"
  84126. #else
  84127. "umlal r4, r5, r8, r9\n\t"
  84128. #endif
  84129. "str r4, [%[r], #88]\n\t"
  84130. "str r5, [%[r], #92]\n\t"
  84131. "ldm sp!, {r3, r4, r5, r6}\n\t"
  84132. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  84133. "ldm sp!, {r3, r4, r5, r6}\n\t"
  84134. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  84135. "ldm sp!, {r3, r4, r5, r6}\n\t"
  84136. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  84137. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  84138. :
  84139. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r11", "r12", "cc"
  84140. );
  84141. }
  84142. #endif /* WOLFSSL_SP_SMALL */
  84143. #ifdef WOLFSSL_SP_SMALL
  84144. /* Square a and put result in r. (r = a * a)
  84145. *
  84146. * r A single precision integer.
  84147. * a A single precision integer.
  84148. */
  84149. static void sp_384_sqr_12(sp_digit* r_p, const sp_digit* a_p)
  84150. {
  84151. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  84152. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  84153. __asm__ __volatile__ (
  84154. "sub sp, sp, #0x60\n\t"
  84155. "ldr lr, [%[a]]\n\t"
  84156. "umull r8, r6, lr, lr\n\t"
  84157. "str r8, [sp]\n\t"
  84158. "mov r7, #0\n\t"
  84159. "mov r8, #0\n\t"
  84160. "mov r5, #4\n\t"
  84161. "\n"
  84162. "L_sp_384_sqr_12_outer_%=: \n\t"
  84163. "subs r3, r5, #44\n\t"
  84164. "it cc\n\t"
  84165. "movcc r3, #0\n\t"
  84166. "sub r4, r5, r3\n\t"
  84167. "\n"
  84168. "L_sp_384_sqr_12_inner_%=: \n\t"
  84169. "ldr lr, [%[a], r3]\n\t"
  84170. "ldr r11, [%[a], r4]\n\t"
  84171. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  84172. "lsl r9, lr, #16\n\t"
  84173. "lsl r10, r11, #16\n\t"
  84174. "lsr r9, r9, #16\n\t"
  84175. "lsr r10, r10, #16\n\t"
  84176. "mul r10, r9, r10\n\t"
  84177. "adds r6, r6, r10\n\t"
  84178. "adcs r7, r7, #0\n\t"
  84179. "adc r8, r8, #0\n\t"
  84180. "adds r6, r6, r10\n\t"
  84181. "adcs r7, r7, #0\n\t"
  84182. "adc r8, r8, #0\n\t"
  84183. "lsr r10, r11, #16\n\t"
  84184. "mul r9, r10, r9\n\t"
  84185. "lsr r10, r9, #16\n\t"
  84186. "lsl r9, r9, #16\n\t"
  84187. "adds r6, r6, r9\n\t"
  84188. "adcs r7, r7, r10\n\t"
  84189. "adc r8, r8, #0\n\t"
  84190. "adds r6, r6, r9\n\t"
  84191. "adcs r7, r7, r10\n\t"
  84192. "adc r8, r8, #0\n\t"
  84193. "lsr r9, lr, #16\n\t"
  84194. "lsr r10, r11, #16\n\t"
  84195. "mul r10, r9, r10\n\t"
  84196. "adds r7, r7, r10\n\t"
  84197. "adc r8, r8, #0\n\t"
  84198. "adds r7, r7, r10\n\t"
  84199. "adc r8, r8, #0\n\t"
  84200. "lsl r10, r11, #16\n\t"
  84201. "lsr r10, r10, #16\n\t"
  84202. "mul r9, r10, r9\n\t"
  84203. "lsr r10, r9, #16\n\t"
  84204. "lsl r9, r9, #16\n\t"
  84205. "adds r6, r6, r9\n\t"
  84206. "adcs r7, r7, r10\n\t"
  84207. "adc r8, r8, #0\n\t"
  84208. "adds r6, r6, r9\n\t"
  84209. "adcs r7, r7, r10\n\t"
  84210. "adc r8, r8, #0\n\t"
  84211. #else
  84212. "umull r9, r10, lr, r11\n\t"
  84213. "adds r6, r6, r9\n\t"
  84214. "adcs r7, r7, r10\n\t"
  84215. "adc r8, r8, #0\n\t"
  84216. "adds r6, r6, r9\n\t"
  84217. "adcs r7, r7, r10\n\t"
  84218. "adc r8, r8, #0\n\t"
  84219. #endif
  84220. "add r3, r3, #4\n\t"
  84221. "sub r4, r4, #4\n\t"
  84222. "cmp r3, r4\n\t"
  84223. "bgt L_sp_384_sqr_12_inner_done_%=\n\t"
  84224. "blt L_sp_384_sqr_12_inner_%=\n\t"
  84225. "ldr lr, [%[a], r3]\n\t"
  84226. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  84227. "lsl r9, lr, #16\n\t"
  84228. "lsr r10, lr, #16\n\t"
  84229. "lsr r9, r9, #16\n\t"
  84230. "mov r11, r9\n\t"
  84231. "mul r9, r11, r9\n\t"
  84232. "mov r11, r10\n\t"
  84233. "mul r10, r11, r10\n\t"
  84234. "adds r6, r6, r9\n\t"
  84235. "adcs r7, r7, r10\n\t"
  84236. "adc r8, r8, #0\n\t"
  84237. "lsr r10, lr, #16\n\t"
  84238. "lsl r9, lr, #16\n\t"
  84239. "lsr r9, r9, #16\n\t"
  84240. "mul r9, r10, r9\n\t"
  84241. "lsr r10, r9, #15\n\t"
  84242. "lsl r9, r9, #17\n\t"
  84243. "adds r6, r6, r9\n\t"
  84244. "adcs r7, r7, r10\n\t"
  84245. "adc r8, r8, #0\n\t"
  84246. #else
  84247. "umull r9, r10, lr, lr\n\t"
  84248. "adds r6, r6, r9\n\t"
  84249. "adcs r7, r7, r10\n\t"
  84250. "adc r8, r8, #0\n\t"
  84251. #endif
  84252. "\n"
  84253. "L_sp_384_sqr_12_inner_done_%=: \n\t"
  84254. "str r6, [sp, r5]\n\t"
  84255. "mov r6, r7\n\t"
  84256. "mov r7, r8\n\t"
  84257. "mov r8, #0\n\t"
  84258. "add r5, r5, #4\n\t"
  84259. "cmp r5, #0x54\n\t"
  84260. "ble L_sp_384_sqr_12_outer_%=\n\t"
  84261. "ldr lr, [%[a], #44]\n\t"
  84262. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  84263. "lsl r9, lr, #16\n\t"
  84264. "lsr r10, lr, #16\n\t"
  84265. "lsr r9, r9, #16\n\t"
  84266. "mov r11, r9\n\t"
  84267. "mul r9, r11, r9\n\t"
  84268. "mov r11, r10\n\t"
  84269. "mul r10, r11, r10\n\t"
  84270. "adds r6, r6, r9\n\t"
  84271. "adc r7, r7, r10\n\t"
  84272. "lsr r10, lr, #16\n\t"
  84273. "lsl r9, lr, #16\n\t"
  84274. "lsr r9, r9, #16\n\t"
  84275. "mul r9, r10, r9\n\t"
  84276. "lsr r10, r9, #15\n\t"
  84277. "lsl r9, r9, #17\n\t"
  84278. "adds r6, r6, r9\n\t"
  84279. "adc r7, r7, r10\n\t"
  84280. #else
  84281. "umull r9, r10, lr, lr\n\t"
  84282. "adds r6, r6, r9\n\t"
  84283. "adc r7, r7, r10\n\t"
  84284. #endif
  84285. "str r6, [sp, r5]\n\t"
  84286. "add r5, r5, #4\n\t"
  84287. "str r7, [sp, r5]\n\t"
  84288. "\n"
  84289. "L_sp_384_sqr_12_store_%=: \n\t"
  84290. "ldm sp!, {r3, r4, r6, r7, r8, r9, r10, r11}\n\t"
  84291. "stm %[r]!, {r3, r4, r6, r7, r8, r9, r10, r11}\n\t"
  84292. "subs r5, r5, #32\n\t"
  84293. "bgt L_sp_384_sqr_12_store_%=\n\t"
  84294. : [r] "+r" (r), [a] "+r" (a)
  84295. :
  84296. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "lr", "r11", "cc"
  84297. );
  84298. }
  84299. #else
  84300. /* Square a and put result in r. (r = a * a)
  84301. *
  84302. * r A single precision integer.
  84303. * a A single precision integer.
  84304. */
  84305. static void sp_384_sqr_12(sp_digit* r_p, const sp_digit* a_p)
  84306. {
  84307. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  84308. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  84309. __asm__ __volatile__ (
  84310. "sub sp, sp, #48\n\t"
  84311. /* A[0] * A[0] */
  84312. "ldr r10, [%[a]]\n\t"
  84313. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  84314. "lsr r9, r10, #16\n\t"
  84315. "lsl r2, r10, #16\n\t"
  84316. "lsr r2, r2, #16\n\t"
  84317. "mul r8, r2, r2\n\t"
  84318. "mul r3, r9, r9\n\t"
  84319. "mul r2, r9, r2\n\t"
  84320. "lsr r9, r2, #15\n\t"
  84321. "lsl r2, r2, #17\n\t"
  84322. "adds r8, r8, r2\n\t"
  84323. "adc r3, r3, r9\n\t"
  84324. #else
  84325. "umull r8, r3, r10, r10\n\t"
  84326. #endif
  84327. "mov r4, #0\n\t"
  84328. "str r8, [sp]\n\t"
  84329. /* A[0] * A[1] */
  84330. "ldr r10, [%[a], #4]\n\t"
  84331. "ldr r12, [%[a]]\n\t"
  84332. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  84333. "lsl r8, r10, #16\n\t"
  84334. "lsl r9, r12, #16\n\t"
  84335. "lsr r8, r8, #16\n\t"
  84336. "lsr r9, r9, #16\n\t"
  84337. "mul r9, r8, r9\n\t"
  84338. "adds r3, r3, r9\n\t"
  84339. "adcs r4, r4, #0\n\t"
  84340. "mov r2, #0\n\t"
  84341. "adc r2, r2, #0\n\t"
  84342. "adds r3, r3, r9\n\t"
  84343. "adcs r4, r4, #0\n\t"
  84344. "adc r2, r2, #0\n\t"
  84345. "lsr r9, r12, #16\n\t"
  84346. "mul r8, r9, r8\n\t"
  84347. "lsr r9, r8, #16\n\t"
  84348. "lsl r8, r8, #16\n\t"
  84349. "adds r3, r3, r8\n\t"
  84350. "adcs r4, r4, r9\n\t"
  84351. "adc r2, r2, #0\n\t"
  84352. "adds r3, r3, r8\n\t"
  84353. "adcs r4, r4, r9\n\t"
  84354. "adc r2, r2, #0\n\t"
  84355. "lsr r8, r10, #16\n\t"
  84356. "lsr r9, r12, #16\n\t"
  84357. "mul r9, r8, r9\n\t"
  84358. "adds r4, r4, r9\n\t"
  84359. "adc r2, r2, #0\n\t"
  84360. "adds r4, r4, r9\n\t"
  84361. "adc r2, r2, #0\n\t"
  84362. "lsl r9, r12, #16\n\t"
  84363. "lsr r9, r9, #16\n\t"
  84364. "mul r8, r9, r8\n\t"
  84365. "lsr r9, r8, #16\n\t"
  84366. "lsl r8, r8, #16\n\t"
  84367. "adds r3, r3, r8\n\t"
  84368. "adcs r4, r4, r9\n\t"
  84369. "adc r2, r2, #0\n\t"
  84370. "adds r3, r3, r8\n\t"
  84371. "adcs r4, r4, r9\n\t"
  84372. "adc r2, r2, #0\n\t"
  84373. #else
  84374. "umull r8, r9, r10, r12\n\t"
  84375. "adds r3, r3, r8\n\t"
  84376. "adcs r4, r4, r9\n\t"
  84377. "mov r2, #0\n\t"
  84378. "adc r2, r2, #0\n\t"
  84379. "adds r3, r3, r8\n\t"
  84380. "adcs r4, r4, r9\n\t"
  84381. "mov r2, #0\n\t"
  84382. "adc r2, r2, #0\n\t"
  84383. #endif
  84384. "str r3, [sp, #4]\n\t"
  84385. /* A[0] * A[2] */
  84386. "ldr r10, [%[a], #8]\n\t"
  84387. "ldr r12, [%[a]]\n\t"
  84388. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  84389. "lsl r8, r10, #16\n\t"
  84390. "lsl r9, r12, #16\n\t"
  84391. "lsr r8, r8, #16\n\t"
  84392. "lsr r9, r9, #16\n\t"
  84393. "mul r9, r8, r9\n\t"
  84394. "adds r4, r4, r9\n\t"
  84395. "adcs r2, r2, #0\n\t"
  84396. "mov r3, #0\n\t"
  84397. "adc r3, r3, #0\n\t"
  84398. "adds r4, r4, r9\n\t"
  84399. "adcs r2, r2, #0\n\t"
  84400. "adc r3, r3, #0\n\t"
  84401. "lsr r9, r12, #16\n\t"
  84402. "mul r8, r9, r8\n\t"
  84403. "lsr r9, r8, #16\n\t"
  84404. "lsl r8, r8, #16\n\t"
  84405. "adds r4, r4, r8\n\t"
  84406. "adcs r2, r2, r9\n\t"
  84407. "adc r3, r3, #0\n\t"
  84408. "adds r4, r4, r8\n\t"
  84409. "adcs r2, r2, r9\n\t"
  84410. "adc r3, r3, #0\n\t"
  84411. "lsr r8, r10, #16\n\t"
  84412. "lsr r9, r12, #16\n\t"
  84413. "mul r9, r8, r9\n\t"
  84414. "adds r2, r2, r9\n\t"
  84415. "adc r3, r3, #0\n\t"
  84416. "adds r2, r2, r9\n\t"
  84417. "adc r3, r3, #0\n\t"
  84418. "lsl r9, r12, #16\n\t"
  84419. "lsr r9, r9, #16\n\t"
  84420. "mul r8, r9, r8\n\t"
  84421. "lsr r9, r8, #16\n\t"
  84422. "lsl r8, r8, #16\n\t"
  84423. "adds r4, r4, r8\n\t"
  84424. "adcs r2, r2, r9\n\t"
  84425. "adc r3, r3, #0\n\t"
  84426. "adds r4, r4, r8\n\t"
  84427. "adcs r2, r2, r9\n\t"
  84428. "adc r3, r3, #0\n\t"
  84429. #else
  84430. "umull r8, r9, r10, r12\n\t"
  84431. "adds r4, r4, r8\n\t"
  84432. "adcs r2, r2, r9\n\t"
  84433. "mov r3, #0\n\t"
  84434. "adc r3, r3, #0\n\t"
  84435. "adds r4, r4, r8\n\t"
  84436. "adcs r2, r2, r9\n\t"
  84437. "mov r3, #0\n\t"
  84438. "adc r3, r3, #0\n\t"
  84439. #endif
  84440. /* A[1] * A[1] */
  84441. "ldr r10, [%[a], #4]\n\t"
  84442. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  84443. "lsl r8, r10, #16\n\t"
  84444. "lsr r9, r10, #16\n\t"
  84445. "lsr r8, r8, #16\n\t"
  84446. "mov r12, r8\n\t"
  84447. "mul r8, r12, r8\n\t"
  84448. "mov r12, r9\n\t"
  84449. "mul r9, r12, r9\n\t"
  84450. "adds r4, r4, r8\n\t"
  84451. "adcs r2, r2, r9\n\t"
  84452. "adc r3, r3, #0\n\t"
  84453. "lsr r9, r10, #16\n\t"
  84454. "lsl r8, r10, #16\n\t"
  84455. "lsr r8, r8, #16\n\t"
  84456. "mul r8, r9, r8\n\t"
  84457. "lsr r9, r8, #15\n\t"
  84458. "lsl r8, r8, #17\n\t"
  84459. "adds r4, r4, r8\n\t"
  84460. "adcs r2, r2, r9\n\t"
  84461. "adc r3, r3, #0\n\t"
  84462. #else
  84463. "umull r8, r9, r10, r10\n\t"
  84464. "adds r4, r4, r8\n\t"
  84465. "adcs r2, r2, r9\n\t"
  84466. "adc r3, r3, #0\n\t"
  84467. #endif
  84468. "str r4, [sp, #8]\n\t"
  84469. /* A[0] * A[3] */
  84470. "ldr r10, [%[a], #12]\n\t"
  84471. "ldr r12, [%[a]]\n\t"
  84472. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  84473. "lsl r8, r10, #16\n\t"
  84474. "lsl r9, r12, #16\n\t"
  84475. "lsr r8, r8, #16\n\t"
  84476. "lsr r9, r9, #16\n\t"
  84477. "mul r9, r8, r9\n\t"
  84478. "adds r2, r2, r9\n\t"
  84479. "adcs r3, r3, #0\n\t"
  84480. "mov r4, #0\n\t"
  84481. "adc r4, r4, #0\n\t"
  84482. "adds r2, r2, r9\n\t"
  84483. "adcs r3, r3, #0\n\t"
  84484. "adc r4, r4, #0\n\t"
  84485. "lsr r9, r12, #16\n\t"
  84486. "mul r8, r9, r8\n\t"
  84487. "lsr r9, r8, #16\n\t"
  84488. "lsl r8, r8, #16\n\t"
  84489. "adds r2, r2, r8\n\t"
  84490. "adcs r3, r3, r9\n\t"
  84491. "adc r4, r4, #0\n\t"
  84492. "adds r2, r2, r8\n\t"
  84493. "adcs r3, r3, r9\n\t"
  84494. "adc r4, r4, #0\n\t"
  84495. "lsr r8, r10, #16\n\t"
  84496. "lsr r9, r12, #16\n\t"
  84497. "mul r9, r8, r9\n\t"
  84498. "adds r3, r3, r9\n\t"
  84499. "adc r4, r4, #0\n\t"
  84500. "adds r3, r3, r9\n\t"
  84501. "adc r4, r4, #0\n\t"
  84502. "lsl r9, r12, #16\n\t"
  84503. "lsr r9, r9, #16\n\t"
  84504. "mul r8, r9, r8\n\t"
  84505. "lsr r9, r8, #16\n\t"
  84506. "lsl r8, r8, #16\n\t"
  84507. "adds r2, r2, r8\n\t"
  84508. "adcs r3, r3, r9\n\t"
  84509. "adc r4, r4, #0\n\t"
  84510. "adds r2, r2, r8\n\t"
  84511. "adcs r3, r3, r9\n\t"
  84512. "adc r4, r4, #0\n\t"
  84513. #else
  84514. "umull r8, r9, r10, r12\n\t"
  84515. "adds r2, r2, r8\n\t"
  84516. "adcs r3, r3, r9\n\t"
  84517. "mov r4, #0\n\t"
  84518. "adc r4, r4, #0\n\t"
  84519. "adds r2, r2, r8\n\t"
  84520. "adcs r3, r3, r9\n\t"
  84521. "mov r4, #0\n\t"
  84522. "adc r4, r4, #0\n\t"
  84523. #endif
  84524. /* A[1] * A[2] */
  84525. "ldr r10, [%[a], #8]\n\t"
  84526. "ldr r12, [%[a], #4]\n\t"
  84527. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  84528. "lsl r8, r10, #16\n\t"
  84529. "lsl r9, r12, #16\n\t"
  84530. "lsr r8, r8, #16\n\t"
  84531. "lsr r9, r9, #16\n\t"
  84532. "mul r9, r8, r9\n\t"
  84533. "adds r2, r2, r9\n\t"
  84534. "adcs r3, r3, #0\n\t"
  84535. "adc r4, r4, #0\n\t"
  84536. "adds r2, r2, r9\n\t"
  84537. "adcs r3, r3, #0\n\t"
  84538. "adc r4, r4, #0\n\t"
  84539. "lsr r9, r12, #16\n\t"
  84540. "mul r8, r9, r8\n\t"
  84541. "lsr r9, r8, #16\n\t"
  84542. "lsl r8, r8, #16\n\t"
  84543. "adds r2, r2, r8\n\t"
  84544. "adcs r3, r3, r9\n\t"
  84545. "adc r4, r4, #0\n\t"
  84546. "adds r2, r2, r8\n\t"
  84547. "adcs r3, r3, r9\n\t"
  84548. "adc r4, r4, #0\n\t"
  84549. "lsr r8, r10, #16\n\t"
  84550. "lsr r9, r12, #16\n\t"
  84551. "mul r9, r8, r9\n\t"
  84552. "adds r3, r3, r9\n\t"
  84553. "adc r4, r4, #0\n\t"
  84554. "adds r3, r3, r9\n\t"
  84555. "adc r4, r4, #0\n\t"
  84556. "lsl r9, r12, #16\n\t"
  84557. "lsr r9, r9, #16\n\t"
  84558. "mul r8, r9, r8\n\t"
  84559. "lsr r9, r8, #16\n\t"
  84560. "lsl r8, r8, #16\n\t"
  84561. "adds r2, r2, r8\n\t"
  84562. "adcs r3, r3, r9\n\t"
  84563. "adc r4, r4, #0\n\t"
  84564. "adds r2, r2, r8\n\t"
  84565. "adcs r3, r3, r9\n\t"
  84566. "adc r4, r4, #0\n\t"
  84567. #else
  84568. "umull r8, r9, r10, r12\n\t"
  84569. "adds r2, r2, r8\n\t"
  84570. "adcs r3, r3, r9\n\t"
  84571. "adc r4, r4, #0\n\t"
  84572. "adds r2, r2, r8\n\t"
  84573. "adcs r3, r3, r9\n\t"
  84574. "adc r4, r4, #0\n\t"
  84575. #endif
  84576. "str r2, [sp, #12]\n\t"
  84577. /* A[0] * A[4] */
  84578. "ldr r10, [%[a], #16]\n\t"
  84579. "ldr r12, [%[a]]\n\t"
  84580. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  84581. "lsl r8, r10, #16\n\t"
  84582. "lsl r9, r12, #16\n\t"
  84583. "lsr r8, r8, #16\n\t"
  84584. "lsr r9, r9, #16\n\t"
  84585. "mul r9, r8, r9\n\t"
  84586. "adds r3, r3, r9\n\t"
  84587. "adcs r4, r4, #0\n\t"
  84588. "mov r2, #0\n\t"
  84589. "adc r2, r2, #0\n\t"
  84590. "adds r3, r3, r9\n\t"
  84591. "adcs r4, r4, #0\n\t"
  84592. "adc r2, r2, #0\n\t"
  84593. "lsr r9, r12, #16\n\t"
  84594. "mul r8, r9, r8\n\t"
  84595. "lsr r9, r8, #16\n\t"
  84596. "lsl r8, r8, #16\n\t"
  84597. "adds r3, r3, r8\n\t"
  84598. "adcs r4, r4, r9\n\t"
  84599. "adc r2, r2, #0\n\t"
  84600. "adds r3, r3, r8\n\t"
  84601. "adcs r4, r4, r9\n\t"
  84602. "adc r2, r2, #0\n\t"
  84603. "lsr r8, r10, #16\n\t"
  84604. "lsr r9, r12, #16\n\t"
  84605. "mul r9, r8, r9\n\t"
  84606. "adds r4, r4, r9\n\t"
  84607. "adc r2, r2, #0\n\t"
  84608. "adds r4, r4, r9\n\t"
  84609. "adc r2, r2, #0\n\t"
  84610. "lsl r9, r12, #16\n\t"
  84611. "lsr r9, r9, #16\n\t"
  84612. "mul r8, r9, r8\n\t"
  84613. "lsr r9, r8, #16\n\t"
  84614. "lsl r8, r8, #16\n\t"
  84615. "adds r3, r3, r8\n\t"
  84616. "adcs r4, r4, r9\n\t"
  84617. "adc r2, r2, #0\n\t"
  84618. "adds r3, r3, r8\n\t"
  84619. "adcs r4, r4, r9\n\t"
  84620. "adc r2, r2, #0\n\t"
  84621. #else
  84622. "umull r8, r9, r10, r12\n\t"
  84623. "adds r3, r3, r8\n\t"
  84624. "adcs r4, r4, r9\n\t"
  84625. "mov r2, #0\n\t"
  84626. "adc r2, r2, #0\n\t"
  84627. "adds r3, r3, r8\n\t"
  84628. "adcs r4, r4, r9\n\t"
  84629. "mov r2, #0\n\t"
  84630. "adc r2, r2, #0\n\t"
  84631. #endif
  84632. /* A[1] * A[3] */
  84633. "ldr r10, [%[a], #12]\n\t"
  84634. "ldr r12, [%[a], #4]\n\t"
  84635. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  84636. "lsl r8, r10, #16\n\t"
  84637. "lsl r9, r12, #16\n\t"
  84638. "lsr r8, r8, #16\n\t"
  84639. "lsr r9, r9, #16\n\t"
  84640. "mul r9, r8, r9\n\t"
  84641. "adds r3, r3, r9\n\t"
  84642. "adcs r4, r4, #0\n\t"
  84643. "adc r2, r2, #0\n\t"
  84644. "adds r3, r3, r9\n\t"
  84645. "adcs r4, r4, #0\n\t"
  84646. "adc r2, r2, #0\n\t"
  84647. "lsr r9, r12, #16\n\t"
  84648. "mul r8, r9, r8\n\t"
  84649. "lsr r9, r8, #16\n\t"
  84650. "lsl r8, r8, #16\n\t"
  84651. "adds r3, r3, r8\n\t"
  84652. "adcs r4, r4, r9\n\t"
  84653. "adc r2, r2, #0\n\t"
  84654. "adds r3, r3, r8\n\t"
  84655. "adcs r4, r4, r9\n\t"
  84656. "adc r2, r2, #0\n\t"
  84657. "lsr r8, r10, #16\n\t"
  84658. "lsr r9, r12, #16\n\t"
  84659. "mul r9, r8, r9\n\t"
  84660. "adds r4, r4, r9\n\t"
  84661. "adc r2, r2, #0\n\t"
  84662. "adds r4, r4, r9\n\t"
  84663. "adc r2, r2, #0\n\t"
  84664. "lsl r9, r12, #16\n\t"
  84665. "lsr r9, r9, #16\n\t"
  84666. "mul r8, r9, r8\n\t"
  84667. "lsr r9, r8, #16\n\t"
  84668. "lsl r8, r8, #16\n\t"
  84669. "adds r3, r3, r8\n\t"
  84670. "adcs r4, r4, r9\n\t"
  84671. "adc r2, r2, #0\n\t"
  84672. "adds r3, r3, r8\n\t"
  84673. "adcs r4, r4, r9\n\t"
  84674. "adc r2, r2, #0\n\t"
  84675. #else
  84676. "umull r8, r9, r10, r12\n\t"
  84677. "adds r3, r3, r8\n\t"
  84678. "adcs r4, r4, r9\n\t"
  84679. "adc r2, r2, #0\n\t"
  84680. "adds r3, r3, r8\n\t"
  84681. "adcs r4, r4, r9\n\t"
  84682. "adc r2, r2, #0\n\t"
  84683. #endif
  84684. /* A[2] * A[2] */
  84685. "ldr r10, [%[a], #8]\n\t"
  84686. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  84687. "lsl r8, r10, #16\n\t"
  84688. "lsr r9, r10, #16\n\t"
  84689. "lsr r8, r8, #16\n\t"
  84690. "mov r12, r8\n\t"
  84691. "mul r8, r12, r8\n\t"
  84692. "mov r12, r9\n\t"
  84693. "mul r9, r12, r9\n\t"
  84694. "adds r3, r3, r8\n\t"
  84695. "adcs r4, r4, r9\n\t"
  84696. "adc r2, r2, #0\n\t"
  84697. "lsr r9, r10, #16\n\t"
  84698. "lsl r8, r10, #16\n\t"
  84699. "lsr r8, r8, #16\n\t"
  84700. "mul r8, r9, r8\n\t"
  84701. "lsr r9, r8, #15\n\t"
  84702. "lsl r8, r8, #17\n\t"
  84703. "adds r3, r3, r8\n\t"
  84704. "adcs r4, r4, r9\n\t"
  84705. "adc r2, r2, #0\n\t"
  84706. #else
  84707. "umull r8, r9, r10, r10\n\t"
  84708. "adds r3, r3, r8\n\t"
  84709. "adcs r4, r4, r9\n\t"
  84710. "adc r2, r2, #0\n\t"
  84711. #endif
  84712. "str r3, [sp, #16]\n\t"
  84713. /* A[0] * A[5] */
  84714. "ldr r10, [%[a], #20]\n\t"
  84715. "ldr r12, [%[a]]\n\t"
  84716. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  84717. "lsl r8, r10, #16\n\t"
  84718. "lsl r5, r12, #16\n\t"
  84719. "lsr r8, r8, #16\n\t"
  84720. "lsr r5, r5, #16\n\t"
  84721. "mul r5, r8, r5\n\t"
  84722. "lsr r9, r12, #16\n\t"
  84723. "mul r8, r9, r8\n\t"
  84724. "lsr r6, r8, #16\n\t"
  84725. "lsl r8, r8, #16\n\t"
  84726. "adds r5, r5, r8\n\t"
  84727. "adc r6, r6, #0\n\t"
  84728. "lsr r8, r10, #16\n\t"
  84729. "mul r9, r8, r9\n\t"
  84730. "add r6, r6, r9\n\t"
  84731. "lsl r9, r12, #16\n\t"
  84732. "lsr r9, r9, #16\n\t"
  84733. "mul r8, r9, r8\n\t"
  84734. "lsr r9, r8, #16\n\t"
  84735. "lsl r8, r8, #16\n\t"
  84736. "adds r5, r5, r8\n\t"
  84737. "adc r6, r6, r9\n\t"
  84738. #else
  84739. "umull r5, r6, r10, r12\n\t"
  84740. #endif
  84741. "mov r3, #0\n\t"
  84742. "mov r7, #0\n\t"
  84743. /* A[1] * A[4] */
  84744. "ldr r10, [%[a], #16]\n\t"
  84745. "ldr r12, [%[a], #4]\n\t"
  84746. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  84747. "lsl r8, r10, #16\n\t"
  84748. "lsl r9, r12, #16\n\t"
  84749. "lsr r8, r8, #16\n\t"
  84750. "lsr r9, r9, #16\n\t"
  84751. "mul r9, r8, r9\n\t"
  84752. "adds r5, r5, r9\n\t"
  84753. "adcs r6, r6, #0\n\t"
  84754. "adc r7, r7, #0\n\t"
  84755. "lsr r9, r12, #16\n\t"
  84756. "mul r8, r9, r8\n\t"
  84757. "lsr r9, r8, #16\n\t"
  84758. "lsl r8, r8, #16\n\t"
  84759. "adds r5, r5, r8\n\t"
  84760. "adcs r6, r6, r9\n\t"
  84761. "adc r7, r7, #0\n\t"
  84762. "lsr r8, r10, #16\n\t"
  84763. "lsr r9, r12, #16\n\t"
  84764. "mul r9, r8, r9\n\t"
  84765. "adds r6, r6, r9\n\t"
  84766. "adc r7, r7, #0\n\t"
  84767. "lsl r9, r12, #16\n\t"
  84768. "lsr r9, r9, #16\n\t"
  84769. "mul r8, r9, r8\n\t"
  84770. "lsr r9, r8, #16\n\t"
  84771. "lsl r8, r8, #16\n\t"
  84772. "adds r5, r5, r8\n\t"
  84773. "adcs r6, r6, r9\n\t"
  84774. "adc r7, r7, #0\n\t"
  84775. #else
  84776. "umull r8, r9, r10, r12\n\t"
  84777. "adds r5, r5, r8\n\t"
  84778. "adcs r6, r6, r9\n\t"
  84779. "adc r7, r7, #0\n\t"
  84780. #endif
  84781. /* A[2] * A[3] */
  84782. "ldr r10, [%[a], #12]\n\t"
  84783. "ldr r12, [%[a], #8]\n\t"
  84784. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  84785. "lsl r8, r10, #16\n\t"
  84786. "lsl r9, r12, #16\n\t"
  84787. "lsr r8, r8, #16\n\t"
  84788. "lsr r9, r9, #16\n\t"
  84789. "mul r9, r8, r9\n\t"
  84790. "adds r5, r5, r9\n\t"
  84791. "adcs r6, r6, #0\n\t"
  84792. "adc r7, r7, #0\n\t"
  84793. "lsr r9, r12, #16\n\t"
  84794. "mul r8, r9, r8\n\t"
  84795. "lsr r9, r8, #16\n\t"
  84796. "lsl r8, r8, #16\n\t"
  84797. "adds r5, r5, r8\n\t"
  84798. "adcs r6, r6, r9\n\t"
  84799. "adc r7, r7, #0\n\t"
  84800. "lsr r8, r10, #16\n\t"
  84801. "lsr r9, r12, #16\n\t"
  84802. "mul r9, r8, r9\n\t"
  84803. "adds r6, r6, r9\n\t"
  84804. "adc r7, r7, #0\n\t"
  84805. "lsl r9, r12, #16\n\t"
  84806. "lsr r9, r9, #16\n\t"
  84807. "mul r8, r9, r8\n\t"
  84808. "lsr r9, r8, #16\n\t"
  84809. "lsl r8, r8, #16\n\t"
  84810. "adds r5, r5, r8\n\t"
  84811. "adcs r6, r6, r9\n\t"
  84812. "adc r7, r7, #0\n\t"
  84813. #else
  84814. "umull r8, r9, r10, r12\n\t"
  84815. "adds r5, r5, r8\n\t"
  84816. "adcs r6, r6, r9\n\t"
  84817. "adc r7, r7, #0\n\t"
  84818. #endif
  84819. "adds r5, r5, r5\n\t"
  84820. "adcs r6, r6, r6\n\t"
  84821. "adc r7, r7, r7\n\t"
  84822. "adds r4, r4, r5\n\t"
  84823. "adcs r2, r2, r6\n\t"
  84824. "adc r3, r3, r7\n\t"
  84825. "str r4, [sp, #20]\n\t"
  84826. /* A[0] * A[6] */
  84827. "ldr r10, [%[a], #24]\n\t"
  84828. "ldr r12, [%[a]]\n\t"
  84829. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  84830. "lsl r8, r10, #16\n\t"
  84831. "lsl r5, r12, #16\n\t"
  84832. "lsr r8, r8, #16\n\t"
  84833. "lsr r5, r5, #16\n\t"
  84834. "mul r5, r8, r5\n\t"
  84835. "lsr r9, r12, #16\n\t"
  84836. "mul r8, r9, r8\n\t"
  84837. "lsr r6, r8, #16\n\t"
  84838. "lsl r8, r8, #16\n\t"
  84839. "adds r5, r5, r8\n\t"
  84840. "adc r6, r6, #0\n\t"
  84841. "lsr r8, r10, #16\n\t"
  84842. "mul r9, r8, r9\n\t"
  84843. "add r6, r6, r9\n\t"
  84844. "lsl r9, r12, #16\n\t"
  84845. "lsr r9, r9, #16\n\t"
  84846. "mul r8, r9, r8\n\t"
  84847. "lsr r9, r8, #16\n\t"
  84848. "lsl r8, r8, #16\n\t"
  84849. "adds r5, r5, r8\n\t"
  84850. "adc r6, r6, r9\n\t"
  84851. #else
  84852. "umull r5, r6, r10, r12\n\t"
  84853. #endif
  84854. "mov r4, #0\n\t"
  84855. "mov r7, #0\n\t"
  84856. /* A[1] * A[5] */
  84857. "ldr r10, [%[a], #20]\n\t"
  84858. "ldr r12, [%[a], #4]\n\t"
  84859. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  84860. "lsl r8, r10, #16\n\t"
  84861. "lsl r9, r12, #16\n\t"
  84862. "lsr r8, r8, #16\n\t"
  84863. "lsr r9, r9, #16\n\t"
  84864. "mul r9, r8, r9\n\t"
  84865. "adds r5, r5, r9\n\t"
  84866. "adcs r6, r6, #0\n\t"
  84867. "adc r7, r7, #0\n\t"
  84868. "lsr r9, r12, #16\n\t"
  84869. "mul r8, r9, r8\n\t"
  84870. "lsr r9, r8, #16\n\t"
  84871. "lsl r8, r8, #16\n\t"
  84872. "adds r5, r5, r8\n\t"
  84873. "adcs r6, r6, r9\n\t"
  84874. "adc r7, r7, #0\n\t"
  84875. "lsr r8, r10, #16\n\t"
  84876. "lsr r9, r12, #16\n\t"
  84877. "mul r9, r8, r9\n\t"
  84878. "adds r6, r6, r9\n\t"
  84879. "adc r7, r7, #0\n\t"
  84880. "lsl r9, r12, #16\n\t"
  84881. "lsr r9, r9, #16\n\t"
  84882. "mul r8, r9, r8\n\t"
  84883. "lsr r9, r8, #16\n\t"
  84884. "lsl r8, r8, #16\n\t"
  84885. "adds r5, r5, r8\n\t"
  84886. "adcs r6, r6, r9\n\t"
  84887. "adc r7, r7, #0\n\t"
  84888. #else
  84889. "umull r8, r9, r10, r12\n\t"
  84890. "adds r5, r5, r8\n\t"
  84891. "adcs r6, r6, r9\n\t"
  84892. "adc r7, r7, #0\n\t"
  84893. #endif
  84894. /* A[2] * A[4] */
  84895. "ldr r10, [%[a], #16]\n\t"
  84896. "ldr r12, [%[a], #8]\n\t"
  84897. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  84898. "lsl r8, r10, #16\n\t"
  84899. "lsl r9, r12, #16\n\t"
  84900. "lsr r8, r8, #16\n\t"
  84901. "lsr r9, r9, #16\n\t"
  84902. "mul r9, r8, r9\n\t"
  84903. "adds r5, r5, r9\n\t"
  84904. "adcs r6, r6, #0\n\t"
  84905. "adc r7, r7, #0\n\t"
  84906. "lsr r9, r12, #16\n\t"
  84907. "mul r8, r9, r8\n\t"
  84908. "lsr r9, r8, #16\n\t"
  84909. "lsl r8, r8, #16\n\t"
  84910. "adds r5, r5, r8\n\t"
  84911. "adcs r6, r6, r9\n\t"
  84912. "adc r7, r7, #0\n\t"
  84913. "lsr r8, r10, #16\n\t"
  84914. "lsr r9, r12, #16\n\t"
  84915. "mul r9, r8, r9\n\t"
  84916. "adds r6, r6, r9\n\t"
  84917. "adc r7, r7, #0\n\t"
  84918. "lsl r9, r12, #16\n\t"
  84919. "lsr r9, r9, #16\n\t"
  84920. "mul r8, r9, r8\n\t"
  84921. "lsr r9, r8, #16\n\t"
  84922. "lsl r8, r8, #16\n\t"
  84923. "adds r5, r5, r8\n\t"
  84924. "adcs r6, r6, r9\n\t"
  84925. "adc r7, r7, #0\n\t"
  84926. #else
  84927. "umull r8, r9, r10, r12\n\t"
  84928. "adds r5, r5, r8\n\t"
  84929. "adcs r6, r6, r9\n\t"
  84930. "adc r7, r7, #0\n\t"
  84931. #endif
  84932. /* A[3] * A[3] */
  84933. "ldr r10, [%[a], #12]\n\t"
  84934. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  84935. "lsl r8, r10, #16\n\t"
  84936. "lsr r9, r10, #16\n\t"
  84937. "lsr r8, r8, #16\n\t"
  84938. "mov r12, r8\n\t"
  84939. "mul r8, r12, r8\n\t"
  84940. "mov r12, r9\n\t"
  84941. "mul r9, r12, r9\n\t"
  84942. "adds r2, r2, r8\n\t"
  84943. "adcs r3, r3, r9\n\t"
  84944. "adc r4, r4, #0\n\t"
  84945. "lsr r9, r10, #16\n\t"
  84946. "lsl r8, r10, #16\n\t"
  84947. "lsr r8, r8, #16\n\t"
  84948. "mul r8, r9, r8\n\t"
  84949. "lsr r9, r8, #15\n\t"
  84950. "lsl r8, r8, #17\n\t"
  84951. "adds r2, r2, r8\n\t"
  84952. "adcs r3, r3, r9\n\t"
  84953. "adc r4, r4, #0\n\t"
  84954. "adds r5, r5, r5\n\t"
  84955. "adcs r6, r6, r6\n\t"
  84956. "adc r7, r7, r7\n\t"
  84957. #else
  84958. "umull r8, r9, r10, r10\n\t"
  84959. "adds r5, r5, r5\n\t"
  84960. "adcs r6, r6, r6\n\t"
  84961. "adc r7, r7, r7\n\t"
  84962. "adds r2, r2, r8\n\t"
  84963. "adcs r3, r3, r9\n\t"
  84964. "adc r4, r4, #0\n\t"
  84965. #endif
  84966. "adds r2, r2, r5\n\t"
  84967. "adcs r3, r3, r6\n\t"
  84968. "adc r4, r4, r7\n\t"
  84969. "str r2, [sp, #24]\n\t"
  84970. /* A[0] * A[7] */
  84971. "ldr r10, [%[a], #28]\n\t"
  84972. "ldr r12, [%[a]]\n\t"
  84973. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  84974. "lsl r8, r10, #16\n\t"
  84975. "lsl r5, r12, #16\n\t"
  84976. "lsr r8, r8, #16\n\t"
  84977. "lsr r5, r5, #16\n\t"
  84978. "mul r5, r8, r5\n\t"
  84979. "lsr r9, r12, #16\n\t"
  84980. "mul r8, r9, r8\n\t"
  84981. "lsr r6, r8, #16\n\t"
  84982. "lsl r8, r8, #16\n\t"
  84983. "adds r5, r5, r8\n\t"
  84984. "adc r6, r6, #0\n\t"
  84985. "lsr r8, r10, #16\n\t"
  84986. "mul r9, r8, r9\n\t"
  84987. "add r6, r6, r9\n\t"
  84988. "lsl r9, r12, #16\n\t"
  84989. "lsr r9, r9, #16\n\t"
  84990. "mul r8, r9, r8\n\t"
  84991. "lsr r9, r8, #16\n\t"
  84992. "lsl r8, r8, #16\n\t"
  84993. "adds r5, r5, r8\n\t"
  84994. "adc r6, r6, r9\n\t"
  84995. #else
  84996. "umull r5, r6, r10, r12\n\t"
  84997. #endif
  84998. "mov r2, #0\n\t"
  84999. "mov r7, #0\n\t"
  85000. /* A[1] * A[6] */
  85001. "ldr r10, [%[a], #24]\n\t"
  85002. "ldr r12, [%[a], #4]\n\t"
  85003. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  85004. "lsl r8, r10, #16\n\t"
  85005. "lsl r9, r12, #16\n\t"
  85006. "lsr r8, r8, #16\n\t"
  85007. "lsr r9, r9, #16\n\t"
  85008. "mul r9, r8, r9\n\t"
  85009. "adds r5, r5, r9\n\t"
  85010. "adcs r6, r6, #0\n\t"
  85011. "adc r7, r7, #0\n\t"
  85012. "lsr r9, r12, #16\n\t"
  85013. "mul r8, r9, r8\n\t"
  85014. "lsr r9, r8, #16\n\t"
  85015. "lsl r8, r8, #16\n\t"
  85016. "adds r5, r5, r8\n\t"
  85017. "adcs r6, r6, r9\n\t"
  85018. "adc r7, r7, #0\n\t"
  85019. "lsr r8, r10, #16\n\t"
  85020. "lsr r9, r12, #16\n\t"
  85021. "mul r9, r8, r9\n\t"
  85022. "adds r6, r6, r9\n\t"
  85023. "adc r7, r7, #0\n\t"
  85024. "lsl r9, r12, #16\n\t"
  85025. "lsr r9, r9, #16\n\t"
  85026. "mul r8, r9, r8\n\t"
  85027. "lsr r9, r8, #16\n\t"
  85028. "lsl r8, r8, #16\n\t"
  85029. "adds r5, r5, r8\n\t"
  85030. "adcs r6, r6, r9\n\t"
  85031. "adc r7, r7, #0\n\t"
  85032. #else
  85033. "umull r8, r9, r10, r12\n\t"
  85034. "adds r5, r5, r8\n\t"
  85035. "adcs r6, r6, r9\n\t"
  85036. "adc r7, r7, #0\n\t"
  85037. #endif
  85038. /* A[2] * A[5] */
  85039. "ldr r10, [%[a], #20]\n\t"
  85040. "ldr r12, [%[a], #8]\n\t"
  85041. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  85042. "lsl r8, r10, #16\n\t"
  85043. "lsl r9, r12, #16\n\t"
  85044. "lsr r8, r8, #16\n\t"
  85045. "lsr r9, r9, #16\n\t"
  85046. "mul r9, r8, r9\n\t"
  85047. "adds r5, r5, r9\n\t"
  85048. "adcs r6, r6, #0\n\t"
  85049. "adc r7, r7, #0\n\t"
  85050. "lsr r9, r12, #16\n\t"
  85051. "mul r8, r9, r8\n\t"
  85052. "lsr r9, r8, #16\n\t"
  85053. "lsl r8, r8, #16\n\t"
  85054. "adds r5, r5, r8\n\t"
  85055. "adcs r6, r6, r9\n\t"
  85056. "adc r7, r7, #0\n\t"
  85057. "lsr r8, r10, #16\n\t"
  85058. "lsr r9, r12, #16\n\t"
  85059. "mul r9, r8, r9\n\t"
  85060. "adds r6, r6, r9\n\t"
  85061. "adc r7, r7, #0\n\t"
  85062. "lsl r9, r12, #16\n\t"
  85063. "lsr r9, r9, #16\n\t"
  85064. "mul r8, r9, r8\n\t"
  85065. "lsr r9, r8, #16\n\t"
  85066. "lsl r8, r8, #16\n\t"
  85067. "adds r5, r5, r8\n\t"
  85068. "adcs r6, r6, r9\n\t"
  85069. "adc r7, r7, #0\n\t"
  85070. #else
  85071. "umull r8, r9, r10, r12\n\t"
  85072. "adds r5, r5, r8\n\t"
  85073. "adcs r6, r6, r9\n\t"
  85074. "adc r7, r7, #0\n\t"
  85075. #endif
  85076. /* A[3] * A[4] */
  85077. "ldr r10, [%[a], #16]\n\t"
  85078. "ldr r12, [%[a], #12]\n\t"
  85079. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  85080. "lsl r8, r10, #16\n\t"
  85081. "lsl r9, r12, #16\n\t"
  85082. "lsr r8, r8, #16\n\t"
  85083. "lsr r9, r9, #16\n\t"
  85084. "mul r9, r8, r9\n\t"
  85085. "adds r5, r5, r9\n\t"
  85086. "adcs r6, r6, #0\n\t"
  85087. "adc r7, r7, #0\n\t"
  85088. "lsr r9, r12, #16\n\t"
  85089. "mul r8, r9, r8\n\t"
  85090. "lsr r9, r8, #16\n\t"
  85091. "lsl r8, r8, #16\n\t"
  85092. "adds r5, r5, r8\n\t"
  85093. "adcs r6, r6, r9\n\t"
  85094. "adc r7, r7, #0\n\t"
  85095. "lsr r8, r10, #16\n\t"
  85096. "lsr r9, r12, #16\n\t"
  85097. "mul r9, r8, r9\n\t"
  85098. "adds r6, r6, r9\n\t"
  85099. "adc r7, r7, #0\n\t"
  85100. "lsl r9, r12, #16\n\t"
  85101. "lsr r9, r9, #16\n\t"
  85102. "mul r8, r9, r8\n\t"
  85103. "lsr r9, r8, #16\n\t"
  85104. "lsl r8, r8, #16\n\t"
  85105. "adds r5, r5, r8\n\t"
  85106. "adcs r6, r6, r9\n\t"
  85107. "adc r7, r7, #0\n\t"
  85108. #else
  85109. "umull r8, r9, r10, r12\n\t"
  85110. "adds r5, r5, r8\n\t"
  85111. "adcs r6, r6, r9\n\t"
  85112. "adc r7, r7, #0\n\t"
  85113. #endif
  85114. "adds r5, r5, r5\n\t"
  85115. "adcs r6, r6, r6\n\t"
  85116. "adc r7, r7, r7\n\t"
  85117. "adds r3, r3, r5\n\t"
  85118. "adcs r4, r4, r6\n\t"
  85119. "adc r2, r2, r7\n\t"
  85120. "str r3, [sp, #28]\n\t"
  85121. /* A[0] * A[8] */
  85122. "ldr r10, [%[a], #32]\n\t"
  85123. "ldr r12, [%[a]]\n\t"
  85124. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  85125. "lsl r8, r10, #16\n\t"
  85126. "lsl r5, r12, #16\n\t"
  85127. "lsr r8, r8, #16\n\t"
  85128. "lsr r5, r5, #16\n\t"
  85129. "mul r5, r8, r5\n\t"
  85130. "lsr r9, r12, #16\n\t"
  85131. "mul r8, r9, r8\n\t"
  85132. "lsr r6, r8, #16\n\t"
  85133. "lsl r8, r8, #16\n\t"
  85134. "adds r5, r5, r8\n\t"
  85135. "adc r6, r6, #0\n\t"
  85136. "lsr r8, r10, #16\n\t"
  85137. "mul r9, r8, r9\n\t"
  85138. "add r6, r6, r9\n\t"
  85139. "lsl r9, r12, #16\n\t"
  85140. "lsr r9, r9, #16\n\t"
  85141. "mul r8, r9, r8\n\t"
  85142. "lsr r9, r8, #16\n\t"
  85143. "lsl r8, r8, #16\n\t"
  85144. "adds r5, r5, r8\n\t"
  85145. "adc r6, r6, r9\n\t"
  85146. #else
  85147. "umull r5, r6, r10, r12\n\t"
  85148. #endif
  85149. "mov r3, #0\n\t"
  85150. "mov r7, #0\n\t"
  85151. /* A[1] * A[7] */
  85152. "ldr r10, [%[a], #28]\n\t"
  85153. "ldr r12, [%[a], #4]\n\t"
  85154. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  85155. "lsl r8, r10, #16\n\t"
  85156. "lsl r9, r12, #16\n\t"
  85157. "lsr r8, r8, #16\n\t"
  85158. "lsr r9, r9, #16\n\t"
  85159. "mul r9, r8, r9\n\t"
  85160. "adds r5, r5, r9\n\t"
  85161. "adcs r6, r6, #0\n\t"
  85162. "adc r7, r7, #0\n\t"
  85163. "lsr r9, r12, #16\n\t"
  85164. "mul r8, r9, r8\n\t"
  85165. "lsr r9, r8, #16\n\t"
  85166. "lsl r8, r8, #16\n\t"
  85167. "adds r5, r5, r8\n\t"
  85168. "adcs r6, r6, r9\n\t"
  85169. "adc r7, r7, #0\n\t"
  85170. "lsr r8, r10, #16\n\t"
  85171. "lsr r9, r12, #16\n\t"
  85172. "mul r9, r8, r9\n\t"
  85173. "adds r6, r6, r9\n\t"
  85174. "adc r7, r7, #0\n\t"
  85175. "lsl r9, r12, #16\n\t"
  85176. "lsr r9, r9, #16\n\t"
  85177. "mul r8, r9, r8\n\t"
  85178. "lsr r9, r8, #16\n\t"
  85179. "lsl r8, r8, #16\n\t"
  85180. "adds r5, r5, r8\n\t"
  85181. "adcs r6, r6, r9\n\t"
  85182. "adc r7, r7, #0\n\t"
  85183. #else
  85184. "umull r8, r9, r10, r12\n\t"
  85185. "adds r5, r5, r8\n\t"
  85186. "adcs r6, r6, r9\n\t"
  85187. "adc r7, r7, #0\n\t"
  85188. #endif
  85189. /* A[2] * A[6] */
  85190. "ldr r10, [%[a], #24]\n\t"
  85191. "ldr r12, [%[a], #8]\n\t"
  85192. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  85193. "lsl r8, r10, #16\n\t"
  85194. "lsl r9, r12, #16\n\t"
  85195. "lsr r8, r8, #16\n\t"
  85196. "lsr r9, r9, #16\n\t"
  85197. "mul r9, r8, r9\n\t"
  85198. "adds r5, r5, r9\n\t"
  85199. "adcs r6, r6, #0\n\t"
  85200. "adc r7, r7, #0\n\t"
  85201. "lsr r9, r12, #16\n\t"
  85202. "mul r8, r9, r8\n\t"
  85203. "lsr r9, r8, #16\n\t"
  85204. "lsl r8, r8, #16\n\t"
  85205. "adds r5, r5, r8\n\t"
  85206. "adcs r6, r6, r9\n\t"
  85207. "adc r7, r7, #0\n\t"
  85208. "lsr r8, r10, #16\n\t"
  85209. "lsr r9, r12, #16\n\t"
  85210. "mul r9, r8, r9\n\t"
  85211. "adds r6, r6, r9\n\t"
  85212. "adc r7, r7, #0\n\t"
  85213. "lsl r9, r12, #16\n\t"
  85214. "lsr r9, r9, #16\n\t"
  85215. "mul r8, r9, r8\n\t"
  85216. "lsr r9, r8, #16\n\t"
  85217. "lsl r8, r8, #16\n\t"
  85218. "adds r5, r5, r8\n\t"
  85219. "adcs r6, r6, r9\n\t"
  85220. "adc r7, r7, #0\n\t"
  85221. #else
  85222. "umull r8, r9, r10, r12\n\t"
  85223. "adds r5, r5, r8\n\t"
  85224. "adcs r6, r6, r9\n\t"
  85225. "adc r7, r7, #0\n\t"
  85226. #endif
  85227. /* A[3] * A[5] */
  85228. "ldr r10, [%[a], #20]\n\t"
  85229. "ldr r12, [%[a], #12]\n\t"
  85230. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  85231. "lsl r8, r10, #16\n\t"
  85232. "lsl r9, r12, #16\n\t"
  85233. "lsr r8, r8, #16\n\t"
  85234. "lsr r9, r9, #16\n\t"
  85235. "mul r9, r8, r9\n\t"
  85236. "adds r5, r5, r9\n\t"
  85237. "adcs r6, r6, #0\n\t"
  85238. "adc r7, r7, #0\n\t"
  85239. "lsr r9, r12, #16\n\t"
  85240. "mul r8, r9, r8\n\t"
  85241. "lsr r9, r8, #16\n\t"
  85242. "lsl r8, r8, #16\n\t"
  85243. "adds r5, r5, r8\n\t"
  85244. "adcs r6, r6, r9\n\t"
  85245. "adc r7, r7, #0\n\t"
  85246. "lsr r8, r10, #16\n\t"
  85247. "lsr r9, r12, #16\n\t"
  85248. "mul r9, r8, r9\n\t"
  85249. "adds r6, r6, r9\n\t"
  85250. "adc r7, r7, #0\n\t"
  85251. "lsl r9, r12, #16\n\t"
  85252. "lsr r9, r9, #16\n\t"
  85253. "mul r8, r9, r8\n\t"
  85254. "lsr r9, r8, #16\n\t"
  85255. "lsl r8, r8, #16\n\t"
  85256. "adds r5, r5, r8\n\t"
  85257. "adcs r6, r6, r9\n\t"
  85258. "adc r7, r7, #0\n\t"
  85259. #else
  85260. "umull r8, r9, r10, r12\n\t"
  85261. "adds r5, r5, r8\n\t"
  85262. "adcs r6, r6, r9\n\t"
  85263. "adc r7, r7, #0\n\t"
  85264. #endif
  85265. /* A[4] * A[4] */
  85266. "ldr r10, [%[a], #16]\n\t"
  85267. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  85268. "lsl r8, r10, #16\n\t"
  85269. "lsr r9, r10, #16\n\t"
  85270. "lsr r8, r8, #16\n\t"
  85271. "mov r12, r8\n\t"
  85272. "mul r8, r12, r8\n\t"
  85273. "mov r12, r9\n\t"
  85274. "mul r9, r12, r9\n\t"
  85275. "adds r4, r4, r8\n\t"
  85276. "adcs r2, r2, r9\n\t"
  85277. "adc r3, r3, #0\n\t"
  85278. "lsr r9, r10, #16\n\t"
  85279. "lsl r8, r10, #16\n\t"
  85280. "lsr r8, r8, #16\n\t"
  85281. "mul r8, r9, r8\n\t"
  85282. "lsr r9, r8, #15\n\t"
  85283. "lsl r8, r8, #17\n\t"
  85284. "adds r4, r4, r8\n\t"
  85285. "adcs r2, r2, r9\n\t"
  85286. "adc r3, r3, #0\n\t"
  85287. "adds r5, r5, r5\n\t"
  85288. "adcs r6, r6, r6\n\t"
  85289. "adc r7, r7, r7\n\t"
  85290. #else
  85291. "umull r8, r9, r10, r10\n\t"
  85292. "adds r5, r5, r5\n\t"
  85293. "adcs r6, r6, r6\n\t"
  85294. "adc r7, r7, r7\n\t"
  85295. "adds r4, r4, r8\n\t"
  85296. "adcs r2, r2, r9\n\t"
  85297. "adc r3, r3, #0\n\t"
  85298. #endif
  85299. "adds r4, r4, r5\n\t"
  85300. "adcs r2, r2, r6\n\t"
  85301. "adc r3, r3, r7\n\t"
  85302. "str r4, [sp, #32]\n\t"
  85303. /* A[0] * A[9] */
  85304. "ldr r10, [%[a], #36]\n\t"
  85305. "ldr r12, [%[a]]\n\t"
  85306. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  85307. "lsl r8, r10, #16\n\t"
  85308. "lsl r5, r12, #16\n\t"
  85309. "lsr r8, r8, #16\n\t"
  85310. "lsr r5, r5, #16\n\t"
  85311. "mul r5, r8, r5\n\t"
  85312. "lsr r9, r12, #16\n\t"
  85313. "mul r8, r9, r8\n\t"
  85314. "lsr r6, r8, #16\n\t"
  85315. "lsl r8, r8, #16\n\t"
  85316. "adds r5, r5, r8\n\t"
  85317. "adc r6, r6, #0\n\t"
  85318. "lsr r8, r10, #16\n\t"
  85319. "mul r9, r8, r9\n\t"
  85320. "add r6, r6, r9\n\t"
  85321. "lsl r9, r12, #16\n\t"
  85322. "lsr r9, r9, #16\n\t"
  85323. "mul r8, r9, r8\n\t"
  85324. "lsr r9, r8, #16\n\t"
  85325. "lsl r8, r8, #16\n\t"
  85326. "adds r5, r5, r8\n\t"
  85327. "adc r6, r6, r9\n\t"
  85328. #else
  85329. "umull r5, r6, r10, r12\n\t"
  85330. #endif
  85331. "mov r4, #0\n\t"
  85332. "mov r7, #0\n\t"
  85333. /* A[1] * A[8] */
  85334. "ldr r10, [%[a], #32]\n\t"
  85335. "ldr r12, [%[a], #4]\n\t"
  85336. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  85337. "lsl r8, r10, #16\n\t"
  85338. "lsl r9, r12, #16\n\t"
  85339. "lsr r8, r8, #16\n\t"
  85340. "lsr r9, r9, #16\n\t"
  85341. "mul r9, r8, r9\n\t"
  85342. "adds r5, r5, r9\n\t"
  85343. "adcs r6, r6, #0\n\t"
  85344. "adc r7, r7, #0\n\t"
  85345. "lsr r9, r12, #16\n\t"
  85346. "mul r8, r9, r8\n\t"
  85347. "lsr r9, r8, #16\n\t"
  85348. "lsl r8, r8, #16\n\t"
  85349. "adds r5, r5, r8\n\t"
  85350. "adcs r6, r6, r9\n\t"
  85351. "adc r7, r7, #0\n\t"
  85352. "lsr r8, r10, #16\n\t"
  85353. "lsr r9, r12, #16\n\t"
  85354. "mul r9, r8, r9\n\t"
  85355. "adds r6, r6, r9\n\t"
  85356. "adc r7, r7, #0\n\t"
  85357. "lsl r9, r12, #16\n\t"
  85358. "lsr r9, r9, #16\n\t"
  85359. "mul r8, r9, r8\n\t"
  85360. "lsr r9, r8, #16\n\t"
  85361. "lsl r8, r8, #16\n\t"
  85362. "adds r5, r5, r8\n\t"
  85363. "adcs r6, r6, r9\n\t"
  85364. "adc r7, r7, #0\n\t"
  85365. #else
  85366. "umull r8, r9, r10, r12\n\t"
  85367. "adds r5, r5, r8\n\t"
  85368. "adcs r6, r6, r9\n\t"
  85369. "adc r7, r7, #0\n\t"
  85370. #endif
  85371. /* A[2] * A[7] */
  85372. "ldr r10, [%[a], #28]\n\t"
  85373. "ldr r12, [%[a], #8]\n\t"
  85374. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  85375. "lsl r8, r10, #16\n\t"
  85376. "lsl r9, r12, #16\n\t"
  85377. "lsr r8, r8, #16\n\t"
  85378. "lsr r9, r9, #16\n\t"
  85379. "mul r9, r8, r9\n\t"
  85380. "adds r5, r5, r9\n\t"
  85381. "adcs r6, r6, #0\n\t"
  85382. "adc r7, r7, #0\n\t"
  85383. "lsr r9, r12, #16\n\t"
  85384. "mul r8, r9, r8\n\t"
  85385. "lsr r9, r8, #16\n\t"
  85386. "lsl r8, r8, #16\n\t"
  85387. "adds r5, r5, r8\n\t"
  85388. "adcs r6, r6, r9\n\t"
  85389. "adc r7, r7, #0\n\t"
  85390. "lsr r8, r10, #16\n\t"
  85391. "lsr r9, r12, #16\n\t"
  85392. "mul r9, r8, r9\n\t"
  85393. "adds r6, r6, r9\n\t"
  85394. "adc r7, r7, #0\n\t"
  85395. "lsl r9, r12, #16\n\t"
  85396. "lsr r9, r9, #16\n\t"
  85397. "mul r8, r9, r8\n\t"
  85398. "lsr r9, r8, #16\n\t"
  85399. "lsl r8, r8, #16\n\t"
  85400. "adds r5, r5, r8\n\t"
  85401. "adcs r6, r6, r9\n\t"
  85402. "adc r7, r7, #0\n\t"
  85403. #else
  85404. "umull r8, r9, r10, r12\n\t"
  85405. "adds r5, r5, r8\n\t"
  85406. "adcs r6, r6, r9\n\t"
  85407. "adc r7, r7, #0\n\t"
  85408. #endif
  85409. /* A[3] * A[6] */
  85410. "ldr r10, [%[a], #24]\n\t"
  85411. "ldr r12, [%[a], #12]\n\t"
  85412. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  85413. "lsl r8, r10, #16\n\t"
  85414. "lsl r9, r12, #16\n\t"
  85415. "lsr r8, r8, #16\n\t"
  85416. "lsr r9, r9, #16\n\t"
  85417. "mul r9, r8, r9\n\t"
  85418. "adds r5, r5, r9\n\t"
  85419. "adcs r6, r6, #0\n\t"
  85420. "adc r7, r7, #0\n\t"
  85421. "lsr r9, r12, #16\n\t"
  85422. "mul r8, r9, r8\n\t"
  85423. "lsr r9, r8, #16\n\t"
  85424. "lsl r8, r8, #16\n\t"
  85425. "adds r5, r5, r8\n\t"
  85426. "adcs r6, r6, r9\n\t"
  85427. "adc r7, r7, #0\n\t"
  85428. "lsr r8, r10, #16\n\t"
  85429. "lsr r9, r12, #16\n\t"
  85430. "mul r9, r8, r9\n\t"
  85431. "adds r6, r6, r9\n\t"
  85432. "adc r7, r7, #0\n\t"
  85433. "lsl r9, r12, #16\n\t"
  85434. "lsr r9, r9, #16\n\t"
  85435. "mul r8, r9, r8\n\t"
  85436. "lsr r9, r8, #16\n\t"
  85437. "lsl r8, r8, #16\n\t"
  85438. "adds r5, r5, r8\n\t"
  85439. "adcs r6, r6, r9\n\t"
  85440. "adc r7, r7, #0\n\t"
  85441. #else
  85442. "umull r8, r9, r10, r12\n\t"
  85443. "adds r5, r5, r8\n\t"
  85444. "adcs r6, r6, r9\n\t"
  85445. "adc r7, r7, #0\n\t"
  85446. #endif
  85447. /* A[4] * A[5] */
  85448. "ldr r10, [%[a], #20]\n\t"
  85449. "ldr r12, [%[a], #16]\n\t"
  85450. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  85451. "lsl r8, r10, #16\n\t"
  85452. "lsl r9, r12, #16\n\t"
  85453. "lsr r8, r8, #16\n\t"
  85454. "lsr r9, r9, #16\n\t"
  85455. "mul r9, r8, r9\n\t"
  85456. "adds r5, r5, r9\n\t"
  85457. "adcs r6, r6, #0\n\t"
  85458. "adc r7, r7, #0\n\t"
  85459. "lsr r9, r12, #16\n\t"
  85460. "mul r8, r9, r8\n\t"
  85461. "lsr r9, r8, #16\n\t"
  85462. "lsl r8, r8, #16\n\t"
  85463. "adds r5, r5, r8\n\t"
  85464. "adcs r6, r6, r9\n\t"
  85465. "adc r7, r7, #0\n\t"
  85466. "lsr r8, r10, #16\n\t"
  85467. "lsr r9, r12, #16\n\t"
  85468. "mul r9, r8, r9\n\t"
  85469. "adds r6, r6, r9\n\t"
  85470. "adc r7, r7, #0\n\t"
  85471. "lsl r9, r12, #16\n\t"
  85472. "lsr r9, r9, #16\n\t"
  85473. "mul r8, r9, r8\n\t"
  85474. "lsr r9, r8, #16\n\t"
  85475. "lsl r8, r8, #16\n\t"
  85476. "adds r5, r5, r8\n\t"
  85477. "adcs r6, r6, r9\n\t"
  85478. "adc r7, r7, #0\n\t"
  85479. #else
  85480. "umull r8, r9, r10, r12\n\t"
  85481. "adds r5, r5, r8\n\t"
  85482. "adcs r6, r6, r9\n\t"
  85483. "adc r7, r7, #0\n\t"
  85484. #endif
  85485. "adds r5, r5, r5\n\t"
  85486. "adcs r6, r6, r6\n\t"
  85487. "adc r7, r7, r7\n\t"
  85488. "adds r2, r2, r5\n\t"
  85489. "adcs r3, r3, r6\n\t"
  85490. "adc r4, r4, r7\n\t"
  85491. "str r2, [sp, #36]\n\t"
  85492. /* A[0] * A[10] */
  85493. "ldr r10, [%[a], #40]\n\t"
  85494. "ldr r12, [%[a]]\n\t"
  85495. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  85496. "lsl r8, r10, #16\n\t"
  85497. "lsl r5, r12, #16\n\t"
  85498. "lsr r8, r8, #16\n\t"
  85499. "lsr r5, r5, #16\n\t"
  85500. "mul r5, r8, r5\n\t"
  85501. "lsr r9, r12, #16\n\t"
  85502. "mul r8, r9, r8\n\t"
  85503. "lsr r6, r8, #16\n\t"
  85504. "lsl r8, r8, #16\n\t"
  85505. "adds r5, r5, r8\n\t"
  85506. "adc r6, r6, #0\n\t"
  85507. "lsr r8, r10, #16\n\t"
  85508. "mul r9, r8, r9\n\t"
  85509. "add r6, r6, r9\n\t"
  85510. "lsl r9, r12, #16\n\t"
  85511. "lsr r9, r9, #16\n\t"
  85512. "mul r8, r9, r8\n\t"
  85513. "lsr r9, r8, #16\n\t"
  85514. "lsl r8, r8, #16\n\t"
  85515. "adds r5, r5, r8\n\t"
  85516. "adc r6, r6, r9\n\t"
  85517. #else
  85518. "umull r5, r6, r10, r12\n\t"
  85519. #endif
  85520. "mov r2, #0\n\t"
  85521. "mov r7, #0\n\t"
  85522. /* A[1] * A[9] */
  85523. "ldr r10, [%[a], #36]\n\t"
  85524. "ldr r12, [%[a], #4]\n\t"
  85525. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  85526. "lsl r8, r10, #16\n\t"
  85527. "lsl r9, r12, #16\n\t"
  85528. "lsr r8, r8, #16\n\t"
  85529. "lsr r9, r9, #16\n\t"
  85530. "mul r9, r8, r9\n\t"
  85531. "adds r5, r5, r9\n\t"
  85532. "adcs r6, r6, #0\n\t"
  85533. "adc r7, r7, #0\n\t"
  85534. "lsr r9, r12, #16\n\t"
  85535. "mul r8, r9, r8\n\t"
  85536. "lsr r9, r8, #16\n\t"
  85537. "lsl r8, r8, #16\n\t"
  85538. "adds r5, r5, r8\n\t"
  85539. "adcs r6, r6, r9\n\t"
  85540. "adc r7, r7, #0\n\t"
  85541. "lsr r8, r10, #16\n\t"
  85542. "lsr r9, r12, #16\n\t"
  85543. "mul r9, r8, r9\n\t"
  85544. "adds r6, r6, r9\n\t"
  85545. "adc r7, r7, #0\n\t"
  85546. "lsl r9, r12, #16\n\t"
  85547. "lsr r9, r9, #16\n\t"
  85548. "mul r8, r9, r8\n\t"
  85549. "lsr r9, r8, #16\n\t"
  85550. "lsl r8, r8, #16\n\t"
  85551. "adds r5, r5, r8\n\t"
  85552. "adcs r6, r6, r9\n\t"
  85553. "adc r7, r7, #0\n\t"
  85554. #else
  85555. "umull r8, r9, r10, r12\n\t"
  85556. "adds r5, r5, r8\n\t"
  85557. "adcs r6, r6, r9\n\t"
  85558. "adc r7, r7, #0\n\t"
  85559. #endif
  85560. /* A[2] * A[8] */
  85561. "ldr r10, [%[a], #32]\n\t"
  85562. "ldr r12, [%[a], #8]\n\t"
  85563. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  85564. "lsl r8, r10, #16\n\t"
  85565. "lsl r9, r12, #16\n\t"
  85566. "lsr r8, r8, #16\n\t"
  85567. "lsr r9, r9, #16\n\t"
  85568. "mul r9, r8, r9\n\t"
  85569. "adds r5, r5, r9\n\t"
  85570. "adcs r6, r6, #0\n\t"
  85571. "adc r7, r7, #0\n\t"
  85572. "lsr r9, r12, #16\n\t"
  85573. "mul r8, r9, r8\n\t"
  85574. "lsr r9, r8, #16\n\t"
  85575. "lsl r8, r8, #16\n\t"
  85576. "adds r5, r5, r8\n\t"
  85577. "adcs r6, r6, r9\n\t"
  85578. "adc r7, r7, #0\n\t"
  85579. "lsr r8, r10, #16\n\t"
  85580. "lsr r9, r12, #16\n\t"
  85581. "mul r9, r8, r9\n\t"
  85582. "adds r6, r6, r9\n\t"
  85583. "adc r7, r7, #0\n\t"
  85584. "lsl r9, r12, #16\n\t"
  85585. "lsr r9, r9, #16\n\t"
  85586. "mul r8, r9, r8\n\t"
  85587. "lsr r9, r8, #16\n\t"
  85588. "lsl r8, r8, #16\n\t"
  85589. "adds r5, r5, r8\n\t"
  85590. "adcs r6, r6, r9\n\t"
  85591. "adc r7, r7, #0\n\t"
  85592. #else
  85593. "umull r8, r9, r10, r12\n\t"
  85594. "adds r5, r5, r8\n\t"
  85595. "adcs r6, r6, r9\n\t"
  85596. "adc r7, r7, #0\n\t"
  85597. #endif
  85598. /* A[3] * A[7] */
  85599. "ldr r10, [%[a], #28]\n\t"
  85600. "ldr r12, [%[a], #12]\n\t"
  85601. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  85602. "lsl r8, r10, #16\n\t"
  85603. "lsl r9, r12, #16\n\t"
  85604. "lsr r8, r8, #16\n\t"
  85605. "lsr r9, r9, #16\n\t"
  85606. "mul r9, r8, r9\n\t"
  85607. "adds r5, r5, r9\n\t"
  85608. "adcs r6, r6, #0\n\t"
  85609. "adc r7, r7, #0\n\t"
  85610. "lsr r9, r12, #16\n\t"
  85611. "mul r8, r9, r8\n\t"
  85612. "lsr r9, r8, #16\n\t"
  85613. "lsl r8, r8, #16\n\t"
  85614. "adds r5, r5, r8\n\t"
  85615. "adcs r6, r6, r9\n\t"
  85616. "adc r7, r7, #0\n\t"
  85617. "lsr r8, r10, #16\n\t"
  85618. "lsr r9, r12, #16\n\t"
  85619. "mul r9, r8, r9\n\t"
  85620. "adds r6, r6, r9\n\t"
  85621. "adc r7, r7, #0\n\t"
  85622. "lsl r9, r12, #16\n\t"
  85623. "lsr r9, r9, #16\n\t"
  85624. "mul r8, r9, r8\n\t"
  85625. "lsr r9, r8, #16\n\t"
  85626. "lsl r8, r8, #16\n\t"
  85627. "adds r5, r5, r8\n\t"
  85628. "adcs r6, r6, r9\n\t"
  85629. "adc r7, r7, #0\n\t"
  85630. #else
  85631. "umull r8, r9, r10, r12\n\t"
  85632. "adds r5, r5, r8\n\t"
  85633. "adcs r6, r6, r9\n\t"
  85634. "adc r7, r7, #0\n\t"
  85635. #endif
  85636. /* A[4] * A[6] */
  85637. "ldr r10, [%[a], #24]\n\t"
  85638. "ldr r12, [%[a], #16]\n\t"
  85639. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  85640. "lsl r8, r10, #16\n\t"
  85641. "lsl r9, r12, #16\n\t"
  85642. "lsr r8, r8, #16\n\t"
  85643. "lsr r9, r9, #16\n\t"
  85644. "mul r9, r8, r9\n\t"
  85645. "adds r5, r5, r9\n\t"
  85646. "adcs r6, r6, #0\n\t"
  85647. "adc r7, r7, #0\n\t"
  85648. "lsr r9, r12, #16\n\t"
  85649. "mul r8, r9, r8\n\t"
  85650. "lsr r9, r8, #16\n\t"
  85651. "lsl r8, r8, #16\n\t"
  85652. "adds r5, r5, r8\n\t"
  85653. "adcs r6, r6, r9\n\t"
  85654. "adc r7, r7, #0\n\t"
  85655. "lsr r8, r10, #16\n\t"
  85656. "lsr r9, r12, #16\n\t"
  85657. "mul r9, r8, r9\n\t"
  85658. "adds r6, r6, r9\n\t"
  85659. "adc r7, r7, #0\n\t"
  85660. "lsl r9, r12, #16\n\t"
  85661. "lsr r9, r9, #16\n\t"
  85662. "mul r8, r9, r8\n\t"
  85663. "lsr r9, r8, #16\n\t"
  85664. "lsl r8, r8, #16\n\t"
  85665. "adds r5, r5, r8\n\t"
  85666. "adcs r6, r6, r9\n\t"
  85667. "adc r7, r7, #0\n\t"
  85668. #else
  85669. "umull r8, r9, r10, r12\n\t"
  85670. "adds r5, r5, r8\n\t"
  85671. "adcs r6, r6, r9\n\t"
  85672. "adc r7, r7, #0\n\t"
  85673. #endif
  85674. /* A[5] * A[5] */
  85675. "ldr r10, [%[a], #20]\n\t"
  85676. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  85677. "lsl r8, r10, #16\n\t"
  85678. "lsr r9, r10, #16\n\t"
  85679. "lsr r8, r8, #16\n\t"
  85680. "mov r12, r8\n\t"
  85681. "mul r8, r12, r8\n\t"
  85682. "mov r12, r9\n\t"
  85683. "mul r9, r12, r9\n\t"
  85684. "adds r3, r3, r8\n\t"
  85685. "adcs r4, r4, r9\n\t"
  85686. "adc r2, r2, #0\n\t"
  85687. "lsr r9, r10, #16\n\t"
  85688. "lsl r8, r10, #16\n\t"
  85689. "lsr r8, r8, #16\n\t"
  85690. "mul r8, r9, r8\n\t"
  85691. "lsr r9, r8, #15\n\t"
  85692. "lsl r8, r8, #17\n\t"
  85693. "adds r3, r3, r8\n\t"
  85694. "adcs r4, r4, r9\n\t"
  85695. "adc r2, r2, #0\n\t"
  85696. "adds r5, r5, r5\n\t"
  85697. "adcs r6, r6, r6\n\t"
  85698. "adc r7, r7, r7\n\t"
  85699. #else
  85700. "umull r8, r9, r10, r10\n\t"
  85701. "adds r5, r5, r5\n\t"
  85702. "adcs r6, r6, r6\n\t"
  85703. "adc r7, r7, r7\n\t"
  85704. "adds r3, r3, r8\n\t"
  85705. "adcs r4, r4, r9\n\t"
  85706. "adc r2, r2, #0\n\t"
  85707. #endif
  85708. "adds r3, r3, r5\n\t"
  85709. "adcs r4, r4, r6\n\t"
  85710. "adc r2, r2, r7\n\t"
  85711. "str r3, [sp, #40]\n\t"
  85712. /* A[0] * A[11] */
  85713. "ldr r10, [%[a], #44]\n\t"
  85714. "ldr r12, [%[a]]\n\t"
  85715. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  85716. "lsl r8, r10, #16\n\t"
  85717. "lsl r5, r12, #16\n\t"
  85718. "lsr r8, r8, #16\n\t"
  85719. "lsr r5, r5, #16\n\t"
  85720. "mul r5, r8, r5\n\t"
  85721. "lsr r9, r12, #16\n\t"
  85722. "mul r8, r9, r8\n\t"
  85723. "lsr r6, r8, #16\n\t"
  85724. "lsl r8, r8, #16\n\t"
  85725. "adds r5, r5, r8\n\t"
  85726. "adc r6, r6, #0\n\t"
  85727. "lsr r8, r10, #16\n\t"
  85728. "mul r9, r8, r9\n\t"
  85729. "add r6, r6, r9\n\t"
  85730. "lsl r9, r12, #16\n\t"
  85731. "lsr r9, r9, #16\n\t"
  85732. "mul r8, r9, r8\n\t"
  85733. "lsr r9, r8, #16\n\t"
  85734. "lsl r8, r8, #16\n\t"
  85735. "adds r5, r5, r8\n\t"
  85736. "adc r6, r6, r9\n\t"
  85737. #else
  85738. "umull r5, r6, r10, r12\n\t"
  85739. #endif
  85740. "mov r3, #0\n\t"
  85741. "mov r7, #0\n\t"
  85742. /* A[1] * A[10] */
  85743. "ldr r10, [%[a], #40]\n\t"
  85744. "ldr r12, [%[a], #4]\n\t"
  85745. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  85746. "lsl r8, r10, #16\n\t"
  85747. "lsl r9, r12, #16\n\t"
  85748. "lsr r8, r8, #16\n\t"
  85749. "lsr r9, r9, #16\n\t"
  85750. "mul r9, r8, r9\n\t"
  85751. "adds r5, r5, r9\n\t"
  85752. "adcs r6, r6, #0\n\t"
  85753. "adc r7, r7, #0\n\t"
  85754. "lsr r9, r12, #16\n\t"
  85755. "mul r8, r9, r8\n\t"
  85756. "lsr r9, r8, #16\n\t"
  85757. "lsl r8, r8, #16\n\t"
  85758. "adds r5, r5, r8\n\t"
  85759. "adcs r6, r6, r9\n\t"
  85760. "adc r7, r7, #0\n\t"
  85761. "lsr r8, r10, #16\n\t"
  85762. "lsr r9, r12, #16\n\t"
  85763. "mul r9, r8, r9\n\t"
  85764. "adds r6, r6, r9\n\t"
  85765. "adc r7, r7, #0\n\t"
  85766. "lsl r9, r12, #16\n\t"
  85767. "lsr r9, r9, #16\n\t"
  85768. "mul r8, r9, r8\n\t"
  85769. "lsr r9, r8, #16\n\t"
  85770. "lsl r8, r8, #16\n\t"
  85771. "adds r5, r5, r8\n\t"
  85772. "adcs r6, r6, r9\n\t"
  85773. "adc r7, r7, #0\n\t"
  85774. #else
  85775. "umull r8, r9, r10, r12\n\t"
  85776. "adds r5, r5, r8\n\t"
  85777. "adcs r6, r6, r9\n\t"
  85778. "adc r7, r7, #0\n\t"
  85779. #endif
  85780. /* A[2] * A[9] */
  85781. "ldr r10, [%[a], #36]\n\t"
  85782. "ldr r12, [%[a], #8]\n\t"
  85783. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  85784. "lsl r8, r10, #16\n\t"
  85785. "lsl r9, r12, #16\n\t"
  85786. "lsr r8, r8, #16\n\t"
  85787. "lsr r9, r9, #16\n\t"
  85788. "mul r9, r8, r9\n\t"
  85789. "adds r5, r5, r9\n\t"
  85790. "adcs r6, r6, #0\n\t"
  85791. "adc r7, r7, #0\n\t"
  85792. "lsr r9, r12, #16\n\t"
  85793. "mul r8, r9, r8\n\t"
  85794. "lsr r9, r8, #16\n\t"
  85795. "lsl r8, r8, #16\n\t"
  85796. "adds r5, r5, r8\n\t"
  85797. "adcs r6, r6, r9\n\t"
  85798. "adc r7, r7, #0\n\t"
  85799. "lsr r8, r10, #16\n\t"
  85800. "lsr r9, r12, #16\n\t"
  85801. "mul r9, r8, r9\n\t"
  85802. "adds r6, r6, r9\n\t"
  85803. "adc r7, r7, #0\n\t"
  85804. "lsl r9, r12, #16\n\t"
  85805. "lsr r9, r9, #16\n\t"
  85806. "mul r8, r9, r8\n\t"
  85807. "lsr r9, r8, #16\n\t"
  85808. "lsl r8, r8, #16\n\t"
  85809. "adds r5, r5, r8\n\t"
  85810. "adcs r6, r6, r9\n\t"
  85811. "adc r7, r7, #0\n\t"
  85812. #else
  85813. "umull r8, r9, r10, r12\n\t"
  85814. "adds r5, r5, r8\n\t"
  85815. "adcs r6, r6, r9\n\t"
  85816. "adc r7, r7, #0\n\t"
  85817. #endif
  85818. /* A[3] * A[8] */
  85819. "ldr r10, [%[a], #32]\n\t"
  85820. "ldr r12, [%[a], #12]\n\t"
  85821. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  85822. "lsl r8, r10, #16\n\t"
  85823. "lsl r9, r12, #16\n\t"
  85824. "lsr r8, r8, #16\n\t"
  85825. "lsr r9, r9, #16\n\t"
  85826. "mul r9, r8, r9\n\t"
  85827. "adds r5, r5, r9\n\t"
  85828. "adcs r6, r6, #0\n\t"
  85829. "adc r7, r7, #0\n\t"
  85830. "lsr r9, r12, #16\n\t"
  85831. "mul r8, r9, r8\n\t"
  85832. "lsr r9, r8, #16\n\t"
  85833. "lsl r8, r8, #16\n\t"
  85834. "adds r5, r5, r8\n\t"
  85835. "adcs r6, r6, r9\n\t"
  85836. "adc r7, r7, #0\n\t"
  85837. "lsr r8, r10, #16\n\t"
  85838. "lsr r9, r12, #16\n\t"
  85839. "mul r9, r8, r9\n\t"
  85840. "adds r6, r6, r9\n\t"
  85841. "adc r7, r7, #0\n\t"
  85842. "lsl r9, r12, #16\n\t"
  85843. "lsr r9, r9, #16\n\t"
  85844. "mul r8, r9, r8\n\t"
  85845. "lsr r9, r8, #16\n\t"
  85846. "lsl r8, r8, #16\n\t"
  85847. "adds r5, r5, r8\n\t"
  85848. "adcs r6, r6, r9\n\t"
  85849. "adc r7, r7, #0\n\t"
  85850. #else
  85851. "umull r8, r9, r10, r12\n\t"
  85852. "adds r5, r5, r8\n\t"
  85853. "adcs r6, r6, r9\n\t"
  85854. "adc r7, r7, #0\n\t"
  85855. #endif
  85856. /* A[4] * A[7] */
  85857. "ldr r10, [%[a], #28]\n\t"
  85858. "ldr r12, [%[a], #16]\n\t"
  85859. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  85860. "lsl r8, r10, #16\n\t"
  85861. "lsl r9, r12, #16\n\t"
  85862. "lsr r8, r8, #16\n\t"
  85863. "lsr r9, r9, #16\n\t"
  85864. "mul r9, r8, r9\n\t"
  85865. "adds r5, r5, r9\n\t"
  85866. "adcs r6, r6, #0\n\t"
  85867. "adc r7, r7, #0\n\t"
  85868. "lsr r9, r12, #16\n\t"
  85869. "mul r8, r9, r8\n\t"
  85870. "lsr r9, r8, #16\n\t"
  85871. "lsl r8, r8, #16\n\t"
  85872. "adds r5, r5, r8\n\t"
  85873. "adcs r6, r6, r9\n\t"
  85874. "adc r7, r7, #0\n\t"
  85875. "lsr r8, r10, #16\n\t"
  85876. "lsr r9, r12, #16\n\t"
  85877. "mul r9, r8, r9\n\t"
  85878. "adds r6, r6, r9\n\t"
  85879. "adc r7, r7, #0\n\t"
  85880. "lsl r9, r12, #16\n\t"
  85881. "lsr r9, r9, #16\n\t"
  85882. "mul r8, r9, r8\n\t"
  85883. "lsr r9, r8, #16\n\t"
  85884. "lsl r8, r8, #16\n\t"
  85885. "adds r5, r5, r8\n\t"
  85886. "adcs r6, r6, r9\n\t"
  85887. "adc r7, r7, #0\n\t"
  85888. #else
  85889. "umull r8, r9, r10, r12\n\t"
  85890. "adds r5, r5, r8\n\t"
  85891. "adcs r6, r6, r9\n\t"
  85892. "adc r7, r7, #0\n\t"
  85893. #endif
  85894. /* A[5] * A[6] */
  85895. "ldr r10, [%[a], #24]\n\t"
  85896. "ldr r12, [%[a], #20]\n\t"
  85897. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  85898. "lsl r8, r10, #16\n\t"
  85899. "lsl r9, r12, #16\n\t"
  85900. "lsr r8, r8, #16\n\t"
  85901. "lsr r9, r9, #16\n\t"
  85902. "mul r9, r8, r9\n\t"
  85903. "adds r5, r5, r9\n\t"
  85904. "adcs r6, r6, #0\n\t"
  85905. "adc r7, r7, #0\n\t"
  85906. "lsr r9, r12, #16\n\t"
  85907. "mul r8, r9, r8\n\t"
  85908. "lsr r9, r8, #16\n\t"
  85909. "lsl r8, r8, #16\n\t"
  85910. "adds r5, r5, r8\n\t"
  85911. "adcs r6, r6, r9\n\t"
  85912. "adc r7, r7, #0\n\t"
  85913. "lsr r8, r10, #16\n\t"
  85914. "lsr r9, r12, #16\n\t"
  85915. "mul r9, r8, r9\n\t"
  85916. "adds r6, r6, r9\n\t"
  85917. "adc r7, r7, #0\n\t"
  85918. "lsl r9, r12, #16\n\t"
  85919. "lsr r9, r9, #16\n\t"
  85920. "mul r8, r9, r8\n\t"
  85921. "lsr r9, r8, #16\n\t"
  85922. "lsl r8, r8, #16\n\t"
  85923. "adds r5, r5, r8\n\t"
  85924. "adcs r6, r6, r9\n\t"
  85925. "adc r7, r7, #0\n\t"
  85926. #else
  85927. "umull r8, r9, r10, r12\n\t"
  85928. "adds r5, r5, r8\n\t"
  85929. "adcs r6, r6, r9\n\t"
  85930. "adc r7, r7, #0\n\t"
  85931. #endif
  85932. "adds r5, r5, r5\n\t"
  85933. "adcs r6, r6, r6\n\t"
  85934. "adc r7, r7, r7\n\t"
  85935. "adds r4, r4, r5\n\t"
  85936. "adcs r2, r2, r6\n\t"
  85937. "adc r3, r3, r7\n\t"
  85938. "str r4, [sp, #44]\n\t"
  85939. /* A[1] * A[11] */
  85940. "ldr r10, [%[a], #44]\n\t"
  85941. "ldr r12, [%[a], #4]\n\t"
  85942. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  85943. "lsl r8, r10, #16\n\t"
  85944. "lsl r5, r12, #16\n\t"
  85945. "lsr r8, r8, #16\n\t"
  85946. "lsr r5, r5, #16\n\t"
  85947. "mul r5, r8, r5\n\t"
  85948. "lsr r9, r12, #16\n\t"
  85949. "mul r8, r9, r8\n\t"
  85950. "lsr r6, r8, #16\n\t"
  85951. "lsl r8, r8, #16\n\t"
  85952. "adds r5, r5, r8\n\t"
  85953. "adc r6, r6, #0\n\t"
  85954. "lsr r8, r10, #16\n\t"
  85955. "mul r9, r8, r9\n\t"
  85956. "add r6, r6, r9\n\t"
  85957. "lsl r9, r12, #16\n\t"
  85958. "lsr r9, r9, #16\n\t"
  85959. "mul r8, r9, r8\n\t"
  85960. "lsr r9, r8, #16\n\t"
  85961. "lsl r8, r8, #16\n\t"
  85962. "adds r5, r5, r8\n\t"
  85963. "adc r6, r6, r9\n\t"
  85964. #else
  85965. "umull r5, r6, r10, r12\n\t"
  85966. #endif
  85967. "mov r4, #0\n\t"
  85968. "mov r7, #0\n\t"
  85969. /* A[2] * A[10] */
  85970. "ldr r10, [%[a], #40]\n\t"
  85971. "ldr r12, [%[a], #8]\n\t"
  85972. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  85973. "lsl r8, r10, #16\n\t"
  85974. "lsl r9, r12, #16\n\t"
  85975. "lsr r8, r8, #16\n\t"
  85976. "lsr r9, r9, #16\n\t"
  85977. "mul r9, r8, r9\n\t"
  85978. "adds r5, r5, r9\n\t"
  85979. "adcs r6, r6, #0\n\t"
  85980. "adc r7, r7, #0\n\t"
  85981. "lsr r9, r12, #16\n\t"
  85982. "mul r8, r9, r8\n\t"
  85983. "lsr r9, r8, #16\n\t"
  85984. "lsl r8, r8, #16\n\t"
  85985. "adds r5, r5, r8\n\t"
  85986. "adcs r6, r6, r9\n\t"
  85987. "adc r7, r7, #0\n\t"
  85988. "lsr r8, r10, #16\n\t"
  85989. "lsr r9, r12, #16\n\t"
  85990. "mul r9, r8, r9\n\t"
  85991. "adds r6, r6, r9\n\t"
  85992. "adc r7, r7, #0\n\t"
  85993. "lsl r9, r12, #16\n\t"
  85994. "lsr r9, r9, #16\n\t"
  85995. "mul r8, r9, r8\n\t"
  85996. "lsr r9, r8, #16\n\t"
  85997. "lsl r8, r8, #16\n\t"
  85998. "adds r5, r5, r8\n\t"
  85999. "adcs r6, r6, r9\n\t"
  86000. "adc r7, r7, #0\n\t"
  86001. #else
  86002. "umull r8, r9, r10, r12\n\t"
  86003. "adds r5, r5, r8\n\t"
  86004. "adcs r6, r6, r9\n\t"
  86005. "adc r7, r7, #0\n\t"
  86006. #endif
  86007. /* A[3] * A[9] */
  86008. "ldr r10, [%[a], #36]\n\t"
  86009. "ldr r12, [%[a], #12]\n\t"
  86010. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  86011. "lsl r8, r10, #16\n\t"
  86012. "lsl r9, r12, #16\n\t"
  86013. "lsr r8, r8, #16\n\t"
  86014. "lsr r9, r9, #16\n\t"
  86015. "mul r9, r8, r9\n\t"
  86016. "adds r5, r5, r9\n\t"
  86017. "adcs r6, r6, #0\n\t"
  86018. "adc r7, r7, #0\n\t"
  86019. "lsr r9, r12, #16\n\t"
  86020. "mul r8, r9, r8\n\t"
  86021. "lsr r9, r8, #16\n\t"
  86022. "lsl r8, r8, #16\n\t"
  86023. "adds r5, r5, r8\n\t"
  86024. "adcs r6, r6, r9\n\t"
  86025. "adc r7, r7, #0\n\t"
  86026. "lsr r8, r10, #16\n\t"
  86027. "lsr r9, r12, #16\n\t"
  86028. "mul r9, r8, r9\n\t"
  86029. "adds r6, r6, r9\n\t"
  86030. "adc r7, r7, #0\n\t"
  86031. "lsl r9, r12, #16\n\t"
  86032. "lsr r9, r9, #16\n\t"
  86033. "mul r8, r9, r8\n\t"
  86034. "lsr r9, r8, #16\n\t"
  86035. "lsl r8, r8, #16\n\t"
  86036. "adds r5, r5, r8\n\t"
  86037. "adcs r6, r6, r9\n\t"
  86038. "adc r7, r7, #0\n\t"
  86039. #else
  86040. "umull r8, r9, r10, r12\n\t"
  86041. "adds r5, r5, r8\n\t"
  86042. "adcs r6, r6, r9\n\t"
  86043. "adc r7, r7, #0\n\t"
  86044. #endif
  86045. /* A[4] * A[8] */
  86046. "ldr r10, [%[a], #32]\n\t"
  86047. "ldr r12, [%[a], #16]\n\t"
  86048. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  86049. "lsl r8, r10, #16\n\t"
  86050. "lsl r9, r12, #16\n\t"
  86051. "lsr r8, r8, #16\n\t"
  86052. "lsr r9, r9, #16\n\t"
  86053. "mul r9, r8, r9\n\t"
  86054. "adds r5, r5, r9\n\t"
  86055. "adcs r6, r6, #0\n\t"
  86056. "adc r7, r7, #0\n\t"
  86057. "lsr r9, r12, #16\n\t"
  86058. "mul r8, r9, r8\n\t"
  86059. "lsr r9, r8, #16\n\t"
  86060. "lsl r8, r8, #16\n\t"
  86061. "adds r5, r5, r8\n\t"
  86062. "adcs r6, r6, r9\n\t"
  86063. "adc r7, r7, #0\n\t"
  86064. "lsr r8, r10, #16\n\t"
  86065. "lsr r9, r12, #16\n\t"
  86066. "mul r9, r8, r9\n\t"
  86067. "adds r6, r6, r9\n\t"
  86068. "adc r7, r7, #0\n\t"
  86069. "lsl r9, r12, #16\n\t"
  86070. "lsr r9, r9, #16\n\t"
  86071. "mul r8, r9, r8\n\t"
  86072. "lsr r9, r8, #16\n\t"
  86073. "lsl r8, r8, #16\n\t"
  86074. "adds r5, r5, r8\n\t"
  86075. "adcs r6, r6, r9\n\t"
  86076. "adc r7, r7, #0\n\t"
  86077. #else
  86078. "umull r8, r9, r10, r12\n\t"
  86079. "adds r5, r5, r8\n\t"
  86080. "adcs r6, r6, r9\n\t"
  86081. "adc r7, r7, #0\n\t"
  86082. #endif
  86083. /* A[5] * A[7] */
  86084. "ldr r10, [%[a], #28]\n\t"
  86085. "ldr r12, [%[a], #20]\n\t"
  86086. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  86087. "lsl r8, r10, #16\n\t"
  86088. "lsl r9, r12, #16\n\t"
  86089. "lsr r8, r8, #16\n\t"
  86090. "lsr r9, r9, #16\n\t"
  86091. "mul r9, r8, r9\n\t"
  86092. "adds r5, r5, r9\n\t"
  86093. "adcs r6, r6, #0\n\t"
  86094. "adc r7, r7, #0\n\t"
  86095. "lsr r9, r12, #16\n\t"
  86096. "mul r8, r9, r8\n\t"
  86097. "lsr r9, r8, #16\n\t"
  86098. "lsl r8, r8, #16\n\t"
  86099. "adds r5, r5, r8\n\t"
  86100. "adcs r6, r6, r9\n\t"
  86101. "adc r7, r7, #0\n\t"
  86102. "lsr r8, r10, #16\n\t"
  86103. "lsr r9, r12, #16\n\t"
  86104. "mul r9, r8, r9\n\t"
  86105. "adds r6, r6, r9\n\t"
  86106. "adc r7, r7, #0\n\t"
  86107. "lsl r9, r12, #16\n\t"
  86108. "lsr r9, r9, #16\n\t"
  86109. "mul r8, r9, r8\n\t"
  86110. "lsr r9, r8, #16\n\t"
  86111. "lsl r8, r8, #16\n\t"
  86112. "adds r5, r5, r8\n\t"
  86113. "adcs r6, r6, r9\n\t"
  86114. "adc r7, r7, #0\n\t"
  86115. #else
  86116. "umull r8, r9, r10, r12\n\t"
  86117. "adds r5, r5, r8\n\t"
  86118. "adcs r6, r6, r9\n\t"
  86119. "adc r7, r7, #0\n\t"
  86120. #endif
  86121. /* A[6] * A[6] */
  86122. "ldr r10, [%[a], #24]\n\t"
  86123. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  86124. "lsl r8, r10, #16\n\t"
  86125. "lsr r9, r10, #16\n\t"
  86126. "lsr r8, r8, #16\n\t"
  86127. "mov r12, r8\n\t"
  86128. "mul r8, r12, r8\n\t"
  86129. "mov r12, r9\n\t"
  86130. "mul r9, r12, r9\n\t"
  86131. "adds r2, r2, r8\n\t"
  86132. "adcs r3, r3, r9\n\t"
  86133. "adc r4, r4, #0\n\t"
  86134. "lsr r9, r10, #16\n\t"
  86135. "lsl r8, r10, #16\n\t"
  86136. "lsr r8, r8, #16\n\t"
  86137. "mul r8, r9, r8\n\t"
  86138. "lsr r9, r8, #15\n\t"
  86139. "lsl r8, r8, #17\n\t"
  86140. "adds r2, r2, r8\n\t"
  86141. "adcs r3, r3, r9\n\t"
  86142. "adc r4, r4, #0\n\t"
  86143. "adds r5, r5, r5\n\t"
  86144. "adcs r6, r6, r6\n\t"
  86145. "adc r7, r7, r7\n\t"
  86146. #else
  86147. "umull r8, r9, r10, r10\n\t"
  86148. "adds r5, r5, r5\n\t"
  86149. "adcs r6, r6, r6\n\t"
  86150. "adc r7, r7, r7\n\t"
  86151. "adds r2, r2, r8\n\t"
  86152. "adcs r3, r3, r9\n\t"
  86153. "adc r4, r4, #0\n\t"
  86154. #endif
  86155. "adds r2, r2, r5\n\t"
  86156. "adcs r3, r3, r6\n\t"
  86157. "adc r4, r4, r7\n\t"
  86158. "str r2, [%[r], #48]\n\t"
  86159. /* A[2] * A[11] */
  86160. "ldr r10, [%[a], #44]\n\t"
  86161. "ldr r12, [%[a], #8]\n\t"
  86162. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  86163. "lsl r8, r10, #16\n\t"
  86164. "lsl r5, r12, #16\n\t"
  86165. "lsr r8, r8, #16\n\t"
  86166. "lsr r5, r5, #16\n\t"
  86167. "mul r5, r8, r5\n\t"
  86168. "lsr r9, r12, #16\n\t"
  86169. "mul r8, r9, r8\n\t"
  86170. "lsr r6, r8, #16\n\t"
  86171. "lsl r8, r8, #16\n\t"
  86172. "adds r5, r5, r8\n\t"
  86173. "adc r6, r6, #0\n\t"
  86174. "lsr r8, r10, #16\n\t"
  86175. "mul r9, r8, r9\n\t"
  86176. "add r6, r6, r9\n\t"
  86177. "lsl r9, r12, #16\n\t"
  86178. "lsr r9, r9, #16\n\t"
  86179. "mul r8, r9, r8\n\t"
  86180. "lsr r9, r8, #16\n\t"
  86181. "lsl r8, r8, #16\n\t"
  86182. "adds r5, r5, r8\n\t"
  86183. "adc r6, r6, r9\n\t"
  86184. #else
  86185. "umull r5, r6, r10, r12\n\t"
  86186. #endif
  86187. "mov r2, #0\n\t"
  86188. "mov r7, #0\n\t"
  86189. /* A[3] * A[10] */
  86190. "ldr r10, [%[a], #40]\n\t"
  86191. "ldr r12, [%[a], #12]\n\t"
  86192. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  86193. "lsl r8, r10, #16\n\t"
  86194. "lsl r9, r12, #16\n\t"
  86195. "lsr r8, r8, #16\n\t"
  86196. "lsr r9, r9, #16\n\t"
  86197. "mul r9, r8, r9\n\t"
  86198. "adds r5, r5, r9\n\t"
  86199. "adcs r6, r6, #0\n\t"
  86200. "adc r7, r7, #0\n\t"
  86201. "lsr r9, r12, #16\n\t"
  86202. "mul r8, r9, r8\n\t"
  86203. "lsr r9, r8, #16\n\t"
  86204. "lsl r8, r8, #16\n\t"
  86205. "adds r5, r5, r8\n\t"
  86206. "adcs r6, r6, r9\n\t"
  86207. "adc r7, r7, #0\n\t"
  86208. "lsr r8, r10, #16\n\t"
  86209. "lsr r9, r12, #16\n\t"
  86210. "mul r9, r8, r9\n\t"
  86211. "adds r6, r6, r9\n\t"
  86212. "adc r7, r7, #0\n\t"
  86213. "lsl r9, r12, #16\n\t"
  86214. "lsr r9, r9, #16\n\t"
  86215. "mul r8, r9, r8\n\t"
  86216. "lsr r9, r8, #16\n\t"
  86217. "lsl r8, r8, #16\n\t"
  86218. "adds r5, r5, r8\n\t"
  86219. "adcs r6, r6, r9\n\t"
  86220. "adc r7, r7, #0\n\t"
  86221. #else
  86222. "umull r8, r9, r10, r12\n\t"
  86223. "adds r5, r5, r8\n\t"
  86224. "adcs r6, r6, r9\n\t"
  86225. "adc r7, r7, #0\n\t"
  86226. #endif
  86227. /* A[4] * A[9] */
  86228. "ldr r10, [%[a], #36]\n\t"
  86229. "ldr r12, [%[a], #16]\n\t"
  86230. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  86231. "lsl r8, r10, #16\n\t"
  86232. "lsl r9, r12, #16\n\t"
  86233. "lsr r8, r8, #16\n\t"
  86234. "lsr r9, r9, #16\n\t"
  86235. "mul r9, r8, r9\n\t"
  86236. "adds r5, r5, r9\n\t"
  86237. "adcs r6, r6, #0\n\t"
  86238. "adc r7, r7, #0\n\t"
  86239. "lsr r9, r12, #16\n\t"
  86240. "mul r8, r9, r8\n\t"
  86241. "lsr r9, r8, #16\n\t"
  86242. "lsl r8, r8, #16\n\t"
  86243. "adds r5, r5, r8\n\t"
  86244. "adcs r6, r6, r9\n\t"
  86245. "adc r7, r7, #0\n\t"
  86246. "lsr r8, r10, #16\n\t"
  86247. "lsr r9, r12, #16\n\t"
  86248. "mul r9, r8, r9\n\t"
  86249. "adds r6, r6, r9\n\t"
  86250. "adc r7, r7, #0\n\t"
  86251. "lsl r9, r12, #16\n\t"
  86252. "lsr r9, r9, #16\n\t"
  86253. "mul r8, r9, r8\n\t"
  86254. "lsr r9, r8, #16\n\t"
  86255. "lsl r8, r8, #16\n\t"
  86256. "adds r5, r5, r8\n\t"
  86257. "adcs r6, r6, r9\n\t"
  86258. "adc r7, r7, #0\n\t"
  86259. #else
  86260. "umull r8, r9, r10, r12\n\t"
  86261. "adds r5, r5, r8\n\t"
  86262. "adcs r6, r6, r9\n\t"
  86263. "adc r7, r7, #0\n\t"
  86264. #endif
  86265. /* A[5] * A[8] */
  86266. "ldr r10, [%[a], #32]\n\t"
  86267. "ldr r12, [%[a], #20]\n\t"
  86268. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  86269. "lsl r8, r10, #16\n\t"
  86270. "lsl r9, r12, #16\n\t"
  86271. "lsr r8, r8, #16\n\t"
  86272. "lsr r9, r9, #16\n\t"
  86273. "mul r9, r8, r9\n\t"
  86274. "adds r5, r5, r9\n\t"
  86275. "adcs r6, r6, #0\n\t"
  86276. "adc r7, r7, #0\n\t"
  86277. "lsr r9, r12, #16\n\t"
  86278. "mul r8, r9, r8\n\t"
  86279. "lsr r9, r8, #16\n\t"
  86280. "lsl r8, r8, #16\n\t"
  86281. "adds r5, r5, r8\n\t"
  86282. "adcs r6, r6, r9\n\t"
  86283. "adc r7, r7, #0\n\t"
  86284. "lsr r8, r10, #16\n\t"
  86285. "lsr r9, r12, #16\n\t"
  86286. "mul r9, r8, r9\n\t"
  86287. "adds r6, r6, r9\n\t"
  86288. "adc r7, r7, #0\n\t"
  86289. "lsl r9, r12, #16\n\t"
  86290. "lsr r9, r9, #16\n\t"
  86291. "mul r8, r9, r8\n\t"
  86292. "lsr r9, r8, #16\n\t"
  86293. "lsl r8, r8, #16\n\t"
  86294. "adds r5, r5, r8\n\t"
  86295. "adcs r6, r6, r9\n\t"
  86296. "adc r7, r7, #0\n\t"
  86297. #else
  86298. "umull r8, r9, r10, r12\n\t"
  86299. "adds r5, r5, r8\n\t"
  86300. "adcs r6, r6, r9\n\t"
  86301. "adc r7, r7, #0\n\t"
  86302. #endif
  86303. /* A[6] * A[7] */
  86304. "ldr r10, [%[a], #28]\n\t"
  86305. "ldr r12, [%[a], #24]\n\t"
  86306. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  86307. "lsl r8, r10, #16\n\t"
  86308. "lsl r9, r12, #16\n\t"
  86309. "lsr r8, r8, #16\n\t"
  86310. "lsr r9, r9, #16\n\t"
  86311. "mul r9, r8, r9\n\t"
  86312. "adds r5, r5, r9\n\t"
  86313. "adcs r6, r6, #0\n\t"
  86314. "adc r7, r7, #0\n\t"
  86315. "lsr r9, r12, #16\n\t"
  86316. "mul r8, r9, r8\n\t"
  86317. "lsr r9, r8, #16\n\t"
  86318. "lsl r8, r8, #16\n\t"
  86319. "adds r5, r5, r8\n\t"
  86320. "adcs r6, r6, r9\n\t"
  86321. "adc r7, r7, #0\n\t"
  86322. "lsr r8, r10, #16\n\t"
  86323. "lsr r9, r12, #16\n\t"
  86324. "mul r9, r8, r9\n\t"
  86325. "adds r6, r6, r9\n\t"
  86326. "adc r7, r7, #0\n\t"
  86327. "lsl r9, r12, #16\n\t"
  86328. "lsr r9, r9, #16\n\t"
  86329. "mul r8, r9, r8\n\t"
  86330. "lsr r9, r8, #16\n\t"
  86331. "lsl r8, r8, #16\n\t"
  86332. "adds r5, r5, r8\n\t"
  86333. "adcs r6, r6, r9\n\t"
  86334. "adc r7, r7, #0\n\t"
  86335. #else
  86336. "umull r8, r9, r10, r12\n\t"
  86337. "adds r5, r5, r8\n\t"
  86338. "adcs r6, r6, r9\n\t"
  86339. "adc r7, r7, #0\n\t"
  86340. #endif
  86341. "adds r5, r5, r5\n\t"
  86342. "adcs r6, r6, r6\n\t"
  86343. "adc r7, r7, r7\n\t"
  86344. "adds r3, r3, r5\n\t"
  86345. "adcs r4, r4, r6\n\t"
  86346. "adc r2, r2, r7\n\t"
  86347. "str r3, [%[r], #52]\n\t"
  86348. /* A[3] * A[11] */
  86349. "ldr r10, [%[a], #44]\n\t"
  86350. "ldr r12, [%[a], #12]\n\t"
  86351. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  86352. "lsl r8, r10, #16\n\t"
  86353. "lsl r5, r12, #16\n\t"
  86354. "lsr r8, r8, #16\n\t"
  86355. "lsr r5, r5, #16\n\t"
  86356. "mul r5, r8, r5\n\t"
  86357. "lsr r9, r12, #16\n\t"
  86358. "mul r8, r9, r8\n\t"
  86359. "lsr r6, r8, #16\n\t"
  86360. "lsl r8, r8, #16\n\t"
  86361. "adds r5, r5, r8\n\t"
  86362. "adc r6, r6, #0\n\t"
  86363. "lsr r8, r10, #16\n\t"
  86364. "mul r9, r8, r9\n\t"
  86365. "add r6, r6, r9\n\t"
  86366. "lsl r9, r12, #16\n\t"
  86367. "lsr r9, r9, #16\n\t"
  86368. "mul r8, r9, r8\n\t"
  86369. "lsr r9, r8, #16\n\t"
  86370. "lsl r8, r8, #16\n\t"
  86371. "adds r5, r5, r8\n\t"
  86372. "adc r6, r6, r9\n\t"
  86373. #else
  86374. "umull r5, r6, r10, r12\n\t"
  86375. #endif
  86376. "mov r3, #0\n\t"
  86377. "mov r7, #0\n\t"
  86378. /* A[4] * A[10] */
  86379. "ldr r10, [%[a], #40]\n\t"
  86380. "ldr r12, [%[a], #16]\n\t"
  86381. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  86382. "lsl r8, r10, #16\n\t"
  86383. "lsl r9, r12, #16\n\t"
  86384. "lsr r8, r8, #16\n\t"
  86385. "lsr r9, r9, #16\n\t"
  86386. "mul r9, r8, r9\n\t"
  86387. "adds r5, r5, r9\n\t"
  86388. "adcs r6, r6, #0\n\t"
  86389. "adc r7, r7, #0\n\t"
  86390. "lsr r9, r12, #16\n\t"
  86391. "mul r8, r9, r8\n\t"
  86392. "lsr r9, r8, #16\n\t"
  86393. "lsl r8, r8, #16\n\t"
  86394. "adds r5, r5, r8\n\t"
  86395. "adcs r6, r6, r9\n\t"
  86396. "adc r7, r7, #0\n\t"
  86397. "lsr r8, r10, #16\n\t"
  86398. "lsr r9, r12, #16\n\t"
  86399. "mul r9, r8, r9\n\t"
  86400. "adds r6, r6, r9\n\t"
  86401. "adc r7, r7, #0\n\t"
  86402. "lsl r9, r12, #16\n\t"
  86403. "lsr r9, r9, #16\n\t"
  86404. "mul r8, r9, r8\n\t"
  86405. "lsr r9, r8, #16\n\t"
  86406. "lsl r8, r8, #16\n\t"
  86407. "adds r5, r5, r8\n\t"
  86408. "adcs r6, r6, r9\n\t"
  86409. "adc r7, r7, #0\n\t"
  86410. #else
  86411. "umull r8, r9, r10, r12\n\t"
  86412. "adds r5, r5, r8\n\t"
  86413. "adcs r6, r6, r9\n\t"
  86414. "adc r7, r7, #0\n\t"
  86415. #endif
  86416. /* A[5] * A[9] */
  86417. "ldr r10, [%[a], #36]\n\t"
  86418. "ldr r12, [%[a], #20]\n\t"
  86419. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  86420. "lsl r8, r10, #16\n\t"
  86421. "lsl r9, r12, #16\n\t"
  86422. "lsr r8, r8, #16\n\t"
  86423. "lsr r9, r9, #16\n\t"
  86424. "mul r9, r8, r9\n\t"
  86425. "adds r5, r5, r9\n\t"
  86426. "adcs r6, r6, #0\n\t"
  86427. "adc r7, r7, #0\n\t"
  86428. "lsr r9, r12, #16\n\t"
  86429. "mul r8, r9, r8\n\t"
  86430. "lsr r9, r8, #16\n\t"
  86431. "lsl r8, r8, #16\n\t"
  86432. "adds r5, r5, r8\n\t"
  86433. "adcs r6, r6, r9\n\t"
  86434. "adc r7, r7, #0\n\t"
  86435. "lsr r8, r10, #16\n\t"
  86436. "lsr r9, r12, #16\n\t"
  86437. "mul r9, r8, r9\n\t"
  86438. "adds r6, r6, r9\n\t"
  86439. "adc r7, r7, #0\n\t"
  86440. "lsl r9, r12, #16\n\t"
  86441. "lsr r9, r9, #16\n\t"
  86442. "mul r8, r9, r8\n\t"
  86443. "lsr r9, r8, #16\n\t"
  86444. "lsl r8, r8, #16\n\t"
  86445. "adds r5, r5, r8\n\t"
  86446. "adcs r6, r6, r9\n\t"
  86447. "adc r7, r7, #0\n\t"
  86448. #else
  86449. "umull r8, r9, r10, r12\n\t"
  86450. "adds r5, r5, r8\n\t"
  86451. "adcs r6, r6, r9\n\t"
  86452. "adc r7, r7, #0\n\t"
  86453. #endif
  86454. /* A[6] * A[8] */
  86455. "ldr r10, [%[a], #32]\n\t"
  86456. "ldr r12, [%[a], #24]\n\t"
  86457. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  86458. "lsl r8, r10, #16\n\t"
  86459. "lsl r9, r12, #16\n\t"
  86460. "lsr r8, r8, #16\n\t"
  86461. "lsr r9, r9, #16\n\t"
  86462. "mul r9, r8, r9\n\t"
  86463. "adds r5, r5, r9\n\t"
  86464. "adcs r6, r6, #0\n\t"
  86465. "adc r7, r7, #0\n\t"
  86466. "lsr r9, r12, #16\n\t"
  86467. "mul r8, r9, r8\n\t"
  86468. "lsr r9, r8, #16\n\t"
  86469. "lsl r8, r8, #16\n\t"
  86470. "adds r5, r5, r8\n\t"
  86471. "adcs r6, r6, r9\n\t"
  86472. "adc r7, r7, #0\n\t"
  86473. "lsr r8, r10, #16\n\t"
  86474. "lsr r9, r12, #16\n\t"
  86475. "mul r9, r8, r9\n\t"
  86476. "adds r6, r6, r9\n\t"
  86477. "adc r7, r7, #0\n\t"
  86478. "lsl r9, r12, #16\n\t"
  86479. "lsr r9, r9, #16\n\t"
  86480. "mul r8, r9, r8\n\t"
  86481. "lsr r9, r8, #16\n\t"
  86482. "lsl r8, r8, #16\n\t"
  86483. "adds r5, r5, r8\n\t"
  86484. "adcs r6, r6, r9\n\t"
  86485. "adc r7, r7, #0\n\t"
  86486. #else
  86487. "umull r8, r9, r10, r12\n\t"
  86488. "adds r5, r5, r8\n\t"
  86489. "adcs r6, r6, r9\n\t"
  86490. "adc r7, r7, #0\n\t"
  86491. #endif
  86492. /* A[7] * A[7] */
  86493. "ldr r10, [%[a], #28]\n\t"
  86494. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  86495. "lsl r8, r10, #16\n\t"
  86496. "lsr r9, r10, #16\n\t"
  86497. "lsr r8, r8, #16\n\t"
  86498. "mov r12, r8\n\t"
  86499. "mul r8, r12, r8\n\t"
  86500. "mov r12, r9\n\t"
  86501. "mul r9, r12, r9\n\t"
  86502. "adds r4, r4, r8\n\t"
  86503. "adcs r2, r2, r9\n\t"
  86504. "adc r3, r3, #0\n\t"
  86505. "lsr r9, r10, #16\n\t"
  86506. "lsl r8, r10, #16\n\t"
  86507. "lsr r8, r8, #16\n\t"
  86508. "mul r8, r9, r8\n\t"
  86509. "lsr r9, r8, #15\n\t"
  86510. "lsl r8, r8, #17\n\t"
  86511. "adds r4, r4, r8\n\t"
  86512. "adcs r2, r2, r9\n\t"
  86513. "adc r3, r3, #0\n\t"
  86514. "adds r5, r5, r5\n\t"
  86515. "adcs r6, r6, r6\n\t"
  86516. "adc r7, r7, r7\n\t"
  86517. #else
  86518. "umull r8, r9, r10, r10\n\t"
  86519. "adds r5, r5, r5\n\t"
  86520. "adcs r6, r6, r6\n\t"
  86521. "adc r7, r7, r7\n\t"
  86522. "adds r4, r4, r8\n\t"
  86523. "adcs r2, r2, r9\n\t"
  86524. "adc r3, r3, #0\n\t"
  86525. #endif
  86526. "adds r4, r4, r5\n\t"
  86527. "adcs r2, r2, r6\n\t"
  86528. "adc r3, r3, r7\n\t"
  86529. "str r4, [%[r], #56]\n\t"
  86530. /* A[4] * A[11] */
  86531. "ldr r10, [%[a], #44]\n\t"
  86532. "ldr r12, [%[a], #16]\n\t"
  86533. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  86534. "lsl r8, r10, #16\n\t"
  86535. "lsl r5, r12, #16\n\t"
  86536. "lsr r8, r8, #16\n\t"
  86537. "lsr r5, r5, #16\n\t"
  86538. "mul r5, r8, r5\n\t"
  86539. "lsr r9, r12, #16\n\t"
  86540. "mul r8, r9, r8\n\t"
  86541. "lsr r6, r8, #16\n\t"
  86542. "lsl r8, r8, #16\n\t"
  86543. "adds r5, r5, r8\n\t"
  86544. "adc r6, r6, #0\n\t"
  86545. "lsr r8, r10, #16\n\t"
  86546. "mul r9, r8, r9\n\t"
  86547. "add r6, r6, r9\n\t"
  86548. "lsl r9, r12, #16\n\t"
  86549. "lsr r9, r9, #16\n\t"
  86550. "mul r8, r9, r8\n\t"
  86551. "lsr r9, r8, #16\n\t"
  86552. "lsl r8, r8, #16\n\t"
  86553. "adds r5, r5, r8\n\t"
  86554. "adc r6, r6, r9\n\t"
  86555. #else
  86556. "umull r5, r6, r10, r12\n\t"
  86557. #endif
  86558. "mov r4, #0\n\t"
  86559. "mov r7, #0\n\t"
  86560. /* A[5] * A[10] */
  86561. "ldr r10, [%[a], #40]\n\t"
  86562. "ldr r12, [%[a], #20]\n\t"
  86563. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  86564. "lsl r8, r10, #16\n\t"
  86565. "lsl r9, r12, #16\n\t"
  86566. "lsr r8, r8, #16\n\t"
  86567. "lsr r9, r9, #16\n\t"
  86568. "mul r9, r8, r9\n\t"
  86569. "adds r5, r5, r9\n\t"
  86570. "adcs r6, r6, #0\n\t"
  86571. "adc r7, r7, #0\n\t"
  86572. "lsr r9, r12, #16\n\t"
  86573. "mul r8, r9, r8\n\t"
  86574. "lsr r9, r8, #16\n\t"
  86575. "lsl r8, r8, #16\n\t"
  86576. "adds r5, r5, r8\n\t"
  86577. "adcs r6, r6, r9\n\t"
  86578. "adc r7, r7, #0\n\t"
  86579. "lsr r8, r10, #16\n\t"
  86580. "lsr r9, r12, #16\n\t"
  86581. "mul r9, r8, r9\n\t"
  86582. "adds r6, r6, r9\n\t"
  86583. "adc r7, r7, #0\n\t"
  86584. "lsl r9, r12, #16\n\t"
  86585. "lsr r9, r9, #16\n\t"
  86586. "mul r8, r9, r8\n\t"
  86587. "lsr r9, r8, #16\n\t"
  86588. "lsl r8, r8, #16\n\t"
  86589. "adds r5, r5, r8\n\t"
  86590. "adcs r6, r6, r9\n\t"
  86591. "adc r7, r7, #0\n\t"
  86592. #else
  86593. "umull r8, r9, r10, r12\n\t"
  86594. "adds r5, r5, r8\n\t"
  86595. "adcs r6, r6, r9\n\t"
  86596. "adc r7, r7, #0\n\t"
  86597. #endif
  86598. /* A[6] * A[9] */
  86599. "ldr r10, [%[a], #36]\n\t"
  86600. "ldr r12, [%[a], #24]\n\t"
  86601. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  86602. "lsl r8, r10, #16\n\t"
  86603. "lsl r9, r12, #16\n\t"
  86604. "lsr r8, r8, #16\n\t"
  86605. "lsr r9, r9, #16\n\t"
  86606. "mul r9, r8, r9\n\t"
  86607. "adds r5, r5, r9\n\t"
  86608. "adcs r6, r6, #0\n\t"
  86609. "adc r7, r7, #0\n\t"
  86610. "lsr r9, r12, #16\n\t"
  86611. "mul r8, r9, r8\n\t"
  86612. "lsr r9, r8, #16\n\t"
  86613. "lsl r8, r8, #16\n\t"
  86614. "adds r5, r5, r8\n\t"
  86615. "adcs r6, r6, r9\n\t"
  86616. "adc r7, r7, #0\n\t"
  86617. "lsr r8, r10, #16\n\t"
  86618. "lsr r9, r12, #16\n\t"
  86619. "mul r9, r8, r9\n\t"
  86620. "adds r6, r6, r9\n\t"
  86621. "adc r7, r7, #0\n\t"
  86622. "lsl r9, r12, #16\n\t"
  86623. "lsr r9, r9, #16\n\t"
  86624. "mul r8, r9, r8\n\t"
  86625. "lsr r9, r8, #16\n\t"
  86626. "lsl r8, r8, #16\n\t"
  86627. "adds r5, r5, r8\n\t"
  86628. "adcs r6, r6, r9\n\t"
  86629. "adc r7, r7, #0\n\t"
  86630. #else
  86631. "umull r8, r9, r10, r12\n\t"
  86632. "adds r5, r5, r8\n\t"
  86633. "adcs r6, r6, r9\n\t"
  86634. "adc r7, r7, #0\n\t"
  86635. #endif
  86636. /* A[7] * A[8] */
  86637. "ldr r10, [%[a], #32]\n\t"
  86638. "ldr r12, [%[a], #28]\n\t"
  86639. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  86640. "lsl r8, r10, #16\n\t"
  86641. "lsl r9, r12, #16\n\t"
  86642. "lsr r8, r8, #16\n\t"
  86643. "lsr r9, r9, #16\n\t"
  86644. "mul r9, r8, r9\n\t"
  86645. "adds r5, r5, r9\n\t"
  86646. "adcs r6, r6, #0\n\t"
  86647. "adc r7, r7, #0\n\t"
  86648. "lsr r9, r12, #16\n\t"
  86649. "mul r8, r9, r8\n\t"
  86650. "lsr r9, r8, #16\n\t"
  86651. "lsl r8, r8, #16\n\t"
  86652. "adds r5, r5, r8\n\t"
  86653. "adcs r6, r6, r9\n\t"
  86654. "adc r7, r7, #0\n\t"
  86655. "lsr r8, r10, #16\n\t"
  86656. "lsr r9, r12, #16\n\t"
  86657. "mul r9, r8, r9\n\t"
  86658. "adds r6, r6, r9\n\t"
  86659. "adc r7, r7, #0\n\t"
  86660. "lsl r9, r12, #16\n\t"
  86661. "lsr r9, r9, #16\n\t"
  86662. "mul r8, r9, r8\n\t"
  86663. "lsr r9, r8, #16\n\t"
  86664. "lsl r8, r8, #16\n\t"
  86665. "adds r5, r5, r8\n\t"
  86666. "adcs r6, r6, r9\n\t"
  86667. "adc r7, r7, #0\n\t"
  86668. #else
  86669. "umull r8, r9, r10, r12\n\t"
  86670. "adds r5, r5, r8\n\t"
  86671. "adcs r6, r6, r9\n\t"
  86672. "adc r7, r7, #0\n\t"
  86673. #endif
  86674. "adds r5, r5, r5\n\t"
  86675. "adcs r6, r6, r6\n\t"
  86676. "adc r7, r7, r7\n\t"
  86677. "adds r2, r2, r5\n\t"
  86678. "adcs r3, r3, r6\n\t"
  86679. "adc r4, r4, r7\n\t"
  86680. "str r2, [%[r], #60]\n\t"
  86681. /* A[5] * A[11] */
  86682. "ldr r10, [%[a], #44]\n\t"
  86683. "ldr r12, [%[a], #20]\n\t"
  86684. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  86685. "lsl r8, r10, #16\n\t"
  86686. "lsl r5, r12, #16\n\t"
  86687. "lsr r8, r8, #16\n\t"
  86688. "lsr r5, r5, #16\n\t"
  86689. "mul r5, r8, r5\n\t"
  86690. "lsr r9, r12, #16\n\t"
  86691. "mul r8, r9, r8\n\t"
  86692. "lsr r6, r8, #16\n\t"
  86693. "lsl r8, r8, #16\n\t"
  86694. "adds r5, r5, r8\n\t"
  86695. "adc r6, r6, #0\n\t"
  86696. "lsr r8, r10, #16\n\t"
  86697. "mul r9, r8, r9\n\t"
  86698. "add r6, r6, r9\n\t"
  86699. "lsl r9, r12, #16\n\t"
  86700. "lsr r9, r9, #16\n\t"
  86701. "mul r8, r9, r8\n\t"
  86702. "lsr r9, r8, #16\n\t"
  86703. "lsl r8, r8, #16\n\t"
  86704. "adds r5, r5, r8\n\t"
  86705. "adc r6, r6, r9\n\t"
  86706. #else
  86707. "umull r5, r6, r10, r12\n\t"
  86708. #endif
  86709. "mov r2, #0\n\t"
  86710. "mov r7, #0\n\t"
  86711. /* A[6] * A[10] */
  86712. "ldr r10, [%[a], #40]\n\t"
  86713. "ldr r12, [%[a], #24]\n\t"
  86714. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  86715. "lsl r8, r10, #16\n\t"
  86716. "lsl r9, r12, #16\n\t"
  86717. "lsr r8, r8, #16\n\t"
  86718. "lsr r9, r9, #16\n\t"
  86719. "mul r9, r8, r9\n\t"
  86720. "adds r5, r5, r9\n\t"
  86721. "adcs r6, r6, #0\n\t"
  86722. "adc r7, r7, #0\n\t"
  86723. "lsr r9, r12, #16\n\t"
  86724. "mul r8, r9, r8\n\t"
  86725. "lsr r9, r8, #16\n\t"
  86726. "lsl r8, r8, #16\n\t"
  86727. "adds r5, r5, r8\n\t"
  86728. "adcs r6, r6, r9\n\t"
  86729. "adc r7, r7, #0\n\t"
  86730. "lsr r8, r10, #16\n\t"
  86731. "lsr r9, r12, #16\n\t"
  86732. "mul r9, r8, r9\n\t"
  86733. "adds r6, r6, r9\n\t"
  86734. "adc r7, r7, #0\n\t"
  86735. "lsl r9, r12, #16\n\t"
  86736. "lsr r9, r9, #16\n\t"
  86737. "mul r8, r9, r8\n\t"
  86738. "lsr r9, r8, #16\n\t"
  86739. "lsl r8, r8, #16\n\t"
  86740. "adds r5, r5, r8\n\t"
  86741. "adcs r6, r6, r9\n\t"
  86742. "adc r7, r7, #0\n\t"
  86743. #else
  86744. "umull r8, r9, r10, r12\n\t"
  86745. "adds r5, r5, r8\n\t"
  86746. "adcs r6, r6, r9\n\t"
  86747. "adc r7, r7, #0\n\t"
  86748. #endif
  86749. /* A[7] * A[9] */
  86750. "ldr r10, [%[a], #36]\n\t"
  86751. "ldr r12, [%[a], #28]\n\t"
  86752. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  86753. "lsl r8, r10, #16\n\t"
  86754. "lsl r9, r12, #16\n\t"
  86755. "lsr r8, r8, #16\n\t"
  86756. "lsr r9, r9, #16\n\t"
  86757. "mul r9, r8, r9\n\t"
  86758. "adds r5, r5, r9\n\t"
  86759. "adcs r6, r6, #0\n\t"
  86760. "adc r7, r7, #0\n\t"
  86761. "lsr r9, r12, #16\n\t"
  86762. "mul r8, r9, r8\n\t"
  86763. "lsr r9, r8, #16\n\t"
  86764. "lsl r8, r8, #16\n\t"
  86765. "adds r5, r5, r8\n\t"
  86766. "adcs r6, r6, r9\n\t"
  86767. "adc r7, r7, #0\n\t"
  86768. "lsr r8, r10, #16\n\t"
  86769. "lsr r9, r12, #16\n\t"
  86770. "mul r9, r8, r9\n\t"
  86771. "adds r6, r6, r9\n\t"
  86772. "adc r7, r7, #0\n\t"
  86773. "lsl r9, r12, #16\n\t"
  86774. "lsr r9, r9, #16\n\t"
  86775. "mul r8, r9, r8\n\t"
  86776. "lsr r9, r8, #16\n\t"
  86777. "lsl r8, r8, #16\n\t"
  86778. "adds r5, r5, r8\n\t"
  86779. "adcs r6, r6, r9\n\t"
  86780. "adc r7, r7, #0\n\t"
  86781. #else
  86782. "umull r8, r9, r10, r12\n\t"
  86783. "adds r5, r5, r8\n\t"
  86784. "adcs r6, r6, r9\n\t"
  86785. "adc r7, r7, #0\n\t"
  86786. #endif
  86787. /* A[8] * A[8] */
  86788. "ldr r10, [%[a], #32]\n\t"
  86789. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  86790. "lsl r8, r10, #16\n\t"
  86791. "lsr r9, r10, #16\n\t"
  86792. "lsr r8, r8, #16\n\t"
  86793. "mov r12, r8\n\t"
  86794. "mul r8, r12, r8\n\t"
  86795. "mov r12, r9\n\t"
  86796. "mul r9, r12, r9\n\t"
  86797. "adds r3, r3, r8\n\t"
  86798. "adcs r4, r4, r9\n\t"
  86799. "adc r2, r2, #0\n\t"
  86800. "lsr r9, r10, #16\n\t"
  86801. "lsl r8, r10, #16\n\t"
  86802. "lsr r8, r8, #16\n\t"
  86803. "mul r8, r9, r8\n\t"
  86804. "lsr r9, r8, #15\n\t"
  86805. "lsl r8, r8, #17\n\t"
  86806. "adds r3, r3, r8\n\t"
  86807. "adcs r4, r4, r9\n\t"
  86808. "adc r2, r2, #0\n\t"
  86809. "adds r5, r5, r5\n\t"
  86810. "adcs r6, r6, r6\n\t"
  86811. "adc r7, r7, r7\n\t"
  86812. #else
  86813. "umull r8, r9, r10, r10\n\t"
  86814. "adds r5, r5, r5\n\t"
  86815. "adcs r6, r6, r6\n\t"
  86816. "adc r7, r7, r7\n\t"
  86817. "adds r3, r3, r8\n\t"
  86818. "adcs r4, r4, r9\n\t"
  86819. "adc r2, r2, #0\n\t"
  86820. #endif
  86821. "adds r3, r3, r5\n\t"
  86822. "adcs r4, r4, r6\n\t"
  86823. "adc r2, r2, r7\n\t"
  86824. "str r3, [%[r], #64]\n\t"
  86825. /* A[6] * A[11] */
  86826. "ldr r10, [%[a], #44]\n\t"
  86827. "ldr r12, [%[a], #24]\n\t"
  86828. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  86829. "lsl r8, r10, #16\n\t"
  86830. "lsl r5, r12, #16\n\t"
  86831. "lsr r8, r8, #16\n\t"
  86832. "lsr r5, r5, #16\n\t"
  86833. "mul r5, r8, r5\n\t"
  86834. "lsr r9, r12, #16\n\t"
  86835. "mul r8, r9, r8\n\t"
  86836. "lsr r6, r8, #16\n\t"
  86837. "lsl r8, r8, #16\n\t"
  86838. "adds r5, r5, r8\n\t"
  86839. "adc r6, r6, #0\n\t"
  86840. "lsr r8, r10, #16\n\t"
  86841. "mul r9, r8, r9\n\t"
  86842. "add r6, r6, r9\n\t"
  86843. "lsl r9, r12, #16\n\t"
  86844. "lsr r9, r9, #16\n\t"
  86845. "mul r8, r9, r8\n\t"
  86846. "lsr r9, r8, #16\n\t"
  86847. "lsl r8, r8, #16\n\t"
  86848. "adds r5, r5, r8\n\t"
  86849. "adc r6, r6, r9\n\t"
  86850. #else
  86851. "umull r5, r6, r10, r12\n\t"
  86852. #endif
  86853. "mov r3, #0\n\t"
  86854. "mov r7, #0\n\t"
  86855. /* A[7] * A[10] */
  86856. "ldr r10, [%[a], #40]\n\t"
  86857. "ldr r12, [%[a], #28]\n\t"
  86858. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  86859. "lsl r8, r10, #16\n\t"
  86860. "lsl r9, r12, #16\n\t"
  86861. "lsr r8, r8, #16\n\t"
  86862. "lsr r9, r9, #16\n\t"
  86863. "mul r9, r8, r9\n\t"
  86864. "adds r5, r5, r9\n\t"
  86865. "adcs r6, r6, #0\n\t"
  86866. "adc r7, r7, #0\n\t"
  86867. "lsr r9, r12, #16\n\t"
  86868. "mul r8, r9, r8\n\t"
  86869. "lsr r9, r8, #16\n\t"
  86870. "lsl r8, r8, #16\n\t"
  86871. "adds r5, r5, r8\n\t"
  86872. "adcs r6, r6, r9\n\t"
  86873. "adc r7, r7, #0\n\t"
  86874. "lsr r8, r10, #16\n\t"
  86875. "lsr r9, r12, #16\n\t"
  86876. "mul r9, r8, r9\n\t"
  86877. "adds r6, r6, r9\n\t"
  86878. "adc r7, r7, #0\n\t"
  86879. "lsl r9, r12, #16\n\t"
  86880. "lsr r9, r9, #16\n\t"
  86881. "mul r8, r9, r8\n\t"
  86882. "lsr r9, r8, #16\n\t"
  86883. "lsl r8, r8, #16\n\t"
  86884. "adds r5, r5, r8\n\t"
  86885. "adcs r6, r6, r9\n\t"
  86886. "adc r7, r7, #0\n\t"
  86887. #else
  86888. "umull r8, r9, r10, r12\n\t"
  86889. "adds r5, r5, r8\n\t"
  86890. "adcs r6, r6, r9\n\t"
  86891. "adc r7, r7, #0\n\t"
  86892. #endif
  86893. /* A[8] * A[9] */
  86894. "ldr r10, [%[a], #36]\n\t"
  86895. "ldr r12, [%[a], #32]\n\t"
  86896. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  86897. "lsl r8, r10, #16\n\t"
  86898. "lsl r9, r12, #16\n\t"
  86899. "lsr r8, r8, #16\n\t"
  86900. "lsr r9, r9, #16\n\t"
  86901. "mul r9, r8, r9\n\t"
  86902. "adds r5, r5, r9\n\t"
  86903. "adcs r6, r6, #0\n\t"
  86904. "adc r7, r7, #0\n\t"
  86905. "lsr r9, r12, #16\n\t"
  86906. "mul r8, r9, r8\n\t"
  86907. "lsr r9, r8, #16\n\t"
  86908. "lsl r8, r8, #16\n\t"
  86909. "adds r5, r5, r8\n\t"
  86910. "adcs r6, r6, r9\n\t"
  86911. "adc r7, r7, #0\n\t"
  86912. "lsr r8, r10, #16\n\t"
  86913. "lsr r9, r12, #16\n\t"
  86914. "mul r9, r8, r9\n\t"
  86915. "adds r6, r6, r9\n\t"
  86916. "adc r7, r7, #0\n\t"
  86917. "lsl r9, r12, #16\n\t"
  86918. "lsr r9, r9, #16\n\t"
  86919. "mul r8, r9, r8\n\t"
  86920. "lsr r9, r8, #16\n\t"
  86921. "lsl r8, r8, #16\n\t"
  86922. "adds r5, r5, r8\n\t"
  86923. "adcs r6, r6, r9\n\t"
  86924. "adc r7, r7, #0\n\t"
  86925. #else
  86926. "umull r8, r9, r10, r12\n\t"
  86927. "adds r5, r5, r8\n\t"
  86928. "adcs r6, r6, r9\n\t"
  86929. "adc r7, r7, #0\n\t"
  86930. #endif
  86931. "adds r5, r5, r5\n\t"
  86932. "adcs r6, r6, r6\n\t"
  86933. "adc r7, r7, r7\n\t"
  86934. "adds r4, r4, r5\n\t"
  86935. "adcs r2, r2, r6\n\t"
  86936. "adc r3, r3, r7\n\t"
  86937. "str r4, [%[r], #68]\n\t"
  86938. /* A[7] * A[11] */
  86939. "ldr r10, [%[a], #44]\n\t"
  86940. "ldr r12, [%[a], #28]\n\t"
  86941. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  86942. "lsl r8, r10, #16\n\t"
  86943. "lsl r9, r12, #16\n\t"
  86944. "lsr r8, r8, #16\n\t"
  86945. "lsr r9, r9, #16\n\t"
  86946. "mul r9, r8, r9\n\t"
  86947. "adds r2, r2, r9\n\t"
  86948. "adcs r3, r3, #0\n\t"
  86949. "mov r4, #0\n\t"
  86950. "adc r4, r4, #0\n\t"
  86951. "adds r2, r2, r9\n\t"
  86952. "adcs r3, r3, #0\n\t"
  86953. "adc r4, r4, #0\n\t"
  86954. "lsr r9, r12, #16\n\t"
  86955. "mul r8, r9, r8\n\t"
  86956. "lsr r9, r8, #16\n\t"
  86957. "lsl r8, r8, #16\n\t"
  86958. "adds r2, r2, r8\n\t"
  86959. "adcs r3, r3, r9\n\t"
  86960. "adc r4, r4, #0\n\t"
  86961. "adds r2, r2, r8\n\t"
  86962. "adcs r3, r3, r9\n\t"
  86963. "adc r4, r4, #0\n\t"
  86964. "lsr r8, r10, #16\n\t"
  86965. "lsr r9, r12, #16\n\t"
  86966. "mul r9, r8, r9\n\t"
  86967. "adds r3, r3, r9\n\t"
  86968. "adc r4, r4, #0\n\t"
  86969. "adds r3, r3, r9\n\t"
  86970. "adc r4, r4, #0\n\t"
  86971. "lsl r9, r12, #16\n\t"
  86972. "lsr r9, r9, #16\n\t"
  86973. "mul r8, r9, r8\n\t"
  86974. "lsr r9, r8, #16\n\t"
  86975. "lsl r8, r8, #16\n\t"
  86976. "adds r2, r2, r8\n\t"
  86977. "adcs r3, r3, r9\n\t"
  86978. "adc r4, r4, #0\n\t"
  86979. "adds r2, r2, r8\n\t"
  86980. "adcs r3, r3, r9\n\t"
  86981. "adc r4, r4, #0\n\t"
  86982. #else
  86983. "umull r8, r9, r10, r12\n\t"
  86984. "adds r2, r2, r8\n\t"
  86985. "adcs r3, r3, r9\n\t"
  86986. "mov r4, #0\n\t"
  86987. "adc r4, r4, #0\n\t"
  86988. "adds r2, r2, r8\n\t"
  86989. "adcs r3, r3, r9\n\t"
  86990. "mov r4, #0\n\t"
  86991. "adc r4, r4, #0\n\t"
  86992. #endif
  86993. /* A[8] * A[10] */
  86994. "ldr r10, [%[a], #40]\n\t"
  86995. "ldr r12, [%[a], #32]\n\t"
  86996. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  86997. "lsl r8, r10, #16\n\t"
  86998. "lsl r9, r12, #16\n\t"
  86999. "lsr r8, r8, #16\n\t"
  87000. "lsr r9, r9, #16\n\t"
  87001. "mul r9, r8, r9\n\t"
  87002. "adds r2, r2, r9\n\t"
  87003. "adcs r3, r3, #0\n\t"
  87004. "adc r4, r4, #0\n\t"
  87005. "adds r2, r2, r9\n\t"
  87006. "adcs r3, r3, #0\n\t"
  87007. "adc r4, r4, #0\n\t"
  87008. "lsr r9, r12, #16\n\t"
  87009. "mul r8, r9, r8\n\t"
  87010. "lsr r9, r8, #16\n\t"
  87011. "lsl r8, r8, #16\n\t"
  87012. "adds r2, r2, r8\n\t"
  87013. "adcs r3, r3, r9\n\t"
  87014. "adc r4, r4, #0\n\t"
  87015. "adds r2, r2, r8\n\t"
  87016. "adcs r3, r3, r9\n\t"
  87017. "adc r4, r4, #0\n\t"
  87018. "lsr r8, r10, #16\n\t"
  87019. "lsr r9, r12, #16\n\t"
  87020. "mul r9, r8, r9\n\t"
  87021. "adds r3, r3, r9\n\t"
  87022. "adc r4, r4, #0\n\t"
  87023. "adds r3, r3, r9\n\t"
  87024. "adc r4, r4, #0\n\t"
  87025. "lsl r9, r12, #16\n\t"
  87026. "lsr r9, r9, #16\n\t"
  87027. "mul r8, r9, r8\n\t"
  87028. "lsr r9, r8, #16\n\t"
  87029. "lsl r8, r8, #16\n\t"
  87030. "adds r2, r2, r8\n\t"
  87031. "adcs r3, r3, r9\n\t"
  87032. "adc r4, r4, #0\n\t"
  87033. "adds r2, r2, r8\n\t"
  87034. "adcs r3, r3, r9\n\t"
  87035. "adc r4, r4, #0\n\t"
  87036. #else
  87037. "umull r8, r9, r10, r12\n\t"
  87038. "adds r2, r2, r8\n\t"
  87039. "adcs r3, r3, r9\n\t"
  87040. "adc r4, r4, #0\n\t"
  87041. "adds r2, r2, r8\n\t"
  87042. "adcs r3, r3, r9\n\t"
  87043. "adc r4, r4, #0\n\t"
  87044. #endif
  87045. /* A[9] * A[9] */
  87046. "ldr r10, [%[a], #36]\n\t"
  87047. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  87048. "lsl r8, r10, #16\n\t"
  87049. "lsr r9, r10, #16\n\t"
  87050. "lsr r8, r8, #16\n\t"
  87051. "mov r12, r8\n\t"
  87052. "mul r8, r12, r8\n\t"
  87053. "mov r12, r9\n\t"
  87054. "mul r9, r12, r9\n\t"
  87055. "adds r2, r2, r8\n\t"
  87056. "adcs r3, r3, r9\n\t"
  87057. "adc r4, r4, #0\n\t"
  87058. "lsr r9, r10, #16\n\t"
  87059. "lsl r8, r10, #16\n\t"
  87060. "lsr r8, r8, #16\n\t"
  87061. "mul r8, r9, r8\n\t"
  87062. "lsr r9, r8, #15\n\t"
  87063. "lsl r8, r8, #17\n\t"
  87064. "adds r2, r2, r8\n\t"
  87065. "adcs r3, r3, r9\n\t"
  87066. "adc r4, r4, #0\n\t"
  87067. #else
  87068. "umull r8, r9, r10, r10\n\t"
  87069. "adds r2, r2, r8\n\t"
  87070. "adcs r3, r3, r9\n\t"
  87071. "adc r4, r4, #0\n\t"
  87072. #endif
  87073. "str r2, [%[r], #72]\n\t"
  87074. /* A[8] * A[11] */
  87075. "ldr r10, [%[a], #44]\n\t"
  87076. "ldr r12, [%[a], #32]\n\t"
  87077. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  87078. "lsl r8, r10, #16\n\t"
  87079. "lsl r9, r12, #16\n\t"
  87080. "lsr r8, r8, #16\n\t"
  87081. "lsr r9, r9, #16\n\t"
  87082. "mul r9, r8, r9\n\t"
  87083. "adds r3, r3, r9\n\t"
  87084. "adcs r4, r4, #0\n\t"
  87085. "mov r2, #0\n\t"
  87086. "adc r2, r2, #0\n\t"
  87087. "adds r3, r3, r9\n\t"
  87088. "adcs r4, r4, #0\n\t"
  87089. "adc r2, r2, #0\n\t"
  87090. "lsr r9, r12, #16\n\t"
  87091. "mul r8, r9, r8\n\t"
  87092. "lsr r9, r8, #16\n\t"
  87093. "lsl r8, r8, #16\n\t"
  87094. "adds r3, r3, r8\n\t"
  87095. "adcs r4, r4, r9\n\t"
  87096. "adc r2, r2, #0\n\t"
  87097. "adds r3, r3, r8\n\t"
  87098. "adcs r4, r4, r9\n\t"
  87099. "adc r2, r2, #0\n\t"
  87100. "lsr r8, r10, #16\n\t"
  87101. "lsr r9, r12, #16\n\t"
  87102. "mul r9, r8, r9\n\t"
  87103. "adds r4, r4, r9\n\t"
  87104. "adc r2, r2, #0\n\t"
  87105. "adds r4, r4, r9\n\t"
  87106. "adc r2, r2, #0\n\t"
  87107. "lsl r9, r12, #16\n\t"
  87108. "lsr r9, r9, #16\n\t"
  87109. "mul r8, r9, r8\n\t"
  87110. "lsr r9, r8, #16\n\t"
  87111. "lsl r8, r8, #16\n\t"
  87112. "adds r3, r3, r8\n\t"
  87113. "adcs r4, r4, r9\n\t"
  87114. "adc r2, r2, #0\n\t"
  87115. "adds r3, r3, r8\n\t"
  87116. "adcs r4, r4, r9\n\t"
  87117. "adc r2, r2, #0\n\t"
  87118. #else
  87119. "umull r8, r9, r10, r12\n\t"
  87120. "adds r3, r3, r8\n\t"
  87121. "adcs r4, r4, r9\n\t"
  87122. "mov r2, #0\n\t"
  87123. "adc r2, r2, #0\n\t"
  87124. "adds r3, r3, r8\n\t"
  87125. "adcs r4, r4, r9\n\t"
  87126. "mov r2, #0\n\t"
  87127. "adc r2, r2, #0\n\t"
  87128. #endif
  87129. /* A[9] * A[10] */
  87130. "ldr r10, [%[a], #40]\n\t"
  87131. "ldr r12, [%[a], #36]\n\t"
  87132. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  87133. "lsl r8, r10, #16\n\t"
  87134. "lsl r9, r12, #16\n\t"
  87135. "lsr r8, r8, #16\n\t"
  87136. "lsr r9, r9, #16\n\t"
  87137. "mul r9, r8, r9\n\t"
  87138. "adds r3, r3, r9\n\t"
  87139. "adcs r4, r4, #0\n\t"
  87140. "adc r2, r2, #0\n\t"
  87141. "adds r3, r3, r9\n\t"
  87142. "adcs r4, r4, #0\n\t"
  87143. "adc r2, r2, #0\n\t"
  87144. "lsr r9, r12, #16\n\t"
  87145. "mul r8, r9, r8\n\t"
  87146. "lsr r9, r8, #16\n\t"
  87147. "lsl r8, r8, #16\n\t"
  87148. "adds r3, r3, r8\n\t"
  87149. "adcs r4, r4, r9\n\t"
  87150. "adc r2, r2, #0\n\t"
  87151. "adds r3, r3, r8\n\t"
  87152. "adcs r4, r4, r9\n\t"
  87153. "adc r2, r2, #0\n\t"
  87154. "lsr r8, r10, #16\n\t"
  87155. "lsr r9, r12, #16\n\t"
  87156. "mul r9, r8, r9\n\t"
  87157. "adds r4, r4, r9\n\t"
  87158. "adc r2, r2, #0\n\t"
  87159. "adds r4, r4, r9\n\t"
  87160. "adc r2, r2, #0\n\t"
  87161. "lsl r9, r12, #16\n\t"
  87162. "lsr r9, r9, #16\n\t"
  87163. "mul r8, r9, r8\n\t"
  87164. "lsr r9, r8, #16\n\t"
  87165. "lsl r8, r8, #16\n\t"
  87166. "adds r3, r3, r8\n\t"
  87167. "adcs r4, r4, r9\n\t"
  87168. "adc r2, r2, #0\n\t"
  87169. "adds r3, r3, r8\n\t"
  87170. "adcs r4, r4, r9\n\t"
  87171. "adc r2, r2, #0\n\t"
  87172. #else
  87173. "umull r8, r9, r10, r12\n\t"
  87174. "adds r3, r3, r8\n\t"
  87175. "adcs r4, r4, r9\n\t"
  87176. "adc r2, r2, #0\n\t"
  87177. "adds r3, r3, r8\n\t"
  87178. "adcs r4, r4, r9\n\t"
  87179. "adc r2, r2, #0\n\t"
  87180. #endif
  87181. "str r3, [%[r], #76]\n\t"
  87182. /* A[9] * A[11] */
  87183. "ldr r10, [%[a], #44]\n\t"
  87184. "ldr r12, [%[a], #36]\n\t"
  87185. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  87186. "lsl r8, r10, #16\n\t"
  87187. "lsl r9, r12, #16\n\t"
  87188. "lsr r8, r8, #16\n\t"
  87189. "lsr r9, r9, #16\n\t"
  87190. "mul r9, r8, r9\n\t"
  87191. "adds r4, r4, r9\n\t"
  87192. "adcs r2, r2, #0\n\t"
  87193. "mov r3, #0\n\t"
  87194. "adc r3, r3, #0\n\t"
  87195. "adds r4, r4, r9\n\t"
  87196. "adcs r2, r2, #0\n\t"
  87197. "adc r3, r3, #0\n\t"
  87198. "lsr r9, r12, #16\n\t"
  87199. "mul r8, r9, r8\n\t"
  87200. "lsr r9, r8, #16\n\t"
  87201. "lsl r8, r8, #16\n\t"
  87202. "adds r4, r4, r8\n\t"
  87203. "adcs r2, r2, r9\n\t"
  87204. "adc r3, r3, #0\n\t"
  87205. "adds r4, r4, r8\n\t"
  87206. "adcs r2, r2, r9\n\t"
  87207. "adc r3, r3, #0\n\t"
  87208. "lsr r8, r10, #16\n\t"
  87209. "lsr r9, r12, #16\n\t"
  87210. "mul r9, r8, r9\n\t"
  87211. "adds r2, r2, r9\n\t"
  87212. "adc r3, r3, #0\n\t"
  87213. "adds r2, r2, r9\n\t"
  87214. "adc r3, r3, #0\n\t"
  87215. "lsl r9, r12, #16\n\t"
  87216. "lsr r9, r9, #16\n\t"
  87217. "mul r8, r9, r8\n\t"
  87218. "lsr r9, r8, #16\n\t"
  87219. "lsl r8, r8, #16\n\t"
  87220. "adds r4, r4, r8\n\t"
  87221. "adcs r2, r2, r9\n\t"
  87222. "adc r3, r3, #0\n\t"
  87223. "adds r4, r4, r8\n\t"
  87224. "adcs r2, r2, r9\n\t"
  87225. "adc r3, r3, #0\n\t"
  87226. #else
  87227. "umull r8, r9, r10, r12\n\t"
  87228. "adds r4, r4, r8\n\t"
  87229. "adcs r2, r2, r9\n\t"
  87230. "mov r3, #0\n\t"
  87231. "adc r3, r3, #0\n\t"
  87232. "adds r4, r4, r8\n\t"
  87233. "adcs r2, r2, r9\n\t"
  87234. "mov r3, #0\n\t"
  87235. "adc r3, r3, #0\n\t"
  87236. #endif
  87237. /* A[10] * A[10] */
  87238. "ldr r10, [%[a], #40]\n\t"
  87239. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  87240. "lsl r8, r10, #16\n\t"
  87241. "lsr r9, r10, #16\n\t"
  87242. "lsr r8, r8, #16\n\t"
  87243. "mov r12, r8\n\t"
  87244. "mul r8, r12, r8\n\t"
  87245. "mov r12, r9\n\t"
  87246. "mul r9, r12, r9\n\t"
  87247. "adds r4, r4, r8\n\t"
  87248. "adcs r2, r2, r9\n\t"
  87249. "adc r3, r3, #0\n\t"
  87250. "lsr r9, r10, #16\n\t"
  87251. "lsl r8, r10, #16\n\t"
  87252. "lsr r8, r8, #16\n\t"
  87253. "mul r8, r9, r8\n\t"
  87254. "lsr r9, r8, #15\n\t"
  87255. "lsl r8, r8, #17\n\t"
  87256. "adds r4, r4, r8\n\t"
  87257. "adcs r2, r2, r9\n\t"
  87258. "adc r3, r3, #0\n\t"
  87259. #else
  87260. "umull r8, r9, r10, r10\n\t"
  87261. "adds r4, r4, r8\n\t"
  87262. "adcs r2, r2, r9\n\t"
  87263. "adc r3, r3, #0\n\t"
  87264. #endif
  87265. "str r4, [%[r], #80]\n\t"
  87266. /* A[10] * A[11] */
  87267. "ldr r10, [%[a], #44]\n\t"
  87268. "ldr r12, [%[a], #40]\n\t"
  87269. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  87270. "lsl r8, r10, #16\n\t"
  87271. "lsl r9, r12, #16\n\t"
  87272. "lsr r8, r8, #16\n\t"
  87273. "lsr r9, r9, #16\n\t"
  87274. "mul r9, r8, r9\n\t"
  87275. "adds r2, r2, r9\n\t"
  87276. "adcs r3, r3, #0\n\t"
  87277. "mov r4, #0\n\t"
  87278. "adc r4, r4, #0\n\t"
  87279. "adds r2, r2, r9\n\t"
  87280. "adcs r3, r3, #0\n\t"
  87281. "adc r4, r4, #0\n\t"
  87282. "lsr r9, r12, #16\n\t"
  87283. "mul r8, r9, r8\n\t"
  87284. "lsr r9, r8, #16\n\t"
  87285. "lsl r8, r8, #16\n\t"
  87286. "adds r2, r2, r8\n\t"
  87287. "adcs r3, r3, r9\n\t"
  87288. "adc r4, r4, #0\n\t"
  87289. "adds r2, r2, r8\n\t"
  87290. "adcs r3, r3, r9\n\t"
  87291. "adc r4, r4, #0\n\t"
  87292. "lsr r8, r10, #16\n\t"
  87293. "lsr r9, r12, #16\n\t"
  87294. "mul r9, r8, r9\n\t"
  87295. "adds r3, r3, r9\n\t"
  87296. "adc r4, r4, #0\n\t"
  87297. "adds r3, r3, r9\n\t"
  87298. "adc r4, r4, #0\n\t"
  87299. "lsl r9, r12, #16\n\t"
  87300. "lsr r9, r9, #16\n\t"
  87301. "mul r8, r9, r8\n\t"
  87302. "lsr r9, r8, #16\n\t"
  87303. "lsl r8, r8, #16\n\t"
  87304. "adds r2, r2, r8\n\t"
  87305. "adcs r3, r3, r9\n\t"
  87306. "adc r4, r4, #0\n\t"
  87307. "adds r2, r2, r8\n\t"
  87308. "adcs r3, r3, r9\n\t"
  87309. "adc r4, r4, #0\n\t"
  87310. #else
  87311. "umull r8, r9, r10, r12\n\t"
  87312. "adds r2, r2, r8\n\t"
  87313. "adcs r3, r3, r9\n\t"
  87314. "mov r4, #0\n\t"
  87315. "adc r4, r4, #0\n\t"
  87316. "adds r2, r2, r8\n\t"
  87317. "adcs r3, r3, r9\n\t"
  87318. "mov r4, #0\n\t"
  87319. "adc r4, r4, #0\n\t"
  87320. #endif
  87321. "str r2, [%[r], #84]\n\t"
  87322. /* A[11] * A[11] */
  87323. "ldr r10, [%[a], #44]\n\t"
  87324. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  87325. "lsl r8, r10, #16\n\t"
  87326. "lsr r9, r10, #16\n\t"
  87327. "lsr r8, r8, #16\n\t"
  87328. "mov r12, r8\n\t"
  87329. "mul r8, r12, r8\n\t"
  87330. "mov r12, r9\n\t"
  87331. "mul r9, r12, r9\n\t"
  87332. "adds r3, r3, r8\n\t"
  87333. "adc r4, r4, r9\n\t"
  87334. "lsr r9, r10, #16\n\t"
  87335. "lsl r8, r10, #16\n\t"
  87336. "lsr r8, r8, #16\n\t"
  87337. "mul r8, r9, r8\n\t"
  87338. "lsr r9, r8, #15\n\t"
  87339. "lsl r8, r8, #17\n\t"
  87340. "adds r3, r3, r8\n\t"
  87341. "adc r4, r4, r9\n\t"
  87342. #else
  87343. "umull r8, r9, r10, r10\n\t"
  87344. "adds r3, r3, r8\n\t"
  87345. "adc r4, r4, r9\n\t"
  87346. #endif
  87347. "str r3, [%[r], #88]\n\t"
  87348. "str r4, [%[r], #92]\n\t"
  87349. "ldm sp!, {r2, r3, r4, r8}\n\t"
  87350. "stm %[r]!, {r2, r3, r4, r8}\n\t"
  87351. "ldm sp!, {r2, r3, r4, r8}\n\t"
  87352. "stm %[r]!, {r2, r3, r4, r8}\n\t"
  87353. "ldm sp!, {r2, r3, r4, r8}\n\t"
  87354. "stm %[r]!, {r2, r3, r4, r8}\n\t"
  87355. : [r] "+r" (r), [a] "+r" (a)
  87356. :
  87357. : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r12", "cc"
  87358. );
  87359. }
  87360. #endif /* WOLFSSL_SP_SMALL */
  87361. #ifdef WOLFSSL_SP_SMALL
  87362. /* Add b to a into r. (r = a + b)
  87363. *
  87364. * r A single precision integer.
  87365. * a A single precision integer.
  87366. * b A single precision integer.
  87367. */
  87368. static sp_digit sp_384_add_12(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p)
  87369. {
  87370. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  87371. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  87372. register const sp_digit* b asm ("r2") = (const sp_digit*)b_p;
  87373. __asm__ __volatile__ (
  87374. "mov r3, #0\n\t"
  87375. "add r12, %[a], #48\n\t"
  87376. "\n"
  87377. "L_sp_384_add_12_word_%=: \n\t"
  87378. "adds r3, r3, #-1\n\t"
  87379. "ldm %[a]!, {r4, r5, r6, r7}\n\t"
  87380. "ldm %[b]!, {r8, r9, r10, r11}\n\t"
  87381. "adcs r4, r4, r8\n\t"
  87382. "adcs r5, r5, r9\n\t"
  87383. "adcs r6, r6, r10\n\t"
  87384. "adcs r7, r7, r11\n\t"
  87385. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  87386. "mov r4, #0\n\t"
  87387. "adc r3, r4, #0\n\t"
  87388. "cmp %[a], r12\n\t"
  87389. "bne L_sp_384_add_12_word_%=\n\t"
  87390. "mov %[r], r3\n\t"
  87391. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  87392. :
  87393. : "memory", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r3", "r12", "cc"
  87394. );
  87395. return (uint32_t)(size_t)r;
  87396. }
  87397. #else
  87398. /* Add b to a into r. (r = a + b)
  87399. *
  87400. * r A single precision integer.
  87401. * a A single precision integer.
  87402. * b A single precision integer.
  87403. */
  87404. static sp_digit sp_384_add_12(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p)
  87405. {
  87406. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  87407. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  87408. register const sp_digit* b asm ("r2") = (const sp_digit*)b_p;
  87409. __asm__ __volatile__ (
  87410. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  87411. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  87412. "adds r3, r3, r7\n\t"
  87413. "adcs r4, r4, r8\n\t"
  87414. "adcs r5, r5, r9\n\t"
  87415. "adcs r6, r6, r10\n\t"
  87416. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  87417. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  87418. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  87419. "adcs r3, r3, r7\n\t"
  87420. "adcs r4, r4, r8\n\t"
  87421. "adcs r5, r5, r9\n\t"
  87422. "adcs r6, r6, r10\n\t"
  87423. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  87424. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  87425. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  87426. "adcs r3, r3, r7\n\t"
  87427. "adcs r4, r4, r8\n\t"
  87428. "adcs r5, r5, r9\n\t"
  87429. "adcs r6, r6, r10\n\t"
  87430. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  87431. "mov %[r], #0\n\t"
  87432. "adc %[r], %[r], #0\n\t"
  87433. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  87434. :
  87435. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "cc"
  87436. );
  87437. return (uint32_t)(size_t)r;
  87438. }
  87439. #endif /* WOLFSSL_SP_SMALL */
  87440. /* Multiply a number by Montgomery normalizer mod modulus (prime).
  87441. *
  87442. * r The resulting Montgomery form number.
  87443. * a The number to convert.
  87444. * m The modulus (prime).
  87445. * returns MEMORY_E when memory allocation fails and MP_OKAY otherwise.
  87446. */
  87447. static int sp_384_mod_mul_norm_12(sp_digit* r, const sp_digit* a, const sp_digit* m)
  87448. {
  87449. #ifdef WOLFSSL_SP_SMALL_STACK
  87450. int64_t* t = NULL;
  87451. #else
  87452. int64_t t[12];
  87453. #endif
  87454. int64_t o;
  87455. int err = MP_OKAY;
  87456. (void)m;
  87457. #ifdef WOLFSSL_SP_SMALL_STACK
  87458. t = (int64_t*)XMALLOC(sizeof(int64_t) * 12, NULL, DYNAMIC_TYPE_ECC);
  87459. if (t == NULL) {
  87460. err = MEMORY_E;
  87461. }
  87462. #endif
  87463. if (err == MP_OKAY) {
  87464. /* 1 0 0 0 0 0 0 0 1 1 0 -1 */
  87465. t[0] = 0 + (int64_t)a[0] + (int64_t)a[8] + (int64_t)a[9] - (int64_t)a[11];
  87466. /* -1 1 0 0 0 0 0 0 -1 0 1 1 */
  87467. t[1] = 0 - (int64_t)a[0] + (int64_t)a[1] - (int64_t)a[8] + (int64_t)a[10] + (int64_t)a[11];
  87468. /* 0 -1 1 0 0 0 0 0 0 -1 0 1 */
  87469. t[2] = 0 - (int64_t)a[1] + (int64_t)a[2] - (int64_t)a[9] + (int64_t)a[11];
  87470. /* 1 0 -1 1 0 0 0 0 1 1 -1 -1 */
  87471. 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];
  87472. /* 1 1 0 -1 1 0 0 0 1 2 1 -2 */
  87473. 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];
  87474. /* 0 1 1 0 -1 1 0 0 0 1 2 1 */
  87475. 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];
  87476. /* 0 0 1 1 0 -1 1 0 0 0 1 2 */
  87477. 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];
  87478. /* 0 0 0 1 1 0 -1 1 0 0 0 1 */
  87479. t[7] = 0 + (int64_t)a[3] + (int64_t)a[4] - (int64_t)a[6] + (int64_t)a[7] + (int64_t)a[11];
  87480. /* 0 0 0 0 1 1 0 -1 1 0 0 0 */
  87481. t[8] = 0 + (int64_t)a[4] + (int64_t)a[5] - (int64_t)a[7] + (int64_t)a[8];
  87482. /* 0 0 0 0 0 1 1 0 -1 1 0 0 */
  87483. t[9] = 0 + (int64_t)a[5] + (int64_t)a[6] - (int64_t)a[8] + (int64_t)a[9];
  87484. /* 0 0 0 0 0 0 1 1 0 -1 1 0 */
  87485. t[10] = 0 + (int64_t)a[6] + (int64_t)a[7] - (int64_t)a[9] + (int64_t)a[10];
  87486. /* 0 0 0 0 0 0 0 1 1 0 -1 1 */
  87487. t[11] = 0 + (int64_t)a[7] + (int64_t)a[8] - (int64_t)a[10] + (int64_t)a[11];
  87488. t[1] += t[0] >> 32; t[0] &= 0xffffffff;
  87489. t[2] += t[1] >> 32; t[1] &= 0xffffffff;
  87490. t[3] += t[2] >> 32; t[2] &= 0xffffffff;
  87491. t[4] += t[3] >> 32; t[3] &= 0xffffffff;
  87492. t[5] += t[4] >> 32; t[4] &= 0xffffffff;
  87493. t[6] += t[5] >> 32; t[5] &= 0xffffffff;
  87494. t[7] += t[6] >> 32; t[6] &= 0xffffffff;
  87495. t[8] += t[7] >> 32; t[7] &= 0xffffffff;
  87496. t[9] += t[8] >> 32; t[8] &= 0xffffffff;
  87497. t[10] += t[9] >> 32; t[9] &= 0xffffffff;
  87498. t[11] += t[10] >> 32; t[10] &= 0xffffffff;
  87499. o = t[11] >> 32; t[11] &= 0xffffffff;
  87500. t[0] += o;
  87501. t[1] -= o;
  87502. t[3] += o;
  87503. t[4] += o;
  87504. t[1] += t[0] >> 32; t[0] &= 0xffffffff;
  87505. t[2] += t[1] >> 32; t[1] &= 0xffffffff;
  87506. t[3] += t[2] >> 32; t[2] &= 0xffffffff;
  87507. t[4] += t[3] >> 32; t[3] &= 0xffffffff;
  87508. t[5] += t[4] >> 32; t[4] &= 0xffffffff;
  87509. t[6] += t[5] >> 32; t[5] &= 0xffffffff;
  87510. t[7] += t[6] >> 32; t[6] &= 0xffffffff;
  87511. t[8] += t[7] >> 32; t[7] &= 0xffffffff;
  87512. t[9] += t[8] >> 32; t[8] &= 0xffffffff;
  87513. t[10] += t[9] >> 32; t[9] &= 0xffffffff;
  87514. t[11] += t[10] >> 32; t[10] &= 0xffffffff;
  87515. r[0] = t[0];
  87516. r[1] = t[1];
  87517. r[2] = t[2];
  87518. r[3] = t[3];
  87519. r[4] = t[4];
  87520. r[5] = t[5];
  87521. r[6] = t[6];
  87522. r[7] = t[7];
  87523. r[8] = t[8];
  87524. r[9] = t[9];
  87525. r[10] = t[10];
  87526. r[11] = t[11];
  87527. }
  87528. #ifdef WOLFSSL_SP_SMALL_STACK
  87529. if (t != NULL)
  87530. XFREE(t, NULL, DYNAMIC_TYPE_ECC);
  87531. #endif
  87532. return err;
  87533. }
  87534. /* Convert an mp_int to an array of sp_digit.
  87535. *
  87536. * r A single precision integer.
  87537. * size Maximum number of bytes to convert
  87538. * a A multi-precision integer.
  87539. */
  87540. static void sp_384_from_mp(sp_digit* r, int size, const mp_int* a)
  87541. {
  87542. #if DIGIT_BIT == 32
  87543. int i;
  87544. sp_digit j = (sp_digit)0 - (sp_digit)a->used;
  87545. int o = 0;
  87546. for (i = 0; i < size; i++) {
  87547. sp_digit mask = (sp_digit)0 - (j >> 31);
  87548. r[i] = a->dp[o] & mask;
  87549. j++;
  87550. o += (int)(j >> 31);
  87551. }
  87552. #elif DIGIT_BIT > 32
  87553. unsigned int i;
  87554. int j = 0;
  87555. word32 s = 0;
  87556. r[0] = 0;
  87557. for (i = 0; i < (unsigned int)a->used && j < size; i++) {
  87558. r[j] |= ((sp_digit)a->dp[i] << s);
  87559. r[j] &= 0xffffffff;
  87560. s = 32U - s;
  87561. if (j + 1 >= size) {
  87562. break;
  87563. }
  87564. /* lint allow cast of mismatch word32 and mp_digit */
  87565. r[++j] = (sp_digit)(a->dp[i] >> s); /*lint !e9033*/
  87566. while ((s + 32U) <= (word32)DIGIT_BIT) {
  87567. s += 32U;
  87568. r[j] &= 0xffffffff;
  87569. if (j + 1 >= size) {
  87570. break;
  87571. }
  87572. if (s < (word32)DIGIT_BIT) {
  87573. /* lint allow cast of mismatch word32 and mp_digit */
  87574. r[++j] = (sp_digit)(a->dp[i] >> s); /*lint !e9033*/
  87575. }
  87576. else {
  87577. r[++j] = (sp_digit)0;
  87578. }
  87579. }
  87580. s = (word32)DIGIT_BIT - s;
  87581. }
  87582. for (j++; j < size; j++) {
  87583. r[j] = 0;
  87584. }
  87585. #else
  87586. unsigned int i;
  87587. int j = 0;
  87588. int s = 0;
  87589. r[0] = 0;
  87590. for (i = 0; i < (unsigned int)a->used && j < size; i++) {
  87591. r[j] |= ((sp_digit)a->dp[i]) << s;
  87592. if (s + DIGIT_BIT >= 32) {
  87593. r[j] &= 0xffffffff;
  87594. if (j + 1 >= size) {
  87595. break;
  87596. }
  87597. s = 32 - s;
  87598. if (s == DIGIT_BIT) {
  87599. r[++j] = 0;
  87600. s = 0;
  87601. }
  87602. else {
  87603. r[++j] = a->dp[i] >> s;
  87604. s = DIGIT_BIT - s;
  87605. }
  87606. }
  87607. else {
  87608. s += DIGIT_BIT;
  87609. }
  87610. }
  87611. for (j++; j < size; j++) {
  87612. r[j] = 0;
  87613. }
  87614. #endif
  87615. }
  87616. /* Convert a point of type ecc_point to type sp_point_384.
  87617. *
  87618. * p Point of type sp_point_384 (result).
  87619. * pm Point of type ecc_point.
  87620. */
  87621. static void sp_384_point_from_ecc_point_12(sp_point_384* p,
  87622. const ecc_point* pm)
  87623. {
  87624. XMEMSET(p->x, 0, sizeof(p->x));
  87625. XMEMSET(p->y, 0, sizeof(p->y));
  87626. XMEMSET(p->z, 0, sizeof(p->z));
  87627. sp_384_from_mp(p->x, 12, pm->x);
  87628. sp_384_from_mp(p->y, 12, pm->y);
  87629. sp_384_from_mp(p->z, 12, pm->z);
  87630. p->infinity = 0;
  87631. }
  87632. /* Convert an array of sp_digit to an mp_int.
  87633. *
  87634. * a A single precision integer.
  87635. * r A multi-precision integer.
  87636. */
  87637. static int sp_384_to_mp(const sp_digit* a, mp_int* r)
  87638. {
  87639. int err;
  87640. err = mp_grow(r, (384 + DIGIT_BIT - 1) / DIGIT_BIT);
  87641. if (err == MP_OKAY) { /*lint !e774 case where err is always MP_OKAY*/
  87642. #if DIGIT_BIT == 32
  87643. XMEMCPY(r->dp, a, sizeof(sp_digit) * 12);
  87644. r->used = 12;
  87645. mp_clamp(r);
  87646. #elif DIGIT_BIT < 32
  87647. int i;
  87648. int j = 0;
  87649. int s = 0;
  87650. r->dp[0] = 0;
  87651. for (i = 0; i < 12; i++) {
  87652. r->dp[j] |= (mp_digit)(a[i] << s);
  87653. r->dp[j] &= ((sp_digit)1 << DIGIT_BIT) - 1;
  87654. s = DIGIT_BIT - s;
  87655. r->dp[++j] = (mp_digit)(a[i] >> s);
  87656. while (s + DIGIT_BIT <= 32) {
  87657. s += DIGIT_BIT;
  87658. r->dp[j++] &= ((sp_digit)1 << DIGIT_BIT) - 1;
  87659. if (s == SP_WORD_SIZE) {
  87660. r->dp[j] = 0;
  87661. }
  87662. else {
  87663. r->dp[j] = (mp_digit)(a[i] >> s);
  87664. }
  87665. }
  87666. s = 32 - s;
  87667. }
  87668. r->used = (384 + DIGIT_BIT - 1) / DIGIT_BIT;
  87669. mp_clamp(r);
  87670. #else
  87671. int i;
  87672. int j = 0;
  87673. int s = 0;
  87674. r->dp[0] = 0;
  87675. for (i = 0; i < 12; i++) {
  87676. r->dp[j] |= ((mp_digit)a[i]) << s;
  87677. if (s + 32 >= DIGIT_BIT) {
  87678. #if DIGIT_BIT != 32 && DIGIT_BIT != 64
  87679. r->dp[j] &= ((sp_digit)1 << DIGIT_BIT) - 1;
  87680. #endif
  87681. s = DIGIT_BIT - s;
  87682. r->dp[++j] = a[i] >> s;
  87683. s = 32 - s;
  87684. }
  87685. else {
  87686. s += 32;
  87687. }
  87688. }
  87689. r->used = (384 + DIGIT_BIT - 1) / DIGIT_BIT;
  87690. mp_clamp(r);
  87691. #endif
  87692. }
  87693. return err;
  87694. }
  87695. /* Convert a point of type sp_point_384 to type ecc_point.
  87696. *
  87697. * p Point of type sp_point_384.
  87698. * pm Point of type ecc_point (result).
  87699. * returns MEMORY_E when allocation of memory in ecc_point fails otherwise
  87700. * MP_OKAY.
  87701. */
  87702. static int sp_384_point_to_ecc_point_12(const sp_point_384* p, ecc_point* pm)
  87703. {
  87704. int err;
  87705. err = sp_384_to_mp(p->x, pm->x);
  87706. if (err == MP_OKAY) {
  87707. err = sp_384_to_mp(p->y, pm->y);
  87708. }
  87709. if (err == MP_OKAY) {
  87710. err = sp_384_to_mp(p->z, pm->z);
  87711. }
  87712. return err;
  87713. }
  87714. #ifdef WOLFSSL_SP_SMALL
  87715. /* Conditionally subtract b from a using the mask m.
  87716. * m is -1 to subtract and 0 when not copying.
  87717. *
  87718. * r A single precision number representing condition subtract result.
  87719. * a A single precision number to subtract from.
  87720. * b A single precision number to subtract.
  87721. * m Mask value to apply.
  87722. */
  87723. 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)
  87724. {
  87725. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  87726. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  87727. register const sp_digit* b asm ("r2") = (const sp_digit*)b_p;
  87728. register sp_digit m asm ("r3") = (sp_digit)m_p;
  87729. __asm__ __volatile__ (
  87730. "mov r6, #0\n\t"
  87731. "mov r12, #0\n\t"
  87732. "mov lr, #0\n\t"
  87733. "\n"
  87734. "L_sp_384_cond_sub_12_words_%=: \n\t"
  87735. "subs r12, r6, r12\n\t"
  87736. "ldr r4, [%[a], lr]\n\t"
  87737. "ldr r5, [%[b], lr]\n\t"
  87738. "and r5, r5, %[m]\n\t"
  87739. "sbcs r4, r4, r5\n\t"
  87740. "sbc r12, r6, r6\n\t"
  87741. "str r4, [%[r], lr]\n\t"
  87742. "add lr, lr, #4\n\t"
  87743. "cmp lr, #48\n\t"
  87744. "blt L_sp_384_cond_sub_12_words_%=\n\t"
  87745. "mov %[r], r12\n\t"
  87746. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b), [m] "+r" (m)
  87747. :
  87748. : "memory", "r12", "lr", "r4", "r5", "r6", "cc"
  87749. );
  87750. return (uint32_t)(size_t)r;
  87751. }
  87752. #else
  87753. /* Conditionally subtract b from a using the mask m.
  87754. * m is -1 to subtract and 0 when not copying.
  87755. *
  87756. * r A single precision number representing condition subtract result.
  87757. * a A single precision number to subtract from.
  87758. * b A single precision number to subtract.
  87759. * m Mask value to apply.
  87760. */
  87761. 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)
  87762. {
  87763. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  87764. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  87765. register const sp_digit* b asm ("r2") = (const sp_digit*)b_p;
  87766. register sp_digit m asm ("r3") = (sp_digit)m_p;
  87767. __asm__ __volatile__ (
  87768. "mov lr, #0\n\t"
  87769. "ldm %[a]!, {r4, r5}\n\t"
  87770. "ldm %[b]!, {r6, r7}\n\t"
  87771. "and r6, r6, %[m]\n\t"
  87772. "and r7, r7, %[m]\n\t"
  87773. "subs r4, r4, r6\n\t"
  87774. "sbcs r5, r5, r7\n\t"
  87775. "stm %[r]!, {r4, r5}\n\t"
  87776. "ldm %[a]!, {r4, r5}\n\t"
  87777. "ldm %[b]!, {r6, r7}\n\t"
  87778. "and r6, r6, %[m]\n\t"
  87779. "and r7, r7, %[m]\n\t"
  87780. "sbcs r4, r4, r6\n\t"
  87781. "sbcs r5, r5, r7\n\t"
  87782. "stm %[r]!, {r4, r5}\n\t"
  87783. "ldm %[a]!, {r4, r5}\n\t"
  87784. "ldm %[b]!, {r6, r7}\n\t"
  87785. "and r6, r6, %[m]\n\t"
  87786. "and r7, r7, %[m]\n\t"
  87787. "sbcs r4, r4, r6\n\t"
  87788. "sbcs r5, r5, r7\n\t"
  87789. "stm %[r]!, {r4, r5}\n\t"
  87790. "ldm %[a]!, {r4, r5}\n\t"
  87791. "ldm %[b]!, {r6, r7}\n\t"
  87792. "and r6, r6, %[m]\n\t"
  87793. "and r7, r7, %[m]\n\t"
  87794. "sbcs r4, r4, r6\n\t"
  87795. "sbcs r5, r5, r7\n\t"
  87796. "stm %[r]!, {r4, r5}\n\t"
  87797. "ldm %[a]!, {r4, r5}\n\t"
  87798. "ldm %[b]!, {r6, r7}\n\t"
  87799. "and r6, r6, %[m]\n\t"
  87800. "and r7, r7, %[m]\n\t"
  87801. "sbcs r4, r4, r6\n\t"
  87802. "sbcs r5, r5, r7\n\t"
  87803. "stm %[r]!, {r4, r5}\n\t"
  87804. "ldm %[a]!, {r4, r5}\n\t"
  87805. "ldm %[b]!, {r6, r7}\n\t"
  87806. "and r6, r6, %[m]\n\t"
  87807. "and r7, r7, %[m]\n\t"
  87808. "sbcs r4, r4, r6\n\t"
  87809. "sbcs r5, r5, r7\n\t"
  87810. "stm %[r]!, {r4, r5}\n\t"
  87811. "sbc %[r], lr, lr\n\t"
  87812. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b), [m] "+r" (m)
  87813. :
  87814. : "memory", "r12", "lr", "r4", "r5", "r6", "r7", "cc"
  87815. );
  87816. return (uint32_t)(size_t)r;
  87817. }
  87818. #endif /* WOLFSSL_SP_SMALL */
  87819. #define sp_384_mont_reduce_order_12 sp_384_mont_reduce_12
  87820. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  87821. /* Reduce the number back to 384 bits using Montgomery reduction.
  87822. *
  87823. * a A single precision number to reduce in place.
  87824. * m The single precision number representing the modulus.
  87825. * mp The digit representing the negative inverse of m mod 2^n.
  87826. */
  87827. static SP_NOINLINE void sp_384_mont_reduce_12(sp_digit* a_p, const sp_digit* m_p, sp_digit mp_p)
  87828. {
  87829. register sp_digit* a asm ("r0") = (sp_digit*)a_p;
  87830. register const sp_digit* m asm ("r1") = (const sp_digit*)m_p;
  87831. register sp_digit mp asm ("r2") = (sp_digit)mp_p;
  87832. __asm__ __volatile__ (
  87833. #if !(defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4))
  87834. "ldr r11, [%[m]]\n\t"
  87835. #endif
  87836. /* i = 0 */
  87837. "mov r9, #0\n\t"
  87838. "mov r3, #0\n\t"
  87839. "ldr r12, [%[a]]\n\t"
  87840. "ldr lr, [%[a], #4]\n\t"
  87841. "\n"
  87842. "L_sp_384_mont_reduce_12_word_%=: \n\t"
  87843. /* mu = a[i] * mp */
  87844. "mul r8, %[mp], r12\n\t"
  87845. /* a[i+0] += m[0] * mu */
  87846. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  87847. "ldr r11, [%[m]]\n\t"
  87848. #endif
  87849. "lsr r7, r11, #16\n\t"
  87850. "lsr r6, r8, #16\n\t"
  87851. "mul r5, r6, r7\n\t"
  87852. "lsl r7, r11, #16\n\t"
  87853. "lsr r7, r7, #16\n\t"
  87854. "mul r6, r7, r6\n\t"
  87855. "lsr r7, r6, #16\n\t"
  87856. "lsl r6, r6, #16\n\t"
  87857. "adds r12, r12, r6\n\t"
  87858. "adc r5, r5, r7\n\t"
  87859. "lsl r6, r8, #16\n\t"
  87860. "lsl r7, r11, #16\n\t"
  87861. "lsr r6, r6, #16\n\t"
  87862. "lsr r7, r7, #16\n\t"
  87863. "mul r7, r6, r7\n\t"
  87864. "adds r12, r12, r7\n\t"
  87865. "adc r5, r5, #0\n\t"
  87866. "lsr r7, r11, #16\n\t"
  87867. "mul r6, r7, r6\n\t"
  87868. "lsr r7, r6, #16\n\t"
  87869. "lsl r6, r6, #16\n\t"
  87870. "adds r12, r12, r6\n\t"
  87871. "adc r5, r5, r7\n\t"
  87872. /* a[i+1] += m[1] * mu */
  87873. "ldr r7, [%[m], #4]\n\t"
  87874. "lsr r10, r7, #16\n\t"
  87875. "lsr r6, r8, #16\n\t"
  87876. "mul r4, r6, r10\n\t"
  87877. "lsl r10, r7, #16\n\t"
  87878. "lsr r10, r10, #16\n\t"
  87879. "mul r6, r10, r6\n\t"
  87880. "lsr r10, r6, #16\n\t"
  87881. "lsl r6, r6, #16\n\t"
  87882. "adds lr, lr, r6\n\t"
  87883. "adc r4, r4, r10\n\t"
  87884. "lsl r6, r8, #16\n\t"
  87885. "lsl r10, r7, #16\n\t"
  87886. "lsr r6, r6, #16\n\t"
  87887. "lsr r10, r10, #16\n\t"
  87888. "mul r10, r6, r10\n\t"
  87889. "adds lr, lr, r10\n\t"
  87890. "adc r4, r4, #0\n\t"
  87891. "lsr r10, r7, #16\n\t"
  87892. "mul r6, r10, r6\n\t"
  87893. "lsr r10, r6, #16\n\t"
  87894. "lsl r6, r6, #16\n\t"
  87895. "adds lr, lr, r6\n\t"
  87896. "adc r4, r4, r10\n\t"
  87897. "mov r12, lr\n\t"
  87898. "adds r12, r12, r5\n\t"
  87899. "adc r4, r4, #0\n\t"
  87900. /* a[i+2] += m[2] * mu */
  87901. "ldr r7, [%[m], #8]\n\t"
  87902. "ldr lr, [%[a], #8]\n\t"
  87903. "lsr r10, r7, #16\n\t"
  87904. "lsr r6, r8, #16\n\t"
  87905. "mul r5, r6, r10\n\t"
  87906. "lsl r10, r7, #16\n\t"
  87907. "lsr r10, r10, #16\n\t"
  87908. "mul r6, r10, r6\n\t"
  87909. "lsr r10, r6, #16\n\t"
  87910. "lsl r6, r6, #16\n\t"
  87911. "adds lr, lr, r6\n\t"
  87912. "adc r5, r5, r10\n\t"
  87913. "lsl r6, r8, #16\n\t"
  87914. "lsl r10, r7, #16\n\t"
  87915. "lsr r6, r6, #16\n\t"
  87916. "lsr r10, r10, #16\n\t"
  87917. "mul r10, r6, r10\n\t"
  87918. "adds lr, lr, r10\n\t"
  87919. "adc r5, r5, #0\n\t"
  87920. "lsr r10, r7, #16\n\t"
  87921. "mul r6, r10, r6\n\t"
  87922. "lsr r10, r6, #16\n\t"
  87923. "lsl r6, r6, #16\n\t"
  87924. "adds lr, lr, r6\n\t"
  87925. "adc r5, r5, r10\n\t"
  87926. "adds lr, lr, r4\n\t"
  87927. "adc r5, r5, #0\n\t"
  87928. /* a[i+3] += m[3] * mu */
  87929. "ldr r7, [%[m], #12]\n\t"
  87930. "ldr r10, [%[a], #12]\n\t"
  87931. "lsr r11, r7, #16\n\t"
  87932. "lsr r6, r8, #16\n\t"
  87933. "mul r4, r6, r11\n\t"
  87934. "lsl r11, r7, #16\n\t"
  87935. "lsr r11, r11, #16\n\t"
  87936. "mul r6, r11, r6\n\t"
  87937. "lsr r11, r6, #16\n\t"
  87938. "lsl r6, r6, #16\n\t"
  87939. "adds r10, r10, r6\n\t"
  87940. "adc r4, r4, r11\n\t"
  87941. "lsl r6, r8, #16\n\t"
  87942. "lsl r11, r7, #16\n\t"
  87943. "lsr r6, r6, #16\n\t"
  87944. "lsr r11, r11, #16\n\t"
  87945. "mul r11, r6, r11\n\t"
  87946. "adds r10, r10, r11\n\t"
  87947. "adc r4, r4, #0\n\t"
  87948. "lsr r11, r7, #16\n\t"
  87949. "mul r6, r11, r6\n\t"
  87950. "lsr r11, r6, #16\n\t"
  87951. "lsl r6, r6, #16\n\t"
  87952. "adds r10, r10, r6\n\t"
  87953. "adc r4, r4, r11\n\t"
  87954. "adds r10, r10, r5\n\t"
  87955. "str r10, [%[a], #12]\n\t"
  87956. "adc r4, r4, #0\n\t"
  87957. /* a[i+4] += m[4] * mu */
  87958. "ldr r7, [%[m], #16]\n\t"
  87959. "ldr r10, [%[a], #16]\n\t"
  87960. "lsr r11, r7, #16\n\t"
  87961. "lsr r6, r8, #16\n\t"
  87962. "mul r5, r6, r11\n\t"
  87963. "lsl r11, r7, #16\n\t"
  87964. "lsr r11, r11, #16\n\t"
  87965. "mul r6, r11, r6\n\t"
  87966. "lsr r11, r6, #16\n\t"
  87967. "lsl r6, r6, #16\n\t"
  87968. "adds r10, r10, r6\n\t"
  87969. "adc r5, r5, r11\n\t"
  87970. "lsl r6, r8, #16\n\t"
  87971. "lsl r11, r7, #16\n\t"
  87972. "lsr r6, r6, #16\n\t"
  87973. "lsr r11, r11, #16\n\t"
  87974. "mul r11, r6, r11\n\t"
  87975. "adds r10, r10, r11\n\t"
  87976. "adc r5, r5, #0\n\t"
  87977. "lsr r11, r7, #16\n\t"
  87978. "mul r6, r11, r6\n\t"
  87979. "lsr r11, r6, #16\n\t"
  87980. "lsl r6, r6, #16\n\t"
  87981. "adds r10, r10, r6\n\t"
  87982. "adc r5, r5, r11\n\t"
  87983. "adds r10, r10, r4\n\t"
  87984. "str r10, [%[a], #16]\n\t"
  87985. "adc r5, r5, #0\n\t"
  87986. /* a[i+5] += m[5] * mu */
  87987. "ldr r7, [%[m], #20]\n\t"
  87988. "ldr r10, [%[a], #20]\n\t"
  87989. "lsr r11, r7, #16\n\t"
  87990. "lsr r6, r8, #16\n\t"
  87991. "mul r4, r6, r11\n\t"
  87992. "lsl r11, r7, #16\n\t"
  87993. "lsr r11, r11, #16\n\t"
  87994. "mul r6, r11, r6\n\t"
  87995. "lsr r11, r6, #16\n\t"
  87996. "lsl r6, r6, #16\n\t"
  87997. "adds r10, r10, r6\n\t"
  87998. "adc r4, r4, r11\n\t"
  87999. "lsl r6, r8, #16\n\t"
  88000. "lsl r11, r7, #16\n\t"
  88001. "lsr r6, r6, #16\n\t"
  88002. "lsr r11, r11, #16\n\t"
  88003. "mul r11, r6, r11\n\t"
  88004. "adds r10, r10, r11\n\t"
  88005. "adc r4, r4, #0\n\t"
  88006. "lsr r11, r7, #16\n\t"
  88007. "mul r6, r11, r6\n\t"
  88008. "lsr r11, r6, #16\n\t"
  88009. "lsl r6, r6, #16\n\t"
  88010. "adds r10, r10, r6\n\t"
  88011. "adc r4, r4, r11\n\t"
  88012. "adds r10, r10, r5\n\t"
  88013. "str r10, [%[a], #20]\n\t"
  88014. "adc r4, r4, #0\n\t"
  88015. /* a[i+6] += m[6] * mu */
  88016. "ldr r7, [%[m], #24]\n\t"
  88017. "ldr r10, [%[a], #24]\n\t"
  88018. "lsr r11, r7, #16\n\t"
  88019. "lsr r6, r8, #16\n\t"
  88020. "mul r5, r6, r11\n\t"
  88021. "lsl r11, r7, #16\n\t"
  88022. "lsr r11, r11, #16\n\t"
  88023. "mul r6, r11, r6\n\t"
  88024. "lsr r11, r6, #16\n\t"
  88025. "lsl r6, r6, #16\n\t"
  88026. "adds r10, r10, r6\n\t"
  88027. "adc r5, r5, r11\n\t"
  88028. "lsl r6, r8, #16\n\t"
  88029. "lsl r11, r7, #16\n\t"
  88030. "lsr r6, r6, #16\n\t"
  88031. "lsr r11, r11, #16\n\t"
  88032. "mul r11, r6, r11\n\t"
  88033. "adds r10, r10, r11\n\t"
  88034. "adc r5, r5, #0\n\t"
  88035. "lsr r11, r7, #16\n\t"
  88036. "mul r6, r11, r6\n\t"
  88037. "lsr r11, r6, #16\n\t"
  88038. "lsl r6, r6, #16\n\t"
  88039. "adds r10, r10, r6\n\t"
  88040. "adc r5, r5, r11\n\t"
  88041. "adds r10, r10, r4\n\t"
  88042. "str r10, [%[a], #24]\n\t"
  88043. "adc r5, r5, #0\n\t"
  88044. /* a[i+7] += m[7] * mu */
  88045. "ldr r7, [%[m], #28]\n\t"
  88046. "ldr r10, [%[a], #28]\n\t"
  88047. "lsr r11, r7, #16\n\t"
  88048. "lsr r6, r8, #16\n\t"
  88049. "mul r4, r6, r11\n\t"
  88050. "lsl r11, r7, #16\n\t"
  88051. "lsr r11, r11, #16\n\t"
  88052. "mul r6, r11, r6\n\t"
  88053. "lsr r11, r6, #16\n\t"
  88054. "lsl r6, r6, #16\n\t"
  88055. "adds r10, r10, r6\n\t"
  88056. "adc r4, r4, r11\n\t"
  88057. "lsl r6, r8, #16\n\t"
  88058. "lsl r11, r7, #16\n\t"
  88059. "lsr r6, r6, #16\n\t"
  88060. "lsr r11, r11, #16\n\t"
  88061. "mul r11, r6, r11\n\t"
  88062. "adds r10, r10, r11\n\t"
  88063. "adc r4, r4, #0\n\t"
  88064. "lsr r11, r7, #16\n\t"
  88065. "mul r6, r11, r6\n\t"
  88066. "lsr r11, r6, #16\n\t"
  88067. "lsl r6, r6, #16\n\t"
  88068. "adds r10, r10, r6\n\t"
  88069. "adc r4, r4, r11\n\t"
  88070. "adds r10, r10, r5\n\t"
  88071. "str r10, [%[a], #28]\n\t"
  88072. "adc r4, r4, #0\n\t"
  88073. /* a[i+8] += m[8] * mu */
  88074. "ldr r7, [%[m], #32]\n\t"
  88075. "ldr r10, [%[a], #32]\n\t"
  88076. "lsr r11, r7, #16\n\t"
  88077. "lsr r6, r8, #16\n\t"
  88078. "mul r5, r6, r11\n\t"
  88079. "lsl r11, r7, #16\n\t"
  88080. "lsr r11, r11, #16\n\t"
  88081. "mul r6, r11, r6\n\t"
  88082. "lsr r11, r6, #16\n\t"
  88083. "lsl r6, r6, #16\n\t"
  88084. "adds r10, r10, r6\n\t"
  88085. "adc r5, r5, r11\n\t"
  88086. "lsl r6, r8, #16\n\t"
  88087. "lsl r11, r7, #16\n\t"
  88088. "lsr r6, r6, #16\n\t"
  88089. "lsr r11, r11, #16\n\t"
  88090. "mul r11, r6, r11\n\t"
  88091. "adds r10, r10, r11\n\t"
  88092. "adc r5, r5, #0\n\t"
  88093. "lsr r11, r7, #16\n\t"
  88094. "mul r6, r11, r6\n\t"
  88095. "lsr r11, r6, #16\n\t"
  88096. "lsl r6, r6, #16\n\t"
  88097. "adds r10, r10, r6\n\t"
  88098. "adc r5, r5, r11\n\t"
  88099. "adds r10, r10, r4\n\t"
  88100. "str r10, [%[a], #32]\n\t"
  88101. "adc r5, r5, #0\n\t"
  88102. /* a[i+9] += m[9] * mu */
  88103. "ldr r7, [%[m], #36]\n\t"
  88104. "ldr r10, [%[a], #36]\n\t"
  88105. "lsr r11, r7, #16\n\t"
  88106. "lsr r6, r8, #16\n\t"
  88107. "mul r4, r6, r11\n\t"
  88108. "lsl r11, r7, #16\n\t"
  88109. "lsr r11, r11, #16\n\t"
  88110. "mul r6, r11, r6\n\t"
  88111. "lsr r11, r6, #16\n\t"
  88112. "lsl r6, r6, #16\n\t"
  88113. "adds r10, r10, r6\n\t"
  88114. "adc r4, r4, r11\n\t"
  88115. "lsl r6, r8, #16\n\t"
  88116. "lsl r11, r7, #16\n\t"
  88117. "lsr r6, r6, #16\n\t"
  88118. "lsr r11, r11, #16\n\t"
  88119. "mul r11, r6, r11\n\t"
  88120. "adds r10, r10, r11\n\t"
  88121. "adc r4, r4, #0\n\t"
  88122. "lsr r11, r7, #16\n\t"
  88123. "mul r6, r11, r6\n\t"
  88124. "lsr r11, r6, #16\n\t"
  88125. "lsl r6, r6, #16\n\t"
  88126. "adds r10, r10, r6\n\t"
  88127. "adc r4, r4, r11\n\t"
  88128. "adds r10, r10, r5\n\t"
  88129. "str r10, [%[a], #36]\n\t"
  88130. "adc r4, r4, #0\n\t"
  88131. /* a[i+10] += m[10] * mu */
  88132. "ldr r7, [%[m], #40]\n\t"
  88133. "ldr r10, [%[a], #40]\n\t"
  88134. "lsr r11, r7, #16\n\t"
  88135. "lsr r6, r8, #16\n\t"
  88136. "mul r5, r6, r11\n\t"
  88137. "lsl r11, r7, #16\n\t"
  88138. "lsr r11, r11, #16\n\t"
  88139. "mul r6, r11, r6\n\t"
  88140. "lsr r11, r6, #16\n\t"
  88141. "lsl r6, r6, #16\n\t"
  88142. "adds r10, r10, r6\n\t"
  88143. "adc r5, r5, r11\n\t"
  88144. "lsl r6, r8, #16\n\t"
  88145. "lsl r11, r7, #16\n\t"
  88146. "lsr r6, r6, #16\n\t"
  88147. "lsr r11, r11, #16\n\t"
  88148. "mul r11, r6, r11\n\t"
  88149. "adds r10, r10, r11\n\t"
  88150. "adc r5, r5, #0\n\t"
  88151. "lsr r11, r7, #16\n\t"
  88152. "mul r6, r11, r6\n\t"
  88153. "lsr r11, r6, #16\n\t"
  88154. "lsl r6, r6, #16\n\t"
  88155. "adds r10, r10, r6\n\t"
  88156. "adc r5, r5, r11\n\t"
  88157. "adds r10, r10, r4\n\t"
  88158. "str r10, [%[a], #40]\n\t"
  88159. "adc r5, r5, #0\n\t"
  88160. /* a[i+11] += m[11] * mu */
  88161. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  88162. "ldr r11, [%[m], #44]\n\t"
  88163. #else
  88164. "ldr r7, [%[m], #44]\n\t"
  88165. #endif
  88166. "ldr r10, [%[a], #44]\n\t"
  88167. "lsl r6, r8, #16\n\t"
  88168. "lsl r7, r11, #16\n\t"
  88169. "lsr r6, r6, #16\n\t"
  88170. "lsr r7, r7, #16\n\t"
  88171. "mul r7, r6, r7\n\t"
  88172. "adds r5, r5, r7\n\t"
  88173. "adcs r4, r3, #0\n\t"
  88174. "mov r3, #0\n\t"
  88175. "adc r3, r3, r3\n\t"
  88176. "lsr r7, r11, #16\n\t"
  88177. "mul r6, r7, r6\n\t"
  88178. "lsr r7, r6, #16\n\t"
  88179. "lsl r6, r6, #16\n\t"
  88180. "adds r5, r5, r6\n\t"
  88181. "adcs r4, r4, r7\n\t"
  88182. "adc r3, r3, #0\n\t"
  88183. "mov r6, r8\n\t"
  88184. "lsr r7, r11, #16\n\t"
  88185. "lsr r6, r6, #16\n\t"
  88186. "mul r7, r6, r7\n\t"
  88187. "adds r4, r4, r7\n\t"
  88188. "lsl r7, r11, #16\n\t"
  88189. "adc r3, r3, #0\n\t"
  88190. "lsr r7, r7, #16\n\t"
  88191. "mul r6, r7, r6\n\t"
  88192. "lsr r7, r6, #16\n\t"
  88193. "lsl r6, r6, #16\n\t"
  88194. "adds r5, r5, r6\n\t"
  88195. "adcs r4, r4, r7\n\t"
  88196. "adc r3, r3, #0\n\t"
  88197. "adds r10, r10, r5\n\t"
  88198. "str r10, [%[a], #44]\n\t"
  88199. "ldr r10, [%[a], #48]\n\t"
  88200. "adcs r10, r10, r4\n\t"
  88201. "str r10, [%[a], #48]\n\t"
  88202. "adc r3, r3, #0\n\t"
  88203. /* i += 1 */
  88204. "add r9, r9, #4\n\t"
  88205. "add %[a], %[a], #4\n\t"
  88206. "cmp r9, #48\n\t"
  88207. "blt L_sp_384_mont_reduce_12_word_%=\n\t"
  88208. /* Loop Done */
  88209. "str r12, [%[a]]\n\t"
  88210. "str lr, [%[a], #4]\n\t"
  88211. "mov %[mp], r3\n\t"
  88212. : [a] "+r" (a), [m] "+r" (m), [mp] "+r" (mp)
  88213. :
  88214. : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "cc"
  88215. );
  88216. sp_384_cond_sub_12(a - 12, a, m, (sp_digit)0 - mp);
  88217. }
  88218. #elif defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  88219. /* Reduce the number back to 384 bits using Montgomery reduction.
  88220. *
  88221. * a A single precision number to reduce in place.
  88222. * m The single precision number representing the modulus.
  88223. * mp The digit representing the negative inverse of m mod 2^n.
  88224. */
  88225. static SP_NOINLINE void sp_384_mont_reduce_12(sp_digit* a_p, const sp_digit* m_p, sp_digit mp_p)
  88226. {
  88227. register sp_digit* a asm ("r0") = (sp_digit*)a_p;
  88228. register const sp_digit* m asm ("r1") = (const sp_digit*)m_p;
  88229. register sp_digit mp asm ("r2") = (sp_digit)mp_p;
  88230. __asm__ __volatile__ (
  88231. "ldr r11, [%[m]]\n\t"
  88232. /* i = 0 */
  88233. "mov r9, #0\n\t"
  88234. "mov r3, #0\n\t"
  88235. "ldr r12, [%[a]]\n\t"
  88236. "ldr lr, [%[a], #4]\n\t"
  88237. "\n"
  88238. "L_sp_384_mont_reduce_12_word_%=: \n\t"
  88239. /* mu = a[i] * mp */
  88240. "mul r8, %[mp], r12\n\t"
  88241. /* a[i+0] += m[0] * mu */
  88242. "mov r5, #0\n\t"
  88243. "umlal r12, r5, r8, r11\n\t"
  88244. /* a[i+1] += m[1] * mu */
  88245. "ldr r7, [%[m], #4]\n\t"
  88246. "mov r4, #0\n\t"
  88247. "umlal lr, r4, r8, r7\n\t"
  88248. "mov r12, lr\n\t"
  88249. "adds r12, r12, r5\n\t"
  88250. "adc r4, r4, #0\n\t"
  88251. /* a[i+2] += m[2] * mu */
  88252. "ldr r7, [%[m], #8]\n\t"
  88253. "ldr lr, [%[a], #8]\n\t"
  88254. "mov r5, #0\n\t"
  88255. "umlal lr, r5, r8, r7\n\t"
  88256. "adds lr, lr, r4\n\t"
  88257. "adc r5, r5, #0\n\t"
  88258. /* a[i+3] += m[3] * mu */
  88259. "ldr r7, [%[m], #12]\n\t"
  88260. "ldr r10, [%[a], #12]\n\t"
  88261. "mov r4, #0\n\t"
  88262. "umlal r10, r4, r8, r7\n\t"
  88263. "adds r10, r10, r5\n\t"
  88264. "str r10, [%[a], #12]\n\t"
  88265. "adc r4, r4, #0\n\t"
  88266. /* a[i+4] += m[4] * mu */
  88267. "ldr r7, [%[m], #16]\n\t"
  88268. "ldr r10, [%[a], #16]\n\t"
  88269. "mov r5, #0\n\t"
  88270. "umlal r10, r5, r8, r7\n\t"
  88271. "adds r10, r10, r4\n\t"
  88272. "str r10, [%[a], #16]\n\t"
  88273. "adc r5, r5, #0\n\t"
  88274. /* a[i+5] += m[5] * mu */
  88275. "ldr r7, [%[m], #20]\n\t"
  88276. "ldr r10, [%[a], #20]\n\t"
  88277. "mov r4, #0\n\t"
  88278. "umlal r10, r4, r8, r7\n\t"
  88279. "adds r10, r10, r5\n\t"
  88280. "str r10, [%[a], #20]\n\t"
  88281. "adc r4, r4, #0\n\t"
  88282. /* a[i+6] += m[6] * mu */
  88283. "ldr r7, [%[m], #24]\n\t"
  88284. "ldr r10, [%[a], #24]\n\t"
  88285. "mov r5, #0\n\t"
  88286. "umlal r10, r5, r8, r7\n\t"
  88287. "adds r10, r10, r4\n\t"
  88288. "str r10, [%[a], #24]\n\t"
  88289. "adc r5, r5, #0\n\t"
  88290. /* a[i+7] += m[7] * mu */
  88291. "ldr r7, [%[m], #28]\n\t"
  88292. "ldr r10, [%[a], #28]\n\t"
  88293. "mov r4, #0\n\t"
  88294. "umlal r10, r4, r8, r7\n\t"
  88295. "adds r10, r10, r5\n\t"
  88296. "str r10, [%[a], #28]\n\t"
  88297. "adc r4, r4, #0\n\t"
  88298. /* a[i+8] += m[8] * mu */
  88299. "ldr r7, [%[m], #32]\n\t"
  88300. "ldr r10, [%[a], #32]\n\t"
  88301. "mov r5, #0\n\t"
  88302. "umlal r10, r5, r8, r7\n\t"
  88303. "adds r10, r10, r4\n\t"
  88304. "str r10, [%[a], #32]\n\t"
  88305. "adc r5, r5, #0\n\t"
  88306. /* a[i+9] += m[9] * mu */
  88307. "ldr r7, [%[m], #36]\n\t"
  88308. "ldr r10, [%[a], #36]\n\t"
  88309. "mov r4, #0\n\t"
  88310. "umlal r10, r4, r8, r7\n\t"
  88311. "adds r10, r10, r5\n\t"
  88312. "str r10, [%[a], #36]\n\t"
  88313. "adc r4, r4, #0\n\t"
  88314. /* a[i+10] += m[10] * mu */
  88315. "ldr r7, [%[m], #40]\n\t"
  88316. "ldr r10, [%[a], #40]\n\t"
  88317. "mov r5, #0\n\t"
  88318. "umlal r10, r5, r8, r7\n\t"
  88319. "adds r10, r10, r4\n\t"
  88320. "str r10, [%[a], #40]\n\t"
  88321. "adc r5, r5, #0\n\t"
  88322. /* a[i+11] += m[11] * mu */
  88323. "ldr r7, [%[m], #44]\n\t"
  88324. "ldr r10, [%[a], #44]\n\t"
  88325. "umull r6, r7, r8, r7\n\t"
  88326. "adds r5, r5, r6\n\t"
  88327. "adcs r4, r7, r3\n\t"
  88328. "mov r3, #0\n\t"
  88329. "adc r3, r3, r3\n\t"
  88330. "adds r10, r10, r5\n\t"
  88331. "str r10, [%[a], #44]\n\t"
  88332. "ldr r10, [%[a], #48]\n\t"
  88333. "adcs r10, r10, r4\n\t"
  88334. "str r10, [%[a], #48]\n\t"
  88335. "adc r3, r3, #0\n\t"
  88336. /* i += 1 */
  88337. "add r9, r9, #4\n\t"
  88338. "add %[a], %[a], #4\n\t"
  88339. "cmp r9, #48\n\t"
  88340. "blt L_sp_384_mont_reduce_12_word_%=\n\t"
  88341. /* Loop Done */
  88342. "str r12, [%[a]]\n\t"
  88343. "str lr, [%[a], #4]\n\t"
  88344. "mov %[mp], r3\n\t"
  88345. : [a] "+r" (a), [m] "+r" (m), [mp] "+r" (mp)
  88346. :
  88347. : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "cc"
  88348. );
  88349. sp_384_cond_sub_12(a - 12, a, m, (sp_digit)0 - mp);
  88350. }
  88351. #else
  88352. /* Reduce the number back to 384 bits using Montgomery reduction.
  88353. *
  88354. * a A single precision number to reduce in place.
  88355. * m The single precision number representing the modulus.
  88356. * mp The digit representing the negative inverse of m mod 2^n.
  88357. */
  88358. static SP_NOINLINE void sp_384_mont_reduce_12(sp_digit* a_p, const sp_digit* m_p, sp_digit mp_p)
  88359. {
  88360. register sp_digit* a asm ("r0") = (sp_digit*)a_p;
  88361. register const sp_digit* m asm ("r1") = (const sp_digit*)m_p;
  88362. register sp_digit mp asm ("r2") = (sp_digit)mp_p;
  88363. __asm__ __volatile__ (
  88364. /* i = 0 */
  88365. "mov r12, #0\n\t"
  88366. "mov lr, #0\n\t"
  88367. "ldr r4, [%[a]]\n\t"
  88368. "ldr r5, [%[a], #4]\n\t"
  88369. "ldr r6, [%[a], #8]\n\t"
  88370. "ldr r7, [%[a], #12]\n\t"
  88371. "ldr r8, [%[a], #16]\n\t"
  88372. "\n"
  88373. "L_sp_384_mont_reduce_12_word_%=: \n\t"
  88374. /* mu = a[i] * mp */
  88375. "mul r11, %[mp], r4\n\t"
  88376. /* a[i+0] += m[0] * mu */
  88377. "ldr r10, [%[m]]\n\t"
  88378. "mov r3, #0\n\t"
  88379. "umaal r4, r3, r11, r10\n\t"
  88380. /* a[i+1] += m[1] * mu */
  88381. "ldr r10, [%[m], #4]\n\t"
  88382. "mov r4, r5\n\t"
  88383. "umaal r4, r3, r11, r10\n\t"
  88384. /* a[i+2] += m[2] * mu */
  88385. "ldr r10, [%[m], #8]\n\t"
  88386. "mov r5, r6\n\t"
  88387. "umaal r5, r3, r11, r10\n\t"
  88388. /* a[i+3] += m[3] * mu */
  88389. "ldr r10, [%[m], #12]\n\t"
  88390. "mov r6, r7\n\t"
  88391. "umaal r6, r3, r11, r10\n\t"
  88392. /* a[i+4] += m[4] * mu */
  88393. "ldr r10, [%[m], #16]\n\t"
  88394. "mov r7, r8\n\t"
  88395. "umaal r7, r3, r11, r10\n\t"
  88396. /* a[i+5] += m[5] * mu */
  88397. "ldr r10, [%[m], #20]\n\t"
  88398. "ldr r8, [%[a], #20]\n\t"
  88399. "umaal r8, r3, r11, r10\n\t"
  88400. /* a[i+6] += m[6] * mu */
  88401. "ldr r10, [%[m], #24]\n\t"
  88402. "ldr r9, [%[a], #24]\n\t"
  88403. "umaal r9, r3, r11, r10\n\t"
  88404. "str r9, [%[a], #24]\n\t"
  88405. /* a[i+7] += m[7] * mu */
  88406. "ldr r10, [%[m], #28]\n\t"
  88407. "ldr r9, [%[a], #28]\n\t"
  88408. "umaal r9, r3, r11, r10\n\t"
  88409. "str r9, [%[a], #28]\n\t"
  88410. /* a[i+8] += m[8] * mu */
  88411. "ldr r10, [%[m], #32]\n\t"
  88412. "ldr r9, [%[a], #32]\n\t"
  88413. "umaal r9, r3, r11, r10\n\t"
  88414. "str r9, [%[a], #32]\n\t"
  88415. /* a[i+9] += m[9] * mu */
  88416. "ldr r10, [%[m], #36]\n\t"
  88417. "ldr r9, [%[a], #36]\n\t"
  88418. "umaal r9, r3, r11, r10\n\t"
  88419. "str r9, [%[a], #36]\n\t"
  88420. /* a[i+10] += m[10] * mu */
  88421. "ldr r10, [%[m], #40]\n\t"
  88422. "ldr r9, [%[a], #40]\n\t"
  88423. "umaal r9, r3, r11, r10\n\t"
  88424. "str r9, [%[a], #40]\n\t"
  88425. /* a[i+11] += m[11] * mu */
  88426. "ldr r10, [%[m], #44]\n\t"
  88427. "ldr r9, [%[a], #44]\n\t"
  88428. "umaal r9, r3, r11, r10\n\t"
  88429. "ldr r11, [%[a], #48]\n\t"
  88430. "mov r10, #0\n\t"
  88431. "umaal r3, r11, r10, r10\n\t"
  88432. "str r9, [%[a], #44]\n\t"
  88433. "adds r3, r3, lr\n\t"
  88434. "adc lr, r11, #0\n\t"
  88435. "str r3, [%[a], #48]\n\t"
  88436. /* i += 1 */
  88437. "add r12, r12, #4\n\t"
  88438. "add %[a], %[a], #4\n\t"
  88439. "cmp r12, #48\n\t"
  88440. "blt L_sp_384_mont_reduce_12_word_%=\n\t"
  88441. /* Loop Done */
  88442. "str r4, [%[a]]\n\t"
  88443. "str r5, [%[a], #4]\n\t"
  88444. "str r6, [%[a], #8]\n\t"
  88445. "str r7, [%[a], #12]\n\t"
  88446. "str r8, [%[a], #16]\n\t"
  88447. "mov %[mp], lr\n\t"
  88448. : [a] "+r" (a), [m] "+r" (m), [mp] "+r" (mp)
  88449. :
  88450. : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "cc"
  88451. );
  88452. sp_384_cond_sub_12(a - 12, a, m, (sp_digit)0 - mp);
  88453. }
  88454. #endif
  88455. /* Multiply two Montgomery form numbers mod the modulus (prime).
  88456. * (r = a * b mod m)
  88457. *
  88458. * r Result of multiplication.
  88459. * a First number to multiply in Montgomery form.
  88460. * b Second number to multiply in Montgomery form.
  88461. * m Modulus (prime).
  88462. * mp Montgomery multiplier.
  88463. */
  88464. SP_NOINLINE static void sp_384_mont_mul_12(sp_digit* r, const sp_digit* a,
  88465. const sp_digit* b, const sp_digit* m, sp_digit mp)
  88466. {
  88467. sp_384_mul_12(r, a, b);
  88468. sp_384_mont_reduce_12(r, m, mp);
  88469. }
  88470. /* Square the Montgomery form number. (r = a * a mod m)
  88471. *
  88472. * r Result of squaring.
  88473. * a Number to square in Montgomery form.
  88474. * m Modulus (prime).
  88475. * mp Montgomery multiplier.
  88476. */
  88477. SP_NOINLINE static void sp_384_mont_sqr_12(sp_digit* r, const sp_digit* a,
  88478. const sp_digit* m, sp_digit mp)
  88479. {
  88480. sp_384_sqr_12(r, a);
  88481. sp_384_mont_reduce_12(r, m, mp);
  88482. }
  88483. #if !defined(WOLFSSL_SP_SMALL) || defined(HAVE_COMP_KEY)
  88484. /* Square the Montgomery form number a number of times. (r = a ^ n mod m)
  88485. *
  88486. * r Result of squaring.
  88487. * a Number to square in Montgomery form.
  88488. * n Number of times to square.
  88489. * m Modulus (prime).
  88490. * mp Montgomery multiplier.
  88491. */
  88492. SP_NOINLINE static void sp_384_mont_sqr_n_12(sp_digit* r,
  88493. const sp_digit* a, int n, const sp_digit* m, sp_digit mp)
  88494. {
  88495. sp_384_mont_sqr_12(r, a, m, mp);
  88496. for (; n > 1; n--) {
  88497. sp_384_mont_sqr_12(r, r, m, mp);
  88498. }
  88499. }
  88500. #endif /* !WOLFSSL_SP_SMALL || HAVE_COMP_KEY */
  88501. #ifdef WOLFSSL_SP_SMALL
  88502. /* Mod-2 for the P384 curve. */
  88503. static const uint32_t p384_mod_minus_2[12] = {
  88504. 0xfffffffdU,0x00000000U,0x00000000U,0xffffffffU,0xfffffffeU,0xffffffffU,
  88505. 0xffffffffU,0xffffffffU,0xffffffffU,0xffffffffU,0xffffffffU,0xffffffffU
  88506. };
  88507. #endif /* !WOLFSSL_SP_SMALL */
  88508. /* Invert the number, in Montgomery form, modulo the modulus (prime) of the
  88509. * P384 curve. (r = 1 / a mod m)
  88510. *
  88511. * r Inverse result.
  88512. * a Number to invert.
  88513. * td Temporary data.
  88514. */
  88515. static void sp_384_mont_inv_12(sp_digit* r, const sp_digit* a, sp_digit* td)
  88516. {
  88517. #ifdef WOLFSSL_SP_SMALL
  88518. sp_digit* t = td;
  88519. int i;
  88520. XMEMCPY(t, a, sizeof(sp_digit) * 12);
  88521. for (i=382; i>=0; i--) {
  88522. sp_384_mont_sqr_12(t, t, p384_mod, p384_mp_mod);
  88523. if (p384_mod_minus_2[i / 32] & ((sp_digit)1 << (i % 32)))
  88524. sp_384_mont_mul_12(t, t, a, p384_mod, p384_mp_mod);
  88525. }
  88526. XMEMCPY(r, t, sizeof(sp_digit) * 12);
  88527. #else
  88528. sp_digit* t1 = td;
  88529. sp_digit* t2 = td + 2 * 12;
  88530. sp_digit* t3 = td + 4 * 12;
  88531. sp_digit* t4 = td + 6 * 12;
  88532. sp_digit* t5 = td + 8 * 12;
  88533. /* 0x2 */
  88534. sp_384_mont_sqr_12(t1, a, p384_mod, p384_mp_mod);
  88535. /* 0x3 */
  88536. sp_384_mont_mul_12(t5, t1, a, p384_mod, p384_mp_mod);
  88537. /* 0xc */
  88538. sp_384_mont_sqr_n_12(t1, t5, 2, p384_mod, p384_mp_mod);
  88539. /* 0xf */
  88540. sp_384_mont_mul_12(t2, t5, t1, p384_mod, p384_mp_mod);
  88541. /* 0x1e */
  88542. sp_384_mont_sqr_12(t1, t2, p384_mod, p384_mp_mod);
  88543. /* 0x1f */
  88544. sp_384_mont_mul_12(t4, t1, a, p384_mod, p384_mp_mod);
  88545. /* 0x3e0 */
  88546. sp_384_mont_sqr_n_12(t1, t4, 5, p384_mod, p384_mp_mod);
  88547. /* 0x3ff */
  88548. sp_384_mont_mul_12(t2, t4, t1, p384_mod, p384_mp_mod);
  88549. /* 0x7fe0 */
  88550. sp_384_mont_sqr_n_12(t1, t2, 5, p384_mod, p384_mp_mod);
  88551. /* 0x7fff */
  88552. sp_384_mont_mul_12(t4, t4, t1, p384_mod, p384_mp_mod);
  88553. /* 0x3fff8000 */
  88554. sp_384_mont_sqr_n_12(t1, t4, 15, p384_mod, p384_mp_mod);
  88555. /* 0x3fffffff */
  88556. sp_384_mont_mul_12(t2, t4, t1, p384_mod, p384_mp_mod);
  88557. /* 0xfffffffc */
  88558. sp_384_mont_sqr_n_12(t3, t2, 2, p384_mod, p384_mp_mod);
  88559. /* 0xfffffffd */
  88560. sp_384_mont_mul_12(r, t3, a, p384_mod, p384_mp_mod);
  88561. /* 0xffffffff */
  88562. sp_384_mont_mul_12(t3, t5, t3, p384_mod, p384_mp_mod);
  88563. /* 0xfffffffc0000000 */
  88564. sp_384_mont_sqr_n_12(t1, t2, 30, p384_mod, p384_mp_mod);
  88565. /* 0xfffffffffffffff */
  88566. sp_384_mont_mul_12(t2, t2, t1, p384_mod, p384_mp_mod);
  88567. /* 0xfffffffffffffff000000000000000 */
  88568. sp_384_mont_sqr_n_12(t1, t2, 60, p384_mod, p384_mp_mod);
  88569. /* 0xffffffffffffffffffffffffffffff */
  88570. sp_384_mont_mul_12(t2, t2, t1, p384_mod, p384_mp_mod);
  88571. /* 0xffffffffffffffffffffffffffffff000000000000000000000000000000 */
  88572. sp_384_mont_sqr_n_12(t1, t2, 120, p384_mod, p384_mp_mod);
  88573. /* 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff */
  88574. sp_384_mont_mul_12(t2, t2, t1, p384_mod, p384_mp_mod);
  88575. /* 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8000 */
  88576. sp_384_mont_sqr_n_12(t1, t2, 15, p384_mod, p384_mp_mod);
  88577. /* 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff */
  88578. sp_384_mont_mul_12(t2, t4, t1, p384_mod, p384_mp_mod);
  88579. /* 0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe00000000 */
  88580. sp_384_mont_sqr_n_12(t1, t2, 33, p384_mod, p384_mp_mod);
  88581. /* 0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff */
  88582. sp_384_mont_mul_12(t2, t3, t1, p384_mod, p384_mp_mod);
  88583. /* 0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff000000000000000000000000 */
  88584. sp_384_mont_sqr_n_12(t1, t2, 96, p384_mod, p384_mp_mod);
  88585. /* 0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000fffffffd */
  88586. sp_384_mont_mul_12(r, r, t1, p384_mod, p384_mp_mod);
  88587. #endif /* WOLFSSL_SP_SMALL */
  88588. }
  88589. /* Compare a with b in constant time.
  88590. *
  88591. * a A single precision integer.
  88592. * b A single precision integer.
  88593. * return -ve, 0 or +ve if a is less than, equal to or greater than b
  88594. * respectively.
  88595. */
  88596. static sp_int32 sp_384_cmp_12(const sp_digit* a_p, const sp_digit* b_p)
  88597. {
  88598. register const sp_digit* a asm ("r0") = (const sp_digit*)a_p;
  88599. register const sp_digit* b asm ("r1") = (const sp_digit*)b_p;
  88600. __asm__ __volatile__ (
  88601. "mov r2, #-1\n\t"
  88602. "mov r6, #1\n\t"
  88603. "mov r5, #0\n\t"
  88604. "mov r3, #-1\n\t"
  88605. #ifdef WOLFSSL_SP_SMALL
  88606. "mov r4, #44\n\t"
  88607. "\n"
  88608. "L_sp_384_cmp_12_words_%=: \n\t"
  88609. "ldr r12, [%[a], r4]\n\t"
  88610. "ldr lr, [%[b], r4]\n\t"
  88611. "and r12, r12, r3\n\t"
  88612. "and lr, lr, r3\n\t"
  88613. "subs r12, r12, lr\n\t"
  88614. "it hi\n\t"
  88615. "movhi r2, r6\n\t"
  88616. "it lo\n\t"
  88617. "movlo r2, r3\n\t"
  88618. "it ne\n\t"
  88619. "movne r3, r5\n\t"
  88620. "subs r4, r4, #4\n\t"
  88621. "bcs L_sp_384_cmp_12_words_%=\n\t"
  88622. "eor r2, r2, r3\n\t"
  88623. #else
  88624. "ldr r12, [%[a], #44]\n\t"
  88625. "ldr lr, [%[b], #44]\n\t"
  88626. "and r12, r12, r3\n\t"
  88627. "and lr, lr, r3\n\t"
  88628. "subs r12, r12, lr\n\t"
  88629. "it hi\n\t"
  88630. "movhi r2, r6\n\t"
  88631. "it lo\n\t"
  88632. "movlo r2, r3\n\t"
  88633. "it ne\n\t"
  88634. "movne r3, r5\n\t"
  88635. "ldr r12, [%[a], #40]\n\t"
  88636. "ldr lr, [%[b], #40]\n\t"
  88637. "and r12, r12, r3\n\t"
  88638. "and lr, lr, r3\n\t"
  88639. "subs r12, r12, lr\n\t"
  88640. "it hi\n\t"
  88641. "movhi r2, r6\n\t"
  88642. "it lo\n\t"
  88643. "movlo r2, r3\n\t"
  88644. "it ne\n\t"
  88645. "movne r3, r5\n\t"
  88646. "ldr r12, [%[a], #36]\n\t"
  88647. "ldr lr, [%[b], #36]\n\t"
  88648. "and r12, r12, r3\n\t"
  88649. "and lr, lr, r3\n\t"
  88650. "subs r12, r12, lr\n\t"
  88651. "it hi\n\t"
  88652. "movhi r2, r6\n\t"
  88653. "it lo\n\t"
  88654. "movlo r2, r3\n\t"
  88655. "it ne\n\t"
  88656. "movne r3, r5\n\t"
  88657. "ldr r12, [%[a], #32]\n\t"
  88658. "ldr lr, [%[b], #32]\n\t"
  88659. "and r12, r12, r3\n\t"
  88660. "and lr, lr, r3\n\t"
  88661. "subs r12, r12, lr\n\t"
  88662. "it hi\n\t"
  88663. "movhi r2, r6\n\t"
  88664. "it lo\n\t"
  88665. "movlo r2, r3\n\t"
  88666. "it ne\n\t"
  88667. "movne r3, r5\n\t"
  88668. "ldr r12, [%[a], #28]\n\t"
  88669. "ldr lr, [%[b], #28]\n\t"
  88670. "and r12, r12, r3\n\t"
  88671. "and lr, lr, r3\n\t"
  88672. "subs r12, r12, lr\n\t"
  88673. "it hi\n\t"
  88674. "movhi r2, r6\n\t"
  88675. "it lo\n\t"
  88676. "movlo r2, r3\n\t"
  88677. "it ne\n\t"
  88678. "movne r3, r5\n\t"
  88679. "ldr r12, [%[a], #24]\n\t"
  88680. "ldr lr, [%[b], #24]\n\t"
  88681. "and r12, r12, r3\n\t"
  88682. "and lr, lr, r3\n\t"
  88683. "subs r12, r12, lr\n\t"
  88684. "it hi\n\t"
  88685. "movhi r2, r6\n\t"
  88686. "it lo\n\t"
  88687. "movlo r2, r3\n\t"
  88688. "it ne\n\t"
  88689. "movne r3, r5\n\t"
  88690. "ldr r12, [%[a], #20]\n\t"
  88691. "ldr lr, [%[b], #20]\n\t"
  88692. "and r12, r12, r3\n\t"
  88693. "and lr, lr, r3\n\t"
  88694. "subs r12, r12, lr\n\t"
  88695. "it hi\n\t"
  88696. "movhi r2, r6\n\t"
  88697. "it lo\n\t"
  88698. "movlo r2, r3\n\t"
  88699. "it ne\n\t"
  88700. "movne r3, r5\n\t"
  88701. "ldr r12, [%[a], #16]\n\t"
  88702. "ldr lr, [%[b], #16]\n\t"
  88703. "and r12, r12, r3\n\t"
  88704. "and lr, lr, r3\n\t"
  88705. "subs r12, r12, lr\n\t"
  88706. "it hi\n\t"
  88707. "movhi r2, r6\n\t"
  88708. "it lo\n\t"
  88709. "movlo r2, r3\n\t"
  88710. "it ne\n\t"
  88711. "movne r3, r5\n\t"
  88712. "ldr r12, [%[a], #12]\n\t"
  88713. "ldr lr, [%[b], #12]\n\t"
  88714. "and r12, r12, r3\n\t"
  88715. "and lr, lr, r3\n\t"
  88716. "subs r12, r12, lr\n\t"
  88717. "it hi\n\t"
  88718. "movhi r2, r6\n\t"
  88719. "it lo\n\t"
  88720. "movlo r2, r3\n\t"
  88721. "it ne\n\t"
  88722. "movne r3, r5\n\t"
  88723. "ldr r12, [%[a], #8]\n\t"
  88724. "ldr lr, [%[b], #8]\n\t"
  88725. "and r12, r12, r3\n\t"
  88726. "and lr, lr, r3\n\t"
  88727. "subs r12, r12, lr\n\t"
  88728. "it hi\n\t"
  88729. "movhi r2, r6\n\t"
  88730. "it lo\n\t"
  88731. "movlo r2, r3\n\t"
  88732. "it ne\n\t"
  88733. "movne r3, r5\n\t"
  88734. "ldr r12, [%[a], #4]\n\t"
  88735. "ldr lr, [%[b], #4]\n\t"
  88736. "and r12, r12, r3\n\t"
  88737. "and lr, lr, r3\n\t"
  88738. "subs r12, r12, lr\n\t"
  88739. "it hi\n\t"
  88740. "movhi r2, r6\n\t"
  88741. "it lo\n\t"
  88742. "movlo r2, r3\n\t"
  88743. "it ne\n\t"
  88744. "movne r3, r5\n\t"
  88745. "ldr r12, [%[a]]\n\t"
  88746. "ldr lr, [%[b]]\n\t"
  88747. "and r12, r12, r3\n\t"
  88748. "and lr, lr, r3\n\t"
  88749. "subs r12, r12, lr\n\t"
  88750. "it hi\n\t"
  88751. "movhi r2, r6\n\t"
  88752. "it lo\n\t"
  88753. "movlo r2, r3\n\t"
  88754. "it ne\n\t"
  88755. "movne r3, r5\n\t"
  88756. "eor r2, r2, r3\n\t"
  88757. #endif /*WOLFSSL_SP_SMALL */
  88758. "mov %[a], r2\n\t"
  88759. : [a] "+r" (a), [b] "+r" (b)
  88760. :
  88761. : "memory", "r2", "r3", "r12", "lr", "r4", "r5", "r6", "cc"
  88762. );
  88763. return (uint32_t)(size_t)a;
  88764. }
  88765. /* Normalize the values in each word to 32.
  88766. *
  88767. * a Array of sp_digit to normalize.
  88768. */
  88769. #define sp_384_norm_12(a)
  88770. /* Map the Montgomery form projective coordinate point to an affine point.
  88771. *
  88772. * r Resulting affine coordinate point.
  88773. * p Montgomery form projective coordinate point.
  88774. * t Temporary ordinate data.
  88775. */
  88776. static void sp_384_map_12(sp_point_384* r, const sp_point_384* p,
  88777. sp_digit* t)
  88778. {
  88779. sp_digit* t1 = t;
  88780. sp_digit* t2 = t + 2*12;
  88781. sp_int32 n;
  88782. sp_384_mont_inv_12(t1, p->z, t + 2*12);
  88783. sp_384_mont_sqr_12(t2, t1, p384_mod, p384_mp_mod);
  88784. sp_384_mont_mul_12(t1, t2, t1, p384_mod, p384_mp_mod);
  88785. /* x /= z^2 */
  88786. sp_384_mont_mul_12(r->x, p->x, t2, p384_mod, p384_mp_mod);
  88787. XMEMSET(r->x + 12, 0, sizeof(sp_digit) * 12U);
  88788. sp_384_mont_reduce_12(r->x, p384_mod, p384_mp_mod);
  88789. /* Reduce x to less than modulus */
  88790. n = sp_384_cmp_12(r->x, p384_mod);
  88791. sp_384_cond_sub_12(r->x, r->x, p384_mod, ~(n >> 31));
  88792. sp_384_norm_12(r->x);
  88793. /* y /= z^3 */
  88794. sp_384_mont_mul_12(r->y, p->y, t1, p384_mod, p384_mp_mod);
  88795. XMEMSET(r->y + 12, 0, sizeof(sp_digit) * 12U);
  88796. sp_384_mont_reduce_12(r->y, p384_mod, p384_mp_mod);
  88797. /* Reduce y to less than modulus */
  88798. n = sp_384_cmp_12(r->y, p384_mod);
  88799. sp_384_cond_sub_12(r->y, r->y, p384_mod, ~(n >> 31));
  88800. sp_384_norm_12(r->y);
  88801. XMEMSET(r->z, 0, sizeof(r->z) / 2);
  88802. r->z[0] = 1;
  88803. }
  88804. /* Add two Montgomery form numbers (r = a + b % m).
  88805. *
  88806. * r Result of addition.
  88807. * a First number to add in Montgomery form.
  88808. * b Second number to add in Montgomery form.
  88809. * m Modulus (prime).
  88810. */
  88811. 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)
  88812. {
  88813. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  88814. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  88815. register const sp_digit* b asm ("r2") = (const sp_digit*)b_p;
  88816. register const sp_digit* m asm ("r3") = (const sp_digit*)m_p;
  88817. sp_digit o;
  88818. o = sp_384_add_12(r, a, b);
  88819. sp_384_cond_sub_12(r, r, m, 0 - o);
  88820. }
  88821. /* Double a Montgomery form number (r = a + a % m).
  88822. *
  88823. * r Result of doubling.
  88824. * a Number to double in Montgomery form.
  88825. * m Modulus (prime).
  88826. */
  88827. static void sp_384_mont_dbl_12(sp_digit* r_p, const sp_digit* a_p, const sp_digit* m_p)
  88828. {
  88829. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  88830. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  88831. register const sp_digit* m asm ("r2") = (const sp_digit*)m_p;
  88832. sp_digit o;
  88833. o = sp_384_add_12(r, a, a);
  88834. sp_384_cond_sub_12(r, r, m, 0 - o);
  88835. }
  88836. /* Triple a Montgomery form number (r = a + a + a % m).
  88837. *
  88838. * r Result of Tripling.
  88839. * a Number to triple in Montgomery form.
  88840. * m Modulus (prime).
  88841. */
  88842. static void sp_384_mont_tpl_12(sp_digit* r_p, const sp_digit* a_p, const sp_digit* m_p)
  88843. {
  88844. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  88845. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  88846. register const sp_digit* m asm ("r2") = (const sp_digit*)m_p;
  88847. sp_digit o;
  88848. o = sp_384_add_12(r, a, a);
  88849. sp_384_cond_sub_12(r, r, m, 0 - o);
  88850. o = sp_384_add_12(r, r, a);
  88851. sp_384_cond_sub_12(r, r, m, 0 - o);
  88852. }
  88853. #ifdef WOLFSSL_SP_SMALL
  88854. /* Sub b from a into r. (r = a - b)
  88855. *
  88856. * r A single precision integer.
  88857. * a A single precision integer.
  88858. * b A single precision integer.
  88859. */
  88860. static sp_digit sp_384_sub_12(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p)
  88861. {
  88862. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  88863. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  88864. register const sp_digit* b asm ("r2") = (const sp_digit*)b_p;
  88865. __asm__ __volatile__ (
  88866. "mov r12, #0\n\t"
  88867. "add lr, %[a], #48\n\t"
  88868. "\n"
  88869. "L_sp_384_sub_12_word_%=: \n\t"
  88870. "rsbs r12, r12, #0\n\t"
  88871. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  88872. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  88873. "sbcs r3, r3, r7\n\t"
  88874. "sbcs r4, r4, r8\n\t"
  88875. "sbcs r5, r5, r9\n\t"
  88876. "sbcs r6, r6, r10\n\t"
  88877. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  88878. "sbc r12, r3, r3\n\t"
  88879. "cmp %[a], lr\n\t"
  88880. "bne L_sp_384_sub_12_word_%=\n\t"
  88881. "mov %[r], r12\n\t"
  88882. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  88883. :
  88884. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r12", "lr", "cc"
  88885. );
  88886. return (uint32_t)(size_t)r;
  88887. }
  88888. #else
  88889. /* Sub b from a into r. (r = a - b)
  88890. *
  88891. * r A single precision integer.
  88892. * a A single precision integer.
  88893. * b A single precision integer.
  88894. */
  88895. static sp_digit sp_384_sub_12(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p)
  88896. {
  88897. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  88898. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  88899. register const sp_digit* b asm ("r2") = (const sp_digit*)b_p;
  88900. __asm__ __volatile__ (
  88901. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  88902. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  88903. "subs r3, r3, r7\n\t"
  88904. "sbcs r4, r4, r8\n\t"
  88905. "sbcs r5, r5, r9\n\t"
  88906. "sbcs r6, r6, r10\n\t"
  88907. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  88908. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  88909. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  88910. "sbcs r3, r3, r7\n\t"
  88911. "sbcs r4, r4, r8\n\t"
  88912. "sbcs r5, r5, r9\n\t"
  88913. "sbcs r6, r6, r10\n\t"
  88914. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  88915. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  88916. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  88917. "sbcs r3, r3, r7\n\t"
  88918. "sbcs r4, r4, r8\n\t"
  88919. "sbcs r5, r5, r9\n\t"
  88920. "sbcs r6, r6, r10\n\t"
  88921. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  88922. "sbc %[r], r6, r6\n\t"
  88923. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  88924. :
  88925. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "cc"
  88926. );
  88927. return (uint32_t)(size_t)r;
  88928. }
  88929. #endif /* WOLFSSL_SP_SMALL */
  88930. #ifdef WOLFSSL_SP_SMALL
  88931. /* Conditionally add a and b using the mask m.
  88932. * m is -1 to add and 0 when not.
  88933. *
  88934. * r A single precision number representing conditional add result.
  88935. * a A single precision number to add with.
  88936. * b A single precision number to add.
  88937. * m Mask value to apply.
  88938. */
  88939. 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)
  88940. {
  88941. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  88942. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  88943. register const sp_digit* b asm ("r2") = (const sp_digit*)b_p;
  88944. register sp_digit m asm ("r3") = (sp_digit)m_p;
  88945. __asm__ __volatile__ (
  88946. "mov lr, #0\n\t"
  88947. "mov r6, #0\n\t"
  88948. "mov r12, #0\n\t"
  88949. "\n"
  88950. "L_sp_384_cond_add_12_words_%=: \n\t"
  88951. "adds lr, lr, #-1\n\t"
  88952. "ldr r4, [%[a], r12]\n\t"
  88953. "ldr r5, [%[b], r12]\n\t"
  88954. "and r5, r5, %[m]\n\t"
  88955. "adcs r4, r4, r5\n\t"
  88956. "adc lr, r6, r6\n\t"
  88957. "str r4, [%[r], r12]\n\t"
  88958. "add r12, r12, #4\n\t"
  88959. "cmp r12, #48\n\t"
  88960. "blt L_sp_384_cond_add_12_words_%=\n\t"
  88961. "mov %[r], lr\n\t"
  88962. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b), [m] "+r" (m)
  88963. :
  88964. : "memory", "r12", "lr", "r4", "r5", "r6", "cc"
  88965. );
  88966. return (uint32_t)(size_t)r;
  88967. }
  88968. #else
  88969. /* Conditionally add a and b using the mask m.
  88970. * m is -1 to add and 0 when not.
  88971. *
  88972. * r A single precision number representing conditional add result.
  88973. * a A single precision number to add with.
  88974. * b A single precision number to add.
  88975. * m Mask value to apply.
  88976. */
  88977. 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)
  88978. {
  88979. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  88980. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  88981. register const sp_digit* b asm ("r2") = (const sp_digit*)b_p;
  88982. register sp_digit m asm ("r3") = (sp_digit)m_p;
  88983. __asm__ __volatile__ (
  88984. "mov r8, #0\n\t"
  88985. "ldm %[a]!, {r4, r5}\n\t"
  88986. "ldm %[b]!, {r6, r7}\n\t"
  88987. "and r6, r6, %[m]\n\t"
  88988. "and r7, r7, %[m]\n\t"
  88989. "adds r4, r4, r6\n\t"
  88990. "adcs r5, r5, r7\n\t"
  88991. "stm %[r]!, {r4, r5}\n\t"
  88992. "ldm %[a]!, {r4, r5}\n\t"
  88993. "ldm %[b]!, {r6, r7}\n\t"
  88994. "and r6, r6, %[m]\n\t"
  88995. "and r7, r7, %[m]\n\t"
  88996. "adcs r4, r4, r6\n\t"
  88997. "adcs r5, r5, r7\n\t"
  88998. "stm %[r]!, {r4, r5}\n\t"
  88999. "ldm %[a]!, {r4, r5}\n\t"
  89000. "ldm %[b]!, {r6, r7}\n\t"
  89001. "and r6, r6, %[m]\n\t"
  89002. "and r7, r7, %[m]\n\t"
  89003. "adcs r4, r4, r6\n\t"
  89004. "adcs r5, r5, r7\n\t"
  89005. "stm %[r]!, {r4, r5}\n\t"
  89006. "ldm %[a]!, {r4, r5}\n\t"
  89007. "ldm %[b]!, {r6, r7}\n\t"
  89008. "and r6, r6, %[m]\n\t"
  89009. "and r7, r7, %[m]\n\t"
  89010. "adcs r4, r4, r6\n\t"
  89011. "adcs r5, r5, r7\n\t"
  89012. "stm %[r]!, {r4, r5}\n\t"
  89013. "ldm %[a]!, {r4, r5}\n\t"
  89014. "ldm %[b]!, {r6, r7}\n\t"
  89015. "and r6, r6, %[m]\n\t"
  89016. "and r7, r7, %[m]\n\t"
  89017. "adcs r4, r4, r6\n\t"
  89018. "adcs r5, r5, r7\n\t"
  89019. "stm %[r]!, {r4, r5}\n\t"
  89020. "ldm %[a]!, {r4, r5}\n\t"
  89021. "ldm %[b]!, {r6, r7}\n\t"
  89022. "and r6, r6, %[m]\n\t"
  89023. "and r7, r7, %[m]\n\t"
  89024. "adcs r4, r4, r6\n\t"
  89025. "adcs r5, r5, r7\n\t"
  89026. "stm %[r]!, {r4, r5}\n\t"
  89027. "adc %[r], r8, r8\n\t"
  89028. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b), [m] "+r" (m)
  89029. :
  89030. : "memory", "r12", "lr", "r4", "r5", "r6", "r7", "r8", "cc"
  89031. );
  89032. return (uint32_t)(size_t)r;
  89033. }
  89034. #endif /* WOLFSSL_SP_SMALL */
  89035. /* Subtract two Montgomery form numbers (r = a - b % m).
  89036. *
  89037. * r Result of subtration.
  89038. * a Number to subtract from in Montgomery form.
  89039. * b Number to subtract with in Montgomery form.
  89040. * m Modulus (prime).
  89041. */
  89042. 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)
  89043. {
  89044. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  89045. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  89046. register const sp_digit* b asm ("r2") = (const sp_digit*)b_p;
  89047. register const sp_digit* m asm ("r3") = (const sp_digit*)m_p;
  89048. sp_digit o;
  89049. o = sp_384_sub_12(r, a, b);
  89050. sp_384_cond_add_12(r, r, m, o);
  89051. }
  89052. #ifdef WOLFSSL_SP_SMALL
  89053. #else
  89054. #endif /* WOLFSSL_SP_SMALL */
  89055. static void sp_384_rshift1_12(sp_digit* r_p, const sp_digit* a_p)
  89056. {
  89057. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  89058. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  89059. __asm__ __volatile__ (
  89060. "ldm %[a], {r2, r3}\n\t"
  89061. "lsr r2, r2, #1\n\t"
  89062. "orr r2, r2, r3, lsl #31\n\t"
  89063. "lsr r3, r3, #1\n\t"
  89064. "ldr r4, [%[a], #8]\n\t"
  89065. "str r2, [%[r]]\n\t"
  89066. "orr r3, r3, r4, lsl #31\n\t"
  89067. "lsr r4, r4, #1\n\t"
  89068. "ldr r2, [%[a], #12]\n\t"
  89069. "str r3, [%[r], #4]\n\t"
  89070. "orr r4, r4, r2, lsl #31\n\t"
  89071. "lsr r2, r2, #1\n\t"
  89072. "ldr r3, [%[a], #16]\n\t"
  89073. "str r4, [%[r], #8]\n\t"
  89074. "orr r2, r2, r3, lsl #31\n\t"
  89075. "lsr r3, r3, #1\n\t"
  89076. "ldr r4, [%[a], #20]\n\t"
  89077. "str r2, [%[r], #12]\n\t"
  89078. "orr r3, r3, r4, lsl #31\n\t"
  89079. "lsr r4, r4, #1\n\t"
  89080. "ldr r2, [%[a], #24]\n\t"
  89081. "str r3, [%[r], #16]\n\t"
  89082. "orr r4, r4, r2, lsl #31\n\t"
  89083. "lsr r2, r2, #1\n\t"
  89084. "ldr r3, [%[a], #28]\n\t"
  89085. "str r4, [%[r], #20]\n\t"
  89086. "orr r2, r2, r3, lsl #31\n\t"
  89087. "lsr r3, r3, #1\n\t"
  89088. "ldr r4, [%[a], #32]\n\t"
  89089. "str r2, [%[r], #24]\n\t"
  89090. "orr r3, r3, r4, lsl #31\n\t"
  89091. "lsr r4, r4, #1\n\t"
  89092. "ldr r2, [%[a], #36]\n\t"
  89093. "str r3, [%[r], #28]\n\t"
  89094. "orr r4, r4, r2, lsl #31\n\t"
  89095. "lsr r2, r2, #1\n\t"
  89096. "ldr r3, [%[a], #40]\n\t"
  89097. "str r4, [%[r], #32]\n\t"
  89098. "orr r2, r2, r3, lsl #31\n\t"
  89099. "lsr r3, r3, #1\n\t"
  89100. "ldr r4, [%[a], #44]\n\t"
  89101. "str r2, [%[r], #36]\n\t"
  89102. "orr r3, r3, r4, lsl #31\n\t"
  89103. "lsr r4, r4, #1\n\t"
  89104. "str r3, [%[r], #40]\n\t"
  89105. "str r4, [%[r], #44]\n\t"
  89106. : [r] "+r" (r), [a] "+r" (a)
  89107. :
  89108. : "memory", "r2", "r3", "r4", "cc"
  89109. );
  89110. }
  89111. /* Divide the number by 2 mod the modulus (prime). (r = a / 2 % m)
  89112. *
  89113. * r Result of division by 2.
  89114. * a Number to divide.
  89115. * m Modulus (prime).
  89116. */
  89117. static void sp_384_mont_div2_12(sp_digit* r, const sp_digit* a, const sp_digit* m)
  89118. {
  89119. sp_digit o;
  89120. o = sp_384_cond_add_12(r, a, m, 0 - (a[0] & 1));
  89121. sp_384_rshift1_12(r, r);
  89122. r[11] |= o << 31;
  89123. }
  89124. /* Double the Montgomery form projective point p.
  89125. *
  89126. * r Result of doubling point.
  89127. * p Point to double.
  89128. * t Temporary ordinate data.
  89129. */
  89130. static void sp_384_proj_point_dbl_12(sp_point_384* r, const sp_point_384* p,
  89131. sp_digit* t)
  89132. {
  89133. sp_digit* t1 = t;
  89134. sp_digit* t2 = t + 2*12;
  89135. sp_digit* x;
  89136. sp_digit* y;
  89137. sp_digit* z;
  89138. x = r->x;
  89139. y = r->y;
  89140. z = r->z;
  89141. /* Put infinity into result. */
  89142. if (r != p) {
  89143. r->infinity = p->infinity;
  89144. }
  89145. /* T1 = Z * Z */
  89146. sp_384_mont_sqr_12(t1, p->z, p384_mod, p384_mp_mod);
  89147. /* Z = Y * Z */
  89148. sp_384_mont_mul_12(z, p->y, p->z, p384_mod, p384_mp_mod);
  89149. /* Z = 2Z */
  89150. sp_384_mont_dbl_12(z, z, p384_mod);
  89151. /* T2 = X - T1 */
  89152. sp_384_mont_sub_12(t2, p->x, t1, p384_mod);
  89153. /* T1 = X + T1 */
  89154. sp_384_mont_add_12(t1, p->x, t1, p384_mod);
  89155. /* T2 = T1 * T2 */
  89156. sp_384_mont_mul_12(t2, t1, t2, p384_mod, p384_mp_mod);
  89157. /* T1 = 3T2 */
  89158. sp_384_mont_tpl_12(t1, t2, p384_mod);
  89159. /* Y = 2Y */
  89160. sp_384_mont_dbl_12(y, p->y, p384_mod);
  89161. /* Y = Y * Y */
  89162. sp_384_mont_sqr_12(y, y, p384_mod, p384_mp_mod);
  89163. /* T2 = Y * Y */
  89164. sp_384_mont_sqr_12(t2, y, p384_mod, p384_mp_mod);
  89165. /* T2 = T2/2 */
  89166. sp_384_mont_div2_12(t2, t2, p384_mod);
  89167. /* Y = Y * X */
  89168. sp_384_mont_mul_12(y, y, p->x, p384_mod, p384_mp_mod);
  89169. /* X = T1 * T1 */
  89170. sp_384_mont_sqr_12(x, t1, p384_mod, p384_mp_mod);
  89171. /* X = X - Y */
  89172. sp_384_mont_sub_12(x, x, y, p384_mod);
  89173. /* X = X - Y */
  89174. sp_384_mont_sub_12(x, x, y, p384_mod);
  89175. /* Y = Y - X */
  89176. sp_384_mont_sub_12(y, y, x, p384_mod);
  89177. /* Y = Y * T1 */
  89178. sp_384_mont_mul_12(y, y, t1, p384_mod, p384_mp_mod);
  89179. /* Y = Y - T2 */
  89180. sp_384_mont_sub_12(y, y, t2, p384_mod);
  89181. }
  89182. #ifdef WOLFSSL_SP_NONBLOCK
  89183. typedef struct sp_384_proj_point_dbl_12_ctx {
  89184. int state;
  89185. sp_digit* t1;
  89186. sp_digit* t2;
  89187. sp_digit* x;
  89188. sp_digit* y;
  89189. sp_digit* z;
  89190. } sp_384_proj_point_dbl_12_ctx;
  89191. /* Double the Montgomery form projective point p.
  89192. *
  89193. * r Result of doubling point.
  89194. * p Point to double.
  89195. * t Temporary ordinate data.
  89196. */
  89197. static int sp_384_proj_point_dbl_12_nb(sp_ecc_ctx_t* sp_ctx, sp_point_384* r,
  89198. const sp_point_384* p, sp_digit* t)
  89199. {
  89200. int err = FP_WOULDBLOCK;
  89201. sp_384_proj_point_dbl_12_ctx* ctx = (sp_384_proj_point_dbl_12_ctx*)sp_ctx->data;
  89202. typedef char ctx_size_test[sizeof(sp_384_proj_point_dbl_12_ctx) >= sizeof(*sp_ctx) ? -1 : 1];
  89203. (void)sizeof(ctx_size_test);
  89204. switch (ctx->state) {
  89205. case 0:
  89206. ctx->t1 = t;
  89207. ctx->t2 = t + 2*12;
  89208. ctx->x = r->x;
  89209. ctx->y = r->y;
  89210. ctx->z = r->z;
  89211. /* Put infinity into result. */
  89212. if (r != p) {
  89213. r->infinity = p->infinity;
  89214. }
  89215. ctx->state = 1;
  89216. break;
  89217. case 1:
  89218. /* T1 = Z * Z */
  89219. sp_384_mont_sqr_12(ctx->t1, p->z, p384_mod, p384_mp_mod);
  89220. ctx->state = 2;
  89221. break;
  89222. case 2:
  89223. /* Z = Y * Z */
  89224. sp_384_mont_mul_12(ctx->z, p->y, p->z, p384_mod, p384_mp_mod);
  89225. ctx->state = 3;
  89226. break;
  89227. case 3:
  89228. /* Z = 2Z */
  89229. sp_384_mont_dbl_12(ctx->z, ctx->z, p384_mod);
  89230. ctx->state = 4;
  89231. break;
  89232. case 4:
  89233. /* T2 = X - T1 */
  89234. sp_384_mont_sub_12(ctx->t2, p->x, ctx->t1, p384_mod);
  89235. ctx->state = 5;
  89236. break;
  89237. case 5:
  89238. /* T1 = X + T1 */
  89239. sp_384_mont_add_12(ctx->t1, p->x, ctx->t1, p384_mod);
  89240. ctx->state = 6;
  89241. break;
  89242. case 6:
  89243. /* T2 = T1 * T2 */
  89244. sp_384_mont_mul_12(ctx->t2, ctx->t1, ctx->t2, p384_mod, p384_mp_mod);
  89245. ctx->state = 7;
  89246. break;
  89247. case 7:
  89248. /* T1 = 3T2 */
  89249. sp_384_mont_tpl_12(ctx->t1, ctx->t2, p384_mod);
  89250. ctx->state = 8;
  89251. break;
  89252. case 8:
  89253. /* Y = 2Y */
  89254. sp_384_mont_dbl_12(ctx->y, p->y, p384_mod);
  89255. ctx->state = 9;
  89256. break;
  89257. case 9:
  89258. /* Y = Y * Y */
  89259. sp_384_mont_sqr_12(ctx->y, ctx->y, p384_mod, p384_mp_mod);
  89260. ctx->state = 10;
  89261. break;
  89262. case 10:
  89263. /* T2 = Y * Y */
  89264. sp_384_mont_sqr_12(ctx->t2, ctx->y, p384_mod, p384_mp_mod);
  89265. ctx->state = 11;
  89266. break;
  89267. case 11:
  89268. /* T2 = T2/2 */
  89269. sp_384_mont_div2_12(ctx->t2, ctx->t2, p384_mod);
  89270. ctx->state = 12;
  89271. break;
  89272. case 12:
  89273. /* Y = Y * X */
  89274. sp_384_mont_mul_12(ctx->y, ctx->y, p->x, p384_mod, p384_mp_mod);
  89275. ctx->state = 13;
  89276. break;
  89277. case 13:
  89278. /* X = T1 * T1 */
  89279. sp_384_mont_sqr_12(ctx->x, ctx->t1, p384_mod, p384_mp_mod);
  89280. ctx->state = 14;
  89281. break;
  89282. case 14:
  89283. /* X = X - Y */
  89284. sp_384_mont_sub_12(ctx->x, ctx->x, ctx->y, p384_mod);
  89285. ctx->state = 15;
  89286. break;
  89287. case 15:
  89288. /* X = X - Y */
  89289. sp_384_mont_sub_12(ctx->x, ctx->x, ctx->y, p384_mod);
  89290. ctx->state = 16;
  89291. break;
  89292. case 16:
  89293. /* Y = Y - X */
  89294. sp_384_mont_sub_12(ctx->y, ctx->y, ctx->x, p384_mod);
  89295. ctx->state = 17;
  89296. break;
  89297. case 17:
  89298. /* Y = Y * T1 */
  89299. sp_384_mont_mul_12(ctx->y, ctx->y, ctx->t1, p384_mod, p384_mp_mod);
  89300. ctx->state = 18;
  89301. break;
  89302. case 18:
  89303. /* Y = Y - T2 */
  89304. sp_384_mont_sub_12(ctx->y, ctx->y, ctx->t2, p384_mod);
  89305. ctx->state = 19;
  89306. /* fall-through */
  89307. case 19:
  89308. err = MP_OKAY;
  89309. break;
  89310. }
  89311. if (err == MP_OKAY && ctx->state != 19) {
  89312. err = FP_WOULDBLOCK;
  89313. }
  89314. return err;
  89315. }
  89316. #endif /* WOLFSSL_SP_NONBLOCK */
  89317. /* Compare two numbers to determine if they are equal.
  89318. * Constant time implementation.
  89319. *
  89320. * a First number to compare.
  89321. * b Second number to compare.
  89322. * returns 1 when equal and 0 otherwise.
  89323. */
  89324. static int sp_384_cmp_equal_12(const sp_digit* a, const sp_digit* b)
  89325. {
  89326. return ((a[0] ^ b[0]) | (a[1] ^ b[1]) | (a[2] ^ b[2]) |
  89327. (a[3] ^ b[3]) | (a[4] ^ b[4]) | (a[5] ^ b[5]) |
  89328. (a[6] ^ b[6]) | (a[7] ^ b[7]) | (a[8] ^ b[8]) |
  89329. (a[9] ^ b[9]) | (a[10] ^ b[10]) | (a[11] ^ b[11])) == 0;
  89330. }
  89331. /* Returns 1 if the number of zero.
  89332. * Implementation is constant time.
  89333. *
  89334. * a Number to check.
  89335. * returns 1 if the number is zero and 0 otherwise.
  89336. */
  89337. static int sp_384_iszero_12(const sp_digit* a)
  89338. {
  89339. return (a[0] | a[1] | a[2] | a[3] | a[4] | a[5] | a[6] | a[7] |
  89340. a[8] | a[9] | a[10] | a[11]) == 0;
  89341. }
  89342. /* Add two Montgomery form projective points.
  89343. *
  89344. * r Result of addition.
  89345. * p First point to add.
  89346. * q Second point to add.
  89347. * t Temporary ordinate data.
  89348. */
  89349. static void sp_384_proj_point_add_12(sp_point_384* r,
  89350. const sp_point_384* p, const sp_point_384* q, sp_digit* t)
  89351. {
  89352. sp_digit* t6 = t;
  89353. sp_digit* t1 = t + 2*12;
  89354. sp_digit* t2 = t + 4*12;
  89355. sp_digit* t3 = t + 6*12;
  89356. sp_digit* t4 = t + 8*12;
  89357. sp_digit* t5 = t + 10*12;
  89358. /* U1 = X1*Z2^2 */
  89359. sp_384_mont_sqr_12(t1, q->z, p384_mod, p384_mp_mod);
  89360. sp_384_mont_mul_12(t3, t1, q->z, p384_mod, p384_mp_mod);
  89361. sp_384_mont_mul_12(t1, t1, p->x, p384_mod, p384_mp_mod);
  89362. /* U2 = X2*Z1^2 */
  89363. sp_384_mont_sqr_12(t2, p->z, p384_mod, p384_mp_mod);
  89364. sp_384_mont_mul_12(t4, t2, p->z, p384_mod, p384_mp_mod);
  89365. sp_384_mont_mul_12(t2, t2, q->x, p384_mod, p384_mp_mod);
  89366. /* S1 = Y1*Z2^3 */
  89367. sp_384_mont_mul_12(t3, t3, p->y, p384_mod, p384_mp_mod);
  89368. /* S2 = Y2*Z1^3 */
  89369. sp_384_mont_mul_12(t4, t4, q->y, p384_mod, p384_mp_mod);
  89370. /* Check double */
  89371. if ((~p->infinity) & (~q->infinity) &
  89372. sp_384_cmp_equal_12(t2, t1) &
  89373. sp_384_cmp_equal_12(t4, t3)) {
  89374. sp_384_proj_point_dbl_12(r, p, t);
  89375. }
  89376. else {
  89377. sp_digit* x = t6;
  89378. sp_digit* y = t1;
  89379. sp_digit* z = t2;
  89380. /* H = U2 - U1 */
  89381. sp_384_mont_sub_12(t2, t2, t1, p384_mod);
  89382. /* R = S2 - S1 */
  89383. sp_384_mont_sub_12(t4, t4, t3, p384_mod);
  89384. /* X3 = R^2 - H^3 - 2*U1*H^2 */
  89385. sp_384_mont_sqr_12(t5, t2, p384_mod, p384_mp_mod);
  89386. sp_384_mont_mul_12(y, t1, t5, p384_mod, p384_mp_mod);
  89387. sp_384_mont_mul_12(t5, t5, t2, p384_mod, p384_mp_mod);
  89388. /* Z3 = H*Z1*Z2 */
  89389. sp_384_mont_mul_12(z, p->z, t2, p384_mod, p384_mp_mod);
  89390. sp_384_mont_mul_12(z, z, q->z, p384_mod, p384_mp_mod);
  89391. sp_384_mont_sqr_12(x, t4, p384_mod, p384_mp_mod);
  89392. sp_384_mont_sub_12(x, x, t5, p384_mod);
  89393. sp_384_mont_mul_12(t5, t5, t3, p384_mod, p384_mp_mod);
  89394. sp_384_mont_dbl_12(t3, y, p384_mod);
  89395. sp_384_mont_sub_12(x, x, t3, p384_mod);
  89396. /* Y3 = R*(U1*H^2 - X3) - S1*H^3 */
  89397. sp_384_mont_sub_12(y, y, x, p384_mod);
  89398. sp_384_mont_mul_12(y, y, t4, p384_mod, p384_mp_mod);
  89399. sp_384_mont_sub_12(y, y, t5, p384_mod);
  89400. {
  89401. int i;
  89402. sp_digit maskp = 0 - (q->infinity & (!p->infinity));
  89403. sp_digit maskq = 0 - (p->infinity & (!q->infinity));
  89404. sp_digit maskt = ~(maskp | maskq);
  89405. sp_digit inf = (sp_digit)(p->infinity & q->infinity);
  89406. for (i = 0; i < 12; i++) {
  89407. r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) |
  89408. (x[i] & maskt);
  89409. }
  89410. for (i = 0; i < 12; i++) {
  89411. r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) |
  89412. (y[i] & maskt);
  89413. }
  89414. for (i = 0; i < 12; i++) {
  89415. r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) |
  89416. (z[i] & maskt);
  89417. }
  89418. r->z[0] |= inf;
  89419. r->infinity = (word32)inf;
  89420. }
  89421. }
  89422. }
  89423. #ifdef WOLFSSL_SP_NONBLOCK
  89424. typedef struct sp_384_proj_point_add_12_ctx {
  89425. int state;
  89426. sp_384_proj_point_dbl_12_ctx dbl_ctx;
  89427. const sp_point_384* ap[2];
  89428. sp_point_384* rp[2];
  89429. sp_digit* t1;
  89430. sp_digit* t2;
  89431. sp_digit* t3;
  89432. sp_digit* t4;
  89433. sp_digit* t5;
  89434. sp_digit* t6;
  89435. sp_digit* x;
  89436. sp_digit* y;
  89437. sp_digit* z;
  89438. } sp_384_proj_point_add_12_ctx;
  89439. /* Add two Montgomery form projective points.
  89440. *
  89441. * r Result of addition.
  89442. * p First point to add.
  89443. * q Second point to add.
  89444. * t Temporary ordinate data.
  89445. */
  89446. static int sp_384_proj_point_add_12_nb(sp_ecc_ctx_t* sp_ctx, sp_point_384* r,
  89447. const sp_point_384* p, const sp_point_384* q, sp_digit* t)
  89448. {
  89449. int err = FP_WOULDBLOCK;
  89450. sp_384_proj_point_add_12_ctx* ctx = (sp_384_proj_point_add_12_ctx*)sp_ctx->data;
  89451. /* Ensure only the first point is the same as the result. */
  89452. if (q == r) {
  89453. const sp_point_384* a = p;
  89454. p = q;
  89455. q = a;
  89456. }
  89457. typedef char ctx_size_test[sizeof(sp_384_proj_point_add_12_ctx) >= sizeof(*sp_ctx) ? -1 : 1];
  89458. (void)sizeof(ctx_size_test);
  89459. switch (ctx->state) {
  89460. case 0: /* INIT */
  89461. ctx->t6 = t;
  89462. ctx->t1 = t + 2*12;
  89463. ctx->t2 = t + 4*12;
  89464. ctx->t3 = t + 6*12;
  89465. ctx->t4 = t + 8*12;
  89466. ctx->t5 = t + 10*12;
  89467. ctx->x = ctx->t6;
  89468. ctx->y = ctx->t1;
  89469. ctx->z = ctx->t2;
  89470. ctx->state = 1;
  89471. break;
  89472. case 1:
  89473. /* U1 = X1*Z2^2 */
  89474. sp_384_mont_sqr_12(ctx->t1, q->z, p384_mod, p384_mp_mod);
  89475. ctx->state = 2;
  89476. break;
  89477. case 2:
  89478. sp_384_mont_mul_12(ctx->t3, ctx->t1, q->z, p384_mod, p384_mp_mod);
  89479. ctx->state = 3;
  89480. break;
  89481. case 3:
  89482. sp_384_mont_mul_12(ctx->t1, ctx->t1, p->x, p384_mod, p384_mp_mod);
  89483. ctx->state = 4;
  89484. break;
  89485. case 4:
  89486. /* U2 = X2*Z1^2 */
  89487. sp_384_mont_sqr_12(ctx->t2, p->z, p384_mod, p384_mp_mod);
  89488. ctx->state = 5;
  89489. break;
  89490. case 5:
  89491. sp_384_mont_mul_12(ctx->t4, ctx->t2, p->z, p384_mod, p384_mp_mod);
  89492. ctx->state = 6;
  89493. break;
  89494. case 6:
  89495. sp_384_mont_mul_12(ctx->t2, ctx->t2, q->x, p384_mod, p384_mp_mod);
  89496. ctx->state = 7;
  89497. break;
  89498. case 7:
  89499. /* S1 = Y1*Z2^3 */
  89500. sp_384_mont_mul_12(ctx->t3, ctx->t3, p->y, p384_mod, p384_mp_mod);
  89501. ctx->state = 8;
  89502. break;
  89503. case 8:
  89504. /* S2 = Y2*Z1^3 */
  89505. sp_384_mont_mul_12(ctx->t4, ctx->t4, q->y, p384_mod, p384_mp_mod);
  89506. ctx->state = 9;
  89507. break;
  89508. case 9:
  89509. /* Check double */
  89510. if ((~p->infinity) & (~q->infinity) &
  89511. sp_384_cmp_equal_12(ctx->t2, ctx->t1) &
  89512. sp_384_cmp_equal_12(ctx->t4, ctx->t3)) {
  89513. XMEMSET(&ctx->dbl_ctx, 0, sizeof(ctx->dbl_ctx));
  89514. sp_384_proj_point_dbl_12(r, p, t);
  89515. ctx->state = 25;
  89516. }
  89517. else {
  89518. ctx->state = 10;
  89519. }
  89520. break;
  89521. case 10:
  89522. /* H = U2 - U1 */
  89523. sp_384_mont_sub_12(ctx->t2, ctx->t2, ctx->t1, p384_mod);
  89524. ctx->state = 11;
  89525. break;
  89526. case 11:
  89527. /* R = S2 - S1 */
  89528. sp_384_mont_sub_12(ctx->t4, ctx->t4, ctx->t3, p384_mod);
  89529. ctx->state = 12;
  89530. break;
  89531. case 12:
  89532. /* X3 = R^2 - H^3 - 2*U1*H^2 */
  89533. sp_384_mont_sqr_12(ctx->t5, ctx->t2, p384_mod, p384_mp_mod);
  89534. ctx->state = 13;
  89535. break;
  89536. case 13:
  89537. sp_384_mont_mul_12(ctx->y, ctx->t1, ctx->t5, p384_mod, p384_mp_mod);
  89538. ctx->state = 14;
  89539. break;
  89540. case 14:
  89541. sp_384_mont_mul_12(ctx->t5, ctx->t5, ctx->t2, p384_mod, p384_mp_mod);
  89542. ctx->state = 15;
  89543. break;
  89544. case 15:
  89545. /* Z3 = H*Z1*Z2 */
  89546. sp_384_mont_mul_12(ctx->z, p->z, ctx->t2, p384_mod, p384_mp_mod);
  89547. ctx->state = 16;
  89548. break;
  89549. case 16:
  89550. sp_384_mont_mul_12(ctx->z, ctx->z, q->z, p384_mod, p384_mp_mod);
  89551. ctx->state = 17;
  89552. break;
  89553. case 17:
  89554. sp_384_mont_sqr_12(ctx->x, ctx->t4, p384_mod, p384_mp_mod);
  89555. ctx->state = 18;
  89556. break;
  89557. case 18:
  89558. sp_384_mont_sub_12(ctx->x, ctx->x, ctx->t5, p384_mod);
  89559. ctx->state = 19;
  89560. break;
  89561. case 19:
  89562. sp_384_mont_mul_12(ctx->t5, ctx->t5, ctx->t3, p384_mod, p384_mp_mod);
  89563. ctx->state = 20;
  89564. break;
  89565. case 20:
  89566. sp_384_mont_dbl_12(ctx->t3, ctx->y, p384_mod);
  89567. sp_384_mont_sub_12(ctx->x, ctx->x, ctx->t3, p384_mod);
  89568. ctx->state = 21;
  89569. break;
  89570. case 21:
  89571. /* Y3 = R*(U1*H^2 - X3) - S1*H^3 */
  89572. sp_384_mont_sub_12(ctx->y, ctx->y, ctx->x, p384_mod);
  89573. ctx->state = 22;
  89574. break;
  89575. case 22:
  89576. sp_384_mont_mul_12(ctx->y, ctx->y, ctx->t4, p384_mod, p384_mp_mod);
  89577. ctx->state = 23;
  89578. break;
  89579. case 23:
  89580. sp_384_mont_sub_12(ctx->y, ctx->y, ctx->t5, p384_mod);
  89581. ctx->state = 24;
  89582. break;
  89583. case 24:
  89584. {
  89585. {
  89586. int i;
  89587. sp_digit maskp = 0 - (q->infinity & (!p->infinity));
  89588. sp_digit maskq = 0 - (p->infinity & (!q->infinity));
  89589. sp_digit maskt = ~(maskp | maskq);
  89590. sp_digit inf = (sp_digit)(p->infinity & q->infinity);
  89591. for (i = 0; i < 12; i++) {
  89592. r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) |
  89593. (ctx->x[i] & maskt);
  89594. }
  89595. for (i = 0; i < 12; i++) {
  89596. r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) |
  89597. (ctx->y[i] & maskt);
  89598. }
  89599. for (i = 0; i < 12; i++) {
  89600. r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) |
  89601. (ctx->z[i] & maskt);
  89602. }
  89603. r->z[0] |= inf;
  89604. r->infinity = (word32)inf;
  89605. }
  89606. ctx->state = 25;
  89607. break;
  89608. }
  89609. case 25:
  89610. err = MP_OKAY;
  89611. break;
  89612. }
  89613. if (err == MP_OKAY && ctx->state != 25) {
  89614. err = FP_WOULDBLOCK;
  89615. }
  89616. return err;
  89617. }
  89618. #endif /* WOLFSSL_SP_NONBLOCK */
  89619. #ifndef WC_NO_CACHE_RESISTANT
  89620. /* Touch each possible point that could be being copied.
  89621. *
  89622. * r Point to copy into.
  89623. * table Table - start of the entries to access
  89624. * idx Index of entry to retrieve.
  89625. */
  89626. static void sp_384_get_point_16_12(sp_point_384* r, const sp_point_384* table,
  89627. int idx)
  89628. {
  89629. int i;
  89630. sp_digit mask;
  89631. r->x[0] = 0;
  89632. r->x[1] = 0;
  89633. r->x[2] = 0;
  89634. r->x[3] = 0;
  89635. r->x[4] = 0;
  89636. r->x[5] = 0;
  89637. r->x[6] = 0;
  89638. r->x[7] = 0;
  89639. r->x[8] = 0;
  89640. r->x[9] = 0;
  89641. r->x[10] = 0;
  89642. r->x[11] = 0;
  89643. r->y[0] = 0;
  89644. r->y[1] = 0;
  89645. r->y[2] = 0;
  89646. r->y[3] = 0;
  89647. r->y[4] = 0;
  89648. r->y[5] = 0;
  89649. r->y[6] = 0;
  89650. r->y[7] = 0;
  89651. r->y[8] = 0;
  89652. r->y[9] = 0;
  89653. r->y[10] = 0;
  89654. r->y[11] = 0;
  89655. r->z[0] = 0;
  89656. r->z[1] = 0;
  89657. r->z[2] = 0;
  89658. r->z[3] = 0;
  89659. r->z[4] = 0;
  89660. r->z[5] = 0;
  89661. r->z[6] = 0;
  89662. r->z[7] = 0;
  89663. r->z[8] = 0;
  89664. r->z[9] = 0;
  89665. r->z[10] = 0;
  89666. r->z[11] = 0;
  89667. for (i = 1; i < 16; i++) {
  89668. mask = 0 - (i == idx);
  89669. r->x[0] |= mask & table[i].x[0];
  89670. r->x[1] |= mask & table[i].x[1];
  89671. r->x[2] |= mask & table[i].x[2];
  89672. r->x[3] |= mask & table[i].x[3];
  89673. r->x[4] |= mask & table[i].x[4];
  89674. r->x[5] |= mask & table[i].x[5];
  89675. r->x[6] |= mask & table[i].x[6];
  89676. r->x[7] |= mask & table[i].x[7];
  89677. r->x[8] |= mask & table[i].x[8];
  89678. r->x[9] |= mask & table[i].x[9];
  89679. r->x[10] |= mask & table[i].x[10];
  89680. r->x[11] |= mask & table[i].x[11];
  89681. r->y[0] |= mask & table[i].y[0];
  89682. r->y[1] |= mask & table[i].y[1];
  89683. r->y[2] |= mask & table[i].y[2];
  89684. r->y[3] |= mask & table[i].y[3];
  89685. r->y[4] |= mask & table[i].y[4];
  89686. r->y[5] |= mask & table[i].y[5];
  89687. r->y[6] |= mask & table[i].y[6];
  89688. r->y[7] |= mask & table[i].y[7];
  89689. r->y[8] |= mask & table[i].y[8];
  89690. r->y[9] |= mask & table[i].y[9];
  89691. r->y[10] |= mask & table[i].y[10];
  89692. r->y[11] |= mask & table[i].y[11];
  89693. r->z[0] |= mask & table[i].z[0];
  89694. r->z[1] |= mask & table[i].z[1];
  89695. r->z[2] |= mask & table[i].z[2];
  89696. r->z[3] |= mask & table[i].z[3];
  89697. r->z[4] |= mask & table[i].z[4];
  89698. r->z[5] |= mask & table[i].z[5];
  89699. r->z[6] |= mask & table[i].z[6];
  89700. r->z[7] |= mask & table[i].z[7];
  89701. r->z[8] |= mask & table[i].z[8];
  89702. r->z[9] |= mask & table[i].z[9];
  89703. r->z[10] |= mask & table[i].z[10];
  89704. r->z[11] |= mask & table[i].z[11];
  89705. }
  89706. }
  89707. #endif /* !WC_NO_CACHE_RESISTANT */
  89708. /* Multiply the point by the scalar and return the result.
  89709. * If map is true then convert result to affine coordinates.
  89710. *
  89711. * Fast implementation that generates a pre-computation table.
  89712. * 4 bits of window (no sliding!).
  89713. * Uses add and double for calculating table.
  89714. * 384 doubles.
  89715. * 108 adds.
  89716. *
  89717. * r Resulting point.
  89718. * g Point to multiply.
  89719. * k Scalar to multiply by.
  89720. * map Indicates whether to convert result to affine.
  89721. * ct Constant time required.
  89722. * heap Heap to use for allocation.
  89723. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  89724. */
  89725. static int sp_384_ecc_mulmod_fast_12(sp_point_384* r, const sp_point_384* g, const sp_digit* k,
  89726. int map, int ct, void* heap)
  89727. {
  89728. #ifdef WOLFSSL_SP_SMALL_STACK
  89729. sp_point_384* t = NULL;
  89730. sp_digit* tmp = NULL;
  89731. #else
  89732. sp_point_384 t[16 + 1];
  89733. sp_digit tmp[2 * 12 * 6];
  89734. #endif
  89735. sp_point_384* rt = NULL;
  89736. #ifndef WC_NO_CACHE_RESISTANT
  89737. #ifdef WOLFSSL_SP_SMALL_STACK
  89738. sp_point_384* p = NULL;
  89739. #else
  89740. sp_point_384 p[1];
  89741. #endif
  89742. #endif /* !WC_NO_CACHE_RESISTANT */
  89743. sp_digit n;
  89744. int i;
  89745. int c;
  89746. int y;
  89747. int err = MP_OKAY;
  89748. /* Constant time used for cache attack resistance implementation. */
  89749. (void)ct;
  89750. (void)heap;
  89751. #ifdef WOLFSSL_SP_SMALL_STACK
  89752. t = (sp_point_384*)XMALLOC(sizeof(sp_point_384) * (16 + 1),
  89753. heap, DYNAMIC_TYPE_ECC);
  89754. if (t == NULL)
  89755. err = MEMORY_E;
  89756. #ifndef WC_NO_CACHE_RESISTANT
  89757. if (err == MP_OKAY) {
  89758. p = (sp_point_384*)XMALLOC(sizeof(sp_point_384),
  89759. heap, DYNAMIC_TYPE_ECC);
  89760. if (p == NULL)
  89761. err = MEMORY_E;
  89762. }
  89763. #endif
  89764. if (err == MP_OKAY) {
  89765. tmp = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 12 * 6, heap,
  89766. DYNAMIC_TYPE_ECC);
  89767. if (tmp == NULL)
  89768. err = MEMORY_E;
  89769. }
  89770. #endif
  89771. if (err == MP_OKAY) {
  89772. rt = t + 16;
  89773. /* t[0] = {0, 0, 1} * norm */
  89774. XMEMSET(&t[0], 0, sizeof(t[0]));
  89775. t[0].infinity = 1;
  89776. /* t[1] = {g->x, g->y, g->z} * norm */
  89777. (void)sp_384_mod_mul_norm_12(t[1].x, g->x, p384_mod);
  89778. (void)sp_384_mod_mul_norm_12(t[1].y, g->y, p384_mod);
  89779. (void)sp_384_mod_mul_norm_12(t[1].z, g->z, p384_mod);
  89780. t[1].infinity = 0;
  89781. sp_384_proj_point_dbl_12(&t[ 2], &t[ 1], tmp);
  89782. t[ 2].infinity = 0;
  89783. sp_384_proj_point_add_12(&t[ 3], &t[ 2], &t[ 1], tmp);
  89784. t[ 3].infinity = 0;
  89785. sp_384_proj_point_dbl_12(&t[ 4], &t[ 2], tmp);
  89786. t[ 4].infinity = 0;
  89787. sp_384_proj_point_add_12(&t[ 5], &t[ 3], &t[ 2], tmp);
  89788. t[ 5].infinity = 0;
  89789. sp_384_proj_point_dbl_12(&t[ 6], &t[ 3], tmp);
  89790. t[ 6].infinity = 0;
  89791. sp_384_proj_point_add_12(&t[ 7], &t[ 4], &t[ 3], tmp);
  89792. t[ 7].infinity = 0;
  89793. sp_384_proj_point_dbl_12(&t[ 8], &t[ 4], tmp);
  89794. t[ 8].infinity = 0;
  89795. sp_384_proj_point_add_12(&t[ 9], &t[ 5], &t[ 4], tmp);
  89796. t[ 9].infinity = 0;
  89797. sp_384_proj_point_dbl_12(&t[10], &t[ 5], tmp);
  89798. t[10].infinity = 0;
  89799. sp_384_proj_point_add_12(&t[11], &t[ 6], &t[ 5], tmp);
  89800. t[11].infinity = 0;
  89801. sp_384_proj_point_dbl_12(&t[12], &t[ 6], tmp);
  89802. t[12].infinity = 0;
  89803. sp_384_proj_point_add_12(&t[13], &t[ 7], &t[ 6], tmp);
  89804. t[13].infinity = 0;
  89805. sp_384_proj_point_dbl_12(&t[14], &t[ 7], tmp);
  89806. t[14].infinity = 0;
  89807. sp_384_proj_point_add_12(&t[15], &t[ 8], &t[ 7], tmp);
  89808. t[15].infinity = 0;
  89809. i = 10;
  89810. n = k[i+1] << 0;
  89811. c = 28;
  89812. y = (int)(n >> 28);
  89813. #ifndef WC_NO_CACHE_RESISTANT
  89814. if (ct) {
  89815. sp_384_get_point_16_12(rt, t, y);
  89816. rt->infinity = !y;
  89817. }
  89818. else
  89819. #endif
  89820. {
  89821. XMEMCPY(rt, &t[y], sizeof(sp_point_384));
  89822. }
  89823. n <<= 4;
  89824. for (; i>=0 || c>=4; ) {
  89825. if (c < 4) {
  89826. n |= k[i--];
  89827. c += 32;
  89828. }
  89829. y = (n >> 28) & 0xf;
  89830. n <<= 4;
  89831. c -= 4;
  89832. sp_384_proj_point_dbl_12(rt, rt, tmp);
  89833. sp_384_proj_point_dbl_12(rt, rt, tmp);
  89834. sp_384_proj_point_dbl_12(rt, rt, tmp);
  89835. sp_384_proj_point_dbl_12(rt, rt, tmp);
  89836. #ifndef WC_NO_CACHE_RESISTANT
  89837. if (ct) {
  89838. sp_384_get_point_16_12(p, t, y);
  89839. p->infinity = !y;
  89840. sp_384_proj_point_add_12(rt, rt, p, tmp);
  89841. }
  89842. else
  89843. #endif
  89844. {
  89845. sp_384_proj_point_add_12(rt, rt, &t[y], tmp);
  89846. }
  89847. }
  89848. if (map != 0) {
  89849. sp_384_map_12(r, rt, tmp);
  89850. }
  89851. else {
  89852. XMEMCPY(r, rt, sizeof(sp_point_384));
  89853. }
  89854. }
  89855. #ifdef WOLFSSL_SP_SMALL_STACK
  89856. if (tmp != NULL)
  89857. #endif
  89858. {
  89859. ForceZero(tmp, sizeof(sp_digit) * 2 * 12 * 6);
  89860. #ifdef WOLFSSL_SP_SMALL_STACK
  89861. XFREE(tmp, heap, DYNAMIC_TYPE_ECC);
  89862. #endif
  89863. }
  89864. #ifndef WC_NO_CACHE_RESISTANT
  89865. #ifdef WOLFSSL_SP_SMALL_STACK
  89866. if (p != NULL)
  89867. #endif
  89868. {
  89869. ForceZero(p, sizeof(sp_point_384));
  89870. #ifdef WOLFSSL_SP_SMALL_STACK
  89871. XFREE(p, heap, DYNAMIC_TYPE_ECC);
  89872. #endif
  89873. }
  89874. #endif /* !WC_NO_CACHE_RESISTANT */
  89875. #ifdef WOLFSSL_SP_SMALL_STACK
  89876. if (t != NULL)
  89877. #endif
  89878. {
  89879. ForceZero(t, sizeof(sp_point_384) * 17);
  89880. #ifdef WOLFSSL_SP_SMALL_STACK
  89881. XFREE(t, heap, DYNAMIC_TYPE_ECC);
  89882. #endif
  89883. }
  89884. return err;
  89885. }
  89886. #ifdef FP_ECC
  89887. /* Double the Montgomery form projective point p a number of times.
  89888. *
  89889. * r Result of repeated doubling of point.
  89890. * p Point to double.
  89891. * n Number of times to double
  89892. * t Temporary ordinate data.
  89893. */
  89894. static void sp_384_proj_point_dbl_n_12(sp_point_384* p, int i,
  89895. sp_digit* t)
  89896. {
  89897. sp_digit* w = t;
  89898. sp_digit* a = t + 2*12;
  89899. sp_digit* b = t + 4*12;
  89900. sp_digit* t1 = t + 6*12;
  89901. sp_digit* t2 = t + 8*12;
  89902. sp_digit* x;
  89903. sp_digit* y;
  89904. sp_digit* z;
  89905. volatile int n = i;
  89906. x = p->x;
  89907. y = p->y;
  89908. z = p->z;
  89909. /* Y = 2*Y */
  89910. sp_384_mont_dbl_12(y, y, p384_mod);
  89911. /* W = Z^4 */
  89912. sp_384_mont_sqr_12(w, z, p384_mod, p384_mp_mod);
  89913. sp_384_mont_sqr_12(w, w, p384_mod, p384_mp_mod);
  89914. #ifndef WOLFSSL_SP_SMALL
  89915. while (--n > 0)
  89916. #else
  89917. while (--n >= 0)
  89918. #endif
  89919. {
  89920. /* A = 3*(X^2 - W) */
  89921. sp_384_mont_sqr_12(t1, x, p384_mod, p384_mp_mod);
  89922. sp_384_mont_sub_12(t1, t1, w, p384_mod);
  89923. sp_384_mont_tpl_12(a, t1, p384_mod);
  89924. /* B = X*Y^2 */
  89925. sp_384_mont_sqr_12(t1, y, p384_mod, p384_mp_mod);
  89926. sp_384_mont_mul_12(b, t1, x, p384_mod, p384_mp_mod);
  89927. /* X = A^2 - 2B */
  89928. sp_384_mont_sqr_12(x, a, p384_mod, p384_mp_mod);
  89929. sp_384_mont_dbl_12(t2, b, p384_mod);
  89930. sp_384_mont_sub_12(x, x, t2, p384_mod);
  89931. /* B = 2.(B - X) */
  89932. sp_384_mont_sub_12(t2, b, x, p384_mod);
  89933. sp_384_mont_dbl_12(b, t2, p384_mod);
  89934. /* Z = Z*Y */
  89935. sp_384_mont_mul_12(z, z, y, p384_mod, p384_mp_mod);
  89936. /* t1 = Y^4 */
  89937. sp_384_mont_sqr_12(t1, t1, p384_mod, p384_mp_mod);
  89938. #ifdef WOLFSSL_SP_SMALL
  89939. if (n != 0)
  89940. #endif
  89941. {
  89942. /* W = W*Y^4 */
  89943. sp_384_mont_mul_12(w, w, t1, p384_mod, p384_mp_mod);
  89944. }
  89945. /* y = 2*A*(B - X) - Y^4 */
  89946. sp_384_mont_mul_12(y, b, a, p384_mod, p384_mp_mod);
  89947. sp_384_mont_sub_12(y, y, t1, p384_mod);
  89948. }
  89949. #ifndef WOLFSSL_SP_SMALL
  89950. /* A = 3*(X^2 - W) */
  89951. sp_384_mont_sqr_12(t1, x, p384_mod, p384_mp_mod);
  89952. sp_384_mont_sub_12(t1, t1, w, p384_mod);
  89953. sp_384_mont_tpl_12(a, t1, p384_mod);
  89954. /* B = X*Y^2 */
  89955. sp_384_mont_sqr_12(t1, y, p384_mod, p384_mp_mod);
  89956. sp_384_mont_mul_12(b, t1, x, p384_mod, p384_mp_mod);
  89957. /* X = A^2 - 2B */
  89958. sp_384_mont_sqr_12(x, a, p384_mod, p384_mp_mod);
  89959. sp_384_mont_dbl_12(t2, b, p384_mod);
  89960. sp_384_mont_sub_12(x, x, t2, p384_mod);
  89961. /* B = 2.(B - X) */
  89962. sp_384_mont_sub_12(t2, b, x, p384_mod);
  89963. sp_384_mont_dbl_12(b, t2, p384_mod);
  89964. /* Z = Z*Y */
  89965. sp_384_mont_mul_12(z, z, y, p384_mod, p384_mp_mod);
  89966. /* t1 = Y^4 */
  89967. sp_384_mont_sqr_12(t1, t1, p384_mod, p384_mp_mod);
  89968. /* y = 2*A*(B - X) - Y^4 */
  89969. sp_384_mont_mul_12(y, b, a, p384_mod, p384_mp_mod);
  89970. sp_384_mont_sub_12(y, y, t1, p384_mod);
  89971. #endif /* WOLFSSL_SP_SMALL */
  89972. /* Y = Y/2 */
  89973. sp_384_mont_div2_12(y, y, p384_mod);
  89974. }
  89975. /* Convert the projective point to affine.
  89976. * Ordinates are in Montgomery form.
  89977. *
  89978. * a Point to convert.
  89979. * t Temporary data.
  89980. */
  89981. static void sp_384_proj_to_affine_12(sp_point_384* a, sp_digit* t)
  89982. {
  89983. sp_digit* t1 = t;
  89984. sp_digit* t2 = t + 2 * 12;
  89985. sp_digit* tmp = t + 4 * 12;
  89986. sp_384_mont_inv_12(t1, a->z, tmp);
  89987. sp_384_mont_sqr_12(t2, t1, p384_mod, p384_mp_mod);
  89988. sp_384_mont_mul_12(t1, t2, t1, p384_mod, p384_mp_mod);
  89989. sp_384_mont_mul_12(a->x, a->x, t2, p384_mod, p384_mp_mod);
  89990. sp_384_mont_mul_12(a->y, a->y, t1, p384_mod, p384_mp_mod);
  89991. XMEMCPY(a->z, p384_norm_mod, sizeof(p384_norm_mod));
  89992. }
  89993. #endif /* FP_ECC */
  89994. /* A table entry for pre-computed points. */
  89995. typedef struct sp_table_entry_384 {
  89996. sp_digit x[12];
  89997. sp_digit y[12];
  89998. } sp_table_entry_384;
  89999. #ifdef FP_ECC
  90000. #endif /* FP_ECC */
  90001. /* Add two Montgomery form projective points. The second point has a q value of
  90002. * one.
  90003. * Only the first point can be the same pointer as the result point.
  90004. *
  90005. * r Result of addition.
  90006. * p First point to add.
  90007. * q Second point to add.
  90008. * t Temporary ordinate data.
  90009. */
  90010. static void sp_384_proj_point_add_qz1_12(sp_point_384* r,
  90011. const sp_point_384* p, const sp_point_384* q, sp_digit* t)
  90012. {
  90013. sp_digit* t2 = t;
  90014. sp_digit* t3 = t + 2*12;
  90015. sp_digit* t6 = t + 4*12;
  90016. sp_digit* t1 = t + 6*12;
  90017. sp_digit* t4 = t + 8*12;
  90018. sp_digit* t5 = t + 10*12;
  90019. /* Calculate values to subtract from P->x and P->y. */
  90020. /* U2 = X2*Z1^2 */
  90021. sp_384_mont_sqr_12(t2, p->z, p384_mod, p384_mp_mod);
  90022. sp_384_mont_mul_12(t4, t2, p->z, p384_mod, p384_mp_mod);
  90023. sp_384_mont_mul_12(t2, t2, q->x, p384_mod, p384_mp_mod);
  90024. /* S2 = Y2*Z1^3 */
  90025. sp_384_mont_mul_12(t4, t4, q->y, p384_mod, p384_mp_mod);
  90026. if ((~p->infinity) & (~q->infinity) &
  90027. sp_384_cmp_equal_12(p->x, t2) &
  90028. sp_384_cmp_equal_12(p->y, t4)) {
  90029. sp_384_proj_point_dbl_12(r, p, t);
  90030. }
  90031. else {
  90032. sp_digit* x = t2;
  90033. sp_digit* y = t3;
  90034. sp_digit* z = t6;
  90035. /* H = U2 - X1 */
  90036. sp_384_mont_sub_12(t2, t2, p->x, p384_mod);
  90037. /* R = S2 - Y1 */
  90038. sp_384_mont_sub_12(t4, t4, p->y, p384_mod);
  90039. /* Z3 = H*Z1 */
  90040. sp_384_mont_mul_12(z, p->z, t2, p384_mod, p384_mp_mod);
  90041. /* X3 = R^2 - H^3 - 2*X1*H^2 */
  90042. sp_384_mont_sqr_12(t1, t2, p384_mod, p384_mp_mod);
  90043. sp_384_mont_mul_12(t3, p->x, t1, p384_mod, p384_mp_mod);
  90044. sp_384_mont_mul_12(t1, t1, t2, p384_mod, p384_mp_mod);
  90045. sp_384_mont_sqr_12(t2, t4, p384_mod, p384_mp_mod);
  90046. sp_384_mont_sub_12(t2, t2, t1, p384_mod);
  90047. sp_384_mont_dbl_12(t5, t3, p384_mod);
  90048. sp_384_mont_sub_12(x, t2, t5, p384_mod);
  90049. /* Y3 = R*(X1*H^2 - X3) - Y1*H^3 */
  90050. sp_384_mont_sub_12(t3, t3, x, p384_mod);
  90051. sp_384_mont_mul_12(t3, t3, t4, p384_mod, p384_mp_mod);
  90052. sp_384_mont_mul_12(t1, t1, p->y, p384_mod, p384_mp_mod);
  90053. sp_384_mont_sub_12(y, t3, t1, p384_mod);
  90054. {
  90055. int i;
  90056. sp_digit maskp = 0 - (q->infinity & (!p->infinity));
  90057. sp_digit maskq = 0 - (p->infinity & (!q->infinity));
  90058. sp_digit maskt = ~(maskp | maskq);
  90059. sp_digit inf = (sp_digit)(p->infinity & q->infinity);
  90060. for (i = 0; i < 12; i++) {
  90061. r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) |
  90062. (x[i] & maskt);
  90063. }
  90064. for (i = 0; i < 12; i++) {
  90065. r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) |
  90066. (y[i] & maskt);
  90067. }
  90068. for (i = 0; i < 12; i++) {
  90069. r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) |
  90070. (z[i] & maskt);
  90071. }
  90072. r->z[0] |= inf;
  90073. r->infinity = (word32)inf;
  90074. }
  90075. }
  90076. }
  90077. #ifdef WOLFSSL_SP_SMALL
  90078. #ifdef FP_ECC
  90079. /* Generate the pre-computed table of points for the base point.
  90080. *
  90081. * width = 4
  90082. * 16 entries
  90083. * 96 bits between
  90084. *
  90085. * a The base point.
  90086. * table Place to store generated point data.
  90087. * tmp Temporary data.
  90088. * heap Heap to use for allocation.
  90089. */
  90090. static int sp_384_gen_stripe_table_12(const sp_point_384* a,
  90091. sp_table_entry_384* table, sp_digit* tmp, void* heap)
  90092. {
  90093. #ifdef WOLFSSL_SP_SMALL_STACK
  90094. sp_point_384* t = NULL;
  90095. #else
  90096. sp_point_384 t[3];
  90097. #endif
  90098. sp_point_384* s1 = NULL;
  90099. sp_point_384* s2 = NULL;
  90100. int i;
  90101. int j;
  90102. int err = MP_OKAY;
  90103. (void)heap;
  90104. #ifdef WOLFSSL_SP_SMALL_STACK
  90105. t = (sp_point_384*)XMALLOC(sizeof(sp_point_384) * 3, heap,
  90106. DYNAMIC_TYPE_ECC);
  90107. if (t == NULL)
  90108. err = MEMORY_E;
  90109. #endif
  90110. if (err == MP_OKAY) {
  90111. s1 = t + 1;
  90112. s2 = t + 2;
  90113. err = sp_384_mod_mul_norm_12(t->x, a->x, p384_mod);
  90114. }
  90115. if (err == MP_OKAY) {
  90116. err = sp_384_mod_mul_norm_12(t->y, a->y, p384_mod);
  90117. }
  90118. if (err == MP_OKAY) {
  90119. err = sp_384_mod_mul_norm_12(t->z, a->z, p384_mod);
  90120. }
  90121. if (err == MP_OKAY) {
  90122. t->infinity = 0;
  90123. sp_384_proj_to_affine_12(t, tmp);
  90124. XMEMCPY(s1->z, p384_norm_mod, sizeof(p384_norm_mod));
  90125. s1->infinity = 0;
  90126. XMEMCPY(s2->z, p384_norm_mod, sizeof(p384_norm_mod));
  90127. s2->infinity = 0;
  90128. /* table[0] = {0, 0, infinity} */
  90129. XMEMSET(&table[0], 0, sizeof(sp_table_entry_384));
  90130. /* table[1] = Affine version of 'a' in Montgomery form */
  90131. XMEMCPY(table[1].x, t->x, sizeof(table->x));
  90132. XMEMCPY(table[1].y, t->y, sizeof(table->y));
  90133. for (i=1; i<4; i++) {
  90134. sp_384_proj_point_dbl_n_12(t, 96, tmp);
  90135. sp_384_proj_to_affine_12(t, tmp);
  90136. XMEMCPY(table[1<<i].x, t->x, sizeof(table->x));
  90137. XMEMCPY(table[1<<i].y, t->y, sizeof(table->y));
  90138. }
  90139. for (i=1; i<4; i++) {
  90140. XMEMCPY(s1->x, table[1<<i].x, sizeof(table->x));
  90141. XMEMCPY(s1->y, table[1<<i].y, sizeof(table->y));
  90142. for (j=(1<<i)+1; j<(1<<(i+1)); j++) {
  90143. XMEMCPY(s2->x, table[j-(1<<i)].x, sizeof(table->x));
  90144. XMEMCPY(s2->y, table[j-(1<<i)].y, sizeof(table->y));
  90145. sp_384_proj_point_add_qz1_12(t, s1, s2, tmp);
  90146. sp_384_proj_to_affine_12(t, tmp);
  90147. XMEMCPY(table[j].x, t->x, sizeof(table->x));
  90148. XMEMCPY(table[j].y, t->y, sizeof(table->y));
  90149. }
  90150. }
  90151. }
  90152. #ifdef WOLFSSL_SP_SMALL_STACK
  90153. if (t != NULL)
  90154. XFREE(t, heap, DYNAMIC_TYPE_ECC);
  90155. #endif
  90156. return err;
  90157. }
  90158. #endif /* FP_ECC */
  90159. #ifndef WC_NO_CACHE_RESISTANT
  90160. /* Touch each possible entry that could be being copied.
  90161. *
  90162. * r Point to copy into.
  90163. * table Table - start of the entries to access
  90164. * idx Index of entry to retrieve.
  90165. */
  90166. static void sp_384_get_entry_16_12(sp_point_384* r,
  90167. const sp_table_entry_384* table, int idx)
  90168. {
  90169. int i;
  90170. sp_digit mask;
  90171. r->x[0] = 0;
  90172. r->x[1] = 0;
  90173. r->x[2] = 0;
  90174. r->x[3] = 0;
  90175. r->x[4] = 0;
  90176. r->x[5] = 0;
  90177. r->x[6] = 0;
  90178. r->x[7] = 0;
  90179. r->x[8] = 0;
  90180. r->x[9] = 0;
  90181. r->x[10] = 0;
  90182. r->x[11] = 0;
  90183. r->y[0] = 0;
  90184. r->y[1] = 0;
  90185. r->y[2] = 0;
  90186. r->y[3] = 0;
  90187. r->y[4] = 0;
  90188. r->y[5] = 0;
  90189. r->y[6] = 0;
  90190. r->y[7] = 0;
  90191. r->y[8] = 0;
  90192. r->y[9] = 0;
  90193. r->y[10] = 0;
  90194. r->y[11] = 0;
  90195. for (i = 1; i < 16; i++) {
  90196. mask = 0 - (i == idx);
  90197. r->x[0] |= mask & table[i].x[0];
  90198. r->x[1] |= mask & table[i].x[1];
  90199. r->x[2] |= mask & table[i].x[2];
  90200. r->x[3] |= mask & table[i].x[3];
  90201. r->x[4] |= mask & table[i].x[4];
  90202. r->x[5] |= mask & table[i].x[5];
  90203. r->x[6] |= mask & table[i].x[6];
  90204. r->x[7] |= mask & table[i].x[7];
  90205. r->x[8] |= mask & table[i].x[8];
  90206. r->x[9] |= mask & table[i].x[9];
  90207. r->x[10] |= mask & table[i].x[10];
  90208. r->x[11] |= mask & table[i].x[11];
  90209. r->y[0] |= mask & table[i].y[0];
  90210. r->y[1] |= mask & table[i].y[1];
  90211. r->y[2] |= mask & table[i].y[2];
  90212. r->y[3] |= mask & table[i].y[3];
  90213. r->y[4] |= mask & table[i].y[4];
  90214. r->y[5] |= mask & table[i].y[5];
  90215. r->y[6] |= mask & table[i].y[6];
  90216. r->y[7] |= mask & table[i].y[7];
  90217. r->y[8] |= mask & table[i].y[8];
  90218. r->y[9] |= mask & table[i].y[9];
  90219. r->y[10] |= mask & table[i].y[10];
  90220. r->y[11] |= mask & table[i].y[11];
  90221. }
  90222. }
  90223. #endif /* !WC_NO_CACHE_RESISTANT */
  90224. /* Multiply the point by the scalar and return the result.
  90225. * If map is true then convert result to affine coordinates.
  90226. *
  90227. * Stripe implementation.
  90228. * Pre-generated: 2^0, 2^96, ...
  90229. * Pre-generated: products of all combinations of above.
  90230. * 4 doubles and adds (with qz=1)
  90231. *
  90232. * r Resulting point.
  90233. * k Scalar to multiply by.
  90234. * table Pre-computed table.
  90235. * map Indicates whether to convert result to affine.
  90236. * ct Constant time required.
  90237. * heap Heap to use for allocation.
  90238. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  90239. */
  90240. static int sp_384_ecc_mulmod_stripe_12(sp_point_384* r, const sp_point_384* g,
  90241. const sp_table_entry_384* table, const sp_digit* k, int map,
  90242. int ct, void* heap)
  90243. {
  90244. #ifdef WOLFSSL_SP_SMALL_STACK
  90245. sp_point_384* rt = NULL;
  90246. sp_digit* t = NULL;
  90247. #else
  90248. sp_point_384 rt[2];
  90249. sp_digit t[2 * 12 * 6];
  90250. #endif
  90251. sp_point_384* p = NULL;
  90252. int i;
  90253. int j;
  90254. int y;
  90255. int x;
  90256. int err = MP_OKAY;
  90257. (void)g;
  90258. /* Constant time used for cache attack resistance implementation. */
  90259. (void)ct;
  90260. (void)heap;
  90261. #ifdef WOLFSSL_SP_SMALL_STACK
  90262. rt = (sp_point_384*)XMALLOC(sizeof(sp_point_384) * 2, heap,
  90263. DYNAMIC_TYPE_ECC);
  90264. if (rt == NULL)
  90265. err = MEMORY_E;
  90266. if (err == MP_OKAY) {
  90267. t = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 12 * 6, heap,
  90268. DYNAMIC_TYPE_ECC);
  90269. if (t == NULL)
  90270. err = MEMORY_E;
  90271. }
  90272. #endif
  90273. if (err == MP_OKAY) {
  90274. p = rt + 1;
  90275. XMEMCPY(p->z, p384_norm_mod, sizeof(p384_norm_mod));
  90276. XMEMCPY(rt->z, p384_norm_mod, sizeof(p384_norm_mod));
  90277. y = 0;
  90278. x = 95;
  90279. for (j=0; j<4; j++) {
  90280. y |= (int)(((k[x / 32] >> (x % 32)) & 1) << j);
  90281. x += 96;
  90282. }
  90283. #ifndef WC_NO_CACHE_RESISTANT
  90284. if (ct) {
  90285. sp_384_get_entry_16_12(rt, table, y);
  90286. } else
  90287. #endif
  90288. {
  90289. XMEMCPY(rt->x, table[y].x, sizeof(table[y].x));
  90290. XMEMCPY(rt->y, table[y].y, sizeof(table[y].y));
  90291. }
  90292. rt->infinity = !y;
  90293. for (i=94; i>=0; i--) {
  90294. y = 0;
  90295. x = i;
  90296. for (j=0; j<4; j++) {
  90297. y |= (int)(((k[x / 32] >> (x % 32)) & 1) << j);
  90298. x += 96;
  90299. }
  90300. sp_384_proj_point_dbl_12(rt, rt, t);
  90301. #ifndef WC_NO_CACHE_RESISTANT
  90302. if (ct) {
  90303. sp_384_get_entry_16_12(p, table, y);
  90304. }
  90305. else
  90306. #endif
  90307. {
  90308. XMEMCPY(p->x, table[y].x, sizeof(table[y].x));
  90309. XMEMCPY(p->y, table[y].y, sizeof(table[y].y));
  90310. }
  90311. p->infinity = !y;
  90312. sp_384_proj_point_add_qz1_12(rt, rt, p, t);
  90313. }
  90314. if (map != 0) {
  90315. sp_384_map_12(r, rt, t);
  90316. }
  90317. else {
  90318. XMEMCPY(r, rt, sizeof(sp_point_384));
  90319. }
  90320. }
  90321. #ifdef WOLFSSL_SP_SMALL_STACK
  90322. if (t != NULL)
  90323. XFREE(t, heap, DYNAMIC_TYPE_ECC);
  90324. if (rt != NULL)
  90325. XFREE(rt, heap, DYNAMIC_TYPE_ECC);
  90326. #endif
  90327. return err;
  90328. }
  90329. #ifdef FP_ECC
  90330. #ifndef FP_ENTRIES
  90331. #define FP_ENTRIES 16
  90332. #endif
  90333. /* Cache entry - holds precomputation tables for a point. */
  90334. typedef struct sp_cache_384_t {
  90335. /* X ordinate of point that table was generated from. */
  90336. sp_digit x[12];
  90337. /* Y ordinate of point that table was generated from. */
  90338. sp_digit y[12];
  90339. /* Precomputation table for point. */
  90340. sp_table_entry_384 table[16];
  90341. /* Count of entries in table. */
  90342. uint32_t cnt;
  90343. /* Point and table set in entry. */
  90344. int set;
  90345. } sp_cache_384_t;
  90346. /* Cache of tables. */
  90347. static THREAD_LS_T sp_cache_384_t sp_cache_384[FP_ENTRIES];
  90348. /* Index of last entry in cache. */
  90349. static THREAD_LS_T int sp_cache_384_last = -1;
  90350. /* Cache has been initialized. */
  90351. static THREAD_LS_T int sp_cache_384_inited = 0;
  90352. #ifndef HAVE_THREAD_LS
  90353. static volatile int initCacheMutex_384 = 0;
  90354. static wolfSSL_Mutex sp_cache_384_lock;
  90355. #endif
  90356. /* Get the cache entry for the point.
  90357. *
  90358. * g [in] Point scalar multiplying.
  90359. * cache [out] Cache table to use.
  90360. */
  90361. static void sp_ecc_get_cache_384(const sp_point_384* g, sp_cache_384_t** cache)
  90362. {
  90363. int i;
  90364. int j;
  90365. uint32_t least;
  90366. if (sp_cache_384_inited == 0) {
  90367. for (i=0; i<FP_ENTRIES; i++) {
  90368. sp_cache_384[i].set = 0;
  90369. }
  90370. sp_cache_384_inited = 1;
  90371. }
  90372. /* Compare point with those in cache. */
  90373. for (i=0; i<FP_ENTRIES; i++) {
  90374. if (!sp_cache_384[i].set)
  90375. continue;
  90376. if (sp_384_cmp_equal_12(g->x, sp_cache_384[i].x) &
  90377. sp_384_cmp_equal_12(g->y, sp_cache_384[i].y)) {
  90378. sp_cache_384[i].cnt++;
  90379. break;
  90380. }
  90381. }
  90382. /* No match. */
  90383. if (i == FP_ENTRIES) {
  90384. /* Find empty entry. */
  90385. i = (sp_cache_384_last + 1) % FP_ENTRIES;
  90386. for (; i != sp_cache_384_last; i=(i+1)%FP_ENTRIES) {
  90387. if (!sp_cache_384[i].set) {
  90388. break;
  90389. }
  90390. }
  90391. /* Evict least used. */
  90392. if (i == sp_cache_384_last) {
  90393. least = sp_cache_384[0].cnt;
  90394. for (j=1; j<FP_ENTRIES; j++) {
  90395. if (sp_cache_384[j].cnt < least) {
  90396. i = j;
  90397. least = sp_cache_384[i].cnt;
  90398. }
  90399. }
  90400. }
  90401. XMEMCPY(sp_cache_384[i].x, g->x, sizeof(sp_cache_384[i].x));
  90402. XMEMCPY(sp_cache_384[i].y, g->y, sizeof(sp_cache_384[i].y));
  90403. sp_cache_384[i].set = 1;
  90404. sp_cache_384[i].cnt = 1;
  90405. }
  90406. *cache = &sp_cache_384[i];
  90407. sp_cache_384_last = i;
  90408. }
  90409. #endif /* FP_ECC */
  90410. /* Multiply the base point of P384 by the scalar and return the result.
  90411. * If map is true then convert result to affine coordinates.
  90412. *
  90413. * r Resulting point.
  90414. * g Point to multiply.
  90415. * k Scalar to multiply by.
  90416. * map Indicates whether to convert result to affine.
  90417. * ct Constant time required.
  90418. * heap Heap to use for allocation.
  90419. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  90420. */
  90421. static int sp_384_ecc_mulmod_12(sp_point_384* r, const sp_point_384* g,
  90422. const sp_digit* k, int map, int ct, void* heap)
  90423. {
  90424. #ifndef FP_ECC
  90425. return sp_384_ecc_mulmod_fast_12(r, g, k, map, ct, heap);
  90426. #else
  90427. #ifdef WOLFSSL_SP_SMALL_STACK
  90428. sp_digit* tmp;
  90429. #else
  90430. sp_digit tmp[2 * 12 * 7];
  90431. #endif
  90432. sp_cache_384_t* cache;
  90433. int err = MP_OKAY;
  90434. #ifdef WOLFSSL_SP_SMALL_STACK
  90435. tmp = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 12 * 7, heap, DYNAMIC_TYPE_ECC);
  90436. if (tmp == NULL) {
  90437. err = MEMORY_E;
  90438. }
  90439. #endif
  90440. #ifndef HAVE_THREAD_LS
  90441. if (err == MP_OKAY) {
  90442. if (initCacheMutex_384 == 0) {
  90443. wc_InitMutex(&sp_cache_384_lock);
  90444. initCacheMutex_384 = 1;
  90445. }
  90446. if (wc_LockMutex(&sp_cache_384_lock) != 0) {
  90447. err = BAD_MUTEX_E;
  90448. }
  90449. }
  90450. #endif /* HAVE_THREAD_LS */
  90451. if (err == MP_OKAY) {
  90452. sp_ecc_get_cache_384(g, &cache);
  90453. if (cache->cnt == 2)
  90454. sp_384_gen_stripe_table_12(g, cache->table, tmp, heap);
  90455. #ifndef HAVE_THREAD_LS
  90456. wc_UnLockMutex(&sp_cache_384_lock);
  90457. #endif /* HAVE_THREAD_LS */
  90458. if (cache->cnt < 2) {
  90459. err = sp_384_ecc_mulmod_fast_12(r, g, k, map, ct, heap);
  90460. }
  90461. else {
  90462. err = sp_384_ecc_mulmod_stripe_12(r, g, cache->table, k,
  90463. map, ct, heap);
  90464. }
  90465. }
  90466. #ifdef WOLFSSL_SP_SMALL_STACK
  90467. XFREE(tmp, heap, DYNAMIC_TYPE_ECC);
  90468. #endif
  90469. return err;
  90470. #endif
  90471. }
  90472. #else
  90473. #ifdef FP_ECC
  90474. /* Generate the pre-computed table of points for the base point.
  90475. *
  90476. * width = 8
  90477. * 256 entries
  90478. * 48 bits between
  90479. *
  90480. * a The base point.
  90481. * table Place to store generated point data.
  90482. * tmp Temporary data.
  90483. * heap Heap to use for allocation.
  90484. */
  90485. static int sp_384_gen_stripe_table_12(const sp_point_384* a,
  90486. sp_table_entry_384* table, sp_digit* tmp, void* heap)
  90487. {
  90488. #ifdef WOLFSSL_SP_SMALL_STACK
  90489. sp_point_384* t = NULL;
  90490. #else
  90491. sp_point_384 t[3];
  90492. #endif
  90493. sp_point_384* s1 = NULL;
  90494. sp_point_384* s2 = NULL;
  90495. int i;
  90496. int j;
  90497. int err = MP_OKAY;
  90498. (void)heap;
  90499. #ifdef WOLFSSL_SP_SMALL_STACK
  90500. t = (sp_point_384*)XMALLOC(sizeof(sp_point_384) * 3, heap,
  90501. DYNAMIC_TYPE_ECC);
  90502. if (t == NULL)
  90503. err = MEMORY_E;
  90504. #endif
  90505. if (err == MP_OKAY) {
  90506. s1 = t + 1;
  90507. s2 = t + 2;
  90508. err = sp_384_mod_mul_norm_12(t->x, a->x, p384_mod);
  90509. }
  90510. if (err == MP_OKAY) {
  90511. err = sp_384_mod_mul_norm_12(t->y, a->y, p384_mod);
  90512. }
  90513. if (err == MP_OKAY) {
  90514. err = sp_384_mod_mul_norm_12(t->z, a->z, p384_mod);
  90515. }
  90516. if (err == MP_OKAY) {
  90517. t->infinity = 0;
  90518. sp_384_proj_to_affine_12(t, tmp);
  90519. XMEMCPY(s1->z, p384_norm_mod, sizeof(p384_norm_mod));
  90520. s1->infinity = 0;
  90521. XMEMCPY(s2->z, p384_norm_mod, sizeof(p384_norm_mod));
  90522. s2->infinity = 0;
  90523. /* table[0] = {0, 0, infinity} */
  90524. XMEMSET(&table[0], 0, sizeof(sp_table_entry_384));
  90525. /* table[1] = Affine version of 'a' in Montgomery form */
  90526. XMEMCPY(table[1].x, t->x, sizeof(table->x));
  90527. XMEMCPY(table[1].y, t->y, sizeof(table->y));
  90528. for (i=1; i<8; i++) {
  90529. sp_384_proj_point_dbl_n_12(t, 48, tmp);
  90530. sp_384_proj_to_affine_12(t, tmp);
  90531. XMEMCPY(table[1<<i].x, t->x, sizeof(table->x));
  90532. XMEMCPY(table[1<<i].y, t->y, sizeof(table->y));
  90533. }
  90534. for (i=1; i<8; i++) {
  90535. XMEMCPY(s1->x, table[1<<i].x, sizeof(table->x));
  90536. XMEMCPY(s1->y, table[1<<i].y, sizeof(table->y));
  90537. for (j=(1<<i)+1; j<(1<<(i+1)); j++) {
  90538. XMEMCPY(s2->x, table[j-(1<<i)].x, sizeof(table->x));
  90539. XMEMCPY(s2->y, table[j-(1<<i)].y, sizeof(table->y));
  90540. sp_384_proj_point_add_qz1_12(t, s1, s2, tmp);
  90541. sp_384_proj_to_affine_12(t, tmp);
  90542. XMEMCPY(table[j].x, t->x, sizeof(table->x));
  90543. XMEMCPY(table[j].y, t->y, sizeof(table->y));
  90544. }
  90545. }
  90546. }
  90547. #ifdef WOLFSSL_SP_SMALL_STACK
  90548. if (t != NULL)
  90549. XFREE(t, heap, DYNAMIC_TYPE_ECC);
  90550. #endif
  90551. return err;
  90552. }
  90553. #endif /* FP_ECC */
  90554. #ifndef WC_NO_CACHE_RESISTANT
  90555. /* Touch each possible entry that could be being copied.
  90556. *
  90557. * r Point to copy into.
  90558. * table Table - start of the entries to access
  90559. * idx Index of entry to retrieve.
  90560. */
  90561. static void sp_384_get_entry_256_12(sp_point_384* r,
  90562. const sp_table_entry_384* table, int idx)
  90563. {
  90564. int i;
  90565. sp_digit mask;
  90566. r->x[0] = 0;
  90567. r->x[1] = 0;
  90568. r->x[2] = 0;
  90569. r->x[3] = 0;
  90570. r->x[4] = 0;
  90571. r->x[5] = 0;
  90572. r->x[6] = 0;
  90573. r->x[7] = 0;
  90574. r->x[8] = 0;
  90575. r->x[9] = 0;
  90576. r->x[10] = 0;
  90577. r->x[11] = 0;
  90578. r->y[0] = 0;
  90579. r->y[1] = 0;
  90580. r->y[2] = 0;
  90581. r->y[3] = 0;
  90582. r->y[4] = 0;
  90583. r->y[5] = 0;
  90584. r->y[6] = 0;
  90585. r->y[7] = 0;
  90586. r->y[8] = 0;
  90587. r->y[9] = 0;
  90588. r->y[10] = 0;
  90589. r->y[11] = 0;
  90590. for (i = 1; i < 256; i++) {
  90591. mask = 0 - (i == idx);
  90592. r->x[0] |= mask & table[i].x[0];
  90593. r->x[1] |= mask & table[i].x[1];
  90594. r->x[2] |= mask & table[i].x[2];
  90595. r->x[3] |= mask & table[i].x[3];
  90596. r->x[4] |= mask & table[i].x[4];
  90597. r->x[5] |= mask & table[i].x[5];
  90598. r->x[6] |= mask & table[i].x[6];
  90599. r->x[7] |= mask & table[i].x[7];
  90600. r->x[8] |= mask & table[i].x[8];
  90601. r->x[9] |= mask & table[i].x[9];
  90602. r->x[10] |= mask & table[i].x[10];
  90603. r->x[11] |= mask & table[i].x[11];
  90604. r->y[0] |= mask & table[i].y[0];
  90605. r->y[1] |= mask & table[i].y[1];
  90606. r->y[2] |= mask & table[i].y[2];
  90607. r->y[3] |= mask & table[i].y[3];
  90608. r->y[4] |= mask & table[i].y[4];
  90609. r->y[5] |= mask & table[i].y[5];
  90610. r->y[6] |= mask & table[i].y[6];
  90611. r->y[7] |= mask & table[i].y[7];
  90612. r->y[8] |= mask & table[i].y[8];
  90613. r->y[9] |= mask & table[i].y[9];
  90614. r->y[10] |= mask & table[i].y[10];
  90615. r->y[11] |= mask & table[i].y[11];
  90616. }
  90617. }
  90618. #endif /* !WC_NO_CACHE_RESISTANT */
  90619. /* Multiply the point by the scalar and return the result.
  90620. * If map is true then convert result to affine coordinates.
  90621. *
  90622. * Stripe implementation.
  90623. * Pre-generated: 2^0, 2^48, ...
  90624. * Pre-generated: products of all combinations of above.
  90625. * 8 doubles and adds (with qz=1)
  90626. *
  90627. * r Resulting point.
  90628. * k Scalar to multiply by.
  90629. * table Pre-computed table.
  90630. * map Indicates whether to convert result to affine.
  90631. * ct Constant time required.
  90632. * heap Heap to use for allocation.
  90633. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  90634. */
  90635. static int sp_384_ecc_mulmod_stripe_12(sp_point_384* r, const sp_point_384* g,
  90636. const sp_table_entry_384* table, const sp_digit* k, int map,
  90637. int ct, void* heap)
  90638. {
  90639. #ifdef WOLFSSL_SP_SMALL_STACK
  90640. sp_point_384* rt = NULL;
  90641. sp_digit* t = NULL;
  90642. #else
  90643. sp_point_384 rt[2];
  90644. sp_digit t[2 * 12 * 6];
  90645. #endif
  90646. sp_point_384* p = NULL;
  90647. int i;
  90648. int j;
  90649. int y;
  90650. int x;
  90651. int err = MP_OKAY;
  90652. (void)g;
  90653. /* Constant time used for cache attack resistance implementation. */
  90654. (void)ct;
  90655. (void)heap;
  90656. #ifdef WOLFSSL_SP_SMALL_STACK
  90657. rt = (sp_point_384*)XMALLOC(sizeof(sp_point_384) * 2, heap,
  90658. DYNAMIC_TYPE_ECC);
  90659. if (rt == NULL)
  90660. err = MEMORY_E;
  90661. if (err == MP_OKAY) {
  90662. t = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 12 * 6, heap,
  90663. DYNAMIC_TYPE_ECC);
  90664. if (t == NULL)
  90665. err = MEMORY_E;
  90666. }
  90667. #endif
  90668. if (err == MP_OKAY) {
  90669. p = rt + 1;
  90670. XMEMCPY(p->z, p384_norm_mod, sizeof(p384_norm_mod));
  90671. XMEMCPY(rt->z, p384_norm_mod, sizeof(p384_norm_mod));
  90672. y = 0;
  90673. x = 47;
  90674. for (j=0; j<8; j++) {
  90675. y |= (int)(((k[x / 32] >> (x % 32)) & 1) << j);
  90676. x += 48;
  90677. }
  90678. #ifndef WC_NO_CACHE_RESISTANT
  90679. if (ct) {
  90680. sp_384_get_entry_256_12(rt, table, y);
  90681. } else
  90682. #endif
  90683. {
  90684. XMEMCPY(rt->x, table[y].x, sizeof(table[y].x));
  90685. XMEMCPY(rt->y, table[y].y, sizeof(table[y].y));
  90686. }
  90687. rt->infinity = !y;
  90688. for (i=46; i>=0; i--) {
  90689. y = 0;
  90690. x = i;
  90691. for (j=0; j<8; j++) {
  90692. y |= (int)(((k[x / 32] >> (x % 32)) & 1) << j);
  90693. x += 48;
  90694. }
  90695. sp_384_proj_point_dbl_12(rt, rt, t);
  90696. #ifndef WC_NO_CACHE_RESISTANT
  90697. if (ct) {
  90698. sp_384_get_entry_256_12(p, table, y);
  90699. }
  90700. else
  90701. #endif
  90702. {
  90703. XMEMCPY(p->x, table[y].x, sizeof(table[y].x));
  90704. XMEMCPY(p->y, table[y].y, sizeof(table[y].y));
  90705. }
  90706. p->infinity = !y;
  90707. sp_384_proj_point_add_qz1_12(rt, rt, p, t);
  90708. }
  90709. if (map != 0) {
  90710. sp_384_map_12(r, rt, t);
  90711. }
  90712. else {
  90713. XMEMCPY(r, rt, sizeof(sp_point_384));
  90714. }
  90715. }
  90716. #ifdef WOLFSSL_SP_SMALL_STACK
  90717. if (t != NULL)
  90718. XFREE(t, heap, DYNAMIC_TYPE_ECC);
  90719. if (rt != NULL)
  90720. XFREE(rt, heap, DYNAMIC_TYPE_ECC);
  90721. #endif
  90722. return err;
  90723. }
  90724. #ifdef FP_ECC
  90725. #ifndef FP_ENTRIES
  90726. #define FP_ENTRIES 16
  90727. #endif
  90728. /* Cache entry - holds precomputation tables for a point. */
  90729. typedef struct sp_cache_384_t {
  90730. /* X ordinate of point that table was generated from. */
  90731. sp_digit x[12];
  90732. /* Y ordinate of point that table was generated from. */
  90733. sp_digit y[12];
  90734. /* Precomputation table for point. */
  90735. sp_table_entry_384 table[256];
  90736. /* Count of entries in table. */
  90737. uint32_t cnt;
  90738. /* Point and table set in entry. */
  90739. int set;
  90740. } sp_cache_384_t;
  90741. /* Cache of tables. */
  90742. static THREAD_LS_T sp_cache_384_t sp_cache_384[FP_ENTRIES];
  90743. /* Index of last entry in cache. */
  90744. static THREAD_LS_T int sp_cache_384_last = -1;
  90745. /* Cache has been initialized. */
  90746. static THREAD_LS_T int sp_cache_384_inited = 0;
  90747. #ifndef HAVE_THREAD_LS
  90748. static volatile int initCacheMutex_384 = 0;
  90749. static wolfSSL_Mutex sp_cache_384_lock;
  90750. #endif
  90751. /* Get the cache entry for the point.
  90752. *
  90753. * g [in] Point scalar multiplying.
  90754. * cache [out] Cache table to use.
  90755. */
  90756. static void sp_ecc_get_cache_384(const sp_point_384* g, sp_cache_384_t** cache)
  90757. {
  90758. int i;
  90759. int j;
  90760. uint32_t least;
  90761. if (sp_cache_384_inited == 0) {
  90762. for (i=0; i<FP_ENTRIES; i++) {
  90763. sp_cache_384[i].set = 0;
  90764. }
  90765. sp_cache_384_inited = 1;
  90766. }
  90767. /* Compare point with those in cache. */
  90768. for (i=0; i<FP_ENTRIES; i++) {
  90769. if (!sp_cache_384[i].set)
  90770. continue;
  90771. if (sp_384_cmp_equal_12(g->x, sp_cache_384[i].x) &
  90772. sp_384_cmp_equal_12(g->y, sp_cache_384[i].y)) {
  90773. sp_cache_384[i].cnt++;
  90774. break;
  90775. }
  90776. }
  90777. /* No match. */
  90778. if (i == FP_ENTRIES) {
  90779. /* Find empty entry. */
  90780. i = (sp_cache_384_last + 1) % FP_ENTRIES;
  90781. for (; i != sp_cache_384_last; i=(i+1)%FP_ENTRIES) {
  90782. if (!sp_cache_384[i].set) {
  90783. break;
  90784. }
  90785. }
  90786. /* Evict least used. */
  90787. if (i == sp_cache_384_last) {
  90788. least = sp_cache_384[0].cnt;
  90789. for (j=1; j<FP_ENTRIES; j++) {
  90790. if (sp_cache_384[j].cnt < least) {
  90791. i = j;
  90792. least = sp_cache_384[i].cnt;
  90793. }
  90794. }
  90795. }
  90796. XMEMCPY(sp_cache_384[i].x, g->x, sizeof(sp_cache_384[i].x));
  90797. XMEMCPY(sp_cache_384[i].y, g->y, sizeof(sp_cache_384[i].y));
  90798. sp_cache_384[i].set = 1;
  90799. sp_cache_384[i].cnt = 1;
  90800. }
  90801. *cache = &sp_cache_384[i];
  90802. sp_cache_384_last = i;
  90803. }
  90804. #endif /* FP_ECC */
  90805. /* Multiply the base point of P384 by the scalar and return the result.
  90806. * If map is true then convert result to affine coordinates.
  90807. *
  90808. * r Resulting point.
  90809. * g Point to multiply.
  90810. * k Scalar to multiply by.
  90811. * map Indicates whether to convert result to affine.
  90812. * ct Constant time required.
  90813. * heap Heap to use for allocation.
  90814. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  90815. */
  90816. static int sp_384_ecc_mulmod_12(sp_point_384* r, const sp_point_384* g,
  90817. const sp_digit* k, int map, int ct, void* heap)
  90818. {
  90819. #ifndef FP_ECC
  90820. return sp_384_ecc_mulmod_fast_12(r, g, k, map, ct, heap);
  90821. #else
  90822. #ifdef WOLFSSL_SP_SMALL_STACK
  90823. sp_digit* tmp;
  90824. #else
  90825. sp_digit tmp[2 * 12 * 7];
  90826. #endif
  90827. sp_cache_384_t* cache;
  90828. int err = MP_OKAY;
  90829. #ifdef WOLFSSL_SP_SMALL_STACK
  90830. tmp = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 12 * 7, heap, DYNAMIC_TYPE_ECC);
  90831. if (tmp == NULL) {
  90832. err = MEMORY_E;
  90833. }
  90834. #endif
  90835. #ifndef HAVE_THREAD_LS
  90836. if (err == MP_OKAY) {
  90837. if (initCacheMutex_384 == 0) {
  90838. wc_InitMutex(&sp_cache_384_lock);
  90839. initCacheMutex_384 = 1;
  90840. }
  90841. if (wc_LockMutex(&sp_cache_384_lock) != 0) {
  90842. err = BAD_MUTEX_E;
  90843. }
  90844. }
  90845. #endif /* HAVE_THREAD_LS */
  90846. if (err == MP_OKAY) {
  90847. sp_ecc_get_cache_384(g, &cache);
  90848. if (cache->cnt == 2)
  90849. sp_384_gen_stripe_table_12(g, cache->table, tmp, heap);
  90850. #ifndef HAVE_THREAD_LS
  90851. wc_UnLockMutex(&sp_cache_384_lock);
  90852. #endif /* HAVE_THREAD_LS */
  90853. if (cache->cnt < 2) {
  90854. err = sp_384_ecc_mulmod_fast_12(r, g, k, map, ct, heap);
  90855. }
  90856. else {
  90857. err = sp_384_ecc_mulmod_stripe_12(r, g, cache->table, k,
  90858. map, ct, heap);
  90859. }
  90860. }
  90861. #ifdef WOLFSSL_SP_SMALL_STACK
  90862. XFREE(tmp, heap, DYNAMIC_TYPE_ECC);
  90863. #endif
  90864. return err;
  90865. #endif
  90866. }
  90867. #endif /* WOLFSSL_SP_SMALL */
  90868. /* Multiply the point by the scalar and return the result.
  90869. * If map is true then convert result to affine coordinates.
  90870. *
  90871. * km Scalar to multiply by.
  90872. * p Point to multiply.
  90873. * r Resulting point.
  90874. * map Indicates whether to convert result to affine.
  90875. * heap Heap to use for allocation.
  90876. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  90877. */
  90878. int sp_ecc_mulmod_384(const mp_int* km, const ecc_point* gm, ecc_point* r,
  90879. int map, void* heap)
  90880. {
  90881. #ifdef WOLFSSL_SP_SMALL_STACK
  90882. sp_point_384* point = NULL;
  90883. sp_digit* k = NULL;
  90884. #else
  90885. sp_point_384 point[1];
  90886. sp_digit k[12];
  90887. #endif
  90888. int err = MP_OKAY;
  90889. #ifdef WOLFSSL_SP_SMALL_STACK
  90890. point = (sp_point_384*)XMALLOC(sizeof(sp_point_384), heap,
  90891. DYNAMIC_TYPE_ECC);
  90892. if (point == NULL)
  90893. err = MEMORY_E;
  90894. if (err == MP_OKAY) {
  90895. k = (sp_digit*)XMALLOC(sizeof(sp_digit) * 12, heap,
  90896. DYNAMIC_TYPE_ECC);
  90897. if (k == NULL)
  90898. err = MEMORY_E;
  90899. }
  90900. #endif
  90901. if (err == MP_OKAY) {
  90902. sp_384_from_mp(k, 12, km);
  90903. sp_384_point_from_ecc_point_12(point, gm);
  90904. err = sp_384_ecc_mulmod_12(point, point, k, map, 1, heap);
  90905. }
  90906. if (err == MP_OKAY) {
  90907. err = sp_384_point_to_ecc_point_12(point, r);
  90908. }
  90909. #ifdef WOLFSSL_SP_SMALL_STACK
  90910. if (k != NULL)
  90911. XFREE(k, heap, DYNAMIC_TYPE_ECC);
  90912. if (point != NULL)
  90913. XFREE(point, heap, DYNAMIC_TYPE_ECC);
  90914. #endif
  90915. return err;
  90916. }
  90917. /* Multiply the point by the scalar, add point a and return the result.
  90918. * If map is true then convert result to affine coordinates.
  90919. *
  90920. * km Scalar to multiply by.
  90921. * p Point to multiply.
  90922. * am Point to add to scalar multiply result.
  90923. * inMont Point to add is in montgomery form.
  90924. * r Resulting point.
  90925. * map Indicates whether to convert result to affine.
  90926. * heap Heap to use for allocation.
  90927. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  90928. */
  90929. int sp_ecc_mulmod_add_384(const mp_int* km, const ecc_point* gm,
  90930. const ecc_point* am, int inMont, ecc_point* r, int map, void* heap)
  90931. {
  90932. #ifdef WOLFSSL_SP_SMALL_STACK
  90933. sp_point_384* point = NULL;
  90934. sp_digit* k = NULL;
  90935. #else
  90936. sp_point_384 point[2];
  90937. sp_digit k[12 + 12 * 2 * 6];
  90938. #endif
  90939. sp_point_384* addP = NULL;
  90940. sp_digit* tmp = NULL;
  90941. int err = MP_OKAY;
  90942. #ifdef WOLFSSL_SP_SMALL_STACK
  90943. point = (sp_point_384*)XMALLOC(sizeof(sp_point_384) * 2, heap,
  90944. DYNAMIC_TYPE_ECC);
  90945. if (point == NULL)
  90946. err = MEMORY_E;
  90947. if (err == MP_OKAY) {
  90948. k = (sp_digit*)XMALLOC(
  90949. sizeof(sp_digit) * (12 + 12 * 2 * 6), heap,
  90950. DYNAMIC_TYPE_ECC);
  90951. if (k == NULL)
  90952. err = MEMORY_E;
  90953. }
  90954. #endif
  90955. if (err == MP_OKAY) {
  90956. addP = point + 1;
  90957. tmp = k + 12;
  90958. sp_384_from_mp(k, 12, km);
  90959. sp_384_point_from_ecc_point_12(point, gm);
  90960. sp_384_point_from_ecc_point_12(addP, am);
  90961. }
  90962. if ((err == MP_OKAY) && (!inMont)) {
  90963. err = sp_384_mod_mul_norm_12(addP->x, addP->x, p384_mod);
  90964. }
  90965. if ((err == MP_OKAY) && (!inMont)) {
  90966. err = sp_384_mod_mul_norm_12(addP->y, addP->y, p384_mod);
  90967. }
  90968. if ((err == MP_OKAY) && (!inMont)) {
  90969. err = sp_384_mod_mul_norm_12(addP->z, addP->z, p384_mod);
  90970. }
  90971. if (err == MP_OKAY) {
  90972. err = sp_384_ecc_mulmod_12(point, point, k, 0, 0, heap);
  90973. }
  90974. if (err == MP_OKAY) {
  90975. sp_384_proj_point_add_12(point, point, addP, tmp);
  90976. if (map) {
  90977. sp_384_map_12(point, point, tmp);
  90978. }
  90979. err = sp_384_point_to_ecc_point_12(point, r);
  90980. }
  90981. #ifdef WOLFSSL_SP_SMALL_STACK
  90982. if (k != NULL)
  90983. XFREE(k, heap, DYNAMIC_TYPE_ECC);
  90984. if (point != NULL)
  90985. XFREE(point, heap, DYNAMIC_TYPE_ECC);
  90986. #endif
  90987. return err;
  90988. }
  90989. #ifdef WOLFSSL_SP_SMALL
  90990. /* Striping precomputation table.
  90991. * 4 points combined into a table of 16 points.
  90992. * Distance of 96 between points.
  90993. */
  90994. static const sp_table_entry_384 p384_table[16] = {
  90995. /* 0 */
  90996. { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
  90997. { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },
  90998. /* 1 */
  90999. { { 0x49c0b528,0x3dd07566,0xa0d6ce38,0x20e378e2,0x541b4d6e,0x879c3afc,
  91000. 0x59a30eff,0x64548684,0x614ede2b,0x812ff723,0x299e1513,0x4d3aadc2 },
  91001. { 0x4b03a4fe,0x23043dad,0x7bb4a9ac,0xa1bfa8bf,0x2e83b050,0x8bade756,
  91002. 0x68f4ffd9,0xc6c35219,0x3969a840,0xdd800226,0x5a15c5e9,0x2b78abc2 } },
  91003. /* 2 */
  91004. { { 0xf26feef9,0x24480c57,0x3a0e1240,0xc31a2694,0x273e2bc7,0x735002c3,
  91005. 0x3ef1ed4c,0x8c42e9c5,0x7f4948e8,0x028babf6,0x8a978632,0x6a502f43 },
  91006. { 0xb74536fe,0xf5f13a46,0xd8a9f0eb,0x1d218bab,0x37232768,0x30f36bcc,
  91007. 0x576e8c18,0xc5317b31,0x9bbcb766,0xef1d57a6,0xb3e3d4dc,0x917c4930 } },
  91008. /* 3 */
  91009. { { 0xe349ddd0,0x11426e2e,0x9b2fc250,0x9f117ef9,0xec0174a6,0xff36b480,
  91010. 0x18458466,0x4f4bde76,0x05806049,0x2f2edb6d,0x19dfca92,0x8adc75d1 },
  91011. { 0xb7d5a7ce,0xa619d097,0xa34411e9,0x874275e5,0x0da4b4ef,0x5403e047,
  91012. 0x77901d8f,0x2ebaafd9,0xa747170f,0x5e63ebce,0x7f9d8036,0x12a36944 } },
  91013. /* 4 */
  91014. { { 0x2f9fbe67,0x378205de,0x7f728e44,0xc4afcb83,0x682e00f1,0xdbcec06c,
  91015. 0x114d5423,0xf2a145c3,0x7a52463e,0xa01d9874,0x7d717b0a,0xfc0935b1 },
  91016. { 0xd4d01f95,0x9653bc4f,0x9560ad34,0x9aa83ea8,0xaf8e3f3f,0xf77943dc,
  91017. 0xe86fe16e,0x70774a10,0xbf9ffdcf,0x6b62e6f1,0x588745c9,0x8a72f39e } },
  91018. /* 5 */
  91019. { { 0x2341c342,0x73ade4da,0xea704422,0xdd326e54,0x3741cef3,0x336c7d98,
  91020. 0x59e61549,0x1eafa00d,0xbd9a3efd,0xcd3ed892,0xc5c6c7e4,0x03faf26c },
  91021. { 0x3045f8ac,0x087e2fcf,0x174f1e73,0x14a65532,0xfe0af9a7,0x2cf84f28,
  91022. 0x2cdc935b,0xddfd7a84,0x6929c895,0x4c0f117b,0x4c8bcfcc,0x356572d6 } },
  91023. /* 6 */
  91024. { { 0x3f3b236f,0xfab08607,0x81e221da,0x19e9d41d,0x3927b428,0xf3f6571e,
  91025. 0x7550f1f6,0x4348a933,0xa85e62f0,0x7167b996,0x7f5452bf,0x62d43759 },
  91026. { 0xf2955926,0xd85feb9e,0x6df78353,0x440a561f,0x9ca36b59,0x389668ec,
  91027. 0xa22da016,0x052bf1a1,0xf6093254,0xbdfbff72,0xe22209f3,0x94e50f28 } },
  91028. /* 7 */
  91029. { { 0x3062e8af,0x90b2e5b3,0xe8a3d369,0xa8572375,0x201db7b1,0x3fe1b00b,
  91030. 0xee651aa2,0xe926def0,0xb9b10ad7,0x6542c9be,0xa2fcbe74,0x098e309b },
  91031. { 0xfff1d63f,0x779deeb3,0x20bfd374,0x23d0e80a,0x8768f797,0x8452bb3b,
  91032. 0x1f952856,0xcf75bb4d,0x29ea3faa,0x8fe6b400,0x81373a53,0x12bd3e40 } },
  91033. /* 8 */
  91034. { { 0x16973cf4,0x070d34e1,0x7e4f34f7,0x20aee08b,0x5eb8ad29,0x269af9b9,
  91035. 0xa6a45dda,0xdde0a036,0x63df41e0,0xa18b528e,0xa260df2a,0x03cc71b2 },
  91036. { 0xa06b1dd7,0x24a6770a,0x9d2675d3,0x5bfa9c11,0x96844432,0x73c1e2a1,
  91037. 0x131a6cf0,0x3660558d,0x2ee79454,0xb0289c83,0xc6d8ddcd,0xa6aefb01 } },
  91038. /* 9 */
  91039. { { 0x01ab5245,0xba1464b4,0xc48d93ff,0x9b8d0b6d,0x93ad272c,0x939867dc,
  91040. 0xae9fdc77,0xbebe085e,0x894ea8bd,0x73ae5103,0x39ac22e1,0x740fc89a },
  91041. { 0x28e23b23,0x5e28b0a3,0xe13104d0,0x2352722e,0xb0a2640d,0xf4667a18,
  91042. 0x49bb37c3,0xac74a72e,0xe81e183a,0x79f734f0,0x3fd9c0eb,0xbffe5b6c } },
  91043. /* 10 */
  91044. { { 0x00623f3b,0x03cf2922,0x5f29ebff,0x095c7111,0x80aa6823,0x42d72247,
  91045. 0x7458c0b0,0x044c7ba1,0x0959ec20,0xca62f7ef,0xf8ca929f,0x40ae2ab7 },
  91046. { 0xa927b102,0xb8c5377a,0xdc031771,0x398a86a0,0xc216a406,0x04908f9d,
  91047. 0x918d3300,0xb423a73a,0xe0b94739,0x634b0ff1,0x2d69f697,0xe29de725 } },
  91048. /* 11 */
  91049. { { 0x8435af04,0x744d1400,0xfec192da,0x5f255b1d,0x336dc542,0x1f17dc12,
  91050. 0x636a68a8,0x5c90c2a7,0x7704ca1e,0x960c9eb7,0x6fb3d65a,0x9de8cf1e },
  91051. { 0x511d3d06,0xc60fee0d,0xf9eb52c7,0x466e2313,0x206b0914,0x743c0f5f,
  91052. 0x2191aa4d,0x42f55bac,0xffebdbc2,0xcefc7c8f,0xe6e8ed1c,0xd4fa6081 } },
  91053. /* 12 */
  91054. { { 0x98683186,0x867db639,0xddcc4ea9,0xfb5cf424,0xd4f0e7bd,0xcc9a7ffe,
  91055. 0x7a779f7e,0x7c57f71c,0xd6b25ef2,0x90774079,0xb4081680,0x90eae903 },
  91056. { 0x0ee1fceb,0xdf2aae5e,0xe86c1a1f,0x3ff1da24,0xca193edf,0x80f587d6,
  91057. 0xdc9b9d6a,0xa5695523,0x85920303,0x7b840900,0xba6dbdef,0x1efa4dfc } },
  91058. /* 13 */
  91059. { { 0xe0540015,0xfbd838f9,0xc39077dc,0x2c323946,0xad619124,0x8b1fb9e6,
  91060. 0x0ca62ea8,0x9612440c,0x2dbe00ff,0x9ad9b52c,0xae197643,0xf52abaa1 },
  91061. { 0x2cac32ad,0xd0e89894,0x62a98f91,0xdfb79e42,0x276f55cb,0x65452ecf,
  91062. 0x7ad23e12,0xdb1ac0d2,0xde4986f0,0xf68c5f6a,0x82ce327d,0x389ac37b } },
  91063. /* 14 */
  91064. { { 0xb8a9e8c9,0xcd96866d,0x5bb8091e,0xa11963b8,0x045b3cd2,0xc7f90d53,
  91065. 0x80f36504,0x755a72b5,0x21d3751c,0x46f8b399,0x53c193de,0x4bffdc91 },
  91066. { 0xb89554e7,0xcd15c049,0xf7a26be6,0x353c6754,0xbd41d970,0x79602370,
  91067. 0x12b176c0,0xde16470b,0x40c8809d,0x56ba1175,0xe435fb1e,0xe2db35c3 } },
  91068. /* 15 */
  91069. { { 0x6328e33f,0xd71e4aab,0xaf8136d1,0x5486782b,0x86d57231,0x07a4995f,
  91070. 0x1651a968,0xf1f0a5bd,0x76803b6d,0xa5dc5b24,0x42dda935,0x5c587cbc },
  91071. { 0xbae8b4c0,0x2b6cdb32,0xb1331138,0x66d1598b,0x5d7e9614,0x4a23b2d2,
  91072. 0x74a8c05d,0x93e402a6,0xda7ce82e,0x45ac94e6,0xe463d465,0xeb9f8281 } },
  91073. };
  91074. /* Multiply the base point of P384 by the scalar and return the result.
  91075. * If map is true then convert result to affine coordinates.
  91076. *
  91077. * Stripe implementation.
  91078. * Pre-generated: 2^0, 2^96, ...
  91079. * Pre-generated: products of all combinations of above.
  91080. * 4 doubles and adds (with qz=1)
  91081. *
  91082. * r Resulting point.
  91083. * k Scalar to multiply by.
  91084. * map Indicates whether to convert result to affine.
  91085. * ct Constant time required.
  91086. * heap Heap to use for allocation.
  91087. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  91088. */
  91089. static int sp_384_ecc_mulmod_base_12(sp_point_384* r, const sp_digit* k,
  91090. int map, int ct, void* heap)
  91091. {
  91092. return sp_384_ecc_mulmod_stripe_12(r, &p384_base, p384_table,
  91093. k, map, ct, heap);
  91094. }
  91095. #else
  91096. /* Striping precomputation table.
  91097. * 8 points combined into a table of 256 points.
  91098. * Distance of 48 between points.
  91099. */
  91100. static const sp_table_entry_384 p384_table[256] = {
  91101. /* 0 */
  91102. { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
  91103. { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },
  91104. /* 1 */
  91105. { { 0x49c0b528,0x3dd07566,0xa0d6ce38,0x20e378e2,0x541b4d6e,0x879c3afc,
  91106. 0x59a30eff,0x64548684,0x614ede2b,0x812ff723,0x299e1513,0x4d3aadc2 },
  91107. { 0x4b03a4fe,0x23043dad,0x7bb4a9ac,0xa1bfa8bf,0x2e83b050,0x8bade756,
  91108. 0x68f4ffd9,0xc6c35219,0x3969a840,0xdd800226,0x5a15c5e9,0x2b78abc2 } },
  91109. /* 2 */
  91110. { { 0x2b0c535b,0x29864753,0x70506296,0x90dd6953,0x216ab9ac,0x038cd6b4,
  91111. 0xbe12d76a,0x3df9b7b7,0x5f347bdb,0x13f4d978,0x13e94489,0x222c5c9c },
  91112. { 0x2680dc64,0x5f8e796f,0x58352417,0x120e7cb7,0xd10740b8,0x254b5d8a,
  91113. 0x5337dee6,0xc38b8efb,0x94f02247,0xf688c2e1,0x6c25bc4c,0x7b5c75f3 } },
  91114. /* 3 */
  91115. { { 0x9edffea5,0xe26a3cc3,0x37d7e9fc,0x35bbfd1c,0x9bde3ef6,0xf0e7700d,
  91116. 0x1a538f5a,0x0380eb47,0x05bf9eb3,0x2e9da8bb,0x1a460c3e,0xdbb93c73 },
  91117. { 0xf526b605,0x37dba260,0xfd785537,0x95d4978e,0xed72a04a,0x24ed793a,
  91118. 0x76005b1a,0x26948377,0x9e681f82,0x99f557b9,0xd64954ef,0xae5f9557 } },
  91119. /* 4 */
  91120. { { 0xf26feef9,0x24480c57,0x3a0e1240,0xc31a2694,0x273e2bc7,0x735002c3,
  91121. 0x3ef1ed4c,0x8c42e9c5,0x7f4948e8,0x028babf6,0x8a978632,0x6a502f43 },
  91122. { 0xb74536fe,0xf5f13a46,0xd8a9f0eb,0x1d218bab,0x37232768,0x30f36bcc,
  91123. 0x576e8c18,0xc5317b31,0x9bbcb766,0xef1d57a6,0xb3e3d4dc,0x917c4930 } },
  91124. /* 5 */
  91125. { { 0xe349ddd0,0x11426e2e,0x9b2fc250,0x9f117ef9,0xec0174a6,0xff36b480,
  91126. 0x18458466,0x4f4bde76,0x05806049,0x2f2edb6d,0x19dfca92,0x8adc75d1 },
  91127. { 0xb7d5a7ce,0xa619d097,0xa34411e9,0x874275e5,0x0da4b4ef,0x5403e047,
  91128. 0x77901d8f,0x2ebaafd9,0xa747170f,0x5e63ebce,0x7f9d8036,0x12a36944 } },
  91129. /* 6 */
  91130. { { 0x4fc52870,0x28f9c07a,0x1a53a961,0xce0b3748,0x0e1828d9,0xd550fa18,
  91131. 0x6adb225a,0xa24abaf7,0x6e58a348,0xd11ed0a5,0x948acb62,0xf3d811e6 },
  91132. { 0x4c61ed22,0x8618dd77,0x80b47c9d,0x0bb747f9,0xde6b8559,0x22bf796f,
  91133. 0x680a21e9,0xfdfd1c6d,0x2af2c9dd,0xc0db1577,0xc1e90f3d,0xa09379e6 } },
  91134. /* 7 */
  91135. { { 0xe085c629,0x386c66ef,0x095bc89a,0x5fc2a461,0x203f4b41,0x1353d631,
  91136. 0x7e4bd8f5,0x7ca1972b,0xa7df8ce9,0xb077380a,0xee7e4ea3,0xd8a90389 },
  91137. { 0xe7b14461,0x1bc74dc7,0x0c9c4f78,0xdc2cb014,0x84ef0a10,0x52b4b3a6,
  91138. 0x20327fe2,0xbde6ea5d,0x660f9615,0xb71ec435,0xb8ad8173,0xeede5a04 } },
  91139. /* 8 */
  91140. { { 0x893b9a2d,0x5584cbb3,0x00850c5d,0x820c660b,0x7df2d43d,0x4126d826,
  91141. 0x0109e801,0xdd5bbbf0,0x38172f1c,0x85b92ee3,0xf31430d9,0x609d4f93 },
  91142. { 0xeadaf9d6,0x1e059a07,0x0f125fb0,0x70e6536c,0x560f20e7,0xd6220751,
  91143. 0x7aaf3a9a,0xa59489ae,0x64bae14e,0x7b70e2f6,0x76d08249,0x0dd03701 } },
  91144. /* 9 */
  91145. { { 0x8510521f,0x4cc13be8,0xf724cc17,0x87315ba9,0x353dc263,0xb49d83bb,
  91146. 0x0c279257,0x8b677efe,0xc93c9537,0x510a1c1c,0xa4702c99,0x33e30cd8 },
  91147. { 0x2208353f,0xf0ffc89d,0xced42b2b,0x0170fa8d,0x26e2a5f5,0x090851ed,
  91148. 0xecb52c96,0x81276455,0x7fe1adf4,0x0646c4e1,0xb0868eab,0x513f047e } },
  91149. /* 10 */
  91150. { { 0xdf5bdf53,0xc07611f4,0x58b11a6d,0x45d331a7,0x1c4ee394,0x58965daf,
  91151. 0x5a5878d1,0xba8bebe7,0x82dd3025,0xaecc0a18,0xa923eb8b,0xcf2a3899 },
  91152. { 0xd24fd048,0xf98c9281,0x8bbb025d,0x841bfb59,0xc9ab9d53,0xb8ddf8ce,
  91153. 0x7fef044e,0x538a4cb6,0x23236662,0x092ac21f,0x0b66f065,0xa919d385 } },
  91154. /* 11 */
  91155. { { 0x85d480d8,0x3db03b40,0x1b287a7d,0x8cd9f479,0x4a8f3bae,0x8f24dc75,
  91156. 0x3db41892,0x482eb800,0x9c56e0f5,0x38bf9eb3,0x9a91dc6f,0x8b977320 },
  91157. { 0x7209cfc2,0xa31b05b2,0x05b2db70,0x4c49bf85,0xd619527b,0x56462498,
  91158. 0x1fac51ba,0x3fe51039,0xab4b8342,0xfb04f55e,0x04c6eabf,0xc07c10dc } },
  91159. /* 12 */
  91160. { { 0xdb32f048,0xad22fe4c,0x475ed6df,0x5f23bf91,0xaa66b6cb,0xa50ce0c0,
  91161. 0xf03405c0,0xdf627a89,0xf95e2d6a,0x3674837d,0xba42e64e,0x081c95b6 },
  91162. { 0xe71d6ceb,0xeba3e036,0x6c6b0271,0xb45bcccf,0x0684701d,0x67b47e63,
  91163. 0xe712523f,0x60f8f942,0x5cd47adc,0x82423472,0x87649cbb,0x83027d79 } },
  91164. /* 13 */
  91165. { { 0x3615b0b8,0xb3929ea6,0xa54dac41,0xb41441fd,0xb5b6a368,0x8995d556,
  91166. 0x167ef05e,0xa80d4529,0x6d25a27f,0xf6bcb4a1,0x7bd55b68,0x210d6a4c },
  91167. { 0x25351130,0xf3804abb,0x903e37eb,0x1d2df699,0x084c25c8,0x5f201efc,
  91168. 0xa1c68e91,0x31a28c87,0x563f62a5,0x81dad253,0xd6c415d4,0x5dd6de70 } },
  91169. /* 14 */
  91170. { { 0x846612ce,0x29f470fd,0xda18d997,0x986f3eec,0x2f34af86,0x6b84c161,
  91171. 0x46ddaf8b,0x5ef0a408,0xe49e795f,0x14405a00,0xaa2f7a37,0x5f491b16 },
  91172. { 0xdb41b38d,0xc7f07ae4,0x18fbfcaa,0xef7d119e,0x14443b19,0x3a18e076,
  91173. 0x79a19926,0x4356841a,0xe2226fbe,0x91f4a91c,0x3cc88721,0xdc77248c } },
  91174. /* 15 */
  91175. { { 0xe4b1ec9d,0xd570ff1a,0xe7eef706,0x21d23e0e,0xca19e086,0x3cde40f4,
  91176. 0xcd4bb270,0x7d6523c4,0xbf13aa6c,0x16c1f06c,0xd14c4b60,0x5aa7245a },
  91177. { 0x44b74de8,0x37f81467,0x620a934e,0x839e7a17,0xde8b1aa1,0xf74d14e8,
  91178. 0xf30d75e2,0x8789fa51,0xc81c261e,0x09b24052,0x33c565ee,0x654e2678 } },
  91179. /* 16 */
  91180. { { 0x2f9fbe67,0x378205de,0x7f728e44,0xc4afcb83,0x682e00f1,0xdbcec06c,
  91181. 0x114d5423,0xf2a145c3,0x7a52463e,0xa01d9874,0x7d717b0a,0xfc0935b1 },
  91182. { 0xd4d01f95,0x9653bc4f,0x9560ad34,0x9aa83ea8,0xaf8e3f3f,0xf77943dc,
  91183. 0xe86fe16e,0x70774a10,0xbf9ffdcf,0x6b62e6f1,0x588745c9,0x8a72f39e } },
  91184. /* 17 */
  91185. { { 0x2341c342,0x73ade4da,0xea704422,0xdd326e54,0x3741cef3,0x336c7d98,
  91186. 0x59e61549,0x1eafa00d,0xbd9a3efd,0xcd3ed892,0xc5c6c7e4,0x03faf26c },
  91187. { 0x3045f8ac,0x087e2fcf,0x174f1e73,0x14a65532,0xfe0af9a7,0x2cf84f28,
  91188. 0x2cdc935b,0xddfd7a84,0x6929c895,0x4c0f117b,0x4c8bcfcc,0x356572d6 } },
  91189. /* 18 */
  91190. { { 0x7d8c1bba,0x7ecbac01,0x90b0f3d5,0x6058f9c3,0xf6197d0f,0xaee116e3,
  91191. 0x4033b128,0xc4dd7068,0xc209b983,0xf084dba6,0x831dbc4a,0x97c7c2cf },
  91192. { 0xf96010e8,0x2f4e61dd,0x529faa17,0xd97e4e20,0x69d37f20,0x4ee66660,
  91193. 0x3d366d72,0xccc139ed,0x13488e0f,0x690b6ee2,0xf3a6d533,0x7cad1dc5 } },
  91194. /* 19 */
  91195. { { 0xda57a41f,0x660a9a81,0xec0039b6,0xe74a0412,0x5e1dad15,0x42343c6b,
  91196. 0x46681d4c,0x284f3ff5,0x63749e89,0xb51087f1,0x6f9f2f13,0x070f23cc },
  91197. { 0x5d186e14,0x542211da,0xfddb0dff,0x84748f37,0xdb1f4180,0x41a3aab4,
  91198. 0xa6402d0e,0x25ed667b,0x02f58355,0x2f2924a9,0xfa44a689,0x5844ee7c } },
  91199. /* 20 */
  91200. { { 0x3f3b236f,0xfab08607,0x81e221da,0x19e9d41d,0x3927b428,0xf3f6571e,
  91201. 0x7550f1f6,0x4348a933,0xa85e62f0,0x7167b996,0x7f5452bf,0x62d43759 },
  91202. { 0xf2955926,0xd85feb9e,0x6df78353,0x440a561f,0x9ca36b59,0x389668ec,
  91203. 0xa22da016,0x052bf1a1,0xf6093254,0xbdfbff72,0xe22209f3,0x94e50f28 } },
  91204. /* 21 */
  91205. { { 0x3062e8af,0x90b2e5b3,0xe8a3d369,0xa8572375,0x201db7b1,0x3fe1b00b,
  91206. 0xee651aa2,0xe926def0,0xb9b10ad7,0x6542c9be,0xa2fcbe74,0x098e309b },
  91207. { 0xfff1d63f,0x779deeb3,0x20bfd374,0x23d0e80a,0x8768f797,0x8452bb3b,
  91208. 0x1f952856,0xcf75bb4d,0x29ea3faa,0x8fe6b400,0x81373a53,0x12bd3e40 } },
  91209. /* 22 */
  91210. { { 0x104cbba5,0xc023780d,0xfa35dd4c,0x6207e747,0x1ca9b6a3,0x35c23928,
  91211. 0x97987b10,0x4ff19be8,0x8022eee8,0xb8476bbf,0xd3bbe74d,0xaa0a4a14 },
  91212. { 0x187d4543,0x20f94331,0x79f6e066,0x32153870,0xac7e82e1,0x83b0f74e,
  91213. 0x828f06ab,0xa7748ba2,0xc26ef35f,0xc5f0298a,0x8e9a7dbd,0x0f0c5070 } },
  91214. /* 23 */
  91215. { { 0xdef029dd,0x0c5c244c,0x850661b8,0x3dabc687,0xfe11d981,0x9992b865,
  91216. 0x6274dbad,0xe9801b8f,0x098da242,0xe54e6319,0x91a53d08,0x9929a91a },
  91217. { 0x35285887,0x37bffd72,0xf1418102,0xbc759425,0xfd2e6e20,0x9280cc35,
  91218. 0xfbc42ee5,0x735c600c,0x8837619a,0xb7ad2864,0xa778c57b,0xa3627231 } },
  91219. /* 24 */
  91220. { { 0x91361ed8,0xae799b5c,0x6c63366c,0x47d71b75,0x1b265a6a,0x54cdd521,
  91221. 0x98d77b74,0xe0215a59,0xbab29db0,0x4424d9b7,0x7fd9e536,0x8b0ffacc },
  91222. { 0x37b5d9ef,0x46d85d12,0xbfa91747,0x5b106d62,0x5f99ba2d,0xed0479f8,
  91223. 0x1d104de4,0x0e6f3923,0x25e8983f,0x83a84c84,0xf8105a70,0xa9507e0a } },
  91224. /* 25 */
  91225. { { 0x14cf381c,0xf6c68a6e,0xc22e31cc,0xaf9d27bd,0xaa8a5ccb,0x23568d4d,
  91226. 0xe338e4d2,0xe431eec0,0x8f52ad1f,0xf1a828fe,0xe86acd80,0xdb6a0579 },
  91227. { 0x4507832a,0x2885672e,0x887e5289,0x73fc275f,0x05610d08,0x65f80278,
  91228. 0x075ff5b0,0x8d9b4554,0x09f712b5,0x3a8e8fb1,0x2ebe9cf2,0x39f0ac86 } },
  91229. /* 26 */
  91230. { { 0x4c52edf5,0xd8fabf78,0xa589ae53,0xdcd737e5,0xd791ab17,0x94918bf0,
  91231. 0xbcff06c9,0xb5fbd956,0xdca46d45,0xf6d3032e,0x41a3e486,0x2cdff7e1 },
  91232. { 0x61f47ec8,0x6674b3ba,0xeef84608,0x8a882163,0x4c687f90,0xa257c705,
  91233. 0xf6cdf227,0xe30cb2ed,0x7f6ea846,0x2c4c64ca,0xcc6bcd3c,0x186fa17c } },
  91234. /* 27 */
  91235. { { 0x1dfcb91e,0x48a3f536,0x646d358a,0x83595e13,0x91128798,0xbd15827b,
  91236. 0x2187757a,0x3ce612b8,0x61bd7372,0x873150a1,0xb662f568,0xf4684530 },
  91237. { 0x401896f6,0x8833950b,0x77f3e090,0xe11cb89a,0x48e7f4a5,0xb2f12cac,
  91238. 0xf606677e,0x313dd769,0x16579f93,0xfdcf08b3,0x46b8f22b,0x6429cec9 } },
  91239. /* 28 */
  91240. { { 0xbb75f9a4,0x4984dd54,0x29d3b570,0x4aef06b9,0x3d6e4c1e,0xb5f84ca2,
  91241. 0xb083ef35,0x24c61c11,0x392ca9ff,0xce4a7392,0x6730a800,0x865d6517 },
  91242. { 0x722b4a2b,0xca3dfe76,0x7b083e0e,0x12c04bf9,0x1b86b8a5,0x803ce5b5,
  91243. 0x6a7e3e0c,0x3fc7632d,0xc81adbe4,0xc89970c2,0x120e16b1,0x3cbcd3ad } },
  91244. /* 29 */
  91245. { { 0xec30ce93,0xfbfb4cc7,0xb72720a2,0x10ed6c7d,0x47b55500,0xec675bf7,
  91246. 0x333ff7c3,0x90725903,0x5075bfc0,0xc7c3973e,0x07acf31b,0xb049ecb0 },
  91247. { 0x4f58839c,0xb4076eaf,0xa2b05e4f,0x101896da,0xab40c66e,0x3f6033b0,
  91248. 0xc8d864ba,0x19ee9eeb,0x47bf6d2a,0xeb6cf155,0xf826477d,0x8e5a9663 } },
  91249. /* 30 */
  91250. { { 0xf7fbd5e1,0x69e62fdd,0x76912b1d,0x38ecfe54,0xd1da3bfb,0x845a3d56,
  91251. 0x1c86f0d4,0x0494950e,0x3bc36ce8,0x83cadbf9,0x4fccc8d1,0x41fce572 },
  91252. { 0x8332c144,0x05f939c2,0x0871e46e,0xb17f248b,0x66e8aff6,0x3d8534e2,
  91253. 0x3b85c629,0x1d06f1dc,0xa3131b73,0xdb06a32e,0x8b3f64e5,0xf295184d } },
  91254. /* 31 */
  91255. { { 0x36ddc103,0xd9653ff7,0x95ef606f,0x25f43e37,0xfe06dce8,0x09e301fc,
  91256. 0x30b6eebf,0x85af2341,0x0ff56b20,0x79b12b53,0xfe9a3c6b,0x9b4fb499 },
  91257. { 0x51d27ac2,0x0154f892,0x56ca5389,0xd33167e3,0xafc065a6,0x7828ec1f,
  91258. 0x7f746c9b,0x0959a258,0x0c44f837,0xb18f1be3,0xc4132fdb,0xa7946117 } },
  91259. /* 32 */
  91260. { { 0x5e3c647b,0xc0426b77,0x8cf05348,0xbfcbd939,0x172c0d3d,0x31d312e3,
  91261. 0xee754737,0x5f49fde6,0x6da7ee61,0x895530f0,0xe8b3a5fb,0xcf281b0a },
  91262. { 0x41b8a543,0xfd149735,0x3080dd30,0x41a625a7,0x653908cf,0xe2baae07,
  91263. 0xba02a278,0xc3d01436,0x7b21b8f8,0xa0d0222e,0xd7ec1297,0xfdc270e9 } },
  91264. /* 33 */
  91265. { { 0xbc7f41d6,0x00873c0c,0x1b7ad641,0xd976113e,0x238443fb,0x2a536ff4,
  91266. 0x41e62e45,0x030d00e2,0x5f545fc6,0x532e9867,0x8e91208c,0xcd033108 },
  91267. { 0x9797612c,0xd1a04c99,0xeea674e2,0xd4393e02,0xe19742a1,0xd56fa69e,
  91268. 0x85f0590e,0xdd2ab480,0x48a2243d,0xa5cefc52,0x54383f41,0x48cc67b6 } },
  91269. /* 34 */
  91270. { { 0xfc14ab48,0x4e50430e,0x26706a74,0x195b7f4f,0xcc881ff6,0x2fe8a228,
  91271. 0xd945013d,0xb1b968e2,0x4b92162b,0x936aa579,0x364e754a,0x4fb766b7 },
  91272. { 0x31e1ff7f,0x13f93bca,0xce4f2691,0x696eb5ca,0xa2b09e02,0xff754bf8,
  91273. 0xe58e3ff8,0x58f13c9c,0x1678c0b0,0xb757346f,0xa86692b3,0xd54200db } },
  91274. /* 35 */
  91275. { { 0x6dda1265,0x9a030bbd,0xe89718dd,0xf7b4f3fc,0x936065b8,0xa6a4931f,
  91276. 0x5f72241c,0xbce72d87,0x65775857,0x6cbb51cb,0x4e993675,0xc7161815 },
  91277. { 0x2ee32189,0xe81a0f79,0x277dc0b2,0xef2fab26,0xb71f469f,0x9e64f6fe,
  91278. 0xdfdaf859,0xb448ce33,0xbe6b5df1,0x3f5c1c4c,0x1de45f7b,0xfb8dfb00 } },
  91279. /* 36 */
  91280. { { 0x4d5bb921,0xc7345fa7,0x4d2b667e,0x5c7e04be,0x282d7a3e,0x47ed3a80,
  91281. 0x7e47b2a4,0x5c2777f8,0x08488e2e,0x89b3b100,0xb2eb5b45,0x9aad77c2 },
  91282. { 0xdaac34ae,0xd681bca7,0x26afb326,0x2452e4e5,0x41a1ee14,0x0c887924,
  91283. 0xc2407ade,0x743b04d4,0xfc17a2ac,0xcb5e999b,0x4a701a06,0x4dca2f82 } },
  91284. /* 37 */
  91285. { { 0x1127bc1a,0x68e31ca6,0x17ead3be,0xa3edd59b,0xe25f5a15,0x67b6b645,
  91286. 0xa420e15e,0x76221794,0x4b1e872e,0x794fd83b,0xb2dece1b,0x7cab3f03 },
  91287. { 0xca9b3586,0x7119bf15,0x4d250bd7,0xa5545924,0xcc6bcf24,0x173633ea,
  91288. 0xb1b6f884,0x9bd308c2,0x447d38c3,0x3bae06f5,0xf341fe1c,0x54dcc135 } },
  91289. /* 38 */
  91290. { { 0x943caf0d,0x56d3598d,0x225ff133,0xce044ea9,0x563fadea,0x9edf6a7c,
  91291. 0x73e8dc27,0x632eb944,0x3190dcab,0x814b467e,0x6dbb1e31,0x2d4f4f31 },
  91292. { 0xa143b7ca,0x8d69811c,0xde7cf950,0x4ec1ac32,0x37b5fe82,0x223ab5fd,
  91293. 0x9390f1d9,0xe82616e4,0x75804610,0xabff4b20,0x875b08f0,0x11b9be15 } },
  91294. /* 39 */
  91295. { { 0x3bbe682c,0x4ae31a3d,0x74eef2dd,0xbc7c5d26,0x3c47dd40,0x92afd10a,
  91296. 0xc14ab9e1,0xec7e0a3b,0xb2e495e4,0x6a6c3dd1,0x309bcd85,0x085ee5e9 },
  91297. { 0x8c2e67fd,0xf381a908,0xe261eaf2,0x32083a80,0x96deee15,0x0fcd6a49,
  91298. 0x5e524c79,0xe3b8fb03,0x1d5b08b9,0x8dc360d9,0x7f26719f,0x3a06e2c8 } },
  91299. /* 40 */
  91300. { { 0x7237cac0,0x5cd9f5a8,0x43586794,0x93f0b59d,0xe94f6c4e,0x4384a764,
  91301. 0xb62782d3,0x8304ed2b,0xcde06015,0x0b8db8b3,0x5dbe190f,0x4336dd53 },
  91302. { 0x92ab473a,0x57443553,0xbe5ed046,0x031c7275,0x21909aa4,0x3e78678c,
  91303. 0x99202ddb,0x4ab7e04f,0x6977e635,0x2648d206,0x093198be,0xd427d184 } },
  91304. /* 41 */
  91305. { { 0x0f9b5a31,0x822848f5,0xbaadb62a,0xbb003468,0x3357559c,0x233a0472,
  91306. 0x79aee843,0x49ef6880,0xaeb9e1e3,0xa89867a0,0x1f6f9a55,0xc151931b },
  91307. { 0xad74251e,0xd264eb0b,0x4abf295e,0x37b9b263,0x04960d10,0xb600921b,
  91308. 0x4da77dc0,0x0de53dbc,0xd2b18697,0x01d9bab3,0xf7156ddf,0xad54ec7a } },
  91309. /* 42 */
  91310. { { 0x79efdc58,0x8e74dc35,0x4ff68ddb,0x456bd369,0xd32096a5,0x724e74cc,
  91311. 0x386783d0,0xe41cff42,0x7c70d8a4,0xa04c7f21,0xe61a19a2,0x41199d2f },
  91312. { 0x29c05dd2,0xd389a3e0,0xe7e3fda9,0x535f2a6b,0x7c2b4df8,0x26ecf72d,
  91313. 0xfe745294,0x678275f4,0x9d23f519,0x6319c9cc,0x88048fc4,0x1e05a02d } },
  91314. /* 43 */
  91315. { { 0xd4d5ffe8,0x75cc8e2e,0xdbea17f2,0xf8bb4896,0xcee3cb4a,0x35059790,
  91316. 0xa47c6165,0x4c06ee85,0x92935d2f,0xf98fff25,0x32ffd7c7,0x34c4a572 },
  91317. { 0xea0376a2,0xc4b14806,0x4f115e02,0x2ea5e750,0x1e55d7c0,0x532d76e2,
  91318. 0xf31044da,0x68dc9411,0x71b77993,0x9272e465,0x93a8cfd5,0xadaa38bb } },
  91319. /* 44 */
  91320. { { 0x7d4ed72a,0x4bf0c712,0xba1f79a3,0xda0e9264,0xf4c39ea4,0x48c0258b,
  91321. 0x2a715138,0xa5394ed8,0xbf06c660,0x4af511ce,0xec5c37cd,0xfcebceef },
  91322. { 0x779ae8c1,0xf23b75aa,0xad1e606e,0xdeff59cc,0x22755c82,0xf3f526fd,
  91323. 0xbb32cefd,0x64c5ab44,0x915bdefd,0xa96e11a2,0x1143813e,0xab19746a } },
  91324. /* 45 */
  91325. { { 0xec837d7d,0x43c78585,0xb8ee0ba4,0xca5b6fbc,0xd5dbb5ee,0x34e924d9,
  91326. 0xbb4f1ca5,0x3f4fa104,0x398640f7,0x15458b72,0xd7f407ea,0x4231faa9 },
  91327. { 0xf96e6896,0x53e0661e,0xd03b0f9d,0x554e4c69,0x9c7858d1,0xd4fcb07b,
  91328. 0x52cb04fa,0x7e952793,0x8974e7f7,0x5f5f1574,0x6b6d57c8,0x2e3fa558 } },
  91329. /* 46 */
  91330. { { 0x6a9951a8,0x42cd4803,0x42792ad0,0xa8b15b88,0xabb29a73,0x18e8bcf9,
  91331. 0x409933e8,0xbfd9a092,0xefb88dc4,0x760a3594,0x40724458,0x14418863 },
  91332. { 0x99caedc7,0x162a56ee,0x91d101c9,0x8fb12ecd,0x393202da,0xea671967,
  91333. 0xa4ccd796,0x1aac8c4a,0x1cf185a8,0x7db05036,0x8cfd095a,0x0c9f86cd } },
  91334. /* 47 */
  91335. { { 0x10b2a556,0x9a728147,0x327b70b2,0x767ca964,0x5e3799b7,0x04ed9e12,
  91336. 0x22a3eb2a,0x6781d2dc,0x0d9450ac,0x5bd116eb,0xa7ebe08a,0xeccac1fc },
  91337. { 0xdc2d6e94,0xde68444f,0x35ecf21b,0x3621f429,0x29e03a2c,0x14e2d543,
  91338. 0x7d3e7f0a,0x53e42cd5,0x73ed00b9,0xbba26c09,0xc57d2272,0x00297c39 } },
  91339. /* 48 */
  91340. { { 0xb8243a7d,0x3aaaab10,0x8fa58c5b,0x6eeef93e,0x9ae7f764,0xf866fca3,
  91341. 0x61ab04d3,0x64105a26,0x03945d66,0xa3578d8a,0x791b848c,0xb08cd3e4 },
  91342. { 0x756d2411,0x45edc5f8,0xa755128c,0xd4a790d9,0x49e5f6a0,0xc2cf0963,
  91343. 0xf649beaa,0xc66d267d,0x8467039e,0x3ce6d968,0x42f7816f,0x50046c6b } },
  91344. /* 49 */
  91345. { { 0x66425043,0x92ae1602,0xf08db890,0x1ff66afd,0x8f162ce5,0x386f5a7f,
  91346. 0xfcf5598f,0x18d2dea0,0x1a8ca18e,0x78372b3a,0x8cd0e6f7,0xdf0d20eb },
  91347. { 0x75bb4045,0x7edd5e1d,0xb96d94b7,0x252a47ce,0x2c626776,0xbdb29358,
  91348. 0x40dd1031,0x853c3943,0x7d5f47fd,0x9dc9becf,0xbae4044a,0x27c2302f } },
  91349. /* 50 */
  91350. { { 0x8f2d49ce,0x2d1d208a,0x162df0a2,0x0d91aa02,0x09a07f65,0x9c5cce87,
  91351. 0x84339012,0xdf07238b,0x419442cd,0x5028e2c8,0x72062aba,0x2dcbd358 },
  91352. { 0xe4680967,0xb5fbc3cb,0x9f92d72c,0x2a7bc645,0x116c369d,0x806c76e1,
  91353. 0x3177e8d8,0x5c50677a,0x4569df57,0x753739eb,0x36c3f40b,0x2d481ef6 } },
  91354. /* 51 */
  91355. { { 0xfea1103e,0x1a2d39fd,0x95f81b17,0xeaae5592,0xf59b264a,0xdbd0aa18,
  91356. 0xcb592ee0,0x90c39c1a,0x9750cca3,0xdf62f80d,0xdf97cc6c,0xda4d8283 },
  91357. { 0x1e201067,0x0a6dd346,0x69fb1f6b,0x1531f859,0x1d60121f,0x4895e552,
  91358. 0x4c041c91,0x0b21aab0,0xbcc1ccf8,0x9d896c46,0x3141bde7,0xd24da3b3 } },
  91359. /* 52 */
  91360. { { 0x53b0a354,0x575a0537,0x0c6ddcd8,0x392ff2f4,0x56157b94,0x0b8e8cff,
  91361. 0x3b1b80d1,0x073e57bd,0x3fedee15,0x2a75e0f0,0xaa8e6f19,0x752380e4 },
  91362. { 0x6558ffe9,0x1f4e227c,0x19ec5415,0x3a348618,0xf7997085,0xab382d5e,
  91363. 0xddc46ac2,0x5e6deaff,0xfc8d094c,0xe5144078,0xf60e37c6,0xf674fe51 } },
  91364. /* 53 */
  91365. { { 0xaf63408f,0x6fb87ae5,0xcd75a737,0xa39c36a9,0xcf4c618d,0x7833313f,
  91366. 0xf034c88d,0xfbcd4482,0x39b35288,0x4469a761,0x66b5d9c9,0x77a711c5 },
  91367. { 0x944f8d65,0x4a695dc7,0x161aaba8,0xe6da5f65,0x24601669,0x8654e9c3,
  91368. 0x28ae7491,0xbc8b93f5,0x8f5580d8,0x5f1d1e83,0xcea32cc8,0x8ccf9a1a } },
  91369. /* 54 */
  91370. { { 0x7196fee2,0x28ab110c,0x874c8945,0x75799d63,0x29aedadd,0xa2629348,
  91371. 0x2be88ff4,0x9714cc7b,0xd58d60d6,0xf71293cf,0x32a564e9,0xda6b6cb3 },
  91372. { 0x3dd821c2,0xf43fddb1,0x90dd323d,0xf2f2785f,0x048489f8,0x91246419,
  91373. 0xd24c6749,0x61660f26,0xc803c15c,0x961d9e8c,0xfaadc4c9,0x631c6158 } },
  91374. /* 55 */
  91375. { { 0xfd752366,0xacf2ebe0,0x139be88b,0xb93c340e,0x0f20179e,0x98f66485,
  91376. 0xff1da785,0x14820254,0x4f85c16e,0x5278e276,0x7aab1913,0xa246ee45 },
  91377. { 0x53763b33,0x43861eb4,0x45c0bc0d,0xc49f03fc,0xad6b1ea1,0xafff16bc,
  91378. 0x6fd49c99,0xce33908b,0xf7fde8c3,0x5c51e9bf,0xff142c5e,0x076a7a39 } },
  91379. /* 56 */
  91380. { { 0x9e338d10,0x04639dfe,0xf42b411b,0x8ee6996f,0xa875cef2,0x960461d1,
  91381. 0x95b4d0ba,0x1057b6d6,0xa906e0bc,0x27639252,0xe1c20f8a,0x2c19f09a },
  91382. { 0xeef4c43d,0x5b8fc3f0,0x07a84aa9,0xe2e1b1a8,0x835d2bdb,0x5f455528,
  91383. 0x207132dd,0x0f4aee4d,0x3907f675,0xe9f8338c,0x0e0531f0,0x7a874dc9 } },
  91384. /* 57 */
  91385. { { 0x97c27050,0x84b22d45,0x59e70bf8,0xbd0b8df7,0x79738b9b,0xb4d67405,
  91386. 0xcd917c4f,0x47f4d5f5,0x13ce6e33,0x9099c4ce,0x521d0f8b,0x942bfd39 },
  91387. { 0xa43b566d,0x5028f0f6,0x21bff7de,0xaf6e8669,0xc44232cd,0x83f6f856,
  91388. 0xf915069a,0x65680579,0xecfecb85,0xd12095a2,0xdb01ba16,0xcf7f06ae } },
  91389. /* 58 */
  91390. { { 0x8ef96c80,0x0f56e3c4,0x3ddb609c,0xd521f2b3,0x7dc1450d,0x2be94102,
  91391. 0x02a91fe2,0x2d21a071,0x1efa37de,0x2e6f74fa,0x156c28a1,0x9a9a90b8 },
  91392. { 0x9dc7dfcb,0xc54ea9ea,0x2c2c1d62,0xc74e66fc,0x49d3e067,0x9f23f967,
  91393. 0x54dd38ad,0x1c7c3a46,0x5946cee3,0xc7005884,0x45cc045d,0x89856368 } },
  91394. /* 59 */
  91395. { { 0xfce73946,0x29da7cd4,0x23168563,0x8f697db5,0xcba92ec6,0x8e235e9c,
  91396. 0x9f91d3ea,0x55d4655f,0xaa50a6cd,0xf3689f23,0x21e6a1a0,0xdcf21c26 },
  91397. { 0x61b818bf,0xcffbc82e,0xda47a243,0xc74a2f96,0x8bc1a0cf,0x234e980a,
  91398. 0x7929cb6d,0xf35fd6b5,0xefe17d6c,0x81468e12,0x58b2dafb,0xddea6ae5 } },
  91399. /* 60 */
  91400. { { 0x7e787b2e,0x294de887,0x39a9310d,0x258acc1f,0xac14265d,0x92d9714a,
  91401. 0x708b48a0,0x18b5591c,0xe1abbf71,0x27cc6bb0,0x568307b9,0xc0581fa3 },
  91402. { 0xf24d4d58,0x9e0f58a3,0xe0ce2327,0xfebe9bb8,0x9d1be702,0x91fd6a41,
  91403. 0xfacac993,0x9a7d8a45,0x9e50d66d,0xabc0a08c,0x06498201,0x02c342f7 } },
  91404. /* 61 */
  91405. { { 0x157bdbc2,0xccd71407,0xad0e1605,0x72fa89c6,0xb92a015f,0xb1d3da2b,
  91406. 0xa0a3fe56,0x8ad9e7cd,0x24f06737,0x160edcbd,0x61275be6,0x79d4db33 },
  91407. { 0x5f3497c4,0xd3d31fd9,0x04192fb0,0x8cafeaee,0x13a50af3,0xe13ca745,
  91408. 0x8c85aae5,0x18826167,0x9eb556ff,0xce06cea8,0xbdb549f3,0x2eef1995 } },
  91409. /* 62 */
  91410. { { 0x50596edc,0x8ed7d3eb,0x905243a2,0xaa359362,0xa4b6d02b,0xa212c2c2,
  91411. 0xc4fbec68,0x611fd727,0xb84f733d,0x8a0b8ff7,0x5f0daf0e,0xd85a6b90 },
  91412. { 0xd4091cf7,0x60e899f5,0x2eff2768,0x4fef2b67,0x10c33964,0xc1f195cb,
  91413. 0x93626a8f,0x8275d369,0x0d6c840a,0xc77904f4,0x7a868acd,0x88d8b7fd } },
  91414. /* 63 */
  91415. { { 0x7bd98425,0x85f23723,0xc70b154e,0xd4463992,0x96687a2e,0xcbb00ee2,
  91416. 0xc83214fd,0x905fdbf7,0x13593684,0x2019d293,0xef51218e,0x0428c393 },
  91417. { 0x981e909a,0x40c7623f,0x7be192da,0x92513385,0x4010907e,0x48fe480f,
  91418. 0x3120b459,0xdd7a187c,0xa1fd8f3c,0xc9d7702d,0xe358efc5,0x66e4753b } },
  91419. /* 64 */
  91420. { { 0x16973cf4,0x070d34e1,0x7e4f34f7,0x20aee08b,0x5eb8ad29,0x269af9b9,
  91421. 0xa6a45dda,0xdde0a036,0x63df41e0,0xa18b528e,0xa260df2a,0x03cc71b2 },
  91422. { 0xa06b1dd7,0x24a6770a,0x9d2675d3,0x5bfa9c11,0x96844432,0x73c1e2a1,
  91423. 0x131a6cf0,0x3660558d,0x2ee79454,0xb0289c83,0xc6d8ddcd,0xa6aefb01 } },
  91424. /* 65 */
  91425. { { 0x01ab5245,0xba1464b4,0xc48d93ff,0x9b8d0b6d,0x93ad272c,0x939867dc,
  91426. 0xae9fdc77,0xbebe085e,0x894ea8bd,0x73ae5103,0x39ac22e1,0x740fc89a },
  91427. { 0x28e23b23,0x5e28b0a3,0xe13104d0,0x2352722e,0xb0a2640d,0xf4667a18,
  91428. 0x49bb37c3,0xac74a72e,0xe81e183a,0x79f734f0,0x3fd9c0eb,0xbffe5b6c } },
  91429. /* 66 */
  91430. { { 0xc6a2123f,0xb1a358f5,0xfe28df6d,0x927b2d95,0xf199d2f9,0x89702753,
  91431. 0x1a3f82dc,0x0a73754c,0x777affe1,0x063d029d,0xdae6d34d,0x5439817e },
  91432. { 0x6b8b83c4,0xf7979eef,0x9d945682,0x615cb214,0xc5e57eae,0x8f0e4fac,
  91433. 0x113047dd,0x042b89b8,0x93f36508,0x888356dc,0x5fd1f32f,0xbf008d18 } },
  91434. /* 67 */
  91435. { { 0x4e8068db,0x8012aa24,0xa5729a47,0xc72cc641,0x43f0691d,0x3c33df2c,
  91436. 0x1d92145f,0xfa057347,0xb97f7946,0xaefc0f2f,0x2f8121bf,0x813d75cb },
  91437. { 0x4383bba6,0x05613c72,0xa4224b3f,0xa924ce70,0x5f2179a6,0xe59cecbe,
  91438. 0x79f62b61,0x78e2e8aa,0x53ad8079,0x3ac2cc3b,0xd8f4fa96,0x55518d71 } },
  91439. /* 68 */
  91440. { { 0x00623f3b,0x03cf2922,0x5f29ebff,0x095c7111,0x80aa6823,0x42d72247,
  91441. 0x7458c0b0,0x044c7ba1,0x0959ec20,0xca62f7ef,0xf8ca929f,0x40ae2ab7 },
  91442. { 0xa927b102,0xb8c5377a,0xdc031771,0x398a86a0,0xc216a406,0x04908f9d,
  91443. 0x918d3300,0xb423a73a,0xe0b94739,0x634b0ff1,0x2d69f697,0xe29de725 } },
  91444. /* 69 */
  91445. { { 0x8435af04,0x744d1400,0xfec192da,0x5f255b1d,0x336dc542,0x1f17dc12,
  91446. 0x636a68a8,0x5c90c2a7,0x7704ca1e,0x960c9eb7,0x6fb3d65a,0x9de8cf1e },
  91447. { 0x511d3d06,0xc60fee0d,0xf9eb52c7,0x466e2313,0x206b0914,0x743c0f5f,
  91448. 0x2191aa4d,0x42f55bac,0xffebdbc2,0xcefc7c8f,0xe6e8ed1c,0xd4fa6081 } },
  91449. /* 70 */
  91450. { { 0xb0ab9645,0xb5e405d3,0xd5f1f711,0xaeec7f98,0x585c2a6e,0x8ad42311,
  91451. 0x512c6944,0x045acb9e,0xa90db1c6,0xae106c4e,0x898e6563,0xb89f33d5 },
  91452. { 0x7fed2ce4,0x43b07cd9,0xdd815b20,0xf9934e17,0x0a81a349,0x6778d4d5,
  91453. 0x52918061,0x9e616ade,0xd7e67112,0xfa06db06,0x88488091,0x1da23cf1 } },
  91454. /* 71 */
  91455. { { 0x42f2c4b5,0x821c46b3,0x66059e47,0x931513ef,0x66f50cd1,0x7030ae43,
  91456. 0x43e7b127,0x43b536c9,0x5fca5360,0x006258cf,0x6b557abf,0xe4e3ee79 },
  91457. { 0x24c8b22f,0xbb6b3900,0xfcbf1054,0x2eb5e2c1,0x567492af,0x937b18c9,
  91458. 0xacf53957,0xf09432e4,0x1dbf3a56,0x585f5a9d,0xbe0887cf,0xf86751fd } },
  91459. /* 72 */
  91460. { { 0x9d10e0b2,0x157399cb,0x60dc51b7,0x1c0d5956,0x1f583090,0x1d496b8a,
  91461. 0x88590484,0x6658bc26,0x03213f28,0x88c08ab7,0x7ae58de4,0x8d2e0f73 },
  91462. { 0x486cfee6,0x9b79bc95,0xe9e5bc57,0x036a26c7,0xcd8ae97a,0x1ad03601,
  91463. 0xff3a0494,0x06907f87,0x2c7eb584,0x078f4bbf,0x7e8d0a5a,0xe3731bf5 } },
  91464. /* 73 */
  91465. { { 0xe1cd0abe,0x72f2282b,0x87efefa2,0xd4f9015e,0x6c3834bd,0x9d189806,
  91466. 0xb8a29ced,0x9c8cdcc1,0xfee82ebc,0x0601b9f4,0x7206a756,0x371052bc },
  91467. { 0x46f32562,0x76fa1092,0x17351bb4,0xdaad534c,0xb3636bb5,0xc3d64c37,
  91468. 0x45d54e00,0x038a8c51,0x32c09e7c,0x301e6180,0x95735151,0x9764eae7 } },
  91469. /* 74 */
  91470. { { 0xcbd5256a,0x8791b19f,0x6ca13a3b,0x4007e0f2,0x4cf06904,0x03b79460,
  91471. 0xb6c17589,0xb18a9c22,0x81d45908,0xa1cb7d7d,0x21bb68f1,0x6e13fa9d },
  91472. { 0xa71e6e16,0x47183c62,0xe18749ed,0x5cf0ef8e,0x2e5ed409,0x2c9c7f9b,
  91473. 0xe6e117e1,0x042eeacc,0x13fb5a7f,0xb86d4816,0xc9e5feb1,0xea1cf0ed } },
  91474. /* 75 */
  91475. { { 0xcea4cc9b,0x6e6573c9,0xafcec8f3,0x5417961d,0xa438b6f6,0x804bf02a,
  91476. 0xdcd4ea88,0xb894b03c,0x3799571f,0xd0f807e9,0x862156e8,0x3466a7f5 },
  91477. { 0x56515664,0x51e59acd,0xa3c5eb0b,0x55b0f93c,0x6a4279db,0x84a06b02,
  91478. 0xc5fae08e,0x5c850579,0xa663a1a2,0xcf07b8db,0xf46ffc8d,0x49a36bbc } },
  91479. /* 76 */
  91480. { { 0x46d93106,0xe47f5acc,0xaa897c9c,0x65b7ade0,0x12d7e4be,0x37cf4c94,
  91481. 0xd4b2caa9,0xa2ae9b80,0xe60357a3,0x5e7ce09c,0xc8ecd5f9,0x29f77667 },
  91482. { 0xa8a0b1c5,0xdf6868f5,0x62978ad8,0x240858cf,0xdc0002a1,0x0f7ac101,
  91483. 0xffe9aa05,0x1d28a9d7,0x5b962c97,0x744984d6,0x3d28c8b2,0xa8a7c00b } },
  91484. /* 77 */
  91485. { { 0xae11a338,0x7c58a852,0xd1af96e7,0xa78613f1,0x5355cc73,0x7e9767d2,
  91486. 0x792a2de6,0x6ba37009,0x124386b2,0x7d60f618,0x11157674,0xab09b531 },
  91487. { 0x98eb9dd0,0x95a04841,0x15070328,0xe6c17acc,0x489c6e49,0xafc6da45,
  91488. 0xbb211530,0xab45a60a,0x7d7ea933,0xc58d6592,0x095642c6,0xa3ef3c65 } },
  91489. /* 78 */
  91490. { { 0xdf010879,0x89d420e9,0x39576179,0x9d25255d,0xe39513b6,0x9cdefd50,
  91491. 0xd5d1c313,0xe4efe45b,0x3f7af771,0xc0149de7,0x340ab06b,0x55a6b4f4 },
  91492. { 0xebeaf771,0xf1325251,0x878d4288,0x2ab44128,0x18e05afe,0xfcd5832e,
  91493. 0xcc1fb62b,0xef52a348,0xc1c4792a,0x2bd08274,0x877c6dc7,0x345c5846 } },
  91494. /* 79 */
  91495. { { 0xbea65e90,0xde15ceb0,0x2416d99c,0x0987f72b,0xfd863dec,0x44db578d,
  91496. 0xac6a3578,0xf617b74b,0xdb48e999,0x9e62bd7a,0xeab1a1be,0x877cae61 },
  91497. { 0x3a358610,0x23adddaa,0x325e2b07,0x2fc4d6d1,0x1585754e,0x897198f5,
  91498. 0xb392b584,0xf741852c,0xb55f7de1,0x9927804c,0x1aa8efae,0xe9e6c4ed } },
  91499. /* 80 */
  91500. { { 0x98683186,0x867db639,0xddcc4ea9,0xfb5cf424,0xd4f0e7bd,0xcc9a7ffe,
  91501. 0x7a779f7e,0x7c57f71c,0xd6b25ef2,0x90774079,0xb4081680,0x90eae903 },
  91502. { 0x0ee1fceb,0xdf2aae5e,0xe86c1a1f,0x3ff1da24,0xca193edf,0x80f587d6,
  91503. 0xdc9b9d6a,0xa5695523,0x85920303,0x7b840900,0xba6dbdef,0x1efa4dfc } },
  91504. /* 81 */
  91505. { { 0xe0540015,0xfbd838f9,0xc39077dc,0x2c323946,0xad619124,0x8b1fb9e6,
  91506. 0x0ca62ea8,0x9612440c,0x2dbe00ff,0x9ad9b52c,0xae197643,0xf52abaa1 },
  91507. { 0x2cac32ad,0xd0e89894,0x62a98f91,0xdfb79e42,0x276f55cb,0x65452ecf,
  91508. 0x7ad23e12,0xdb1ac0d2,0xde4986f0,0xf68c5f6a,0x82ce327d,0x389ac37b } },
  91509. /* 82 */
  91510. { { 0xf8e60f5b,0x511188b4,0x48aa2ada,0x7fe67015,0x381abca2,0xdb333cb8,
  91511. 0xdaf3fc97,0xb15e6d9d,0x36aabc03,0x4b24f6eb,0x72a748b4,0xc59789df },
  91512. { 0x29cf5279,0x26fcb8a5,0x01ad9a6c,0x7a3c6bfc,0x4b8bac9b,0x866cf88d,
  91513. 0x9c80d041,0xf4c89989,0x70add148,0xf0a04241,0x45d81a41,0x5a02f479 } },
  91514. /* 83 */
  91515. { { 0xc1c90202,0xfa5c877c,0xf8ac7570,0xd099d440,0xd17881f7,0x428a5b1b,
  91516. 0x5b2501d7,0x61e267db,0xf2e4465b,0xf889bf04,0x76aa4cb8,0x4da3ae08 },
  91517. { 0xe3e66861,0x3ef0fe26,0x3318b86d,0x5e772953,0x747396df,0xc3c35fbc,
  91518. 0x439ffd37,0x5115a29c,0xb2d70374,0xbfc4bd97,0x56246b9d,0x088630ea } },
  91519. /* 84 */
  91520. { { 0xb8a9e8c9,0xcd96866d,0x5bb8091e,0xa11963b8,0x045b3cd2,0xc7f90d53,
  91521. 0x80f36504,0x755a72b5,0x21d3751c,0x46f8b399,0x53c193de,0x4bffdc91 },
  91522. { 0xb89554e7,0xcd15c049,0xf7a26be6,0x353c6754,0xbd41d970,0x79602370,
  91523. 0x12b176c0,0xde16470b,0x40c8809d,0x56ba1175,0xe435fb1e,0xe2db35c3 } },
  91524. /* 85 */
  91525. { { 0x6328e33f,0xd71e4aab,0xaf8136d1,0x5486782b,0x86d57231,0x07a4995f,
  91526. 0x1651a968,0xf1f0a5bd,0x76803b6d,0xa5dc5b24,0x42dda935,0x5c587cbc },
  91527. { 0xbae8b4c0,0x2b6cdb32,0xb1331138,0x66d1598b,0x5d7e9614,0x4a23b2d2,
  91528. 0x74a8c05d,0x93e402a6,0xda7ce82e,0x45ac94e6,0xe463d465,0xeb9f8281 } },
  91529. /* 86 */
  91530. { { 0xfecf5b9b,0x34e0f9d1,0xf206966a,0xa115b12b,0x1eaa0534,0x5591cf3b,
  91531. 0xfb1558f9,0x5f0293cb,0x1bc703a5,0x1c8507a4,0x862c1f81,0x92e6b81c },
  91532. { 0xcdaf24e3,0xcc9ebc66,0x72fcfc70,0x68917ecd,0x8157ba48,0x6dc9a930,
  91533. 0xb06ab2b2,0x5d425c08,0x36e929c4,0x362f8ce7,0x62e89324,0x09f6f57c } },
  91534. /* 87 */
  91535. { { 0xd29375fb,0x1c7d6b78,0xe35d1157,0xfabd851e,0x4243ea47,0xf6f62dcd,
  91536. 0x8fe30b0f,0x1dd92460,0xffc6e709,0x08166dfa,0x0881e6a7,0xc6c4c693 },
  91537. { 0xd6a53fb0,0x20368f87,0x9eb4d1f9,0x38718e9f,0xafd7e790,0x03f08acd,
  91538. 0x72fe2a1c,0x0835eb44,0x88076e5d,0x7e050903,0xa638e731,0x538f765e } },
  91539. /* 88 */
  91540. { { 0xc2663b4b,0x0e0249d9,0x47cd38dd,0xe700ab5b,0x2c46559f,0xb192559d,
  91541. 0x4bcde66d,0x8f9f74a8,0x3e2aced5,0xad161523,0x3dd03a5b,0xc155c047 },
  91542. { 0x3be454eb,0x346a8799,0x83b7dccd,0x66ee94db,0xab9d2abe,0x1f6d8378,
  91543. 0x7733f355,0x4a396dd2,0xf53553c2,0x419bd40a,0x731dd943,0xd0ead98d } },
  91544. /* 89 */
  91545. { { 0xec142408,0x908e0b0e,0x4114b310,0x98943cb9,0x1742b1d7,0x03dbf7d8,
  91546. 0x693412f4,0xd270df6b,0x8f69e20c,0xc5065494,0x697e43a1,0xa76a90c3 },
  91547. { 0x4624825a,0xe0fa3384,0x8acc34c2,0x82e48c0b,0xe9a14f2b,0x7b24bd14,
  91548. 0x4db30803,0x4f5dd5e2,0x932da0a3,0x0c77a9e7,0x74c653dc,0x20db90f2 } },
  91549. /* 90 */
  91550. { { 0x0e6c5fd9,0x261179b7,0x6c982eea,0xf8bec123,0xd4957b7e,0x47683338,
  91551. 0x0a72f66a,0xcc47e664,0x1bad9350,0xbd54bf6a,0xf454e95a,0xdfbf4c6a },
  91552. { 0x6907f4fa,0x3f7a7afa,0x865ca735,0x7311fae0,0x2a496ada,0x24737ab8,
  91553. 0x15feb79b,0x13e425f1,0xa1b93c21,0xe9e97c50,0x4ddd3eb5,0xb26b6eac } },
  91554. /* 91 */
  91555. { { 0x2a2e5f2b,0x81cab9f5,0xbf385ac4,0xf93caf29,0xc909963a,0xf4bf35c3,
  91556. 0x74c9143c,0x081e7300,0xc281b4c5,0x3ea57fa8,0x9b340741,0xe497905c },
  91557. { 0x55ab3cfb,0xf556dd8a,0x518db6ad,0xd444b96b,0x5ef4b955,0x34f5425a,
  91558. 0xecd26aa3,0xdda7a3ac,0xda655e97,0xb57da11b,0xc2024c70,0x02da3eff } },
  91559. /* 92 */
  91560. { { 0x6481d0d9,0xe24b0036,0x818fdfe2,0x3740dbe5,0x190fda00,0xc1fc1f45,
  91561. 0x3cf27fde,0x329c9280,0x6934f43e,0x7435cb53,0x7884e8fe,0x2b505a5d },
  91562. { 0x711adcc9,0x6cfcc6a6,0x531e21e1,0xf034325c,0x9b2a8a99,0xa2f4a967,
  91563. 0x3c21bdff,0x9d5f3842,0x31b57d66,0xb25c7811,0x0b8093b9,0xdb5344d8 } },
  91564. /* 93 */
  91565. { { 0xae50a2f5,0x0d72e667,0xe4a861d1,0x9b7f8d8a,0x330df1cb,0xa129f70f,
  91566. 0xe04fefc3,0xe90aa5d7,0xe72c3ae1,0xff561ecb,0xcdb955fa,0x0d8fb428 },
  91567. { 0xd7663784,0xd2235f73,0x7e2c456a,0xc05baec6,0x2adbfccc,0xe5c292e4,
  91568. 0xefb110d5,0x4fd17988,0xd19d49f3,0x27e57734,0x84f679fe,0x188ac4ce } },
  91569. /* 94 */
  91570. { { 0xa796c53e,0x7ee344cf,0x0868009b,0xbbf6074d,0x474a1295,0x1f1594f7,
  91571. 0xac11632d,0x66776edc,0x04e2fa5a,0x1862278b,0xc854a89a,0x52665cf2 },
  91572. { 0x8104ab58,0x7e376464,0x7204fd6d,0x16775913,0x44ea1199,0x86ca06a5,
  91573. 0x1c9240dd,0xaa3f765b,0x24746149,0x5f8501a9,0xdcd251d7,0x7b982e30 } },
  91574. /* 95 */
  91575. { { 0xc15f3060,0xe44e9efc,0xa87ebbe6,0x5ad62f2e,0xc79500d4,0x36499d41,
  91576. 0x336fa9d1,0xa66d6dc0,0x5afd3b1f,0xf8afc495,0xe5c9822b,0x1d8ccb24 },
  91577. { 0x79d7584b,0x4031422b,0xea3f20dd,0xc54a0580,0x958468c5,0x3f837c8f,
  91578. 0xfbea7735,0x3d82f110,0x7dffe2fc,0x679a8778,0x20704803,0x48eba63b } },
  91579. /* 96 */
  91580. { { 0xdf46e2f6,0x89b10d41,0x19514367,0x13ab57f8,0x1d469c87,0x067372b9,
  91581. 0x4f6c5798,0x0c195afa,0x272c9acf,0xea43a12a,0x678abdac,0x9dadd8cb },
  91582. { 0xe182579a,0xcce56c6b,0x2d26c2d8,0x86febadb,0x2a44745c,0x1c668ee1,
  91583. 0x98dc047a,0x580acd86,0x51b9ec2d,0x5a2b79cc,0x4054f6a0,0x007da608 } },
  91584. /* 97 */
  91585. { { 0x17b00dd0,0x9e3ca352,0x0e81a7a6,0x046779cb,0xd482d871,0xb999fef3,
  91586. 0xd9233fbc,0xe6f38134,0xf48cd0e0,0x112c3001,0x3c6c66ae,0x934e7576 },
  91587. { 0xd73234dc,0xb44d4fc3,0x864eafc1,0xfcae2062,0x26bef21a,0x843afe25,
  91588. 0xf3b75fdf,0x61355107,0x794c2e6b,0x8367a5aa,0x8548a372,0x3d2629b1 } },
  91589. /* 98 */
  91590. { { 0x437cfaf8,0x6230618f,0x2032c299,0x5b8742cb,0x2293643a,0x949f7247,
  91591. 0x09464f79,0xb8040f1a,0x4f254143,0x049462d2,0x366c7e76,0xabd6b522 },
  91592. { 0xd5338f55,0x119b392b,0x01495a0c,0x1a80a9ce,0xf8d7537e,0xf3118ca7,
  91593. 0x6bf4b762,0xb715adc2,0xa8482b6c,0x24506165,0x96a7c84d,0xd958d7c6 } },
  91594. /* 99 */
  91595. { { 0xbdc21f31,0x9ad8aa87,0x8063e58c,0xadb3cab4,0xb07dd7b8,0xefd86283,
  91596. 0x1be7c6b4,0xc7b9b762,0x015582de,0x2ef58741,0x299addf3,0xc970c52e },
  91597. { 0x22f24d66,0x78f02e2a,0x74cc100a,0xefec1d10,0x09316e1a,0xaf2a6a39,
  91598. 0x5849dd49,0xce7c2205,0x96bffc4c,0x9c1fe75c,0x7ba06ec0,0xcad98fd2 } },
  91599. /* 100 */
  91600. { { 0xb648b73e,0xed76e2d0,0x1cfd285e,0xa9f92ce5,0x2ed13de1,0xa8c86c06,
  91601. 0xa5191a93,0x1d3a574e,0x1ad1b8bf,0x385cdf8b,0x47d2cfe3,0xbbecc28a },
  91602. { 0x69cec548,0x98d326c0,0xf240a0b2,0x4f5bc1dd,0x29057236,0x241a7062,
  91603. 0xc68294a4,0x0fc6e9c5,0xa319f17a,0x4d04838b,0x9ffc1c6f,0x8b612cf1 } },
  91604. /* 101 */
  91605. { { 0x4c3830eb,0x9bb0b501,0x8ee0d0c5,0x3d08f83c,0x79ba9389,0xa4a62642,
  91606. 0x9cbc2914,0x5d5d4044,0x074c46f0,0xae9eb83e,0x74ead7d6,0x63bb758f },
  91607. { 0xc6bb29e0,0x1c40d2ea,0x4b02f41e,0x95aa2d87,0x53cb199a,0x92989175,
  91608. 0x51584f6d,0xdd91bafe,0x31a1aaec,0x3715efb9,0x46780f9e,0xc1b6ae5b } },
  91609. /* 102 */
  91610. { { 0x42772f41,0xcded3e4b,0x3bcb79d1,0x3a700d5d,0x80feee60,0x4430d50e,
  91611. 0xf5e5d4bb,0x444ef1fc,0xe6e358ff,0xc660194f,0x6a91b43c,0xe68a2f32 },
  91612. { 0x977fe4d2,0x5842775c,0x7e2a41eb,0x78fdef5c,0xff8df00e,0x5f3bec02,
  91613. 0x5852525d,0xf4b840cd,0x4e6988bd,0x0870483a,0xcc64b837,0x39499e39 } },
  91614. /* 103 */
  91615. { { 0xb08df5fe,0xfc05de80,0x63ba0362,0x0c12957c,0xd5cf1428,0xea379414,
  91616. 0x54ef6216,0xc559132a,0xb9e65cf8,0x33d5f12f,0x1695d663,0x09c60278 },
  91617. { 0x61f7a2fb,0x3ac1ced4,0xd4f5eeb8,0xdd838444,0x8318fcad,0x82a38c6c,
  91618. 0xe9f1a864,0x315be2e5,0x442daf47,0x317b5771,0x95aa5f9e,0x81b5904a } },
  91619. /* 104 */
  91620. { { 0x8b21d232,0x6b6b1c50,0x8c2cba75,0x87f3dbc0,0xae9f0faf,0xa7e74b46,
  91621. 0xbb7b8079,0x036a0985,0x8d974a25,0x4f185b90,0xd9af5ec9,0x5aa7cef0 },
  91622. { 0x57dcfffc,0xe0566a70,0xb8453225,0x6ea311da,0x23368aa9,0x72ea1a8d,
  91623. 0x48cd552d,0xed9b2083,0xc80ea435,0xb987967c,0x6c104173,0xad735c75 } },
  91624. /* 105 */
  91625. { { 0xcee76ef4,0xaea85ab3,0xaf1d2b93,0x44997444,0xeacb923f,0x0851929b,
  91626. 0x51e3bc0c,0xb080b590,0x59be68a2,0xc4ee1d86,0x64b26cda,0xf00de219 },
  91627. { 0xf2e90d4d,0x8d7fb5c0,0x77d9ec64,0x00e219a7,0x5d1c491c,0xc4e6febd,
  91628. 0x1a8f4585,0x080e3754,0x48d2af9c,0x4a9b86c8,0xb6679851,0x2ed70db6 } },
  91629. /* 106 */
  91630. { { 0x586f25cb,0xaee44116,0xa0fcf70f,0xf7b6861f,0x18a350e8,0x55d2cd20,
  91631. 0x92dc286f,0x861bf3e5,0x6226aba7,0x9ab18ffa,0xa9857b03,0xd15827be },
  91632. { 0x92e6acef,0x26c1f547,0xac1fbac3,0x422c63c8,0xfcbfd71d,0xa2d8760d,
  91633. 0xb2511224,0x35f6a539,0x048d1a21,0xbaa88fa1,0xebf999db,0x49f1abe9 } },
  91634. /* 107 */
  91635. { { 0xf7492b73,0x16f9f4f4,0xcb392b1a,0xcf28ec1e,0x69ca6ffc,0x45b130d4,
  91636. 0xb72efa58,0x28ba8d40,0x5ca066f5,0xace987c7,0x4ad022eb,0x3e399246 },
  91637. { 0x752555bb,0x63a2d84e,0x9c2ae394,0xaaa93b4a,0xc89539ca,0xcd80424e,
  91638. 0xaa119a99,0x6d6b5a6d,0x379f2629,0xbd50334c,0xef3cc7d3,0x899e925e } },
  91639. /* 108 */
  91640. { { 0xbf825dc4,0xb7ff3651,0x40b9c462,0x0f741cc4,0x5cc4fb5b,0x771ff5a9,
  91641. 0x47fd56fe,0xcb9e9c9b,0x5626c0d3,0xbdf053db,0xf7e14098,0xa97ce675 },
  91642. { 0x6c934f5e,0x68afe5a3,0xccefc46f,0x6cd5e148,0xd7a88586,0xc7758570,
  91643. 0xdd558d40,0x49978f5e,0x64ae00c1,0xa1d5088a,0xf1d65bb2,0x58f2a720 } },
  91644. /* 109 */
  91645. { { 0x3e4daedb,0x66fdda4a,0x65d1b052,0x38318c12,0x4c4bbf5c,0x28d910a2,
  91646. 0x78a9cd14,0x762fe5c4,0xd2cc0aee,0x08e5ebaa,0xca0c654c,0xd2cdf257 },
  91647. { 0x08b717d2,0x48f7c58b,0x386cd07a,0x3807184a,0xae7d0112,0x3240f626,
  91648. 0xc43917b0,0x03e9361b,0x20aea018,0xf261a876,0x7e1e6372,0x53f556a4 } },
  91649. /* 110 */
  91650. { { 0x2f512a90,0xc84cee56,0x1b0ea9f1,0x24b3c004,0xe26cc1ea,0x0ee15d2d,
  91651. 0xf0c9ef7d,0xd848762c,0xd5341435,0x1026e9c5,0xfdb16b31,0x8f5b73dc },
  91652. { 0xd2c75d95,0x1f69bef2,0xbe064dda,0x8d33d581,0x57ed35e6,0x8c024c12,
  91653. 0xc309c281,0xf8d435f9,0xd6960193,0xfd295061,0xe9e49541,0x66618d78 } },
  91654. /* 111 */
  91655. { { 0x8ce382de,0x571cfd45,0xde900dde,0x175806ee,0x34aba3b5,0x61849965,
  91656. 0xde7aec95,0xe899778a,0xff4aa97f,0xe8f00f6e,0x010b0c6d,0xae971cb5 },
  91657. { 0x3af788f1,0x1827eebc,0xe413fe2d,0xd46229ff,0x4741c9b4,0x8a15455b,
  91658. 0xf8e424eb,0x5f02e690,0xdae87712,0x40a1202e,0x64944f6d,0x49b3bda2 } },
  91659. /* 112 */
  91660. { { 0x035b2d69,0xd63c6067,0x6bed91b0,0xb507150d,0x7afb39b2,0x1f35f82f,
  91661. 0x16012b66,0xb9bd9c01,0xed0a5f50,0x00d97960,0x2716f7c9,0xed705451 },
  91662. { 0x127abdb4,0x1576eff4,0xf01e701c,0x6850d698,0x3fc87e2f,0x9fa7d749,
  91663. 0xb0ce3e48,0x0b6bcc6f,0xf7d8c1c0,0xf4fbe1f5,0x02719cc6,0xcf75230e } },
  91664. /* 113 */
  91665. { { 0x722d94ed,0x6761d6c2,0x3718820e,0xd1ec3f21,0x25d0e7c6,0x65a40b70,
  91666. 0xbaf3cf31,0xd67f830e,0xb93ea430,0x633b3807,0x0bc96c69,0x17faa0ea },
  91667. { 0xdf866b98,0xe6bf3482,0xa9db52d4,0x205c1ee9,0xff9ab869,0x51ef9bbd,
  91668. 0x75eeb985,0x3863dad1,0xd3cf442a,0xef216c3b,0xf9c8e321,0x3fb228e3 } },
  91669. /* 114 */
  91670. { { 0x0760ac07,0x94f9b70c,0x9d79bf4d,0xf3c9ccae,0xc5ffc83d,0x73cea084,
  91671. 0xdc49c38e,0xef50f943,0xbc9e7330,0xf467a2ae,0x44ea7fba,0x5ee534b6 },
  91672. { 0x03609e7f,0x20cb6272,0x62fdc9f0,0x09844355,0x0f1457f7,0xaf5c8e58,
  91673. 0xb4b25941,0xd1f50a6c,0x2ec82395,0x77cb247c,0xda3dca33,0xa5f3e1e5 } },
  91674. /* 115 */
  91675. { { 0x7d85fa94,0x023489d6,0x2db9ce47,0x0ba40537,0xaed7aad1,0x0fdf7a1f,
  91676. 0x9a4ccb40,0xa57b0d73,0x5b18967c,0x48fcec99,0xb7274d24,0xf30b5b6e },
  91677. { 0xc81c5338,0x7ccb4773,0xa3ed6bd0,0xb85639e6,0x1d56eada,0x7d9df95f,
  91678. 0x0a1607ad,0xe256d57f,0x957574d6,0x6da7ffdc,0x01c7a8c4,0x65f84046 } },
  91679. /* 116 */
  91680. { { 0xcba1e7f1,0x8d45d0cb,0x02b55f64,0xef0a08c0,0x17e19892,0x771ca31b,
  91681. 0x4885907e,0xe1843ecb,0x364ce16a,0x67797ebc,0x8df4b338,0x816d2b2d },
  91682. { 0x39aa8671,0xe870b0e5,0xc102b5f5,0x9f0db3e4,0x1720c697,0x34296659,
  91683. 0x613c0d2a,0x0ad4c89e,0x418ddd61,0x1af900b2,0xd336e20e,0xe087ca72 } },
  91684. /* 117 */
  91685. { { 0xaba10079,0x222831ff,0x6d64fff2,0x0dc5f87b,0x3e8cb330,0x44547907,
  91686. 0x702a33fb,0xe815aaa2,0x5fba3215,0x338d6b2e,0x79f549c8,0x0f7535cb },
  91687. { 0x2ee95923,0x471ecd97,0xc6d1c09f,0x1e868b37,0xc666ef4e,0x2bc7b8ec,
  91688. 0x808a4bfc,0xf5416589,0x3fbc4d2e,0xf23e9ee2,0x2d75125b,0x4357236c } },
  91689. /* 118 */
  91690. { { 0xba9cdb1b,0xfe176d95,0x2f82791e,0x45a1ca01,0x4de4cca2,0x97654af2,
  91691. 0x5cc4bcb9,0xbdbf9d0e,0xad97ac0a,0xf6a7df50,0x61359fd6,0xc52112b0 },
  91692. { 0x4f05eae3,0x696d9ce3,0xe943ac2b,0x903adc02,0x0848be17,0xa9075347,
  91693. 0x2a3973e5,0x1e20f170,0x6feb67e9,0xe1aacc1c,0xe16bc6b9,0x2ca0ac32 } },
  91694. /* 119 */
  91695. { { 0xef871eb5,0xffea12e4,0xa8bf0a7a,0x94c2f25d,0x78134eaa,0x4d1e4c2a,
  91696. 0x0360fb10,0x11ed16fb,0x85fc11be,0x4029b6db,0xf4d390fa,0x5e9f7ab7 },
  91697. { 0x30646612,0x5076d72f,0xdda1d0d8,0xa0afed1d,0x85a1d103,0x29022257,
  91698. 0x4e276bcd,0xcb499e17,0x51246c3d,0x16d1da71,0x589a0443,0xc72d56d3 } },
  91699. /* 120 */
  91700. { { 0xdae5bb45,0xdf5ffc74,0x261bd6dc,0x99068c4a,0xaa98ec7b,0xdc0afa7a,
  91701. 0xf121e96d,0xedd2ee00,0x1414045c,0x163cc7be,0x335af50e,0xb0b1bbce },
  91702. { 0x01a06293,0xd440d785,0x6552e644,0xcdebab7c,0x8c757e46,0x48cb8dbc,
  91703. 0x3cabe3cb,0x81f9cf78,0xb123f59a,0xddd02611,0xeeb3784d,0x3dc7b88e } },
  91704. /* 121 */
  91705. { { 0xc4741456,0xe1b8d398,0x6032a121,0xa9dfa902,0x1263245b,0x1cbfc86d,
  91706. 0x5244718c,0xf411c762,0x05b0fc54,0x96521d54,0xdbaa4985,0x1afab46e },
  91707. { 0x8674b4ad,0xa75902ba,0x5ad87d12,0x486b43ad,0x36e0d099,0x72b1c736,
  91708. 0xbb6cd6d6,0x39890e07,0x59bace4e,0x8128999c,0x7b535e33,0xd8da430b } },
  91709. /* 122 */
  91710. { { 0xc6b75791,0x39f65642,0x21806bfb,0x050947a6,0x1362ef84,0x0ca3e370,
  91711. 0x8c3d2391,0x9bc60aed,0x732e1ddc,0x9b488671,0xa98ee077,0x12d10d9e },
  91712. { 0x3651b7dc,0xb6f2822d,0x80abd138,0x6345a5ba,0x472d3c84,0x62033262,
  91713. 0xacc57527,0xd54a1d40,0x424447cb,0x6ea46b3a,0x2fb1a496,0x5bc41057 } },
  91714. /* 123 */
  91715. { { 0xa751cd0e,0xe70c57a3,0xeba3c7d6,0x190d8419,0x9d47d55a,0xb1c3bee7,
  91716. 0xf912c6d8,0xda941266,0x407a6ad6,0x12e9aacc,0x6e838911,0xd6ce5f11 },
  91717. { 0x70e1f2ce,0x063ca97b,0x8213d434,0xa3e47c72,0x84df810a,0xa016e241,
  91718. 0xdfd881a4,0x688ad7b0,0xa89bf0ad,0xa37d99fc,0xa23c2d23,0xd8e3f339 } },
  91719. /* 124 */
  91720. { { 0x750bed6f,0xbdf53163,0x83e68b0a,0x808abc32,0x5bb08a33,0x85a36627,
  91721. 0x6b0e4abe,0xf72a3a0f,0xfaf0c6ad,0xf7716d19,0x5379b25f,0x22dcc020 },
  91722. { 0xf9a56e11,0x7400bf8d,0x56a47f21,0x6cb8bad7,0x7a6eb644,0x7c97176f,
  91723. 0xd1f5b646,0xe8fd84f7,0x44ddb054,0x98320a94,0x1dde86f5,0x07071ba3 } },
  91724. /* 125 */
  91725. { { 0x98f8fcb9,0x6fdfa0e5,0x94d0d70c,0x89cec8e0,0x106d20a8,0xa0899397,
  91726. 0xba8acc9c,0x915bfb9a,0x5507e01c,0x1370c94b,0x8a821ffb,0x83246a60 },
  91727. { 0xbe3c378f,0xa8273a9f,0x35a25be9,0x7e544789,0x4dd929d7,0x6cfa4972,
  91728. 0x365bd878,0x987fed9d,0x5c29a7ae,0x4982ac94,0x5ddd7ec5,0x4589a5d7 } },
  91729. /* 126 */
  91730. { { 0xa95540a9,0x9fabb174,0x0162c5b0,0x7cfb886f,0xea3dee18,0x17be766b,
  91731. 0xe88e624c,0xff7da41f,0x8b919c38,0xad0b71eb,0xf31ff9a9,0x86a522e0 },
  91732. { 0x868bc259,0xbc8e6f72,0x3ccef9e4,0x6130c638,0x9a466555,0x09f1f454,
  91733. 0x19b2bfb4,0x8e6c0f09,0x0ca7bb22,0x945c46c9,0x4dafb67b,0xacd87168 } },
  91734. /* 127 */
  91735. { { 0x10c53841,0x090c72ca,0x55a4fced,0xc20ae01b,0xe10234ad,0x03f7ebd5,
  91736. 0x85892064,0xb3f42a6a,0xb4a14722,0xbdbc30c0,0x8ca124cc,0x971bc437 },
  91737. { 0x517ff2ff,0x6f79f46d,0xecba947b,0x6a9c96e2,0x62925122,0x5e79f2f4,
  91738. 0x6a4e91f1,0x30a96bb1,0x2d4c72da,0x1147c923,0x5811e4df,0x65bc311f } },
  91739. /* 128 */
  91740. { { 0x139b3239,0x87c7dd7d,0x4d833bae,0x8b57824e,0x9fff0015,0xbcbc4878,
  91741. 0x909eaf1a,0x8ffcef8b,0xf1443a78,0x9905f4ee,0xe15cbfed,0x020dd4a2 },
  91742. { 0xa306d695,0xca2969ec,0xb93caf60,0xdf940cad,0x87ea6e39,0x67f7fab7,
  91743. 0xf98c4fe5,0x0d0ee10f,0xc19cb91e,0xc646879a,0x7d1d7ab4,0x4b4ea50c } },
  91744. /* 129 */
  91745. { { 0x7a0db57e,0x19e40945,0x9a8c9702,0xe6017cad,0x1be5cff9,0xdbf739e5,
  91746. 0xa7a938a2,0x3646b3cd,0x68350dfc,0x04511085,0x56e098b5,0xad3bd6f3 },
  91747. { 0xee2e3e3e,0x935ebabf,0x473926cb,0xfbd01702,0x9e9fb5aa,0x7c735b02,
  91748. 0x2e3feff0,0xc52a1b85,0x046b405a,0x9199abd3,0x39039971,0xe306fcec } },
  91749. /* 130 */
  91750. { { 0x23e4712c,0xd6d9aec8,0xc3c198ee,0x7ca8376c,0x31bebd8a,0xe6d83187,
  91751. 0xd88bfef3,0xed57aff3,0xcf44edc7,0x72a645ee,0x5cbb1517,0xd4e63d0b },
  91752. { 0xceee0ecf,0x98ce7a1c,0x5383ee8e,0x8f012633,0xa6b455e8,0x3b879078,
  91753. 0xc7658c06,0xcbcd3d96,0x0783336a,0x721d6fe7,0x5a677136,0xf21a7263 } },
  91754. /* 131 */
  91755. { { 0x9586ba11,0x19d8b3cd,0x8a5c0480,0xd9e0aeb2,0x2230ef5c,0xe4261dbf,
  91756. 0x02e6bf09,0x095a9dee,0x80dc7784,0x8963723c,0x145157b1,0x5c97dbaf },
  91757. { 0x4bc4503e,0x97e74434,0x85a6b370,0x0fb1cb31,0xcd205d4b,0x3e8df2be,
  91758. 0xf8f765da,0x497dd1bc,0x6c988a1a,0x92ef95c7,0x64dc4cfa,0x3f924baa } },
  91759. /* 132 */
  91760. { { 0x7268b448,0x6bf1b8dd,0xefd79b94,0xd4c28ba1,0xe4e3551f,0x2fa1f8c8,
  91761. 0x5c9187a9,0x769e3ad4,0x40326c0d,0x28843b4d,0x50d5d669,0xfefc8094 },
  91762. { 0x90339366,0x30c85bfd,0x5ccf6c3a,0x4eeb56f1,0x28ccd1dc,0x0e72b149,
  91763. 0xf2ce978e,0x73ee85b5,0x3165bb23,0xcdeb2bf3,0x4e410abf,0x8106c923 } },
  91764. /* 133 */
  91765. { { 0x7d02f4ee,0xc8df0161,0x18e21225,0x8a781547,0x6acf9e40,0x4ea895eb,
  91766. 0x6e5a633d,0x8b000cb5,0x7e981ffb,0xf31d86d5,0x4475bc32,0xf5c8029c },
  91767. { 0x1b568973,0x764561ce,0xa62996ec,0x2f809b81,0xda085408,0x9e513d64,
  91768. 0xe61ce309,0xc27d815d,0x272999e0,0x0da6ff99,0xfead73f7,0xbd284779 } },
  91769. /* 134 */
  91770. { { 0x9b1cdf2b,0x6033c2f9,0xbc5fa151,0x2a99cf06,0x12177b3b,0x7d27d259,
  91771. 0xc4485483,0xb1f15273,0x102e2297,0x5fd57d81,0xc7f6acb7,0x3d43e017 },
  91772. { 0x3a70eb28,0x41a8bb0b,0x3e80b06b,0x67de2d8e,0x70c28de5,0x09245a41,
  91773. 0xa7b26023,0xad7dbcb1,0x2cbc6c1e,0x70b08a35,0x9b33041f,0xb504fb66 } },
  91774. /* 135 */
  91775. { { 0xf97a27c2,0xa8e85ab5,0xc10a011b,0x6ac5ec8b,0xffbcf161,0x55745533,
  91776. 0x65790a60,0x01780e85,0x99ee75b0,0xe451bf85,0x39c29881,0x8907a63b },
  91777. { 0x260189ed,0x76d46738,0x47bd35cb,0x284a4436,0x20cab61e,0xd74e8c40,
  91778. 0x416cf20a,0x6264bf8c,0x5fd820ce,0xfa5a6c95,0xf24bb5fc,0xfa7154d0 } },
  91779. /* 136 */
  91780. { { 0x9b3f5034,0x18482cec,0xcd9e68fd,0x962d445a,0x95746f23,0x266fb1d6,
  91781. 0x58c94a4b,0xc66ade5a,0xed68a5b6,0xdbbda826,0x7ab0d6ae,0x05664a4d },
  91782. { 0x025e32fc,0xbcd4fe51,0xa96df252,0x61a5aebf,0x31592a31,0xd88a07e2,
  91783. 0x98905517,0x5d9d94de,0x5fd440e7,0x96bb4010,0xe807db4c,0x1b0c47a2 } },
  91784. /* 137 */
  91785. { { 0x08223878,0x5c2a6ac8,0xe65a5558,0xba08c269,0x9bbc27fd,0xd22b1b9b,
  91786. 0x72b9607d,0x919171bf,0xe588dc58,0x9ab455f9,0x23662d93,0x6d54916e },
  91787. { 0x3b1de0c1,0x8da8e938,0x804f278f,0xa84d186a,0xd3461695,0xbf4988cc,
  91788. 0xe10eb0cb,0xf5eae3be,0xbf2a66ed,0x1ff8b68f,0xc305b570,0xa68daf67 } },
  91789. /* 138 */
  91790. { { 0x44b2e045,0xc1004cff,0x4b1c05d4,0x91b5e136,0x88a48a07,0x53ae4090,
  91791. 0xea11bb1a,0x73fb2995,0x3d93a4ea,0x32048570,0x3bfc8a5f,0xcce45de8 },
  91792. { 0xc2b3106e,0xaff4a97e,0xb6848b4f,0x9069c630,0xed76241c,0xeda837a6,
  91793. 0x6cc3f6cf,0x8a0daf13,0x3da018a8,0x199d049d,0xd9093ba3,0xf867c6b1 } },
  91794. /* 139 */
  91795. { { 0x56527296,0xe4d42a56,0xce71178d,0xae26c73d,0x6c251664,0x70a0adac,
  91796. 0x5dc0ae1d,0x813483ae,0xdaab2daf,0x7574eacd,0xc2d55f4f,0xc56b52dc },
  91797. { 0x95f32923,0x872bc167,0x5bdd2a89,0x4be17581,0xa7699f00,0x9b57f1e7,
  91798. 0x3ac2de02,0x5fcd9c72,0x92377739,0x83af3ba1,0xfc50b97f,0xa64d4e2b } },
  91799. /* 140 */
  91800. { { 0x0e552b40,0x2172dae2,0xd34d52e8,0x62f49725,0x07958f98,0x7930ee40,
  91801. 0x751fdd74,0x56da2a90,0xf53e48c3,0xf1192834,0x8e53c343,0x34d2ac26 },
  91802. { 0x13111286,0x1073c218,0xda9d9827,0x201dac14,0xee95d378,0xec2c29db,
  91803. 0x1f3ee0b1,0x9316f119,0x544ce71c,0x7890c9f0,0x27612127,0xd77138af } },
  91804. /* 141 */
  91805. { { 0x3b4ad1cd,0x78045e6d,0x4aa49bc1,0xcd86b94e,0xfd677a16,0x57e51f1d,
  91806. 0xfa613697,0xd9290935,0x34f4d893,0x7a3f9593,0x5d5fcf9b,0x8c9c248b },
  91807. { 0x6f70d4e9,0x9f23a482,0x63190ae9,0x17273454,0x5b081a48,0x4bdd7c13,
  91808. 0x28d65271,0x1e2de389,0xe5841d1f,0x0bbaaa25,0x746772e5,0xc4c18a79 } },
  91809. /* 142 */
  91810. { { 0x593375ac,0x10ee2681,0x7dd5e113,0x4f3288be,0x240f3538,0x9a97b2fb,
  91811. 0x1de6b1e2,0xfa11089f,0x1351bc58,0x516da562,0x2dfa85b5,0x573b6119 },
  91812. { 0x6cba7df5,0x89e96683,0x8c28ab40,0xf299be15,0xad43fcbf,0xe91c9348,
  91813. 0x9a1cefb3,0xe9bbc7cc,0x738b2775,0xc8add876,0x775eaa01,0x6e3b1f2e } },
  91814. /* 143 */
  91815. { { 0xb677788b,0x0365a888,0x3fd6173c,0x634ae8c4,0x9e498dbe,0x30498761,
  91816. 0xc8f779ab,0x08c43e6d,0x4c09aca9,0x068ae384,0x2018d170,0x2380c70b },
  91817. { 0xa297c5ec,0xcf77fbc3,0xca457948,0xdacbc853,0x336bec7e,0x3690de04,
  91818. 0x14eec461,0x26bbac64,0x1f713abf,0xd1c23c7e,0xe6fd569e,0xf08bbfcd } },
  91819. /* 144 */
  91820. { { 0x84770ee3,0x5f8163f4,0x744a1706,0x0e0c7f94,0xe1b2d46d,0x9c8f05f7,
  91821. 0xd01fd99a,0x417eafe7,0x11440e5b,0x2ba15df5,0x91a6fbcf,0xdc5c552a },
  91822. { 0xa270f721,0x86271d74,0xa004485b,0x32c0a075,0x8defa075,0x9d1a87e3,
  91823. 0xbf0d20fe,0xb590a7ac,0x8feda1f5,0x430c41c2,0x58f6ec24,0x454d2879 } },
  91824. /* 145 */
  91825. { { 0x7c525435,0x52b7a635,0x37c4bdbc,0x3d9ef57f,0xdffcc475,0x2bb93e9e,
  91826. 0x7710f3be,0xf7b8ba98,0x21b727de,0x42ee86da,0x2e490d01,0x55ac3f19 },
  91827. { 0xc0c1c390,0x487e3a6e,0x446cde7b,0x036fb345,0x496ae951,0x089eb276,
  91828. 0x71ed1234,0xedfed4d9,0x900f0b46,0x661b0dd5,0x8582f0d3,0x11bd6f1b } },
  91829. /* 146 */
  91830. { { 0x076bc9d1,0x5cf9350f,0xcf3cd2c3,0x15d903be,0x25af031c,0x21cfc8c2,
  91831. 0x8b1cc657,0xe0ad3248,0x70014e87,0xdd9fb963,0x297f1658,0xf0f3a5a1 },
  91832. { 0xf1f703aa,0xbb908fba,0x2f6760ba,0x2f9cc420,0x66a38b51,0x00ceec66,
  91833. 0x05d645da,0x4deda330,0xf7de3394,0xb9cf5c72,0x1ad4c906,0xaeef6502 } },
  91834. /* 147 */
  91835. { { 0x7a19045d,0x0583c8b1,0xd052824c,0xae7c3102,0xff6cfa58,0x2a234979,
  91836. 0x62c733c0,0xfe9dffc9,0x9c0c4b09,0x3a7fa250,0x4fe21805,0x516437bb },
  91837. { 0xc2a23ddb,0x9454e3d5,0x289c104e,0x0726d887,0x4fd15243,0x8977d918,
  91838. 0x6d7790ba,0xc559e73f,0x465af85f,0x8fd3e87d,0x5feee46b,0xa2615c74 } },
  91839. /* 148 */
  91840. { { 0x4335167d,0xc8d607a8,0xe0f5c887,0x8b42d804,0x398d11f9,0x5f9f13df,
  91841. 0x20740c67,0x5aaa5087,0xa3d9234b,0x83da9a6a,0x2a54bad1,0xbd3a5c4e },
  91842. { 0x2db0f658,0xdd13914c,0x5a3f373a,0x29dcb66e,0x5245a72b,0xbfd62df5,
  91843. 0x91e40847,0x19d18023,0xb136b1ae,0xd9df74db,0x3f93bc5b,0x72a06b6b } },
  91844. /* 149 */
  91845. { { 0xad19d96f,0x6da19ec3,0xfb2a4099,0xb342daa4,0x662271ea,0x0e61633a,
  91846. 0xce8c054b,0x3bcece81,0x8bd62dc6,0x7cc8e061,0xee578d8b,0xae189e19 },
  91847. { 0xdced1eed,0x73e7a25d,0x7875d3ab,0xc1257f0a,0x1cfef026,0x2cb2d5a2,
  91848. 0xb1fdf61c,0xd98ef39b,0x24e83e6c,0xcd8e6f69,0xc7b7088b,0xd71e7076 } },
  91849. /* 150 */
  91850. { { 0x9d4245bf,0x33936830,0x2ac2953b,0x22d96217,0x56c3c3cd,0xb3bf5a82,
  91851. 0x0d0699e8,0x50c9be91,0x8f366459,0xec094463,0x513b7c35,0x6c056dba },
  91852. { 0x045ab0e3,0x687a6a83,0x445c9295,0x8d40b57f,0xa16f5954,0x0f345048,
  91853. 0x3d8f0a87,0x64b5c639,0x9f71c5e2,0x106353a2,0x874f0dd4,0xdd58b475 } },
  91854. /* 151 */
  91855. { { 0x62230c72,0x67ec084f,0x481385e3,0xf14f6cca,0x4cda7774,0xf58bb407,
  91856. 0xaa2dbb6b,0xe15011b1,0x0c035ab1,0xd488369d,0x8245f2fd,0xef83c24a },
  91857. { 0x9fdc2538,0xfb57328f,0x191fe46a,0x79808293,0x32ede548,0xe28f5c44,
  91858. 0xea1a022c,0x1b3cda99,0x3df2ec7f,0x39e639b7,0x760e9a18,0x77b6272b } },
  91859. /* 152 */
  91860. { { 0xa65d56d5,0x2b1d51bd,0x7ea696e0,0x3a9b71f9,0x9904f4c4,0x95250ecc,
  91861. 0xe75774b7,0x8bc4d6eb,0xeaeeb9aa,0x0e343f8a,0x930e04cb,0xc473c1d1 },
  91862. { 0x064cd8ae,0x282321b1,0x5562221c,0xf4b4371e,0xd1bf1221,0xc1cc81ec,
  91863. 0xe2c8082f,0xa52a07a9,0xba64a958,0x350d8e59,0x6fb32c9a,0x29e4f3de } },
  91864. /* 153 */
  91865. { { 0xba89aaa5,0x0aa9d56c,0xc4c6059e,0xf0208ac0,0xbd6ddca4,0x7400d9c6,
  91866. 0xf2c2f74a,0xb384e475,0xb1562dd3,0x4c1061fc,0x2e153b8d,0x3924e248 },
  91867. { 0x849808ab,0xf38b8d98,0xa491aa36,0x29bf3260,0x88220ede,0x85159ada,
  91868. 0xbe5bc422,0x8b47915b,0xd7300967,0xa934d72e,0x2e515d0d,0xc4f30398 } },
  91869. /* 154 */
  91870. { { 0x1b1de38b,0xe3e9ee42,0x42636760,0xa124e25a,0x90165b1a,0x90bf73c0,
  91871. 0x146434c5,0x21802a34,0x2e1fa109,0x54aa83f2,0xed9c51e9,0x1d4bd03c },
  91872. { 0x798751e6,0xc2d96a38,0x8c3507f5,0xed27235f,0xc8c24f88,0xb5fb80e2,
  91873. 0xd37f4f78,0xf873eefa,0xf224ba96,0x7229fd74,0x9edd7149,0x9dcd9199 } },
  91874. /* 155 */
  91875. { { 0x4e94f22a,0xee9f81a6,0xf71ec341,0xe5609892,0xa998284e,0x6c818ddd,
  91876. 0x3b54b098,0x9fd47295,0x0e8a7cc9,0x47a6ac03,0xb207a382,0xde684e5e },
  91877. { 0x2b6b956b,0x4bdd1ecd,0xf01b3583,0x09084414,0x55233b14,0xe2f80b32,
  91878. 0xef5ebc5e,0x5a0fec54,0xbf8b29a2,0x74cf25e6,0x7f29e014,0x1c757fa0 } },
  91879. /* 156 */
  91880. { { 0xeb0fdfe4,0x1bcb5c4a,0xf0899367,0xd7c649b3,0x05bc083b,0xaef68e3f,
  91881. 0xa78aa607,0x57a06e46,0x21223a44,0xa2136ecc,0x52f5a50b,0x89bd6484 },
  91882. { 0x4455f15a,0x724411b9,0x08a9c0fd,0x23dfa970,0x6db63bef,0x7b0da4d1,
  91883. 0xfb162443,0x6f8a7ec1,0xe98284fb,0xc1ac9cee,0x33566022,0x085a582b } },
  91884. /* 157 */
  91885. { { 0xec1f138a,0x15cb61f9,0x668f0c28,0x11c9a230,0xdf93f38f,0xac829729,
  91886. 0x4048848d,0xcef25698,0x2bba8fbf,0x3f686da0,0x111c619a,0xed5fea78 },
  91887. { 0xd6d1c833,0x9b4f73bc,0x86e7bf80,0x50951606,0x042b1d51,0xa2a73508,
  91888. 0x5fb89ec2,0x9ef6ea49,0x5ef8b892,0xf1008ce9,0x9ae8568b,0x78a7e684 } },
  91889. /* 158 */
  91890. { { 0x10470cd8,0x3fe83a7c,0xf86df000,0x92734682,0xda9409b5,0xb5dac06b,
  91891. 0x94939c5f,0x1e7a9660,0x5cc116dc,0xdec6c150,0x66bac8cc,0x1a52b408 },
  91892. { 0x6e864045,0x5303a365,0x9139efc1,0x45eae72a,0x6f31d54f,0x83bec646,
  91893. 0x6e958a6d,0x2fb4a86f,0x4ff44030,0x6760718e,0xe91ae0df,0x008117e3 } },
  91894. /* 159 */
  91895. { { 0x384310a2,0x5d5833ba,0x1fd6c9fc,0xbdfb4edc,0x849c4fb8,0xb9a4f102,
  91896. 0x581c1e1f,0xe5fb239a,0xd0a9746d,0xba44b2e7,0x3bd942b9,0x78f7b768 },
  91897. { 0xc87607ae,0x076c8ca1,0xd5caaa7e,0x82b23c2e,0x2763e461,0x6a581f39,
  91898. 0x3886df11,0xca8a5e4a,0x264e7f22,0xc87e90cf,0x215cfcfc,0x04f74870 } },
  91899. /* 160 */
  91900. { { 0x141d161c,0x5285d116,0x93c4ed17,0x67cd2e0e,0x7c36187e,0x12c62a64,
  91901. 0xed2584ca,0xf5329539,0x42fbbd69,0xc4c777c4,0x1bdfc50a,0x107de776 },
  91902. { 0xe96beebd,0x9976dcc5,0xa865a151,0xbe2aff95,0x9d8872af,0x0e0a9da1,
  91903. 0xa63c17cc,0x5e357a3d,0xe15cc67c,0xd31fdfd8,0x7970c6d8,0xc44bbefd } },
  91904. /* 161 */
  91905. { { 0x4c0c62f1,0x703f83e2,0x4e195572,0x9b1e28ee,0xfe26cced,0x6a82858b,
  91906. 0xc43638fa,0xd381c84b,0xa5ba43d8,0x94f72867,0x10b82743,0x3b4a783d },
  91907. { 0x7576451e,0xee1ad7b5,0x14b6b5c8,0xc3d0b597,0xfcacc1b8,0x3dc30954,
  91908. 0x472c9d7b,0x55df110e,0x02f8a328,0x97c86ed7,0x88dc098f,0xd0433413 } },
  91909. /* 162 */
  91910. { { 0x2ca8f2fe,0x1a60d152,0x491bd41f,0x61640948,0x58dfe035,0x6dae29a5,
  91911. 0x278e4863,0x9a615bea,0x9ad7c8e5,0xbbdb4477,0x2ceac2fc,0x1c706630 },
  91912. { 0x99699b4b,0x5e2b54c6,0x239e17e8,0xb509ca6d,0xea063a82,0x728165fe,
  91913. 0xb6a22e02,0x6b5e609d,0xb26ee1df,0x12813905,0x439491fa,0x07b9f722 } },
  91914. /* 163 */
  91915. { { 0x48ff4e49,0x1592ec14,0x6d644129,0x3e4e9f17,0x1156acc0,0x7acf8288,
  91916. 0xbb092b0b,0x5aa34ba8,0x7d38393d,0xcd0f9022,0xea4f8187,0x416724dd },
  91917. { 0xc0139e73,0x3c4e641c,0x91e4d87d,0xe0fe46cf,0xcab61f8a,0xedb3c792,
  91918. 0xd3868753,0x4cb46de4,0x20f1098a,0xe449c21d,0xf5b8ea6e,0x5e5fd059 } },
  91919. /* 164 */
  91920. { { 0x75856031,0x7fcadd46,0xeaf2fbd0,0x89c7a4cd,0x7a87c480,0x1af523ce,
  91921. 0x61d9ae90,0xe5fc1095,0xbcdb95f5,0x3fb5864f,0xbb5b2c7d,0xbeb5188e },
  91922. { 0x3ae65825,0x3d1563c3,0x0e57d641,0x116854c4,0x1942ebd3,0x11f73d34,
  91923. 0xc06955b3,0x24dc5904,0x995a0a62,0x8a0d4c83,0x5d577b7d,0xfb26b86d } },
  91924. /* 165 */
  91925. { { 0xc686ae17,0xc53108e7,0xd1c1da56,0x9090d739,0x9aec50ae,0x4583b013,
  91926. 0xa49a6ab2,0xdd9a088b,0xf382f850,0x28192eea,0xf5fe910e,0xcc8df756 },
  91927. { 0x9cab7630,0x877823a3,0xfb8e7fc1,0x64984a9a,0x364bfc16,0x5448ef9c,
  91928. 0xc44e2a9a,0xbbb4f871,0x435c95e9,0x901a41ab,0xaaa50a06,0xc6c23e5f } },
  91929. /* 166 */
  91930. { { 0x9034d8dd,0xb78016c1,0x0b13e79b,0x856bb44b,0xb3241a05,0x85c6409a,
  91931. 0x2d78ed21,0x8d2fe19a,0x726eddf2,0xdcc7c26d,0x25104f04,0x3ccaff5f },
  91932. { 0x6b21f843,0x397d7edc,0xe975de4c,0xda88e4dd,0x4f5ab69e,0x5273d396,
  91933. 0x9aae6cc0,0x537680e3,0x3e6f9461,0xf749cce5,0x957bffd3,0x021ddbd9 } },
  91934. /* 167 */
  91935. { { 0x777233cf,0x7b64585f,0x0942a6f0,0xfe6771f6,0xdfe6eef0,0x636aba7a,
  91936. 0x86038029,0x63bbeb56,0xde8fcf36,0xacee5842,0xd4a20524,0x48d9aa99 },
  91937. { 0x0da5e57a,0xcff7a74c,0xe549d6c9,0xc232593c,0xf0f2287b,0x68504bcc,
  91938. 0xbc8360b5,0x6d7d098d,0x5b402f41,0xeac5f149,0xb87d1bf1,0x61936f11 } },
  91939. /* 168 */
  91940. { { 0xb8153a9d,0xaa9da167,0x9e83ecf0,0xa49fe3ac,0x1b661384,0x14c18f8e,
  91941. 0x38434de1,0x61c24dab,0x283dae96,0x3d973c3a,0x82754fc9,0xc99baa01 },
  91942. { 0x4c26b1e3,0x477d198f,0xa7516202,0x12e8e186,0x362addfa,0x386e52f6,
  91943. 0xc3962853,0x31e8f695,0x6aaedb60,0xdec2af13,0x29cf74ac,0xfcfdb4c6 } },
  91944. /* 169 */
  91945. { { 0xcca40298,0x6b3ee958,0xf2f5d195,0xc3878153,0xed2eae5b,0x0c565630,
  91946. 0x3a697cf2,0xd089b37e,0xad5029ea,0xc2ed2ac7,0x0f0dda6a,0x7e5cdfad },
  91947. { 0xd9b86202,0xf98426df,0x4335e054,0xed1960b1,0x3f14639e,0x1fdb0246,
  91948. 0x0db6c670,0x17f709c3,0x773421e1,0xbfc687ae,0x26c1a8ac,0x13fefc4a } },
  91949. /* 170 */
  91950. { { 0x7ffa0a5f,0xe361a198,0xc63fe109,0xf4b26102,0x6c74e111,0x264acbc5,
  91951. 0x77abebaf,0x4af445fa,0x24cddb75,0x448c4fdd,0x44506eea,0x0b13157d },
  91952. { 0x72e9993d,0x22a6b159,0x85e5ecbe,0x2c3c57e4,0xfd83e1a1,0xa673560b,
  91953. 0xc3b8c83b,0x6be23f82,0x40bbe38e,0x40b13a96,0xad17399b,0x66eea033 } },
  91954. /* 171 */
  91955. { { 0xb4c6c693,0x49fc6e95,0x36af7d38,0xefc735de,0x35fe42fc,0xe053343d,
  91956. 0x6a9ab7c3,0xf0aa427c,0x4a0fcb24,0xc79f0436,0x93ebbc50,0x16287243 },
  91957. { 0x16927e1e,0x5c3d6bd0,0x673b984c,0x40158ed2,0x4cd48b9a,0xa7f86fc8,
  91958. 0x60ea282d,0x1643eda6,0xe2a1beed,0x45b393ea,0x19571a94,0x664c839e } },
  91959. /* 172 */
  91960. { { 0x27eeaf94,0x57745750,0xea99e1e7,0x2875c925,0x5086adea,0xc127e7ba,
  91961. 0x86fe424f,0x765252a0,0x2b6c0281,0x1143cc6c,0xd671312d,0xc9bb2989 },
  91962. { 0x51acb0a5,0x880c337c,0xd3c60f78,0xa3710915,0x9262b6ed,0x496113c0,
  91963. 0x9ce48182,0x5d25d9f8,0xb3813586,0x53b6ad72,0x4c0e159c,0x0ea3bebc } },
  91964. /* 173 */
  91965. { { 0xc5e49bea,0xcaba450a,0x7c05da59,0x684e5415,0xde7ac36c,0xa2e9cab9,
  91966. 0x2e6f957b,0x4ca79b5f,0x09b817b1,0xef7b0247,0x7d89df0f,0xeb304990 },
  91967. { 0x46fe5096,0x508f7307,0x2e04eaaf,0x695810e8,0x3512f76c,0x88ef1bd9,
  91968. 0x3ebca06b,0x77661351,0xccf158b7,0xf7d4863a,0x94ee57da,0xb2a81e44 } },
  91969. /* 174 */
  91970. { { 0x6d53e6ba,0xff288e5b,0x14484ea2,0xa90de1a9,0xed33c8ec,0x2fadb60c,
  91971. 0x28b66a40,0x579d6ef3,0xec24372d,0x4f2dd6dd,0x1d66ec7d,0xe9e33fc9 },
  91972. { 0x039eab6e,0x110899d2,0x3e97bb5e,0xa31a667a,0xcfdce68e,0x6200166d,
  91973. 0x5137d54b,0xbe83ebae,0x4800acdf,0x085f7d87,0x0c6f8c86,0xcf4ab133 } },
  91974. /* 175 */
  91975. { { 0x931e08fb,0x03f65845,0x1506e2c0,0x6438551e,0x9c36961f,0x5791f0dc,
  91976. 0xe3dcc916,0x68107b29,0xf495d2ca,0x83242374,0x6ee5895b,0xd8cfb663 },
  91977. { 0xa0349b1b,0x525e0f16,0x4a0fab86,0x33cd2c6c,0x2af8dda9,0x46c12ee8,
  91978. 0x71e97ad3,0x7cc424ba,0x37621eb0,0x69766ddf,0xa5f0d390,0x95565f56 } },
  91979. /* 176 */
  91980. { { 0x1a0f5e94,0xe0e7bbf2,0x1d82d327,0xf771e115,0xceb111fa,0x10033e3d,
  91981. 0xd3426638,0xd269744d,0x00d01ef6,0xbdf2d9da,0xa049ceaf,0x1cb80c71 },
  91982. { 0x9e21c677,0x17f18328,0x19c8f98b,0x6452af05,0x80b67997,0x35b9c5f7,
  91983. 0x40f8f3d4,0x5c2e1cbe,0x66d667ca,0x43f91656,0xcf9d6e79,0x9faaa059 } },
  91984. /* 177 */
  91985. { { 0x0a078fe6,0x8ad24618,0x464fd1dd,0xf6cc73e6,0xc3e37448,0x4d2ce34d,
  91986. 0xe3271b5f,0x624950c5,0xefc5af72,0x62910f5e,0xaa132bc6,0x8b585bf8 },
  91987. { 0xa839327f,0x11723985,0x4aac252f,0x34e2d27d,0x6296cc4e,0x402f59ef,
  91988. 0x47053de9,0x00ae055c,0x28b4f09b,0xfc22a972,0xfa0c180e,0xa9e86264 } },
  91989. /* 178 */
  91990. { { 0xbc310ecc,0x0b7b6224,0x67fa14ed,0x8a1a74f1,0x7214395c,0x87dd0960,
  91991. 0xf5c91128,0xdf1b3d09,0x86b264a8,0x39ff23c6,0x3e58d4c5,0xdc2d49d0 },
  91992. { 0xa9d6f501,0x2152b7d3,0xc04094f7,0xf4c32e24,0xd938990f,0xc6366596,
  91993. 0x94fb207f,0x084d078f,0x328594cb,0xfd99f1d7,0xcb2d96b3,0x36defa64 } },
  91994. /* 179 */
  91995. { { 0x13ed7cbe,0x4619b781,0x9784bd0e,0x95e50015,0x2c7705fe,0x2a32251c,
  91996. 0x5f0dd083,0xa376af99,0x0361a45b,0x55425c6c,0x1f291e7b,0x812d2cef },
  91997. { 0x5fd94972,0xccf581a0,0xe56dc383,0x26e20e39,0x63dbfbf0,0x0093685d,
  91998. 0x36b8c575,0x1fc164cc,0x390ef5e7,0xb9c5ab81,0x26908c66,0x40086beb } },
  91999. /* 180 */
  92000. { { 0x37e3c115,0xe5e54f79,0xc1445a8a,0x69b8ee8c,0xb7659709,0x79aedff2,
  92001. 0x1b46fbe6,0xe288e163,0xd18d7bb7,0xdb4844f0,0x48aa6424,0xe0ea23d0 },
  92002. { 0xf3d80a73,0x714c0e4e,0x3bd64f98,0x87a0aa9e,0x2ec63080,0x8844b8a8,
  92003. 0x255d81a3,0xe0ac9c30,0x455397fc,0x86151237,0x2f820155,0x0b979464 } },
  92004. /* 181 */
  92005. { { 0x4ae03080,0x127a255a,0x580a89fb,0x232306b4,0x6416f539,0x04e8cd6a,
  92006. 0x13b02a0e,0xaeb70dee,0x4c09684a,0xa3038cf8,0x28e433ee,0xa710ec3c },
  92007. { 0x681b1f7d,0x77a72567,0x2fc28170,0x86fbce95,0xf5735ac8,0xd3408683,
  92008. 0x6bd68e93,0x3a324e2a,0xc027d155,0x7ec74353,0xd4427177,0xab60354c } },
  92009. /* 182 */
  92010. { { 0xef4c209d,0x32a5342a,0x08d62704,0x2ba75274,0xc825d5fe,0x4bb4af6f,
  92011. 0xd28e7ff1,0x1c3919ce,0xde0340f6,0x1dfc2fdc,0x29f33ba9,0xc6580baf },
  92012. { 0x41d442cb,0xae121e75,0x3a4724e4,0x4c7727fd,0x524f3474,0xe556d6a4,
  92013. 0x785642a2,0x87e13cc7,0xa17845fd,0x182efbb1,0x4e144857,0xdcec0cf1 } },
  92014. /* 183 */
  92015. { { 0xe9539819,0x1cb89541,0x9d94dbf1,0xc8cb3b4f,0x417da578,0x1d353f63,
  92016. 0x8053a09e,0xb7a697fb,0xc35d8b78,0x8d841731,0xb656a7a9,0x85748d6f },
  92017. { 0xc1859c5d,0x1fd03947,0x535d22a2,0x6ce965c1,0x0ca3aadc,0x1966a13e,
  92018. 0x4fb14eff,0x9802e41d,0x76dd3fcd,0xa9048cbb,0xe9455bba,0x89b182b5 } },
  92019. /* 184 */
  92020. { { 0x43360710,0xd777ad6a,0x55e9936b,0x841287ef,0x04a21b24,0xbaf5c670,
  92021. 0x35ad86f1,0xf2c0725f,0xc707e72e,0x338fa650,0xd8883e52,0x2bf8ed2e },
  92022. { 0xb56e0d6a,0xb0212cf4,0x6843290c,0x50537e12,0x98b3dc6f,0xd8b184a1,
  92023. 0x0210b722,0xd2be9a35,0x559781ee,0x407406db,0x0bc18534,0x5a78d591 } },
  92024. /* 185 */
  92025. { { 0xd748b02c,0x4d57aa2a,0xa12b3b95,0xbe5b3451,0x64711258,0xadca7a45,
  92026. 0x322153db,0x597e091a,0x32eb1eab,0xf3271006,0x2873f301,0xbd9adcba },
  92027. { 0x38543f7f,0xd1dc79d1,0x921b1fef,0x00022092,0x1e5df8ed,0x86db3ef5,
  92028. 0x9e6b944a,0x888cae04,0x791a32b4,0x71bd29ec,0xa6d1c13e,0xd3516206 } },
  92029. /* 186 */
  92030. { { 0x55924f43,0x2ef6b952,0x4f9de8d5,0xd2f401ae,0xadc68042,0xfc73e8d7,
  92031. 0x0d9d1bb4,0x627ea70c,0xbbf35679,0xc3bb3e3e,0xd882dee4,0x7e8a254a },
  92032. { 0xb5924407,0x08906f50,0xa1ad444a,0xf14a0e61,0x65f3738e,0xaa0efa21,
  92033. 0xae71f161,0xd60c7dd6,0xf175894d,0x9e8390fa,0x149f4c00,0xd115cd20 } },
  92034. /* 187 */
  92035. { { 0xa52abf77,0x2f2e2c1d,0x54232568,0xc2a0dca5,0x54966dcc,0xed423ea2,
  92036. 0xcd0dd039,0xe48c93c7,0x176405c7,0x1e54a225,0x70d58f2e,0x1efb5b16 },
  92037. { 0x94fb1471,0xa751f9d9,0x67d2941d,0xfdb31e1f,0x53733698,0xa6c74eb2,
  92038. 0x89a0f64a,0xd3155d11,0xa4b8d2b6,0x4414cfe4,0xf7a8e9e3,0x8d5a4be8 } },
  92039. /* 188 */
  92040. { { 0x52669e98,0x5c96b4d4,0x8fd42a03,0x4547f922,0xd285174e,0xcf5c1319,
  92041. 0x064bffa0,0x805cd1ae,0x246d27e7,0x50e8bc4f,0xd5781e11,0xf89ef98f },
  92042. { 0xdee0b63f,0xb4ff95f6,0x222663a4,0xad850047,0x4d23ce9c,0x02691860,
  92043. 0x50019f59,0x3e5309ce,0x69a508ae,0x27e6f722,0x267ba52c,0xe9376652 } },
  92044. /* 189 */
  92045. { { 0xc0368708,0xa04d289c,0x5e306e1d,0xc458872f,0x33112fea,0x76fa23de,
  92046. 0x6efde42e,0x718e3974,0x1d206091,0xf0c98cdc,0x14a71987,0x5fa3ca62 },
  92047. { 0xdcaa9f2a,0xeee8188b,0x589a860d,0x312cc732,0xc63aeb1f,0xf9808dd6,
  92048. 0x4ea62b53,0x70fd43db,0x890b6e97,0x2c2bfe34,0xfa426aa6,0x105f863c } },
  92049. /* 190 */
  92050. { { 0xb38059ad,0x0b29795d,0x90647ea0,0x5686b77e,0xdb473a3e,0xeff0470e,
  92051. 0xf9b6d1e2,0x278d2340,0xbd594ec7,0xebbff95b,0xd3a7f23d,0xf4b72334 },
  92052. { 0xa5a83f0b,0x2a285980,0x9716a8b3,0x0786c41a,0x22511812,0x138901bd,
  92053. 0xe2fede6e,0xd1b55221,0xdf4eb590,0x0806e264,0x762e462e,0x6c4c897e } },
  92054. /* 191 */
  92055. { { 0xb4b41d9d,0xd10b905f,0x4523a65b,0x826ca466,0xb699fa37,0x535bbd13,
  92056. 0x73bc8f90,0x5b9933d7,0xcd2118ad,0x9332d61f,0xd4a65fd0,0x158c693e },
  92057. { 0xe6806e63,0x4ddfb2a8,0xb5de651b,0xe31ed3ec,0x819bc69a,0xf9460e51,
  92058. 0x2c76b1f8,0x6229c0d6,0x901970a3,0xbb78f231,0x9cee72b8,0x31f3820f } },
  92059. /* 192 */
  92060. { { 0xc09e1c72,0xe931caf2,0x12990cf4,0x0715f298,0x943262d8,0x33aad81d,
  92061. 0x73048d3f,0x5d292b7a,0xdc7415f6,0xb152aaa4,0x0fd19587,0xc3d10fd9 },
  92062. { 0x75ddadd0,0xf76b35c5,0x1e7b694c,0x9f5f4a51,0xc0663025,0x2f1ab7eb,
  92063. 0x920260b0,0x01c9cc87,0x05d39da6,0xc4b1f61a,0xeb4a9c4e,0x6dcd76c4 } },
  92064. /* 193 */
  92065. { { 0xfdc83f01,0x0ba0916f,0x9553e4f9,0x354c8b44,0xffc5e622,0xa6cc511a,
  92066. 0xe95be787,0xb954726a,0x75b41a62,0xcb048115,0xebfde989,0xfa2ae6cd },
  92067. { 0x0f24659a,0x6376bbc7,0x4c289c43,0x13a999fd,0xec9abd8b,0xc7134184,
  92068. 0xa789ab04,0x28c02bf6,0xd3e526ec,0xff841ebc,0x640893a8,0x442b191e } },
  92069. /* 194 */
  92070. { { 0xfa2b6e20,0x4cac6c62,0xf6d69861,0x97f29e9b,0xbc96d12d,0x228ab1db,
  92071. 0x5e8e108d,0x6eb91327,0x40771245,0xd4b3d4d1,0xca8a803a,0x61b20623 },
  92072. { 0xa6a560b1,0x2c2f3b41,0x3859fcf4,0x879e1d40,0x024dbfc3,0x7cdb5145,
  92073. 0x3bfa5315,0x55d08f15,0xaa93823a,0x2f57d773,0xc6a2c9a2,0xa97f259c } },
  92074. /* 195 */
  92075. { { 0xe58edbbb,0xc306317b,0x79dfdf13,0x25ade51c,0x16d83dd6,0x6b5beaf1,
  92076. 0x1dd8f925,0xe8038a44,0xb2a87b6b,0x7f00143c,0xf5b438de,0xa885d00d },
  92077. { 0xcf9e48bd,0xe9f76790,0xa5162768,0xf0bdf9f0,0xad7b57cb,0x0436709f,
  92078. 0xf7c15db7,0x7e151c12,0x5d90ee3b,0x3514f022,0x2c361a8d,0x2e84e803 } },
  92079. /* 196 */
  92080. { { 0x563ec8d8,0x2277607d,0xe3934cb7,0xa661811f,0xf58fd5de,0x3ca72e7a,
  92081. 0x62294c6a,0x7989da04,0xf6bbefe9,0x88b3708b,0x53ed7c82,0x0d524cf7 },
  92082. { 0x2f30c073,0x69f699ca,0x9dc1dcf3,0xf0fa264b,0x05f0aaf6,0x44ca4568,
  92083. 0xd19b9baf,0x0f5b23c7,0xeabd1107,0x39193f41,0x2a7c9b83,0x9e3e10ad } },
  92084. /* 197 */
  92085. { { 0xd4ae972f,0xa90824f0,0xc6e846e7,0x43eef02b,0x29d2160a,0x7e460612,
  92086. 0xfe604e91,0x29a178ac,0x4eb184b2,0x23056f04,0xeb54cdf4,0x4fcad55f },
  92087. { 0xae728d15,0xa0ff96f3,0xc6a00331,0x8a2680c6,0x7ee52556,0x5f84cae0,
  92088. 0xc5a65dad,0x5e462c3a,0xe2d23f4f,0x5d2b81df,0xc5b1eb07,0x6e47301b } },
  92089. /* 198 */
  92090. { { 0xaf8219b9,0x77411d68,0x51b1907a,0xcb883ce6,0x101383b5,0x25c87e57,
  92091. 0x982f970d,0x9c7d9859,0x118305d2,0xaa6abca5,0x9013a5db,0x725fed2f },
  92092. { 0xababd109,0x487cdbaf,0x87586528,0xc0f8cf56,0x8ad58254,0xa02591e6,
  92093. 0xdebbd526,0xc071b1d1,0x961e7e31,0x927dfe8b,0x9263dfe1,0x55f895f9 } },
  92094. /* 199 */
  92095. { { 0xb175645b,0xf899b00d,0xb65b4b92,0x51f3a627,0xb67399ef,0xa2f3ac8d,
  92096. 0xe400bc20,0xe717867f,0x1967b952,0x42cc9020,0x3ecd1de1,0x3d596751 },
  92097. { 0xdb979775,0xd41ebcde,0x6a2e7e88,0x99ba61bc,0x321504f2,0x039149a5,
  92098. 0x27ba2fad,0xe7dc2314,0xb57d8368,0x9f556308,0x57da80a7,0x2b6d16c9 } },
  92099. /* 200 */
  92100. { { 0x279ad982,0x84af5e76,0x9c8b81a6,0x9bb4c92d,0x0e698e67,0xd79ad44e,
  92101. 0x265fc167,0xe8be9048,0x0c3a4ccc,0xf135f7e6,0xb8863a33,0xa0a10d38 },
  92102. { 0xd386efd9,0xe197247c,0xb52346c2,0x0eefd3f9,0x78607bc8,0xc22415f9,
  92103. 0x508674ce,0xa2a8f862,0xc8c9d607,0xa72ad09e,0x50fa764f,0xcd9f0ede } },
  92104. /* 201 */
  92105. { { 0xd1a46d4d,0x063391c7,0x9eb01693,0x2df51c11,0x849e83de,0xc5849800,
  92106. 0x8ad08382,0x48fd09aa,0xaa742736,0xa405d873,0xe1f9600c,0xee49e61e },
  92107. { 0x48c76f73,0xd76676be,0x01274b2a,0xd9c100f6,0x83f8718d,0x110bb67c,
  92108. 0x02fc0d73,0xec85a420,0x744656ad,0xc0449e1e,0x37d9939b,0x28ce7376 } },
  92109. /* 202 */
  92110. { { 0x44544ac7,0x97e9af72,0xba010426,0xf2c658d5,0xfb3adfbd,0x732dec39,
  92111. 0xa2df0b07,0xd12faf91,0x2171e208,0x8ac26725,0x5b24fa54,0xf820cdc8 },
  92112. { 0x94f4cf77,0x307a6eea,0x944a33c6,0x18c783d2,0x0b741ac5,0x4b939d4c,
  92113. 0x3ffbb6e4,0x1d7acd15,0x7a255e44,0x06a24858,0xce336d50,0x14fbc494 } },
  92114. /* 203 */
  92115. { { 0x51584e3c,0x9b920c0c,0xf7e54027,0xc7733c59,0x88422bbe,0xe24ce139,
  92116. 0x523bd6ab,0x11ada812,0xb88e6def,0xde068800,0xfe8c582d,0x7b872671 },
  92117. { 0x7de53510,0x4e746f28,0xf7971968,0x492f8b99,0x7d928ac2,0x1ec80bc7,
  92118. 0x432eb1b5,0xb3913e48,0x32028f6e,0xad084866,0x8fc2f38b,0x122bb835 } },
  92119. /* 204 */
  92120. { { 0x3b0b29c3,0x0a9f3b1e,0x4fa44151,0x837b6432,0x17b28ea7,0xb9905c92,
  92121. 0x98451750,0xf39bc937,0xce8b6da1,0xcd383c24,0x010620b2,0x299f57db },
  92122. { 0x58afdce3,0x7b6ac396,0x3d05ef47,0xa15206b3,0xb9bb02ff,0xa0ae37e2,
  92123. 0x9db3964c,0x107760ab,0x67954bea,0xe29de9a0,0x431c3f82,0x446a1ad8 } },
  92124. /* 205 */
  92125. { { 0x5c6b8195,0xc6fecea0,0xf49e71b9,0xd744a7c5,0x177a7ae7,0xa8e96acc,
  92126. 0x358773a7,0x1a05746c,0x37567369,0xa4162146,0x87d1c971,0xaa0217f7 },
  92127. { 0x77fd3226,0x61e9d158,0xe4f600be,0x0f6f2304,0x7a6dff07,0xa9c4cebc,
  92128. 0x09f12a24,0xd15afa01,0x8c863ee9,0x2bbadb22,0xe5eb8c78,0xa28290e4 } },
  92129. /* 206 */
  92130. { { 0x3e9de330,0x55b87fa0,0x195c145b,0x12b26066,0xa920bef0,0xe08536e0,
  92131. 0x4d195adc,0x7bff6f2c,0x945f4187,0x7f319e9d,0xf892ce47,0xf9848863 },
  92132. { 0x4fe37657,0xd0efc1d3,0x5cf0e45a,0x3c58de82,0x8b0ccbbe,0x626ad21a,
  92133. 0xaf952fc5,0xd2a31208,0xeb437357,0x81791995,0x98e95d4f,0x5f19d30f } },
  92134. /* 207 */
  92135. { { 0x0e6865bb,0x72e83d9a,0xf63456a6,0x22f5af3b,0x463c8d9e,0x409e9c73,
  92136. 0xdfe6970e,0x40e9e578,0x711b91ca,0x876b6efa,0x942625a3,0x895512cf },
  92137. { 0xcb4e462b,0x84c8eda8,0x4412e7c8,0x84c0154a,0xceb7b71f,0x04325db1,
  92138. 0x66f70877,0x1537dde3,0x1992b9ac,0xf3a09399,0xd498ae77,0xa7316606 } },
  92139. /* 208 */
  92140. { { 0xcad260f5,0x13990d2f,0xeec0e8c0,0x76c3be29,0x0f7bd7d5,0x7dc5bee0,
  92141. 0xefebda4b,0x9be167d2,0x9122b87e,0xcce3dde6,0x82b5415c,0x75a28b09 },
  92142. { 0xe84607a6,0xf6810bcd,0x6f4dbf0d,0xc6d58128,0x1b4dafeb,0xfead577d,
  92143. 0x066b28eb,0x9bc440b2,0x8b17e84b,0x53f1da97,0xcda9a575,0x0459504b } },
  92144. /* 209 */
  92145. { { 0x329e5836,0x13e39a02,0xf717269d,0x2c9e7d51,0xf26c963b,0xc5ac58d6,
  92146. 0x79967bf5,0x3b0c6c43,0x55908d9d,0x60bbea3f,0xf07c9ad1,0xd84811e7 },
  92147. { 0x5bd20e4a,0xfe7609a7,0x0a70baa8,0xe4325dd2,0xb3600386,0x3711f370,
  92148. 0xd0924302,0x97f9562f,0x4acc4436,0x040dc0c3,0xde79cdd4,0xfd6d725c } },
  92149. /* 210 */
  92150. { { 0xcf13eafb,0xb3efd0e3,0x5aa0ae5f,0x21009cbb,0x79022279,0xe480c553,
  92151. 0xb2fc9a6d,0x755cf334,0x07096ae7,0x8564a5bf,0xbd238139,0xddd649d0 },
  92152. { 0x8a045041,0xd0de10b1,0xc957d572,0x6e05b413,0x4e0fb25c,0x5c5ff806,
  92153. 0x641162fb,0xd933179b,0xe57439f9,0x42d48485,0x8a8d72aa,0x70c5bd0a } },
  92154. /* 211 */
  92155. { { 0x97bdf646,0xa7671738,0xab329f7c,0xaa1485b4,0xf8f25fdf,0xce3e11d6,
  92156. 0xc6221824,0x76a3fc7e,0xf3924740,0x045f281f,0x96d13a9a,0x24557d4e },
  92157. { 0xdd4c27cd,0x875c804b,0x0f5c7fea,0x11c5f0f4,0xdc55ff7e,0xac8c880b,
  92158. 0x1103f101,0x2acddec5,0xf99faa89,0x38341a21,0xce9d6b57,0xc7b67a2c } },
  92159. /* 212 */
  92160. { { 0x8e357586,0x9a0d724f,0xdf648da0,0x1d7f4ff5,0xfdee62a5,0x9c3e6c9b,
  92161. 0x0389b372,0x0499cef0,0x98eab879,0xe904050d,0x6c051617,0xe8eef1b6 },
  92162. { 0xc37e3ca9,0xebf5bfeb,0xa4e0b91d,0x7c5e946d,0x2c4bea28,0x79097314,
  92163. 0xee67b2b7,0x81f6c109,0xdafc5ede,0xaf237d9b,0x2abb04c7,0xd2e60201 } },
  92164. /* 213 */
  92165. { { 0x8a4f57bf,0x6156060c,0xff11182a,0xf9758696,0x6296ef00,0x8336773c,
  92166. 0xff666899,0x9c054bce,0x719cd11c,0xd6a11611,0xdbe1acfa,0x9824a641 },
  92167. { 0xba89fd01,0x0b7b7a5f,0x889f79d8,0xf8d3b809,0xf578285c,0xc5e1ea08,
  92168. 0xae6d8288,0x7ac74536,0x7521ef5f,0x5d37a200,0xb260a25d,0x5ecc4184 } },
  92169. /* 214 */
  92170. { { 0xa708c8d3,0xddcebb19,0xc63f81ec,0xe63ed04f,0x11873f95,0xd045f5a0,
  92171. 0x79f276d5,0x3b5ad544,0x425ae5b3,0x81272a3d,0x10ce1605,0x8bfeb501 },
  92172. { 0x888228bf,0x4233809c,0xb2aff7df,0x4bd82acf,0x0cbd4a7f,0x9c68f180,
  92173. 0x6b44323d,0xfcd77124,0x891db957,0x60c0fcf6,0x04da8f7f,0xcfbb4d89 } },
  92174. /* 215 */
  92175. { { 0x3b26139a,0x9a6a5df9,0xb2cc7eb8,0x3e076a83,0x5a964bcd,0x47a8e82d,
  92176. 0xb9278d6b,0x8a4e2a39,0xe4443549,0x93506c98,0xf1e0d566,0x06497a8f },
  92177. { 0x2b1efa05,0x3dee8d99,0x45393e33,0x2da63ca8,0xcf0579ad,0xa4af7277,
  92178. 0x3236d8ea,0xaf4b4639,0x32b617f5,0x6ccad95b,0xb88bb124,0xce76d8b8 } },
  92179. /* 216 */
  92180. { { 0x083843dc,0x63d2537a,0x1e4153b4,0x89eb3514,0xea9afc94,0x5175ebc4,
  92181. 0x8ed1aed7,0x7a652580,0xd85e8297,0x67295611,0xb584b73d,0x8dd2d68b },
  92182. { 0x0133c3a4,0x237139e6,0x4bd278ea,0x9de838ab,0xc062fcd9,0xe829b072,
  92183. 0x63ba8706,0x70730d4f,0xd3cd05ec,0x6080483f,0x0c85f84d,0x872ab5b8 } },
  92184. /* 217 */
  92185. { { 0x999d4d49,0xfc0776d3,0xec3f45e7,0xa3eb59de,0x0dae1fc1,0xbc990e44,
  92186. 0xa15371ff,0x33596b1e,0x9bc7ab25,0xd447dcb2,0x35979582,0xcd5b63e9 },
  92187. { 0x77d1ff11,0xae3366fa,0xedee6903,0x59f28f05,0xa4433bf2,0x6f43fed1,
  92188. 0xdf9ce00e,0x15409c9b,0xaca9c5dc,0x21b5cded,0x82d7bdb4,0xf9f33595 } },
  92189. /* 218 */
  92190. { { 0x9422c792,0x95944378,0xc958b8bf,0x239ea923,0xdf076541,0x4b61a247,
  92191. 0xbb9fc544,0x4d29ce85,0x0b424559,0x9a692a67,0x0e486900,0x6e0ca5a0 },
  92192. { 0x85b3bece,0x6b79a782,0xc61f9892,0x41f35e39,0xae747f82,0xff82099a,
  92193. 0xd0ca59d6,0x58c8ae3f,0x99406b5f,0x4ac930e2,0x9df24243,0x2ce04eb9 } },
  92194. /* 219 */
  92195. { { 0x1ac37b82,0x4366b994,0x25b04d83,0xff0c728d,0x19c47b7c,0x1f551361,
  92196. 0xbeff13e7,0xdbf2d5ed,0xe12a683d,0xf78efd51,0x989cf9c4,0x82cd85b9 },
  92197. { 0xe0cb5d37,0xe23c6db6,0x72ee1a15,0x818aeebd,0x28771b14,0x8212aafd,
  92198. 0x1def817d,0x7bc221d9,0x9445c51f,0xdac403a2,0x12c3746b,0x711b0517 } },
  92199. /* 220 */
  92200. { { 0x5ea99ecc,0x0ed9ed48,0xb8cab5e1,0xf799500d,0xb570cbdc,0xa8ec87dc,
  92201. 0xd35dfaec,0x52cfb2c2,0x6e4d80a4,0x8d31fae2,0xdcdeabe5,0xe6a37dc9 },
  92202. { 0x1deca452,0x5d365a34,0x0d68b44e,0x09a5f8a5,0xa60744b1,0x59238ea5,
  92203. 0xbb4249e9,0xf2fedc0d,0xa909b2e3,0xe395c74e,0x39388250,0xe156d1a5 } },
  92204. /* 221 */
  92205. { { 0x47181ae9,0xd796b3d0,0x44197808,0xbaf44ba8,0x34cf3fac,0xe6933094,
  92206. 0xc3bd5c46,0x41aa6ade,0xeed947c6,0x4fda75d8,0x9ea5a525,0xacd9d412 },
  92207. { 0xd430301b,0x65cc55a3,0x7b52ea49,0x3c9a5bcf,0x159507f0,0x22d319cf,
  92208. 0xde74a8dd,0x2ee0b9b5,0x877ac2b6,0x20c26a1e,0x92e7c314,0x387d73da } },
  92209. /* 222 */
  92210. { { 0x8cd3fdac,0x13c4833e,0x332e5b8e,0x76fcd473,0xe2fe1fd3,0xff671b4b,
  92211. 0x5d98d8ec,0x4d734e8b,0x514bbc11,0xb1ead3c6,0x7b390494,0xd14ca858 },
  92212. { 0x5d2d37e9,0x95a443af,0x00464622,0x73c6ea73,0x15755044,0xa44aeb4b,
  92213. 0xfab58fee,0xba3f8575,0xdc680a6f,0x9779dbc9,0x7b37ddfc,0xe1ee5f5a } },
  92214. /* 223 */
  92215. { { 0x12d29f46,0xcd0b4648,0x0ed53137,0x93295b0b,0x80bef6c9,0xbfe26094,
  92216. 0x54248b00,0xa6565788,0x80e7f9c4,0x69c43fca,0xbe141ea1,0x2190837b },
  92217. { 0xa1b26cfb,0x875e159a,0x7affe852,0x90ca9f87,0x92ca598e,0x15e6550d,
  92218. 0x1938ad11,0xe3e0945d,0x366ef937,0xef7636bb,0xb39869e5,0xb6034d0b } },
  92219. /* 224 */
  92220. { { 0x26d8356e,0x4d255e30,0xd314626f,0xf83666ed,0xd0c8ed64,0x421ddf61,
  92221. 0x26677b61,0x96e473c5,0x9e9b18b3,0xdad4af7e,0xa9393f75,0xfceffd4a },
  92222. { 0x11c731d5,0x843138a1,0xb2f141d9,0x05bcb3a1,0x617b7671,0x20e1fa95,
  92223. 0x88ccec7b,0xbefce812,0x90f1b568,0x582073dc,0x1f055cb7,0xf572261a } },
  92224. /* 225 */
  92225. { { 0x36973088,0xf3148277,0x86a9f980,0xc008e708,0xe046c261,0x1b795947,
  92226. 0xca76bca0,0xdf1e6a7d,0x71acddf0,0xabafd886,0x1364d8f4,0xff7054d9 },
  92227. { 0xe2260594,0x2cf63547,0xd73b277e,0x468a5372,0xef9bd35e,0xc7419e24,
  92228. 0x24043cc3,0x2b4a1c20,0x890b39cd,0xa28f047a,0x46f9a2e3,0xdca2cea1 } },
  92229. /* 226 */
  92230. { { 0x53277538,0xab788736,0xcf697738,0xa734e225,0x6b22e2c1,0x66ee1d1e,
  92231. 0xebe1d212,0x2c615389,0x02bb0766,0xf36cad40,0x3e64f207,0x120885c3 },
  92232. { 0x90fbfec2,0x59e77d56,0xd7a574ae,0xf9e781aa,0x5d045e53,0x801410b0,
  92233. 0xa91b5f0e,0xd3b5f0aa,0x7fbb3521,0xb3d1df00,0xc72bee9a,0x11c4b33e } },
  92234. /* 227 */
  92235. { { 0x83c3a7f3,0xd32b9832,0x88d8a354,0x8083abcf,0x50f4ec5a,0xdeb16404,
  92236. 0x641e2907,0x18d747f0,0xf1bbf03e,0x4e8978ae,0x88a0cd89,0x932447dc },
  92237. { 0xcf3d5897,0x561e0feb,0x13600e6d,0xfc3a682f,0xd16a6b73,0xc78b9d73,
  92238. 0xd29bf580,0xe713fede,0x08d69e5c,0x0a225223,0x1ff7fda4,0x3a924a57 } },
  92239. /* 228 */
  92240. { { 0xb4093bee,0xfb64554c,0xa58c6ec0,0xa6d65a25,0x43d0ed37,0x4126994d,
  92241. 0x55152d44,0xa5689a51,0x284caa8d,0xb8e5ea8c,0xd1f25538,0x33f05d4f },
  92242. { 0x1b615d6e,0xe0fdfe09,0x705507da,0x2ded7e8f,0x17bbcc80,0xdd5631e5,
  92243. 0x267fd11f,0x4f87453e,0xff89d62d,0xc6da723f,0xe3cda21d,0x55cbcae2 } },
  92244. /* 229 */
  92245. { { 0x6b4e84f3,0x336bc94e,0x4ef72c35,0x72863031,0xeeb57f99,0x6d85fdee,
  92246. 0xa42ece1b,0x7f4e3272,0x36f0320a,0x7f86cbb5,0x923331e6,0xf09b6a2b },
  92247. { 0x56778435,0x21d3ecf1,0x8323b2d2,0x2977ba99,0x1704bc0f,0x6a1b57fb,
  92248. 0x389f048a,0xd777cf8b,0xac6b42cd,0x9ce2174f,0x09e6c55a,0x404e2bff } },
  92249. /* 230 */
  92250. { { 0x204c5ddb,0x9b9b135e,0x3eff550e,0x9dbfe044,0xec3be0f6,0x35eab4bf,
  92251. 0x0a43e56f,0x8b4c3f0d,0x0e73f9b3,0x4c1c6673,0x2c78c905,0x92ed38bd },
  92252. { 0xa386e27c,0xc7003f6a,0xaced8507,0xb9c4f46f,0x59df5464,0xea024ec8,
  92253. 0x429572ea,0x4af96152,0xe1fc1194,0x279cd5e2,0x281e358c,0xaa376a03 } },
  92254. /* 231 */
  92255. { { 0x3cdbc95c,0x07859223,0xef2e337a,0xaae1aa6a,0x472a8544,0xc040108d,
  92256. 0x8d037b7d,0x80c853e6,0x8c7eee24,0xd221315c,0x8ee47752,0x195d3856 },
  92257. { 0xdacd7fbe,0xd4b1ba03,0xd3e0c52b,0x4b5ac61e,0x6aab7b52,0x68d3c052,
  92258. 0x660e3fea,0xf0d7248c,0x3145efb4,0xafdb3f89,0x8f40936d,0xa73fd9a3 } },
  92259. /* 232 */
  92260. { { 0xbb1b17ce,0x891b9ef3,0xc6127f31,0x14023667,0x305521fd,0x12b2e58d,
  92261. 0xe3508088,0x3a47e449,0xff751507,0xe49fc84b,0x5310d16e,0x4023f722 },
  92262. { 0xb73399fa,0xa608e5ed,0xd532aa3e,0xf12632d8,0x845e8415,0x13a2758e,
  92263. 0x1fc2d861,0xae4b6f85,0x339d02f2,0x3879f5b1,0x80d99ebd,0x446d22a6 } },
  92264. /* 233 */
  92265. { { 0x4be164f1,0x0f502302,0x88b81920,0x8d09d2d6,0x984aceff,0x514056f1,
  92266. 0x75e9e80d,0xa5c4ddf0,0xdf496a93,0x38cb47e6,0x38df6bf7,0x899e1d6b },
  92267. { 0xb59eb2a6,0x69e87e88,0x9b47f38b,0x280d9d63,0x3654e955,0x599411ea,
  92268. 0x969aa581,0xcf8dd4fd,0x530742a7,0xff5c2baf,0x1a373085,0xa4391536 } },
  92269. /* 234 */
  92270. { { 0xa8a4bdd2,0x6ace72a3,0xb68ef702,0xc656cdd1,0x90c4dad8,0xd4a33e7e,
  92271. 0x9d951c50,0x4aece08a,0x085d68e6,0xea8005ae,0x6f7502b8,0xfdd7a7d7 },
  92272. { 0x98d6fa45,0xce6fb0a6,0x1104eb8c,0x228f8672,0xda09d7dc,0xd23d8787,
  92273. 0x2ae93065,0x5521428b,0xea56c366,0x95faba3d,0x0a88aca5,0xedbe5039 } },
  92274. /* 235 */
  92275. { { 0xbfb26c82,0xd64da0ad,0x952c2f9c,0xe5d70b3c,0xf7e77f68,0xf5e8f365,
  92276. 0x08f2d695,0x7234e002,0xd12e7be6,0xfaf900ee,0x4acf734e,0x27dc6934 },
  92277. { 0xc260a46a,0x80e4ff5e,0x2dc31c28,0x7da5ebce,0xca69f552,0x485c5d73,
  92278. 0x69cc84c2,0xcdfb6b29,0xed6d4eca,0x031c5afe,0x22247637,0xc7bbf4c8 } },
  92279. /* 236 */
  92280. { { 0x49fe01b2,0x9d5b72c7,0x793a91b8,0x34785186,0xcf460438,0xa3ba3c54,
  92281. 0x3ab21b6f,0x73e8e43d,0xbe57b8ab,0x50cde8e0,0xdd204264,0x6488b3a7 },
  92282. { 0xdddc4582,0xa9e398b3,0x5bec46fe,0x1698c1a9,0x156d3843,0x7f1446ef,
  92283. 0x770329a2,0x3fd25dd8,0x2c710668,0x05b1221a,0xa72ee6cf,0x65b2dc2a } },
  92284. /* 237 */
  92285. { { 0xcd021d63,0x21a885f7,0xfea61f08,0x3f344b15,0xc5cf73e6,0xad5ba6dd,
  92286. 0x227a8b23,0x154d0d8f,0xdc559311,0x9b74373c,0x98620fa1,0x4feab715 },
  92287. { 0x7d9ec924,0x5098938e,0x6d47e550,0x84d54a5e,0x1b617506,0x1a2d1bdc,
  92288. 0x615868a4,0x99fe1782,0x3005a924,0x171da780,0x7d8f79b6,0xa70bf5ed } },
  92289. /* 238 */
  92290. { { 0xfe2216c5,0x0bc1250d,0x7601b351,0x2c37e250,0xd6f06b7e,0xb6300175,
  92291. 0x8bfeb9b7,0x4dde8ca1,0xb82f843d,0x4f210432,0xb1ac0afd,0x8d70e2f9 },
  92292. { 0xaae91abb,0x25c73b78,0x863028f2,0x0230dca3,0xe5cf30b7,0x8b923ecf,
  92293. 0x5506f265,0xed754ec2,0x729a5e39,0x8e41b88c,0xbabf889b,0xee67cec2 } },
  92294. /* 239 */
  92295. { { 0x1be46c65,0xe183acf5,0xe7565d7a,0x9789538f,0xd9627b4e,0x87873391,
  92296. 0x9f1d9187,0xbf4ac4c1,0x4691f5c8,0x5db99f63,0x74a1fb98,0xa68df803 },
  92297. { 0xbf92b5fa,0x3c448ed1,0x3e0bdc32,0xa098c841,0x79bf016c,0x8e74cd55,
  92298. 0x115e244d,0x5df0d09c,0x3410b66e,0x9418ad01,0x17a02130,0x8b6124cb } },
  92299. /* 240 */
  92300. { { 0xc26e3392,0x425ec3af,0xa1722e00,0xc07f8470,0xe2356b43,0xdcc28190,
  92301. 0xb1ef59a6,0x4ed97dff,0xc63028c1,0xc22b3ad1,0x68c18988,0x070723c2 },
  92302. { 0x4cf49e7d,0x70da302f,0x3f12a522,0xc5e87c93,0x18594148,0x74acdd1d,
  92303. 0xca74124c,0xad5f73ab,0xd69fd478,0xe72e4a3e,0x7b117cc3,0x61593868 } },
  92304. /* 241 */
  92305. { { 0xa9aa0486,0x7b7b9577,0xa063d557,0x6e41fb35,0xda9047d7,0xb017d5c7,
  92306. 0x68a87ba9,0x8c748280,0xdf08ad93,0xab45fa5c,0x4c288a28,0xcd9fb217 },
  92307. { 0x5747843d,0x59544642,0xa56111e3,0x34d64c6c,0x4bfce8d5,0x12e47ea1,
  92308. 0x6169267f,0x17740e05,0xeed03fb5,0x5c49438e,0x4fc3f513,0x9da30add } },
  92309. /* 242 */
  92310. { { 0xccfa5200,0xc4e85282,0x6a19b13d,0x2707608f,0xf5726e2f,0xdcb9a53d,
  92311. 0xe9427de5,0x612407c9,0xd54d582a,0x3e5a17e1,0x655ae118,0xb99877de },
  92312. { 0x015254de,0x6f0e972b,0xf0a6f7c5,0x92a56db1,0xa656f8b2,0xd297e4e1,
  92313. 0xad981983,0x99fe0052,0x07cfed84,0xd3652d2f,0x843c1738,0xc784352e } },
  92314. /* 243 */
  92315. { { 0x7e9b2d8a,0x6ee90af0,0x57cf1964,0xac8d7018,0x71f28efc,0xf6ed9031,
  92316. 0x6812b20e,0x7f70d5a9,0xf1c61eee,0x27b557f4,0xc6263758,0xf1c9bd57 },
  92317. { 0x2a1a6194,0x5cf7d014,0x1890ab84,0xdd614e0b,0x0e93c2a6,0x3ef9de10,
  92318. 0xe0cd91c5,0xf98cf575,0x14befc32,0x504ec0c6,0x6279d68c,0xd0513a66 } },
  92319. /* 244 */
  92320. { { 0xa859fb6a,0xa8eadbad,0xdb283666,0xcf8346e7,0x3e22e355,0x7b35e61a,
  92321. 0x99639c6b,0x293ece2c,0x56f241c8,0xfa0162e2,0xbf7a1dda,0xd2e6c7b9 },
  92322. { 0x40075e63,0xd0de6253,0xf9ec8286,0x2405aa61,0x8fe45494,0x2237830a,
  92323. 0x364e9c8c,0x4fd01ac7,0x904ba750,0x4d9c3d21,0xaf1b520b,0xd589be14 } },
  92324. /* 245 */
  92325. { { 0x4662e53b,0x13576a4f,0xf9077676,0x35ec2f51,0x97c0af97,0x66297d13,
  92326. 0x9e598b58,0xed3201fe,0x5e70f604,0x49bc752a,0xbb12d951,0xb54af535 },
  92327. { 0x212c1c76,0x36ea4c2b,0xeb250dfd,0x18f5bbc7,0x9a0a1a46,0xa0d466cc,
  92328. 0xdac2d917,0x52564da4,0x8e95fab5,0x206559f4,0x9ca67a33,0x7487c190 } },
  92329. /* 246 */
  92330. { { 0xdde98e9c,0x75abfe37,0x2a411199,0x99b90b26,0xdcdb1f7c,0x1b410996,
  92331. 0x8b3b5675,0xab346f11,0xf1f8ae1e,0x04852193,0x6b8b98c1,0x1ec4d227 },
  92332. { 0x45452baa,0xba3bc926,0xacc4a572,0x387d1858,0xe51f171e,0x9478eff6,
  92333. 0x931e1c00,0xf357077d,0xe54c8ca8,0xffee77cd,0x551dc9a4,0xfb4892ff } },
  92334. /* 247 */
  92335. { { 0x2db8dff8,0x5b1bdad0,0x5a2285a2,0xd462f4fd,0xda00b461,0x1d6aad8e,
  92336. 0x41306d1b,0x43fbefcf,0x6a13fe19,0x428e86f3,0x17f89404,0xc8b2f118 },
  92337. { 0xf0d51afb,0x762528aa,0x549b1d06,0xa3e2fea4,0xea3ddf66,0x86fad8f2,
  92338. 0x4fbdd206,0x0d9ccc4b,0xc189ff5a,0xcde97d4c,0x199f19a6,0xc36793d6 } },
  92339. /* 248 */
  92340. { { 0x51b85197,0xea38909b,0xb4c92895,0xffb17dd0,0x1ddb3f3f,0x0eb0878b,
  92341. 0xc57cf0f2,0xb05d28ff,0x1abd57e2,0xd8bde2e7,0xc40c1b20,0x7f2be28d },
  92342. { 0x299a2d48,0x6554dca2,0x8377982d,0x5130ba2e,0x1071971a,0x8863205f,
  92343. 0x7cf2825d,0x15ee6282,0x03748f2b,0xd4b6c57f,0x430385a0,0xa9e3f4da } },
  92344. /* 249 */
  92345. { { 0x83fbc9c6,0x33eb7cec,0x4541777e,0x24a311c7,0x4f0767fc,0xc81377f7,
  92346. 0x4ab702da,0x12adae36,0x2a779696,0xb7fcb6db,0x01cea6ad,0x4a6fb284 },
  92347. { 0xcdfc73de,0x5e8b1d2a,0x1b02fd32,0xd0efae8d,0xd81d8519,0x3f99c190,
  92348. 0xfc808971,0x3c18f7fa,0x51b7ae7b,0x41f713e7,0xf07fc3f8,0x0a4b3435 } },
  92349. /* 250 */
  92350. { { 0x019b7d2e,0x7dda3c4c,0xd4dc4b89,0x631c8d1a,0x1cdb313c,0x5489cd6e,
  92351. 0x4c07bb06,0xd44aed10,0x75f000d1,0x8f97e13a,0xdda5df4d,0x0e9ee64f },
  92352. { 0x3e346910,0xeaa99f3b,0xfa294ad7,0x622f6921,0x0d0b2fe9,0x22aaa20d,
  92353. 0x1e5881ba,0x4fed2f99,0xc1571802,0x9af3b2d6,0xdc7ee17c,0x919e67a8 } },
  92354. /* 251 */
  92355. { { 0x76250533,0xc724fe4c,0x7d817ef8,0x8a2080e5,0x172c9751,0xa2afb0f4,
  92356. 0x17c0702e,0x9b10cdeb,0xc9b7e3e9,0xbf3975e3,0x1cd0cdc5,0x206117df },
  92357. { 0xbe05ebd5,0xfb049e61,0x16c782c0,0xeb0bb55c,0xab7fed09,0x13a331b8,
  92358. 0x632863f0,0xf6c58b1d,0x4d3b6195,0x6264ef6e,0x9a53f116,0x92c51b63 } },
  92359. /* 252 */
  92360. { { 0x288b364d,0xa57c7bc8,0x7b41e5c4,0x4a562e08,0x698a9a11,0x699d21c6,
  92361. 0xf3f849b9,0xa4ed9581,0x9eb726ba,0xa223eef3,0xcc2884f9,0x13159c23 },
  92362. { 0x3a3f4963,0x73931e58,0x0ada6a81,0x96500389,0x5ab2950b,0x3ee8a1c6,
  92363. 0x775fab52,0xeedf4949,0x4f2671b6,0x63d652e1,0x3c4e2f55,0xfed4491c } },
  92364. /* 253 */
  92365. { { 0xf4eb453e,0x335eadc3,0xcadd1a5b,0x5ff74b63,0x5d84a91a,0x6933d0d7,
  92366. 0xb49ba337,0x9ca3eeb9,0xc04c15b8,0x1f6facce,0xdc09a7e4,0x4ef19326 },
  92367. { 0x3dca3233,0x53d2d324,0xa2259d4b,0x0ee40590,0x5546f002,0x18c22edb,
  92368. 0x09ea6b71,0x92429801,0xb0e91e61,0xaada0add,0x99963c50,0x5fe53ef4 } },
  92369. /* 254 */
  92370. { { 0x90c28c65,0x372dd06b,0x119ce47d,0x1765242c,0x6b22fc82,0xc041fb80,
  92371. 0xb0a7ccc1,0x667edf07,0x1261bece,0xc79599e7,0x19cff22a,0xbc69d9ba },
  92372. { 0x13c06819,0x009d77cd,0xe282b79d,0x635a66ae,0x225b1be8,0x4edac4a6,
  92373. 0x524008f9,0x57d4f4e4,0xb056af84,0xee299ac5,0x3a0bc386,0xcc38444c } },
  92374. /* 255 */
  92375. { { 0xcd4c2356,0x490643b1,0x750547be,0x740a4851,0xd4944c04,0x643eaf29,
  92376. 0x299a98a0,0xba572479,0xee05fdf9,0x48b29f16,0x089b2d7b,0x33fb4f61 },
  92377. { 0xa950f955,0x86704902,0xfedc3ddf,0x97e1034d,0x05fbb6a2,0x211320b6,
  92378. 0x432299bb,0x23d7b93f,0x8590e4a3,0x1fe1a057,0xf58c0ce6,0x8e1d0586 } },
  92379. };
  92380. /* Multiply the base point of P384 by the scalar and return the result.
  92381. * If map is true then convert result to affine coordinates.
  92382. *
  92383. * Stripe implementation.
  92384. * Pre-generated: 2^0, 2^48, ...
  92385. * Pre-generated: products of all combinations of above.
  92386. * 8 doubles and adds (with qz=1)
  92387. *
  92388. * r Resulting point.
  92389. * k Scalar to multiply by.
  92390. * map Indicates whether to convert result to affine.
  92391. * ct Constant time required.
  92392. * heap Heap to use for allocation.
  92393. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  92394. */
  92395. static int sp_384_ecc_mulmod_base_12(sp_point_384* r, const sp_digit* k,
  92396. int map, int ct, void* heap)
  92397. {
  92398. return sp_384_ecc_mulmod_stripe_12(r, &p384_base, p384_table,
  92399. k, map, ct, heap);
  92400. }
  92401. #endif
  92402. /* Multiply the base point of P384 by the scalar and return the result.
  92403. * If map is true then convert result to affine coordinates.
  92404. *
  92405. * km Scalar to multiply by.
  92406. * r Resulting point.
  92407. * map Indicates whether to convert result to affine.
  92408. * heap Heap to use for allocation.
  92409. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  92410. */
  92411. int sp_ecc_mulmod_base_384(const mp_int* km, ecc_point* r, int map, void* heap)
  92412. {
  92413. #ifdef WOLFSSL_SP_SMALL_STACK
  92414. sp_point_384* point = NULL;
  92415. sp_digit* k = NULL;
  92416. #else
  92417. sp_point_384 point[1];
  92418. sp_digit k[12];
  92419. #endif
  92420. int err = MP_OKAY;
  92421. #ifdef WOLFSSL_SP_SMALL_STACK
  92422. point = (sp_point_384*)XMALLOC(sizeof(sp_point_384), heap,
  92423. DYNAMIC_TYPE_ECC);
  92424. if (point == NULL)
  92425. err = MEMORY_E;
  92426. if (err == MP_OKAY) {
  92427. k = (sp_digit*)XMALLOC(sizeof(sp_digit) * 12, heap,
  92428. DYNAMIC_TYPE_ECC);
  92429. if (k == NULL)
  92430. err = MEMORY_E;
  92431. }
  92432. #endif
  92433. if (err == MP_OKAY) {
  92434. sp_384_from_mp(k, 12, km);
  92435. err = sp_384_ecc_mulmod_base_12(point, k, map, 1, heap);
  92436. }
  92437. if (err == MP_OKAY) {
  92438. err = sp_384_point_to_ecc_point_12(point, r);
  92439. }
  92440. #ifdef WOLFSSL_SP_SMALL_STACK
  92441. if (k != NULL)
  92442. XFREE(k, heap, DYNAMIC_TYPE_ECC);
  92443. if (point != NULL)
  92444. XFREE(point, heap, DYNAMIC_TYPE_ECC);
  92445. #endif
  92446. return err;
  92447. }
  92448. /* Multiply the base point of P384 by the scalar, add point a and return
  92449. * the result. If map is true then convert result to affine coordinates.
  92450. *
  92451. * km Scalar to multiply by.
  92452. * am Point to add to scalar multiply result.
  92453. * inMont Point to add is in montgomery form.
  92454. * r Resulting point.
  92455. * map Indicates whether to convert result to affine.
  92456. * heap Heap to use for allocation.
  92457. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  92458. */
  92459. int sp_ecc_mulmod_base_add_384(const mp_int* km, const ecc_point* am,
  92460. int inMont, ecc_point* r, int map, void* heap)
  92461. {
  92462. #ifdef WOLFSSL_SP_SMALL_STACK
  92463. sp_point_384* point = NULL;
  92464. sp_digit* k = NULL;
  92465. #else
  92466. sp_point_384 point[2];
  92467. sp_digit k[12 + 12 * 2 * 6];
  92468. #endif
  92469. sp_point_384* addP = NULL;
  92470. sp_digit* tmp = NULL;
  92471. int err = MP_OKAY;
  92472. #ifdef WOLFSSL_SP_SMALL_STACK
  92473. point = (sp_point_384*)XMALLOC(sizeof(sp_point_384) * 2, heap,
  92474. DYNAMIC_TYPE_ECC);
  92475. if (point == NULL)
  92476. err = MEMORY_E;
  92477. if (err == MP_OKAY) {
  92478. k = (sp_digit*)XMALLOC(
  92479. sizeof(sp_digit) * (12 + 12 * 2 * 6),
  92480. heap, DYNAMIC_TYPE_ECC);
  92481. if (k == NULL)
  92482. err = MEMORY_E;
  92483. }
  92484. #endif
  92485. if (err == MP_OKAY) {
  92486. addP = point + 1;
  92487. tmp = k + 12;
  92488. sp_384_from_mp(k, 12, km);
  92489. sp_384_point_from_ecc_point_12(addP, am);
  92490. }
  92491. if ((err == MP_OKAY) && (!inMont)) {
  92492. err = sp_384_mod_mul_norm_12(addP->x, addP->x, p384_mod);
  92493. }
  92494. if ((err == MP_OKAY) && (!inMont)) {
  92495. err = sp_384_mod_mul_norm_12(addP->y, addP->y, p384_mod);
  92496. }
  92497. if ((err == MP_OKAY) && (!inMont)) {
  92498. err = sp_384_mod_mul_norm_12(addP->z, addP->z, p384_mod);
  92499. }
  92500. if (err == MP_OKAY) {
  92501. err = sp_384_ecc_mulmod_base_12(point, k, 0, 0, heap);
  92502. }
  92503. if (err == MP_OKAY) {
  92504. sp_384_proj_point_add_12(point, point, addP, tmp);
  92505. if (map) {
  92506. sp_384_map_12(point, point, tmp);
  92507. }
  92508. err = sp_384_point_to_ecc_point_12(point, r);
  92509. }
  92510. #ifdef WOLFSSL_SP_SMALL_STACK
  92511. if (k != NULL)
  92512. XFREE(k, heap, DYNAMIC_TYPE_ECC);
  92513. if (point)
  92514. XFREE(point, heap, DYNAMIC_TYPE_ECC);
  92515. #endif
  92516. return err;
  92517. }
  92518. #if defined(WOLFSSL_VALIDATE_ECC_KEYGEN) || defined(HAVE_ECC_SIGN) || \
  92519. defined(HAVE_ECC_VERIFY)
  92520. #endif /* WOLFSSL_VALIDATE_ECC_KEYGEN | HAVE_ECC_SIGN | HAVE_ECC_VERIFY */
  92521. /* Add 1 to a. (a = a + 1)
  92522. *
  92523. * a A single precision integer.
  92524. */
  92525. static void sp_384_add_one_12(sp_digit* a_p)
  92526. {
  92527. register sp_digit* a asm ("r0") = (sp_digit*)a_p;
  92528. __asm__ __volatile__ (
  92529. "ldm %[a], {r1, r2, r3, r4}\n\t"
  92530. "adds r1, r1, #1\n\t"
  92531. "adcs r2, r2, #0\n\t"
  92532. "adcs r3, r3, #0\n\t"
  92533. "adcs r4, r4, #0\n\t"
  92534. "stm %[a]!, {r1, r2, r3, r4}\n\t"
  92535. "ldm %[a], {r1, r2, r3, r4}\n\t"
  92536. "adcs r1, r1, #0\n\t"
  92537. "adcs r2, r2, #0\n\t"
  92538. "adcs r3, r3, #0\n\t"
  92539. "adcs r4, r4, #0\n\t"
  92540. "stm %[a]!, {r1, r2, r3, r4}\n\t"
  92541. "ldm %[a], {r1, r2, r3, r4}\n\t"
  92542. "adcs r1, r1, #0\n\t"
  92543. "adcs r2, r2, #0\n\t"
  92544. "adcs r3, r3, #0\n\t"
  92545. "adcs r4, r4, #0\n\t"
  92546. "stm %[a]!, {r1, r2, r3, r4}\n\t"
  92547. : [a] "+r" (a)
  92548. :
  92549. : "memory", "r1", "r2", "r3", "r4", "cc"
  92550. );
  92551. }
  92552. /* Read big endian unsigned byte array into r.
  92553. *
  92554. * r A single precision integer.
  92555. * size Maximum number of bytes to convert
  92556. * a Byte array.
  92557. * n Number of bytes in array to read.
  92558. */
  92559. static void sp_384_from_bin(sp_digit* r, int size, const byte* a, int n)
  92560. {
  92561. int i;
  92562. int j;
  92563. byte* d;
  92564. for (i = n - 1,j = 0; i >= 3; i -= 4) {
  92565. r[j] = ((sp_digit)a[i - 0] << 0) |
  92566. ((sp_digit)a[i - 1] << 8) |
  92567. ((sp_digit)a[i - 2] << 16) |
  92568. ((sp_digit)a[i - 3] << 24);
  92569. j++;
  92570. }
  92571. if (i >= 0) {
  92572. r[j] = 0;
  92573. d = (byte*)r;
  92574. switch (i) {
  92575. case 2: d[n - 1 - 2] = a[2]; //fallthrough
  92576. case 1: d[n - 1 - 1] = a[1]; //fallthrough
  92577. case 0: d[n - 1 - 0] = a[0]; //fallthrough
  92578. }
  92579. j++;
  92580. }
  92581. for (; j < size; j++) {
  92582. r[j] = 0;
  92583. }
  92584. }
  92585. /* Generates a scalar that is in the range 1..order-1.
  92586. *
  92587. * rng Random number generator.
  92588. * k Scalar value.
  92589. * returns RNG failures, MEMORY_E when memory allocation fails and
  92590. * MP_OKAY on success.
  92591. */
  92592. static int sp_384_ecc_gen_k_12(WC_RNG* rng, sp_digit* k)
  92593. {
  92594. int err;
  92595. byte buf[48];
  92596. do {
  92597. err = wc_RNG_GenerateBlock(rng, buf, sizeof(buf));
  92598. if (err == 0) {
  92599. sp_384_from_bin(k, 12, buf, (int)sizeof(buf));
  92600. if (sp_384_cmp_12(k, p384_order2) <= 0) {
  92601. sp_384_add_one_12(k);
  92602. break;
  92603. }
  92604. }
  92605. }
  92606. while (err == 0);
  92607. return err;
  92608. }
  92609. /* Makes a random EC key pair.
  92610. *
  92611. * rng Random number generator.
  92612. * priv Generated private value.
  92613. * pub Generated public point.
  92614. * heap Heap to use for allocation.
  92615. * returns ECC_INF_E when the point does not have the correct order, RNG
  92616. * failures, MEMORY_E when memory allocation fails and MP_OKAY on success.
  92617. */
  92618. int sp_ecc_make_key_384(WC_RNG* rng, mp_int* priv, ecc_point* pub, void* heap)
  92619. {
  92620. #ifdef WOLFSSL_SP_SMALL_STACK
  92621. sp_point_384* point = NULL;
  92622. sp_digit* k = NULL;
  92623. #else
  92624. #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN
  92625. sp_point_384 point[2];
  92626. #else
  92627. sp_point_384 point[1];
  92628. #endif
  92629. sp_digit k[12];
  92630. #endif
  92631. #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN
  92632. sp_point_384* infinity = NULL;
  92633. #endif
  92634. int err = MP_OKAY;
  92635. (void)heap;
  92636. #ifdef WOLFSSL_SP_SMALL_STACK
  92637. #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN
  92638. point = (sp_point_384*)XMALLOC(sizeof(sp_point_384) * 2, heap, DYNAMIC_TYPE_ECC);
  92639. #else
  92640. point = (sp_point_384*)XMALLOC(sizeof(sp_point_384), heap, DYNAMIC_TYPE_ECC);
  92641. #endif
  92642. if (point == NULL)
  92643. err = MEMORY_E;
  92644. if (err == MP_OKAY) {
  92645. k = (sp_digit*)XMALLOC(sizeof(sp_digit) * 12, heap,
  92646. DYNAMIC_TYPE_ECC);
  92647. if (k == NULL)
  92648. err = MEMORY_E;
  92649. }
  92650. #endif
  92651. if (err == MP_OKAY) {
  92652. #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN
  92653. infinity = point + 1;
  92654. #endif
  92655. err = sp_384_ecc_gen_k_12(rng, k);
  92656. }
  92657. if (err == MP_OKAY) {
  92658. err = sp_384_ecc_mulmod_base_12(point, k, 1, 1, NULL);
  92659. }
  92660. #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN
  92661. if (err == MP_OKAY) {
  92662. err = sp_384_ecc_mulmod_12(infinity, point, p384_order, 1, 1, NULL);
  92663. }
  92664. if (err == MP_OKAY) {
  92665. if (sp_384_iszero_12(point->x) || sp_384_iszero_12(point->y)) {
  92666. err = ECC_INF_E;
  92667. }
  92668. }
  92669. #endif
  92670. if (err == MP_OKAY) {
  92671. err = sp_384_to_mp(k, priv);
  92672. }
  92673. if (err == MP_OKAY) {
  92674. err = sp_384_point_to_ecc_point_12(point, pub);
  92675. }
  92676. #ifdef WOLFSSL_SP_SMALL_STACK
  92677. if (k != NULL)
  92678. XFREE(k, heap, DYNAMIC_TYPE_ECC);
  92679. if (point != NULL) {
  92680. /* point is not sensitive, so no need to zeroize */
  92681. XFREE(point, heap, DYNAMIC_TYPE_ECC);
  92682. }
  92683. #endif
  92684. return err;
  92685. }
  92686. #ifdef WOLFSSL_SP_NONBLOCK
  92687. typedef struct sp_ecc_key_gen_384_ctx {
  92688. int state;
  92689. sp_384_ecc_mulmod_12_ctx mulmod_ctx;
  92690. sp_digit k[12];
  92691. #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN
  92692. sp_point_384 point[2];
  92693. #else
  92694. sp_point_384 point[1];
  92695. #endif /* WOLFSSL_VALIDATE_ECC_KEYGEN */
  92696. } sp_ecc_key_gen_384_ctx;
  92697. int sp_ecc_make_key_384_nb(sp_ecc_ctx_t* sp_ctx, WC_RNG* rng, mp_int* priv,
  92698. ecc_point* pub, void* heap)
  92699. {
  92700. int err = FP_WOULDBLOCK;
  92701. sp_ecc_key_gen_384_ctx* ctx = (sp_ecc_key_gen_384_ctx*)sp_ctx->data;
  92702. #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN
  92703. sp_point_384* infinity = ctx->point + 1;
  92704. #endif /* WOLFSSL_VALIDATE_ECC_KEYGEN */
  92705. typedef char ctx_size_test[sizeof(sp_ecc_key_gen_384_ctx)
  92706. >= sizeof(*sp_ctx) ? -1 : 1];
  92707. (void)sizeof(ctx_size_test);
  92708. switch (ctx->state) {
  92709. case 0:
  92710. err = sp_384_ecc_gen_k_12(rng, ctx->k);
  92711. if (err == MP_OKAY) {
  92712. err = FP_WOULDBLOCK;
  92713. ctx->state = 1;
  92714. }
  92715. break;
  92716. case 1:
  92717. err = sp_384_ecc_mulmod_base_12_nb((sp_ecc_ctx_t*)&ctx->mulmod_ctx,
  92718. ctx->point, ctx->k, 1, 1, heap);
  92719. if (err == MP_OKAY) {
  92720. err = FP_WOULDBLOCK;
  92721. #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN
  92722. XMEMSET(&ctx->mulmod_ctx, 0, sizeof(ctx->mulmod_ctx));
  92723. ctx->state = 2;
  92724. #else
  92725. ctx->state = 3;
  92726. #endif
  92727. }
  92728. break;
  92729. #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN
  92730. case 2:
  92731. err = sp_384_ecc_mulmod_12_nb((sp_ecc_ctx_t*)&ctx->mulmod_ctx,
  92732. infinity, ctx->point, p384_order, 1, 1);
  92733. if (err == MP_OKAY) {
  92734. if (sp_384_iszero_12(ctx->point->x) ||
  92735. sp_384_iszero_12(ctx->point->y)) {
  92736. err = ECC_INF_E;
  92737. }
  92738. else {
  92739. err = FP_WOULDBLOCK;
  92740. ctx->state = 3;
  92741. }
  92742. }
  92743. break;
  92744. #endif /* WOLFSSL_VALIDATE_ECC_KEYGEN */
  92745. case 3:
  92746. err = sp_384_to_mp(ctx->k, priv);
  92747. if (err == MP_OKAY) {
  92748. err = sp_384_point_to_ecc_point_12(ctx->point, pub);
  92749. }
  92750. break;
  92751. }
  92752. if (err != FP_WOULDBLOCK) {
  92753. XMEMSET(ctx, 0, sizeof(sp_ecc_key_gen_384_ctx));
  92754. }
  92755. return err;
  92756. }
  92757. #endif /* WOLFSSL_SP_NONBLOCK */
  92758. #ifdef HAVE_ECC_DHE
  92759. /* Write r as big endian to byte array.
  92760. * Fixed length number of bytes written: 48
  92761. *
  92762. * r A single precision integer.
  92763. * a Byte array.
  92764. */
  92765. static void sp_384_to_bin_12(sp_digit* r, byte* a)
  92766. {
  92767. int i;
  92768. int j = 0;
  92769. for (i = 11; i >= 0; i--) {
  92770. a[j++] = r[i] >> 24;
  92771. a[j++] = r[i] >> 16;
  92772. a[j++] = r[i] >> 8;
  92773. a[j++] = r[i] >> 0;
  92774. }
  92775. }
  92776. /* Multiply the point by the scalar and serialize the X ordinate.
  92777. * The number is 0 padded to maximum size on output.
  92778. *
  92779. * priv Scalar to multiply the point by.
  92780. * pub Point to multiply.
  92781. * out Buffer to hold X ordinate.
  92782. * outLen On entry, size of the buffer in bytes.
  92783. * On exit, length of data in buffer in bytes.
  92784. * heap Heap to use for allocation.
  92785. * returns BUFFER_E if the buffer is to small for output size,
  92786. * MEMORY_E when memory allocation fails and MP_OKAY on success.
  92787. */
  92788. int sp_ecc_secret_gen_384(const mp_int* priv, const ecc_point* pub, byte* out,
  92789. word32* outLen, void* heap)
  92790. {
  92791. #ifdef WOLFSSL_SP_SMALL_STACK
  92792. sp_point_384* point = NULL;
  92793. sp_digit* k = NULL;
  92794. #else
  92795. sp_point_384 point[1];
  92796. sp_digit k[12];
  92797. #endif
  92798. int err = MP_OKAY;
  92799. if (*outLen < 48U) {
  92800. err = BUFFER_E;
  92801. }
  92802. #ifdef WOLFSSL_SP_SMALL_STACK
  92803. if (err == MP_OKAY) {
  92804. point = (sp_point_384*)XMALLOC(sizeof(sp_point_384), heap,
  92805. DYNAMIC_TYPE_ECC);
  92806. if (point == NULL)
  92807. err = MEMORY_E;
  92808. }
  92809. if (err == MP_OKAY) {
  92810. k = (sp_digit*)XMALLOC(sizeof(sp_digit) * 12, heap,
  92811. DYNAMIC_TYPE_ECC);
  92812. if (k == NULL)
  92813. err = MEMORY_E;
  92814. }
  92815. #endif
  92816. if (err == MP_OKAY) {
  92817. sp_384_from_mp(k, 12, priv);
  92818. sp_384_point_from_ecc_point_12(point, pub);
  92819. err = sp_384_ecc_mulmod_12(point, point, k, 1, 1, heap);
  92820. }
  92821. if (err == MP_OKAY) {
  92822. sp_384_to_bin_12(point->x, out);
  92823. *outLen = 48;
  92824. }
  92825. #ifdef WOLFSSL_SP_SMALL_STACK
  92826. if (k != NULL)
  92827. XFREE(k, heap, DYNAMIC_TYPE_ECC);
  92828. if (point != NULL)
  92829. XFREE(point, heap, DYNAMIC_TYPE_ECC);
  92830. #endif
  92831. return err;
  92832. }
  92833. #ifdef WOLFSSL_SP_NONBLOCK
  92834. typedef struct sp_ecc_sec_gen_384_ctx {
  92835. int state;
  92836. union {
  92837. sp_384_ecc_mulmod_12_ctx mulmod_ctx;
  92838. };
  92839. sp_digit k[12];
  92840. sp_point_384 point;
  92841. } sp_ecc_sec_gen_384_ctx;
  92842. int sp_ecc_secret_gen_384_nb(sp_ecc_ctx_t* sp_ctx, const mp_int* priv,
  92843. const ecc_point* pub, byte* out, word32* outLen, void* heap)
  92844. {
  92845. int err = FP_WOULDBLOCK;
  92846. sp_ecc_sec_gen_384_ctx* ctx = (sp_ecc_sec_gen_384_ctx*)sp_ctx->data;
  92847. typedef char ctx_size_test[sizeof(sp_ecc_sec_gen_384_ctx) >= sizeof(*sp_ctx) ? -1 : 1];
  92848. (void)sizeof(ctx_size_test);
  92849. if (*outLen < 32U) {
  92850. err = BUFFER_E;
  92851. }
  92852. switch (ctx->state) {
  92853. case 0:
  92854. sp_384_from_mp(ctx->k, 12, priv);
  92855. sp_384_point_from_ecc_point_12(&ctx->point, pub);
  92856. ctx->state = 1;
  92857. break;
  92858. case 1:
  92859. err = sp_384_ecc_mulmod_12_nb((sp_ecc_ctx_t*)&ctx->mulmod_ctx,
  92860. &ctx->point, &ctx->point, ctx->k, 1, 1, heap);
  92861. if (err == MP_OKAY) {
  92862. sp_384_to_bin_12(ctx->point.x, out);
  92863. *outLen = 48;
  92864. }
  92865. break;
  92866. }
  92867. if (err == MP_OKAY && ctx->state != 1) {
  92868. err = FP_WOULDBLOCK;
  92869. }
  92870. if (err != FP_WOULDBLOCK) {
  92871. XMEMSET(ctx, 0, sizeof(sp_ecc_sec_gen_384_ctx));
  92872. }
  92873. return err;
  92874. }
  92875. #endif /* WOLFSSL_SP_NONBLOCK */
  92876. #endif /* HAVE_ECC_DHE */
  92877. #if defined(HAVE_ECC_SIGN) || defined(HAVE_ECC_VERIFY)
  92878. #endif
  92879. #if defined(HAVE_ECC_SIGN) || defined(HAVE_ECC_VERIFY)
  92880. #endif
  92881. #if defined(HAVE_ECC_SIGN) || defined(HAVE_ECC_VERIFY)
  92882. #ifdef WOLFSSL_SP_SMALL
  92883. /* Sub b from a into a. (a -= b)
  92884. *
  92885. * a A single precision integer.
  92886. * b A single precision integer.
  92887. */
  92888. static sp_digit sp_384_sub_in_place_12(sp_digit* a_p, const sp_digit* b_p)
  92889. {
  92890. register sp_digit* a asm ("r0") = (sp_digit*)a_p;
  92891. register const sp_digit* b asm ("r1") = (const sp_digit*)b_p;
  92892. __asm__ __volatile__ (
  92893. "mov r12, #0\n\t"
  92894. "add lr, %[a], #48\n\t"
  92895. "\n"
  92896. "L_sp_384_sub_in_pkace_12_word_%=: \n\t"
  92897. "rsbs r12, r12, #0\n\t"
  92898. "ldm %[a], {r2, r3, r4, r5}\n\t"
  92899. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  92900. "sbcs r2, r2, r6\n\t"
  92901. "sbcs r3, r3, r7\n\t"
  92902. "sbcs r4, r4, r8\n\t"
  92903. "sbcs r5, r5, r9\n\t"
  92904. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  92905. "sbc r12, r12, r12\n\t"
  92906. "cmp %[a], lr\n\t"
  92907. "bne L_sp_384_sub_in_pkace_12_word_%=\n\t"
  92908. "mov %[a], r12\n\t"
  92909. : [a] "+r" (a), [b] "+r" (b)
  92910. :
  92911. : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r12", "lr", "cc"
  92912. );
  92913. return (uint32_t)(size_t)a;
  92914. }
  92915. #else
  92916. /* Sub b from a into a. (a -= b)
  92917. *
  92918. * a A single precision integer and result.
  92919. * b A single precision integer.
  92920. */
  92921. static sp_digit sp_384_sub_in_place_12(sp_digit* a_p, const sp_digit* b_p)
  92922. {
  92923. register sp_digit* a asm ("r0") = (sp_digit*)a_p;
  92924. register const sp_digit* b asm ("r1") = (const sp_digit*)b_p;
  92925. __asm__ __volatile__ (
  92926. "ldm %[a], {r2, r3, r4, r5}\n\t"
  92927. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  92928. "subs r2, r2, r6\n\t"
  92929. "sbcs r3, r3, r7\n\t"
  92930. "sbcs r4, r4, r8\n\t"
  92931. "sbcs r5, r5, r9\n\t"
  92932. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  92933. "ldm %[a], {r2, r3, r4, r5}\n\t"
  92934. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  92935. "sbcs r2, r2, r6\n\t"
  92936. "sbcs r3, r3, r7\n\t"
  92937. "sbcs r4, r4, r8\n\t"
  92938. "sbcs r5, r5, r9\n\t"
  92939. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  92940. "ldm %[a], {r2, r3, r4, r5}\n\t"
  92941. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  92942. "sbcs r2, r2, r6\n\t"
  92943. "sbcs r3, r3, r7\n\t"
  92944. "sbcs r4, r4, r8\n\t"
  92945. "sbcs r5, r5, r9\n\t"
  92946. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  92947. "sbc %[a], r9, r9\n\t"
  92948. : [a] "+r" (a), [b] "+r" (b)
  92949. :
  92950. : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "cc"
  92951. );
  92952. return (uint32_t)(size_t)a;
  92953. }
  92954. #endif /* WOLFSSL_SP_SMALL */
  92955. #ifdef WOLFSSL_SP_SMALL
  92956. /* Mul a by digit b into r. (r = a * b)
  92957. *
  92958. * r A single precision integer.
  92959. * a A single precision integer.
  92960. * b A single precision digit.
  92961. */
  92962. static void sp_384_mul_d_12(sp_digit* r_p, const sp_digit* a_p, sp_digit b_p)
  92963. {
  92964. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  92965. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  92966. register sp_digit b asm ("r2") = (sp_digit)b_p;
  92967. __asm__ __volatile__ (
  92968. /* A[0] * B */
  92969. "ldr r8, [%[a]]\n\t"
  92970. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  92971. "lsl r6, %[b], #16\n\t"
  92972. "lsl r5, r8, #16\n\t"
  92973. "lsr r6, r6, #16\n\t"
  92974. "lsr r5, r5, #16\n\t"
  92975. "mul r5, r6, r5\n\t"
  92976. "lsr r7, r8, #16\n\t"
  92977. "mul r6, r7, r6\n\t"
  92978. "lsr r3, r6, #16\n\t"
  92979. "lsl r6, r6, #16\n\t"
  92980. "adds r5, r5, r6\n\t"
  92981. "adc r3, r3, #0\n\t"
  92982. "lsr r6, %[b], #16\n\t"
  92983. "mul r7, r6, r7\n\t"
  92984. "add r3, r3, r7\n\t"
  92985. "lsl r7, r8, #16\n\t"
  92986. "lsr r7, r7, #16\n\t"
  92987. "mul r6, r7, r6\n\t"
  92988. "lsr r7, r6, #16\n\t"
  92989. "lsl r6, r6, #16\n\t"
  92990. "adds r5, r5, r6\n\t"
  92991. "adc r3, r3, r7\n\t"
  92992. #else
  92993. "umull r5, r3, %[b], r8\n\t"
  92994. #endif
  92995. "mov r4, #0\n\t"
  92996. "str r5, [%[r]]\n\t"
  92997. "mov r5, #0\n\t"
  92998. "mov r9, #4\n\t"
  92999. "\n"
  93000. "L_sp_384_mul_d_12_word_%=: \n\t"
  93001. /* A[i] * B */
  93002. "ldr r8, [%[a], r9]\n\t"
  93003. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  93004. "lsl r6, %[b], #16\n\t"
  93005. "lsl r7, r8, #16\n\t"
  93006. "lsr r6, r6, #16\n\t"
  93007. "lsr r7, r7, #16\n\t"
  93008. "mul r7, r6, r7\n\t"
  93009. "adds r3, r3, r7\n\t"
  93010. "adcs r4, r4, #0\n\t"
  93011. "adc r5, r5, #0\n\t"
  93012. "lsr r7, r8, #16\n\t"
  93013. "mul r6, r7, r6\n\t"
  93014. "lsr r7, r6, #16\n\t"
  93015. "lsl r6, r6, #16\n\t"
  93016. "adds r3, r3, r6\n\t"
  93017. "adcs r4, r4, r7\n\t"
  93018. "adc r5, r5, #0\n\t"
  93019. "lsr r6, %[b], #16\n\t"
  93020. "lsr r7, r8, #16\n\t"
  93021. "mul r7, r6, r7\n\t"
  93022. "adds r4, r4, r7\n\t"
  93023. "adc r5, r5, #0\n\t"
  93024. "lsl r7, r8, #16\n\t"
  93025. "lsr r7, r7, #16\n\t"
  93026. "mul r6, r7, r6\n\t"
  93027. "lsr r7, r6, #16\n\t"
  93028. "lsl r6, r6, #16\n\t"
  93029. "adds r3, r3, r6\n\t"
  93030. "adcs r4, r4, r7\n\t"
  93031. "adc r5, r5, #0\n\t"
  93032. #else
  93033. "umull r6, r7, %[b], r8\n\t"
  93034. "adds r3, r3, r6\n\t"
  93035. "adcs r4, r4, r7\n\t"
  93036. "adc r5, r5, #0\n\t"
  93037. #endif
  93038. "str r3, [%[r], r9]\n\t"
  93039. "mov r3, r4\n\t"
  93040. "mov r4, r5\n\t"
  93041. "mov r5, #0\n\t"
  93042. "add r9, r9, #4\n\t"
  93043. "cmp r9, #48\n\t"
  93044. "blt L_sp_384_mul_d_12_word_%=\n\t"
  93045. "str r3, [%[r], #48]\n\t"
  93046. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  93047. :
  93048. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "cc"
  93049. );
  93050. }
  93051. #else
  93052. /* Mul a by digit b into r. (r = a * b)
  93053. *
  93054. * r A single precision integer.
  93055. * a A single precision integer.
  93056. * b A single precision digit.
  93057. */
  93058. static void sp_384_mul_d_12(sp_digit* r_p, const sp_digit* a_p, sp_digit b_p)
  93059. {
  93060. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  93061. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  93062. register sp_digit b asm ("r2") = (sp_digit)b_p;
  93063. __asm__ __volatile__ (
  93064. /* A[0] * B */
  93065. "ldm %[a]!, {r8}\n\t"
  93066. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  93067. "lsl r6, %[b], #16\n\t"
  93068. "lsl r3, r8, #16\n\t"
  93069. "lsr r6, r6, #16\n\t"
  93070. "lsr r3, r3, #16\n\t"
  93071. "mul r3, r6, r3\n\t"
  93072. "lsr r7, r8, #16\n\t"
  93073. "mul r6, r7, r6\n\t"
  93074. "lsr r4, r6, #16\n\t"
  93075. "lsl r6, r6, #16\n\t"
  93076. "adds r3, r3, r6\n\t"
  93077. "adc r4, r4, #0\n\t"
  93078. "lsr r6, %[b], #16\n\t"
  93079. "mul r7, r6, r7\n\t"
  93080. "add r4, r4, r7\n\t"
  93081. "lsl r7, r8, #16\n\t"
  93082. "lsr r7, r7, #16\n\t"
  93083. "mul r6, r7, r6\n\t"
  93084. "lsr r7, r6, #16\n\t"
  93085. "lsl r6, r6, #16\n\t"
  93086. "adds r3, r3, r6\n\t"
  93087. "adc r4, r4, r7\n\t"
  93088. #else
  93089. "umull r3, r4, %[b], r8\n\t"
  93090. #endif
  93091. "stm %[r]!, {r3}\n\t"
  93092. "mov r5, #0\n\t"
  93093. /* A[1] * B */
  93094. "ldm %[a]!, {r8}\n\t"
  93095. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  93096. "lsl r6, %[b], #16\n\t"
  93097. "lsl r7, r8, #16\n\t"
  93098. "lsr r6, r6, #16\n\t"
  93099. "lsr r7, r7, #16\n\t"
  93100. "mul r7, r6, r7\n\t"
  93101. "adds r4, r4, r7\n\t"
  93102. "adc r5, r5, #0\n\t"
  93103. "lsr r7, r8, #16\n\t"
  93104. "mul r6, r7, r6\n\t"
  93105. "lsr r7, r6, #16\n\t"
  93106. "lsl r6, r6, #16\n\t"
  93107. "adds r4, r4, r6\n\t"
  93108. "adc r5, r5, r7\n\t"
  93109. "lsr r6, %[b], #16\n\t"
  93110. "lsr r7, r8, #16\n\t"
  93111. "mul r7, r6, r7\n\t"
  93112. "add r5, r5, r7\n\t"
  93113. "lsl r7, r8, #16\n\t"
  93114. "lsr r7, r7, #16\n\t"
  93115. "mul r6, r7, r6\n\t"
  93116. "lsr r7, r6, #16\n\t"
  93117. "lsl r6, r6, #16\n\t"
  93118. "adds r4, r4, r6\n\t"
  93119. "adc r5, r5, r7\n\t"
  93120. #else
  93121. "umlal r4, r5, %[b], r8\n\t"
  93122. #endif
  93123. "stm %[r]!, {r4}\n\t"
  93124. "mov r3, #0\n\t"
  93125. /* A[2] * B */
  93126. "ldm %[a]!, {r8}\n\t"
  93127. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  93128. "lsl r6, %[b], #16\n\t"
  93129. "lsl r7, r8, #16\n\t"
  93130. "lsr r6, r6, #16\n\t"
  93131. "lsr r7, r7, #16\n\t"
  93132. "mul r7, r6, r7\n\t"
  93133. "adds r5, r5, r7\n\t"
  93134. "adc r3, r3, #0\n\t"
  93135. "lsr r7, r8, #16\n\t"
  93136. "mul r6, r7, r6\n\t"
  93137. "lsr r7, r6, #16\n\t"
  93138. "lsl r6, r6, #16\n\t"
  93139. "adds r5, r5, r6\n\t"
  93140. "adc r3, r3, r7\n\t"
  93141. "lsr r6, %[b], #16\n\t"
  93142. "lsr r7, r8, #16\n\t"
  93143. "mul r7, r6, r7\n\t"
  93144. "add r3, r3, r7\n\t"
  93145. "lsl r7, r8, #16\n\t"
  93146. "lsr r7, r7, #16\n\t"
  93147. "mul r6, r7, r6\n\t"
  93148. "lsr r7, r6, #16\n\t"
  93149. "lsl r6, r6, #16\n\t"
  93150. "adds r5, r5, r6\n\t"
  93151. "adc r3, r3, r7\n\t"
  93152. #else
  93153. "umlal r5, r3, %[b], r8\n\t"
  93154. #endif
  93155. "stm %[r]!, {r5}\n\t"
  93156. "mov r4, #0\n\t"
  93157. /* A[3] * B */
  93158. "ldm %[a]!, {r8}\n\t"
  93159. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  93160. "lsl r6, %[b], #16\n\t"
  93161. "lsl r7, r8, #16\n\t"
  93162. "lsr r6, r6, #16\n\t"
  93163. "lsr r7, r7, #16\n\t"
  93164. "mul r7, r6, r7\n\t"
  93165. "adds r3, r3, r7\n\t"
  93166. "adc r4, r4, #0\n\t"
  93167. "lsr r7, r8, #16\n\t"
  93168. "mul r6, r7, r6\n\t"
  93169. "lsr r7, r6, #16\n\t"
  93170. "lsl r6, r6, #16\n\t"
  93171. "adds r3, r3, r6\n\t"
  93172. "adc r4, r4, r7\n\t"
  93173. "lsr r6, %[b], #16\n\t"
  93174. "lsr r7, r8, #16\n\t"
  93175. "mul r7, r6, r7\n\t"
  93176. "add r4, r4, r7\n\t"
  93177. "lsl r7, r8, #16\n\t"
  93178. "lsr r7, r7, #16\n\t"
  93179. "mul r6, r7, r6\n\t"
  93180. "lsr r7, r6, #16\n\t"
  93181. "lsl r6, r6, #16\n\t"
  93182. "adds r3, r3, r6\n\t"
  93183. "adc r4, r4, r7\n\t"
  93184. #else
  93185. "umlal r3, r4, %[b], r8\n\t"
  93186. #endif
  93187. "stm %[r]!, {r3}\n\t"
  93188. "mov r5, #0\n\t"
  93189. /* A[4] * B */
  93190. "ldm %[a]!, {r8}\n\t"
  93191. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  93192. "lsl r6, %[b], #16\n\t"
  93193. "lsl r7, r8, #16\n\t"
  93194. "lsr r6, r6, #16\n\t"
  93195. "lsr r7, r7, #16\n\t"
  93196. "mul r7, r6, r7\n\t"
  93197. "adds r4, r4, r7\n\t"
  93198. "adc r5, r5, #0\n\t"
  93199. "lsr r7, r8, #16\n\t"
  93200. "mul r6, r7, r6\n\t"
  93201. "lsr r7, r6, #16\n\t"
  93202. "lsl r6, r6, #16\n\t"
  93203. "adds r4, r4, r6\n\t"
  93204. "adc r5, r5, r7\n\t"
  93205. "lsr r6, %[b], #16\n\t"
  93206. "lsr r7, r8, #16\n\t"
  93207. "mul r7, r6, r7\n\t"
  93208. "add r5, r5, r7\n\t"
  93209. "lsl r7, r8, #16\n\t"
  93210. "lsr r7, r7, #16\n\t"
  93211. "mul r6, r7, r6\n\t"
  93212. "lsr r7, r6, #16\n\t"
  93213. "lsl r6, r6, #16\n\t"
  93214. "adds r4, r4, r6\n\t"
  93215. "adc r5, r5, r7\n\t"
  93216. #else
  93217. "umlal r4, r5, %[b], r8\n\t"
  93218. #endif
  93219. "stm %[r]!, {r4}\n\t"
  93220. "mov r3, #0\n\t"
  93221. /* A[5] * B */
  93222. "ldm %[a]!, {r8}\n\t"
  93223. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  93224. "lsl r6, %[b], #16\n\t"
  93225. "lsl r7, r8, #16\n\t"
  93226. "lsr r6, r6, #16\n\t"
  93227. "lsr r7, r7, #16\n\t"
  93228. "mul r7, r6, r7\n\t"
  93229. "adds r5, r5, r7\n\t"
  93230. "adc r3, r3, #0\n\t"
  93231. "lsr r7, r8, #16\n\t"
  93232. "mul r6, r7, r6\n\t"
  93233. "lsr r7, r6, #16\n\t"
  93234. "lsl r6, r6, #16\n\t"
  93235. "adds r5, r5, r6\n\t"
  93236. "adc r3, r3, r7\n\t"
  93237. "lsr r6, %[b], #16\n\t"
  93238. "lsr r7, r8, #16\n\t"
  93239. "mul r7, r6, r7\n\t"
  93240. "add r3, r3, r7\n\t"
  93241. "lsl r7, r8, #16\n\t"
  93242. "lsr r7, r7, #16\n\t"
  93243. "mul r6, r7, r6\n\t"
  93244. "lsr r7, r6, #16\n\t"
  93245. "lsl r6, r6, #16\n\t"
  93246. "adds r5, r5, r6\n\t"
  93247. "adc r3, r3, r7\n\t"
  93248. #else
  93249. "umlal r5, r3, %[b], r8\n\t"
  93250. #endif
  93251. "stm %[r]!, {r5}\n\t"
  93252. "mov r4, #0\n\t"
  93253. /* A[6] * B */
  93254. "ldm %[a]!, {r8}\n\t"
  93255. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  93256. "lsl r6, %[b], #16\n\t"
  93257. "lsl r7, r8, #16\n\t"
  93258. "lsr r6, r6, #16\n\t"
  93259. "lsr r7, r7, #16\n\t"
  93260. "mul r7, r6, r7\n\t"
  93261. "adds r3, r3, r7\n\t"
  93262. "adc r4, r4, #0\n\t"
  93263. "lsr r7, r8, #16\n\t"
  93264. "mul r6, r7, r6\n\t"
  93265. "lsr r7, r6, #16\n\t"
  93266. "lsl r6, r6, #16\n\t"
  93267. "adds r3, r3, r6\n\t"
  93268. "adc r4, r4, r7\n\t"
  93269. "lsr r6, %[b], #16\n\t"
  93270. "lsr r7, r8, #16\n\t"
  93271. "mul r7, r6, r7\n\t"
  93272. "add r4, r4, r7\n\t"
  93273. "lsl r7, r8, #16\n\t"
  93274. "lsr r7, r7, #16\n\t"
  93275. "mul r6, r7, r6\n\t"
  93276. "lsr r7, r6, #16\n\t"
  93277. "lsl r6, r6, #16\n\t"
  93278. "adds r3, r3, r6\n\t"
  93279. "adc r4, r4, r7\n\t"
  93280. #else
  93281. "umlal r3, r4, %[b], r8\n\t"
  93282. #endif
  93283. "stm %[r]!, {r3}\n\t"
  93284. "mov r5, #0\n\t"
  93285. /* A[7] * B */
  93286. "ldm %[a]!, {r8}\n\t"
  93287. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  93288. "lsl r6, %[b], #16\n\t"
  93289. "lsl r7, r8, #16\n\t"
  93290. "lsr r6, r6, #16\n\t"
  93291. "lsr r7, r7, #16\n\t"
  93292. "mul r7, r6, r7\n\t"
  93293. "adds r4, r4, r7\n\t"
  93294. "adc r5, r5, #0\n\t"
  93295. "lsr r7, r8, #16\n\t"
  93296. "mul r6, r7, r6\n\t"
  93297. "lsr r7, r6, #16\n\t"
  93298. "lsl r6, r6, #16\n\t"
  93299. "adds r4, r4, r6\n\t"
  93300. "adc r5, r5, r7\n\t"
  93301. "lsr r6, %[b], #16\n\t"
  93302. "lsr r7, r8, #16\n\t"
  93303. "mul r7, r6, r7\n\t"
  93304. "add r5, r5, r7\n\t"
  93305. "lsl r7, r8, #16\n\t"
  93306. "lsr r7, r7, #16\n\t"
  93307. "mul r6, r7, r6\n\t"
  93308. "lsr r7, r6, #16\n\t"
  93309. "lsl r6, r6, #16\n\t"
  93310. "adds r4, r4, r6\n\t"
  93311. "adc r5, r5, r7\n\t"
  93312. #else
  93313. "umlal r4, r5, %[b], r8\n\t"
  93314. #endif
  93315. "stm %[r]!, {r4}\n\t"
  93316. "mov r3, #0\n\t"
  93317. /* A[8] * B */
  93318. "ldm %[a]!, {r8}\n\t"
  93319. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  93320. "lsl r6, %[b], #16\n\t"
  93321. "lsl r7, r8, #16\n\t"
  93322. "lsr r6, r6, #16\n\t"
  93323. "lsr r7, r7, #16\n\t"
  93324. "mul r7, r6, r7\n\t"
  93325. "adds r5, r5, r7\n\t"
  93326. "adc r3, r3, #0\n\t"
  93327. "lsr r7, r8, #16\n\t"
  93328. "mul r6, r7, r6\n\t"
  93329. "lsr r7, r6, #16\n\t"
  93330. "lsl r6, r6, #16\n\t"
  93331. "adds r5, r5, r6\n\t"
  93332. "adc r3, r3, r7\n\t"
  93333. "lsr r6, %[b], #16\n\t"
  93334. "lsr r7, r8, #16\n\t"
  93335. "mul r7, r6, r7\n\t"
  93336. "add r3, r3, r7\n\t"
  93337. "lsl r7, r8, #16\n\t"
  93338. "lsr r7, r7, #16\n\t"
  93339. "mul r6, r7, r6\n\t"
  93340. "lsr r7, r6, #16\n\t"
  93341. "lsl r6, r6, #16\n\t"
  93342. "adds r5, r5, r6\n\t"
  93343. "adc r3, r3, r7\n\t"
  93344. #else
  93345. "umlal r5, r3, %[b], r8\n\t"
  93346. #endif
  93347. "stm %[r]!, {r5}\n\t"
  93348. "mov r4, #0\n\t"
  93349. /* A[9] * B */
  93350. "ldm %[a]!, {r8}\n\t"
  93351. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  93352. "lsl r6, %[b], #16\n\t"
  93353. "lsl r7, r8, #16\n\t"
  93354. "lsr r6, r6, #16\n\t"
  93355. "lsr r7, r7, #16\n\t"
  93356. "mul r7, r6, r7\n\t"
  93357. "adds r3, r3, r7\n\t"
  93358. "adc r4, r4, #0\n\t"
  93359. "lsr r7, r8, #16\n\t"
  93360. "mul r6, r7, r6\n\t"
  93361. "lsr r7, r6, #16\n\t"
  93362. "lsl r6, r6, #16\n\t"
  93363. "adds r3, r3, r6\n\t"
  93364. "adc r4, r4, r7\n\t"
  93365. "lsr r6, %[b], #16\n\t"
  93366. "lsr r7, r8, #16\n\t"
  93367. "mul r7, r6, r7\n\t"
  93368. "add r4, r4, r7\n\t"
  93369. "lsl r7, r8, #16\n\t"
  93370. "lsr r7, r7, #16\n\t"
  93371. "mul r6, r7, r6\n\t"
  93372. "lsr r7, r6, #16\n\t"
  93373. "lsl r6, r6, #16\n\t"
  93374. "adds r3, r3, r6\n\t"
  93375. "adc r4, r4, r7\n\t"
  93376. #else
  93377. "umlal r3, r4, %[b], r8\n\t"
  93378. #endif
  93379. "stm %[r]!, {r3}\n\t"
  93380. "mov r5, #0\n\t"
  93381. /* A[10] * B */
  93382. "ldm %[a]!, {r8}\n\t"
  93383. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  93384. "lsl r6, %[b], #16\n\t"
  93385. "lsl r7, r8, #16\n\t"
  93386. "lsr r6, r6, #16\n\t"
  93387. "lsr r7, r7, #16\n\t"
  93388. "mul r7, r6, r7\n\t"
  93389. "adds r4, r4, r7\n\t"
  93390. "adc r5, r5, #0\n\t"
  93391. "lsr r7, r8, #16\n\t"
  93392. "mul r6, r7, r6\n\t"
  93393. "lsr r7, r6, #16\n\t"
  93394. "lsl r6, r6, #16\n\t"
  93395. "adds r4, r4, r6\n\t"
  93396. "adc r5, r5, r7\n\t"
  93397. "lsr r6, %[b], #16\n\t"
  93398. "lsr r7, r8, #16\n\t"
  93399. "mul r7, r6, r7\n\t"
  93400. "add r5, r5, r7\n\t"
  93401. "lsl r7, r8, #16\n\t"
  93402. "lsr r7, r7, #16\n\t"
  93403. "mul r6, r7, r6\n\t"
  93404. "lsr r7, r6, #16\n\t"
  93405. "lsl r6, r6, #16\n\t"
  93406. "adds r4, r4, r6\n\t"
  93407. "adc r5, r5, r7\n\t"
  93408. #else
  93409. "umlal r4, r5, %[b], r8\n\t"
  93410. #endif
  93411. "stm %[r]!, {r4}\n\t"
  93412. "mov r3, #0\n\t"
  93413. /* A[11] * B */
  93414. "ldm %[a]!, {r8}\n\t"
  93415. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  93416. "lsl r6, %[b], #16\n\t"
  93417. "lsl r7, r8, #16\n\t"
  93418. "lsr r6, r6, #16\n\t"
  93419. "lsr r7, r7, #16\n\t"
  93420. "mul r7, r6, r7\n\t"
  93421. "adds r5, r5, r7\n\t"
  93422. "adc r3, r3, #0\n\t"
  93423. "lsr r7, r8, #16\n\t"
  93424. "mul r6, r7, r6\n\t"
  93425. "lsr r7, r6, #16\n\t"
  93426. "lsl r6, r6, #16\n\t"
  93427. "adds r5, r5, r6\n\t"
  93428. "adc r3, r3, r7\n\t"
  93429. "lsr r6, %[b], #16\n\t"
  93430. "lsr r7, r8, #16\n\t"
  93431. "mul r7, r6, r7\n\t"
  93432. "add r3, r3, r7\n\t"
  93433. "lsl r7, r8, #16\n\t"
  93434. "lsr r7, r7, #16\n\t"
  93435. "mul r6, r7, r6\n\t"
  93436. "lsr r7, r6, #16\n\t"
  93437. "lsl r6, r6, #16\n\t"
  93438. "adds r5, r5, r6\n\t"
  93439. "adc r3, r3, r7\n\t"
  93440. #else
  93441. "umlal r5, r3, %[b], r8\n\t"
  93442. #endif
  93443. "stm %[r]!, {r5}\n\t"
  93444. "str r3, [%[r]]\n\t"
  93445. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  93446. :
  93447. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "cc"
  93448. );
  93449. }
  93450. #endif /* WOLFSSL_SP_SMALL */
  93451. #ifdef WOLFSSL_SP_USE_UDIV
  93452. /* Divide the double width number (d1|d0) by the divisor. (d1|d0 / div)
  93453. *
  93454. * d1 The high order half of the number to divide.
  93455. * d0 The low order half of the number to divide.
  93456. * div The divisor.
  93457. * returns the result of the division.
  93458. *
  93459. * Note that this is an approximate div. It may give an answer 1 larger.
  93460. */
  93461. static sp_digit div_384_word_12(sp_digit d1_p, sp_digit d0_p, sp_digit div_p)
  93462. {
  93463. register sp_digit d1 asm ("r0") = (sp_digit)d1_p;
  93464. register sp_digit d0 asm ("r1") = (sp_digit)d0_p;
  93465. register sp_digit div asm ("r2") = (sp_digit)div_p;
  93466. __asm__ __volatile__ (
  93467. "lsr r6, %[div], #16\n\t"
  93468. "add lr, r6, #1\n\t"
  93469. "udiv r4, %[d1], lr\n\t"
  93470. "lsl r5, %[div], #16\n\t"
  93471. "lsl r4, r4, #16\n\t"
  93472. "umull r3, r12, %[div], r4\n\t"
  93473. "subs %[d0], %[d0], r3\n\t"
  93474. "sbc %[d1], %[d1], r12\n\t"
  93475. "subs r3, %[d1], lr\n\t"
  93476. "sbc r7, r7, r7\n\t"
  93477. "add r7, r7, #1\n\t"
  93478. "rsb r8, r7, #0\n\t"
  93479. "lsl r7, r7, #16\n\t"
  93480. "and r5, r5, r8\n\t"
  93481. "and r6, r6, r8\n\t"
  93482. "subs %[d0], %[d0], r5\n\t"
  93483. "add r4, r4, r7\n\t"
  93484. "sbc %[d1], %[d1], r6\n\t"
  93485. "lsl r12, %[d1], #16\n\t"
  93486. "lsr r3, %[d0], #16\n\t"
  93487. "orr r3, r3, r12\n\t"
  93488. "udiv r3, r3, lr\n\t"
  93489. "add r4, r4, r3\n\t"
  93490. "umull r3, r12, %[div], r3\n\t"
  93491. "subs %[d0], %[d0], r3\n\t"
  93492. "sbc %[d1], %[d1], r12\n\t"
  93493. "lsl r12, %[d1], #16\n\t"
  93494. "lsr r3, %[d0], #16\n\t"
  93495. "orr r3, r3, r12\n\t"
  93496. "udiv r3, r3, lr\n\t"
  93497. "add r4, r4, r3\n\t"
  93498. "mul r3, %[div], r3\n\t"
  93499. "sub %[d0], %[d0], r3\n\t"
  93500. "udiv r3, %[d0], %[div]\n\t"
  93501. "add %[d1], r4, r3\n\t"
  93502. : [d1] "+r" (d1), [d0] "+r" (d0), [div] "+r" (div)
  93503. :
  93504. : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8", "cc"
  93505. );
  93506. return (uint32_t)(size_t)d1;
  93507. }
  93508. #else
  93509. /* Divide the double width number (d1|d0) by the divisor. (d1|d0 / div)
  93510. *
  93511. * d1 The high order half of the number to divide.
  93512. * d0 The low order half of the number to divide.
  93513. * div The divisor.
  93514. * returns the result of the division.
  93515. *
  93516. * Note that this is an approximate div. It may give an answer 1 larger.
  93517. */
  93518. static sp_digit div_384_word_12(sp_digit d1_p, sp_digit d0_p, sp_digit div_p)
  93519. {
  93520. register sp_digit d1 asm ("r0") = (sp_digit)d1_p;
  93521. register sp_digit d0 asm ("r1") = (sp_digit)d0_p;
  93522. register sp_digit div asm ("r2") = (sp_digit)div_p;
  93523. __asm__ __volatile__ (
  93524. "lsr lr, %[div], #1\n\t"
  93525. "add lr, lr, #1\n\t"
  93526. "mov r4, %[d0]\n\t"
  93527. "mov r5, %[d1]\n\t"
  93528. /* Do top 32 */
  93529. "subs r6, lr, r5\n\t"
  93530. "sbc r6, r6, r6\n\t"
  93531. "mov r3, #0\n\t"
  93532. "sub r3, r3, r6\n\t"
  93533. "and r6, r6, lr\n\t"
  93534. "subs r5, r5, r6\n\t"
  93535. /* Next 30 bits */
  93536. "mov r12, #29\n\t"
  93537. "\n"
  93538. "L_div_384_word_12_bit_%=: \n\t"
  93539. "lsls r4, r4, #1\n\t"
  93540. "adc r5, r5, r5\n\t"
  93541. "subs r6, lr, r5\n\t"
  93542. "sbc r6, r6, r6\n\t"
  93543. "add r3, r3, r3\n\t"
  93544. "sub r3, r3, r6\n\t"
  93545. "and r6, r6, lr\n\t"
  93546. "subs r5, r5, r6\n\t"
  93547. "subs r12, r12, #1\n\t"
  93548. "bpl L_div_384_word_12_bit_%=\n\t"
  93549. "add r3, r3, r3\n\t"
  93550. "add r3, r3, #1\n\t"
  93551. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  93552. "lsl r7, r3, #16\n\t"
  93553. "lsl r4, %[div], #16\n\t"
  93554. "lsr r7, r7, #16\n\t"
  93555. "lsr r4, r4, #16\n\t"
  93556. "mul r4, r7, r4\n\t"
  93557. "lsr r8, %[div], #16\n\t"
  93558. "mul r7, r8, r7\n\t"
  93559. "lsr r5, r7, #16\n\t"
  93560. "lsl r7, r7, #16\n\t"
  93561. "adds r4, r4, r7\n\t"
  93562. "adc r5, r5, #0\n\t"
  93563. "lsr r7, r3, #16\n\t"
  93564. "mul r8, r7, r8\n\t"
  93565. "add r5, r5, r8\n\t"
  93566. "lsl r8, %[div], #16\n\t"
  93567. "lsr r8, r8, #16\n\t"
  93568. "mul r7, r8, r7\n\t"
  93569. "lsr r8, r7, #16\n\t"
  93570. "lsl r7, r7, #16\n\t"
  93571. "adds r4, r4, r7\n\t"
  93572. "adc r5, r5, r8\n\t"
  93573. #else
  93574. "umull r4, r5, r3, %[div]\n\t"
  93575. #endif
  93576. "subs r7, %[d0], r4\n\t"
  93577. "sbc r8, %[d1], r5\n\t"
  93578. "add r3, r3, r8\n\t"
  93579. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  93580. "lsl r7, r3, #16\n\t"
  93581. "lsl r4, %[div], #16\n\t"
  93582. "lsr r7, r7, #16\n\t"
  93583. "lsr r4, r4, #16\n\t"
  93584. "mul r4, r7, r4\n\t"
  93585. "lsr r8, %[div], #16\n\t"
  93586. "mul r7, r8, r7\n\t"
  93587. "lsr r5, r7, #16\n\t"
  93588. "lsl r7, r7, #16\n\t"
  93589. "adds r4, r4, r7\n\t"
  93590. "adc r5, r5, #0\n\t"
  93591. "lsr r7, r3, #16\n\t"
  93592. "mul r8, r7, r8\n\t"
  93593. "add r5, r5, r8\n\t"
  93594. "lsl r8, %[div], #16\n\t"
  93595. "lsr r8, r8, #16\n\t"
  93596. "mul r7, r8, r7\n\t"
  93597. "lsr r8, r7, #16\n\t"
  93598. "lsl r7, r7, #16\n\t"
  93599. "adds r4, r4, r7\n\t"
  93600. "adc r5, r5, r8\n\t"
  93601. #else
  93602. "umull r4, r5, r3, %[div]\n\t"
  93603. #endif
  93604. "subs r7, %[d0], r4\n\t"
  93605. "sbc r8, %[d1], r5\n\t"
  93606. "add r3, r3, r8\n\t"
  93607. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  93608. "lsl r7, r3, #16\n\t"
  93609. "lsl r4, %[div], #16\n\t"
  93610. "lsr r7, r7, #16\n\t"
  93611. "lsr r4, r4, #16\n\t"
  93612. "mul r4, r7, r4\n\t"
  93613. "lsr r8, %[div], #16\n\t"
  93614. "mul r7, r8, r7\n\t"
  93615. "lsr r5, r7, #16\n\t"
  93616. "lsl r7, r7, #16\n\t"
  93617. "adds r4, r4, r7\n\t"
  93618. "adc r5, r5, #0\n\t"
  93619. "lsr r7, r3, #16\n\t"
  93620. "mul r8, r7, r8\n\t"
  93621. "add r5, r5, r8\n\t"
  93622. "lsl r8, %[div], #16\n\t"
  93623. "lsr r8, r8, #16\n\t"
  93624. "mul r7, r8, r7\n\t"
  93625. "lsr r8, r7, #16\n\t"
  93626. "lsl r7, r7, #16\n\t"
  93627. "adds r4, r4, r7\n\t"
  93628. "adc r5, r5, r8\n\t"
  93629. #else
  93630. "umull r4, r5, r3, %[div]\n\t"
  93631. #endif
  93632. "subs r7, %[d0], r4\n\t"
  93633. "sbc r8, %[d1], r5\n\t"
  93634. "add r3, r3, r8\n\t"
  93635. "subs r6, %[div], r7\n\t"
  93636. "sbc r6, r6, r6\n\t"
  93637. "sub %[d1], r3, r6\n\t"
  93638. : [d1] "+r" (d1), [d0] "+r" (d0), [div] "+r" (div)
  93639. :
  93640. : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8", "cc"
  93641. );
  93642. return (uint32_t)(size_t)d1;
  93643. }
  93644. #endif
  93645. /* AND m into each word of a and store in r.
  93646. *
  93647. * r A single precision integer.
  93648. * a A single precision integer.
  93649. * m Mask to AND against each digit.
  93650. */
  93651. static void sp_384_mask_12(sp_digit* r, const sp_digit* a, sp_digit m)
  93652. {
  93653. #ifdef WOLFSSL_SP_SMALL
  93654. int i;
  93655. for (i=0; i<12; i++) {
  93656. r[i] = a[i] & m;
  93657. }
  93658. #else
  93659. r[0] = a[0] & m;
  93660. r[1] = a[1] & m;
  93661. r[2] = a[2] & m;
  93662. r[3] = a[3] & m;
  93663. r[4] = a[4] & m;
  93664. r[5] = a[5] & m;
  93665. r[6] = a[6] & m;
  93666. r[7] = a[7] & m;
  93667. r[8] = a[8] & m;
  93668. r[9] = a[9] & m;
  93669. r[10] = a[10] & m;
  93670. r[11] = a[11] & m;
  93671. #endif
  93672. }
  93673. /* Divide d in a and put remainder into r (m*d + r = a)
  93674. * m is not calculated as it is not needed at this time.
  93675. *
  93676. * a Number to be divided.
  93677. * d Number to divide with.
  93678. * m Multiplier result.
  93679. * r Remainder from the division.
  93680. * returns MP_OKAY indicating success.
  93681. */
  93682. static WC_INLINE int sp_384_div_12(const sp_digit* a, const sp_digit* d,
  93683. sp_digit* m, sp_digit* r)
  93684. {
  93685. sp_digit t1[24], t2[13];
  93686. sp_digit div, r1;
  93687. int i;
  93688. (void)m;
  93689. div = d[11];
  93690. XMEMCPY(t1, a, sizeof(*t1) * 2 * 12);
  93691. r1 = sp_384_cmp_12(&t1[12], d) >= 0;
  93692. sp_384_cond_sub_12(&t1[12], &t1[12], d, (sp_digit)0 - r1);
  93693. for (i = 11; i >= 0; i--) {
  93694. volatile sp_digit mask = (sp_digit)0 - (t1[12 + i] == div);
  93695. sp_digit hi = t1[12 + i] + mask;
  93696. r1 = div_384_word_12(hi, t1[12 + i - 1], div);
  93697. r1 |= mask;
  93698. sp_384_mul_d_12(t2, d, r1);
  93699. t1[12 + i] += sp_384_sub_in_place_12(&t1[i], t2);
  93700. t1[12 + i] -= t2[12];
  93701. sp_384_mask_12(t2, d, t1[12 + i]);
  93702. t1[12 + i] += sp_384_add_12(&t1[i], &t1[i], t2);
  93703. sp_384_mask_12(t2, d, t1[12 + i]);
  93704. t1[12 + i] += sp_384_add_12(&t1[i], &t1[i], t2);
  93705. }
  93706. r1 = sp_384_cmp_12(t1, d) >= 0;
  93707. sp_384_cond_sub_12(r, t1, d, (sp_digit)0 - r1);
  93708. return MP_OKAY;
  93709. }
  93710. /* Reduce a modulo m into r. (r = a mod m)
  93711. *
  93712. * r A single precision number that is the reduced result.
  93713. * a A single precision number that is to be reduced.
  93714. * m A single precision number that is the modulus to reduce with.
  93715. * returns MP_OKAY indicating success.
  93716. */
  93717. static WC_INLINE int sp_384_mod_12(sp_digit* r, const sp_digit* a,
  93718. const sp_digit* m)
  93719. {
  93720. return sp_384_div_12(a, m, NULL, r);
  93721. }
  93722. #endif
  93723. #if defined(HAVE_ECC_SIGN) || defined(HAVE_ECC_VERIFY)
  93724. /* Multiply two number mod the order of P384 curve. (r = a * b mod order)
  93725. *
  93726. * r Result of the multiplication.
  93727. * a First operand of the multiplication.
  93728. * b Second operand of the multiplication.
  93729. */
  93730. static void sp_384_mont_mul_order_12(sp_digit* r, const sp_digit* a, const sp_digit* b)
  93731. {
  93732. sp_384_mul_12(r, a, b);
  93733. sp_384_mont_reduce_order_12(r, p384_order, p384_mp_order);
  93734. }
  93735. #if defined(HAVE_ECC_SIGN) || (defined(HAVE_ECC_VERIFY) && defined(WOLFSSL_SP_SMALL))
  93736. #ifdef WOLFSSL_SP_SMALL
  93737. /* Order-2 for the P384 curve. */
  93738. static const uint32_t p384_order_minus_2[12] = {
  93739. 0xccc52971U,0xecec196aU,0x48b0a77aU,0x581a0db2U,0xf4372ddfU,0xc7634d81U,
  93740. 0xffffffffU,0xffffffffU,0xffffffffU,0xffffffffU,0xffffffffU,0xffffffffU
  93741. };
  93742. #else
  93743. /* The low half of the order-2 of the P384 curve. */
  93744. static const uint32_t p384_order_low[6] = {
  93745. 0xccc52971U,0xecec196aU,0x48b0a77aU,0x581a0db2U,0xf4372ddfU,0xc7634d81U
  93746. };
  93747. #endif /* WOLFSSL_SP_SMALL */
  93748. /* Square number mod the order of P384 curve. (r = a * a mod order)
  93749. *
  93750. * r Result of the squaring.
  93751. * a Number to square.
  93752. */
  93753. static void sp_384_mont_sqr_order_12(sp_digit* r, const sp_digit* a)
  93754. {
  93755. sp_384_sqr_12(r, a);
  93756. sp_384_mont_reduce_order_12(r, p384_order, p384_mp_order);
  93757. }
  93758. #ifndef WOLFSSL_SP_SMALL
  93759. /* Square number mod the order of P384 curve a number of times.
  93760. * (r = a ^ n mod order)
  93761. *
  93762. * r Result of the squaring.
  93763. * a Number to square.
  93764. */
  93765. static void sp_384_mont_sqr_n_order_12(sp_digit* r, const sp_digit* a, int n)
  93766. {
  93767. int i;
  93768. sp_384_mont_sqr_order_12(r, a);
  93769. for (i=1; i<n; i++) {
  93770. sp_384_mont_sqr_order_12(r, r);
  93771. }
  93772. }
  93773. #endif /* !WOLFSSL_SP_SMALL */
  93774. /* Invert the number, in Montgomery form, modulo the order of the P384 curve.
  93775. * (r = 1 / a mod order)
  93776. *
  93777. * r Inverse result.
  93778. * a Number to invert.
  93779. * td Temporary data.
  93780. */
  93781. #ifdef WOLFSSL_SP_NONBLOCK
  93782. typedef struct sp_384_mont_inv_order_12_ctx {
  93783. int state;
  93784. int i;
  93785. } sp_384_mont_inv_order_12_ctx;
  93786. static int sp_384_mont_inv_order_12_nb(sp_ecc_ctx_t* sp_ctx, sp_digit* r, const sp_digit* a,
  93787. sp_digit* t)
  93788. {
  93789. int err = FP_WOULDBLOCK;
  93790. sp_384_mont_inv_order_12_ctx* ctx = (sp_384_mont_inv_order_12_ctx*)sp_ctx;
  93791. typedef char ctx_size_test[sizeof(sp_384_mont_inv_order_12_ctx) >= sizeof(*sp_ctx) ? -1 : 1];
  93792. (void)sizeof(ctx_size_test);
  93793. switch (ctx->state) {
  93794. case 0:
  93795. XMEMCPY(t, a, sizeof(sp_digit) * 12);
  93796. ctx->i = 382;
  93797. ctx->state = 1;
  93798. break;
  93799. case 1:
  93800. sp_384_mont_sqr_order_12(t, t);
  93801. ctx->state = 2;
  93802. break;
  93803. case 2:
  93804. if ((p384_order_minus_2[ctx->i / 32] & ((sp_int_digit)1 << (ctx->i % 32))) != 0) {
  93805. sp_384_mont_mul_order_12(t, t, a);
  93806. }
  93807. ctx->i--;
  93808. ctx->state = (ctx->i == 0) ? 3 : 1;
  93809. break;
  93810. case 3:
  93811. XMEMCPY(r, t, sizeof(sp_digit) * 12U);
  93812. err = MP_OKAY;
  93813. break;
  93814. }
  93815. return err;
  93816. }
  93817. #endif /* WOLFSSL_SP_NONBLOCK */
  93818. static void sp_384_mont_inv_order_12(sp_digit* r, const sp_digit* a,
  93819. sp_digit* td)
  93820. {
  93821. #ifdef WOLFSSL_SP_SMALL
  93822. sp_digit* t = td;
  93823. int i;
  93824. XMEMCPY(t, a, sizeof(sp_digit) * 12);
  93825. for (i=382; i>=0; i--) {
  93826. sp_384_mont_sqr_order_12(t, t);
  93827. if ((p384_order_minus_2[i / 32] & ((sp_int_digit)1 << (i % 32))) != 0) {
  93828. sp_384_mont_mul_order_12(t, t, a);
  93829. }
  93830. }
  93831. XMEMCPY(r, t, sizeof(sp_digit) * 12U);
  93832. #else
  93833. sp_digit* t = td;
  93834. sp_digit* t2 = td + 2 * 12;
  93835. sp_digit* t3 = td + 4 * 12;
  93836. int i;
  93837. /* t = a^2 */
  93838. sp_384_mont_sqr_order_12(t, a);
  93839. /* t = a^3 = t * a */
  93840. sp_384_mont_mul_order_12(t, t, a);
  93841. /* t2= a^c = t ^ 2 ^ 2 */
  93842. sp_384_mont_sqr_n_order_12(t2, t, 2);
  93843. /* t = a^f = t2 * t */
  93844. sp_384_mont_mul_order_12(t, t2, t);
  93845. /* t2= a^f0 = t ^ 2 ^ 4 */
  93846. sp_384_mont_sqr_n_order_12(t2, t, 4);
  93847. /* t = a^ff = t2 * t */
  93848. sp_384_mont_mul_order_12(t, t2, t);
  93849. /* t2= a^ff00 = t ^ 2 ^ 8 */
  93850. sp_384_mont_sqr_n_order_12(t2, t, 8);
  93851. /* t3= a^ffff = t2 * t */
  93852. sp_384_mont_mul_order_12(t3, t2, t);
  93853. /* t2= a^ffff0000 = t3 ^ 2 ^ 16 */
  93854. sp_384_mont_sqr_n_order_12(t2, t3, 16);
  93855. /* t = a^ffffffff = t2 * t3 */
  93856. sp_384_mont_mul_order_12(t, t2, t3);
  93857. /* t2= a^ffffffff0000 = t ^ 2 ^ 16 */
  93858. sp_384_mont_sqr_n_order_12(t2, t, 16);
  93859. /* t = a^ffffffffffff = t2 * t3 */
  93860. sp_384_mont_mul_order_12(t, t2, t3);
  93861. /* t2= a^ffffffffffff000000000000 = t ^ 2 ^ 48 */
  93862. sp_384_mont_sqr_n_order_12(t2, t, 48);
  93863. /* t= a^fffffffffffffffffffffffff = t2 * t */
  93864. sp_384_mont_mul_order_12(t, t2, t);
  93865. /* t2= a^ffffffffffffffffffffffff000000000000000000000000 */
  93866. sp_384_mont_sqr_n_order_12(t2, t, 96);
  93867. /* t2= a^ffffffffffffffffffffffffffffffffffffffffffffffff = t2 * t */
  93868. sp_384_mont_mul_order_12(t2, t2, t);
  93869. for (i=191; i>=1; i--) {
  93870. sp_384_mont_sqr_order_12(t2, t2);
  93871. if ((p384_order_low[i / 32] & ((sp_int_digit)1 << (i % 32))) != 0) {
  93872. sp_384_mont_mul_order_12(t2, t2, a);
  93873. }
  93874. }
  93875. sp_384_mont_sqr_order_12(t2, t2);
  93876. sp_384_mont_mul_order_12(r, t2, a);
  93877. #endif /* WOLFSSL_SP_SMALL */
  93878. }
  93879. #endif /* HAVE_ECC_SIGN || (HAVE_ECC_VERIFY && WOLFSSL_SP_SMALL) */
  93880. #endif /* HAVE_ECC_SIGN | HAVE_ECC_VERIFY */
  93881. #ifdef HAVE_ECC_SIGN
  93882. #ifndef SP_ECC_MAX_SIG_GEN
  93883. #define SP_ECC_MAX_SIG_GEN 64
  93884. #endif
  93885. /* Calculate second signature value S from R, k and private value.
  93886. *
  93887. * s = (r * x + e) / k
  93888. *
  93889. * s Signature value.
  93890. * r First signature value.
  93891. * k Ephemeral private key.
  93892. * x Private key as a number.
  93893. * e Hash of message as a number.
  93894. * tmp Temporary storage for intermediate numbers.
  93895. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  93896. */
  93897. static int sp_384_calc_s_12(sp_digit* s, const sp_digit* r, sp_digit* k,
  93898. sp_digit* x, const sp_digit* e, sp_digit* tmp)
  93899. {
  93900. int err;
  93901. sp_digit carry;
  93902. sp_int32 c;
  93903. sp_digit* kInv = k;
  93904. /* Conv k to Montgomery form (mod order) */
  93905. sp_384_mul_12(k, k, p384_norm_order);
  93906. err = sp_384_mod_12(k, k, p384_order);
  93907. if (err == MP_OKAY) {
  93908. sp_384_norm_12(k);
  93909. /* kInv = 1/k mod order */
  93910. sp_384_mont_inv_order_12(kInv, k, tmp);
  93911. sp_384_norm_12(kInv);
  93912. /* s = r * x + e */
  93913. sp_384_mul_12(x, x, r);
  93914. err = sp_384_mod_12(x, x, p384_order);
  93915. }
  93916. if (err == MP_OKAY) {
  93917. sp_384_norm_12(x);
  93918. carry = sp_384_add_12(s, e, x);
  93919. sp_384_cond_sub_12(s, s, p384_order, 0 - carry);
  93920. sp_384_norm_12(s);
  93921. c = sp_384_cmp_12(s, p384_order);
  93922. sp_384_cond_sub_12(s, s, p384_order,
  93923. (sp_digit)0 - (sp_digit)(c >= 0));
  93924. sp_384_norm_12(s);
  93925. /* s = s * k^-1 mod order */
  93926. sp_384_mont_mul_order_12(s, s, kInv);
  93927. sp_384_norm_12(s);
  93928. }
  93929. return err;
  93930. }
  93931. /* Sign the hash using the private key.
  93932. * e = [hash, 384 bits] from binary
  93933. * r = (k.G)->x mod order
  93934. * s = (r * x + e) / k mod order
  93935. * The hash is truncated to the first 384 bits.
  93936. *
  93937. * hash Hash to sign.
  93938. * hashLen Length of the hash data.
  93939. * rng Random number generator.
  93940. * priv Private part of key - scalar.
  93941. * rm First part of result as an mp_int.
  93942. * sm Sirst part of result as an mp_int.
  93943. * heap Heap to use for allocation.
  93944. * returns RNG failures, MEMORY_E when memory allocation fails and
  93945. * MP_OKAY on success.
  93946. */
  93947. int sp_ecc_sign_384(const byte* hash, word32 hashLen, WC_RNG* rng,
  93948. const mp_int* priv, mp_int* rm, mp_int* sm, mp_int* km, void* heap)
  93949. {
  93950. #ifdef WOLFSSL_SP_SMALL_STACK
  93951. sp_digit* e = NULL;
  93952. sp_point_384* point = NULL;
  93953. #else
  93954. sp_digit e[7 * 2 * 12];
  93955. sp_point_384 point[1];
  93956. #endif
  93957. sp_digit* x = NULL;
  93958. sp_digit* k = NULL;
  93959. sp_digit* r = NULL;
  93960. sp_digit* tmp = NULL;
  93961. sp_digit* s = NULL;
  93962. sp_int32 c;
  93963. int err = MP_OKAY;
  93964. int i;
  93965. (void)heap;
  93966. #ifdef WOLFSSL_SP_SMALL_STACK
  93967. if (err == MP_OKAY) {
  93968. point = (sp_point_384*)XMALLOC(sizeof(sp_point_384), heap,
  93969. DYNAMIC_TYPE_ECC);
  93970. if (point == NULL)
  93971. err = MEMORY_E;
  93972. }
  93973. if (err == MP_OKAY) {
  93974. e = (sp_digit*)XMALLOC(sizeof(sp_digit) * 7 * 2 * 12, heap,
  93975. DYNAMIC_TYPE_ECC);
  93976. if (e == NULL)
  93977. err = MEMORY_E;
  93978. }
  93979. #endif
  93980. if (err == MP_OKAY) {
  93981. x = e + 2 * 12;
  93982. k = e + 4 * 12;
  93983. r = e + 6 * 12;
  93984. tmp = e + 8 * 12;
  93985. s = e;
  93986. if (hashLen > 48U) {
  93987. hashLen = 48U;
  93988. }
  93989. }
  93990. for (i = SP_ECC_MAX_SIG_GEN; err == MP_OKAY && i > 0; i--) {
  93991. /* New random point. */
  93992. if (km == NULL || mp_iszero(km)) {
  93993. err = sp_384_ecc_gen_k_12(rng, k);
  93994. }
  93995. else {
  93996. sp_384_from_mp(k, 12, km);
  93997. mp_zero(km);
  93998. }
  93999. if (err == MP_OKAY) {
  94000. err = sp_384_ecc_mulmod_base_12(point, k, 1, 1, heap);
  94001. }
  94002. if (err == MP_OKAY) {
  94003. /* r = point->x mod order */
  94004. XMEMCPY(r, point->x, sizeof(sp_digit) * 12U);
  94005. sp_384_norm_12(r);
  94006. c = sp_384_cmp_12(r, p384_order);
  94007. sp_384_cond_sub_12(r, r, p384_order,
  94008. (sp_digit)0 - (sp_digit)(c >= 0));
  94009. sp_384_norm_12(r);
  94010. if (!sp_384_iszero_12(r)) {
  94011. /* x is modified in calculation of s. */
  94012. sp_384_from_mp(x, 12, priv);
  94013. /* s ptr == e ptr, e is modified in calculation of s. */
  94014. sp_384_from_bin(e, 12, hash, (int)hashLen);
  94015. err = sp_384_calc_s_12(s, r, k, x, e, tmp);
  94016. /* Check that signature is usable. */
  94017. if ((err == MP_OKAY) && (!sp_384_iszero_12(s))) {
  94018. break;
  94019. }
  94020. }
  94021. }
  94022. #ifdef WOLFSSL_ECDSA_SET_K_ONE_LOOP
  94023. i = 1;
  94024. #endif
  94025. }
  94026. if (i == 0) {
  94027. err = RNG_FAILURE_E;
  94028. }
  94029. if (err == MP_OKAY) {
  94030. err = sp_384_to_mp(r, rm);
  94031. }
  94032. if (err == MP_OKAY) {
  94033. err = sp_384_to_mp(s, sm);
  94034. }
  94035. #ifdef WOLFSSL_SP_SMALL_STACK
  94036. if (e != NULL)
  94037. #endif
  94038. {
  94039. ForceZero(e, sizeof(sp_digit) * 7 * 2 * 12);
  94040. #ifdef WOLFSSL_SP_SMALL_STACK
  94041. XFREE(e, heap, DYNAMIC_TYPE_ECC);
  94042. #endif
  94043. }
  94044. #ifdef WOLFSSL_SP_SMALL_STACK
  94045. if (point != NULL)
  94046. #endif
  94047. {
  94048. ForceZero(point, sizeof(sp_point_384));
  94049. #ifdef WOLFSSL_SP_SMALL_STACK
  94050. XFREE(point, heap, DYNAMIC_TYPE_ECC);
  94051. #endif
  94052. }
  94053. return err;
  94054. }
  94055. #ifdef WOLFSSL_SP_NONBLOCK
  94056. typedef struct sp_ecc_sign_384_ctx {
  94057. int state;
  94058. union {
  94059. sp_384_ecc_mulmod_12_ctx mulmod_ctx;
  94060. sp_384_mont_inv_order_12_ctx mont_inv_order_ctx;
  94061. };
  94062. sp_digit e[2*12];
  94063. sp_digit x[2*12];
  94064. sp_digit k[2*12];
  94065. sp_digit r[2*12];
  94066. sp_digit tmp[3 * 2*12];
  94067. sp_point_384 point;
  94068. sp_digit* s;
  94069. sp_digit* kInv;
  94070. int i;
  94071. } sp_ecc_sign_384_ctx;
  94072. int sp_ecc_sign_384_nb(sp_ecc_ctx_t* sp_ctx, const byte* hash, word32 hashLen, WC_RNG* rng,
  94073. mp_int* priv, mp_int* rm, mp_int* sm, mp_int* km, void* heap)
  94074. {
  94075. int err = FP_WOULDBLOCK;
  94076. sp_ecc_sign_384_ctx* ctx = (sp_ecc_sign_384_ctx*)sp_ctx->data;
  94077. typedef char ctx_size_test[sizeof(sp_ecc_sign_384_ctx) >= sizeof(*sp_ctx) ? -1 : 1];
  94078. (void)sizeof(ctx_size_test);
  94079. switch (ctx->state) {
  94080. case 0: /* INIT */
  94081. ctx->s = ctx->e;
  94082. ctx->kInv = ctx->k;
  94083. ctx->i = SP_ECC_MAX_SIG_GEN;
  94084. ctx->state = 1;
  94085. break;
  94086. case 1: /* GEN */
  94087. /* New random point. */
  94088. if (km == NULL || mp_iszero(km)) {
  94089. err = sp_384_ecc_gen_k_12(rng, ctx->k);
  94090. }
  94091. else {
  94092. sp_384_from_mp(ctx->k, 12, km);
  94093. mp_zero(km);
  94094. }
  94095. XMEMSET(&ctx->mulmod_ctx, 0, sizeof(ctx->mulmod_ctx));
  94096. ctx->state = 2;
  94097. break;
  94098. case 2: /* MULMOD */
  94099. err = sp_384_ecc_mulmod_12_nb((sp_ecc_ctx_t*)&ctx->mulmod_ctx,
  94100. &ctx->point, &p384_base, ctx->k, 1, 1, heap);
  94101. if (err == MP_OKAY) {
  94102. ctx->state = 3;
  94103. }
  94104. break;
  94105. case 3: /* MODORDER */
  94106. {
  94107. sp_int32 c;
  94108. /* r = point->x mod order */
  94109. XMEMCPY(ctx->r, ctx->point.x, sizeof(sp_digit) * 12U);
  94110. sp_384_norm_12(ctx->r);
  94111. c = sp_384_cmp_12(ctx->r, p384_order);
  94112. sp_384_cond_sub_12(ctx->r, ctx->r, p384_order,
  94113. (sp_digit)0 - (sp_digit)(c >= 0));
  94114. sp_384_norm_12(ctx->r);
  94115. if (hashLen > 48U) {
  94116. hashLen = 48U;
  94117. }
  94118. sp_384_from_mp(ctx->x, 12, priv);
  94119. sp_384_from_bin(ctx->e, 12, hash, (int)hashLen);
  94120. ctx->state = 4;
  94121. break;
  94122. }
  94123. case 4: /* KMODORDER */
  94124. /* Conv k to Montgomery form (mod order) */
  94125. sp_384_mul_12(ctx->k, ctx->k, p384_norm_order);
  94126. err = sp_384_mod_12(ctx->k, ctx->k, p384_order);
  94127. if (err == MP_OKAY) {
  94128. sp_384_norm_12(ctx->k);
  94129. XMEMSET(&ctx->mont_inv_order_ctx, 0, sizeof(ctx->mont_inv_order_ctx));
  94130. ctx->state = 5;
  94131. }
  94132. break;
  94133. case 5: /* KINV */
  94134. /* kInv = 1/k mod order */
  94135. err = sp_384_mont_inv_order_12_nb((sp_ecc_ctx_t*)&ctx->mont_inv_order_ctx, ctx->kInv, ctx->k, ctx->tmp);
  94136. if (err == MP_OKAY) {
  94137. XMEMSET(&ctx->mont_inv_order_ctx, 0, sizeof(ctx->mont_inv_order_ctx));
  94138. ctx->state = 6;
  94139. }
  94140. break;
  94141. case 6: /* KINVNORM */
  94142. sp_384_norm_12(ctx->kInv);
  94143. ctx->state = 7;
  94144. break;
  94145. case 7: /* R */
  94146. /* s = r * x + e */
  94147. sp_384_mul_12(ctx->x, ctx->x, ctx->r);
  94148. ctx->state = 8;
  94149. break;
  94150. case 8: /* S1 */
  94151. err = sp_384_mod_12(ctx->x, ctx->x, p384_order);
  94152. if (err == MP_OKAY)
  94153. ctx->state = 9;
  94154. break;
  94155. case 9: /* S2 */
  94156. {
  94157. sp_digit carry;
  94158. sp_int32 c;
  94159. sp_384_norm_12(ctx->x);
  94160. carry = sp_384_add_12(ctx->s, ctx->e, ctx->x);
  94161. sp_384_cond_sub_12(ctx->s, ctx->s,
  94162. p384_order, 0 - carry);
  94163. sp_384_norm_12(ctx->s);
  94164. c = sp_384_cmp_12(ctx->s, p384_order);
  94165. sp_384_cond_sub_12(ctx->s, ctx->s, p384_order,
  94166. (sp_digit)0 - (sp_digit)(c >= 0));
  94167. sp_384_norm_12(ctx->s);
  94168. /* s = s * k^-1 mod order */
  94169. sp_384_mont_mul_order_12(ctx->s, ctx->s, ctx->kInv);
  94170. sp_384_norm_12(ctx->s);
  94171. /* Check that signature is usable. */
  94172. if (sp_384_iszero_12(ctx->s) == 0) {
  94173. ctx->state = 10;
  94174. break;
  94175. }
  94176. #ifdef WOLFSSL_ECDSA_SET_K_ONE_LOOP
  94177. ctx->i = 1;
  94178. #endif
  94179. /* not usable gen, try again */
  94180. ctx->i--;
  94181. if (ctx->i == 0) {
  94182. err = RNG_FAILURE_E;
  94183. }
  94184. ctx->state = 1;
  94185. break;
  94186. }
  94187. case 10: /* RES */
  94188. err = sp_384_to_mp(ctx->r, rm);
  94189. if (err == MP_OKAY) {
  94190. err = sp_384_to_mp(ctx->s, sm);
  94191. }
  94192. break;
  94193. }
  94194. if (err == MP_OKAY && ctx->state != 10) {
  94195. err = FP_WOULDBLOCK;
  94196. }
  94197. if (err != FP_WOULDBLOCK) {
  94198. XMEMSET(ctx->e, 0, sizeof(sp_digit) * 2U * 12U);
  94199. XMEMSET(ctx->x, 0, sizeof(sp_digit) * 2U * 12U);
  94200. XMEMSET(ctx->k, 0, sizeof(sp_digit) * 2U * 12U);
  94201. XMEMSET(ctx->r, 0, sizeof(sp_digit) * 2U * 12U);
  94202. XMEMSET(ctx->tmp, 0, sizeof(sp_digit) * 3U * 2U * 12U);
  94203. }
  94204. return err;
  94205. }
  94206. #endif /* WOLFSSL_SP_NONBLOCK */
  94207. #endif /* HAVE_ECC_SIGN */
  94208. #ifndef WOLFSSL_SP_SMALL
  94209. /* Divide the number by 2 mod the modulus. (r = a / 2 % m)
  94210. *
  94211. * r Result of division by 2.
  94212. * a Number to divide.
  94213. * m Modulus.
  94214. */
  94215. static void sp_384_div2_mod_12(sp_digit* r_p, const sp_digit* a_p, const sp_digit* m_p)
  94216. {
  94217. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  94218. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  94219. register const sp_digit* m asm ("r2") = (const sp_digit*)m_p;
  94220. __asm__ __volatile__ (
  94221. "ldm %[a]!, {r4}\n\t"
  94222. "ands r3, r4, #1\n\t"
  94223. "beq L_sp_384_div2_mod_12_even_%=\n\t"
  94224. "mov r12, #0\n\t"
  94225. "ldm %[a]!, {r5, r6, r7}\n\t"
  94226. "ldm %[m]!, {r8, r9, r10, r11}\n\t"
  94227. "adds r4, r4, r8\n\t"
  94228. "adcs r5, r5, r9\n\t"
  94229. "adcs r6, r6, r10\n\t"
  94230. "adcs r7, r7, r11\n\t"
  94231. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  94232. "ldm %[a]!, {r4, r5, r6, r7}\n\t"
  94233. "ldm %[m]!, {r8, r9, r10, r11}\n\t"
  94234. "adcs r4, r4, r8\n\t"
  94235. "adcs r5, r5, r9\n\t"
  94236. "adcs r6, r6, r10\n\t"
  94237. "adcs r7, r7, r11\n\t"
  94238. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  94239. "ldm %[a]!, {r4, r5, r6, r7}\n\t"
  94240. "ldm %[m]!, {r8, r9, r10, r11}\n\t"
  94241. "adcs r4, r4, r8\n\t"
  94242. "adcs r5, r5, r9\n\t"
  94243. "adcs r6, r6, r10\n\t"
  94244. "adcs r7, r7, r11\n\t"
  94245. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  94246. "adc r3, r12, r12\n\t"
  94247. "b L_sp_384_div2_mod_12_div2_%=\n\t"
  94248. "\n"
  94249. "L_sp_384_div2_mod_12_even_%=: \n\t"
  94250. "ldm %[a]!, {r5, r6, r7}\n\t"
  94251. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  94252. "ldm %[a]!, {r4, r5, r6, r7}\n\t"
  94253. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  94254. "ldm %[a]!, {r4, r5, r6, r7}\n\t"
  94255. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  94256. "\n"
  94257. "L_sp_384_div2_mod_12_div2_%=: \n\t"
  94258. "sub %[r], %[r], #48\n\t"
  94259. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  94260. "ldr r8, [%[r]]\n\t"
  94261. "ldr r9, [%[r], #4]\n\t"
  94262. #else
  94263. "ldrd r8, r9, [%[r]]\n\t"
  94264. #endif
  94265. "lsr r8, r8, #1\n\t"
  94266. "orr r8, r8, r9, lsl #31\n\t"
  94267. "lsr r9, r9, #1\n\t"
  94268. "ldr r10, [%[r], #8]\n\t"
  94269. "str r8, [%[r]]\n\t"
  94270. "orr r9, r9, r10, lsl #31\n\t"
  94271. "lsr r10, r10, #1\n\t"
  94272. "ldr r8, [%[r], #12]\n\t"
  94273. "str r9, [%[r], #4]\n\t"
  94274. "orr r10, r10, r8, lsl #31\n\t"
  94275. "lsr r8, r8, #1\n\t"
  94276. "ldr r9, [%[r], #16]\n\t"
  94277. "str r10, [%[r], #8]\n\t"
  94278. "orr r8, r8, r9, lsl #31\n\t"
  94279. "lsr r9, r9, #1\n\t"
  94280. "ldr r10, [%[r], #20]\n\t"
  94281. "str r8, [%[r], #12]\n\t"
  94282. "orr r9, r9, r10, lsl #31\n\t"
  94283. "lsr r10, r10, #1\n\t"
  94284. "ldr r8, [%[r], #24]\n\t"
  94285. "str r9, [%[r], #16]\n\t"
  94286. "orr r10, r10, r8, lsl #31\n\t"
  94287. "lsr r8, r8, #1\n\t"
  94288. "ldr r9, [%[r], #28]\n\t"
  94289. "str r10, [%[r], #20]\n\t"
  94290. "orr r8, r8, r9, lsl #31\n\t"
  94291. "lsr r9, r9, #1\n\t"
  94292. "ldr r10, [%[r], #32]\n\t"
  94293. "str r8, [%[r], #24]\n\t"
  94294. "orr r9, r9, r10, lsl #31\n\t"
  94295. "lsr r10, r10, #1\n\t"
  94296. "ldr r8, [%[r], #36]\n\t"
  94297. "str r9, [%[r], #28]\n\t"
  94298. "orr r10, r10, r8, lsl #31\n\t"
  94299. "lsr r8, r8, #1\n\t"
  94300. "ldr r9, [%[r], #40]\n\t"
  94301. "str r10, [%[r], #32]\n\t"
  94302. "orr r8, r8, r9, lsl #31\n\t"
  94303. "lsr r9, r9, #1\n\t"
  94304. "ldr r10, [%[r], #44]\n\t"
  94305. "str r8, [%[r], #36]\n\t"
  94306. "orr r9, r9, r10, lsl #31\n\t"
  94307. "lsr r10, r10, #1\n\t"
  94308. "orr r10, r10, r3, lsl #31\n\t"
  94309. "str r9, [%[r], #40]\n\t"
  94310. "str r10, [%[r], #44]\n\t"
  94311. : [r] "+r" (r), [a] "+r" (a), [m] "+r" (m)
  94312. :
  94313. : "memory", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r3", "r12", "cc"
  94314. );
  94315. }
  94316. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  94317. static const unsigned char L_sp_384_num_bits_12_table[] = {
  94318. 0x00, 0x01, 0x02, 0x02, 0x03, 0x03, 0x03, 0x03,
  94319. 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04,
  94320. 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05,
  94321. 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05,
  94322. 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
  94323. 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
  94324. 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
  94325. 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
  94326. 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07,
  94327. 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07,
  94328. 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07,
  94329. 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07,
  94330. 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07,
  94331. 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07,
  94332. 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07,
  94333. 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07,
  94334. 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
  94335. 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
  94336. 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
  94337. 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
  94338. 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
  94339. 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
  94340. 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
  94341. 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
  94342. 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
  94343. 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
  94344. 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
  94345. 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
  94346. 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
  94347. 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
  94348. 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
  94349. 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
  94350. };
  94351. static int sp_384_num_bits_12(const sp_digit* a_p)
  94352. {
  94353. register const sp_digit* a asm ("r0") = (const sp_digit*)a_p;
  94354. register unsigned char* L_sp_384_num_bits_12_table_c asm ("r1") = (unsigned char*)&L_sp_384_num_bits_12_table;
  94355. __asm__ __volatile__ (
  94356. "mov lr, %[L_sp_384_num_bits_12_table]\n\t"
  94357. "ldr r1, [%[a], #44]\n\t"
  94358. "cmp r1, #0\n\t"
  94359. "beq L_sp_384_num_bits_12_11_%=\n\t"
  94360. "lsr r3, r1, #24\n\t"
  94361. "cmp r3, #0\n\t"
  94362. "beq L_sp_384_num_bits_12_11_3_%=\n\t"
  94363. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  94364. "mov r2, #0x1\n\t"
  94365. "lsl r2, r2, #8\n\t"
  94366. "add r2, r2, #0x78\n\t"
  94367. #else
  94368. "mov r2, #0x178\n\t"
  94369. #endif
  94370. "ldrb r12, [lr, r3]\n\t"
  94371. "add r12, r2, r12\n\t"
  94372. "b L_sp_384_num_bits_12_13_%=\n\t"
  94373. "\n"
  94374. "L_sp_384_num_bits_12_11_3_%=: \n\t"
  94375. "lsr r3, r1, #16\n\t"
  94376. "and r3, r3, #0xff\n\t"
  94377. "cmp r3, #0\n\t"
  94378. "beq L_sp_384_num_bits_12_11_2_%=\n\t"
  94379. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  94380. "mov r2, #0x1\n\t"
  94381. "lsl r2, r2, #8\n\t"
  94382. "add r2, r2, #0x70\n\t"
  94383. #else
  94384. "mov r2, #0x170\n\t"
  94385. #endif
  94386. "ldrb r12, [lr, r3]\n\t"
  94387. "add r12, r2, r12\n\t"
  94388. "b L_sp_384_num_bits_12_13_%=\n\t"
  94389. "\n"
  94390. "L_sp_384_num_bits_12_11_2_%=: \n\t"
  94391. "lsr r3, r1, #8\n\t"
  94392. "and r3, r3, #0xff\n\t"
  94393. "cmp r3, #0\n\t"
  94394. "beq L_sp_384_num_bits_12_11_1_%=\n\t"
  94395. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  94396. "mov r2, #0x1\n\t"
  94397. "lsl r2, r2, #8\n\t"
  94398. "add r2, r2, #0x68\n\t"
  94399. #else
  94400. "mov r2, #0x168\n\t"
  94401. #endif
  94402. "ldrb r12, [lr, r3]\n\t"
  94403. "add r12, r2, r12\n\t"
  94404. "b L_sp_384_num_bits_12_13_%=\n\t"
  94405. "\n"
  94406. "L_sp_384_num_bits_12_11_1_%=: \n\t"
  94407. "and r3, r1, #0xff\n\t"
  94408. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  94409. "mov r2, #0x1\n\t"
  94410. "lsl r2, r2, #8\n\t"
  94411. "add r2, r2, #0x60\n\t"
  94412. #else
  94413. "mov r2, #0x160\n\t"
  94414. #endif
  94415. "ldrb r12, [lr, r3]\n\t"
  94416. "add r12, r2, r12\n\t"
  94417. "b L_sp_384_num_bits_12_13_%=\n\t"
  94418. "\n"
  94419. "L_sp_384_num_bits_12_11_%=: \n\t"
  94420. "ldr r1, [%[a], #40]\n\t"
  94421. "cmp r1, #0\n\t"
  94422. "beq L_sp_384_num_bits_12_10_%=\n\t"
  94423. "lsr r3, r1, #24\n\t"
  94424. "cmp r3, #0\n\t"
  94425. "beq L_sp_384_num_bits_12_10_3_%=\n\t"
  94426. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  94427. "mov r2, #0x1\n\t"
  94428. "lsl r2, r2, #8\n\t"
  94429. "add r2, r2, #0x58\n\t"
  94430. #else
  94431. "mov r2, #0x158\n\t"
  94432. #endif
  94433. "ldrb r12, [lr, r3]\n\t"
  94434. "add r12, r2, r12\n\t"
  94435. "b L_sp_384_num_bits_12_13_%=\n\t"
  94436. "\n"
  94437. "L_sp_384_num_bits_12_10_3_%=: \n\t"
  94438. "lsr r3, r1, #16\n\t"
  94439. "and r3, r3, #0xff\n\t"
  94440. "cmp r3, #0\n\t"
  94441. "beq L_sp_384_num_bits_12_10_2_%=\n\t"
  94442. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  94443. "mov r2, #0x1\n\t"
  94444. "lsl r2, r2, #8\n\t"
  94445. "add r2, r2, #0x50\n\t"
  94446. #else
  94447. "mov r2, #0x150\n\t"
  94448. #endif
  94449. "ldrb r12, [lr, r3]\n\t"
  94450. "add r12, r2, r12\n\t"
  94451. "b L_sp_384_num_bits_12_13_%=\n\t"
  94452. "\n"
  94453. "L_sp_384_num_bits_12_10_2_%=: \n\t"
  94454. "lsr r3, r1, #8\n\t"
  94455. "and r3, r3, #0xff\n\t"
  94456. "cmp r3, #0\n\t"
  94457. "beq L_sp_384_num_bits_12_10_1_%=\n\t"
  94458. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  94459. "mov r2, #0x1\n\t"
  94460. "lsl r2, r2, #8\n\t"
  94461. "add r2, r2, #0x48\n\t"
  94462. #else
  94463. "mov r2, #0x148\n\t"
  94464. #endif
  94465. "ldrb r12, [lr, r3]\n\t"
  94466. "add r12, r2, r12\n\t"
  94467. "b L_sp_384_num_bits_12_13_%=\n\t"
  94468. "\n"
  94469. "L_sp_384_num_bits_12_10_1_%=: \n\t"
  94470. "and r3, r1, #0xff\n\t"
  94471. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  94472. "mov r2, #0x1\n\t"
  94473. "lsl r2, r2, #8\n\t"
  94474. "add r2, r2, #0x40\n\t"
  94475. #else
  94476. "mov r2, #0x140\n\t"
  94477. #endif
  94478. "ldrb r12, [lr, r3]\n\t"
  94479. "add r12, r2, r12\n\t"
  94480. "b L_sp_384_num_bits_12_13_%=\n\t"
  94481. "\n"
  94482. "L_sp_384_num_bits_12_10_%=: \n\t"
  94483. "ldr r1, [%[a], #36]\n\t"
  94484. "cmp r1, #0\n\t"
  94485. "beq L_sp_384_num_bits_12_9_%=\n\t"
  94486. "lsr r3, r1, #24\n\t"
  94487. "cmp r3, #0\n\t"
  94488. "beq L_sp_384_num_bits_12_9_3_%=\n\t"
  94489. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  94490. "mov r2, #0x1\n\t"
  94491. "lsl r2, r2, #8\n\t"
  94492. "add r2, r2, #0x38\n\t"
  94493. #else
  94494. "mov r2, #0x138\n\t"
  94495. #endif
  94496. "ldrb r12, [lr, r3]\n\t"
  94497. "add r12, r2, r12\n\t"
  94498. "b L_sp_384_num_bits_12_13_%=\n\t"
  94499. "\n"
  94500. "L_sp_384_num_bits_12_9_3_%=: \n\t"
  94501. "lsr r3, r1, #16\n\t"
  94502. "and r3, r3, #0xff\n\t"
  94503. "cmp r3, #0\n\t"
  94504. "beq L_sp_384_num_bits_12_9_2_%=\n\t"
  94505. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  94506. "mov r2, #0x1\n\t"
  94507. "lsl r2, r2, #8\n\t"
  94508. "add r2, r2, #0x30\n\t"
  94509. #else
  94510. "mov r2, #0x130\n\t"
  94511. #endif
  94512. "ldrb r12, [lr, r3]\n\t"
  94513. "add r12, r2, r12\n\t"
  94514. "b L_sp_384_num_bits_12_13_%=\n\t"
  94515. "\n"
  94516. "L_sp_384_num_bits_12_9_2_%=: \n\t"
  94517. "lsr r3, r1, #8\n\t"
  94518. "and r3, r3, #0xff\n\t"
  94519. "cmp r3, #0\n\t"
  94520. "beq L_sp_384_num_bits_12_9_1_%=\n\t"
  94521. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  94522. "mov r2, #0x1\n\t"
  94523. "lsl r2, r2, #8\n\t"
  94524. "add r2, r2, #0x28\n\t"
  94525. #else
  94526. "mov r2, #0x128\n\t"
  94527. #endif
  94528. "ldrb r12, [lr, r3]\n\t"
  94529. "add r12, r2, r12\n\t"
  94530. "b L_sp_384_num_bits_12_13_%=\n\t"
  94531. "\n"
  94532. "L_sp_384_num_bits_12_9_1_%=: \n\t"
  94533. "and r3, r1, #0xff\n\t"
  94534. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  94535. "mov r2, #0x1\n\t"
  94536. "lsl r2, r2, #8\n\t"
  94537. "add r2, r2, #0x20\n\t"
  94538. #else
  94539. "mov r2, #0x120\n\t"
  94540. #endif
  94541. "ldrb r12, [lr, r3]\n\t"
  94542. "add r12, r2, r12\n\t"
  94543. "b L_sp_384_num_bits_12_13_%=\n\t"
  94544. "\n"
  94545. "L_sp_384_num_bits_12_9_%=: \n\t"
  94546. "ldr r1, [%[a], #32]\n\t"
  94547. "cmp r1, #0\n\t"
  94548. "beq L_sp_384_num_bits_12_8_%=\n\t"
  94549. "lsr r3, r1, #24\n\t"
  94550. "cmp r3, #0\n\t"
  94551. "beq L_sp_384_num_bits_12_8_3_%=\n\t"
  94552. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  94553. "mov r2, #0x1\n\t"
  94554. "lsl r2, r2, #8\n\t"
  94555. "add r2, r2, #0x18\n\t"
  94556. #else
  94557. "mov r2, #0x118\n\t"
  94558. #endif
  94559. "ldrb r12, [lr, r3]\n\t"
  94560. "add r12, r2, r12\n\t"
  94561. "b L_sp_384_num_bits_12_13_%=\n\t"
  94562. "\n"
  94563. "L_sp_384_num_bits_12_8_3_%=: \n\t"
  94564. "lsr r3, r1, #16\n\t"
  94565. "and r3, r3, #0xff\n\t"
  94566. "cmp r3, #0\n\t"
  94567. "beq L_sp_384_num_bits_12_8_2_%=\n\t"
  94568. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  94569. "mov r2, #0x1\n\t"
  94570. "lsl r2, r2, #8\n\t"
  94571. "add r2, r2, #0x10\n\t"
  94572. #else
  94573. "mov r2, #0x110\n\t"
  94574. #endif
  94575. "ldrb r12, [lr, r3]\n\t"
  94576. "add r12, r2, r12\n\t"
  94577. "b L_sp_384_num_bits_12_13_%=\n\t"
  94578. "\n"
  94579. "L_sp_384_num_bits_12_8_2_%=: \n\t"
  94580. "lsr r3, r1, #8\n\t"
  94581. "and r3, r3, #0xff\n\t"
  94582. "cmp r3, #0\n\t"
  94583. "beq L_sp_384_num_bits_12_8_1_%=\n\t"
  94584. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  94585. "mov r2, #0x1\n\t"
  94586. "lsl r2, r2, #8\n\t"
  94587. "add r2, r2, #0x8\n\t"
  94588. #else
  94589. "mov r2, #0x108\n\t"
  94590. #endif
  94591. "ldrb r12, [lr, r3]\n\t"
  94592. "add r12, r2, r12\n\t"
  94593. "b L_sp_384_num_bits_12_13_%=\n\t"
  94594. "\n"
  94595. "L_sp_384_num_bits_12_8_1_%=: \n\t"
  94596. "and r3, r1, #0xff\n\t"
  94597. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  94598. "mov r2, #0x1\n\t"
  94599. "lsl r2, r2, #8\n\t"
  94600. "add r2, r2, #0x0\n\t"
  94601. #else
  94602. "mov r2, #0x100\n\t"
  94603. #endif
  94604. "ldrb r12, [lr, r3]\n\t"
  94605. "add r12, r2, r12\n\t"
  94606. "b L_sp_384_num_bits_12_13_%=\n\t"
  94607. "\n"
  94608. "L_sp_384_num_bits_12_8_%=: \n\t"
  94609. "ldr r1, [%[a], #28]\n\t"
  94610. "cmp r1, #0\n\t"
  94611. "beq L_sp_384_num_bits_12_7_%=\n\t"
  94612. "lsr r3, r1, #24\n\t"
  94613. "cmp r3, #0\n\t"
  94614. "beq L_sp_384_num_bits_12_7_3_%=\n\t"
  94615. "mov r2, #0xf8\n\t"
  94616. "ldrb r12, [lr, r3]\n\t"
  94617. "add r12, r2, r12\n\t"
  94618. "b L_sp_384_num_bits_12_13_%=\n\t"
  94619. "\n"
  94620. "L_sp_384_num_bits_12_7_3_%=: \n\t"
  94621. "lsr r3, r1, #16\n\t"
  94622. "and r3, r3, #0xff\n\t"
  94623. "cmp r3, #0\n\t"
  94624. "beq L_sp_384_num_bits_12_7_2_%=\n\t"
  94625. "mov r2, #0xf0\n\t"
  94626. "ldrb r12, [lr, r3]\n\t"
  94627. "add r12, r2, r12\n\t"
  94628. "b L_sp_384_num_bits_12_13_%=\n\t"
  94629. "\n"
  94630. "L_sp_384_num_bits_12_7_2_%=: \n\t"
  94631. "lsr r3, r1, #8\n\t"
  94632. "and r3, r3, #0xff\n\t"
  94633. "cmp r3, #0\n\t"
  94634. "beq L_sp_384_num_bits_12_7_1_%=\n\t"
  94635. "mov r2, #0xe8\n\t"
  94636. "ldrb r12, [lr, r3]\n\t"
  94637. "add r12, r2, r12\n\t"
  94638. "b L_sp_384_num_bits_12_13_%=\n\t"
  94639. "\n"
  94640. "L_sp_384_num_bits_12_7_1_%=: \n\t"
  94641. "and r3, r1, #0xff\n\t"
  94642. "mov r2, #0xe0\n\t"
  94643. "ldrb r12, [lr, r3]\n\t"
  94644. "add r12, r2, r12\n\t"
  94645. "b L_sp_384_num_bits_12_13_%=\n\t"
  94646. "\n"
  94647. "L_sp_384_num_bits_12_7_%=: \n\t"
  94648. "ldr r1, [%[a], #24]\n\t"
  94649. "cmp r1, #0\n\t"
  94650. "beq L_sp_384_num_bits_12_6_%=\n\t"
  94651. "lsr r3, r1, #24\n\t"
  94652. "cmp r3, #0\n\t"
  94653. "beq L_sp_384_num_bits_12_6_3_%=\n\t"
  94654. "mov r2, #0xd8\n\t"
  94655. "ldrb r12, [lr, r3]\n\t"
  94656. "add r12, r2, r12\n\t"
  94657. "b L_sp_384_num_bits_12_13_%=\n\t"
  94658. "\n"
  94659. "L_sp_384_num_bits_12_6_3_%=: \n\t"
  94660. "lsr r3, r1, #16\n\t"
  94661. "and r3, r3, #0xff\n\t"
  94662. "cmp r3, #0\n\t"
  94663. "beq L_sp_384_num_bits_12_6_2_%=\n\t"
  94664. "mov r2, #0xd0\n\t"
  94665. "ldrb r12, [lr, r3]\n\t"
  94666. "add r12, r2, r12\n\t"
  94667. "b L_sp_384_num_bits_12_13_%=\n\t"
  94668. "\n"
  94669. "L_sp_384_num_bits_12_6_2_%=: \n\t"
  94670. "lsr r3, r1, #8\n\t"
  94671. "and r3, r3, #0xff\n\t"
  94672. "cmp r3, #0\n\t"
  94673. "beq L_sp_384_num_bits_12_6_1_%=\n\t"
  94674. "mov r2, #0xc8\n\t"
  94675. "ldrb r12, [lr, r3]\n\t"
  94676. "add r12, r2, r12\n\t"
  94677. "b L_sp_384_num_bits_12_13_%=\n\t"
  94678. "\n"
  94679. "L_sp_384_num_bits_12_6_1_%=: \n\t"
  94680. "and r3, r1, #0xff\n\t"
  94681. "mov r2, #0xc0\n\t"
  94682. "ldrb r12, [lr, r3]\n\t"
  94683. "add r12, r2, r12\n\t"
  94684. "b L_sp_384_num_bits_12_13_%=\n\t"
  94685. "\n"
  94686. "L_sp_384_num_bits_12_6_%=: \n\t"
  94687. "ldr r1, [%[a], #20]\n\t"
  94688. "cmp r1, #0\n\t"
  94689. "beq L_sp_384_num_bits_12_5_%=\n\t"
  94690. "lsr r3, r1, #24\n\t"
  94691. "cmp r3, #0\n\t"
  94692. "beq L_sp_384_num_bits_12_5_3_%=\n\t"
  94693. "mov r2, #0xb8\n\t"
  94694. "ldrb r12, [lr, r3]\n\t"
  94695. "add r12, r2, r12\n\t"
  94696. "b L_sp_384_num_bits_12_13_%=\n\t"
  94697. "\n"
  94698. "L_sp_384_num_bits_12_5_3_%=: \n\t"
  94699. "lsr r3, r1, #16\n\t"
  94700. "and r3, r3, #0xff\n\t"
  94701. "cmp r3, #0\n\t"
  94702. "beq L_sp_384_num_bits_12_5_2_%=\n\t"
  94703. "mov r2, #0xb0\n\t"
  94704. "ldrb r12, [lr, r3]\n\t"
  94705. "add r12, r2, r12\n\t"
  94706. "b L_sp_384_num_bits_12_13_%=\n\t"
  94707. "\n"
  94708. "L_sp_384_num_bits_12_5_2_%=: \n\t"
  94709. "lsr r3, r1, #8\n\t"
  94710. "and r3, r3, #0xff\n\t"
  94711. "cmp r3, #0\n\t"
  94712. "beq L_sp_384_num_bits_12_5_1_%=\n\t"
  94713. "mov r2, #0xa8\n\t"
  94714. "ldrb r12, [lr, r3]\n\t"
  94715. "add r12, r2, r12\n\t"
  94716. "b L_sp_384_num_bits_12_13_%=\n\t"
  94717. "\n"
  94718. "L_sp_384_num_bits_12_5_1_%=: \n\t"
  94719. "and r3, r1, #0xff\n\t"
  94720. "mov r2, #0xa0\n\t"
  94721. "ldrb r12, [lr, r3]\n\t"
  94722. "add r12, r2, r12\n\t"
  94723. "b L_sp_384_num_bits_12_13_%=\n\t"
  94724. "\n"
  94725. "L_sp_384_num_bits_12_5_%=: \n\t"
  94726. "ldr r1, [%[a], #16]\n\t"
  94727. "cmp r1, #0\n\t"
  94728. "beq L_sp_384_num_bits_12_4_%=\n\t"
  94729. "lsr r3, r1, #24\n\t"
  94730. "cmp r3, #0\n\t"
  94731. "beq L_sp_384_num_bits_12_4_3_%=\n\t"
  94732. "mov r2, #0x98\n\t"
  94733. "ldrb r12, [lr, r3]\n\t"
  94734. "add r12, r2, r12\n\t"
  94735. "b L_sp_384_num_bits_12_13_%=\n\t"
  94736. "\n"
  94737. "L_sp_384_num_bits_12_4_3_%=: \n\t"
  94738. "lsr r3, r1, #16\n\t"
  94739. "and r3, r3, #0xff\n\t"
  94740. "cmp r3, #0\n\t"
  94741. "beq L_sp_384_num_bits_12_4_2_%=\n\t"
  94742. "mov r2, #0x90\n\t"
  94743. "ldrb r12, [lr, r3]\n\t"
  94744. "add r12, r2, r12\n\t"
  94745. "b L_sp_384_num_bits_12_13_%=\n\t"
  94746. "\n"
  94747. "L_sp_384_num_bits_12_4_2_%=: \n\t"
  94748. "lsr r3, r1, #8\n\t"
  94749. "and r3, r3, #0xff\n\t"
  94750. "cmp r3, #0\n\t"
  94751. "beq L_sp_384_num_bits_12_4_1_%=\n\t"
  94752. "mov r2, #0x88\n\t"
  94753. "ldrb r12, [lr, r3]\n\t"
  94754. "add r12, r2, r12\n\t"
  94755. "b L_sp_384_num_bits_12_13_%=\n\t"
  94756. "\n"
  94757. "L_sp_384_num_bits_12_4_1_%=: \n\t"
  94758. "and r3, r1, #0xff\n\t"
  94759. "mov r2, #0x80\n\t"
  94760. "ldrb r12, [lr, r3]\n\t"
  94761. "add r12, r2, r12\n\t"
  94762. "b L_sp_384_num_bits_12_13_%=\n\t"
  94763. "\n"
  94764. "L_sp_384_num_bits_12_4_%=: \n\t"
  94765. "ldr r1, [%[a], #12]\n\t"
  94766. "cmp r1, #0\n\t"
  94767. "beq L_sp_384_num_bits_12_3_%=\n\t"
  94768. "lsr r3, r1, #24\n\t"
  94769. "cmp r3, #0\n\t"
  94770. "beq L_sp_384_num_bits_12_3_3_%=\n\t"
  94771. "mov r2, #0x78\n\t"
  94772. "ldrb r12, [lr, r3]\n\t"
  94773. "add r12, r2, r12\n\t"
  94774. "b L_sp_384_num_bits_12_13_%=\n\t"
  94775. "\n"
  94776. "L_sp_384_num_bits_12_3_3_%=: \n\t"
  94777. "lsr r3, r1, #16\n\t"
  94778. "and r3, r3, #0xff\n\t"
  94779. "cmp r3, #0\n\t"
  94780. "beq L_sp_384_num_bits_12_3_2_%=\n\t"
  94781. "mov r2, #0x70\n\t"
  94782. "ldrb r12, [lr, r3]\n\t"
  94783. "add r12, r2, r12\n\t"
  94784. "b L_sp_384_num_bits_12_13_%=\n\t"
  94785. "\n"
  94786. "L_sp_384_num_bits_12_3_2_%=: \n\t"
  94787. "lsr r3, r1, #8\n\t"
  94788. "and r3, r3, #0xff\n\t"
  94789. "cmp r3, #0\n\t"
  94790. "beq L_sp_384_num_bits_12_3_1_%=\n\t"
  94791. "mov r2, #0x68\n\t"
  94792. "ldrb r12, [lr, r3]\n\t"
  94793. "add r12, r2, r12\n\t"
  94794. "b L_sp_384_num_bits_12_13_%=\n\t"
  94795. "\n"
  94796. "L_sp_384_num_bits_12_3_1_%=: \n\t"
  94797. "and r3, r1, #0xff\n\t"
  94798. "mov r2, #0x60\n\t"
  94799. "ldrb r12, [lr, r3]\n\t"
  94800. "add r12, r2, r12\n\t"
  94801. "b L_sp_384_num_bits_12_13_%=\n\t"
  94802. "\n"
  94803. "L_sp_384_num_bits_12_3_%=: \n\t"
  94804. "ldr r1, [%[a], #8]\n\t"
  94805. "cmp r1, #0\n\t"
  94806. "beq L_sp_384_num_bits_12_2_%=\n\t"
  94807. "lsr r3, r1, #24\n\t"
  94808. "cmp r3, #0\n\t"
  94809. "beq L_sp_384_num_bits_12_2_3_%=\n\t"
  94810. "mov r2, #0x58\n\t"
  94811. "ldrb r12, [lr, r3]\n\t"
  94812. "add r12, r2, r12\n\t"
  94813. "b L_sp_384_num_bits_12_13_%=\n\t"
  94814. "\n"
  94815. "L_sp_384_num_bits_12_2_3_%=: \n\t"
  94816. "lsr r3, r1, #16\n\t"
  94817. "and r3, r3, #0xff\n\t"
  94818. "cmp r3, #0\n\t"
  94819. "beq L_sp_384_num_bits_12_2_2_%=\n\t"
  94820. "mov r2, #0x50\n\t"
  94821. "ldrb r12, [lr, r3]\n\t"
  94822. "add r12, r2, r12\n\t"
  94823. "b L_sp_384_num_bits_12_13_%=\n\t"
  94824. "\n"
  94825. "L_sp_384_num_bits_12_2_2_%=: \n\t"
  94826. "lsr r3, r1, #8\n\t"
  94827. "and r3, r3, #0xff\n\t"
  94828. "cmp r3, #0\n\t"
  94829. "beq L_sp_384_num_bits_12_2_1_%=\n\t"
  94830. "mov r2, #0x48\n\t"
  94831. "ldrb r12, [lr, r3]\n\t"
  94832. "add r12, r2, r12\n\t"
  94833. "b L_sp_384_num_bits_12_13_%=\n\t"
  94834. "\n"
  94835. "L_sp_384_num_bits_12_2_1_%=: \n\t"
  94836. "and r3, r1, #0xff\n\t"
  94837. "mov r2, #0x40\n\t"
  94838. "ldrb r12, [lr, r3]\n\t"
  94839. "add r12, r2, r12\n\t"
  94840. "b L_sp_384_num_bits_12_13_%=\n\t"
  94841. "\n"
  94842. "L_sp_384_num_bits_12_2_%=: \n\t"
  94843. "ldr r1, [%[a], #4]\n\t"
  94844. "cmp r1, #0\n\t"
  94845. "beq L_sp_384_num_bits_12_1_%=\n\t"
  94846. "lsr r3, r1, #24\n\t"
  94847. "cmp r3, #0\n\t"
  94848. "beq L_sp_384_num_bits_12_1_3_%=\n\t"
  94849. "mov r2, #56\n\t"
  94850. "ldrb r12, [lr, r3]\n\t"
  94851. "add r12, r2, r12\n\t"
  94852. "b L_sp_384_num_bits_12_13_%=\n\t"
  94853. "\n"
  94854. "L_sp_384_num_bits_12_1_3_%=: \n\t"
  94855. "lsr r3, r1, #16\n\t"
  94856. "and r3, r3, #0xff\n\t"
  94857. "cmp r3, #0\n\t"
  94858. "beq L_sp_384_num_bits_12_1_2_%=\n\t"
  94859. "mov r2, #48\n\t"
  94860. "ldrb r12, [lr, r3]\n\t"
  94861. "add r12, r2, r12\n\t"
  94862. "b L_sp_384_num_bits_12_13_%=\n\t"
  94863. "\n"
  94864. "L_sp_384_num_bits_12_1_2_%=: \n\t"
  94865. "lsr r3, r1, #8\n\t"
  94866. "and r3, r3, #0xff\n\t"
  94867. "cmp r3, #0\n\t"
  94868. "beq L_sp_384_num_bits_12_1_1_%=\n\t"
  94869. "mov r2, #40\n\t"
  94870. "ldrb r12, [lr, r3]\n\t"
  94871. "add r12, r2, r12\n\t"
  94872. "b L_sp_384_num_bits_12_13_%=\n\t"
  94873. "\n"
  94874. "L_sp_384_num_bits_12_1_1_%=: \n\t"
  94875. "and r3, r1, #0xff\n\t"
  94876. "mov r2, #32\n\t"
  94877. "ldrb r12, [lr, r3]\n\t"
  94878. "add r12, r2, r12\n\t"
  94879. "b L_sp_384_num_bits_12_13_%=\n\t"
  94880. "\n"
  94881. "L_sp_384_num_bits_12_1_%=: \n\t"
  94882. "ldr r1, [%[a]]\n\t"
  94883. "lsr r3, r1, #24\n\t"
  94884. "cmp r3, #0\n\t"
  94885. "beq L_sp_384_num_bits_12_0_3_%=\n\t"
  94886. "mov r2, #24\n\t"
  94887. "ldrb r12, [lr, r3]\n\t"
  94888. "add r12, r2, r12\n\t"
  94889. "b L_sp_384_num_bits_12_13_%=\n\t"
  94890. "\n"
  94891. "L_sp_384_num_bits_12_0_3_%=: \n\t"
  94892. "lsr r3, r1, #16\n\t"
  94893. "and r3, r3, #0xff\n\t"
  94894. "cmp r3, #0\n\t"
  94895. "beq L_sp_384_num_bits_12_0_2_%=\n\t"
  94896. "mov r2, #16\n\t"
  94897. "ldrb r12, [lr, r3]\n\t"
  94898. "add r12, r2, r12\n\t"
  94899. "b L_sp_384_num_bits_12_13_%=\n\t"
  94900. "\n"
  94901. "L_sp_384_num_bits_12_0_2_%=: \n\t"
  94902. "lsr r3, r1, #8\n\t"
  94903. "and r3, r3, #0xff\n\t"
  94904. "cmp r3, #0\n\t"
  94905. "beq L_sp_384_num_bits_12_0_1_%=\n\t"
  94906. "mov r2, #8\n\t"
  94907. "ldrb r12, [lr, r3]\n\t"
  94908. "add r12, r2, r12\n\t"
  94909. "b L_sp_384_num_bits_12_13_%=\n\t"
  94910. "\n"
  94911. "L_sp_384_num_bits_12_0_1_%=: \n\t"
  94912. "and r3, r1, #0xff\n\t"
  94913. "ldrb r12, [lr, r3]\n\t"
  94914. "\n"
  94915. "L_sp_384_num_bits_12_13_%=: \n\t"
  94916. "mov %[a], r12\n\t"
  94917. : [a] "+r" (a), [L_sp_384_num_bits_12_table] "+r" (L_sp_384_num_bits_12_table_c)
  94918. :
  94919. : "memory", "r2", "r3", "r12", "lr", "cc"
  94920. );
  94921. return (uint32_t)(size_t)a;
  94922. }
  94923. #else
  94924. static int sp_384_num_bits_12(const sp_digit* a_p)
  94925. {
  94926. register const sp_digit* a asm ("r0") = (const sp_digit*)a_p;
  94927. __asm__ __volatile__ (
  94928. "ldr r1, [%[a], #44]\n\t"
  94929. "cmp r1, #0\n\t"
  94930. "beq L_sp_384_num_bits_12_11_%=\n\t"
  94931. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  94932. "mov r2, #0x1\n\t"
  94933. "lsl r2, r2, #8\n\t"
  94934. "add r2, r2, #0x80\n\t"
  94935. #else
  94936. "mov r2, #0x180\n\t"
  94937. #endif
  94938. "clz r12, r1\n\t"
  94939. "sub r12, r2, r12\n\t"
  94940. "b L_sp_384_num_bits_12_13_%=\n\t"
  94941. "\n"
  94942. "L_sp_384_num_bits_12_11_%=: \n\t"
  94943. "ldr r1, [%[a], #40]\n\t"
  94944. "cmp r1, #0\n\t"
  94945. "beq L_sp_384_num_bits_12_10_%=\n\t"
  94946. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  94947. "mov r2, #0x1\n\t"
  94948. "lsl r2, r2, #8\n\t"
  94949. "add r2, r2, #0x60\n\t"
  94950. #else
  94951. "mov r2, #0x160\n\t"
  94952. #endif
  94953. "clz r12, r1\n\t"
  94954. "sub r12, r2, r12\n\t"
  94955. "b L_sp_384_num_bits_12_13_%=\n\t"
  94956. "\n"
  94957. "L_sp_384_num_bits_12_10_%=: \n\t"
  94958. "ldr r1, [%[a], #36]\n\t"
  94959. "cmp r1, #0\n\t"
  94960. "beq L_sp_384_num_bits_12_9_%=\n\t"
  94961. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  94962. "mov r2, #0x1\n\t"
  94963. "lsl r2, r2, #8\n\t"
  94964. "add r2, r2, #0x40\n\t"
  94965. #else
  94966. "mov r2, #0x140\n\t"
  94967. #endif
  94968. "clz r12, r1\n\t"
  94969. "sub r12, r2, r12\n\t"
  94970. "b L_sp_384_num_bits_12_13_%=\n\t"
  94971. "\n"
  94972. "L_sp_384_num_bits_12_9_%=: \n\t"
  94973. "ldr r1, [%[a], #32]\n\t"
  94974. "cmp r1, #0\n\t"
  94975. "beq L_sp_384_num_bits_12_8_%=\n\t"
  94976. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  94977. "mov r2, #0x1\n\t"
  94978. "lsl r2, r2, #8\n\t"
  94979. "add r2, r2, #0x20\n\t"
  94980. #else
  94981. "mov r2, #0x120\n\t"
  94982. #endif
  94983. "clz r12, r1\n\t"
  94984. "sub r12, r2, r12\n\t"
  94985. "b L_sp_384_num_bits_12_13_%=\n\t"
  94986. "\n"
  94987. "L_sp_384_num_bits_12_8_%=: \n\t"
  94988. "ldr r1, [%[a], #28]\n\t"
  94989. "cmp r1, #0\n\t"
  94990. "beq L_sp_384_num_bits_12_7_%=\n\t"
  94991. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  94992. "mov r2, #0x1\n\t"
  94993. "lsl r2, r2, #8\n\t"
  94994. "add r2, r2, #0x0\n\t"
  94995. #else
  94996. "mov r2, #0x100\n\t"
  94997. #endif
  94998. "clz r12, r1\n\t"
  94999. "sub r12, r2, r12\n\t"
  95000. "b L_sp_384_num_bits_12_13_%=\n\t"
  95001. "\n"
  95002. "L_sp_384_num_bits_12_7_%=: \n\t"
  95003. "ldr r1, [%[a], #24]\n\t"
  95004. "cmp r1, #0\n\t"
  95005. "beq L_sp_384_num_bits_12_6_%=\n\t"
  95006. "mov r2, #0xe0\n\t"
  95007. "clz r12, r1\n\t"
  95008. "sub r12, r2, r12\n\t"
  95009. "b L_sp_384_num_bits_12_13_%=\n\t"
  95010. "\n"
  95011. "L_sp_384_num_bits_12_6_%=: \n\t"
  95012. "ldr r1, [%[a], #20]\n\t"
  95013. "cmp r1, #0\n\t"
  95014. "beq L_sp_384_num_bits_12_5_%=\n\t"
  95015. "mov r2, #0xc0\n\t"
  95016. "clz r12, r1\n\t"
  95017. "sub r12, r2, r12\n\t"
  95018. "b L_sp_384_num_bits_12_13_%=\n\t"
  95019. "\n"
  95020. "L_sp_384_num_bits_12_5_%=: \n\t"
  95021. "ldr r1, [%[a], #16]\n\t"
  95022. "cmp r1, #0\n\t"
  95023. "beq L_sp_384_num_bits_12_4_%=\n\t"
  95024. "mov r2, #0xa0\n\t"
  95025. "clz r12, r1\n\t"
  95026. "sub r12, r2, r12\n\t"
  95027. "b L_sp_384_num_bits_12_13_%=\n\t"
  95028. "\n"
  95029. "L_sp_384_num_bits_12_4_%=: \n\t"
  95030. "ldr r1, [%[a], #12]\n\t"
  95031. "cmp r1, #0\n\t"
  95032. "beq L_sp_384_num_bits_12_3_%=\n\t"
  95033. "mov r2, #0x80\n\t"
  95034. "clz r12, r1\n\t"
  95035. "sub r12, r2, r12\n\t"
  95036. "b L_sp_384_num_bits_12_13_%=\n\t"
  95037. "\n"
  95038. "L_sp_384_num_bits_12_3_%=: \n\t"
  95039. "ldr r1, [%[a], #8]\n\t"
  95040. "cmp r1, #0\n\t"
  95041. "beq L_sp_384_num_bits_12_2_%=\n\t"
  95042. "mov r2, #0x60\n\t"
  95043. "clz r12, r1\n\t"
  95044. "sub r12, r2, r12\n\t"
  95045. "b L_sp_384_num_bits_12_13_%=\n\t"
  95046. "\n"
  95047. "L_sp_384_num_bits_12_2_%=: \n\t"
  95048. "ldr r1, [%[a], #4]\n\t"
  95049. "cmp r1, #0\n\t"
  95050. "beq L_sp_384_num_bits_12_1_%=\n\t"
  95051. "mov r2, #0x40\n\t"
  95052. "clz r12, r1\n\t"
  95053. "sub r12, r2, r12\n\t"
  95054. "b L_sp_384_num_bits_12_13_%=\n\t"
  95055. "\n"
  95056. "L_sp_384_num_bits_12_1_%=: \n\t"
  95057. "ldr r1, [%[a]]\n\t"
  95058. "mov r2, #32\n\t"
  95059. "clz r12, r1\n\t"
  95060. "sub r12, r2, r12\n\t"
  95061. "\n"
  95062. "L_sp_384_num_bits_12_13_%=: \n\t"
  95063. "mov %[a], r12\n\t"
  95064. : [a] "+r" (a)
  95065. :
  95066. : "memory", "r1", "r2", "r3", "r12", "lr", "cc"
  95067. );
  95068. return (uint32_t)(size_t)a;
  95069. }
  95070. #endif /* WOLFSSL_ARM_ARCH && (WOLFSSL_ARM_ARCH < 7) */
  95071. /* Non-constant time modular inversion.
  95072. *
  95073. * @param [out] r Resulting number.
  95074. * @param [in] a Number to invert.
  95075. * @param [in] m Modulus.
  95076. * @return MP_OKAY on success.
  95077. */
  95078. static int sp_384_mod_inv_12(sp_digit* r, const sp_digit* a, const sp_digit* m)
  95079. {
  95080. sp_digit u[12];
  95081. sp_digit v[12];
  95082. sp_digit b[12];
  95083. sp_digit d[12];
  95084. int ut, vt;
  95085. sp_digit o;
  95086. XMEMCPY(u, m, sizeof(u));
  95087. XMEMCPY(v, a, sizeof(v));
  95088. ut = sp_384_num_bits_12(u);
  95089. vt = sp_384_num_bits_12(v);
  95090. XMEMSET(b, 0, sizeof(b));
  95091. if ((v[0] & 1) == 0) {
  95092. sp_384_rshift1_12(v, v);
  95093. XMEMCPY(d, m, sizeof(u));
  95094. d[0] += 1;
  95095. sp_384_rshift1_12(d, d);
  95096. vt--;
  95097. while ((v[0] & 1) == 0) {
  95098. sp_384_rshift1_12(v, v);
  95099. sp_384_div2_mod_12(d, d, m);
  95100. vt--;
  95101. }
  95102. }
  95103. else {
  95104. XMEMSET(d+1, 0, sizeof(d)-sizeof(sp_digit));
  95105. d[0] = 1;
  95106. }
  95107. while (ut > 1 && vt > 1) {
  95108. if ((ut > vt) || ((ut == vt) && (sp_384_cmp_12(u, v) >= 0))) {
  95109. sp_384_sub_12(u, u, v);
  95110. o = sp_384_sub_12(b, b, d);
  95111. if (o != 0)
  95112. sp_384_add_12(b, b, m);
  95113. ut = sp_384_num_bits_12(u);
  95114. do {
  95115. sp_384_rshift1_12(u, u);
  95116. sp_384_div2_mod_12(b, b, m);
  95117. ut--;
  95118. }
  95119. while (ut > 0 && (u[0] & 1) == 0);
  95120. }
  95121. else {
  95122. sp_384_sub_12(v, v, u);
  95123. o = sp_384_sub_12(d, d, b);
  95124. if (o != 0)
  95125. sp_384_add_12(d, d, m);
  95126. vt = sp_384_num_bits_12(v);
  95127. do {
  95128. sp_384_rshift1_12(v, v);
  95129. sp_384_div2_mod_12(d, d, m);
  95130. vt--;
  95131. }
  95132. while (vt > 0 && (v[0] & 1) == 0);
  95133. }
  95134. }
  95135. if (ut == 1)
  95136. XMEMCPY(r, b, sizeof(b));
  95137. else
  95138. XMEMCPY(r, d, sizeof(d));
  95139. return MP_OKAY;
  95140. }
  95141. #endif /* WOLFSSL_SP_SMALL */
  95142. /* Add point p1 into point p2. Handles p1 == p2 and result at infinity.
  95143. *
  95144. * p1 First point to add and holds result.
  95145. * p2 Second point to add.
  95146. * tmp Temporary storage for intermediate numbers.
  95147. */
  95148. static void sp_384_add_points_12(sp_point_384* p1, const sp_point_384* p2,
  95149. sp_digit* tmp)
  95150. {
  95151. sp_384_proj_point_add_12(p1, p1, p2, tmp);
  95152. if (sp_384_iszero_12(p1->z)) {
  95153. if (sp_384_iszero_12(p1->x) && sp_384_iszero_12(p1->y)) {
  95154. sp_384_proj_point_dbl_12(p1, p2, tmp);
  95155. }
  95156. else {
  95157. /* Y ordinate is not used from here - don't set. */
  95158. p1->x[0] = 0;
  95159. p1->x[1] = 0;
  95160. p1->x[2] = 0;
  95161. p1->x[3] = 0;
  95162. p1->x[4] = 0;
  95163. p1->x[5] = 0;
  95164. p1->x[6] = 0;
  95165. p1->x[7] = 0;
  95166. p1->x[8] = 0;
  95167. p1->x[9] = 0;
  95168. p1->x[10] = 0;
  95169. p1->x[11] = 0;
  95170. XMEMCPY(p1->z, p384_norm_mod, sizeof(p384_norm_mod));
  95171. }
  95172. }
  95173. }
  95174. /* Calculate the verification point: [e/s]G + [r/s]Q
  95175. *
  95176. * p1 Calculated point.
  95177. * p2 Public point and temporary.
  95178. * s Second part of signature as a number.
  95179. * u1 Temporary number.
  95180. * u2 Temporary number.
  95181. * heap Heap to use for allocation.
  95182. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  95183. */
  95184. static int sp_384_calc_vfy_point_12(sp_point_384* p1, sp_point_384* p2,
  95185. sp_digit* s, sp_digit* u1, sp_digit* u2, sp_digit* tmp, void* heap)
  95186. {
  95187. int err;
  95188. #ifndef WOLFSSL_SP_SMALL
  95189. err = sp_384_mod_inv_12(s, s, p384_order);
  95190. if (err == MP_OKAY)
  95191. #endif /* !WOLFSSL_SP_SMALL */
  95192. {
  95193. sp_384_mul_12(s, s, p384_norm_order);
  95194. err = sp_384_mod_12(s, s, p384_order);
  95195. }
  95196. if (err == MP_OKAY) {
  95197. sp_384_norm_12(s);
  95198. #ifdef WOLFSSL_SP_SMALL
  95199. {
  95200. sp_384_mont_inv_order_12(s, s, tmp);
  95201. sp_384_mont_mul_order_12(u1, u1, s);
  95202. sp_384_mont_mul_order_12(u2, u2, s);
  95203. }
  95204. #else
  95205. {
  95206. sp_384_mont_mul_order_12(u1, u1, s);
  95207. sp_384_mont_mul_order_12(u2, u2, s);
  95208. }
  95209. #endif /* WOLFSSL_SP_SMALL */
  95210. {
  95211. err = sp_384_ecc_mulmod_base_12(p1, u1, 0, 0, heap);
  95212. }
  95213. }
  95214. if ((err == MP_OKAY) && sp_384_iszero_12(p1->z)) {
  95215. p1->infinity = 1;
  95216. }
  95217. if (err == MP_OKAY) {
  95218. err = sp_384_ecc_mulmod_12(p2, p2, u2, 0, 0, heap);
  95219. }
  95220. if ((err == MP_OKAY) && sp_384_iszero_12(p2->z)) {
  95221. p2->infinity = 1;
  95222. }
  95223. if (err == MP_OKAY) {
  95224. sp_384_add_points_12(p1, p2, tmp);
  95225. }
  95226. return err;
  95227. }
  95228. #ifdef HAVE_ECC_VERIFY
  95229. /* Verify the signature values with the hash and public key.
  95230. * e = Truncate(hash, 384)
  95231. * u1 = e/s mod order
  95232. * u2 = r/s mod order
  95233. * r == (u1.G + u2.Q)->x mod order
  95234. * Optimization: Leave point in projective form.
  95235. * (x, y, 1) == (x' / z'*z', y' / z'*z'*z', z' / z')
  95236. * (r + n*order).z'.z' mod prime == (u1.G + u2.Q)->x'
  95237. * The hash is truncated to the first 384 bits.
  95238. *
  95239. * hash Hash to sign.
  95240. * hashLen Length of the hash data.
  95241. * rng Random number generator.
  95242. * priv Private part of key - scalar.
  95243. * rm First part of result as an mp_int.
  95244. * sm Sirst part of result as an mp_int.
  95245. * heap Heap to use for allocation.
  95246. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  95247. */
  95248. int sp_ecc_verify_384(const byte* hash, word32 hashLen, const mp_int* pX,
  95249. const mp_int* pY, const mp_int* pZ, const mp_int* rm, const mp_int* sm,
  95250. int* res, void* heap)
  95251. {
  95252. #ifdef WOLFSSL_SP_SMALL_STACK
  95253. sp_digit* u1 = NULL;
  95254. sp_point_384* p1 = NULL;
  95255. #else
  95256. sp_digit u1[18 * 12];
  95257. sp_point_384 p1[2];
  95258. #endif
  95259. sp_digit* u2 = NULL;
  95260. sp_digit* s = NULL;
  95261. sp_digit* tmp = NULL;
  95262. sp_point_384* p2 = NULL;
  95263. sp_digit carry;
  95264. sp_int32 c = 0;
  95265. int err = MP_OKAY;
  95266. #ifdef WOLFSSL_SP_SMALL_STACK
  95267. if (err == MP_OKAY) {
  95268. p1 = (sp_point_384*)XMALLOC(sizeof(sp_point_384) * 2, heap,
  95269. DYNAMIC_TYPE_ECC);
  95270. if (p1 == NULL)
  95271. err = MEMORY_E;
  95272. }
  95273. if (err == MP_OKAY) {
  95274. u1 = (sp_digit*)XMALLOC(sizeof(sp_digit) * 18 * 12, heap,
  95275. DYNAMIC_TYPE_ECC);
  95276. if (u1 == NULL)
  95277. err = MEMORY_E;
  95278. }
  95279. #endif
  95280. if (err == MP_OKAY) {
  95281. u2 = u1 + 2 * 12;
  95282. s = u1 + 4 * 12;
  95283. tmp = u1 + 6 * 12;
  95284. p2 = p1 + 1;
  95285. if (hashLen > 48U) {
  95286. hashLen = 48U;
  95287. }
  95288. sp_384_from_bin(u1, 12, hash, (int)hashLen);
  95289. sp_384_from_mp(u2, 12, rm);
  95290. sp_384_from_mp(s, 12, sm);
  95291. sp_384_from_mp(p2->x, 12, pX);
  95292. sp_384_from_mp(p2->y, 12, pY);
  95293. sp_384_from_mp(p2->z, 12, pZ);
  95294. err = sp_384_calc_vfy_point_12(p1, p2, s, u1, u2, tmp, heap);
  95295. }
  95296. if (err == MP_OKAY) {
  95297. /* (r + n*order).z'.z' mod prime == (u1.G + u2.Q)->x' */
  95298. /* Reload r and convert to Montgomery form. */
  95299. sp_384_from_mp(u2, 12, rm);
  95300. err = sp_384_mod_mul_norm_12(u2, u2, p384_mod);
  95301. }
  95302. if (err == MP_OKAY) {
  95303. /* u1 = r.z'.z' mod prime */
  95304. sp_384_mont_sqr_12(p1->z, p1->z, p384_mod, p384_mp_mod);
  95305. sp_384_mont_mul_12(u1, u2, p1->z, p384_mod, p384_mp_mod);
  95306. *res = (int)(sp_384_cmp_12(p1->x, u1) == 0);
  95307. if (*res == 0) {
  95308. /* Reload r and add order. */
  95309. sp_384_from_mp(u2, 12, rm);
  95310. carry = sp_384_add_12(u2, u2, p384_order);
  95311. /* Carry means result is greater than mod and is not valid. */
  95312. if (carry == 0) {
  95313. sp_384_norm_12(u2);
  95314. /* Compare with mod and if greater or equal then not valid. */
  95315. c = sp_384_cmp_12(u2, p384_mod);
  95316. }
  95317. }
  95318. if ((*res == 0) && (c < 0)) {
  95319. /* Convert to Montogomery form */
  95320. err = sp_384_mod_mul_norm_12(u2, u2, p384_mod);
  95321. if (err == MP_OKAY) {
  95322. /* u1 = (r + 1*order).z'.z' mod prime */
  95323. {
  95324. sp_384_mont_mul_12(u1, u2, p1->z, p384_mod, p384_mp_mod);
  95325. }
  95326. *res = (sp_384_cmp_12(p1->x, u1) == 0);
  95327. }
  95328. }
  95329. }
  95330. #ifdef WOLFSSL_SP_SMALL_STACK
  95331. if (u1 != NULL)
  95332. XFREE(u1, heap, DYNAMIC_TYPE_ECC);
  95333. if (p1 != NULL)
  95334. XFREE(p1, heap, DYNAMIC_TYPE_ECC);
  95335. #endif
  95336. return err;
  95337. }
  95338. #ifdef WOLFSSL_SP_NONBLOCK
  95339. typedef struct sp_ecc_verify_384_ctx {
  95340. int state;
  95341. union {
  95342. sp_384_ecc_mulmod_12_ctx mulmod_ctx;
  95343. sp_384_mont_inv_order_12_ctx mont_inv_order_ctx;
  95344. sp_384_proj_point_dbl_12_ctx dbl_ctx;
  95345. sp_384_proj_point_add_12_ctx add_ctx;
  95346. };
  95347. sp_digit u1[2*12];
  95348. sp_digit u2[2*12];
  95349. sp_digit s[2*12];
  95350. sp_digit tmp[2*12 * 6];
  95351. sp_point_384 p1;
  95352. sp_point_384 p2;
  95353. } sp_ecc_verify_384_ctx;
  95354. int sp_ecc_verify_384_nb(sp_ecc_ctx_t* sp_ctx, const byte* hash,
  95355. word32 hashLen, const mp_int* pX, const mp_int* pY, const mp_int* pZ,
  95356. const mp_int* rm, const mp_int* sm, int* res, void* heap)
  95357. {
  95358. int err = FP_WOULDBLOCK;
  95359. sp_ecc_verify_384_ctx* ctx = (sp_ecc_verify_384_ctx*)sp_ctx->data;
  95360. typedef char ctx_size_test[sizeof(sp_ecc_verify_384_ctx) >= sizeof(*sp_ctx) ? -1 : 1];
  95361. (void)sizeof(ctx_size_test);
  95362. switch (ctx->state) {
  95363. case 0: /* INIT */
  95364. if (hashLen > 48U) {
  95365. hashLen = 48U;
  95366. }
  95367. sp_384_from_bin(ctx->u1, 12, hash, (int)hashLen);
  95368. sp_384_from_mp(ctx->u2, 12, rm);
  95369. sp_384_from_mp(ctx->s, 12, sm);
  95370. sp_384_from_mp(ctx->p2.x, 12, pX);
  95371. sp_384_from_mp(ctx->p2.y, 12, pY);
  95372. sp_384_from_mp(ctx->p2.z, 12, pZ);
  95373. ctx->state = 1;
  95374. break;
  95375. case 1: /* NORMS0 */
  95376. sp_384_mul_12(ctx->s, ctx->s, p384_norm_order);
  95377. err = sp_384_mod_12(ctx->s, ctx->s, p384_order);
  95378. if (err == MP_OKAY)
  95379. ctx->state = 2;
  95380. break;
  95381. case 2: /* NORMS1 */
  95382. sp_384_norm_12(ctx->s);
  95383. XMEMSET(&ctx->mont_inv_order_ctx, 0, sizeof(ctx->mont_inv_order_ctx));
  95384. ctx->state = 3;
  95385. break;
  95386. case 3: /* NORMS2 */
  95387. err = sp_384_mont_inv_order_12_nb((sp_ecc_ctx_t*)&ctx->mont_inv_order_ctx, ctx->s, ctx->s, ctx->tmp);
  95388. if (err == MP_OKAY) {
  95389. ctx->state = 4;
  95390. }
  95391. break;
  95392. case 4: /* NORMS3 */
  95393. sp_384_mont_mul_order_12(ctx->u1, ctx->u1, ctx->s);
  95394. ctx->state = 5;
  95395. break;
  95396. case 5: /* NORMS4 */
  95397. sp_384_mont_mul_order_12(ctx->u2, ctx->u2, ctx->s);
  95398. XMEMSET(&ctx->mulmod_ctx, 0, sizeof(ctx->mulmod_ctx));
  95399. ctx->state = 6;
  95400. break;
  95401. case 6: /* MULBASE */
  95402. err = sp_384_ecc_mulmod_12_nb((sp_ecc_ctx_t*)&ctx->mulmod_ctx, &ctx->p1, &p384_base, ctx->u1, 0, 0, heap);
  95403. if (err == MP_OKAY) {
  95404. if (sp_384_iszero_12(ctx->p1.z)) {
  95405. ctx->p1.infinity = 1;
  95406. }
  95407. XMEMSET(&ctx->mulmod_ctx, 0, sizeof(ctx->mulmod_ctx));
  95408. ctx->state = 7;
  95409. }
  95410. break;
  95411. case 7: /* MULMOD */
  95412. err = sp_384_ecc_mulmod_12_nb((sp_ecc_ctx_t*)&ctx->mulmod_ctx, &ctx->p2, &ctx->p2, ctx->u2, 0, 0, heap);
  95413. if (err == MP_OKAY) {
  95414. if (sp_384_iszero_12(ctx->p2.z)) {
  95415. ctx->p2.infinity = 1;
  95416. }
  95417. XMEMSET(&ctx->add_ctx, 0, sizeof(ctx->add_ctx));
  95418. ctx->state = 8;
  95419. }
  95420. break;
  95421. case 8: /* ADD */
  95422. err = sp_384_proj_point_add_12_nb((sp_ecc_ctx_t*)&ctx->add_ctx, &ctx->p1, &ctx->p1, &ctx->p2, ctx->tmp);
  95423. if (err == MP_OKAY)
  95424. ctx->state = 9;
  95425. break;
  95426. case 9: /* MONT */
  95427. /* (r + n*order).z'.z' mod prime == (u1.G + u2.Q)->x' */
  95428. /* Reload r and convert to Montgomery form. */
  95429. sp_384_from_mp(ctx->u2, 12, rm);
  95430. err = sp_384_mod_mul_norm_12(ctx->u2, ctx->u2, p384_mod);
  95431. if (err == MP_OKAY)
  95432. ctx->state = 10;
  95433. break;
  95434. case 10: /* SQR */
  95435. /* u1 = r.z'.z' mod prime */
  95436. sp_384_mont_sqr_12(ctx->p1.z, ctx->p1.z, p384_mod, p384_mp_mod);
  95437. ctx->state = 11;
  95438. break;
  95439. case 11: /* MUL */
  95440. sp_384_mont_mul_12(ctx->u1, ctx->u2, ctx->p1.z, p384_mod, p384_mp_mod);
  95441. ctx->state = 12;
  95442. break;
  95443. case 12: /* RES */
  95444. {
  95445. sp_int32 c = 0;
  95446. err = MP_OKAY; /* math okay, now check result */
  95447. *res = (int)(sp_384_cmp_12(ctx->p1.x, ctx->u1) == 0);
  95448. if (*res == 0) {
  95449. sp_digit carry;
  95450. /* Reload r and add order. */
  95451. sp_384_from_mp(ctx->u2, 12, rm);
  95452. carry = sp_384_add_12(ctx->u2, ctx->u2, p384_order);
  95453. /* Carry means result is greater than mod and is not valid. */
  95454. if (carry == 0) {
  95455. sp_384_norm_12(ctx->u2);
  95456. /* Compare with mod and if greater or equal then not valid. */
  95457. c = sp_384_cmp_12(ctx->u2, p384_mod);
  95458. }
  95459. }
  95460. if ((*res == 0) && (c < 0)) {
  95461. /* Convert to Montogomery form */
  95462. err = sp_384_mod_mul_norm_12(ctx->u2, ctx->u2, p384_mod);
  95463. if (err == MP_OKAY) {
  95464. /* u1 = (r + 1*order).z'.z' mod prime */
  95465. sp_384_mont_mul_12(ctx->u1, ctx->u2, ctx->p1.z, p384_mod,
  95466. p384_mp_mod);
  95467. *res = (int)(sp_384_cmp_12(ctx->p1.x, ctx->u1) == 0);
  95468. }
  95469. }
  95470. break;
  95471. }
  95472. } /* switch */
  95473. if (err == MP_OKAY && ctx->state != 12) {
  95474. err = FP_WOULDBLOCK;
  95475. }
  95476. return err;
  95477. }
  95478. #endif /* WOLFSSL_SP_NONBLOCK */
  95479. #endif /* HAVE_ECC_VERIFY */
  95480. #ifdef HAVE_ECC_CHECK_KEY
  95481. /* Check that the x and y ordinates are a valid point on the curve.
  95482. *
  95483. * point EC point.
  95484. * heap Heap to use if dynamically allocating.
  95485. * returns MEMORY_E if dynamic memory allocation fails, MP_VAL if the point is
  95486. * not on the curve and MP_OKAY otherwise.
  95487. */
  95488. static int sp_384_ecc_is_point_12(const sp_point_384* point,
  95489. void* heap)
  95490. {
  95491. #ifdef WOLFSSL_SP_SMALL_STACK
  95492. sp_digit* t1 = NULL;
  95493. #else
  95494. sp_digit t1[12 * 4];
  95495. #endif
  95496. sp_digit* t2 = NULL;
  95497. int err = MP_OKAY;
  95498. #ifdef WOLFSSL_SP_SMALL_STACK
  95499. t1 = (sp_digit*)XMALLOC(sizeof(sp_digit) * 12 * 4, heap, DYNAMIC_TYPE_ECC);
  95500. if (t1 == NULL)
  95501. err = MEMORY_E;
  95502. #endif
  95503. (void)heap;
  95504. if (err == MP_OKAY) {
  95505. t2 = t1 + 2 * 12;
  95506. /* y^2 - x^3 - a.x = b */
  95507. sp_384_sqr_12(t1, point->y);
  95508. (void)sp_384_mod_12(t1, t1, p384_mod);
  95509. sp_384_sqr_12(t2, point->x);
  95510. (void)sp_384_mod_12(t2, t2, p384_mod);
  95511. sp_384_mul_12(t2, t2, point->x);
  95512. (void)sp_384_mod_12(t2, t2, p384_mod);
  95513. sp_384_mont_sub_12(t1, t1, t2, p384_mod);
  95514. /* y^2 - x^3 + 3.x = b, when a = -3 */
  95515. sp_384_mont_add_12(t1, t1, point->x, p384_mod);
  95516. sp_384_mont_add_12(t1, t1, point->x, p384_mod);
  95517. sp_384_mont_add_12(t1, t1, point->x, p384_mod);
  95518. if (sp_384_cmp_12(t1, p384_b) != 0) {
  95519. err = MP_VAL;
  95520. }
  95521. }
  95522. #ifdef WOLFSSL_SP_SMALL_STACK
  95523. if (t1 != NULL)
  95524. XFREE(t1, heap, DYNAMIC_TYPE_ECC);
  95525. #endif
  95526. return err;
  95527. }
  95528. /* Check that the x and y ordinates are a valid point on the curve.
  95529. *
  95530. * pX X ordinate of EC point.
  95531. * pY Y ordinate of EC point.
  95532. * returns MEMORY_E if dynamic memory allocation fails, MP_VAL if the point is
  95533. * not on the curve and MP_OKAY otherwise.
  95534. */
  95535. int sp_ecc_is_point_384(const mp_int* pX, const mp_int* pY)
  95536. {
  95537. #ifdef WOLFSSL_SP_SMALL_STACK
  95538. sp_point_384* pub = NULL;
  95539. #else
  95540. sp_point_384 pub[1];
  95541. #endif
  95542. const byte one[1] = { 1 };
  95543. int err = MP_OKAY;
  95544. #ifdef WOLFSSL_SP_SMALL_STACK
  95545. pub = (sp_point_384*)XMALLOC(sizeof(sp_point_384), NULL,
  95546. DYNAMIC_TYPE_ECC);
  95547. if (pub == NULL)
  95548. err = MEMORY_E;
  95549. #endif
  95550. if (err == MP_OKAY) {
  95551. sp_384_from_mp(pub->x, 12, pX);
  95552. sp_384_from_mp(pub->y, 12, pY);
  95553. sp_384_from_bin(pub->z, 12, one, (int)sizeof(one));
  95554. err = sp_384_ecc_is_point_12(pub, NULL);
  95555. }
  95556. #ifdef WOLFSSL_SP_SMALL_STACK
  95557. if (pub != NULL)
  95558. XFREE(pub, NULL, DYNAMIC_TYPE_ECC);
  95559. #endif
  95560. return err;
  95561. }
  95562. /* Check that the private scalar generates the EC point (px, py), the point is
  95563. * on the curve and the point has the correct order.
  95564. *
  95565. * pX X ordinate of EC point.
  95566. * pY Y ordinate of EC point.
  95567. * privm Private scalar that generates EC point.
  95568. * returns MEMORY_E if dynamic memory allocation fails, MP_VAL if the point is
  95569. * not on the curve, ECC_INF_E if the point does not have the correct order,
  95570. * ECC_PRIV_KEY_E when the private scalar doesn't generate the EC point and
  95571. * MP_OKAY otherwise.
  95572. */
  95573. int sp_ecc_check_key_384(const mp_int* pX, const mp_int* pY,
  95574. const mp_int* privm, void* heap)
  95575. {
  95576. #ifdef WOLFSSL_SP_SMALL_STACK
  95577. sp_digit* priv = NULL;
  95578. sp_point_384* pub = NULL;
  95579. #else
  95580. sp_digit priv[12];
  95581. sp_point_384 pub[2];
  95582. #endif
  95583. sp_point_384* p = NULL;
  95584. const byte one[1] = { 1 };
  95585. int err = MP_OKAY;
  95586. /* Quick check the lengs of public key ordinates and private key are in
  95587. * range. Proper check later.
  95588. */
  95589. if (((mp_count_bits(pX) > 384) ||
  95590. (mp_count_bits(pY) > 384) ||
  95591. ((privm != NULL) && (mp_count_bits(privm) > 384)))) {
  95592. err = ECC_OUT_OF_RANGE_E;
  95593. }
  95594. #ifdef WOLFSSL_SP_SMALL_STACK
  95595. if (err == MP_OKAY) {
  95596. pub = (sp_point_384*)XMALLOC(sizeof(sp_point_384) * 2, heap,
  95597. DYNAMIC_TYPE_ECC);
  95598. if (pub == NULL)
  95599. err = MEMORY_E;
  95600. }
  95601. if (err == MP_OKAY && privm) {
  95602. priv = (sp_digit*)XMALLOC(sizeof(sp_digit) * 12, heap,
  95603. DYNAMIC_TYPE_ECC);
  95604. if (priv == NULL)
  95605. err = MEMORY_E;
  95606. }
  95607. #endif
  95608. if (err == MP_OKAY) {
  95609. p = pub + 1;
  95610. sp_384_from_mp(pub->x, 12, pX);
  95611. sp_384_from_mp(pub->y, 12, pY);
  95612. sp_384_from_bin(pub->z, 12, one, (int)sizeof(one));
  95613. if (privm)
  95614. sp_384_from_mp(priv, 12, privm);
  95615. /* Check point at infinitiy. */
  95616. if ((sp_384_iszero_12(pub->x) != 0) &&
  95617. (sp_384_iszero_12(pub->y) != 0)) {
  95618. err = ECC_INF_E;
  95619. }
  95620. }
  95621. /* Check range of X and Y */
  95622. if ((err == MP_OKAY) &&
  95623. ((sp_384_cmp_12(pub->x, p384_mod) >= 0) ||
  95624. (sp_384_cmp_12(pub->y, p384_mod) >= 0))) {
  95625. err = ECC_OUT_OF_RANGE_E;
  95626. }
  95627. if (err == MP_OKAY) {
  95628. /* Check point is on curve */
  95629. err = sp_384_ecc_is_point_12(pub, heap);
  95630. }
  95631. if (err == MP_OKAY) {
  95632. /* Point * order = infinity */
  95633. err = sp_384_ecc_mulmod_12(p, pub, p384_order, 1, 1, heap);
  95634. }
  95635. /* Check result is infinity */
  95636. if ((err == MP_OKAY) && ((sp_384_iszero_12(p->x) == 0) ||
  95637. (sp_384_iszero_12(p->y) == 0))) {
  95638. err = ECC_INF_E;
  95639. }
  95640. if (privm) {
  95641. if (err == MP_OKAY) {
  95642. /* Base * private = point */
  95643. err = sp_384_ecc_mulmod_base_12(p, priv, 1, 1, heap);
  95644. }
  95645. /* Check result is public key */
  95646. if ((err == MP_OKAY) &&
  95647. ((sp_384_cmp_12(p->x, pub->x) != 0) ||
  95648. (sp_384_cmp_12(p->y, pub->y) != 0))) {
  95649. err = ECC_PRIV_KEY_E;
  95650. }
  95651. }
  95652. #ifdef WOLFSSL_SP_SMALL_STACK
  95653. if (pub != NULL)
  95654. XFREE(pub, heap, DYNAMIC_TYPE_ECC);
  95655. if (priv != NULL)
  95656. XFREE(priv, heap, DYNAMIC_TYPE_ECC);
  95657. #endif
  95658. return err;
  95659. }
  95660. #endif
  95661. #ifdef WOLFSSL_PUBLIC_ECC_ADD_DBL
  95662. /* Add two projective EC points together.
  95663. * (pX, pY, pZ) + (qX, qY, qZ) = (rX, rY, rZ)
  95664. *
  95665. * pX First EC point's X ordinate.
  95666. * pY First EC point's Y ordinate.
  95667. * pZ First EC point's Z ordinate.
  95668. * qX Second EC point's X ordinate.
  95669. * qY Second EC point's Y ordinate.
  95670. * qZ Second EC point's Z ordinate.
  95671. * rX Resultant EC point's X ordinate.
  95672. * rY Resultant EC point's Y ordinate.
  95673. * rZ Resultant EC point's Z ordinate.
  95674. * returns MEMORY_E if dynamic memory allocation fails and MP_OKAY otherwise.
  95675. */
  95676. int sp_ecc_proj_add_point_384(mp_int* pX, mp_int* pY, mp_int* pZ,
  95677. mp_int* qX, mp_int* qY, mp_int* qZ,
  95678. mp_int* rX, mp_int* rY, mp_int* rZ)
  95679. {
  95680. #ifdef WOLFSSL_SP_SMALL_STACK
  95681. sp_digit* tmp = NULL;
  95682. sp_point_384* p = NULL;
  95683. #else
  95684. sp_digit tmp[2 * 12 * 6];
  95685. sp_point_384 p[2];
  95686. #endif
  95687. sp_point_384* q = NULL;
  95688. int err = MP_OKAY;
  95689. #ifdef WOLFSSL_SP_SMALL_STACK
  95690. if (err == MP_OKAY) {
  95691. p = (sp_point_384*)XMALLOC(sizeof(sp_point_384) * 2, NULL,
  95692. DYNAMIC_TYPE_ECC);
  95693. if (p == NULL)
  95694. err = MEMORY_E;
  95695. }
  95696. if (err == MP_OKAY) {
  95697. tmp = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 12 * 6, NULL,
  95698. DYNAMIC_TYPE_ECC);
  95699. if (tmp == NULL) {
  95700. err = MEMORY_E;
  95701. }
  95702. }
  95703. #endif
  95704. if (err == MP_OKAY) {
  95705. q = p + 1;
  95706. sp_384_from_mp(p->x, 12, pX);
  95707. sp_384_from_mp(p->y, 12, pY);
  95708. sp_384_from_mp(p->z, 12, pZ);
  95709. sp_384_from_mp(q->x, 12, qX);
  95710. sp_384_from_mp(q->y, 12, qY);
  95711. sp_384_from_mp(q->z, 12, qZ);
  95712. p->infinity = sp_384_iszero_12(p->x) &
  95713. sp_384_iszero_12(p->y);
  95714. q->infinity = sp_384_iszero_12(q->x) &
  95715. sp_384_iszero_12(q->y);
  95716. sp_384_proj_point_add_12(p, p, q, tmp);
  95717. }
  95718. if (err == MP_OKAY) {
  95719. err = sp_384_to_mp(p->x, rX);
  95720. }
  95721. if (err == MP_OKAY) {
  95722. err = sp_384_to_mp(p->y, rY);
  95723. }
  95724. if (err == MP_OKAY) {
  95725. err = sp_384_to_mp(p->z, rZ);
  95726. }
  95727. #ifdef WOLFSSL_SP_SMALL_STACK
  95728. if (tmp != NULL)
  95729. XFREE(tmp, NULL, DYNAMIC_TYPE_ECC);
  95730. if (p != NULL)
  95731. XFREE(p, NULL, DYNAMIC_TYPE_ECC);
  95732. #endif
  95733. return err;
  95734. }
  95735. /* Double a projective EC point.
  95736. * (pX, pY, pZ) + (pX, pY, pZ) = (rX, rY, rZ)
  95737. *
  95738. * pX EC point's X ordinate.
  95739. * pY EC point's Y ordinate.
  95740. * pZ EC point's Z ordinate.
  95741. * rX Resultant EC point's X ordinate.
  95742. * rY Resultant EC point's Y ordinate.
  95743. * rZ Resultant EC point's Z ordinate.
  95744. * returns MEMORY_E if dynamic memory allocation fails and MP_OKAY otherwise.
  95745. */
  95746. int sp_ecc_proj_dbl_point_384(mp_int* pX, mp_int* pY, mp_int* pZ,
  95747. mp_int* rX, mp_int* rY, mp_int* rZ)
  95748. {
  95749. #ifdef WOLFSSL_SP_SMALL_STACK
  95750. sp_digit* tmp = NULL;
  95751. sp_point_384* p = NULL;
  95752. #else
  95753. sp_digit tmp[2 * 12 * 2];
  95754. sp_point_384 p[1];
  95755. #endif
  95756. int err = MP_OKAY;
  95757. #ifdef WOLFSSL_SP_SMALL_STACK
  95758. if (err == MP_OKAY) {
  95759. p = (sp_point_384*)XMALLOC(sizeof(sp_point_384), NULL,
  95760. DYNAMIC_TYPE_ECC);
  95761. if (p == NULL)
  95762. err = MEMORY_E;
  95763. }
  95764. if (err == MP_OKAY) {
  95765. tmp = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 12 * 2, NULL,
  95766. DYNAMIC_TYPE_ECC);
  95767. if (tmp == NULL)
  95768. err = MEMORY_E;
  95769. }
  95770. #endif
  95771. if (err == MP_OKAY) {
  95772. sp_384_from_mp(p->x, 12, pX);
  95773. sp_384_from_mp(p->y, 12, pY);
  95774. sp_384_from_mp(p->z, 12, pZ);
  95775. p->infinity = sp_384_iszero_12(p->x) &
  95776. sp_384_iszero_12(p->y);
  95777. sp_384_proj_point_dbl_12(p, p, tmp);
  95778. }
  95779. if (err == MP_OKAY) {
  95780. err = sp_384_to_mp(p->x, rX);
  95781. }
  95782. if (err == MP_OKAY) {
  95783. err = sp_384_to_mp(p->y, rY);
  95784. }
  95785. if (err == MP_OKAY) {
  95786. err = sp_384_to_mp(p->z, rZ);
  95787. }
  95788. #ifdef WOLFSSL_SP_SMALL_STACK
  95789. if (tmp != NULL)
  95790. XFREE(tmp, NULL, DYNAMIC_TYPE_ECC);
  95791. if (p != NULL)
  95792. XFREE(p, NULL, DYNAMIC_TYPE_ECC);
  95793. #endif
  95794. return err;
  95795. }
  95796. /* Map a projective EC point to affine in place.
  95797. * pZ will be one.
  95798. *
  95799. * pX EC point's X ordinate.
  95800. * pY EC point's Y ordinate.
  95801. * pZ EC point's Z ordinate.
  95802. * returns MEMORY_E if dynamic memory allocation fails and MP_OKAY otherwise.
  95803. */
  95804. int sp_ecc_map_384(mp_int* pX, mp_int* pY, mp_int* pZ)
  95805. {
  95806. #ifdef WOLFSSL_SP_SMALL_STACK
  95807. sp_digit* tmp = NULL;
  95808. sp_point_384* p = NULL;
  95809. #else
  95810. sp_digit tmp[2 * 12 * 6];
  95811. sp_point_384 p[1];
  95812. #endif
  95813. int err = MP_OKAY;
  95814. #ifdef WOLFSSL_SP_SMALL_STACK
  95815. if (err == MP_OKAY) {
  95816. p = (sp_point_384*)XMALLOC(sizeof(sp_point_384), NULL,
  95817. DYNAMIC_TYPE_ECC);
  95818. if (p == NULL)
  95819. err = MEMORY_E;
  95820. }
  95821. if (err == MP_OKAY) {
  95822. tmp = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 12 * 6, NULL,
  95823. DYNAMIC_TYPE_ECC);
  95824. if (tmp == NULL)
  95825. err = MEMORY_E;
  95826. }
  95827. #endif
  95828. if (err == MP_OKAY) {
  95829. sp_384_from_mp(p->x, 12, pX);
  95830. sp_384_from_mp(p->y, 12, pY);
  95831. sp_384_from_mp(p->z, 12, pZ);
  95832. p->infinity = sp_384_iszero_12(p->x) &
  95833. sp_384_iszero_12(p->y);
  95834. sp_384_map_12(p, p, tmp);
  95835. }
  95836. if (err == MP_OKAY) {
  95837. err = sp_384_to_mp(p->x, pX);
  95838. }
  95839. if (err == MP_OKAY) {
  95840. err = sp_384_to_mp(p->y, pY);
  95841. }
  95842. if (err == MP_OKAY) {
  95843. err = sp_384_to_mp(p->z, pZ);
  95844. }
  95845. #ifdef WOLFSSL_SP_SMALL_STACK
  95846. if (tmp != NULL)
  95847. XFREE(tmp, NULL, DYNAMIC_TYPE_ECC);
  95848. if (p != NULL)
  95849. XFREE(p, NULL, DYNAMIC_TYPE_ECC);
  95850. #endif
  95851. return err;
  95852. }
  95853. #endif /* WOLFSSL_PUBLIC_ECC_ADD_DBL */
  95854. #ifdef HAVE_COMP_KEY
  95855. /* Find the square root of a number mod the prime of the curve.
  95856. *
  95857. * y The number to operate on and the result.
  95858. * returns MEMORY_E if dynamic memory allocation fails and MP_OKAY otherwise.
  95859. */
  95860. static int sp_384_mont_sqrt_12(sp_digit* y)
  95861. {
  95862. #ifdef WOLFSSL_SP_SMALL_STACK
  95863. sp_digit* t1 = NULL;
  95864. #else
  95865. sp_digit t1[5 * 2 * 12];
  95866. #endif
  95867. sp_digit* t2 = NULL;
  95868. sp_digit* t3 = NULL;
  95869. sp_digit* t4 = NULL;
  95870. sp_digit* t5 = NULL;
  95871. int err = MP_OKAY;
  95872. #ifdef WOLFSSL_SP_SMALL_STACK
  95873. t1 = (sp_digit*)XMALLOC(sizeof(sp_digit) * 5 * 2 * 12, NULL, DYNAMIC_TYPE_ECC);
  95874. if (t1 == NULL)
  95875. err = MEMORY_E;
  95876. #endif
  95877. if (err == MP_OKAY) {
  95878. t2 = t1 + 2 * 12;
  95879. t3 = t1 + 4 * 12;
  95880. t4 = t1 + 6 * 12;
  95881. t5 = t1 + 8 * 12;
  95882. {
  95883. /* t2 = y ^ 0x2 */
  95884. sp_384_mont_sqr_12(t2, y, p384_mod, p384_mp_mod);
  95885. /* t1 = y ^ 0x3 */
  95886. sp_384_mont_mul_12(t1, t2, y, p384_mod, p384_mp_mod);
  95887. /* t5 = y ^ 0xc */
  95888. sp_384_mont_sqr_n_12(t5, t1, 2, p384_mod, p384_mp_mod);
  95889. /* t1 = y ^ 0xf */
  95890. sp_384_mont_mul_12(t1, t1, t5, p384_mod, p384_mp_mod);
  95891. /* t2 = y ^ 0x1e */
  95892. sp_384_mont_sqr_12(t2, t1, p384_mod, p384_mp_mod);
  95893. /* t3 = y ^ 0x1f */
  95894. sp_384_mont_mul_12(t3, t2, y, p384_mod, p384_mp_mod);
  95895. /* t2 = y ^ 0x3e0 */
  95896. sp_384_mont_sqr_n_12(t2, t3, 5, p384_mod, p384_mp_mod);
  95897. /* t1 = y ^ 0x3ff */
  95898. sp_384_mont_mul_12(t1, t3, t2, p384_mod, p384_mp_mod);
  95899. /* t2 = y ^ 0x7fe0 */
  95900. sp_384_mont_sqr_n_12(t2, t1, 5, p384_mod, p384_mp_mod);
  95901. /* t3 = y ^ 0x7fff */
  95902. sp_384_mont_mul_12(t3, t3, t2, p384_mod, p384_mp_mod);
  95903. /* t2 = y ^ 0x3fff800 */
  95904. sp_384_mont_sqr_n_12(t2, t3, 15, p384_mod, p384_mp_mod);
  95905. /* t4 = y ^ 0x3ffffff */
  95906. sp_384_mont_mul_12(t4, t3, t2, p384_mod, p384_mp_mod);
  95907. /* t2 = y ^ 0xffffffc000000 */
  95908. sp_384_mont_sqr_n_12(t2, t4, 30, p384_mod, p384_mp_mod);
  95909. /* t1 = y ^ 0xfffffffffffff */
  95910. sp_384_mont_mul_12(t1, t4, t2, p384_mod, p384_mp_mod);
  95911. /* t2 = y ^ 0xfffffffffffffff000000000000000 */
  95912. sp_384_mont_sqr_n_12(t2, t1, 60, p384_mod, p384_mp_mod);
  95913. /* t1 = y ^ 0xffffffffffffffffffffffffffffff */
  95914. sp_384_mont_mul_12(t1, t1, t2, p384_mod, p384_mp_mod);
  95915. /* t2 = y ^ 0xffffffffffffffffffffffffffffff000000000000000000000000000000 */
  95916. sp_384_mont_sqr_n_12(t2, t1, 120, p384_mod, p384_mp_mod);
  95917. /* t1 = y ^ 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff */
  95918. sp_384_mont_mul_12(t1, t1, t2, p384_mod, p384_mp_mod);
  95919. /* t2 = y ^ 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8000 */
  95920. sp_384_mont_sqr_n_12(t2, t1, 15, p384_mod, p384_mp_mod);
  95921. /* t1 = y ^ 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff */
  95922. sp_384_mont_mul_12(t1, t3, t2, p384_mod, p384_mp_mod);
  95923. /* t2 = y ^ 0x3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80000000 */
  95924. sp_384_mont_sqr_n_12(t2, t1, 31, p384_mod, p384_mp_mod);
  95925. /* t1 = y ^ 0x3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfffffff */
  95926. sp_384_mont_mul_12(t1, t4, t2, p384_mod, p384_mp_mod);
  95927. /* t2 = y ^ 0x3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfffffff0 */
  95928. sp_384_mont_sqr_n_12(t2, t1, 4, p384_mod, p384_mp_mod);
  95929. /* t1 = y ^ 0x3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfffffffc */
  95930. sp_384_mont_mul_12(t1, t5, t2, p384_mod, p384_mp_mod);
  95931. /* t2 = y ^ 0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000 */
  95932. sp_384_mont_sqr_n_12(t2, t1, 62, p384_mod, p384_mp_mod);
  95933. /* t1 = y ^ 0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000001 */
  95934. sp_384_mont_mul_12(t1, y, t2, p384_mod, p384_mp_mod);
  95935. /* t2 = y ^ 0x3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfffffffc00000000000000040000000 */
  95936. sp_384_mont_sqr_n_12(y, t1, 30, p384_mod, p384_mp_mod);
  95937. }
  95938. }
  95939. #ifdef WOLFSSL_SP_SMALL_STACK
  95940. if (t1 != NULL)
  95941. XFREE(t1, NULL, DYNAMIC_TYPE_ECC);
  95942. #endif
  95943. return err;
  95944. }
  95945. /* Uncompress the point given the X ordinate.
  95946. *
  95947. * xm X ordinate.
  95948. * odd Whether the Y ordinate is odd.
  95949. * ym Calculated Y ordinate.
  95950. * returns MEMORY_E if dynamic memory allocation fails and MP_OKAY otherwise.
  95951. */
  95952. int sp_ecc_uncompress_384(mp_int* xm, int odd, mp_int* ym)
  95953. {
  95954. #ifdef WOLFSSL_SP_SMALL_STACK
  95955. sp_digit* x = NULL;
  95956. #else
  95957. sp_digit x[4 * 12];
  95958. #endif
  95959. sp_digit* y = NULL;
  95960. int err = MP_OKAY;
  95961. #ifdef WOLFSSL_SP_SMALL_STACK
  95962. x = (sp_digit*)XMALLOC(sizeof(sp_digit) * 4 * 12, NULL, DYNAMIC_TYPE_ECC);
  95963. if (x == NULL)
  95964. err = MEMORY_E;
  95965. #endif
  95966. if (err == MP_OKAY) {
  95967. y = x + 2 * 12;
  95968. sp_384_from_mp(x, 12, xm);
  95969. err = sp_384_mod_mul_norm_12(x, x, p384_mod);
  95970. }
  95971. if (err == MP_OKAY) {
  95972. /* y = x^3 */
  95973. {
  95974. sp_384_mont_sqr_12(y, x, p384_mod, p384_mp_mod);
  95975. sp_384_mont_mul_12(y, y, x, p384_mod, p384_mp_mod);
  95976. }
  95977. /* y = x^3 - 3x */
  95978. sp_384_mont_sub_12(y, y, x, p384_mod);
  95979. sp_384_mont_sub_12(y, y, x, p384_mod);
  95980. sp_384_mont_sub_12(y, y, x, p384_mod);
  95981. /* y = x^3 - 3x + b */
  95982. err = sp_384_mod_mul_norm_12(x, p384_b, p384_mod);
  95983. }
  95984. if (err == MP_OKAY) {
  95985. sp_384_mont_add_12(y, y, x, p384_mod);
  95986. /* y = sqrt(x^3 - 3x + b) */
  95987. err = sp_384_mont_sqrt_12(y);
  95988. }
  95989. if (err == MP_OKAY) {
  95990. XMEMSET(y + 12, 0, 12U * sizeof(sp_digit));
  95991. sp_384_mont_reduce_12(y, p384_mod, p384_mp_mod);
  95992. if ((((word32)y[0] ^ (word32)odd) & 1U) != 0U) {
  95993. sp_384_mont_sub_12(y, p384_mod, y, p384_mod);
  95994. }
  95995. err = sp_384_to_mp(y, ym);
  95996. }
  95997. #ifdef WOLFSSL_SP_SMALL_STACK
  95998. if (x != NULL)
  95999. XFREE(x, NULL, DYNAMIC_TYPE_ECC);
  96000. #endif
  96001. return err;
  96002. }
  96003. #endif
  96004. #endif /* WOLFSSL_SP_384 */
  96005. #ifdef WOLFSSL_SP_521
  96006. /* Point structure to use. */
  96007. typedef struct sp_point_521 {
  96008. /* X ordinate of point. */
  96009. sp_digit x[2 * 17];
  96010. /* Y ordinate of point. */
  96011. sp_digit y[2 * 17];
  96012. /* Z ordinate of point. */
  96013. sp_digit z[2 * 17];
  96014. /* Indicates point is at infinity. */
  96015. int infinity;
  96016. } sp_point_521;
  96017. /* The modulus (prime) of the curve P521. */
  96018. static const sp_digit p521_mod[17] = {
  96019. 0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,
  96020. 0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,
  96021. 0xffffffff,0xffffffff,0xffffffff,0xffffffff,0x000001ff
  96022. };
  96023. /* The Montgomery normalizer for modulus of the curve P521. */
  96024. static const sp_digit p521_norm_mod[17] = {
  96025. 0x00000001,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,
  96026. 0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,
  96027. 0x00000000,0x00000000,0x00000000,0x00000000,0x00000000
  96028. };
  96029. /* The Montgomery multiplier for modulus of the curve P521. */
  96030. static sp_digit p521_mp_mod = 0x00000001;
  96031. #if defined(WOLFSSL_VALIDATE_ECC_KEYGEN) || defined(HAVE_ECC_SIGN) || \
  96032. defined(HAVE_ECC_VERIFY)
  96033. /* The order of the curve P521. */
  96034. static const sp_digit p521_order[17] = {
  96035. 0x91386409,0xbb6fb71e,0x899c47ae,0x3bb5c9b8,0xf709a5d0,0x7fcc0148,
  96036. 0xbf2f966b,0x51868783,0xfffffffa,0xffffffff,0xffffffff,0xffffffff,
  96037. 0xffffffff,0xffffffff,0xffffffff,0xffffffff,0x000001ff
  96038. };
  96039. #endif
  96040. /* The order of the curve P521 minus 2. */
  96041. static const sp_digit p521_order2[17] = {
  96042. 0x91386407,0xbb6fb71e,0x899c47ae,0x3bb5c9b8,0xf709a5d0,0x7fcc0148,
  96043. 0xbf2f966b,0x51868783,0xfffffffa,0xffffffff,0xffffffff,0xffffffff,
  96044. 0xffffffff,0xffffffff,0xffffffff,0xffffffff,0x000001ff
  96045. };
  96046. #if defined(HAVE_ECC_SIGN) || defined(HAVE_ECC_VERIFY)
  96047. /* The Montgomery normalizer for order of the curve P521. */
  96048. static const sp_digit p521_norm_order[17] = {
  96049. 0x6ec79bf7,0x449048e1,0x7663b851,0xc44a3647,0x08f65a2f,0x8033feb7,
  96050. 0x40d06994,0xae79787c,0x00000005,0x00000000,0x00000000,0x00000000,
  96051. 0x00000000,0x00000000,0x00000000,0x00000000,0x00000000
  96052. };
  96053. #endif
  96054. #if defined(HAVE_ECC_SIGN) || defined(HAVE_ECC_VERIFY)
  96055. /* The Montgomery multiplier for order of the curve P521. */
  96056. static sp_digit p521_mp_order = 0x79a995c7;
  96057. #endif
  96058. /* The base point of curve P521. */
  96059. static const sp_point_521 p521_base = {
  96060. /* X ordinate */
  96061. {
  96062. 0xc2e5bd66,0xf97e7e31,0x856a429b,0x3348b3c1,0xa2ffa8de,0xfe1dc127,
  96063. 0xefe75928,0xa14b5e77,0x6b4d3dba,0xf828af60,0x053fb521,0x9c648139,
  96064. 0x2395b442,0x9e3ecb66,0x0404e9cd,0x858e06b7,0x000000c6,
  96065. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  96066. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  96067. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  96068. (sp_digit)0, (sp_digit)0
  96069. },
  96070. /* Y ordinate */
  96071. {
  96072. 0x9fd16650,0x88be9476,0xa272c240,0x353c7086,0x3fad0761,0xc550b901,
  96073. 0x5ef42640,0x97ee7299,0x273e662c,0x17afbd17,0x579b4468,0x98f54449,
  96074. 0x2c7d1bd9,0x5c8a5fb4,0x9a3bc004,0x39296a78,0x00000118,
  96075. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  96076. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  96077. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  96078. (sp_digit)0, (sp_digit)0
  96079. },
  96080. /* Z ordinate */
  96081. {
  96082. 0x00000001,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,
  96083. 0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,
  96084. 0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,
  96085. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  96086. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  96087. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  96088. (sp_digit)0, (sp_digit)0
  96089. },
  96090. /* infinity */
  96091. 0
  96092. };
  96093. #if defined(HAVE_ECC_CHECK_KEY) || defined(HAVE_COMP_KEY)
  96094. static const sp_digit p521_b[17] = {
  96095. 0x6b503f00,0xef451fd4,0x3d2c34f1,0x3573df88,0x3bb1bf07,0x1652c0bd,
  96096. 0xec7e937b,0x56193951,0x8ef109e1,0xb8b48991,0x99b315f3,0xa2da725b,
  96097. 0xb68540ee,0x929a21a0,0x8e1c9a1f,0x953eb961,0x00000051
  96098. };
  96099. #endif
  96100. #ifdef WOLFSSL_SP_SMALL
  96101. /* Multiply a and b into r. (r = a * b)
  96102. *
  96103. * r A single precision integer.
  96104. * a A single precision integer.
  96105. * b A single precision integer.
  96106. */
  96107. static void sp_521_mul_17(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p)
  96108. {
  96109. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  96110. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  96111. register const sp_digit* b asm ("r2") = (const sp_digit*)b_p;
  96112. __asm__ __volatile__ (
  96113. "sub sp, sp, #0x88\n\t"
  96114. "ldr lr, [%[a]]\n\t"
  96115. "ldr r11, [%[b]]\n\t"
  96116. "umull r8, r6, lr, r11\n\t"
  96117. "str r8, [sp]\n\t"
  96118. "mov r7, #0\n\t"
  96119. "mov r8, #0\n\t"
  96120. "mov r5, #4\n\t"
  96121. "\n"
  96122. "L_sp_521_mul_17_outer_%=: \n\t"
  96123. "subs r3, r5, #0x40\n\t"
  96124. "it cc\n\t"
  96125. "movcc r3, #0\n\t"
  96126. "sub r4, r5, r3\n\t"
  96127. "\n"
  96128. "L_sp_521_mul_17_inner_%=: \n\t"
  96129. "ldr lr, [%[a], r3]\n\t"
  96130. "ldr r11, [%[b], r4]\n\t"
  96131. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  96132. "lsl r9, lr, #16\n\t"
  96133. "lsl r10, r11, #16\n\t"
  96134. "lsr r9, r9, #16\n\t"
  96135. "lsr r10, r10, #16\n\t"
  96136. "mul r10, r9, r10\n\t"
  96137. "adds r6, r6, r10\n\t"
  96138. "adcs r7, r7, #0\n\t"
  96139. "adc r8, r8, #0\n\t"
  96140. "lsr r10, r11, #16\n\t"
  96141. "mul r9, r10, r9\n\t"
  96142. "lsr r10, r9, #16\n\t"
  96143. "lsl r9, r9, #16\n\t"
  96144. "adds r6, r6, r9\n\t"
  96145. "adcs r7, r7, r10\n\t"
  96146. "adc r8, r8, #0\n\t"
  96147. "lsr r9, lr, #16\n\t"
  96148. "lsr r10, r11, #16\n\t"
  96149. "mul r10, r9, r10\n\t"
  96150. "adds r7, r7, r10\n\t"
  96151. "adc r8, r8, #0\n\t"
  96152. "lsl r10, r11, #16\n\t"
  96153. "lsr r10, r10, #16\n\t"
  96154. "mul r9, r10, r9\n\t"
  96155. "lsr r10, r9, #16\n\t"
  96156. "lsl r9, r9, #16\n\t"
  96157. "adds r6, r6, r9\n\t"
  96158. "adcs r7, r7, r10\n\t"
  96159. "adc r8, r8, #0\n\t"
  96160. #else
  96161. "umull r9, r10, lr, r11\n\t"
  96162. "adds r6, r6, r9\n\t"
  96163. "adcs r7, r7, r10\n\t"
  96164. "adc r8, r8, #0\n\t"
  96165. #endif
  96166. "ldr lr, [%[a], r4]\n\t"
  96167. "ldr r11, [%[b], r3]\n\t"
  96168. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  96169. "lsl r9, lr, #16\n\t"
  96170. "lsl r10, r11, #16\n\t"
  96171. "lsr r9, r9, #16\n\t"
  96172. "lsr r10, r10, #16\n\t"
  96173. "mul r10, r9, r10\n\t"
  96174. "adds r6, r6, r10\n\t"
  96175. "adcs r7, r7, #0\n\t"
  96176. "adc r8, r8, #0\n\t"
  96177. "lsr r10, r11, #16\n\t"
  96178. "mul r9, r10, r9\n\t"
  96179. "lsr r10, r9, #16\n\t"
  96180. "lsl r9, r9, #16\n\t"
  96181. "adds r6, r6, r9\n\t"
  96182. "adcs r7, r7, r10\n\t"
  96183. "adc r8, r8, #0\n\t"
  96184. "lsr r9, lr, #16\n\t"
  96185. "lsr r10, r11, #16\n\t"
  96186. "mul r10, r9, r10\n\t"
  96187. "adds r7, r7, r10\n\t"
  96188. "adc r8, r8, #0\n\t"
  96189. "lsl r10, r11, #16\n\t"
  96190. "lsr r10, r10, #16\n\t"
  96191. "mul r9, r10, r9\n\t"
  96192. "lsr r10, r9, #16\n\t"
  96193. "lsl r9, r9, #16\n\t"
  96194. "adds r6, r6, r9\n\t"
  96195. "adcs r7, r7, r10\n\t"
  96196. "adc r8, r8, #0\n\t"
  96197. #else
  96198. "umull r9, r10, lr, r11\n\t"
  96199. "adds r6, r6, r9\n\t"
  96200. "adcs r7, r7, r10\n\t"
  96201. "adc r8, r8, #0\n\t"
  96202. #endif
  96203. "add r3, r3, #4\n\t"
  96204. "sub r4, r4, #4\n\t"
  96205. "cmp r3, r4\n\t"
  96206. "bgt L_sp_521_mul_17_inner_done_%=\n\t"
  96207. "blt L_sp_521_mul_17_inner_%=\n\t"
  96208. "ldr lr, [%[a], r3]\n\t"
  96209. "ldr r11, [%[b], r3]\n\t"
  96210. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  96211. "lsl r9, lr, #16\n\t"
  96212. "lsl r10, r11, #16\n\t"
  96213. "lsr r9, r9, #16\n\t"
  96214. "lsr r10, r10, #16\n\t"
  96215. "mul r10, r9, r10\n\t"
  96216. "adds r6, r6, r10\n\t"
  96217. "adcs r7, r7, #0\n\t"
  96218. "adc r8, r8, #0\n\t"
  96219. "lsr r10, r11, #16\n\t"
  96220. "mul r9, r10, r9\n\t"
  96221. "lsr r10, r9, #16\n\t"
  96222. "lsl r9, r9, #16\n\t"
  96223. "adds r6, r6, r9\n\t"
  96224. "adcs r7, r7, r10\n\t"
  96225. "adc r8, r8, #0\n\t"
  96226. "lsr r9, lr, #16\n\t"
  96227. "lsr r10, r11, #16\n\t"
  96228. "mul r10, r9, r10\n\t"
  96229. "adds r7, r7, r10\n\t"
  96230. "adc r8, r8, #0\n\t"
  96231. "lsl r10, r11, #16\n\t"
  96232. "lsr r10, r10, #16\n\t"
  96233. "mul r9, r10, r9\n\t"
  96234. "lsr r10, r9, #16\n\t"
  96235. "lsl r9, r9, #16\n\t"
  96236. "adds r6, r6, r9\n\t"
  96237. "adcs r7, r7, r10\n\t"
  96238. "adc r8, r8, #0\n\t"
  96239. #else
  96240. "umull r9, r10, lr, r11\n\t"
  96241. "adds r6, r6, r9\n\t"
  96242. "adcs r7, r7, r10\n\t"
  96243. "adc r8, r8, #0\n\t"
  96244. #endif
  96245. "\n"
  96246. "L_sp_521_mul_17_inner_done_%=: \n\t"
  96247. "str r6, [sp, r5]\n\t"
  96248. "mov r6, r7\n\t"
  96249. "mov r7, r8\n\t"
  96250. "mov r8, #0\n\t"
  96251. "add r5, r5, #4\n\t"
  96252. "cmp r5, #0x7c\n\t"
  96253. "ble L_sp_521_mul_17_outer_%=\n\t"
  96254. "ldr lr, [%[a], #64]\n\t"
  96255. "ldr r11, [%[b], #64]\n\t"
  96256. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  96257. "lsl r9, lr, #16\n\t"
  96258. "lsl r10, r11, #16\n\t"
  96259. "lsr r9, r9, #16\n\t"
  96260. "lsr r10, r10, #16\n\t"
  96261. "mul r10, r9, r10\n\t"
  96262. "adds r6, r6, r10\n\t"
  96263. "adc r7, r7, #0\n\t"
  96264. "lsr r10, r11, #16\n\t"
  96265. "mul r9, r10, r9\n\t"
  96266. "lsr r10, r9, #16\n\t"
  96267. "lsl r9, r9, #16\n\t"
  96268. "adds r6, r6, r9\n\t"
  96269. "adc r7, r7, r10\n\t"
  96270. "lsr r9, lr, #16\n\t"
  96271. "lsr r10, r11, #16\n\t"
  96272. "mul r10, r9, r10\n\t"
  96273. "add r7, r7, r10\n\t"
  96274. "lsl r10, r11, #16\n\t"
  96275. "lsr r10, r10, #16\n\t"
  96276. "mul r9, r10, r9\n\t"
  96277. "lsr r10, r9, #16\n\t"
  96278. "lsl r9, r9, #16\n\t"
  96279. "adds r6, r6, r9\n\t"
  96280. "adc r7, r7, r10\n\t"
  96281. #else
  96282. "umlal r6, r7, lr, r11\n\t"
  96283. #endif
  96284. "str r6, [sp, r5]\n\t"
  96285. "add r5, r5, #4\n\t"
  96286. "str r7, [sp, r5]\n\t"
  96287. "ldm sp!, {r6, r7}\n\t"
  96288. "stm %[r]!, {r6, r7}\n\t"
  96289. "sub r5, r5, #8\n\t"
  96290. "\n"
  96291. "L_sp_521_mul_17_store_%=: \n\t"
  96292. "ldm sp!, {r3, r4, r6, r7, r8, r9, r10, r11}\n\t"
  96293. "stm %[r]!, {r3, r4, r6, r7, r8, r9, r10, r11}\n\t"
  96294. "subs r5, r5, #32\n\t"
  96295. "bgt L_sp_521_mul_17_store_%=\n\t"
  96296. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  96297. :
  96298. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "lr", "r11", "cc"
  96299. );
  96300. }
  96301. #else
  96302. /* Multiply a and b into r. (r = a * b)
  96303. *
  96304. * r A single precision integer.
  96305. * a A single precision integer.
  96306. * b A single precision integer.
  96307. */
  96308. static void sp_521_mul_17(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p)
  96309. {
  96310. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  96311. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  96312. register const sp_digit* b asm ("r2") = (const sp_digit*)b_p;
  96313. __asm__ __volatile__ (
  96314. "sub sp, sp, #0x44\n\t"
  96315. /* A[0] * B[0] */
  96316. "ldr r11, [%[a]]\n\t"
  96317. "ldr r12, [%[b]]\n\t"
  96318. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  96319. "lsl r6, r11, #16\n\t"
  96320. "lsl r3, r12, #16\n\t"
  96321. "lsr r6, r6, #16\n\t"
  96322. "lsr r3, r3, #16\n\t"
  96323. "mul r3, r6, r3\n\t"
  96324. "lsr r7, r12, #16\n\t"
  96325. "mul r6, r7, r6\n\t"
  96326. "lsr r4, r6, #16\n\t"
  96327. "lsl r6, r6, #16\n\t"
  96328. "adds r3, r3, r6\n\t"
  96329. "adc r4, r4, #0\n\t"
  96330. "lsr r6, r11, #16\n\t"
  96331. "mul r7, r6, r7\n\t"
  96332. "add r4, r4, r7\n\t"
  96333. "lsl r7, r12, #16\n\t"
  96334. "lsr r7, r7, #16\n\t"
  96335. "mul r6, r7, r6\n\t"
  96336. "lsr r7, r6, #16\n\t"
  96337. "lsl r6, r6, #16\n\t"
  96338. "adds r3, r3, r6\n\t"
  96339. "adc r4, r4, r7\n\t"
  96340. "mov r5, #0\n\t"
  96341. #else
  96342. "umull r3, r4, r11, r12\n\t"
  96343. "mov r5, #0\n\t"
  96344. #endif
  96345. "str r3, [sp]\n\t"
  96346. /* A[0] * B[1] */
  96347. "ldr r9, [%[b], #4]\n\t"
  96348. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  96349. "lsl r6, r11, #16\n\t"
  96350. "lsl r7, r9, #16\n\t"
  96351. "lsr r6, r6, #16\n\t"
  96352. "lsr r7, r7, #16\n\t"
  96353. "mul r7, r6, r7\n\t"
  96354. "adds r4, r4, r7\n\t"
  96355. "adcs r5, r5, #0\n\t"
  96356. "mov r3, #0\n\t"
  96357. "adc r3, r3, #0\n\t"
  96358. "lsr r7, r9, #16\n\t"
  96359. "mul r6, r7, r6\n\t"
  96360. "lsr r7, r6, #16\n\t"
  96361. "lsl r6, r6, #16\n\t"
  96362. "adds r4, r4, r6\n\t"
  96363. "adcs r5, r5, r7\n\t"
  96364. "adc r3, r3, #0\n\t"
  96365. "lsr r6, r11, #16\n\t"
  96366. "lsr r7, r9, #16\n\t"
  96367. "mul r7, r6, r7\n\t"
  96368. "adds r5, r5, r7\n\t"
  96369. "adc r3, r3, #0\n\t"
  96370. "lsl r7, r9, #16\n\t"
  96371. "lsr r7, r7, #16\n\t"
  96372. "mul r6, r7, r6\n\t"
  96373. "lsr r7, r6, #16\n\t"
  96374. "lsl r6, r6, #16\n\t"
  96375. "adds r4, r4, r6\n\t"
  96376. "adcs r5, r5, r7\n\t"
  96377. "adc r3, r3, #0\n\t"
  96378. #else
  96379. "umull r6, r7, r11, r9\n\t"
  96380. "adds r4, r4, r6\n\t"
  96381. "adcs r5, r5, r7\n\t"
  96382. "mov r3, #0\n\t"
  96383. "adc r3, r3, #0\n\t"
  96384. #endif
  96385. /* A[1] * B[0] */
  96386. "ldr r8, [%[a], #4]\n\t"
  96387. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  96388. "lsl r6, r8, #16\n\t"
  96389. "lsl r7, r12, #16\n\t"
  96390. "lsr r6, r6, #16\n\t"
  96391. "lsr r7, r7, #16\n\t"
  96392. "mul r7, r6, r7\n\t"
  96393. "adds r4, r4, r7\n\t"
  96394. "adcs r5, r5, #0\n\t"
  96395. "adc r3, r3, #0\n\t"
  96396. "lsr r7, r12, #16\n\t"
  96397. "mul r6, r7, r6\n\t"
  96398. "lsr r7, r6, #16\n\t"
  96399. "lsl r6, r6, #16\n\t"
  96400. "adds r4, r4, r6\n\t"
  96401. "adcs r5, r5, r7\n\t"
  96402. "adc r3, r3, #0\n\t"
  96403. "lsr r6, r8, #16\n\t"
  96404. "lsr r7, r12, #16\n\t"
  96405. "mul r7, r6, r7\n\t"
  96406. "adds r5, r5, r7\n\t"
  96407. "adc r3, r3, #0\n\t"
  96408. "lsl r7, r12, #16\n\t"
  96409. "lsr r7, r7, #16\n\t"
  96410. "mul r6, r7, r6\n\t"
  96411. "lsr r7, r6, #16\n\t"
  96412. "lsl r6, r6, #16\n\t"
  96413. "adds r4, r4, r6\n\t"
  96414. "adcs r5, r5, r7\n\t"
  96415. "adc r3, r3, #0\n\t"
  96416. #else
  96417. "umull r6, r7, r8, r12\n\t"
  96418. "adds r4, r4, r6\n\t"
  96419. "adcs r5, r5, r7\n\t"
  96420. "adc r3, r3, #0\n\t"
  96421. #endif
  96422. "str r4, [sp, #4]\n\t"
  96423. /* A[2] * B[0] */
  96424. "ldr r8, [%[a], #8]\n\t"
  96425. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  96426. "lsl r6, r8, #16\n\t"
  96427. "lsl r7, r12, #16\n\t"
  96428. "lsr r6, r6, #16\n\t"
  96429. "lsr r7, r7, #16\n\t"
  96430. "mul r7, r6, r7\n\t"
  96431. "adds r5, r5, r7\n\t"
  96432. "adcs r3, r3, #0\n\t"
  96433. "mov r4, #0\n\t"
  96434. "adc r4, r4, #0\n\t"
  96435. "lsr r7, r12, #16\n\t"
  96436. "mul r6, r7, r6\n\t"
  96437. "lsr r7, r6, #16\n\t"
  96438. "lsl r6, r6, #16\n\t"
  96439. "adds r5, r5, r6\n\t"
  96440. "adcs r3, r3, r7\n\t"
  96441. "adc r4, r4, #0\n\t"
  96442. "lsr r6, r8, #16\n\t"
  96443. "lsr r7, r12, #16\n\t"
  96444. "mul r7, r6, r7\n\t"
  96445. "adds r3, r3, r7\n\t"
  96446. "adc r4, r4, #0\n\t"
  96447. "lsl r7, r12, #16\n\t"
  96448. "lsr r7, r7, #16\n\t"
  96449. "mul r6, r7, r6\n\t"
  96450. "lsr r7, r6, #16\n\t"
  96451. "lsl r6, r6, #16\n\t"
  96452. "adds r5, r5, r6\n\t"
  96453. "adcs r3, r3, r7\n\t"
  96454. "adc r4, r4, #0\n\t"
  96455. #else
  96456. "umull r6, r7, r8, r12\n\t"
  96457. "adds r5, r5, r6\n\t"
  96458. "adcs r3, r3, r7\n\t"
  96459. "mov r4, #0\n\t"
  96460. "adc r4, r4, #0\n\t"
  96461. #endif
  96462. /* A[1] * B[1] */
  96463. "ldr r11, [%[a], #4]\n\t"
  96464. "ldr r12, [%[b], #4]\n\t"
  96465. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  96466. "lsl r6, r11, #16\n\t"
  96467. "lsl r7, r12, #16\n\t"
  96468. "lsr r6, r6, #16\n\t"
  96469. "lsr r7, r7, #16\n\t"
  96470. "mul r7, r6, r7\n\t"
  96471. "adds r5, r5, r7\n\t"
  96472. "adcs r3, r3, #0\n\t"
  96473. "adc r4, r4, #0\n\t"
  96474. "lsr r7, r12, #16\n\t"
  96475. "mul r6, r7, r6\n\t"
  96476. "lsr r7, r6, #16\n\t"
  96477. "lsl r6, r6, #16\n\t"
  96478. "adds r5, r5, r6\n\t"
  96479. "adcs r3, r3, r7\n\t"
  96480. "adc r4, r4, #0\n\t"
  96481. "lsr r6, r11, #16\n\t"
  96482. "lsr r7, r12, #16\n\t"
  96483. "mul r7, r6, r7\n\t"
  96484. "adds r3, r3, r7\n\t"
  96485. "adc r4, r4, #0\n\t"
  96486. "lsl r7, r12, #16\n\t"
  96487. "lsr r7, r7, #16\n\t"
  96488. "mul r6, r7, r6\n\t"
  96489. "lsr r7, r6, #16\n\t"
  96490. "lsl r6, r6, #16\n\t"
  96491. "adds r5, r5, r6\n\t"
  96492. "adcs r3, r3, r7\n\t"
  96493. "adc r4, r4, #0\n\t"
  96494. #else
  96495. "umull r6, r7, r11, r12\n\t"
  96496. "adds r5, r5, r6\n\t"
  96497. "adcs r3, r3, r7\n\t"
  96498. "adc r4, r4, #0\n\t"
  96499. #endif
  96500. /* A[0] * B[2] */
  96501. "ldr r8, [%[a]]\n\t"
  96502. "ldr r9, [%[b], #8]\n\t"
  96503. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  96504. "lsl r6, r8, #16\n\t"
  96505. "lsl r7, r9, #16\n\t"
  96506. "lsr r6, r6, #16\n\t"
  96507. "lsr r7, r7, #16\n\t"
  96508. "mul r7, r6, r7\n\t"
  96509. "adds r5, r5, r7\n\t"
  96510. "adcs r3, r3, #0\n\t"
  96511. "adc r4, r4, #0\n\t"
  96512. "lsr r7, r9, #16\n\t"
  96513. "mul r6, r7, r6\n\t"
  96514. "lsr r7, r6, #16\n\t"
  96515. "lsl r6, r6, #16\n\t"
  96516. "adds r5, r5, r6\n\t"
  96517. "adcs r3, r3, r7\n\t"
  96518. "adc r4, r4, #0\n\t"
  96519. "lsr r6, r8, #16\n\t"
  96520. "lsr r7, r9, #16\n\t"
  96521. "mul r7, r6, r7\n\t"
  96522. "adds r3, r3, r7\n\t"
  96523. "adc r4, r4, #0\n\t"
  96524. "lsl r7, r9, #16\n\t"
  96525. "lsr r7, r7, #16\n\t"
  96526. "mul r6, r7, r6\n\t"
  96527. "lsr r7, r6, #16\n\t"
  96528. "lsl r6, r6, #16\n\t"
  96529. "adds r5, r5, r6\n\t"
  96530. "adcs r3, r3, r7\n\t"
  96531. "adc r4, r4, #0\n\t"
  96532. #else
  96533. "umull r6, r7, r8, r9\n\t"
  96534. "adds r5, r5, r6\n\t"
  96535. "adcs r3, r3, r7\n\t"
  96536. "adc r4, r4, #0\n\t"
  96537. #endif
  96538. "str r5, [sp, #8]\n\t"
  96539. /* A[0] * B[3] */
  96540. "ldr r9, [%[b], #12]\n\t"
  96541. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  96542. "lsl r6, r8, #16\n\t"
  96543. "lsl r7, r9, #16\n\t"
  96544. "lsr r6, r6, #16\n\t"
  96545. "lsr r7, r7, #16\n\t"
  96546. "mul r7, r6, r7\n\t"
  96547. "adds r3, r3, r7\n\t"
  96548. "adcs r4, r4, #0\n\t"
  96549. "mov r5, #0\n\t"
  96550. "adc r5, r5, #0\n\t"
  96551. "lsr r7, r9, #16\n\t"
  96552. "mul r6, r7, r6\n\t"
  96553. "lsr r7, r6, #16\n\t"
  96554. "lsl r6, r6, #16\n\t"
  96555. "adds r3, r3, r6\n\t"
  96556. "adcs r4, r4, r7\n\t"
  96557. "adc r5, r5, #0\n\t"
  96558. "lsr r6, r8, #16\n\t"
  96559. "lsr r7, r9, #16\n\t"
  96560. "mul r7, r6, r7\n\t"
  96561. "adds r4, r4, r7\n\t"
  96562. "adc r5, r5, #0\n\t"
  96563. "lsl r7, r9, #16\n\t"
  96564. "lsr r7, r7, #16\n\t"
  96565. "mul r6, r7, r6\n\t"
  96566. "lsr r7, r6, #16\n\t"
  96567. "lsl r6, r6, #16\n\t"
  96568. "adds r3, r3, r6\n\t"
  96569. "adcs r4, r4, r7\n\t"
  96570. "adc r5, r5, #0\n\t"
  96571. #else
  96572. "umull r6, r7, r8, r9\n\t"
  96573. "adds r3, r3, r6\n\t"
  96574. "adcs r4, r4, r7\n\t"
  96575. "mov r5, #0\n\t"
  96576. "adc r5, r5, #0\n\t"
  96577. #endif
  96578. /* A[1] * B[2] */
  96579. "ldr r9, [%[b], #8]\n\t"
  96580. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  96581. "lsl r6, r11, #16\n\t"
  96582. "lsl r7, r9, #16\n\t"
  96583. "lsr r6, r6, #16\n\t"
  96584. "lsr r7, r7, #16\n\t"
  96585. "mul r7, r6, r7\n\t"
  96586. "adds r3, r3, r7\n\t"
  96587. "adcs r4, r4, #0\n\t"
  96588. "adc r5, r5, #0\n\t"
  96589. "lsr r7, r9, #16\n\t"
  96590. "mul r6, r7, r6\n\t"
  96591. "lsr r7, r6, #16\n\t"
  96592. "lsl r6, r6, #16\n\t"
  96593. "adds r3, r3, r6\n\t"
  96594. "adcs r4, r4, r7\n\t"
  96595. "adc r5, r5, #0\n\t"
  96596. "lsr r6, r11, #16\n\t"
  96597. "lsr r7, r9, #16\n\t"
  96598. "mul r7, r6, r7\n\t"
  96599. "adds r4, r4, r7\n\t"
  96600. "adc r5, r5, #0\n\t"
  96601. "lsl r7, r9, #16\n\t"
  96602. "lsr r7, r7, #16\n\t"
  96603. "mul r6, r7, r6\n\t"
  96604. "lsr r7, r6, #16\n\t"
  96605. "lsl r6, r6, #16\n\t"
  96606. "adds r3, r3, r6\n\t"
  96607. "adcs r4, r4, r7\n\t"
  96608. "adc r5, r5, #0\n\t"
  96609. #else
  96610. "umull r6, r7, r11, r9\n\t"
  96611. "adds r3, r3, r6\n\t"
  96612. "adcs r4, r4, r7\n\t"
  96613. "adc r5, r5, #0\n\t"
  96614. #endif
  96615. /* A[2] * B[1] */
  96616. "ldr r8, [%[a], #8]\n\t"
  96617. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  96618. "lsl r6, r8, #16\n\t"
  96619. "lsl r7, r12, #16\n\t"
  96620. "lsr r6, r6, #16\n\t"
  96621. "lsr r7, r7, #16\n\t"
  96622. "mul r7, r6, r7\n\t"
  96623. "adds r3, r3, r7\n\t"
  96624. "adcs r4, r4, #0\n\t"
  96625. "adc r5, r5, #0\n\t"
  96626. "lsr r7, r12, #16\n\t"
  96627. "mul r6, r7, r6\n\t"
  96628. "lsr r7, r6, #16\n\t"
  96629. "lsl r6, r6, #16\n\t"
  96630. "adds r3, r3, r6\n\t"
  96631. "adcs r4, r4, r7\n\t"
  96632. "adc r5, r5, #0\n\t"
  96633. "lsr r6, r8, #16\n\t"
  96634. "lsr r7, r12, #16\n\t"
  96635. "mul r7, r6, r7\n\t"
  96636. "adds r4, r4, r7\n\t"
  96637. "adc r5, r5, #0\n\t"
  96638. "lsl r7, r12, #16\n\t"
  96639. "lsr r7, r7, #16\n\t"
  96640. "mul r6, r7, r6\n\t"
  96641. "lsr r7, r6, #16\n\t"
  96642. "lsl r6, r6, #16\n\t"
  96643. "adds r3, r3, r6\n\t"
  96644. "adcs r4, r4, r7\n\t"
  96645. "adc r5, r5, #0\n\t"
  96646. #else
  96647. "umull r6, r7, r8, r12\n\t"
  96648. "adds r3, r3, r6\n\t"
  96649. "adcs r4, r4, r7\n\t"
  96650. "adc r5, r5, #0\n\t"
  96651. #endif
  96652. /* A[3] * B[0] */
  96653. "ldr r8, [%[a], #12]\n\t"
  96654. "ldr r9, [%[b]]\n\t"
  96655. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  96656. "lsl r6, r8, #16\n\t"
  96657. "lsl r7, r9, #16\n\t"
  96658. "lsr r6, r6, #16\n\t"
  96659. "lsr r7, r7, #16\n\t"
  96660. "mul r7, r6, r7\n\t"
  96661. "adds r3, r3, r7\n\t"
  96662. "adcs r4, r4, #0\n\t"
  96663. "adc r5, r5, #0\n\t"
  96664. "lsr r7, r9, #16\n\t"
  96665. "mul r6, r7, r6\n\t"
  96666. "lsr r7, r6, #16\n\t"
  96667. "lsl r6, r6, #16\n\t"
  96668. "adds r3, r3, r6\n\t"
  96669. "adcs r4, r4, r7\n\t"
  96670. "adc r5, r5, #0\n\t"
  96671. "lsr r6, r8, #16\n\t"
  96672. "lsr r7, r9, #16\n\t"
  96673. "mul r7, r6, r7\n\t"
  96674. "adds r4, r4, r7\n\t"
  96675. "adc r5, r5, #0\n\t"
  96676. "lsl r7, r9, #16\n\t"
  96677. "lsr r7, r7, #16\n\t"
  96678. "mul r6, r7, r6\n\t"
  96679. "lsr r7, r6, #16\n\t"
  96680. "lsl r6, r6, #16\n\t"
  96681. "adds r3, r3, r6\n\t"
  96682. "adcs r4, r4, r7\n\t"
  96683. "adc r5, r5, #0\n\t"
  96684. #else
  96685. "umull r6, r7, r8, r9\n\t"
  96686. "adds r3, r3, r6\n\t"
  96687. "adcs r4, r4, r7\n\t"
  96688. "adc r5, r5, #0\n\t"
  96689. #endif
  96690. "str r3, [sp, #12]\n\t"
  96691. /* A[4] * B[0] */
  96692. "ldr r8, [%[a], #16]\n\t"
  96693. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  96694. "lsl r6, r8, #16\n\t"
  96695. "lsl r7, r9, #16\n\t"
  96696. "lsr r6, r6, #16\n\t"
  96697. "lsr r7, r7, #16\n\t"
  96698. "mul r7, r6, r7\n\t"
  96699. "adds r4, r4, r7\n\t"
  96700. "adcs r5, r5, #0\n\t"
  96701. "mov r3, #0\n\t"
  96702. "adc r3, r3, #0\n\t"
  96703. "lsr r7, r9, #16\n\t"
  96704. "mul r6, r7, r6\n\t"
  96705. "lsr r7, r6, #16\n\t"
  96706. "lsl r6, r6, #16\n\t"
  96707. "adds r4, r4, r6\n\t"
  96708. "adcs r5, r5, r7\n\t"
  96709. "adc r3, r3, #0\n\t"
  96710. "lsr r6, r8, #16\n\t"
  96711. "lsr r7, r9, #16\n\t"
  96712. "mul r7, r6, r7\n\t"
  96713. "adds r5, r5, r7\n\t"
  96714. "adc r3, r3, #0\n\t"
  96715. "lsl r7, r9, #16\n\t"
  96716. "lsr r7, r7, #16\n\t"
  96717. "mul r6, r7, r6\n\t"
  96718. "lsr r7, r6, #16\n\t"
  96719. "lsl r6, r6, #16\n\t"
  96720. "adds r4, r4, r6\n\t"
  96721. "adcs r5, r5, r7\n\t"
  96722. "adc r3, r3, #0\n\t"
  96723. #else
  96724. "umull r6, r7, r8, r9\n\t"
  96725. "adds r4, r4, r6\n\t"
  96726. "adcs r5, r5, r7\n\t"
  96727. "mov r3, #0\n\t"
  96728. "adc r3, r3, #0\n\t"
  96729. #endif
  96730. /* A[3] * B[1] */
  96731. "ldr r8, [%[a], #12]\n\t"
  96732. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  96733. "lsl r6, r8, #16\n\t"
  96734. "lsl r7, r12, #16\n\t"
  96735. "lsr r6, r6, #16\n\t"
  96736. "lsr r7, r7, #16\n\t"
  96737. "mul r7, r6, r7\n\t"
  96738. "adds r4, r4, r7\n\t"
  96739. "adcs r5, r5, #0\n\t"
  96740. "adc r3, r3, #0\n\t"
  96741. "lsr r7, r12, #16\n\t"
  96742. "mul r6, r7, r6\n\t"
  96743. "lsr r7, r6, #16\n\t"
  96744. "lsl r6, r6, #16\n\t"
  96745. "adds r4, r4, r6\n\t"
  96746. "adcs r5, r5, r7\n\t"
  96747. "adc r3, r3, #0\n\t"
  96748. "lsr r6, r8, #16\n\t"
  96749. "lsr r7, r12, #16\n\t"
  96750. "mul r7, r6, r7\n\t"
  96751. "adds r5, r5, r7\n\t"
  96752. "adc r3, r3, #0\n\t"
  96753. "lsl r7, r12, #16\n\t"
  96754. "lsr r7, r7, #16\n\t"
  96755. "mul r6, r7, r6\n\t"
  96756. "lsr r7, r6, #16\n\t"
  96757. "lsl r6, r6, #16\n\t"
  96758. "adds r4, r4, r6\n\t"
  96759. "adcs r5, r5, r7\n\t"
  96760. "adc r3, r3, #0\n\t"
  96761. #else
  96762. "umull r6, r7, r8, r12\n\t"
  96763. "adds r4, r4, r6\n\t"
  96764. "adcs r5, r5, r7\n\t"
  96765. "adc r3, r3, #0\n\t"
  96766. #endif
  96767. /* A[2] * B[2] */
  96768. "ldr r11, [%[a], #8]\n\t"
  96769. "ldr r12, [%[b], #8]\n\t"
  96770. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  96771. "lsl r6, r11, #16\n\t"
  96772. "lsl r7, r12, #16\n\t"
  96773. "lsr r6, r6, #16\n\t"
  96774. "lsr r7, r7, #16\n\t"
  96775. "mul r7, r6, r7\n\t"
  96776. "adds r4, r4, r7\n\t"
  96777. "adcs r5, r5, #0\n\t"
  96778. "adc r3, r3, #0\n\t"
  96779. "lsr r7, r12, #16\n\t"
  96780. "mul r6, r7, r6\n\t"
  96781. "lsr r7, r6, #16\n\t"
  96782. "lsl r6, r6, #16\n\t"
  96783. "adds r4, r4, r6\n\t"
  96784. "adcs r5, r5, r7\n\t"
  96785. "adc r3, r3, #0\n\t"
  96786. "lsr r6, r11, #16\n\t"
  96787. "lsr r7, r12, #16\n\t"
  96788. "mul r7, r6, r7\n\t"
  96789. "adds r5, r5, r7\n\t"
  96790. "adc r3, r3, #0\n\t"
  96791. "lsl r7, r12, #16\n\t"
  96792. "lsr r7, r7, #16\n\t"
  96793. "mul r6, r7, r6\n\t"
  96794. "lsr r7, r6, #16\n\t"
  96795. "lsl r6, r6, #16\n\t"
  96796. "adds r4, r4, r6\n\t"
  96797. "adcs r5, r5, r7\n\t"
  96798. "adc r3, r3, #0\n\t"
  96799. #else
  96800. "umull r6, r7, r11, r12\n\t"
  96801. "adds r4, r4, r6\n\t"
  96802. "adcs r5, r5, r7\n\t"
  96803. "adc r3, r3, #0\n\t"
  96804. #endif
  96805. /* A[1] * B[3] */
  96806. "ldr r8, [%[a], #4]\n\t"
  96807. "ldr r9, [%[b], #12]\n\t"
  96808. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  96809. "lsl r6, r8, #16\n\t"
  96810. "lsl r7, r9, #16\n\t"
  96811. "lsr r6, r6, #16\n\t"
  96812. "lsr r7, r7, #16\n\t"
  96813. "mul r7, r6, r7\n\t"
  96814. "adds r4, r4, r7\n\t"
  96815. "adcs r5, r5, #0\n\t"
  96816. "adc r3, r3, #0\n\t"
  96817. "lsr r7, r9, #16\n\t"
  96818. "mul r6, r7, r6\n\t"
  96819. "lsr r7, r6, #16\n\t"
  96820. "lsl r6, r6, #16\n\t"
  96821. "adds r4, r4, r6\n\t"
  96822. "adcs r5, r5, r7\n\t"
  96823. "adc r3, r3, #0\n\t"
  96824. "lsr r6, r8, #16\n\t"
  96825. "lsr r7, r9, #16\n\t"
  96826. "mul r7, r6, r7\n\t"
  96827. "adds r5, r5, r7\n\t"
  96828. "adc r3, r3, #0\n\t"
  96829. "lsl r7, r9, #16\n\t"
  96830. "lsr r7, r7, #16\n\t"
  96831. "mul r6, r7, r6\n\t"
  96832. "lsr r7, r6, #16\n\t"
  96833. "lsl r6, r6, #16\n\t"
  96834. "adds r4, r4, r6\n\t"
  96835. "adcs r5, r5, r7\n\t"
  96836. "adc r3, r3, #0\n\t"
  96837. #else
  96838. "umull r6, r7, r8, r9\n\t"
  96839. "adds r4, r4, r6\n\t"
  96840. "adcs r5, r5, r7\n\t"
  96841. "adc r3, r3, #0\n\t"
  96842. #endif
  96843. /* A[0] * B[4] */
  96844. "ldr r8, [%[a]]\n\t"
  96845. "ldr r9, [%[b], #16]\n\t"
  96846. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  96847. "lsl r6, r8, #16\n\t"
  96848. "lsl r7, r9, #16\n\t"
  96849. "lsr r6, r6, #16\n\t"
  96850. "lsr r7, r7, #16\n\t"
  96851. "mul r7, r6, r7\n\t"
  96852. "adds r4, r4, r7\n\t"
  96853. "adcs r5, r5, #0\n\t"
  96854. "adc r3, r3, #0\n\t"
  96855. "lsr r7, r9, #16\n\t"
  96856. "mul r6, r7, r6\n\t"
  96857. "lsr r7, r6, #16\n\t"
  96858. "lsl r6, r6, #16\n\t"
  96859. "adds r4, r4, r6\n\t"
  96860. "adcs r5, r5, r7\n\t"
  96861. "adc r3, r3, #0\n\t"
  96862. "lsr r6, r8, #16\n\t"
  96863. "lsr r7, r9, #16\n\t"
  96864. "mul r7, r6, r7\n\t"
  96865. "adds r5, r5, r7\n\t"
  96866. "adc r3, r3, #0\n\t"
  96867. "lsl r7, r9, #16\n\t"
  96868. "lsr r7, r7, #16\n\t"
  96869. "mul r6, r7, r6\n\t"
  96870. "lsr r7, r6, #16\n\t"
  96871. "lsl r6, r6, #16\n\t"
  96872. "adds r4, r4, r6\n\t"
  96873. "adcs r5, r5, r7\n\t"
  96874. "adc r3, r3, #0\n\t"
  96875. #else
  96876. "umull r6, r7, r8, r9\n\t"
  96877. "adds r4, r4, r6\n\t"
  96878. "adcs r5, r5, r7\n\t"
  96879. "adc r3, r3, #0\n\t"
  96880. #endif
  96881. "str r4, [sp, #16]\n\t"
  96882. /* A[0] * B[5] */
  96883. "ldr r9, [%[b], #20]\n\t"
  96884. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  96885. "lsl r6, r8, #16\n\t"
  96886. "lsl r7, r9, #16\n\t"
  96887. "lsr r6, r6, #16\n\t"
  96888. "lsr r7, r7, #16\n\t"
  96889. "mul r7, r6, r7\n\t"
  96890. "adds r5, r5, r7\n\t"
  96891. "adcs r3, r3, #0\n\t"
  96892. "mov r4, #0\n\t"
  96893. "adc r4, r4, #0\n\t"
  96894. "lsr r7, r9, #16\n\t"
  96895. "mul r6, r7, r6\n\t"
  96896. "lsr r7, r6, #16\n\t"
  96897. "lsl r6, r6, #16\n\t"
  96898. "adds r5, r5, r6\n\t"
  96899. "adcs r3, r3, r7\n\t"
  96900. "adc r4, r4, #0\n\t"
  96901. "lsr r6, r8, #16\n\t"
  96902. "lsr r7, r9, #16\n\t"
  96903. "mul r7, r6, r7\n\t"
  96904. "adds r3, r3, r7\n\t"
  96905. "adc r4, r4, #0\n\t"
  96906. "lsl r7, r9, #16\n\t"
  96907. "lsr r7, r7, #16\n\t"
  96908. "mul r6, r7, r6\n\t"
  96909. "lsr r7, r6, #16\n\t"
  96910. "lsl r6, r6, #16\n\t"
  96911. "adds r5, r5, r6\n\t"
  96912. "adcs r3, r3, r7\n\t"
  96913. "adc r4, r4, #0\n\t"
  96914. #else
  96915. "umull r6, r7, r8, r9\n\t"
  96916. "adds r5, r5, r6\n\t"
  96917. "adcs r3, r3, r7\n\t"
  96918. "mov r4, #0\n\t"
  96919. "adc r4, r4, #0\n\t"
  96920. #endif
  96921. /* A[1] * B[4] */
  96922. "ldr r8, [%[a], #4]\n\t"
  96923. "ldr r9, [%[b], #16]\n\t"
  96924. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  96925. "lsl r6, r8, #16\n\t"
  96926. "lsl r7, r9, #16\n\t"
  96927. "lsr r6, r6, #16\n\t"
  96928. "lsr r7, r7, #16\n\t"
  96929. "mul r7, r6, r7\n\t"
  96930. "adds r5, r5, r7\n\t"
  96931. "adcs r3, r3, #0\n\t"
  96932. "adc r4, r4, #0\n\t"
  96933. "lsr r7, r9, #16\n\t"
  96934. "mul r6, r7, r6\n\t"
  96935. "lsr r7, r6, #16\n\t"
  96936. "lsl r6, r6, #16\n\t"
  96937. "adds r5, r5, r6\n\t"
  96938. "adcs r3, r3, r7\n\t"
  96939. "adc r4, r4, #0\n\t"
  96940. "lsr r6, r8, #16\n\t"
  96941. "lsr r7, r9, #16\n\t"
  96942. "mul r7, r6, r7\n\t"
  96943. "adds r3, r3, r7\n\t"
  96944. "adc r4, r4, #0\n\t"
  96945. "lsl r7, r9, #16\n\t"
  96946. "lsr r7, r7, #16\n\t"
  96947. "mul r6, r7, r6\n\t"
  96948. "lsr r7, r6, #16\n\t"
  96949. "lsl r6, r6, #16\n\t"
  96950. "adds r5, r5, r6\n\t"
  96951. "adcs r3, r3, r7\n\t"
  96952. "adc r4, r4, #0\n\t"
  96953. #else
  96954. "umull r6, r7, r8, r9\n\t"
  96955. "adds r5, r5, r6\n\t"
  96956. "adcs r3, r3, r7\n\t"
  96957. "adc r4, r4, #0\n\t"
  96958. #endif
  96959. /* A[2] * B[3] */
  96960. "ldr r9, [%[b], #12]\n\t"
  96961. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  96962. "lsl r6, r11, #16\n\t"
  96963. "lsl r7, r9, #16\n\t"
  96964. "lsr r6, r6, #16\n\t"
  96965. "lsr r7, r7, #16\n\t"
  96966. "mul r7, r6, r7\n\t"
  96967. "adds r5, r5, r7\n\t"
  96968. "adcs r3, r3, #0\n\t"
  96969. "adc r4, r4, #0\n\t"
  96970. "lsr r7, r9, #16\n\t"
  96971. "mul r6, r7, r6\n\t"
  96972. "lsr r7, r6, #16\n\t"
  96973. "lsl r6, r6, #16\n\t"
  96974. "adds r5, r5, r6\n\t"
  96975. "adcs r3, r3, r7\n\t"
  96976. "adc r4, r4, #0\n\t"
  96977. "lsr r6, r11, #16\n\t"
  96978. "lsr r7, r9, #16\n\t"
  96979. "mul r7, r6, r7\n\t"
  96980. "adds r3, r3, r7\n\t"
  96981. "adc r4, r4, #0\n\t"
  96982. "lsl r7, r9, #16\n\t"
  96983. "lsr r7, r7, #16\n\t"
  96984. "mul r6, r7, r6\n\t"
  96985. "lsr r7, r6, #16\n\t"
  96986. "lsl r6, r6, #16\n\t"
  96987. "adds r5, r5, r6\n\t"
  96988. "adcs r3, r3, r7\n\t"
  96989. "adc r4, r4, #0\n\t"
  96990. #else
  96991. "umull r6, r7, r11, r9\n\t"
  96992. "adds r5, r5, r6\n\t"
  96993. "adcs r3, r3, r7\n\t"
  96994. "adc r4, r4, #0\n\t"
  96995. #endif
  96996. /* A[3] * B[2] */
  96997. "ldr r8, [%[a], #12]\n\t"
  96998. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  96999. "lsl r6, r8, #16\n\t"
  97000. "lsl r7, r12, #16\n\t"
  97001. "lsr r6, r6, #16\n\t"
  97002. "lsr r7, r7, #16\n\t"
  97003. "mul r7, r6, r7\n\t"
  97004. "adds r5, r5, r7\n\t"
  97005. "adcs r3, r3, #0\n\t"
  97006. "adc r4, r4, #0\n\t"
  97007. "lsr r7, r12, #16\n\t"
  97008. "mul r6, r7, r6\n\t"
  97009. "lsr r7, r6, #16\n\t"
  97010. "lsl r6, r6, #16\n\t"
  97011. "adds r5, r5, r6\n\t"
  97012. "adcs r3, r3, r7\n\t"
  97013. "adc r4, r4, #0\n\t"
  97014. "lsr r6, r8, #16\n\t"
  97015. "lsr r7, r12, #16\n\t"
  97016. "mul r7, r6, r7\n\t"
  97017. "adds r3, r3, r7\n\t"
  97018. "adc r4, r4, #0\n\t"
  97019. "lsl r7, r12, #16\n\t"
  97020. "lsr r7, r7, #16\n\t"
  97021. "mul r6, r7, r6\n\t"
  97022. "lsr r7, r6, #16\n\t"
  97023. "lsl r6, r6, #16\n\t"
  97024. "adds r5, r5, r6\n\t"
  97025. "adcs r3, r3, r7\n\t"
  97026. "adc r4, r4, #0\n\t"
  97027. #else
  97028. "umull r6, r7, r8, r12\n\t"
  97029. "adds r5, r5, r6\n\t"
  97030. "adcs r3, r3, r7\n\t"
  97031. "adc r4, r4, #0\n\t"
  97032. #endif
  97033. /* A[4] * B[1] */
  97034. "ldr r8, [%[a], #16]\n\t"
  97035. "ldr r9, [%[b], #4]\n\t"
  97036. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  97037. "lsl r6, r8, #16\n\t"
  97038. "lsl r7, r9, #16\n\t"
  97039. "lsr r6, r6, #16\n\t"
  97040. "lsr r7, r7, #16\n\t"
  97041. "mul r7, r6, r7\n\t"
  97042. "adds r5, r5, r7\n\t"
  97043. "adcs r3, r3, #0\n\t"
  97044. "adc r4, r4, #0\n\t"
  97045. "lsr r7, r9, #16\n\t"
  97046. "mul r6, r7, r6\n\t"
  97047. "lsr r7, r6, #16\n\t"
  97048. "lsl r6, r6, #16\n\t"
  97049. "adds r5, r5, r6\n\t"
  97050. "adcs r3, r3, r7\n\t"
  97051. "adc r4, r4, #0\n\t"
  97052. "lsr r6, r8, #16\n\t"
  97053. "lsr r7, r9, #16\n\t"
  97054. "mul r7, r6, r7\n\t"
  97055. "adds r3, r3, r7\n\t"
  97056. "adc r4, r4, #0\n\t"
  97057. "lsl r7, r9, #16\n\t"
  97058. "lsr r7, r7, #16\n\t"
  97059. "mul r6, r7, r6\n\t"
  97060. "lsr r7, r6, #16\n\t"
  97061. "lsl r6, r6, #16\n\t"
  97062. "adds r5, r5, r6\n\t"
  97063. "adcs r3, r3, r7\n\t"
  97064. "adc r4, r4, #0\n\t"
  97065. #else
  97066. "umull r6, r7, r8, r9\n\t"
  97067. "adds r5, r5, r6\n\t"
  97068. "adcs r3, r3, r7\n\t"
  97069. "adc r4, r4, #0\n\t"
  97070. #endif
  97071. /* A[5] * B[0] */
  97072. "ldr r8, [%[a], #20]\n\t"
  97073. "ldr r9, [%[b]]\n\t"
  97074. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  97075. "lsl r6, r8, #16\n\t"
  97076. "lsl r7, r9, #16\n\t"
  97077. "lsr r6, r6, #16\n\t"
  97078. "lsr r7, r7, #16\n\t"
  97079. "mul r7, r6, r7\n\t"
  97080. "adds r5, r5, r7\n\t"
  97081. "adcs r3, r3, #0\n\t"
  97082. "adc r4, r4, #0\n\t"
  97083. "lsr r7, r9, #16\n\t"
  97084. "mul r6, r7, r6\n\t"
  97085. "lsr r7, r6, #16\n\t"
  97086. "lsl r6, r6, #16\n\t"
  97087. "adds r5, r5, r6\n\t"
  97088. "adcs r3, r3, r7\n\t"
  97089. "adc r4, r4, #0\n\t"
  97090. "lsr r6, r8, #16\n\t"
  97091. "lsr r7, r9, #16\n\t"
  97092. "mul r7, r6, r7\n\t"
  97093. "adds r3, r3, r7\n\t"
  97094. "adc r4, r4, #0\n\t"
  97095. "lsl r7, r9, #16\n\t"
  97096. "lsr r7, r7, #16\n\t"
  97097. "mul r6, r7, r6\n\t"
  97098. "lsr r7, r6, #16\n\t"
  97099. "lsl r6, r6, #16\n\t"
  97100. "adds r5, r5, r6\n\t"
  97101. "adcs r3, r3, r7\n\t"
  97102. "adc r4, r4, #0\n\t"
  97103. #else
  97104. "umull r6, r7, r8, r9\n\t"
  97105. "adds r5, r5, r6\n\t"
  97106. "adcs r3, r3, r7\n\t"
  97107. "adc r4, r4, #0\n\t"
  97108. #endif
  97109. "str r5, [sp, #20]\n\t"
  97110. /* A[6] * B[0] */
  97111. "ldr r8, [%[a], #24]\n\t"
  97112. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  97113. "lsl r6, r8, #16\n\t"
  97114. "lsl r7, r9, #16\n\t"
  97115. "lsr r6, r6, #16\n\t"
  97116. "lsr r7, r7, #16\n\t"
  97117. "mul r7, r6, r7\n\t"
  97118. "adds r3, r3, r7\n\t"
  97119. "adcs r4, r4, #0\n\t"
  97120. "mov r5, #0\n\t"
  97121. "adc r5, r5, #0\n\t"
  97122. "lsr r7, r9, #16\n\t"
  97123. "mul r6, r7, r6\n\t"
  97124. "lsr r7, r6, #16\n\t"
  97125. "lsl r6, r6, #16\n\t"
  97126. "adds r3, r3, r6\n\t"
  97127. "adcs r4, r4, r7\n\t"
  97128. "adc r5, r5, #0\n\t"
  97129. "lsr r6, r8, #16\n\t"
  97130. "lsr r7, r9, #16\n\t"
  97131. "mul r7, r6, r7\n\t"
  97132. "adds r4, r4, r7\n\t"
  97133. "adc r5, r5, #0\n\t"
  97134. "lsl r7, r9, #16\n\t"
  97135. "lsr r7, r7, #16\n\t"
  97136. "mul r6, r7, r6\n\t"
  97137. "lsr r7, r6, #16\n\t"
  97138. "lsl r6, r6, #16\n\t"
  97139. "adds r3, r3, r6\n\t"
  97140. "adcs r4, r4, r7\n\t"
  97141. "adc r5, r5, #0\n\t"
  97142. #else
  97143. "umull r6, r7, r8, r9\n\t"
  97144. "adds r3, r3, r6\n\t"
  97145. "adcs r4, r4, r7\n\t"
  97146. "mov r5, #0\n\t"
  97147. "adc r5, r5, #0\n\t"
  97148. #endif
  97149. /* A[5] * B[1] */
  97150. "ldr r8, [%[a], #20]\n\t"
  97151. "ldr r9, [%[b], #4]\n\t"
  97152. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  97153. "lsl r6, r8, #16\n\t"
  97154. "lsl r7, r9, #16\n\t"
  97155. "lsr r6, r6, #16\n\t"
  97156. "lsr r7, r7, #16\n\t"
  97157. "mul r7, r6, r7\n\t"
  97158. "adds r3, r3, r7\n\t"
  97159. "adcs r4, r4, #0\n\t"
  97160. "adc r5, r5, #0\n\t"
  97161. "lsr r7, r9, #16\n\t"
  97162. "mul r6, r7, r6\n\t"
  97163. "lsr r7, r6, #16\n\t"
  97164. "lsl r6, r6, #16\n\t"
  97165. "adds r3, r3, r6\n\t"
  97166. "adcs r4, r4, r7\n\t"
  97167. "adc r5, r5, #0\n\t"
  97168. "lsr r6, r8, #16\n\t"
  97169. "lsr r7, r9, #16\n\t"
  97170. "mul r7, r6, r7\n\t"
  97171. "adds r4, r4, r7\n\t"
  97172. "adc r5, r5, #0\n\t"
  97173. "lsl r7, r9, #16\n\t"
  97174. "lsr r7, r7, #16\n\t"
  97175. "mul r6, r7, r6\n\t"
  97176. "lsr r7, r6, #16\n\t"
  97177. "lsl r6, r6, #16\n\t"
  97178. "adds r3, r3, r6\n\t"
  97179. "adcs r4, r4, r7\n\t"
  97180. "adc r5, r5, #0\n\t"
  97181. #else
  97182. "umull r6, r7, r8, r9\n\t"
  97183. "adds r3, r3, r6\n\t"
  97184. "adcs r4, r4, r7\n\t"
  97185. "adc r5, r5, #0\n\t"
  97186. #endif
  97187. /* A[4] * B[2] */
  97188. "ldr r8, [%[a], #16]\n\t"
  97189. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  97190. "lsl r6, r8, #16\n\t"
  97191. "lsl r7, r12, #16\n\t"
  97192. "lsr r6, r6, #16\n\t"
  97193. "lsr r7, r7, #16\n\t"
  97194. "mul r7, r6, r7\n\t"
  97195. "adds r3, r3, r7\n\t"
  97196. "adcs r4, r4, #0\n\t"
  97197. "adc r5, r5, #0\n\t"
  97198. "lsr r7, r12, #16\n\t"
  97199. "mul r6, r7, r6\n\t"
  97200. "lsr r7, r6, #16\n\t"
  97201. "lsl r6, r6, #16\n\t"
  97202. "adds r3, r3, r6\n\t"
  97203. "adcs r4, r4, r7\n\t"
  97204. "adc r5, r5, #0\n\t"
  97205. "lsr r6, r8, #16\n\t"
  97206. "lsr r7, r12, #16\n\t"
  97207. "mul r7, r6, r7\n\t"
  97208. "adds r4, r4, r7\n\t"
  97209. "adc r5, r5, #0\n\t"
  97210. "lsl r7, r12, #16\n\t"
  97211. "lsr r7, r7, #16\n\t"
  97212. "mul r6, r7, r6\n\t"
  97213. "lsr r7, r6, #16\n\t"
  97214. "lsl r6, r6, #16\n\t"
  97215. "adds r3, r3, r6\n\t"
  97216. "adcs r4, r4, r7\n\t"
  97217. "adc r5, r5, #0\n\t"
  97218. #else
  97219. "umull r6, r7, r8, r12\n\t"
  97220. "adds r3, r3, r6\n\t"
  97221. "adcs r4, r4, r7\n\t"
  97222. "adc r5, r5, #0\n\t"
  97223. #endif
  97224. /* A[3] * B[3] */
  97225. "ldr r11, [%[a], #12]\n\t"
  97226. "ldr r12, [%[b], #12]\n\t"
  97227. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  97228. "lsl r6, r11, #16\n\t"
  97229. "lsl r7, r12, #16\n\t"
  97230. "lsr r6, r6, #16\n\t"
  97231. "lsr r7, r7, #16\n\t"
  97232. "mul r7, r6, r7\n\t"
  97233. "adds r3, r3, r7\n\t"
  97234. "adcs r4, r4, #0\n\t"
  97235. "adc r5, r5, #0\n\t"
  97236. "lsr r7, r12, #16\n\t"
  97237. "mul r6, r7, r6\n\t"
  97238. "lsr r7, r6, #16\n\t"
  97239. "lsl r6, r6, #16\n\t"
  97240. "adds r3, r3, r6\n\t"
  97241. "adcs r4, r4, r7\n\t"
  97242. "adc r5, r5, #0\n\t"
  97243. "lsr r6, r11, #16\n\t"
  97244. "lsr r7, r12, #16\n\t"
  97245. "mul r7, r6, r7\n\t"
  97246. "adds r4, r4, r7\n\t"
  97247. "adc r5, r5, #0\n\t"
  97248. "lsl r7, r12, #16\n\t"
  97249. "lsr r7, r7, #16\n\t"
  97250. "mul r6, r7, r6\n\t"
  97251. "lsr r7, r6, #16\n\t"
  97252. "lsl r6, r6, #16\n\t"
  97253. "adds r3, r3, r6\n\t"
  97254. "adcs r4, r4, r7\n\t"
  97255. "adc r5, r5, #0\n\t"
  97256. #else
  97257. "umull r6, r7, r11, r12\n\t"
  97258. "adds r3, r3, r6\n\t"
  97259. "adcs r4, r4, r7\n\t"
  97260. "adc r5, r5, #0\n\t"
  97261. #endif
  97262. /* A[2] * B[4] */
  97263. "ldr r8, [%[a], #8]\n\t"
  97264. "ldr r9, [%[b], #16]\n\t"
  97265. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  97266. "lsl r6, r8, #16\n\t"
  97267. "lsl r7, r9, #16\n\t"
  97268. "lsr r6, r6, #16\n\t"
  97269. "lsr r7, r7, #16\n\t"
  97270. "mul r7, r6, r7\n\t"
  97271. "adds r3, r3, r7\n\t"
  97272. "adcs r4, r4, #0\n\t"
  97273. "adc r5, r5, #0\n\t"
  97274. "lsr r7, r9, #16\n\t"
  97275. "mul r6, r7, r6\n\t"
  97276. "lsr r7, r6, #16\n\t"
  97277. "lsl r6, r6, #16\n\t"
  97278. "adds r3, r3, r6\n\t"
  97279. "adcs r4, r4, r7\n\t"
  97280. "adc r5, r5, #0\n\t"
  97281. "lsr r6, r8, #16\n\t"
  97282. "lsr r7, r9, #16\n\t"
  97283. "mul r7, r6, r7\n\t"
  97284. "adds r4, r4, r7\n\t"
  97285. "adc r5, r5, #0\n\t"
  97286. "lsl r7, r9, #16\n\t"
  97287. "lsr r7, r7, #16\n\t"
  97288. "mul r6, r7, r6\n\t"
  97289. "lsr r7, r6, #16\n\t"
  97290. "lsl r6, r6, #16\n\t"
  97291. "adds r3, r3, r6\n\t"
  97292. "adcs r4, r4, r7\n\t"
  97293. "adc r5, r5, #0\n\t"
  97294. #else
  97295. "umull r6, r7, r8, r9\n\t"
  97296. "adds r3, r3, r6\n\t"
  97297. "adcs r4, r4, r7\n\t"
  97298. "adc r5, r5, #0\n\t"
  97299. #endif
  97300. /* A[1] * B[5] */
  97301. "ldr r8, [%[a], #4]\n\t"
  97302. "ldr r9, [%[b], #20]\n\t"
  97303. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  97304. "lsl r6, r8, #16\n\t"
  97305. "lsl r7, r9, #16\n\t"
  97306. "lsr r6, r6, #16\n\t"
  97307. "lsr r7, r7, #16\n\t"
  97308. "mul r7, r6, r7\n\t"
  97309. "adds r3, r3, r7\n\t"
  97310. "adcs r4, r4, #0\n\t"
  97311. "adc r5, r5, #0\n\t"
  97312. "lsr r7, r9, #16\n\t"
  97313. "mul r6, r7, r6\n\t"
  97314. "lsr r7, r6, #16\n\t"
  97315. "lsl r6, r6, #16\n\t"
  97316. "adds r3, r3, r6\n\t"
  97317. "adcs r4, r4, r7\n\t"
  97318. "adc r5, r5, #0\n\t"
  97319. "lsr r6, r8, #16\n\t"
  97320. "lsr r7, r9, #16\n\t"
  97321. "mul r7, r6, r7\n\t"
  97322. "adds r4, r4, r7\n\t"
  97323. "adc r5, r5, #0\n\t"
  97324. "lsl r7, r9, #16\n\t"
  97325. "lsr r7, r7, #16\n\t"
  97326. "mul r6, r7, r6\n\t"
  97327. "lsr r7, r6, #16\n\t"
  97328. "lsl r6, r6, #16\n\t"
  97329. "adds r3, r3, r6\n\t"
  97330. "adcs r4, r4, r7\n\t"
  97331. "adc r5, r5, #0\n\t"
  97332. #else
  97333. "umull r6, r7, r8, r9\n\t"
  97334. "adds r3, r3, r6\n\t"
  97335. "adcs r4, r4, r7\n\t"
  97336. "adc r5, r5, #0\n\t"
  97337. #endif
  97338. /* A[0] * B[6] */
  97339. "ldr r8, [%[a]]\n\t"
  97340. "ldr r9, [%[b], #24]\n\t"
  97341. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  97342. "lsl r6, r8, #16\n\t"
  97343. "lsl r7, r9, #16\n\t"
  97344. "lsr r6, r6, #16\n\t"
  97345. "lsr r7, r7, #16\n\t"
  97346. "mul r7, r6, r7\n\t"
  97347. "adds r3, r3, r7\n\t"
  97348. "adcs r4, r4, #0\n\t"
  97349. "adc r5, r5, #0\n\t"
  97350. "lsr r7, r9, #16\n\t"
  97351. "mul r6, r7, r6\n\t"
  97352. "lsr r7, r6, #16\n\t"
  97353. "lsl r6, r6, #16\n\t"
  97354. "adds r3, r3, r6\n\t"
  97355. "adcs r4, r4, r7\n\t"
  97356. "adc r5, r5, #0\n\t"
  97357. "lsr r6, r8, #16\n\t"
  97358. "lsr r7, r9, #16\n\t"
  97359. "mul r7, r6, r7\n\t"
  97360. "adds r4, r4, r7\n\t"
  97361. "adc r5, r5, #0\n\t"
  97362. "lsl r7, r9, #16\n\t"
  97363. "lsr r7, r7, #16\n\t"
  97364. "mul r6, r7, r6\n\t"
  97365. "lsr r7, r6, #16\n\t"
  97366. "lsl r6, r6, #16\n\t"
  97367. "adds r3, r3, r6\n\t"
  97368. "adcs r4, r4, r7\n\t"
  97369. "adc r5, r5, #0\n\t"
  97370. #else
  97371. "umull r6, r7, r8, r9\n\t"
  97372. "adds r3, r3, r6\n\t"
  97373. "adcs r4, r4, r7\n\t"
  97374. "adc r5, r5, #0\n\t"
  97375. #endif
  97376. "str r3, [sp, #24]\n\t"
  97377. /* A[0] * B[7] */
  97378. "ldr r9, [%[b], #28]\n\t"
  97379. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  97380. "lsl r6, r8, #16\n\t"
  97381. "lsl r7, r9, #16\n\t"
  97382. "lsr r6, r6, #16\n\t"
  97383. "lsr r7, r7, #16\n\t"
  97384. "mul r7, r6, r7\n\t"
  97385. "adds r4, r4, r7\n\t"
  97386. "adcs r5, r5, #0\n\t"
  97387. "mov r3, #0\n\t"
  97388. "adc r3, r3, #0\n\t"
  97389. "lsr r7, r9, #16\n\t"
  97390. "mul r6, r7, r6\n\t"
  97391. "lsr r7, r6, #16\n\t"
  97392. "lsl r6, r6, #16\n\t"
  97393. "adds r4, r4, r6\n\t"
  97394. "adcs r5, r5, r7\n\t"
  97395. "adc r3, r3, #0\n\t"
  97396. "lsr r6, r8, #16\n\t"
  97397. "lsr r7, r9, #16\n\t"
  97398. "mul r7, r6, r7\n\t"
  97399. "adds r5, r5, r7\n\t"
  97400. "adc r3, r3, #0\n\t"
  97401. "lsl r7, r9, #16\n\t"
  97402. "lsr r7, r7, #16\n\t"
  97403. "mul r6, r7, r6\n\t"
  97404. "lsr r7, r6, #16\n\t"
  97405. "lsl r6, r6, #16\n\t"
  97406. "adds r4, r4, r6\n\t"
  97407. "adcs r5, r5, r7\n\t"
  97408. "adc r3, r3, #0\n\t"
  97409. #else
  97410. "umull r6, r7, r8, r9\n\t"
  97411. "adds r4, r4, r6\n\t"
  97412. "adcs r5, r5, r7\n\t"
  97413. "mov r3, #0\n\t"
  97414. "adc r3, r3, #0\n\t"
  97415. #endif
  97416. /* A[1] * B[6] */
  97417. "ldr r8, [%[a], #4]\n\t"
  97418. "ldr r9, [%[b], #24]\n\t"
  97419. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  97420. "lsl r6, r8, #16\n\t"
  97421. "lsl r7, r9, #16\n\t"
  97422. "lsr r6, r6, #16\n\t"
  97423. "lsr r7, r7, #16\n\t"
  97424. "mul r7, r6, r7\n\t"
  97425. "adds r4, r4, r7\n\t"
  97426. "adcs r5, r5, #0\n\t"
  97427. "adc r3, r3, #0\n\t"
  97428. "lsr r7, r9, #16\n\t"
  97429. "mul r6, r7, r6\n\t"
  97430. "lsr r7, r6, #16\n\t"
  97431. "lsl r6, r6, #16\n\t"
  97432. "adds r4, r4, r6\n\t"
  97433. "adcs r5, r5, r7\n\t"
  97434. "adc r3, r3, #0\n\t"
  97435. "lsr r6, r8, #16\n\t"
  97436. "lsr r7, r9, #16\n\t"
  97437. "mul r7, r6, r7\n\t"
  97438. "adds r5, r5, r7\n\t"
  97439. "adc r3, r3, #0\n\t"
  97440. "lsl r7, r9, #16\n\t"
  97441. "lsr r7, r7, #16\n\t"
  97442. "mul r6, r7, r6\n\t"
  97443. "lsr r7, r6, #16\n\t"
  97444. "lsl r6, r6, #16\n\t"
  97445. "adds r4, r4, r6\n\t"
  97446. "adcs r5, r5, r7\n\t"
  97447. "adc r3, r3, #0\n\t"
  97448. #else
  97449. "umull r6, r7, r8, r9\n\t"
  97450. "adds r4, r4, r6\n\t"
  97451. "adcs r5, r5, r7\n\t"
  97452. "adc r3, r3, #0\n\t"
  97453. #endif
  97454. /* A[2] * B[5] */
  97455. "ldr r8, [%[a], #8]\n\t"
  97456. "ldr r9, [%[b], #20]\n\t"
  97457. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  97458. "lsl r6, r8, #16\n\t"
  97459. "lsl r7, r9, #16\n\t"
  97460. "lsr r6, r6, #16\n\t"
  97461. "lsr r7, r7, #16\n\t"
  97462. "mul r7, r6, r7\n\t"
  97463. "adds r4, r4, r7\n\t"
  97464. "adcs r5, r5, #0\n\t"
  97465. "adc r3, r3, #0\n\t"
  97466. "lsr r7, r9, #16\n\t"
  97467. "mul r6, r7, r6\n\t"
  97468. "lsr r7, r6, #16\n\t"
  97469. "lsl r6, r6, #16\n\t"
  97470. "adds r4, r4, r6\n\t"
  97471. "adcs r5, r5, r7\n\t"
  97472. "adc r3, r3, #0\n\t"
  97473. "lsr r6, r8, #16\n\t"
  97474. "lsr r7, r9, #16\n\t"
  97475. "mul r7, r6, r7\n\t"
  97476. "adds r5, r5, r7\n\t"
  97477. "adc r3, r3, #0\n\t"
  97478. "lsl r7, r9, #16\n\t"
  97479. "lsr r7, r7, #16\n\t"
  97480. "mul r6, r7, r6\n\t"
  97481. "lsr r7, r6, #16\n\t"
  97482. "lsl r6, r6, #16\n\t"
  97483. "adds r4, r4, r6\n\t"
  97484. "adcs r5, r5, r7\n\t"
  97485. "adc r3, r3, #0\n\t"
  97486. #else
  97487. "umull r6, r7, r8, r9\n\t"
  97488. "adds r4, r4, r6\n\t"
  97489. "adcs r5, r5, r7\n\t"
  97490. "adc r3, r3, #0\n\t"
  97491. #endif
  97492. /* A[3] * B[4] */
  97493. "ldr r9, [%[b], #16]\n\t"
  97494. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  97495. "lsl r6, r11, #16\n\t"
  97496. "lsl r7, r9, #16\n\t"
  97497. "lsr r6, r6, #16\n\t"
  97498. "lsr r7, r7, #16\n\t"
  97499. "mul r7, r6, r7\n\t"
  97500. "adds r4, r4, r7\n\t"
  97501. "adcs r5, r5, #0\n\t"
  97502. "adc r3, r3, #0\n\t"
  97503. "lsr r7, r9, #16\n\t"
  97504. "mul r6, r7, r6\n\t"
  97505. "lsr r7, r6, #16\n\t"
  97506. "lsl r6, r6, #16\n\t"
  97507. "adds r4, r4, r6\n\t"
  97508. "adcs r5, r5, r7\n\t"
  97509. "adc r3, r3, #0\n\t"
  97510. "lsr r6, r11, #16\n\t"
  97511. "lsr r7, r9, #16\n\t"
  97512. "mul r7, r6, r7\n\t"
  97513. "adds r5, r5, r7\n\t"
  97514. "adc r3, r3, #0\n\t"
  97515. "lsl r7, r9, #16\n\t"
  97516. "lsr r7, r7, #16\n\t"
  97517. "mul r6, r7, r6\n\t"
  97518. "lsr r7, r6, #16\n\t"
  97519. "lsl r6, r6, #16\n\t"
  97520. "adds r4, r4, r6\n\t"
  97521. "adcs r5, r5, r7\n\t"
  97522. "adc r3, r3, #0\n\t"
  97523. #else
  97524. "umull r6, r7, r11, r9\n\t"
  97525. "adds r4, r4, r6\n\t"
  97526. "adcs r5, r5, r7\n\t"
  97527. "adc r3, r3, #0\n\t"
  97528. #endif
  97529. /* A[4] * B[3] */
  97530. "ldr r8, [%[a], #16]\n\t"
  97531. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  97532. "lsl r6, r8, #16\n\t"
  97533. "lsl r7, r12, #16\n\t"
  97534. "lsr r6, r6, #16\n\t"
  97535. "lsr r7, r7, #16\n\t"
  97536. "mul r7, r6, r7\n\t"
  97537. "adds r4, r4, r7\n\t"
  97538. "adcs r5, r5, #0\n\t"
  97539. "adc r3, r3, #0\n\t"
  97540. "lsr r7, r12, #16\n\t"
  97541. "mul r6, r7, r6\n\t"
  97542. "lsr r7, r6, #16\n\t"
  97543. "lsl r6, r6, #16\n\t"
  97544. "adds r4, r4, r6\n\t"
  97545. "adcs r5, r5, r7\n\t"
  97546. "adc r3, r3, #0\n\t"
  97547. "lsr r6, r8, #16\n\t"
  97548. "lsr r7, r12, #16\n\t"
  97549. "mul r7, r6, r7\n\t"
  97550. "adds r5, r5, r7\n\t"
  97551. "adc r3, r3, #0\n\t"
  97552. "lsl r7, r12, #16\n\t"
  97553. "lsr r7, r7, #16\n\t"
  97554. "mul r6, r7, r6\n\t"
  97555. "lsr r7, r6, #16\n\t"
  97556. "lsl r6, r6, #16\n\t"
  97557. "adds r4, r4, r6\n\t"
  97558. "adcs r5, r5, r7\n\t"
  97559. "adc r3, r3, #0\n\t"
  97560. #else
  97561. "umull r6, r7, r8, r12\n\t"
  97562. "adds r4, r4, r6\n\t"
  97563. "adcs r5, r5, r7\n\t"
  97564. "adc r3, r3, #0\n\t"
  97565. #endif
  97566. /* A[5] * B[2] */
  97567. "ldr r8, [%[a], #20]\n\t"
  97568. "ldr r9, [%[b], #8]\n\t"
  97569. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  97570. "lsl r6, r8, #16\n\t"
  97571. "lsl r7, r9, #16\n\t"
  97572. "lsr r6, r6, #16\n\t"
  97573. "lsr r7, r7, #16\n\t"
  97574. "mul r7, r6, r7\n\t"
  97575. "adds r4, r4, r7\n\t"
  97576. "adcs r5, r5, #0\n\t"
  97577. "adc r3, r3, #0\n\t"
  97578. "lsr r7, r9, #16\n\t"
  97579. "mul r6, r7, r6\n\t"
  97580. "lsr r7, r6, #16\n\t"
  97581. "lsl r6, r6, #16\n\t"
  97582. "adds r4, r4, r6\n\t"
  97583. "adcs r5, r5, r7\n\t"
  97584. "adc r3, r3, #0\n\t"
  97585. "lsr r6, r8, #16\n\t"
  97586. "lsr r7, r9, #16\n\t"
  97587. "mul r7, r6, r7\n\t"
  97588. "adds r5, r5, r7\n\t"
  97589. "adc r3, r3, #0\n\t"
  97590. "lsl r7, r9, #16\n\t"
  97591. "lsr r7, r7, #16\n\t"
  97592. "mul r6, r7, r6\n\t"
  97593. "lsr r7, r6, #16\n\t"
  97594. "lsl r6, r6, #16\n\t"
  97595. "adds r4, r4, r6\n\t"
  97596. "adcs r5, r5, r7\n\t"
  97597. "adc r3, r3, #0\n\t"
  97598. #else
  97599. "umull r6, r7, r8, r9\n\t"
  97600. "adds r4, r4, r6\n\t"
  97601. "adcs r5, r5, r7\n\t"
  97602. "adc r3, r3, #0\n\t"
  97603. #endif
  97604. /* A[6] * B[1] */
  97605. "ldr r8, [%[a], #24]\n\t"
  97606. "ldr r9, [%[b], #4]\n\t"
  97607. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  97608. "lsl r6, r8, #16\n\t"
  97609. "lsl r7, r9, #16\n\t"
  97610. "lsr r6, r6, #16\n\t"
  97611. "lsr r7, r7, #16\n\t"
  97612. "mul r7, r6, r7\n\t"
  97613. "adds r4, r4, r7\n\t"
  97614. "adcs r5, r5, #0\n\t"
  97615. "adc r3, r3, #0\n\t"
  97616. "lsr r7, r9, #16\n\t"
  97617. "mul r6, r7, r6\n\t"
  97618. "lsr r7, r6, #16\n\t"
  97619. "lsl r6, r6, #16\n\t"
  97620. "adds r4, r4, r6\n\t"
  97621. "adcs r5, r5, r7\n\t"
  97622. "adc r3, r3, #0\n\t"
  97623. "lsr r6, r8, #16\n\t"
  97624. "lsr r7, r9, #16\n\t"
  97625. "mul r7, r6, r7\n\t"
  97626. "adds r5, r5, r7\n\t"
  97627. "adc r3, r3, #0\n\t"
  97628. "lsl r7, r9, #16\n\t"
  97629. "lsr r7, r7, #16\n\t"
  97630. "mul r6, r7, r6\n\t"
  97631. "lsr r7, r6, #16\n\t"
  97632. "lsl r6, r6, #16\n\t"
  97633. "adds r4, r4, r6\n\t"
  97634. "adcs r5, r5, r7\n\t"
  97635. "adc r3, r3, #0\n\t"
  97636. #else
  97637. "umull r6, r7, r8, r9\n\t"
  97638. "adds r4, r4, r6\n\t"
  97639. "adcs r5, r5, r7\n\t"
  97640. "adc r3, r3, #0\n\t"
  97641. #endif
  97642. /* A[7] * B[0] */
  97643. "ldr r8, [%[a], #28]\n\t"
  97644. "ldr r9, [%[b]]\n\t"
  97645. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  97646. "lsl r6, r8, #16\n\t"
  97647. "lsl r7, r9, #16\n\t"
  97648. "lsr r6, r6, #16\n\t"
  97649. "lsr r7, r7, #16\n\t"
  97650. "mul r7, r6, r7\n\t"
  97651. "adds r4, r4, r7\n\t"
  97652. "adcs r5, r5, #0\n\t"
  97653. "adc r3, r3, #0\n\t"
  97654. "lsr r7, r9, #16\n\t"
  97655. "mul r6, r7, r6\n\t"
  97656. "lsr r7, r6, #16\n\t"
  97657. "lsl r6, r6, #16\n\t"
  97658. "adds r4, r4, r6\n\t"
  97659. "adcs r5, r5, r7\n\t"
  97660. "adc r3, r3, #0\n\t"
  97661. "lsr r6, r8, #16\n\t"
  97662. "lsr r7, r9, #16\n\t"
  97663. "mul r7, r6, r7\n\t"
  97664. "adds r5, r5, r7\n\t"
  97665. "adc r3, r3, #0\n\t"
  97666. "lsl r7, r9, #16\n\t"
  97667. "lsr r7, r7, #16\n\t"
  97668. "mul r6, r7, r6\n\t"
  97669. "lsr r7, r6, #16\n\t"
  97670. "lsl r6, r6, #16\n\t"
  97671. "adds r4, r4, r6\n\t"
  97672. "adcs r5, r5, r7\n\t"
  97673. "adc r3, r3, #0\n\t"
  97674. #else
  97675. "umull r6, r7, r8, r9\n\t"
  97676. "adds r4, r4, r6\n\t"
  97677. "adcs r5, r5, r7\n\t"
  97678. "adc r3, r3, #0\n\t"
  97679. #endif
  97680. "str r4, [sp, #28]\n\t"
  97681. /* A[8] * B[0] */
  97682. "ldr r8, [%[a], #32]\n\t"
  97683. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  97684. "lsl r6, r8, #16\n\t"
  97685. "lsl r7, r9, #16\n\t"
  97686. "lsr r6, r6, #16\n\t"
  97687. "lsr r7, r7, #16\n\t"
  97688. "mul r7, r6, r7\n\t"
  97689. "adds r5, r5, r7\n\t"
  97690. "adcs r3, r3, #0\n\t"
  97691. "mov r4, #0\n\t"
  97692. "adc r4, r4, #0\n\t"
  97693. "lsr r7, r9, #16\n\t"
  97694. "mul r6, r7, r6\n\t"
  97695. "lsr r7, r6, #16\n\t"
  97696. "lsl r6, r6, #16\n\t"
  97697. "adds r5, r5, r6\n\t"
  97698. "adcs r3, r3, r7\n\t"
  97699. "adc r4, r4, #0\n\t"
  97700. "lsr r6, r8, #16\n\t"
  97701. "lsr r7, r9, #16\n\t"
  97702. "mul r7, r6, r7\n\t"
  97703. "adds r3, r3, r7\n\t"
  97704. "adc r4, r4, #0\n\t"
  97705. "lsl r7, r9, #16\n\t"
  97706. "lsr r7, r7, #16\n\t"
  97707. "mul r6, r7, r6\n\t"
  97708. "lsr r7, r6, #16\n\t"
  97709. "lsl r6, r6, #16\n\t"
  97710. "adds r5, r5, r6\n\t"
  97711. "adcs r3, r3, r7\n\t"
  97712. "adc r4, r4, #0\n\t"
  97713. #else
  97714. "umull r6, r7, r8, r9\n\t"
  97715. "adds r5, r5, r6\n\t"
  97716. "adcs r3, r3, r7\n\t"
  97717. "mov r4, #0\n\t"
  97718. "adc r4, r4, #0\n\t"
  97719. #endif
  97720. /* A[7] * B[1] */
  97721. "ldr r8, [%[a], #28]\n\t"
  97722. "ldr r9, [%[b], #4]\n\t"
  97723. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  97724. "lsl r6, r8, #16\n\t"
  97725. "lsl r7, r9, #16\n\t"
  97726. "lsr r6, r6, #16\n\t"
  97727. "lsr r7, r7, #16\n\t"
  97728. "mul r7, r6, r7\n\t"
  97729. "adds r5, r5, r7\n\t"
  97730. "adcs r3, r3, #0\n\t"
  97731. "adc r4, r4, #0\n\t"
  97732. "lsr r7, r9, #16\n\t"
  97733. "mul r6, r7, r6\n\t"
  97734. "lsr r7, r6, #16\n\t"
  97735. "lsl r6, r6, #16\n\t"
  97736. "adds r5, r5, r6\n\t"
  97737. "adcs r3, r3, r7\n\t"
  97738. "adc r4, r4, #0\n\t"
  97739. "lsr r6, r8, #16\n\t"
  97740. "lsr r7, r9, #16\n\t"
  97741. "mul r7, r6, r7\n\t"
  97742. "adds r3, r3, r7\n\t"
  97743. "adc r4, r4, #0\n\t"
  97744. "lsl r7, r9, #16\n\t"
  97745. "lsr r7, r7, #16\n\t"
  97746. "mul r6, r7, r6\n\t"
  97747. "lsr r7, r6, #16\n\t"
  97748. "lsl r6, r6, #16\n\t"
  97749. "adds r5, r5, r6\n\t"
  97750. "adcs r3, r3, r7\n\t"
  97751. "adc r4, r4, #0\n\t"
  97752. #else
  97753. "umull r6, r7, r8, r9\n\t"
  97754. "adds r5, r5, r6\n\t"
  97755. "adcs r3, r3, r7\n\t"
  97756. "adc r4, r4, #0\n\t"
  97757. #endif
  97758. /* A[6] * B[2] */
  97759. "ldr r8, [%[a], #24]\n\t"
  97760. "ldr r9, [%[b], #8]\n\t"
  97761. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  97762. "lsl r6, r8, #16\n\t"
  97763. "lsl r7, r9, #16\n\t"
  97764. "lsr r6, r6, #16\n\t"
  97765. "lsr r7, r7, #16\n\t"
  97766. "mul r7, r6, r7\n\t"
  97767. "adds r5, r5, r7\n\t"
  97768. "adcs r3, r3, #0\n\t"
  97769. "adc r4, r4, #0\n\t"
  97770. "lsr r7, r9, #16\n\t"
  97771. "mul r6, r7, r6\n\t"
  97772. "lsr r7, r6, #16\n\t"
  97773. "lsl r6, r6, #16\n\t"
  97774. "adds r5, r5, r6\n\t"
  97775. "adcs r3, r3, r7\n\t"
  97776. "adc r4, r4, #0\n\t"
  97777. "lsr r6, r8, #16\n\t"
  97778. "lsr r7, r9, #16\n\t"
  97779. "mul r7, r6, r7\n\t"
  97780. "adds r3, r3, r7\n\t"
  97781. "adc r4, r4, #0\n\t"
  97782. "lsl r7, r9, #16\n\t"
  97783. "lsr r7, r7, #16\n\t"
  97784. "mul r6, r7, r6\n\t"
  97785. "lsr r7, r6, #16\n\t"
  97786. "lsl r6, r6, #16\n\t"
  97787. "adds r5, r5, r6\n\t"
  97788. "adcs r3, r3, r7\n\t"
  97789. "adc r4, r4, #0\n\t"
  97790. #else
  97791. "umull r6, r7, r8, r9\n\t"
  97792. "adds r5, r5, r6\n\t"
  97793. "adcs r3, r3, r7\n\t"
  97794. "adc r4, r4, #0\n\t"
  97795. #endif
  97796. /* A[5] * B[3] */
  97797. "ldr r8, [%[a], #20]\n\t"
  97798. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  97799. "lsl r6, r8, #16\n\t"
  97800. "lsl r7, r12, #16\n\t"
  97801. "lsr r6, r6, #16\n\t"
  97802. "lsr r7, r7, #16\n\t"
  97803. "mul r7, r6, r7\n\t"
  97804. "adds r5, r5, r7\n\t"
  97805. "adcs r3, r3, #0\n\t"
  97806. "adc r4, r4, #0\n\t"
  97807. "lsr r7, r12, #16\n\t"
  97808. "mul r6, r7, r6\n\t"
  97809. "lsr r7, r6, #16\n\t"
  97810. "lsl r6, r6, #16\n\t"
  97811. "adds r5, r5, r6\n\t"
  97812. "adcs r3, r3, r7\n\t"
  97813. "adc r4, r4, #0\n\t"
  97814. "lsr r6, r8, #16\n\t"
  97815. "lsr r7, r12, #16\n\t"
  97816. "mul r7, r6, r7\n\t"
  97817. "adds r3, r3, r7\n\t"
  97818. "adc r4, r4, #0\n\t"
  97819. "lsl r7, r12, #16\n\t"
  97820. "lsr r7, r7, #16\n\t"
  97821. "mul r6, r7, r6\n\t"
  97822. "lsr r7, r6, #16\n\t"
  97823. "lsl r6, r6, #16\n\t"
  97824. "adds r5, r5, r6\n\t"
  97825. "adcs r3, r3, r7\n\t"
  97826. "adc r4, r4, #0\n\t"
  97827. #else
  97828. "umull r6, r7, r8, r12\n\t"
  97829. "adds r5, r5, r6\n\t"
  97830. "adcs r3, r3, r7\n\t"
  97831. "adc r4, r4, #0\n\t"
  97832. #endif
  97833. /* A[4] * B[4] */
  97834. "ldr r11, [%[a], #16]\n\t"
  97835. "ldr r12, [%[b], #16]\n\t"
  97836. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  97837. "lsl r6, r11, #16\n\t"
  97838. "lsl r7, r12, #16\n\t"
  97839. "lsr r6, r6, #16\n\t"
  97840. "lsr r7, r7, #16\n\t"
  97841. "mul r7, r6, r7\n\t"
  97842. "adds r5, r5, r7\n\t"
  97843. "adcs r3, r3, #0\n\t"
  97844. "adc r4, r4, #0\n\t"
  97845. "lsr r7, r12, #16\n\t"
  97846. "mul r6, r7, r6\n\t"
  97847. "lsr r7, r6, #16\n\t"
  97848. "lsl r6, r6, #16\n\t"
  97849. "adds r5, r5, r6\n\t"
  97850. "adcs r3, r3, r7\n\t"
  97851. "adc r4, r4, #0\n\t"
  97852. "lsr r6, r11, #16\n\t"
  97853. "lsr r7, r12, #16\n\t"
  97854. "mul r7, r6, r7\n\t"
  97855. "adds r3, r3, r7\n\t"
  97856. "adc r4, r4, #0\n\t"
  97857. "lsl r7, r12, #16\n\t"
  97858. "lsr r7, r7, #16\n\t"
  97859. "mul r6, r7, r6\n\t"
  97860. "lsr r7, r6, #16\n\t"
  97861. "lsl r6, r6, #16\n\t"
  97862. "adds r5, r5, r6\n\t"
  97863. "adcs r3, r3, r7\n\t"
  97864. "adc r4, r4, #0\n\t"
  97865. #else
  97866. "umull r6, r7, r11, r12\n\t"
  97867. "adds r5, r5, r6\n\t"
  97868. "adcs r3, r3, r7\n\t"
  97869. "adc r4, r4, #0\n\t"
  97870. #endif
  97871. /* A[3] * B[5] */
  97872. "ldr r8, [%[a], #12]\n\t"
  97873. "ldr r9, [%[b], #20]\n\t"
  97874. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  97875. "lsl r6, r8, #16\n\t"
  97876. "lsl r7, r9, #16\n\t"
  97877. "lsr r6, r6, #16\n\t"
  97878. "lsr r7, r7, #16\n\t"
  97879. "mul r7, r6, r7\n\t"
  97880. "adds r5, r5, r7\n\t"
  97881. "adcs r3, r3, #0\n\t"
  97882. "adc r4, r4, #0\n\t"
  97883. "lsr r7, r9, #16\n\t"
  97884. "mul r6, r7, r6\n\t"
  97885. "lsr r7, r6, #16\n\t"
  97886. "lsl r6, r6, #16\n\t"
  97887. "adds r5, r5, r6\n\t"
  97888. "adcs r3, r3, r7\n\t"
  97889. "adc r4, r4, #0\n\t"
  97890. "lsr r6, r8, #16\n\t"
  97891. "lsr r7, r9, #16\n\t"
  97892. "mul r7, r6, r7\n\t"
  97893. "adds r3, r3, r7\n\t"
  97894. "adc r4, r4, #0\n\t"
  97895. "lsl r7, r9, #16\n\t"
  97896. "lsr r7, r7, #16\n\t"
  97897. "mul r6, r7, r6\n\t"
  97898. "lsr r7, r6, #16\n\t"
  97899. "lsl r6, r6, #16\n\t"
  97900. "adds r5, r5, r6\n\t"
  97901. "adcs r3, r3, r7\n\t"
  97902. "adc r4, r4, #0\n\t"
  97903. #else
  97904. "umull r6, r7, r8, r9\n\t"
  97905. "adds r5, r5, r6\n\t"
  97906. "adcs r3, r3, r7\n\t"
  97907. "adc r4, r4, #0\n\t"
  97908. #endif
  97909. /* A[2] * B[6] */
  97910. "ldr r8, [%[a], #8]\n\t"
  97911. "ldr r9, [%[b], #24]\n\t"
  97912. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  97913. "lsl r6, r8, #16\n\t"
  97914. "lsl r7, r9, #16\n\t"
  97915. "lsr r6, r6, #16\n\t"
  97916. "lsr r7, r7, #16\n\t"
  97917. "mul r7, r6, r7\n\t"
  97918. "adds r5, r5, r7\n\t"
  97919. "adcs r3, r3, #0\n\t"
  97920. "adc r4, r4, #0\n\t"
  97921. "lsr r7, r9, #16\n\t"
  97922. "mul r6, r7, r6\n\t"
  97923. "lsr r7, r6, #16\n\t"
  97924. "lsl r6, r6, #16\n\t"
  97925. "adds r5, r5, r6\n\t"
  97926. "adcs r3, r3, r7\n\t"
  97927. "adc r4, r4, #0\n\t"
  97928. "lsr r6, r8, #16\n\t"
  97929. "lsr r7, r9, #16\n\t"
  97930. "mul r7, r6, r7\n\t"
  97931. "adds r3, r3, r7\n\t"
  97932. "adc r4, r4, #0\n\t"
  97933. "lsl r7, r9, #16\n\t"
  97934. "lsr r7, r7, #16\n\t"
  97935. "mul r6, r7, r6\n\t"
  97936. "lsr r7, r6, #16\n\t"
  97937. "lsl r6, r6, #16\n\t"
  97938. "adds r5, r5, r6\n\t"
  97939. "adcs r3, r3, r7\n\t"
  97940. "adc r4, r4, #0\n\t"
  97941. #else
  97942. "umull r6, r7, r8, r9\n\t"
  97943. "adds r5, r5, r6\n\t"
  97944. "adcs r3, r3, r7\n\t"
  97945. "adc r4, r4, #0\n\t"
  97946. #endif
  97947. /* A[1] * B[7] */
  97948. "ldr r8, [%[a], #4]\n\t"
  97949. "ldr r9, [%[b], #28]\n\t"
  97950. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  97951. "lsl r6, r8, #16\n\t"
  97952. "lsl r7, r9, #16\n\t"
  97953. "lsr r6, r6, #16\n\t"
  97954. "lsr r7, r7, #16\n\t"
  97955. "mul r7, r6, r7\n\t"
  97956. "adds r5, r5, r7\n\t"
  97957. "adcs r3, r3, #0\n\t"
  97958. "adc r4, r4, #0\n\t"
  97959. "lsr r7, r9, #16\n\t"
  97960. "mul r6, r7, r6\n\t"
  97961. "lsr r7, r6, #16\n\t"
  97962. "lsl r6, r6, #16\n\t"
  97963. "adds r5, r5, r6\n\t"
  97964. "adcs r3, r3, r7\n\t"
  97965. "adc r4, r4, #0\n\t"
  97966. "lsr r6, r8, #16\n\t"
  97967. "lsr r7, r9, #16\n\t"
  97968. "mul r7, r6, r7\n\t"
  97969. "adds r3, r3, r7\n\t"
  97970. "adc r4, r4, #0\n\t"
  97971. "lsl r7, r9, #16\n\t"
  97972. "lsr r7, r7, #16\n\t"
  97973. "mul r6, r7, r6\n\t"
  97974. "lsr r7, r6, #16\n\t"
  97975. "lsl r6, r6, #16\n\t"
  97976. "adds r5, r5, r6\n\t"
  97977. "adcs r3, r3, r7\n\t"
  97978. "adc r4, r4, #0\n\t"
  97979. #else
  97980. "umull r6, r7, r8, r9\n\t"
  97981. "adds r5, r5, r6\n\t"
  97982. "adcs r3, r3, r7\n\t"
  97983. "adc r4, r4, #0\n\t"
  97984. #endif
  97985. /* A[0] * B[8] */
  97986. "ldr r8, [%[a]]\n\t"
  97987. "ldr r9, [%[b], #32]\n\t"
  97988. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  97989. "lsl r6, r8, #16\n\t"
  97990. "lsl r7, r9, #16\n\t"
  97991. "lsr r6, r6, #16\n\t"
  97992. "lsr r7, r7, #16\n\t"
  97993. "mul r7, r6, r7\n\t"
  97994. "adds r5, r5, r7\n\t"
  97995. "adcs r3, r3, #0\n\t"
  97996. "adc r4, r4, #0\n\t"
  97997. "lsr r7, r9, #16\n\t"
  97998. "mul r6, r7, r6\n\t"
  97999. "lsr r7, r6, #16\n\t"
  98000. "lsl r6, r6, #16\n\t"
  98001. "adds r5, r5, r6\n\t"
  98002. "adcs r3, r3, r7\n\t"
  98003. "adc r4, r4, #0\n\t"
  98004. "lsr r6, r8, #16\n\t"
  98005. "lsr r7, r9, #16\n\t"
  98006. "mul r7, r6, r7\n\t"
  98007. "adds r3, r3, r7\n\t"
  98008. "adc r4, r4, #0\n\t"
  98009. "lsl r7, r9, #16\n\t"
  98010. "lsr r7, r7, #16\n\t"
  98011. "mul r6, r7, r6\n\t"
  98012. "lsr r7, r6, #16\n\t"
  98013. "lsl r6, r6, #16\n\t"
  98014. "adds r5, r5, r6\n\t"
  98015. "adcs r3, r3, r7\n\t"
  98016. "adc r4, r4, #0\n\t"
  98017. #else
  98018. "umull r6, r7, r8, r9\n\t"
  98019. "adds r5, r5, r6\n\t"
  98020. "adcs r3, r3, r7\n\t"
  98021. "adc r4, r4, #0\n\t"
  98022. #endif
  98023. "str r5, [sp, #32]\n\t"
  98024. /* A[0] * B[9] */
  98025. "ldr r9, [%[b], #36]\n\t"
  98026. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  98027. "lsl r6, r8, #16\n\t"
  98028. "lsl r7, r9, #16\n\t"
  98029. "lsr r6, r6, #16\n\t"
  98030. "lsr r7, r7, #16\n\t"
  98031. "mul r7, r6, r7\n\t"
  98032. "adds r3, r3, r7\n\t"
  98033. "adcs r4, r4, #0\n\t"
  98034. "mov r5, #0\n\t"
  98035. "adc r5, r5, #0\n\t"
  98036. "lsr r7, r9, #16\n\t"
  98037. "mul r6, r7, r6\n\t"
  98038. "lsr r7, r6, #16\n\t"
  98039. "lsl r6, r6, #16\n\t"
  98040. "adds r3, r3, r6\n\t"
  98041. "adcs r4, r4, r7\n\t"
  98042. "adc r5, r5, #0\n\t"
  98043. "lsr r6, r8, #16\n\t"
  98044. "lsr r7, r9, #16\n\t"
  98045. "mul r7, r6, r7\n\t"
  98046. "adds r4, r4, r7\n\t"
  98047. "adc r5, r5, #0\n\t"
  98048. "lsl r7, r9, #16\n\t"
  98049. "lsr r7, r7, #16\n\t"
  98050. "mul r6, r7, r6\n\t"
  98051. "lsr r7, r6, #16\n\t"
  98052. "lsl r6, r6, #16\n\t"
  98053. "adds r3, r3, r6\n\t"
  98054. "adcs r4, r4, r7\n\t"
  98055. "adc r5, r5, #0\n\t"
  98056. #else
  98057. "umull r6, r7, r8, r9\n\t"
  98058. "adds r3, r3, r6\n\t"
  98059. "adcs r4, r4, r7\n\t"
  98060. "mov r5, #0\n\t"
  98061. "adc r5, r5, #0\n\t"
  98062. #endif
  98063. /* A[1] * B[8] */
  98064. "ldr r8, [%[a], #4]\n\t"
  98065. "ldr r9, [%[b], #32]\n\t"
  98066. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  98067. "lsl r6, r8, #16\n\t"
  98068. "lsl r7, r9, #16\n\t"
  98069. "lsr r6, r6, #16\n\t"
  98070. "lsr r7, r7, #16\n\t"
  98071. "mul r7, r6, r7\n\t"
  98072. "adds r3, r3, r7\n\t"
  98073. "adcs r4, r4, #0\n\t"
  98074. "adc r5, r5, #0\n\t"
  98075. "lsr r7, r9, #16\n\t"
  98076. "mul r6, r7, r6\n\t"
  98077. "lsr r7, r6, #16\n\t"
  98078. "lsl r6, r6, #16\n\t"
  98079. "adds r3, r3, r6\n\t"
  98080. "adcs r4, r4, r7\n\t"
  98081. "adc r5, r5, #0\n\t"
  98082. "lsr r6, r8, #16\n\t"
  98083. "lsr r7, r9, #16\n\t"
  98084. "mul r7, r6, r7\n\t"
  98085. "adds r4, r4, r7\n\t"
  98086. "adc r5, r5, #0\n\t"
  98087. "lsl r7, r9, #16\n\t"
  98088. "lsr r7, r7, #16\n\t"
  98089. "mul r6, r7, r6\n\t"
  98090. "lsr r7, r6, #16\n\t"
  98091. "lsl r6, r6, #16\n\t"
  98092. "adds r3, r3, r6\n\t"
  98093. "adcs r4, r4, r7\n\t"
  98094. "adc r5, r5, #0\n\t"
  98095. #else
  98096. "umull r6, r7, r8, r9\n\t"
  98097. "adds r3, r3, r6\n\t"
  98098. "adcs r4, r4, r7\n\t"
  98099. "adc r5, r5, #0\n\t"
  98100. #endif
  98101. /* A[2] * B[7] */
  98102. "ldr r8, [%[a], #8]\n\t"
  98103. "ldr r9, [%[b], #28]\n\t"
  98104. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  98105. "lsl r6, r8, #16\n\t"
  98106. "lsl r7, r9, #16\n\t"
  98107. "lsr r6, r6, #16\n\t"
  98108. "lsr r7, r7, #16\n\t"
  98109. "mul r7, r6, r7\n\t"
  98110. "adds r3, r3, r7\n\t"
  98111. "adcs r4, r4, #0\n\t"
  98112. "adc r5, r5, #0\n\t"
  98113. "lsr r7, r9, #16\n\t"
  98114. "mul r6, r7, r6\n\t"
  98115. "lsr r7, r6, #16\n\t"
  98116. "lsl r6, r6, #16\n\t"
  98117. "adds r3, r3, r6\n\t"
  98118. "adcs r4, r4, r7\n\t"
  98119. "adc r5, r5, #0\n\t"
  98120. "lsr r6, r8, #16\n\t"
  98121. "lsr r7, r9, #16\n\t"
  98122. "mul r7, r6, r7\n\t"
  98123. "adds r4, r4, r7\n\t"
  98124. "adc r5, r5, #0\n\t"
  98125. "lsl r7, r9, #16\n\t"
  98126. "lsr r7, r7, #16\n\t"
  98127. "mul r6, r7, r6\n\t"
  98128. "lsr r7, r6, #16\n\t"
  98129. "lsl r6, r6, #16\n\t"
  98130. "adds r3, r3, r6\n\t"
  98131. "adcs r4, r4, r7\n\t"
  98132. "adc r5, r5, #0\n\t"
  98133. #else
  98134. "umull r6, r7, r8, r9\n\t"
  98135. "adds r3, r3, r6\n\t"
  98136. "adcs r4, r4, r7\n\t"
  98137. "adc r5, r5, #0\n\t"
  98138. #endif
  98139. /* A[3] * B[6] */
  98140. "ldr r8, [%[a], #12]\n\t"
  98141. "ldr r9, [%[b], #24]\n\t"
  98142. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  98143. "lsl r6, r8, #16\n\t"
  98144. "lsl r7, r9, #16\n\t"
  98145. "lsr r6, r6, #16\n\t"
  98146. "lsr r7, r7, #16\n\t"
  98147. "mul r7, r6, r7\n\t"
  98148. "adds r3, r3, r7\n\t"
  98149. "adcs r4, r4, #0\n\t"
  98150. "adc r5, r5, #0\n\t"
  98151. "lsr r7, r9, #16\n\t"
  98152. "mul r6, r7, r6\n\t"
  98153. "lsr r7, r6, #16\n\t"
  98154. "lsl r6, r6, #16\n\t"
  98155. "adds r3, r3, r6\n\t"
  98156. "adcs r4, r4, r7\n\t"
  98157. "adc r5, r5, #0\n\t"
  98158. "lsr r6, r8, #16\n\t"
  98159. "lsr r7, r9, #16\n\t"
  98160. "mul r7, r6, r7\n\t"
  98161. "adds r4, r4, r7\n\t"
  98162. "adc r5, r5, #0\n\t"
  98163. "lsl r7, r9, #16\n\t"
  98164. "lsr r7, r7, #16\n\t"
  98165. "mul r6, r7, r6\n\t"
  98166. "lsr r7, r6, #16\n\t"
  98167. "lsl r6, r6, #16\n\t"
  98168. "adds r3, r3, r6\n\t"
  98169. "adcs r4, r4, r7\n\t"
  98170. "adc r5, r5, #0\n\t"
  98171. #else
  98172. "umull r6, r7, r8, r9\n\t"
  98173. "adds r3, r3, r6\n\t"
  98174. "adcs r4, r4, r7\n\t"
  98175. "adc r5, r5, #0\n\t"
  98176. #endif
  98177. /* A[4] * B[5] */
  98178. "ldr r9, [%[b], #20]\n\t"
  98179. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  98180. "lsl r6, r11, #16\n\t"
  98181. "lsl r7, r9, #16\n\t"
  98182. "lsr r6, r6, #16\n\t"
  98183. "lsr r7, r7, #16\n\t"
  98184. "mul r7, r6, r7\n\t"
  98185. "adds r3, r3, r7\n\t"
  98186. "adcs r4, r4, #0\n\t"
  98187. "adc r5, r5, #0\n\t"
  98188. "lsr r7, r9, #16\n\t"
  98189. "mul r6, r7, r6\n\t"
  98190. "lsr r7, r6, #16\n\t"
  98191. "lsl r6, r6, #16\n\t"
  98192. "adds r3, r3, r6\n\t"
  98193. "adcs r4, r4, r7\n\t"
  98194. "adc r5, r5, #0\n\t"
  98195. "lsr r6, r11, #16\n\t"
  98196. "lsr r7, r9, #16\n\t"
  98197. "mul r7, r6, r7\n\t"
  98198. "adds r4, r4, r7\n\t"
  98199. "adc r5, r5, #0\n\t"
  98200. "lsl r7, r9, #16\n\t"
  98201. "lsr r7, r7, #16\n\t"
  98202. "mul r6, r7, r6\n\t"
  98203. "lsr r7, r6, #16\n\t"
  98204. "lsl r6, r6, #16\n\t"
  98205. "adds r3, r3, r6\n\t"
  98206. "adcs r4, r4, r7\n\t"
  98207. "adc r5, r5, #0\n\t"
  98208. #else
  98209. "umull r6, r7, r11, r9\n\t"
  98210. "adds r3, r3, r6\n\t"
  98211. "adcs r4, r4, r7\n\t"
  98212. "adc r5, r5, #0\n\t"
  98213. #endif
  98214. /* A[5] * B[4] */
  98215. "ldr r8, [%[a], #20]\n\t"
  98216. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  98217. "lsl r6, r8, #16\n\t"
  98218. "lsl r7, r12, #16\n\t"
  98219. "lsr r6, r6, #16\n\t"
  98220. "lsr r7, r7, #16\n\t"
  98221. "mul r7, r6, r7\n\t"
  98222. "adds r3, r3, r7\n\t"
  98223. "adcs r4, r4, #0\n\t"
  98224. "adc r5, r5, #0\n\t"
  98225. "lsr r7, r12, #16\n\t"
  98226. "mul r6, r7, r6\n\t"
  98227. "lsr r7, r6, #16\n\t"
  98228. "lsl r6, r6, #16\n\t"
  98229. "adds r3, r3, r6\n\t"
  98230. "adcs r4, r4, r7\n\t"
  98231. "adc r5, r5, #0\n\t"
  98232. "lsr r6, r8, #16\n\t"
  98233. "lsr r7, r12, #16\n\t"
  98234. "mul r7, r6, r7\n\t"
  98235. "adds r4, r4, r7\n\t"
  98236. "adc r5, r5, #0\n\t"
  98237. "lsl r7, r12, #16\n\t"
  98238. "lsr r7, r7, #16\n\t"
  98239. "mul r6, r7, r6\n\t"
  98240. "lsr r7, r6, #16\n\t"
  98241. "lsl r6, r6, #16\n\t"
  98242. "adds r3, r3, r6\n\t"
  98243. "adcs r4, r4, r7\n\t"
  98244. "adc r5, r5, #0\n\t"
  98245. #else
  98246. "umull r6, r7, r8, r12\n\t"
  98247. "adds r3, r3, r6\n\t"
  98248. "adcs r4, r4, r7\n\t"
  98249. "adc r5, r5, #0\n\t"
  98250. #endif
  98251. /* A[6] * B[3] */
  98252. "ldr r8, [%[a], #24]\n\t"
  98253. "ldr r9, [%[b], #12]\n\t"
  98254. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  98255. "lsl r6, r8, #16\n\t"
  98256. "lsl r7, r9, #16\n\t"
  98257. "lsr r6, r6, #16\n\t"
  98258. "lsr r7, r7, #16\n\t"
  98259. "mul r7, r6, r7\n\t"
  98260. "adds r3, r3, r7\n\t"
  98261. "adcs r4, r4, #0\n\t"
  98262. "adc r5, r5, #0\n\t"
  98263. "lsr r7, r9, #16\n\t"
  98264. "mul r6, r7, r6\n\t"
  98265. "lsr r7, r6, #16\n\t"
  98266. "lsl r6, r6, #16\n\t"
  98267. "adds r3, r3, r6\n\t"
  98268. "adcs r4, r4, r7\n\t"
  98269. "adc r5, r5, #0\n\t"
  98270. "lsr r6, r8, #16\n\t"
  98271. "lsr r7, r9, #16\n\t"
  98272. "mul r7, r6, r7\n\t"
  98273. "adds r4, r4, r7\n\t"
  98274. "adc r5, r5, #0\n\t"
  98275. "lsl r7, r9, #16\n\t"
  98276. "lsr r7, r7, #16\n\t"
  98277. "mul r6, r7, r6\n\t"
  98278. "lsr r7, r6, #16\n\t"
  98279. "lsl r6, r6, #16\n\t"
  98280. "adds r3, r3, r6\n\t"
  98281. "adcs r4, r4, r7\n\t"
  98282. "adc r5, r5, #0\n\t"
  98283. #else
  98284. "umull r6, r7, r8, r9\n\t"
  98285. "adds r3, r3, r6\n\t"
  98286. "adcs r4, r4, r7\n\t"
  98287. "adc r5, r5, #0\n\t"
  98288. #endif
  98289. /* A[7] * B[2] */
  98290. "ldr r8, [%[a], #28]\n\t"
  98291. "ldr r9, [%[b], #8]\n\t"
  98292. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  98293. "lsl r6, r8, #16\n\t"
  98294. "lsl r7, r9, #16\n\t"
  98295. "lsr r6, r6, #16\n\t"
  98296. "lsr r7, r7, #16\n\t"
  98297. "mul r7, r6, r7\n\t"
  98298. "adds r3, r3, r7\n\t"
  98299. "adcs r4, r4, #0\n\t"
  98300. "adc r5, r5, #0\n\t"
  98301. "lsr r7, r9, #16\n\t"
  98302. "mul r6, r7, r6\n\t"
  98303. "lsr r7, r6, #16\n\t"
  98304. "lsl r6, r6, #16\n\t"
  98305. "adds r3, r3, r6\n\t"
  98306. "adcs r4, r4, r7\n\t"
  98307. "adc r5, r5, #0\n\t"
  98308. "lsr r6, r8, #16\n\t"
  98309. "lsr r7, r9, #16\n\t"
  98310. "mul r7, r6, r7\n\t"
  98311. "adds r4, r4, r7\n\t"
  98312. "adc r5, r5, #0\n\t"
  98313. "lsl r7, r9, #16\n\t"
  98314. "lsr r7, r7, #16\n\t"
  98315. "mul r6, r7, r6\n\t"
  98316. "lsr r7, r6, #16\n\t"
  98317. "lsl r6, r6, #16\n\t"
  98318. "adds r3, r3, r6\n\t"
  98319. "adcs r4, r4, r7\n\t"
  98320. "adc r5, r5, #0\n\t"
  98321. #else
  98322. "umull r6, r7, r8, r9\n\t"
  98323. "adds r3, r3, r6\n\t"
  98324. "adcs r4, r4, r7\n\t"
  98325. "adc r5, r5, #0\n\t"
  98326. #endif
  98327. /* A[8] * B[1] */
  98328. "ldr r8, [%[a], #32]\n\t"
  98329. "ldr r9, [%[b], #4]\n\t"
  98330. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  98331. "lsl r6, r8, #16\n\t"
  98332. "lsl r7, r9, #16\n\t"
  98333. "lsr r6, r6, #16\n\t"
  98334. "lsr r7, r7, #16\n\t"
  98335. "mul r7, r6, r7\n\t"
  98336. "adds r3, r3, r7\n\t"
  98337. "adcs r4, r4, #0\n\t"
  98338. "adc r5, r5, #0\n\t"
  98339. "lsr r7, r9, #16\n\t"
  98340. "mul r6, r7, r6\n\t"
  98341. "lsr r7, r6, #16\n\t"
  98342. "lsl r6, r6, #16\n\t"
  98343. "adds r3, r3, r6\n\t"
  98344. "adcs r4, r4, r7\n\t"
  98345. "adc r5, r5, #0\n\t"
  98346. "lsr r6, r8, #16\n\t"
  98347. "lsr r7, r9, #16\n\t"
  98348. "mul r7, r6, r7\n\t"
  98349. "adds r4, r4, r7\n\t"
  98350. "adc r5, r5, #0\n\t"
  98351. "lsl r7, r9, #16\n\t"
  98352. "lsr r7, r7, #16\n\t"
  98353. "mul r6, r7, r6\n\t"
  98354. "lsr r7, r6, #16\n\t"
  98355. "lsl r6, r6, #16\n\t"
  98356. "adds r3, r3, r6\n\t"
  98357. "adcs r4, r4, r7\n\t"
  98358. "adc r5, r5, #0\n\t"
  98359. #else
  98360. "umull r6, r7, r8, r9\n\t"
  98361. "adds r3, r3, r6\n\t"
  98362. "adcs r4, r4, r7\n\t"
  98363. "adc r5, r5, #0\n\t"
  98364. #endif
  98365. /* A[9] * B[0] */
  98366. "ldr r8, [%[a], #36]\n\t"
  98367. "ldr r9, [%[b]]\n\t"
  98368. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  98369. "lsl r6, r8, #16\n\t"
  98370. "lsl r7, r9, #16\n\t"
  98371. "lsr r6, r6, #16\n\t"
  98372. "lsr r7, r7, #16\n\t"
  98373. "mul r7, r6, r7\n\t"
  98374. "adds r3, r3, r7\n\t"
  98375. "adcs r4, r4, #0\n\t"
  98376. "adc r5, r5, #0\n\t"
  98377. "lsr r7, r9, #16\n\t"
  98378. "mul r6, r7, r6\n\t"
  98379. "lsr r7, r6, #16\n\t"
  98380. "lsl r6, r6, #16\n\t"
  98381. "adds r3, r3, r6\n\t"
  98382. "adcs r4, r4, r7\n\t"
  98383. "adc r5, r5, #0\n\t"
  98384. "lsr r6, r8, #16\n\t"
  98385. "lsr r7, r9, #16\n\t"
  98386. "mul r7, r6, r7\n\t"
  98387. "adds r4, r4, r7\n\t"
  98388. "adc r5, r5, #0\n\t"
  98389. "lsl r7, r9, #16\n\t"
  98390. "lsr r7, r7, #16\n\t"
  98391. "mul r6, r7, r6\n\t"
  98392. "lsr r7, r6, #16\n\t"
  98393. "lsl r6, r6, #16\n\t"
  98394. "adds r3, r3, r6\n\t"
  98395. "adcs r4, r4, r7\n\t"
  98396. "adc r5, r5, #0\n\t"
  98397. #else
  98398. "umull r6, r7, r8, r9\n\t"
  98399. "adds r3, r3, r6\n\t"
  98400. "adcs r4, r4, r7\n\t"
  98401. "adc r5, r5, #0\n\t"
  98402. #endif
  98403. "str r3, [sp, #36]\n\t"
  98404. /* A[10] * B[0] */
  98405. "ldr r8, [%[a], #40]\n\t"
  98406. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  98407. "lsl r6, r8, #16\n\t"
  98408. "lsl r7, r9, #16\n\t"
  98409. "lsr r6, r6, #16\n\t"
  98410. "lsr r7, r7, #16\n\t"
  98411. "mul r7, r6, r7\n\t"
  98412. "adds r4, r4, r7\n\t"
  98413. "adcs r5, r5, #0\n\t"
  98414. "mov r3, #0\n\t"
  98415. "adc r3, r3, #0\n\t"
  98416. "lsr r7, r9, #16\n\t"
  98417. "mul r6, r7, r6\n\t"
  98418. "lsr r7, r6, #16\n\t"
  98419. "lsl r6, r6, #16\n\t"
  98420. "adds r4, r4, r6\n\t"
  98421. "adcs r5, r5, r7\n\t"
  98422. "adc r3, r3, #0\n\t"
  98423. "lsr r6, r8, #16\n\t"
  98424. "lsr r7, r9, #16\n\t"
  98425. "mul r7, r6, r7\n\t"
  98426. "adds r5, r5, r7\n\t"
  98427. "adc r3, r3, #0\n\t"
  98428. "lsl r7, r9, #16\n\t"
  98429. "lsr r7, r7, #16\n\t"
  98430. "mul r6, r7, r6\n\t"
  98431. "lsr r7, r6, #16\n\t"
  98432. "lsl r6, r6, #16\n\t"
  98433. "adds r4, r4, r6\n\t"
  98434. "adcs r5, r5, r7\n\t"
  98435. "adc r3, r3, #0\n\t"
  98436. #else
  98437. "umull r6, r7, r8, r9\n\t"
  98438. "adds r4, r4, r6\n\t"
  98439. "adcs r5, r5, r7\n\t"
  98440. "mov r3, #0\n\t"
  98441. "adc r3, r3, #0\n\t"
  98442. #endif
  98443. /* A[9] * B[1] */
  98444. "ldr r8, [%[a], #36]\n\t"
  98445. "ldr r9, [%[b], #4]\n\t"
  98446. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  98447. "lsl r6, r8, #16\n\t"
  98448. "lsl r7, r9, #16\n\t"
  98449. "lsr r6, r6, #16\n\t"
  98450. "lsr r7, r7, #16\n\t"
  98451. "mul r7, r6, r7\n\t"
  98452. "adds r4, r4, r7\n\t"
  98453. "adcs r5, r5, #0\n\t"
  98454. "adc r3, r3, #0\n\t"
  98455. "lsr r7, r9, #16\n\t"
  98456. "mul r6, r7, r6\n\t"
  98457. "lsr r7, r6, #16\n\t"
  98458. "lsl r6, r6, #16\n\t"
  98459. "adds r4, r4, r6\n\t"
  98460. "adcs r5, r5, r7\n\t"
  98461. "adc r3, r3, #0\n\t"
  98462. "lsr r6, r8, #16\n\t"
  98463. "lsr r7, r9, #16\n\t"
  98464. "mul r7, r6, r7\n\t"
  98465. "adds r5, r5, r7\n\t"
  98466. "adc r3, r3, #0\n\t"
  98467. "lsl r7, r9, #16\n\t"
  98468. "lsr r7, r7, #16\n\t"
  98469. "mul r6, r7, r6\n\t"
  98470. "lsr r7, r6, #16\n\t"
  98471. "lsl r6, r6, #16\n\t"
  98472. "adds r4, r4, r6\n\t"
  98473. "adcs r5, r5, r7\n\t"
  98474. "adc r3, r3, #0\n\t"
  98475. #else
  98476. "umull r6, r7, r8, r9\n\t"
  98477. "adds r4, r4, r6\n\t"
  98478. "adcs r5, r5, r7\n\t"
  98479. "adc r3, r3, #0\n\t"
  98480. #endif
  98481. /* A[8] * B[2] */
  98482. "ldr r8, [%[a], #32]\n\t"
  98483. "ldr r9, [%[b], #8]\n\t"
  98484. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  98485. "lsl r6, r8, #16\n\t"
  98486. "lsl r7, r9, #16\n\t"
  98487. "lsr r6, r6, #16\n\t"
  98488. "lsr r7, r7, #16\n\t"
  98489. "mul r7, r6, r7\n\t"
  98490. "adds r4, r4, r7\n\t"
  98491. "adcs r5, r5, #0\n\t"
  98492. "adc r3, r3, #0\n\t"
  98493. "lsr r7, r9, #16\n\t"
  98494. "mul r6, r7, r6\n\t"
  98495. "lsr r7, r6, #16\n\t"
  98496. "lsl r6, r6, #16\n\t"
  98497. "adds r4, r4, r6\n\t"
  98498. "adcs r5, r5, r7\n\t"
  98499. "adc r3, r3, #0\n\t"
  98500. "lsr r6, r8, #16\n\t"
  98501. "lsr r7, r9, #16\n\t"
  98502. "mul r7, r6, r7\n\t"
  98503. "adds r5, r5, r7\n\t"
  98504. "adc r3, r3, #0\n\t"
  98505. "lsl r7, r9, #16\n\t"
  98506. "lsr r7, r7, #16\n\t"
  98507. "mul r6, r7, r6\n\t"
  98508. "lsr r7, r6, #16\n\t"
  98509. "lsl r6, r6, #16\n\t"
  98510. "adds r4, r4, r6\n\t"
  98511. "adcs r5, r5, r7\n\t"
  98512. "adc r3, r3, #0\n\t"
  98513. #else
  98514. "umull r6, r7, r8, r9\n\t"
  98515. "adds r4, r4, r6\n\t"
  98516. "adcs r5, r5, r7\n\t"
  98517. "adc r3, r3, #0\n\t"
  98518. #endif
  98519. /* A[7] * B[3] */
  98520. "ldr r8, [%[a], #28]\n\t"
  98521. "ldr r9, [%[b], #12]\n\t"
  98522. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  98523. "lsl r6, r8, #16\n\t"
  98524. "lsl r7, r9, #16\n\t"
  98525. "lsr r6, r6, #16\n\t"
  98526. "lsr r7, r7, #16\n\t"
  98527. "mul r7, r6, r7\n\t"
  98528. "adds r4, r4, r7\n\t"
  98529. "adcs r5, r5, #0\n\t"
  98530. "adc r3, r3, #0\n\t"
  98531. "lsr r7, r9, #16\n\t"
  98532. "mul r6, r7, r6\n\t"
  98533. "lsr r7, r6, #16\n\t"
  98534. "lsl r6, r6, #16\n\t"
  98535. "adds r4, r4, r6\n\t"
  98536. "adcs r5, r5, r7\n\t"
  98537. "adc r3, r3, #0\n\t"
  98538. "lsr r6, r8, #16\n\t"
  98539. "lsr r7, r9, #16\n\t"
  98540. "mul r7, r6, r7\n\t"
  98541. "adds r5, r5, r7\n\t"
  98542. "adc r3, r3, #0\n\t"
  98543. "lsl r7, r9, #16\n\t"
  98544. "lsr r7, r7, #16\n\t"
  98545. "mul r6, r7, r6\n\t"
  98546. "lsr r7, r6, #16\n\t"
  98547. "lsl r6, r6, #16\n\t"
  98548. "adds r4, r4, r6\n\t"
  98549. "adcs r5, r5, r7\n\t"
  98550. "adc r3, r3, #0\n\t"
  98551. #else
  98552. "umull r6, r7, r8, r9\n\t"
  98553. "adds r4, r4, r6\n\t"
  98554. "adcs r5, r5, r7\n\t"
  98555. "adc r3, r3, #0\n\t"
  98556. #endif
  98557. /* A[6] * B[4] */
  98558. "ldr r8, [%[a], #24]\n\t"
  98559. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  98560. "lsl r6, r8, #16\n\t"
  98561. "lsl r7, r12, #16\n\t"
  98562. "lsr r6, r6, #16\n\t"
  98563. "lsr r7, r7, #16\n\t"
  98564. "mul r7, r6, r7\n\t"
  98565. "adds r4, r4, r7\n\t"
  98566. "adcs r5, r5, #0\n\t"
  98567. "adc r3, r3, #0\n\t"
  98568. "lsr r7, r12, #16\n\t"
  98569. "mul r6, r7, r6\n\t"
  98570. "lsr r7, r6, #16\n\t"
  98571. "lsl r6, r6, #16\n\t"
  98572. "adds r4, r4, r6\n\t"
  98573. "adcs r5, r5, r7\n\t"
  98574. "adc r3, r3, #0\n\t"
  98575. "lsr r6, r8, #16\n\t"
  98576. "lsr r7, r12, #16\n\t"
  98577. "mul r7, r6, r7\n\t"
  98578. "adds r5, r5, r7\n\t"
  98579. "adc r3, r3, #0\n\t"
  98580. "lsl r7, r12, #16\n\t"
  98581. "lsr r7, r7, #16\n\t"
  98582. "mul r6, r7, r6\n\t"
  98583. "lsr r7, r6, #16\n\t"
  98584. "lsl r6, r6, #16\n\t"
  98585. "adds r4, r4, r6\n\t"
  98586. "adcs r5, r5, r7\n\t"
  98587. "adc r3, r3, #0\n\t"
  98588. #else
  98589. "umull r6, r7, r8, r12\n\t"
  98590. "adds r4, r4, r6\n\t"
  98591. "adcs r5, r5, r7\n\t"
  98592. "adc r3, r3, #0\n\t"
  98593. #endif
  98594. /* A[5] * B[5] */
  98595. "ldr r11, [%[a], #20]\n\t"
  98596. "ldr r12, [%[b], #20]\n\t"
  98597. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  98598. "lsl r6, r11, #16\n\t"
  98599. "lsl r7, r12, #16\n\t"
  98600. "lsr r6, r6, #16\n\t"
  98601. "lsr r7, r7, #16\n\t"
  98602. "mul r7, r6, r7\n\t"
  98603. "adds r4, r4, r7\n\t"
  98604. "adcs r5, r5, #0\n\t"
  98605. "adc r3, r3, #0\n\t"
  98606. "lsr r7, r12, #16\n\t"
  98607. "mul r6, r7, r6\n\t"
  98608. "lsr r7, r6, #16\n\t"
  98609. "lsl r6, r6, #16\n\t"
  98610. "adds r4, r4, r6\n\t"
  98611. "adcs r5, r5, r7\n\t"
  98612. "adc r3, r3, #0\n\t"
  98613. "lsr r6, r11, #16\n\t"
  98614. "lsr r7, r12, #16\n\t"
  98615. "mul r7, r6, r7\n\t"
  98616. "adds r5, r5, r7\n\t"
  98617. "adc r3, r3, #0\n\t"
  98618. "lsl r7, r12, #16\n\t"
  98619. "lsr r7, r7, #16\n\t"
  98620. "mul r6, r7, r6\n\t"
  98621. "lsr r7, r6, #16\n\t"
  98622. "lsl r6, r6, #16\n\t"
  98623. "adds r4, r4, r6\n\t"
  98624. "adcs r5, r5, r7\n\t"
  98625. "adc r3, r3, #0\n\t"
  98626. #else
  98627. "umull r6, r7, r11, r12\n\t"
  98628. "adds r4, r4, r6\n\t"
  98629. "adcs r5, r5, r7\n\t"
  98630. "adc r3, r3, #0\n\t"
  98631. #endif
  98632. /* A[4] * B[6] */
  98633. "ldr r8, [%[a], #16]\n\t"
  98634. "ldr r9, [%[b], #24]\n\t"
  98635. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  98636. "lsl r6, r8, #16\n\t"
  98637. "lsl r7, r9, #16\n\t"
  98638. "lsr r6, r6, #16\n\t"
  98639. "lsr r7, r7, #16\n\t"
  98640. "mul r7, r6, r7\n\t"
  98641. "adds r4, r4, r7\n\t"
  98642. "adcs r5, r5, #0\n\t"
  98643. "adc r3, r3, #0\n\t"
  98644. "lsr r7, r9, #16\n\t"
  98645. "mul r6, r7, r6\n\t"
  98646. "lsr r7, r6, #16\n\t"
  98647. "lsl r6, r6, #16\n\t"
  98648. "adds r4, r4, r6\n\t"
  98649. "adcs r5, r5, r7\n\t"
  98650. "adc r3, r3, #0\n\t"
  98651. "lsr r6, r8, #16\n\t"
  98652. "lsr r7, r9, #16\n\t"
  98653. "mul r7, r6, r7\n\t"
  98654. "adds r5, r5, r7\n\t"
  98655. "adc r3, r3, #0\n\t"
  98656. "lsl r7, r9, #16\n\t"
  98657. "lsr r7, r7, #16\n\t"
  98658. "mul r6, r7, r6\n\t"
  98659. "lsr r7, r6, #16\n\t"
  98660. "lsl r6, r6, #16\n\t"
  98661. "adds r4, r4, r6\n\t"
  98662. "adcs r5, r5, r7\n\t"
  98663. "adc r3, r3, #0\n\t"
  98664. #else
  98665. "umull r6, r7, r8, r9\n\t"
  98666. "adds r4, r4, r6\n\t"
  98667. "adcs r5, r5, r7\n\t"
  98668. "adc r3, r3, #0\n\t"
  98669. #endif
  98670. /* A[3] * B[7] */
  98671. "ldr r8, [%[a], #12]\n\t"
  98672. "ldr r9, [%[b], #28]\n\t"
  98673. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  98674. "lsl r6, r8, #16\n\t"
  98675. "lsl r7, r9, #16\n\t"
  98676. "lsr r6, r6, #16\n\t"
  98677. "lsr r7, r7, #16\n\t"
  98678. "mul r7, r6, r7\n\t"
  98679. "adds r4, r4, r7\n\t"
  98680. "adcs r5, r5, #0\n\t"
  98681. "adc r3, r3, #0\n\t"
  98682. "lsr r7, r9, #16\n\t"
  98683. "mul r6, r7, r6\n\t"
  98684. "lsr r7, r6, #16\n\t"
  98685. "lsl r6, r6, #16\n\t"
  98686. "adds r4, r4, r6\n\t"
  98687. "adcs r5, r5, r7\n\t"
  98688. "adc r3, r3, #0\n\t"
  98689. "lsr r6, r8, #16\n\t"
  98690. "lsr r7, r9, #16\n\t"
  98691. "mul r7, r6, r7\n\t"
  98692. "adds r5, r5, r7\n\t"
  98693. "adc r3, r3, #0\n\t"
  98694. "lsl r7, r9, #16\n\t"
  98695. "lsr r7, r7, #16\n\t"
  98696. "mul r6, r7, r6\n\t"
  98697. "lsr r7, r6, #16\n\t"
  98698. "lsl r6, r6, #16\n\t"
  98699. "adds r4, r4, r6\n\t"
  98700. "adcs r5, r5, r7\n\t"
  98701. "adc r3, r3, #0\n\t"
  98702. #else
  98703. "umull r6, r7, r8, r9\n\t"
  98704. "adds r4, r4, r6\n\t"
  98705. "adcs r5, r5, r7\n\t"
  98706. "adc r3, r3, #0\n\t"
  98707. #endif
  98708. /* A[2] * B[8] */
  98709. "ldr r8, [%[a], #8]\n\t"
  98710. "ldr r9, [%[b], #32]\n\t"
  98711. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  98712. "lsl r6, r8, #16\n\t"
  98713. "lsl r7, r9, #16\n\t"
  98714. "lsr r6, r6, #16\n\t"
  98715. "lsr r7, r7, #16\n\t"
  98716. "mul r7, r6, r7\n\t"
  98717. "adds r4, r4, r7\n\t"
  98718. "adcs r5, r5, #0\n\t"
  98719. "adc r3, r3, #0\n\t"
  98720. "lsr r7, r9, #16\n\t"
  98721. "mul r6, r7, r6\n\t"
  98722. "lsr r7, r6, #16\n\t"
  98723. "lsl r6, r6, #16\n\t"
  98724. "adds r4, r4, r6\n\t"
  98725. "adcs r5, r5, r7\n\t"
  98726. "adc r3, r3, #0\n\t"
  98727. "lsr r6, r8, #16\n\t"
  98728. "lsr r7, r9, #16\n\t"
  98729. "mul r7, r6, r7\n\t"
  98730. "adds r5, r5, r7\n\t"
  98731. "adc r3, r3, #0\n\t"
  98732. "lsl r7, r9, #16\n\t"
  98733. "lsr r7, r7, #16\n\t"
  98734. "mul r6, r7, r6\n\t"
  98735. "lsr r7, r6, #16\n\t"
  98736. "lsl r6, r6, #16\n\t"
  98737. "adds r4, r4, r6\n\t"
  98738. "adcs r5, r5, r7\n\t"
  98739. "adc r3, r3, #0\n\t"
  98740. #else
  98741. "umull r6, r7, r8, r9\n\t"
  98742. "adds r4, r4, r6\n\t"
  98743. "adcs r5, r5, r7\n\t"
  98744. "adc r3, r3, #0\n\t"
  98745. #endif
  98746. /* A[1] * B[9] */
  98747. "ldr r8, [%[a], #4]\n\t"
  98748. "ldr r9, [%[b], #36]\n\t"
  98749. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  98750. "lsl r6, r8, #16\n\t"
  98751. "lsl r7, r9, #16\n\t"
  98752. "lsr r6, r6, #16\n\t"
  98753. "lsr r7, r7, #16\n\t"
  98754. "mul r7, r6, r7\n\t"
  98755. "adds r4, r4, r7\n\t"
  98756. "adcs r5, r5, #0\n\t"
  98757. "adc r3, r3, #0\n\t"
  98758. "lsr r7, r9, #16\n\t"
  98759. "mul r6, r7, r6\n\t"
  98760. "lsr r7, r6, #16\n\t"
  98761. "lsl r6, r6, #16\n\t"
  98762. "adds r4, r4, r6\n\t"
  98763. "adcs r5, r5, r7\n\t"
  98764. "adc r3, r3, #0\n\t"
  98765. "lsr r6, r8, #16\n\t"
  98766. "lsr r7, r9, #16\n\t"
  98767. "mul r7, r6, r7\n\t"
  98768. "adds r5, r5, r7\n\t"
  98769. "adc r3, r3, #0\n\t"
  98770. "lsl r7, r9, #16\n\t"
  98771. "lsr r7, r7, #16\n\t"
  98772. "mul r6, r7, r6\n\t"
  98773. "lsr r7, r6, #16\n\t"
  98774. "lsl r6, r6, #16\n\t"
  98775. "adds r4, r4, r6\n\t"
  98776. "adcs r5, r5, r7\n\t"
  98777. "adc r3, r3, #0\n\t"
  98778. #else
  98779. "umull r6, r7, r8, r9\n\t"
  98780. "adds r4, r4, r6\n\t"
  98781. "adcs r5, r5, r7\n\t"
  98782. "adc r3, r3, #0\n\t"
  98783. #endif
  98784. /* A[0] * B[10] */
  98785. "ldr r8, [%[a]]\n\t"
  98786. "ldr r9, [%[b], #40]\n\t"
  98787. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  98788. "lsl r6, r8, #16\n\t"
  98789. "lsl r7, r9, #16\n\t"
  98790. "lsr r6, r6, #16\n\t"
  98791. "lsr r7, r7, #16\n\t"
  98792. "mul r7, r6, r7\n\t"
  98793. "adds r4, r4, r7\n\t"
  98794. "adcs r5, r5, #0\n\t"
  98795. "adc r3, r3, #0\n\t"
  98796. "lsr r7, r9, #16\n\t"
  98797. "mul r6, r7, r6\n\t"
  98798. "lsr r7, r6, #16\n\t"
  98799. "lsl r6, r6, #16\n\t"
  98800. "adds r4, r4, r6\n\t"
  98801. "adcs r5, r5, r7\n\t"
  98802. "adc r3, r3, #0\n\t"
  98803. "lsr r6, r8, #16\n\t"
  98804. "lsr r7, r9, #16\n\t"
  98805. "mul r7, r6, r7\n\t"
  98806. "adds r5, r5, r7\n\t"
  98807. "adc r3, r3, #0\n\t"
  98808. "lsl r7, r9, #16\n\t"
  98809. "lsr r7, r7, #16\n\t"
  98810. "mul r6, r7, r6\n\t"
  98811. "lsr r7, r6, #16\n\t"
  98812. "lsl r6, r6, #16\n\t"
  98813. "adds r4, r4, r6\n\t"
  98814. "adcs r5, r5, r7\n\t"
  98815. "adc r3, r3, #0\n\t"
  98816. #else
  98817. "umull r6, r7, r8, r9\n\t"
  98818. "adds r4, r4, r6\n\t"
  98819. "adcs r5, r5, r7\n\t"
  98820. "adc r3, r3, #0\n\t"
  98821. #endif
  98822. "str r4, [sp, #40]\n\t"
  98823. /* A[0] * B[11] */
  98824. "ldr r9, [%[b], #44]\n\t"
  98825. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  98826. "lsl r6, r8, #16\n\t"
  98827. "lsl r7, r9, #16\n\t"
  98828. "lsr r6, r6, #16\n\t"
  98829. "lsr r7, r7, #16\n\t"
  98830. "mul r7, r6, r7\n\t"
  98831. "adds r5, r5, r7\n\t"
  98832. "adcs r3, r3, #0\n\t"
  98833. "mov r4, #0\n\t"
  98834. "adc r4, r4, #0\n\t"
  98835. "lsr r7, r9, #16\n\t"
  98836. "mul r6, r7, r6\n\t"
  98837. "lsr r7, r6, #16\n\t"
  98838. "lsl r6, r6, #16\n\t"
  98839. "adds r5, r5, r6\n\t"
  98840. "adcs r3, r3, r7\n\t"
  98841. "adc r4, r4, #0\n\t"
  98842. "lsr r6, r8, #16\n\t"
  98843. "lsr r7, r9, #16\n\t"
  98844. "mul r7, r6, r7\n\t"
  98845. "adds r3, r3, r7\n\t"
  98846. "adc r4, r4, #0\n\t"
  98847. "lsl r7, r9, #16\n\t"
  98848. "lsr r7, r7, #16\n\t"
  98849. "mul r6, r7, r6\n\t"
  98850. "lsr r7, r6, #16\n\t"
  98851. "lsl r6, r6, #16\n\t"
  98852. "adds r5, r5, r6\n\t"
  98853. "adcs r3, r3, r7\n\t"
  98854. "adc r4, r4, #0\n\t"
  98855. #else
  98856. "umull r6, r7, r8, r9\n\t"
  98857. "adds r5, r5, r6\n\t"
  98858. "adcs r3, r3, r7\n\t"
  98859. "mov r4, #0\n\t"
  98860. "adc r4, r4, #0\n\t"
  98861. #endif
  98862. /* A[1] * B[10] */
  98863. "ldr r8, [%[a], #4]\n\t"
  98864. "ldr r9, [%[b], #40]\n\t"
  98865. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  98866. "lsl r6, r8, #16\n\t"
  98867. "lsl r7, r9, #16\n\t"
  98868. "lsr r6, r6, #16\n\t"
  98869. "lsr r7, r7, #16\n\t"
  98870. "mul r7, r6, r7\n\t"
  98871. "adds r5, r5, r7\n\t"
  98872. "adcs r3, r3, #0\n\t"
  98873. "adc r4, r4, #0\n\t"
  98874. "lsr r7, r9, #16\n\t"
  98875. "mul r6, r7, r6\n\t"
  98876. "lsr r7, r6, #16\n\t"
  98877. "lsl r6, r6, #16\n\t"
  98878. "adds r5, r5, r6\n\t"
  98879. "adcs r3, r3, r7\n\t"
  98880. "adc r4, r4, #0\n\t"
  98881. "lsr r6, r8, #16\n\t"
  98882. "lsr r7, r9, #16\n\t"
  98883. "mul r7, r6, r7\n\t"
  98884. "adds r3, r3, r7\n\t"
  98885. "adc r4, r4, #0\n\t"
  98886. "lsl r7, r9, #16\n\t"
  98887. "lsr r7, r7, #16\n\t"
  98888. "mul r6, r7, r6\n\t"
  98889. "lsr r7, r6, #16\n\t"
  98890. "lsl r6, r6, #16\n\t"
  98891. "adds r5, r5, r6\n\t"
  98892. "adcs r3, r3, r7\n\t"
  98893. "adc r4, r4, #0\n\t"
  98894. #else
  98895. "umull r6, r7, r8, r9\n\t"
  98896. "adds r5, r5, r6\n\t"
  98897. "adcs r3, r3, r7\n\t"
  98898. "adc r4, r4, #0\n\t"
  98899. #endif
  98900. /* A[2] * B[9] */
  98901. "ldr r8, [%[a], #8]\n\t"
  98902. "ldr r9, [%[b], #36]\n\t"
  98903. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  98904. "lsl r6, r8, #16\n\t"
  98905. "lsl r7, r9, #16\n\t"
  98906. "lsr r6, r6, #16\n\t"
  98907. "lsr r7, r7, #16\n\t"
  98908. "mul r7, r6, r7\n\t"
  98909. "adds r5, r5, r7\n\t"
  98910. "adcs r3, r3, #0\n\t"
  98911. "adc r4, r4, #0\n\t"
  98912. "lsr r7, r9, #16\n\t"
  98913. "mul r6, r7, r6\n\t"
  98914. "lsr r7, r6, #16\n\t"
  98915. "lsl r6, r6, #16\n\t"
  98916. "adds r5, r5, r6\n\t"
  98917. "adcs r3, r3, r7\n\t"
  98918. "adc r4, r4, #0\n\t"
  98919. "lsr r6, r8, #16\n\t"
  98920. "lsr r7, r9, #16\n\t"
  98921. "mul r7, r6, r7\n\t"
  98922. "adds r3, r3, r7\n\t"
  98923. "adc r4, r4, #0\n\t"
  98924. "lsl r7, r9, #16\n\t"
  98925. "lsr r7, r7, #16\n\t"
  98926. "mul r6, r7, r6\n\t"
  98927. "lsr r7, r6, #16\n\t"
  98928. "lsl r6, r6, #16\n\t"
  98929. "adds r5, r5, r6\n\t"
  98930. "adcs r3, r3, r7\n\t"
  98931. "adc r4, r4, #0\n\t"
  98932. #else
  98933. "umull r6, r7, r8, r9\n\t"
  98934. "adds r5, r5, r6\n\t"
  98935. "adcs r3, r3, r7\n\t"
  98936. "adc r4, r4, #0\n\t"
  98937. #endif
  98938. /* A[3] * B[8] */
  98939. "ldr r8, [%[a], #12]\n\t"
  98940. "ldr r9, [%[b], #32]\n\t"
  98941. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  98942. "lsl r6, r8, #16\n\t"
  98943. "lsl r7, r9, #16\n\t"
  98944. "lsr r6, r6, #16\n\t"
  98945. "lsr r7, r7, #16\n\t"
  98946. "mul r7, r6, r7\n\t"
  98947. "adds r5, r5, r7\n\t"
  98948. "adcs r3, r3, #0\n\t"
  98949. "adc r4, r4, #0\n\t"
  98950. "lsr r7, r9, #16\n\t"
  98951. "mul r6, r7, r6\n\t"
  98952. "lsr r7, r6, #16\n\t"
  98953. "lsl r6, r6, #16\n\t"
  98954. "adds r5, r5, r6\n\t"
  98955. "adcs r3, r3, r7\n\t"
  98956. "adc r4, r4, #0\n\t"
  98957. "lsr r6, r8, #16\n\t"
  98958. "lsr r7, r9, #16\n\t"
  98959. "mul r7, r6, r7\n\t"
  98960. "adds r3, r3, r7\n\t"
  98961. "adc r4, r4, #0\n\t"
  98962. "lsl r7, r9, #16\n\t"
  98963. "lsr r7, r7, #16\n\t"
  98964. "mul r6, r7, r6\n\t"
  98965. "lsr r7, r6, #16\n\t"
  98966. "lsl r6, r6, #16\n\t"
  98967. "adds r5, r5, r6\n\t"
  98968. "adcs r3, r3, r7\n\t"
  98969. "adc r4, r4, #0\n\t"
  98970. #else
  98971. "umull r6, r7, r8, r9\n\t"
  98972. "adds r5, r5, r6\n\t"
  98973. "adcs r3, r3, r7\n\t"
  98974. "adc r4, r4, #0\n\t"
  98975. #endif
  98976. /* A[4] * B[7] */
  98977. "ldr r8, [%[a], #16]\n\t"
  98978. "ldr r9, [%[b], #28]\n\t"
  98979. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  98980. "lsl r6, r8, #16\n\t"
  98981. "lsl r7, r9, #16\n\t"
  98982. "lsr r6, r6, #16\n\t"
  98983. "lsr r7, r7, #16\n\t"
  98984. "mul r7, r6, r7\n\t"
  98985. "adds r5, r5, r7\n\t"
  98986. "adcs r3, r3, #0\n\t"
  98987. "adc r4, r4, #0\n\t"
  98988. "lsr r7, r9, #16\n\t"
  98989. "mul r6, r7, r6\n\t"
  98990. "lsr r7, r6, #16\n\t"
  98991. "lsl r6, r6, #16\n\t"
  98992. "adds r5, r5, r6\n\t"
  98993. "adcs r3, r3, r7\n\t"
  98994. "adc r4, r4, #0\n\t"
  98995. "lsr r6, r8, #16\n\t"
  98996. "lsr r7, r9, #16\n\t"
  98997. "mul r7, r6, r7\n\t"
  98998. "adds r3, r3, r7\n\t"
  98999. "adc r4, r4, #0\n\t"
  99000. "lsl r7, r9, #16\n\t"
  99001. "lsr r7, r7, #16\n\t"
  99002. "mul r6, r7, r6\n\t"
  99003. "lsr r7, r6, #16\n\t"
  99004. "lsl r6, r6, #16\n\t"
  99005. "adds r5, r5, r6\n\t"
  99006. "adcs r3, r3, r7\n\t"
  99007. "adc r4, r4, #0\n\t"
  99008. #else
  99009. "umull r6, r7, r8, r9\n\t"
  99010. "adds r5, r5, r6\n\t"
  99011. "adcs r3, r3, r7\n\t"
  99012. "adc r4, r4, #0\n\t"
  99013. #endif
  99014. /* A[5] * B[6] */
  99015. "ldr r9, [%[b], #24]\n\t"
  99016. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  99017. "lsl r6, r11, #16\n\t"
  99018. "lsl r7, r9, #16\n\t"
  99019. "lsr r6, r6, #16\n\t"
  99020. "lsr r7, r7, #16\n\t"
  99021. "mul r7, r6, r7\n\t"
  99022. "adds r5, r5, r7\n\t"
  99023. "adcs r3, r3, #0\n\t"
  99024. "adc r4, r4, #0\n\t"
  99025. "lsr r7, r9, #16\n\t"
  99026. "mul r6, r7, r6\n\t"
  99027. "lsr r7, r6, #16\n\t"
  99028. "lsl r6, r6, #16\n\t"
  99029. "adds r5, r5, r6\n\t"
  99030. "adcs r3, r3, r7\n\t"
  99031. "adc r4, r4, #0\n\t"
  99032. "lsr r6, r11, #16\n\t"
  99033. "lsr r7, r9, #16\n\t"
  99034. "mul r7, r6, r7\n\t"
  99035. "adds r3, r3, r7\n\t"
  99036. "adc r4, r4, #0\n\t"
  99037. "lsl r7, r9, #16\n\t"
  99038. "lsr r7, r7, #16\n\t"
  99039. "mul r6, r7, r6\n\t"
  99040. "lsr r7, r6, #16\n\t"
  99041. "lsl r6, r6, #16\n\t"
  99042. "adds r5, r5, r6\n\t"
  99043. "adcs r3, r3, r7\n\t"
  99044. "adc r4, r4, #0\n\t"
  99045. #else
  99046. "umull r6, r7, r11, r9\n\t"
  99047. "adds r5, r5, r6\n\t"
  99048. "adcs r3, r3, r7\n\t"
  99049. "adc r4, r4, #0\n\t"
  99050. #endif
  99051. /* A[6] * B[5] */
  99052. "ldr r8, [%[a], #24]\n\t"
  99053. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  99054. "lsl r6, r8, #16\n\t"
  99055. "lsl r7, r12, #16\n\t"
  99056. "lsr r6, r6, #16\n\t"
  99057. "lsr r7, r7, #16\n\t"
  99058. "mul r7, r6, r7\n\t"
  99059. "adds r5, r5, r7\n\t"
  99060. "adcs r3, r3, #0\n\t"
  99061. "adc r4, r4, #0\n\t"
  99062. "lsr r7, r12, #16\n\t"
  99063. "mul r6, r7, r6\n\t"
  99064. "lsr r7, r6, #16\n\t"
  99065. "lsl r6, r6, #16\n\t"
  99066. "adds r5, r5, r6\n\t"
  99067. "adcs r3, r3, r7\n\t"
  99068. "adc r4, r4, #0\n\t"
  99069. "lsr r6, r8, #16\n\t"
  99070. "lsr r7, r12, #16\n\t"
  99071. "mul r7, r6, r7\n\t"
  99072. "adds r3, r3, r7\n\t"
  99073. "adc r4, r4, #0\n\t"
  99074. "lsl r7, r12, #16\n\t"
  99075. "lsr r7, r7, #16\n\t"
  99076. "mul r6, r7, r6\n\t"
  99077. "lsr r7, r6, #16\n\t"
  99078. "lsl r6, r6, #16\n\t"
  99079. "adds r5, r5, r6\n\t"
  99080. "adcs r3, r3, r7\n\t"
  99081. "adc r4, r4, #0\n\t"
  99082. #else
  99083. "umull r6, r7, r8, r12\n\t"
  99084. "adds r5, r5, r6\n\t"
  99085. "adcs r3, r3, r7\n\t"
  99086. "adc r4, r4, #0\n\t"
  99087. #endif
  99088. /* A[7] * B[4] */
  99089. "ldr r8, [%[a], #28]\n\t"
  99090. "ldr r9, [%[b], #16]\n\t"
  99091. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  99092. "lsl r6, r8, #16\n\t"
  99093. "lsl r7, r9, #16\n\t"
  99094. "lsr r6, r6, #16\n\t"
  99095. "lsr r7, r7, #16\n\t"
  99096. "mul r7, r6, r7\n\t"
  99097. "adds r5, r5, r7\n\t"
  99098. "adcs r3, r3, #0\n\t"
  99099. "adc r4, r4, #0\n\t"
  99100. "lsr r7, r9, #16\n\t"
  99101. "mul r6, r7, r6\n\t"
  99102. "lsr r7, r6, #16\n\t"
  99103. "lsl r6, r6, #16\n\t"
  99104. "adds r5, r5, r6\n\t"
  99105. "adcs r3, r3, r7\n\t"
  99106. "adc r4, r4, #0\n\t"
  99107. "lsr r6, r8, #16\n\t"
  99108. "lsr r7, r9, #16\n\t"
  99109. "mul r7, r6, r7\n\t"
  99110. "adds r3, r3, r7\n\t"
  99111. "adc r4, r4, #0\n\t"
  99112. "lsl r7, r9, #16\n\t"
  99113. "lsr r7, r7, #16\n\t"
  99114. "mul r6, r7, r6\n\t"
  99115. "lsr r7, r6, #16\n\t"
  99116. "lsl r6, r6, #16\n\t"
  99117. "adds r5, r5, r6\n\t"
  99118. "adcs r3, r3, r7\n\t"
  99119. "adc r4, r4, #0\n\t"
  99120. #else
  99121. "umull r6, r7, r8, r9\n\t"
  99122. "adds r5, r5, r6\n\t"
  99123. "adcs r3, r3, r7\n\t"
  99124. "adc r4, r4, #0\n\t"
  99125. #endif
  99126. /* A[8] * B[3] */
  99127. "ldr r8, [%[a], #32]\n\t"
  99128. "ldr r9, [%[b], #12]\n\t"
  99129. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  99130. "lsl r6, r8, #16\n\t"
  99131. "lsl r7, r9, #16\n\t"
  99132. "lsr r6, r6, #16\n\t"
  99133. "lsr r7, r7, #16\n\t"
  99134. "mul r7, r6, r7\n\t"
  99135. "adds r5, r5, r7\n\t"
  99136. "adcs r3, r3, #0\n\t"
  99137. "adc r4, r4, #0\n\t"
  99138. "lsr r7, r9, #16\n\t"
  99139. "mul r6, r7, r6\n\t"
  99140. "lsr r7, r6, #16\n\t"
  99141. "lsl r6, r6, #16\n\t"
  99142. "adds r5, r5, r6\n\t"
  99143. "adcs r3, r3, r7\n\t"
  99144. "adc r4, r4, #0\n\t"
  99145. "lsr r6, r8, #16\n\t"
  99146. "lsr r7, r9, #16\n\t"
  99147. "mul r7, r6, r7\n\t"
  99148. "adds r3, r3, r7\n\t"
  99149. "adc r4, r4, #0\n\t"
  99150. "lsl r7, r9, #16\n\t"
  99151. "lsr r7, r7, #16\n\t"
  99152. "mul r6, r7, r6\n\t"
  99153. "lsr r7, r6, #16\n\t"
  99154. "lsl r6, r6, #16\n\t"
  99155. "adds r5, r5, r6\n\t"
  99156. "adcs r3, r3, r7\n\t"
  99157. "adc r4, r4, #0\n\t"
  99158. #else
  99159. "umull r6, r7, r8, r9\n\t"
  99160. "adds r5, r5, r6\n\t"
  99161. "adcs r3, r3, r7\n\t"
  99162. "adc r4, r4, #0\n\t"
  99163. #endif
  99164. /* A[9] * B[2] */
  99165. "ldr r8, [%[a], #36]\n\t"
  99166. "ldr r9, [%[b], #8]\n\t"
  99167. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  99168. "lsl r6, r8, #16\n\t"
  99169. "lsl r7, r9, #16\n\t"
  99170. "lsr r6, r6, #16\n\t"
  99171. "lsr r7, r7, #16\n\t"
  99172. "mul r7, r6, r7\n\t"
  99173. "adds r5, r5, r7\n\t"
  99174. "adcs r3, r3, #0\n\t"
  99175. "adc r4, r4, #0\n\t"
  99176. "lsr r7, r9, #16\n\t"
  99177. "mul r6, r7, r6\n\t"
  99178. "lsr r7, r6, #16\n\t"
  99179. "lsl r6, r6, #16\n\t"
  99180. "adds r5, r5, r6\n\t"
  99181. "adcs r3, r3, r7\n\t"
  99182. "adc r4, r4, #0\n\t"
  99183. "lsr r6, r8, #16\n\t"
  99184. "lsr r7, r9, #16\n\t"
  99185. "mul r7, r6, r7\n\t"
  99186. "adds r3, r3, r7\n\t"
  99187. "adc r4, r4, #0\n\t"
  99188. "lsl r7, r9, #16\n\t"
  99189. "lsr r7, r7, #16\n\t"
  99190. "mul r6, r7, r6\n\t"
  99191. "lsr r7, r6, #16\n\t"
  99192. "lsl r6, r6, #16\n\t"
  99193. "adds r5, r5, r6\n\t"
  99194. "adcs r3, r3, r7\n\t"
  99195. "adc r4, r4, #0\n\t"
  99196. #else
  99197. "umull r6, r7, r8, r9\n\t"
  99198. "adds r5, r5, r6\n\t"
  99199. "adcs r3, r3, r7\n\t"
  99200. "adc r4, r4, #0\n\t"
  99201. #endif
  99202. /* A[10] * B[1] */
  99203. "ldr r8, [%[a], #40]\n\t"
  99204. "ldr r9, [%[b], #4]\n\t"
  99205. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  99206. "lsl r6, r8, #16\n\t"
  99207. "lsl r7, r9, #16\n\t"
  99208. "lsr r6, r6, #16\n\t"
  99209. "lsr r7, r7, #16\n\t"
  99210. "mul r7, r6, r7\n\t"
  99211. "adds r5, r5, r7\n\t"
  99212. "adcs r3, r3, #0\n\t"
  99213. "adc r4, r4, #0\n\t"
  99214. "lsr r7, r9, #16\n\t"
  99215. "mul r6, r7, r6\n\t"
  99216. "lsr r7, r6, #16\n\t"
  99217. "lsl r6, r6, #16\n\t"
  99218. "adds r5, r5, r6\n\t"
  99219. "adcs r3, r3, r7\n\t"
  99220. "adc r4, r4, #0\n\t"
  99221. "lsr r6, r8, #16\n\t"
  99222. "lsr r7, r9, #16\n\t"
  99223. "mul r7, r6, r7\n\t"
  99224. "adds r3, r3, r7\n\t"
  99225. "adc r4, r4, #0\n\t"
  99226. "lsl r7, r9, #16\n\t"
  99227. "lsr r7, r7, #16\n\t"
  99228. "mul r6, r7, r6\n\t"
  99229. "lsr r7, r6, #16\n\t"
  99230. "lsl r6, r6, #16\n\t"
  99231. "adds r5, r5, r6\n\t"
  99232. "adcs r3, r3, r7\n\t"
  99233. "adc r4, r4, #0\n\t"
  99234. #else
  99235. "umull r6, r7, r8, r9\n\t"
  99236. "adds r5, r5, r6\n\t"
  99237. "adcs r3, r3, r7\n\t"
  99238. "adc r4, r4, #0\n\t"
  99239. #endif
  99240. /* A[11] * B[0] */
  99241. "ldr r8, [%[a], #44]\n\t"
  99242. "ldr r9, [%[b]]\n\t"
  99243. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  99244. "lsl r6, r8, #16\n\t"
  99245. "lsl r7, r9, #16\n\t"
  99246. "lsr r6, r6, #16\n\t"
  99247. "lsr r7, r7, #16\n\t"
  99248. "mul r7, r6, r7\n\t"
  99249. "adds r5, r5, r7\n\t"
  99250. "adcs r3, r3, #0\n\t"
  99251. "adc r4, r4, #0\n\t"
  99252. "lsr r7, r9, #16\n\t"
  99253. "mul r6, r7, r6\n\t"
  99254. "lsr r7, r6, #16\n\t"
  99255. "lsl r6, r6, #16\n\t"
  99256. "adds r5, r5, r6\n\t"
  99257. "adcs r3, r3, r7\n\t"
  99258. "adc r4, r4, #0\n\t"
  99259. "lsr r6, r8, #16\n\t"
  99260. "lsr r7, r9, #16\n\t"
  99261. "mul r7, r6, r7\n\t"
  99262. "adds r3, r3, r7\n\t"
  99263. "adc r4, r4, #0\n\t"
  99264. "lsl r7, r9, #16\n\t"
  99265. "lsr r7, r7, #16\n\t"
  99266. "mul r6, r7, r6\n\t"
  99267. "lsr r7, r6, #16\n\t"
  99268. "lsl r6, r6, #16\n\t"
  99269. "adds r5, r5, r6\n\t"
  99270. "adcs r3, r3, r7\n\t"
  99271. "adc r4, r4, #0\n\t"
  99272. #else
  99273. "umull r6, r7, r8, r9\n\t"
  99274. "adds r5, r5, r6\n\t"
  99275. "adcs r3, r3, r7\n\t"
  99276. "adc r4, r4, #0\n\t"
  99277. #endif
  99278. "str r5, [sp, #44]\n\t"
  99279. /* A[12] * B[0] */
  99280. "ldr r8, [%[a], #48]\n\t"
  99281. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  99282. "lsl r6, r8, #16\n\t"
  99283. "lsl r7, r9, #16\n\t"
  99284. "lsr r6, r6, #16\n\t"
  99285. "lsr r7, r7, #16\n\t"
  99286. "mul r7, r6, r7\n\t"
  99287. "adds r3, r3, r7\n\t"
  99288. "adcs r4, r4, #0\n\t"
  99289. "mov r5, #0\n\t"
  99290. "adc r5, r5, #0\n\t"
  99291. "lsr r7, r9, #16\n\t"
  99292. "mul r6, r7, r6\n\t"
  99293. "lsr r7, r6, #16\n\t"
  99294. "lsl r6, r6, #16\n\t"
  99295. "adds r3, r3, r6\n\t"
  99296. "adcs r4, r4, r7\n\t"
  99297. "adc r5, r5, #0\n\t"
  99298. "lsr r6, r8, #16\n\t"
  99299. "lsr r7, r9, #16\n\t"
  99300. "mul r7, r6, r7\n\t"
  99301. "adds r4, r4, r7\n\t"
  99302. "adc r5, r5, #0\n\t"
  99303. "lsl r7, r9, #16\n\t"
  99304. "lsr r7, r7, #16\n\t"
  99305. "mul r6, r7, r6\n\t"
  99306. "lsr r7, r6, #16\n\t"
  99307. "lsl r6, r6, #16\n\t"
  99308. "adds r3, r3, r6\n\t"
  99309. "adcs r4, r4, r7\n\t"
  99310. "adc r5, r5, #0\n\t"
  99311. #else
  99312. "umull r6, r7, r8, r9\n\t"
  99313. "adds r3, r3, r6\n\t"
  99314. "adcs r4, r4, r7\n\t"
  99315. "mov r5, #0\n\t"
  99316. "adc r5, r5, #0\n\t"
  99317. #endif
  99318. /* A[11] * B[1] */
  99319. "ldr r8, [%[a], #44]\n\t"
  99320. "ldr r9, [%[b], #4]\n\t"
  99321. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  99322. "lsl r6, r8, #16\n\t"
  99323. "lsl r7, r9, #16\n\t"
  99324. "lsr r6, r6, #16\n\t"
  99325. "lsr r7, r7, #16\n\t"
  99326. "mul r7, r6, r7\n\t"
  99327. "adds r3, r3, r7\n\t"
  99328. "adcs r4, r4, #0\n\t"
  99329. "adc r5, r5, #0\n\t"
  99330. "lsr r7, r9, #16\n\t"
  99331. "mul r6, r7, r6\n\t"
  99332. "lsr r7, r6, #16\n\t"
  99333. "lsl r6, r6, #16\n\t"
  99334. "adds r3, r3, r6\n\t"
  99335. "adcs r4, r4, r7\n\t"
  99336. "adc r5, r5, #0\n\t"
  99337. "lsr r6, r8, #16\n\t"
  99338. "lsr r7, r9, #16\n\t"
  99339. "mul r7, r6, r7\n\t"
  99340. "adds r4, r4, r7\n\t"
  99341. "adc r5, r5, #0\n\t"
  99342. "lsl r7, r9, #16\n\t"
  99343. "lsr r7, r7, #16\n\t"
  99344. "mul r6, r7, r6\n\t"
  99345. "lsr r7, r6, #16\n\t"
  99346. "lsl r6, r6, #16\n\t"
  99347. "adds r3, r3, r6\n\t"
  99348. "adcs r4, r4, r7\n\t"
  99349. "adc r5, r5, #0\n\t"
  99350. #else
  99351. "umull r6, r7, r8, r9\n\t"
  99352. "adds r3, r3, r6\n\t"
  99353. "adcs r4, r4, r7\n\t"
  99354. "adc r5, r5, #0\n\t"
  99355. #endif
  99356. /* A[10] * B[2] */
  99357. "ldr r8, [%[a], #40]\n\t"
  99358. "ldr r9, [%[b], #8]\n\t"
  99359. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  99360. "lsl r6, r8, #16\n\t"
  99361. "lsl r7, r9, #16\n\t"
  99362. "lsr r6, r6, #16\n\t"
  99363. "lsr r7, r7, #16\n\t"
  99364. "mul r7, r6, r7\n\t"
  99365. "adds r3, r3, r7\n\t"
  99366. "adcs r4, r4, #0\n\t"
  99367. "adc r5, r5, #0\n\t"
  99368. "lsr r7, r9, #16\n\t"
  99369. "mul r6, r7, r6\n\t"
  99370. "lsr r7, r6, #16\n\t"
  99371. "lsl r6, r6, #16\n\t"
  99372. "adds r3, r3, r6\n\t"
  99373. "adcs r4, r4, r7\n\t"
  99374. "adc r5, r5, #0\n\t"
  99375. "lsr r6, r8, #16\n\t"
  99376. "lsr r7, r9, #16\n\t"
  99377. "mul r7, r6, r7\n\t"
  99378. "adds r4, r4, r7\n\t"
  99379. "adc r5, r5, #0\n\t"
  99380. "lsl r7, r9, #16\n\t"
  99381. "lsr r7, r7, #16\n\t"
  99382. "mul r6, r7, r6\n\t"
  99383. "lsr r7, r6, #16\n\t"
  99384. "lsl r6, r6, #16\n\t"
  99385. "adds r3, r3, r6\n\t"
  99386. "adcs r4, r4, r7\n\t"
  99387. "adc r5, r5, #0\n\t"
  99388. #else
  99389. "umull r6, r7, r8, r9\n\t"
  99390. "adds r3, r3, r6\n\t"
  99391. "adcs r4, r4, r7\n\t"
  99392. "adc r5, r5, #0\n\t"
  99393. #endif
  99394. /* A[9] * B[3] */
  99395. "ldr r8, [%[a], #36]\n\t"
  99396. "ldr r9, [%[b], #12]\n\t"
  99397. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  99398. "lsl r6, r8, #16\n\t"
  99399. "lsl r7, r9, #16\n\t"
  99400. "lsr r6, r6, #16\n\t"
  99401. "lsr r7, r7, #16\n\t"
  99402. "mul r7, r6, r7\n\t"
  99403. "adds r3, r3, r7\n\t"
  99404. "adcs r4, r4, #0\n\t"
  99405. "adc r5, r5, #0\n\t"
  99406. "lsr r7, r9, #16\n\t"
  99407. "mul r6, r7, r6\n\t"
  99408. "lsr r7, r6, #16\n\t"
  99409. "lsl r6, r6, #16\n\t"
  99410. "adds r3, r3, r6\n\t"
  99411. "adcs r4, r4, r7\n\t"
  99412. "adc r5, r5, #0\n\t"
  99413. "lsr r6, r8, #16\n\t"
  99414. "lsr r7, r9, #16\n\t"
  99415. "mul r7, r6, r7\n\t"
  99416. "adds r4, r4, r7\n\t"
  99417. "adc r5, r5, #0\n\t"
  99418. "lsl r7, r9, #16\n\t"
  99419. "lsr r7, r7, #16\n\t"
  99420. "mul r6, r7, r6\n\t"
  99421. "lsr r7, r6, #16\n\t"
  99422. "lsl r6, r6, #16\n\t"
  99423. "adds r3, r3, r6\n\t"
  99424. "adcs r4, r4, r7\n\t"
  99425. "adc r5, r5, #0\n\t"
  99426. #else
  99427. "umull r6, r7, r8, r9\n\t"
  99428. "adds r3, r3, r6\n\t"
  99429. "adcs r4, r4, r7\n\t"
  99430. "adc r5, r5, #0\n\t"
  99431. #endif
  99432. /* A[8] * B[4] */
  99433. "ldr r8, [%[a], #32]\n\t"
  99434. "ldr r9, [%[b], #16]\n\t"
  99435. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  99436. "lsl r6, r8, #16\n\t"
  99437. "lsl r7, r9, #16\n\t"
  99438. "lsr r6, r6, #16\n\t"
  99439. "lsr r7, r7, #16\n\t"
  99440. "mul r7, r6, r7\n\t"
  99441. "adds r3, r3, r7\n\t"
  99442. "adcs r4, r4, #0\n\t"
  99443. "adc r5, r5, #0\n\t"
  99444. "lsr r7, r9, #16\n\t"
  99445. "mul r6, r7, r6\n\t"
  99446. "lsr r7, r6, #16\n\t"
  99447. "lsl r6, r6, #16\n\t"
  99448. "adds r3, r3, r6\n\t"
  99449. "adcs r4, r4, r7\n\t"
  99450. "adc r5, r5, #0\n\t"
  99451. "lsr r6, r8, #16\n\t"
  99452. "lsr r7, r9, #16\n\t"
  99453. "mul r7, r6, r7\n\t"
  99454. "adds r4, r4, r7\n\t"
  99455. "adc r5, r5, #0\n\t"
  99456. "lsl r7, r9, #16\n\t"
  99457. "lsr r7, r7, #16\n\t"
  99458. "mul r6, r7, r6\n\t"
  99459. "lsr r7, r6, #16\n\t"
  99460. "lsl r6, r6, #16\n\t"
  99461. "adds r3, r3, r6\n\t"
  99462. "adcs r4, r4, r7\n\t"
  99463. "adc r5, r5, #0\n\t"
  99464. #else
  99465. "umull r6, r7, r8, r9\n\t"
  99466. "adds r3, r3, r6\n\t"
  99467. "adcs r4, r4, r7\n\t"
  99468. "adc r5, r5, #0\n\t"
  99469. #endif
  99470. /* A[7] * B[5] */
  99471. "ldr r8, [%[a], #28]\n\t"
  99472. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  99473. "lsl r6, r8, #16\n\t"
  99474. "lsl r7, r12, #16\n\t"
  99475. "lsr r6, r6, #16\n\t"
  99476. "lsr r7, r7, #16\n\t"
  99477. "mul r7, r6, r7\n\t"
  99478. "adds r3, r3, r7\n\t"
  99479. "adcs r4, r4, #0\n\t"
  99480. "adc r5, r5, #0\n\t"
  99481. "lsr r7, r12, #16\n\t"
  99482. "mul r6, r7, r6\n\t"
  99483. "lsr r7, r6, #16\n\t"
  99484. "lsl r6, r6, #16\n\t"
  99485. "adds r3, r3, r6\n\t"
  99486. "adcs r4, r4, r7\n\t"
  99487. "adc r5, r5, #0\n\t"
  99488. "lsr r6, r8, #16\n\t"
  99489. "lsr r7, r12, #16\n\t"
  99490. "mul r7, r6, r7\n\t"
  99491. "adds r4, r4, r7\n\t"
  99492. "adc r5, r5, #0\n\t"
  99493. "lsl r7, r12, #16\n\t"
  99494. "lsr r7, r7, #16\n\t"
  99495. "mul r6, r7, r6\n\t"
  99496. "lsr r7, r6, #16\n\t"
  99497. "lsl r6, r6, #16\n\t"
  99498. "adds r3, r3, r6\n\t"
  99499. "adcs r4, r4, r7\n\t"
  99500. "adc r5, r5, #0\n\t"
  99501. #else
  99502. "umull r6, r7, r8, r12\n\t"
  99503. "adds r3, r3, r6\n\t"
  99504. "adcs r4, r4, r7\n\t"
  99505. "adc r5, r5, #0\n\t"
  99506. #endif
  99507. /* A[6] * B[6] */
  99508. "ldr r11, [%[a], #24]\n\t"
  99509. "ldr r12, [%[b], #24]\n\t"
  99510. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  99511. "lsl r6, r11, #16\n\t"
  99512. "lsl r7, r12, #16\n\t"
  99513. "lsr r6, r6, #16\n\t"
  99514. "lsr r7, r7, #16\n\t"
  99515. "mul r7, r6, r7\n\t"
  99516. "adds r3, r3, r7\n\t"
  99517. "adcs r4, r4, #0\n\t"
  99518. "adc r5, r5, #0\n\t"
  99519. "lsr r7, r12, #16\n\t"
  99520. "mul r6, r7, r6\n\t"
  99521. "lsr r7, r6, #16\n\t"
  99522. "lsl r6, r6, #16\n\t"
  99523. "adds r3, r3, r6\n\t"
  99524. "adcs r4, r4, r7\n\t"
  99525. "adc r5, r5, #0\n\t"
  99526. "lsr r6, r11, #16\n\t"
  99527. "lsr r7, r12, #16\n\t"
  99528. "mul r7, r6, r7\n\t"
  99529. "adds r4, r4, r7\n\t"
  99530. "adc r5, r5, #0\n\t"
  99531. "lsl r7, r12, #16\n\t"
  99532. "lsr r7, r7, #16\n\t"
  99533. "mul r6, r7, r6\n\t"
  99534. "lsr r7, r6, #16\n\t"
  99535. "lsl r6, r6, #16\n\t"
  99536. "adds r3, r3, r6\n\t"
  99537. "adcs r4, r4, r7\n\t"
  99538. "adc r5, r5, #0\n\t"
  99539. #else
  99540. "umull r6, r7, r11, r12\n\t"
  99541. "adds r3, r3, r6\n\t"
  99542. "adcs r4, r4, r7\n\t"
  99543. "adc r5, r5, #0\n\t"
  99544. #endif
  99545. /* A[5] * B[7] */
  99546. "ldr r8, [%[a], #20]\n\t"
  99547. "ldr r9, [%[b], #28]\n\t"
  99548. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  99549. "lsl r6, r8, #16\n\t"
  99550. "lsl r7, r9, #16\n\t"
  99551. "lsr r6, r6, #16\n\t"
  99552. "lsr r7, r7, #16\n\t"
  99553. "mul r7, r6, r7\n\t"
  99554. "adds r3, r3, r7\n\t"
  99555. "adcs r4, r4, #0\n\t"
  99556. "adc r5, r5, #0\n\t"
  99557. "lsr r7, r9, #16\n\t"
  99558. "mul r6, r7, r6\n\t"
  99559. "lsr r7, r6, #16\n\t"
  99560. "lsl r6, r6, #16\n\t"
  99561. "adds r3, r3, r6\n\t"
  99562. "adcs r4, r4, r7\n\t"
  99563. "adc r5, r5, #0\n\t"
  99564. "lsr r6, r8, #16\n\t"
  99565. "lsr r7, r9, #16\n\t"
  99566. "mul r7, r6, r7\n\t"
  99567. "adds r4, r4, r7\n\t"
  99568. "adc r5, r5, #0\n\t"
  99569. "lsl r7, r9, #16\n\t"
  99570. "lsr r7, r7, #16\n\t"
  99571. "mul r6, r7, r6\n\t"
  99572. "lsr r7, r6, #16\n\t"
  99573. "lsl r6, r6, #16\n\t"
  99574. "adds r3, r3, r6\n\t"
  99575. "adcs r4, r4, r7\n\t"
  99576. "adc r5, r5, #0\n\t"
  99577. #else
  99578. "umull r6, r7, r8, r9\n\t"
  99579. "adds r3, r3, r6\n\t"
  99580. "adcs r4, r4, r7\n\t"
  99581. "adc r5, r5, #0\n\t"
  99582. #endif
  99583. /* A[4] * B[8] */
  99584. "ldr r8, [%[a], #16]\n\t"
  99585. "ldr r9, [%[b], #32]\n\t"
  99586. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  99587. "lsl r6, r8, #16\n\t"
  99588. "lsl r7, r9, #16\n\t"
  99589. "lsr r6, r6, #16\n\t"
  99590. "lsr r7, r7, #16\n\t"
  99591. "mul r7, r6, r7\n\t"
  99592. "adds r3, r3, r7\n\t"
  99593. "adcs r4, r4, #0\n\t"
  99594. "adc r5, r5, #0\n\t"
  99595. "lsr r7, r9, #16\n\t"
  99596. "mul r6, r7, r6\n\t"
  99597. "lsr r7, r6, #16\n\t"
  99598. "lsl r6, r6, #16\n\t"
  99599. "adds r3, r3, r6\n\t"
  99600. "adcs r4, r4, r7\n\t"
  99601. "adc r5, r5, #0\n\t"
  99602. "lsr r6, r8, #16\n\t"
  99603. "lsr r7, r9, #16\n\t"
  99604. "mul r7, r6, r7\n\t"
  99605. "adds r4, r4, r7\n\t"
  99606. "adc r5, r5, #0\n\t"
  99607. "lsl r7, r9, #16\n\t"
  99608. "lsr r7, r7, #16\n\t"
  99609. "mul r6, r7, r6\n\t"
  99610. "lsr r7, r6, #16\n\t"
  99611. "lsl r6, r6, #16\n\t"
  99612. "adds r3, r3, r6\n\t"
  99613. "adcs r4, r4, r7\n\t"
  99614. "adc r5, r5, #0\n\t"
  99615. #else
  99616. "umull r6, r7, r8, r9\n\t"
  99617. "adds r3, r3, r6\n\t"
  99618. "adcs r4, r4, r7\n\t"
  99619. "adc r5, r5, #0\n\t"
  99620. #endif
  99621. /* A[3] * B[9] */
  99622. "ldr r8, [%[a], #12]\n\t"
  99623. "ldr r9, [%[b], #36]\n\t"
  99624. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  99625. "lsl r6, r8, #16\n\t"
  99626. "lsl r7, r9, #16\n\t"
  99627. "lsr r6, r6, #16\n\t"
  99628. "lsr r7, r7, #16\n\t"
  99629. "mul r7, r6, r7\n\t"
  99630. "adds r3, r3, r7\n\t"
  99631. "adcs r4, r4, #0\n\t"
  99632. "adc r5, r5, #0\n\t"
  99633. "lsr r7, r9, #16\n\t"
  99634. "mul r6, r7, r6\n\t"
  99635. "lsr r7, r6, #16\n\t"
  99636. "lsl r6, r6, #16\n\t"
  99637. "adds r3, r3, r6\n\t"
  99638. "adcs r4, r4, r7\n\t"
  99639. "adc r5, r5, #0\n\t"
  99640. "lsr r6, r8, #16\n\t"
  99641. "lsr r7, r9, #16\n\t"
  99642. "mul r7, r6, r7\n\t"
  99643. "adds r4, r4, r7\n\t"
  99644. "adc r5, r5, #0\n\t"
  99645. "lsl r7, r9, #16\n\t"
  99646. "lsr r7, r7, #16\n\t"
  99647. "mul r6, r7, r6\n\t"
  99648. "lsr r7, r6, #16\n\t"
  99649. "lsl r6, r6, #16\n\t"
  99650. "adds r3, r3, r6\n\t"
  99651. "adcs r4, r4, r7\n\t"
  99652. "adc r5, r5, #0\n\t"
  99653. #else
  99654. "umull r6, r7, r8, r9\n\t"
  99655. "adds r3, r3, r6\n\t"
  99656. "adcs r4, r4, r7\n\t"
  99657. "adc r5, r5, #0\n\t"
  99658. #endif
  99659. /* A[2] * B[10] */
  99660. "ldr r8, [%[a], #8]\n\t"
  99661. "ldr r9, [%[b], #40]\n\t"
  99662. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  99663. "lsl r6, r8, #16\n\t"
  99664. "lsl r7, r9, #16\n\t"
  99665. "lsr r6, r6, #16\n\t"
  99666. "lsr r7, r7, #16\n\t"
  99667. "mul r7, r6, r7\n\t"
  99668. "adds r3, r3, r7\n\t"
  99669. "adcs r4, r4, #0\n\t"
  99670. "adc r5, r5, #0\n\t"
  99671. "lsr r7, r9, #16\n\t"
  99672. "mul r6, r7, r6\n\t"
  99673. "lsr r7, r6, #16\n\t"
  99674. "lsl r6, r6, #16\n\t"
  99675. "adds r3, r3, r6\n\t"
  99676. "adcs r4, r4, r7\n\t"
  99677. "adc r5, r5, #0\n\t"
  99678. "lsr r6, r8, #16\n\t"
  99679. "lsr r7, r9, #16\n\t"
  99680. "mul r7, r6, r7\n\t"
  99681. "adds r4, r4, r7\n\t"
  99682. "adc r5, r5, #0\n\t"
  99683. "lsl r7, r9, #16\n\t"
  99684. "lsr r7, r7, #16\n\t"
  99685. "mul r6, r7, r6\n\t"
  99686. "lsr r7, r6, #16\n\t"
  99687. "lsl r6, r6, #16\n\t"
  99688. "adds r3, r3, r6\n\t"
  99689. "adcs r4, r4, r7\n\t"
  99690. "adc r5, r5, #0\n\t"
  99691. #else
  99692. "umull r6, r7, r8, r9\n\t"
  99693. "adds r3, r3, r6\n\t"
  99694. "adcs r4, r4, r7\n\t"
  99695. "adc r5, r5, #0\n\t"
  99696. #endif
  99697. /* A[1] * B[11] */
  99698. "ldr r8, [%[a], #4]\n\t"
  99699. "ldr r9, [%[b], #44]\n\t"
  99700. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  99701. "lsl r6, r8, #16\n\t"
  99702. "lsl r7, r9, #16\n\t"
  99703. "lsr r6, r6, #16\n\t"
  99704. "lsr r7, r7, #16\n\t"
  99705. "mul r7, r6, r7\n\t"
  99706. "adds r3, r3, r7\n\t"
  99707. "adcs r4, r4, #0\n\t"
  99708. "adc r5, r5, #0\n\t"
  99709. "lsr r7, r9, #16\n\t"
  99710. "mul r6, r7, r6\n\t"
  99711. "lsr r7, r6, #16\n\t"
  99712. "lsl r6, r6, #16\n\t"
  99713. "adds r3, r3, r6\n\t"
  99714. "adcs r4, r4, r7\n\t"
  99715. "adc r5, r5, #0\n\t"
  99716. "lsr r6, r8, #16\n\t"
  99717. "lsr r7, r9, #16\n\t"
  99718. "mul r7, r6, r7\n\t"
  99719. "adds r4, r4, r7\n\t"
  99720. "adc r5, r5, #0\n\t"
  99721. "lsl r7, r9, #16\n\t"
  99722. "lsr r7, r7, #16\n\t"
  99723. "mul r6, r7, r6\n\t"
  99724. "lsr r7, r6, #16\n\t"
  99725. "lsl r6, r6, #16\n\t"
  99726. "adds r3, r3, r6\n\t"
  99727. "adcs r4, r4, r7\n\t"
  99728. "adc r5, r5, #0\n\t"
  99729. #else
  99730. "umull r6, r7, r8, r9\n\t"
  99731. "adds r3, r3, r6\n\t"
  99732. "adcs r4, r4, r7\n\t"
  99733. "adc r5, r5, #0\n\t"
  99734. #endif
  99735. /* A[0] * B[12] */
  99736. "ldr r8, [%[a]]\n\t"
  99737. "ldr r9, [%[b], #48]\n\t"
  99738. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  99739. "lsl r6, r8, #16\n\t"
  99740. "lsl r7, r9, #16\n\t"
  99741. "lsr r6, r6, #16\n\t"
  99742. "lsr r7, r7, #16\n\t"
  99743. "mul r7, r6, r7\n\t"
  99744. "adds r3, r3, r7\n\t"
  99745. "adcs r4, r4, #0\n\t"
  99746. "adc r5, r5, #0\n\t"
  99747. "lsr r7, r9, #16\n\t"
  99748. "mul r6, r7, r6\n\t"
  99749. "lsr r7, r6, #16\n\t"
  99750. "lsl r6, r6, #16\n\t"
  99751. "adds r3, r3, r6\n\t"
  99752. "adcs r4, r4, r7\n\t"
  99753. "adc r5, r5, #0\n\t"
  99754. "lsr r6, r8, #16\n\t"
  99755. "lsr r7, r9, #16\n\t"
  99756. "mul r7, r6, r7\n\t"
  99757. "adds r4, r4, r7\n\t"
  99758. "adc r5, r5, #0\n\t"
  99759. "lsl r7, r9, #16\n\t"
  99760. "lsr r7, r7, #16\n\t"
  99761. "mul r6, r7, r6\n\t"
  99762. "lsr r7, r6, #16\n\t"
  99763. "lsl r6, r6, #16\n\t"
  99764. "adds r3, r3, r6\n\t"
  99765. "adcs r4, r4, r7\n\t"
  99766. "adc r5, r5, #0\n\t"
  99767. #else
  99768. "umull r6, r7, r8, r9\n\t"
  99769. "adds r3, r3, r6\n\t"
  99770. "adcs r4, r4, r7\n\t"
  99771. "adc r5, r5, #0\n\t"
  99772. #endif
  99773. "str r3, [sp, #48]\n\t"
  99774. /* A[0] * B[13] */
  99775. "ldr r9, [%[b], #52]\n\t"
  99776. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  99777. "lsl r6, r8, #16\n\t"
  99778. "lsl r7, r9, #16\n\t"
  99779. "lsr r6, r6, #16\n\t"
  99780. "lsr r7, r7, #16\n\t"
  99781. "mul r7, r6, r7\n\t"
  99782. "adds r4, r4, r7\n\t"
  99783. "adcs r5, r5, #0\n\t"
  99784. "mov r3, #0\n\t"
  99785. "adc r3, r3, #0\n\t"
  99786. "lsr r7, r9, #16\n\t"
  99787. "mul r6, r7, r6\n\t"
  99788. "lsr r7, r6, #16\n\t"
  99789. "lsl r6, r6, #16\n\t"
  99790. "adds r4, r4, r6\n\t"
  99791. "adcs r5, r5, r7\n\t"
  99792. "adc r3, r3, #0\n\t"
  99793. "lsr r6, r8, #16\n\t"
  99794. "lsr r7, r9, #16\n\t"
  99795. "mul r7, r6, r7\n\t"
  99796. "adds r5, r5, r7\n\t"
  99797. "adc r3, r3, #0\n\t"
  99798. "lsl r7, r9, #16\n\t"
  99799. "lsr r7, r7, #16\n\t"
  99800. "mul r6, r7, r6\n\t"
  99801. "lsr r7, r6, #16\n\t"
  99802. "lsl r6, r6, #16\n\t"
  99803. "adds r4, r4, r6\n\t"
  99804. "adcs r5, r5, r7\n\t"
  99805. "adc r3, r3, #0\n\t"
  99806. #else
  99807. "umull r6, r7, r8, r9\n\t"
  99808. "adds r4, r4, r6\n\t"
  99809. "adcs r5, r5, r7\n\t"
  99810. "mov r3, #0\n\t"
  99811. "adc r3, r3, #0\n\t"
  99812. #endif
  99813. /* A[1] * B[12] */
  99814. "ldr r8, [%[a], #4]\n\t"
  99815. "ldr r9, [%[b], #48]\n\t"
  99816. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  99817. "lsl r6, r8, #16\n\t"
  99818. "lsl r7, r9, #16\n\t"
  99819. "lsr r6, r6, #16\n\t"
  99820. "lsr r7, r7, #16\n\t"
  99821. "mul r7, r6, r7\n\t"
  99822. "adds r4, r4, r7\n\t"
  99823. "adcs r5, r5, #0\n\t"
  99824. "adc r3, r3, #0\n\t"
  99825. "lsr r7, r9, #16\n\t"
  99826. "mul r6, r7, r6\n\t"
  99827. "lsr r7, r6, #16\n\t"
  99828. "lsl r6, r6, #16\n\t"
  99829. "adds r4, r4, r6\n\t"
  99830. "adcs r5, r5, r7\n\t"
  99831. "adc r3, r3, #0\n\t"
  99832. "lsr r6, r8, #16\n\t"
  99833. "lsr r7, r9, #16\n\t"
  99834. "mul r7, r6, r7\n\t"
  99835. "adds r5, r5, r7\n\t"
  99836. "adc r3, r3, #0\n\t"
  99837. "lsl r7, r9, #16\n\t"
  99838. "lsr r7, r7, #16\n\t"
  99839. "mul r6, r7, r6\n\t"
  99840. "lsr r7, r6, #16\n\t"
  99841. "lsl r6, r6, #16\n\t"
  99842. "adds r4, r4, r6\n\t"
  99843. "adcs r5, r5, r7\n\t"
  99844. "adc r3, r3, #0\n\t"
  99845. #else
  99846. "umull r6, r7, r8, r9\n\t"
  99847. "adds r4, r4, r6\n\t"
  99848. "adcs r5, r5, r7\n\t"
  99849. "adc r3, r3, #0\n\t"
  99850. #endif
  99851. /* A[2] * B[11] */
  99852. "ldr r8, [%[a], #8]\n\t"
  99853. "ldr r9, [%[b], #44]\n\t"
  99854. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  99855. "lsl r6, r8, #16\n\t"
  99856. "lsl r7, r9, #16\n\t"
  99857. "lsr r6, r6, #16\n\t"
  99858. "lsr r7, r7, #16\n\t"
  99859. "mul r7, r6, r7\n\t"
  99860. "adds r4, r4, r7\n\t"
  99861. "adcs r5, r5, #0\n\t"
  99862. "adc r3, r3, #0\n\t"
  99863. "lsr r7, r9, #16\n\t"
  99864. "mul r6, r7, r6\n\t"
  99865. "lsr r7, r6, #16\n\t"
  99866. "lsl r6, r6, #16\n\t"
  99867. "adds r4, r4, r6\n\t"
  99868. "adcs r5, r5, r7\n\t"
  99869. "adc r3, r3, #0\n\t"
  99870. "lsr r6, r8, #16\n\t"
  99871. "lsr r7, r9, #16\n\t"
  99872. "mul r7, r6, r7\n\t"
  99873. "adds r5, r5, r7\n\t"
  99874. "adc r3, r3, #0\n\t"
  99875. "lsl r7, r9, #16\n\t"
  99876. "lsr r7, r7, #16\n\t"
  99877. "mul r6, r7, r6\n\t"
  99878. "lsr r7, r6, #16\n\t"
  99879. "lsl r6, r6, #16\n\t"
  99880. "adds r4, r4, r6\n\t"
  99881. "adcs r5, r5, r7\n\t"
  99882. "adc r3, r3, #0\n\t"
  99883. #else
  99884. "umull r6, r7, r8, r9\n\t"
  99885. "adds r4, r4, r6\n\t"
  99886. "adcs r5, r5, r7\n\t"
  99887. "adc r3, r3, #0\n\t"
  99888. #endif
  99889. /* A[3] * B[10] */
  99890. "ldr r8, [%[a], #12]\n\t"
  99891. "ldr r9, [%[b], #40]\n\t"
  99892. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  99893. "lsl r6, r8, #16\n\t"
  99894. "lsl r7, r9, #16\n\t"
  99895. "lsr r6, r6, #16\n\t"
  99896. "lsr r7, r7, #16\n\t"
  99897. "mul r7, r6, r7\n\t"
  99898. "adds r4, r4, r7\n\t"
  99899. "adcs r5, r5, #0\n\t"
  99900. "adc r3, r3, #0\n\t"
  99901. "lsr r7, r9, #16\n\t"
  99902. "mul r6, r7, r6\n\t"
  99903. "lsr r7, r6, #16\n\t"
  99904. "lsl r6, r6, #16\n\t"
  99905. "adds r4, r4, r6\n\t"
  99906. "adcs r5, r5, r7\n\t"
  99907. "adc r3, r3, #0\n\t"
  99908. "lsr r6, r8, #16\n\t"
  99909. "lsr r7, r9, #16\n\t"
  99910. "mul r7, r6, r7\n\t"
  99911. "adds r5, r5, r7\n\t"
  99912. "adc r3, r3, #0\n\t"
  99913. "lsl r7, r9, #16\n\t"
  99914. "lsr r7, r7, #16\n\t"
  99915. "mul r6, r7, r6\n\t"
  99916. "lsr r7, r6, #16\n\t"
  99917. "lsl r6, r6, #16\n\t"
  99918. "adds r4, r4, r6\n\t"
  99919. "adcs r5, r5, r7\n\t"
  99920. "adc r3, r3, #0\n\t"
  99921. #else
  99922. "umull r6, r7, r8, r9\n\t"
  99923. "adds r4, r4, r6\n\t"
  99924. "adcs r5, r5, r7\n\t"
  99925. "adc r3, r3, #0\n\t"
  99926. #endif
  99927. /* A[4] * B[9] */
  99928. "ldr r8, [%[a], #16]\n\t"
  99929. "ldr r9, [%[b], #36]\n\t"
  99930. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  99931. "lsl r6, r8, #16\n\t"
  99932. "lsl r7, r9, #16\n\t"
  99933. "lsr r6, r6, #16\n\t"
  99934. "lsr r7, r7, #16\n\t"
  99935. "mul r7, r6, r7\n\t"
  99936. "adds r4, r4, r7\n\t"
  99937. "adcs r5, r5, #0\n\t"
  99938. "adc r3, r3, #0\n\t"
  99939. "lsr r7, r9, #16\n\t"
  99940. "mul r6, r7, r6\n\t"
  99941. "lsr r7, r6, #16\n\t"
  99942. "lsl r6, r6, #16\n\t"
  99943. "adds r4, r4, r6\n\t"
  99944. "adcs r5, r5, r7\n\t"
  99945. "adc r3, r3, #0\n\t"
  99946. "lsr r6, r8, #16\n\t"
  99947. "lsr r7, r9, #16\n\t"
  99948. "mul r7, r6, r7\n\t"
  99949. "adds r5, r5, r7\n\t"
  99950. "adc r3, r3, #0\n\t"
  99951. "lsl r7, r9, #16\n\t"
  99952. "lsr r7, r7, #16\n\t"
  99953. "mul r6, r7, r6\n\t"
  99954. "lsr r7, r6, #16\n\t"
  99955. "lsl r6, r6, #16\n\t"
  99956. "adds r4, r4, r6\n\t"
  99957. "adcs r5, r5, r7\n\t"
  99958. "adc r3, r3, #0\n\t"
  99959. #else
  99960. "umull r6, r7, r8, r9\n\t"
  99961. "adds r4, r4, r6\n\t"
  99962. "adcs r5, r5, r7\n\t"
  99963. "adc r3, r3, #0\n\t"
  99964. #endif
  99965. /* A[5] * B[8] */
  99966. "ldr r8, [%[a], #20]\n\t"
  99967. "ldr r9, [%[b], #32]\n\t"
  99968. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  99969. "lsl r6, r8, #16\n\t"
  99970. "lsl r7, r9, #16\n\t"
  99971. "lsr r6, r6, #16\n\t"
  99972. "lsr r7, r7, #16\n\t"
  99973. "mul r7, r6, r7\n\t"
  99974. "adds r4, r4, r7\n\t"
  99975. "adcs r5, r5, #0\n\t"
  99976. "adc r3, r3, #0\n\t"
  99977. "lsr r7, r9, #16\n\t"
  99978. "mul r6, r7, r6\n\t"
  99979. "lsr r7, r6, #16\n\t"
  99980. "lsl r6, r6, #16\n\t"
  99981. "adds r4, r4, r6\n\t"
  99982. "adcs r5, r5, r7\n\t"
  99983. "adc r3, r3, #0\n\t"
  99984. "lsr r6, r8, #16\n\t"
  99985. "lsr r7, r9, #16\n\t"
  99986. "mul r7, r6, r7\n\t"
  99987. "adds r5, r5, r7\n\t"
  99988. "adc r3, r3, #0\n\t"
  99989. "lsl r7, r9, #16\n\t"
  99990. "lsr r7, r7, #16\n\t"
  99991. "mul r6, r7, r6\n\t"
  99992. "lsr r7, r6, #16\n\t"
  99993. "lsl r6, r6, #16\n\t"
  99994. "adds r4, r4, r6\n\t"
  99995. "adcs r5, r5, r7\n\t"
  99996. "adc r3, r3, #0\n\t"
  99997. #else
  99998. "umull r6, r7, r8, r9\n\t"
  99999. "adds r4, r4, r6\n\t"
  100000. "adcs r5, r5, r7\n\t"
  100001. "adc r3, r3, #0\n\t"
  100002. #endif
  100003. /* A[6] * B[7] */
  100004. "ldr r9, [%[b], #28]\n\t"
  100005. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  100006. "lsl r6, r11, #16\n\t"
  100007. "lsl r7, r9, #16\n\t"
  100008. "lsr r6, r6, #16\n\t"
  100009. "lsr r7, r7, #16\n\t"
  100010. "mul r7, r6, r7\n\t"
  100011. "adds r4, r4, r7\n\t"
  100012. "adcs r5, r5, #0\n\t"
  100013. "adc r3, r3, #0\n\t"
  100014. "lsr r7, r9, #16\n\t"
  100015. "mul r6, r7, r6\n\t"
  100016. "lsr r7, r6, #16\n\t"
  100017. "lsl r6, r6, #16\n\t"
  100018. "adds r4, r4, r6\n\t"
  100019. "adcs r5, r5, r7\n\t"
  100020. "adc r3, r3, #0\n\t"
  100021. "lsr r6, r11, #16\n\t"
  100022. "lsr r7, r9, #16\n\t"
  100023. "mul r7, r6, r7\n\t"
  100024. "adds r5, r5, r7\n\t"
  100025. "adc r3, r3, #0\n\t"
  100026. "lsl r7, r9, #16\n\t"
  100027. "lsr r7, r7, #16\n\t"
  100028. "mul r6, r7, r6\n\t"
  100029. "lsr r7, r6, #16\n\t"
  100030. "lsl r6, r6, #16\n\t"
  100031. "adds r4, r4, r6\n\t"
  100032. "adcs r5, r5, r7\n\t"
  100033. "adc r3, r3, #0\n\t"
  100034. #else
  100035. "umull r6, r7, r11, r9\n\t"
  100036. "adds r4, r4, r6\n\t"
  100037. "adcs r5, r5, r7\n\t"
  100038. "adc r3, r3, #0\n\t"
  100039. #endif
  100040. /* A[7] * B[6] */
  100041. "ldr r8, [%[a], #28]\n\t"
  100042. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  100043. "lsl r6, r8, #16\n\t"
  100044. "lsl r7, r12, #16\n\t"
  100045. "lsr r6, r6, #16\n\t"
  100046. "lsr r7, r7, #16\n\t"
  100047. "mul r7, r6, r7\n\t"
  100048. "adds r4, r4, r7\n\t"
  100049. "adcs r5, r5, #0\n\t"
  100050. "adc r3, r3, #0\n\t"
  100051. "lsr r7, r12, #16\n\t"
  100052. "mul r6, r7, r6\n\t"
  100053. "lsr r7, r6, #16\n\t"
  100054. "lsl r6, r6, #16\n\t"
  100055. "adds r4, r4, r6\n\t"
  100056. "adcs r5, r5, r7\n\t"
  100057. "adc r3, r3, #0\n\t"
  100058. "lsr r6, r8, #16\n\t"
  100059. "lsr r7, r12, #16\n\t"
  100060. "mul r7, r6, r7\n\t"
  100061. "adds r5, r5, r7\n\t"
  100062. "adc r3, r3, #0\n\t"
  100063. "lsl r7, r12, #16\n\t"
  100064. "lsr r7, r7, #16\n\t"
  100065. "mul r6, r7, r6\n\t"
  100066. "lsr r7, r6, #16\n\t"
  100067. "lsl r6, r6, #16\n\t"
  100068. "adds r4, r4, r6\n\t"
  100069. "adcs r5, r5, r7\n\t"
  100070. "adc r3, r3, #0\n\t"
  100071. #else
  100072. "umull r6, r7, r8, r12\n\t"
  100073. "adds r4, r4, r6\n\t"
  100074. "adcs r5, r5, r7\n\t"
  100075. "adc r3, r3, #0\n\t"
  100076. #endif
  100077. /* A[8] * B[5] */
  100078. "ldr r8, [%[a], #32]\n\t"
  100079. "ldr r9, [%[b], #20]\n\t"
  100080. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  100081. "lsl r6, r8, #16\n\t"
  100082. "lsl r7, r9, #16\n\t"
  100083. "lsr r6, r6, #16\n\t"
  100084. "lsr r7, r7, #16\n\t"
  100085. "mul r7, r6, r7\n\t"
  100086. "adds r4, r4, r7\n\t"
  100087. "adcs r5, r5, #0\n\t"
  100088. "adc r3, r3, #0\n\t"
  100089. "lsr r7, r9, #16\n\t"
  100090. "mul r6, r7, r6\n\t"
  100091. "lsr r7, r6, #16\n\t"
  100092. "lsl r6, r6, #16\n\t"
  100093. "adds r4, r4, r6\n\t"
  100094. "adcs r5, r5, r7\n\t"
  100095. "adc r3, r3, #0\n\t"
  100096. "lsr r6, r8, #16\n\t"
  100097. "lsr r7, r9, #16\n\t"
  100098. "mul r7, r6, r7\n\t"
  100099. "adds r5, r5, r7\n\t"
  100100. "adc r3, r3, #0\n\t"
  100101. "lsl r7, r9, #16\n\t"
  100102. "lsr r7, r7, #16\n\t"
  100103. "mul r6, r7, r6\n\t"
  100104. "lsr r7, r6, #16\n\t"
  100105. "lsl r6, r6, #16\n\t"
  100106. "adds r4, r4, r6\n\t"
  100107. "adcs r5, r5, r7\n\t"
  100108. "adc r3, r3, #0\n\t"
  100109. #else
  100110. "umull r6, r7, r8, r9\n\t"
  100111. "adds r4, r4, r6\n\t"
  100112. "adcs r5, r5, r7\n\t"
  100113. "adc r3, r3, #0\n\t"
  100114. #endif
  100115. /* A[9] * B[4] */
  100116. "ldr r8, [%[a], #36]\n\t"
  100117. "ldr r9, [%[b], #16]\n\t"
  100118. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  100119. "lsl r6, r8, #16\n\t"
  100120. "lsl r7, r9, #16\n\t"
  100121. "lsr r6, r6, #16\n\t"
  100122. "lsr r7, r7, #16\n\t"
  100123. "mul r7, r6, r7\n\t"
  100124. "adds r4, r4, r7\n\t"
  100125. "adcs r5, r5, #0\n\t"
  100126. "adc r3, r3, #0\n\t"
  100127. "lsr r7, r9, #16\n\t"
  100128. "mul r6, r7, r6\n\t"
  100129. "lsr r7, r6, #16\n\t"
  100130. "lsl r6, r6, #16\n\t"
  100131. "adds r4, r4, r6\n\t"
  100132. "adcs r5, r5, r7\n\t"
  100133. "adc r3, r3, #0\n\t"
  100134. "lsr r6, r8, #16\n\t"
  100135. "lsr r7, r9, #16\n\t"
  100136. "mul r7, r6, r7\n\t"
  100137. "adds r5, r5, r7\n\t"
  100138. "adc r3, r3, #0\n\t"
  100139. "lsl r7, r9, #16\n\t"
  100140. "lsr r7, r7, #16\n\t"
  100141. "mul r6, r7, r6\n\t"
  100142. "lsr r7, r6, #16\n\t"
  100143. "lsl r6, r6, #16\n\t"
  100144. "adds r4, r4, r6\n\t"
  100145. "adcs r5, r5, r7\n\t"
  100146. "adc r3, r3, #0\n\t"
  100147. #else
  100148. "umull r6, r7, r8, r9\n\t"
  100149. "adds r4, r4, r6\n\t"
  100150. "adcs r5, r5, r7\n\t"
  100151. "adc r3, r3, #0\n\t"
  100152. #endif
  100153. /* A[10] * B[3] */
  100154. "ldr r8, [%[a], #40]\n\t"
  100155. "ldr r9, [%[b], #12]\n\t"
  100156. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  100157. "lsl r6, r8, #16\n\t"
  100158. "lsl r7, r9, #16\n\t"
  100159. "lsr r6, r6, #16\n\t"
  100160. "lsr r7, r7, #16\n\t"
  100161. "mul r7, r6, r7\n\t"
  100162. "adds r4, r4, r7\n\t"
  100163. "adcs r5, r5, #0\n\t"
  100164. "adc r3, r3, #0\n\t"
  100165. "lsr r7, r9, #16\n\t"
  100166. "mul r6, r7, r6\n\t"
  100167. "lsr r7, r6, #16\n\t"
  100168. "lsl r6, r6, #16\n\t"
  100169. "adds r4, r4, r6\n\t"
  100170. "adcs r5, r5, r7\n\t"
  100171. "adc r3, r3, #0\n\t"
  100172. "lsr r6, r8, #16\n\t"
  100173. "lsr r7, r9, #16\n\t"
  100174. "mul r7, r6, r7\n\t"
  100175. "adds r5, r5, r7\n\t"
  100176. "adc r3, r3, #0\n\t"
  100177. "lsl r7, r9, #16\n\t"
  100178. "lsr r7, r7, #16\n\t"
  100179. "mul r6, r7, r6\n\t"
  100180. "lsr r7, r6, #16\n\t"
  100181. "lsl r6, r6, #16\n\t"
  100182. "adds r4, r4, r6\n\t"
  100183. "adcs r5, r5, r7\n\t"
  100184. "adc r3, r3, #0\n\t"
  100185. #else
  100186. "umull r6, r7, r8, r9\n\t"
  100187. "adds r4, r4, r6\n\t"
  100188. "adcs r5, r5, r7\n\t"
  100189. "adc r3, r3, #0\n\t"
  100190. #endif
  100191. /* A[11] * B[2] */
  100192. "ldr r8, [%[a], #44]\n\t"
  100193. "ldr r9, [%[b], #8]\n\t"
  100194. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  100195. "lsl r6, r8, #16\n\t"
  100196. "lsl r7, r9, #16\n\t"
  100197. "lsr r6, r6, #16\n\t"
  100198. "lsr r7, r7, #16\n\t"
  100199. "mul r7, r6, r7\n\t"
  100200. "adds r4, r4, r7\n\t"
  100201. "adcs r5, r5, #0\n\t"
  100202. "adc r3, r3, #0\n\t"
  100203. "lsr r7, r9, #16\n\t"
  100204. "mul r6, r7, r6\n\t"
  100205. "lsr r7, r6, #16\n\t"
  100206. "lsl r6, r6, #16\n\t"
  100207. "adds r4, r4, r6\n\t"
  100208. "adcs r5, r5, r7\n\t"
  100209. "adc r3, r3, #0\n\t"
  100210. "lsr r6, r8, #16\n\t"
  100211. "lsr r7, r9, #16\n\t"
  100212. "mul r7, r6, r7\n\t"
  100213. "adds r5, r5, r7\n\t"
  100214. "adc r3, r3, #0\n\t"
  100215. "lsl r7, r9, #16\n\t"
  100216. "lsr r7, r7, #16\n\t"
  100217. "mul r6, r7, r6\n\t"
  100218. "lsr r7, r6, #16\n\t"
  100219. "lsl r6, r6, #16\n\t"
  100220. "adds r4, r4, r6\n\t"
  100221. "adcs r5, r5, r7\n\t"
  100222. "adc r3, r3, #0\n\t"
  100223. #else
  100224. "umull r6, r7, r8, r9\n\t"
  100225. "adds r4, r4, r6\n\t"
  100226. "adcs r5, r5, r7\n\t"
  100227. "adc r3, r3, #0\n\t"
  100228. #endif
  100229. /* A[12] * B[1] */
  100230. "ldr r8, [%[a], #48]\n\t"
  100231. "ldr r9, [%[b], #4]\n\t"
  100232. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  100233. "lsl r6, r8, #16\n\t"
  100234. "lsl r7, r9, #16\n\t"
  100235. "lsr r6, r6, #16\n\t"
  100236. "lsr r7, r7, #16\n\t"
  100237. "mul r7, r6, r7\n\t"
  100238. "adds r4, r4, r7\n\t"
  100239. "adcs r5, r5, #0\n\t"
  100240. "adc r3, r3, #0\n\t"
  100241. "lsr r7, r9, #16\n\t"
  100242. "mul r6, r7, r6\n\t"
  100243. "lsr r7, r6, #16\n\t"
  100244. "lsl r6, r6, #16\n\t"
  100245. "adds r4, r4, r6\n\t"
  100246. "adcs r5, r5, r7\n\t"
  100247. "adc r3, r3, #0\n\t"
  100248. "lsr r6, r8, #16\n\t"
  100249. "lsr r7, r9, #16\n\t"
  100250. "mul r7, r6, r7\n\t"
  100251. "adds r5, r5, r7\n\t"
  100252. "adc r3, r3, #0\n\t"
  100253. "lsl r7, r9, #16\n\t"
  100254. "lsr r7, r7, #16\n\t"
  100255. "mul r6, r7, r6\n\t"
  100256. "lsr r7, r6, #16\n\t"
  100257. "lsl r6, r6, #16\n\t"
  100258. "adds r4, r4, r6\n\t"
  100259. "adcs r5, r5, r7\n\t"
  100260. "adc r3, r3, #0\n\t"
  100261. #else
  100262. "umull r6, r7, r8, r9\n\t"
  100263. "adds r4, r4, r6\n\t"
  100264. "adcs r5, r5, r7\n\t"
  100265. "adc r3, r3, #0\n\t"
  100266. #endif
  100267. /* A[13] * B[0] */
  100268. "ldr r8, [%[a], #52]\n\t"
  100269. "ldr r9, [%[b]]\n\t"
  100270. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  100271. "lsl r6, r8, #16\n\t"
  100272. "lsl r7, r9, #16\n\t"
  100273. "lsr r6, r6, #16\n\t"
  100274. "lsr r7, r7, #16\n\t"
  100275. "mul r7, r6, r7\n\t"
  100276. "adds r4, r4, r7\n\t"
  100277. "adcs r5, r5, #0\n\t"
  100278. "adc r3, r3, #0\n\t"
  100279. "lsr r7, r9, #16\n\t"
  100280. "mul r6, r7, r6\n\t"
  100281. "lsr r7, r6, #16\n\t"
  100282. "lsl r6, r6, #16\n\t"
  100283. "adds r4, r4, r6\n\t"
  100284. "adcs r5, r5, r7\n\t"
  100285. "adc r3, r3, #0\n\t"
  100286. "lsr r6, r8, #16\n\t"
  100287. "lsr r7, r9, #16\n\t"
  100288. "mul r7, r6, r7\n\t"
  100289. "adds r5, r5, r7\n\t"
  100290. "adc r3, r3, #0\n\t"
  100291. "lsl r7, r9, #16\n\t"
  100292. "lsr r7, r7, #16\n\t"
  100293. "mul r6, r7, r6\n\t"
  100294. "lsr r7, r6, #16\n\t"
  100295. "lsl r6, r6, #16\n\t"
  100296. "adds r4, r4, r6\n\t"
  100297. "adcs r5, r5, r7\n\t"
  100298. "adc r3, r3, #0\n\t"
  100299. #else
  100300. "umull r6, r7, r8, r9\n\t"
  100301. "adds r4, r4, r6\n\t"
  100302. "adcs r5, r5, r7\n\t"
  100303. "adc r3, r3, #0\n\t"
  100304. #endif
  100305. "str r4, [sp, #52]\n\t"
  100306. /* A[14] * B[0] */
  100307. "ldr r8, [%[a], #56]\n\t"
  100308. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  100309. "lsl r6, r8, #16\n\t"
  100310. "lsl r7, r9, #16\n\t"
  100311. "lsr r6, r6, #16\n\t"
  100312. "lsr r7, r7, #16\n\t"
  100313. "mul r7, r6, r7\n\t"
  100314. "adds r5, r5, r7\n\t"
  100315. "adcs r3, r3, #0\n\t"
  100316. "mov r4, #0\n\t"
  100317. "adc r4, r4, #0\n\t"
  100318. "lsr r7, r9, #16\n\t"
  100319. "mul r6, r7, r6\n\t"
  100320. "lsr r7, r6, #16\n\t"
  100321. "lsl r6, r6, #16\n\t"
  100322. "adds r5, r5, r6\n\t"
  100323. "adcs r3, r3, r7\n\t"
  100324. "adc r4, r4, #0\n\t"
  100325. "lsr r6, r8, #16\n\t"
  100326. "lsr r7, r9, #16\n\t"
  100327. "mul r7, r6, r7\n\t"
  100328. "adds r3, r3, r7\n\t"
  100329. "adc r4, r4, #0\n\t"
  100330. "lsl r7, r9, #16\n\t"
  100331. "lsr r7, r7, #16\n\t"
  100332. "mul r6, r7, r6\n\t"
  100333. "lsr r7, r6, #16\n\t"
  100334. "lsl r6, r6, #16\n\t"
  100335. "adds r5, r5, r6\n\t"
  100336. "adcs r3, r3, r7\n\t"
  100337. "adc r4, r4, #0\n\t"
  100338. #else
  100339. "umull r6, r7, r8, r9\n\t"
  100340. "adds r5, r5, r6\n\t"
  100341. "adcs r3, r3, r7\n\t"
  100342. "mov r4, #0\n\t"
  100343. "adc r4, r4, #0\n\t"
  100344. #endif
  100345. /* A[13] * B[1] */
  100346. "ldr r8, [%[a], #52]\n\t"
  100347. "ldr r9, [%[b], #4]\n\t"
  100348. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  100349. "lsl r6, r8, #16\n\t"
  100350. "lsl r7, r9, #16\n\t"
  100351. "lsr r6, r6, #16\n\t"
  100352. "lsr r7, r7, #16\n\t"
  100353. "mul r7, r6, r7\n\t"
  100354. "adds r5, r5, r7\n\t"
  100355. "adcs r3, r3, #0\n\t"
  100356. "adc r4, r4, #0\n\t"
  100357. "lsr r7, r9, #16\n\t"
  100358. "mul r6, r7, r6\n\t"
  100359. "lsr r7, r6, #16\n\t"
  100360. "lsl r6, r6, #16\n\t"
  100361. "adds r5, r5, r6\n\t"
  100362. "adcs r3, r3, r7\n\t"
  100363. "adc r4, r4, #0\n\t"
  100364. "lsr r6, r8, #16\n\t"
  100365. "lsr r7, r9, #16\n\t"
  100366. "mul r7, r6, r7\n\t"
  100367. "adds r3, r3, r7\n\t"
  100368. "adc r4, r4, #0\n\t"
  100369. "lsl r7, r9, #16\n\t"
  100370. "lsr r7, r7, #16\n\t"
  100371. "mul r6, r7, r6\n\t"
  100372. "lsr r7, r6, #16\n\t"
  100373. "lsl r6, r6, #16\n\t"
  100374. "adds r5, r5, r6\n\t"
  100375. "adcs r3, r3, r7\n\t"
  100376. "adc r4, r4, #0\n\t"
  100377. #else
  100378. "umull r6, r7, r8, r9\n\t"
  100379. "adds r5, r5, r6\n\t"
  100380. "adcs r3, r3, r7\n\t"
  100381. "adc r4, r4, #0\n\t"
  100382. #endif
  100383. /* A[12] * B[2] */
  100384. "ldr r8, [%[a], #48]\n\t"
  100385. "ldr r9, [%[b], #8]\n\t"
  100386. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  100387. "lsl r6, r8, #16\n\t"
  100388. "lsl r7, r9, #16\n\t"
  100389. "lsr r6, r6, #16\n\t"
  100390. "lsr r7, r7, #16\n\t"
  100391. "mul r7, r6, r7\n\t"
  100392. "adds r5, r5, r7\n\t"
  100393. "adcs r3, r3, #0\n\t"
  100394. "adc r4, r4, #0\n\t"
  100395. "lsr r7, r9, #16\n\t"
  100396. "mul r6, r7, r6\n\t"
  100397. "lsr r7, r6, #16\n\t"
  100398. "lsl r6, r6, #16\n\t"
  100399. "adds r5, r5, r6\n\t"
  100400. "adcs r3, r3, r7\n\t"
  100401. "adc r4, r4, #0\n\t"
  100402. "lsr r6, r8, #16\n\t"
  100403. "lsr r7, r9, #16\n\t"
  100404. "mul r7, r6, r7\n\t"
  100405. "adds r3, r3, r7\n\t"
  100406. "adc r4, r4, #0\n\t"
  100407. "lsl r7, r9, #16\n\t"
  100408. "lsr r7, r7, #16\n\t"
  100409. "mul r6, r7, r6\n\t"
  100410. "lsr r7, r6, #16\n\t"
  100411. "lsl r6, r6, #16\n\t"
  100412. "adds r5, r5, r6\n\t"
  100413. "adcs r3, r3, r7\n\t"
  100414. "adc r4, r4, #0\n\t"
  100415. #else
  100416. "umull r6, r7, r8, r9\n\t"
  100417. "adds r5, r5, r6\n\t"
  100418. "adcs r3, r3, r7\n\t"
  100419. "adc r4, r4, #0\n\t"
  100420. #endif
  100421. /* A[11] * B[3] */
  100422. "ldr r8, [%[a], #44]\n\t"
  100423. "ldr r9, [%[b], #12]\n\t"
  100424. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  100425. "lsl r6, r8, #16\n\t"
  100426. "lsl r7, r9, #16\n\t"
  100427. "lsr r6, r6, #16\n\t"
  100428. "lsr r7, r7, #16\n\t"
  100429. "mul r7, r6, r7\n\t"
  100430. "adds r5, r5, r7\n\t"
  100431. "adcs r3, r3, #0\n\t"
  100432. "adc r4, r4, #0\n\t"
  100433. "lsr r7, r9, #16\n\t"
  100434. "mul r6, r7, r6\n\t"
  100435. "lsr r7, r6, #16\n\t"
  100436. "lsl r6, r6, #16\n\t"
  100437. "adds r5, r5, r6\n\t"
  100438. "adcs r3, r3, r7\n\t"
  100439. "adc r4, r4, #0\n\t"
  100440. "lsr r6, r8, #16\n\t"
  100441. "lsr r7, r9, #16\n\t"
  100442. "mul r7, r6, r7\n\t"
  100443. "adds r3, r3, r7\n\t"
  100444. "adc r4, r4, #0\n\t"
  100445. "lsl r7, r9, #16\n\t"
  100446. "lsr r7, r7, #16\n\t"
  100447. "mul r6, r7, r6\n\t"
  100448. "lsr r7, r6, #16\n\t"
  100449. "lsl r6, r6, #16\n\t"
  100450. "adds r5, r5, r6\n\t"
  100451. "adcs r3, r3, r7\n\t"
  100452. "adc r4, r4, #0\n\t"
  100453. #else
  100454. "umull r6, r7, r8, r9\n\t"
  100455. "adds r5, r5, r6\n\t"
  100456. "adcs r3, r3, r7\n\t"
  100457. "adc r4, r4, #0\n\t"
  100458. #endif
  100459. /* A[10] * B[4] */
  100460. "ldr r8, [%[a], #40]\n\t"
  100461. "ldr r9, [%[b], #16]\n\t"
  100462. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  100463. "lsl r6, r8, #16\n\t"
  100464. "lsl r7, r9, #16\n\t"
  100465. "lsr r6, r6, #16\n\t"
  100466. "lsr r7, r7, #16\n\t"
  100467. "mul r7, r6, r7\n\t"
  100468. "adds r5, r5, r7\n\t"
  100469. "adcs r3, r3, #0\n\t"
  100470. "adc r4, r4, #0\n\t"
  100471. "lsr r7, r9, #16\n\t"
  100472. "mul r6, r7, r6\n\t"
  100473. "lsr r7, r6, #16\n\t"
  100474. "lsl r6, r6, #16\n\t"
  100475. "adds r5, r5, r6\n\t"
  100476. "adcs r3, r3, r7\n\t"
  100477. "adc r4, r4, #0\n\t"
  100478. "lsr r6, r8, #16\n\t"
  100479. "lsr r7, r9, #16\n\t"
  100480. "mul r7, r6, r7\n\t"
  100481. "adds r3, r3, r7\n\t"
  100482. "adc r4, r4, #0\n\t"
  100483. "lsl r7, r9, #16\n\t"
  100484. "lsr r7, r7, #16\n\t"
  100485. "mul r6, r7, r6\n\t"
  100486. "lsr r7, r6, #16\n\t"
  100487. "lsl r6, r6, #16\n\t"
  100488. "adds r5, r5, r6\n\t"
  100489. "adcs r3, r3, r7\n\t"
  100490. "adc r4, r4, #0\n\t"
  100491. #else
  100492. "umull r6, r7, r8, r9\n\t"
  100493. "adds r5, r5, r6\n\t"
  100494. "adcs r3, r3, r7\n\t"
  100495. "adc r4, r4, #0\n\t"
  100496. #endif
  100497. /* A[9] * B[5] */
  100498. "ldr r8, [%[a], #36]\n\t"
  100499. "ldr r9, [%[b], #20]\n\t"
  100500. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  100501. "lsl r6, r8, #16\n\t"
  100502. "lsl r7, r9, #16\n\t"
  100503. "lsr r6, r6, #16\n\t"
  100504. "lsr r7, r7, #16\n\t"
  100505. "mul r7, r6, r7\n\t"
  100506. "adds r5, r5, r7\n\t"
  100507. "adcs r3, r3, #0\n\t"
  100508. "adc r4, r4, #0\n\t"
  100509. "lsr r7, r9, #16\n\t"
  100510. "mul r6, r7, r6\n\t"
  100511. "lsr r7, r6, #16\n\t"
  100512. "lsl r6, r6, #16\n\t"
  100513. "adds r5, r5, r6\n\t"
  100514. "adcs r3, r3, r7\n\t"
  100515. "adc r4, r4, #0\n\t"
  100516. "lsr r6, r8, #16\n\t"
  100517. "lsr r7, r9, #16\n\t"
  100518. "mul r7, r6, r7\n\t"
  100519. "adds r3, r3, r7\n\t"
  100520. "adc r4, r4, #0\n\t"
  100521. "lsl r7, r9, #16\n\t"
  100522. "lsr r7, r7, #16\n\t"
  100523. "mul r6, r7, r6\n\t"
  100524. "lsr r7, r6, #16\n\t"
  100525. "lsl r6, r6, #16\n\t"
  100526. "adds r5, r5, r6\n\t"
  100527. "adcs r3, r3, r7\n\t"
  100528. "adc r4, r4, #0\n\t"
  100529. #else
  100530. "umull r6, r7, r8, r9\n\t"
  100531. "adds r5, r5, r6\n\t"
  100532. "adcs r3, r3, r7\n\t"
  100533. "adc r4, r4, #0\n\t"
  100534. #endif
  100535. /* A[8] * B[6] */
  100536. "ldr r8, [%[a], #32]\n\t"
  100537. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  100538. "lsl r6, r8, #16\n\t"
  100539. "lsl r7, r12, #16\n\t"
  100540. "lsr r6, r6, #16\n\t"
  100541. "lsr r7, r7, #16\n\t"
  100542. "mul r7, r6, r7\n\t"
  100543. "adds r5, r5, r7\n\t"
  100544. "adcs r3, r3, #0\n\t"
  100545. "adc r4, r4, #0\n\t"
  100546. "lsr r7, r12, #16\n\t"
  100547. "mul r6, r7, r6\n\t"
  100548. "lsr r7, r6, #16\n\t"
  100549. "lsl r6, r6, #16\n\t"
  100550. "adds r5, r5, r6\n\t"
  100551. "adcs r3, r3, r7\n\t"
  100552. "adc r4, r4, #0\n\t"
  100553. "lsr r6, r8, #16\n\t"
  100554. "lsr r7, r12, #16\n\t"
  100555. "mul r7, r6, r7\n\t"
  100556. "adds r3, r3, r7\n\t"
  100557. "adc r4, r4, #0\n\t"
  100558. "lsl r7, r12, #16\n\t"
  100559. "lsr r7, r7, #16\n\t"
  100560. "mul r6, r7, r6\n\t"
  100561. "lsr r7, r6, #16\n\t"
  100562. "lsl r6, r6, #16\n\t"
  100563. "adds r5, r5, r6\n\t"
  100564. "adcs r3, r3, r7\n\t"
  100565. "adc r4, r4, #0\n\t"
  100566. #else
  100567. "umull r6, r7, r8, r12\n\t"
  100568. "adds r5, r5, r6\n\t"
  100569. "adcs r3, r3, r7\n\t"
  100570. "adc r4, r4, #0\n\t"
  100571. #endif
  100572. /* A[7] * B[7] */
  100573. "ldr r11, [%[a], #28]\n\t"
  100574. "ldr r12, [%[b], #28]\n\t"
  100575. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  100576. "lsl r6, r11, #16\n\t"
  100577. "lsl r7, r12, #16\n\t"
  100578. "lsr r6, r6, #16\n\t"
  100579. "lsr r7, r7, #16\n\t"
  100580. "mul r7, r6, r7\n\t"
  100581. "adds r5, r5, r7\n\t"
  100582. "adcs r3, r3, #0\n\t"
  100583. "adc r4, r4, #0\n\t"
  100584. "lsr r7, r12, #16\n\t"
  100585. "mul r6, r7, r6\n\t"
  100586. "lsr r7, r6, #16\n\t"
  100587. "lsl r6, r6, #16\n\t"
  100588. "adds r5, r5, r6\n\t"
  100589. "adcs r3, r3, r7\n\t"
  100590. "adc r4, r4, #0\n\t"
  100591. "lsr r6, r11, #16\n\t"
  100592. "lsr r7, r12, #16\n\t"
  100593. "mul r7, r6, r7\n\t"
  100594. "adds r3, r3, r7\n\t"
  100595. "adc r4, r4, #0\n\t"
  100596. "lsl r7, r12, #16\n\t"
  100597. "lsr r7, r7, #16\n\t"
  100598. "mul r6, r7, r6\n\t"
  100599. "lsr r7, r6, #16\n\t"
  100600. "lsl r6, r6, #16\n\t"
  100601. "adds r5, r5, r6\n\t"
  100602. "adcs r3, r3, r7\n\t"
  100603. "adc r4, r4, #0\n\t"
  100604. #else
  100605. "umull r6, r7, r11, r12\n\t"
  100606. "adds r5, r5, r6\n\t"
  100607. "adcs r3, r3, r7\n\t"
  100608. "adc r4, r4, #0\n\t"
  100609. #endif
  100610. /* A[6] * B[8] */
  100611. "ldr r8, [%[a], #24]\n\t"
  100612. "ldr r9, [%[b], #32]\n\t"
  100613. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  100614. "lsl r6, r8, #16\n\t"
  100615. "lsl r7, r9, #16\n\t"
  100616. "lsr r6, r6, #16\n\t"
  100617. "lsr r7, r7, #16\n\t"
  100618. "mul r7, r6, r7\n\t"
  100619. "adds r5, r5, r7\n\t"
  100620. "adcs r3, r3, #0\n\t"
  100621. "adc r4, r4, #0\n\t"
  100622. "lsr r7, r9, #16\n\t"
  100623. "mul r6, r7, r6\n\t"
  100624. "lsr r7, r6, #16\n\t"
  100625. "lsl r6, r6, #16\n\t"
  100626. "adds r5, r5, r6\n\t"
  100627. "adcs r3, r3, r7\n\t"
  100628. "adc r4, r4, #0\n\t"
  100629. "lsr r6, r8, #16\n\t"
  100630. "lsr r7, r9, #16\n\t"
  100631. "mul r7, r6, r7\n\t"
  100632. "adds r3, r3, r7\n\t"
  100633. "adc r4, r4, #0\n\t"
  100634. "lsl r7, r9, #16\n\t"
  100635. "lsr r7, r7, #16\n\t"
  100636. "mul r6, r7, r6\n\t"
  100637. "lsr r7, r6, #16\n\t"
  100638. "lsl r6, r6, #16\n\t"
  100639. "adds r5, r5, r6\n\t"
  100640. "adcs r3, r3, r7\n\t"
  100641. "adc r4, r4, #0\n\t"
  100642. #else
  100643. "umull r6, r7, r8, r9\n\t"
  100644. "adds r5, r5, r6\n\t"
  100645. "adcs r3, r3, r7\n\t"
  100646. "adc r4, r4, #0\n\t"
  100647. #endif
  100648. /* A[5] * B[9] */
  100649. "ldr r8, [%[a], #20]\n\t"
  100650. "ldr r9, [%[b], #36]\n\t"
  100651. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  100652. "lsl r6, r8, #16\n\t"
  100653. "lsl r7, r9, #16\n\t"
  100654. "lsr r6, r6, #16\n\t"
  100655. "lsr r7, r7, #16\n\t"
  100656. "mul r7, r6, r7\n\t"
  100657. "adds r5, r5, r7\n\t"
  100658. "adcs r3, r3, #0\n\t"
  100659. "adc r4, r4, #0\n\t"
  100660. "lsr r7, r9, #16\n\t"
  100661. "mul r6, r7, r6\n\t"
  100662. "lsr r7, r6, #16\n\t"
  100663. "lsl r6, r6, #16\n\t"
  100664. "adds r5, r5, r6\n\t"
  100665. "adcs r3, r3, r7\n\t"
  100666. "adc r4, r4, #0\n\t"
  100667. "lsr r6, r8, #16\n\t"
  100668. "lsr r7, r9, #16\n\t"
  100669. "mul r7, r6, r7\n\t"
  100670. "adds r3, r3, r7\n\t"
  100671. "adc r4, r4, #0\n\t"
  100672. "lsl r7, r9, #16\n\t"
  100673. "lsr r7, r7, #16\n\t"
  100674. "mul r6, r7, r6\n\t"
  100675. "lsr r7, r6, #16\n\t"
  100676. "lsl r6, r6, #16\n\t"
  100677. "adds r5, r5, r6\n\t"
  100678. "adcs r3, r3, r7\n\t"
  100679. "adc r4, r4, #0\n\t"
  100680. #else
  100681. "umull r6, r7, r8, r9\n\t"
  100682. "adds r5, r5, r6\n\t"
  100683. "adcs r3, r3, r7\n\t"
  100684. "adc r4, r4, #0\n\t"
  100685. #endif
  100686. /* A[4] * B[10] */
  100687. "ldr r8, [%[a], #16]\n\t"
  100688. "ldr r9, [%[b], #40]\n\t"
  100689. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  100690. "lsl r6, r8, #16\n\t"
  100691. "lsl r7, r9, #16\n\t"
  100692. "lsr r6, r6, #16\n\t"
  100693. "lsr r7, r7, #16\n\t"
  100694. "mul r7, r6, r7\n\t"
  100695. "adds r5, r5, r7\n\t"
  100696. "adcs r3, r3, #0\n\t"
  100697. "adc r4, r4, #0\n\t"
  100698. "lsr r7, r9, #16\n\t"
  100699. "mul r6, r7, r6\n\t"
  100700. "lsr r7, r6, #16\n\t"
  100701. "lsl r6, r6, #16\n\t"
  100702. "adds r5, r5, r6\n\t"
  100703. "adcs r3, r3, r7\n\t"
  100704. "adc r4, r4, #0\n\t"
  100705. "lsr r6, r8, #16\n\t"
  100706. "lsr r7, r9, #16\n\t"
  100707. "mul r7, r6, r7\n\t"
  100708. "adds r3, r3, r7\n\t"
  100709. "adc r4, r4, #0\n\t"
  100710. "lsl r7, r9, #16\n\t"
  100711. "lsr r7, r7, #16\n\t"
  100712. "mul r6, r7, r6\n\t"
  100713. "lsr r7, r6, #16\n\t"
  100714. "lsl r6, r6, #16\n\t"
  100715. "adds r5, r5, r6\n\t"
  100716. "adcs r3, r3, r7\n\t"
  100717. "adc r4, r4, #0\n\t"
  100718. #else
  100719. "umull r6, r7, r8, r9\n\t"
  100720. "adds r5, r5, r6\n\t"
  100721. "adcs r3, r3, r7\n\t"
  100722. "adc r4, r4, #0\n\t"
  100723. #endif
  100724. /* A[3] * B[11] */
  100725. "ldr r8, [%[a], #12]\n\t"
  100726. "ldr r9, [%[b], #44]\n\t"
  100727. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  100728. "lsl r6, r8, #16\n\t"
  100729. "lsl r7, r9, #16\n\t"
  100730. "lsr r6, r6, #16\n\t"
  100731. "lsr r7, r7, #16\n\t"
  100732. "mul r7, r6, r7\n\t"
  100733. "adds r5, r5, r7\n\t"
  100734. "adcs r3, r3, #0\n\t"
  100735. "adc r4, r4, #0\n\t"
  100736. "lsr r7, r9, #16\n\t"
  100737. "mul r6, r7, r6\n\t"
  100738. "lsr r7, r6, #16\n\t"
  100739. "lsl r6, r6, #16\n\t"
  100740. "adds r5, r5, r6\n\t"
  100741. "adcs r3, r3, r7\n\t"
  100742. "adc r4, r4, #0\n\t"
  100743. "lsr r6, r8, #16\n\t"
  100744. "lsr r7, r9, #16\n\t"
  100745. "mul r7, r6, r7\n\t"
  100746. "adds r3, r3, r7\n\t"
  100747. "adc r4, r4, #0\n\t"
  100748. "lsl r7, r9, #16\n\t"
  100749. "lsr r7, r7, #16\n\t"
  100750. "mul r6, r7, r6\n\t"
  100751. "lsr r7, r6, #16\n\t"
  100752. "lsl r6, r6, #16\n\t"
  100753. "adds r5, r5, r6\n\t"
  100754. "adcs r3, r3, r7\n\t"
  100755. "adc r4, r4, #0\n\t"
  100756. #else
  100757. "umull r6, r7, r8, r9\n\t"
  100758. "adds r5, r5, r6\n\t"
  100759. "adcs r3, r3, r7\n\t"
  100760. "adc r4, r4, #0\n\t"
  100761. #endif
  100762. /* A[2] * B[12] */
  100763. "ldr r8, [%[a], #8]\n\t"
  100764. "ldr r9, [%[b], #48]\n\t"
  100765. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  100766. "lsl r6, r8, #16\n\t"
  100767. "lsl r7, r9, #16\n\t"
  100768. "lsr r6, r6, #16\n\t"
  100769. "lsr r7, r7, #16\n\t"
  100770. "mul r7, r6, r7\n\t"
  100771. "adds r5, r5, r7\n\t"
  100772. "adcs r3, r3, #0\n\t"
  100773. "adc r4, r4, #0\n\t"
  100774. "lsr r7, r9, #16\n\t"
  100775. "mul r6, r7, r6\n\t"
  100776. "lsr r7, r6, #16\n\t"
  100777. "lsl r6, r6, #16\n\t"
  100778. "adds r5, r5, r6\n\t"
  100779. "adcs r3, r3, r7\n\t"
  100780. "adc r4, r4, #0\n\t"
  100781. "lsr r6, r8, #16\n\t"
  100782. "lsr r7, r9, #16\n\t"
  100783. "mul r7, r6, r7\n\t"
  100784. "adds r3, r3, r7\n\t"
  100785. "adc r4, r4, #0\n\t"
  100786. "lsl r7, r9, #16\n\t"
  100787. "lsr r7, r7, #16\n\t"
  100788. "mul r6, r7, r6\n\t"
  100789. "lsr r7, r6, #16\n\t"
  100790. "lsl r6, r6, #16\n\t"
  100791. "adds r5, r5, r6\n\t"
  100792. "adcs r3, r3, r7\n\t"
  100793. "adc r4, r4, #0\n\t"
  100794. #else
  100795. "umull r6, r7, r8, r9\n\t"
  100796. "adds r5, r5, r6\n\t"
  100797. "adcs r3, r3, r7\n\t"
  100798. "adc r4, r4, #0\n\t"
  100799. #endif
  100800. /* A[1] * B[13] */
  100801. "ldr r8, [%[a], #4]\n\t"
  100802. "ldr r9, [%[b], #52]\n\t"
  100803. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  100804. "lsl r6, r8, #16\n\t"
  100805. "lsl r7, r9, #16\n\t"
  100806. "lsr r6, r6, #16\n\t"
  100807. "lsr r7, r7, #16\n\t"
  100808. "mul r7, r6, r7\n\t"
  100809. "adds r5, r5, r7\n\t"
  100810. "adcs r3, r3, #0\n\t"
  100811. "adc r4, r4, #0\n\t"
  100812. "lsr r7, r9, #16\n\t"
  100813. "mul r6, r7, r6\n\t"
  100814. "lsr r7, r6, #16\n\t"
  100815. "lsl r6, r6, #16\n\t"
  100816. "adds r5, r5, r6\n\t"
  100817. "adcs r3, r3, r7\n\t"
  100818. "adc r4, r4, #0\n\t"
  100819. "lsr r6, r8, #16\n\t"
  100820. "lsr r7, r9, #16\n\t"
  100821. "mul r7, r6, r7\n\t"
  100822. "adds r3, r3, r7\n\t"
  100823. "adc r4, r4, #0\n\t"
  100824. "lsl r7, r9, #16\n\t"
  100825. "lsr r7, r7, #16\n\t"
  100826. "mul r6, r7, r6\n\t"
  100827. "lsr r7, r6, #16\n\t"
  100828. "lsl r6, r6, #16\n\t"
  100829. "adds r5, r5, r6\n\t"
  100830. "adcs r3, r3, r7\n\t"
  100831. "adc r4, r4, #0\n\t"
  100832. #else
  100833. "umull r6, r7, r8, r9\n\t"
  100834. "adds r5, r5, r6\n\t"
  100835. "adcs r3, r3, r7\n\t"
  100836. "adc r4, r4, #0\n\t"
  100837. #endif
  100838. /* A[0] * B[14] */
  100839. "ldr r8, [%[a]]\n\t"
  100840. "ldr r9, [%[b], #56]\n\t"
  100841. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  100842. "lsl r6, r8, #16\n\t"
  100843. "lsl r7, r9, #16\n\t"
  100844. "lsr r6, r6, #16\n\t"
  100845. "lsr r7, r7, #16\n\t"
  100846. "mul r7, r6, r7\n\t"
  100847. "adds r5, r5, r7\n\t"
  100848. "adcs r3, r3, #0\n\t"
  100849. "adc r4, r4, #0\n\t"
  100850. "lsr r7, r9, #16\n\t"
  100851. "mul r6, r7, r6\n\t"
  100852. "lsr r7, r6, #16\n\t"
  100853. "lsl r6, r6, #16\n\t"
  100854. "adds r5, r5, r6\n\t"
  100855. "adcs r3, r3, r7\n\t"
  100856. "adc r4, r4, #0\n\t"
  100857. "lsr r6, r8, #16\n\t"
  100858. "lsr r7, r9, #16\n\t"
  100859. "mul r7, r6, r7\n\t"
  100860. "adds r3, r3, r7\n\t"
  100861. "adc r4, r4, #0\n\t"
  100862. "lsl r7, r9, #16\n\t"
  100863. "lsr r7, r7, #16\n\t"
  100864. "mul r6, r7, r6\n\t"
  100865. "lsr r7, r6, #16\n\t"
  100866. "lsl r6, r6, #16\n\t"
  100867. "adds r5, r5, r6\n\t"
  100868. "adcs r3, r3, r7\n\t"
  100869. "adc r4, r4, #0\n\t"
  100870. #else
  100871. "umull r6, r7, r8, r9\n\t"
  100872. "adds r5, r5, r6\n\t"
  100873. "adcs r3, r3, r7\n\t"
  100874. "adc r4, r4, #0\n\t"
  100875. #endif
  100876. "str r5, [sp, #56]\n\t"
  100877. /* A[0] * B[15] */
  100878. "ldr r9, [%[b], #60]\n\t"
  100879. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  100880. "lsl r6, r8, #16\n\t"
  100881. "lsl r7, r9, #16\n\t"
  100882. "lsr r6, r6, #16\n\t"
  100883. "lsr r7, r7, #16\n\t"
  100884. "mul r7, r6, r7\n\t"
  100885. "adds r3, r3, r7\n\t"
  100886. "adcs r4, r4, #0\n\t"
  100887. "mov r5, #0\n\t"
  100888. "adc r5, r5, #0\n\t"
  100889. "lsr r7, r9, #16\n\t"
  100890. "mul r6, r7, r6\n\t"
  100891. "lsr r7, r6, #16\n\t"
  100892. "lsl r6, r6, #16\n\t"
  100893. "adds r3, r3, r6\n\t"
  100894. "adcs r4, r4, r7\n\t"
  100895. "adc r5, r5, #0\n\t"
  100896. "lsr r6, r8, #16\n\t"
  100897. "lsr r7, r9, #16\n\t"
  100898. "mul r7, r6, r7\n\t"
  100899. "adds r4, r4, r7\n\t"
  100900. "adc r5, r5, #0\n\t"
  100901. "lsl r7, r9, #16\n\t"
  100902. "lsr r7, r7, #16\n\t"
  100903. "mul r6, r7, r6\n\t"
  100904. "lsr r7, r6, #16\n\t"
  100905. "lsl r6, r6, #16\n\t"
  100906. "adds r3, r3, r6\n\t"
  100907. "adcs r4, r4, r7\n\t"
  100908. "adc r5, r5, #0\n\t"
  100909. #else
  100910. "umull r6, r7, r8, r9\n\t"
  100911. "adds r3, r3, r6\n\t"
  100912. "adcs r4, r4, r7\n\t"
  100913. "mov r5, #0\n\t"
  100914. "adc r5, r5, #0\n\t"
  100915. #endif
  100916. /* A[1] * B[14] */
  100917. "ldr r8, [%[a], #4]\n\t"
  100918. "ldr r9, [%[b], #56]\n\t"
  100919. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  100920. "lsl r6, r8, #16\n\t"
  100921. "lsl r7, r9, #16\n\t"
  100922. "lsr r6, r6, #16\n\t"
  100923. "lsr r7, r7, #16\n\t"
  100924. "mul r7, r6, r7\n\t"
  100925. "adds r3, r3, r7\n\t"
  100926. "adcs r4, r4, #0\n\t"
  100927. "adc r5, r5, #0\n\t"
  100928. "lsr r7, r9, #16\n\t"
  100929. "mul r6, r7, r6\n\t"
  100930. "lsr r7, r6, #16\n\t"
  100931. "lsl r6, r6, #16\n\t"
  100932. "adds r3, r3, r6\n\t"
  100933. "adcs r4, r4, r7\n\t"
  100934. "adc r5, r5, #0\n\t"
  100935. "lsr r6, r8, #16\n\t"
  100936. "lsr r7, r9, #16\n\t"
  100937. "mul r7, r6, r7\n\t"
  100938. "adds r4, r4, r7\n\t"
  100939. "adc r5, r5, #0\n\t"
  100940. "lsl r7, r9, #16\n\t"
  100941. "lsr r7, r7, #16\n\t"
  100942. "mul r6, r7, r6\n\t"
  100943. "lsr r7, r6, #16\n\t"
  100944. "lsl r6, r6, #16\n\t"
  100945. "adds r3, r3, r6\n\t"
  100946. "adcs r4, r4, r7\n\t"
  100947. "adc r5, r5, #0\n\t"
  100948. #else
  100949. "umull r6, r7, r8, r9\n\t"
  100950. "adds r3, r3, r6\n\t"
  100951. "adcs r4, r4, r7\n\t"
  100952. "adc r5, r5, #0\n\t"
  100953. #endif
  100954. /* A[2] * B[13] */
  100955. "ldr r8, [%[a], #8]\n\t"
  100956. "ldr r9, [%[b], #52]\n\t"
  100957. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  100958. "lsl r6, r8, #16\n\t"
  100959. "lsl r7, r9, #16\n\t"
  100960. "lsr r6, r6, #16\n\t"
  100961. "lsr r7, r7, #16\n\t"
  100962. "mul r7, r6, r7\n\t"
  100963. "adds r3, r3, r7\n\t"
  100964. "adcs r4, r4, #0\n\t"
  100965. "adc r5, r5, #0\n\t"
  100966. "lsr r7, r9, #16\n\t"
  100967. "mul r6, r7, r6\n\t"
  100968. "lsr r7, r6, #16\n\t"
  100969. "lsl r6, r6, #16\n\t"
  100970. "adds r3, r3, r6\n\t"
  100971. "adcs r4, r4, r7\n\t"
  100972. "adc r5, r5, #0\n\t"
  100973. "lsr r6, r8, #16\n\t"
  100974. "lsr r7, r9, #16\n\t"
  100975. "mul r7, r6, r7\n\t"
  100976. "adds r4, r4, r7\n\t"
  100977. "adc r5, r5, #0\n\t"
  100978. "lsl r7, r9, #16\n\t"
  100979. "lsr r7, r7, #16\n\t"
  100980. "mul r6, r7, r6\n\t"
  100981. "lsr r7, r6, #16\n\t"
  100982. "lsl r6, r6, #16\n\t"
  100983. "adds r3, r3, r6\n\t"
  100984. "adcs r4, r4, r7\n\t"
  100985. "adc r5, r5, #0\n\t"
  100986. #else
  100987. "umull r6, r7, r8, r9\n\t"
  100988. "adds r3, r3, r6\n\t"
  100989. "adcs r4, r4, r7\n\t"
  100990. "adc r5, r5, #0\n\t"
  100991. #endif
  100992. /* A[3] * B[12] */
  100993. "ldr r8, [%[a], #12]\n\t"
  100994. "ldr r9, [%[b], #48]\n\t"
  100995. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  100996. "lsl r6, r8, #16\n\t"
  100997. "lsl r7, r9, #16\n\t"
  100998. "lsr r6, r6, #16\n\t"
  100999. "lsr r7, r7, #16\n\t"
  101000. "mul r7, r6, r7\n\t"
  101001. "adds r3, r3, r7\n\t"
  101002. "adcs r4, r4, #0\n\t"
  101003. "adc r5, r5, #0\n\t"
  101004. "lsr r7, r9, #16\n\t"
  101005. "mul r6, r7, r6\n\t"
  101006. "lsr r7, r6, #16\n\t"
  101007. "lsl r6, r6, #16\n\t"
  101008. "adds r3, r3, r6\n\t"
  101009. "adcs r4, r4, r7\n\t"
  101010. "adc r5, r5, #0\n\t"
  101011. "lsr r6, r8, #16\n\t"
  101012. "lsr r7, r9, #16\n\t"
  101013. "mul r7, r6, r7\n\t"
  101014. "adds r4, r4, r7\n\t"
  101015. "adc r5, r5, #0\n\t"
  101016. "lsl r7, r9, #16\n\t"
  101017. "lsr r7, r7, #16\n\t"
  101018. "mul r6, r7, r6\n\t"
  101019. "lsr r7, r6, #16\n\t"
  101020. "lsl r6, r6, #16\n\t"
  101021. "adds r3, r3, r6\n\t"
  101022. "adcs r4, r4, r7\n\t"
  101023. "adc r5, r5, #0\n\t"
  101024. #else
  101025. "umull r6, r7, r8, r9\n\t"
  101026. "adds r3, r3, r6\n\t"
  101027. "adcs r4, r4, r7\n\t"
  101028. "adc r5, r5, #0\n\t"
  101029. #endif
  101030. /* A[4] * B[11] */
  101031. "ldr r8, [%[a], #16]\n\t"
  101032. "ldr r9, [%[b], #44]\n\t"
  101033. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  101034. "lsl r6, r8, #16\n\t"
  101035. "lsl r7, r9, #16\n\t"
  101036. "lsr r6, r6, #16\n\t"
  101037. "lsr r7, r7, #16\n\t"
  101038. "mul r7, r6, r7\n\t"
  101039. "adds r3, r3, r7\n\t"
  101040. "adcs r4, r4, #0\n\t"
  101041. "adc r5, r5, #0\n\t"
  101042. "lsr r7, r9, #16\n\t"
  101043. "mul r6, r7, r6\n\t"
  101044. "lsr r7, r6, #16\n\t"
  101045. "lsl r6, r6, #16\n\t"
  101046. "adds r3, r3, r6\n\t"
  101047. "adcs r4, r4, r7\n\t"
  101048. "adc r5, r5, #0\n\t"
  101049. "lsr r6, r8, #16\n\t"
  101050. "lsr r7, r9, #16\n\t"
  101051. "mul r7, r6, r7\n\t"
  101052. "adds r4, r4, r7\n\t"
  101053. "adc r5, r5, #0\n\t"
  101054. "lsl r7, r9, #16\n\t"
  101055. "lsr r7, r7, #16\n\t"
  101056. "mul r6, r7, r6\n\t"
  101057. "lsr r7, r6, #16\n\t"
  101058. "lsl r6, r6, #16\n\t"
  101059. "adds r3, r3, r6\n\t"
  101060. "adcs r4, r4, r7\n\t"
  101061. "adc r5, r5, #0\n\t"
  101062. #else
  101063. "umull r6, r7, r8, r9\n\t"
  101064. "adds r3, r3, r6\n\t"
  101065. "adcs r4, r4, r7\n\t"
  101066. "adc r5, r5, #0\n\t"
  101067. #endif
  101068. /* A[5] * B[10] */
  101069. "ldr r8, [%[a], #20]\n\t"
  101070. "ldr r9, [%[b], #40]\n\t"
  101071. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  101072. "lsl r6, r8, #16\n\t"
  101073. "lsl r7, r9, #16\n\t"
  101074. "lsr r6, r6, #16\n\t"
  101075. "lsr r7, r7, #16\n\t"
  101076. "mul r7, r6, r7\n\t"
  101077. "adds r3, r3, r7\n\t"
  101078. "adcs r4, r4, #0\n\t"
  101079. "adc r5, r5, #0\n\t"
  101080. "lsr r7, r9, #16\n\t"
  101081. "mul r6, r7, r6\n\t"
  101082. "lsr r7, r6, #16\n\t"
  101083. "lsl r6, r6, #16\n\t"
  101084. "adds r3, r3, r6\n\t"
  101085. "adcs r4, r4, r7\n\t"
  101086. "adc r5, r5, #0\n\t"
  101087. "lsr r6, r8, #16\n\t"
  101088. "lsr r7, r9, #16\n\t"
  101089. "mul r7, r6, r7\n\t"
  101090. "adds r4, r4, r7\n\t"
  101091. "adc r5, r5, #0\n\t"
  101092. "lsl r7, r9, #16\n\t"
  101093. "lsr r7, r7, #16\n\t"
  101094. "mul r6, r7, r6\n\t"
  101095. "lsr r7, r6, #16\n\t"
  101096. "lsl r6, r6, #16\n\t"
  101097. "adds r3, r3, r6\n\t"
  101098. "adcs r4, r4, r7\n\t"
  101099. "adc r5, r5, #0\n\t"
  101100. #else
  101101. "umull r6, r7, r8, r9\n\t"
  101102. "adds r3, r3, r6\n\t"
  101103. "adcs r4, r4, r7\n\t"
  101104. "adc r5, r5, #0\n\t"
  101105. #endif
  101106. /* A[6] * B[9] */
  101107. "ldr r8, [%[a], #24]\n\t"
  101108. "ldr r9, [%[b], #36]\n\t"
  101109. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  101110. "lsl r6, r8, #16\n\t"
  101111. "lsl r7, r9, #16\n\t"
  101112. "lsr r6, r6, #16\n\t"
  101113. "lsr r7, r7, #16\n\t"
  101114. "mul r7, r6, r7\n\t"
  101115. "adds r3, r3, r7\n\t"
  101116. "adcs r4, r4, #0\n\t"
  101117. "adc r5, r5, #0\n\t"
  101118. "lsr r7, r9, #16\n\t"
  101119. "mul r6, r7, r6\n\t"
  101120. "lsr r7, r6, #16\n\t"
  101121. "lsl r6, r6, #16\n\t"
  101122. "adds r3, r3, r6\n\t"
  101123. "adcs r4, r4, r7\n\t"
  101124. "adc r5, r5, #0\n\t"
  101125. "lsr r6, r8, #16\n\t"
  101126. "lsr r7, r9, #16\n\t"
  101127. "mul r7, r6, r7\n\t"
  101128. "adds r4, r4, r7\n\t"
  101129. "adc r5, r5, #0\n\t"
  101130. "lsl r7, r9, #16\n\t"
  101131. "lsr r7, r7, #16\n\t"
  101132. "mul r6, r7, r6\n\t"
  101133. "lsr r7, r6, #16\n\t"
  101134. "lsl r6, r6, #16\n\t"
  101135. "adds r3, r3, r6\n\t"
  101136. "adcs r4, r4, r7\n\t"
  101137. "adc r5, r5, #0\n\t"
  101138. #else
  101139. "umull r6, r7, r8, r9\n\t"
  101140. "adds r3, r3, r6\n\t"
  101141. "adcs r4, r4, r7\n\t"
  101142. "adc r5, r5, #0\n\t"
  101143. #endif
  101144. /* A[7] * B[8] */
  101145. "ldr r9, [%[b], #32]\n\t"
  101146. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  101147. "lsl r6, r11, #16\n\t"
  101148. "lsl r7, r9, #16\n\t"
  101149. "lsr r6, r6, #16\n\t"
  101150. "lsr r7, r7, #16\n\t"
  101151. "mul r7, r6, r7\n\t"
  101152. "adds r3, r3, r7\n\t"
  101153. "adcs r4, r4, #0\n\t"
  101154. "adc r5, r5, #0\n\t"
  101155. "lsr r7, r9, #16\n\t"
  101156. "mul r6, r7, r6\n\t"
  101157. "lsr r7, r6, #16\n\t"
  101158. "lsl r6, r6, #16\n\t"
  101159. "adds r3, r3, r6\n\t"
  101160. "adcs r4, r4, r7\n\t"
  101161. "adc r5, r5, #0\n\t"
  101162. "lsr r6, r11, #16\n\t"
  101163. "lsr r7, r9, #16\n\t"
  101164. "mul r7, r6, r7\n\t"
  101165. "adds r4, r4, r7\n\t"
  101166. "adc r5, r5, #0\n\t"
  101167. "lsl r7, r9, #16\n\t"
  101168. "lsr r7, r7, #16\n\t"
  101169. "mul r6, r7, r6\n\t"
  101170. "lsr r7, r6, #16\n\t"
  101171. "lsl r6, r6, #16\n\t"
  101172. "adds r3, r3, r6\n\t"
  101173. "adcs r4, r4, r7\n\t"
  101174. "adc r5, r5, #0\n\t"
  101175. #else
  101176. "umull r6, r7, r11, r9\n\t"
  101177. "adds r3, r3, r6\n\t"
  101178. "adcs r4, r4, r7\n\t"
  101179. "adc r5, r5, #0\n\t"
  101180. #endif
  101181. /* A[8] * B[7] */
  101182. "ldr r8, [%[a], #32]\n\t"
  101183. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  101184. "lsl r6, r8, #16\n\t"
  101185. "lsl r7, r12, #16\n\t"
  101186. "lsr r6, r6, #16\n\t"
  101187. "lsr r7, r7, #16\n\t"
  101188. "mul r7, r6, r7\n\t"
  101189. "adds r3, r3, r7\n\t"
  101190. "adcs r4, r4, #0\n\t"
  101191. "adc r5, r5, #0\n\t"
  101192. "lsr r7, r12, #16\n\t"
  101193. "mul r6, r7, r6\n\t"
  101194. "lsr r7, r6, #16\n\t"
  101195. "lsl r6, r6, #16\n\t"
  101196. "adds r3, r3, r6\n\t"
  101197. "adcs r4, r4, r7\n\t"
  101198. "adc r5, r5, #0\n\t"
  101199. "lsr r6, r8, #16\n\t"
  101200. "lsr r7, r12, #16\n\t"
  101201. "mul r7, r6, r7\n\t"
  101202. "adds r4, r4, r7\n\t"
  101203. "adc r5, r5, #0\n\t"
  101204. "lsl r7, r12, #16\n\t"
  101205. "lsr r7, r7, #16\n\t"
  101206. "mul r6, r7, r6\n\t"
  101207. "lsr r7, r6, #16\n\t"
  101208. "lsl r6, r6, #16\n\t"
  101209. "adds r3, r3, r6\n\t"
  101210. "adcs r4, r4, r7\n\t"
  101211. "adc r5, r5, #0\n\t"
  101212. #else
  101213. "umull r6, r7, r8, r12\n\t"
  101214. "adds r3, r3, r6\n\t"
  101215. "adcs r4, r4, r7\n\t"
  101216. "adc r5, r5, #0\n\t"
  101217. #endif
  101218. /* A[9] * B[6] */
  101219. "ldr r8, [%[a], #36]\n\t"
  101220. "ldr r9, [%[b], #24]\n\t"
  101221. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  101222. "lsl r6, r8, #16\n\t"
  101223. "lsl r7, r9, #16\n\t"
  101224. "lsr r6, r6, #16\n\t"
  101225. "lsr r7, r7, #16\n\t"
  101226. "mul r7, r6, r7\n\t"
  101227. "adds r3, r3, r7\n\t"
  101228. "adcs r4, r4, #0\n\t"
  101229. "adc r5, r5, #0\n\t"
  101230. "lsr r7, r9, #16\n\t"
  101231. "mul r6, r7, r6\n\t"
  101232. "lsr r7, r6, #16\n\t"
  101233. "lsl r6, r6, #16\n\t"
  101234. "adds r3, r3, r6\n\t"
  101235. "adcs r4, r4, r7\n\t"
  101236. "adc r5, r5, #0\n\t"
  101237. "lsr r6, r8, #16\n\t"
  101238. "lsr r7, r9, #16\n\t"
  101239. "mul r7, r6, r7\n\t"
  101240. "adds r4, r4, r7\n\t"
  101241. "adc r5, r5, #0\n\t"
  101242. "lsl r7, r9, #16\n\t"
  101243. "lsr r7, r7, #16\n\t"
  101244. "mul r6, r7, r6\n\t"
  101245. "lsr r7, r6, #16\n\t"
  101246. "lsl r6, r6, #16\n\t"
  101247. "adds r3, r3, r6\n\t"
  101248. "adcs r4, r4, r7\n\t"
  101249. "adc r5, r5, #0\n\t"
  101250. #else
  101251. "umull r6, r7, r8, r9\n\t"
  101252. "adds r3, r3, r6\n\t"
  101253. "adcs r4, r4, r7\n\t"
  101254. "adc r5, r5, #0\n\t"
  101255. #endif
  101256. /* A[10] * B[5] */
  101257. "ldr r8, [%[a], #40]\n\t"
  101258. "ldr r9, [%[b], #20]\n\t"
  101259. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  101260. "lsl r6, r8, #16\n\t"
  101261. "lsl r7, r9, #16\n\t"
  101262. "lsr r6, r6, #16\n\t"
  101263. "lsr r7, r7, #16\n\t"
  101264. "mul r7, r6, r7\n\t"
  101265. "adds r3, r3, r7\n\t"
  101266. "adcs r4, r4, #0\n\t"
  101267. "adc r5, r5, #0\n\t"
  101268. "lsr r7, r9, #16\n\t"
  101269. "mul r6, r7, r6\n\t"
  101270. "lsr r7, r6, #16\n\t"
  101271. "lsl r6, r6, #16\n\t"
  101272. "adds r3, r3, r6\n\t"
  101273. "adcs r4, r4, r7\n\t"
  101274. "adc r5, r5, #0\n\t"
  101275. "lsr r6, r8, #16\n\t"
  101276. "lsr r7, r9, #16\n\t"
  101277. "mul r7, r6, r7\n\t"
  101278. "adds r4, r4, r7\n\t"
  101279. "adc r5, r5, #0\n\t"
  101280. "lsl r7, r9, #16\n\t"
  101281. "lsr r7, r7, #16\n\t"
  101282. "mul r6, r7, r6\n\t"
  101283. "lsr r7, r6, #16\n\t"
  101284. "lsl r6, r6, #16\n\t"
  101285. "adds r3, r3, r6\n\t"
  101286. "adcs r4, r4, r7\n\t"
  101287. "adc r5, r5, #0\n\t"
  101288. #else
  101289. "umull r6, r7, r8, r9\n\t"
  101290. "adds r3, r3, r6\n\t"
  101291. "adcs r4, r4, r7\n\t"
  101292. "adc r5, r5, #0\n\t"
  101293. #endif
  101294. /* A[11] * B[4] */
  101295. "ldr r8, [%[a], #44]\n\t"
  101296. "ldr r9, [%[b], #16]\n\t"
  101297. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  101298. "lsl r6, r8, #16\n\t"
  101299. "lsl r7, r9, #16\n\t"
  101300. "lsr r6, r6, #16\n\t"
  101301. "lsr r7, r7, #16\n\t"
  101302. "mul r7, r6, r7\n\t"
  101303. "adds r3, r3, r7\n\t"
  101304. "adcs r4, r4, #0\n\t"
  101305. "adc r5, r5, #0\n\t"
  101306. "lsr r7, r9, #16\n\t"
  101307. "mul r6, r7, r6\n\t"
  101308. "lsr r7, r6, #16\n\t"
  101309. "lsl r6, r6, #16\n\t"
  101310. "adds r3, r3, r6\n\t"
  101311. "adcs r4, r4, r7\n\t"
  101312. "adc r5, r5, #0\n\t"
  101313. "lsr r6, r8, #16\n\t"
  101314. "lsr r7, r9, #16\n\t"
  101315. "mul r7, r6, r7\n\t"
  101316. "adds r4, r4, r7\n\t"
  101317. "adc r5, r5, #0\n\t"
  101318. "lsl r7, r9, #16\n\t"
  101319. "lsr r7, r7, #16\n\t"
  101320. "mul r6, r7, r6\n\t"
  101321. "lsr r7, r6, #16\n\t"
  101322. "lsl r6, r6, #16\n\t"
  101323. "adds r3, r3, r6\n\t"
  101324. "adcs r4, r4, r7\n\t"
  101325. "adc r5, r5, #0\n\t"
  101326. #else
  101327. "umull r6, r7, r8, r9\n\t"
  101328. "adds r3, r3, r6\n\t"
  101329. "adcs r4, r4, r7\n\t"
  101330. "adc r5, r5, #0\n\t"
  101331. #endif
  101332. /* A[12] * B[3] */
  101333. "ldr r8, [%[a], #48]\n\t"
  101334. "ldr r9, [%[b], #12]\n\t"
  101335. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  101336. "lsl r6, r8, #16\n\t"
  101337. "lsl r7, r9, #16\n\t"
  101338. "lsr r6, r6, #16\n\t"
  101339. "lsr r7, r7, #16\n\t"
  101340. "mul r7, r6, r7\n\t"
  101341. "adds r3, r3, r7\n\t"
  101342. "adcs r4, r4, #0\n\t"
  101343. "adc r5, r5, #0\n\t"
  101344. "lsr r7, r9, #16\n\t"
  101345. "mul r6, r7, r6\n\t"
  101346. "lsr r7, r6, #16\n\t"
  101347. "lsl r6, r6, #16\n\t"
  101348. "adds r3, r3, r6\n\t"
  101349. "adcs r4, r4, r7\n\t"
  101350. "adc r5, r5, #0\n\t"
  101351. "lsr r6, r8, #16\n\t"
  101352. "lsr r7, r9, #16\n\t"
  101353. "mul r7, r6, r7\n\t"
  101354. "adds r4, r4, r7\n\t"
  101355. "adc r5, r5, #0\n\t"
  101356. "lsl r7, r9, #16\n\t"
  101357. "lsr r7, r7, #16\n\t"
  101358. "mul r6, r7, r6\n\t"
  101359. "lsr r7, r6, #16\n\t"
  101360. "lsl r6, r6, #16\n\t"
  101361. "adds r3, r3, r6\n\t"
  101362. "adcs r4, r4, r7\n\t"
  101363. "adc r5, r5, #0\n\t"
  101364. #else
  101365. "umull r6, r7, r8, r9\n\t"
  101366. "adds r3, r3, r6\n\t"
  101367. "adcs r4, r4, r7\n\t"
  101368. "adc r5, r5, #0\n\t"
  101369. #endif
  101370. /* A[13] * B[2] */
  101371. "ldr r8, [%[a], #52]\n\t"
  101372. "ldr r9, [%[b], #8]\n\t"
  101373. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  101374. "lsl r6, r8, #16\n\t"
  101375. "lsl r7, r9, #16\n\t"
  101376. "lsr r6, r6, #16\n\t"
  101377. "lsr r7, r7, #16\n\t"
  101378. "mul r7, r6, r7\n\t"
  101379. "adds r3, r3, r7\n\t"
  101380. "adcs r4, r4, #0\n\t"
  101381. "adc r5, r5, #0\n\t"
  101382. "lsr r7, r9, #16\n\t"
  101383. "mul r6, r7, r6\n\t"
  101384. "lsr r7, r6, #16\n\t"
  101385. "lsl r6, r6, #16\n\t"
  101386. "adds r3, r3, r6\n\t"
  101387. "adcs r4, r4, r7\n\t"
  101388. "adc r5, r5, #0\n\t"
  101389. "lsr r6, r8, #16\n\t"
  101390. "lsr r7, r9, #16\n\t"
  101391. "mul r7, r6, r7\n\t"
  101392. "adds r4, r4, r7\n\t"
  101393. "adc r5, r5, #0\n\t"
  101394. "lsl r7, r9, #16\n\t"
  101395. "lsr r7, r7, #16\n\t"
  101396. "mul r6, r7, r6\n\t"
  101397. "lsr r7, r6, #16\n\t"
  101398. "lsl r6, r6, #16\n\t"
  101399. "adds r3, r3, r6\n\t"
  101400. "adcs r4, r4, r7\n\t"
  101401. "adc r5, r5, #0\n\t"
  101402. #else
  101403. "umull r6, r7, r8, r9\n\t"
  101404. "adds r3, r3, r6\n\t"
  101405. "adcs r4, r4, r7\n\t"
  101406. "adc r5, r5, #0\n\t"
  101407. #endif
  101408. /* A[14] * B[1] */
  101409. "ldr r8, [%[a], #56]\n\t"
  101410. "ldr r9, [%[b], #4]\n\t"
  101411. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  101412. "lsl r6, r8, #16\n\t"
  101413. "lsl r7, r9, #16\n\t"
  101414. "lsr r6, r6, #16\n\t"
  101415. "lsr r7, r7, #16\n\t"
  101416. "mul r7, r6, r7\n\t"
  101417. "adds r3, r3, r7\n\t"
  101418. "adcs r4, r4, #0\n\t"
  101419. "adc r5, r5, #0\n\t"
  101420. "lsr r7, r9, #16\n\t"
  101421. "mul r6, r7, r6\n\t"
  101422. "lsr r7, r6, #16\n\t"
  101423. "lsl r6, r6, #16\n\t"
  101424. "adds r3, r3, r6\n\t"
  101425. "adcs r4, r4, r7\n\t"
  101426. "adc r5, r5, #0\n\t"
  101427. "lsr r6, r8, #16\n\t"
  101428. "lsr r7, r9, #16\n\t"
  101429. "mul r7, r6, r7\n\t"
  101430. "adds r4, r4, r7\n\t"
  101431. "adc r5, r5, #0\n\t"
  101432. "lsl r7, r9, #16\n\t"
  101433. "lsr r7, r7, #16\n\t"
  101434. "mul r6, r7, r6\n\t"
  101435. "lsr r7, r6, #16\n\t"
  101436. "lsl r6, r6, #16\n\t"
  101437. "adds r3, r3, r6\n\t"
  101438. "adcs r4, r4, r7\n\t"
  101439. "adc r5, r5, #0\n\t"
  101440. #else
  101441. "umull r6, r7, r8, r9\n\t"
  101442. "adds r3, r3, r6\n\t"
  101443. "adcs r4, r4, r7\n\t"
  101444. "adc r5, r5, #0\n\t"
  101445. #endif
  101446. /* A[15] * B[0] */
  101447. "ldr r8, [%[a], #60]\n\t"
  101448. "ldr r9, [%[b]]\n\t"
  101449. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  101450. "lsl r6, r8, #16\n\t"
  101451. "lsl r7, r9, #16\n\t"
  101452. "lsr r6, r6, #16\n\t"
  101453. "lsr r7, r7, #16\n\t"
  101454. "mul r7, r6, r7\n\t"
  101455. "adds r3, r3, r7\n\t"
  101456. "adcs r4, r4, #0\n\t"
  101457. "adc r5, r5, #0\n\t"
  101458. "lsr r7, r9, #16\n\t"
  101459. "mul r6, r7, r6\n\t"
  101460. "lsr r7, r6, #16\n\t"
  101461. "lsl r6, r6, #16\n\t"
  101462. "adds r3, r3, r6\n\t"
  101463. "adcs r4, r4, r7\n\t"
  101464. "adc r5, r5, #0\n\t"
  101465. "lsr r6, r8, #16\n\t"
  101466. "lsr r7, r9, #16\n\t"
  101467. "mul r7, r6, r7\n\t"
  101468. "adds r4, r4, r7\n\t"
  101469. "adc r5, r5, #0\n\t"
  101470. "lsl r7, r9, #16\n\t"
  101471. "lsr r7, r7, #16\n\t"
  101472. "mul r6, r7, r6\n\t"
  101473. "lsr r7, r6, #16\n\t"
  101474. "lsl r6, r6, #16\n\t"
  101475. "adds r3, r3, r6\n\t"
  101476. "adcs r4, r4, r7\n\t"
  101477. "adc r5, r5, #0\n\t"
  101478. #else
  101479. "umull r6, r7, r8, r9\n\t"
  101480. "adds r3, r3, r6\n\t"
  101481. "adcs r4, r4, r7\n\t"
  101482. "adc r5, r5, #0\n\t"
  101483. #endif
  101484. "str r3, [sp, #60]\n\t"
  101485. /* A[16] * B[0] */
  101486. "ldr r8, [%[a], #64]\n\t"
  101487. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  101488. "lsl r6, r8, #16\n\t"
  101489. "lsl r7, r9, #16\n\t"
  101490. "lsr r6, r6, #16\n\t"
  101491. "lsr r7, r7, #16\n\t"
  101492. "mul r7, r6, r7\n\t"
  101493. "adds r4, r4, r7\n\t"
  101494. "adcs r5, r5, #0\n\t"
  101495. "mov r3, #0\n\t"
  101496. "adc r3, r3, #0\n\t"
  101497. "lsr r7, r9, #16\n\t"
  101498. "mul r6, r7, r6\n\t"
  101499. "lsr r7, r6, #16\n\t"
  101500. "lsl r6, r6, #16\n\t"
  101501. "adds r4, r4, r6\n\t"
  101502. "adcs r5, r5, r7\n\t"
  101503. "adc r3, r3, #0\n\t"
  101504. "lsr r6, r8, #16\n\t"
  101505. "lsr r7, r9, #16\n\t"
  101506. "mul r7, r6, r7\n\t"
  101507. "adds r5, r5, r7\n\t"
  101508. "adc r3, r3, #0\n\t"
  101509. "lsl r7, r9, #16\n\t"
  101510. "lsr r7, r7, #16\n\t"
  101511. "mul r6, r7, r6\n\t"
  101512. "lsr r7, r6, #16\n\t"
  101513. "lsl r6, r6, #16\n\t"
  101514. "adds r4, r4, r6\n\t"
  101515. "adcs r5, r5, r7\n\t"
  101516. "adc r3, r3, #0\n\t"
  101517. #else
  101518. "umull r6, r7, r8, r9\n\t"
  101519. "adds r4, r4, r6\n\t"
  101520. "adcs r5, r5, r7\n\t"
  101521. "mov r3, #0\n\t"
  101522. "adc r3, r3, #0\n\t"
  101523. #endif
  101524. /* A[15] * B[1] */
  101525. "ldr r8, [%[a], #60]\n\t"
  101526. "ldr r9, [%[b], #4]\n\t"
  101527. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  101528. "lsl r6, r8, #16\n\t"
  101529. "lsl r7, r9, #16\n\t"
  101530. "lsr r6, r6, #16\n\t"
  101531. "lsr r7, r7, #16\n\t"
  101532. "mul r7, r6, r7\n\t"
  101533. "adds r4, r4, r7\n\t"
  101534. "adcs r5, r5, #0\n\t"
  101535. "adc r3, r3, #0\n\t"
  101536. "lsr r7, r9, #16\n\t"
  101537. "mul r6, r7, r6\n\t"
  101538. "lsr r7, r6, #16\n\t"
  101539. "lsl r6, r6, #16\n\t"
  101540. "adds r4, r4, r6\n\t"
  101541. "adcs r5, r5, r7\n\t"
  101542. "adc r3, r3, #0\n\t"
  101543. "lsr r6, r8, #16\n\t"
  101544. "lsr r7, r9, #16\n\t"
  101545. "mul r7, r6, r7\n\t"
  101546. "adds r5, r5, r7\n\t"
  101547. "adc r3, r3, #0\n\t"
  101548. "lsl r7, r9, #16\n\t"
  101549. "lsr r7, r7, #16\n\t"
  101550. "mul r6, r7, r6\n\t"
  101551. "lsr r7, r6, #16\n\t"
  101552. "lsl r6, r6, #16\n\t"
  101553. "adds r4, r4, r6\n\t"
  101554. "adcs r5, r5, r7\n\t"
  101555. "adc r3, r3, #0\n\t"
  101556. #else
  101557. "umull r6, r7, r8, r9\n\t"
  101558. "adds r4, r4, r6\n\t"
  101559. "adcs r5, r5, r7\n\t"
  101560. "adc r3, r3, #0\n\t"
  101561. #endif
  101562. /* A[14] * B[2] */
  101563. "ldr r8, [%[a], #56]\n\t"
  101564. "ldr r9, [%[b], #8]\n\t"
  101565. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  101566. "lsl r6, r8, #16\n\t"
  101567. "lsl r7, r9, #16\n\t"
  101568. "lsr r6, r6, #16\n\t"
  101569. "lsr r7, r7, #16\n\t"
  101570. "mul r7, r6, r7\n\t"
  101571. "adds r4, r4, r7\n\t"
  101572. "adcs r5, r5, #0\n\t"
  101573. "adc r3, r3, #0\n\t"
  101574. "lsr r7, r9, #16\n\t"
  101575. "mul r6, r7, r6\n\t"
  101576. "lsr r7, r6, #16\n\t"
  101577. "lsl r6, r6, #16\n\t"
  101578. "adds r4, r4, r6\n\t"
  101579. "adcs r5, r5, r7\n\t"
  101580. "adc r3, r3, #0\n\t"
  101581. "lsr r6, r8, #16\n\t"
  101582. "lsr r7, r9, #16\n\t"
  101583. "mul r7, r6, r7\n\t"
  101584. "adds r5, r5, r7\n\t"
  101585. "adc r3, r3, #0\n\t"
  101586. "lsl r7, r9, #16\n\t"
  101587. "lsr r7, r7, #16\n\t"
  101588. "mul r6, r7, r6\n\t"
  101589. "lsr r7, r6, #16\n\t"
  101590. "lsl r6, r6, #16\n\t"
  101591. "adds r4, r4, r6\n\t"
  101592. "adcs r5, r5, r7\n\t"
  101593. "adc r3, r3, #0\n\t"
  101594. #else
  101595. "umull r6, r7, r8, r9\n\t"
  101596. "adds r4, r4, r6\n\t"
  101597. "adcs r5, r5, r7\n\t"
  101598. "adc r3, r3, #0\n\t"
  101599. #endif
  101600. /* A[13] * B[3] */
  101601. "ldr r8, [%[a], #52]\n\t"
  101602. "ldr r9, [%[b], #12]\n\t"
  101603. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  101604. "lsl r6, r8, #16\n\t"
  101605. "lsl r7, r9, #16\n\t"
  101606. "lsr r6, r6, #16\n\t"
  101607. "lsr r7, r7, #16\n\t"
  101608. "mul r7, r6, r7\n\t"
  101609. "adds r4, r4, r7\n\t"
  101610. "adcs r5, r5, #0\n\t"
  101611. "adc r3, r3, #0\n\t"
  101612. "lsr r7, r9, #16\n\t"
  101613. "mul r6, r7, r6\n\t"
  101614. "lsr r7, r6, #16\n\t"
  101615. "lsl r6, r6, #16\n\t"
  101616. "adds r4, r4, r6\n\t"
  101617. "adcs r5, r5, r7\n\t"
  101618. "adc r3, r3, #0\n\t"
  101619. "lsr r6, r8, #16\n\t"
  101620. "lsr r7, r9, #16\n\t"
  101621. "mul r7, r6, r7\n\t"
  101622. "adds r5, r5, r7\n\t"
  101623. "adc r3, r3, #0\n\t"
  101624. "lsl r7, r9, #16\n\t"
  101625. "lsr r7, r7, #16\n\t"
  101626. "mul r6, r7, r6\n\t"
  101627. "lsr r7, r6, #16\n\t"
  101628. "lsl r6, r6, #16\n\t"
  101629. "adds r4, r4, r6\n\t"
  101630. "adcs r5, r5, r7\n\t"
  101631. "adc r3, r3, #0\n\t"
  101632. #else
  101633. "umull r6, r7, r8, r9\n\t"
  101634. "adds r4, r4, r6\n\t"
  101635. "adcs r5, r5, r7\n\t"
  101636. "adc r3, r3, #0\n\t"
  101637. #endif
  101638. /* A[12] * B[4] */
  101639. "ldr r8, [%[a], #48]\n\t"
  101640. "ldr r9, [%[b], #16]\n\t"
  101641. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  101642. "lsl r6, r8, #16\n\t"
  101643. "lsl r7, r9, #16\n\t"
  101644. "lsr r6, r6, #16\n\t"
  101645. "lsr r7, r7, #16\n\t"
  101646. "mul r7, r6, r7\n\t"
  101647. "adds r4, r4, r7\n\t"
  101648. "adcs r5, r5, #0\n\t"
  101649. "adc r3, r3, #0\n\t"
  101650. "lsr r7, r9, #16\n\t"
  101651. "mul r6, r7, r6\n\t"
  101652. "lsr r7, r6, #16\n\t"
  101653. "lsl r6, r6, #16\n\t"
  101654. "adds r4, r4, r6\n\t"
  101655. "adcs r5, r5, r7\n\t"
  101656. "adc r3, r3, #0\n\t"
  101657. "lsr r6, r8, #16\n\t"
  101658. "lsr r7, r9, #16\n\t"
  101659. "mul r7, r6, r7\n\t"
  101660. "adds r5, r5, r7\n\t"
  101661. "adc r3, r3, #0\n\t"
  101662. "lsl r7, r9, #16\n\t"
  101663. "lsr r7, r7, #16\n\t"
  101664. "mul r6, r7, r6\n\t"
  101665. "lsr r7, r6, #16\n\t"
  101666. "lsl r6, r6, #16\n\t"
  101667. "adds r4, r4, r6\n\t"
  101668. "adcs r5, r5, r7\n\t"
  101669. "adc r3, r3, #0\n\t"
  101670. #else
  101671. "umull r6, r7, r8, r9\n\t"
  101672. "adds r4, r4, r6\n\t"
  101673. "adcs r5, r5, r7\n\t"
  101674. "adc r3, r3, #0\n\t"
  101675. #endif
  101676. /* A[11] * B[5] */
  101677. "ldr r8, [%[a], #44]\n\t"
  101678. "ldr r9, [%[b], #20]\n\t"
  101679. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  101680. "lsl r6, r8, #16\n\t"
  101681. "lsl r7, r9, #16\n\t"
  101682. "lsr r6, r6, #16\n\t"
  101683. "lsr r7, r7, #16\n\t"
  101684. "mul r7, r6, r7\n\t"
  101685. "adds r4, r4, r7\n\t"
  101686. "adcs r5, r5, #0\n\t"
  101687. "adc r3, r3, #0\n\t"
  101688. "lsr r7, r9, #16\n\t"
  101689. "mul r6, r7, r6\n\t"
  101690. "lsr r7, r6, #16\n\t"
  101691. "lsl r6, r6, #16\n\t"
  101692. "adds r4, r4, r6\n\t"
  101693. "adcs r5, r5, r7\n\t"
  101694. "adc r3, r3, #0\n\t"
  101695. "lsr r6, r8, #16\n\t"
  101696. "lsr r7, r9, #16\n\t"
  101697. "mul r7, r6, r7\n\t"
  101698. "adds r5, r5, r7\n\t"
  101699. "adc r3, r3, #0\n\t"
  101700. "lsl r7, r9, #16\n\t"
  101701. "lsr r7, r7, #16\n\t"
  101702. "mul r6, r7, r6\n\t"
  101703. "lsr r7, r6, #16\n\t"
  101704. "lsl r6, r6, #16\n\t"
  101705. "adds r4, r4, r6\n\t"
  101706. "adcs r5, r5, r7\n\t"
  101707. "adc r3, r3, #0\n\t"
  101708. #else
  101709. "umull r6, r7, r8, r9\n\t"
  101710. "adds r4, r4, r6\n\t"
  101711. "adcs r5, r5, r7\n\t"
  101712. "adc r3, r3, #0\n\t"
  101713. #endif
  101714. /* A[10] * B[6] */
  101715. "ldr r8, [%[a], #40]\n\t"
  101716. "ldr r9, [%[b], #24]\n\t"
  101717. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  101718. "lsl r6, r8, #16\n\t"
  101719. "lsl r7, r9, #16\n\t"
  101720. "lsr r6, r6, #16\n\t"
  101721. "lsr r7, r7, #16\n\t"
  101722. "mul r7, r6, r7\n\t"
  101723. "adds r4, r4, r7\n\t"
  101724. "adcs r5, r5, #0\n\t"
  101725. "adc r3, r3, #0\n\t"
  101726. "lsr r7, r9, #16\n\t"
  101727. "mul r6, r7, r6\n\t"
  101728. "lsr r7, r6, #16\n\t"
  101729. "lsl r6, r6, #16\n\t"
  101730. "adds r4, r4, r6\n\t"
  101731. "adcs r5, r5, r7\n\t"
  101732. "adc r3, r3, #0\n\t"
  101733. "lsr r6, r8, #16\n\t"
  101734. "lsr r7, r9, #16\n\t"
  101735. "mul r7, r6, r7\n\t"
  101736. "adds r5, r5, r7\n\t"
  101737. "adc r3, r3, #0\n\t"
  101738. "lsl r7, r9, #16\n\t"
  101739. "lsr r7, r7, #16\n\t"
  101740. "mul r6, r7, r6\n\t"
  101741. "lsr r7, r6, #16\n\t"
  101742. "lsl r6, r6, #16\n\t"
  101743. "adds r4, r4, r6\n\t"
  101744. "adcs r5, r5, r7\n\t"
  101745. "adc r3, r3, #0\n\t"
  101746. #else
  101747. "umull r6, r7, r8, r9\n\t"
  101748. "adds r4, r4, r6\n\t"
  101749. "adcs r5, r5, r7\n\t"
  101750. "adc r3, r3, #0\n\t"
  101751. #endif
  101752. /* A[9] * B[7] */
  101753. "ldr r8, [%[a], #36]\n\t"
  101754. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  101755. "lsl r6, r8, #16\n\t"
  101756. "lsl r7, r12, #16\n\t"
  101757. "lsr r6, r6, #16\n\t"
  101758. "lsr r7, r7, #16\n\t"
  101759. "mul r7, r6, r7\n\t"
  101760. "adds r4, r4, r7\n\t"
  101761. "adcs r5, r5, #0\n\t"
  101762. "adc r3, r3, #0\n\t"
  101763. "lsr r7, r12, #16\n\t"
  101764. "mul r6, r7, r6\n\t"
  101765. "lsr r7, r6, #16\n\t"
  101766. "lsl r6, r6, #16\n\t"
  101767. "adds r4, r4, r6\n\t"
  101768. "adcs r5, r5, r7\n\t"
  101769. "adc r3, r3, #0\n\t"
  101770. "lsr r6, r8, #16\n\t"
  101771. "lsr r7, r12, #16\n\t"
  101772. "mul r7, r6, r7\n\t"
  101773. "adds r5, r5, r7\n\t"
  101774. "adc r3, r3, #0\n\t"
  101775. "lsl r7, r12, #16\n\t"
  101776. "lsr r7, r7, #16\n\t"
  101777. "mul r6, r7, r6\n\t"
  101778. "lsr r7, r6, #16\n\t"
  101779. "lsl r6, r6, #16\n\t"
  101780. "adds r4, r4, r6\n\t"
  101781. "adcs r5, r5, r7\n\t"
  101782. "adc r3, r3, #0\n\t"
  101783. #else
  101784. "umull r6, r7, r8, r12\n\t"
  101785. "adds r4, r4, r6\n\t"
  101786. "adcs r5, r5, r7\n\t"
  101787. "adc r3, r3, #0\n\t"
  101788. #endif
  101789. /* A[8] * B[8] */
  101790. "ldr r11, [%[a], #32]\n\t"
  101791. "ldr r12, [%[b], #32]\n\t"
  101792. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  101793. "lsl r6, r11, #16\n\t"
  101794. "lsl r7, r12, #16\n\t"
  101795. "lsr r6, r6, #16\n\t"
  101796. "lsr r7, r7, #16\n\t"
  101797. "mul r7, r6, r7\n\t"
  101798. "adds r4, r4, r7\n\t"
  101799. "adcs r5, r5, #0\n\t"
  101800. "adc r3, r3, #0\n\t"
  101801. "lsr r7, r12, #16\n\t"
  101802. "mul r6, r7, r6\n\t"
  101803. "lsr r7, r6, #16\n\t"
  101804. "lsl r6, r6, #16\n\t"
  101805. "adds r4, r4, r6\n\t"
  101806. "adcs r5, r5, r7\n\t"
  101807. "adc r3, r3, #0\n\t"
  101808. "lsr r6, r11, #16\n\t"
  101809. "lsr r7, r12, #16\n\t"
  101810. "mul r7, r6, r7\n\t"
  101811. "adds r5, r5, r7\n\t"
  101812. "adc r3, r3, #0\n\t"
  101813. "lsl r7, r12, #16\n\t"
  101814. "lsr r7, r7, #16\n\t"
  101815. "mul r6, r7, r6\n\t"
  101816. "lsr r7, r6, #16\n\t"
  101817. "lsl r6, r6, #16\n\t"
  101818. "adds r4, r4, r6\n\t"
  101819. "adcs r5, r5, r7\n\t"
  101820. "adc r3, r3, #0\n\t"
  101821. #else
  101822. "umull r6, r7, r11, r12\n\t"
  101823. "adds r4, r4, r6\n\t"
  101824. "adcs r5, r5, r7\n\t"
  101825. "adc r3, r3, #0\n\t"
  101826. #endif
  101827. /* A[7] * B[9] */
  101828. "ldr r8, [%[a], #28]\n\t"
  101829. "ldr r9, [%[b], #36]\n\t"
  101830. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  101831. "lsl r6, r8, #16\n\t"
  101832. "lsl r7, r9, #16\n\t"
  101833. "lsr r6, r6, #16\n\t"
  101834. "lsr r7, r7, #16\n\t"
  101835. "mul r7, r6, r7\n\t"
  101836. "adds r4, r4, r7\n\t"
  101837. "adcs r5, r5, #0\n\t"
  101838. "adc r3, r3, #0\n\t"
  101839. "lsr r7, r9, #16\n\t"
  101840. "mul r6, r7, r6\n\t"
  101841. "lsr r7, r6, #16\n\t"
  101842. "lsl r6, r6, #16\n\t"
  101843. "adds r4, r4, r6\n\t"
  101844. "adcs r5, r5, r7\n\t"
  101845. "adc r3, r3, #0\n\t"
  101846. "lsr r6, r8, #16\n\t"
  101847. "lsr r7, r9, #16\n\t"
  101848. "mul r7, r6, r7\n\t"
  101849. "adds r5, r5, r7\n\t"
  101850. "adc r3, r3, #0\n\t"
  101851. "lsl r7, r9, #16\n\t"
  101852. "lsr r7, r7, #16\n\t"
  101853. "mul r6, r7, r6\n\t"
  101854. "lsr r7, r6, #16\n\t"
  101855. "lsl r6, r6, #16\n\t"
  101856. "adds r4, r4, r6\n\t"
  101857. "adcs r5, r5, r7\n\t"
  101858. "adc r3, r3, #0\n\t"
  101859. #else
  101860. "umull r6, r7, r8, r9\n\t"
  101861. "adds r4, r4, r6\n\t"
  101862. "adcs r5, r5, r7\n\t"
  101863. "adc r3, r3, #0\n\t"
  101864. #endif
  101865. /* A[6] * B[10] */
  101866. "ldr r8, [%[a], #24]\n\t"
  101867. "ldr r9, [%[b], #40]\n\t"
  101868. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  101869. "lsl r6, r8, #16\n\t"
  101870. "lsl r7, r9, #16\n\t"
  101871. "lsr r6, r6, #16\n\t"
  101872. "lsr r7, r7, #16\n\t"
  101873. "mul r7, r6, r7\n\t"
  101874. "adds r4, r4, r7\n\t"
  101875. "adcs r5, r5, #0\n\t"
  101876. "adc r3, r3, #0\n\t"
  101877. "lsr r7, r9, #16\n\t"
  101878. "mul r6, r7, r6\n\t"
  101879. "lsr r7, r6, #16\n\t"
  101880. "lsl r6, r6, #16\n\t"
  101881. "adds r4, r4, r6\n\t"
  101882. "adcs r5, r5, r7\n\t"
  101883. "adc r3, r3, #0\n\t"
  101884. "lsr r6, r8, #16\n\t"
  101885. "lsr r7, r9, #16\n\t"
  101886. "mul r7, r6, r7\n\t"
  101887. "adds r5, r5, r7\n\t"
  101888. "adc r3, r3, #0\n\t"
  101889. "lsl r7, r9, #16\n\t"
  101890. "lsr r7, r7, #16\n\t"
  101891. "mul r6, r7, r6\n\t"
  101892. "lsr r7, r6, #16\n\t"
  101893. "lsl r6, r6, #16\n\t"
  101894. "adds r4, r4, r6\n\t"
  101895. "adcs r5, r5, r7\n\t"
  101896. "adc r3, r3, #0\n\t"
  101897. #else
  101898. "umull r6, r7, r8, r9\n\t"
  101899. "adds r4, r4, r6\n\t"
  101900. "adcs r5, r5, r7\n\t"
  101901. "adc r3, r3, #0\n\t"
  101902. #endif
  101903. /* A[5] * B[11] */
  101904. "ldr r8, [%[a], #20]\n\t"
  101905. "ldr r9, [%[b], #44]\n\t"
  101906. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  101907. "lsl r6, r8, #16\n\t"
  101908. "lsl r7, r9, #16\n\t"
  101909. "lsr r6, r6, #16\n\t"
  101910. "lsr r7, r7, #16\n\t"
  101911. "mul r7, r6, r7\n\t"
  101912. "adds r4, r4, r7\n\t"
  101913. "adcs r5, r5, #0\n\t"
  101914. "adc r3, r3, #0\n\t"
  101915. "lsr r7, r9, #16\n\t"
  101916. "mul r6, r7, r6\n\t"
  101917. "lsr r7, r6, #16\n\t"
  101918. "lsl r6, r6, #16\n\t"
  101919. "adds r4, r4, r6\n\t"
  101920. "adcs r5, r5, r7\n\t"
  101921. "adc r3, r3, #0\n\t"
  101922. "lsr r6, r8, #16\n\t"
  101923. "lsr r7, r9, #16\n\t"
  101924. "mul r7, r6, r7\n\t"
  101925. "adds r5, r5, r7\n\t"
  101926. "adc r3, r3, #0\n\t"
  101927. "lsl r7, r9, #16\n\t"
  101928. "lsr r7, r7, #16\n\t"
  101929. "mul r6, r7, r6\n\t"
  101930. "lsr r7, r6, #16\n\t"
  101931. "lsl r6, r6, #16\n\t"
  101932. "adds r4, r4, r6\n\t"
  101933. "adcs r5, r5, r7\n\t"
  101934. "adc r3, r3, #0\n\t"
  101935. #else
  101936. "umull r6, r7, r8, r9\n\t"
  101937. "adds r4, r4, r6\n\t"
  101938. "adcs r5, r5, r7\n\t"
  101939. "adc r3, r3, #0\n\t"
  101940. #endif
  101941. /* A[4] * B[12] */
  101942. "ldr r8, [%[a], #16]\n\t"
  101943. "ldr r9, [%[b], #48]\n\t"
  101944. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  101945. "lsl r6, r8, #16\n\t"
  101946. "lsl r7, r9, #16\n\t"
  101947. "lsr r6, r6, #16\n\t"
  101948. "lsr r7, r7, #16\n\t"
  101949. "mul r7, r6, r7\n\t"
  101950. "adds r4, r4, r7\n\t"
  101951. "adcs r5, r5, #0\n\t"
  101952. "adc r3, r3, #0\n\t"
  101953. "lsr r7, r9, #16\n\t"
  101954. "mul r6, r7, r6\n\t"
  101955. "lsr r7, r6, #16\n\t"
  101956. "lsl r6, r6, #16\n\t"
  101957. "adds r4, r4, r6\n\t"
  101958. "adcs r5, r5, r7\n\t"
  101959. "adc r3, r3, #0\n\t"
  101960. "lsr r6, r8, #16\n\t"
  101961. "lsr r7, r9, #16\n\t"
  101962. "mul r7, r6, r7\n\t"
  101963. "adds r5, r5, r7\n\t"
  101964. "adc r3, r3, #0\n\t"
  101965. "lsl r7, r9, #16\n\t"
  101966. "lsr r7, r7, #16\n\t"
  101967. "mul r6, r7, r6\n\t"
  101968. "lsr r7, r6, #16\n\t"
  101969. "lsl r6, r6, #16\n\t"
  101970. "adds r4, r4, r6\n\t"
  101971. "adcs r5, r5, r7\n\t"
  101972. "adc r3, r3, #0\n\t"
  101973. #else
  101974. "umull r6, r7, r8, r9\n\t"
  101975. "adds r4, r4, r6\n\t"
  101976. "adcs r5, r5, r7\n\t"
  101977. "adc r3, r3, #0\n\t"
  101978. #endif
  101979. /* A[3] * B[13] */
  101980. "ldr r8, [%[a], #12]\n\t"
  101981. "ldr r9, [%[b], #52]\n\t"
  101982. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  101983. "lsl r6, r8, #16\n\t"
  101984. "lsl r7, r9, #16\n\t"
  101985. "lsr r6, r6, #16\n\t"
  101986. "lsr r7, r7, #16\n\t"
  101987. "mul r7, r6, r7\n\t"
  101988. "adds r4, r4, r7\n\t"
  101989. "adcs r5, r5, #0\n\t"
  101990. "adc r3, r3, #0\n\t"
  101991. "lsr r7, r9, #16\n\t"
  101992. "mul r6, r7, r6\n\t"
  101993. "lsr r7, r6, #16\n\t"
  101994. "lsl r6, r6, #16\n\t"
  101995. "adds r4, r4, r6\n\t"
  101996. "adcs r5, r5, r7\n\t"
  101997. "adc r3, r3, #0\n\t"
  101998. "lsr r6, r8, #16\n\t"
  101999. "lsr r7, r9, #16\n\t"
  102000. "mul r7, r6, r7\n\t"
  102001. "adds r5, r5, r7\n\t"
  102002. "adc r3, r3, #0\n\t"
  102003. "lsl r7, r9, #16\n\t"
  102004. "lsr r7, r7, #16\n\t"
  102005. "mul r6, r7, r6\n\t"
  102006. "lsr r7, r6, #16\n\t"
  102007. "lsl r6, r6, #16\n\t"
  102008. "adds r4, r4, r6\n\t"
  102009. "adcs r5, r5, r7\n\t"
  102010. "adc r3, r3, #0\n\t"
  102011. #else
  102012. "umull r6, r7, r8, r9\n\t"
  102013. "adds r4, r4, r6\n\t"
  102014. "adcs r5, r5, r7\n\t"
  102015. "adc r3, r3, #0\n\t"
  102016. #endif
  102017. /* A[2] * B[14] */
  102018. "ldr r8, [%[a], #8]\n\t"
  102019. "ldr r9, [%[b], #56]\n\t"
  102020. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  102021. "lsl r6, r8, #16\n\t"
  102022. "lsl r7, r9, #16\n\t"
  102023. "lsr r6, r6, #16\n\t"
  102024. "lsr r7, r7, #16\n\t"
  102025. "mul r7, r6, r7\n\t"
  102026. "adds r4, r4, r7\n\t"
  102027. "adcs r5, r5, #0\n\t"
  102028. "adc r3, r3, #0\n\t"
  102029. "lsr r7, r9, #16\n\t"
  102030. "mul r6, r7, r6\n\t"
  102031. "lsr r7, r6, #16\n\t"
  102032. "lsl r6, r6, #16\n\t"
  102033. "adds r4, r4, r6\n\t"
  102034. "adcs r5, r5, r7\n\t"
  102035. "adc r3, r3, #0\n\t"
  102036. "lsr r6, r8, #16\n\t"
  102037. "lsr r7, r9, #16\n\t"
  102038. "mul r7, r6, r7\n\t"
  102039. "adds r5, r5, r7\n\t"
  102040. "adc r3, r3, #0\n\t"
  102041. "lsl r7, r9, #16\n\t"
  102042. "lsr r7, r7, #16\n\t"
  102043. "mul r6, r7, r6\n\t"
  102044. "lsr r7, r6, #16\n\t"
  102045. "lsl r6, r6, #16\n\t"
  102046. "adds r4, r4, r6\n\t"
  102047. "adcs r5, r5, r7\n\t"
  102048. "adc r3, r3, #0\n\t"
  102049. #else
  102050. "umull r6, r7, r8, r9\n\t"
  102051. "adds r4, r4, r6\n\t"
  102052. "adcs r5, r5, r7\n\t"
  102053. "adc r3, r3, #0\n\t"
  102054. #endif
  102055. /* A[1] * B[15] */
  102056. "ldr r8, [%[a], #4]\n\t"
  102057. "ldr r9, [%[b], #60]\n\t"
  102058. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  102059. "lsl r6, r8, #16\n\t"
  102060. "lsl r7, r9, #16\n\t"
  102061. "lsr r6, r6, #16\n\t"
  102062. "lsr r7, r7, #16\n\t"
  102063. "mul r7, r6, r7\n\t"
  102064. "adds r4, r4, r7\n\t"
  102065. "adcs r5, r5, #0\n\t"
  102066. "adc r3, r3, #0\n\t"
  102067. "lsr r7, r9, #16\n\t"
  102068. "mul r6, r7, r6\n\t"
  102069. "lsr r7, r6, #16\n\t"
  102070. "lsl r6, r6, #16\n\t"
  102071. "adds r4, r4, r6\n\t"
  102072. "adcs r5, r5, r7\n\t"
  102073. "adc r3, r3, #0\n\t"
  102074. "lsr r6, r8, #16\n\t"
  102075. "lsr r7, r9, #16\n\t"
  102076. "mul r7, r6, r7\n\t"
  102077. "adds r5, r5, r7\n\t"
  102078. "adc r3, r3, #0\n\t"
  102079. "lsl r7, r9, #16\n\t"
  102080. "lsr r7, r7, #16\n\t"
  102081. "mul r6, r7, r6\n\t"
  102082. "lsr r7, r6, #16\n\t"
  102083. "lsl r6, r6, #16\n\t"
  102084. "adds r4, r4, r6\n\t"
  102085. "adcs r5, r5, r7\n\t"
  102086. "adc r3, r3, #0\n\t"
  102087. #else
  102088. "umull r6, r7, r8, r9\n\t"
  102089. "adds r4, r4, r6\n\t"
  102090. "adcs r5, r5, r7\n\t"
  102091. "adc r3, r3, #0\n\t"
  102092. #endif
  102093. /* A[0] * B[16] */
  102094. "ldr r8, [%[a]]\n\t"
  102095. "ldr r9, [%[b], #64]\n\t"
  102096. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  102097. "lsl r6, r8, #16\n\t"
  102098. "lsl r7, r9, #16\n\t"
  102099. "lsr r6, r6, #16\n\t"
  102100. "lsr r7, r7, #16\n\t"
  102101. "mul r7, r6, r7\n\t"
  102102. "adds r4, r4, r7\n\t"
  102103. "adcs r5, r5, #0\n\t"
  102104. "adc r3, r3, #0\n\t"
  102105. "lsr r7, r9, #16\n\t"
  102106. "mul r6, r7, r6\n\t"
  102107. "lsr r7, r6, #16\n\t"
  102108. "lsl r6, r6, #16\n\t"
  102109. "adds r4, r4, r6\n\t"
  102110. "adcs r5, r5, r7\n\t"
  102111. "adc r3, r3, #0\n\t"
  102112. "lsr r6, r8, #16\n\t"
  102113. "lsr r7, r9, #16\n\t"
  102114. "mul r7, r6, r7\n\t"
  102115. "adds r5, r5, r7\n\t"
  102116. "adc r3, r3, #0\n\t"
  102117. "lsl r7, r9, #16\n\t"
  102118. "lsr r7, r7, #16\n\t"
  102119. "mul r6, r7, r6\n\t"
  102120. "lsr r7, r6, #16\n\t"
  102121. "lsl r6, r6, #16\n\t"
  102122. "adds r4, r4, r6\n\t"
  102123. "adcs r5, r5, r7\n\t"
  102124. "adc r3, r3, #0\n\t"
  102125. #else
  102126. "umull r6, r7, r8, r9\n\t"
  102127. "adds r4, r4, r6\n\t"
  102128. "adcs r5, r5, r7\n\t"
  102129. "adc r3, r3, #0\n\t"
  102130. #endif
  102131. "str r4, [sp, #64]\n\t"
  102132. /* A[1] * B[16] */
  102133. "ldr r8, [%[a], #4]\n\t"
  102134. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  102135. "lsl r6, r8, #16\n\t"
  102136. "lsl r7, r9, #16\n\t"
  102137. "lsr r6, r6, #16\n\t"
  102138. "lsr r7, r7, #16\n\t"
  102139. "mul r7, r6, r7\n\t"
  102140. "adds r5, r5, r7\n\t"
  102141. "adcs r3, r3, #0\n\t"
  102142. "mov r4, #0\n\t"
  102143. "adc r4, r4, #0\n\t"
  102144. "lsr r7, r9, #16\n\t"
  102145. "mul r6, r7, r6\n\t"
  102146. "lsr r7, r6, #16\n\t"
  102147. "lsl r6, r6, #16\n\t"
  102148. "adds r5, r5, r6\n\t"
  102149. "adcs r3, r3, r7\n\t"
  102150. "adc r4, r4, #0\n\t"
  102151. "lsr r6, r8, #16\n\t"
  102152. "lsr r7, r9, #16\n\t"
  102153. "mul r7, r6, r7\n\t"
  102154. "adds r3, r3, r7\n\t"
  102155. "adc r4, r4, #0\n\t"
  102156. "lsl r7, r9, #16\n\t"
  102157. "lsr r7, r7, #16\n\t"
  102158. "mul r6, r7, r6\n\t"
  102159. "lsr r7, r6, #16\n\t"
  102160. "lsl r6, r6, #16\n\t"
  102161. "adds r5, r5, r6\n\t"
  102162. "adcs r3, r3, r7\n\t"
  102163. "adc r4, r4, #0\n\t"
  102164. #else
  102165. "umull r6, r7, r8, r9\n\t"
  102166. "adds r5, r5, r6\n\t"
  102167. "adcs r3, r3, r7\n\t"
  102168. "mov r4, #0\n\t"
  102169. "adc r4, r4, #0\n\t"
  102170. #endif
  102171. /* A[2] * B[15] */
  102172. "ldr r8, [%[a], #8]\n\t"
  102173. "ldr r9, [%[b], #60]\n\t"
  102174. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  102175. "lsl r6, r8, #16\n\t"
  102176. "lsl r7, r9, #16\n\t"
  102177. "lsr r6, r6, #16\n\t"
  102178. "lsr r7, r7, #16\n\t"
  102179. "mul r7, r6, r7\n\t"
  102180. "adds r5, r5, r7\n\t"
  102181. "adcs r3, r3, #0\n\t"
  102182. "adc r4, r4, #0\n\t"
  102183. "lsr r7, r9, #16\n\t"
  102184. "mul r6, r7, r6\n\t"
  102185. "lsr r7, r6, #16\n\t"
  102186. "lsl r6, r6, #16\n\t"
  102187. "adds r5, r5, r6\n\t"
  102188. "adcs r3, r3, r7\n\t"
  102189. "adc r4, r4, #0\n\t"
  102190. "lsr r6, r8, #16\n\t"
  102191. "lsr r7, r9, #16\n\t"
  102192. "mul r7, r6, r7\n\t"
  102193. "adds r3, r3, r7\n\t"
  102194. "adc r4, r4, #0\n\t"
  102195. "lsl r7, r9, #16\n\t"
  102196. "lsr r7, r7, #16\n\t"
  102197. "mul r6, r7, r6\n\t"
  102198. "lsr r7, r6, #16\n\t"
  102199. "lsl r6, r6, #16\n\t"
  102200. "adds r5, r5, r6\n\t"
  102201. "adcs r3, r3, r7\n\t"
  102202. "adc r4, r4, #0\n\t"
  102203. #else
  102204. "umull r6, r7, r8, r9\n\t"
  102205. "adds r5, r5, r6\n\t"
  102206. "adcs r3, r3, r7\n\t"
  102207. "adc r4, r4, #0\n\t"
  102208. #endif
  102209. /* A[3] * B[14] */
  102210. "ldr r8, [%[a], #12]\n\t"
  102211. "ldr r9, [%[b], #56]\n\t"
  102212. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  102213. "lsl r6, r8, #16\n\t"
  102214. "lsl r7, r9, #16\n\t"
  102215. "lsr r6, r6, #16\n\t"
  102216. "lsr r7, r7, #16\n\t"
  102217. "mul r7, r6, r7\n\t"
  102218. "adds r5, r5, r7\n\t"
  102219. "adcs r3, r3, #0\n\t"
  102220. "adc r4, r4, #0\n\t"
  102221. "lsr r7, r9, #16\n\t"
  102222. "mul r6, r7, r6\n\t"
  102223. "lsr r7, r6, #16\n\t"
  102224. "lsl r6, r6, #16\n\t"
  102225. "adds r5, r5, r6\n\t"
  102226. "adcs r3, r3, r7\n\t"
  102227. "adc r4, r4, #0\n\t"
  102228. "lsr r6, r8, #16\n\t"
  102229. "lsr r7, r9, #16\n\t"
  102230. "mul r7, r6, r7\n\t"
  102231. "adds r3, r3, r7\n\t"
  102232. "adc r4, r4, #0\n\t"
  102233. "lsl r7, r9, #16\n\t"
  102234. "lsr r7, r7, #16\n\t"
  102235. "mul r6, r7, r6\n\t"
  102236. "lsr r7, r6, #16\n\t"
  102237. "lsl r6, r6, #16\n\t"
  102238. "adds r5, r5, r6\n\t"
  102239. "adcs r3, r3, r7\n\t"
  102240. "adc r4, r4, #0\n\t"
  102241. #else
  102242. "umull r6, r7, r8, r9\n\t"
  102243. "adds r5, r5, r6\n\t"
  102244. "adcs r3, r3, r7\n\t"
  102245. "adc r4, r4, #0\n\t"
  102246. #endif
  102247. /* A[4] * B[13] */
  102248. "ldr r8, [%[a], #16]\n\t"
  102249. "ldr r9, [%[b], #52]\n\t"
  102250. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  102251. "lsl r6, r8, #16\n\t"
  102252. "lsl r7, r9, #16\n\t"
  102253. "lsr r6, r6, #16\n\t"
  102254. "lsr r7, r7, #16\n\t"
  102255. "mul r7, r6, r7\n\t"
  102256. "adds r5, r5, r7\n\t"
  102257. "adcs r3, r3, #0\n\t"
  102258. "adc r4, r4, #0\n\t"
  102259. "lsr r7, r9, #16\n\t"
  102260. "mul r6, r7, r6\n\t"
  102261. "lsr r7, r6, #16\n\t"
  102262. "lsl r6, r6, #16\n\t"
  102263. "adds r5, r5, r6\n\t"
  102264. "adcs r3, r3, r7\n\t"
  102265. "adc r4, r4, #0\n\t"
  102266. "lsr r6, r8, #16\n\t"
  102267. "lsr r7, r9, #16\n\t"
  102268. "mul r7, r6, r7\n\t"
  102269. "adds r3, r3, r7\n\t"
  102270. "adc r4, r4, #0\n\t"
  102271. "lsl r7, r9, #16\n\t"
  102272. "lsr r7, r7, #16\n\t"
  102273. "mul r6, r7, r6\n\t"
  102274. "lsr r7, r6, #16\n\t"
  102275. "lsl r6, r6, #16\n\t"
  102276. "adds r5, r5, r6\n\t"
  102277. "adcs r3, r3, r7\n\t"
  102278. "adc r4, r4, #0\n\t"
  102279. #else
  102280. "umull r6, r7, r8, r9\n\t"
  102281. "adds r5, r5, r6\n\t"
  102282. "adcs r3, r3, r7\n\t"
  102283. "adc r4, r4, #0\n\t"
  102284. #endif
  102285. /* A[5] * B[12] */
  102286. "ldr r8, [%[a], #20]\n\t"
  102287. "ldr r9, [%[b], #48]\n\t"
  102288. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  102289. "lsl r6, r8, #16\n\t"
  102290. "lsl r7, r9, #16\n\t"
  102291. "lsr r6, r6, #16\n\t"
  102292. "lsr r7, r7, #16\n\t"
  102293. "mul r7, r6, r7\n\t"
  102294. "adds r5, r5, r7\n\t"
  102295. "adcs r3, r3, #0\n\t"
  102296. "adc r4, r4, #0\n\t"
  102297. "lsr r7, r9, #16\n\t"
  102298. "mul r6, r7, r6\n\t"
  102299. "lsr r7, r6, #16\n\t"
  102300. "lsl r6, r6, #16\n\t"
  102301. "adds r5, r5, r6\n\t"
  102302. "adcs r3, r3, r7\n\t"
  102303. "adc r4, r4, #0\n\t"
  102304. "lsr r6, r8, #16\n\t"
  102305. "lsr r7, r9, #16\n\t"
  102306. "mul r7, r6, r7\n\t"
  102307. "adds r3, r3, r7\n\t"
  102308. "adc r4, r4, #0\n\t"
  102309. "lsl r7, r9, #16\n\t"
  102310. "lsr r7, r7, #16\n\t"
  102311. "mul r6, r7, r6\n\t"
  102312. "lsr r7, r6, #16\n\t"
  102313. "lsl r6, r6, #16\n\t"
  102314. "adds r5, r5, r6\n\t"
  102315. "adcs r3, r3, r7\n\t"
  102316. "adc r4, r4, #0\n\t"
  102317. #else
  102318. "umull r6, r7, r8, r9\n\t"
  102319. "adds r5, r5, r6\n\t"
  102320. "adcs r3, r3, r7\n\t"
  102321. "adc r4, r4, #0\n\t"
  102322. #endif
  102323. /* A[6] * B[11] */
  102324. "ldr r8, [%[a], #24]\n\t"
  102325. "ldr r9, [%[b], #44]\n\t"
  102326. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  102327. "lsl r6, r8, #16\n\t"
  102328. "lsl r7, r9, #16\n\t"
  102329. "lsr r6, r6, #16\n\t"
  102330. "lsr r7, r7, #16\n\t"
  102331. "mul r7, r6, r7\n\t"
  102332. "adds r5, r5, r7\n\t"
  102333. "adcs r3, r3, #0\n\t"
  102334. "adc r4, r4, #0\n\t"
  102335. "lsr r7, r9, #16\n\t"
  102336. "mul r6, r7, r6\n\t"
  102337. "lsr r7, r6, #16\n\t"
  102338. "lsl r6, r6, #16\n\t"
  102339. "adds r5, r5, r6\n\t"
  102340. "adcs r3, r3, r7\n\t"
  102341. "adc r4, r4, #0\n\t"
  102342. "lsr r6, r8, #16\n\t"
  102343. "lsr r7, r9, #16\n\t"
  102344. "mul r7, r6, r7\n\t"
  102345. "adds r3, r3, r7\n\t"
  102346. "adc r4, r4, #0\n\t"
  102347. "lsl r7, r9, #16\n\t"
  102348. "lsr r7, r7, #16\n\t"
  102349. "mul r6, r7, r6\n\t"
  102350. "lsr r7, r6, #16\n\t"
  102351. "lsl r6, r6, #16\n\t"
  102352. "adds r5, r5, r6\n\t"
  102353. "adcs r3, r3, r7\n\t"
  102354. "adc r4, r4, #0\n\t"
  102355. #else
  102356. "umull r6, r7, r8, r9\n\t"
  102357. "adds r5, r5, r6\n\t"
  102358. "adcs r3, r3, r7\n\t"
  102359. "adc r4, r4, #0\n\t"
  102360. #endif
  102361. /* A[7] * B[10] */
  102362. "ldr r8, [%[a], #28]\n\t"
  102363. "ldr r9, [%[b], #40]\n\t"
  102364. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  102365. "lsl r6, r8, #16\n\t"
  102366. "lsl r7, r9, #16\n\t"
  102367. "lsr r6, r6, #16\n\t"
  102368. "lsr r7, r7, #16\n\t"
  102369. "mul r7, r6, r7\n\t"
  102370. "adds r5, r5, r7\n\t"
  102371. "adcs r3, r3, #0\n\t"
  102372. "adc r4, r4, #0\n\t"
  102373. "lsr r7, r9, #16\n\t"
  102374. "mul r6, r7, r6\n\t"
  102375. "lsr r7, r6, #16\n\t"
  102376. "lsl r6, r6, #16\n\t"
  102377. "adds r5, r5, r6\n\t"
  102378. "adcs r3, r3, r7\n\t"
  102379. "adc r4, r4, #0\n\t"
  102380. "lsr r6, r8, #16\n\t"
  102381. "lsr r7, r9, #16\n\t"
  102382. "mul r7, r6, r7\n\t"
  102383. "adds r3, r3, r7\n\t"
  102384. "adc r4, r4, #0\n\t"
  102385. "lsl r7, r9, #16\n\t"
  102386. "lsr r7, r7, #16\n\t"
  102387. "mul r6, r7, r6\n\t"
  102388. "lsr r7, r6, #16\n\t"
  102389. "lsl r6, r6, #16\n\t"
  102390. "adds r5, r5, r6\n\t"
  102391. "adcs r3, r3, r7\n\t"
  102392. "adc r4, r4, #0\n\t"
  102393. #else
  102394. "umull r6, r7, r8, r9\n\t"
  102395. "adds r5, r5, r6\n\t"
  102396. "adcs r3, r3, r7\n\t"
  102397. "adc r4, r4, #0\n\t"
  102398. #endif
  102399. /* A[8] * B[9] */
  102400. "ldr r9, [%[b], #36]\n\t"
  102401. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  102402. "lsl r6, r11, #16\n\t"
  102403. "lsl r7, r9, #16\n\t"
  102404. "lsr r6, r6, #16\n\t"
  102405. "lsr r7, r7, #16\n\t"
  102406. "mul r7, r6, r7\n\t"
  102407. "adds r5, r5, r7\n\t"
  102408. "adcs r3, r3, #0\n\t"
  102409. "adc r4, r4, #0\n\t"
  102410. "lsr r7, r9, #16\n\t"
  102411. "mul r6, r7, r6\n\t"
  102412. "lsr r7, r6, #16\n\t"
  102413. "lsl r6, r6, #16\n\t"
  102414. "adds r5, r5, r6\n\t"
  102415. "adcs r3, r3, r7\n\t"
  102416. "adc r4, r4, #0\n\t"
  102417. "lsr r6, r11, #16\n\t"
  102418. "lsr r7, r9, #16\n\t"
  102419. "mul r7, r6, r7\n\t"
  102420. "adds r3, r3, r7\n\t"
  102421. "adc r4, r4, #0\n\t"
  102422. "lsl r7, r9, #16\n\t"
  102423. "lsr r7, r7, #16\n\t"
  102424. "mul r6, r7, r6\n\t"
  102425. "lsr r7, r6, #16\n\t"
  102426. "lsl r6, r6, #16\n\t"
  102427. "adds r5, r5, r6\n\t"
  102428. "adcs r3, r3, r7\n\t"
  102429. "adc r4, r4, #0\n\t"
  102430. #else
  102431. "umull r6, r7, r11, r9\n\t"
  102432. "adds r5, r5, r6\n\t"
  102433. "adcs r3, r3, r7\n\t"
  102434. "adc r4, r4, #0\n\t"
  102435. #endif
  102436. /* A[9] * B[8] */
  102437. "ldr r8, [%[a], #36]\n\t"
  102438. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  102439. "lsl r6, r8, #16\n\t"
  102440. "lsl r7, r12, #16\n\t"
  102441. "lsr r6, r6, #16\n\t"
  102442. "lsr r7, r7, #16\n\t"
  102443. "mul r7, r6, r7\n\t"
  102444. "adds r5, r5, r7\n\t"
  102445. "adcs r3, r3, #0\n\t"
  102446. "adc r4, r4, #0\n\t"
  102447. "lsr r7, r12, #16\n\t"
  102448. "mul r6, r7, r6\n\t"
  102449. "lsr r7, r6, #16\n\t"
  102450. "lsl r6, r6, #16\n\t"
  102451. "adds r5, r5, r6\n\t"
  102452. "adcs r3, r3, r7\n\t"
  102453. "adc r4, r4, #0\n\t"
  102454. "lsr r6, r8, #16\n\t"
  102455. "lsr r7, r12, #16\n\t"
  102456. "mul r7, r6, r7\n\t"
  102457. "adds r3, r3, r7\n\t"
  102458. "adc r4, r4, #0\n\t"
  102459. "lsl r7, r12, #16\n\t"
  102460. "lsr r7, r7, #16\n\t"
  102461. "mul r6, r7, r6\n\t"
  102462. "lsr r7, r6, #16\n\t"
  102463. "lsl r6, r6, #16\n\t"
  102464. "adds r5, r5, r6\n\t"
  102465. "adcs r3, r3, r7\n\t"
  102466. "adc r4, r4, #0\n\t"
  102467. #else
  102468. "umull r6, r7, r8, r12\n\t"
  102469. "adds r5, r5, r6\n\t"
  102470. "adcs r3, r3, r7\n\t"
  102471. "adc r4, r4, #0\n\t"
  102472. #endif
  102473. /* A[10] * B[7] */
  102474. "ldr r8, [%[a], #40]\n\t"
  102475. "ldr r9, [%[b], #28]\n\t"
  102476. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  102477. "lsl r6, r8, #16\n\t"
  102478. "lsl r7, r9, #16\n\t"
  102479. "lsr r6, r6, #16\n\t"
  102480. "lsr r7, r7, #16\n\t"
  102481. "mul r7, r6, r7\n\t"
  102482. "adds r5, r5, r7\n\t"
  102483. "adcs r3, r3, #0\n\t"
  102484. "adc r4, r4, #0\n\t"
  102485. "lsr r7, r9, #16\n\t"
  102486. "mul r6, r7, r6\n\t"
  102487. "lsr r7, r6, #16\n\t"
  102488. "lsl r6, r6, #16\n\t"
  102489. "adds r5, r5, r6\n\t"
  102490. "adcs r3, r3, r7\n\t"
  102491. "adc r4, r4, #0\n\t"
  102492. "lsr r6, r8, #16\n\t"
  102493. "lsr r7, r9, #16\n\t"
  102494. "mul r7, r6, r7\n\t"
  102495. "adds r3, r3, r7\n\t"
  102496. "adc r4, r4, #0\n\t"
  102497. "lsl r7, r9, #16\n\t"
  102498. "lsr r7, r7, #16\n\t"
  102499. "mul r6, r7, r6\n\t"
  102500. "lsr r7, r6, #16\n\t"
  102501. "lsl r6, r6, #16\n\t"
  102502. "adds r5, r5, r6\n\t"
  102503. "adcs r3, r3, r7\n\t"
  102504. "adc r4, r4, #0\n\t"
  102505. #else
  102506. "umull r6, r7, r8, r9\n\t"
  102507. "adds r5, r5, r6\n\t"
  102508. "adcs r3, r3, r7\n\t"
  102509. "adc r4, r4, #0\n\t"
  102510. #endif
  102511. /* A[11] * B[6] */
  102512. "ldr r8, [%[a], #44]\n\t"
  102513. "ldr r9, [%[b], #24]\n\t"
  102514. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  102515. "lsl r6, r8, #16\n\t"
  102516. "lsl r7, r9, #16\n\t"
  102517. "lsr r6, r6, #16\n\t"
  102518. "lsr r7, r7, #16\n\t"
  102519. "mul r7, r6, r7\n\t"
  102520. "adds r5, r5, r7\n\t"
  102521. "adcs r3, r3, #0\n\t"
  102522. "adc r4, r4, #0\n\t"
  102523. "lsr r7, r9, #16\n\t"
  102524. "mul r6, r7, r6\n\t"
  102525. "lsr r7, r6, #16\n\t"
  102526. "lsl r6, r6, #16\n\t"
  102527. "adds r5, r5, r6\n\t"
  102528. "adcs r3, r3, r7\n\t"
  102529. "adc r4, r4, #0\n\t"
  102530. "lsr r6, r8, #16\n\t"
  102531. "lsr r7, r9, #16\n\t"
  102532. "mul r7, r6, r7\n\t"
  102533. "adds r3, r3, r7\n\t"
  102534. "adc r4, r4, #0\n\t"
  102535. "lsl r7, r9, #16\n\t"
  102536. "lsr r7, r7, #16\n\t"
  102537. "mul r6, r7, r6\n\t"
  102538. "lsr r7, r6, #16\n\t"
  102539. "lsl r6, r6, #16\n\t"
  102540. "adds r5, r5, r6\n\t"
  102541. "adcs r3, r3, r7\n\t"
  102542. "adc r4, r4, #0\n\t"
  102543. #else
  102544. "umull r6, r7, r8, r9\n\t"
  102545. "adds r5, r5, r6\n\t"
  102546. "adcs r3, r3, r7\n\t"
  102547. "adc r4, r4, #0\n\t"
  102548. #endif
  102549. /* A[12] * B[5] */
  102550. "ldr r8, [%[a], #48]\n\t"
  102551. "ldr r9, [%[b], #20]\n\t"
  102552. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  102553. "lsl r6, r8, #16\n\t"
  102554. "lsl r7, r9, #16\n\t"
  102555. "lsr r6, r6, #16\n\t"
  102556. "lsr r7, r7, #16\n\t"
  102557. "mul r7, r6, r7\n\t"
  102558. "adds r5, r5, r7\n\t"
  102559. "adcs r3, r3, #0\n\t"
  102560. "adc r4, r4, #0\n\t"
  102561. "lsr r7, r9, #16\n\t"
  102562. "mul r6, r7, r6\n\t"
  102563. "lsr r7, r6, #16\n\t"
  102564. "lsl r6, r6, #16\n\t"
  102565. "adds r5, r5, r6\n\t"
  102566. "adcs r3, r3, r7\n\t"
  102567. "adc r4, r4, #0\n\t"
  102568. "lsr r6, r8, #16\n\t"
  102569. "lsr r7, r9, #16\n\t"
  102570. "mul r7, r6, r7\n\t"
  102571. "adds r3, r3, r7\n\t"
  102572. "adc r4, r4, #0\n\t"
  102573. "lsl r7, r9, #16\n\t"
  102574. "lsr r7, r7, #16\n\t"
  102575. "mul r6, r7, r6\n\t"
  102576. "lsr r7, r6, #16\n\t"
  102577. "lsl r6, r6, #16\n\t"
  102578. "adds r5, r5, r6\n\t"
  102579. "adcs r3, r3, r7\n\t"
  102580. "adc r4, r4, #0\n\t"
  102581. #else
  102582. "umull r6, r7, r8, r9\n\t"
  102583. "adds r5, r5, r6\n\t"
  102584. "adcs r3, r3, r7\n\t"
  102585. "adc r4, r4, #0\n\t"
  102586. #endif
  102587. /* A[13] * B[4] */
  102588. "ldr r8, [%[a], #52]\n\t"
  102589. "ldr r9, [%[b], #16]\n\t"
  102590. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  102591. "lsl r6, r8, #16\n\t"
  102592. "lsl r7, r9, #16\n\t"
  102593. "lsr r6, r6, #16\n\t"
  102594. "lsr r7, r7, #16\n\t"
  102595. "mul r7, r6, r7\n\t"
  102596. "adds r5, r5, r7\n\t"
  102597. "adcs r3, r3, #0\n\t"
  102598. "adc r4, r4, #0\n\t"
  102599. "lsr r7, r9, #16\n\t"
  102600. "mul r6, r7, r6\n\t"
  102601. "lsr r7, r6, #16\n\t"
  102602. "lsl r6, r6, #16\n\t"
  102603. "adds r5, r5, r6\n\t"
  102604. "adcs r3, r3, r7\n\t"
  102605. "adc r4, r4, #0\n\t"
  102606. "lsr r6, r8, #16\n\t"
  102607. "lsr r7, r9, #16\n\t"
  102608. "mul r7, r6, r7\n\t"
  102609. "adds r3, r3, r7\n\t"
  102610. "adc r4, r4, #0\n\t"
  102611. "lsl r7, r9, #16\n\t"
  102612. "lsr r7, r7, #16\n\t"
  102613. "mul r6, r7, r6\n\t"
  102614. "lsr r7, r6, #16\n\t"
  102615. "lsl r6, r6, #16\n\t"
  102616. "adds r5, r5, r6\n\t"
  102617. "adcs r3, r3, r7\n\t"
  102618. "adc r4, r4, #0\n\t"
  102619. #else
  102620. "umull r6, r7, r8, r9\n\t"
  102621. "adds r5, r5, r6\n\t"
  102622. "adcs r3, r3, r7\n\t"
  102623. "adc r4, r4, #0\n\t"
  102624. #endif
  102625. /* A[14] * B[3] */
  102626. "ldr r8, [%[a], #56]\n\t"
  102627. "ldr r9, [%[b], #12]\n\t"
  102628. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  102629. "lsl r6, r8, #16\n\t"
  102630. "lsl r7, r9, #16\n\t"
  102631. "lsr r6, r6, #16\n\t"
  102632. "lsr r7, r7, #16\n\t"
  102633. "mul r7, r6, r7\n\t"
  102634. "adds r5, r5, r7\n\t"
  102635. "adcs r3, r3, #0\n\t"
  102636. "adc r4, r4, #0\n\t"
  102637. "lsr r7, r9, #16\n\t"
  102638. "mul r6, r7, r6\n\t"
  102639. "lsr r7, r6, #16\n\t"
  102640. "lsl r6, r6, #16\n\t"
  102641. "adds r5, r5, r6\n\t"
  102642. "adcs r3, r3, r7\n\t"
  102643. "adc r4, r4, #0\n\t"
  102644. "lsr r6, r8, #16\n\t"
  102645. "lsr r7, r9, #16\n\t"
  102646. "mul r7, r6, r7\n\t"
  102647. "adds r3, r3, r7\n\t"
  102648. "adc r4, r4, #0\n\t"
  102649. "lsl r7, r9, #16\n\t"
  102650. "lsr r7, r7, #16\n\t"
  102651. "mul r6, r7, r6\n\t"
  102652. "lsr r7, r6, #16\n\t"
  102653. "lsl r6, r6, #16\n\t"
  102654. "adds r5, r5, r6\n\t"
  102655. "adcs r3, r3, r7\n\t"
  102656. "adc r4, r4, #0\n\t"
  102657. #else
  102658. "umull r6, r7, r8, r9\n\t"
  102659. "adds r5, r5, r6\n\t"
  102660. "adcs r3, r3, r7\n\t"
  102661. "adc r4, r4, #0\n\t"
  102662. #endif
  102663. /* A[15] * B[2] */
  102664. "ldr r8, [%[a], #60]\n\t"
  102665. "ldr r9, [%[b], #8]\n\t"
  102666. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  102667. "lsl r6, r8, #16\n\t"
  102668. "lsl r7, r9, #16\n\t"
  102669. "lsr r6, r6, #16\n\t"
  102670. "lsr r7, r7, #16\n\t"
  102671. "mul r7, r6, r7\n\t"
  102672. "adds r5, r5, r7\n\t"
  102673. "adcs r3, r3, #0\n\t"
  102674. "adc r4, r4, #0\n\t"
  102675. "lsr r7, r9, #16\n\t"
  102676. "mul r6, r7, r6\n\t"
  102677. "lsr r7, r6, #16\n\t"
  102678. "lsl r6, r6, #16\n\t"
  102679. "adds r5, r5, r6\n\t"
  102680. "adcs r3, r3, r7\n\t"
  102681. "adc r4, r4, #0\n\t"
  102682. "lsr r6, r8, #16\n\t"
  102683. "lsr r7, r9, #16\n\t"
  102684. "mul r7, r6, r7\n\t"
  102685. "adds r3, r3, r7\n\t"
  102686. "adc r4, r4, #0\n\t"
  102687. "lsl r7, r9, #16\n\t"
  102688. "lsr r7, r7, #16\n\t"
  102689. "mul r6, r7, r6\n\t"
  102690. "lsr r7, r6, #16\n\t"
  102691. "lsl r6, r6, #16\n\t"
  102692. "adds r5, r5, r6\n\t"
  102693. "adcs r3, r3, r7\n\t"
  102694. "adc r4, r4, #0\n\t"
  102695. #else
  102696. "umull r6, r7, r8, r9\n\t"
  102697. "adds r5, r5, r6\n\t"
  102698. "adcs r3, r3, r7\n\t"
  102699. "adc r4, r4, #0\n\t"
  102700. #endif
  102701. /* A[16] * B[1] */
  102702. "ldr r8, [%[a], #64]\n\t"
  102703. "ldr r9, [%[b], #4]\n\t"
  102704. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  102705. "lsl r6, r8, #16\n\t"
  102706. "lsl r7, r9, #16\n\t"
  102707. "lsr r6, r6, #16\n\t"
  102708. "lsr r7, r7, #16\n\t"
  102709. "mul r7, r6, r7\n\t"
  102710. "adds r5, r5, r7\n\t"
  102711. "adcs r3, r3, #0\n\t"
  102712. "adc r4, r4, #0\n\t"
  102713. "lsr r7, r9, #16\n\t"
  102714. "mul r6, r7, r6\n\t"
  102715. "lsr r7, r6, #16\n\t"
  102716. "lsl r6, r6, #16\n\t"
  102717. "adds r5, r5, r6\n\t"
  102718. "adcs r3, r3, r7\n\t"
  102719. "adc r4, r4, #0\n\t"
  102720. "lsr r6, r8, #16\n\t"
  102721. "lsr r7, r9, #16\n\t"
  102722. "mul r7, r6, r7\n\t"
  102723. "adds r3, r3, r7\n\t"
  102724. "adc r4, r4, #0\n\t"
  102725. "lsl r7, r9, #16\n\t"
  102726. "lsr r7, r7, #16\n\t"
  102727. "mul r6, r7, r6\n\t"
  102728. "lsr r7, r6, #16\n\t"
  102729. "lsl r6, r6, #16\n\t"
  102730. "adds r5, r5, r6\n\t"
  102731. "adcs r3, r3, r7\n\t"
  102732. "adc r4, r4, #0\n\t"
  102733. #else
  102734. "umull r6, r7, r8, r9\n\t"
  102735. "adds r5, r5, r6\n\t"
  102736. "adcs r3, r3, r7\n\t"
  102737. "adc r4, r4, #0\n\t"
  102738. #endif
  102739. "str r5, [%[r], #68]\n\t"
  102740. /* A[16] * B[2] */
  102741. "ldr r9, [%[b], #8]\n\t"
  102742. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  102743. "lsl r6, r8, #16\n\t"
  102744. "lsl r7, r9, #16\n\t"
  102745. "lsr r6, r6, #16\n\t"
  102746. "lsr r7, r7, #16\n\t"
  102747. "mul r7, r6, r7\n\t"
  102748. "adds r3, r3, r7\n\t"
  102749. "adcs r4, r4, #0\n\t"
  102750. "mov r5, #0\n\t"
  102751. "adc r5, r5, #0\n\t"
  102752. "lsr r7, r9, #16\n\t"
  102753. "mul r6, r7, r6\n\t"
  102754. "lsr r7, r6, #16\n\t"
  102755. "lsl r6, r6, #16\n\t"
  102756. "adds r3, r3, r6\n\t"
  102757. "adcs r4, r4, r7\n\t"
  102758. "adc r5, r5, #0\n\t"
  102759. "lsr r6, r8, #16\n\t"
  102760. "lsr r7, r9, #16\n\t"
  102761. "mul r7, r6, r7\n\t"
  102762. "adds r4, r4, r7\n\t"
  102763. "adc r5, r5, #0\n\t"
  102764. "lsl r7, r9, #16\n\t"
  102765. "lsr r7, r7, #16\n\t"
  102766. "mul r6, r7, r6\n\t"
  102767. "lsr r7, r6, #16\n\t"
  102768. "lsl r6, r6, #16\n\t"
  102769. "adds r3, r3, r6\n\t"
  102770. "adcs r4, r4, r7\n\t"
  102771. "adc r5, r5, #0\n\t"
  102772. #else
  102773. "umull r6, r7, r8, r9\n\t"
  102774. "adds r3, r3, r6\n\t"
  102775. "adcs r4, r4, r7\n\t"
  102776. "mov r5, #0\n\t"
  102777. "adc r5, r5, #0\n\t"
  102778. #endif
  102779. /* A[15] * B[3] */
  102780. "ldr r8, [%[a], #60]\n\t"
  102781. "ldr r9, [%[b], #12]\n\t"
  102782. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  102783. "lsl r6, r8, #16\n\t"
  102784. "lsl r7, r9, #16\n\t"
  102785. "lsr r6, r6, #16\n\t"
  102786. "lsr r7, r7, #16\n\t"
  102787. "mul r7, r6, r7\n\t"
  102788. "adds r3, r3, r7\n\t"
  102789. "adcs r4, r4, #0\n\t"
  102790. "adc r5, r5, #0\n\t"
  102791. "lsr r7, r9, #16\n\t"
  102792. "mul r6, r7, r6\n\t"
  102793. "lsr r7, r6, #16\n\t"
  102794. "lsl r6, r6, #16\n\t"
  102795. "adds r3, r3, r6\n\t"
  102796. "adcs r4, r4, r7\n\t"
  102797. "adc r5, r5, #0\n\t"
  102798. "lsr r6, r8, #16\n\t"
  102799. "lsr r7, r9, #16\n\t"
  102800. "mul r7, r6, r7\n\t"
  102801. "adds r4, r4, r7\n\t"
  102802. "adc r5, r5, #0\n\t"
  102803. "lsl r7, r9, #16\n\t"
  102804. "lsr r7, r7, #16\n\t"
  102805. "mul r6, r7, r6\n\t"
  102806. "lsr r7, r6, #16\n\t"
  102807. "lsl r6, r6, #16\n\t"
  102808. "adds r3, r3, r6\n\t"
  102809. "adcs r4, r4, r7\n\t"
  102810. "adc r5, r5, #0\n\t"
  102811. #else
  102812. "umull r6, r7, r8, r9\n\t"
  102813. "adds r3, r3, r6\n\t"
  102814. "adcs r4, r4, r7\n\t"
  102815. "adc r5, r5, #0\n\t"
  102816. #endif
  102817. /* A[14] * B[4] */
  102818. "ldr r8, [%[a], #56]\n\t"
  102819. "ldr r9, [%[b], #16]\n\t"
  102820. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  102821. "lsl r6, r8, #16\n\t"
  102822. "lsl r7, r9, #16\n\t"
  102823. "lsr r6, r6, #16\n\t"
  102824. "lsr r7, r7, #16\n\t"
  102825. "mul r7, r6, r7\n\t"
  102826. "adds r3, r3, r7\n\t"
  102827. "adcs r4, r4, #0\n\t"
  102828. "adc r5, r5, #0\n\t"
  102829. "lsr r7, r9, #16\n\t"
  102830. "mul r6, r7, r6\n\t"
  102831. "lsr r7, r6, #16\n\t"
  102832. "lsl r6, r6, #16\n\t"
  102833. "adds r3, r3, r6\n\t"
  102834. "adcs r4, r4, r7\n\t"
  102835. "adc r5, r5, #0\n\t"
  102836. "lsr r6, r8, #16\n\t"
  102837. "lsr r7, r9, #16\n\t"
  102838. "mul r7, r6, r7\n\t"
  102839. "adds r4, r4, r7\n\t"
  102840. "adc r5, r5, #0\n\t"
  102841. "lsl r7, r9, #16\n\t"
  102842. "lsr r7, r7, #16\n\t"
  102843. "mul r6, r7, r6\n\t"
  102844. "lsr r7, r6, #16\n\t"
  102845. "lsl r6, r6, #16\n\t"
  102846. "adds r3, r3, r6\n\t"
  102847. "adcs r4, r4, r7\n\t"
  102848. "adc r5, r5, #0\n\t"
  102849. #else
  102850. "umull r6, r7, r8, r9\n\t"
  102851. "adds r3, r3, r6\n\t"
  102852. "adcs r4, r4, r7\n\t"
  102853. "adc r5, r5, #0\n\t"
  102854. #endif
  102855. /* A[13] * B[5] */
  102856. "ldr r8, [%[a], #52]\n\t"
  102857. "ldr r9, [%[b], #20]\n\t"
  102858. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  102859. "lsl r6, r8, #16\n\t"
  102860. "lsl r7, r9, #16\n\t"
  102861. "lsr r6, r6, #16\n\t"
  102862. "lsr r7, r7, #16\n\t"
  102863. "mul r7, r6, r7\n\t"
  102864. "adds r3, r3, r7\n\t"
  102865. "adcs r4, r4, #0\n\t"
  102866. "adc r5, r5, #0\n\t"
  102867. "lsr r7, r9, #16\n\t"
  102868. "mul r6, r7, r6\n\t"
  102869. "lsr r7, r6, #16\n\t"
  102870. "lsl r6, r6, #16\n\t"
  102871. "adds r3, r3, r6\n\t"
  102872. "adcs r4, r4, r7\n\t"
  102873. "adc r5, r5, #0\n\t"
  102874. "lsr r6, r8, #16\n\t"
  102875. "lsr r7, r9, #16\n\t"
  102876. "mul r7, r6, r7\n\t"
  102877. "adds r4, r4, r7\n\t"
  102878. "adc r5, r5, #0\n\t"
  102879. "lsl r7, r9, #16\n\t"
  102880. "lsr r7, r7, #16\n\t"
  102881. "mul r6, r7, r6\n\t"
  102882. "lsr r7, r6, #16\n\t"
  102883. "lsl r6, r6, #16\n\t"
  102884. "adds r3, r3, r6\n\t"
  102885. "adcs r4, r4, r7\n\t"
  102886. "adc r5, r5, #0\n\t"
  102887. #else
  102888. "umull r6, r7, r8, r9\n\t"
  102889. "adds r3, r3, r6\n\t"
  102890. "adcs r4, r4, r7\n\t"
  102891. "adc r5, r5, #0\n\t"
  102892. #endif
  102893. /* A[12] * B[6] */
  102894. "ldr r8, [%[a], #48]\n\t"
  102895. "ldr r9, [%[b], #24]\n\t"
  102896. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  102897. "lsl r6, r8, #16\n\t"
  102898. "lsl r7, r9, #16\n\t"
  102899. "lsr r6, r6, #16\n\t"
  102900. "lsr r7, r7, #16\n\t"
  102901. "mul r7, r6, r7\n\t"
  102902. "adds r3, r3, r7\n\t"
  102903. "adcs r4, r4, #0\n\t"
  102904. "adc r5, r5, #0\n\t"
  102905. "lsr r7, r9, #16\n\t"
  102906. "mul r6, r7, r6\n\t"
  102907. "lsr r7, r6, #16\n\t"
  102908. "lsl r6, r6, #16\n\t"
  102909. "adds r3, r3, r6\n\t"
  102910. "adcs r4, r4, r7\n\t"
  102911. "adc r5, r5, #0\n\t"
  102912. "lsr r6, r8, #16\n\t"
  102913. "lsr r7, r9, #16\n\t"
  102914. "mul r7, r6, r7\n\t"
  102915. "adds r4, r4, r7\n\t"
  102916. "adc r5, r5, #0\n\t"
  102917. "lsl r7, r9, #16\n\t"
  102918. "lsr r7, r7, #16\n\t"
  102919. "mul r6, r7, r6\n\t"
  102920. "lsr r7, r6, #16\n\t"
  102921. "lsl r6, r6, #16\n\t"
  102922. "adds r3, r3, r6\n\t"
  102923. "adcs r4, r4, r7\n\t"
  102924. "adc r5, r5, #0\n\t"
  102925. #else
  102926. "umull r6, r7, r8, r9\n\t"
  102927. "adds r3, r3, r6\n\t"
  102928. "adcs r4, r4, r7\n\t"
  102929. "adc r5, r5, #0\n\t"
  102930. #endif
  102931. /* A[11] * B[7] */
  102932. "ldr r8, [%[a], #44]\n\t"
  102933. "ldr r9, [%[b], #28]\n\t"
  102934. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  102935. "lsl r6, r8, #16\n\t"
  102936. "lsl r7, r9, #16\n\t"
  102937. "lsr r6, r6, #16\n\t"
  102938. "lsr r7, r7, #16\n\t"
  102939. "mul r7, r6, r7\n\t"
  102940. "adds r3, r3, r7\n\t"
  102941. "adcs r4, r4, #0\n\t"
  102942. "adc r5, r5, #0\n\t"
  102943. "lsr r7, r9, #16\n\t"
  102944. "mul r6, r7, r6\n\t"
  102945. "lsr r7, r6, #16\n\t"
  102946. "lsl r6, r6, #16\n\t"
  102947. "adds r3, r3, r6\n\t"
  102948. "adcs r4, r4, r7\n\t"
  102949. "adc r5, r5, #0\n\t"
  102950. "lsr r6, r8, #16\n\t"
  102951. "lsr r7, r9, #16\n\t"
  102952. "mul r7, r6, r7\n\t"
  102953. "adds r4, r4, r7\n\t"
  102954. "adc r5, r5, #0\n\t"
  102955. "lsl r7, r9, #16\n\t"
  102956. "lsr r7, r7, #16\n\t"
  102957. "mul r6, r7, r6\n\t"
  102958. "lsr r7, r6, #16\n\t"
  102959. "lsl r6, r6, #16\n\t"
  102960. "adds r3, r3, r6\n\t"
  102961. "adcs r4, r4, r7\n\t"
  102962. "adc r5, r5, #0\n\t"
  102963. #else
  102964. "umull r6, r7, r8, r9\n\t"
  102965. "adds r3, r3, r6\n\t"
  102966. "adcs r4, r4, r7\n\t"
  102967. "adc r5, r5, #0\n\t"
  102968. #endif
  102969. /* A[10] * B[8] */
  102970. "ldr r8, [%[a], #40]\n\t"
  102971. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  102972. "lsl r6, r8, #16\n\t"
  102973. "lsl r7, r12, #16\n\t"
  102974. "lsr r6, r6, #16\n\t"
  102975. "lsr r7, r7, #16\n\t"
  102976. "mul r7, r6, r7\n\t"
  102977. "adds r3, r3, r7\n\t"
  102978. "adcs r4, r4, #0\n\t"
  102979. "adc r5, r5, #0\n\t"
  102980. "lsr r7, r12, #16\n\t"
  102981. "mul r6, r7, r6\n\t"
  102982. "lsr r7, r6, #16\n\t"
  102983. "lsl r6, r6, #16\n\t"
  102984. "adds r3, r3, r6\n\t"
  102985. "adcs r4, r4, r7\n\t"
  102986. "adc r5, r5, #0\n\t"
  102987. "lsr r6, r8, #16\n\t"
  102988. "lsr r7, r12, #16\n\t"
  102989. "mul r7, r6, r7\n\t"
  102990. "adds r4, r4, r7\n\t"
  102991. "adc r5, r5, #0\n\t"
  102992. "lsl r7, r12, #16\n\t"
  102993. "lsr r7, r7, #16\n\t"
  102994. "mul r6, r7, r6\n\t"
  102995. "lsr r7, r6, #16\n\t"
  102996. "lsl r6, r6, #16\n\t"
  102997. "adds r3, r3, r6\n\t"
  102998. "adcs r4, r4, r7\n\t"
  102999. "adc r5, r5, #0\n\t"
  103000. #else
  103001. "umull r6, r7, r8, r12\n\t"
  103002. "adds r3, r3, r6\n\t"
  103003. "adcs r4, r4, r7\n\t"
  103004. "adc r5, r5, #0\n\t"
  103005. #endif
  103006. /* A[9] * B[9] */
  103007. "ldr r11, [%[a], #36]\n\t"
  103008. "ldr r12, [%[b], #36]\n\t"
  103009. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  103010. "lsl r6, r11, #16\n\t"
  103011. "lsl r7, r12, #16\n\t"
  103012. "lsr r6, r6, #16\n\t"
  103013. "lsr r7, r7, #16\n\t"
  103014. "mul r7, r6, r7\n\t"
  103015. "adds r3, r3, r7\n\t"
  103016. "adcs r4, r4, #0\n\t"
  103017. "adc r5, r5, #0\n\t"
  103018. "lsr r7, r12, #16\n\t"
  103019. "mul r6, r7, r6\n\t"
  103020. "lsr r7, r6, #16\n\t"
  103021. "lsl r6, r6, #16\n\t"
  103022. "adds r3, r3, r6\n\t"
  103023. "adcs r4, r4, r7\n\t"
  103024. "adc r5, r5, #0\n\t"
  103025. "lsr r6, r11, #16\n\t"
  103026. "lsr r7, r12, #16\n\t"
  103027. "mul r7, r6, r7\n\t"
  103028. "adds r4, r4, r7\n\t"
  103029. "adc r5, r5, #0\n\t"
  103030. "lsl r7, r12, #16\n\t"
  103031. "lsr r7, r7, #16\n\t"
  103032. "mul r6, r7, r6\n\t"
  103033. "lsr r7, r6, #16\n\t"
  103034. "lsl r6, r6, #16\n\t"
  103035. "adds r3, r3, r6\n\t"
  103036. "adcs r4, r4, r7\n\t"
  103037. "adc r5, r5, #0\n\t"
  103038. #else
  103039. "umull r6, r7, r11, r12\n\t"
  103040. "adds r3, r3, r6\n\t"
  103041. "adcs r4, r4, r7\n\t"
  103042. "adc r5, r5, #0\n\t"
  103043. #endif
  103044. /* A[8] * B[10] */
  103045. "ldr r8, [%[a], #32]\n\t"
  103046. "ldr r9, [%[b], #40]\n\t"
  103047. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  103048. "lsl r6, r8, #16\n\t"
  103049. "lsl r7, r9, #16\n\t"
  103050. "lsr r6, r6, #16\n\t"
  103051. "lsr r7, r7, #16\n\t"
  103052. "mul r7, r6, r7\n\t"
  103053. "adds r3, r3, r7\n\t"
  103054. "adcs r4, r4, #0\n\t"
  103055. "adc r5, r5, #0\n\t"
  103056. "lsr r7, r9, #16\n\t"
  103057. "mul r6, r7, r6\n\t"
  103058. "lsr r7, r6, #16\n\t"
  103059. "lsl r6, r6, #16\n\t"
  103060. "adds r3, r3, r6\n\t"
  103061. "adcs r4, r4, r7\n\t"
  103062. "adc r5, r5, #0\n\t"
  103063. "lsr r6, r8, #16\n\t"
  103064. "lsr r7, r9, #16\n\t"
  103065. "mul r7, r6, r7\n\t"
  103066. "adds r4, r4, r7\n\t"
  103067. "adc r5, r5, #0\n\t"
  103068. "lsl r7, r9, #16\n\t"
  103069. "lsr r7, r7, #16\n\t"
  103070. "mul r6, r7, r6\n\t"
  103071. "lsr r7, r6, #16\n\t"
  103072. "lsl r6, r6, #16\n\t"
  103073. "adds r3, r3, r6\n\t"
  103074. "adcs r4, r4, r7\n\t"
  103075. "adc r5, r5, #0\n\t"
  103076. #else
  103077. "umull r6, r7, r8, r9\n\t"
  103078. "adds r3, r3, r6\n\t"
  103079. "adcs r4, r4, r7\n\t"
  103080. "adc r5, r5, #0\n\t"
  103081. #endif
  103082. /* A[7] * B[11] */
  103083. "ldr r8, [%[a], #28]\n\t"
  103084. "ldr r9, [%[b], #44]\n\t"
  103085. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  103086. "lsl r6, r8, #16\n\t"
  103087. "lsl r7, r9, #16\n\t"
  103088. "lsr r6, r6, #16\n\t"
  103089. "lsr r7, r7, #16\n\t"
  103090. "mul r7, r6, r7\n\t"
  103091. "adds r3, r3, r7\n\t"
  103092. "adcs r4, r4, #0\n\t"
  103093. "adc r5, r5, #0\n\t"
  103094. "lsr r7, r9, #16\n\t"
  103095. "mul r6, r7, r6\n\t"
  103096. "lsr r7, r6, #16\n\t"
  103097. "lsl r6, r6, #16\n\t"
  103098. "adds r3, r3, r6\n\t"
  103099. "adcs r4, r4, r7\n\t"
  103100. "adc r5, r5, #0\n\t"
  103101. "lsr r6, r8, #16\n\t"
  103102. "lsr r7, r9, #16\n\t"
  103103. "mul r7, r6, r7\n\t"
  103104. "adds r4, r4, r7\n\t"
  103105. "adc r5, r5, #0\n\t"
  103106. "lsl r7, r9, #16\n\t"
  103107. "lsr r7, r7, #16\n\t"
  103108. "mul r6, r7, r6\n\t"
  103109. "lsr r7, r6, #16\n\t"
  103110. "lsl r6, r6, #16\n\t"
  103111. "adds r3, r3, r6\n\t"
  103112. "adcs r4, r4, r7\n\t"
  103113. "adc r5, r5, #0\n\t"
  103114. #else
  103115. "umull r6, r7, r8, r9\n\t"
  103116. "adds r3, r3, r6\n\t"
  103117. "adcs r4, r4, r7\n\t"
  103118. "adc r5, r5, #0\n\t"
  103119. #endif
  103120. /* A[6] * B[12] */
  103121. "ldr r8, [%[a], #24]\n\t"
  103122. "ldr r9, [%[b], #48]\n\t"
  103123. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  103124. "lsl r6, r8, #16\n\t"
  103125. "lsl r7, r9, #16\n\t"
  103126. "lsr r6, r6, #16\n\t"
  103127. "lsr r7, r7, #16\n\t"
  103128. "mul r7, r6, r7\n\t"
  103129. "adds r3, r3, r7\n\t"
  103130. "adcs r4, r4, #0\n\t"
  103131. "adc r5, r5, #0\n\t"
  103132. "lsr r7, r9, #16\n\t"
  103133. "mul r6, r7, r6\n\t"
  103134. "lsr r7, r6, #16\n\t"
  103135. "lsl r6, r6, #16\n\t"
  103136. "adds r3, r3, r6\n\t"
  103137. "adcs r4, r4, r7\n\t"
  103138. "adc r5, r5, #0\n\t"
  103139. "lsr r6, r8, #16\n\t"
  103140. "lsr r7, r9, #16\n\t"
  103141. "mul r7, r6, r7\n\t"
  103142. "adds r4, r4, r7\n\t"
  103143. "adc r5, r5, #0\n\t"
  103144. "lsl r7, r9, #16\n\t"
  103145. "lsr r7, r7, #16\n\t"
  103146. "mul r6, r7, r6\n\t"
  103147. "lsr r7, r6, #16\n\t"
  103148. "lsl r6, r6, #16\n\t"
  103149. "adds r3, r3, r6\n\t"
  103150. "adcs r4, r4, r7\n\t"
  103151. "adc r5, r5, #0\n\t"
  103152. #else
  103153. "umull r6, r7, r8, r9\n\t"
  103154. "adds r3, r3, r6\n\t"
  103155. "adcs r4, r4, r7\n\t"
  103156. "adc r5, r5, #0\n\t"
  103157. #endif
  103158. /* A[5] * B[13] */
  103159. "ldr r8, [%[a], #20]\n\t"
  103160. "ldr r9, [%[b], #52]\n\t"
  103161. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  103162. "lsl r6, r8, #16\n\t"
  103163. "lsl r7, r9, #16\n\t"
  103164. "lsr r6, r6, #16\n\t"
  103165. "lsr r7, r7, #16\n\t"
  103166. "mul r7, r6, r7\n\t"
  103167. "adds r3, r3, r7\n\t"
  103168. "adcs r4, r4, #0\n\t"
  103169. "adc r5, r5, #0\n\t"
  103170. "lsr r7, r9, #16\n\t"
  103171. "mul r6, r7, r6\n\t"
  103172. "lsr r7, r6, #16\n\t"
  103173. "lsl r6, r6, #16\n\t"
  103174. "adds r3, r3, r6\n\t"
  103175. "adcs r4, r4, r7\n\t"
  103176. "adc r5, r5, #0\n\t"
  103177. "lsr r6, r8, #16\n\t"
  103178. "lsr r7, r9, #16\n\t"
  103179. "mul r7, r6, r7\n\t"
  103180. "adds r4, r4, r7\n\t"
  103181. "adc r5, r5, #0\n\t"
  103182. "lsl r7, r9, #16\n\t"
  103183. "lsr r7, r7, #16\n\t"
  103184. "mul r6, r7, r6\n\t"
  103185. "lsr r7, r6, #16\n\t"
  103186. "lsl r6, r6, #16\n\t"
  103187. "adds r3, r3, r6\n\t"
  103188. "adcs r4, r4, r7\n\t"
  103189. "adc r5, r5, #0\n\t"
  103190. #else
  103191. "umull r6, r7, r8, r9\n\t"
  103192. "adds r3, r3, r6\n\t"
  103193. "adcs r4, r4, r7\n\t"
  103194. "adc r5, r5, #0\n\t"
  103195. #endif
  103196. /* A[4] * B[14] */
  103197. "ldr r8, [%[a], #16]\n\t"
  103198. "ldr r9, [%[b], #56]\n\t"
  103199. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  103200. "lsl r6, r8, #16\n\t"
  103201. "lsl r7, r9, #16\n\t"
  103202. "lsr r6, r6, #16\n\t"
  103203. "lsr r7, r7, #16\n\t"
  103204. "mul r7, r6, r7\n\t"
  103205. "adds r3, r3, r7\n\t"
  103206. "adcs r4, r4, #0\n\t"
  103207. "adc r5, r5, #0\n\t"
  103208. "lsr r7, r9, #16\n\t"
  103209. "mul r6, r7, r6\n\t"
  103210. "lsr r7, r6, #16\n\t"
  103211. "lsl r6, r6, #16\n\t"
  103212. "adds r3, r3, r6\n\t"
  103213. "adcs r4, r4, r7\n\t"
  103214. "adc r5, r5, #0\n\t"
  103215. "lsr r6, r8, #16\n\t"
  103216. "lsr r7, r9, #16\n\t"
  103217. "mul r7, r6, r7\n\t"
  103218. "adds r4, r4, r7\n\t"
  103219. "adc r5, r5, #0\n\t"
  103220. "lsl r7, r9, #16\n\t"
  103221. "lsr r7, r7, #16\n\t"
  103222. "mul r6, r7, r6\n\t"
  103223. "lsr r7, r6, #16\n\t"
  103224. "lsl r6, r6, #16\n\t"
  103225. "adds r3, r3, r6\n\t"
  103226. "adcs r4, r4, r7\n\t"
  103227. "adc r5, r5, #0\n\t"
  103228. #else
  103229. "umull r6, r7, r8, r9\n\t"
  103230. "adds r3, r3, r6\n\t"
  103231. "adcs r4, r4, r7\n\t"
  103232. "adc r5, r5, #0\n\t"
  103233. #endif
  103234. /* A[3] * B[15] */
  103235. "ldr r8, [%[a], #12]\n\t"
  103236. "ldr r9, [%[b], #60]\n\t"
  103237. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  103238. "lsl r6, r8, #16\n\t"
  103239. "lsl r7, r9, #16\n\t"
  103240. "lsr r6, r6, #16\n\t"
  103241. "lsr r7, r7, #16\n\t"
  103242. "mul r7, r6, r7\n\t"
  103243. "adds r3, r3, r7\n\t"
  103244. "adcs r4, r4, #0\n\t"
  103245. "adc r5, r5, #0\n\t"
  103246. "lsr r7, r9, #16\n\t"
  103247. "mul r6, r7, r6\n\t"
  103248. "lsr r7, r6, #16\n\t"
  103249. "lsl r6, r6, #16\n\t"
  103250. "adds r3, r3, r6\n\t"
  103251. "adcs r4, r4, r7\n\t"
  103252. "adc r5, r5, #0\n\t"
  103253. "lsr r6, r8, #16\n\t"
  103254. "lsr r7, r9, #16\n\t"
  103255. "mul r7, r6, r7\n\t"
  103256. "adds r4, r4, r7\n\t"
  103257. "adc r5, r5, #0\n\t"
  103258. "lsl r7, r9, #16\n\t"
  103259. "lsr r7, r7, #16\n\t"
  103260. "mul r6, r7, r6\n\t"
  103261. "lsr r7, r6, #16\n\t"
  103262. "lsl r6, r6, #16\n\t"
  103263. "adds r3, r3, r6\n\t"
  103264. "adcs r4, r4, r7\n\t"
  103265. "adc r5, r5, #0\n\t"
  103266. #else
  103267. "umull r6, r7, r8, r9\n\t"
  103268. "adds r3, r3, r6\n\t"
  103269. "adcs r4, r4, r7\n\t"
  103270. "adc r5, r5, #0\n\t"
  103271. #endif
  103272. /* A[2] * B[16] */
  103273. "ldr r8, [%[a], #8]\n\t"
  103274. "ldr r9, [%[b], #64]\n\t"
  103275. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  103276. "lsl r6, r8, #16\n\t"
  103277. "lsl r7, r9, #16\n\t"
  103278. "lsr r6, r6, #16\n\t"
  103279. "lsr r7, r7, #16\n\t"
  103280. "mul r7, r6, r7\n\t"
  103281. "adds r3, r3, r7\n\t"
  103282. "adcs r4, r4, #0\n\t"
  103283. "adc r5, r5, #0\n\t"
  103284. "lsr r7, r9, #16\n\t"
  103285. "mul r6, r7, r6\n\t"
  103286. "lsr r7, r6, #16\n\t"
  103287. "lsl r6, r6, #16\n\t"
  103288. "adds r3, r3, r6\n\t"
  103289. "adcs r4, r4, r7\n\t"
  103290. "adc r5, r5, #0\n\t"
  103291. "lsr r6, r8, #16\n\t"
  103292. "lsr r7, r9, #16\n\t"
  103293. "mul r7, r6, r7\n\t"
  103294. "adds r4, r4, r7\n\t"
  103295. "adc r5, r5, #0\n\t"
  103296. "lsl r7, r9, #16\n\t"
  103297. "lsr r7, r7, #16\n\t"
  103298. "mul r6, r7, r6\n\t"
  103299. "lsr r7, r6, #16\n\t"
  103300. "lsl r6, r6, #16\n\t"
  103301. "adds r3, r3, r6\n\t"
  103302. "adcs r4, r4, r7\n\t"
  103303. "adc r5, r5, #0\n\t"
  103304. #else
  103305. "umull r6, r7, r8, r9\n\t"
  103306. "adds r3, r3, r6\n\t"
  103307. "adcs r4, r4, r7\n\t"
  103308. "adc r5, r5, #0\n\t"
  103309. #endif
  103310. "str r3, [%[r], #72]\n\t"
  103311. /* A[3] * B[16] */
  103312. "ldr r8, [%[a], #12]\n\t"
  103313. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  103314. "lsl r6, r8, #16\n\t"
  103315. "lsl r7, r9, #16\n\t"
  103316. "lsr r6, r6, #16\n\t"
  103317. "lsr r7, r7, #16\n\t"
  103318. "mul r7, r6, r7\n\t"
  103319. "adds r4, r4, r7\n\t"
  103320. "adcs r5, r5, #0\n\t"
  103321. "mov r3, #0\n\t"
  103322. "adc r3, r3, #0\n\t"
  103323. "lsr r7, r9, #16\n\t"
  103324. "mul r6, r7, r6\n\t"
  103325. "lsr r7, r6, #16\n\t"
  103326. "lsl r6, r6, #16\n\t"
  103327. "adds r4, r4, r6\n\t"
  103328. "adcs r5, r5, r7\n\t"
  103329. "adc r3, r3, #0\n\t"
  103330. "lsr r6, r8, #16\n\t"
  103331. "lsr r7, r9, #16\n\t"
  103332. "mul r7, r6, r7\n\t"
  103333. "adds r5, r5, r7\n\t"
  103334. "adc r3, r3, #0\n\t"
  103335. "lsl r7, r9, #16\n\t"
  103336. "lsr r7, r7, #16\n\t"
  103337. "mul r6, r7, r6\n\t"
  103338. "lsr r7, r6, #16\n\t"
  103339. "lsl r6, r6, #16\n\t"
  103340. "adds r4, r4, r6\n\t"
  103341. "adcs r5, r5, r7\n\t"
  103342. "adc r3, r3, #0\n\t"
  103343. #else
  103344. "umull r6, r7, r8, r9\n\t"
  103345. "adds r4, r4, r6\n\t"
  103346. "adcs r5, r5, r7\n\t"
  103347. "mov r3, #0\n\t"
  103348. "adc r3, r3, #0\n\t"
  103349. #endif
  103350. /* A[4] * B[15] */
  103351. "ldr r8, [%[a], #16]\n\t"
  103352. "ldr r9, [%[b], #60]\n\t"
  103353. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  103354. "lsl r6, r8, #16\n\t"
  103355. "lsl r7, r9, #16\n\t"
  103356. "lsr r6, r6, #16\n\t"
  103357. "lsr r7, r7, #16\n\t"
  103358. "mul r7, r6, r7\n\t"
  103359. "adds r4, r4, r7\n\t"
  103360. "adcs r5, r5, #0\n\t"
  103361. "adc r3, r3, #0\n\t"
  103362. "lsr r7, r9, #16\n\t"
  103363. "mul r6, r7, r6\n\t"
  103364. "lsr r7, r6, #16\n\t"
  103365. "lsl r6, r6, #16\n\t"
  103366. "adds r4, r4, r6\n\t"
  103367. "adcs r5, r5, r7\n\t"
  103368. "adc r3, r3, #0\n\t"
  103369. "lsr r6, r8, #16\n\t"
  103370. "lsr r7, r9, #16\n\t"
  103371. "mul r7, r6, r7\n\t"
  103372. "adds r5, r5, r7\n\t"
  103373. "adc r3, r3, #0\n\t"
  103374. "lsl r7, r9, #16\n\t"
  103375. "lsr r7, r7, #16\n\t"
  103376. "mul r6, r7, r6\n\t"
  103377. "lsr r7, r6, #16\n\t"
  103378. "lsl r6, r6, #16\n\t"
  103379. "adds r4, r4, r6\n\t"
  103380. "adcs r5, r5, r7\n\t"
  103381. "adc r3, r3, #0\n\t"
  103382. #else
  103383. "umull r6, r7, r8, r9\n\t"
  103384. "adds r4, r4, r6\n\t"
  103385. "adcs r5, r5, r7\n\t"
  103386. "adc r3, r3, #0\n\t"
  103387. #endif
  103388. /* A[5] * B[14] */
  103389. "ldr r8, [%[a], #20]\n\t"
  103390. "ldr r9, [%[b], #56]\n\t"
  103391. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  103392. "lsl r6, r8, #16\n\t"
  103393. "lsl r7, r9, #16\n\t"
  103394. "lsr r6, r6, #16\n\t"
  103395. "lsr r7, r7, #16\n\t"
  103396. "mul r7, r6, r7\n\t"
  103397. "adds r4, r4, r7\n\t"
  103398. "adcs r5, r5, #0\n\t"
  103399. "adc r3, r3, #0\n\t"
  103400. "lsr r7, r9, #16\n\t"
  103401. "mul r6, r7, r6\n\t"
  103402. "lsr r7, r6, #16\n\t"
  103403. "lsl r6, r6, #16\n\t"
  103404. "adds r4, r4, r6\n\t"
  103405. "adcs r5, r5, r7\n\t"
  103406. "adc r3, r3, #0\n\t"
  103407. "lsr r6, r8, #16\n\t"
  103408. "lsr r7, r9, #16\n\t"
  103409. "mul r7, r6, r7\n\t"
  103410. "adds r5, r5, r7\n\t"
  103411. "adc r3, r3, #0\n\t"
  103412. "lsl r7, r9, #16\n\t"
  103413. "lsr r7, r7, #16\n\t"
  103414. "mul r6, r7, r6\n\t"
  103415. "lsr r7, r6, #16\n\t"
  103416. "lsl r6, r6, #16\n\t"
  103417. "adds r4, r4, r6\n\t"
  103418. "adcs r5, r5, r7\n\t"
  103419. "adc r3, r3, #0\n\t"
  103420. #else
  103421. "umull r6, r7, r8, r9\n\t"
  103422. "adds r4, r4, r6\n\t"
  103423. "adcs r5, r5, r7\n\t"
  103424. "adc r3, r3, #0\n\t"
  103425. #endif
  103426. /* A[6] * B[13] */
  103427. "ldr r8, [%[a], #24]\n\t"
  103428. "ldr r9, [%[b], #52]\n\t"
  103429. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  103430. "lsl r6, r8, #16\n\t"
  103431. "lsl r7, r9, #16\n\t"
  103432. "lsr r6, r6, #16\n\t"
  103433. "lsr r7, r7, #16\n\t"
  103434. "mul r7, r6, r7\n\t"
  103435. "adds r4, r4, r7\n\t"
  103436. "adcs r5, r5, #0\n\t"
  103437. "adc r3, r3, #0\n\t"
  103438. "lsr r7, r9, #16\n\t"
  103439. "mul r6, r7, r6\n\t"
  103440. "lsr r7, r6, #16\n\t"
  103441. "lsl r6, r6, #16\n\t"
  103442. "adds r4, r4, r6\n\t"
  103443. "adcs r5, r5, r7\n\t"
  103444. "adc r3, r3, #0\n\t"
  103445. "lsr r6, r8, #16\n\t"
  103446. "lsr r7, r9, #16\n\t"
  103447. "mul r7, r6, r7\n\t"
  103448. "adds r5, r5, r7\n\t"
  103449. "adc r3, r3, #0\n\t"
  103450. "lsl r7, r9, #16\n\t"
  103451. "lsr r7, r7, #16\n\t"
  103452. "mul r6, r7, r6\n\t"
  103453. "lsr r7, r6, #16\n\t"
  103454. "lsl r6, r6, #16\n\t"
  103455. "adds r4, r4, r6\n\t"
  103456. "adcs r5, r5, r7\n\t"
  103457. "adc r3, r3, #0\n\t"
  103458. #else
  103459. "umull r6, r7, r8, r9\n\t"
  103460. "adds r4, r4, r6\n\t"
  103461. "adcs r5, r5, r7\n\t"
  103462. "adc r3, r3, #0\n\t"
  103463. #endif
  103464. /* A[7] * B[12] */
  103465. "ldr r8, [%[a], #28]\n\t"
  103466. "ldr r9, [%[b], #48]\n\t"
  103467. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  103468. "lsl r6, r8, #16\n\t"
  103469. "lsl r7, r9, #16\n\t"
  103470. "lsr r6, r6, #16\n\t"
  103471. "lsr r7, r7, #16\n\t"
  103472. "mul r7, r6, r7\n\t"
  103473. "adds r4, r4, r7\n\t"
  103474. "adcs r5, r5, #0\n\t"
  103475. "adc r3, r3, #0\n\t"
  103476. "lsr r7, r9, #16\n\t"
  103477. "mul r6, r7, r6\n\t"
  103478. "lsr r7, r6, #16\n\t"
  103479. "lsl r6, r6, #16\n\t"
  103480. "adds r4, r4, r6\n\t"
  103481. "adcs r5, r5, r7\n\t"
  103482. "adc r3, r3, #0\n\t"
  103483. "lsr r6, r8, #16\n\t"
  103484. "lsr r7, r9, #16\n\t"
  103485. "mul r7, r6, r7\n\t"
  103486. "adds r5, r5, r7\n\t"
  103487. "adc r3, r3, #0\n\t"
  103488. "lsl r7, r9, #16\n\t"
  103489. "lsr r7, r7, #16\n\t"
  103490. "mul r6, r7, r6\n\t"
  103491. "lsr r7, r6, #16\n\t"
  103492. "lsl r6, r6, #16\n\t"
  103493. "adds r4, r4, r6\n\t"
  103494. "adcs r5, r5, r7\n\t"
  103495. "adc r3, r3, #0\n\t"
  103496. #else
  103497. "umull r6, r7, r8, r9\n\t"
  103498. "adds r4, r4, r6\n\t"
  103499. "adcs r5, r5, r7\n\t"
  103500. "adc r3, r3, #0\n\t"
  103501. #endif
  103502. /* A[8] * B[11] */
  103503. "ldr r8, [%[a], #32]\n\t"
  103504. "ldr r9, [%[b], #44]\n\t"
  103505. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  103506. "lsl r6, r8, #16\n\t"
  103507. "lsl r7, r9, #16\n\t"
  103508. "lsr r6, r6, #16\n\t"
  103509. "lsr r7, r7, #16\n\t"
  103510. "mul r7, r6, r7\n\t"
  103511. "adds r4, r4, r7\n\t"
  103512. "adcs r5, r5, #0\n\t"
  103513. "adc r3, r3, #0\n\t"
  103514. "lsr r7, r9, #16\n\t"
  103515. "mul r6, r7, r6\n\t"
  103516. "lsr r7, r6, #16\n\t"
  103517. "lsl r6, r6, #16\n\t"
  103518. "adds r4, r4, r6\n\t"
  103519. "adcs r5, r5, r7\n\t"
  103520. "adc r3, r3, #0\n\t"
  103521. "lsr r6, r8, #16\n\t"
  103522. "lsr r7, r9, #16\n\t"
  103523. "mul r7, r6, r7\n\t"
  103524. "adds r5, r5, r7\n\t"
  103525. "adc r3, r3, #0\n\t"
  103526. "lsl r7, r9, #16\n\t"
  103527. "lsr r7, r7, #16\n\t"
  103528. "mul r6, r7, r6\n\t"
  103529. "lsr r7, r6, #16\n\t"
  103530. "lsl r6, r6, #16\n\t"
  103531. "adds r4, r4, r6\n\t"
  103532. "adcs r5, r5, r7\n\t"
  103533. "adc r3, r3, #0\n\t"
  103534. #else
  103535. "umull r6, r7, r8, r9\n\t"
  103536. "adds r4, r4, r6\n\t"
  103537. "adcs r5, r5, r7\n\t"
  103538. "adc r3, r3, #0\n\t"
  103539. #endif
  103540. /* A[9] * B[10] */
  103541. "ldr r9, [%[b], #40]\n\t"
  103542. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  103543. "lsl r6, r11, #16\n\t"
  103544. "lsl r7, r9, #16\n\t"
  103545. "lsr r6, r6, #16\n\t"
  103546. "lsr r7, r7, #16\n\t"
  103547. "mul r7, r6, r7\n\t"
  103548. "adds r4, r4, r7\n\t"
  103549. "adcs r5, r5, #0\n\t"
  103550. "adc r3, r3, #0\n\t"
  103551. "lsr r7, r9, #16\n\t"
  103552. "mul r6, r7, r6\n\t"
  103553. "lsr r7, r6, #16\n\t"
  103554. "lsl r6, r6, #16\n\t"
  103555. "adds r4, r4, r6\n\t"
  103556. "adcs r5, r5, r7\n\t"
  103557. "adc r3, r3, #0\n\t"
  103558. "lsr r6, r11, #16\n\t"
  103559. "lsr r7, r9, #16\n\t"
  103560. "mul r7, r6, r7\n\t"
  103561. "adds r5, r5, r7\n\t"
  103562. "adc r3, r3, #0\n\t"
  103563. "lsl r7, r9, #16\n\t"
  103564. "lsr r7, r7, #16\n\t"
  103565. "mul r6, r7, r6\n\t"
  103566. "lsr r7, r6, #16\n\t"
  103567. "lsl r6, r6, #16\n\t"
  103568. "adds r4, r4, r6\n\t"
  103569. "adcs r5, r5, r7\n\t"
  103570. "adc r3, r3, #0\n\t"
  103571. #else
  103572. "umull r6, r7, r11, r9\n\t"
  103573. "adds r4, r4, r6\n\t"
  103574. "adcs r5, r5, r7\n\t"
  103575. "adc r3, r3, #0\n\t"
  103576. #endif
  103577. /* A[10] * B[9] */
  103578. "ldr r8, [%[a], #40]\n\t"
  103579. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  103580. "lsl r6, r8, #16\n\t"
  103581. "lsl r7, r12, #16\n\t"
  103582. "lsr r6, r6, #16\n\t"
  103583. "lsr r7, r7, #16\n\t"
  103584. "mul r7, r6, r7\n\t"
  103585. "adds r4, r4, r7\n\t"
  103586. "adcs r5, r5, #0\n\t"
  103587. "adc r3, r3, #0\n\t"
  103588. "lsr r7, r12, #16\n\t"
  103589. "mul r6, r7, r6\n\t"
  103590. "lsr r7, r6, #16\n\t"
  103591. "lsl r6, r6, #16\n\t"
  103592. "adds r4, r4, r6\n\t"
  103593. "adcs r5, r5, r7\n\t"
  103594. "adc r3, r3, #0\n\t"
  103595. "lsr r6, r8, #16\n\t"
  103596. "lsr r7, r12, #16\n\t"
  103597. "mul r7, r6, r7\n\t"
  103598. "adds r5, r5, r7\n\t"
  103599. "adc r3, r3, #0\n\t"
  103600. "lsl r7, r12, #16\n\t"
  103601. "lsr r7, r7, #16\n\t"
  103602. "mul r6, r7, r6\n\t"
  103603. "lsr r7, r6, #16\n\t"
  103604. "lsl r6, r6, #16\n\t"
  103605. "adds r4, r4, r6\n\t"
  103606. "adcs r5, r5, r7\n\t"
  103607. "adc r3, r3, #0\n\t"
  103608. #else
  103609. "umull r6, r7, r8, r12\n\t"
  103610. "adds r4, r4, r6\n\t"
  103611. "adcs r5, r5, r7\n\t"
  103612. "adc r3, r3, #0\n\t"
  103613. #endif
  103614. /* A[11] * B[8] */
  103615. "ldr r8, [%[a], #44]\n\t"
  103616. "ldr r9, [%[b], #32]\n\t"
  103617. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  103618. "lsl r6, r8, #16\n\t"
  103619. "lsl r7, r9, #16\n\t"
  103620. "lsr r6, r6, #16\n\t"
  103621. "lsr r7, r7, #16\n\t"
  103622. "mul r7, r6, r7\n\t"
  103623. "adds r4, r4, r7\n\t"
  103624. "adcs r5, r5, #0\n\t"
  103625. "adc r3, r3, #0\n\t"
  103626. "lsr r7, r9, #16\n\t"
  103627. "mul r6, r7, r6\n\t"
  103628. "lsr r7, r6, #16\n\t"
  103629. "lsl r6, r6, #16\n\t"
  103630. "adds r4, r4, r6\n\t"
  103631. "adcs r5, r5, r7\n\t"
  103632. "adc r3, r3, #0\n\t"
  103633. "lsr r6, r8, #16\n\t"
  103634. "lsr r7, r9, #16\n\t"
  103635. "mul r7, r6, r7\n\t"
  103636. "adds r5, r5, r7\n\t"
  103637. "adc r3, r3, #0\n\t"
  103638. "lsl r7, r9, #16\n\t"
  103639. "lsr r7, r7, #16\n\t"
  103640. "mul r6, r7, r6\n\t"
  103641. "lsr r7, r6, #16\n\t"
  103642. "lsl r6, r6, #16\n\t"
  103643. "adds r4, r4, r6\n\t"
  103644. "adcs r5, r5, r7\n\t"
  103645. "adc r3, r3, #0\n\t"
  103646. #else
  103647. "umull r6, r7, r8, r9\n\t"
  103648. "adds r4, r4, r6\n\t"
  103649. "adcs r5, r5, r7\n\t"
  103650. "adc r3, r3, #0\n\t"
  103651. #endif
  103652. /* A[12] * B[7] */
  103653. "ldr r8, [%[a], #48]\n\t"
  103654. "ldr r9, [%[b], #28]\n\t"
  103655. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  103656. "lsl r6, r8, #16\n\t"
  103657. "lsl r7, r9, #16\n\t"
  103658. "lsr r6, r6, #16\n\t"
  103659. "lsr r7, r7, #16\n\t"
  103660. "mul r7, r6, r7\n\t"
  103661. "adds r4, r4, r7\n\t"
  103662. "adcs r5, r5, #0\n\t"
  103663. "adc r3, r3, #0\n\t"
  103664. "lsr r7, r9, #16\n\t"
  103665. "mul r6, r7, r6\n\t"
  103666. "lsr r7, r6, #16\n\t"
  103667. "lsl r6, r6, #16\n\t"
  103668. "adds r4, r4, r6\n\t"
  103669. "adcs r5, r5, r7\n\t"
  103670. "adc r3, r3, #0\n\t"
  103671. "lsr r6, r8, #16\n\t"
  103672. "lsr r7, r9, #16\n\t"
  103673. "mul r7, r6, r7\n\t"
  103674. "adds r5, r5, r7\n\t"
  103675. "adc r3, r3, #0\n\t"
  103676. "lsl r7, r9, #16\n\t"
  103677. "lsr r7, r7, #16\n\t"
  103678. "mul r6, r7, r6\n\t"
  103679. "lsr r7, r6, #16\n\t"
  103680. "lsl r6, r6, #16\n\t"
  103681. "adds r4, r4, r6\n\t"
  103682. "adcs r5, r5, r7\n\t"
  103683. "adc r3, r3, #0\n\t"
  103684. #else
  103685. "umull r6, r7, r8, r9\n\t"
  103686. "adds r4, r4, r6\n\t"
  103687. "adcs r5, r5, r7\n\t"
  103688. "adc r3, r3, #0\n\t"
  103689. #endif
  103690. /* A[13] * B[6] */
  103691. "ldr r8, [%[a], #52]\n\t"
  103692. "ldr r9, [%[b], #24]\n\t"
  103693. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  103694. "lsl r6, r8, #16\n\t"
  103695. "lsl r7, r9, #16\n\t"
  103696. "lsr r6, r6, #16\n\t"
  103697. "lsr r7, r7, #16\n\t"
  103698. "mul r7, r6, r7\n\t"
  103699. "adds r4, r4, r7\n\t"
  103700. "adcs r5, r5, #0\n\t"
  103701. "adc r3, r3, #0\n\t"
  103702. "lsr r7, r9, #16\n\t"
  103703. "mul r6, r7, r6\n\t"
  103704. "lsr r7, r6, #16\n\t"
  103705. "lsl r6, r6, #16\n\t"
  103706. "adds r4, r4, r6\n\t"
  103707. "adcs r5, r5, r7\n\t"
  103708. "adc r3, r3, #0\n\t"
  103709. "lsr r6, r8, #16\n\t"
  103710. "lsr r7, r9, #16\n\t"
  103711. "mul r7, r6, r7\n\t"
  103712. "adds r5, r5, r7\n\t"
  103713. "adc r3, r3, #0\n\t"
  103714. "lsl r7, r9, #16\n\t"
  103715. "lsr r7, r7, #16\n\t"
  103716. "mul r6, r7, r6\n\t"
  103717. "lsr r7, r6, #16\n\t"
  103718. "lsl r6, r6, #16\n\t"
  103719. "adds r4, r4, r6\n\t"
  103720. "adcs r5, r5, r7\n\t"
  103721. "adc r3, r3, #0\n\t"
  103722. #else
  103723. "umull r6, r7, r8, r9\n\t"
  103724. "adds r4, r4, r6\n\t"
  103725. "adcs r5, r5, r7\n\t"
  103726. "adc r3, r3, #0\n\t"
  103727. #endif
  103728. /* A[14] * B[5] */
  103729. "ldr r8, [%[a], #56]\n\t"
  103730. "ldr r9, [%[b], #20]\n\t"
  103731. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  103732. "lsl r6, r8, #16\n\t"
  103733. "lsl r7, r9, #16\n\t"
  103734. "lsr r6, r6, #16\n\t"
  103735. "lsr r7, r7, #16\n\t"
  103736. "mul r7, r6, r7\n\t"
  103737. "adds r4, r4, r7\n\t"
  103738. "adcs r5, r5, #0\n\t"
  103739. "adc r3, r3, #0\n\t"
  103740. "lsr r7, r9, #16\n\t"
  103741. "mul r6, r7, r6\n\t"
  103742. "lsr r7, r6, #16\n\t"
  103743. "lsl r6, r6, #16\n\t"
  103744. "adds r4, r4, r6\n\t"
  103745. "adcs r5, r5, r7\n\t"
  103746. "adc r3, r3, #0\n\t"
  103747. "lsr r6, r8, #16\n\t"
  103748. "lsr r7, r9, #16\n\t"
  103749. "mul r7, r6, r7\n\t"
  103750. "adds r5, r5, r7\n\t"
  103751. "adc r3, r3, #0\n\t"
  103752. "lsl r7, r9, #16\n\t"
  103753. "lsr r7, r7, #16\n\t"
  103754. "mul r6, r7, r6\n\t"
  103755. "lsr r7, r6, #16\n\t"
  103756. "lsl r6, r6, #16\n\t"
  103757. "adds r4, r4, r6\n\t"
  103758. "adcs r5, r5, r7\n\t"
  103759. "adc r3, r3, #0\n\t"
  103760. #else
  103761. "umull r6, r7, r8, r9\n\t"
  103762. "adds r4, r4, r6\n\t"
  103763. "adcs r5, r5, r7\n\t"
  103764. "adc r3, r3, #0\n\t"
  103765. #endif
  103766. /* A[15] * B[4] */
  103767. "ldr r8, [%[a], #60]\n\t"
  103768. "ldr r9, [%[b], #16]\n\t"
  103769. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  103770. "lsl r6, r8, #16\n\t"
  103771. "lsl r7, r9, #16\n\t"
  103772. "lsr r6, r6, #16\n\t"
  103773. "lsr r7, r7, #16\n\t"
  103774. "mul r7, r6, r7\n\t"
  103775. "adds r4, r4, r7\n\t"
  103776. "adcs r5, r5, #0\n\t"
  103777. "adc r3, r3, #0\n\t"
  103778. "lsr r7, r9, #16\n\t"
  103779. "mul r6, r7, r6\n\t"
  103780. "lsr r7, r6, #16\n\t"
  103781. "lsl r6, r6, #16\n\t"
  103782. "adds r4, r4, r6\n\t"
  103783. "adcs r5, r5, r7\n\t"
  103784. "adc r3, r3, #0\n\t"
  103785. "lsr r6, r8, #16\n\t"
  103786. "lsr r7, r9, #16\n\t"
  103787. "mul r7, r6, r7\n\t"
  103788. "adds r5, r5, r7\n\t"
  103789. "adc r3, r3, #0\n\t"
  103790. "lsl r7, r9, #16\n\t"
  103791. "lsr r7, r7, #16\n\t"
  103792. "mul r6, r7, r6\n\t"
  103793. "lsr r7, r6, #16\n\t"
  103794. "lsl r6, r6, #16\n\t"
  103795. "adds r4, r4, r6\n\t"
  103796. "adcs r5, r5, r7\n\t"
  103797. "adc r3, r3, #0\n\t"
  103798. #else
  103799. "umull r6, r7, r8, r9\n\t"
  103800. "adds r4, r4, r6\n\t"
  103801. "adcs r5, r5, r7\n\t"
  103802. "adc r3, r3, #0\n\t"
  103803. #endif
  103804. /* A[16] * B[3] */
  103805. "ldr r8, [%[a], #64]\n\t"
  103806. "ldr r9, [%[b], #12]\n\t"
  103807. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  103808. "lsl r6, r8, #16\n\t"
  103809. "lsl r7, r9, #16\n\t"
  103810. "lsr r6, r6, #16\n\t"
  103811. "lsr r7, r7, #16\n\t"
  103812. "mul r7, r6, r7\n\t"
  103813. "adds r4, r4, r7\n\t"
  103814. "adcs r5, r5, #0\n\t"
  103815. "adc r3, r3, #0\n\t"
  103816. "lsr r7, r9, #16\n\t"
  103817. "mul r6, r7, r6\n\t"
  103818. "lsr r7, r6, #16\n\t"
  103819. "lsl r6, r6, #16\n\t"
  103820. "adds r4, r4, r6\n\t"
  103821. "adcs r5, r5, r7\n\t"
  103822. "adc r3, r3, #0\n\t"
  103823. "lsr r6, r8, #16\n\t"
  103824. "lsr r7, r9, #16\n\t"
  103825. "mul r7, r6, r7\n\t"
  103826. "adds r5, r5, r7\n\t"
  103827. "adc r3, r3, #0\n\t"
  103828. "lsl r7, r9, #16\n\t"
  103829. "lsr r7, r7, #16\n\t"
  103830. "mul r6, r7, r6\n\t"
  103831. "lsr r7, r6, #16\n\t"
  103832. "lsl r6, r6, #16\n\t"
  103833. "adds r4, r4, r6\n\t"
  103834. "adcs r5, r5, r7\n\t"
  103835. "adc r3, r3, #0\n\t"
  103836. #else
  103837. "umull r6, r7, r8, r9\n\t"
  103838. "adds r4, r4, r6\n\t"
  103839. "adcs r5, r5, r7\n\t"
  103840. "adc r3, r3, #0\n\t"
  103841. #endif
  103842. "str r4, [%[r], #76]\n\t"
  103843. /* A[16] * B[4] */
  103844. "ldr r9, [%[b], #16]\n\t"
  103845. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  103846. "lsl r6, r8, #16\n\t"
  103847. "lsl r7, r9, #16\n\t"
  103848. "lsr r6, r6, #16\n\t"
  103849. "lsr r7, r7, #16\n\t"
  103850. "mul r7, r6, r7\n\t"
  103851. "adds r5, r5, r7\n\t"
  103852. "adcs r3, r3, #0\n\t"
  103853. "mov r4, #0\n\t"
  103854. "adc r4, r4, #0\n\t"
  103855. "lsr r7, r9, #16\n\t"
  103856. "mul r6, r7, r6\n\t"
  103857. "lsr r7, r6, #16\n\t"
  103858. "lsl r6, r6, #16\n\t"
  103859. "adds r5, r5, r6\n\t"
  103860. "adcs r3, r3, r7\n\t"
  103861. "adc r4, r4, #0\n\t"
  103862. "lsr r6, r8, #16\n\t"
  103863. "lsr r7, r9, #16\n\t"
  103864. "mul r7, r6, r7\n\t"
  103865. "adds r3, r3, r7\n\t"
  103866. "adc r4, r4, #0\n\t"
  103867. "lsl r7, r9, #16\n\t"
  103868. "lsr r7, r7, #16\n\t"
  103869. "mul r6, r7, r6\n\t"
  103870. "lsr r7, r6, #16\n\t"
  103871. "lsl r6, r6, #16\n\t"
  103872. "adds r5, r5, r6\n\t"
  103873. "adcs r3, r3, r7\n\t"
  103874. "adc r4, r4, #0\n\t"
  103875. #else
  103876. "umull r6, r7, r8, r9\n\t"
  103877. "adds r5, r5, r6\n\t"
  103878. "adcs r3, r3, r7\n\t"
  103879. "mov r4, #0\n\t"
  103880. "adc r4, r4, #0\n\t"
  103881. #endif
  103882. /* A[15] * B[5] */
  103883. "ldr r8, [%[a], #60]\n\t"
  103884. "ldr r9, [%[b], #20]\n\t"
  103885. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  103886. "lsl r6, r8, #16\n\t"
  103887. "lsl r7, r9, #16\n\t"
  103888. "lsr r6, r6, #16\n\t"
  103889. "lsr r7, r7, #16\n\t"
  103890. "mul r7, r6, r7\n\t"
  103891. "adds r5, r5, r7\n\t"
  103892. "adcs r3, r3, #0\n\t"
  103893. "adc r4, r4, #0\n\t"
  103894. "lsr r7, r9, #16\n\t"
  103895. "mul r6, r7, r6\n\t"
  103896. "lsr r7, r6, #16\n\t"
  103897. "lsl r6, r6, #16\n\t"
  103898. "adds r5, r5, r6\n\t"
  103899. "adcs r3, r3, r7\n\t"
  103900. "adc r4, r4, #0\n\t"
  103901. "lsr r6, r8, #16\n\t"
  103902. "lsr r7, r9, #16\n\t"
  103903. "mul r7, r6, r7\n\t"
  103904. "adds r3, r3, r7\n\t"
  103905. "adc r4, r4, #0\n\t"
  103906. "lsl r7, r9, #16\n\t"
  103907. "lsr r7, r7, #16\n\t"
  103908. "mul r6, r7, r6\n\t"
  103909. "lsr r7, r6, #16\n\t"
  103910. "lsl r6, r6, #16\n\t"
  103911. "adds r5, r5, r6\n\t"
  103912. "adcs r3, r3, r7\n\t"
  103913. "adc r4, r4, #0\n\t"
  103914. #else
  103915. "umull r6, r7, r8, r9\n\t"
  103916. "adds r5, r5, r6\n\t"
  103917. "adcs r3, r3, r7\n\t"
  103918. "adc r4, r4, #0\n\t"
  103919. #endif
  103920. /* A[14] * B[6] */
  103921. "ldr r8, [%[a], #56]\n\t"
  103922. "ldr r9, [%[b], #24]\n\t"
  103923. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  103924. "lsl r6, r8, #16\n\t"
  103925. "lsl r7, r9, #16\n\t"
  103926. "lsr r6, r6, #16\n\t"
  103927. "lsr r7, r7, #16\n\t"
  103928. "mul r7, r6, r7\n\t"
  103929. "adds r5, r5, r7\n\t"
  103930. "adcs r3, r3, #0\n\t"
  103931. "adc r4, r4, #0\n\t"
  103932. "lsr r7, r9, #16\n\t"
  103933. "mul r6, r7, r6\n\t"
  103934. "lsr r7, r6, #16\n\t"
  103935. "lsl r6, r6, #16\n\t"
  103936. "adds r5, r5, r6\n\t"
  103937. "adcs r3, r3, r7\n\t"
  103938. "adc r4, r4, #0\n\t"
  103939. "lsr r6, r8, #16\n\t"
  103940. "lsr r7, r9, #16\n\t"
  103941. "mul r7, r6, r7\n\t"
  103942. "adds r3, r3, r7\n\t"
  103943. "adc r4, r4, #0\n\t"
  103944. "lsl r7, r9, #16\n\t"
  103945. "lsr r7, r7, #16\n\t"
  103946. "mul r6, r7, r6\n\t"
  103947. "lsr r7, r6, #16\n\t"
  103948. "lsl r6, r6, #16\n\t"
  103949. "adds r5, r5, r6\n\t"
  103950. "adcs r3, r3, r7\n\t"
  103951. "adc r4, r4, #0\n\t"
  103952. #else
  103953. "umull r6, r7, r8, r9\n\t"
  103954. "adds r5, r5, r6\n\t"
  103955. "adcs r3, r3, r7\n\t"
  103956. "adc r4, r4, #0\n\t"
  103957. #endif
  103958. /* A[13] * B[7] */
  103959. "ldr r8, [%[a], #52]\n\t"
  103960. "ldr r9, [%[b], #28]\n\t"
  103961. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  103962. "lsl r6, r8, #16\n\t"
  103963. "lsl r7, r9, #16\n\t"
  103964. "lsr r6, r6, #16\n\t"
  103965. "lsr r7, r7, #16\n\t"
  103966. "mul r7, r6, r7\n\t"
  103967. "adds r5, r5, r7\n\t"
  103968. "adcs r3, r3, #0\n\t"
  103969. "adc r4, r4, #0\n\t"
  103970. "lsr r7, r9, #16\n\t"
  103971. "mul r6, r7, r6\n\t"
  103972. "lsr r7, r6, #16\n\t"
  103973. "lsl r6, r6, #16\n\t"
  103974. "adds r5, r5, r6\n\t"
  103975. "adcs r3, r3, r7\n\t"
  103976. "adc r4, r4, #0\n\t"
  103977. "lsr r6, r8, #16\n\t"
  103978. "lsr r7, r9, #16\n\t"
  103979. "mul r7, r6, r7\n\t"
  103980. "adds r3, r3, r7\n\t"
  103981. "adc r4, r4, #0\n\t"
  103982. "lsl r7, r9, #16\n\t"
  103983. "lsr r7, r7, #16\n\t"
  103984. "mul r6, r7, r6\n\t"
  103985. "lsr r7, r6, #16\n\t"
  103986. "lsl r6, r6, #16\n\t"
  103987. "adds r5, r5, r6\n\t"
  103988. "adcs r3, r3, r7\n\t"
  103989. "adc r4, r4, #0\n\t"
  103990. #else
  103991. "umull r6, r7, r8, r9\n\t"
  103992. "adds r5, r5, r6\n\t"
  103993. "adcs r3, r3, r7\n\t"
  103994. "adc r4, r4, #0\n\t"
  103995. #endif
  103996. /* A[12] * B[8] */
  103997. "ldr r8, [%[a], #48]\n\t"
  103998. "ldr r9, [%[b], #32]\n\t"
  103999. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  104000. "lsl r6, r8, #16\n\t"
  104001. "lsl r7, r9, #16\n\t"
  104002. "lsr r6, r6, #16\n\t"
  104003. "lsr r7, r7, #16\n\t"
  104004. "mul r7, r6, r7\n\t"
  104005. "adds r5, r5, r7\n\t"
  104006. "adcs r3, r3, #0\n\t"
  104007. "adc r4, r4, #0\n\t"
  104008. "lsr r7, r9, #16\n\t"
  104009. "mul r6, r7, r6\n\t"
  104010. "lsr r7, r6, #16\n\t"
  104011. "lsl r6, r6, #16\n\t"
  104012. "adds r5, r5, r6\n\t"
  104013. "adcs r3, r3, r7\n\t"
  104014. "adc r4, r4, #0\n\t"
  104015. "lsr r6, r8, #16\n\t"
  104016. "lsr r7, r9, #16\n\t"
  104017. "mul r7, r6, r7\n\t"
  104018. "adds r3, r3, r7\n\t"
  104019. "adc r4, r4, #0\n\t"
  104020. "lsl r7, r9, #16\n\t"
  104021. "lsr r7, r7, #16\n\t"
  104022. "mul r6, r7, r6\n\t"
  104023. "lsr r7, r6, #16\n\t"
  104024. "lsl r6, r6, #16\n\t"
  104025. "adds r5, r5, r6\n\t"
  104026. "adcs r3, r3, r7\n\t"
  104027. "adc r4, r4, #0\n\t"
  104028. #else
  104029. "umull r6, r7, r8, r9\n\t"
  104030. "adds r5, r5, r6\n\t"
  104031. "adcs r3, r3, r7\n\t"
  104032. "adc r4, r4, #0\n\t"
  104033. #endif
  104034. /* A[11] * B[9] */
  104035. "ldr r8, [%[a], #44]\n\t"
  104036. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  104037. "lsl r6, r8, #16\n\t"
  104038. "lsl r7, r12, #16\n\t"
  104039. "lsr r6, r6, #16\n\t"
  104040. "lsr r7, r7, #16\n\t"
  104041. "mul r7, r6, r7\n\t"
  104042. "adds r5, r5, r7\n\t"
  104043. "adcs r3, r3, #0\n\t"
  104044. "adc r4, r4, #0\n\t"
  104045. "lsr r7, r12, #16\n\t"
  104046. "mul r6, r7, r6\n\t"
  104047. "lsr r7, r6, #16\n\t"
  104048. "lsl r6, r6, #16\n\t"
  104049. "adds r5, r5, r6\n\t"
  104050. "adcs r3, r3, r7\n\t"
  104051. "adc r4, r4, #0\n\t"
  104052. "lsr r6, r8, #16\n\t"
  104053. "lsr r7, r12, #16\n\t"
  104054. "mul r7, r6, r7\n\t"
  104055. "adds r3, r3, r7\n\t"
  104056. "adc r4, r4, #0\n\t"
  104057. "lsl r7, r12, #16\n\t"
  104058. "lsr r7, r7, #16\n\t"
  104059. "mul r6, r7, r6\n\t"
  104060. "lsr r7, r6, #16\n\t"
  104061. "lsl r6, r6, #16\n\t"
  104062. "adds r5, r5, r6\n\t"
  104063. "adcs r3, r3, r7\n\t"
  104064. "adc r4, r4, #0\n\t"
  104065. #else
  104066. "umull r6, r7, r8, r12\n\t"
  104067. "adds r5, r5, r6\n\t"
  104068. "adcs r3, r3, r7\n\t"
  104069. "adc r4, r4, #0\n\t"
  104070. #endif
  104071. /* A[10] * B[10] */
  104072. "ldr r11, [%[a], #40]\n\t"
  104073. "ldr r12, [%[b], #40]\n\t"
  104074. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  104075. "lsl r6, r11, #16\n\t"
  104076. "lsl r7, r12, #16\n\t"
  104077. "lsr r6, r6, #16\n\t"
  104078. "lsr r7, r7, #16\n\t"
  104079. "mul r7, r6, r7\n\t"
  104080. "adds r5, r5, r7\n\t"
  104081. "adcs r3, r3, #0\n\t"
  104082. "adc r4, r4, #0\n\t"
  104083. "lsr r7, r12, #16\n\t"
  104084. "mul r6, r7, r6\n\t"
  104085. "lsr r7, r6, #16\n\t"
  104086. "lsl r6, r6, #16\n\t"
  104087. "adds r5, r5, r6\n\t"
  104088. "adcs r3, r3, r7\n\t"
  104089. "adc r4, r4, #0\n\t"
  104090. "lsr r6, r11, #16\n\t"
  104091. "lsr r7, r12, #16\n\t"
  104092. "mul r7, r6, r7\n\t"
  104093. "adds r3, r3, r7\n\t"
  104094. "adc r4, r4, #0\n\t"
  104095. "lsl r7, r12, #16\n\t"
  104096. "lsr r7, r7, #16\n\t"
  104097. "mul r6, r7, r6\n\t"
  104098. "lsr r7, r6, #16\n\t"
  104099. "lsl r6, r6, #16\n\t"
  104100. "adds r5, r5, r6\n\t"
  104101. "adcs r3, r3, r7\n\t"
  104102. "adc r4, r4, #0\n\t"
  104103. #else
  104104. "umull r6, r7, r11, r12\n\t"
  104105. "adds r5, r5, r6\n\t"
  104106. "adcs r3, r3, r7\n\t"
  104107. "adc r4, r4, #0\n\t"
  104108. #endif
  104109. /* A[9] * B[11] */
  104110. "ldr r8, [%[a], #36]\n\t"
  104111. "ldr r9, [%[b], #44]\n\t"
  104112. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  104113. "lsl r6, r8, #16\n\t"
  104114. "lsl r7, r9, #16\n\t"
  104115. "lsr r6, r6, #16\n\t"
  104116. "lsr r7, r7, #16\n\t"
  104117. "mul r7, r6, r7\n\t"
  104118. "adds r5, r5, r7\n\t"
  104119. "adcs r3, r3, #0\n\t"
  104120. "adc r4, r4, #0\n\t"
  104121. "lsr r7, r9, #16\n\t"
  104122. "mul r6, r7, r6\n\t"
  104123. "lsr r7, r6, #16\n\t"
  104124. "lsl r6, r6, #16\n\t"
  104125. "adds r5, r5, r6\n\t"
  104126. "adcs r3, r3, r7\n\t"
  104127. "adc r4, r4, #0\n\t"
  104128. "lsr r6, r8, #16\n\t"
  104129. "lsr r7, r9, #16\n\t"
  104130. "mul r7, r6, r7\n\t"
  104131. "adds r3, r3, r7\n\t"
  104132. "adc r4, r4, #0\n\t"
  104133. "lsl r7, r9, #16\n\t"
  104134. "lsr r7, r7, #16\n\t"
  104135. "mul r6, r7, r6\n\t"
  104136. "lsr r7, r6, #16\n\t"
  104137. "lsl r6, r6, #16\n\t"
  104138. "adds r5, r5, r6\n\t"
  104139. "adcs r3, r3, r7\n\t"
  104140. "adc r4, r4, #0\n\t"
  104141. #else
  104142. "umull r6, r7, r8, r9\n\t"
  104143. "adds r5, r5, r6\n\t"
  104144. "adcs r3, r3, r7\n\t"
  104145. "adc r4, r4, #0\n\t"
  104146. #endif
  104147. /* A[8] * B[12] */
  104148. "ldr r8, [%[a], #32]\n\t"
  104149. "ldr r9, [%[b], #48]\n\t"
  104150. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  104151. "lsl r6, r8, #16\n\t"
  104152. "lsl r7, r9, #16\n\t"
  104153. "lsr r6, r6, #16\n\t"
  104154. "lsr r7, r7, #16\n\t"
  104155. "mul r7, r6, r7\n\t"
  104156. "adds r5, r5, r7\n\t"
  104157. "adcs r3, r3, #0\n\t"
  104158. "adc r4, r4, #0\n\t"
  104159. "lsr r7, r9, #16\n\t"
  104160. "mul r6, r7, r6\n\t"
  104161. "lsr r7, r6, #16\n\t"
  104162. "lsl r6, r6, #16\n\t"
  104163. "adds r5, r5, r6\n\t"
  104164. "adcs r3, r3, r7\n\t"
  104165. "adc r4, r4, #0\n\t"
  104166. "lsr r6, r8, #16\n\t"
  104167. "lsr r7, r9, #16\n\t"
  104168. "mul r7, r6, r7\n\t"
  104169. "adds r3, r3, r7\n\t"
  104170. "adc r4, r4, #0\n\t"
  104171. "lsl r7, r9, #16\n\t"
  104172. "lsr r7, r7, #16\n\t"
  104173. "mul r6, r7, r6\n\t"
  104174. "lsr r7, r6, #16\n\t"
  104175. "lsl r6, r6, #16\n\t"
  104176. "adds r5, r5, r6\n\t"
  104177. "adcs r3, r3, r7\n\t"
  104178. "adc r4, r4, #0\n\t"
  104179. #else
  104180. "umull r6, r7, r8, r9\n\t"
  104181. "adds r5, r5, r6\n\t"
  104182. "adcs r3, r3, r7\n\t"
  104183. "adc r4, r4, #0\n\t"
  104184. #endif
  104185. /* A[7] * B[13] */
  104186. "ldr r8, [%[a], #28]\n\t"
  104187. "ldr r9, [%[b], #52]\n\t"
  104188. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  104189. "lsl r6, r8, #16\n\t"
  104190. "lsl r7, r9, #16\n\t"
  104191. "lsr r6, r6, #16\n\t"
  104192. "lsr r7, r7, #16\n\t"
  104193. "mul r7, r6, r7\n\t"
  104194. "adds r5, r5, r7\n\t"
  104195. "adcs r3, r3, #0\n\t"
  104196. "adc r4, r4, #0\n\t"
  104197. "lsr r7, r9, #16\n\t"
  104198. "mul r6, r7, r6\n\t"
  104199. "lsr r7, r6, #16\n\t"
  104200. "lsl r6, r6, #16\n\t"
  104201. "adds r5, r5, r6\n\t"
  104202. "adcs r3, r3, r7\n\t"
  104203. "adc r4, r4, #0\n\t"
  104204. "lsr r6, r8, #16\n\t"
  104205. "lsr r7, r9, #16\n\t"
  104206. "mul r7, r6, r7\n\t"
  104207. "adds r3, r3, r7\n\t"
  104208. "adc r4, r4, #0\n\t"
  104209. "lsl r7, r9, #16\n\t"
  104210. "lsr r7, r7, #16\n\t"
  104211. "mul r6, r7, r6\n\t"
  104212. "lsr r7, r6, #16\n\t"
  104213. "lsl r6, r6, #16\n\t"
  104214. "adds r5, r5, r6\n\t"
  104215. "adcs r3, r3, r7\n\t"
  104216. "adc r4, r4, #0\n\t"
  104217. #else
  104218. "umull r6, r7, r8, r9\n\t"
  104219. "adds r5, r5, r6\n\t"
  104220. "adcs r3, r3, r7\n\t"
  104221. "adc r4, r4, #0\n\t"
  104222. #endif
  104223. /* A[6] * B[14] */
  104224. "ldr r8, [%[a], #24]\n\t"
  104225. "ldr r9, [%[b], #56]\n\t"
  104226. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  104227. "lsl r6, r8, #16\n\t"
  104228. "lsl r7, r9, #16\n\t"
  104229. "lsr r6, r6, #16\n\t"
  104230. "lsr r7, r7, #16\n\t"
  104231. "mul r7, r6, r7\n\t"
  104232. "adds r5, r5, r7\n\t"
  104233. "adcs r3, r3, #0\n\t"
  104234. "adc r4, r4, #0\n\t"
  104235. "lsr r7, r9, #16\n\t"
  104236. "mul r6, r7, r6\n\t"
  104237. "lsr r7, r6, #16\n\t"
  104238. "lsl r6, r6, #16\n\t"
  104239. "adds r5, r5, r6\n\t"
  104240. "adcs r3, r3, r7\n\t"
  104241. "adc r4, r4, #0\n\t"
  104242. "lsr r6, r8, #16\n\t"
  104243. "lsr r7, r9, #16\n\t"
  104244. "mul r7, r6, r7\n\t"
  104245. "adds r3, r3, r7\n\t"
  104246. "adc r4, r4, #0\n\t"
  104247. "lsl r7, r9, #16\n\t"
  104248. "lsr r7, r7, #16\n\t"
  104249. "mul r6, r7, r6\n\t"
  104250. "lsr r7, r6, #16\n\t"
  104251. "lsl r6, r6, #16\n\t"
  104252. "adds r5, r5, r6\n\t"
  104253. "adcs r3, r3, r7\n\t"
  104254. "adc r4, r4, #0\n\t"
  104255. #else
  104256. "umull r6, r7, r8, r9\n\t"
  104257. "adds r5, r5, r6\n\t"
  104258. "adcs r3, r3, r7\n\t"
  104259. "adc r4, r4, #0\n\t"
  104260. #endif
  104261. /* A[5] * B[15] */
  104262. "ldr r8, [%[a], #20]\n\t"
  104263. "ldr r9, [%[b], #60]\n\t"
  104264. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  104265. "lsl r6, r8, #16\n\t"
  104266. "lsl r7, r9, #16\n\t"
  104267. "lsr r6, r6, #16\n\t"
  104268. "lsr r7, r7, #16\n\t"
  104269. "mul r7, r6, r7\n\t"
  104270. "adds r5, r5, r7\n\t"
  104271. "adcs r3, r3, #0\n\t"
  104272. "adc r4, r4, #0\n\t"
  104273. "lsr r7, r9, #16\n\t"
  104274. "mul r6, r7, r6\n\t"
  104275. "lsr r7, r6, #16\n\t"
  104276. "lsl r6, r6, #16\n\t"
  104277. "adds r5, r5, r6\n\t"
  104278. "adcs r3, r3, r7\n\t"
  104279. "adc r4, r4, #0\n\t"
  104280. "lsr r6, r8, #16\n\t"
  104281. "lsr r7, r9, #16\n\t"
  104282. "mul r7, r6, r7\n\t"
  104283. "adds r3, r3, r7\n\t"
  104284. "adc r4, r4, #0\n\t"
  104285. "lsl r7, r9, #16\n\t"
  104286. "lsr r7, r7, #16\n\t"
  104287. "mul r6, r7, r6\n\t"
  104288. "lsr r7, r6, #16\n\t"
  104289. "lsl r6, r6, #16\n\t"
  104290. "adds r5, r5, r6\n\t"
  104291. "adcs r3, r3, r7\n\t"
  104292. "adc r4, r4, #0\n\t"
  104293. #else
  104294. "umull r6, r7, r8, r9\n\t"
  104295. "adds r5, r5, r6\n\t"
  104296. "adcs r3, r3, r7\n\t"
  104297. "adc r4, r4, #0\n\t"
  104298. #endif
  104299. /* A[4] * B[16] */
  104300. "ldr r8, [%[a], #16]\n\t"
  104301. "ldr r9, [%[b], #64]\n\t"
  104302. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  104303. "lsl r6, r8, #16\n\t"
  104304. "lsl r7, r9, #16\n\t"
  104305. "lsr r6, r6, #16\n\t"
  104306. "lsr r7, r7, #16\n\t"
  104307. "mul r7, r6, r7\n\t"
  104308. "adds r5, r5, r7\n\t"
  104309. "adcs r3, r3, #0\n\t"
  104310. "adc r4, r4, #0\n\t"
  104311. "lsr r7, r9, #16\n\t"
  104312. "mul r6, r7, r6\n\t"
  104313. "lsr r7, r6, #16\n\t"
  104314. "lsl r6, r6, #16\n\t"
  104315. "adds r5, r5, r6\n\t"
  104316. "adcs r3, r3, r7\n\t"
  104317. "adc r4, r4, #0\n\t"
  104318. "lsr r6, r8, #16\n\t"
  104319. "lsr r7, r9, #16\n\t"
  104320. "mul r7, r6, r7\n\t"
  104321. "adds r3, r3, r7\n\t"
  104322. "adc r4, r4, #0\n\t"
  104323. "lsl r7, r9, #16\n\t"
  104324. "lsr r7, r7, #16\n\t"
  104325. "mul r6, r7, r6\n\t"
  104326. "lsr r7, r6, #16\n\t"
  104327. "lsl r6, r6, #16\n\t"
  104328. "adds r5, r5, r6\n\t"
  104329. "adcs r3, r3, r7\n\t"
  104330. "adc r4, r4, #0\n\t"
  104331. #else
  104332. "umull r6, r7, r8, r9\n\t"
  104333. "adds r5, r5, r6\n\t"
  104334. "adcs r3, r3, r7\n\t"
  104335. "adc r4, r4, #0\n\t"
  104336. #endif
  104337. "str r5, [%[r], #80]\n\t"
  104338. /* A[5] * B[16] */
  104339. "ldr r8, [%[a], #20]\n\t"
  104340. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  104341. "lsl r6, r8, #16\n\t"
  104342. "lsl r7, r9, #16\n\t"
  104343. "lsr r6, r6, #16\n\t"
  104344. "lsr r7, r7, #16\n\t"
  104345. "mul r7, r6, r7\n\t"
  104346. "adds r3, r3, r7\n\t"
  104347. "adcs r4, r4, #0\n\t"
  104348. "mov r5, #0\n\t"
  104349. "adc r5, r5, #0\n\t"
  104350. "lsr r7, r9, #16\n\t"
  104351. "mul r6, r7, r6\n\t"
  104352. "lsr r7, r6, #16\n\t"
  104353. "lsl r6, r6, #16\n\t"
  104354. "adds r3, r3, r6\n\t"
  104355. "adcs r4, r4, r7\n\t"
  104356. "adc r5, r5, #0\n\t"
  104357. "lsr r6, r8, #16\n\t"
  104358. "lsr r7, r9, #16\n\t"
  104359. "mul r7, r6, r7\n\t"
  104360. "adds r4, r4, r7\n\t"
  104361. "adc r5, r5, #0\n\t"
  104362. "lsl r7, r9, #16\n\t"
  104363. "lsr r7, r7, #16\n\t"
  104364. "mul r6, r7, r6\n\t"
  104365. "lsr r7, r6, #16\n\t"
  104366. "lsl r6, r6, #16\n\t"
  104367. "adds r3, r3, r6\n\t"
  104368. "adcs r4, r4, r7\n\t"
  104369. "adc r5, r5, #0\n\t"
  104370. #else
  104371. "umull r6, r7, r8, r9\n\t"
  104372. "adds r3, r3, r6\n\t"
  104373. "adcs r4, r4, r7\n\t"
  104374. "mov r5, #0\n\t"
  104375. "adc r5, r5, #0\n\t"
  104376. #endif
  104377. /* A[6] * B[15] */
  104378. "ldr r8, [%[a], #24]\n\t"
  104379. "ldr r9, [%[b], #60]\n\t"
  104380. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  104381. "lsl r6, r8, #16\n\t"
  104382. "lsl r7, r9, #16\n\t"
  104383. "lsr r6, r6, #16\n\t"
  104384. "lsr r7, r7, #16\n\t"
  104385. "mul r7, r6, r7\n\t"
  104386. "adds r3, r3, r7\n\t"
  104387. "adcs r4, r4, #0\n\t"
  104388. "adc r5, r5, #0\n\t"
  104389. "lsr r7, r9, #16\n\t"
  104390. "mul r6, r7, r6\n\t"
  104391. "lsr r7, r6, #16\n\t"
  104392. "lsl r6, r6, #16\n\t"
  104393. "adds r3, r3, r6\n\t"
  104394. "adcs r4, r4, r7\n\t"
  104395. "adc r5, r5, #0\n\t"
  104396. "lsr r6, r8, #16\n\t"
  104397. "lsr r7, r9, #16\n\t"
  104398. "mul r7, r6, r7\n\t"
  104399. "adds r4, r4, r7\n\t"
  104400. "adc r5, r5, #0\n\t"
  104401. "lsl r7, r9, #16\n\t"
  104402. "lsr r7, r7, #16\n\t"
  104403. "mul r6, r7, r6\n\t"
  104404. "lsr r7, r6, #16\n\t"
  104405. "lsl r6, r6, #16\n\t"
  104406. "adds r3, r3, r6\n\t"
  104407. "adcs r4, r4, r7\n\t"
  104408. "adc r5, r5, #0\n\t"
  104409. #else
  104410. "umull r6, r7, r8, r9\n\t"
  104411. "adds r3, r3, r6\n\t"
  104412. "adcs r4, r4, r7\n\t"
  104413. "adc r5, r5, #0\n\t"
  104414. #endif
  104415. /* A[7] * B[14] */
  104416. "ldr r8, [%[a], #28]\n\t"
  104417. "ldr r9, [%[b], #56]\n\t"
  104418. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  104419. "lsl r6, r8, #16\n\t"
  104420. "lsl r7, r9, #16\n\t"
  104421. "lsr r6, r6, #16\n\t"
  104422. "lsr r7, r7, #16\n\t"
  104423. "mul r7, r6, r7\n\t"
  104424. "adds r3, r3, r7\n\t"
  104425. "adcs r4, r4, #0\n\t"
  104426. "adc r5, r5, #0\n\t"
  104427. "lsr r7, r9, #16\n\t"
  104428. "mul r6, r7, r6\n\t"
  104429. "lsr r7, r6, #16\n\t"
  104430. "lsl r6, r6, #16\n\t"
  104431. "adds r3, r3, r6\n\t"
  104432. "adcs r4, r4, r7\n\t"
  104433. "adc r5, r5, #0\n\t"
  104434. "lsr r6, r8, #16\n\t"
  104435. "lsr r7, r9, #16\n\t"
  104436. "mul r7, r6, r7\n\t"
  104437. "adds r4, r4, r7\n\t"
  104438. "adc r5, r5, #0\n\t"
  104439. "lsl r7, r9, #16\n\t"
  104440. "lsr r7, r7, #16\n\t"
  104441. "mul r6, r7, r6\n\t"
  104442. "lsr r7, r6, #16\n\t"
  104443. "lsl r6, r6, #16\n\t"
  104444. "adds r3, r3, r6\n\t"
  104445. "adcs r4, r4, r7\n\t"
  104446. "adc r5, r5, #0\n\t"
  104447. #else
  104448. "umull r6, r7, r8, r9\n\t"
  104449. "adds r3, r3, r6\n\t"
  104450. "adcs r4, r4, r7\n\t"
  104451. "adc r5, r5, #0\n\t"
  104452. #endif
  104453. /* A[8] * B[13] */
  104454. "ldr r8, [%[a], #32]\n\t"
  104455. "ldr r9, [%[b], #52]\n\t"
  104456. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  104457. "lsl r6, r8, #16\n\t"
  104458. "lsl r7, r9, #16\n\t"
  104459. "lsr r6, r6, #16\n\t"
  104460. "lsr r7, r7, #16\n\t"
  104461. "mul r7, r6, r7\n\t"
  104462. "adds r3, r3, r7\n\t"
  104463. "adcs r4, r4, #0\n\t"
  104464. "adc r5, r5, #0\n\t"
  104465. "lsr r7, r9, #16\n\t"
  104466. "mul r6, r7, r6\n\t"
  104467. "lsr r7, r6, #16\n\t"
  104468. "lsl r6, r6, #16\n\t"
  104469. "adds r3, r3, r6\n\t"
  104470. "adcs r4, r4, r7\n\t"
  104471. "adc r5, r5, #0\n\t"
  104472. "lsr r6, r8, #16\n\t"
  104473. "lsr r7, r9, #16\n\t"
  104474. "mul r7, r6, r7\n\t"
  104475. "adds r4, r4, r7\n\t"
  104476. "adc r5, r5, #0\n\t"
  104477. "lsl r7, r9, #16\n\t"
  104478. "lsr r7, r7, #16\n\t"
  104479. "mul r6, r7, r6\n\t"
  104480. "lsr r7, r6, #16\n\t"
  104481. "lsl r6, r6, #16\n\t"
  104482. "adds r3, r3, r6\n\t"
  104483. "adcs r4, r4, r7\n\t"
  104484. "adc r5, r5, #0\n\t"
  104485. #else
  104486. "umull r6, r7, r8, r9\n\t"
  104487. "adds r3, r3, r6\n\t"
  104488. "adcs r4, r4, r7\n\t"
  104489. "adc r5, r5, #0\n\t"
  104490. #endif
  104491. /* A[9] * B[12] */
  104492. "ldr r8, [%[a], #36]\n\t"
  104493. "ldr r9, [%[b], #48]\n\t"
  104494. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  104495. "lsl r6, r8, #16\n\t"
  104496. "lsl r7, r9, #16\n\t"
  104497. "lsr r6, r6, #16\n\t"
  104498. "lsr r7, r7, #16\n\t"
  104499. "mul r7, r6, r7\n\t"
  104500. "adds r3, r3, r7\n\t"
  104501. "adcs r4, r4, #0\n\t"
  104502. "adc r5, r5, #0\n\t"
  104503. "lsr r7, r9, #16\n\t"
  104504. "mul r6, r7, r6\n\t"
  104505. "lsr r7, r6, #16\n\t"
  104506. "lsl r6, r6, #16\n\t"
  104507. "adds r3, r3, r6\n\t"
  104508. "adcs r4, r4, r7\n\t"
  104509. "adc r5, r5, #0\n\t"
  104510. "lsr r6, r8, #16\n\t"
  104511. "lsr r7, r9, #16\n\t"
  104512. "mul r7, r6, r7\n\t"
  104513. "adds r4, r4, r7\n\t"
  104514. "adc r5, r5, #0\n\t"
  104515. "lsl r7, r9, #16\n\t"
  104516. "lsr r7, r7, #16\n\t"
  104517. "mul r6, r7, r6\n\t"
  104518. "lsr r7, r6, #16\n\t"
  104519. "lsl r6, r6, #16\n\t"
  104520. "adds r3, r3, r6\n\t"
  104521. "adcs r4, r4, r7\n\t"
  104522. "adc r5, r5, #0\n\t"
  104523. #else
  104524. "umull r6, r7, r8, r9\n\t"
  104525. "adds r3, r3, r6\n\t"
  104526. "adcs r4, r4, r7\n\t"
  104527. "adc r5, r5, #0\n\t"
  104528. #endif
  104529. /* A[10] * B[11] */
  104530. "ldr r9, [%[b], #44]\n\t"
  104531. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  104532. "lsl r6, r11, #16\n\t"
  104533. "lsl r7, r9, #16\n\t"
  104534. "lsr r6, r6, #16\n\t"
  104535. "lsr r7, r7, #16\n\t"
  104536. "mul r7, r6, r7\n\t"
  104537. "adds r3, r3, r7\n\t"
  104538. "adcs r4, r4, #0\n\t"
  104539. "adc r5, r5, #0\n\t"
  104540. "lsr r7, r9, #16\n\t"
  104541. "mul r6, r7, r6\n\t"
  104542. "lsr r7, r6, #16\n\t"
  104543. "lsl r6, r6, #16\n\t"
  104544. "adds r3, r3, r6\n\t"
  104545. "adcs r4, r4, r7\n\t"
  104546. "adc r5, r5, #0\n\t"
  104547. "lsr r6, r11, #16\n\t"
  104548. "lsr r7, r9, #16\n\t"
  104549. "mul r7, r6, r7\n\t"
  104550. "adds r4, r4, r7\n\t"
  104551. "adc r5, r5, #0\n\t"
  104552. "lsl r7, r9, #16\n\t"
  104553. "lsr r7, r7, #16\n\t"
  104554. "mul r6, r7, r6\n\t"
  104555. "lsr r7, r6, #16\n\t"
  104556. "lsl r6, r6, #16\n\t"
  104557. "adds r3, r3, r6\n\t"
  104558. "adcs r4, r4, r7\n\t"
  104559. "adc r5, r5, #0\n\t"
  104560. #else
  104561. "umull r6, r7, r11, r9\n\t"
  104562. "adds r3, r3, r6\n\t"
  104563. "adcs r4, r4, r7\n\t"
  104564. "adc r5, r5, #0\n\t"
  104565. #endif
  104566. /* A[11] * B[10] */
  104567. "ldr r8, [%[a], #44]\n\t"
  104568. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  104569. "lsl r6, r8, #16\n\t"
  104570. "lsl r7, r12, #16\n\t"
  104571. "lsr r6, r6, #16\n\t"
  104572. "lsr r7, r7, #16\n\t"
  104573. "mul r7, r6, r7\n\t"
  104574. "adds r3, r3, r7\n\t"
  104575. "adcs r4, r4, #0\n\t"
  104576. "adc r5, r5, #0\n\t"
  104577. "lsr r7, r12, #16\n\t"
  104578. "mul r6, r7, r6\n\t"
  104579. "lsr r7, r6, #16\n\t"
  104580. "lsl r6, r6, #16\n\t"
  104581. "adds r3, r3, r6\n\t"
  104582. "adcs r4, r4, r7\n\t"
  104583. "adc r5, r5, #0\n\t"
  104584. "lsr r6, r8, #16\n\t"
  104585. "lsr r7, r12, #16\n\t"
  104586. "mul r7, r6, r7\n\t"
  104587. "adds r4, r4, r7\n\t"
  104588. "adc r5, r5, #0\n\t"
  104589. "lsl r7, r12, #16\n\t"
  104590. "lsr r7, r7, #16\n\t"
  104591. "mul r6, r7, r6\n\t"
  104592. "lsr r7, r6, #16\n\t"
  104593. "lsl r6, r6, #16\n\t"
  104594. "adds r3, r3, r6\n\t"
  104595. "adcs r4, r4, r7\n\t"
  104596. "adc r5, r5, #0\n\t"
  104597. #else
  104598. "umull r6, r7, r8, r12\n\t"
  104599. "adds r3, r3, r6\n\t"
  104600. "adcs r4, r4, r7\n\t"
  104601. "adc r5, r5, #0\n\t"
  104602. #endif
  104603. /* A[12] * B[9] */
  104604. "ldr r8, [%[a], #48]\n\t"
  104605. "ldr r9, [%[b], #36]\n\t"
  104606. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  104607. "lsl r6, r8, #16\n\t"
  104608. "lsl r7, r9, #16\n\t"
  104609. "lsr r6, r6, #16\n\t"
  104610. "lsr r7, r7, #16\n\t"
  104611. "mul r7, r6, r7\n\t"
  104612. "adds r3, r3, r7\n\t"
  104613. "adcs r4, r4, #0\n\t"
  104614. "adc r5, r5, #0\n\t"
  104615. "lsr r7, r9, #16\n\t"
  104616. "mul r6, r7, r6\n\t"
  104617. "lsr r7, r6, #16\n\t"
  104618. "lsl r6, r6, #16\n\t"
  104619. "adds r3, r3, r6\n\t"
  104620. "adcs r4, r4, r7\n\t"
  104621. "adc r5, r5, #0\n\t"
  104622. "lsr r6, r8, #16\n\t"
  104623. "lsr r7, r9, #16\n\t"
  104624. "mul r7, r6, r7\n\t"
  104625. "adds r4, r4, r7\n\t"
  104626. "adc r5, r5, #0\n\t"
  104627. "lsl r7, r9, #16\n\t"
  104628. "lsr r7, r7, #16\n\t"
  104629. "mul r6, r7, r6\n\t"
  104630. "lsr r7, r6, #16\n\t"
  104631. "lsl r6, r6, #16\n\t"
  104632. "adds r3, r3, r6\n\t"
  104633. "adcs r4, r4, r7\n\t"
  104634. "adc r5, r5, #0\n\t"
  104635. #else
  104636. "umull r6, r7, r8, r9\n\t"
  104637. "adds r3, r3, r6\n\t"
  104638. "adcs r4, r4, r7\n\t"
  104639. "adc r5, r5, #0\n\t"
  104640. #endif
  104641. /* A[13] * B[8] */
  104642. "ldr r8, [%[a], #52]\n\t"
  104643. "ldr r9, [%[b], #32]\n\t"
  104644. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  104645. "lsl r6, r8, #16\n\t"
  104646. "lsl r7, r9, #16\n\t"
  104647. "lsr r6, r6, #16\n\t"
  104648. "lsr r7, r7, #16\n\t"
  104649. "mul r7, r6, r7\n\t"
  104650. "adds r3, r3, r7\n\t"
  104651. "adcs r4, r4, #0\n\t"
  104652. "adc r5, r5, #0\n\t"
  104653. "lsr r7, r9, #16\n\t"
  104654. "mul r6, r7, r6\n\t"
  104655. "lsr r7, r6, #16\n\t"
  104656. "lsl r6, r6, #16\n\t"
  104657. "adds r3, r3, r6\n\t"
  104658. "adcs r4, r4, r7\n\t"
  104659. "adc r5, r5, #0\n\t"
  104660. "lsr r6, r8, #16\n\t"
  104661. "lsr r7, r9, #16\n\t"
  104662. "mul r7, r6, r7\n\t"
  104663. "adds r4, r4, r7\n\t"
  104664. "adc r5, r5, #0\n\t"
  104665. "lsl r7, r9, #16\n\t"
  104666. "lsr r7, r7, #16\n\t"
  104667. "mul r6, r7, r6\n\t"
  104668. "lsr r7, r6, #16\n\t"
  104669. "lsl r6, r6, #16\n\t"
  104670. "adds r3, r3, r6\n\t"
  104671. "adcs r4, r4, r7\n\t"
  104672. "adc r5, r5, #0\n\t"
  104673. #else
  104674. "umull r6, r7, r8, r9\n\t"
  104675. "adds r3, r3, r6\n\t"
  104676. "adcs r4, r4, r7\n\t"
  104677. "adc r5, r5, #0\n\t"
  104678. #endif
  104679. /* A[14] * B[7] */
  104680. "ldr r8, [%[a], #56]\n\t"
  104681. "ldr r9, [%[b], #28]\n\t"
  104682. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  104683. "lsl r6, r8, #16\n\t"
  104684. "lsl r7, r9, #16\n\t"
  104685. "lsr r6, r6, #16\n\t"
  104686. "lsr r7, r7, #16\n\t"
  104687. "mul r7, r6, r7\n\t"
  104688. "adds r3, r3, r7\n\t"
  104689. "adcs r4, r4, #0\n\t"
  104690. "adc r5, r5, #0\n\t"
  104691. "lsr r7, r9, #16\n\t"
  104692. "mul r6, r7, r6\n\t"
  104693. "lsr r7, r6, #16\n\t"
  104694. "lsl r6, r6, #16\n\t"
  104695. "adds r3, r3, r6\n\t"
  104696. "adcs r4, r4, r7\n\t"
  104697. "adc r5, r5, #0\n\t"
  104698. "lsr r6, r8, #16\n\t"
  104699. "lsr r7, r9, #16\n\t"
  104700. "mul r7, r6, r7\n\t"
  104701. "adds r4, r4, r7\n\t"
  104702. "adc r5, r5, #0\n\t"
  104703. "lsl r7, r9, #16\n\t"
  104704. "lsr r7, r7, #16\n\t"
  104705. "mul r6, r7, r6\n\t"
  104706. "lsr r7, r6, #16\n\t"
  104707. "lsl r6, r6, #16\n\t"
  104708. "adds r3, r3, r6\n\t"
  104709. "adcs r4, r4, r7\n\t"
  104710. "adc r5, r5, #0\n\t"
  104711. #else
  104712. "umull r6, r7, r8, r9\n\t"
  104713. "adds r3, r3, r6\n\t"
  104714. "adcs r4, r4, r7\n\t"
  104715. "adc r5, r5, #0\n\t"
  104716. #endif
  104717. /* A[15] * B[6] */
  104718. "ldr r8, [%[a], #60]\n\t"
  104719. "ldr r9, [%[b], #24]\n\t"
  104720. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  104721. "lsl r6, r8, #16\n\t"
  104722. "lsl r7, r9, #16\n\t"
  104723. "lsr r6, r6, #16\n\t"
  104724. "lsr r7, r7, #16\n\t"
  104725. "mul r7, r6, r7\n\t"
  104726. "adds r3, r3, r7\n\t"
  104727. "adcs r4, r4, #0\n\t"
  104728. "adc r5, r5, #0\n\t"
  104729. "lsr r7, r9, #16\n\t"
  104730. "mul r6, r7, r6\n\t"
  104731. "lsr r7, r6, #16\n\t"
  104732. "lsl r6, r6, #16\n\t"
  104733. "adds r3, r3, r6\n\t"
  104734. "adcs r4, r4, r7\n\t"
  104735. "adc r5, r5, #0\n\t"
  104736. "lsr r6, r8, #16\n\t"
  104737. "lsr r7, r9, #16\n\t"
  104738. "mul r7, r6, r7\n\t"
  104739. "adds r4, r4, r7\n\t"
  104740. "adc r5, r5, #0\n\t"
  104741. "lsl r7, r9, #16\n\t"
  104742. "lsr r7, r7, #16\n\t"
  104743. "mul r6, r7, r6\n\t"
  104744. "lsr r7, r6, #16\n\t"
  104745. "lsl r6, r6, #16\n\t"
  104746. "adds r3, r3, r6\n\t"
  104747. "adcs r4, r4, r7\n\t"
  104748. "adc r5, r5, #0\n\t"
  104749. #else
  104750. "umull r6, r7, r8, r9\n\t"
  104751. "adds r3, r3, r6\n\t"
  104752. "adcs r4, r4, r7\n\t"
  104753. "adc r5, r5, #0\n\t"
  104754. #endif
  104755. /* A[16] * B[5] */
  104756. "ldr r8, [%[a], #64]\n\t"
  104757. "ldr r9, [%[b], #20]\n\t"
  104758. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  104759. "lsl r6, r8, #16\n\t"
  104760. "lsl r7, r9, #16\n\t"
  104761. "lsr r6, r6, #16\n\t"
  104762. "lsr r7, r7, #16\n\t"
  104763. "mul r7, r6, r7\n\t"
  104764. "adds r3, r3, r7\n\t"
  104765. "adcs r4, r4, #0\n\t"
  104766. "adc r5, r5, #0\n\t"
  104767. "lsr r7, r9, #16\n\t"
  104768. "mul r6, r7, r6\n\t"
  104769. "lsr r7, r6, #16\n\t"
  104770. "lsl r6, r6, #16\n\t"
  104771. "adds r3, r3, r6\n\t"
  104772. "adcs r4, r4, r7\n\t"
  104773. "adc r5, r5, #0\n\t"
  104774. "lsr r6, r8, #16\n\t"
  104775. "lsr r7, r9, #16\n\t"
  104776. "mul r7, r6, r7\n\t"
  104777. "adds r4, r4, r7\n\t"
  104778. "adc r5, r5, #0\n\t"
  104779. "lsl r7, r9, #16\n\t"
  104780. "lsr r7, r7, #16\n\t"
  104781. "mul r6, r7, r6\n\t"
  104782. "lsr r7, r6, #16\n\t"
  104783. "lsl r6, r6, #16\n\t"
  104784. "adds r3, r3, r6\n\t"
  104785. "adcs r4, r4, r7\n\t"
  104786. "adc r5, r5, #0\n\t"
  104787. #else
  104788. "umull r6, r7, r8, r9\n\t"
  104789. "adds r3, r3, r6\n\t"
  104790. "adcs r4, r4, r7\n\t"
  104791. "adc r5, r5, #0\n\t"
  104792. #endif
  104793. "str r3, [%[r], #84]\n\t"
  104794. /* A[16] * B[6] */
  104795. "ldr r9, [%[b], #24]\n\t"
  104796. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  104797. "lsl r6, r8, #16\n\t"
  104798. "lsl r7, r9, #16\n\t"
  104799. "lsr r6, r6, #16\n\t"
  104800. "lsr r7, r7, #16\n\t"
  104801. "mul r7, r6, r7\n\t"
  104802. "adds r4, r4, r7\n\t"
  104803. "adcs r5, r5, #0\n\t"
  104804. "mov r3, #0\n\t"
  104805. "adc r3, r3, #0\n\t"
  104806. "lsr r7, r9, #16\n\t"
  104807. "mul r6, r7, r6\n\t"
  104808. "lsr r7, r6, #16\n\t"
  104809. "lsl r6, r6, #16\n\t"
  104810. "adds r4, r4, r6\n\t"
  104811. "adcs r5, r5, r7\n\t"
  104812. "adc r3, r3, #0\n\t"
  104813. "lsr r6, r8, #16\n\t"
  104814. "lsr r7, r9, #16\n\t"
  104815. "mul r7, r6, r7\n\t"
  104816. "adds r5, r5, r7\n\t"
  104817. "adc r3, r3, #0\n\t"
  104818. "lsl r7, r9, #16\n\t"
  104819. "lsr r7, r7, #16\n\t"
  104820. "mul r6, r7, r6\n\t"
  104821. "lsr r7, r6, #16\n\t"
  104822. "lsl r6, r6, #16\n\t"
  104823. "adds r4, r4, r6\n\t"
  104824. "adcs r5, r5, r7\n\t"
  104825. "adc r3, r3, #0\n\t"
  104826. #else
  104827. "umull r6, r7, r8, r9\n\t"
  104828. "adds r4, r4, r6\n\t"
  104829. "adcs r5, r5, r7\n\t"
  104830. "mov r3, #0\n\t"
  104831. "adc r3, r3, #0\n\t"
  104832. #endif
  104833. /* A[15] * B[7] */
  104834. "ldr r8, [%[a], #60]\n\t"
  104835. "ldr r9, [%[b], #28]\n\t"
  104836. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  104837. "lsl r6, r8, #16\n\t"
  104838. "lsl r7, r9, #16\n\t"
  104839. "lsr r6, r6, #16\n\t"
  104840. "lsr r7, r7, #16\n\t"
  104841. "mul r7, r6, r7\n\t"
  104842. "adds r4, r4, r7\n\t"
  104843. "adcs r5, r5, #0\n\t"
  104844. "adc r3, r3, #0\n\t"
  104845. "lsr r7, r9, #16\n\t"
  104846. "mul r6, r7, r6\n\t"
  104847. "lsr r7, r6, #16\n\t"
  104848. "lsl r6, r6, #16\n\t"
  104849. "adds r4, r4, r6\n\t"
  104850. "adcs r5, r5, r7\n\t"
  104851. "adc r3, r3, #0\n\t"
  104852. "lsr r6, r8, #16\n\t"
  104853. "lsr r7, r9, #16\n\t"
  104854. "mul r7, r6, r7\n\t"
  104855. "adds r5, r5, r7\n\t"
  104856. "adc r3, r3, #0\n\t"
  104857. "lsl r7, r9, #16\n\t"
  104858. "lsr r7, r7, #16\n\t"
  104859. "mul r6, r7, r6\n\t"
  104860. "lsr r7, r6, #16\n\t"
  104861. "lsl r6, r6, #16\n\t"
  104862. "adds r4, r4, r6\n\t"
  104863. "adcs r5, r5, r7\n\t"
  104864. "adc r3, r3, #0\n\t"
  104865. #else
  104866. "umull r6, r7, r8, r9\n\t"
  104867. "adds r4, r4, r6\n\t"
  104868. "adcs r5, r5, r7\n\t"
  104869. "adc r3, r3, #0\n\t"
  104870. #endif
  104871. /* A[14] * B[8] */
  104872. "ldr r8, [%[a], #56]\n\t"
  104873. "ldr r9, [%[b], #32]\n\t"
  104874. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  104875. "lsl r6, r8, #16\n\t"
  104876. "lsl r7, r9, #16\n\t"
  104877. "lsr r6, r6, #16\n\t"
  104878. "lsr r7, r7, #16\n\t"
  104879. "mul r7, r6, r7\n\t"
  104880. "adds r4, r4, r7\n\t"
  104881. "adcs r5, r5, #0\n\t"
  104882. "adc r3, r3, #0\n\t"
  104883. "lsr r7, r9, #16\n\t"
  104884. "mul r6, r7, r6\n\t"
  104885. "lsr r7, r6, #16\n\t"
  104886. "lsl r6, r6, #16\n\t"
  104887. "adds r4, r4, r6\n\t"
  104888. "adcs r5, r5, r7\n\t"
  104889. "adc r3, r3, #0\n\t"
  104890. "lsr r6, r8, #16\n\t"
  104891. "lsr r7, r9, #16\n\t"
  104892. "mul r7, r6, r7\n\t"
  104893. "adds r5, r5, r7\n\t"
  104894. "adc r3, r3, #0\n\t"
  104895. "lsl r7, r9, #16\n\t"
  104896. "lsr r7, r7, #16\n\t"
  104897. "mul r6, r7, r6\n\t"
  104898. "lsr r7, r6, #16\n\t"
  104899. "lsl r6, r6, #16\n\t"
  104900. "adds r4, r4, r6\n\t"
  104901. "adcs r5, r5, r7\n\t"
  104902. "adc r3, r3, #0\n\t"
  104903. #else
  104904. "umull r6, r7, r8, r9\n\t"
  104905. "adds r4, r4, r6\n\t"
  104906. "adcs r5, r5, r7\n\t"
  104907. "adc r3, r3, #0\n\t"
  104908. #endif
  104909. /* A[13] * B[9] */
  104910. "ldr r8, [%[a], #52]\n\t"
  104911. "ldr r9, [%[b], #36]\n\t"
  104912. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  104913. "lsl r6, r8, #16\n\t"
  104914. "lsl r7, r9, #16\n\t"
  104915. "lsr r6, r6, #16\n\t"
  104916. "lsr r7, r7, #16\n\t"
  104917. "mul r7, r6, r7\n\t"
  104918. "adds r4, r4, r7\n\t"
  104919. "adcs r5, r5, #0\n\t"
  104920. "adc r3, r3, #0\n\t"
  104921. "lsr r7, r9, #16\n\t"
  104922. "mul r6, r7, r6\n\t"
  104923. "lsr r7, r6, #16\n\t"
  104924. "lsl r6, r6, #16\n\t"
  104925. "adds r4, r4, r6\n\t"
  104926. "adcs r5, r5, r7\n\t"
  104927. "adc r3, r3, #0\n\t"
  104928. "lsr r6, r8, #16\n\t"
  104929. "lsr r7, r9, #16\n\t"
  104930. "mul r7, r6, r7\n\t"
  104931. "adds r5, r5, r7\n\t"
  104932. "adc r3, r3, #0\n\t"
  104933. "lsl r7, r9, #16\n\t"
  104934. "lsr r7, r7, #16\n\t"
  104935. "mul r6, r7, r6\n\t"
  104936. "lsr r7, r6, #16\n\t"
  104937. "lsl r6, r6, #16\n\t"
  104938. "adds r4, r4, r6\n\t"
  104939. "adcs r5, r5, r7\n\t"
  104940. "adc r3, r3, #0\n\t"
  104941. #else
  104942. "umull r6, r7, r8, r9\n\t"
  104943. "adds r4, r4, r6\n\t"
  104944. "adcs r5, r5, r7\n\t"
  104945. "adc r3, r3, #0\n\t"
  104946. #endif
  104947. /* A[12] * B[10] */
  104948. "ldr r8, [%[a], #48]\n\t"
  104949. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  104950. "lsl r6, r8, #16\n\t"
  104951. "lsl r7, r12, #16\n\t"
  104952. "lsr r6, r6, #16\n\t"
  104953. "lsr r7, r7, #16\n\t"
  104954. "mul r7, r6, r7\n\t"
  104955. "adds r4, r4, r7\n\t"
  104956. "adcs r5, r5, #0\n\t"
  104957. "adc r3, r3, #0\n\t"
  104958. "lsr r7, r12, #16\n\t"
  104959. "mul r6, r7, r6\n\t"
  104960. "lsr r7, r6, #16\n\t"
  104961. "lsl r6, r6, #16\n\t"
  104962. "adds r4, r4, r6\n\t"
  104963. "adcs r5, r5, r7\n\t"
  104964. "adc r3, r3, #0\n\t"
  104965. "lsr r6, r8, #16\n\t"
  104966. "lsr r7, r12, #16\n\t"
  104967. "mul r7, r6, r7\n\t"
  104968. "adds r5, r5, r7\n\t"
  104969. "adc r3, r3, #0\n\t"
  104970. "lsl r7, r12, #16\n\t"
  104971. "lsr r7, r7, #16\n\t"
  104972. "mul r6, r7, r6\n\t"
  104973. "lsr r7, r6, #16\n\t"
  104974. "lsl r6, r6, #16\n\t"
  104975. "adds r4, r4, r6\n\t"
  104976. "adcs r5, r5, r7\n\t"
  104977. "adc r3, r3, #0\n\t"
  104978. #else
  104979. "umull r6, r7, r8, r12\n\t"
  104980. "adds r4, r4, r6\n\t"
  104981. "adcs r5, r5, r7\n\t"
  104982. "adc r3, r3, #0\n\t"
  104983. #endif
  104984. /* A[11] * B[11] */
  104985. "ldr r11, [%[a], #44]\n\t"
  104986. "ldr r12, [%[b], #44]\n\t"
  104987. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  104988. "lsl r6, r11, #16\n\t"
  104989. "lsl r7, r12, #16\n\t"
  104990. "lsr r6, r6, #16\n\t"
  104991. "lsr r7, r7, #16\n\t"
  104992. "mul r7, r6, r7\n\t"
  104993. "adds r4, r4, r7\n\t"
  104994. "adcs r5, r5, #0\n\t"
  104995. "adc r3, r3, #0\n\t"
  104996. "lsr r7, r12, #16\n\t"
  104997. "mul r6, r7, r6\n\t"
  104998. "lsr r7, r6, #16\n\t"
  104999. "lsl r6, r6, #16\n\t"
  105000. "adds r4, r4, r6\n\t"
  105001. "adcs r5, r5, r7\n\t"
  105002. "adc r3, r3, #0\n\t"
  105003. "lsr r6, r11, #16\n\t"
  105004. "lsr r7, r12, #16\n\t"
  105005. "mul r7, r6, r7\n\t"
  105006. "adds r5, r5, r7\n\t"
  105007. "adc r3, r3, #0\n\t"
  105008. "lsl r7, r12, #16\n\t"
  105009. "lsr r7, r7, #16\n\t"
  105010. "mul r6, r7, r6\n\t"
  105011. "lsr r7, r6, #16\n\t"
  105012. "lsl r6, r6, #16\n\t"
  105013. "adds r4, r4, r6\n\t"
  105014. "adcs r5, r5, r7\n\t"
  105015. "adc r3, r3, #0\n\t"
  105016. #else
  105017. "umull r6, r7, r11, r12\n\t"
  105018. "adds r4, r4, r6\n\t"
  105019. "adcs r5, r5, r7\n\t"
  105020. "adc r3, r3, #0\n\t"
  105021. #endif
  105022. /* A[10] * B[12] */
  105023. "ldr r8, [%[a], #40]\n\t"
  105024. "ldr r9, [%[b], #48]\n\t"
  105025. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  105026. "lsl r6, r8, #16\n\t"
  105027. "lsl r7, r9, #16\n\t"
  105028. "lsr r6, r6, #16\n\t"
  105029. "lsr r7, r7, #16\n\t"
  105030. "mul r7, r6, r7\n\t"
  105031. "adds r4, r4, r7\n\t"
  105032. "adcs r5, r5, #0\n\t"
  105033. "adc r3, r3, #0\n\t"
  105034. "lsr r7, r9, #16\n\t"
  105035. "mul r6, r7, r6\n\t"
  105036. "lsr r7, r6, #16\n\t"
  105037. "lsl r6, r6, #16\n\t"
  105038. "adds r4, r4, r6\n\t"
  105039. "adcs r5, r5, r7\n\t"
  105040. "adc r3, r3, #0\n\t"
  105041. "lsr r6, r8, #16\n\t"
  105042. "lsr r7, r9, #16\n\t"
  105043. "mul r7, r6, r7\n\t"
  105044. "adds r5, r5, r7\n\t"
  105045. "adc r3, r3, #0\n\t"
  105046. "lsl r7, r9, #16\n\t"
  105047. "lsr r7, r7, #16\n\t"
  105048. "mul r6, r7, r6\n\t"
  105049. "lsr r7, r6, #16\n\t"
  105050. "lsl r6, r6, #16\n\t"
  105051. "adds r4, r4, r6\n\t"
  105052. "adcs r5, r5, r7\n\t"
  105053. "adc r3, r3, #0\n\t"
  105054. #else
  105055. "umull r6, r7, r8, r9\n\t"
  105056. "adds r4, r4, r6\n\t"
  105057. "adcs r5, r5, r7\n\t"
  105058. "adc r3, r3, #0\n\t"
  105059. #endif
  105060. /* A[9] * B[13] */
  105061. "ldr r8, [%[a], #36]\n\t"
  105062. "ldr r9, [%[b], #52]\n\t"
  105063. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  105064. "lsl r6, r8, #16\n\t"
  105065. "lsl r7, r9, #16\n\t"
  105066. "lsr r6, r6, #16\n\t"
  105067. "lsr r7, r7, #16\n\t"
  105068. "mul r7, r6, r7\n\t"
  105069. "adds r4, r4, r7\n\t"
  105070. "adcs r5, r5, #0\n\t"
  105071. "adc r3, r3, #0\n\t"
  105072. "lsr r7, r9, #16\n\t"
  105073. "mul r6, r7, r6\n\t"
  105074. "lsr r7, r6, #16\n\t"
  105075. "lsl r6, r6, #16\n\t"
  105076. "adds r4, r4, r6\n\t"
  105077. "adcs r5, r5, r7\n\t"
  105078. "adc r3, r3, #0\n\t"
  105079. "lsr r6, r8, #16\n\t"
  105080. "lsr r7, r9, #16\n\t"
  105081. "mul r7, r6, r7\n\t"
  105082. "adds r5, r5, r7\n\t"
  105083. "adc r3, r3, #0\n\t"
  105084. "lsl r7, r9, #16\n\t"
  105085. "lsr r7, r7, #16\n\t"
  105086. "mul r6, r7, r6\n\t"
  105087. "lsr r7, r6, #16\n\t"
  105088. "lsl r6, r6, #16\n\t"
  105089. "adds r4, r4, r6\n\t"
  105090. "adcs r5, r5, r7\n\t"
  105091. "adc r3, r3, #0\n\t"
  105092. #else
  105093. "umull r6, r7, r8, r9\n\t"
  105094. "adds r4, r4, r6\n\t"
  105095. "adcs r5, r5, r7\n\t"
  105096. "adc r3, r3, #0\n\t"
  105097. #endif
  105098. /* A[8] * B[14] */
  105099. "ldr r8, [%[a], #32]\n\t"
  105100. "ldr r9, [%[b], #56]\n\t"
  105101. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  105102. "lsl r6, r8, #16\n\t"
  105103. "lsl r7, r9, #16\n\t"
  105104. "lsr r6, r6, #16\n\t"
  105105. "lsr r7, r7, #16\n\t"
  105106. "mul r7, r6, r7\n\t"
  105107. "adds r4, r4, r7\n\t"
  105108. "adcs r5, r5, #0\n\t"
  105109. "adc r3, r3, #0\n\t"
  105110. "lsr r7, r9, #16\n\t"
  105111. "mul r6, r7, r6\n\t"
  105112. "lsr r7, r6, #16\n\t"
  105113. "lsl r6, r6, #16\n\t"
  105114. "adds r4, r4, r6\n\t"
  105115. "adcs r5, r5, r7\n\t"
  105116. "adc r3, r3, #0\n\t"
  105117. "lsr r6, r8, #16\n\t"
  105118. "lsr r7, r9, #16\n\t"
  105119. "mul r7, r6, r7\n\t"
  105120. "adds r5, r5, r7\n\t"
  105121. "adc r3, r3, #0\n\t"
  105122. "lsl r7, r9, #16\n\t"
  105123. "lsr r7, r7, #16\n\t"
  105124. "mul r6, r7, r6\n\t"
  105125. "lsr r7, r6, #16\n\t"
  105126. "lsl r6, r6, #16\n\t"
  105127. "adds r4, r4, r6\n\t"
  105128. "adcs r5, r5, r7\n\t"
  105129. "adc r3, r3, #0\n\t"
  105130. #else
  105131. "umull r6, r7, r8, r9\n\t"
  105132. "adds r4, r4, r6\n\t"
  105133. "adcs r5, r5, r7\n\t"
  105134. "adc r3, r3, #0\n\t"
  105135. #endif
  105136. /* A[7] * B[15] */
  105137. "ldr r8, [%[a], #28]\n\t"
  105138. "ldr r9, [%[b], #60]\n\t"
  105139. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  105140. "lsl r6, r8, #16\n\t"
  105141. "lsl r7, r9, #16\n\t"
  105142. "lsr r6, r6, #16\n\t"
  105143. "lsr r7, r7, #16\n\t"
  105144. "mul r7, r6, r7\n\t"
  105145. "adds r4, r4, r7\n\t"
  105146. "adcs r5, r5, #0\n\t"
  105147. "adc r3, r3, #0\n\t"
  105148. "lsr r7, r9, #16\n\t"
  105149. "mul r6, r7, r6\n\t"
  105150. "lsr r7, r6, #16\n\t"
  105151. "lsl r6, r6, #16\n\t"
  105152. "adds r4, r4, r6\n\t"
  105153. "adcs r5, r5, r7\n\t"
  105154. "adc r3, r3, #0\n\t"
  105155. "lsr r6, r8, #16\n\t"
  105156. "lsr r7, r9, #16\n\t"
  105157. "mul r7, r6, r7\n\t"
  105158. "adds r5, r5, r7\n\t"
  105159. "adc r3, r3, #0\n\t"
  105160. "lsl r7, r9, #16\n\t"
  105161. "lsr r7, r7, #16\n\t"
  105162. "mul r6, r7, r6\n\t"
  105163. "lsr r7, r6, #16\n\t"
  105164. "lsl r6, r6, #16\n\t"
  105165. "adds r4, r4, r6\n\t"
  105166. "adcs r5, r5, r7\n\t"
  105167. "adc r3, r3, #0\n\t"
  105168. #else
  105169. "umull r6, r7, r8, r9\n\t"
  105170. "adds r4, r4, r6\n\t"
  105171. "adcs r5, r5, r7\n\t"
  105172. "adc r3, r3, #0\n\t"
  105173. #endif
  105174. /* A[6] * B[16] */
  105175. "ldr r8, [%[a], #24]\n\t"
  105176. "ldr r9, [%[b], #64]\n\t"
  105177. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  105178. "lsl r6, r8, #16\n\t"
  105179. "lsl r7, r9, #16\n\t"
  105180. "lsr r6, r6, #16\n\t"
  105181. "lsr r7, r7, #16\n\t"
  105182. "mul r7, r6, r7\n\t"
  105183. "adds r4, r4, r7\n\t"
  105184. "adcs r5, r5, #0\n\t"
  105185. "adc r3, r3, #0\n\t"
  105186. "lsr r7, r9, #16\n\t"
  105187. "mul r6, r7, r6\n\t"
  105188. "lsr r7, r6, #16\n\t"
  105189. "lsl r6, r6, #16\n\t"
  105190. "adds r4, r4, r6\n\t"
  105191. "adcs r5, r5, r7\n\t"
  105192. "adc r3, r3, #0\n\t"
  105193. "lsr r6, r8, #16\n\t"
  105194. "lsr r7, r9, #16\n\t"
  105195. "mul r7, r6, r7\n\t"
  105196. "adds r5, r5, r7\n\t"
  105197. "adc r3, r3, #0\n\t"
  105198. "lsl r7, r9, #16\n\t"
  105199. "lsr r7, r7, #16\n\t"
  105200. "mul r6, r7, r6\n\t"
  105201. "lsr r7, r6, #16\n\t"
  105202. "lsl r6, r6, #16\n\t"
  105203. "adds r4, r4, r6\n\t"
  105204. "adcs r5, r5, r7\n\t"
  105205. "adc r3, r3, #0\n\t"
  105206. #else
  105207. "umull r6, r7, r8, r9\n\t"
  105208. "adds r4, r4, r6\n\t"
  105209. "adcs r5, r5, r7\n\t"
  105210. "adc r3, r3, #0\n\t"
  105211. #endif
  105212. "str r4, [%[r], #88]\n\t"
  105213. /* A[7] * B[16] */
  105214. "ldr r8, [%[a], #28]\n\t"
  105215. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  105216. "lsl r6, r8, #16\n\t"
  105217. "lsl r7, r9, #16\n\t"
  105218. "lsr r6, r6, #16\n\t"
  105219. "lsr r7, r7, #16\n\t"
  105220. "mul r7, r6, r7\n\t"
  105221. "adds r5, r5, r7\n\t"
  105222. "adcs r3, r3, #0\n\t"
  105223. "mov r4, #0\n\t"
  105224. "adc r4, r4, #0\n\t"
  105225. "lsr r7, r9, #16\n\t"
  105226. "mul r6, r7, r6\n\t"
  105227. "lsr r7, r6, #16\n\t"
  105228. "lsl r6, r6, #16\n\t"
  105229. "adds r5, r5, r6\n\t"
  105230. "adcs r3, r3, r7\n\t"
  105231. "adc r4, r4, #0\n\t"
  105232. "lsr r6, r8, #16\n\t"
  105233. "lsr r7, r9, #16\n\t"
  105234. "mul r7, r6, r7\n\t"
  105235. "adds r3, r3, r7\n\t"
  105236. "adc r4, r4, #0\n\t"
  105237. "lsl r7, r9, #16\n\t"
  105238. "lsr r7, r7, #16\n\t"
  105239. "mul r6, r7, r6\n\t"
  105240. "lsr r7, r6, #16\n\t"
  105241. "lsl r6, r6, #16\n\t"
  105242. "adds r5, r5, r6\n\t"
  105243. "adcs r3, r3, r7\n\t"
  105244. "adc r4, r4, #0\n\t"
  105245. #else
  105246. "umull r6, r7, r8, r9\n\t"
  105247. "adds r5, r5, r6\n\t"
  105248. "adcs r3, r3, r7\n\t"
  105249. "mov r4, #0\n\t"
  105250. "adc r4, r4, #0\n\t"
  105251. #endif
  105252. /* A[8] * B[15] */
  105253. "ldr r8, [%[a], #32]\n\t"
  105254. "ldr r9, [%[b], #60]\n\t"
  105255. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  105256. "lsl r6, r8, #16\n\t"
  105257. "lsl r7, r9, #16\n\t"
  105258. "lsr r6, r6, #16\n\t"
  105259. "lsr r7, r7, #16\n\t"
  105260. "mul r7, r6, r7\n\t"
  105261. "adds r5, r5, r7\n\t"
  105262. "adcs r3, r3, #0\n\t"
  105263. "adc r4, r4, #0\n\t"
  105264. "lsr r7, r9, #16\n\t"
  105265. "mul r6, r7, r6\n\t"
  105266. "lsr r7, r6, #16\n\t"
  105267. "lsl r6, r6, #16\n\t"
  105268. "adds r5, r5, r6\n\t"
  105269. "adcs r3, r3, r7\n\t"
  105270. "adc r4, r4, #0\n\t"
  105271. "lsr r6, r8, #16\n\t"
  105272. "lsr r7, r9, #16\n\t"
  105273. "mul r7, r6, r7\n\t"
  105274. "adds r3, r3, r7\n\t"
  105275. "adc r4, r4, #0\n\t"
  105276. "lsl r7, r9, #16\n\t"
  105277. "lsr r7, r7, #16\n\t"
  105278. "mul r6, r7, r6\n\t"
  105279. "lsr r7, r6, #16\n\t"
  105280. "lsl r6, r6, #16\n\t"
  105281. "adds r5, r5, r6\n\t"
  105282. "adcs r3, r3, r7\n\t"
  105283. "adc r4, r4, #0\n\t"
  105284. #else
  105285. "umull r6, r7, r8, r9\n\t"
  105286. "adds r5, r5, r6\n\t"
  105287. "adcs r3, r3, r7\n\t"
  105288. "adc r4, r4, #0\n\t"
  105289. #endif
  105290. /* A[9] * B[14] */
  105291. "ldr r8, [%[a], #36]\n\t"
  105292. "ldr r9, [%[b], #56]\n\t"
  105293. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  105294. "lsl r6, r8, #16\n\t"
  105295. "lsl r7, r9, #16\n\t"
  105296. "lsr r6, r6, #16\n\t"
  105297. "lsr r7, r7, #16\n\t"
  105298. "mul r7, r6, r7\n\t"
  105299. "adds r5, r5, r7\n\t"
  105300. "adcs r3, r3, #0\n\t"
  105301. "adc r4, r4, #0\n\t"
  105302. "lsr r7, r9, #16\n\t"
  105303. "mul r6, r7, r6\n\t"
  105304. "lsr r7, r6, #16\n\t"
  105305. "lsl r6, r6, #16\n\t"
  105306. "adds r5, r5, r6\n\t"
  105307. "adcs r3, r3, r7\n\t"
  105308. "adc r4, r4, #0\n\t"
  105309. "lsr r6, r8, #16\n\t"
  105310. "lsr r7, r9, #16\n\t"
  105311. "mul r7, r6, r7\n\t"
  105312. "adds r3, r3, r7\n\t"
  105313. "adc r4, r4, #0\n\t"
  105314. "lsl r7, r9, #16\n\t"
  105315. "lsr r7, r7, #16\n\t"
  105316. "mul r6, r7, r6\n\t"
  105317. "lsr r7, r6, #16\n\t"
  105318. "lsl r6, r6, #16\n\t"
  105319. "adds r5, r5, r6\n\t"
  105320. "adcs r3, r3, r7\n\t"
  105321. "adc r4, r4, #0\n\t"
  105322. #else
  105323. "umull r6, r7, r8, r9\n\t"
  105324. "adds r5, r5, r6\n\t"
  105325. "adcs r3, r3, r7\n\t"
  105326. "adc r4, r4, #0\n\t"
  105327. #endif
  105328. /* A[10] * B[13] */
  105329. "ldr r8, [%[a], #40]\n\t"
  105330. "ldr r9, [%[b], #52]\n\t"
  105331. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  105332. "lsl r6, r8, #16\n\t"
  105333. "lsl r7, r9, #16\n\t"
  105334. "lsr r6, r6, #16\n\t"
  105335. "lsr r7, r7, #16\n\t"
  105336. "mul r7, r6, r7\n\t"
  105337. "adds r5, r5, r7\n\t"
  105338. "adcs r3, r3, #0\n\t"
  105339. "adc r4, r4, #0\n\t"
  105340. "lsr r7, r9, #16\n\t"
  105341. "mul r6, r7, r6\n\t"
  105342. "lsr r7, r6, #16\n\t"
  105343. "lsl r6, r6, #16\n\t"
  105344. "adds r5, r5, r6\n\t"
  105345. "adcs r3, r3, r7\n\t"
  105346. "adc r4, r4, #0\n\t"
  105347. "lsr r6, r8, #16\n\t"
  105348. "lsr r7, r9, #16\n\t"
  105349. "mul r7, r6, r7\n\t"
  105350. "adds r3, r3, r7\n\t"
  105351. "adc r4, r4, #0\n\t"
  105352. "lsl r7, r9, #16\n\t"
  105353. "lsr r7, r7, #16\n\t"
  105354. "mul r6, r7, r6\n\t"
  105355. "lsr r7, r6, #16\n\t"
  105356. "lsl r6, r6, #16\n\t"
  105357. "adds r5, r5, r6\n\t"
  105358. "adcs r3, r3, r7\n\t"
  105359. "adc r4, r4, #0\n\t"
  105360. #else
  105361. "umull r6, r7, r8, r9\n\t"
  105362. "adds r5, r5, r6\n\t"
  105363. "adcs r3, r3, r7\n\t"
  105364. "adc r4, r4, #0\n\t"
  105365. #endif
  105366. /* A[11] * B[12] */
  105367. "ldr r9, [%[b], #48]\n\t"
  105368. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  105369. "lsl r6, r11, #16\n\t"
  105370. "lsl r7, r9, #16\n\t"
  105371. "lsr r6, r6, #16\n\t"
  105372. "lsr r7, r7, #16\n\t"
  105373. "mul r7, r6, r7\n\t"
  105374. "adds r5, r5, r7\n\t"
  105375. "adcs r3, r3, #0\n\t"
  105376. "adc r4, r4, #0\n\t"
  105377. "lsr r7, r9, #16\n\t"
  105378. "mul r6, r7, r6\n\t"
  105379. "lsr r7, r6, #16\n\t"
  105380. "lsl r6, r6, #16\n\t"
  105381. "adds r5, r5, r6\n\t"
  105382. "adcs r3, r3, r7\n\t"
  105383. "adc r4, r4, #0\n\t"
  105384. "lsr r6, r11, #16\n\t"
  105385. "lsr r7, r9, #16\n\t"
  105386. "mul r7, r6, r7\n\t"
  105387. "adds r3, r3, r7\n\t"
  105388. "adc r4, r4, #0\n\t"
  105389. "lsl r7, r9, #16\n\t"
  105390. "lsr r7, r7, #16\n\t"
  105391. "mul r6, r7, r6\n\t"
  105392. "lsr r7, r6, #16\n\t"
  105393. "lsl r6, r6, #16\n\t"
  105394. "adds r5, r5, r6\n\t"
  105395. "adcs r3, r3, r7\n\t"
  105396. "adc r4, r4, #0\n\t"
  105397. #else
  105398. "umull r6, r7, r11, r9\n\t"
  105399. "adds r5, r5, r6\n\t"
  105400. "adcs r3, r3, r7\n\t"
  105401. "adc r4, r4, #0\n\t"
  105402. #endif
  105403. /* A[12] * B[11] */
  105404. "ldr r8, [%[a], #48]\n\t"
  105405. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  105406. "lsl r6, r8, #16\n\t"
  105407. "lsl r7, r12, #16\n\t"
  105408. "lsr r6, r6, #16\n\t"
  105409. "lsr r7, r7, #16\n\t"
  105410. "mul r7, r6, r7\n\t"
  105411. "adds r5, r5, r7\n\t"
  105412. "adcs r3, r3, #0\n\t"
  105413. "adc r4, r4, #0\n\t"
  105414. "lsr r7, r12, #16\n\t"
  105415. "mul r6, r7, r6\n\t"
  105416. "lsr r7, r6, #16\n\t"
  105417. "lsl r6, r6, #16\n\t"
  105418. "adds r5, r5, r6\n\t"
  105419. "adcs r3, r3, r7\n\t"
  105420. "adc r4, r4, #0\n\t"
  105421. "lsr r6, r8, #16\n\t"
  105422. "lsr r7, r12, #16\n\t"
  105423. "mul r7, r6, r7\n\t"
  105424. "adds r3, r3, r7\n\t"
  105425. "adc r4, r4, #0\n\t"
  105426. "lsl r7, r12, #16\n\t"
  105427. "lsr r7, r7, #16\n\t"
  105428. "mul r6, r7, r6\n\t"
  105429. "lsr r7, r6, #16\n\t"
  105430. "lsl r6, r6, #16\n\t"
  105431. "adds r5, r5, r6\n\t"
  105432. "adcs r3, r3, r7\n\t"
  105433. "adc r4, r4, #0\n\t"
  105434. #else
  105435. "umull r6, r7, r8, r12\n\t"
  105436. "adds r5, r5, r6\n\t"
  105437. "adcs r3, r3, r7\n\t"
  105438. "adc r4, r4, #0\n\t"
  105439. #endif
  105440. /* A[13] * B[10] */
  105441. "ldr r8, [%[a], #52]\n\t"
  105442. "ldr r9, [%[b], #40]\n\t"
  105443. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  105444. "lsl r6, r8, #16\n\t"
  105445. "lsl r7, r9, #16\n\t"
  105446. "lsr r6, r6, #16\n\t"
  105447. "lsr r7, r7, #16\n\t"
  105448. "mul r7, r6, r7\n\t"
  105449. "adds r5, r5, r7\n\t"
  105450. "adcs r3, r3, #0\n\t"
  105451. "adc r4, r4, #0\n\t"
  105452. "lsr r7, r9, #16\n\t"
  105453. "mul r6, r7, r6\n\t"
  105454. "lsr r7, r6, #16\n\t"
  105455. "lsl r6, r6, #16\n\t"
  105456. "adds r5, r5, r6\n\t"
  105457. "adcs r3, r3, r7\n\t"
  105458. "adc r4, r4, #0\n\t"
  105459. "lsr r6, r8, #16\n\t"
  105460. "lsr r7, r9, #16\n\t"
  105461. "mul r7, r6, r7\n\t"
  105462. "adds r3, r3, r7\n\t"
  105463. "adc r4, r4, #0\n\t"
  105464. "lsl r7, r9, #16\n\t"
  105465. "lsr r7, r7, #16\n\t"
  105466. "mul r6, r7, r6\n\t"
  105467. "lsr r7, r6, #16\n\t"
  105468. "lsl r6, r6, #16\n\t"
  105469. "adds r5, r5, r6\n\t"
  105470. "adcs r3, r3, r7\n\t"
  105471. "adc r4, r4, #0\n\t"
  105472. #else
  105473. "umull r6, r7, r8, r9\n\t"
  105474. "adds r5, r5, r6\n\t"
  105475. "adcs r3, r3, r7\n\t"
  105476. "adc r4, r4, #0\n\t"
  105477. #endif
  105478. /* A[14] * B[9] */
  105479. "ldr r8, [%[a], #56]\n\t"
  105480. "ldr r9, [%[b], #36]\n\t"
  105481. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  105482. "lsl r6, r8, #16\n\t"
  105483. "lsl r7, r9, #16\n\t"
  105484. "lsr r6, r6, #16\n\t"
  105485. "lsr r7, r7, #16\n\t"
  105486. "mul r7, r6, r7\n\t"
  105487. "adds r5, r5, r7\n\t"
  105488. "adcs r3, r3, #0\n\t"
  105489. "adc r4, r4, #0\n\t"
  105490. "lsr r7, r9, #16\n\t"
  105491. "mul r6, r7, r6\n\t"
  105492. "lsr r7, r6, #16\n\t"
  105493. "lsl r6, r6, #16\n\t"
  105494. "adds r5, r5, r6\n\t"
  105495. "adcs r3, r3, r7\n\t"
  105496. "adc r4, r4, #0\n\t"
  105497. "lsr r6, r8, #16\n\t"
  105498. "lsr r7, r9, #16\n\t"
  105499. "mul r7, r6, r7\n\t"
  105500. "adds r3, r3, r7\n\t"
  105501. "adc r4, r4, #0\n\t"
  105502. "lsl r7, r9, #16\n\t"
  105503. "lsr r7, r7, #16\n\t"
  105504. "mul r6, r7, r6\n\t"
  105505. "lsr r7, r6, #16\n\t"
  105506. "lsl r6, r6, #16\n\t"
  105507. "adds r5, r5, r6\n\t"
  105508. "adcs r3, r3, r7\n\t"
  105509. "adc r4, r4, #0\n\t"
  105510. #else
  105511. "umull r6, r7, r8, r9\n\t"
  105512. "adds r5, r5, r6\n\t"
  105513. "adcs r3, r3, r7\n\t"
  105514. "adc r4, r4, #0\n\t"
  105515. #endif
  105516. /* A[15] * B[8] */
  105517. "ldr r8, [%[a], #60]\n\t"
  105518. "ldr r9, [%[b], #32]\n\t"
  105519. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  105520. "lsl r6, r8, #16\n\t"
  105521. "lsl r7, r9, #16\n\t"
  105522. "lsr r6, r6, #16\n\t"
  105523. "lsr r7, r7, #16\n\t"
  105524. "mul r7, r6, r7\n\t"
  105525. "adds r5, r5, r7\n\t"
  105526. "adcs r3, r3, #0\n\t"
  105527. "adc r4, r4, #0\n\t"
  105528. "lsr r7, r9, #16\n\t"
  105529. "mul r6, r7, r6\n\t"
  105530. "lsr r7, r6, #16\n\t"
  105531. "lsl r6, r6, #16\n\t"
  105532. "adds r5, r5, r6\n\t"
  105533. "adcs r3, r3, r7\n\t"
  105534. "adc r4, r4, #0\n\t"
  105535. "lsr r6, r8, #16\n\t"
  105536. "lsr r7, r9, #16\n\t"
  105537. "mul r7, r6, r7\n\t"
  105538. "adds r3, r3, r7\n\t"
  105539. "adc r4, r4, #0\n\t"
  105540. "lsl r7, r9, #16\n\t"
  105541. "lsr r7, r7, #16\n\t"
  105542. "mul r6, r7, r6\n\t"
  105543. "lsr r7, r6, #16\n\t"
  105544. "lsl r6, r6, #16\n\t"
  105545. "adds r5, r5, r6\n\t"
  105546. "adcs r3, r3, r7\n\t"
  105547. "adc r4, r4, #0\n\t"
  105548. #else
  105549. "umull r6, r7, r8, r9\n\t"
  105550. "adds r5, r5, r6\n\t"
  105551. "adcs r3, r3, r7\n\t"
  105552. "adc r4, r4, #0\n\t"
  105553. #endif
  105554. /* A[16] * B[7] */
  105555. "ldr r8, [%[a], #64]\n\t"
  105556. "ldr r9, [%[b], #28]\n\t"
  105557. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  105558. "lsl r6, r8, #16\n\t"
  105559. "lsl r7, r9, #16\n\t"
  105560. "lsr r6, r6, #16\n\t"
  105561. "lsr r7, r7, #16\n\t"
  105562. "mul r7, r6, r7\n\t"
  105563. "adds r5, r5, r7\n\t"
  105564. "adcs r3, r3, #0\n\t"
  105565. "adc r4, r4, #0\n\t"
  105566. "lsr r7, r9, #16\n\t"
  105567. "mul r6, r7, r6\n\t"
  105568. "lsr r7, r6, #16\n\t"
  105569. "lsl r6, r6, #16\n\t"
  105570. "adds r5, r5, r6\n\t"
  105571. "adcs r3, r3, r7\n\t"
  105572. "adc r4, r4, #0\n\t"
  105573. "lsr r6, r8, #16\n\t"
  105574. "lsr r7, r9, #16\n\t"
  105575. "mul r7, r6, r7\n\t"
  105576. "adds r3, r3, r7\n\t"
  105577. "adc r4, r4, #0\n\t"
  105578. "lsl r7, r9, #16\n\t"
  105579. "lsr r7, r7, #16\n\t"
  105580. "mul r6, r7, r6\n\t"
  105581. "lsr r7, r6, #16\n\t"
  105582. "lsl r6, r6, #16\n\t"
  105583. "adds r5, r5, r6\n\t"
  105584. "adcs r3, r3, r7\n\t"
  105585. "adc r4, r4, #0\n\t"
  105586. #else
  105587. "umull r6, r7, r8, r9\n\t"
  105588. "adds r5, r5, r6\n\t"
  105589. "adcs r3, r3, r7\n\t"
  105590. "adc r4, r4, #0\n\t"
  105591. #endif
  105592. "str r5, [%[r], #92]\n\t"
  105593. /* A[16] * B[8] */
  105594. "ldr r9, [%[b], #32]\n\t"
  105595. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  105596. "lsl r6, r8, #16\n\t"
  105597. "lsl r7, r9, #16\n\t"
  105598. "lsr r6, r6, #16\n\t"
  105599. "lsr r7, r7, #16\n\t"
  105600. "mul r7, r6, r7\n\t"
  105601. "adds r3, r3, r7\n\t"
  105602. "adcs r4, r4, #0\n\t"
  105603. "mov r5, #0\n\t"
  105604. "adc r5, r5, #0\n\t"
  105605. "lsr r7, r9, #16\n\t"
  105606. "mul r6, r7, r6\n\t"
  105607. "lsr r7, r6, #16\n\t"
  105608. "lsl r6, r6, #16\n\t"
  105609. "adds r3, r3, r6\n\t"
  105610. "adcs r4, r4, r7\n\t"
  105611. "adc r5, r5, #0\n\t"
  105612. "lsr r6, r8, #16\n\t"
  105613. "lsr r7, r9, #16\n\t"
  105614. "mul r7, r6, r7\n\t"
  105615. "adds r4, r4, r7\n\t"
  105616. "adc r5, r5, #0\n\t"
  105617. "lsl r7, r9, #16\n\t"
  105618. "lsr r7, r7, #16\n\t"
  105619. "mul r6, r7, r6\n\t"
  105620. "lsr r7, r6, #16\n\t"
  105621. "lsl r6, r6, #16\n\t"
  105622. "adds r3, r3, r6\n\t"
  105623. "adcs r4, r4, r7\n\t"
  105624. "adc r5, r5, #0\n\t"
  105625. #else
  105626. "umull r6, r7, r8, r9\n\t"
  105627. "adds r3, r3, r6\n\t"
  105628. "adcs r4, r4, r7\n\t"
  105629. "mov r5, #0\n\t"
  105630. "adc r5, r5, #0\n\t"
  105631. #endif
  105632. /* A[15] * B[9] */
  105633. "ldr r8, [%[a], #60]\n\t"
  105634. "ldr r9, [%[b], #36]\n\t"
  105635. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  105636. "lsl r6, r8, #16\n\t"
  105637. "lsl r7, r9, #16\n\t"
  105638. "lsr r6, r6, #16\n\t"
  105639. "lsr r7, r7, #16\n\t"
  105640. "mul r7, r6, r7\n\t"
  105641. "adds r3, r3, r7\n\t"
  105642. "adcs r4, r4, #0\n\t"
  105643. "adc r5, r5, #0\n\t"
  105644. "lsr r7, r9, #16\n\t"
  105645. "mul r6, r7, r6\n\t"
  105646. "lsr r7, r6, #16\n\t"
  105647. "lsl r6, r6, #16\n\t"
  105648. "adds r3, r3, r6\n\t"
  105649. "adcs r4, r4, r7\n\t"
  105650. "adc r5, r5, #0\n\t"
  105651. "lsr r6, r8, #16\n\t"
  105652. "lsr r7, r9, #16\n\t"
  105653. "mul r7, r6, r7\n\t"
  105654. "adds r4, r4, r7\n\t"
  105655. "adc r5, r5, #0\n\t"
  105656. "lsl r7, r9, #16\n\t"
  105657. "lsr r7, r7, #16\n\t"
  105658. "mul r6, r7, r6\n\t"
  105659. "lsr r7, r6, #16\n\t"
  105660. "lsl r6, r6, #16\n\t"
  105661. "adds r3, r3, r6\n\t"
  105662. "adcs r4, r4, r7\n\t"
  105663. "adc r5, r5, #0\n\t"
  105664. #else
  105665. "umull r6, r7, r8, r9\n\t"
  105666. "adds r3, r3, r6\n\t"
  105667. "adcs r4, r4, r7\n\t"
  105668. "adc r5, r5, #0\n\t"
  105669. #endif
  105670. /* A[14] * B[10] */
  105671. "ldr r8, [%[a], #56]\n\t"
  105672. "ldr r9, [%[b], #40]\n\t"
  105673. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  105674. "lsl r6, r8, #16\n\t"
  105675. "lsl r7, r9, #16\n\t"
  105676. "lsr r6, r6, #16\n\t"
  105677. "lsr r7, r7, #16\n\t"
  105678. "mul r7, r6, r7\n\t"
  105679. "adds r3, r3, r7\n\t"
  105680. "adcs r4, r4, #0\n\t"
  105681. "adc r5, r5, #0\n\t"
  105682. "lsr r7, r9, #16\n\t"
  105683. "mul r6, r7, r6\n\t"
  105684. "lsr r7, r6, #16\n\t"
  105685. "lsl r6, r6, #16\n\t"
  105686. "adds r3, r3, r6\n\t"
  105687. "adcs r4, r4, r7\n\t"
  105688. "adc r5, r5, #0\n\t"
  105689. "lsr r6, r8, #16\n\t"
  105690. "lsr r7, r9, #16\n\t"
  105691. "mul r7, r6, r7\n\t"
  105692. "adds r4, r4, r7\n\t"
  105693. "adc r5, r5, #0\n\t"
  105694. "lsl r7, r9, #16\n\t"
  105695. "lsr r7, r7, #16\n\t"
  105696. "mul r6, r7, r6\n\t"
  105697. "lsr r7, r6, #16\n\t"
  105698. "lsl r6, r6, #16\n\t"
  105699. "adds r3, r3, r6\n\t"
  105700. "adcs r4, r4, r7\n\t"
  105701. "adc r5, r5, #0\n\t"
  105702. #else
  105703. "umull r6, r7, r8, r9\n\t"
  105704. "adds r3, r3, r6\n\t"
  105705. "adcs r4, r4, r7\n\t"
  105706. "adc r5, r5, #0\n\t"
  105707. #endif
  105708. /* A[13] * B[11] */
  105709. "ldr r8, [%[a], #52]\n\t"
  105710. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  105711. "lsl r6, r8, #16\n\t"
  105712. "lsl r7, r12, #16\n\t"
  105713. "lsr r6, r6, #16\n\t"
  105714. "lsr r7, r7, #16\n\t"
  105715. "mul r7, r6, r7\n\t"
  105716. "adds r3, r3, r7\n\t"
  105717. "adcs r4, r4, #0\n\t"
  105718. "adc r5, r5, #0\n\t"
  105719. "lsr r7, r12, #16\n\t"
  105720. "mul r6, r7, r6\n\t"
  105721. "lsr r7, r6, #16\n\t"
  105722. "lsl r6, r6, #16\n\t"
  105723. "adds r3, r3, r6\n\t"
  105724. "adcs r4, r4, r7\n\t"
  105725. "adc r5, r5, #0\n\t"
  105726. "lsr r6, r8, #16\n\t"
  105727. "lsr r7, r12, #16\n\t"
  105728. "mul r7, r6, r7\n\t"
  105729. "adds r4, r4, r7\n\t"
  105730. "adc r5, r5, #0\n\t"
  105731. "lsl r7, r12, #16\n\t"
  105732. "lsr r7, r7, #16\n\t"
  105733. "mul r6, r7, r6\n\t"
  105734. "lsr r7, r6, #16\n\t"
  105735. "lsl r6, r6, #16\n\t"
  105736. "adds r3, r3, r6\n\t"
  105737. "adcs r4, r4, r7\n\t"
  105738. "adc r5, r5, #0\n\t"
  105739. #else
  105740. "umull r6, r7, r8, r12\n\t"
  105741. "adds r3, r3, r6\n\t"
  105742. "adcs r4, r4, r7\n\t"
  105743. "adc r5, r5, #0\n\t"
  105744. #endif
  105745. /* A[12] * B[12] */
  105746. "ldr r11, [%[a], #48]\n\t"
  105747. "ldr r12, [%[b], #48]\n\t"
  105748. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  105749. "lsl r6, r11, #16\n\t"
  105750. "lsl r7, r12, #16\n\t"
  105751. "lsr r6, r6, #16\n\t"
  105752. "lsr r7, r7, #16\n\t"
  105753. "mul r7, r6, r7\n\t"
  105754. "adds r3, r3, r7\n\t"
  105755. "adcs r4, r4, #0\n\t"
  105756. "adc r5, r5, #0\n\t"
  105757. "lsr r7, r12, #16\n\t"
  105758. "mul r6, r7, r6\n\t"
  105759. "lsr r7, r6, #16\n\t"
  105760. "lsl r6, r6, #16\n\t"
  105761. "adds r3, r3, r6\n\t"
  105762. "adcs r4, r4, r7\n\t"
  105763. "adc r5, r5, #0\n\t"
  105764. "lsr r6, r11, #16\n\t"
  105765. "lsr r7, r12, #16\n\t"
  105766. "mul r7, r6, r7\n\t"
  105767. "adds r4, r4, r7\n\t"
  105768. "adc r5, r5, #0\n\t"
  105769. "lsl r7, r12, #16\n\t"
  105770. "lsr r7, r7, #16\n\t"
  105771. "mul r6, r7, r6\n\t"
  105772. "lsr r7, r6, #16\n\t"
  105773. "lsl r6, r6, #16\n\t"
  105774. "adds r3, r3, r6\n\t"
  105775. "adcs r4, r4, r7\n\t"
  105776. "adc r5, r5, #0\n\t"
  105777. #else
  105778. "umull r6, r7, r11, r12\n\t"
  105779. "adds r3, r3, r6\n\t"
  105780. "adcs r4, r4, r7\n\t"
  105781. "adc r5, r5, #0\n\t"
  105782. #endif
  105783. /* A[11] * B[13] */
  105784. "ldr r8, [%[a], #44]\n\t"
  105785. "ldr r9, [%[b], #52]\n\t"
  105786. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  105787. "lsl r6, r8, #16\n\t"
  105788. "lsl r7, r9, #16\n\t"
  105789. "lsr r6, r6, #16\n\t"
  105790. "lsr r7, r7, #16\n\t"
  105791. "mul r7, r6, r7\n\t"
  105792. "adds r3, r3, r7\n\t"
  105793. "adcs r4, r4, #0\n\t"
  105794. "adc r5, r5, #0\n\t"
  105795. "lsr r7, r9, #16\n\t"
  105796. "mul r6, r7, r6\n\t"
  105797. "lsr r7, r6, #16\n\t"
  105798. "lsl r6, r6, #16\n\t"
  105799. "adds r3, r3, r6\n\t"
  105800. "adcs r4, r4, r7\n\t"
  105801. "adc r5, r5, #0\n\t"
  105802. "lsr r6, r8, #16\n\t"
  105803. "lsr r7, r9, #16\n\t"
  105804. "mul r7, r6, r7\n\t"
  105805. "adds r4, r4, r7\n\t"
  105806. "adc r5, r5, #0\n\t"
  105807. "lsl r7, r9, #16\n\t"
  105808. "lsr r7, r7, #16\n\t"
  105809. "mul r6, r7, r6\n\t"
  105810. "lsr r7, r6, #16\n\t"
  105811. "lsl r6, r6, #16\n\t"
  105812. "adds r3, r3, r6\n\t"
  105813. "adcs r4, r4, r7\n\t"
  105814. "adc r5, r5, #0\n\t"
  105815. #else
  105816. "umull r6, r7, r8, r9\n\t"
  105817. "adds r3, r3, r6\n\t"
  105818. "adcs r4, r4, r7\n\t"
  105819. "adc r5, r5, #0\n\t"
  105820. #endif
  105821. /* A[10] * B[14] */
  105822. "ldr r8, [%[a], #40]\n\t"
  105823. "ldr r9, [%[b], #56]\n\t"
  105824. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  105825. "lsl r6, r8, #16\n\t"
  105826. "lsl r7, r9, #16\n\t"
  105827. "lsr r6, r6, #16\n\t"
  105828. "lsr r7, r7, #16\n\t"
  105829. "mul r7, r6, r7\n\t"
  105830. "adds r3, r3, r7\n\t"
  105831. "adcs r4, r4, #0\n\t"
  105832. "adc r5, r5, #0\n\t"
  105833. "lsr r7, r9, #16\n\t"
  105834. "mul r6, r7, r6\n\t"
  105835. "lsr r7, r6, #16\n\t"
  105836. "lsl r6, r6, #16\n\t"
  105837. "adds r3, r3, r6\n\t"
  105838. "adcs r4, r4, r7\n\t"
  105839. "adc r5, r5, #0\n\t"
  105840. "lsr r6, r8, #16\n\t"
  105841. "lsr r7, r9, #16\n\t"
  105842. "mul r7, r6, r7\n\t"
  105843. "adds r4, r4, r7\n\t"
  105844. "adc r5, r5, #0\n\t"
  105845. "lsl r7, r9, #16\n\t"
  105846. "lsr r7, r7, #16\n\t"
  105847. "mul r6, r7, r6\n\t"
  105848. "lsr r7, r6, #16\n\t"
  105849. "lsl r6, r6, #16\n\t"
  105850. "adds r3, r3, r6\n\t"
  105851. "adcs r4, r4, r7\n\t"
  105852. "adc r5, r5, #0\n\t"
  105853. #else
  105854. "umull r6, r7, r8, r9\n\t"
  105855. "adds r3, r3, r6\n\t"
  105856. "adcs r4, r4, r7\n\t"
  105857. "adc r5, r5, #0\n\t"
  105858. #endif
  105859. /* A[9] * B[15] */
  105860. "ldr r8, [%[a], #36]\n\t"
  105861. "ldr r9, [%[b], #60]\n\t"
  105862. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  105863. "lsl r6, r8, #16\n\t"
  105864. "lsl r7, r9, #16\n\t"
  105865. "lsr r6, r6, #16\n\t"
  105866. "lsr r7, r7, #16\n\t"
  105867. "mul r7, r6, r7\n\t"
  105868. "adds r3, r3, r7\n\t"
  105869. "adcs r4, r4, #0\n\t"
  105870. "adc r5, r5, #0\n\t"
  105871. "lsr r7, r9, #16\n\t"
  105872. "mul r6, r7, r6\n\t"
  105873. "lsr r7, r6, #16\n\t"
  105874. "lsl r6, r6, #16\n\t"
  105875. "adds r3, r3, r6\n\t"
  105876. "adcs r4, r4, r7\n\t"
  105877. "adc r5, r5, #0\n\t"
  105878. "lsr r6, r8, #16\n\t"
  105879. "lsr r7, r9, #16\n\t"
  105880. "mul r7, r6, r7\n\t"
  105881. "adds r4, r4, r7\n\t"
  105882. "adc r5, r5, #0\n\t"
  105883. "lsl r7, r9, #16\n\t"
  105884. "lsr r7, r7, #16\n\t"
  105885. "mul r6, r7, r6\n\t"
  105886. "lsr r7, r6, #16\n\t"
  105887. "lsl r6, r6, #16\n\t"
  105888. "adds r3, r3, r6\n\t"
  105889. "adcs r4, r4, r7\n\t"
  105890. "adc r5, r5, #0\n\t"
  105891. #else
  105892. "umull r6, r7, r8, r9\n\t"
  105893. "adds r3, r3, r6\n\t"
  105894. "adcs r4, r4, r7\n\t"
  105895. "adc r5, r5, #0\n\t"
  105896. #endif
  105897. /* A[8] * B[16] */
  105898. "ldr r8, [%[a], #32]\n\t"
  105899. "ldr r9, [%[b], #64]\n\t"
  105900. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  105901. "lsl r6, r8, #16\n\t"
  105902. "lsl r7, r9, #16\n\t"
  105903. "lsr r6, r6, #16\n\t"
  105904. "lsr r7, r7, #16\n\t"
  105905. "mul r7, r6, r7\n\t"
  105906. "adds r3, r3, r7\n\t"
  105907. "adcs r4, r4, #0\n\t"
  105908. "adc r5, r5, #0\n\t"
  105909. "lsr r7, r9, #16\n\t"
  105910. "mul r6, r7, r6\n\t"
  105911. "lsr r7, r6, #16\n\t"
  105912. "lsl r6, r6, #16\n\t"
  105913. "adds r3, r3, r6\n\t"
  105914. "adcs r4, r4, r7\n\t"
  105915. "adc r5, r5, #0\n\t"
  105916. "lsr r6, r8, #16\n\t"
  105917. "lsr r7, r9, #16\n\t"
  105918. "mul r7, r6, r7\n\t"
  105919. "adds r4, r4, r7\n\t"
  105920. "adc r5, r5, #0\n\t"
  105921. "lsl r7, r9, #16\n\t"
  105922. "lsr r7, r7, #16\n\t"
  105923. "mul r6, r7, r6\n\t"
  105924. "lsr r7, r6, #16\n\t"
  105925. "lsl r6, r6, #16\n\t"
  105926. "adds r3, r3, r6\n\t"
  105927. "adcs r4, r4, r7\n\t"
  105928. "adc r5, r5, #0\n\t"
  105929. #else
  105930. "umull r6, r7, r8, r9\n\t"
  105931. "adds r3, r3, r6\n\t"
  105932. "adcs r4, r4, r7\n\t"
  105933. "adc r5, r5, #0\n\t"
  105934. #endif
  105935. "str r3, [%[r], #96]\n\t"
  105936. /* A[9] * B[16] */
  105937. "ldr r8, [%[a], #36]\n\t"
  105938. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  105939. "lsl r6, r8, #16\n\t"
  105940. "lsl r7, r9, #16\n\t"
  105941. "lsr r6, r6, #16\n\t"
  105942. "lsr r7, r7, #16\n\t"
  105943. "mul r7, r6, r7\n\t"
  105944. "adds r4, r4, r7\n\t"
  105945. "adcs r5, r5, #0\n\t"
  105946. "mov r3, #0\n\t"
  105947. "adc r3, r3, #0\n\t"
  105948. "lsr r7, r9, #16\n\t"
  105949. "mul r6, r7, r6\n\t"
  105950. "lsr r7, r6, #16\n\t"
  105951. "lsl r6, r6, #16\n\t"
  105952. "adds r4, r4, r6\n\t"
  105953. "adcs r5, r5, r7\n\t"
  105954. "adc r3, r3, #0\n\t"
  105955. "lsr r6, r8, #16\n\t"
  105956. "lsr r7, r9, #16\n\t"
  105957. "mul r7, r6, r7\n\t"
  105958. "adds r5, r5, r7\n\t"
  105959. "adc r3, r3, #0\n\t"
  105960. "lsl r7, r9, #16\n\t"
  105961. "lsr r7, r7, #16\n\t"
  105962. "mul r6, r7, r6\n\t"
  105963. "lsr r7, r6, #16\n\t"
  105964. "lsl r6, r6, #16\n\t"
  105965. "adds r4, r4, r6\n\t"
  105966. "adcs r5, r5, r7\n\t"
  105967. "adc r3, r3, #0\n\t"
  105968. #else
  105969. "umull r6, r7, r8, r9\n\t"
  105970. "adds r4, r4, r6\n\t"
  105971. "adcs r5, r5, r7\n\t"
  105972. "mov r3, #0\n\t"
  105973. "adc r3, r3, #0\n\t"
  105974. #endif
  105975. /* A[10] * B[15] */
  105976. "ldr r8, [%[a], #40]\n\t"
  105977. "ldr r9, [%[b], #60]\n\t"
  105978. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  105979. "lsl r6, r8, #16\n\t"
  105980. "lsl r7, r9, #16\n\t"
  105981. "lsr r6, r6, #16\n\t"
  105982. "lsr r7, r7, #16\n\t"
  105983. "mul r7, r6, r7\n\t"
  105984. "adds r4, r4, r7\n\t"
  105985. "adcs r5, r5, #0\n\t"
  105986. "adc r3, r3, #0\n\t"
  105987. "lsr r7, r9, #16\n\t"
  105988. "mul r6, r7, r6\n\t"
  105989. "lsr r7, r6, #16\n\t"
  105990. "lsl r6, r6, #16\n\t"
  105991. "adds r4, r4, r6\n\t"
  105992. "adcs r5, r5, r7\n\t"
  105993. "adc r3, r3, #0\n\t"
  105994. "lsr r6, r8, #16\n\t"
  105995. "lsr r7, r9, #16\n\t"
  105996. "mul r7, r6, r7\n\t"
  105997. "adds r5, r5, r7\n\t"
  105998. "adc r3, r3, #0\n\t"
  105999. "lsl r7, r9, #16\n\t"
  106000. "lsr r7, r7, #16\n\t"
  106001. "mul r6, r7, r6\n\t"
  106002. "lsr r7, r6, #16\n\t"
  106003. "lsl r6, r6, #16\n\t"
  106004. "adds r4, r4, r6\n\t"
  106005. "adcs r5, r5, r7\n\t"
  106006. "adc r3, r3, #0\n\t"
  106007. #else
  106008. "umull r6, r7, r8, r9\n\t"
  106009. "adds r4, r4, r6\n\t"
  106010. "adcs r5, r5, r7\n\t"
  106011. "adc r3, r3, #0\n\t"
  106012. #endif
  106013. /* A[11] * B[14] */
  106014. "ldr r8, [%[a], #44]\n\t"
  106015. "ldr r9, [%[b], #56]\n\t"
  106016. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  106017. "lsl r6, r8, #16\n\t"
  106018. "lsl r7, r9, #16\n\t"
  106019. "lsr r6, r6, #16\n\t"
  106020. "lsr r7, r7, #16\n\t"
  106021. "mul r7, r6, r7\n\t"
  106022. "adds r4, r4, r7\n\t"
  106023. "adcs r5, r5, #0\n\t"
  106024. "adc r3, r3, #0\n\t"
  106025. "lsr r7, r9, #16\n\t"
  106026. "mul r6, r7, r6\n\t"
  106027. "lsr r7, r6, #16\n\t"
  106028. "lsl r6, r6, #16\n\t"
  106029. "adds r4, r4, r6\n\t"
  106030. "adcs r5, r5, r7\n\t"
  106031. "adc r3, r3, #0\n\t"
  106032. "lsr r6, r8, #16\n\t"
  106033. "lsr r7, r9, #16\n\t"
  106034. "mul r7, r6, r7\n\t"
  106035. "adds r5, r5, r7\n\t"
  106036. "adc r3, r3, #0\n\t"
  106037. "lsl r7, r9, #16\n\t"
  106038. "lsr r7, r7, #16\n\t"
  106039. "mul r6, r7, r6\n\t"
  106040. "lsr r7, r6, #16\n\t"
  106041. "lsl r6, r6, #16\n\t"
  106042. "adds r4, r4, r6\n\t"
  106043. "adcs r5, r5, r7\n\t"
  106044. "adc r3, r3, #0\n\t"
  106045. #else
  106046. "umull r6, r7, r8, r9\n\t"
  106047. "adds r4, r4, r6\n\t"
  106048. "adcs r5, r5, r7\n\t"
  106049. "adc r3, r3, #0\n\t"
  106050. #endif
  106051. /* A[12] * B[13] */
  106052. "ldr r9, [%[b], #52]\n\t"
  106053. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  106054. "lsl r6, r11, #16\n\t"
  106055. "lsl r7, r9, #16\n\t"
  106056. "lsr r6, r6, #16\n\t"
  106057. "lsr r7, r7, #16\n\t"
  106058. "mul r7, r6, r7\n\t"
  106059. "adds r4, r4, r7\n\t"
  106060. "adcs r5, r5, #0\n\t"
  106061. "adc r3, r3, #0\n\t"
  106062. "lsr r7, r9, #16\n\t"
  106063. "mul r6, r7, r6\n\t"
  106064. "lsr r7, r6, #16\n\t"
  106065. "lsl r6, r6, #16\n\t"
  106066. "adds r4, r4, r6\n\t"
  106067. "adcs r5, r5, r7\n\t"
  106068. "adc r3, r3, #0\n\t"
  106069. "lsr r6, r11, #16\n\t"
  106070. "lsr r7, r9, #16\n\t"
  106071. "mul r7, r6, r7\n\t"
  106072. "adds r5, r5, r7\n\t"
  106073. "adc r3, r3, #0\n\t"
  106074. "lsl r7, r9, #16\n\t"
  106075. "lsr r7, r7, #16\n\t"
  106076. "mul r6, r7, r6\n\t"
  106077. "lsr r7, r6, #16\n\t"
  106078. "lsl r6, r6, #16\n\t"
  106079. "adds r4, r4, r6\n\t"
  106080. "adcs r5, r5, r7\n\t"
  106081. "adc r3, r3, #0\n\t"
  106082. #else
  106083. "umull r6, r7, r11, r9\n\t"
  106084. "adds r4, r4, r6\n\t"
  106085. "adcs r5, r5, r7\n\t"
  106086. "adc r3, r3, #0\n\t"
  106087. #endif
  106088. /* A[13] * B[12] */
  106089. "ldr r8, [%[a], #52]\n\t"
  106090. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  106091. "lsl r6, r8, #16\n\t"
  106092. "lsl r7, r12, #16\n\t"
  106093. "lsr r6, r6, #16\n\t"
  106094. "lsr r7, r7, #16\n\t"
  106095. "mul r7, r6, r7\n\t"
  106096. "adds r4, r4, r7\n\t"
  106097. "adcs r5, r5, #0\n\t"
  106098. "adc r3, r3, #0\n\t"
  106099. "lsr r7, r12, #16\n\t"
  106100. "mul r6, r7, r6\n\t"
  106101. "lsr r7, r6, #16\n\t"
  106102. "lsl r6, r6, #16\n\t"
  106103. "adds r4, r4, r6\n\t"
  106104. "adcs r5, r5, r7\n\t"
  106105. "adc r3, r3, #0\n\t"
  106106. "lsr r6, r8, #16\n\t"
  106107. "lsr r7, r12, #16\n\t"
  106108. "mul r7, r6, r7\n\t"
  106109. "adds r5, r5, r7\n\t"
  106110. "adc r3, r3, #0\n\t"
  106111. "lsl r7, r12, #16\n\t"
  106112. "lsr r7, r7, #16\n\t"
  106113. "mul r6, r7, r6\n\t"
  106114. "lsr r7, r6, #16\n\t"
  106115. "lsl r6, r6, #16\n\t"
  106116. "adds r4, r4, r6\n\t"
  106117. "adcs r5, r5, r7\n\t"
  106118. "adc r3, r3, #0\n\t"
  106119. #else
  106120. "umull r6, r7, r8, r12\n\t"
  106121. "adds r4, r4, r6\n\t"
  106122. "adcs r5, r5, r7\n\t"
  106123. "adc r3, r3, #0\n\t"
  106124. #endif
  106125. /* A[14] * B[11] */
  106126. "ldr r8, [%[a], #56]\n\t"
  106127. "ldr r9, [%[b], #44]\n\t"
  106128. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  106129. "lsl r6, r8, #16\n\t"
  106130. "lsl r7, r9, #16\n\t"
  106131. "lsr r6, r6, #16\n\t"
  106132. "lsr r7, r7, #16\n\t"
  106133. "mul r7, r6, r7\n\t"
  106134. "adds r4, r4, r7\n\t"
  106135. "adcs r5, r5, #0\n\t"
  106136. "adc r3, r3, #0\n\t"
  106137. "lsr r7, r9, #16\n\t"
  106138. "mul r6, r7, r6\n\t"
  106139. "lsr r7, r6, #16\n\t"
  106140. "lsl r6, r6, #16\n\t"
  106141. "adds r4, r4, r6\n\t"
  106142. "adcs r5, r5, r7\n\t"
  106143. "adc r3, r3, #0\n\t"
  106144. "lsr r6, r8, #16\n\t"
  106145. "lsr r7, r9, #16\n\t"
  106146. "mul r7, r6, r7\n\t"
  106147. "adds r5, r5, r7\n\t"
  106148. "adc r3, r3, #0\n\t"
  106149. "lsl r7, r9, #16\n\t"
  106150. "lsr r7, r7, #16\n\t"
  106151. "mul r6, r7, r6\n\t"
  106152. "lsr r7, r6, #16\n\t"
  106153. "lsl r6, r6, #16\n\t"
  106154. "adds r4, r4, r6\n\t"
  106155. "adcs r5, r5, r7\n\t"
  106156. "adc r3, r3, #0\n\t"
  106157. #else
  106158. "umull r6, r7, r8, r9\n\t"
  106159. "adds r4, r4, r6\n\t"
  106160. "adcs r5, r5, r7\n\t"
  106161. "adc r3, r3, #0\n\t"
  106162. #endif
  106163. /* A[15] * B[10] */
  106164. "ldr r8, [%[a], #60]\n\t"
  106165. "ldr r9, [%[b], #40]\n\t"
  106166. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  106167. "lsl r6, r8, #16\n\t"
  106168. "lsl r7, r9, #16\n\t"
  106169. "lsr r6, r6, #16\n\t"
  106170. "lsr r7, r7, #16\n\t"
  106171. "mul r7, r6, r7\n\t"
  106172. "adds r4, r4, r7\n\t"
  106173. "adcs r5, r5, #0\n\t"
  106174. "adc r3, r3, #0\n\t"
  106175. "lsr r7, r9, #16\n\t"
  106176. "mul r6, r7, r6\n\t"
  106177. "lsr r7, r6, #16\n\t"
  106178. "lsl r6, r6, #16\n\t"
  106179. "adds r4, r4, r6\n\t"
  106180. "adcs r5, r5, r7\n\t"
  106181. "adc r3, r3, #0\n\t"
  106182. "lsr r6, r8, #16\n\t"
  106183. "lsr r7, r9, #16\n\t"
  106184. "mul r7, r6, r7\n\t"
  106185. "adds r5, r5, r7\n\t"
  106186. "adc r3, r3, #0\n\t"
  106187. "lsl r7, r9, #16\n\t"
  106188. "lsr r7, r7, #16\n\t"
  106189. "mul r6, r7, r6\n\t"
  106190. "lsr r7, r6, #16\n\t"
  106191. "lsl r6, r6, #16\n\t"
  106192. "adds r4, r4, r6\n\t"
  106193. "adcs r5, r5, r7\n\t"
  106194. "adc r3, r3, #0\n\t"
  106195. #else
  106196. "umull r6, r7, r8, r9\n\t"
  106197. "adds r4, r4, r6\n\t"
  106198. "adcs r5, r5, r7\n\t"
  106199. "adc r3, r3, #0\n\t"
  106200. #endif
  106201. /* A[16] * B[9] */
  106202. "ldr r8, [%[a], #64]\n\t"
  106203. "ldr r9, [%[b], #36]\n\t"
  106204. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  106205. "lsl r6, r8, #16\n\t"
  106206. "lsl r7, r9, #16\n\t"
  106207. "lsr r6, r6, #16\n\t"
  106208. "lsr r7, r7, #16\n\t"
  106209. "mul r7, r6, r7\n\t"
  106210. "adds r4, r4, r7\n\t"
  106211. "adcs r5, r5, #0\n\t"
  106212. "adc r3, r3, #0\n\t"
  106213. "lsr r7, r9, #16\n\t"
  106214. "mul r6, r7, r6\n\t"
  106215. "lsr r7, r6, #16\n\t"
  106216. "lsl r6, r6, #16\n\t"
  106217. "adds r4, r4, r6\n\t"
  106218. "adcs r5, r5, r7\n\t"
  106219. "adc r3, r3, #0\n\t"
  106220. "lsr r6, r8, #16\n\t"
  106221. "lsr r7, r9, #16\n\t"
  106222. "mul r7, r6, r7\n\t"
  106223. "adds r5, r5, r7\n\t"
  106224. "adc r3, r3, #0\n\t"
  106225. "lsl r7, r9, #16\n\t"
  106226. "lsr r7, r7, #16\n\t"
  106227. "mul r6, r7, r6\n\t"
  106228. "lsr r7, r6, #16\n\t"
  106229. "lsl r6, r6, #16\n\t"
  106230. "adds r4, r4, r6\n\t"
  106231. "adcs r5, r5, r7\n\t"
  106232. "adc r3, r3, #0\n\t"
  106233. #else
  106234. "umull r6, r7, r8, r9\n\t"
  106235. "adds r4, r4, r6\n\t"
  106236. "adcs r5, r5, r7\n\t"
  106237. "adc r3, r3, #0\n\t"
  106238. #endif
  106239. "str r4, [%[r], #100]\n\t"
  106240. /* A[16] * B[10] */
  106241. "ldr r9, [%[b], #40]\n\t"
  106242. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  106243. "lsl r6, r8, #16\n\t"
  106244. "lsl r7, r9, #16\n\t"
  106245. "lsr r6, r6, #16\n\t"
  106246. "lsr r7, r7, #16\n\t"
  106247. "mul r7, r6, r7\n\t"
  106248. "adds r5, r5, r7\n\t"
  106249. "adcs r3, r3, #0\n\t"
  106250. "mov r4, #0\n\t"
  106251. "adc r4, r4, #0\n\t"
  106252. "lsr r7, r9, #16\n\t"
  106253. "mul r6, r7, r6\n\t"
  106254. "lsr r7, r6, #16\n\t"
  106255. "lsl r6, r6, #16\n\t"
  106256. "adds r5, r5, r6\n\t"
  106257. "adcs r3, r3, r7\n\t"
  106258. "adc r4, r4, #0\n\t"
  106259. "lsr r6, r8, #16\n\t"
  106260. "lsr r7, r9, #16\n\t"
  106261. "mul r7, r6, r7\n\t"
  106262. "adds r3, r3, r7\n\t"
  106263. "adc r4, r4, #0\n\t"
  106264. "lsl r7, r9, #16\n\t"
  106265. "lsr r7, r7, #16\n\t"
  106266. "mul r6, r7, r6\n\t"
  106267. "lsr r7, r6, #16\n\t"
  106268. "lsl r6, r6, #16\n\t"
  106269. "adds r5, r5, r6\n\t"
  106270. "adcs r3, r3, r7\n\t"
  106271. "adc r4, r4, #0\n\t"
  106272. #else
  106273. "umull r6, r7, r8, r9\n\t"
  106274. "adds r5, r5, r6\n\t"
  106275. "adcs r3, r3, r7\n\t"
  106276. "mov r4, #0\n\t"
  106277. "adc r4, r4, #0\n\t"
  106278. #endif
  106279. /* A[15] * B[11] */
  106280. "ldr r8, [%[a], #60]\n\t"
  106281. "ldr r9, [%[b], #44]\n\t"
  106282. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  106283. "lsl r6, r8, #16\n\t"
  106284. "lsl r7, r9, #16\n\t"
  106285. "lsr r6, r6, #16\n\t"
  106286. "lsr r7, r7, #16\n\t"
  106287. "mul r7, r6, r7\n\t"
  106288. "adds r5, r5, r7\n\t"
  106289. "adcs r3, r3, #0\n\t"
  106290. "adc r4, r4, #0\n\t"
  106291. "lsr r7, r9, #16\n\t"
  106292. "mul r6, r7, r6\n\t"
  106293. "lsr r7, r6, #16\n\t"
  106294. "lsl r6, r6, #16\n\t"
  106295. "adds r5, r5, r6\n\t"
  106296. "adcs r3, r3, r7\n\t"
  106297. "adc r4, r4, #0\n\t"
  106298. "lsr r6, r8, #16\n\t"
  106299. "lsr r7, r9, #16\n\t"
  106300. "mul r7, r6, r7\n\t"
  106301. "adds r3, r3, r7\n\t"
  106302. "adc r4, r4, #0\n\t"
  106303. "lsl r7, r9, #16\n\t"
  106304. "lsr r7, r7, #16\n\t"
  106305. "mul r6, r7, r6\n\t"
  106306. "lsr r7, r6, #16\n\t"
  106307. "lsl r6, r6, #16\n\t"
  106308. "adds r5, r5, r6\n\t"
  106309. "adcs r3, r3, r7\n\t"
  106310. "adc r4, r4, #0\n\t"
  106311. #else
  106312. "umull r6, r7, r8, r9\n\t"
  106313. "adds r5, r5, r6\n\t"
  106314. "adcs r3, r3, r7\n\t"
  106315. "adc r4, r4, #0\n\t"
  106316. #endif
  106317. /* A[14] * B[12] */
  106318. "ldr r8, [%[a], #56]\n\t"
  106319. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  106320. "lsl r6, r8, #16\n\t"
  106321. "lsl r7, r12, #16\n\t"
  106322. "lsr r6, r6, #16\n\t"
  106323. "lsr r7, r7, #16\n\t"
  106324. "mul r7, r6, r7\n\t"
  106325. "adds r5, r5, r7\n\t"
  106326. "adcs r3, r3, #0\n\t"
  106327. "adc r4, r4, #0\n\t"
  106328. "lsr r7, r12, #16\n\t"
  106329. "mul r6, r7, r6\n\t"
  106330. "lsr r7, r6, #16\n\t"
  106331. "lsl r6, r6, #16\n\t"
  106332. "adds r5, r5, r6\n\t"
  106333. "adcs r3, r3, r7\n\t"
  106334. "adc r4, r4, #0\n\t"
  106335. "lsr r6, r8, #16\n\t"
  106336. "lsr r7, r12, #16\n\t"
  106337. "mul r7, r6, r7\n\t"
  106338. "adds r3, r3, r7\n\t"
  106339. "adc r4, r4, #0\n\t"
  106340. "lsl r7, r12, #16\n\t"
  106341. "lsr r7, r7, #16\n\t"
  106342. "mul r6, r7, r6\n\t"
  106343. "lsr r7, r6, #16\n\t"
  106344. "lsl r6, r6, #16\n\t"
  106345. "adds r5, r5, r6\n\t"
  106346. "adcs r3, r3, r7\n\t"
  106347. "adc r4, r4, #0\n\t"
  106348. #else
  106349. "umull r6, r7, r8, r12\n\t"
  106350. "adds r5, r5, r6\n\t"
  106351. "adcs r3, r3, r7\n\t"
  106352. "adc r4, r4, #0\n\t"
  106353. #endif
  106354. /* A[13] * B[13] */
  106355. "ldr r11, [%[a], #52]\n\t"
  106356. "ldr r12, [%[b], #52]\n\t"
  106357. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  106358. "lsl r6, r11, #16\n\t"
  106359. "lsl r7, r12, #16\n\t"
  106360. "lsr r6, r6, #16\n\t"
  106361. "lsr r7, r7, #16\n\t"
  106362. "mul r7, r6, r7\n\t"
  106363. "adds r5, r5, r7\n\t"
  106364. "adcs r3, r3, #0\n\t"
  106365. "adc r4, r4, #0\n\t"
  106366. "lsr r7, r12, #16\n\t"
  106367. "mul r6, r7, r6\n\t"
  106368. "lsr r7, r6, #16\n\t"
  106369. "lsl r6, r6, #16\n\t"
  106370. "adds r5, r5, r6\n\t"
  106371. "adcs r3, r3, r7\n\t"
  106372. "adc r4, r4, #0\n\t"
  106373. "lsr r6, r11, #16\n\t"
  106374. "lsr r7, r12, #16\n\t"
  106375. "mul r7, r6, r7\n\t"
  106376. "adds r3, r3, r7\n\t"
  106377. "adc r4, r4, #0\n\t"
  106378. "lsl r7, r12, #16\n\t"
  106379. "lsr r7, r7, #16\n\t"
  106380. "mul r6, r7, r6\n\t"
  106381. "lsr r7, r6, #16\n\t"
  106382. "lsl r6, r6, #16\n\t"
  106383. "adds r5, r5, r6\n\t"
  106384. "adcs r3, r3, r7\n\t"
  106385. "adc r4, r4, #0\n\t"
  106386. #else
  106387. "umull r6, r7, r11, r12\n\t"
  106388. "adds r5, r5, r6\n\t"
  106389. "adcs r3, r3, r7\n\t"
  106390. "adc r4, r4, #0\n\t"
  106391. #endif
  106392. /* A[12] * B[14] */
  106393. "ldr r8, [%[a], #48]\n\t"
  106394. "ldr r9, [%[b], #56]\n\t"
  106395. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  106396. "lsl r6, r8, #16\n\t"
  106397. "lsl r7, r9, #16\n\t"
  106398. "lsr r6, r6, #16\n\t"
  106399. "lsr r7, r7, #16\n\t"
  106400. "mul r7, r6, r7\n\t"
  106401. "adds r5, r5, r7\n\t"
  106402. "adcs r3, r3, #0\n\t"
  106403. "adc r4, r4, #0\n\t"
  106404. "lsr r7, r9, #16\n\t"
  106405. "mul r6, r7, r6\n\t"
  106406. "lsr r7, r6, #16\n\t"
  106407. "lsl r6, r6, #16\n\t"
  106408. "adds r5, r5, r6\n\t"
  106409. "adcs r3, r3, r7\n\t"
  106410. "adc r4, r4, #0\n\t"
  106411. "lsr r6, r8, #16\n\t"
  106412. "lsr r7, r9, #16\n\t"
  106413. "mul r7, r6, r7\n\t"
  106414. "adds r3, r3, r7\n\t"
  106415. "adc r4, r4, #0\n\t"
  106416. "lsl r7, r9, #16\n\t"
  106417. "lsr r7, r7, #16\n\t"
  106418. "mul r6, r7, r6\n\t"
  106419. "lsr r7, r6, #16\n\t"
  106420. "lsl r6, r6, #16\n\t"
  106421. "adds r5, r5, r6\n\t"
  106422. "adcs r3, r3, r7\n\t"
  106423. "adc r4, r4, #0\n\t"
  106424. #else
  106425. "umull r6, r7, r8, r9\n\t"
  106426. "adds r5, r5, r6\n\t"
  106427. "adcs r3, r3, r7\n\t"
  106428. "adc r4, r4, #0\n\t"
  106429. #endif
  106430. /* A[11] * B[15] */
  106431. "ldr r8, [%[a], #44]\n\t"
  106432. "ldr r9, [%[b], #60]\n\t"
  106433. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  106434. "lsl r6, r8, #16\n\t"
  106435. "lsl r7, r9, #16\n\t"
  106436. "lsr r6, r6, #16\n\t"
  106437. "lsr r7, r7, #16\n\t"
  106438. "mul r7, r6, r7\n\t"
  106439. "adds r5, r5, r7\n\t"
  106440. "adcs r3, r3, #0\n\t"
  106441. "adc r4, r4, #0\n\t"
  106442. "lsr r7, r9, #16\n\t"
  106443. "mul r6, r7, r6\n\t"
  106444. "lsr r7, r6, #16\n\t"
  106445. "lsl r6, r6, #16\n\t"
  106446. "adds r5, r5, r6\n\t"
  106447. "adcs r3, r3, r7\n\t"
  106448. "adc r4, r4, #0\n\t"
  106449. "lsr r6, r8, #16\n\t"
  106450. "lsr r7, r9, #16\n\t"
  106451. "mul r7, r6, r7\n\t"
  106452. "adds r3, r3, r7\n\t"
  106453. "adc r4, r4, #0\n\t"
  106454. "lsl r7, r9, #16\n\t"
  106455. "lsr r7, r7, #16\n\t"
  106456. "mul r6, r7, r6\n\t"
  106457. "lsr r7, r6, #16\n\t"
  106458. "lsl r6, r6, #16\n\t"
  106459. "adds r5, r5, r6\n\t"
  106460. "adcs r3, r3, r7\n\t"
  106461. "adc r4, r4, #0\n\t"
  106462. #else
  106463. "umull r6, r7, r8, r9\n\t"
  106464. "adds r5, r5, r6\n\t"
  106465. "adcs r3, r3, r7\n\t"
  106466. "adc r4, r4, #0\n\t"
  106467. #endif
  106468. /* A[10] * B[16] */
  106469. "ldr r8, [%[a], #40]\n\t"
  106470. "ldr r9, [%[b], #64]\n\t"
  106471. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  106472. "lsl r6, r8, #16\n\t"
  106473. "lsl r7, r9, #16\n\t"
  106474. "lsr r6, r6, #16\n\t"
  106475. "lsr r7, r7, #16\n\t"
  106476. "mul r7, r6, r7\n\t"
  106477. "adds r5, r5, r7\n\t"
  106478. "adcs r3, r3, #0\n\t"
  106479. "adc r4, r4, #0\n\t"
  106480. "lsr r7, r9, #16\n\t"
  106481. "mul r6, r7, r6\n\t"
  106482. "lsr r7, r6, #16\n\t"
  106483. "lsl r6, r6, #16\n\t"
  106484. "adds r5, r5, r6\n\t"
  106485. "adcs r3, r3, r7\n\t"
  106486. "adc r4, r4, #0\n\t"
  106487. "lsr r6, r8, #16\n\t"
  106488. "lsr r7, r9, #16\n\t"
  106489. "mul r7, r6, r7\n\t"
  106490. "adds r3, r3, r7\n\t"
  106491. "adc r4, r4, #0\n\t"
  106492. "lsl r7, r9, #16\n\t"
  106493. "lsr r7, r7, #16\n\t"
  106494. "mul r6, r7, r6\n\t"
  106495. "lsr r7, r6, #16\n\t"
  106496. "lsl r6, r6, #16\n\t"
  106497. "adds r5, r5, r6\n\t"
  106498. "adcs r3, r3, r7\n\t"
  106499. "adc r4, r4, #0\n\t"
  106500. #else
  106501. "umull r6, r7, r8, r9\n\t"
  106502. "adds r5, r5, r6\n\t"
  106503. "adcs r3, r3, r7\n\t"
  106504. "adc r4, r4, #0\n\t"
  106505. #endif
  106506. "str r5, [%[r], #104]\n\t"
  106507. /* A[11] * B[16] */
  106508. "ldr r8, [%[a], #44]\n\t"
  106509. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  106510. "lsl r6, r8, #16\n\t"
  106511. "lsl r7, r9, #16\n\t"
  106512. "lsr r6, r6, #16\n\t"
  106513. "lsr r7, r7, #16\n\t"
  106514. "mul r7, r6, r7\n\t"
  106515. "adds r3, r3, r7\n\t"
  106516. "adcs r4, r4, #0\n\t"
  106517. "mov r5, #0\n\t"
  106518. "adc r5, r5, #0\n\t"
  106519. "lsr r7, r9, #16\n\t"
  106520. "mul r6, r7, r6\n\t"
  106521. "lsr r7, r6, #16\n\t"
  106522. "lsl r6, r6, #16\n\t"
  106523. "adds r3, r3, r6\n\t"
  106524. "adcs r4, r4, r7\n\t"
  106525. "adc r5, r5, #0\n\t"
  106526. "lsr r6, r8, #16\n\t"
  106527. "lsr r7, r9, #16\n\t"
  106528. "mul r7, r6, r7\n\t"
  106529. "adds r4, r4, r7\n\t"
  106530. "adc r5, r5, #0\n\t"
  106531. "lsl r7, r9, #16\n\t"
  106532. "lsr r7, r7, #16\n\t"
  106533. "mul r6, r7, r6\n\t"
  106534. "lsr r7, r6, #16\n\t"
  106535. "lsl r6, r6, #16\n\t"
  106536. "adds r3, r3, r6\n\t"
  106537. "adcs r4, r4, r7\n\t"
  106538. "adc r5, r5, #0\n\t"
  106539. #else
  106540. "umull r6, r7, r8, r9\n\t"
  106541. "adds r3, r3, r6\n\t"
  106542. "adcs r4, r4, r7\n\t"
  106543. "mov r5, #0\n\t"
  106544. "adc r5, r5, #0\n\t"
  106545. #endif
  106546. /* A[12] * B[15] */
  106547. "ldr r8, [%[a], #48]\n\t"
  106548. "ldr r9, [%[b], #60]\n\t"
  106549. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  106550. "lsl r6, r8, #16\n\t"
  106551. "lsl r7, r9, #16\n\t"
  106552. "lsr r6, r6, #16\n\t"
  106553. "lsr r7, r7, #16\n\t"
  106554. "mul r7, r6, r7\n\t"
  106555. "adds r3, r3, r7\n\t"
  106556. "adcs r4, r4, #0\n\t"
  106557. "adc r5, r5, #0\n\t"
  106558. "lsr r7, r9, #16\n\t"
  106559. "mul r6, r7, r6\n\t"
  106560. "lsr r7, r6, #16\n\t"
  106561. "lsl r6, r6, #16\n\t"
  106562. "adds r3, r3, r6\n\t"
  106563. "adcs r4, r4, r7\n\t"
  106564. "adc r5, r5, #0\n\t"
  106565. "lsr r6, r8, #16\n\t"
  106566. "lsr r7, r9, #16\n\t"
  106567. "mul r7, r6, r7\n\t"
  106568. "adds r4, r4, r7\n\t"
  106569. "adc r5, r5, #0\n\t"
  106570. "lsl r7, r9, #16\n\t"
  106571. "lsr r7, r7, #16\n\t"
  106572. "mul r6, r7, r6\n\t"
  106573. "lsr r7, r6, #16\n\t"
  106574. "lsl r6, r6, #16\n\t"
  106575. "adds r3, r3, r6\n\t"
  106576. "adcs r4, r4, r7\n\t"
  106577. "adc r5, r5, #0\n\t"
  106578. #else
  106579. "umull r6, r7, r8, r9\n\t"
  106580. "adds r3, r3, r6\n\t"
  106581. "adcs r4, r4, r7\n\t"
  106582. "adc r5, r5, #0\n\t"
  106583. #endif
  106584. /* A[13] * B[14] */
  106585. "ldr r9, [%[b], #56]\n\t"
  106586. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  106587. "lsl r6, r11, #16\n\t"
  106588. "lsl r7, r9, #16\n\t"
  106589. "lsr r6, r6, #16\n\t"
  106590. "lsr r7, r7, #16\n\t"
  106591. "mul r7, r6, r7\n\t"
  106592. "adds r3, r3, r7\n\t"
  106593. "adcs r4, r4, #0\n\t"
  106594. "adc r5, r5, #0\n\t"
  106595. "lsr r7, r9, #16\n\t"
  106596. "mul r6, r7, r6\n\t"
  106597. "lsr r7, r6, #16\n\t"
  106598. "lsl r6, r6, #16\n\t"
  106599. "adds r3, r3, r6\n\t"
  106600. "adcs r4, r4, r7\n\t"
  106601. "adc r5, r5, #0\n\t"
  106602. "lsr r6, r11, #16\n\t"
  106603. "lsr r7, r9, #16\n\t"
  106604. "mul r7, r6, r7\n\t"
  106605. "adds r4, r4, r7\n\t"
  106606. "adc r5, r5, #0\n\t"
  106607. "lsl r7, r9, #16\n\t"
  106608. "lsr r7, r7, #16\n\t"
  106609. "mul r6, r7, r6\n\t"
  106610. "lsr r7, r6, #16\n\t"
  106611. "lsl r6, r6, #16\n\t"
  106612. "adds r3, r3, r6\n\t"
  106613. "adcs r4, r4, r7\n\t"
  106614. "adc r5, r5, #0\n\t"
  106615. #else
  106616. "umull r6, r7, r11, r9\n\t"
  106617. "adds r3, r3, r6\n\t"
  106618. "adcs r4, r4, r7\n\t"
  106619. "adc r5, r5, #0\n\t"
  106620. #endif
  106621. /* A[14] * B[13] */
  106622. "ldr r8, [%[a], #56]\n\t"
  106623. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  106624. "lsl r6, r8, #16\n\t"
  106625. "lsl r7, r12, #16\n\t"
  106626. "lsr r6, r6, #16\n\t"
  106627. "lsr r7, r7, #16\n\t"
  106628. "mul r7, r6, r7\n\t"
  106629. "adds r3, r3, r7\n\t"
  106630. "adcs r4, r4, #0\n\t"
  106631. "adc r5, r5, #0\n\t"
  106632. "lsr r7, r12, #16\n\t"
  106633. "mul r6, r7, r6\n\t"
  106634. "lsr r7, r6, #16\n\t"
  106635. "lsl r6, r6, #16\n\t"
  106636. "adds r3, r3, r6\n\t"
  106637. "adcs r4, r4, r7\n\t"
  106638. "adc r5, r5, #0\n\t"
  106639. "lsr r6, r8, #16\n\t"
  106640. "lsr r7, r12, #16\n\t"
  106641. "mul r7, r6, r7\n\t"
  106642. "adds r4, r4, r7\n\t"
  106643. "adc r5, r5, #0\n\t"
  106644. "lsl r7, r12, #16\n\t"
  106645. "lsr r7, r7, #16\n\t"
  106646. "mul r6, r7, r6\n\t"
  106647. "lsr r7, r6, #16\n\t"
  106648. "lsl r6, r6, #16\n\t"
  106649. "adds r3, r3, r6\n\t"
  106650. "adcs r4, r4, r7\n\t"
  106651. "adc r5, r5, #0\n\t"
  106652. #else
  106653. "umull r6, r7, r8, r12\n\t"
  106654. "adds r3, r3, r6\n\t"
  106655. "adcs r4, r4, r7\n\t"
  106656. "adc r5, r5, #0\n\t"
  106657. #endif
  106658. /* A[15] * B[12] */
  106659. "ldr r8, [%[a], #60]\n\t"
  106660. "ldr r9, [%[b], #48]\n\t"
  106661. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  106662. "lsl r6, r8, #16\n\t"
  106663. "lsl r7, r9, #16\n\t"
  106664. "lsr r6, r6, #16\n\t"
  106665. "lsr r7, r7, #16\n\t"
  106666. "mul r7, r6, r7\n\t"
  106667. "adds r3, r3, r7\n\t"
  106668. "adcs r4, r4, #0\n\t"
  106669. "adc r5, r5, #0\n\t"
  106670. "lsr r7, r9, #16\n\t"
  106671. "mul r6, r7, r6\n\t"
  106672. "lsr r7, r6, #16\n\t"
  106673. "lsl r6, r6, #16\n\t"
  106674. "adds r3, r3, r6\n\t"
  106675. "adcs r4, r4, r7\n\t"
  106676. "adc r5, r5, #0\n\t"
  106677. "lsr r6, r8, #16\n\t"
  106678. "lsr r7, r9, #16\n\t"
  106679. "mul r7, r6, r7\n\t"
  106680. "adds r4, r4, r7\n\t"
  106681. "adc r5, r5, #0\n\t"
  106682. "lsl r7, r9, #16\n\t"
  106683. "lsr r7, r7, #16\n\t"
  106684. "mul r6, r7, r6\n\t"
  106685. "lsr r7, r6, #16\n\t"
  106686. "lsl r6, r6, #16\n\t"
  106687. "adds r3, r3, r6\n\t"
  106688. "adcs r4, r4, r7\n\t"
  106689. "adc r5, r5, #0\n\t"
  106690. #else
  106691. "umull r6, r7, r8, r9\n\t"
  106692. "adds r3, r3, r6\n\t"
  106693. "adcs r4, r4, r7\n\t"
  106694. "adc r5, r5, #0\n\t"
  106695. #endif
  106696. /* A[16] * B[11] */
  106697. "ldr r8, [%[a], #64]\n\t"
  106698. "ldr r9, [%[b], #44]\n\t"
  106699. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  106700. "lsl r6, r8, #16\n\t"
  106701. "lsl r7, r9, #16\n\t"
  106702. "lsr r6, r6, #16\n\t"
  106703. "lsr r7, r7, #16\n\t"
  106704. "mul r7, r6, r7\n\t"
  106705. "adds r3, r3, r7\n\t"
  106706. "adcs r4, r4, #0\n\t"
  106707. "adc r5, r5, #0\n\t"
  106708. "lsr r7, r9, #16\n\t"
  106709. "mul r6, r7, r6\n\t"
  106710. "lsr r7, r6, #16\n\t"
  106711. "lsl r6, r6, #16\n\t"
  106712. "adds r3, r3, r6\n\t"
  106713. "adcs r4, r4, r7\n\t"
  106714. "adc r5, r5, #0\n\t"
  106715. "lsr r6, r8, #16\n\t"
  106716. "lsr r7, r9, #16\n\t"
  106717. "mul r7, r6, r7\n\t"
  106718. "adds r4, r4, r7\n\t"
  106719. "adc r5, r5, #0\n\t"
  106720. "lsl r7, r9, #16\n\t"
  106721. "lsr r7, r7, #16\n\t"
  106722. "mul r6, r7, r6\n\t"
  106723. "lsr r7, r6, #16\n\t"
  106724. "lsl r6, r6, #16\n\t"
  106725. "adds r3, r3, r6\n\t"
  106726. "adcs r4, r4, r7\n\t"
  106727. "adc r5, r5, #0\n\t"
  106728. #else
  106729. "umull r6, r7, r8, r9\n\t"
  106730. "adds r3, r3, r6\n\t"
  106731. "adcs r4, r4, r7\n\t"
  106732. "adc r5, r5, #0\n\t"
  106733. #endif
  106734. "str r3, [%[r], #108]\n\t"
  106735. /* A[16] * B[12] */
  106736. "ldr r9, [%[b], #48]\n\t"
  106737. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  106738. "lsl r6, r8, #16\n\t"
  106739. "lsl r7, r9, #16\n\t"
  106740. "lsr r6, r6, #16\n\t"
  106741. "lsr r7, r7, #16\n\t"
  106742. "mul r7, r6, r7\n\t"
  106743. "adds r4, r4, r7\n\t"
  106744. "adcs r5, r5, #0\n\t"
  106745. "mov r3, #0\n\t"
  106746. "adc r3, r3, #0\n\t"
  106747. "lsr r7, r9, #16\n\t"
  106748. "mul r6, r7, r6\n\t"
  106749. "lsr r7, r6, #16\n\t"
  106750. "lsl r6, r6, #16\n\t"
  106751. "adds r4, r4, r6\n\t"
  106752. "adcs r5, r5, r7\n\t"
  106753. "adc r3, r3, #0\n\t"
  106754. "lsr r6, r8, #16\n\t"
  106755. "lsr r7, r9, #16\n\t"
  106756. "mul r7, r6, r7\n\t"
  106757. "adds r5, r5, r7\n\t"
  106758. "adc r3, r3, #0\n\t"
  106759. "lsl r7, r9, #16\n\t"
  106760. "lsr r7, r7, #16\n\t"
  106761. "mul r6, r7, r6\n\t"
  106762. "lsr r7, r6, #16\n\t"
  106763. "lsl r6, r6, #16\n\t"
  106764. "adds r4, r4, r6\n\t"
  106765. "adcs r5, r5, r7\n\t"
  106766. "adc r3, r3, #0\n\t"
  106767. #else
  106768. "umull r6, r7, r8, r9\n\t"
  106769. "adds r4, r4, r6\n\t"
  106770. "adcs r5, r5, r7\n\t"
  106771. "mov r3, #0\n\t"
  106772. "adc r3, r3, #0\n\t"
  106773. #endif
  106774. /* A[15] * B[13] */
  106775. "ldr r8, [%[a], #60]\n\t"
  106776. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  106777. "lsl r6, r8, #16\n\t"
  106778. "lsl r7, r12, #16\n\t"
  106779. "lsr r6, r6, #16\n\t"
  106780. "lsr r7, r7, #16\n\t"
  106781. "mul r7, r6, r7\n\t"
  106782. "adds r4, r4, r7\n\t"
  106783. "adcs r5, r5, #0\n\t"
  106784. "adc r3, r3, #0\n\t"
  106785. "lsr r7, r12, #16\n\t"
  106786. "mul r6, r7, r6\n\t"
  106787. "lsr r7, r6, #16\n\t"
  106788. "lsl r6, r6, #16\n\t"
  106789. "adds r4, r4, r6\n\t"
  106790. "adcs r5, r5, r7\n\t"
  106791. "adc r3, r3, #0\n\t"
  106792. "lsr r6, r8, #16\n\t"
  106793. "lsr r7, r12, #16\n\t"
  106794. "mul r7, r6, r7\n\t"
  106795. "adds r5, r5, r7\n\t"
  106796. "adc r3, r3, #0\n\t"
  106797. "lsl r7, r12, #16\n\t"
  106798. "lsr r7, r7, #16\n\t"
  106799. "mul r6, r7, r6\n\t"
  106800. "lsr r7, r6, #16\n\t"
  106801. "lsl r6, r6, #16\n\t"
  106802. "adds r4, r4, r6\n\t"
  106803. "adcs r5, r5, r7\n\t"
  106804. "adc r3, r3, #0\n\t"
  106805. #else
  106806. "umull r6, r7, r8, r12\n\t"
  106807. "adds r4, r4, r6\n\t"
  106808. "adcs r5, r5, r7\n\t"
  106809. "adc r3, r3, #0\n\t"
  106810. #endif
  106811. /* A[14] * B[14] */
  106812. "ldr r11, [%[a], #56]\n\t"
  106813. "ldr r12, [%[b], #56]\n\t"
  106814. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  106815. "lsl r6, r11, #16\n\t"
  106816. "lsl r7, r12, #16\n\t"
  106817. "lsr r6, r6, #16\n\t"
  106818. "lsr r7, r7, #16\n\t"
  106819. "mul r7, r6, r7\n\t"
  106820. "adds r4, r4, r7\n\t"
  106821. "adcs r5, r5, #0\n\t"
  106822. "adc r3, r3, #0\n\t"
  106823. "lsr r7, r12, #16\n\t"
  106824. "mul r6, r7, r6\n\t"
  106825. "lsr r7, r6, #16\n\t"
  106826. "lsl r6, r6, #16\n\t"
  106827. "adds r4, r4, r6\n\t"
  106828. "adcs r5, r5, r7\n\t"
  106829. "adc r3, r3, #0\n\t"
  106830. "lsr r6, r11, #16\n\t"
  106831. "lsr r7, r12, #16\n\t"
  106832. "mul r7, r6, r7\n\t"
  106833. "adds r5, r5, r7\n\t"
  106834. "adc r3, r3, #0\n\t"
  106835. "lsl r7, r12, #16\n\t"
  106836. "lsr r7, r7, #16\n\t"
  106837. "mul r6, r7, r6\n\t"
  106838. "lsr r7, r6, #16\n\t"
  106839. "lsl r6, r6, #16\n\t"
  106840. "adds r4, r4, r6\n\t"
  106841. "adcs r5, r5, r7\n\t"
  106842. "adc r3, r3, #0\n\t"
  106843. #else
  106844. "umull r6, r7, r11, r12\n\t"
  106845. "adds r4, r4, r6\n\t"
  106846. "adcs r5, r5, r7\n\t"
  106847. "adc r3, r3, #0\n\t"
  106848. #endif
  106849. /* A[13] * B[15] */
  106850. "ldr r8, [%[a], #52]\n\t"
  106851. "ldr r9, [%[b], #60]\n\t"
  106852. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  106853. "lsl r6, r8, #16\n\t"
  106854. "lsl r7, r9, #16\n\t"
  106855. "lsr r6, r6, #16\n\t"
  106856. "lsr r7, r7, #16\n\t"
  106857. "mul r7, r6, r7\n\t"
  106858. "adds r4, r4, r7\n\t"
  106859. "adcs r5, r5, #0\n\t"
  106860. "adc r3, r3, #0\n\t"
  106861. "lsr r7, r9, #16\n\t"
  106862. "mul r6, r7, r6\n\t"
  106863. "lsr r7, r6, #16\n\t"
  106864. "lsl r6, r6, #16\n\t"
  106865. "adds r4, r4, r6\n\t"
  106866. "adcs r5, r5, r7\n\t"
  106867. "adc r3, r3, #0\n\t"
  106868. "lsr r6, r8, #16\n\t"
  106869. "lsr r7, r9, #16\n\t"
  106870. "mul r7, r6, r7\n\t"
  106871. "adds r5, r5, r7\n\t"
  106872. "adc r3, r3, #0\n\t"
  106873. "lsl r7, r9, #16\n\t"
  106874. "lsr r7, r7, #16\n\t"
  106875. "mul r6, r7, r6\n\t"
  106876. "lsr r7, r6, #16\n\t"
  106877. "lsl r6, r6, #16\n\t"
  106878. "adds r4, r4, r6\n\t"
  106879. "adcs r5, r5, r7\n\t"
  106880. "adc r3, r3, #0\n\t"
  106881. #else
  106882. "umull r6, r7, r8, r9\n\t"
  106883. "adds r4, r4, r6\n\t"
  106884. "adcs r5, r5, r7\n\t"
  106885. "adc r3, r3, #0\n\t"
  106886. #endif
  106887. /* A[12] * B[16] */
  106888. "ldr r8, [%[a], #48]\n\t"
  106889. "ldr r9, [%[b], #64]\n\t"
  106890. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  106891. "lsl r6, r8, #16\n\t"
  106892. "lsl r7, r9, #16\n\t"
  106893. "lsr r6, r6, #16\n\t"
  106894. "lsr r7, r7, #16\n\t"
  106895. "mul r7, r6, r7\n\t"
  106896. "adds r4, r4, r7\n\t"
  106897. "adcs r5, r5, #0\n\t"
  106898. "adc r3, r3, #0\n\t"
  106899. "lsr r7, r9, #16\n\t"
  106900. "mul r6, r7, r6\n\t"
  106901. "lsr r7, r6, #16\n\t"
  106902. "lsl r6, r6, #16\n\t"
  106903. "adds r4, r4, r6\n\t"
  106904. "adcs r5, r5, r7\n\t"
  106905. "adc r3, r3, #0\n\t"
  106906. "lsr r6, r8, #16\n\t"
  106907. "lsr r7, r9, #16\n\t"
  106908. "mul r7, r6, r7\n\t"
  106909. "adds r5, r5, r7\n\t"
  106910. "adc r3, r3, #0\n\t"
  106911. "lsl r7, r9, #16\n\t"
  106912. "lsr r7, r7, #16\n\t"
  106913. "mul r6, r7, r6\n\t"
  106914. "lsr r7, r6, #16\n\t"
  106915. "lsl r6, r6, #16\n\t"
  106916. "adds r4, r4, r6\n\t"
  106917. "adcs r5, r5, r7\n\t"
  106918. "adc r3, r3, #0\n\t"
  106919. #else
  106920. "umull r6, r7, r8, r9\n\t"
  106921. "adds r4, r4, r6\n\t"
  106922. "adcs r5, r5, r7\n\t"
  106923. "adc r3, r3, #0\n\t"
  106924. #endif
  106925. "str r4, [%[r], #112]\n\t"
  106926. /* A[13] * B[16] */
  106927. "ldr r8, [%[a], #52]\n\t"
  106928. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  106929. "lsl r6, r8, #16\n\t"
  106930. "lsl r7, r9, #16\n\t"
  106931. "lsr r6, r6, #16\n\t"
  106932. "lsr r7, r7, #16\n\t"
  106933. "mul r7, r6, r7\n\t"
  106934. "adds r5, r5, r7\n\t"
  106935. "adcs r3, r3, #0\n\t"
  106936. "mov r4, #0\n\t"
  106937. "adc r4, r4, #0\n\t"
  106938. "lsr r7, r9, #16\n\t"
  106939. "mul r6, r7, r6\n\t"
  106940. "lsr r7, r6, #16\n\t"
  106941. "lsl r6, r6, #16\n\t"
  106942. "adds r5, r5, r6\n\t"
  106943. "adcs r3, r3, r7\n\t"
  106944. "adc r4, r4, #0\n\t"
  106945. "lsr r6, r8, #16\n\t"
  106946. "lsr r7, r9, #16\n\t"
  106947. "mul r7, r6, r7\n\t"
  106948. "adds r3, r3, r7\n\t"
  106949. "adc r4, r4, #0\n\t"
  106950. "lsl r7, r9, #16\n\t"
  106951. "lsr r7, r7, #16\n\t"
  106952. "mul r6, r7, r6\n\t"
  106953. "lsr r7, r6, #16\n\t"
  106954. "lsl r6, r6, #16\n\t"
  106955. "adds r5, r5, r6\n\t"
  106956. "adcs r3, r3, r7\n\t"
  106957. "adc r4, r4, #0\n\t"
  106958. #else
  106959. "umull r6, r7, r8, r9\n\t"
  106960. "adds r5, r5, r6\n\t"
  106961. "adcs r3, r3, r7\n\t"
  106962. "mov r4, #0\n\t"
  106963. "adc r4, r4, #0\n\t"
  106964. #endif
  106965. /* A[14] * B[15] */
  106966. "ldr r9, [%[b], #60]\n\t"
  106967. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  106968. "lsl r6, r11, #16\n\t"
  106969. "lsl r7, r9, #16\n\t"
  106970. "lsr r6, r6, #16\n\t"
  106971. "lsr r7, r7, #16\n\t"
  106972. "mul r7, r6, r7\n\t"
  106973. "adds r5, r5, r7\n\t"
  106974. "adcs r3, r3, #0\n\t"
  106975. "adc r4, r4, #0\n\t"
  106976. "lsr r7, r9, #16\n\t"
  106977. "mul r6, r7, r6\n\t"
  106978. "lsr r7, r6, #16\n\t"
  106979. "lsl r6, r6, #16\n\t"
  106980. "adds r5, r5, r6\n\t"
  106981. "adcs r3, r3, r7\n\t"
  106982. "adc r4, r4, #0\n\t"
  106983. "lsr r6, r11, #16\n\t"
  106984. "lsr r7, r9, #16\n\t"
  106985. "mul r7, r6, r7\n\t"
  106986. "adds r3, r3, r7\n\t"
  106987. "adc r4, r4, #0\n\t"
  106988. "lsl r7, r9, #16\n\t"
  106989. "lsr r7, r7, #16\n\t"
  106990. "mul r6, r7, r6\n\t"
  106991. "lsr r7, r6, #16\n\t"
  106992. "lsl r6, r6, #16\n\t"
  106993. "adds r5, r5, r6\n\t"
  106994. "adcs r3, r3, r7\n\t"
  106995. "adc r4, r4, #0\n\t"
  106996. #else
  106997. "umull r6, r7, r11, r9\n\t"
  106998. "adds r5, r5, r6\n\t"
  106999. "adcs r3, r3, r7\n\t"
  107000. "adc r4, r4, #0\n\t"
  107001. #endif
  107002. /* A[15] * B[14] */
  107003. "ldr r8, [%[a], #60]\n\t"
  107004. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  107005. "lsl r6, r8, #16\n\t"
  107006. "lsl r7, r12, #16\n\t"
  107007. "lsr r6, r6, #16\n\t"
  107008. "lsr r7, r7, #16\n\t"
  107009. "mul r7, r6, r7\n\t"
  107010. "adds r5, r5, r7\n\t"
  107011. "adcs r3, r3, #0\n\t"
  107012. "adc r4, r4, #0\n\t"
  107013. "lsr r7, r12, #16\n\t"
  107014. "mul r6, r7, r6\n\t"
  107015. "lsr r7, r6, #16\n\t"
  107016. "lsl r6, r6, #16\n\t"
  107017. "adds r5, r5, r6\n\t"
  107018. "adcs r3, r3, r7\n\t"
  107019. "adc r4, r4, #0\n\t"
  107020. "lsr r6, r8, #16\n\t"
  107021. "lsr r7, r12, #16\n\t"
  107022. "mul r7, r6, r7\n\t"
  107023. "adds r3, r3, r7\n\t"
  107024. "adc r4, r4, #0\n\t"
  107025. "lsl r7, r12, #16\n\t"
  107026. "lsr r7, r7, #16\n\t"
  107027. "mul r6, r7, r6\n\t"
  107028. "lsr r7, r6, #16\n\t"
  107029. "lsl r6, r6, #16\n\t"
  107030. "adds r5, r5, r6\n\t"
  107031. "adcs r3, r3, r7\n\t"
  107032. "adc r4, r4, #0\n\t"
  107033. #else
  107034. "umull r6, r7, r8, r12\n\t"
  107035. "adds r5, r5, r6\n\t"
  107036. "adcs r3, r3, r7\n\t"
  107037. "adc r4, r4, #0\n\t"
  107038. #endif
  107039. /* A[16] * B[13] */
  107040. "ldr r8, [%[a], #64]\n\t"
  107041. "ldr r9, [%[b], #52]\n\t"
  107042. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  107043. "lsl r6, r8, #16\n\t"
  107044. "lsl r7, r9, #16\n\t"
  107045. "lsr r6, r6, #16\n\t"
  107046. "lsr r7, r7, #16\n\t"
  107047. "mul r7, r6, r7\n\t"
  107048. "adds r5, r5, r7\n\t"
  107049. "adcs r3, r3, #0\n\t"
  107050. "adc r4, r4, #0\n\t"
  107051. "lsr r7, r9, #16\n\t"
  107052. "mul r6, r7, r6\n\t"
  107053. "lsr r7, r6, #16\n\t"
  107054. "lsl r6, r6, #16\n\t"
  107055. "adds r5, r5, r6\n\t"
  107056. "adcs r3, r3, r7\n\t"
  107057. "adc r4, r4, #0\n\t"
  107058. "lsr r6, r8, #16\n\t"
  107059. "lsr r7, r9, #16\n\t"
  107060. "mul r7, r6, r7\n\t"
  107061. "adds r3, r3, r7\n\t"
  107062. "adc r4, r4, #0\n\t"
  107063. "lsl r7, r9, #16\n\t"
  107064. "lsr r7, r7, #16\n\t"
  107065. "mul r6, r7, r6\n\t"
  107066. "lsr r7, r6, #16\n\t"
  107067. "lsl r6, r6, #16\n\t"
  107068. "adds r5, r5, r6\n\t"
  107069. "adcs r3, r3, r7\n\t"
  107070. "adc r4, r4, #0\n\t"
  107071. #else
  107072. "umull r6, r7, r8, r9\n\t"
  107073. "adds r5, r5, r6\n\t"
  107074. "adcs r3, r3, r7\n\t"
  107075. "adc r4, r4, #0\n\t"
  107076. #endif
  107077. "str r5, [%[r], #116]\n\t"
  107078. /* A[16] * B[14] */
  107079. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  107080. "lsl r6, r8, #16\n\t"
  107081. "lsl r7, r12, #16\n\t"
  107082. "lsr r6, r6, #16\n\t"
  107083. "lsr r7, r7, #16\n\t"
  107084. "mul r7, r6, r7\n\t"
  107085. "adds r3, r3, r7\n\t"
  107086. "adcs r4, r4, #0\n\t"
  107087. "mov r5, #0\n\t"
  107088. "adc r5, r5, #0\n\t"
  107089. "lsr r7, r12, #16\n\t"
  107090. "mul r6, r7, r6\n\t"
  107091. "lsr r7, r6, #16\n\t"
  107092. "lsl r6, r6, #16\n\t"
  107093. "adds r3, r3, r6\n\t"
  107094. "adcs r4, r4, r7\n\t"
  107095. "adc r5, r5, #0\n\t"
  107096. "lsr r6, r8, #16\n\t"
  107097. "lsr r7, r12, #16\n\t"
  107098. "mul r7, r6, r7\n\t"
  107099. "adds r4, r4, r7\n\t"
  107100. "adc r5, r5, #0\n\t"
  107101. "lsl r7, r12, #16\n\t"
  107102. "lsr r7, r7, #16\n\t"
  107103. "mul r6, r7, r6\n\t"
  107104. "lsr r7, r6, #16\n\t"
  107105. "lsl r6, r6, #16\n\t"
  107106. "adds r3, r3, r6\n\t"
  107107. "adcs r4, r4, r7\n\t"
  107108. "adc r5, r5, #0\n\t"
  107109. #else
  107110. "umull r6, r7, r8, r12\n\t"
  107111. "adds r3, r3, r6\n\t"
  107112. "adcs r4, r4, r7\n\t"
  107113. "mov r5, #0\n\t"
  107114. "adc r5, r5, #0\n\t"
  107115. #endif
  107116. /* A[15] * B[15] */
  107117. "ldr r11, [%[a], #60]\n\t"
  107118. "ldr r12, [%[b], #60]\n\t"
  107119. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  107120. "lsl r6, r11, #16\n\t"
  107121. "lsl r7, r12, #16\n\t"
  107122. "lsr r6, r6, #16\n\t"
  107123. "lsr r7, r7, #16\n\t"
  107124. "mul r7, r6, r7\n\t"
  107125. "adds r3, r3, r7\n\t"
  107126. "adcs r4, r4, #0\n\t"
  107127. "adc r5, r5, #0\n\t"
  107128. "lsr r7, r12, #16\n\t"
  107129. "mul r6, r7, r6\n\t"
  107130. "lsr r7, r6, #16\n\t"
  107131. "lsl r6, r6, #16\n\t"
  107132. "adds r3, r3, r6\n\t"
  107133. "adcs r4, r4, r7\n\t"
  107134. "adc r5, r5, #0\n\t"
  107135. "lsr r6, r11, #16\n\t"
  107136. "lsr r7, r12, #16\n\t"
  107137. "mul r7, r6, r7\n\t"
  107138. "adds r4, r4, r7\n\t"
  107139. "adc r5, r5, #0\n\t"
  107140. "lsl r7, r12, #16\n\t"
  107141. "lsr r7, r7, #16\n\t"
  107142. "mul r6, r7, r6\n\t"
  107143. "lsr r7, r6, #16\n\t"
  107144. "lsl r6, r6, #16\n\t"
  107145. "adds r3, r3, r6\n\t"
  107146. "adcs r4, r4, r7\n\t"
  107147. "adc r5, r5, #0\n\t"
  107148. #else
  107149. "umull r6, r7, r11, r12\n\t"
  107150. "adds r3, r3, r6\n\t"
  107151. "adcs r4, r4, r7\n\t"
  107152. "adc r5, r5, #0\n\t"
  107153. #endif
  107154. /* A[14] * B[16] */
  107155. "ldr r8, [%[a], #56]\n\t"
  107156. "ldr r9, [%[b], #64]\n\t"
  107157. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  107158. "lsl r6, r8, #16\n\t"
  107159. "lsl r7, r9, #16\n\t"
  107160. "lsr r6, r6, #16\n\t"
  107161. "lsr r7, r7, #16\n\t"
  107162. "mul r7, r6, r7\n\t"
  107163. "adds r3, r3, r7\n\t"
  107164. "adcs r4, r4, #0\n\t"
  107165. "adc r5, r5, #0\n\t"
  107166. "lsr r7, r9, #16\n\t"
  107167. "mul r6, r7, r6\n\t"
  107168. "lsr r7, r6, #16\n\t"
  107169. "lsl r6, r6, #16\n\t"
  107170. "adds r3, r3, r6\n\t"
  107171. "adcs r4, r4, r7\n\t"
  107172. "adc r5, r5, #0\n\t"
  107173. "lsr r6, r8, #16\n\t"
  107174. "lsr r7, r9, #16\n\t"
  107175. "mul r7, r6, r7\n\t"
  107176. "adds r4, r4, r7\n\t"
  107177. "adc r5, r5, #0\n\t"
  107178. "lsl r7, r9, #16\n\t"
  107179. "lsr r7, r7, #16\n\t"
  107180. "mul r6, r7, r6\n\t"
  107181. "lsr r7, r6, #16\n\t"
  107182. "lsl r6, r6, #16\n\t"
  107183. "adds r3, r3, r6\n\t"
  107184. "adcs r4, r4, r7\n\t"
  107185. "adc r5, r5, #0\n\t"
  107186. #else
  107187. "umull r6, r7, r8, r9\n\t"
  107188. "adds r3, r3, r6\n\t"
  107189. "adcs r4, r4, r7\n\t"
  107190. "adc r5, r5, #0\n\t"
  107191. #endif
  107192. "str r3, [%[r], #120]\n\t"
  107193. /* A[15] * B[16] */
  107194. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  107195. "lsl r6, r11, #16\n\t"
  107196. "lsl r7, r9, #16\n\t"
  107197. "lsr r6, r6, #16\n\t"
  107198. "lsr r7, r7, #16\n\t"
  107199. "mul r7, r6, r7\n\t"
  107200. "adds r4, r4, r7\n\t"
  107201. "adcs r5, r5, #0\n\t"
  107202. "mov r3, #0\n\t"
  107203. "adc r3, r3, #0\n\t"
  107204. "lsr r7, r9, #16\n\t"
  107205. "mul r6, r7, r6\n\t"
  107206. "lsr r7, r6, #16\n\t"
  107207. "lsl r6, r6, #16\n\t"
  107208. "adds r4, r4, r6\n\t"
  107209. "adcs r5, r5, r7\n\t"
  107210. "adc r3, r3, #0\n\t"
  107211. "lsr r6, r11, #16\n\t"
  107212. "lsr r7, r9, #16\n\t"
  107213. "mul r7, r6, r7\n\t"
  107214. "adds r5, r5, r7\n\t"
  107215. "adc r3, r3, #0\n\t"
  107216. "lsl r7, r9, #16\n\t"
  107217. "lsr r7, r7, #16\n\t"
  107218. "mul r6, r7, r6\n\t"
  107219. "lsr r7, r6, #16\n\t"
  107220. "lsl r6, r6, #16\n\t"
  107221. "adds r4, r4, r6\n\t"
  107222. "adcs r5, r5, r7\n\t"
  107223. "adc r3, r3, #0\n\t"
  107224. #else
  107225. "umull r6, r7, r11, r9\n\t"
  107226. "adds r4, r4, r6\n\t"
  107227. "adcs r5, r5, r7\n\t"
  107228. "mov r3, #0\n\t"
  107229. "adc r3, r3, #0\n\t"
  107230. #endif
  107231. /* A[16] * B[15] */
  107232. "ldr r8, [%[a], #64]\n\t"
  107233. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  107234. "lsl r6, r8, #16\n\t"
  107235. "lsl r7, r12, #16\n\t"
  107236. "lsr r6, r6, #16\n\t"
  107237. "lsr r7, r7, #16\n\t"
  107238. "mul r7, r6, r7\n\t"
  107239. "adds r4, r4, r7\n\t"
  107240. "adcs r5, r5, #0\n\t"
  107241. "adc r3, r3, #0\n\t"
  107242. "lsr r7, r12, #16\n\t"
  107243. "mul r6, r7, r6\n\t"
  107244. "lsr r7, r6, #16\n\t"
  107245. "lsl r6, r6, #16\n\t"
  107246. "adds r4, r4, r6\n\t"
  107247. "adcs r5, r5, r7\n\t"
  107248. "adc r3, r3, #0\n\t"
  107249. "lsr r6, r8, #16\n\t"
  107250. "lsr r7, r12, #16\n\t"
  107251. "mul r7, r6, r7\n\t"
  107252. "adds r5, r5, r7\n\t"
  107253. "adc r3, r3, #0\n\t"
  107254. "lsl r7, r12, #16\n\t"
  107255. "lsr r7, r7, #16\n\t"
  107256. "mul r6, r7, r6\n\t"
  107257. "lsr r7, r6, #16\n\t"
  107258. "lsl r6, r6, #16\n\t"
  107259. "adds r4, r4, r6\n\t"
  107260. "adcs r5, r5, r7\n\t"
  107261. "adc r3, r3, #0\n\t"
  107262. #else
  107263. "umull r6, r7, r8, r12\n\t"
  107264. "adds r4, r4, r6\n\t"
  107265. "adcs r5, r5, r7\n\t"
  107266. "adc r3, r3, #0\n\t"
  107267. #endif
  107268. "str r4, [%[r], #124]\n\t"
  107269. /* A[16] * B[16] */
  107270. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  107271. "lsl r6, r8, #16\n\t"
  107272. "lsl r7, r9, #16\n\t"
  107273. "lsr r6, r6, #16\n\t"
  107274. "lsr r7, r7, #16\n\t"
  107275. "mul r7, r6, r7\n\t"
  107276. "adds r5, r5, r7\n\t"
  107277. "adc r3, r3, #0\n\t"
  107278. "lsr r7, r9, #16\n\t"
  107279. "mul r6, r7, r6\n\t"
  107280. "lsr r7, r6, #16\n\t"
  107281. "lsl r6, r6, #16\n\t"
  107282. "adds r5, r5, r6\n\t"
  107283. "adc r3, r3, r7\n\t"
  107284. "lsr r6, r8, #16\n\t"
  107285. "lsr r7, r9, #16\n\t"
  107286. "mul r7, r6, r7\n\t"
  107287. "add r3, r3, r7\n\t"
  107288. "lsl r7, r9, #16\n\t"
  107289. "lsr r7, r7, #16\n\t"
  107290. "mul r6, r7, r6\n\t"
  107291. "lsr r7, r6, #16\n\t"
  107292. "lsl r6, r6, #16\n\t"
  107293. "adds r5, r5, r6\n\t"
  107294. "adc r3, r3, r7\n\t"
  107295. #else
  107296. "umlal r5, r3, r8, r9\n\t"
  107297. #endif
  107298. "str r5, [%[r], #128]\n\t"
  107299. "str r3, [%[r], #132]\n\t"
  107300. "ldm sp!, {r3, r4, r5, r6}\n\t"
  107301. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  107302. "ldm sp!, {r3, r4, r5, r6}\n\t"
  107303. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  107304. "ldm sp!, {r3, r4, r5, r6}\n\t"
  107305. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  107306. "ldm sp!, {r3, r4, r5, r6}\n\t"
  107307. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  107308. "ldm sp!, {r3}\n\t"
  107309. "stm %[r]!, {r3}\n\t"
  107310. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  107311. :
  107312. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r11", "r12", "cc"
  107313. );
  107314. }
  107315. #endif /* WOLFSSL_SP_SMALL */
  107316. #ifdef WOLFSSL_SP_SMALL
  107317. /* Square a and put result in r. (r = a * a)
  107318. *
  107319. * r A single precision integer.
  107320. * a A single precision integer.
  107321. */
  107322. static void sp_521_sqr_17(sp_digit* r_p, const sp_digit* a_p)
  107323. {
  107324. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  107325. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  107326. __asm__ __volatile__ (
  107327. "sub sp, sp, #0x88\n\t"
  107328. "ldr lr, [%[a]]\n\t"
  107329. "umull r8, r6, lr, lr\n\t"
  107330. "str r8, [sp]\n\t"
  107331. "mov r7, #0\n\t"
  107332. "mov r8, #0\n\t"
  107333. "mov r5, #4\n\t"
  107334. "\n"
  107335. "L_sp_521_sqr_17_outer_%=: \n\t"
  107336. "subs r3, r5, #0x40\n\t"
  107337. "it cc\n\t"
  107338. "movcc r3, #0\n\t"
  107339. "sub r4, r5, r3\n\t"
  107340. "\n"
  107341. "L_sp_521_sqr_17_inner_%=: \n\t"
  107342. "ldr lr, [%[a], r3]\n\t"
  107343. "ldr r11, [%[a], r4]\n\t"
  107344. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  107345. "lsl r9, lr, #16\n\t"
  107346. "lsl r10, r11, #16\n\t"
  107347. "lsr r9, r9, #16\n\t"
  107348. "lsr r10, r10, #16\n\t"
  107349. "mul r10, r9, r10\n\t"
  107350. "adds r6, r6, r10\n\t"
  107351. "adcs r7, r7, #0\n\t"
  107352. "adc r8, r8, #0\n\t"
  107353. "adds r6, r6, r10\n\t"
  107354. "adcs r7, r7, #0\n\t"
  107355. "adc r8, r8, #0\n\t"
  107356. "lsr r10, r11, #16\n\t"
  107357. "mul r9, r10, r9\n\t"
  107358. "lsr r10, r9, #16\n\t"
  107359. "lsl r9, r9, #16\n\t"
  107360. "adds r6, r6, r9\n\t"
  107361. "adcs r7, r7, r10\n\t"
  107362. "adc r8, r8, #0\n\t"
  107363. "adds r6, r6, r9\n\t"
  107364. "adcs r7, r7, r10\n\t"
  107365. "adc r8, r8, #0\n\t"
  107366. "lsr r9, lr, #16\n\t"
  107367. "lsr r10, r11, #16\n\t"
  107368. "mul r10, r9, r10\n\t"
  107369. "adds r7, r7, r10\n\t"
  107370. "adc r8, r8, #0\n\t"
  107371. "adds r7, r7, r10\n\t"
  107372. "adc r8, r8, #0\n\t"
  107373. "lsl r10, r11, #16\n\t"
  107374. "lsr r10, r10, #16\n\t"
  107375. "mul r9, r10, r9\n\t"
  107376. "lsr r10, r9, #16\n\t"
  107377. "lsl r9, r9, #16\n\t"
  107378. "adds r6, r6, r9\n\t"
  107379. "adcs r7, r7, r10\n\t"
  107380. "adc r8, r8, #0\n\t"
  107381. "adds r6, r6, r9\n\t"
  107382. "adcs r7, r7, r10\n\t"
  107383. "adc r8, r8, #0\n\t"
  107384. #else
  107385. "umull r9, r10, lr, r11\n\t"
  107386. "adds r6, r6, r9\n\t"
  107387. "adcs r7, r7, r10\n\t"
  107388. "adc r8, r8, #0\n\t"
  107389. "adds r6, r6, r9\n\t"
  107390. "adcs r7, r7, r10\n\t"
  107391. "adc r8, r8, #0\n\t"
  107392. #endif
  107393. "add r3, r3, #4\n\t"
  107394. "sub r4, r4, #4\n\t"
  107395. "cmp r3, r4\n\t"
  107396. "bgt L_sp_521_sqr_17_inner_done_%=\n\t"
  107397. "blt L_sp_521_sqr_17_inner_%=\n\t"
  107398. "ldr lr, [%[a], r3]\n\t"
  107399. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  107400. "lsl r9, lr, #16\n\t"
  107401. "lsr r10, lr, #16\n\t"
  107402. "lsr r9, r9, #16\n\t"
  107403. "mov r11, r9\n\t"
  107404. "mul r9, r11, r9\n\t"
  107405. "mov r11, r10\n\t"
  107406. "mul r10, r11, r10\n\t"
  107407. "adds r6, r6, r9\n\t"
  107408. "adcs r7, r7, r10\n\t"
  107409. "adc r8, r8, #0\n\t"
  107410. "lsr r10, lr, #16\n\t"
  107411. "lsl r9, lr, #16\n\t"
  107412. "lsr r9, r9, #16\n\t"
  107413. "mul r9, r10, r9\n\t"
  107414. "lsr r10, r9, #15\n\t"
  107415. "lsl r9, r9, #17\n\t"
  107416. "adds r6, r6, r9\n\t"
  107417. "adcs r7, r7, r10\n\t"
  107418. "adc r8, r8, #0\n\t"
  107419. #else
  107420. "umull r9, r10, lr, lr\n\t"
  107421. "adds r6, r6, r9\n\t"
  107422. "adcs r7, r7, r10\n\t"
  107423. "adc r8, r8, #0\n\t"
  107424. #endif
  107425. "\n"
  107426. "L_sp_521_sqr_17_inner_done_%=: \n\t"
  107427. "str r6, [sp, r5]\n\t"
  107428. "mov r6, r7\n\t"
  107429. "mov r7, r8\n\t"
  107430. "mov r8, #0\n\t"
  107431. "add r5, r5, #4\n\t"
  107432. "cmp r5, #0x7c\n\t"
  107433. "ble L_sp_521_sqr_17_outer_%=\n\t"
  107434. "ldr lr, [%[a], #64]\n\t"
  107435. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  107436. "lsl r9, lr, #16\n\t"
  107437. "lsr r10, lr, #16\n\t"
  107438. "lsr r9, r9, #16\n\t"
  107439. "mov r11, r9\n\t"
  107440. "mul r9, r11, r9\n\t"
  107441. "mov r11, r10\n\t"
  107442. "mul r10, r11, r10\n\t"
  107443. "adds r6, r6, r9\n\t"
  107444. "adc r7, r7, r10\n\t"
  107445. "lsr r10, lr, #16\n\t"
  107446. "lsl r9, lr, #16\n\t"
  107447. "lsr r9, r9, #16\n\t"
  107448. "mul r9, r10, r9\n\t"
  107449. "lsr r10, r9, #15\n\t"
  107450. "lsl r9, r9, #17\n\t"
  107451. "adds r6, r6, r9\n\t"
  107452. "adc r7, r7, r10\n\t"
  107453. #else
  107454. "umull r9, r10, lr, lr\n\t"
  107455. "adds r6, r6, r9\n\t"
  107456. "adc r7, r7, r10\n\t"
  107457. #endif
  107458. "str r6, [sp, r5]\n\t"
  107459. "add r5, r5, #4\n\t"
  107460. "str r7, [sp, r5]\n\t"
  107461. "ldm sp!, {r6, r7}\n\t"
  107462. "stm %[r]!, {r6, r7}\n\t"
  107463. "sub r5, r5, #8\n\t"
  107464. "\n"
  107465. "L_sp_521_sqr_17_store_%=: \n\t"
  107466. "ldm sp!, {r3, r4, r6, r7, r8, r9, r10, r11}\n\t"
  107467. "stm %[r]!, {r3, r4, r6, r7, r8, r9, r10, r11}\n\t"
  107468. "subs r5, r5, #32\n\t"
  107469. "bgt L_sp_521_sqr_17_store_%=\n\t"
  107470. : [r] "+r" (r), [a] "+r" (a)
  107471. :
  107472. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "lr", "r11", "cc"
  107473. );
  107474. }
  107475. #else
  107476. /* Square a and put result in r. (r = a * a)
  107477. *
  107478. * r A single precision integer.
  107479. * a A single precision integer.
  107480. */
  107481. static void sp_521_sqr_17(sp_digit* r_p, const sp_digit* a_p)
  107482. {
  107483. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  107484. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  107485. __asm__ __volatile__ (
  107486. "sub sp, sp, #0x44\n\t"
  107487. /* A[0] * A[0] */
  107488. "ldr r10, [%[a]]\n\t"
  107489. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  107490. "lsr r9, r10, #16\n\t"
  107491. "lsl r2, r10, #16\n\t"
  107492. "lsr r2, r2, #16\n\t"
  107493. "mul r8, r2, r2\n\t"
  107494. "mul r3, r9, r9\n\t"
  107495. "mul r2, r9, r2\n\t"
  107496. "lsr r9, r2, #15\n\t"
  107497. "lsl r2, r2, #17\n\t"
  107498. "adds r8, r8, r2\n\t"
  107499. "adc r3, r3, r9\n\t"
  107500. #else
  107501. "umull r8, r3, r10, r10\n\t"
  107502. #endif
  107503. "mov r4, #0\n\t"
  107504. "str r8, [sp]\n\t"
  107505. /* A[0] * A[1] */
  107506. "ldr r10, [%[a], #4]\n\t"
  107507. "ldr r12, [%[a]]\n\t"
  107508. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  107509. "lsl r8, r10, #16\n\t"
  107510. "lsl r9, r12, #16\n\t"
  107511. "lsr r8, r8, #16\n\t"
  107512. "lsr r9, r9, #16\n\t"
  107513. "mul r9, r8, r9\n\t"
  107514. "adds r3, r3, r9\n\t"
  107515. "adcs r4, r4, #0\n\t"
  107516. "mov r2, #0\n\t"
  107517. "adc r2, r2, #0\n\t"
  107518. "adds r3, r3, r9\n\t"
  107519. "adcs r4, r4, #0\n\t"
  107520. "adc r2, r2, #0\n\t"
  107521. "lsr r9, r12, #16\n\t"
  107522. "mul r8, r9, r8\n\t"
  107523. "lsr r9, r8, #16\n\t"
  107524. "lsl r8, r8, #16\n\t"
  107525. "adds r3, r3, r8\n\t"
  107526. "adcs r4, r4, r9\n\t"
  107527. "adc r2, r2, #0\n\t"
  107528. "adds r3, r3, r8\n\t"
  107529. "adcs r4, r4, r9\n\t"
  107530. "adc r2, r2, #0\n\t"
  107531. "lsr r8, r10, #16\n\t"
  107532. "lsr r9, r12, #16\n\t"
  107533. "mul r9, r8, r9\n\t"
  107534. "adds r4, r4, r9\n\t"
  107535. "adc r2, r2, #0\n\t"
  107536. "adds r4, r4, r9\n\t"
  107537. "adc r2, r2, #0\n\t"
  107538. "lsl r9, r12, #16\n\t"
  107539. "lsr r9, r9, #16\n\t"
  107540. "mul r8, r9, r8\n\t"
  107541. "lsr r9, r8, #16\n\t"
  107542. "lsl r8, r8, #16\n\t"
  107543. "adds r3, r3, r8\n\t"
  107544. "adcs r4, r4, r9\n\t"
  107545. "adc r2, r2, #0\n\t"
  107546. "adds r3, r3, r8\n\t"
  107547. "adcs r4, r4, r9\n\t"
  107548. "adc r2, r2, #0\n\t"
  107549. #else
  107550. "umull r8, r9, r10, r12\n\t"
  107551. "adds r3, r3, r8\n\t"
  107552. "adcs r4, r4, r9\n\t"
  107553. "mov r2, #0\n\t"
  107554. "adc r2, r2, #0\n\t"
  107555. "adds r3, r3, r8\n\t"
  107556. "adcs r4, r4, r9\n\t"
  107557. "mov r2, #0\n\t"
  107558. "adc r2, r2, #0\n\t"
  107559. #endif
  107560. "str r3, [sp, #4]\n\t"
  107561. /* A[0] * A[2] */
  107562. "ldr r10, [%[a], #8]\n\t"
  107563. "ldr r12, [%[a]]\n\t"
  107564. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  107565. "lsl r8, r10, #16\n\t"
  107566. "lsl r9, r12, #16\n\t"
  107567. "lsr r8, r8, #16\n\t"
  107568. "lsr r9, r9, #16\n\t"
  107569. "mul r9, r8, r9\n\t"
  107570. "adds r4, r4, r9\n\t"
  107571. "adcs r2, r2, #0\n\t"
  107572. "mov r3, #0\n\t"
  107573. "adc r3, r3, #0\n\t"
  107574. "adds r4, r4, r9\n\t"
  107575. "adcs r2, r2, #0\n\t"
  107576. "adc r3, r3, #0\n\t"
  107577. "lsr r9, r12, #16\n\t"
  107578. "mul r8, r9, r8\n\t"
  107579. "lsr r9, r8, #16\n\t"
  107580. "lsl r8, r8, #16\n\t"
  107581. "adds r4, r4, r8\n\t"
  107582. "adcs r2, r2, r9\n\t"
  107583. "adc r3, r3, #0\n\t"
  107584. "adds r4, r4, r8\n\t"
  107585. "adcs r2, r2, r9\n\t"
  107586. "adc r3, r3, #0\n\t"
  107587. "lsr r8, r10, #16\n\t"
  107588. "lsr r9, r12, #16\n\t"
  107589. "mul r9, r8, r9\n\t"
  107590. "adds r2, r2, r9\n\t"
  107591. "adc r3, r3, #0\n\t"
  107592. "adds r2, r2, r9\n\t"
  107593. "adc r3, r3, #0\n\t"
  107594. "lsl r9, r12, #16\n\t"
  107595. "lsr r9, r9, #16\n\t"
  107596. "mul r8, r9, r8\n\t"
  107597. "lsr r9, r8, #16\n\t"
  107598. "lsl r8, r8, #16\n\t"
  107599. "adds r4, r4, r8\n\t"
  107600. "adcs r2, r2, r9\n\t"
  107601. "adc r3, r3, #0\n\t"
  107602. "adds r4, r4, r8\n\t"
  107603. "adcs r2, r2, r9\n\t"
  107604. "adc r3, r3, #0\n\t"
  107605. #else
  107606. "umull r8, r9, r10, r12\n\t"
  107607. "adds r4, r4, r8\n\t"
  107608. "adcs r2, r2, r9\n\t"
  107609. "mov r3, #0\n\t"
  107610. "adc r3, r3, #0\n\t"
  107611. "adds r4, r4, r8\n\t"
  107612. "adcs r2, r2, r9\n\t"
  107613. "mov r3, #0\n\t"
  107614. "adc r3, r3, #0\n\t"
  107615. #endif
  107616. /* A[1] * A[1] */
  107617. "ldr r10, [%[a], #4]\n\t"
  107618. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  107619. "lsl r8, r10, #16\n\t"
  107620. "lsr r9, r10, #16\n\t"
  107621. "lsr r8, r8, #16\n\t"
  107622. "mov r12, r8\n\t"
  107623. "mul r8, r12, r8\n\t"
  107624. "mov r12, r9\n\t"
  107625. "mul r9, r12, r9\n\t"
  107626. "adds r4, r4, r8\n\t"
  107627. "adcs r2, r2, r9\n\t"
  107628. "adc r3, r3, #0\n\t"
  107629. "lsr r9, r10, #16\n\t"
  107630. "lsl r8, r10, #16\n\t"
  107631. "lsr r8, r8, #16\n\t"
  107632. "mul r8, r9, r8\n\t"
  107633. "lsr r9, r8, #15\n\t"
  107634. "lsl r8, r8, #17\n\t"
  107635. "adds r4, r4, r8\n\t"
  107636. "adcs r2, r2, r9\n\t"
  107637. "adc r3, r3, #0\n\t"
  107638. #else
  107639. "umull r8, r9, r10, r10\n\t"
  107640. "adds r4, r4, r8\n\t"
  107641. "adcs r2, r2, r9\n\t"
  107642. "adc r3, r3, #0\n\t"
  107643. #endif
  107644. "str r4, [sp, #8]\n\t"
  107645. /* A[0] * A[3] */
  107646. "ldr r10, [%[a], #12]\n\t"
  107647. "ldr r12, [%[a]]\n\t"
  107648. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  107649. "lsl r8, r10, #16\n\t"
  107650. "lsl r9, r12, #16\n\t"
  107651. "lsr r8, r8, #16\n\t"
  107652. "lsr r9, r9, #16\n\t"
  107653. "mul r9, r8, r9\n\t"
  107654. "adds r2, r2, r9\n\t"
  107655. "adcs r3, r3, #0\n\t"
  107656. "mov r4, #0\n\t"
  107657. "adc r4, r4, #0\n\t"
  107658. "adds r2, r2, r9\n\t"
  107659. "adcs r3, r3, #0\n\t"
  107660. "adc r4, r4, #0\n\t"
  107661. "lsr r9, r12, #16\n\t"
  107662. "mul r8, r9, r8\n\t"
  107663. "lsr r9, r8, #16\n\t"
  107664. "lsl r8, r8, #16\n\t"
  107665. "adds r2, r2, r8\n\t"
  107666. "adcs r3, r3, r9\n\t"
  107667. "adc r4, r4, #0\n\t"
  107668. "adds r2, r2, r8\n\t"
  107669. "adcs r3, r3, r9\n\t"
  107670. "adc r4, r4, #0\n\t"
  107671. "lsr r8, r10, #16\n\t"
  107672. "lsr r9, r12, #16\n\t"
  107673. "mul r9, r8, r9\n\t"
  107674. "adds r3, r3, r9\n\t"
  107675. "adc r4, r4, #0\n\t"
  107676. "adds r3, r3, r9\n\t"
  107677. "adc r4, r4, #0\n\t"
  107678. "lsl r9, r12, #16\n\t"
  107679. "lsr r9, r9, #16\n\t"
  107680. "mul r8, r9, r8\n\t"
  107681. "lsr r9, r8, #16\n\t"
  107682. "lsl r8, r8, #16\n\t"
  107683. "adds r2, r2, r8\n\t"
  107684. "adcs r3, r3, r9\n\t"
  107685. "adc r4, r4, #0\n\t"
  107686. "adds r2, r2, r8\n\t"
  107687. "adcs r3, r3, r9\n\t"
  107688. "adc r4, r4, #0\n\t"
  107689. #else
  107690. "umull r8, r9, r10, r12\n\t"
  107691. "adds r2, r2, r8\n\t"
  107692. "adcs r3, r3, r9\n\t"
  107693. "mov r4, #0\n\t"
  107694. "adc r4, r4, #0\n\t"
  107695. "adds r2, r2, r8\n\t"
  107696. "adcs r3, r3, r9\n\t"
  107697. "mov r4, #0\n\t"
  107698. "adc r4, r4, #0\n\t"
  107699. #endif
  107700. /* A[1] * A[2] */
  107701. "ldr r10, [%[a], #8]\n\t"
  107702. "ldr r12, [%[a], #4]\n\t"
  107703. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  107704. "lsl r8, r10, #16\n\t"
  107705. "lsl r9, r12, #16\n\t"
  107706. "lsr r8, r8, #16\n\t"
  107707. "lsr r9, r9, #16\n\t"
  107708. "mul r9, r8, r9\n\t"
  107709. "adds r2, r2, r9\n\t"
  107710. "adcs r3, r3, #0\n\t"
  107711. "adc r4, r4, #0\n\t"
  107712. "adds r2, r2, r9\n\t"
  107713. "adcs r3, r3, #0\n\t"
  107714. "adc r4, r4, #0\n\t"
  107715. "lsr r9, r12, #16\n\t"
  107716. "mul r8, r9, r8\n\t"
  107717. "lsr r9, r8, #16\n\t"
  107718. "lsl r8, r8, #16\n\t"
  107719. "adds r2, r2, r8\n\t"
  107720. "adcs r3, r3, r9\n\t"
  107721. "adc r4, r4, #0\n\t"
  107722. "adds r2, r2, r8\n\t"
  107723. "adcs r3, r3, r9\n\t"
  107724. "adc r4, r4, #0\n\t"
  107725. "lsr r8, r10, #16\n\t"
  107726. "lsr r9, r12, #16\n\t"
  107727. "mul r9, r8, r9\n\t"
  107728. "adds r3, r3, r9\n\t"
  107729. "adc r4, r4, #0\n\t"
  107730. "adds r3, r3, r9\n\t"
  107731. "adc r4, r4, #0\n\t"
  107732. "lsl r9, r12, #16\n\t"
  107733. "lsr r9, r9, #16\n\t"
  107734. "mul r8, r9, r8\n\t"
  107735. "lsr r9, r8, #16\n\t"
  107736. "lsl r8, r8, #16\n\t"
  107737. "adds r2, r2, r8\n\t"
  107738. "adcs r3, r3, r9\n\t"
  107739. "adc r4, r4, #0\n\t"
  107740. "adds r2, r2, r8\n\t"
  107741. "adcs r3, r3, r9\n\t"
  107742. "adc r4, r4, #0\n\t"
  107743. #else
  107744. "umull r8, r9, r10, r12\n\t"
  107745. "adds r2, r2, r8\n\t"
  107746. "adcs r3, r3, r9\n\t"
  107747. "adc r4, r4, #0\n\t"
  107748. "adds r2, r2, r8\n\t"
  107749. "adcs r3, r3, r9\n\t"
  107750. "adc r4, r4, #0\n\t"
  107751. #endif
  107752. "str r2, [sp, #12]\n\t"
  107753. /* A[0] * A[4] */
  107754. "ldr r10, [%[a], #16]\n\t"
  107755. "ldr r12, [%[a]]\n\t"
  107756. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  107757. "lsl r8, r10, #16\n\t"
  107758. "lsl r9, r12, #16\n\t"
  107759. "lsr r8, r8, #16\n\t"
  107760. "lsr r9, r9, #16\n\t"
  107761. "mul r9, r8, r9\n\t"
  107762. "adds r3, r3, r9\n\t"
  107763. "adcs r4, r4, #0\n\t"
  107764. "mov r2, #0\n\t"
  107765. "adc r2, r2, #0\n\t"
  107766. "adds r3, r3, r9\n\t"
  107767. "adcs r4, r4, #0\n\t"
  107768. "adc r2, r2, #0\n\t"
  107769. "lsr r9, r12, #16\n\t"
  107770. "mul r8, r9, r8\n\t"
  107771. "lsr r9, r8, #16\n\t"
  107772. "lsl r8, r8, #16\n\t"
  107773. "adds r3, r3, r8\n\t"
  107774. "adcs r4, r4, r9\n\t"
  107775. "adc r2, r2, #0\n\t"
  107776. "adds r3, r3, r8\n\t"
  107777. "adcs r4, r4, r9\n\t"
  107778. "adc r2, r2, #0\n\t"
  107779. "lsr r8, r10, #16\n\t"
  107780. "lsr r9, r12, #16\n\t"
  107781. "mul r9, r8, r9\n\t"
  107782. "adds r4, r4, r9\n\t"
  107783. "adc r2, r2, #0\n\t"
  107784. "adds r4, r4, r9\n\t"
  107785. "adc r2, r2, #0\n\t"
  107786. "lsl r9, r12, #16\n\t"
  107787. "lsr r9, r9, #16\n\t"
  107788. "mul r8, r9, r8\n\t"
  107789. "lsr r9, r8, #16\n\t"
  107790. "lsl r8, r8, #16\n\t"
  107791. "adds r3, r3, r8\n\t"
  107792. "adcs r4, r4, r9\n\t"
  107793. "adc r2, r2, #0\n\t"
  107794. "adds r3, r3, r8\n\t"
  107795. "adcs r4, r4, r9\n\t"
  107796. "adc r2, r2, #0\n\t"
  107797. #else
  107798. "umull r8, r9, r10, r12\n\t"
  107799. "adds r3, r3, r8\n\t"
  107800. "adcs r4, r4, r9\n\t"
  107801. "mov r2, #0\n\t"
  107802. "adc r2, r2, #0\n\t"
  107803. "adds r3, r3, r8\n\t"
  107804. "adcs r4, r4, r9\n\t"
  107805. "mov r2, #0\n\t"
  107806. "adc r2, r2, #0\n\t"
  107807. #endif
  107808. /* A[1] * A[3] */
  107809. "ldr r10, [%[a], #12]\n\t"
  107810. "ldr r12, [%[a], #4]\n\t"
  107811. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  107812. "lsl r8, r10, #16\n\t"
  107813. "lsl r9, r12, #16\n\t"
  107814. "lsr r8, r8, #16\n\t"
  107815. "lsr r9, r9, #16\n\t"
  107816. "mul r9, r8, r9\n\t"
  107817. "adds r3, r3, r9\n\t"
  107818. "adcs r4, r4, #0\n\t"
  107819. "adc r2, r2, #0\n\t"
  107820. "adds r3, r3, r9\n\t"
  107821. "adcs r4, r4, #0\n\t"
  107822. "adc r2, r2, #0\n\t"
  107823. "lsr r9, r12, #16\n\t"
  107824. "mul r8, r9, r8\n\t"
  107825. "lsr r9, r8, #16\n\t"
  107826. "lsl r8, r8, #16\n\t"
  107827. "adds r3, r3, r8\n\t"
  107828. "adcs r4, r4, r9\n\t"
  107829. "adc r2, r2, #0\n\t"
  107830. "adds r3, r3, r8\n\t"
  107831. "adcs r4, r4, r9\n\t"
  107832. "adc r2, r2, #0\n\t"
  107833. "lsr r8, r10, #16\n\t"
  107834. "lsr r9, r12, #16\n\t"
  107835. "mul r9, r8, r9\n\t"
  107836. "adds r4, r4, r9\n\t"
  107837. "adc r2, r2, #0\n\t"
  107838. "adds r4, r4, r9\n\t"
  107839. "adc r2, r2, #0\n\t"
  107840. "lsl r9, r12, #16\n\t"
  107841. "lsr r9, r9, #16\n\t"
  107842. "mul r8, r9, r8\n\t"
  107843. "lsr r9, r8, #16\n\t"
  107844. "lsl r8, r8, #16\n\t"
  107845. "adds r3, r3, r8\n\t"
  107846. "adcs r4, r4, r9\n\t"
  107847. "adc r2, r2, #0\n\t"
  107848. "adds r3, r3, r8\n\t"
  107849. "adcs r4, r4, r9\n\t"
  107850. "adc r2, r2, #0\n\t"
  107851. #else
  107852. "umull r8, r9, r10, r12\n\t"
  107853. "adds r3, r3, r8\n\t"
  107854. "adcs r4, r4, r9\n\t"
  107855. "adc r2, r2, #0\n\t"
  107856. "adds r3, r3, r8\n\t"
  107857. "adcs r4, r4, r9\n\t"
  107858. "adc r2, r2, #0\n\t"
  107859. #endif
  107860. /* A[2] * A[2] */
  107861. "ldr r10, [%[a], #8]\n\t"
  107862. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  107863. "lsl r8, r10, #16\n\t"
  107864. "lsr r9, r10, #16\n\t"
  107865. "lsr r8, r8, #16\n\t"
  107866. "mov r12, r8\n\t"
  107867. "mul r8, r12, r8\n\t"
  107868. "mov r12, r9\n\t"
  107869. "mul r9, r12, r9\n\t"
  107870. "adds r3, r3, r8\n\t"
  107871. "adcs r4, r4, r9\n\t"
  107872. "adc r2, r2, #0\n\t"
  107873. "lsr r9, r10, #16\n\t"
  107874. "lsl r8, r10, #16\n\t"
  107875. "lsr r8, r8, #16\n\t"
  107876. "mul r8, r9, r8\n\t"
  107877. "lsr r9, r8, #15\n\t"
  107878. "lsl r8, r8, #17\n\t"
  107879. "adds r3, r3, r8\n\t"
  107880. "adcs r4, r4, r9\n\t"
  107881. "adc r2, r2, #0\n\t"
  107882. #else
  107883. "umull r8, r9, r10, r10\n\t"
  107884. "adds r3, r3, r8\n\t"
  107885. "adcs r4, r4, r9\n\t"
  107886. "adc r2, r2, #0\n\t"
  107887. #endif
  107888. "str r3, [sp, #16]\n\t"
  107889. /* A[0] * A[5] */
  107890. "ldr r10, [%[a], #20]\n\t"
  107891. "ldr r12, [%[a]]\n\t"
  107892. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  107893. "lsl r8, r10, #16\n\t"
  107894. "lsl r5, r12, #16\n\t"
  107895. "lsr r8, r8, #16\n\t"
  107896. "lsr r5, r5, #16\n\t"
  107897. "mul r5, r8, r5\n\t"
  107898. "lsr r9, r12, #16\n\t"
  107899. "mul r8, r9, r8\n\t"
  107900. "lsr r6, r8, #16\n\t"
  107901. "lsl r8, r8, #16\n\t"
  107902. "adds r5, r5, r8\n\t"
  107903. "adc r6, r6, #0\n\t"
  107904. "lsr r8, r10, #16\n\t"
  107905. "mul r9, r8, r9\n\t"
  107906. "add r6, r6, r9\n\t"
  107907. "lsl r9, r12, #16\n\t"
  107908. "lsr r9, r9, #16\n\t"
  107909. "mul r8, r9, r8\n\t"
  107910. "lsr r9, r8, #16\n\t"
  107911. "lsl r8, r8, #16\n\t"
  107912. "adds r5, r5, r8\n\t"
  107913. "adc r6, r6, r9\n\t"
  107914. #else
  107915. "umull r5, r6, r10, r12\n\t"
  107916. #endif
  107917. "mov r3, #0\n\t"
  107918. "mov r7, #0\n\t"
  107919. /* A[1] * A[4] */
  107920. "ldr r10, [%[a], #16]\n\t"
  107921. "ldr r12, [%[a], #4]\n\t"
  107922. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  107923. "lsl r8, r10, #16\n\t"
  107924. "lsl r9, r12, #16\n\t"
  107925. "lsr r8, r8, #16\n\t"
  107926. "lsr r9, r9, #16\n\t"
  107927. "mul r9, r8, r9\n\t"
  107928. "adds r5, r5, r9\n\t"
  107929. "adcs r6, r6, #0\n\t"
  107930. "adc r7, r7, #0\n\t"
  107931. "lsr r9, r12, #16\n\t"
  107932. "mul r8, r9, r8\n\t"
  107933. "lsr r9, r8, #16\n\t"
  107934. "lsl r8, r8, #16\n\t"
  107935. "adds r5, r5, r8\n\t"
  107936. "adcs r6, r6, r9\n\t"
  107937. "adc r7, r7, #0\n\t"
  107938. "lsr r8, r10, #16\n\t"
  107939. "lsr r9, r12, #16\n\t"
  107940. "mul r9, r8, r9\n\t"
  107941. "adds r6, r6, r9\n\t"
  107942. "adc r7, r7, #0\n\t"
  107943. "lsl r9, r12, #16\n\t"
  107944. "lsr r9, r9, #16\n\t"
  107945. "mul r8, r9, r8\n\t"
  107946. "lsr r9, r8, #16\n\t"
  107947. "lsl r8, r8, #16\n\t"
  107948. "adds r5, r5, r8\n\t"
  107949. "adcs r6, r6, r9\n\t"
  107950. "adc r7, r7, #0\n\t"
  107951. #else
  107952. "umull r8, r9, r10, r12\n\t"
  107953. "adds r5, r5, r8\n\t"
  107954. "adcs r6, r6, r9\n\t"
  107955. "adc r7, r7, #0\n\t"
  107956. #endif
  107957. /* A[2] * A[3] */
  107958. "ldr r10, [%[a], #12]\n\t"
  107959. "ldr r12, [%[a], #8]\n\t"
  107960. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  107961. "lsl r8, r10, #16\n\t"
  107962. "lsl r9, r12, #16\n\t"
  107963. "lsr r8, r8, #16\n\t"
  107964. "lsr r9, r9, #16\n\t"
  107965. "mul r9, r8, r9\n\t"
  107966. "adds r5, r5, r9\n\t"
  107967. "adcs r6, r6, #0\n\t"
  107968. "adc r7, r7, #0\n\t"
  107969. "lsr r9, r12, #16\n\t"
  107970. "mul r8, r9, r8\n\t"
  107971. "lsr r9, r8, #16\n\t"
  107972. "lsl r8, r8, #16\n\t"
  107973. "adds r5, r5, r8\n\t"
  107974. "adcs r6, r6, r9\n\t"
  107975. "adc r7, r7, #0\n\t"
  107976. "lsr r8, r10, #16\n\t"
  107977. "lsr r9, r12, #16\n\t"
  107978. "mul r9, r8, r9\n\t"
  107979. "adds r6, r6, r9\n\t"
  107980. "adc r7, r7, #0\n\t"
  107981. "lsl r9, r12, #16\n\t"
  107982. "lsr r9, r9, #16\n\t"
  107983. "mul r8, r9, r8\n\t"
  107984. "lsr r9, r8, #16\n\t"
  107985. "lsl r8, r8, #16\n\t"
  107986. "adds r5, r5, r8\n\t"
  107987. "adcs r6, r6, r9\n\t"
  107988. "adc r7, r7, #0\n\t"
  107989. #else
  107990. "umull r8, r9, r10, r12\n\t"
  107991. "adds r5, r5, r8\n\t"
  107992. "adcs r6, r6, r9\n\t"
  107993. "adc r7, r7, #0\n\t"
  107994. #endif
  107995. "adds r5, r5, r5\n\t"
  107996. "adcs r6, r6, r6\n\t"
  107997. "adc r7, r7, r7\n\t"
  107998. "adds r4, r4, r5\n\t"
  107999. "adcs r2, r2, r6\n\t"
  108000. "adc r3, r3, r7\n\t"
  108001. "str r4, [sp, #20]\n\t"
  108002. /* A[0] * A[6] */
  108003. "ldr r10, [%[a], #24]\n\t"
  108004. "ldr r12, [%[a]]\n\t"
  108005. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  108006. "lsl r8, r10, #16\n\t"
  108007. "lsl r5, r12, #16\n\t"
  108008. "lsr r8, r8, #16\n\t"
  108009. "lsr r5, r5, #16\n\t"
  108010. "mul r5, r8, r5\n\t"
  108011. "lsr r9, r12, #16\n\t"
  108012. "mul r8, r9, r8\n\t"
  108013. "lsr r6, r8, #16\n\t"
  108014. "lsl r8, r8, #16\n\t"
  108015. "adds r5, r5, r8\n\t"
  108016. "adc r6, r6, #0\n\t"
  108017. "lsr r8, r10, #16\n\t"
  108018. "mul r9, r8, r9\n\t"
  108019. "add r6, r6, r9\n\t"
  108020. "lsl r9, r12, #16\n\t"
  108021. "lsr r9, r9, #16\n\t"
  108022. "mul r8, r9, r8\n\t"
  108023. "lsr r9, r8, #16\n\t"
  108024. "lsl r8, r8, #16\n\t"
  108025. "adds r5, r5, r8\n\t"
  108026. "adc r6, r6, r9\n\t"
  108027. #else
  108028. "umull r5, r6, r10, r12\n\t"
  108029. #endif
  108030. "mov r4, #0\n\t"
  108031. "mov r7, #0\n\t"
  108032. /* A[1] * A[5] */
  108033. "ldr r10, [%[a], #20]\n\t"
  108034. "ldr r12, [%[a], #4]\n\t"
  108035. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  108036. "lsl r8, r10, #16\n\t"
  108037. "lsl r9, r12, #16\n\t"
  108038. "lsr r8, r8, #16\n\t"
  108039. "lsr r9, r9, #16\n\t"
  108040. "mul r9, r8, r9\n\t"
  108041. "adds r5, r5, r9\n\t"
  108042. "adcs r6, r6, #0\n\t"
  108043. "adc r7, r7, #0\n\t"
  108044. "lsr r9, r12, #16\n\t"
  108045. "mul r8, r9, r8\n\t"
  108046. "lsr r9, r8, #16\n\t"
  108047. "lsl r8, r8, #16\n\t"
  108048. "adds r5, r5, r8\n\t"
  108049. "adcs r6, r6, r9\n\t"
  108050. "adc r7, r7, #0\n\t"
  108051. "lsr r8, r10, #16\n\t"
  108052. "lsr r9, r12, #16\n\t"
  108053. "mul r9, r8, r9\n\t"
  108054. "adds r6, r6, r9\n\t"
  108055. "adc r7, r7, #0\n\t"
  108056. "lsl r9, r12, #16\n\t"
  108057. "lsr r9, r9, #16\n\t"
  108058. "mul r8, r9, r8\n\t"
  108059. "lsr r9, r8, #16\n\t"
  108060. "lsl r8, r8, #16\n\t"
  108061. "adds r5, r5, r8\n\t"
  108062. "adcs r6, r6, r9\n\t"
  108063. "adc r7, r7, #0\n\t"
  108064. #else
  108065. "umull r8, r9, r10, r12\n\t"
  108066. "adds r5, r5, r8\n\t"
  108067. "adcs r6, r6, r9\n\t"
  108068. "adc r7, r7, #0\n\t"
  108069. #endif
  108070. /* A[2] * A[4] */
  108071. "ldr r10, [%[a], #16]\n\t"
  108072. "ldr r12, [%[a], #8]\n\t"
  108073. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  108074. "lsl r8, r10, #16\n\t"
  108075. "lsl r9, r12, #16\n\t"
  108076. "lsr r8, r8, #16\n\t"
  108077. "lsr r9, r9, #16\n\t"
  108078. "mul r9, r8, r9\n\t"
  108079. "adds r5, r5, r9\n\t"
  108080. "adcs r6, r6, #0\n\t"
  108081. "adc r7, r7, #0\n\t"
  108082. "lsr r9, r12, #16\n\t"
  108083. "mul r8, r9, r8\n\t"
  108084. "lsr r9, r8, #16\n\t"
  108085. "lsl r8, r8, #16\n\t"
  108086. "adds r5, r5, r8\n\t"
  108087. "adcs r6, r6, r9\n\t"
  108088. "adc r7, r7, #0\n\t"
  108089. "lsr r8, r10, #16\n\t"
  108090. "lsr r9, r12, #16\n\t"
  108091. "mul r9, r8, r9\n\t"
  108092. "adds r6, r6, r9\n\t"
  108093. "adc r7, r7, #0\n\t"
  108094. "lsl r9, r12, #16\n\t"
  108095. "lsr r9, r9, #16\n\t"
  108096. "mul r8, r9, r8\n\t"
  108097. "lsr r9, r8, #16\n\t"
  108098. "lsl r8, r8, #16\n\t"
  108099. "adds r5, r5, r8\n\t"
  108100. "adcs r6, r6, r9\n\t"
  108101. "adc r7, r7, #0\n\t"
  108102. #else
  108103. "umull r8, r9, r10, r12\n\t"
  108104. "adds r5, r5, r8\n\t"
  108105. "adcs r6, r6, r9\n\t"
  108106. "adc r7, r7, #0\n\t"
  108107. #endif
  108108. /* A[3] * A[3] */
  108109. "ldr r10, [%[a], #12]\n\t"
  108110. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  108111. "lsl r8, r10, #16\n\t"
  108112. "lsr r9, r10, #16\n\t"
  108113. "lsr r8, r8, #16\n\t"
  108114. "mov r12, r8\n\t"
  108115. "mul r8, r12, r8\n\t"
  108116. "mov r12, r9\n\t"
  108117. "mul r9, r12, r9\n\t"
  108118. "adds r2, r2, r8\n\t"
  108119. "adcs r3, r3, r9\n\t"
  108120. "adc r4, r4, #0\n\t"
  108121. "lsr r9, r10, #16\n\t"
  108122. "lsl r8, r10, #16\n\t"
  108123. "lsr r8, r8, #16\n\t"
  108124. "mul r8, r9, r8\n\t"
  108125. "lsr r9, r8, #15\n\t"
  108126. "lsl r8, r8, #17\n\t"
  108127. "adds r2, r2, r8\n\t"
  108128. "adcs r3, r3, r9\n\t"
  108129. "adc r4, r4, #0\n\t"
  108130. "adds r5, r5, r5\n\t"
  108131. "adcs r6, r6, r6\n\t"
  108132. "adc r7, r7, r7\n\t"
  108133. #else
  108134. "umull r8, r9, r10, r10\n\t"
  108135. "adds r5, r5, r5\n\t"
  108136. "adcs r6, r6, r6\n\t"
  108137. "adc r7, r7, r7\n\t"
  108138. "adds r2, r2, r8\n\t"
  108139. "adcs r3, r3, r9\n\t"
  108140. "adc r4, r4, #0\n\t"
  108141. #endif
  108142. "adds r2, r2, r5\n\t"
  108143. "adcs r3, r3, r6\n\t"
  108144. "adc r4, r4, r7\n\t"
  108145. "str r2, [sp, #24]\n\t"
  108146. /* A[0] * A[7] */
  108147. "ldr r10, [%[a], #28]\n\t"
  108148. "ldr r12, [%[a]]\n\t"
  108149. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  108150. "lsl r8, r10, #16\n\t"
  108151. "lsl r5, r12, #16\n\t"
  108152. "lsr r8, r8, #16\n\t"
  108153. "lsr r5, r5, #16\n\t"
  108154. "mul r5, r8, r5\n\t"
  108155. "lsr r9, r12, #16\n\t"
  108156. "mul r8, r9, r8\n\t"
  108157. "lsr r6, r8, #16\n\t"
  108158. "lsl r8, r8, #16\n\t"
  108159. "adds r5, r5, r8\n\t"
  108160. "adc r6, r6, #0\n\t"
  108161. "lsr r8, r10, #16\n\t"
  108162. "mul r9, r8, r9\n\t"
  108163. "add r6, r6, r9\n\t"
  108164. "lsl r9, r12, #16\n\t"
  108165. "lsr r9, r9, #16\n\t"
  108166. "mul r8, r9, r8\n\t"
  108167. "lsr r9, r8, #16\n\t"
  108168. "lsl r8, r8, #16\n\t"
  108169. "adds r5, r5, r8\n\t"
  108170. "adc r6, r6, r9\n\t"
  108171. #else
  108172. "umull r5, r6, r10, r12\n\t"
  108173. #endif
  108174. "mov r2, #0\n\t"
  108175. "mov r7, #0\n\t"
  108176. /* A[1] * A[6] */
  108177. "ldr r10, [%[a], #24]\n\t"
  108178. "ldr r12, [%[a], #4]\n\t"
  108179. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  108180. "lsl r8, r10, #16\n\t"
  108181. "lsl r9, r12, #16\n\t"
  108182. "lsr r8, r8, #16\n\t"
  108183. "lsr r9, r9, #16\n\t"
  108184. "mul r9, r8, r9\n\t"
  108185. "adds r5, r5, r9\n\t"
  108186. "adcs r6, r6, #0\n\t"
  108187. "adc r7, r7, #0\n\t"
  108188. "lsr r9, r12, #16\n\t"
  108189. "mul r8, r9, r8\n\t"
  108190. "lsr r9, r8, #16\n\t"
  108191. "lsl r8, r8, #16\n\t"
  108192. "adds r5, r5, r8\n\t"
  108193. "adcs r6, r6, r9\n\t"
  108194. "adc r7, r7, #0\n\t"
  108195. "lsr r8, r10, #16\n\t"
  108196. "lsr r9, r12, #16\n\t"
  108197. "mul r9, r8, r9\n\t"
  108198. "adds r6, r6, r9\n\t"
  108199. "adc r7, r7, #0\n\t"
  108200. "lsl r9, r12, #16\n\t"
  108201. "lsr r9, r9, #16\n\t"
  108202. "mul r8, r9, r8\n\t"
  108203. "lsr r9, r8, #16\n\t"
  108204. "lsl r8, r8, #16\n\t"
  108205. "adds r5, r5, r8\n\t"
  108206. "adcs r6, r6, r9\n\t"
  108207. "adc r7, r7, #0\n\t"
  108208. #else
  108209. "umull r8, r9, r10, r12\n\t"
  108210. "adds r5, r5, r8\n\t"
  108211. "adcs r6, r6, r9\n\t"
  108212. "adc r7, r7, #0\n\t"
  108213. #endif
  108214. /* A[2] * A[5] */
  108215. "ldr r10, [%[a], #20]\n\t"
  108216. "ldr r12, [%[a], #8]\n\t"
  108217. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  108218. "lsl r8, r10, #16\n\t"
  108219. "lsl r9, r12, #16\n\t"
  108220. "lsr r8, r8, #16\n\t"
  108221. "lsr r9, r9, #16\n\t"
  108222. "mul r9, r8, r9\n\t"
  108223. "adds r5, r5, r9\n\t"
  108224. "adcs r6, r6, #0\n\t"
  108225. "adc r7, r7, #0\n\t"
  108226. "lsr r9, r12, #16\n\t"
  108227. "mul r8, r9, r8\n\t"
  108228. "lsr r9, r8, #16\n\t"
  108229. "lsl r8, r8, #16\n\t"
  108230. "adds r5, r5, r8\n\t"
  108231. "adcs r6, r6, r9\n\t"
  108232. "adc r7, r7, #0\n\t"
  108233. "lsr r8, r10, #16\n\t"
  108234. "lsr r9, r12, #16\n\t"
  108235. "mul r9, r8, r9\n\t"
  108236. "adds r6, r6, r9\n\t"
  108237. "adc r7, r7, #0\n\t"
  108238. "lsl r9, r12, #16\n\t"
  108239. "lsr r9, r9, #16\n\t"
  108240. "mul r8, r9, r8\n\t"
  108241. "lsr r9, r8, #16\n\t"
  108242. "lsl r8, r8, #16\n\t"
  108243. "adds r5, r5, r8\n\t"
  108244. "adcs r6, r6, r9\n\t"
  108245. "adc r7, r7, #0\n\t"
  108246. #else
  108247. "umull r8, r9, r10, r12\n\t"
  108248. "adds r5, r5, r8\n\t"
  108249. "adcs r6, r6, r9\n\t"
  108250. "adc r7, r7, #0\n\t"
  108251. #endif
  108252. /* A[3] * A[4] */
  108253. "ldr r10, [%[a], #16]\n\t"
  108254. "ldr r12, [%[a], #12]\n\t"
  108255. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  108256. "lsl r8, r10, #16\n\t"
  108257. "lsl r9, r12, #16\n\t"
  108258. "lsr r8, r8, #16\n\t"
  108259. "lsr r9, r9, #16\n\t"
  108260. "mul r9, r8, r9\n\t"
  108261. "adds r5, r5, r9\n\t"
  108262. "adcs r6, r6, #0\n\t"
  108263. "adc r7, r7, #0\n\t"
  108264. "lsr r9, r12, #16\n\t"
  108265. "mul r8, r9, r8\n\t"
  108266. "lsr r9, r8, #16\n\t"
  108267. "lsl r8, r8, #16\n\t"
  108268. "adds r5, r5, r8\n\t"
  108269. "adcs r6, r6, r9\n\t"
  108270. "adc r7, r7, #0\n\t"
  108271. "lsr r8, r10, #16\n\t"
  108272. "lsr r9, r12, #16\n\t"
  108273. "mul r9, r8, r9\n\t"
  108274. "adds r6, r6, r9\n\t"
  108275. "adc r7, r7, #0\n\t"
  108276. "lsl r9, r12, #16\n\t"
  108277. "lsr r9, r9, #16\n\t"
  108278. "mul r8, r9, r8\n\t"
  108279. "lsr r9, r8, #16\n\t"
  108280. "lsl r8, r8, #16\n\t"
  108281. "adds r5, r5, r8\n\t"
  108282. "adcs r6, r6, r9\n\t"
  108283. "adc r7, r7, #0\n\t"
  108284. #else
  108285. "umull r8, r9, r10, r12\n\t"
  108286. "adds r5, r5, r8\n\t"
  108287. "adcs r6, r6, r9\n\t"
  108288. "adc r7, r7, #0\n\t"
  108289. #endif
  108290. "adds r5, r5, r5\n\t"
  108291. "adcs r6, r6, r6\n\t"
  108292. "adc r7, r7, r7\n\t"
  108293. "adds r3, r3, r5\n\t"
  108294. "adcs r4, r4, r6\n\t"
  108295. "adc r2, r2, r7\n\t"
  108296. "str r3, [sp, #28]\n\t"
  108297. /* A[0] * A[8] */
  108298. "ldr r10, [%[a], #32]\n\t"
  108299. "ldr r12, [%[a]]\n\t"
  108300. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  108301. "lsl r8, r10, #16\n\t"
  108302. "lsl r5, r12, #16\n\t"
  108303. "lsr r8, r8, #16\n\t"
  108304. "lsr r5, r5, #16\n\t"
  108305. "mul r5, r8, r5\n\t"
  108306. "lsr r9, r12, #16\n\t"
  108307. "mul r8, r9, r8\n\t"
  108308. "lsr r6, r8, #16\n\t"
  108309. "lsl r8, r8, #16\n\t"
  108310. "adds r5, r5, r8\n\t"
  108311. "adc r6, r6, #0\n\t"
  108312. "lsr r8, r10, #16\n\t"
  108313. "mul r9, r8, r9\n\t"
  108314. "add r6, r6, r9\n\t"
  108315. "lsl r9, r12, #16\n\t"
  108316. "lsr r9, r9, #16\n\t"
  108317. "mul r8, r9, r8\n\t"
  108318. "lsr r9, r8, #16\n\t"
  108319. "lsl r8, r8, #16\n\t"
  108320. "adds r5, r5, r8\n\t"
  108321. "adc r6, r6, r9\n\t"
  108322. #else
  108323. "umull r5, r6, r10, r12\n\t"
  108324. #endif
  108325. "mov r3, #0\n\t"
  108326. "mov r7, #0\n\t"
  108327. /* A[1] * A[7] */
  108328. "ldr r10, [%[a], #28]\n\t"
  108329. "ldr r12, [%[a], #4]\n\t"
  108330. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  108331. "lsl r8, r10, #16\n\t"
  108332. "lsl r9, r12, #16\n\t"
  108333. "lsr r8, r8, #16\n\t"
  108334. "lsr r9, r9, #16\n\t"
  108335. "mul r9, r8, r9\n\t"
  108336. "adds r5, r5, r9\n\t"
  108337. "adcs r6, r6, #0\n\t"
  108338. "adc r7, r7, #0\n\t"
  108339. "lsr r9, r12, #16\n\t"
  108340. "mul r8, r9, r8\n\t"
  108341. "lsr r9, r8, #16\n\t"
  108342. "lsl r8, r8, #16\n\t"
  108343. "adds r5, r5, r8\n\t"
  108344. "adcs r6, r6, r9\n\t"
  108345. "adc r7, r7, #0\n\t"
  108346. "lsr r8, r10, #16\n\t"
  108347. "lsr r9, r12, #16\n\t"
  108348. "mul r9, r8, r9\n\t"
  108349. "adds r6, r6, r9\n\t"
  108350. "adc r7, r7, #0\n\t"
  108351. "lsl r9, r12, #16\n\t"
  108352. "lsr r9, r9, #16\n\t"
  108353. "mul r8, r9, r8\n\t"
  108354. "lsr r9, r8, #16\n\t"
  108355. "lsl r8, r8, #16\n\t"
  108356. "adds r5, r5, r8\n\t"
  108357. "adcs r6, r6, r9\n\t"
  108358. "adc r7, r7, #0\n\t"
  108359. #else
  108360. "umull r8, r9, r10, r12\n\t"
  108361. "adds r5, r5, r8\n\t"
  108362. "adcs r6, r6, r9\n\t"
  108363. "adc r7, r7, #0\n\t"
  108364. #endif
  108365. /* A[2] * A[6] */
  108366. "ldr r10, [%[a], #24]\n\t"
  108367. "ldr r12, [%[a], #8]\n\t"
  108368. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  108369. "lsl r8, r10, #16\n\t"
  108370. "lsl r9, r12, #16\n\t"
  108371. "lsr r8, r8, #16\n\t"
  108372. "lsr r9, r9, #16\n\t"
  108373. "mul r9, r8, r9\n\t"
  108374. "adds r5, r5, r9\n\t"
  108375. "adcs r6, r6, #0\n\t"
  108376. "adc r7, r7, #0\n\t"
  108377. "lsr r9, r12, #16\n\t"
  108378. "mul r8, r9, r8\n\t"
  108379. "lsr r9, r8, #16\n\t"
  108380. "lsl r8, r8, #16\n\t"
  108381. "adds r5, r5, r8\n\t"
  108382. "adcs r6, r6, r9\n\t"
  108383. "adc r7, r7, #0\n\t"
  108384. "lsr r8, r10, #16\n\t"
  108385. "lsr r9, r12, #16\n\t"
  108386. "mul r9, r8, r9\n\t"
  108387. "adds r6, r6, r9\n\t"
  108388. "adc r7, r7, #0\n\t"
  108389. "lsl r9, r12, #16\n\t"
  108390. "lsr r9, r9, #16\n\t"
  108391. "mul r8, r9, r8\n\t"
  108392. "lsr r9, r8, #16\n\t"
  108393. "lsl r8, r8, #16\n\t"
  108394. "adds r5, r5, r8\n\t"
  108395. "adcs r6, r6, r9\n\t"
  108396. "adc r7, r7, #0\n\t"
  108397. #else
  108398. "umull r8, r9, r10, r12\n\t"
  108399. "adds r5, r5, r8\n\t"
  108400. "adcs r6, r6, r9\n\t"
  108401. "adc r7, r7, #0\n\t"
  108402. #endif
  108403. /* A[3] * A[5] */
  108404. "ldr r10, [%[a], #20]\n\t"
  108405. "ldr r12, [%[a], #12]\n\t"
  108406. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  108407. "lsl r8, r10, #16\n\t"
  108408. "lsl r9, r12, #16\n\t"
  108409. "lsr r8, r8, #16\n\t"
  108410. "lsr r9, r9, #16\n\t"
  108411. "mul r9, r8, r9\n\t"
  108412. "adds r5, r5, r9\n\t"
  108413. "adcs r6, r6, #0\n\t"
  108414. "adc r7, r7, #0\n\t"
  108415. "lsr r9, r12, #16\n\t"
  108416. "mul r8, r9, r8\n\t"
  108417. "lsr r9, r8, #16\n\t"
  108418. "lsl r8, r8, #16\n\t"
  108419. "adds r5, r5, r8\n\t"
  108420. "adcs r6, r6, r9\n\t"
  108421. "adc r7, r7, #0\n\t"
  108422. "lsr r8, r10, #16\n\t"
  108423. "lsr r9, r12, #16\n\t"
  108424. "mul r9, r8, r9\n\t"
  108425. "adds r6, r6, r9\n\t"
  108426. "adc r7, r7, #0\n\t"
  108427. "lsl r9, r12, #16\n\t"
  108428. "lsr r9, r9, #16\n\t"
  108429. "mul r8, r9, r8\n\t"
  108430. "lsr r9, r8, #16\n\t"
  108431. "lsl r8, r8, #16\n\t"
  108432. "adds r5, r5, r8\n\t"
  108433. "adcs r6, r6, r9\n\t"
  108434. "adc r7, r7, #0\n\t"
  108435. #else
  108436. "umull r8, r9, r10, r12\n\t"
  108437. "adds r5, r5, r8\n\t"
  108438. "adcs r6, r6, r9\n\t"
  108439. "adc r7, r7, #0\n\t"
  108440. #endif
  108441. /* A[4] * A[4] */
  108442. "ldr r10, [%[a], #16]\n\t"
  108443. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  108444. "lsl r8, r10, #16\n\t"
  108445. "lsr r9, r10, #16\n\t"
  108446. "lsr r8, r8, #16\n\t"
  108447. "mov r12, r8\n\t"
  108448. "mul r8, r12, r8\n\t"
  108449. "mov r12, r9\n\t"
  108450. "mul r9, r12, r9\n\t"
  108451. "adds r4, r4, r8\n\t"
  108452. "adcs r2, r2, r9\n\t"
  108453. "adc r3, r3, #0\n\t"
  108454. "lsr r9, r10, #16\n\t"
  108455. "lsl r8, r10, #16\n\t"
  108456. "lsr r8, r8, #16\n\t"
  108457. "mul r8, r9, r8\n\t"
  108458. "lsr r9, r8, #15\n\t"
  108459. "lsl r8, r8, #17\n\t"
  108460. "adds r4, r4, r8\n\t"
  108461. "adcs r2, r2, r9\n\t"
  108462. "adc r3, r3, #0\n\t"
  108463. "adds r5, r5, r5\n\t"
  108464. "adcs r6, r6, r6\n\t"
  108465. "adc r7, r7, r7\n\t"
  108466. #else
  108467. "umull r8, r9, r10, r10\n\t"
  108468. "adds r5, r5, r5\n\t"
  108469. "adcs r6, r6, r6\n\t"
  108470. "adc r7, r7, r7\n\t"
  108471. "adds r4, r4, r8\n\t"
  108472. "adcs r2, r2, r9\n\t"
  108473. "adc r3, r3, #0\n\t"
  108474. #endif
  108475. "adds r4, r4, r5\n\t"
  108476. "adcs r2, r2, r6\n\t"
  108477. "adc r3, r3, r7\n\t"
  108478. "str r4, [sp, #32]\n\t"
  108479. /* A[0] * A[9] */
  108480. "ldr r10, [%[a], #36]\n\t"
  108481. "ldr r12, [%[a]]\n\t"
  108482. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  108483. "lsl r8, r10, #16\n\t"
  108484. "lsl r5, r12, #16\n\t"
  108485. "lsr r8, r8, #16\n\t"
  108486. "lsr r5, r5, #16\n\t"
  108487. "mul r5, r8, r5\n\t"
  108488. "lsr r9, r12, #16\n\t"
  108489. "mul r8, r9, r8\n\t"
  108490. "lsr r6, r8, #16\n\t"
  108491. "lsl r8, r8, #16\n\t"
  108492. "adds r5, r5, r8\n\t"
  108493. "adc r6, r6, #0\n\t"
  108494. "lsr r8, r10, #16\n\t"
  108495. "mul r9, r8, r9\n\t"
  108496. "add r6, r6, r9\n\t"
  108497. "lsl r9, r12, #16\n\t"
  108498. "lsr r9, r9, #16\n\t"
  108499. "mul r8, r9, r8\n\t"
  108500. "lsr r9, r8, #16\n\t"
  108501. "lsl r8, r8, #16\n\t"
  108502. "adds r5, r5, r8\n\t"
  108503. "adc r6, r6, r9\n\t"
  108504. #else
  108505. "umull r5, r6, r10, r12\n\t"
  108506. #endif
  108507. "mov r4, #0\n\t"
  108508. "mov r7, #0\n\t"
  108509. /* A[1] * A[8] */
  108510. "ldr r10, [%[a], #32]\n\t"
  108511. "ldr r12, [%[a], #4]\n\t"
  108512. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  108513. "lsl r8, r10, #16\n\t"
  108514. "lsl r9, r12, #16\n\t"
  108515. "lsr r8, r8, #16\n\t"
  108516. "lsr r9, r9, #16\n\t"
  108517. "mul r9, r8, r9\n\t"
  108518. "adds r5, r5, r9\n\t"
  108519. "adcs r6, r6, #0\n\t"
  108520. "adc r7, r7, #0\n\t"
  108521. "lsr r9, r12, #16\n\t"
  108522. "mul r8, r9, r8\n\t"
  108523. "lsr r9, r8, #16\n\t"
  108524. "lsl r8, r8, #16\n\t"
  108525. "adds r5, r5, r8\n\t"
  108526. "adcs r6, r6, r9\n\t"
  108527. "adc r7, r7, #0\n\t"
  108528. "lsr r8, r10, #16\n\t"
  108529. "lsr r9, r12, #16\n\t"
  108530. "mul r9, r8, r9\n\t"
  108531. "adds r6, r6, r9\n\t"
  108532. "adc r7, r7, #0\n\t"
  108533. "lsl r9, r12, #16\n\t"
  108534. "lsr r9, r9, #16\n\t"
  108535. "mul r8, r9, r8\n\t"
  108536. "lsr r9, r8, #16\n\t"
  108537. "lsl r8, r8, #16\n\t"
  108538. "adds r5, r5, r8\n\t"
  108539. "adcs r6, r6, r9\n\t"
  108540. "adc r7, r7, #0\n\t"
  108541. #else
  108542. "umull r8, r9, r10, r12\n\t"
  108543. "adds r5, r5, r8\n\t"
  108544. "adcs r6, r6, r9\n\t"
  108545. "adc r7, r7, #0\n\t"
  108546. #endif
  108547. /* A[2] * A[7] */
  108548. "ldr r10, [%[a], #28]\n\t"
  108549. "ldr r12, [%[a], #8]\n\t"
  108550. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  108551. "lsl r8, r10, #16\n\t"
  108552. "lsl r9, r12, #16\n\t"
  108553. "lsr r8, r8, #16\n\t"
  108554. "lsr r9, r9, #16\n\t"
  108555. "mul r9, r8, r9\n\t"
  108556. "adds r5, r5, r9\n\t"
  108557. "adcs r6, r6, #0\n\t"
  108558. "adc r7, r7, #0\n\t"
  108559. "lsr r9, r12, #16\n\t"
  108560. "mul r8, r9, r8\n\t"
  108561. "lsr r9, r8, #16\n\t"
  108562. "lsl r8, r8, #16\n\t"
  108563. "adds r5, r5, r8\n\t"
  108564. "adcs r6, r6, r9\n\t"
  108565. "adc r7, r7, #0\n\t"
  108566. "lsr r8, r10, #16\n\t"
  108567. "lsr r9, r12, #16\n\t"
  108568. "mul r9, r8, r9\n\t"
  108569. "adds r6, r6, r9\n\t"
  108570. "adc r7, r7, #0\n\t"
  108571. "lsl r9, r12, #16\n\t"
  108572. "lsr r9, r9, #16\n\t"
  108573. "mul r8, r9, r8\n\t"
  108574. "lsr r9, r8, #16\n\t"
  108575. "lsl r8, r8, #16\n\t"
  108576. "adds r5, r5, r8\n\t"
  108577. "adcs r6, r6, r9\n\t"
  108578. "adc r7, r7, #0\n\t"
  108579. #else
  108580. "umull r8, r9, r10, r12\n\t"
  108581. "adds r5, r5, r8\n\t"
  108582. "adcs r6, r6, r9\n\t"
  108583. "adc r7, r7, #0\n\t"
  108584. #endif
  108585. /* A[3] * A[6] */
  108586. "ldr r10, [%[a], #24]\n\t"
  108587. "ldr r12, [%[a], #12]\n\t"
  108588. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  108589. "lsl r8, r10, #16\n\t"
  108590. "lsl r9, r12, #16\n\t"
  108591. "lsr r8, r8, #16\n\t"
  108592. "lsr r9, r9, #16\n\t"
  108593. "mul r9, r8, r9\n\t"
  108594. "adds r5, r5, r9\n\t"
  108595. "adcs r6, r6, #0\n\t"
  108596. "adc r7, r7, #0\n\t"
  108597. "lsr r9, r12, #16\n\t"
  108598. "mul r8, r9, r8\n\t"
  108599. "lsr r9, r8, #16\n\t"
  108600. "lsl r8, r8, #16\n\t"
  108601. "adds r5, r5, r8\n\t"
  108602. "adcs r6, r6, r9\n\t"
  108603. "adc r7, r7, #0\n\t"
  108604. "lsr r8, r10, #16\n\t"
  108605. "lsr r9, r12, #16\n\t"
  108606. "mul r9, r8, r9\n\t"
  108607. "adds r6, r6, r9\n\t"
  108608. "adc r7, r7, #0\n\t"
  108609. "lsl r9, r12, #16\n\t"
  108610. "lsr r9, r9, #16\n\t"
  108611. "mul r8, r9, r8\n\t"
  108612. "lsr r9, r8, #16\n\t"
  108613. "lsl r8, r8, #16\n\t"
  108614. "adds r5, r5, r8\n\t"
  108615. "adcs r6, r6, r9\n\t"
  108616. "adc r7, r7, #0\n\t"
  108617. #else
  108618. "umull r8, r9, r10, r12\n\t"
  108619. "adds r5, r5, r8\n\t"
  108620. "adcs r6, r6, r9\n\t"
  108621. "adc r7, r7, #0\n\t"
  108622. #endif
  108623. /* A[4] * A[5] */
  108624. "ldr r10, [%[a], #20]\n\t"
  108625. "ldr r12, [%[a], #16]\n\t"
  108626. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  108627. "lsl r8, r10, #16\n\t"
  108628. "lsl r9, r12, #16\n\t"
  108629. "lsr r8, r8, #16\n\t"
  108630. "lsr r9, r9, #16\n\t"
  108631. "mul r9, r8, r9\n\t"
  108632. "adds r5, r5, r9\n\t"
  108633. "adcs r6, r6, #0\n\t"
  108634. "adc r7, r7, #0\n\t"
  108635. "lsr r9, r12, #16\n\t"
  108636. "mul r8, r9, r8\n\t"
  108637. "lsr r9, r8, #16\n\t"
  108638. "lsl r8, r8, #16\n\t"
  108639. "adds r5, r5, r8\n\t"
  108640. "adcs r6, r6, r9\n\t"
  108641. "adc r7, r7, #0\n\t"
  108642. "lsr r8, r10, #16\n\t"
  108643. "lsr r9, r12, #16\n\t"
  108644. "mul r9, r8, r9\n\t"
  108645. "adds r6, r6, r9\n\t"
  108646. "adc r7, r7, #0\n\t"
  108647. "lsl r9, r12, #16\n\t"
  108648. "lsr r9, r9, #16\n\t"
  108649. "mul r8, r9, r8\n\t"
  108650. "lsr r9, r8, #16\n\t"
  108651. "lsl r8, r8, #16\n\t"
  108652. "adds r5, r5, r8\n\t"
  108653. "adcs r6, r6, r9\n\t"
  108654. "adc r7, r7, #0\n\t"
  108655. #else
  108656. "umull r8, r9, r10, r12\n\t"
  108657. "adds r5, r5, r8\n\t"
  108658. "adcs r6, r6, r9\n\t"
  108659. "adc r7, r7, #0\n\t"
  108660. #endif
  108661. "adds r5, r5, r5\n\t"
  108662. "adcs r6, r6, r6\n\t"
  108663. "adc r7, r7, r7\n\t"
  108664. "adds r2, r2, r5\n\t"
  108665. "adcs r3, r3, r6\n\t"
  108666. "adc r4, r4, r7\n\t"
  108667. "str r2, [sp, #36]\n\t"
  108668. /* A[0] * A[10] */
  108669. "ldr r10, [%[a], #40]\n\t"
  108670. "ldr r12, [%[a]]\n\t"
  108671. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  108672. "lsl r8, r10, #16\n\t"
  108673. "lsl r5, r12, #16\n\t"
  108674. "lsr r8, r8, #16\n\t"
  108675. "lsr r5, r5, #16\n\t"
  108676. "mul r5, r8, r5\n\t"
  108677. "lsr r9, r12, #16\n\t"
  108678. "mul r8, r9, r8\n\t"
  108679. "lsr r6, r8, #16\n\t"
  108680. "lsl r8, r8, #16\n\t"
  108681. "adds r5, r5, r8\n\t"
  108682. "adc r6, r6, #0\n\t"
  108683. "lsr r8, r10, #16\n\t"
  108684. "mul r9, r8, r9\n\t"
  108685. "add r6, r6, r9\n\t"
  108686. "lsl r9, r12, #16\n\t"
  108687. "lsr r9, r9, #16\n\t"
  108688. "mul r8, r9, r8\n\t"
  108689. "lsr r9, r8, #16\n\t"
  108690. "lsl r8, r8, #16\n\t"
  108691. "adds r5, r5, r8\n\t"
  108692. "adc r6, r6, r9\n\t"
  108693. #else
  108694. "umull r5, r6, r10, r12\n\t"
  108695. #endif
  108696. "mov r2, #0\n\t"
  108697. "mov r7, #0\n\t"
  108698. /* A[1] * A[9] */
  108699. "ldr r10, [%[a], #36]\n\t"
  108700. "ldr r12, [%[a], #4]\n\t"
  108701. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  108702. "lsl r8, r10, #16\n\t"
  108703. "lsl r9, r12, #16\n\t"
  108704. "lsr r8, r8, #16\n\t"
  108705. "lsr r9, r9, #16\n\t"
  108706. "mul r9, r8, r9\n\t"
  108707. "adds r5, r5, r9\n\t"
  108708. "adcs r6, r6, #0\n\t"
  108709. "adc r7, r7, #0\n\t"
  108710. "lsr r9, r12, #16\n\t"
  108711. "mul r8, r9, r8\n\t"
  108712. "lsr r9, r8, #16\n\t"
  108713. "lsl r8, r8, #16\n\t"
  108714. "adds r5, r5, r8\n\t"
  108715. "adcs r6, r6, r9\n\t"
  108716. "adc r7, r7, #0\n\t"
  108717. "lsr r8, r10, #16\n\t"
  108718. "lsr r9, r12, #16\n\t"
  108719. "mul r9, r8, r9\n\t"
  108720. "adds r6, r6, r9\n\t"
  108721. "adc r7, r7, #0\n\t"
  108722. "lsl r9, r12, #16\n\t"
  108723. "lsr r9, r9, #16\n\t"
  108724. "mul r8, r9, r8\n\t"
  108725. "lsr r9, r8, #16\n\t"
  108726. "lsl r8, r8, #16\n\t"
  108727. "adds r5, r5, r8\n\t"
  108728. "adcs r6, r6, r9\n\t"
  108729. "adc r7, r7, #0\n\t"
  108730. #else
  108731. "umull r8, r9, r10, r12\n\t"
  108732. "adds r5, r5, r8\n\t"
  108733. "adcs r6, r6, r9\n\t"
  108734. "adc r7, r7, #0\n\t"
  108735. #endif
  108736. /* A[2] * A[8] */
  108737. "ldr r10, [%[a], #32]\n\t"
  108738. "ldr r12, [%[a], #8]\n\t"
  108739. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  108740. "lsl r8, r10, #16\n\t"
  108741. "lsl r9, r12, #16\n\t"
  108742. "lsr r8, r8, #16\n\t"
  108743. "lsr r9, r9, #16\n\t"
  108744. "mul r9, r8, r9\n\t"
  108745. "adds r5, r5, r9\n\t"
  108746. "adcs r6, r6, #0\n\t"
  108747. "adc r7, r7, #0\n\t"
  108748. "lsr r9, r12, #16\n\t"
  108749. "mul r8, r9, r8\n\t"
  108750. "lsr r9, r8, #16\n\t"
  108751. "lsl r8, r8, #16\n\t"
  108752. "adds r5, r5, r8\n\t"
  108753. "adcs r6, r6, r9\n\t"
  108754. "adc r7, r7, #0\n\t"
  108755. "lsr r8, r10, #16\n\t"
  108756. "lsr r9, r12, #16\n\t"
  108757. "mul r9, r8, r9\n\t"
  108758. "adds r6, r6, r9\n\t"
  108759. "adc r7, r7, #0\n\t"
  108760. "lsl r9, r12, #16\n\t"
  108761. "lsr r9, r9, #16\n\t"
  108762. "mul r8, r9, r8\n\t"
  108763. "lsr r9, r8, #16\n\t"
  108764. "lsl r8, r8, #16\n\t"
  108765. "adds r5, r5, r8\n\t"
  108766. "adcs r6, r6, r9\n\t"
  108767. "adc r7, r7, #0\n\t"
  108768. #else
  108769. "umull r8, r9, r10, r12\n\t"
  108770. "adds r5, r5, r8\n\t"
  108771. "adcs r6, r6, r9\n\t"
  108772. "adc r7, r7, #0\n\t"
  108773. #endif
  108774. /* A[3] * A[7] */
  108775. "ldr r10, [%[a], #28]\n\t"
  108776. "ldr r12, [%[a], #12]\n\t"
  108777. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  108778. "lsl r8, r10, #16\n\t"
  108779. "lsl r9, r12, #16\n\t"
  108780. "lsr r8, r8, #16\n\t"
  108781. "lsr r9, r9, #16\n\t"
  108782. "mul r9, r8, r9\n\t"
  108783. "adds r5, r5, r9\n\t"
  108784. "adcs r6, r6, #0\n\t"
  108785. "adc r7, r7, #0\n\t"
  108786. "lsr r9, r12, #16\n\t"
  108787. "mul r8, r9, r8\n\t"
  108788. "lsr r9, r8, #16\n\t"
  108789. "lsl r8, r8, #16\n\t"
  108790. "adds r5, r5, r8\n\t"
  108791. "adcs r6, r6, r9\n\t"
  108792. "adc r7, r7, #0\n\t"
  108793. "lsr r8, r10, #16\n\t"
  108794. "lsr r9, r12, #16\n\t"
  108795. "mul r9, r8, r9\n\t"
  108796. "adds r6, r6, r9\n\t"
  108797. "adc r7, r7, #0\n\t"
  108798. "lsl r9, r12, #16\n\t"
  108799. "lsr r9, r9, #16\n\t"
  108800. "mul r8, r9, r8\n\t"
  108801. "lsr r9, r8, #16\n\t"
  108802. "lsl r8, r8, #16\n\t"
  108803. "adds r5, r5, r8\n\t"
  108804. "adcs r6, r6, r9\n\t"
  108805. "adc r7, r7, #0\n\t"
  108806. #else
  108807. "umull r8, r9, r10, r12\n\t"
  108808. "adds r5, r5, r8\n\t"
  108809. "adcs r6, r6, r9\n\t"
  108810. "adc r7, r7, #0\n\t"
  108811. #endif
  108812. /* A[4] * A[6] */
  108813. "ldr r10, [%[a], #24]\n\t"
  108814. "ldr r12, [%[a], #16]\n\t"
  108815. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  108816. "lsl r8, r10, #16\n\t"
  108817. "lsl r9, r12, #16\n\t"
  108818. "lsr r8, r8, #16\n\t"
  108819. "lsr r9, r9, #16\n\t"
  108820. "mul r9, r8, r9\n\t"
  108821. "adds r5, r5, r9\n\t"
  108822. "adcs r6, r6, #0\n\t"
  108823. "adc r7, r7, #0\n\t"
  108824. "lsr r9, r12, #16\n\t"
  108825. "mul r8, r9, r8\n\t"
  108826. "lsr r9, r8, #16\n\t"
  108827. "lsl r8, r8, #16\n\t"
  108828. "adds r5, r5, r8\n\t"
  108829. "adcs r6, r6, r9\n\t"
  108830. "adc r7, r7, #0\n\t"
  108831. "lsr r8, r10, #16\n\t"
  108832. "lsr r9, r12, #16\n\t"
  108833. "mul r9, r8, r9\n\t"
  108834. "adds r6, r6, r9\n\t"
  108835. "adc r7, r7, #0\n\t"
  108836. "lsl r9, r12, #16\n\t"
  108837. "lsr r9, r9, #16\n\t"
  108838. "mul r8, r9, r8\n\t"
  108839. "lsr r9, r8, #16\n\t"
  108840. "lsl r8, r8, #16\n\t"
  108841. "adds r5, r5, r8\n\t"
  108842. "adcs r6, r6, r9\n\t"
  108843. "adc r7, r7, #0\n\t"
  108844. #else
  108845. "umull r8, r9, r10, r12\n\t"
  108846. "adds r5, r5, r8\n\t"
  108847. "adcs r6, r6, r9\n\t"
  108848. "adc r7, r7, #0\n\t"
  108849. #endif
  108850. /* A[5] * A[5] */
  108851. "ldr r10, [%[a], #20]\n\t"
  108852. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  108853. "lsl r8, r10, #16\n\t"
  108854. "lsr r9, r10, #16\n\t"
  108855. "lsr r8, r8, #16\n\t"
  108856. "mov r12, r8\n\t"
  108857. "mul r8, r12, r8\n\t"
  108858. "mov r12, r9\n\t"
  108859. "mul r9, r12, r9\n\t"
  108860. "adds r3, r3, r8\n\t"
  108861. "adcs r4, r4, r9\n\t"
  108862. "adc r2, r2, #0\n\t"
  108863. "lsr r9, r10, #16\n\t"
  108864. "lsl r8, r10, #16\n\t"
  108865. "lsr r8, r8, #16\n\t"
  108866. "mul r8, r9, r8\n\t"
  108867. "lsr r9, r8, #15\n\t"
  108868. "lsl r8, r8, #17\n\t"
  108869. "adds r3, r3, r8\n\t"
  108870. "adcs r4, r4, r9\n\t"
  108871. "adc r2, r2, #0\n\t"
  108872. "adds r5, r5, r5\n\t"
  108873. "adcs r6, r6, r6\n\t"
  108874. "adc r7, r7, r7\n\t"
  108875. #else
  108876. "umull r8, r9, r10, r10\n\t"
  108877. "adds r5, r5, r5\n\t"
  108878. "adcs r6, r6, r6\n\t"
  108879. "adc r7, r7, r7\n\t"
  108880. "adds r3, r3, r8\n\t"
  108881. "adcs r4, r4, r9\n\t"
  108882. "adc r2, r2, #0\n\t"
  108883. #endif
  108884. "adds r3, r3, r5\n\t"
  108885. "adcs r4, r4, r6\n\t"
  108886. "adc r2, r2, r7\n\t"
  108887. "str r3, [sp, #40]\n\t"
  108888. /* A[0] * A[11] */
  108889. "ldr r10, [%[a], #44]\n\t"
  108890. "ldr r12, [%[a]]\n\t"
  108891. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  108892. "lsl r8, r10, #16\n\t"
  108893. "lsl r5, r12, #16\n\t"
  108894. "lsr r8, r8, #16\n\t"
  108895. "lsr r5, r5, #16\n\t"
  108896. "mul r5, r8, r5\n\t"
  108897. "lsr r9, r12, #16\n\t"
  108898. "mul r8, r9, r8\n\t"
  108899. "lsr r6, r8, #16\n\t"
  108900. "lsl r8, r8, #16\n\t"
  108901. "adds r5, r5, r8\n\t"
  108902. "adc r6, r6, #0\n\t"
  108903. "lsr r8, r10, #16\n\t"
  108904. "mul r9, r8, r9\n\t"
  108905. "add r6, r6, r9\n\t"
  108906. "lsl r9, r12, #16\n\t"
  108907. "lsr r9, r9, #16\n\t"
  108908. "mul r8, r9, r8\n\t"
  108909. "lsr r9, r8, #16\n\t"
  108910. "lsl r8, r8, #16\n\t"
  108911. "adds r5, r5, r8\n\t"
  108912. "adc r6, r6, r9\n\t"
  108913. #else
  108914. "umull r5, r6, r10, r12\n\t"
  108915. #endif
  108916. "mov r3, #0\n\t"
  108917. "mov r7, #0\n\t"
  108918. /* A[1] * A[10] */
  108919. "ldr r10, [%[a], #40]\n\t"
  108920. "ldr r12, [%[a], #4]\n\t"
  108921. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  108922. "lsl r8, r10, #16\n\t"
  108923. "lsl r9, r12, #16\n\t"
  108924. "lsr r8, r8, #16\n\t"
  108925. "lsr r9, r9, #16\n\t"
  108926. "mul r9, r8, r9\n\t"
  108927. "adds r5, r5, r9\n\t"
  108928. "adcs r6, r6, #0\n\t"
  108929. "adc r7, r7, #0\n\t"
  108930. "lsr r9, r12, #16\n\t"
  108931. "mul r8, r9, r8\n\t"
  108932. "lsr r9, r8, #16\n\t"
  108933. "lsl r8, r8, #16\n\t"
  108934. "adds r5, r5, r8\n\t"
  108935. "adcs r6, r6, r9\n\t"
  108936. "adc r7, r7, #0\n\t"
  108937. "lsr r8, r10, #16\n\t"
  108938. "lsr r9, r12, #16\n\t"
  108939. "mul r9, r8, r9\n\t"
  108940. "adds r6, r6, r9\n\t"
  108941. "adc r7, r7, #0\n\t"
  108942. "lsl r9, r12, #16\n\t"
  108943. "lsr r9, r9, #16\n\t"
  108944. "mul r8, r9, r8\n\t"
  108945. "lsr r9, r8, #16\n\t"
  108946. "lsl r8, r8, #16\n\t"
  108947. "adds r5, r5, r8\n\t"
  108948. "adcs r6, r6, r9\n\t"
  108949. "adc r7, r7, #0\n\t"
  108950. #else
  108951. "umull r8, r9, r10, r12\n\t"
  108952. "adds r5, r5, r8\n\t"
  108953. "adcs r6, r6, r9\n\t"
  108954. "adc r7, r7, #0\n\t"
  108955. #endif
  108956. /* A[2] * A[9] */
  108957. "ldr r10, [%[a], #36]\n\t"
  108958. "ldr r12, [%[a], #8]\n\t"
  108959. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  108960. "lsl r8, r10, #16\n\t"
  108961. "lsl r9, r12, #16\n\t"
  108962. "lsr r8, r8, #16\n\t"
  108963. "lsr r9, r9, #16\n\t"
  108964. "mul r9, r8, r9\n\t"
  108965. "adds r5, r5, r9\n\t"
  108966. "adcs r6, r6, #0\n\t"
  108967. "adc r7, r7, #0\n\t"
  108968. "lsr r9, r12, #16\n\t"
  108969. "mul r8, r9, r8\n\t"
  108970. "lsr r9, r8, #16\n\t"
  108971. "lsl r8, r8, #16\n\t"
  108972. "adds r5, r5, r8\n\t"
  108973. "adcs r6, r6, r9\n\t"
  108974. "adc r7, r7, #0\n\t"
  108975. "lsr r8, r10, #16\n\t"
  108976. "lsr r9, r12, #16\n\t"
  108977. "mul r9, r8, r9\n\t"
  108978. "adds r6, r6, r9\n\t"
  108979. "adc r7, r7, #0\n\t"
  108980. "lsl r9, r12, #16\n\t"
  108981. "lsr r9, r9, #16\n\t"
  108982. "mul r8, r9, r8\n\t"
  108983. "lsr r9, r8, #16\n\t"
  108984. "lsl r8, r8, #16\n\t"
  108985. "adds r5, r5, r8\n\t"
  108986. "adcs r6, r6, r9\n\t"
  108987. "adc r7, r7, #0\n\t"
  108988. #else
  108989. "umull r8, r9, r10, r12\n\t"
  108990. "adds r5, r5, r8\n\t"
  108991. "adcs r6, r6, r9\n\t"
  108992. "adc r7, r7, #0\n\t"
  108993. #endif
  108994. /* A[3] * A[8] */
  108995. "ldr r10, [%[a], #32]\n\t"
  108996. "ldr r12, [%[a], #12]\n\t"
  108997. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  108998. "lsl r8, r10, #16\n\t"
  108999. "lsl r9, r12, #16\n\t"
  109000. "lsr r8, r8, #16\n\t"
  109001. "lsr r9, r9, #16\n\t"
  109002. "mul r9, r8, r9\n\t"
  109003. "adds r5, r5, r9\n\t"
  109004. "adcs r6, r6, #0\n\t"
  109005. "adc r7, r7, #0\n\t"
  109006. "lsr r9, r12, #16\n\t"
  109007. "mul r8, r9, r8\n\t"
  109008. "lsr r9, r8, #16\n\t"
  109009. "lsl r8, r8, #16\n\t"
  109010. "adds r5, r5, r8\n\t"
  109011. "adcs r6, r6, r9\n\t"
  109012. "adc r7, r7, #0\n\t"
  109013. "lsr r8, r10, #16\n\t"
  109014. "lsr r9, r12, #16\n\t"
  109015. "mul r9, r8, r9\n\t"
  109016. "adds r6, r6, r9\n\t"
  109017. "adc r7, r7, #0\n\t"
  109018. "lsl r9, r12, #16\n\t"
  109019. "lsr r9, r9, #16\n\t"
  109020. "mul r8, r9, r8\n\t"
  109021. "lsr r9, r8, #16\n\t"
  109022. "lsl r8, r8, #16\n\t"
  109023. "adds r5, r5, r8\n\t"
  109024. "adcs r6, r6, r9\n\t"
  109025. "adc r7, r7, #0\n\t"
  109026. #else
  109027. "umull r8, r9, r10, r12\n\t"
  109028. "adds r5, r5, r8\n\t"
  109029. "adcs r6, r6, r9\n\t"
  109030. "adc r7, r7, #0\n\t"
  109031. #endif
  109032. /* A[4] * A[7] */
  109033. "ldr r10, [%[a], #28]\n\t"
  109034. "ldr r12, [%[a], #16]\n\t"
  109035. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  109036. "lsl r8, r10, #16\n\t"
  109037. "lsl r9, r12, #16\n\t"
  109038. "lsr r8, r8, #16\n\t"
  109039. "lsr r9, r9, #16\n\t"
  109040. "mul r9, r8, r9\n\t"
  109041. "adds r5, r5, r9\n\t"
  109042. "adcs r6, r6, #0\n\t"
  109043. "adc r7, r7, #0\n\t"
  109044. "lsr r9, r12, #16\n\t"
  109045. "mul r8, r9, r8\n\t"
  109046. "lsr r9, r8, #16\n\t"
  109047. "lsl r8, r8, #16\n\t"
  109048. "adds r5, r5, r8\n\t"
  109049. "adcs r6, r6, r9\n\t"
  109050. "adc r7, r7, #0\n\t"
  109051. "lsr r8, r10, #16\n\t"
  109052. "lsr r9, r12, #16\n\t"
  109053. "mul r9, r8, r9\n\t"
  109054. "adds r6, r6, r9\n\t"
  109055. "adc r7, r7, #0\n\t"
  109056. "lsl r9, r12, #16\n\t"
  109057. "lsr r9, r9, #16\n\t"
  109058. "mul r8, r9, r8\n\t"
  109059. "lsr r9, r8, #16\n\t"
  109060. "lsl r8, r8, #16\n\t"
  109061. "adds r5, r5, r8\n\t"
  109062. "adcs r6, r6, r9\n\t"
  109063. "adc r7, r7, #0\n\t"
  109064. #else
  109065. "umull r8, r9, r10, r12\n\t"
  109066. "adds r5, r5, r8\n\t"
  109067. "adcs r6, r6, r9\n\t"
  109068. "adc r7, r7, #0\n\t"
  109069. #endif
  109070. /* A[5] * A[6] */
  109071. "ldr r10, [%[a], #24]\n\t"
  109072. "ldr r12, [%[a], #20]\n\t"
  109073. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  109074. "lsl r8, r10, #16\n\t"
  109075. "lsl r9, r12, #16\n\t"
  109076. "lsr r8, r8, #16\n\t"
  109077. "lsr r9, r9, #16\n\t"
  109078. "mul r9, r8, r9\n\t"
  109079. "adds r5, r5, r9\n\t"
  109080. "adcs r6, r6, #0\n\t"
  109081. "adc r7, r7, #0\n\t"
  109082. "lsr r9, r12, #16\n\t"
  109083. "mul r8, r9, r8\n\t"
  109084. "lsr r9, r8, #16\n\t"
  109085. "lsl r8, r8, #16\n\t"
  109086. "adds r5, r5, r8\n\t"
  109087. "adcs r6, r6, r9\n\t"
  109088. "adc r7, r7, #0\n\t"
  109089. "lsr r8, r10, #16\n\t"
  109090. "lsr r9, r12, #16\n\t"
  109091. "mul r9, r8, r9\n\t"
  109092. "adds r6, r6, r9\n\t"
  109093. "adc r7, r7, #0\n\t"
  109094. "lsl r9, r12, #16\n\t"
  109095. "lsr r9, r9, #16\n\t"
  109096. "mul r8, r9, r8\n\t"
  109097. "lsr r9, r8, #16\n\t"
  109098. "lsl r8, r8, #16\n\t"
  109099. "adds r5, r5, r8\n\t"
  109100. "adcs r6, r6, r9\n\t"
  109101. "adc r7, r7, #0\n\t"
  109102. #else
  109103. "umull r8, r9, r10, r12\n\t"
  109104. "adds r5, r5, r8\n\t"
  109105. "adcs r6, r6, r9\n\t"
  109106. "adc r7, r7, #0\n\t"
  109107. #endif
  109108. "adds r5, r5, r5\n\t"
  109109. "adcs r6, r6, r6\n\t"
  109110. "adc r7, r7, r7\n\t"
  109111. "adds r4, r4, r5\n\t"
  109112. "adcs r2, r2, r6\n\t"
  109113. "adc r3, r3, r7\n\t"
  109114. "str r4, [sp, #44]\n\t"
  109115. /* A[0] * A[12] */
  109116. "ldr r10, [%[a], #48]\n\t"
  109117. "ldr r12, [%[a]]\n\t"
  109118. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  109119. "lsl r8, r10, #16\n\t"
  109120. "lsl r5, r12, #16\n\t"
  109121. "lsr r8, r8, #16\n\t"
  109122. "lsr r5, r5, #16\n\t"
  109123. "mul r5, r8, r5\n\t"
  109124. "lsr r9, r12, #16\n\t"
  109125. "mul r8, r9, r8\n\t"
  109126. "lsr r6, r8, #16\n\t"
  109127. "lsl r8, r8, #16\n\t"
  109128. "adds r5, r5, r8\n\t"
  109129. "adc r6, r6, #0\n\t"
  109130. "lsr r8, r10, #16\n\t"
  109131. "mul r9, r8, r9\n\t"
  109132. "add r6, r6, r9\n\t"
  109133. "lsl r9, r12, #16\n\t"
  109134. "lsr r9, r9, #16\n\t"
  109135. "mul r8, r9, r8\n\t"
  109136. "lsr r9, r8, #16\n\t"
  109137. "lsl r8, r8, #16\n\t"
  109138. "adds r5, r5, r8\n\t"
  109139. "adc r6, r6, r9\n\t"
  109140. #else
  109141. "umull r5, r6, r10, r12\n\t"
  109142. #endif
  109143. "mov r4, #0\n\t"
  109144. "mov r7, #0\n\t"
  109145. /* A[1] * A[11] */
  109146. "ldr r10, [%[a], #44]\n\t"
  109147. "ldr r12, [%[a], #4]\n\t"
  109148. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  109149. "lsl r8, r10, #16\n\t"
  109150. "lsl r9, r12, #16\n\t"
  109151. "lsr r8, r8, #16\n\t"
  109152. "lsr r9, r9, #16\n\t"
  109153. "mul r9, r8, r9\n\t"
  109154. "adds r5, r5, r9\n\t"
  109155. "adcs r6, r6, #0\n\t"
  109156. "adc r7, r7, #0\n\t"
  109157. "lsr r9, r12, #16\n\t"
  109158. "mul r8, r9, r8\n\t"
  109159. "lsr r9, r8, #16\n\t"
  109160. "lsl r8, r8, #16\n\t"
  109161. "adds r5, r5, r8\n\t"
  109162. "adcs r6, r6, r9\n\t"
  109163. "adc r7, r7, #0\n\t"
  109164. "lsr r8, r10, #16\n\t"
  109165. "lsr r9, r12, #16\n\t"
  109166. "mul r9, r8, r9\n\t"
  109167. "adds r6, r6, r9\n\t"
  109168. "adc r7, r7, #0\n\t"
  109169. "lsl r9, r12, #16\n\t"
  109170. "lsr r9, r9, #16\n\t"
  109171. "mul r8, r9, r8\n\t"
  109172. "lsr r9, r8, #16\n\t"
  109173. "lsl r8, r8, #16\n\t"
  109174. "adds r5, r5, r8\n\t"
  109175. "adcs r6, r6, r9\n\t"
  109176. "adc r7, r7, #0\n\t"
  109177. #else
  109178. "umull r8, r9, r10, r12\n\t"
  109179. "adds r5, r5, r8\n\t"
  109180. "adcs r6, r6, r9\n\t"
  109181. "adc r7, r7, #0\n\t"
  109182. #endif
  109183. /* A[2] * A[10] */
  109184. "ldr r10, [%[a], #40]\n\t"
  109185. "ldr r12, [%[a], #8]\n\t"
  109186. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  109187. "lsl r8, r10, #16\n\t"
  109188. "lsl r9, r12, #16\n\t"
  109189. "lsr r8, r8, #16\n\t"
  109190. "lsr r9, r9, #16\n\t"
  109191. "mul r9, r8, r9\n\t"
  109192. "adds r5, r5, r9\n\t"
  109193. "adcs r6, r6, #0\n\t"
  109194. "adc r7, r7, #0\n\t"
  109195. "lsr r9, r12, #16\n\t"
  109196. "mul r8, r9, r8\n\t"
  109197. "lsr r9, r8, #16\n\t"
  109198. "lsl r8, r8, #16\n\t"
  109199. "adds r5, r5, r8\n\t"
  109200. "adcs r6, r6, r9\n\t"
  109201. "adc r7, r7, #0\n\t"
  109202. "lsr r8, r10, #16\n\t"
  109203. "lsr r9, r12, #16\n\t"
  109204. "mul r9, r8, r9\n\t"
  109205. "adds r6, r6, r9\n\t"
  109206. "adc r7, r7, #0\n\t"
  109207. "lsl r9, r12, #16\n\t"
  109208. "lsr r9, r9, #16\n\t"
  109209. "mul r8, r9, r8\n\t"
  109210. "lsr r9, r8, #16\n\t"
  109211. "lsl r8, r8, #16\n\t"
  109212. "adds r5, r5, r8\n\t"
  109213. "adcs r6, r6, r9\n\t"
  109214. "adc r7, r7, #0\n\t"
  109215. #else
  109216. "umull r8, r9, r10, r12\n\t"
  109217. "adds r5, r5, r8\n\t"
  109218. "adcs r6, r6, r9\n\t"
  109219. "adc r7, r7, #0\n\t"
  109220. #endif
  109221. /* A[3] * A[9] */
  109222. "ldr r10, [%[a], #36]\n\t"
  109223. "ldr r12, [%[a], #12]\n\t"
  109224. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  109225. "lsl r8, r10, #16\n\t"
  109226. "lsl r9, r12, #16\n\t"
  109227. "lsr r8, r8, #16\n\t"
  109228. "lsr r9, r9, #16\n\t"
  109229. "mul r9, r8, r9\n\t"
  109230. "adds r5, r5, r9\n\t"
  109231. "adcs r6, r6, #0\n\t"
  109232. "adc r7, r7, #0\n\t"
  109233. "lsr r9, r12, #16\n\t"
  109234. "mul r8, r9, r8\n\t"
  109235. "lsr r9, r8, #16\n\t"
  109236. "lsl r8, r8, #16\n\t"
  109237. "adds r5, r5, r8\n\t"
  109238. "adcs r6, r6, r9\n\t"
  109239. "adc r7, r7, #0\n\t"
  109240. "lsr r8, r10, #16\n\t"
  109241. "lsr r9, r12, #16\n\t"
  109242. "mul r9, r8, r9\n\t"
  109243. "adds r6, r6, r9\n\t"
  109244. "adc r7, r7, #0\n\t"
  109245. "lsl r9, r12, #16\n\t"
  109246. "lsr r9, r9, #16\n\t"
  109247. "mul r8, r9, r8\n\t"
  109248. "lsr r9, r8, #16\n\t"
  109249. "lsl r8, r8, #16\n\t"
  109250. "adds r5, r5, r8\n\t"
  109251. "adcs r6, r6, r9\n\t"
  109252. "adc r7, r7, #0\n\t"
  109253. #else
  109254. "umull r8, r9, r10, r12\n\t"
  109255. "adds r5, r5, r8\n\t"
  109256. "adcs r6, r6, r9\n\t"
  109257. "adc r7, r7, #0\n\t"
  109258. #endif
  109259. /* A[4] * A[8] */
  109260. "ldr r10, [%[a], #32]\n\t"
  109261. "ldr r12, [%[a], #16]\n\t"
  109262. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  109263. "lsl r8, r10, #16\n\t"
  109264. "lsl r9, r12, #16\n\t"
  109265. "lsr r8, r8, #16\n\t"
  109266. "lsr r9, r9, #16\n\t"
  109267. "mul r9, r8, r9\n\t"
  109268. "adds r5, r5, r9\n\t"
  109269. "adcs r6, r6, #0\n\t"
  109270. "adc r7, r7, #0\n\t"
  109271. "lsr r9, r12, #16\n\t"
  109272. "mul r8, r9, r8\n\t"
  109273. "lsr r9, r8, #16\n\t"
  109274. "lsl r8, r8, #16\n\t"
  109275. "adds r5, r5, r8\n\t"
  109276. "adcs r6, r6, r9\n\t"
  109277. "adc r7, r7, #0\n\t"
  109278. "lsr r8, r10, #16\n\t"
  109279. "lsr r9, r12, #16\n\t"
  109280. "mul r9, r8, r9\n\t"
  109281. "adds r6, r6, r9\n\t"
  109282. "adc r7, r7, #0\n\t"
  109283. "lsl r9, r12, #16\n\t"
  109284. "lsr r9, r9, #16\n\t"
  109285. "mul r8, r9, r8\n\t"
  109286. "lsr r9, r8, #16\n\t"
  109287. "lsl r8, r8, #16\n\t"
  109288. "adds r5, r5, r8\n\t"
  109289. "adcs r6, r6, r9\n\t"
  109290. "adc r7, r7, #0\n\t"
  109291. #else
  109292. "umull r8, r9, r10, r12\n\t"
  109293. "adds r5, r5, r8\n\t"
  109294. "adcs r6, r6, r9\n\t"
  109295. "adc r7, r7, #0\n\t"
  109296. #endif
  109297. /* A[5] * A[7] */
  109298. "ldr r10, [%[a], #28]\n\t"
  109299. "ldr r12, [%[a], #20]\n\t"
  109300. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  109301. "lsl r8, r10, #16\n\t"
  109302. "lsl r9, r12, #16\n\t"
  109303. "lsr r8, r8, #16\n\t"
  109304. "lsr r9, r9, #16\n\t"
  109305. "mul r9, r8, r9\n\t"
  109306. "adds r5, r5, r9\n\t"
  109307. "adcs r6, r6, #0\n\t"
  109308. "adc r7, r7, #0\n\t"
  109309. "lsr r9, r12, #16\n\t"
  109310. "mul r8, r9, r8\n\t"
  109311. "lsr r9, r8, #16\n\t"
  109312. "lsl r8, r8, #16\n\t"
  109313. "adds r5, r5, r8\n\t"
  109314. "adcs r6, r6, r9\n\t"
  109315. "adc r7, r7, #0\n\t"
  109316. "lsr r8, r10, #16\n\t"
  109317. "lsr r9, r12, #16\n\t"
  109318. "mul r9, r8, r9\n\t"
  109319. "adds r6, r6, r9\n\t"
  109320. "adc r7, r7, #0\n\t"
  109321. "lsl r9, r12, #16\n\t"
  109322. "lsr r9, r9, #16\n\t"
  109323. "mul r8, r9, r8\n\t"
  109324. "lsr r9, r8, #16\n\t"
  109325. "lsl r8, r8, #16\n\t"
  109326. "adds r5, r5, r8\n\t"
  109327. "adcs r6, r6, r9\n\t"
  109328. "adc r7, r7, #0\n\t"
  109329. #else
  109330. "umull r8, r9, r10, r12\n\t"
  109331. "adds r5, r5, r8\n\t"
  109332. "adcs r6, r6, r9\n\t"
  109333. "adc r7, r7, #0\n\t"
  109334. #endif
  109335. /* A[6] * A[6] */
  109336. "ldr r10, [%[a], #24]\n\t"
  109337. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  109338. "lsl r8, r10, #16\n\t"
  109339. "lsr r9, r10, #16\n\t"
  109340. "lsr r8, r8, #16\n\t"
  109341. "mov r12, r8\n\t"
  109342. "mul r8, r12, r8\n\t"
  109343. "mov r12, r9\n\t"
  109344. "mul r9, r12, r9\n\t"
  109345. "adds r2, r2, r8\n\t"
  109346. "adcs r3, r3, r9\n\t"
  109347. "adc r4, r4, #0\n\t"
  109348. "lsr r9, r10, #16\n\t"
  109349. "lsl r8, r10, #16\n\t"
  109350. "lsr r8, r8, #16\n\t"
  109351. "mul r8, r9, r8\n\t"
  109352. "lsr r9, r8, #15\n\t"
  109353. "lsl r8, r8, #17\n\t"
  109354. "adds r2, r2, r8\n\t"
  109355. "adcs r3, r3, r9\n\t"
  109356. "adc r4, r4, #0\n\t"
  109357. "adds r5, r5, r5\n\t"
  109358. "adcs r6, r6, r6\n\t"
  109359. "adc r7, r7, r7\n\t"
  109360. #else
  109361. "umull r8, r9, r10, r10\n\t"
  109362. "adds r5, r5, r5\n\t"
  109363. "adcs r6, r6, r6\n\t"
  109364. "adc r7, r7, r7\n\t"
  109365. "adds r2, r2, r8\n\t"
  109366. "adcs r3, r3, r9\n\t"
  109367. "adc r4, r4, #0\n\t"
  109368. #endif
  109369. "adds r2, r2, r5\n\t"
  109370. "adcs r3, r3, r6\n\t"
  109371. "adc r4, r4, r7\n\t"
  109372. "str r2, [sp, #48]\n\t"
  109373. /* A[0] * A[13] */
  109374. "ldr r10, [%[a], #52]\n\t"
  109375. "ldr r12, [%[a]]\n\t"
  109376. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  109377. "lsl r8, r10, #16\n\t"
  109378. "lsl r5, r12, #16\n\t"
  109379. "lsr r8, r8, #16\n\t"
  109380. "lsr r5, r5, #16\n\t"
  109381. "mul r5, r8, r5\n\t"
  109382. "lsr r9, r12, #16\n\t"
  109383. "mul r8, r9, r8\n\t"
  109384. "lsr r6, r8, #16\n\t"
  109385. "lsl r8, r8, #16\n\t"
  109386. "adds r5, r5, r8\n\t"
  109387. "adc r6, r6, #0\n\t"
  109388. "lsr r8, r10, #16\n\t"
  109389. "mul r9, r8, r9\n\t"
  109390. "add r6, r6, r9\n\t"
  109391. "lsl r9, r12, #16\n\t"
  109392. "lsr r9, r9, #16\n\t"
  109393. "mul r8, r9, r8\n\t"
  109394. "lsr r9, r8, #16\n\t"
  109395. "lsl r8, r8, #16\n\t"
  109396. "adds r5, r5, r8\n\t"
  109397. "adc r6, r6, r9\n\t"
  109398. #else
  109399. "umull r5, r6, r10, r12\n\t"
  109400. #endif
  109401. "mov r2, #0\n\t"
  109402. "mov r7, #0\n\t"
  109403. /* A[1] * A[12] */
  109404. "ldr r10, [%[a], #48]\n\t"
  109405. "ldr r12, [%[a], #4]\n\t"
  109406. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  109407. "lsl r8, r10, #16\n\t"
  109408. "lsl r9, r12, #16\n\t"
  109409. "lsr r8, r8, #16\n\t"
  109410. "lsr r9, r9, #16\n\t"
  109411. "mul r9, r8, r9\n\t"
  109412. "adds r5, r5, r9\n\t"
  109413. "adcs r6, r6, #0\n\t"
  109414. "adc r7, r7, #0\n\t"
  109415. "lsr r9, r12, #16\n\t"
  109416. "mul r8, r9, r8\n\t"
  109417. "lsr r9, r8, #16\n\t"
  109418. "lsl r8, r8, #16\n\t"
  109419. "adds r5, r5, r8\n\t"
  109420. "adcs r6, r6, r9\n\t"
  109421. "adc r7, r7, #0\n\t"
  109422. "lsr r8, r10, #16\n\t"
  109423. "lsr r9, r12, #16\n\t"
  109424. "mul r9, r8, r9\n\t"
  109425. "adds r6, r6, r9\n\t"
  109426. "adc r7, r7, #0\n\t"
  109427. "lsl r9, r12, #16\n\t"
  109428. "lsr r9, r9, #16\n\t"
  109429. "mul r8, r9, r8\n\t"
  109430. "lsr r9, r8, #16\n\t"
  109431. "lsl r8, r8, #16\n\t"
  109432. "adds r5, r5, r8\n\t"
  109433. "adcs r6, r6, r9\n\t"
  109434. "adc r7, r7, #0\n\t"
  109435. #else
  109436. "umull r8, r9, r10, r12\n\t"
  109437. "adds r5, r5, r8\n\t"
  109438. "adcs r6, r6, r9\n\t"
  109439. "adc r7, r7, #0\n\t"
  109440. #endif
  109441. /* A[2] * A[11] */
  109442. "ldr r10, [%[a], #44]\n\t"
  109443. "ldr r12, [%[a], #8]\n\t"
  109444. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  109445. "lsl r8, r10, #16\n\t"
  109446. "lsl r9, r12, #16\n\t"
  109447. "lsr r8, r8, #16\n\t"
  109448. "lsr r9, r9, #16\n\t"
  109449. "mul r9, r8, r9\n\t"
  109450. "adds r5, r5, r9\n\t"
  109451. "adcs r6, r6, #0\n\t"
  109452. "adc r7, r7, #0\n\t"
  109453. "lsr r9, r12, #16\n\t"
  109454. "mul r8, r9, r8\n\t"
  109455. "lsr r9, r8, #16\n\t"
  109456. "lsl r8, r8, #16\n\t"
  109457. "adds r5, r5, r8\n\t"
  109458. "adcs r6, r6, r9\n\t"
  109459. "adc r7, r7, #0\n\t"
  109460. "lsr r8, r10, #16\n\t"
  109461. "lsr r9, r12, #16\n\t"
  109462. "mul r9, r8, r9\n\t"
  109463. "adds r6, r6, r9\n\t"
  109464. "adc r7, r7, #0\n\t"
  109465. "lsl r9, r12, #16\n\t"
  109466. "lsr r9, r9, #16\n\t"
  109467. "mul r8, r9, r8\n\t"
  109468. "lsr r9, r8, #16\n\t"
  109469. "lsl r8, r8, #16\n\t"
  109470. "adds r5, r5, r8\n\t"
  109471. "adcs r6, r6, r9\n\t"
  109472. "adc r7, r7, #0\n\t"
  109473. #else
  109474. "umull r8, r9, r10, r12\n\t"
  109475. "adds r5, r5, r8\n\t"
  109476. "adcs r6, r6, r9\n\t"
  109477. "adc r7, r7, #0\n\t"
  109478. #endif
  109479. /* A[3] * A[10] */
  109480. "ldr r10, [%[a], #40]\n\t"
  109481. "ldr r12, [%[a], #12]\n\t"
  109482. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  109483. "lsl r8, r10, #16\n\t"
  109484. "lsl r9, r12, #16\n\t"
  109485. "lsr r8, r8, #16\n\t"
  109486. "lsr r9, r9, #16\n\t"
  109487. "mul r9, r8, r9\n\t"
  109488. "adds r5, r5, r9\n\t"
  109489. "adcs r6, r6, #0\n\t"
  109490. "adc r7, r7, #0\n\t"
  109491. "lsr r9, r12, #16\n\t"
  109492. "mul r8, r9, r8\n\t"
  109493. "lsr r9, r8, #16\n\t"
  109494. "lsl r8, r8, #16\n\t"
  109495. "adds r5, r5, r8\n\t"
  109496. "adcs r6, r6, r9\n\t"
  109497. "adc r7, r7, #0\n\t"
  109498. "lsr r8, r10, #16\n\t"
  109499. "lsr r9, r12, #16\n\t"
  109500. "mul r9, r8, r9\n\t"
  109501. "adds r6, r6, r9\n\t"
  109502. "adc r7, r7, #0\n\t"
  109503. "lsl r9, r12, #16\n\t"
  109504. "lsr r9, r9, #16\n\t"
  109505. "mul r8, r9, r8\n\t"
  109506. "lsr r9, r8, #16\n\t"
  109507. "lsl r8, r8, #16\n\t"
  109508. "adds r5, r5, r8\n\t"
  109509. "adcs r6, r6, r9\n\t"
  109510. "adc r7, r7, #0\n\t"
  109511. #else
  109512. "umull r8, r9, r10, r12\n\t"
  109513. "adds r5, r5, r8\n\t"
  109514. "adcs r6, r6, r9\n\t"
  109515. "adc r7, r7, #0\n\t"
  109516. #endif
  109517. /* A[4] * A[9] */
  109518. "ldr r10, [%[a], #36]\n\t"
  109519. "ldr r12, [%[a], #16]\n\t"
  109520. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  109521. "lsl r8, r10, #16\n\t"
  109522. "lsl r9, r12, #16\n\t"
  109523. "lsr r8, r8, #16\n\t"
  109524. "lsr r9, r9, #16\n\t"
  109525. "mul r9, r8, r9\n\t"
  109526. "adds r5, r5, r9\n\t"
  109527. "adcs r6, r6, #0\n\t"
  109528. "adc r7, r7, #0\n\t"
  109529. "lsr r9, r12, #16\n\t"
  109530. "mul r8, r9, r8\n\t"
  109531. "lsr r9, r8, #16\n\t"
  109532. "lsl r8, r8, #16\n\t"
  109533. "adds r5, r5, r8\n\t"
  109534. "adcs r6, r6, r9\n\t"
  109535. "adc r7, r7, #0\n\t"
  109536. "lsr r8, r10, #16\n\t"
  109537. "lsr r9, r12, #16\n\t"
  109538. "mul r9, r8, r9\n\t"
  109539. "adds r6, r6, r9\n\t"
  109540. "adc r7, r7, #0\n\t"
  109541. "lsl r9, r12, #16\n\t"
  109542. "lsr r9, r9, #16\n\t"
  109543. "mul r8, r9, r8\n\t"
  109544. "lsr r9, r8, #16\n\t"
  109545. "lsl r8, r8, #16\n\t"
  109546. "adds r5, r5, r8\n\t"
  109547. "adcs r6, r6, r9\n\t"
  109548. "adc r7, r7, #0\n\t"
  109549. #else
  109550. "umull r8, r9, r10, r12\n\t"
  109551. "adds r5, r5, r8\n\t"
  109552. "adcs r6, r6, r9\n\t"
  109553. "adc r7, r7, #0\n\t"
  109554. #endif
  109555. /* A[5] * A[8] */
  109556. "ldr r10, [%[a], #32]\n\t"
  109557. "ldr r12, [%[a], #20]\n\t"
  109558. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  109559. "lsl r8, r10, #16\n\t"
  109560. "lsl r9, r12, #16\n\t"
  109561. "lsr r8, r8, #16\n\t"
  109562. "lsr r9, r9, #16\n\t"
  109563. "mul r9, r8, r9\n\t"
  109564. "adds r5, r5, r9\n\t"
  109565. "adcs r6, r6, #0\n\t"
  109566. "adc r7, r7, #0\n\t"
  109567. "lsr r9, r12, #16\n\t"
  109568. "mul r8, r9, r8\n\t"
  109569. "lsr r9, r8, #16\n\t"
  109570. "lsl r8, r8, #16\n\t"
  109571. "adds r5, r5, r8\n\t"
  109572. "adcs r6, r6, r9\n\t"
  109573. "adc r7, r7, #0\n\t"
  109574. "lsr r8, r10, #16\n\t"
  109575. "lsr r9, r12, #16\n\t"
  109576. "mul r9, r8, r9\n\t"
  109577. "adds r6, r6, r9\n\t"
  109578. "adc r7, r7, #0\n\t"
  109579. "lsl r9, r12, #16\n\t"
  109580. "lsr r9, r9, #16\n\t"
  109581. "mul r8, r9, r8\n\t"
  109582. "lsr r9, r8, #16\n\t"
  109583. "lsl r8, r8, #16\n\t"
  109584. "adds r5, r5, r8\n\t"
  109585. "adcs r6, r6, r9\n\t"
  109586. "adc r7, r7, #0\n\t"
  109587. #else
  109588. "umull r8, r9, r10, r12\n\t"
  109589. "adds r5, r5, r8\n\t"
  109590. "adcs r6, r6, r9\n\t"
  109591. "adc r7, r7, #0\n\t"
  109592. #endif
  109593. /* A[6] * A[7] */
  109594. "ldr r10, [%[a], #28]\n\t"
  109595. "ldr r12, [%[a], #24]\n\t"
  109596. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  109597. "lsl r8, r10, #16\n\t"
  109598. "lsl r9, r12, #16\n\t"
  109599. "lsr r8, r8, #16\n\t"
  109600. "lsr r9, r9, #16\n\t"
  109601. "mul r9, r8, r9\n\t"
  109602. "adds r5, r5, r9\n\t"
  109603. "adcs r6, r6, #0\n\t"
  109604. "adc r7, r7, #0\n\t"
  109605. "lsr r9, r12, #16\n\t"
  109606. "mul r8, r9, r8\n\t"
  109607. "lsr r9, r8, #16\n\t"
  109608. "lsl r8, r8, #16\n\t"
  109609. "adds r5, r5, r8\n\t"
  109610. "adcs r6, r6, r9\n\t"
  109611. "adc r7, r7, #0\n\t"
  109612. "lsr r8, r10, #16\n\t"
  109613. "lsr r9, r12, #16\n\t"
  109614. "mul r9, r8, r9\n\t"
  109615. "adds r6, r6, r9\n\t"
  109616. "adc r7, r7, #0\n\t"
  109617. "lsl r9, r12, #16\n\t"
  109618. "lsr r9, r9, #16\n\t"
  109619. "mul r8, r9, r8\n\t"
  109620. "lsr r9, r8, #16\n\t"
  109621. "lsl r8, r8, #16\n\t"
  109622. "adds r5, r5, r8\n\t"
  109623. "adcs r6, r6, r9\n\t"
  109624. "adc r7, r7, #0\n\t"
  109625. #else
  109626. "umull r8, r9, r10, r12\n\t"
  109627. "adds r5, r5, r8\n\t"
  109628. "adcs r6, r6, r9\n\t"
  109629. "adc r7, r7, #0\n\t"
  109630. #endif
  109631. "adds r5, r5, r5\n\t"
  109632. "adcs r6, r6, r6\n\t"
  109633. "adc r7, r7, r7\n\t"
  109634. "adds r3, r3, r5\n\t"
  109635. "adcs r4, r4, r6\n\t"
  109636. "adc r2, r2, r7\n\t"
  109637. "str r3, [sp, #52]\n\t"
  109638. /* A[0] * A[14] */
  109639. "ldr r10, [%[a], #56]\n\t"
  109640. "ldr r12, [%[a]]\n\t"
  109641. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  109642. "lsl r8, r10, #16\n\t"
  109643. "lsl r5, r12, #16\n\t"
  109644. "lsr r8, r8, #16\n\t"
  109645. "lsr r5, r5, #16\n\t"
  109646. "mul r5, r8, r5\n\t"
  109647. "lsr r9, r12, #16\n\t"
  109648. "mul r8, r9, r8\n\t"
  109649. "lsr r6, r8, #16\n\t"
  109650. "lsl r8, r8, #16\n\t"
  109651. "adds r5, r5, r8\n\t"
  109652. "adc r6, r6, #0\n\t"
  109653. "lsr r8, r10, #16\n\t"
  109654. "mul r9, r8, r9\n\t"
  109655. "add r6, r6, r9\n\t"
  109656. "lsl r9, r12, #16\n\t"
  109657. "lsr r9, r9, #16\n\t"
  109658. "mul r8, r9, r8\n\t"
  109659. "lsr r9, r8, #16\n\t"
  109660. "lsl r8, r8, #16\n\t"
  109661. "adds r5, r5, r8\n\t"
  109662. "adc r6, r6, r9\n\t"
  109663. #else
  109664. "umull r5, r6, r10, r12\n\t"
  109665. #endif
  109666. "mov r3, #0\n\t"
  109667. "mov r7, #0\n\t"
  109668. /* A[1] * A[13] */
  109669. "ldr r10, [%[a], #52]\n\t"
  109670. "ldr r12, [%[a], #4]\n\t"
  109671. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  109672. "lsl r8, r10, #16\n\t"
  109673. "lsl r9, r12, #16\n\t"
  109674. "lsr r8, r8, #16\n\t"
  109675. "lsr r9, r9, #16\n\t"
  109676. "mul r9, r8, r9\n\t"
  109677. "adds r5, r5, r9\n\t"
  109678. "adcs r6, r6, #0\n\t"
  109679. "adc r7, r7, #0\n\t"
  109680. "lsr r9, r12, #16\n\t"
  109681. "mul r8, r9, r8\n\t"
  109682. "lsr r9, r8, #16\n\t"
  109683. "lsl r8, r8, #16\n\t"
  109684. "adds r5, r5, r8\n\t"
  109685. "adcs r6, r6, r9\n\t"
  109686. "adc r7, r7, #0\n\t"
  109687. "lsr r8, r10, #16\n\t"
  109688. "lsr r9, r12, #16\n\t"
  109689. "mul r9, r8, r9\n\t"
  109690. "adds r6, r6, r9\n\t"
  109691. "adc r7, r7, #0\n\t"
  109692. "lsl r9, r12, #16\n\t"
  109693. "lsr r9, r9, #16\n\t"
  109694. "mul r8, r9, r8\n\t"
  109695. "lsr r9, r8, #16\n\t"
  109696. "lsl r8, r8, #16\n\t"
  109697. "adds r5, r5, r8\n\t"
  109698. "adcs r6, r6, r9\n\t"
  109699. "adc r7, r7, #0\n\t"
  109700. #else
  109701. "umull r8, r9, r10, r12\n\t"
  109702. "adds r5, r5, r8\n\t"
  109703. "adcs r6, r6, r9\n\t"
  109704. "adc r7, r7, #0\n\t"
  109705. #endif
  109706. /* A[2] * A[12] */
  109707. "ldr r10, [%[a], #48]\n\t"
  109708. "ldr r12, [%[a], #8]\n\t"
  109709. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  109710. "lsl r8, r10, #16\n\t"
  109711. "lsl r9, r12, #16\n\t"
  109712. "lsr r8, r8, #16\n\t"
  109713. "lsr r9, r9, #16\n\t"
  109714. "mul r9, r8, r9\n\t"
  109715. "adds r5, r5, r9\n\t"
  109716. "adcs r6, r6, #0\n\t"
  109717. "adc r7, r7, #0\n\t"
  109718. "lsr r9, r12, #16\n\t"
  109719. "mul r8, r9, r8\n\t"
  109720. "lsr r9, r8, #16\n\t"
  109721. "lsl r8, r8, #16\n\t"
  109722. "adds r5, r5, r8\n\t"
  109723. "adcs r6, r6, r9\n\t"
  109724. "adc r7, r7, #0\n\t"
  109725. "lsr r8, r10, #16\n\t"
  109726. "lsr r9, r12, #16\n\t"
  109727. "mul r9, r8, r9\n\t"
  109728. "adds r6, r6, r9\n\t"
  109729. "adc r7, r7, #0\n\t"
  109730. "lsl r9, r12, #16\n\t"
  109731. "lsr r9, r9, #16\n\t"
  109732. "mul r8, r9, r8\n\t"
  109733. "lsr r9, r8, #16\n\t"
  109734. "lsl r8, r8, #16\n\t"
  109735. "adds r5, r5, r8\n\t"
  109736. "adcs r6, r6, r9\n\t"
  109737. "adc r7, r7, #0\n\t"
  109738. #else
  109739. "umull r8, r9, r10, r12\n\t"
  109740. "adds r5, r5, r8\n\t"
  109741. "adcs r6, r6, r9\n\t"
  109742. "adc r7, r7, #0\n\t"
  109743. #endif
  109744. /* A[3] * A[11] */
  109745. "ldr r10, [%[a], #44]\n\t"
  109746. "ldr r12, [%[a], #12]\n\t"
  109747. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  109748. "lsl r8, r10, #16\n\t"
  109749. "lsl r9, r12, #16\n\t"
  109750. "lsr r8, r8, #16\n\t"
  109751. "lsr r9, r9, #16\n\t"
  109752. "mul r9, r8, r9\n\t"
  109753. "adds r5, r5, r9\n\t"
  109754. "adcs r6, r6, #0\n\t"
  109755. "adc r7, r7, #0\n\t"
  109756. "lsr r9, r12, #16\n\t"
  109757. "mul r8, r9, r8\n\t"
  109758. "lsr r9, r8, #16\n\t"
  109759. "lsl r8, r8, #16\n\t"
  109760. "adds r5, r5, r8\n\t"
  109761. "adcs r6, r6, r9\n\t"
  109762. "adc r7, r7, #0\n\t"
  109763. "lsr r8, r10, #16\n\t"
  109764. "lsr r9, r12, #16\n\t"
  109765. "mul r9, r8, r9\n\t"
  109766. "adds r6, r6, r9\n\t"
  109767. "adc r7, r7, #0\n\t"
  109768. "lsl r9, r12, #16\n\t"
  109769. "lsr r9, r9, #16\n\t"
  109770. "mul r8, r9, r8\n\t"
  109771. "lsr r9, r8, #16\n\t"
  109772. "lsl r8, r8, #16\n\t"
  109773. "adds r5, r5, r8\n\t"
  109774. "adcs r6, r6, r9\n\t"
  109775. "adc r7, r7, #0\n\t"
  109776. #else
  109777. "umull r8, r9, r10, r12\n\t"
  109778. "adds r5, r5, r8\n\t"
  109779. "adcs r6, r6, r9\n\t"
  109780. "adc r7, r7, #0\n\t"
  109781. #endif
  109782. /* A[4] * A[10] */
  109783. "ldr r10, [%[a], #40]\n\t"
  109784. "ldr r12, [%[a], #16]\n\t"
  109785. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  109786. "lsl r8, r10, #16\n\t"
  109787. "lsl r9, r12, #16\n\t"
  109788. "lsr r8, r8, #16\n\t"
  109789. "lsr r9, r9, #16\n\t"
  109790. "mul r9, r8, r9\n\t"
  109791. "adds r5, r5, r9\n\t"
  109792. "adcs r6, r6, #0\n\t"
  109793. "adc r7, r7, #0\n\t"
  109794. "lsr r9, r12, #16\n\t"
  109795. "mul r8, r9, r8\n\t"
  109796. "lsr r9, r8, #16\n\t"
  109797. "lsl r8, r8, #16\n\t"
  109798. "adds r5, r5, r8\n\t"
  109799. "adcs r6, r6, r9\n\t"
  109800. "adc r7, r7, #0\n\t"
  109801. "lsr r8, r10, #16\n\t"
  109802. "lsr r9, r12, #16\n\t"
  109803. "mul r9, r8, r9\n\t"
  109804. "adds r6, r6, r9\n\t"
  109805. "adc r7, r7, #0\n\t"
  109806. "lsl r9, r12, #16\n\t"
  109807. "lsr r9, r9, #16\n\t"
  109808. "mul r8, r9, r8\n\t"
  109809. "lsr r9, r8, #16\n\t"
  109810. "lsl r8, r8, #16\n\t"
  109811. "adds r5, r5, r8\n\t"
  109812. "adcs r6, r6, r9\n\t"
  109813. "adc r7, r7, #0\n\t"
  109814. #else
  109815. "umull r8, r9, r10, r12\n\t"
  109816. "adds r5, r5, r8\n\t"
  109817. "adcs r6, r6, r9\n\t"
  109818. "adc r7, r7, #0\n\t"
  109819. #endif
  109820. /* A[5] * A[9] */
  109821. "ldr r10, [%[a], #36]\n\t"
  109822. "ldr r12, [%[a], #20]\n\t"
  109823. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  109824. "lsl r8, r10, #16\n\t"
  109825. "lsl r9, r12, #16\n\t"
  109826. "lsr r8, r8, #16\n\t"
  109827. "lsr r9, r9, #16\n\t"
  109828. "mul r9, r8, r9\n\t"
  109829. "adds r5, r5, r9\n\t"
  109830. "adcs r6, r6, #0\n\t"
  109831. "adc r7, r7, #0\n\t"
  109832. "lsr r9, r12, #16\n\t"
  109833. "mul r8, r9, r8\n\t"
  109834. "lsr r9, r8, #16\n\t"
  109835. "lsl r8, r8, #16\n\t"
  109836. "adds r5, r5, r8\n\t"
  109837. "adcs r6, r6, r9\n\t"
  109838. "adc r7, r7, #0\n\t"
  109839. "lsr r8, r10, #16\n\t"
  109840. "lsr r9, r12, #16\n\t"
  109841. "mul r9, r8, r9\n\t"
  109842. "adds r6, r6, r9\n\t"
  109843. "adc r7, r7, #0\n\t"
  109844. "lsl r9, r12, #16\n\t"
  109845. "lsr r9, r9, #16\n\t"
  109846. "mul r8, r9, r8\n\t"
  109847. "lsr r9, r8, #16\n\t"
  109848. "lsl r8, r8, #16\n\t"
  109849. "adds r5, r5, r8\n\t"
  109850. "adcs r6, r6, r9\n\t"
  109851. "adc r7, r7, #0\n\t"
  109852. #else
  109853. "umull r8, r9, r10, r12\n\t"
  109854. "adds r5, r5, r8\n\t"
  109855. "adcs r6, r6, r9\n\t"
  109856. "adc r7, r7, #0\n\t"
  109857. #endif
  109858. /* A[6] * A[8] */
  109859. "ldr r10, [%[a], #32]\n\t"
  109860. "ldr r12, [%[a], #24]\n\t"
  109861. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  109862. "lsl r8, r10, #16\n\t"
  109863. "lsl r9, r12, #16\n\t"
  109864. "lsr r8, r8, #16\n\t"
  109865. "lsr r9, r9, #16\n\t"
  109866. "mul r9, r8, r9\n\t"
  109867. "adds r5, r5, r9\n\t"
  109868. "adcs r6, r6, #0\n\t"
  109869. "adc r7, r7, #0\n\t"
  109870. "lsr r9, r12, #16\n\t"
  109871. "mul r8, r9, r8\n\t"
  109872. "lsr r9, r8, #16\n\t"
  109873. "lsl r8, r8, #16\n\t"
  109874. "adds r5, r5, r8\n\t"
  109875. "adcs r6, r6, r9\n\t"
  109876. "adc r7, r7, #0\n\t"
  109877. "lsr r8, r10, #16\n\t"
  109878. "lsr r9, r12, #16\n\t"
  109879. "mul r9, r8, r9\n\t"
  109880. "adds r6, r6, r9\n\t"
  109881. "adc r7, r7, #0\n\t"
  109882. "lsl r9, r12, #16\n\t"
  109883. "lsr r9, r9, #16\n\t"
  109884. "mul r8, r9, r8\n\t"
  109885. "lsr r9, r8, #16\n\t"
  109886. "lsl r8, r8, #16\n\t"
  109887. "adds r5, r5, r8\n\t"
  109888. "adcs r6, r6, r9\n\t"
  109889. "adc r7, r7, #0\n\t"
  109890. #else
  109891. "umull r8, r9, r10, r12\n\t"
  109892. "adds r5, r5, r8\n\t"
  109893. "adcs r6, r6, r9\n\t"
  109894. "adc r7, r7, #0\n\t"
  109895. #endif
  109896. /* A[7] * A[7] */
  109897. "ldr r10, [%[a], #28]\n\t"
  109898. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  109899. "lsl r8, r10, #16\n\t"
  109900. "lsr r9, r10, #16\n\t"
  109901. "lsr r8, r8, #16\n\t"
  109902. "mov r12, r8\n\t"
  109903. "mul r8, r12, r8\n\t"
  109904. "mov r12, r9\n\t"
  109905. "mul r9, r12, r9\n\t"
  109906. "adds r4, r4, r8\n\t"
  109907. "adcs r2, r2, r9\n\t"
  109908. "adc r3, r3, #0\n\t"
  109909. "lsr r9, r10, #16\n\t"
  109910. "lsl r8, r10, #16\n\t"
  109911. "lsr r8, r8, #16\n\t"
  109912. "mul r8, r9, r8\n\t"
  109913. "lsr r9, r8, #15\n\t"
  109914. "lsl r8, r8, #17\n\t"
  109915. "adds r4, r4, r8\n\t"
  109916. "adcs r2, r2, r9\n\t"
  109917. "adc r3, r3, #0\n\t"
  109918. "adds r5, r5, r5\n\t"
  109919. "adcs r6, r6, r6\n\t"
  109920. "adc r7, r7, r7\n\t"
  109921. #else
  109922. "umull r8, r9, r10, r10\n\t"
  109923. "adds r5, r5, r5\n\t"
  109924. "adcs r6, r6, r6\n\t"
  109925. "adc r7, r7, r7\n\t"
  109926. "adds r4, r4, r8\n\t"
  109927. "adcs r2, r2, r9\n\t"
  109928. "adc r3, r3, #0\n\t"
  109929. #endif
  109930. "adds r4, r4, r5\n\t"
  109931. "adcs r2, r2, r6\n\t"
  109932. "adc r3, r3, r7\n\t"
  109933. "str r4, [sp, #56]\n\t"
  109934. /* A[0] * A[15] */
  109935. "ldr r10, [%[a], #60]\n\t"
  109936. "ldr r12, [%[a]]\n\t"
  109937. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  109938. "lsl r8, r10, #16\n\t"
  109939. "lsl r5, r12, #16\n\t"
  109940. "lsr r8, r8, #16\n\t"
  109941. "lsr r5, r5, #16\n\t"
  109942. "mul r5, r8, r5\n\t"
  109943. "lsr r9, r12, #16\n\t"
  109944. "mul r8, r9, r8\n\t"
  109945. "lsr r6, r8, #16\n\t"
  109946. "lsl r8, r8, #16\n\t"
  109947. "adds r5, r5, r8\n\t"
  109948. "adc r6, r6, #0\n\t"
  109949. "lsr r8, r10, #16\n\t"
  109950. "mul r9, r8, r9\n\t"
  109951. "add r6, r6, r9\n\t"
  109952. "lsl r9, r12, #16\n\t"
  109953. "lsr r9, r9, #16\n\t"
  109954. "mul r8, r9, r8\n\t"
  109955. "lsr r9, r8, #16\n\t"
  109956. "lsl r8, r8, #16\n\t"
  109957. "adds r5, r5, r8\n\t"
  109958. "adc r6, r6, r9\n\t"
  109959. #else
  109960. "umull r5, r6, r10, r12\n\t"
  109961. #endif
  109962. "mov r4, #0\n\t"
  109963. "mov r7, #0\n\t"
  109964. /* A[1] * A[14] */
  109965. "ldr r10, [%[a], #56]\n\t"
  109966. "ldr r12, [%[a], #4]\n\t"
  109967. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  109968. "lsl r8, r10, #16\n\t"
  109969. "lsl r9, r12, #16\n\t"
  109970. "lsr r8, r8, #16\n\t"
  109971. "lsr r9, r9, #16\n\t"
  109972. "mul r9, r8, r9\n\t"
  109973. "adds r5, r5, r9\n\t"
  109974. "adcs r6, r6, #0\n\t"
  109975. "adc r7, r7, #0\n\t"
  109976. "lsr r9, r12, #16\n\t"
  109977. "mul r8, r9, r8\n\t"
  109978. "lsr r9, r8, #16\n\t"
  109979. "lsl r8, r8, #16\n\t"
  109980. "adds r5, r5, r8\n\t"
  109981. "adcs r6, r6, r9\n\t"
  109982. "adc r7, r7, #0\n\t"
  109983. "lsr r8, r10, #16\n\t"
  109984. "lsr r9, r12, #16\n\t"
  109985. "mul r9, r8, r9\n\t"
  109986. "adds r6, r6, r9\n\t"
  109987. "adc r7, r7, #0\n\t"
  109988. "lsl r9, r12, #16\n\t"
  109989. "lsr r9, r9, #16\n\t"
  109990. "mul r8, r9, r8\n\t"
  109991. "lsr r9, r8, #16\n\t"
  109992. "lsl r8, r8, #16\n\t"
  109993. "adds r5, r5, r8\n\t"
  109994. "adcs r6, r6, r9\n\t"
  109995. "adc r7, r7, #0\n\t"
  109996. #else
  109997. "umull r8, r9, r10, r12\n\t"
  109998. "adds r5, r5, r8\n\t"
  109999. "adcs r6, r6, r9\n\t"
  110000. "adc r7, r7, #0\n\t"
  110001. #endif
  110002. /* A[2] * A[13] */
  110003. "ldr r10, [%[a], #52]\n\t"
  110004. "ldr r12, [%[a], #8]\n\t"
  110005. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  110006. "lsl r8, r10, #16\n\t"
  110007. "lsl r9, r12, #16\n\t"
  110008. "lsr r8, r8, #16\n\t"
  110009. "lsr r9, r9, #16\n\t"
  110010. "mul r9, r8, r9\n\t"
  110011. "adds r5, r5, r9\n\t"
  110012. "adcs r6, r6, #0\n\t"
  110013. "adc r7, r7, #0\n\t"
  110014. "lsr r9, r12, #16\n\t"
  110015. "mul r8, r9, r8\n\t"
  110016. "lsr r9, r8, #16\n\t"
  110017. "lsl r8, r8, #16\n\t"
  110018. "adds r5, r5, r8\n\t"
  110019. "adcs r6, r6, r9\n\t"
  110020. "adc r7, r7, #0\n\t"
  110021. "lsr r8, r10, #16\n\t"
  110022. "lsr r9, r12, #16\n\t"
  110023. "mul r9, r8, r9\n\t"
  110024. "adds r6, r6, r9\n\t"
  110025. "adc r7, r7, #0\n\t"
  110026. "lsl r9, r12, #16\n\t"
  110027. "lsr r9, r9, #16\n\t"
  110028. "mul r8, r9, r8\n\t"
  110029. "lsr r9, r8, #16\n\t"
  110030. "lsl r8, r8, #16\n\t"
  110031. "adds r5, r5, r8\n\t"
  110032. "adcs r6, r6, r9\n\t"
  110033. "adc r7, r7, #0\n\t"
  110034. #else
  110035. "umull r8, r9, r10, r12\n\t"
  110036. "adds r5, r5, r8\n\t"
  110037. "adcs r6, r6, r9\n\t"
  110038. "adc r7, r7, #0\n\t"
  110039. #endif
  110040. /* A[3] * A[12] */
  110041. "ldr r10, [%[a], #48]\n\t"
  110042. "ldr r12, [%[a], #12]\n\t"
  110043. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  110044. "lsl r8, r10, #16\n\t"
  110045. "lsl r9, r12, #16\n\t"
  110046. "lsr r8, r8, #16\n\t"
  110047. "lsr r9, r9, #16\n\t"
  110048. "mul r9, r8, r9\n\t"
  110049. "adds r5, r5, r9\n\t"
  110050. "adcs r6, r6, #0\n\t"
  110051. "adc r7, r7, #0\n\t"
  110052. "lsr r9, r12, #16\n\t"
  110053. "mul r8, r9, r8\n\t"
  110054. "lsr r9, r8, #16\n\t"
  110055. "lsl r8, r8, #16\n\t"
  110056. "adds r5, r5, r8\n\t"
  110057. "adcs r6, r6, r9\n\t"
  110058. "adc r7, r7, #0\n\t"
  110059. "lsr r8, r10, #16\n\t"
  110060. "lsr r9, r12, #16\n\t"
  110061. "mul r9, r8, r9\n\t"
  110062. "adds r6, r6, r9\n\t"
  110063. "adc r7, r7, #0\n\t"
  110064. "lsl r9, r12, #16\n\t"
  110065. "lsr r9, r9, #16\n\t"
  110066. "mul r8, r9, r8\n\t"
  110067. "lsr r9, r8, #16\n\t"
  110068. "lsl r8, r8, #16\n\t"
  110069. "adds r5, r5, r8\n\t"
  110070. "adcs r6, r6, r9\n\t"
  110071. "adc r7, r7, #0\n\t"
  110072. #else
  110073. "umull r8, r9, r10, r12\n\t"
  110074. "adds r5, r5, r8\n\t"
  110075. "adcs r6, r6, r9\n\t"
  110076. "adc r7, r7, #0\n\t"
  110077. #endif
  110078. /* A[4] * A[11] */
  110079. "ldr r10, [%[a], #44]\n\t"
  110080. "ldr r12, [%[a], #16]\n\t"
  110081. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  110082. "lsl r8, r10, #16\n\t"
  110083. "lsl r9, r12, #16\n\t"
  110084. "lsr r8, r8, #16\n\t"
  110085. "lsr r9, r9, #16\n\t"
  110086. "mul r9, r8, r9\n\t"
  110087. "adds r5, r5, r9\n\t"
  110088. "adcs r6, r6, #0\n\t"
  110089. "adc r7, r7, #0\n\t"
  110090. "lsr r9, r12, #16\n\t"
  110091. "mul r8, r9, r8\n\t"
  110092. "lsr r9, r8, #16\n\t"
  110093. "lsl r8, r8, #16\n\t"
  110094. "adds r5, r5, r8\n\t"
  110095. "adcs r6, r6, r9\n\t"
  110096. "adc r7, r7, #0\n\t"
  110097. "lsr r8, r10, #16\n\t"
  110098. "lsr r9, r12, #16\n\t"
  110099. "mul r9, r8, r9\n\t"
  110100. "adds r6, r6, r9\n\t"
  110101. "adc r7, r7, #0\n\t"
  110102. "lsl r9, r12, #16\n\t"
  110103. "lsr r9, r9, #16\n\t"
  110104. "mul r8, r9, r8\n\t"
  110105. "lsr r9, r8, #16\n\t"
  110106. "lsl r8, r8, #16\n\t"
  110107. "adds r5, r5, r8\n\t"
  110108. "adcs r6, r6, r9\n\t"
  110109. "adc r7, r7, #0\n\t"
  110110. #else
  110111. "umull r8, r9, r10, r12\n\t"
  110112. "adds r5, r5, r8\n\t"
  110113. "adcs r6, r6, r9\n\t"
  110114. "adc r7, r7, #0\n\t"
  110115. #endif
  110116. /* A[5] * A[10] */
  110117. "ldr r10, [%[a], #40]\n\t"
  110118. "ldr r12, [%[a], #20]\n\t"
  110119. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  110120. "lsl r8, r10, #16\n\t"
  110121. "lsl r9, r12, #16\n\t"
  110122. "lsr r8, r8, #16\n\t"
  110123. "lsr r9, r9, #16\n\t"
  110124. "mul r9, r8, r9\n\t"
  110125. "adds r5, r5, r9\n\t"
  110126. "adcs r6, r6, #0\n\t"
  110127. "adc r7, r7, #0\n\t"
  110128. "lsr r9, r12, #16\n\t"
  110129. "mul r8, r9, r8\n\t"
  110130. "lsr r9, r8, #16\n\t"
  110131. "lsl r8, r8, #16\n\t"
  110132. "adds r5, r5, r8\n\t"
  110133. "adcs r6, r6, r9\n\t"
  110134. "adc r7, r7, #0\n\t"
  110135. "lsr r8, r10, #16\n\t"
  110136. "lsr r9, r12, #16\n\t"
  110137. "mul r9, r8, r9\n\t"
  110138. "adds r6, r6, r9\n\t"
  110139. "adc r7, r7, #0\n\t"
  110140. "lsl r9, r12, #16\n\t"
  110141. "lsr r9, r9, #16\n\t"
  110142. "mul r8, r9, r8\n\t"
  110143. "lsr r9, r8, #16\n\t"
  110144. "lsl r8, r8, #16\n\t"
  110145. "adds r5, r5, r8\n\t"
  110146. "adcs r6, r6, r9\n\t"
  110147. "adc r7, r7, #0\n\t"
  110148. #else
  110149. "umull r8, r9, r10, r12\n\t"
  110150. "adds r5, r5, r8\n\t"
  110151. "adcs r6, r6, r9\n\t"
  110152. "adc r7, r7, #0\n\t"
  110153. #endif
  110154. /* A[6] * A[9] */
  110155. "ldr r10, [%[a], #36]\n\t"
  110156. "ldr r12, [%[a], #24]\n\t"
  110157. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  110158. "lsl r8, r10, #16\n\t"
  110159. "lsl r9, r12, #16\n\t"
  110160. "lsr r8, r8, #16\n\t"
  110161. "lsr r9, r9, #16\n\t"
  110162. "mul r9, r8, r9\n\t"
  110163. "adds r5, r5, r9\n\t"
  110164. "adcs r6, r6, #0\n\t"
  110165. "adc r7, r7, #0\n\t"
  110166. "lsr r9, r12, #16\n\t"
  110167. "mul r8, r9, r8\n\t"
  110168. "lsr r9, r8, #16\n\t"
  110169. "lsl r8, r8, #16\n\t"
  110170. "adds r5, r5, r8\n\t"
  110171. "adcs r6, r6, r9\n\t"
  110172. "adc r7, r7, #0\n\t"
  110173. "lsr r8, r10, #16\n\t"
  110174. "lsr r9, r12, #16\n\t"
  110175. "mul r9, r8, r9\n\t"
  110176. "adds r6, r6, r9\n\t"
  110177. "adc r7, r7, #0\n\t"
  110178. "lsl r9, r12, #16\n\t"
  110179. "lsr r9, r9, #16\n\t"
  110180. "mul r8, r9, r8\n\t"
  110181. "lsr r9, r8, #16\n\t"
  110182. "lsl r8, r8, #16\n\t"
  110183. "adds r5, r5, r8\n\t"
  110184. "adcs r6, r6, r9\n\t"
  110185. "adc r7, r7, #0\n\t"
  110186. #else
  110187. "umull r8, r9, r10, r12\n\t"
  110188. "adds r5, r5, r8\n\t"
  110189. "adcs r6, r6, r9\n\t"
  110190. "adc r7, r7, #0\n\t"
  110191. #endif
  110192. /* A[7] * A[8] */
  110193. "ldr r10, [%[a], #32]\n\t"
  110194. "ldr r12, [%[a], #28]\n\t"
  110195. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  110196. "lsl r8, r10, #16\n\t"
  110197. "lsl r9, r12, #16\n\t"
  110198. "lsr r8, r8, #16\n\t"
  110199. "lsr r9, r9, #16\n\t"
  110200. "mul r9, r8, r9\n\t"
  110201. "adds r5, r5, r9\n\t"
  110202. "adcs r6, r6, #0\n\t"
  110203. "adc r7, r7, #0\n\t"
  110204. "lsr r9, r12, #16\n\t"
  110205. "mul r8, r9, r8\n\t"
  110206. "lsr r9, r8, #16\n\t"
  110207. "lsl r8, r8, #16\n\t"
  110208. "adds r5, r5, r8\n\t"
  110209. "adcs r6, r6, r9\n\t"
  110210. "adc r7, r7, #0\n\t"
  110211. "lsr r8, r10, #16\n\t"
  110212. "lsr r9, r12, #16\n\t"
  110213. "mul r9, r8, r9\n\t"
  110214. "adds r6, r6, r9\n\t"
  110215. "adc r7, r7, #0\n\t"
  110216. "lsl r9, r12, #16\n\t"
  110217. "lsr r9, r9, #16\n\t"
  110218. "mul r8, r9, r8\n\t"
  110219. "lsr r9, r8, #16\n\t"
  110220. "lsl r8, r8, #16\n\t"
  110221. "adds r5, r5, r8\n\t"
  110222. "adcs r6, r6, r9\n\t"
  110223. "adc r7, r7, #0\n\t"
  110224. #else
  110225. "umull r8, r9, r10, r12\n\t"
  110226. "adds r5, r5, r8\n\t"
  110227. "adcs r6, r6, r9\n\t"
  110228. "adc r7, r7, #0\n\t"
  110229. #endif
  110230. "adds r5, r5, r5\n\t"
  110231. "adcs r6, r6, r6\n\t"
  110232. "adc r7, r7, r7\n\t"
  110233. "adds r2, r2, r5\n\t"
  110234. "adcs r3, r3, r6\n\t"
  110235. "adc r4, r4, r7\n\t"
  110236. "str r2, [sp, #60]\n\t"
  110237. /* A[0] * A[16] */
  110238. "ldr r10, [%[a], #64]\n\t"
  110239. "ldr r12, [%[a]]\n\t"
  110240. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  110241. "lsl r8, r10, #16\n\t"
  110242. "lsl r5, r12, #16\n\t"
  110243. "lsr r8, r8, #16\n\t"
  110244. "lsr r5, r5, #16\n\t"
  110245. "mul r5, r8, r5\n\t"
  110246. "lsr r9, r12, #16\n\t"
  110247. "mul r8, r9, r8\n\t"
  110248. "lsr r6, r8, #16\n\t"
  110249. "lsl r8, r8, #16\n\t"
  110250. "adds r5, r5, r8\n\t"
  110251. "adc r6, r6, #0\n\t"
  110252. "lsr r8, r10, #16\n\t"
  110253. "mul r9, r8, r9\n\t"
  110254. "add r6, r6, r9\n\t"
  110255. "lsl r9, r12, #16\n\t"
  110256. "lsr r9, r9, #16\n\t"
  110257. "mul r8, r9, r8\n\t"
  110258. "lsr r9, r8, #16\n\t"
  110259. "lsl r8, r8, #16\n\t"
  110260. "adds r5, r5, r8\n\t"
  110261. "adc r6, r6, r9\n\t"
  110262. #else
  110263. "umull r5, r6, r10, r12\n\t"
  110264. #endif
  110265. "mov r2, #0\n\t"
  110266. "mov r7, #0\n\t"
  110267. /* A[1] * A[15] */
  110268. "ldr r10, [%[a], #60]\n\t"
  110269. "ldr r12, [%[a], #4]\n\t"
  110270. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  110271. "lsl r8, r10, #16\n\t"
  110272. "lsl r9, r12, #16\n\t"
  110273. "lsr r8, r8, #16\n\t"
  110274. "lsr r9, r9, #16\n\t"
  110275. "mul r9, r8, r9\n\t"
  110276. "adds r5, r5, r9\n\t"
  110277. "adcs r6, r6, #0\n\t"
  110278. "adc r7, r7, #0\n\t"
  110279. "lsr r9, r12, #16\n\t"
  110280. "mul r8, r9, r8\n\t"
  110281. "lsr r9, r8, #16\n\t"
  110282. "lsl r8, r8, #16\n\t"
  110283. "adds r5, r5, r8\n\t"
  110284. "adcs r6, r6, r9\n\t"
  110285. "adc r7, r7, #0\n\t"
  110286. "lsr r8, r10, #16\n\t"
  110287. "lsr r9, r12, #16\n\t"
  110288. "mul r9, r8, r9\n\t"
  110289. "adds r6, r6, r9\n\t"
  110290. "adc r7, r7, #0\n\t"
  110291. "lsl r9, r12, #16\n\t"
  110292. "lsr r9, r9, #16\n\t"
  110293. "mul r8, r9, r8\n\t"
  110294. "lsr r9, r8, #16\n\t"
  110295. "lsl r8, r8, #16\n\t"
  110296. "adds r5, r5, r8\n\t"
  110297. "adcs r6, r6, r9\n\t"
  110298. "adc r7, r7, #0\n\t"
  110299. #else
  110300. "umull r8, r9, r10, r12\n\t"
  110301. "adds r5, r5, r8\n\t"
  110302. "adcs r6, r6, r9\n\t"
  110303. "adc r7, r7, #0\n\t"
  110304. #endif
  110305. /* A[2] * A[14] */
  110306. "ldr r10, [%[a], #56]\n\t"
  110307. "ldr r12, [%[a], #8]\n\t"
  110308. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  110309. "lsl r8, r10, #16\n\t"
  110310. "lsl r9, r12, #16\n\t"
  110311. "lsr r8, r8, #16\n\t"
  110312. "lsr r9, r9, #16\n\t"
  110313. "mul r9, r8, r9\n\t"
  110314. "adds r5, r5, r9\n\t"
  110315. "adcs r6, r6, #0\n\t"
  110316. "adc r7, r7, #0\n\t"
  110317. "lsr r9, r12, #16\n\t"
  110318. "mul r8, r9, r8\n\t"
  110319. "lsr r9, r8, #16\n\t"
  110320. "lsl r8, r8, #16\n\t"
  110321. "adds r5, r5, r8\n\t"
  110322. "adcs r6, r6, r9\n\t"
  110323. "adc r7, r7, #0\n\t"
  110324. "lsr r8, r10, #16\n\t"
  110325. "lsr r9, r12, #16\n\t"
  110326. "mul r9, r8, r9\n\t"
  110327. "adds r6, r6, r9\n\t"
  110328. "adc r7, r7, #0\n\t"
  110329. "lsl r9, r12, #16\n\t"
  110330. "lsr r9, r9, #16\n\t"
  110331. "mul r8, r9, r8\n\t"
  110332. "lsr r9, r8, #16\n\t"
  110333. "lsl r8, r8, #16\n\t"
  110334. "adds r5, r5, r8\n\t"
  110335. "adcs r6, r6, r9\n\t"
  110336. "adc r7, r7, #0\n\t"
  110337. #else
  110338. "umull r8, r9, r10, r12\n\t"
  110339. "adds r5, r5, r8\n\t"
  110340. "adcs r6, r6, r9\n\t"
  110341. "adc r7, r7, #0\n\t"
  110342. #endif
  110343. /* A[3] * A[13] */
  110344. "ldr r10, [%[a], #52]\n\t"
  110345. "ldr r12, [%[a], #12]\n\t"
  110346. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  110347. "lsl r8, r10, #16\n\t"
  110348. "lsl r9, r12, #16\n\t"
  110349. "lsr r8, r8, #16\n\t"
  110350. "lsr r9, r9, #16\n\t"
  110351. "mul r9, r8, r9\n\t"
  110352. "adds r5, r5, r9\n\t"
  110353. "adcs r6, r6, #0\n\t"
  110354. "adc r7, r7, #0\n\t"
  110355. "lsr r9, r12, #16\n\t"
  110356. "mul r8, r9, r8\n\t"
  110357. "lsr r9, r8, #16\n\t"
  110358. "lsl r8, r8, #16\n\t"
  110359. "adds r5, r5, r8\n\t"
  110360. "adcs r6, r6, r9\n\t"
  110361. "adc r7, r7, #0\n\t"
  110362. "lsr r8, r10, #16\n\t"
  110363. "lsr r9, r12, #16\n\t"
  110364. "mul r9, r8, r9\n\t"
  110365. "adds r6, r6, r9\n\t"
  110366. "adc r7, r7, #0\n\t"
  110367. "lsl r9, r12, #16\n\t"
  110368. "lsr r9, r9, #16\n\t"
  110369. "mul r8, r9, r8\n\t"
  110370. "lsr r9, r8, #16\n\t"
  110371. "lsl r8, r8, #16\n\t"
  110372. "adds r5, r5, r8\n\t"
  110373. "adcs r6, r6, r9\n\t"
  110374. "adc r7, r7, #0\n\t"
  110375. #else
  110376. "umull r8, r9, r10, r12\n\t"
  110377. "adds r5, r5, r8\n\t"
  110378. "adcs r6, r6, r9\n\t"
  110379. "adc r7, r7, #0\n\t"
  110380. #endif
  110381. /* A[4] * A[12] */
  110382. "ldr r10, [%[a], #48]\n\t"
  110383. "ldr r12, [%[a], #16]\n\t"
  110384. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  110385. "lsl r8, r10, #16\n\t"
  110386. "lsl r9, r12, #16\n\t"
  110387. "lsr r8, r8, #16\n\t"
  110388. "lsr r9, r9, #16\n\t"
  110389. "mul r9, r8, r9\n\t"
  110390. "adds r5, r5, r9\n\t"
  110391. "adcs r6, r6, #0\n\t"
  110392. "adc r7, r7, #0\n\t"
  110393. "lsr r9, r12, #16\n\t"
  110394. "mul r8, r9, r8\n\t"
  110395. "lsr r9, r8, #16\n\t"
  110396. "lsl r8, r8, #16\n\t"
  110397. "adds r5, r5, r8\n\t"
  110398. "adcs r6, r6, r9\n\t"
  110399. "adc r7, r7, #0\n\t"
  110400. "lsr r8, r10, #16\n\t"
  110401. "lsr r9, r12, #16\n\t"
  110402. "mul r9, r8, r9\n\t"
  110403. "adds r6, r6, r9\n\t"
  110404. "adc r7, r7, #0\n\t"
  110405. "lsl r9, r12, #16\n\t"
  110406. "lsr r9, r9, #16\n\t"
  110407. "mul r8, r9, r8\n\t"
  110408. "lsr r9, r8, #16\n\t"
  110409. "lsl r8, r8, #16\n\t"
  110410. "adds r5, r5, r8\n\t"
  110411. "adcs r6, r6, r9\n\t"
  110412. "adc r7, r7, #0\n\t"
  110413. #else
  110414. "umull r8, r9, r10, r12\n\t"
  110415. "adds r5, r5, r8\n\t"
  110416. "adcs r6, r6, r9\n\t"
  110417. "adc r7, r7, #0\n\t"
  110418. #endif
  110419. /* A[5] * A[11] */
  110420. "ldr r10, [%[a], #44]\n\t"
  110421. "ldr r12, [%[a], #20]\n\t"
  110422. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  110423. "lsl r8, r10, #16\n\t"
  110424. "lsl r9, r12, #16\n\t"
  110425. "lsr r8, r8, #16\n\t"
  110426. "lsr r9, r9, #16\n\t"
  110427. "mul r9, r8, r9\n\t"
  110428. "adds r5, r5, r9\n\t"
  110429. "adcs r6, r6, #0\n\t"
  110430. "adc r7, r7, #0\n\t"
  110431. "lsr r9, r12, #16\n\t"
  110432. "mul r8, r9, r8\n\t"
  110433. "lsr r9, r8, #16\n\t"
  110434. "lsl r8, r8, #16\n\t"
  110435. "adds r5, r5, r8\n\t"
  110436. "adcs r6, r6, r9\n\t"
  110437. "adc r7, r7, #0\n\t"
  110438. "lsr r8, r10, #16\n\t"
  110439. "lsr r9, r12, #16\n\t"
  110440. "mul r9, r8, r9\n\t"
  110441. "adds r6, r6, r9\n\t"
  110442. "adc r7, r7, #0\n\t"
  110443. "lsl r9, r12, #16\n\t"
  110444. "lsr r9, r9, #16\n\t"
  110445. "mul r8, r9, r8\n\t"
  110446. "lsr r9, r8, #16\n\t"
  110447. "lsl r8, r8, #16\n\t"
  110448. "adds r5, r5, r8\n\t"
  110449. "adcs r6, r6, r9\n\t"
  110450. "adc r7, r7, #0\n\t"
  110451. #else
  110452. "umull r8, r9, r10, r12\n\t"
  110453. "adds r5, r5, r8\n\t"
  110454. "adcs r6, r6, r9\n\t"
  110455. "adc r7, r7, #0\n\t"
  110456. #endif
  110457. /* A[6] * A[10] */
  110458. "ldr r10, [%[a], #40]\n\t"
  110459. "ldr r12, [%[a], #24]\n\t"
  110460. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  110461. "lsl r8, r10, #16\n\t"
  110462. "lsl r9, r12, #16\n\t"
  110463. "lsr r8, r8, #16\n\t"
  110464. "lsr r9, r9, #16\n\t"
  110465. "mul r9, r8, r9\n\t"
  110466. "adds r5, r5, r9\n\t"
  110467. "adcs r6, r6, #0\n\t"
  110468. "adc r7, r7, #0\n\t"
  110469. "lsr r9, r12, #16\n\t"
  110470. "mul r8, r9, r8\n\t"
  110471. "lsr r9, r8, #16\n\t"
  110472. "lsl r8, r8, #16\n\t"
  110473. "adds r5, r5, r8\n\t"
  110474. "adcs r6, r6, r9\n\t"
  110475. "adc r7, r7, #0\n\t"
  110476. "lsr r8, r10, #16\n\t"
  110477. "lsr r9, r12, #16\n\t"
  110478. "mul r9, r8, r9\n\t"
  110479. "adds r6, r6, r9\n\t"
  110480. "adc r7, r7, #0\n\t"
  110481. "lsl r9, r12, #16\n\t"
  110482. "lsr r9, r9, #16\n\t"
  110483. "mul r8, r9, r8\n\t"
  110484. "lsr r9, r8, #16\n\t"
  110485. "lsl r8, r8, #16\n\t"
  110486. "adds r5, r5, r8\n\t"
  110487. "adcs r6, r6, r9\n\t"
  110488. "adc r7, r7, #0\n\t"
  110489. #else
  110490. "umull r8, r9, r10, r12\n\t"
  110491. "adds r5, r5, r8\n\t"
  110492. "adcs r6, r6, r9\n\t"
  110493. "adc r7, r7, #0\n\t"
  110494. #endif
  110495. /* A[7] * A[9] */
  110496. "ldr r10, [%[a], #36]\n\t"
  110497. "ldr r12, [%[a], #28]\n\t"
  110498. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  110499. "lsl r8, r10, #16\n\t"
  110500. "lsl r9, r12, #16\n\t"
  110501. "lsr r8, r8, #16\n\t"
  110502. "lsr r9, r9, #16\n\t"
  110503. "mul r9, r8, r9\n\t"
  110504. "adds r5, r5, r9\n\t"
  110505. "adcs r6, r6, #0\n\t"
  110506. "adc r7, r7, #0\n\t"
  110507. "lsr r9, r12, #16\n\t"
  110508. "mul r8, r9, r8\n\t"
  110509. "lsr r9, r8, #16\n\t"
  110510. "lsl r8, r8, #16\n\t"
  110511. "adds r5, r5, r8\n\t"
  110512. "adcs r6, r6, r9\n\t"
  110513. "adc r7, r7, #0\n\t"
  110514. "lsr r8, r10, #16\n\t"
  110515. "lsr r9, r12, #16\n\t"
  110516. "mul r9, r8, r9\n\t"
  110517. "adds r6, r6, r9\n\t"
  110518. "adc r7, r7, #0\n\t"
  110519. "lsl r9, r12, #16\n\t"
  110520. "lsr r9, r9, #16\n\t"
  110521. "mul r8, r9, r8\n\t"
  110522. "lsr r9, r8, #16\n\t"
  110523. "lsl r8, r8, #16\n\t"
  110524. "adds r5, r5, r8\n\t"
  110525. "adcs r6, r6, r9\n\t"
  110526. "adc r7, r7, #0\n\t"
  110527. #else
  110528. "umull r8, r9, r10, r12\n\t"
  110529. "adds r5, r5, r8\n\t"
  110530. "adcs r6, r6, r9\n\t"
  110531. "adc r7, r7, #0\n\t"
  110532. #endif
  110533. /* A[8] * A[8] */
  110534. "ldr r10, [%[a], #32]\n\t"
  110535. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  110536. "lsl r8, r10, #16\n\t"
  110537. "lsr r9, r10, #16\n\t"
  110538. "lsr r8, r8, #16\n\t"
  110539. "mov r12, r8\n\t"
  110540. "mul r8, r12, r8\n\t"
  110541. "mov r12, r9\n\t"
  110542. "mul r9, r12, r9\n\t"
  110543. "adds r3, r3, r8\n\t"
  110544. "adcs r4, r4, r9\n\t"
  110545. "adc r2, r2, #0\n\t"
  110546. "lsr r9, r10, #16\n\t"
  110547. "lsl r8, r10, #16\n\t"
  110548. "lsr r8, r8, #16\n\t"
  110549. "mul r8, r9, r8\n\t"
  110550. "lsr r9, r8, #15\n\t"
  110551. "lsl r8, r8, #17\n\t"
  110552. "adds r3, r3, r8\n\t"
  110553. "adcs r4, r4, r9\n\t"
  110554. "adc r2, r2, #0\n\t"
  110555. "adds r5, r5, r5\n\t"
  110556. "adcs r6, r6, r6\n\t"
  110557. "adc r7, r7, r7\n\t"
  110558. #else
  110559. "umull r8, r9, r10, r10\n\t"
  110560. "adds r5, r5, r5\n\t"
  110561. "adcs r6, r6, r6\n\t"
  110562. "adc r7, r7, r7\n\t"
  110563. "adds r3, r3, r8\n\t"
  110564. "adcs r4, r4, r9\n\t"
  110565. "adc r2, r2, #0\n\t"
  110566. #endif
  110567. "adds r3, r3, r5\n\t"
  110568. "adcs r4, r4, r6\n\t"
  110569. "adc r2, r2, r7\n\t"
  110570. "str r3, [sp, #64]\n\t"
  110571. /* A[1] * A[16] */
  110572. "ldr r10, [%[a], #64]\n\t"
  110573. "ldr r12, [%[a], #4]\n\t"
  110574. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  110575. "lsl r8, r10, #16\n\t"
  110576. "lsl r5, r12, #16\n\t"
  110577. "lsr r8, r8, #16\n\t"
  110578. "lsr r5, r5, #16\n\t"
  110579. "mul r5, r8, r5\n\t"
  110580. "lsr r9, r12, #16\n\t"
  110581. "mul r8, r9, r8\n\t"
  110582. "lsr r6, r8, #16\n\t"
  110583. "lsl r8, r8, #16\n\t"
  110584. "adds r5, r5, r8\n\t"
  110585. "adc r6, r6, #0\n\t"
  110586. "lsr r8, r10, #16\n\t"
  110587. "mul r9, r8, r9\n\t"
  110588. "add r6, r6, r9\n\t"
  110589. "lsl r9, r12, #16\n\t"
  110590. "lsr r9, r9, #16\n\t"
  110591. "mul r8, r9, r8\n\t"
  110592. "lsr r9, r8, #16\n\t"
  110593. "lsl r8, r8, #16\n\t"
  110594. "adds r5, r5, r8\n\t"
  110595. "adc r6, r6, r9\n\t"
  110596. #else
  110597. "umull r5, r6, r10, r12\n\t"
  110598. #endif
  110599. "mov r3, #0\n\t"
  110600. "mov r7, #0\n\t"
  110601. /* A[2] * A[15] */
  110602. "ldr r10, [%[a], #60]\n\t"
  110603. "ldr r12, [%[a], #8]\n\t"
  110604. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  110605. "lsl r8, r10, #16\n\t"
  110606. "lsl r9, r12, #16\n\t"
  110607. "lsr r8, r8, #16\n\t"
  110608. "lsr r9, r9, #16\n\t"
  110609. "mul r9, r8, r9\n\t"
  110610. "adds r5, r5, r9\n\t"
  110611. "adcs r6, r6, #0\n\t"
  110612. "adc r7, r7, #0\n\t"
  110613. "lsr r9, r12, #16\n\t"
  110614. "mul r8, r9, r8\n\t"
  110615. "lsr r9, r8, #16\n\t"
  110616. "lsl r8, r8, #16\n\t"
  110617. "adds r5, r5, r8\n\t"
  110618. "adcs r6, r6, r9\n\t"
  110619. "adc r7, r7, #0\n\t"
  110620. "lsr r8, r10, #16\n\t"
  110621. "lsr r9, r12, #16\n\t"
  110622. "mul r9, r8, r9\n\t"
  110623. "adds r6, r6, r9\n\t"
  110624. "adc r7, r7, #0\n\t"
  110625. "lsl r9, r12, #16\n\t"
  110626. "lsr r9, r9, #16\n\t"
  110627. "mul r8, r9, r8\n\t"
  110628. "lsr r9, r8, #16\n\t"
  110629. "lsl r8, r8, #16\n\t"
  110630. "adds r5, r5, r8\n\t"
  110631. "adcs r6, r6, r9\n\t"
  110632. "adc r7, r7, #0\n\t"
  110633. #else
  110634. "umull r8, r9, r10, r12\n\t"
  110635. "adds r5, r5, r8\n\t"
  110636. "adcs r6, r6, r9\n\t"
  110637. "adc r7, r7, #0\n\t"
  110638. #endif
  110639. /* A[3] * A[14] */
  110640. "ldr r10, [%[a], #56]\n\t"
  110641. "ldr r12, [%[a], #12]\n\t"
  110642. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  110643. "lsl r8, r10, #16\n\t"
  110644. "lsl r9, r12, #16\n\t"
  110645. "lsr r8, r8, #16\n\t"
  110646. "lsr r9, r9, #16\n\t"
  110647. "mul r9, r8, r9\n\t"
  110648. "adds r5, r5, r9\n\t"
  110649. "adcs r6, r6, #0\n\t"
  110650. "adc r7, r7, #0\n\t"
  110651. "lsr r9, r12, #16\n\t"
  110652. "mul r8, r9, r8\n\t"
  110653. "lsr r9, r8, #16\n\t"
  110654. "lsl r8, r8, #16\n\t"
  110655. "adds r5, r5, r8\n\t"
  110656. "adcs r6, r6, r9\n\t"
  110657. "adc r7, r7, #0\n\t"
  110658. "lsr r8, r10, #16\n\t"
  110659. "lsr r9, r12, #16\n\t"
  110660. "mul r9, r8, r9\n\t"
  110661. "adds r6, r6, r9\n\t"
  110662. "adc r7, r7, #0\n\t"
  110663. "lsl r9, r12, #16\n\t"
  110664. "lsr r9, r9, #16\n\t"
  110665. "mul r8, r9, r8\n\t"
  110666. "lsr r9, r8, #16\n\t"
  110667. "lsl r8, r8, #16\n\t"
  110668. "adds r5, r5, r8\n\t"
  110669. "adcs r6, r6, r9\n\t"
  110670. "adc r7, r7, #0\n\t"
  110671. #else
  110672. "umull r8, r9, r10, r12\n\t"
  110673. "adds r5, r5, r8\n\t"
  110674. "adcs r6, r6, r9\n\t"
  110675. "adc r7, r7, #0\n\t"
  110676. #endif
  110677. /* A[4] * A[13] */
  110678. "ldr r10, [%[a], #52]\n\t"
  110679. "ldr r12, [%[a], #16]\n\t"
  110680. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  110681. "lsl r8, r10, #16\n\t"
  110682. "lsl r9, r12, #16\n\t"
  110683. "lsr r8, r8, #16\n\t"
  110684. "lsr r9, r9, #16\n\t"
  110685. "mul r9, r8, r9\n\t"
  110686. "adds r5, r5, r9\n\t"
  110687. "adcs r6, r6, #0\n\t"
  110688. "adc r7, r7, #0\n\t"
  110689. "lsr r9, r12, #16\n\t"
  110690. "mul r8, r9, r8\n\t"
  110691. "lsr r9, r8, #16\n\t"
  110692. "lsl r8, r8, #16\n\t"
  110693. "adds r5, r5, r8\n\t"
  110694. "adcs r6, r6, r9\n\t"
  110695. "adc r7, r7, #0\n\t"
  110696. "lsr r8, r10, #16\n\t"
  110697. "lsr r9, r12, #16\n\t"
  110698. "mul r9, r8, r9\n\t"
  110699. "adds r6, r6, r9\n\t"
  110700. "adc r7, r7, #0\n\t"
  110701. "lsl r9, r12, #16\n\t"
  110702. "lsr r9, r9, #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 r5, r5, r8\n\t"
  110707. "adcs r6, r6, r9\n\t"
  110708. "adc r7, r7, #0\n\t"
  110709. #else
  110710. "umull r8, r9, r10, r12\n\t"
  110711. "adds r5, r5, r8\n\t"
  110712. "adcs r6, r6, r9\n\t"
  110713. "adc r7, r7, #0\n\t"
  110714. #endif
  110715. /* A[5] * A[12] */
  110716. "ldr r10, [%[a], #48]\n\t"
  110717. "ldr r12, [%[a], #20]\n\t"
  110718. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  110719. "lsl r8, r10, #16\n\t"
  110720. "lsl r9, r12, #16\n\t"
  110721. "lsr r8, r8, #16\n\t"
  110722. "lsr r9, r9, #16\n\t"
  110723. "mul r9, r8, r9\n\t"
  110724. "adds r5, r5, r9\n\t"
  110725. "adcs r6, r6, #0\n\t"
  110726. "adc r7, r7, #0\n\t"
  110727. "lsr r9, r12, #16\n\t"
  110728. "mul r8, r9, r8\n\t"
  110729. "lsr r9, r8, #16\n\t"
  110730. "lsl r8, r8, #16\n\t"
  110731. "adds r5, r5, r8\n\t"
  110732. "adcs r6, r6, r9\n\t"
  110733. "adc r7, r7, #0\n\t"
  110734. "lsr r8, r10, #16\n\t"
  110735. "lsr r9, r12, #16\n\t"
  110736. "mul r9, r8, r9\n\t"
  110737. "adds r6, r6, r9\n\t"
  110738. "adc r7, r7, #0\n\t"
  110739. "lsl r9, r12, #16\n\t"
  110740. "lsr r9, r9, #16\n\t"
  110741. "mul r8, r9, r8\n\t"
  110742. "lsr r9, r8, #16\n\t"
  110743. "lsl r8, r8, #16\n\t"
  110744. "adds r5, r5, r8\n\t"
  110745. "adcs r6, r6, r9\n\t"
  110746. "adc r7, r7, #0\n\t"
  110747. #else
  110748. "umull r8, r9, r10, r12\n\t"
  110749. "adds r5, r5, r8\n\t"
  110750. "adcs r6, r6, r9\n\t"
  110751. "adc r7, r7, #0\n\t"
  110752. #endif
  110753. /* A[6] * A[11] */
  110754. "ldr r10, [%[a], #44]\n\t"
  110755. "ldr r12, [%[a], #24]\n\t"
  110756. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  110757. "lsl r8, r10, #16\n\t"
  110758. "lsl r9, r12, #16\n\t"
  110759. "lsr r8, r8, #16\n\t"
  110760. "lsr r9, r9, #16\n\t"
  110761. "mul r9, r8, r9\n\t"
  110762. "adds r5, r5, r9\n\t"
  110763. "adcs r6, r6, #0\n\t"
  110764. "adc r7, r7, #0\n\t"
  110765. "lsr r9, r12, #16\n\t"
  110766. "mul r8, r9, r8\n\t"
  110767. "lsr r9, r8, #16\n\t"
  110768. "lsl r8, r8, #16\n\t"
  110769. "adds r5, r5, r8\n\t"
  110770. "adcs r6, r6, r9\n\t"
  110771. "adc r7, r7, #0\n\t"
  110772. "lsr r8, r10, #16\n\t"
  110773. "lsr r9, r12, #16\n\t"
  110774. "mul r9, r8, r9\n\t"
  110775. "adds r6, r6, r9\n\t"
  110776. "adc r7, r7, #0\n\t"
  110777. "lsl r9, r12, #16\n\t"
  110778. "lsr r9, r9, #16\n\t"
  110779. "mul r8, r9, r8\n\t"
  110780. "lsr r9, r8, #16\n\t"
  110781. "lsl r8, r8, #16\n\t"
  110782. "adds r5, r5, r8\n\t"
  110783. "adcs r6, r6, r9\n\t"
  110784. "adc r7, r7, #0\n\t"
  110785. #else
  110786. "umull r8, r9, r10, r12\n\t"
  110787. "adds r5, r5, r8\n\t"
  110788. "adcs r6, r6, r9\n\t"
  110789. "adc r7, r7, #0\n\t"
  110790. #endif
  110791. /* A[7] * A[10] */
  110792. "ldr r10, [%[a], #40]\n\t"
  110793. "ldr r12, [%[a], #28]\n\t"
  110794. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  110795. "lsl r8, r10, #16\n\t"
  110796. "lsl r9, r12, #16\n\t"
  110797. "lsr r8, r8, #16\n\t"
  110798. "lsr r9, r9, #16\n\t"
  110799. "mul r9, r8, r9\n\t"
  110800. "adds r5, r5, r9\n\t"
  110801. "adcs r6, r6, #0\n\t"
  110802. "adc r7, r7, #0\n\t"
  110803. "lsr r9, r12, #16\n\t"
  110804. "mul r8, r9, r8\n\t"
  110805. "lsr r9, r8, #16\n\t"
  110806. "lsl r8, r8, #16\n\t"
  110807. "adds r5, r5, r8\n\t"
  110808. "adcs r6, r6, r9\n\t"
  110809. "adc r7, r7, #0\n\t"
  110810. "lsr r8, r10, #16\n\t"
  110811. "lsr r9, r12, #16\n\t"
  110812. "mul r9, r8, r9\n\t"
  110813. "adds r6, r6, r9\n\t"
  110814. "adc r7, r7, #0\n\t"
  110815. "lsl r9, r12, #16\n\t"
  110816. "lsr r9, r9, #16\n\t"
  110817. "mul r8, r9, r8\n\t"
  110818. "lsr r9, r8, #16\n\t"
  110819. "lsl r8, r8, #16\n\t"
  110820. "adds r5, r5, r8\n\t"
  110821. "adcs r6, r6, r9\n\t"
  110822. "adc r7, r7, #0\n\t"
  110823. #else
  110824. "umull r8, r9, r10, r12\n\t"
  110825. "adds r5, r5, r8\n\t"
  110826. "adcs r6, r6, r9\n\t"
  110827. "adc r7, r7, #0\n\t"
  110828. #endif
  110829. /* A[8] * A[9] */
  110830. "ldr r10, [%[a], #36]\n\t"
  110831. "ldr r12, [%[a], #32]\n\t"
  110832. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  110833. "lsl r8, r10, #16\n\t"
  110834. "lsl r9, r12, #16\n\t"
  110835. "lsr r8, r8, #16\n\t"
  110836. "lsr r9, r9, #16\n\t"
  110837. "mul r9, r8, r9\n\t"
  110838. "adds r5, r5, r9\n\t"
  110839. "adcs r6, r6, #0\n\t"
  110840. "adc r7, r7, #0\n\t"
  110841. "lsr r9, r12, #16\n\t"
  110842. "mul r8, r9, r8\n\t"
  110843. "lsr r9, r8, #16\n\t"
  110844. "lsl r8, r8, #16\n\t"
  110845. "adds r5, r5, r8\n\t"
  110846. "adcs r6, r6, r9\n\t"
  110847. "adc r7, r7, #0\n\t"
  110848. "lsr r8, r10, #16\n\t"
  110849. "lsr r9, r12, #16\n\t"
  110850. "mul r9, r8, r9\n\t"
  110851. "adds r6, r6, r9\n\t"
  110852. "adc r7, r7, #0\n\t"
  110853. "lsl r9, r12, #16\n\t"
  110854. "lsr r9, r9, #16\n\t"
  110855. "mul r8, r9, r8\n\t"
  110856. "lsr r9, r8, #16\n\t"
  110857. "lsl r8, r8, #16\n\t"
  110858. "adds r5, r5, r8\n\t"
  110859. "adcs r6, r6, r9\n\t"
  110860. "adc r7, r7, #0\n\t"
  110861. #else
  110862. "umull r8, r9, r10, r12\n\t"
  110863. "adds r5, r5, r8\n\t"
  110864. "adcs r6, r6, r9\n\t"
  110865. "adc r7, r7, #0\n\t"
  110866. #endif
  110867. "adds r5, r5, r5\n\t"
  110868. "adcs r6, r6, r6\n\t"
  110869. "adc r7, r7, r7\n\t"
  110870. "adds r4, r4, r5\n\t"
  110871. "adcs r2, r2, r6\n\t"
  110872. "adc r3, r3, r7\n\t"
  110873. "str r4, [%[r], #68]\n\t"
  110874. /* A[2] * A[16] */
  110875. "ldr r10, [%[a], #64]\n\t"
  110876. "ldr r12, [%[a], #8]\n\t"
  110877. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  110878. "lsl r8, r10, #16\n\t"
  110879. "lsl r5, r12, #16\n\t"
  110880. "lsr r8, r8, #16\n\t"
  110881. "lsr r5, r5, #16\n\t"
  110882. "mul r5, r8, r5\n\t"
  110883. "lsr r9, r12, #16\n\t"
  110884. "mul r8, r9, r8\n\t"
  110885. "lsr r6, r8, #16\n\t"
  110886. "lsl r8, r8, #16\n\t"
  110887. "adds r5, r5, r8\n\t"
  110888. "adc r6, r6, #0\n\t"
  110889. "lsr r8, r10, #16\n\t"
  110890. "mul r9, r8, r9\n\t"
  110891. "add r6, r6, r9\n\t"
  110892. "lsl r9, r12, #16\n\t"
  110893. "lsr r9, r9, #16\n\t"
  110894. "mul r8, r9, r8\n\t"
  110895. "lsr r9, r8, #16\n\t"
  110896. "lsl r8, r8, #16\n\t"
  110897. "adds r5, r5, r8\n\t"
  110898. "adc r6, r6, r9\n\t"
  110899. #else
  110900. "umull r5, r6, r10, r12\n\t"
  110901. #endif
  110902. "mov r4, #0\n\t"
  110903. "mov r7, #0\n\t"
  110904. /* A[3] * A[15] */
  110905. "ldr r10, [%[a], #60]\n\t"
  110906. "ldr r12, [%[a], #12]\n\t"
  110907. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  110908. "lsl r8, r10, #16\n\t"
  110909. "lsl r9, r12, #16\n\t"
  110910. "lsr r8, r8, #16\n\t"
  110911. "lsr r9, r9, #16\n\t"
  110912. "mul r9, r8, r9\n\t"
  110913. "adds r5, r5, r9\n\t"
  110914. "adcs r6, r6, #0\n\t"
  110915. "adc r7, r7, #0\n\t"
  110916. "lsr r9, r12, #16\n\t"
  110917. "mul r8, r9, r8\n\t"
  110918. "lsr r9, r8, #16\n\t"
  110919. "lsl r8, r8, #16\n\t"
  110920. "adds r5, r5, r8\n\t"
  110921. "adcs r6, r6, r9\n\t"
  110922. "adc r7, r7, #0\n\t"
  110923. "lsr r8, r10, #16\n\t"
  110924. "lsr r9, r12, #16\n\t"
  110925. "mul r9, r8, r9\n\t"
  110926. "adds r6, r6, r9\n\t"
  110927. "adc r7, r7, #0\n\t"
  110928. "lsl r9, r12, #16\n\t"
  110929. "lsr r9, r9, #16\n\t"
  110930. "mul r8, r9, r8\n\t"
  110931. "lsr r9, r8, #16\n\t"
  110932. "lsl r8, r8, #16\n\t"
  110933. "adds r5, r5, r8\n\t"
  110934. "adcs r6, r6, r9\n\t"
  110935. "adc r7, r7, #0\n\t"
  110936. #else
  110937. "umull r8, r9, r10, r12\n\t"
  110938. "adds r5, r5, r8\n\t"
  110939. "adcs r6, r6, r9\n\t"
  110940. "adc r7, r7, #0\n\t"
  110941. #endif
  110942. /* A[4] * A[14] */
  110943. "ldr r10, [%[a], #56]\n\t"
  110944. "ldr r12, [%[a], #16]\n\t"
  110945. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  110946. "lsl r8, r10, #16\n\t"
  110947. "lsl r9, r12, #16\n\t"
  110948. "lsr r8, r8, #16\n\t"
  110949. "lsr r9, r9, #16\n\t"
  110950. "mul r9, r8, r9\n\t"
  110951. "adds r5, r5, r9\n\t"
  110952. "adcs r6, r6, #0\n\t"
  110953. "adc r7, r7, #0\n\t"
  110954. "lsr r9, r12, #16\n\t"
  110955. "mul r8, r9, r8\n\t"
  110956. "lsr r9, r8, #16\n\t"
  110957. "lsl r8, r8, #16\n\t"
  110958. "adds r5, r5, r8\n\t"
  110959. "adcs r6, r6, r9\n\t"
  110960. "adc r7, r7, #0\n\t"
  110961. "lsr r8, r10, #16\n\t"
  110962. "lsr r9, r12, #16\n\t"
  110963. "mul r9, r8, r9\n\t"
  110964. "adds r6, r6, r9\n\t"
  110965. "adc r7, r7, #0\n\t"
  110966. "lsl r9, r12, #16\n\t"
  110967. "lsr r9, r9, #16\n\t"
  110968. "mul r8, r9, r8\n\t"
  110969. "lsr r9, r8, #16\n\t"
  110970. "lsl r8, r8, #16\n\t"
  110971. "adds r5, r5, r8\n\t"
  110972. "adcs r6, r6, r9\n\t"
  110973. "adc r7, r7, #0\n\t"
  110974. #else
  110975. "umull r8, r9, r10, r12\n\t"
  110976. "adds r5, r5, r8\n\t"
  110977. "adcs r6, r6, r9\n\t"
  110978. "adc r7, r7, #0\n\t"
  110979. #endif
  110980. /* A[5] * A[13] */
  110981. "ldr r10, [%[a], #52]\n\t"
  110982. "ldr r12, [%[a], #20]\n\t"
  110983. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  110984. "lsl r8, r10, #16\n\t"
  110985. "lsl r9, r12, #16\n\t"
  110986. "lsr r8, r8, #16\n\t"
  110987. "lsr r9, r9, #16\n\t"
  110988. "mul r9, r8, r9\n\t"
  110989. "adds r5, r5, r9\n\t"
  110990. "adcs r6, r6, #0\n\t"
  110991. "adc r7, r7, #0\n\t"
  110992. "lsr r9, r12, #16\n\t"
  110993. "mul r8, r9, r8\n\t"
  110994. "lsr r9, r8, #16\n\t"
  110995. "lsl r8, r8, #16\n\t"
  110996. "adds r5, r5, r8\n\t"
  110997. "adcs r6, r6, r9\n\t"
  110998. "adc r7, r7, #0\n\t"
  110999. "lsr r8, r10, #16\n\t"
  111000. "lsr r9, r12, #16\n\t"
  111001. "mul r9, r8, r9\n\t"
  111002. "adds r6, r6, r9\n\t"
  111003. "adc r7, r7, #0\n\t"
  111004. "lsl r9, r12, #16\n\t"
  111005. "lsr r9, r9, #16\n\t"
  111006. "mul r8, r9, r8\n\t"
  111007. "lsr r9, r8, #16\n\t"
  111008. "lsl r8, r8, #16\n\t"
  111009. "adds r5, r5, r8\n\t"
  111010. "adcs r6, r6, r9\n\t"
  111011. "adc r7, r7, #0\n\t"
  111012. #else
  111013. "umull r8, r9, r10, r12\n\t"
  111014. "adds r5, r5, r8\n\t"
  111015. "adcs r6, r6, r9\n\t"
  111016. "adc r7, r7, #0\n\t"
  111017. #endif
  111018. /* A[6] * A[12] */
  111019. "ldr r10, [%[a], #48]\n\t"
  111020. "ldr r12, [%[a], #24]\n\t"
  111021. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  111022. "lsl r8, r10, #16\n\t"
  111023. "lsl r9, r12, #16\n\t"
  111024. "lsr r8, r8, #16\n\t"
  111025. "lsr r9, r9, #16\n\t"
  111026. "mul r9, r8, r9\n\t"
  111027. "adds r5, r5, r9\n\t"
  111028. "adcs r6, r6, #0\n\t"
  111029. "adc r7, r7, #0\n\t"
  111030. "lsr r9, r12, #16\n\t"
  111031. "mul r8, r9, r8\n\t"
  111032. "lsr r9, r8, #16\n\t"
  111033. "lsl r8, r8, #16\n\t"
  111034. "adds r5, r5, r8\n\t"
  111035. "adcs r6, r6, r9\n\t"
  111036. "adc r7, r7, #0\n\t"
  111037. "lsr r8, r10, #16\n\t"
  111038. "lsr r9, r12, #16\n\t"
  111039. "mul r9, r8, r9\n\t"
  111040. "adds r6, r6, r9\n\t"
  111041. "adc r7, r7, #0\n\t"
  111042. "lsl r9, r12, #16\n\t"
  111043. "lsr r9, r9, #16\n\t"
  111044. "mul r8, r9, r8\n\t"
  111045. "lsr r9, r8, #16\n\t"
  111046. "lsl r8, r8, #16\n\t"
  111047. "adds r5, r5, r8\n\t"
  111048. "adcs r6, r6, r9\n\t"
  111049. "adc r7, r7, #0\n\t"
  111050. #else
  111051. "umull r8, r9, r10, r12\n\t"
  111052. "adds r5, r5, r8\n\t"
  111053. "adcs r6, r6, r9\n\t"
  111054. "adc r7, r7, #0\n\t"
  111055. #endif
  111056. /* A[7] * A[11] */
  111057. "ldr r10, [%[a], #44]\n\t"
  111058. "ldr r12, [%[a], #28]\n\t"
  111059. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  111060. "lsl r8, r10, #16\n\t"
  111061. "lsl r9, r12, #16\n\t"
  111062. "lsr r8, r8, #16\n\t"
  111063. "lsr r9, r9, #16\n\t"
  111064. "mul r9, r8, r9\n\t"
  111065. "adds r5, r5, r9\n\t"
  111066. "adcs r6, r6, #0\n\t"
  111067. "adc r7, r7, #0\n\t"
  111068. "lsr r9, r12, #16\n\t"
  111069. "mul r8, r9, r8\n\t"
  111070. "lsr r9, r8, #16\n\t"
  111071. "lsl r8, r8, #16\n\t"
  111072. "adds r5, r5, r8\n\t"
  111073. "adcs r6, r6, r9\n\t"
  111074. "adc r7, r7, #0\n\t"
  111075. "lsr r8, r10, #16\n\t"
  111076. "lsr r9, r12, #16\n\t"
  111077. "mul r9, r8, r9\n\t"
  111078. "adds r6, r6, r9\n\t"
  111079. "adc r7, r7, #0\n\t"
  111080. "lsl r9, r12, #16\n\t"
  111081. "lsr r9, r9, #16\n\t"
  111082. "mul r8, r9, r8\n\t"
  111083. "lsr r9, r8, #16\n\t"
  111084. "lsl r8, r8, #16\n\t"
  111085. "adds r5, r5, r8\n\t"
  111086. "adcs r6, r6, r9\n\t"
  111087. "adc r7, r7, #0\n\t"
  111088. #else
  111089. "umull r8, r9, r10, r12\n\t"
  111090. "adds r5, r5, r8\n\t"
  111091. "adcs r6, r6, r9\n\t"
  111092. "adc r7, r7, #0\n\t"
  111093. #endif
  111094. /* A[8] * A[10] */
  111095. "ldr r10, [%[a], #40]\n\t"
  111096. "ldr r12, [%[a], #32]\n\t"
  111097. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  111098. "lsl r8, r10, #16\n\t"
  111099. "lsl r9, r12, #16\n\t"
  111100. "lsr r8, r8, #16\n\t"
  111101. "lsr r9, r9, #16\n\t"
  111102. "mul r9, r8, r9\n\t"
  111103. "adds r5, r5, r9\n\t"
  111104. "adcs r6, r6, #0\n\t"
  111105. "adc r7, r7, #0\n\t"
  111106. "lsr r9, r12, #16\n\t"
  111107. "mul r8, r9, r8\n\t"
  111108. "lsr r9, r8, #16\n\t"
  111109. "lsl r8, r8, #16\n\t"
  111110. "adds r5, r5, r8\n\t"
  111111. "adcs r6, r6, r9\n\t"
  111112. "adc r7, r7, #0\n\t"
  111113. "lsr r8, r10, #16\n\t"
  111114. "lsr r9, r12, #16\n\t"
  111115. "mul r9, r8, r9\n\t"
  111116. "adds r6, r6, r9\n\t"
  111117. "adc r7, r7, #0\n\t"
  111118. "lsl r9, r12, #16\n\t"
  111119. "lsr r9, r9, #16\n\t"
  111120. "mul r8, r9, r8\n\t"
  111121. "lsr r9, r8, #16\n\t"
  111122. "lsl r8, r8, #16\n\t"
  111123. "adds r5, r5, r8\n\t"
  111124. "adcs r6, r6, r9\n\t"
  111125. "adc r7, r7, #0\n\t"
  111126. #else
  111127. "umull r8, r9, r10, r12\n\t"
  111128. "adds r5, r5, r8\n\t"
  111129. "adcs r6, r6, r9\n\t"
  111130. "adc r7, r7, #0\n\t"
  111131. #endif
  111132. /* A[9] * A[9] */
  111133. "ldr r10, [%[a], #36]\n\t"
  111134. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  111135. "lsl r8, r10, #16\n\t"
  111136. "lsr r9, r10, #16\n\t"
  111137. "lsr r8, r8, #16\n\t"
  111138. "mov r12, r8\n\t"
  111139. "mul r8, r12, r8\n\t"
  111140. "mov r12, r9\n\t"
  111141. "mul r9, r12, r9\n\t"
  111142. "adds r2, r2, r8\n\t"
  111143. "adcs r3, r3, r9\n\t"
  111144. "adc r4, r4, #0\n\t"
  111145. "lsr r9, r10, #16\n\t"
  111146. "lsl r8, r10, #16\n\t"
  111147. "lsr r8, r8, #16\n\t"
  111148. "mul r8, r9, r8\n\t"
  111149. "lsr r9, r8, #15\n\t"
  111150. "lsl r8, r8, #17\n\t"
  111151. "adds r2, r2, r8\n\t"
  111152. "adcs r3, r3, r9\n\t"
  111153. "adc r4, r4, #0\n\t"
  111154. "adds r5, r5, r5\n\t"
  111155. "adcs r6, r6, r6\n\t"
  111156. "adc r7, r7, r7\n\t"
  111157. #else
  111158. "umull r8, r9, r10, r10\n\t"
  111159. "adds r5, r5, r5\n\t"
  111160. "adcs r6, r6, r6\n\t"
  111161. "adc r7, r7, r7\n\t"
  111162. "adds r2, r2, r8\n\t"
  111163. "adcs r3, r3, r9\n\t"
  111164. "adc r4, r4, #0\n\t"
  111165. #endif
  111166. "adds r2, r2, r5\n\t"
  111167. "adcs r3, r3, r6\n\t"
  111168. "adc r4, r4, r7\n\t"
  111169. "str r2, [%[r], #72]\n\t"
  111170. /* A[3] * A[16] */
  111171. "ldr r10, [%[a], #64]\n\t"
  111172. "ldr r12, [%[a], #12]\n\t"
  111173. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  111174. "lsl r8, r10, #16\n\t"
  111175. "lsl r5, r12, #16\n\t"
  111176. "lsr r8, r8, #16\n\t"
  111177. "lsr r5, r5, #16\n\t"
  111178. "mul r5, r8, r5\n\t"
  111179. "lsr r9, r12, #16\n\t"
  111180. "mul r8, r9, r8\n\t"
  111181. "lsr r6, r8, #16\n\t"
  111182. "lsl r8, r8, #16\n\t"
  111183. "adds r5, r5, r8\n\t"
  111184. "adc r6, r6, #0\n\t"
  111185. "lsr r8, r10, #16\n\t"
  111186. "mul r9, r8, r9\n\t"
  111187. "add r6, r6, r9\n\t"
  111188. "lsl r9, r12, #16\n\t"
  111189. "lsr r9, r9, #16\n\t"
  111190. "mul r8, r9, r8\n\t"
  111191. "lsr r9, r8, #16\n\t"
  111192. "lsl r8, r8, #16\n\t"
  111193. "adds r5, r5, r8\n\t"
  111194. "adc r6, r6, r9\n\t"
  111195. #else
  111196. "umull r5, r6, r10, r12\n\t"
  111197. #endif
  111198. "mov r2, #0\n\t"
  111199. "mov r7, #0\n\t"
  111200. /* A[4] * A[15] */
  111201. "ldr r10, [%[a], #60]\n\t"
  111202. "ldr r12, [%[a], #16]\n\t"
  111203. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  111204. "lsl r8, r10, #16\n\t"
  111205. "lsl r9, r12, #16\n\t"
  111206. "lsr r8, r8, #16\n\t"
  111207. "lsr r9, r9, #16\n\t"
  111208. "mul r9, r8, r9\n\t"
  111209. "adds r5, r5, r9\n\t"
  111210. "adcs r6, r6, #0\n\t"
  111211. "adc r7, r7, #0\n\t"
  111212. "lsr r9, r12, #16\n\t"
  111213. "mul r8, r9, r8\n\t"
  111214. "lsr r9, r8, #16\n\t"
  111215. "lsl r8, r8, #16\n\t"
  111216. "adds r5, r5, r8\n\t"
  111217. "adcs r6, r6, r9\n\t"
  111218. "adc r7, r7, #0\n\t"
  111219. "lsr r8, r10, #16\n\t"
  111220. "lsr r9, r12, #16\n\t"
  111221. "mul r9, r8, r9\n\t"
  111222. "adds r6, r6, r9\n\t"
  111223. "adc r7, r7, #0\n\t"
  111224. "lsl r9, r12, #16\n\t"
  111225. "lsr r9, r9, #16\n\t"
  111226. "mul r8, r9, r8\n\t"
  111227. "lsr r9, r8, #16\n\t"
  111228. "lsl r8, r8, #16\n\t"
  111229. "adds r5, r5, r8\n\t"
  111230. "adcs r6, r6, r9\n\t"
  111231. "adc r7, r7, #0\n\t"
  111232. #else
  111233. "umull r8, r9, r10, r12\n\t"
  111234. "adds r5, r5, r8\n\t"
  111235. "adcs r6, r6, r9\n\t"
  111236. "adc r7, r7, #0\n\t"
  111237. #endif
  111238. /* A[5] * A[14] */
  111239. "ldr r10, [%[a], #56]\n\t"
  111240. "ldr r12, [%[a], #20]\n\t"
  111241. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  111242. "lsl r8, r10, #16\n\t"
  111243. "lsl r9, r12, #16\n\t"
  111244. "lsr r8, r8, #16\n\t"
  111245. "lsr r9, r9, #16\n\t"
  111246. "mul r9, r8, r9\n\t"
  111247. "adds r5, r5, r9\n\t"
  111248. "adcs r6, r6, #0\n\t"
  111249. "adc r7, r7, #0\n\t"
  111250. "lsr r9, r12, #16\n\t"
  111251. "mul r8, r9, r8\n\t"
  111252. "lsr r9, r8, #16\n\t"
  111253. "lsl r8, r8, #16\n\t"
  111254. "adds r5, r5, r8\n\t"
  111255. "adcs r6, r6, r9\n\t"
  111256. "adc r7, r7, #0\n\t"
  111257. "lsr r8, r10, #16\n\t"
  111258. "lsr r9, r12, #16\n\t"
  111259. "mul r9, r8, r9\n\t"
  111260. "adds r6, r6, r9\n\t"
  111261. "adc r7, r7, #0\n\t"
  111262. "lsl r9, r12, #16\n\t"
  111263. "lsr r9, r9, #16\n\t"
  111264. "mul r8, r9, r8\n\t"
  111265. "lsr r9, r8, #16\n\t"
  111266. "lsl r8, r8, #16\n\t"
  111267. "adds r5, r5, r8\n\t"
  111268. "adcs r6, r6, r9\n\t"
  111269. "adc r7, r7, #0\n\t"
  111270. #else
  111271. "umull r8, r9, r10, r12\n\t"
  111272. "adds r5, r5, r8\n\t"
  111273. "adcs r6, r6, r9\n\t"
  111274. "adc r7, r7, #0\n\t"
  111275. #endif
  111276. /* A[6] * A[13] */
  111277. "ldr r10, [%[a], #52]\n\t"
  111278. "ldr r12, [%[a], #24]\n\t"
  111279. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  111280. "lsl r8, r10, #16\n\t"
  111281. "lsl r9, r12, #16\n\t"
  111282. "lsr r8, r8, #16\n\t"
  111283. "lsr r9, r9, #16\n\t"
  111284. "mul r9, r8, r9\n\t"
  111285. "adds r5, r5, r9\n\t"
  111286. "adcs r6, r6, #0\n\t"
  111287. "adc r7, r7, #0\n\t"
  111288. "lsr r9, r12, #16\n\t"
  111289. "mul r8, r9, r8\n\t"
  111290. "lsr r9, r8, #16\n\t"
  111291. "lsl r8, r8, #16\n\t"
  111292. "adds r5, r5, r8\n\t"
  111293. "adcs r6, r6, r9\n\t"
  111294. "adc r7, r7, #0\n\t"
  111295. "lsr r8, r10, #16\n\t"
  111296. "lsr r9, r12, #16\n\t"
  111297. "mul r9, r8, r9\n\t"
  111298. "adds r6, r6, r9\n\t"
  111299. "adc r7, r7, #0\n\t"
  111300. "lsl r9, r12, #16\n\t"
  111301. "lsr r9, r9, #16\n\t"
  111302. "mul r8, r9, r8\n\t"
  111303. "lsr r9, r8, #16\n\t"
  111304. "lsl r8, r8, #16\n\t"
  111305. "adds r5, r5, r8\n\t"
  111306. "adcs r6, r6, r9\n\t"
  111307. "adc r7, r7, #0\n\t"
  111308. #else
  111309. "umull r8, r9, r10, r12\n\t"
  111310. "adds r5, r5, r8\n\t"
  111311. "adcs r6, r6, r9\n\t"
  111312. "adc r7, r7, #0\n\t"
  111313. #endif
  111314. /* A[7] * A[12] */
  111315. "ldr r10, [%[a], #48]\n\t"
  111316. "ldr r12, [%[a], #28]\n\t"
  111317. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  111318. "lsl r8, r10, #16\n\t"
  111319. "lsl r9, r12, #16\n\t"
  111320. "lsr r8, r8, #16\n\t"
  111321. "lsr r9, r9, #16\n\t"
  111322. "mul r9, r8, r9\n\t"
  111323. "adds r5, r5, r9\n\t"
  111324. "adcs r6, r6, #0\n\t"
  111325. "adc r7, r7, #0\n\t"
  111326. "lsr r9, r12, #16\n\t"
  111327. "mul r8, r9, r8\n\t"
  111328. "lsr r9, r8, #16\n\t"
  111329. "lsl r8, r8, #16\n\t"
  111330. "adds r5, r5, r8\n\t"
  111331. "adcs r6, r6, r9\n\t"
  111332. "adc r7, r7, #0\n\t"
  111333. "lsr r8, r10, #16\n\t"
  111334. "lsr r9, r12, #16\n\t"
  111335. "mul r9, r8, r9\n\t"
  111336. "adds r6, r6, r9\n\t"
  111337. "adc r7, r7, #0\n\t"
  111338. "lsl r9, r12, #16\n\t"
  111339. "lsr r9, r9, #16\n\t"
  111340. "mul r8, r9, r8\n\t"
  111341. "lsr r9, r8, #16\n\t"
  111342. "lsl r8, r8, #16\n\t"
  111343. "adds r5, r5, r8\n\t"
  111344. "adcs r6, r6, r9\n\t"
  111345. "adc r7, r7, #0\n\t"
  111346. #else
  111347. "umull r8, r9, r10, r12\n\t"
  111348. "adds r5, r5, r8\n\t"
  111349. "adcs r6, r6, r9\n\t"
  111350. "adc r7, r7, #0\n\t"
  111351. #endif
  111352. /* A[8] * A[11] */
  111353. "ldr r10, [%[a], #44]\n\t"
  111354. "ldr r12, [%[a], #32]\n\t"
  111355. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  111356. "lsl r8, r10, #16\n\t"
  111357. "lsl r9, r12, #16\n\t"
  111358. "lsr r8, r8, #16\n\t"
  111359. "lsr r9, r9, #16\n\t"
  111360. "mul r9, r8, r9\n\t"
  111361. "adds r5, r5, r9\n\t"
  111362. "adcs r6, r6, #0\n\t"
  111363. "adc r7, r7, #0\n\t"
  111364. "lsr r9, r12, #16\n\t"
  111365. "mul r8, r9, r8\n\t"
  111366. "lsr r9, r8, #16\n\t"
  111367. "lsl r8, r8, #16\n\t"
  111368. "adds r5, r5, r8\n\t"
  111369. "adcs r6, r6, r9\n\t"
  111370. "adc r7, r7, #0\n\t"
  111371. "lsr r8, r10, #16\n\t"
  111372. "lsr r9, r12, #16\n\t"
  111373. "mul r9, r8, r9\n\t"
  111374. "adds r6, r6, r9\n\t"
  111375. "adc r7, r7, #0\n\t"
  111376. "lsl r9, r12, #16\n\t"
  111377. "lsr r9, r9, #16\n\t"
  111378. "mul r8, r9, r8\n\t"
  111379. "lsr r9, r8, #16\n\t"
  111380. "lsl r8, r8, #16\n\t"
  111381. "adds r5, r5, r8\n\t"
  111382. "adcs r6, r6, r9\n\t"
  111383. "adc r7, r7, #0\n\t"
  111384. #else
  111385. "umull r8, r9, r10, r12\n\t"
  111386. "adds r5, r5, r8\n\t"
  111387. "adcs r6, r6, r9\n\t"
  111388. "adc r7, r7, #0\n\t"
  111389. #endif
  111390. /* A[9] * A[10] */
  111391. "ldr r10, [%[a], #40]\n\t"
  111392. "ldr r12, [%[a], #36]\n\t"
  111393. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  111394. "lsl r8, r10, #16\n\t"
  111395. "lsl r9, r12, #16\n\t"
  111396. "lsr r8, r8, #16\n\t"
  111397. "lsr r9, r9, #16\n\t"
  111398. "mul r9, r8, r9\n\t"
  111399. "adds r5, r5, r9\n\t"
  111400. "adcs r6, r6, #0\n\t"
  111401. "adc r7, r7, #0\n\t"
  111402. "lsr r9, r12, #16\n\t"
  111403. "mul r8, r9, r8\n\t"
  111404. "lsr r9, r8, #16\n\t"
  111405. "lsl r8, r8, #16\n\t"
  111406. "adds r5, r5, r8\n\t"
  111407. "adcs r6, r6, r9\n\t"
  111408. "adc r7, r7, #0\n\t"
  111409. "lsr r8, r10, #16\n\t"
  111410. "lsr r9, r12, #16\n\t"
  111411. "mul r9, r8, r9\n\t"
  111412. "adds r6, r6, r9\n\t"
  111413. "adc r7, r7, #0\n\t"
  111414. "lsl r9, r12, #16\n\t"
  111415. "lsr r9, r9, #16\n\t"
  111416. "mul r8, r9, r8\n\t"
  111417. "lsr r9, r8, #16\n\t"
  111418. "lsl r8, r8, #16\n\t"
  111419. "adds r5, r5, r8\n\t"
  111420. "adcs r6, r6, r9\n\t"
  111421. "adc r7, r7, #0\n\t"
  111422. #else
  111423. "umull r8, r9, r10, r12\n\t"
  111424. "adds r5, r5, r8\n\t"
  111425. "adcs r6, r6, r9\n\t"
  111426. "adc r7, r7, #0\n\t"
  111427. #endif
  111428. "adds r5, r5, r5\n\t"
  111429. "adcs r6, r6, r6\n\t"
  111430. "adc r7, r7, r7\n\t"
  111431. "adds r3, r3, r5\n\t"
  111432. "adcs r4, r4, r6\n\t"
  111433. "adc r2, r2, r7\n\t"
  111434. "str r3, [%[r], #76]\n\t"
  111435. /* A[4] * A[16] */
  111436. "ldr r10, [%[a], #64]\n\t"
  111437. "ldr r12, [%[a], #16]\n\t"
  111438. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  111439. "lsl r8, r10, #16\n\t"
  111440. "lsl r5, r12, #16\n\t"
  111441. "lsr r8, r8, #16\n\t"
  111442. "lsr r5, r5, #16\n\t"
  111443. "mul r5, r8, r5\n\t"
  111444. "lsr r9, r12, #16\n\t"
  111445. "mul r8, r9, r8\n\t"
  111446. "lsr r6, r8, #16\n\t"
  111447. "lsl r8, r8, #16\n\t"
  111448. "adds r5, r5, r8\n\t"
  111449. "adc r6, r6, #0\n\t"
  111450. "lsr r8, r10, #16\n\t"
  111451. "mul r9, r8, r9\n\t"
  111452. "add r6, r6, r9\n\t"
  111453. "lsl r9, r12, #16\n\t"
  111454. "lsr r9, r9, #16\n\t"
  111455. "mul r8, r9, r8\n\t"
  111456. "lsr r9, r8, #16\n\t"
  111457. "lsl r8, r8, #16\n\t"
  111458. "adds r5, r5, r8\n\t"
  111459. "adc r6, r6, r9\n\t"
  111460. #else
  111461. "umull r5, r6, r10, r12\n\t"
  111462. #endif
  111463. "mov r3, #0\n\t"
  111464. "mov r7, #0\n\t"
  111465. /* A[5] * A[15] */
  111466. "ldr r10, [%[a], #60]\n\t"
  111467. "ldr r12, [%[a], #20]\n\t"
  111468. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  111469. "lsl r8, r10, #16\n\t"
  111470. "lsl r9, r12, #16\n\t"
  111471. "lsr r8, r8, #16\n\t"
  111472. "lsr r9, r9, #16\n\t"
  111473. "mul r9, r8, r9\n\t"
  111474. "adds r5, r5, r9\n\t"
  111475. "adcs r6, r6, #0\n\t"
  111476. "adc r7, r7, #0\n\t"
  111477. "lsr r9, r12, #16\n\t"
  111478. "mul r8, r9, r8\n\t"
  111479. "lsr r9, r8, #16\n\t"
  111480. "lsl r8, r8, #16\n\t"
  111481. "adds r5, r5, r8\n\t"
  111482. "adcs r6, r6, r9\n\t"
  111483. "adc r7, r7, #0\n\t"
  111484. "lsr r8, r10, #16\n\t"
  111485. "lsr r9, r12, #16\n\t"
  111486. "mul r9, r8, r9\n\t"
  111487. "adds r6, r6, r9\n\t"
  111488. "adc r7, r7, #0\n\t"
  111489. "lsl r9, r12, #16\n\t"
  111490. "lsr r9, r9, #16\n\t"
  111491. "mul r8, r9, r8\n\t"
  111492. "lsr r9, r8, #16\n\t"
  111493. "lsl r8, r8, #16\n\t"
  111494. "adds r5, r5, r8\n\t"
  111495. "adcs r6, r6, r9\n\t"
  111496. "adc r7, r7, #0\n\t"
  111497. #else
  111498. "umull r8, r9, r10, r12\n\t"
  111499. "adds r5, r5, r8\n\t"
  111500. "adcs r6, r6, r9\n\t"
  111501. "adc r7, r7, #0\n\t"
  111502. #endif
  111503. /* A[6] * A[14] */
  111504. "ldr r10, [%[a], #56]\n\t"
  111505. "ldr r12, [%[a], #24]\n\t"
  111506. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  111507. "lsl r8, r10, #16\n\t"
  111508. "lsl r9, r12, #16\n\t"
  111509. "lsr r8, r8, #16\n\t"
  111510. "lsr r9, r9, #16\n\t"
  111511. "mul r9, r8, r9\n\t"
  111512. "adds r5, r5, r9\n\t"
  111513. "adcs r6, r6, #0\n\t"
  111514. "adc r7, r7, #0\n\t"
  111515. "lsr r9, r12, #16\n\t"
  111516. "mul r8, r9, r8\n\t"
  111517. "lsr r9, r8, #16\n\t"
  111518. "lsl r8, r8, #16\n\t"
  111519. "adds r5, r5, r8\n\t"
  111520. "adcs r6, r6, r9\n\t"
  111521. "adc r7, r7, #0\n\t"
  111522. "lsr r8, r10, #16\n\t"
  111523. "lsr r9, r12, #16\n\t"
  111524. "mul r9, r8, r9\n\t"
  111525. "adds r6, r6, r9\n\t"
  111526. "adc r7, r7, #0\n\t"
  111527. "lsl r9, r12, #16\n\t"
  111528. "lsr r9, r9, #16\n\t"
  111529. "mul r8, r9, r8\n\t"
  111530. "lsr r9, r8, #16\n\t"
  111531. "lsl r8, r8, #16\n\t"
  111532. "adds r5, r5, r8\n\t"
  111533. "adcs r6, r6, r9\n\t"
  111534. "adc r7, r7, #0\n\t"
  111535. #else
  111536. "umull r8, r9, r10, r12\n\t"
  111537. "adds r5, r5, r8\n\t"
  111538. "adcs r6, r6, r9\n\t"
  111539. "adc r7, r7, #0\n\t"
  111540. #endif
  111541. /* A[7] * A[13] */
  111542. "ldr r10, [%[a], #52]\n\t"
  111543. "ldr r12, [%[a], #28]\n\t"
  111544. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  111545. "lsl r8, r10, #16\n\t"
  111546. "lsl r9, r12, #16\n\t"
  111547. "lsr r8, r8, #16\n\t"
  111548. "lsr r9, r9, #16\n\t"
  111549. "mul r9, r8, r9\n\t"
  111550. "adds r5, r5, r9\n\t"
  111551. "adcs r6, r6, #0\n\t"
  111552. "adc r7, r7, #0\n\t"
  111553. "lsr r9, r12, #16\n\t"
  111554. "mul r8, r9, r8\n\t"
  111555. "lsr r9, r8, #16\n\t"
  111556. "lsl r8, r8, #16\n\t"
  111557. "adds r5, r5, r8\n\t"
  111558. "adcs r6, r6, r9\n\t"
  111559. "adc r7, r7, #0\n\t"
  111560. "lsr r8, r10, #16\n\t"
  111561. "lsr r9, r12, #16\n\t"
  111562. "mul r9, r8, r9\n\t"
  111563. "adds r6, r6, r9\n\t"
  111564. "adc r7, r7, #0\n\t"
  111565. "lsl r9, r12, #16\n\t"
  111566. "lsr r9, r9, #16\n\t"
  111567. "mul r8, r9, r8\n\t"
  111568. "lsr r9, r8, #16\n\t"
  111569. "lsl r8, r8, #16\n\t"
  111570. "adds r5, r5, r8\n\t"
  111571. "adcs r6, r6, r9\n\t"
  111572. "adc r7, r7, #0\n\t"
  111573. #else
  111574. "umull r8, r9, r10, r12\n\t"
  111575. "adds r5, r5, r8\n\t"
  111576. "adcs r6, r6, r9\n\t"
  111577. "adc r7, r7, #0\n\t"
  111578. #endif
  111579. /* A[8] * A[12] */
  111580. "ldr r10, [%[a], #48]\n\t"
  111581. "ldr r12, [%[a], #32]\n\t"
  111582. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  111583. "lsl r8, r10, #16\n\t"
  111584. "lsl r9, r12, #16\n\t"
  111585. "lsr r8, r8, #16\n\t"
  111586. "lsr r9, r9, #16\n\t"
  111587. "mul r9, r8, r9\n\t"
  111588. "adds r5, r5, r9\n\t"
  111589. "adcs r6, r6, #0\n\t"
  111590. "adc r7, r7, #0\n\t"
  111591. "lsr r9, r12, #16\n\t"
  111592. "mul r8, r9, r8\n\t"
  111593. "lsr r9, r8, #16\n\t"
  111594. "lsl r8, r8, #16\n\t"
  111595. "adds r5, r5, r8\n\t"
  111596. "adcs r6, r6, r9\n\t"
  111597. "adc r7, r7, #0\n\t"
  111598. "lsr r8, r10, #16\n\t"
  111599. "lsr r9, r12, #16\n\t"
  111600. "mul r9, r8, r9\n\t"
  111601. "adds r6, r6, r9\n\t"
  111602. "adc r7, r7, #0\n\t"
  111603. "lsl r9, r12, #16\n\t"
  111604. "lsr r9, r9, #16\n\t"
  111605. "mul r8, r9, r8\n\t"
  111606. "lsr r9, r8, #16\n\t"
  111607. "lsl r8, r8, #16\n\t"
  111608. "adds r5, r5, r8\n\t"
  111609. "adcs r6, r6, r9\n\t"
  111610. "adc r7, r7, #0\n\t"
  111611. #else
  111612. "umull r8, r9, r10, r12\n\t"
  111613. "adds r5, r5, r8\n\t"
  111614. "adcs r6, r6, r9\n\t"
  111615. "adc r7, r7, #0\n\t"
  111616. #endif
  111617. /* A[9] * A[11] */
  111618. "ldr r10, [%[a], #44]\n\t"
  111619. "ldr r12, [%[a], #36]\n\t"
  111620. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  111621. "lsl r8, r10, #16\n\t"
  111622. "lsl r9, r12, #16\n\t"
  111623. "lsr r8, r8, #16\n\t"
  111624. "lsr r9, r9, #16\n\t"
  111625. "mul r9, r8, r9\n\t"
  111626. "adds r5, r5, r9\n\t"
  111627. "adcs r6, r6, #0\n\t"
  111628. "adc r7, r7, #0\n\t"
  111629. "lsr r9, r12, #16\n\t"
  111630. "mul r8, r9, r8\n\t"
  111631. "lsr r9, r8, #16\n\t"
  111632. "lsl r8, r8, #16\n\t"
  111633. "adds r5, r5, r8\n\t"
  111634. "adcs r6, r6, r9\n\t"
  111635. "adc r7, r7, #0\n\t"
  111636. "lsr r8, r10, #16\n\t"
  111637. "lsr r9, r12, #16\n\t"
  111638. "mul r9, r8, r9\n\t"
  111639. "adds r6, r6, r9\n\t"
  111640. "adc r7, r7, #0\n\t"
  111641. "lsl r9, r12, #16\n\t"
  111642. "lsr r9, r9, #16\n\t"
  111643. "mul r8, r9, r8\n\t"
  111644. "lsr r9, r8, #16\n\t"
  111645. "lsl r8, r8, #16\n\t"
  111646. "adds r5, r5, r8\n\t"
  111647. "adcs r6, r6, r9\n\t"
  111648. "adc r7, r7, #0\n\t"
  111649. #else
  111650. "umull r8, r9, r10, r12\n\t"
  111651. "adds r5, r5, r8\n\t"
  111652. "adcs r6, r6, r9\n\t"
  111653. "adc r7, r7, #0\n\t"
  111654. #endif
  111655. /* A[10] * A[10] */
  111656. "ldr r10, [%[a], #40]\n\t"
  111657. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  111658. "lsl r8, r10, #16\n\t"
  111659. "lsr r9, r10, #16\n\t"
  111660. "lsr r8, r8, #16\n\t"
  111661. "mov r12, r8\n\t"
  111662. "mul r8, r12, r8\n\t"
  111663. "mov r12, r9\n\t"
  111664. "mul r9, r12, r9\n\t"
  111665. "adds r4, r4, r8\n\t"
  111666. "adcs r2, r2, r9\n\t"
  111667. "adc r3, r3, #0\n\t"
  111668. "lsr r9, r10, #16\n\t"
  111669. "lsl r8, r10, #16\n\t"
  111670. "lsr r8, r8, #16\n\t"
  111671. "mul r8, r9, r8\n\t"
  111672. "lsr r9, r8, #15\n\t"
  111673. "lsl r8, r8, #17\n\t"
  111674. "adds r4, r4, r8\n\t"
  111675. "adcs r2, r2, r9\n\t"
  111676. "adc r3, r3, #0\n\t"
  111677. "adds r5, r5, r5\n\t"
  111678. "adcs r6, r6, r6\n\t"
  111679. "adc r7, r7, r7\n\t"
  111680. #else
  111681. "umull r8, r9, r10, r10\n\t"
  111682. "adds r5, r5, r5\n\t"
  111683. "adcs r6, r6, r6\n\t"
  111684. "adc r7, r7, r7\n\t"
  111685. "adds r4, r4, r8\n\t"
  111686. "adcs r2, r2, r9\n\t"
  111687. "adc r3, r3, #0\n\t"
  111688. #endif
  111689. "adds r4, r4, r5\n\t"
  111690. "adcs r2, r2, r6\n\t"
  111691. "adc r3, r3, r7\n\t"
  111692. "str r4, [%[r], #80]\n\t"
  111693. /* A[5] * A[16] */
  111694. "ldr r10, [%[a], #64]\n\t"
  111695. "ldr r12, [%[a], #20]\n\t"
  111696. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  111697. "lsl r8, r10, #16\n\t"
  111698. "lsl r5, r12, #16\n\t"
  111699. "lsr r8, r8, #16\n\t"
  111700. "lsr r5, r5, #16\n\t"
  111701. "mul r5, r8, r5\n\t"
  111702. "lsr r9, r12, #16\n\t"
  111703. "mul r8, r9, r8\n\t"
  111704. "lsr r6, r8, #16\n\t"
  111705. "lsl r8, r8, #16\n\t"
  111706. "adds r5, r5, r8\n\t"
  111707. "adc r6, r6, #0\n\t"
  111708. "lsr r8, r10, #16\n\t"
  111709. "mul r9, r8, r9\n\t"
  111710. "add r6, r6, r9\n\t"
  111711. "lsl r9, r12, #16\n\t"
  111712. "lsr r9, r9, #16\n\t"
  111713. "mul r8, r9, r8\n\t"
  111714. "lsr r9, r8, #16\n\t"
  111715. "lsl r8, r8, #16\n\t"
  111716. "adds r5, r5, r8\n\t"
  111717. "adc r6, r6, r9\n\t"
  111718. #else
  111719. "umull r5, r6, r10, r12\n\t"
  111720. #endif
  111721. "mov r4, #0\n\t"
  111722. "mov r7, #0\n\t"
  111723. /* A[6] * A[15] */
  111724. "ldr r10, [%[a], #60]\n\t"
  111725. "ldr r12, [%[a], #24]\n\t"
  111726. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  111727. "lsl r8, r10, #16\n\t"
  111728. "lsl r9, r12, #16\n\t"
  111729. "lsr r8, r8, #16\n\t"
  111730. "lsr r9, r9, #16\n\t"
  111731. "mul r9, r8, r9\n\t"
  111732. "adds r5, r5, r9\n\t"
  111733. "adcs r6, r6, #0\n\t"
  111734. "adc r7, r7, #0\n\t"
  111735. "lsr r9, r12, #16\n\t"
  111736. "mul r8, r9, r8\n\t"
  111737. "lsr r9, r8, #16\n\t"
  111738. "lsl r8, r8, #16\n\t"
  111739. "adds r5, r5, r8\n\t"
  111740. "adcs r6, r6, r9\n\t"
  111741. "adc r7, r7, #0\n\t"
  111742. "lsr r8, r10, #16\n\t"
  111743. "lsr r9, r12, #16\n\t"
  111744. "mul r9, r8, r9\n\t"
  111745. "adds r6, r6, r9\n\t"
  111746. "adc r7, r7, #0\n\t"
  111747. "lsl r9, r12, #16\n\t"
  111748. "lsr r9, r9, #16\n\t"
  111749. "mul r8, r9, r8\n\t"
  111750. "lsr r9, r8, #16\n\t"
  111751. "lsl r8, r8, #16\n\t"
  111752. "adds r5, r5, r8\n\t"
  111753. "adcs r6, r6, r9\n\t"
  111754. "adc r7, r7, #0\n\t"
  111755. #else
  111756. "umull r8, r9, r10, r12\n\t"
  111757. "adds r5, r5, r8\n\t"
  111758. "adcs r6, r6, r9\n\t"
  111759. "adc r7, r7, #0\n\t"
  111760. #endif
  111761. /* A[7] * A[14] */
  111762. "ldr r10, [%[a], #56]\n\t"
  111763. "ldr r12, [%[a], #28]\n\t"
  111764. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  111765. "lsl r8, r10, #16\n\t"
  111766. "lsl r9, r12, #16\n\t"
  111767. "lsr r8, r8, #16\n\t"
  111768. "lsr r9, r9, #16\n\t"
  111769. "mul r9, r8, r9\n\t"
  111770. "adds r5, r5, r9\n\t"
  111771. "adcs r6, r6, #0\n\t"
  111772. "adc r7, r7, #0\n\t"
  111773. "lsr r9, r12, #16\n\t"
  111774. "mul r8, r9, r8\n\t"
  111775. "lsr r9, r8, #16\n\t"
  111776. "lsl r8, r8, #16\n\t"
  111777. "adds r5, r5, r8\n\t"
  111778. "adcs r6, r6, r9\n\t"
  111779. "adc r7, r7, #0\n\t"
  111780. "lsr r8, r10, #16\n\t"
  111781. "lsr r9, r12, #16\n\t"
  111782. "mul r9, r8, r9\n\t"
  111783. "adds r6, r6, r9\n\t"
  111784. "adc r7, r7, #0\n\t"
  111785. "lsl r9, r12, #16\n\t"
  111786. "lsr r9, r9, #16\n\t"
  111787. "mul r8, r9, r8\n\t"
  111788. "lsr r9, r8, #16\n\t"
  111789. "lsl r8, r8, #16\n\t"
  111790. "adds r5, r5, r8\n\t"
  111791. "adcs r6, r6, r9\n\t"
  111792. "adc r7, r7, #0\n\t"
  111793. #else
  111794. "umull r8, r9, r10, r12\n\t"
  111795. "adds r5, r5, r8\n\t"
  111796. "adcs r6, r6, r9\n\t"
  111797. "adc r7, r7, #0\n\t"
  111798. #endif
  111799. /* A[8] * A[13] */
  111800. "ldr r10, [%[a], #52]\n\t"
  111801. "ldr r12, [%[a], #32]\n\t"
  111802. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  111803. "lsl r8, r10, #16\n\t"
  111804. "lsl r9, r12, #16\n\t"
  111805. "lsr r8, r8, #16\n\t"
  111806. "lsr r9, r9, #16\n\t"
  111807. "mul r9, r8, r9\n\t"
  111808. "adds r5, r5, r9\n\t"
  111809. "adcs r6, r6, #0\n\t"
  111810. "adc r7, r7, #0\n\t"
  111811. "lsr r9, r12, #16\n\t"
  111812. "mul r8, r9, r8\n\t"
  111813. "lsr r9, r8, #16\n\t"
  111814. "lsl r8, r8, #16\n\t"
  111815. "adds r5, r5, r8\n\t"
  111816. "adcs r6, r6, r9\n\t"
  111817. "adc r7, r7, #0\n\t"
  111818. "lsr r8, r10, #16\n\t"
  111819. "lsr r9, r12, #16\n\t"
  111820. "mul r9, r8, r9\n\t"
  111821. "adds r6, r6, r9\n\t"
  111822. "adc r7, r7, #0\n\t"
  111823. "lsl r9, r12, #16\n\t"
  111824. "lsr r9, r9, #16\n\t"
  111825. "mul r8, r9, r8\n\t"
  111826. "lsr r9, r8, #16\n\t"
  111827. "lsl r8, r8, #16\n\t"
  111828. "adds r5, r5, r8\n\t"
  111829. "adcs r6, r6, r9\n\t"
  111830. "adc r7, r7, #0\n\t"
  111831. #else
  111832. "umull r8, r9, r10, r12\n\t"
  111833. "adds r5, r5, r8\n\t"
  111834. "adcs r6, r6, r9\n\t"
  111835. "adc r7, r7, #0\n\t"
  111836. #endif
  111837. /* A[9] * A[12] */
  111838. "ldr r10, [%[a], #48]\n\t"
  111839. "ldr r12, [%[a], #36]\n\t"
  111840. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  111841. "lsl r8, r10, #16\n\t"
  111842. "lsl r9, r12, #16\n\t"
  111843. "lsr r8, r8, #16\n\t"
  111844. "lsr r9, r9, #16\n\t"
  111845. "mul r9, r8, r9\n\t"
  111846. "adds r5, r5, r9\n\t"
  111847. "adcs r6, r6, #0\n\t"
  111848. "adc r7, r7, #0\n\t"
  111849. "lsr r9, r12, #16\n\t"
  111850. "mul r8, r9, r8\n\t"
  111851. "lsr r9, r8, #16\n\t"
  111852. "lsl r8, r8, #16\n\t"
  111853. "adds r5, r5, r8\n\t"
  111854. "adcs r6, r6, r9\n\t"
  111855. "adc r7, r7, #0\n\t"
  111856. "lsr r8, r10, #16\n\t"
  111857. "lsr r9, r12, #16\n\t"
  111858. "mul r9, r8, r9\n\t"
  111859. "adds r6, r6, r9\n\t"
  111860. "adc r7, r7, #0\n\t"
  111861. "lsl r9, r12, #16\n\t"
  111862. "lsr r9, r9, #16\n\t"
  111863. "mul r8, r9, r8\n\t"
  111864. "lsr r9, r8, #16\n\t"
  111865. "lsl r8, r8, #16\n\t"
  111866. "adds r5, r5, r8\n\t"
  111867. "adcs r6, r6, r9\n\t"
  111868. "adc r7, r7, #0\n\t"
  111869. #else
  111870. "umull r8, r9, r10, r12\n\t"
  111871. "adds r5, r5, r8\n\t"
  111872. "adcs r6, r6, r9\n\t"
  111873. "adc r7, r7, #0\n\t"
  111874. #endif
  111875. /* A[10] * A[11] */
  111876. "ldr r10, [%[a], #44]\n\t"
  111877. "ldr r12, [%[a], #40]\n\t"
  111878. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  111879. "lsl r8, r10, #16\n\t"
  111880. "lsl r9, r12, #16\n\t"
  111881. "lsr r8, r8, #16\n\t"
  111882. "lsr r9, r9, #16\n\t"
  111883. "mul r9, r8, r9\n\t"
  111884. "adds r5, r5, r9\n\t"
  111885. "adcs r6, r6, #0\n\t"
  111886. "adc r7, r7, #0\n\t"
  111887. "lsr r9, r12, #16\n\t"
  111888. "mul r8, r9, r8\n\t"
  111889. "lsr r9, r8, #16\n\t"
  111890. "lsl r8, r8, #16\n\t"
  111891. "adds r5, r5, r8\n\t"
  111892. "adcs r6, r6, r9\n\t"
  111893. "adc r7, r7, #0\n\t"
  111894. "lsr r8, r10, #16\n\t"
  111895. "lsr r9, r12, #16\n\t"
  111896. "mul r9, r8, r9\n\t"
  111897. "adds r6, r6, r9\n\t"
  111898. "adc r7, r7, #0\n\t"
  111899. "lsl r9, r12, #16\n\t"
  111900. "lsr r9, r9, #16\n\t"
  111901. "mul r8, r9, r8\n\t"
  111902. "lsr r9, r8, #16\n\t"
  111903. "lsl r8, r8, #16\n\t"
  111904. "adds r5, r5, r8\n\t"
  111905. "adcs r6, r6, r9\n\t"
  111906. "adc r7, r7, #0\n\t"
  111907. #else
  111908. "umull r8, r9, r10, r12\n\t"
  111909. "adds r5, r5, r8\n\t"
  111910. "adcs r6, r6, r9\n\t"
  111911. "adc r7, r7, #0\n\t"
  111912. #endif
  111913. "adds r5, r5, r5\n\t"
  111914. "adcs r6, r6, r6\n\t"
  111915. "adc r7, r7, r7\n\t"
  111916. "adds r2, r2, r5\n\t"
  111917. "adcs r3, r3, r6\n\t"
  111918. "adc r4, r4, r7\n\t"
  111919. "str r2, [%[r], #84]\n\t"
  111920. /* A[6] * A[16] */
  111921. "ldr r10, [%[a], #64]\n\t"
  111922. "ldr r12, [%[a], #24]\n\t"
  111923. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  111924. "lsl r8, r10, #16\n\t"
  111925. "lsl r5, r12, #16\n\t"
  111926. "lsr r8, r8, #16\n\t"
  111927. "lsr r5, r5, #16\n\t"
  111928. "mul r5, r8, r5\n\t"
  111929. "lsr r9, r12, #16\n\t"
  111930. "mul r8, r9, r8\n\t"
  111931. "lsr r6, r8, #16\n\t"
  111932. "lsl r8, r8, #16\n\t"
  111933. "adds r5, r5, r8\n\t"
  111934. "adc r6, r6, #0\n\t"
  111935. "lsr r8, r10, #16\n\t"
  111936. "mul r9, r8, r9\n\t"
  111937. "add r6, r6, r9\n\t"
  111938. "lsl r9, r12, #16\n\t"
  111939. "lsr r9, r9, #16\n\t"
  111940. "mul r8, r9, r8\n\t"
  111941. "lsr r9, r8, #16\n\t"
  111942. "lsl r8, r8, #16\n\t"
  111943. "adds r5, r5, r8\n\t"
  111944. "adc r6, r6, r9\n\t"
  111945. #else
  111946. "umull r5, r6, r10, r12\n\t"
  111947. #endif
  111948. "mov r2, #0\n\t"
  111949. "mov r7, #0\n\t"
  111950. /* A[7] * A[15] */
  111951. "ldr r10, [%[a], #60]\n\t"
  111952. "ldr r12, [%[a], #28]\n\t"
  111953. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  111954. "lsl r8, r10, #16\n\t"
  111955. "lsl r9, r12, #16\n\t"
  111956. "lsr r8, r8, #16\n\t"
  111957. "lsr r9, r9, #16\n\t"
  111958. "mul r9, r8, r9\n\t"
  111959. "adds r5, r5, r9\n\t"
  111960. "adcs r6, r6, #0\n\t"
  111961. "adc r7, r7, #0\n\t"
  111962. "lsr r9, r12, #16\n\t"
  111963. "mul r8, r9, r8\n\t"
  111964. "lsr r9, r8, #16\n\t"
  111965. "lsl r8, r8, #16\n\t"
  111966. "adds r5, r5, r8\n\t"
  111967. "adcs r6, r6, r9\n\t"
  111968. "adc r7, r7, #0\n\t"
  111969. "lsr r8, r10, #16\n\t"
  111970. "lsr r9, r12, #16\n\t"
  111971. "mul r9, r8, r9\n\t"
  111972. "adds r6, r6, r9\n\t"
  111973. "adc r7, r7, #0\n\t"
  111974. "lsl r9, r12, #16\n\t"
  111975. "lsr r9, r9, #16\n\t"
  111976. "mul r8, r9, r8\n\t"
  111977. "lsr r9, r8, #16\n\t"
  111978. "lsl r8, r8, #16\n\t"
  111979. "adds r5, r5, r8\n\t"
  111980. "adcs r6, r6, r9\n\t"
  111981. "adc r7, r7, #0\n\t"
  111982. #else
  111983. "umull r8, r9, r10, r12\n\t"
  111984. "adds r5, r5, r8\n\t"
  111985. "adcs r6, r6, r9\n\t"
  111986. "adc r7, r7, #0\n\t"
  111987. #endif
  111988. /* A[8] * A[14] */
  111989. "ldr r10, [%[a], #56]\n\t"
  111990. "ldr r12, [%[a], #32]\n\t"
  111991. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  111992. "lsl r8, r10, #16\n\t"
  111993. "lsl r9, r12, #16\n\t"
  111994. "lsr r8, r8, #16\n\t"
  111995. "lsr r9, r9, #16\n\t"
  111996. "mul r9, r8, r9\n\t"
  111997. "adds r5, r5, r9\n\t"
  111998. "adcs r6, r6, #0\n\t"
  111999. "adc r7, r7, #0\n\t"
  112000. "lsr r9, r12, #16\n\t"
  112001. "mul r8, r9, r8\n\t"
  112002. "lsr r9, r8, #16\n\t"
  112003. "lsl r8, r8, #16\n\t"
  112004. "adds r5, r5, r8\n\t"
  112005. "adcs r6, r6, r9\n\t"
  112006. "adc r7, r7, #0\n\t"
  112007. "lsr r8, r10, #16\n\t"
  112008. "lsr r9, r12, #16\n\t"
  112009. "mul r9, r8, r9\n\t"
  112010. "adds r6, r6, r9\n\t"
  112011. "adc r7, r7, #0\n\t"
  112012. "lsl r9, r12, #16\n\t"
  112013. "lsr r9, r9, #16\n\t"
  112014. "mul r8, r9, r8\n\t"
  112015. "lsr r9, r8, #16\n\t"
  112016. "lsl r8, r8, #16\n\t"
  112017. "adds r5, r5, r8\n\t"
  112018. "adcs r6, r6, r9\n\t"
  112019. "adc r7, r7, #0\n\t"
  112020. #else
  112021. "umull r8, r9, r10, r12\n\t"
  112022. "adds r5, r5, r8\n\t"
  112023. "adcs r6, r6, r9\n\t"
  112024. "adc r7, r7, #0\n\t"
  112025. #endif
  112026. /* A[9] * A[13] */
  112027. "ldr r10, [%[a], #52]\n\t"
  112028. "ldr r12, [%[a], #36]\n\t"
  112029. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  112030. "lsl r8, r10, #16\n\t"
  112031. "lsl r9, r12, #16\n\t"
  112032. "lsr r8, r8, #16\n\t"
  112033. "lsr r9, r9, #16\n\t"
  112034. "mul r9, r8, r9\n\t"
  112035. "adds r5, r5, r9\n\t"
  112036. "adcs r6, r6, #0\n\t"
  112037. "adc r7, r7, #0\n\t"
  112038. "lsr r9, r12, #16\n\t"
  112039. "mul r8, r9, r8\n\t"
  112040. "lsr r9, r8, #16\n\t"
  112041. "lsl r8, r8, #16\n\t"
  112042. "adds r5, r5, r8\n\t"
  112043. "adcs r6, r6, r9\n\t"
  112044. "adc r7, r7, #0\n\t"
  112045. "lsr r8, r10, #16\n\t"
  112046. "lsr r9, r12, #16\n\t"
  112047. "mul r9, r8, r9\n\t"
  112048. "adds r6, r6, r9\n\t"
  112049. "adc r7, r7, #0\n\t"
  112050. "lsl r9, r12, #16\n\t"
  112051. "lsr r9, r9, #16\n\t"
  112052. "mul r8, r9, r8\n\t"
  112053. "lsr r9, r8, #16\n\t"
  112054. "lsl r8, r8, #16\n\t"
  112055. "adds r5, r5, r8\n\t"
  112056. "adcs r6, r6, r9\n\t"
  112057. "adc r7, r7, #0\n\t"
  112058. #else
  112059. "umull r8, r9, r10, r12\n\t"
  112060. "adds r5, r5, r8\n\t"
  112061. "adcs r6, r6, r9\n\t"
  112062. "adc r7, r7, #0\n\t"
  112063. #endif
  112064. /* A[10] * A[12] */
  112065. "ldr r10, [%[a], #48]\n\t"
  112066. "ldr r12, [%[a], #40]\n\t"
  112067. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  112068. "lsl r8, r10, #16\n\t"
  112069. "lsl r9, r12, #16\n\t"
  112070. "lsr r8, r8, #16\n\t"
  112071. "lsr r9, r9, #16\n\t"
  112072. "mul r9, r8, r9\n\t"
  112073. "adds r5, r5, r9\n\t"
  112074. "adcs r6, r6, #0\n\t"
  112075. "adc r7, r7, #0\n\t"
  112076. "lsr r9, r12, #16\n\t"
  112077. "mul r8, r9, r8\n\t"
  112078. "lsr r9, r8, #16\n\t"
  112079. "lsl r8, r8, #16\n\t"
  112080. "adds r5, r5, r8\n\t"
  112081. "adcs r6, r6, r9\n\t"
  112082. "adc r7, r7, #0\n\t"
  112083. "lsr r8, r10, #16\n\t"
  112084. "lsr r9, r12, #16\n\t"
  112085. "mul r9, r8, r9\n\t"
  112086. "adds r6, r6, r9\n\t"
  112087. "adc r7, r7, #0\n\t"
  112088. "lsl r9, r12, #16\n\t"
  112089. "lsr r9, r9, #16\n\t"
  112090. "mul r8, r9, r8\n\t"
  112091. "lsr r9, r8, #16\n\t"
  112092. "lsl r8, r8, #16\n\t"
  112093. "adds r5, r5, r8\n\t"
  112094. "adcs r6, r6, r9\n\t"
  112095. "adc r7, r7, #0\n\t"
  112096. #else
  112097. "umull r8, r9, r10, r12\n\t"
  112098. "adds r5, r5, r8\n\t"
  112099. "adcs r6, r6, r9\n\t"
  112100. "adc r7, r7, #0\n\t"
  112101. #endif
  112102. /* A[11] * A[11] */
  112103. "ldr r10, [%[a], #44]\n\t"
  112104. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  112105. "lsl r8, r10, #16\n\t"
  112106. "lsr r9, r10, #16\n\t"
  112107. "lsr r8, r8, #16\n\t"
  112108. "mov r12, r8\n\t"
  112109. "mul r8, r12, r8\n\t"
  112110. "mov r12, r9\n\t"
  112111. "mul r9, r12, r9\n\t"
  112112. "adds r3, r3, r8\n\t"
  112113. "adcs r4, r4, r9\n\t"
  112114. "adc r2, r2, #0\n\t"
  112115. "lsr r9, r10, #16\n\t"
  112116. "lsl r8, r10, #16\n\t"
  112117. "lsr r8, r8, #16\n\t"
  112118. "mul r8, r9, r8\n\t"
  112119. "lsr r9, r8, #15\n\t"
  112120. "lsl r8, r8, #17\n\t"
  112121. "adds r3, r3, r8\n\t"
  112122. "adcs r4, r4, r9\n\t"
  112123. "adc r2, r2, #0\n\t"
  112124. "adds r5, r5, r5\n\t"
  112125. "adcs r6, r6, r6\n\t"
  112126. "adc r7, r7, r7\n\t"
  112127. #else
  112128. "umull r8, r9, r10, r10\n\t"
  112129. "adds r5, r5, r5\n\t"
  112130. "adcs r6, r6, r6\n\t"
  112131. "adc r7, r7, r7\n\t"
  112132. "adds r3, r3, r8\n\t"
  112133. "adcs r4, r4, r9\n\t"
  112134. "adc r2, r2, #0\n\t"
  112135. #endif
  112136. "adds r3, r3, r5\n\t"
  112137. "adcs r4, r4, r6\n\t"
  112138. "adc r2, r2, r7\n\t"
  112139. "str r3, [%[r], #88]\n\t"
  112140. /* A[7] * A[16] */
  112141. "ldr r10, [%[a], #64]\n\t"
  112142. "ldr r12, [%[a], #28]\n\t"
  112143. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  112144. "lsl r8, r10, #16\n\t"
  112145. "lsl r5, r12, #16\n\t"
  112146. "lsr r8, r8, #16\n\t"
  112147. "lsr r5, r5, #16\n\t"
  112148. "mul r5, r8, r5\n\t"
  112149. "lsr r9, r12, #16\n\t"
  112150. "mul r8, r9, r8\n\t"
  112151. "lsr r6, r8, #16\n\t"
  112152. "lsl r8, r8, #16\n\t"
  112153. "adds r5, r5, r8\n\t"
  112154. "adc r6, r6, #0\n\t"
  112155. "lsr r8, r10, #16\n\t"
  112156. "mul r9, r8, r9\n\t"
  112157. "add r6, r6, r9\n\t"
  112158. "lsl r9, r12, #16\n\t"
  112159. "lsr r9, r9, #16\n\t"
  112160. "mul r8, r9, r8\n\t"
  112161. "lsr r9, r8, #16\n\t"
  112162. "lsl r8, r8, #16\n\t"
  112163. "adds r5, r5, r8\n\t"
  112164. "adc r6, r6, r9\n\t"
  112165. #else
  112166. "umull r5, r6, r10, r12\n\t"
  112167. #endif
  112168. "mov r3, #0\n\t"
  112169. "mov r7, #0\n\t"
  112170. /* A[8] * A[15] */
  112171. "ldr r10, [%[a], #60]\n\t"
  112172. "ldr r12, [%[a], #32]\n\t"
  112173. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  112174. "lsl r8, r10, #16\n\t"
  112175. "lsl r9, r12, #16\n\t"
  112176. "lsr r8, r8, #16\n\t"
  112177. "lsr r9, r9, #16\n\t"
  112178. "mul r9, r8, r9\n\t"
  112179. "adds r5, r5, r9\n\t"
  112180. "adcs r6, r6, #0\n\t"
  112181. "adc r7, r7, #0\n\t"
  112182. "lsr r9, r12, #16\n\t"
  112183. "mul r8, r9, r8\n\t"
  112184. "lsr r9, r8, #16\n\t"
  112185. "lsl r8, r8, #16\n\t"
  112186. "adds r5, r5, r8\n\t"
  112187. "adcs r6, r6, r9\n\t"
  112188. "adc r7, r7, #0\n\t"
  112189. "lsr r8, r10, #16\n\t"
  112190. "lsr r9, r12, #16\n\t"
  112191. "mul r9, r8, r9\n\t"
  112192. "adds r6, r6, r9\n\t"
  112193. "adc r7, r7, #0\n\t"
  112194. "lsl r9, r12, #16\n\t"
  112195. "lsr r9, r9, #16\n\t"
  112196. "mul r8, r9, r8\n\t"
  112197. "lsr r9, r8, #16\n\t"
  112198. "lsl r8, r8, #16\n\t"
  112199. "adds r5, r5, r8\n\t"
  112200. "adcs r6, r6, r9\n\t"
  112201. "adc r7, r7, #0\n\t"
  112202. #else
  112203. "umull r8, r9, r10, r12\n\t"
  112204. "adds r5, r5, r8\n\t"
  112205. "adcs r6, r6, r9\n\t"
  112206. "adc r7, r7, #0\n\t"
  112207. #endif
  112208. /* A[9] * A[14] */
  112209. "ldr r10, [%[a], #56]\n\t"
  112210. "ldr r12, [%[a], #36]\n\t"
  112211. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  112212. "lsl r8, r10, #16\n\t"
  112213. "lsl r9, r12, #16\n\t"
  112214. "lsr r8, r8, #16\n\t"
  112215. "lsr r9, r9, #16\n\t"
  112216. "mul r9, r8, r9\n\t"
  112217. "adds r5, r5, r9\n\t"
  112218. "adcs r6, r6, #0\n\t"
  112219. "adc r7, r7, #0\n\t"
  112220. "lsr r9, r12, #16\n\t"
  112221. "mul r8, r9, r8\n\t"
  112222. "lsr r9, r8, #16\n\t"
  112223. "lsl r8, r8, #16\n\t"
  112224. "adds r5, r5, r8\n\t"
  112225. "adcs r6, r6, r9\n\t"
  112226. "adc r7, r7, #0\n\t"
  112227. "lsr r8, r10, #16\n\t"
  112228. "lsr r9, r12, #16\n\t"
  112229. "mul r9, r8, r9\n\t"
  112230. "adds r6, r6, r9\n\t"
  112231. "adc r7, r7, #0\n\t"
  112232. "lsl r9, r12, #16\n\t"
  112233. "lsr r9, r9, #16\n\t"
  112234. "mul r8, r9, r8\n\t"
  112235. "lsr r9, r8, #16\n\t"
  112236. "lsl r8, r8, #16\n\t"
  112237. "adds r5, r5, r8\n\t"
  112238. "adcs r6, r6, r9\n\t"
  112239. "adc r7, r7, #0\n\t"
  112240. #else
  112241. "umull r8, r9, r10, r12\n\t"
  112242. "adds r5, r5, r8\n\t"
  112243. "adcs r6, r6, r9\n\t"
  112244. "adc r7, r7, #0\n\t"
  112245. #endif
  112246. /* A[10] * A[13] */
  112247. "ldr r10, [%[a], #52]\n\t"
  112248. "ldr r12, [%[a], #40]\n\t"
  112249. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  112250. "lsl r8, r10, #16\n\t"
  112251. "lsl r9, r12, #16\n\t"
  112252. "lsr r8, r8, #16\n\t"
  112253. "lsr r9, r9, #16\n\t"
  112254. "mul r9, r8, r9\n\t"
  112255. "adds r5, r5, r9\n\t"
  112256. "adcs r6, r6, #0\n\t"
  112257. "adc r7, r7, #0\n\t"
  112258. "lsr r9, r12, #16\n\t"
  112259. "mul r8, r9, r8\n\t"
  112260. "lsr r9, r8, #16\n\t"
  112261. "lsl r8, r8, #16\n\t"
  112262. "adds r5, r5, r8\n\t"
  112263. "adcs r6, r6, r9\n\t"
  112264. "adc r7, r7, #0\n\t"
  112265. "lsr r8, r10, #16\n\t"
  112266. "lsr r9, r12, #16\n\t"
  112267. "mul r9, r8, r9\n\t"
  112268. "adds r6, r6, r9\n\t"
  112269. "adc r7, r7, #0\n\t"
  112270. "lsl r9, r12, #16\n\t"
  112271. "lsr r9, r9, #16\n\t"
  112272. "mul r8, r9, r8\n\t"
  112273. "lsr r9, r8, #16\n\t"
  112274. "lsl r8, r8, #16\n\t"
  112275. "adds r5, r5, r8\n\t"
  112276. "adcs r6, r6, r9\n\t"
  112277. "adc r7, r7, #0\n\t"
  112278. #else
  112279. "umull r8, r9, r10, r12\n\t"
  112280. "adds r5, r5, r8\n\t"
  112281. "adcs r6, r6, r9\n\t"
  112282. "adc r7, r7, #0\n\t"
  112283. #endif
  112284. /* A[11] * A[12] */
  112285. "ldr r10, [%[a], #48]\n\t"
  112286. "ldr r12, [%[a], #44]\n\t"
  112287. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  112288. "lsl r8, r10, #16\n\t"
  112289. "lsl r9, r12, #16\n\t"
  112290. "lsr r8, r8, #16\n\t"
  112291. "lsr r9, r9, #16\n\t"
  112292. "mul r9, r8, r9\n\t"
  112293. "adds r5, r5, r9\n\t"
  112294. "adcs r6, r6, #0\n\t"
  112295. "adc r7, r7, #0\n\t"
  112296. "lsr r9, r12, #16\n\t"
  112297. "mul r8, r9, r8\n\t"
  112298. "lsr r9, r8, #16\n\t"
  112299. "lsl r8, r8, #16\n\t"
  112300. "adds r5, r5, r8\n\t"
  112301. "adcs r6, r6, r9\n\t"
  112302. "adc r7, r7, #0\n\t"
  112303. "lsr r8, r10, #16\n\t"
  112304. "lsr r9, r12, #16\n\t"
  112305. "mul r9, r8, r9\n\t"
  112306. "adds r6, r6, r9\n\t"
  112307. "adc r7, r7, #0\n\t"
  112308. "lsl r9, r12, #16\n\t"
  112309. "lsr r9, r9, #16\n\t"
  112310. "mul r8, r9, r8\n\t"
  112311. "lsr r9, r8, #16\n\t"
  112312. "lsl r8, r8, #16\n\t"
  112313. "adds r5, r5, r8\n\t"
  112314. "adcs r6, r6, r9\n\t"
  112315. "adc r7, r7, #0\n\t"
  112316. #else
  112317. "umull r8, r9, r10, r12\n\t"
  112318. "adds r5, r5, r8\n\t"
  112319. "adcs r6, r6, r9\n\t"
  112320. "adc r7, r7, #0\n\t"
  112321. #endif
  112322. "adds r5, r5, r5\n\t"
  112323. "adcs r6, r6, r6\n\t"
  112324. "adc r7, r7, r7\n\t"
  112325. "adds r4, r4, r5\n\t"
  112326. "adcs r2, r2, r6\n\t"
  112327. "adc r3, r3, r7\n\t"
  112328. "str r4, [%[r], #92]\n\t"
  112329. /* A[8] * A[16] */
  112330. "ldr r10, [%[a], #64]\n\t"
  112331. "ldr r12, [%[a], #32]\n\t"
  112332. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  112333. "lsl r8, r10, #16\n\t"
  112334. "lsl r5, r12, #16\n\t"
  112335. "lsr r8, r8, #16\n\t"
  112336. "lsr r5, r5, #16\n\t"
  112337. "mul r5, r8, r5\n\t"
  112338. "lsr r9, r12, #16\n\t"
  112339. "mul r8, r9, r8\n\t"
  112340. "lsr r6, r8, #16\n\t"
  112341. "lsl r8, r8, #16\n\t"
  112342. "adds r5, r5, r8\n\t"
  112343. "adc r6, r6, #0\n\t"
  112344. "lsr r8, r10, #16\n\t"
  112345. "mul r9, r8, r9\n\t"
  112346. "add r6, r6, r9\n\t"
  112347. "lsl r9, r12, #16\n\t"
  112348. "lsr r9, r9, #16\n\t"
  112349. "mul r8, r9, r8\n\t"
  112350. "lsr r9, r8, #16\n\t"
  112351. "lsl r8, r8, #16\n\t"
  112352. "adds r5, r5, r8\n\t"
  112353. "adc r6, r6, r9\n\t"
  112354. #else
  112355. "umull r5, r6, r10, r12\n\t"
  112356. #endif
  112357. "mov r4, #0\n\t"
  112358. "mov r7, #0\n\t"
  112359. /* A[9] * A[15] */
  112360. "ldr r10, [%[a], #60]\n\t"
  112361. "ldr r12, [%[a], #36]\n\t"
  112362. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  112363. "lsl r8, r10, #16\n\t"
  112364. "lsl r9, r12, #16\n\t"
  112365. "lsr r8, r8, #16\n\t"
  112366. "lsr r9, r9, #16\n\t"
  112367. "mul r9, r8, r9\n\t"
  112368. "adds r5, r5, r9\n\t"
  112369. "adcs r6, r6, #0\n\t"
  112370. "adc r7, r7, #0\n\t"
  112371. "lsr r9, r12, #16\n\t"
  112372. "mul r8, r9, r8\n\t"
  112373. "lsr r9, r8, #16\n\t"
  112374. "lsl r8, r8, #16\n\t"
  112375. "adds r5, r5, r8\n\t"
  112376. "adcs r6, r6, r9\n\t"
  112377. "adc r7, r7, #0\n\t"
  112378. "lsr r8, r10, #16\n\t"
  112379. "lsr r9, r12, #16\n\t"
  112380. "mul r9, r8, r9\n\t"
  112381. "adds r6, r6, r9\n\t"
  112382. "adc r7, r7, #0\n\t"
  112383. "lsl r9, r12, #16\n\t"
  112384. "lsr r9, r9, #16\n\t"
  112385. "mul r8, r9, r8\n\t"
  112386. "lsr r9, r8, #16\n\t"
  112387. "lsl r8, r8, #16\n\t"
  112388. "adds r5, r5, r8\n\t"
  112389. "adcs r6, r6, r9\n\t"
  112390. "adc r7, r7, #0\n\t"
  112391. #else
  112392. "umull r8, r9, r10, r12\n\t"
  112393. "adds r5, r5, r8\n\t"
  112394. "adcs r6, r6, r9\n\t"
  112395. "adc r7, r7, #0\n\t"
  112396. #endif
  112397. /* A[10] * A[14] */
  112398. "ldr r10, [%[a], #56]\n\t"
  112399. "ldr r12, [%[a], #40]\n\t"
  112400. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  112401. "lsl r8, r10, #16\n\t"
  112402. "lsl r9, r12, #16\n\t"
  112403. "lsr r8, r8, #16\n\t"
  112404. "lsr r9, r9, #16\n\t"
  112405. "mul r9, r8, r9\n\t"
  112406. "adds r5, r5, r9\n\t"
  112407. "adcs r6, r6, #0\n\t"
  112408. "adc r7, r7, #0\n\t"
  112409. "lsr r9, r12, #16\n\t"
  112410. "mul r8, r9, r8\n\t"
  112411. "lsr r9, r8, #16\n\t"
  112412. "lsl r8, r8, #16\n\t"
  112413. "adds r5, r5, r8\n\t"
  112414. "adcs r6, r6, r9\n\t"
  112415. "adc r7, r7, #0\n\t"
  112416. "lsr r8, r10, #16\n\t"
  112417. "lsr r9, r12, #16\n\t"
  112418. "mul r9, r8, r9\n\t"
  112419. "adds r6, r6, r9\n\t"
  112420. "adc r7, r7, #0\n\t"
  112421. "lsl r9, r12, #16\n\t"
  112422. "lsr r9, r9, #16\n\t"
  112423. "mul r8, r9, r8\n\t"
  112424. "lsr r9, r8, #16\n\t"
  112425. "lsl r8, r8, #16\n\t"
  112426. "adds r5, r5, r8\n\t"
  112427. "adcs r6, r6, r9\n\t"
  112428. "adc r7, r7, #0\n\t"
  112429. #else
  112430. "umull r8, r9, r10, r12\n\t"
  112431. "adds r5, r5, r8\n\t"
  112432. "adcs r6, r6, r9\n\t"
  112433. "adc r7, r7, #0\n\t"
  112434. #endif
  112435. /* A[11] * A[13] */
  112436. "ldr r10, [%[a], #52]\n\t"
  112437. "ldr r12, [%[a], #44]\n\t"
  112438. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  112439. "lsl r8, r10, #16\n\t"
  112440. "lsl r9, r12, #16\n\t"
  112441. "lsr r8, r8, #16\n\t"
  112442. "lsr r9, r9, #16\n\t"
  112443. "mul r9, r8, r9\n\t"
  112444. "adds r5, r5, r9\n\t"
  112445. "adcs r6, r6, #0\n\t"
  112446. "adc r7, r7, #0\n\t"
  112447. "lsr r9, r12, #16\n\t"
  112448. "mul r8, r9, r8\n\t"
  112449. "lsr r9, r8, #16\n\t"
  112450. "lsl r8, r8, #16\n\t"
  112451. "adds r5, r5, r8\n\t"
  112452. "adcs r6, r6, r9\n\t"
  112453. "adc r7, r7, #0\n\t"
  112454. "lsr r8, r10, #16\n\t"
  112455. "lsr r9, r12, #16\n\t"
  112456. "mul r9, r8, r9\n\t"
  112457. "adds r6, r6, r9\n\t"
  112458. "adc r7, r7, #0\n\t"
  112459. "lsl r9, r12, #16\n\t"
  112460. "lsr r9, r9, #16\n\t"
  112461. "mul r8, r9, r8\n\t"
  112462. "lsr r9, r8, #16\n\t"
  112463. "lsl r8, r8, #16\n\t"
  112464. "adds r5, r5, r8\n\t"
  112465. "adcs r6, r6, r9\n\t"
  112466. "adc r7, r7, #0\n\t"
  112467. #else
  112468. "umull r8, r9, r10, r12\n\t"
  112469. "adds r5, r5, r8\n\t"
  112470. "adcs r6, r6, r9\n\t"
  112471. "adc r7, r7, #0\n\t"
  112472. #endif
  112473. /* A[12] * A[12] */
  112474. "ldr r10, [%[a], #48]\n\t"
  112475. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  112476. "lsl r8, r10, #16\n\t"
  112477. "lsr r9, r10, #16\n\t"
  112478. "lsr r8, r8, #16\n\t"
  112479. "mov r12, r8\n\t"
  112480. "mul r8, r12, r8\n\t"
  112481. "mov r12, r9\n\t"
  112482. "mul r9, r12, r9\n\t"
  112483. "adds r2, r2, r8\n\t"
  112484. "adcs r3, r3, r9\n\t"
  112485. "adc r4, r4, #0\n\t"
  112486. "lsr r9, r10, #16\n\t"
  112487. "lsl r8, r10, #16\n\t"
  112488. "lsr r8, r8, #16\n\t"
  112489. "mul r8, r9, r8\n\t"
  112490. "lsr r9, r8, #15\n\t"
  112491. "lsl r8, r8, #17\n\t"
  112492. "adds r2, r2, r8\n\t"
  112493. "adcs r3, r3, r9\n\t"
  112494. "adc r4, r4, #0\n\t"
  112495. "adds r5, r5, r5\n\t"
  112496. "adcs r6, r6, r6\n\t"
  112497. "adc r7, r7, r7\n\t"
  112498. #else
  112499. "umull r8, r9, r10, r10\n\t"
  112500. "adds r5, r5, r5\n\t"
  112501. "adcs r6, r6, r6\n\t"
  112502. "adc r7, r7, r7\n\t"
  112503. "adds r2, r2, r8\n\t"
  112504. "adcs r3, r3, r9\n\t"
  112505. "adc r4, r4, #0\n\t"
  112506. #endif
  112507. "adds r2, r2, r5\n\t"
  112508. "adcs r3, r3, r6\n\t"
  112509. "adc r4, r4, r7\n\t"
  112510. "str r2, [%[r], #96]\n\t"
  112511. /* A[9] * A[16] */
  112512. "ldr r10, [%[a], #64]\n\t"
  112513. "ldr r12, [%[a], #36]\n\t"
  112514. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  112515. "lsl r8, r10, #16\n\t"
  112516. "lsl r5, r12, #16\n\t"
  112517. "lsr r8, r8, #16\n\t"
  112518. "lsr r5, r5, #16\n\t"
  112519. "mul r5, r8, r5\n\t"
  112520. "lsr r9, r12, #16\n\t"
  112521. "mul r8, r9, r8\n\t"
  112522. "lsr r6, r8, #16\n\t"
  112523. "lsl r8, r8, #16\n\t"
  112524. "adds r5, r5, r8\n\t"
  112525. "adc r6, r6, #0\n\t"
  112526. "lsr r8, r10, #16\n\t"
  112527. "mul r9, r8, r9\n\t"
  112528. "add r6, r6, r9\n\t"
  112529. "lsl r9, r12, #16\n\t"
  112530. "lsr r9, r9, #16\n\t"
  112531. "mul r8, r9, r8\n\t"
  112532. "lsr r9, r8, #16\n\t"
  112533. "lsl r8, r8, #16\n\t"
  112534. "adds r5, r5, r8\n\t"
  112535. "adc r6, r6, r9\n\t"
  112536. #else
  112537. "umull r5, r6, r10, r12\n\t"
  112538. #endif
  112539. "mov r2, #0\n\t"
  112540. "mov r7, #0\n\t"
  112541. /* A[10] * A[15] */
  112542. "ldr r10, [%[a], #60]\n\t"
  112543. "ldr r12, [%[a], #40]\n\t"
  112544. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  112545. "lsl r8, r10, #16\n\t"
  112546. "lsl r9, r12, #16\n\t"
  112547. "lsr r8, r8, #16\n\t"
  112548. "lsr r9, r9, #16\n\t"
  112549. "mul r9, r8, r9\n\t"
  112550. "adds r5, r5, r9\n\t"
  112551. "adcs r6, r6, #0\n\t"
  112552. "adc r7, r7, #0\n\t"
  112553. "lsr r9, r12, #16\n\t"
  112554. "mul r8, r9, r8\n\t"
  112555. "lsr r9, r8, #16\n\t"
  112556. "lsl r8, r8, #16\n\t"
  112557. "adds r5, r5, r8\n\t"
  112558. "adcs r6, r6, r9\n\t"
  112559. "adc r7, r7, #0\n\t"
  112560. "lsr r8, r10, #16\n\t"
  112561. "lsr r9, r12, #16\n\t"
  112562. "mul r9, r8, r9\n\t"
  112563. "adds r6, r6, r9\n\t"
  112564. "adc r7, r7, #0\n\t"
  112565. "lsl r9, r12, #16\n\t"
  112566. "lsr r9, r9, #16\n\t"
  112567. "mul r8, r9, r8\n\t"
  112568. "lsr r9, r8, #16\n\t"
  112569. "lsl r8, r8, #16\n\t"
  112570. "adds r5, r5, r8\n\t"
  112571. "adcs r6, r6, r9\n\t"
  112572. "adc r7, r7, #0\n\t"
  112573. #else
  112574. "umull r8, r9, r10, r12\n\t"
  112575. "adds r5, r5, r8\n\t"
  112576. "adcs r6, r6, r9\n\t"
  112577. "adc r7, r7, #0\n\t"
  112578. #endif
  112579. /* A[11] * A[14] */
  112580. "ldr r10, [%[a], #56]\n\t"
  112581. "ldr r12, [%[a], #44]\n\t"
  112582. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  112583. "lsl r8, r10, #16\n\t"
  112584. "lsl r9, r12, #16\n\t"
  112585. "lsr r8, r8, #16\n\t"
  112586. "lsr r9, r9, #16\n\t"
  112587. "mul r9, r8, r9\n\t"
  112588. "adds r5, r5, r9\n\t"
  112589. "adcs r6, r6, #0\n\t"
  112590. "adc r7, r7, #0\n\t"
  112591. "lsr r9, r12, #16\n\t"
  112592. "mul r8, r9, r8\n\t"
  112593. "lsr r9, r8, #16\n\t"
  112594. "lsl r8, r8, #16\n\t"
  112595. "adds r5, r5, r8\n\t"
  112596. "adcs r6, r6, r9\n\t"
  112597. "adc r7, r7, #0\n\t"
  112598. "lsr r8, r10, #16\n\t"
  112599. "lsr r9, r12, #16\n\t"
  112600. "mul r9, r8, r9\n\t"
  112601. "adds r6, r6, r9\n\t"
  112602. "adc r7, r7, #0\n\t"
  112603. "lsl r9, r12, #16\n\t"
  112604. "lsr r9, r9, #16\n\t"
  112605. "mul r8, r9, r8\n\t"
  112606. "lsr r9, r8, #16\n\t"
  112607. "lsl r8, r8, #16\n\t"
  112608. "adds r5, r5, r8\n\t"
  112609. "adcs r6, r6, r9\n\t"
  112610. "adc r7, r7, #0\n\t"
  112611. #else
  112612. "umull r8, r9, r10, r12\n\t"
  112613. "adds r5, r5, r8\n\t"
  112614. "adcs r6, r6, r9\n\t"
  112615. "adc r7, r7, #0\n\t"
  112616. #endif
  112617. /* A[12] * A[13] */
  112618. "ldr r10, [%[a], #52]\n\t"
  112619. "ldr r12, [%[a], #48]\n\t"
  112620. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  112621. "lsl r8, r10, #16\n\t"
  112622. "lsl r9, r12, #16\n\t"
  112623. "lsr r8, r8, #16\n\t"
  112624. "lsr r9, r9, #16\n\t"
  112625. "mul r9, r8, r9\n\t"
  112626. "adds r5, r5, r9\n\t"
  112627. "adcs r6, r6, #0\n\t"
  112628. "adc r7, r7, #0\n\t"
  112629. "lsr r9, r12, #16\n\t"
  112630. "mul r8, r9, r8\n\t"
  112631. "lsr r9, r8, #16\n\t"
  112632. "lsl r8, r8, #16\n\t"
  112633. "adds r5, r5, r8\n\t"
  112634. "adcs r6, r6, r9\n\t"
  112635. "adc r7, r7, #0\n\t"
  112636. "lsr r8, r10, #16\n\t"
  112637. "lsr r9, r12, #16\n\t"
  112638. "mul r9, r8, r9\n\t"
  112639. "adds r6, r6, r9\n\t"
  112640. "adc r7, r7, #0\n\t"
  112641. "lsl r9, r12, #16\n\t"
  112642. "lsr r9, r9, #16\n\t"
  112643. "mul r8, r9, r8\n\t"
  112644. "lsr r9, r8, #16\n\t"
  112645. "lsl r8, r8, #16\n\t"
  112646. "adds r5, r5, r8\n\t"
  112647. "adcs r6, r6, r9\n\t"
  112648. "adc r7, r7, #0\n\t"
  112649. #else
  112650. "umull r8, r9, r10, r12\n\t"
  112651. "adds r5, r5, r8\n\t"
  112652. "adcs r6, r6, r9\n\t"
  112653. "adc r7, r7, #0\n\t"
  112654. #endif
  112655. "adds r5, r5, r5\n\t"
  112656. "adcs r6, r6, r6\n\t"
  112657. "adc r7, r7, r7\n\t"
  112658. "adds r3, r3, r5\n\t"
  112659. "adcs r4, r4, r6\n\t"
  112660. "adc r2, r2, r7\n\t"
  112661. "str r3, [%[r], #100]\n\t"
  112662. /* A[10] * A[16] */
  112663. "ldr r10, [%[a], #64]\n\t"
  112664. "ldr r12, [%[a], #40]\n\t"
  112665. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  112666. "lsl r8, r10, #16\n\t"
  112667. "lsl r5, r12, #16\n\t"
  112668. "lsr r8, r8, #16\n\t"
  112669. "lsr r5, r5, #16\n\t"
  112670. "mul r5, r8, r5\n\t"
  112671. "lsr r9, r12, #16\n\t"
  112672. "mul r8, r9, r8\n\t"
  112673. "lsr r6, r8, #16\n\t"
  112674. "lsl r8, r8, #16\n\t"
  112675. "adds r5, r5, r8\n\t"
  112676. "adc r6, r6, #0\n\t"
  112677. "lsr r8, r10, #16\n\t"
  112678. "mul r9, r8, r9\n\t"
  112679. "add r6, r6, r9\n\t"
  112680. "lsl r9, r12, #16\n\t"
  112681. "lsr r9, r9, #16\n\t"
  112682. "mul r8, r9, r8\n\t"
  112683. "lsr r9, r8, #16\n\t"
  112684. "lsl r8, r8, #16\n\t"
  112685. "adds r5, r5, r8\n\t"
  112686. "adc r6, r6, r9\n\t"
  112687. #else
  112688. "umull r5, r6, r10, r12\n\t"
  112689. #endif
  112690. "mov r3, #0\n\t"
  112691. "mov r7, #0\n\t"
  112692. /* A[11] * A[15] */
  112693. "ldr r10, [%[a], #60]\n\t"
  112694. "ldr r12, [%[a], #44]\n\t"
  112695. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  112696. "lsl r8, r10, #16\n\t"
  112697. "lsl r9, r12, #16\n\t"
  112698. "lsr r8, r8, #16\n\t"
  112699. "lsr r9, r9, #16\n\t"
  112700. "mul r9, r8, r9\n\t"
  112701. "adds r5, r5, r9\n\t"
  112702. "adcs r6, r6, #0\n\t"
  112703. "adc r7, r7, #0\n\t"
  112704. "lsr r9, r12, #16\n\t"
  112705. "mul r8, r9, r8\n\t"
  112706. "lsr r9, r8, #16\n\t"
  112707. "lsl r8, r8, #16\n\t"
  112708. "adds r5, r5, r8\n\t"
  112709. "adcs r6, r6, r9\n\t"
  112710. "adc r7, r7, #0\n\t"
  112711. "lsr r8, r10, #16\n\t"
  112712. "lsr r9, r12, #16\n\t"
  112713. "mul r9, r8, r9\n\t"
  112714. "adds r6, r6, r9\n\t"
  112715. "adc r7, r7, #0\n\t"
  112716. "lsl r9, r12, #16\n\t"
  112717. "lsr r9, r9, #16\n\t"
  112718. "mul r8, r9, r8\n\t"
  112719. "lsr r9, r8, #16\n\t"
  112720. "lsl r8, r8, #16\n\t"
  112721. "adds r5, r5, r8\n\t"
  112722. "adcs r6, r6, r9\n\t"
  112723. "adc r7, r7, #0\n\t"
  112724. #else
  112725. "umull r8, r9, r10, r12\n\t"
  112726. "adds r5, r5, r8\n\t"
  112727. "adcs r6, r6, r9\n\t"
  112728. "adc r7, r7, #0\n\t"
  112729. #endif
  112730. /* A[12] * A[14] */
  112731. "ldr r10, [%[a], #56]\n\t"
  112732. "ldr r12, [%[a], #48]\n\t"
  112733. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  112734. "lsl r8, r10, #16\n\t"
  112735. "lsl r9, r12, #16\n\t"
  112736. "lsr r8, r8, #16\n\t"
  112737. "lsr r9, r9, #16\n\t"
  112738. "mul r9, r8, r9\n\t"
  112739. "adds r5, r5, r9\n\t"
  112740. "adcs r6, r6, #0\n\t"
  112741. "adc r7, r7, #0\n\t"
  112742. "lsr r9, r12, #16\n\t"
  112743. "mul r8, r9, r8\n\t"
  112744. "lsr r9, r8, #16\n\t"
  112745. "lsl r8, r8, #16\n\t"
  112746. "adds r5, r5, r8\n\t"
  112747. "adcs r6, r6, r9\n\t"
  112748. "adc r7, r7, #0\n\t"
  112749. "lsr r8, r10, #16\n\t"
  112750. "lsr r9, r12, #16\n\t"
  112751. "mul r9, r8, r9\n\t"
  112752. "adds r6, r6, r9\n\t"
  112753. "adc r7, r7, #0\n\t"
  112754. "lsl r9, r12, #16\n\t"
  112755. "lsr r9, r9, #16\n\t"
  112756. "mul r8, r9, r8\n\t"
  112757. "lsr r9, r8, #16\n\t"
  112758. "lsl r8, r8, #16\n\t"
  112759. "adds r5, r5, r8\n\t"
  112760. "adcs r6, r6, r9\n\t"
  112761. "adc r7, r7, #0\n\t"
  112762. #else
  112763. "umull r8, r9, r10, r12\n\t"
  112764. "adds r5, r5, r8\n\t"
  112765. "adcs r6, r6, r9\n\t"
  112766. "adc r7, r7, #0\n\t"
  112767. #endif
  112768. /* A[13] * A[13] */
  112769. "ldr r10, [%[a], #52]\n\t"
  112770. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  112771. "lsl r8, r10, #16\n\t"
  112772. "lsr r9, r10, #16\n\t"
  112773. "lsr r8, r8, #16\n\t"
  112774. "mov r12, r8\n\t"
  112775. "mul r8, r12, r8\n\t"
  112776. "mov r12, r9\n\t"
  112777. "mul r9, r12, r9\n\t"
  112778. "adds r4, r4, r8\n\t"
  112779. "adcs r2, r2, r9\n\t"
  112780. "adc r3, r3, #0\n\t"
  112781. "lsr r9, r10, #16\n\t"
  112782. "lsl r8, r10, #16\n\t"
  112783. "lsr r8, r8, #16\n\t"
  112784. "mul r8, r9, r8\n\t"
  112785. "lsr r9, r8, #15\n\t"
  112786. "lsl r8, r8, #17\n\t"
  112787. "adds r4, r4, r8\n\t"
  112788. "adcs r2, r2, r9\n\t"
  112789. "adc r3, r3, #0\n\t"
  112790. "adds r5, r5, r5\n\t"
  112791. "adcs r6, r6, r6\n\t"
  112792. "adc r7, r7, r7\n\t"
  112793. #else
  112794. "umull r8, r9, r10, r10\n\t"
  112795. "adds r5, r5, r5\n\t"
  112796. "adcs r6, r6, r6\n\t"
  112797. "adc r7, r7, r7\n\t"
  112798. "adds r4, r4, r8\n\t"
  112799. "adcs r2, r2, r9\n\t"
  112800. "adc r3, r3, #0\n\t"
  112801. #endif
  112802. "adds r4, r4, r5\n\t"
  112803. "adcs r2, r2, r6\n\t"
  112804. "adc r3, r3, r7\n\t"
  112805. "str r4, [%[r], #104]\n\t"
  112806. /* A[11] * A[16] */
  112807. "ldr r10, [%[a], #64]\n\t"
  112808. "ldr r12, [%[a], #44]\n\t"
  112809. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  112810. "lsl r8, r10, #16\n\t"
  112811. "lsl r5, r12, #16\n\t"
  112812. "lsr r8, r8, #16\n\t"
  112813. "lsr r5, r5, #16\n\t"
  112814. "mul r5, r8, r5\n\t"
  112815. "lsr r9, r12, #16\n\t"
  112816. "mul r8, r9, r8\n\t"
  112817. "lsr r6, r8, #16\n\t"
  112818. "lsl r8, r8, #16\n\t"
  112819. "adds r5, r5, r8\n\t"
  112820. "adc r6, r6, #0\n\t"
  112821. "lsr r8, r10, #16\n\t"
  112822. "mul r9, r8, r9\n\t"
  112823. "add r6, r6, r9\n\t"
  112824. "lsl r9, r12, #16\n\t"
  112825. "lsr r9, r9, #16\n\t"
  112826. "mul r8, r9, r8\n\t"
  112827. "lsr r9, r8, #16\n\t"
  112828. "lsl r8, r8, #16\n\t"
  112829. "adds r5, r5, r8\n\t"
  112830. "adc r6, r6, r9\n\t"
  112831. #else
  112832. "umull r5, r6, r10, r12\n\t"
  112833. #endif
  112834. "mov r4, #0\n\t"
  112835. "mov r7, #0\n\t"
  112836. /* A[12] * A[15] */
  112837. "ldr r10, [%[a], #60]\n\t"
  112838. "ldr r12, [%[a], #48]\n\t"
  112839. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  112840. "lsl r8, r10, #16\n\t"
  112841. "lsl r9, r12, #16\n\t"
  112842. "lsr r8, r8, #16\n\t"
  112843. "lsr r9, r9, #16\n\t"
  112844. "mul r9, r8, r9\n\t"
  112845. "adds r5, r5, r9\n\t"
  112846. "adcs r6, r6, #0\n\t"
  112847. "adc r7, r7, #0\n\t"
  112848. "lsr r9, r12, #16\n\t"
  112849. "mul r8, r9, r8\n\t"
  112850. "lsr r9, r8, #16\n\t"
  112851. "lsl r8, r8, #16\n\t"
  112852. "adds r5, r5, r8\n\t"
  112853. "adcs r6, r6, r9\n\t"
  112854. "adc r7, r7, #0\n\t"
  112855. "lsr r8, r10, #16\n\t"
  112856. "lsr r9, r12, #16\n\t"
  112857. "mul r9, r8, r9\n\t"
  112858. "adds r6, r6, r9\n\t"
  112859. "adc r7, r7, #0\n\t"
  112860. "lsl r9, r12, #16\n\t"
  112861. "lsr r9, r9, #16\n\t"
  112862. "mul r8, r9, r8\n\t"
  112863. "lsr r9, r8, #16\n\t"
  112864. "lsl r8, r8, #16\n\t"
  112865. "adds r5, r5, r8\n\t"
  112866. "adcs r6, r6, r9\n\t"
  112867. "adc r7, r7, #0\n\t"
  112868. #else
  112869. "umull r8, r9, r10, r12\n\t"
  112870. "adds r5, r5, r8\n\t"
  112871. "adcs r6, r6, r9\n\t"
  112872. "adc r7, r7, #0\n\t"
  112873. #endif
  112874. /* A[13] * A[14] */
  112875. "ldr r10, [%[a], #56]\n\t"
  112876. "ldr r12, [%[a], #52]\n\t"
  112877. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  112878. "lsl r8, r10, #16\n\t"
  112879. "lsl r9, r12, #16\n\t"
  112880. "lsr r8, r8, #16\n\t"
  112881. "lsr r9, r9, #16\n\t"
  112882. "mul r9, r8, r9\n\t"
  112883. "adds r5, r5, r9\n\t"
  112884. "adcs r6, r6, #0\n\t"
  112885. "adc r7, r7, #0\n\t"
  112886. "lsr r9, r12, #16\n\t"
  112887. "mul r8, r9, r8\n\t"
  112888. "lsr r9, r8, #16\n\t"
  112889. "lsl r8, r8, #16\n\t"
  112890. "adds r5, r5, r8\n\t"
  112891. "adcs r6, r6, r9\n\t"
  112892. "adc r7, r7, #0\n\t"
  112893. "lsr r8, r10, #16\n\t"
  112894. "lsr r9, r12, #16\n\t"
  112895. "mul r9, r8, r9\n\t"
  112896. "adds r6, r6, r9\n\t"
  112897. "adc r7, r7, #0\n\t"
  112898. "lsl r9, r12, #16\n\t"
  112899. "lsr r9, r9, #16\n\t"
  112900. "mul r8, r9, r8\n\t"
  112901. "lsr r9, r8, #16\n\t"
  112902. "lsl r8, r8, #16\n\t"
  112903. "adds r5, r5, r8\n\t"
  112904. "adcs r6, r6, r9\n\t"
  112905. "adc r7, r7, #0\n\t"
  112906. #else
  112907. "umull r8, r9, r10, r12\n\t"
  112908. "adds r5, r5, r8\n\t"
  112909. "adcs r6, r6, r9\n\t"
  112910. "adc r7, r7, #0\n\t"
  112911. #endif
  112912. "adds r5, r5, r5\n\t"
  112913. "adcs r6, r6, r6\n\t"
  112914. "adc r7, r7, r7\n\t"
  112915. "adds r2, r2, r5\n\t"
  112916. "adcs r3, r3, r6\n\t"
  112917. "adc r4, r4, r7\n\t"
  112918. "str r2, [%[r], #108]\n\t"
  112919. /* A[12] * A[16] */
  112920. "ldr r10, [%[a], #64]\n\t"
  112921. "ldr r12, [%[a], #48]\n\t"
  112922. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  112923. "lsl r8, r10, #16\n\t"
  112924. "lsl r9, r12, #16\n\t"
  112925. "lsr r8, r8, #16\n\t"
  112926. "lsr r9, r9, #16\n\t"
  112927. "mul r9, r8, r9\n\t"
  112928. "adds r3, r3, r9\n\t"
  112929. "adcs r4, r4, #0\n\t"
  112930. "mov r2, #0\n\t"
  112931. "adc r2, r2, #0\n\t"
  112932. "adds r3, r3, r9\n\t"
  112933. "adcs r4, r4, #0\n\t"
  112934. "adc r2, r2, #0\n\t"
  112935. "lsr r9, r12, #16\n\t"
  112936. "mul r8, r9, r8\n\t"
  112937. "lsr r9, r8, #16\n\t"
  112938. "lsl r8, r8, #16\n\t"
  112939. "adds r3, r3, r8\n\t"
  112940. "adcs r4, r4, r9\n\t"
  112941. "adc r2, r2, #0\n\t"
  112942. "adds r3, r3, r8\n\t"
  112943. "adcs r4, r4, r9\n\t"
  112944. "adc r2, r2, #0\n\t"
  112945. "lsr r8, r10, #16\n\t"
  112946. "lsr r9, r12, #16\n\t"
  112947. "mul r9, r8, r9\n\t"
  112948. "adds r4, r4, r9\n\t"
  112949. "adc r2, r2, #0\n\t"
  112950. "adds r4, r4, r9\n\t"
  112951. "adc r2, r2, #0\n\t"
  112952. "lsl r9, r12, #16\n\t"
  112953. "lsr r9, r9, #16\n\t"
  112954. "mul r8, r9, r8\n\t"
  112955. "lsr r9, r8, #16\n\t"
  112956. "lsl r8, r8, #16\n\t"
  112957. "adds r3, r3, r8\n\t"
  112958. "adcs r4, r4, r9\n\t"
  112959. "adc r2, r2, #0\n\t"
  112960. "adds r3, r3, r8\n\t"
  112961. "adcs r4, r4, r9\n\t"
  112962. "adc r2, r2, #0\n\t"
  112963. #else
  112964. "umull r8, r9, r10, r12\n\t"
  112965. "adds r3, r3, r8\n\t"
  112966. "adcs r4, r4, r9\n\t"
  112967. "mov r2, #0\n\t"
  112968. "adc r2, r2, #0\n\t"
  112969. "adds r3, r3, r8\n\t"
  112970. "adcs r4, r4, r9\n\t"
  112971. "mov r2, #0\n\t"
  112972. "adc r2, r2, #0\n\t"
  112973. #endif
  112974. /* A[13] * A[15] */
  112975. "ldr r10, [%[a], #60]\n\t"
  112976. "ldr r12, [%[a], #52]\n\t"
  112977. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  112978. "lsl r8, r10, #16\n\t"
  112979. "lsl r9, r12, #16\n\t"
  112980. "lsr r8, r8, #16\n\t"
  112981. "lsr r9, r9, #16\n\t"
  112982. "mul r9, r8, r9\n\t"
  112983. "adds r3, r3, r9\n\t"
  112984. "adcs r4, r4, #0\n\t"
  112985. "adc r2, r2, #0\n\t"
  112986. "adds r3, r3, r9\n\t"
  112987. "adcs r4, r4, #0\n\t"
  112988. "adc r2, r2, #0\n\t"
  112989. "lsr r9, r12, #16\n\t"
  112990. "mul r8, r9, r8\n\t"
  112991. "lsr r9, r8, #16\n\t"
  112992. "lsl r8, r8, #16\n\t"
  112993. "adds r3, r3, r8\n\t"
  112994. "adcs r4, r4, r9\n\t"
  112995. "adc r2, r2, #0\n\t"
  112996. "adds r3, r3, r8\n\t"
  112997. "adcs r4, r4, r9\n\t"
  112998. "adc r2, r2, #0\n\t"
  112999. "lsr r8, r10, #16\n\t"
  113000. "lsr r9, r12, #16\n\t"
  113001. "mul r9, r8, r9\n\t"
  113002. "adds r4, r4, r9\n\t"
  113003. "adc r2, r2, #0\n\t"
  113004. "adds r4, r4, r9\n\t"
  113005. "adc r2, r2, #0\n\t"
  113006. "lsl r9, r12, #16\n\t"
  113007. "lsr r9, r9, #16\n\t"
  113008. "mul r8, r9, r8\n\t"
  113009. "lsr r9, r8, #16\n\t"
  113010. "lsl r8, r8, #16\n\t"
  113011. "adds r3, r3, r8\n\t"
  113012. "adcs r4, r4, r9\n\t"
  113013. "adc r2, r2, #0\n\t"
  113014. "adds r3, r3, r8\n\t"
  113015. "adcs r4, r4, r9\n\t"
  113016. "adc r2, r2, #0\n\t"
  113017. #else
  113018. "umull r8, r9, r10, r12\n\t"
  113019. "adds r3, r3, r8\n\t"
  113020. "adcs r4, r4, r9\n\t"
  113021. "adc r2, r2, #0\n\t"
  113022. "adds r3, r3, r8\n\t"
  113023. "adcs r4, r4, r9\n\t"
  113024. "adc r2, r2, #0\n\t"
  113025. #endif
  113026. /* A[14] * A[14] */
  113027. "ldr r10, [%[a], #56]\n\t"
  113028. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  113029. "lsl r8, r10, #16\n\t"
  113030. "lsr r9, r10, #16\n\t"
  113031. "lsr r8, r8, #16\n\t"
  113032. "mov r12, r8\n\t"
  113033. "mul r8, r12, r8\n\t"
  113034. "mov r12, r9\n\t"
  113035. "mul r9, r12, r9\n\t"
  113036. "adds r3, r3, r8\n\t"
  113037. "adcs r4, r4, r9\n\t"
  113038. "adc r2, r2, #0\n\t"
  113039. "lsr r9, r10, #16\n\t"
  113040. "lsl r8, r10, #16\n\t"
  113041. "lsr r8, r8, #16\n\t"
  113042. "mul r8, r9, r8\n\t"
  113043. "lsr r9, r8, #15\n\t"
  113044. "lsl r8, r8, #17\n\t"
  113045. "adds r3, r3, r8\n\t"
  113046. "adcs r4, r4, r9\n\t"
  113047. "adc r2, r2, #0\n\t"
  113048. #else
  113049. "umull r8, r9, r10, r10\n\t"
  113050. "adds r3, r3, r8\n\t"
  113051. "adcs r4, r4, r9\n\t"
  113052. "adc r2, r2, #0\n\t"
  113053. #endif
  113054. "str r3, [%[r], #112]\n\t"
  113055. /* A[13] * A[16] */
  113056. "ldr r10, [%[a], #64]\n\t"
  113057. "ldr r12, [%[a], #52]\n\t"
  113058. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  113059. "lsl r8, r10, #16\n\t"
  113060. "lsl r9, r12, #16\n\t"
  113061. "lsr r8, r8, #16\n\t"
  113062. "lsr r9, r9, #16\n\t"
  113063. "mul r9, r8, r9\n\t"
  113064. "adds r4, r4, r9\n\t"
  113065. "adcs r2, r2, #0\n\t"
  113066. "mov r3, #0\n\t"
  113067. "adc r3, r3, #0\n\t"
  113068. "adds r4, r4, r9\n\t"
  113069. "adcs r2, r2, #0\n\t"
  113070. "adc r3, r3, #0\n\t"
  113071. "lsr r9, r12, #16\n\t"
  113072. "mul r8, r9, r8\n\t"
  113073. "lsr r9, r8, #16\n\t"
  113074. "lsl r8, r8, #16\n\t"
  113075. "adds r4, r4, r8\n\t"
  113076. "adcs r2, r2, r9\n\t"
  113077. "adc r3, r3, #0\n\t"
  113078. "adds r4, r4, r8\n\t"
  113079. "adcs r2, r2, r9\n\t"
  113080. "adc r3, r3, #0\n\t"
  113081. "lsr r8, r10, #16\n\t"
  113082. "lsr r9, r12, #16\n\t"
  113083. "mul r9, r8, r9\n\t"
  113084. "adds r2, r2, r9\n\t"
  113085. "adc r3, r3, #0\n\t"
  113086. "adds r2, r2, r9\n\t"
  113087. "adc r3, r3, #0\n\t"
  113088. "lsl r9, r12, #16\n\t"
  113089. "lsr r9, r9, #16\n\t"
  113090. "mul r8, r9, r8\n\t"
  113091. "lsr r9, r8, #16\n\t"
  113092. "lsl r8, r8, #16\n\t"
  113093. "adds r4, r4, r8\n\t"
  113094. "adcs r2, r2, r9\n\t"
  113095. "adc r3, r3, #0\n\t"
  113096. "adds r4, r4, r8\n\t"
  113097. "adcs r2, r2, r9\n\t"
  113098. "adc r3, r3, #0\n\t"
  113099. #else
  113100. "umull r8, r9, r10, r12\n\t"
  113101. "adds r4, r4, r8\n\t"
  113102. "adcs r2, r2, r9\n\t"
  113103. "mov r3, #0\n\t"
  113104. "adc r3, r3, #0\n\t"
  113105. "adds r4, r4, r8\n\t"
  113106. "adcs r2, r2, r9\n\t"
  113107. "mov r3, #0\n\t"
  113108. "adc r3, r3, #0\n\t"
  113109. #endif
  113110. /* A[14] * A[15] */
  113111. "ldr r10, [%[a], #60]\n\t"
  113112. "ldr r12, [%[a], #56]\n\t"
  113113. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  113114. "lsl r8, r10, #16\n\t"
  113115. "lsl r9, r12, #16\n\t"
  113116. "lsr r8, r8, #16\n\t"
  113117. "lsr r9, r9, #16\n\t"
  113118. "mul r9, r8, r9\n\t"
  113119. "adds r4, r4, r9\n\t"
  113120. "adcs r2, r2, #0\n\t"
  113121. "adc r3, r3, #0\n\t"
  113122. "adds r4, r4, r9\n\t"
  113123. "adcs r2, r2, #0\n\t"
  113124. "adc r3, r3, #0\n\t"
  113125. "lsr r9, r12, #16\n\t"
  113126. "mul r8, r9, r8\n\t"
  113127. "lsr r9, r8, #16\n\t"
  113128. "lsl r8, r8, #16\n\t"
  113129. "adds r4, r4, r8\n\t"
  113130. "adcs r2, r2, r9\n\t"
  113131. "adc r3, r3, #0\n\t"
  113132. "adds r4, r4, r8\n\t"
  113133. "adcs r2, r2, r9\n\t"
  113134. "adc r3, r3, #0\n\t"
  113135. "lsr r8, r10, #16\n\t"
  113136. "lsr r9, r12, #16\n\t"
  113137. "mul r9, r8, r9\n\t"
  113138. "adds r2, r2, r9\n\t"
  113139. "adc r3, r3, #0\n\t"
  113140. "adds r2, r2, r9\n\t"
  113141. "adc r3, r3, #0\n\t"
  113142. "lsl r9, r12, #16\n\t"
  113143. "lsr r9, r9, #16\n\t"
  113144. "mul r8, r9, r8\n\t"
  113145. "lsr r9, r8, #16\n\t"
  113146. "lsl r8, r8, #16\n\t"
  113147. "adds r4, r4, r8\n\t"
  113148. "adcs r2, r2, r9\n\t"
  113149. "adc r3, r3, #0\n\t"
  113150. "adds r4, r4, r8\n\t"
  113151. "adcs r2, r2, r9\n\t"
  113152. "adc r3, r3, #0\n\t"
  113153. #else
  113154. "umull r8, r9, r10, r12\n\t"
  113155. "adds r4, r4, r8\n\t"
  113156. "adcs r2, r2, r9\n\t"
  113157. "adc r3, r3, #0\n\t"
  113158. "adds r4, r4, r8\n\t"
  113159. "adcs r2, r2, r9\n\t"
  113160. "adc r3, r3, #0\n\t"
  113161. #endif
  113162. "str r4, [%[r], #116]\n\t"
  113163. /* A[14] * A[16] */
  113164. "ldr r10, [%[a], #64]\n\t"
  113165. "ldr r12, [%[a], #56]\n\t"
  113166. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  113167. "lsl r8, r10, #16\n\t"
  113168. "lsl r9, r12, #16\n\t"
  113169. "lsr r8, r8, #16\n\t"
  113170. "lsr r9, r9, #16\n\t"
  113171. "mul r9, r8, r9\n\t"
  113172. "adds r2, r2, r9\n\t"
  113173. "adcs r3, r3, #0\n\t"
  113174. "mov r4, #0\n\t"
  113175. "adc r4, r4, #0\n\t"
  113176. "adds r2, r2, r9\n\t"
  113177. "adcs r3, r3, #0\n\t"
  113178. "adc r4, r4, #0\n\t"
  113179. "lsr r9, r12, #16\n\t"
  113180. "mul r8, r9, r8\n\t"
  113181. "lsr r9, r8, #16\n\t"
  113182. "lsl r8, r8, #16\n\t"
  113183. "adds r2, r2, r8\n\t"
  113184. "adcs r3, r3, r9\n\t"
  113185. "adc r4, r4, #0\n\t"
  113186. "adds r2, r2, r8\n\t"
  113187. "adcs r3, r3, r9\n\t"
  113188. "adc r4, r4, #0\n\t"
  113189. "lsr r8, r10, #16\n\t"
  113190. "lsr r9, r12, #16\n\t"
  113191. "mul r9, r8, r9\n\t"
  113192. "adds r3, r3, r9\n\t"
  113193. "adc r4, r4, #0\n\t"
  113194. "adds r3, r3, r9\n\t"
  113195. "adc r4, r4, #0\n\t"
  113196. "lsl r9, r12, #16\n\t"
  113197. "lsr r9, r9, #16\n\t"
  113198. "mul r8, r9, r8\n\t"
  113199. "lsr r9, r8, #16\n\t"
  113200. "lsl r8, r8, #16\n\t"
  113201. "adds r2, r2, r8\n\t"
  113202. "adcs r3, r3, r9\n\t"
  113203. "adc r4, r4, #0\n\t"
  113204. "adds r2, r2, r8\n\t"
  113205. "adcs r3, r3, r9\n\t"
  113206. "adc r4, r4, #0\n\t"
  113207. #else
  113208. "umull r8, r9, r10, r12\n\t"
  113209. "adds r2, r2, r8\n\t"
  113210. "adcs r3, r3, r9\n\t"
  113211. "mov r4, #0\n\t"
  113212. "adc r4, r4, #0\n\t"
  113213. "adds r2, r2, r8\n\t"
  113214. "adcs r3, r3, r9\n\t"
  113215. "mov r4, #0\n\t"
  113216. "adc r4, r4, #0\n\t"
  113217. #endif
  113218. /* A[15] * A[15] */
  113219. "ldr r10, [%[a], #60]\n\t"
  113220. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  113221. "lsl r8, r10, #16\n\t"
  113222. "lsr r9, r10, #16\n\t"
  113223. "lsr r8, r8, #16\n\t"
  113224. "mov r12, r8\n\t"
  113225. "mul r8, r12, r8\n\t"
  113226. "mov r12, r9\n\t"
  113227. "mul r9, r12, r9\n\t"
  113228. "adds r2, r2, r8\n\t"
  113229. "adcs r3, r3, r9\n\t"
  113230. "adc r4, r4, #0\n\t"
  113231. "lsr r9, r10, #16\n\t"
  113232. "lsl r8, r10, #16\n\t"
  113233. "lsr r8, r8, #16\n\t"
  113234. "mul r8, r9, r8\n\t"
  113235. "lsr r9, r8, #15\n\t"
  113236. "lsl r8, r8, #17\n\t"
  113237. "adds r2, r2, r8\n\t"
  113238. "adcs r3, r3, r9\n\t"
  113239. "adc r4, r4, #0\n\t"
  113240. #else
  113241. "umull r8, r9, r10, r10\n\t"
  113242. "adds r2, r2, r8\n\t"
  113243. "adcs r3, r3, r9\n\t"
  113244. "adc r4, r4, #0\n\t"
  113245. #endif
  113246. "str r2, [%[r], #120]\n\t"
  113247. /* A[15] * A[16] */
  113248. "ldr r10, [%[a], #64]\n\t"
  113249. "ldr r12, [%[a], #60]\n\t"
  113250. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  113251. "lsl r8, r10, #16\n\t"
  113252. "lsl r9, r12, #16\n\t"
  113253. "lsr r8, r8, #16\n\t"
  113254. "lsr r9, r9, #16\n\t"
  113255. "mul r9, r8, r9\n\t"
  113256. "adds r3, r3, r9\n\t"
  113257. "adcs r4, r4, #0\n\t"
  113258. "mov r2, #0\n\t"
  113259. "adc r2, r2, #0\n\t"
  113260. "adds r3, r3, r9\n\t"
  113261. "adcs r4, r4, #0\n\t"
  113262. "adc r2, r2, #0\n\t"
  113263. "lsr r9, r12, #16\n\t"
  113264. "mul r8, r9, r8\n\t"
  113265. "lsr r9, r8, #16\n\t"
  113266. "lsl r8, r8, #16\n\t"
  113267. "adds r3, r3, r8\n\t"
  113268. "adcs r4, r4, r9\n\t"
  113269. "adc r2, r2, #0\n\t"
  113270. "adds r3, r3, r8\n\t"
  113271. "adcs r4, r4, r9\n\t"
  113272. "adc r2, r2, #0\n\t"
  113273. "lsr r8, r10, #16\n\t"
  113274. "lsr r9, r12, #16\n\t"
  113275. "mul r9, r8, r9\n\t"
  113276. "adds r4, r4, r9\n\t"
  113277. "adc r2, r2, #0\n\t"
  113278. "adds r4, r4, r9\n\t"
  113279. "adc r2, r2, #0\n\t"
  113280. "lsl r9, r12, #16\n\t"
  113281. "lsr r9, r9, #16\n\t"
  113282. "mul r8, r9, r8\n\t"
  113283. "lsr r9, r8, #16\n\t"
  113284. "lsl r8, r8, #16\n\t"
  113285. "adds r3, r3, r8\n\t"
  113286. "adcs r4, r4, r9\n\t"
  113287. "adc r2, r2, #0\n\t"
  113288. "adds r3, r3, r8\n\t"
  113289. "adcs r4, r4, r9\n\t"
  113290. "adc r2, r2, #0\n\t"
  113291. #else
  113292. "umull r8, r9, r10, r12\n\t"
  113293. "adds r3, r3, r8\n\t"
  113294. "adcs r4, r4, r9\n\t"
  113295. "mov r2, #0\n\t"
  113296. "adc r2, r2, #0\n\t"
  113297. "adds r3, r3, r8\n\t"
  113298. "adcs r4, r4, r9\n\t"
  113299. "mov r2, #0\n\t"
  113300. "adc r2, r2, #0\n\t"
  113301. #endif
  113302. "str r3, [%[r], #124]\n\t"
  113303. /* A[16] * A[16] */
  113304. "ldr r10, [%[a], #64]\n\t"
  113305. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  113306. "lsl r8, r10, #16\n\t"
  113307. "lsr r9, r10, #16\n\t"
  113308. "lsr r8, r8, #16\n\t"
  113309. "mov r12, r8\n\t"
  113310. "mul r8, r12, r8\n\t"
  113311. "mov r12, r9\n\t"
  113312. "mul r9, r12, r9\n\t"
  113313. "adds r4, r4, r8\n\t"
  113314. "adc r2, r2, r9\n\t"
  113315. "lsr r9, r10, #16\n\t"
  113316. "lsl r8, r10, #16\n\t"
  113317. "lsr r8, r8, #16\n\t"
  113318. "mul r8, r9, r8\n\t"
  113319. "lsr r9, r8, #15\n\t"
  113320. "lsl r8, r8, #17\n\t"
  113321. "adds r4, r4, r8\n\t"
  113322. "adc r2, r2, r9\n\t"
  113323. #else
  113324. "umull r8, r9, r10, r10\n\t"
  113325. "adds r4, r4, r8\n\t"
  113326. "adc r2, r2, r9\n\t"
  113327. #endif
  113328. "str r4, [%[r], #128]\n\t"
  113329. "str r2, [%[r], #132]\n\t"
  113330. "ldm sp!, {r2, r3, r4, r8}\n\t"
  113331. "stm %[r]!, {r2, r3, r4, r8}\n\t"
  113332. "ldm sp!, {r2, r3, r4, r8}\n\t"
  113333. "stm %[r]!, {r2, r3, r4, r8}\n\t"
  113334. "ldm sp!, {r2, r3, r4, r8}\n\t"
  113335. "stm %[r]!, {r2, r3, r4, r8}\n\t"
  113336. "ldm sp!, {r2, r3, r4, r8}\n\t"
  113337. "stm %[r]!, {r2, r3, r4, r8}\n\t"
  113338. "ldm sp!, {r2}\n\t"
  113339. "stm %[r]!, {r2}\n\t"
  113340. : [r] "+r" (r), [a] "+r" (a)
  113341. :
  113342. : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r12", "cc"
  113343. );
  113344. }
  113345. #endif /* WOLFSSL_SP_SMALL */
  113346. #ifdef WOLFSSL_SP_SMALL
  113347. /* Add b to a into r. (r = a + b)
  113348. *
  113349. * r A single precision integer.
  113350. * a A single precision integer.
  113351. * b A single precision integer.
  113352. */
  113353. static sp_digit sp_521_add_17(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p)
  113354. {
  113355. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  113356. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  113357. register const sp_digit* b asm ("r2") = (const sp_digit*)b_p;
  113358. __asm__ __volatile__ (
  113359. "mov r3, #0\n\t"
  113360. "add r12, %[a], #0x40\n\t"
  113361. "\n"
  113362. "L_sp_521_add_17_word_%=: \n\t"
  113363. "adds r3, r3, #-1\n\t"
  113364. "ldm %[a]!, {r4, r5, r6, r7}\n\t"
  113365. "ldm %[b]!, {r8, r9, r10, r11}\n\t"
  113366. "adcs r4, r4, r8\n\t"
  113367. "adcs r5, r5, r9\n\t"
  113368. "adcs r6, r6, r10\n\t"
  113369. "adcs r7, r7, r11\n\t"
  113370. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  113371. "mov r4, #0\n\t"
  113372. "adc r3, r4, #0\n\t"
  113373. "cmp %[a], r12\n\t"
  113374. "bne L_sp_521_add_17_word_%=\n\t"
  113375. "adds r3, r3, #-1\n\t"
  113376. "ldm %[a], {r4}\n\t"
  113377. "ldm %[b], {r8}\n\t"
  113378. "adcs r4, r4, r8\n\t"
  113379. "stm %[r]!, {r4}\n\t"
  113380. "mov r4, #0\n\t"
  113381. "adc %[r], r4, #0\n\t"
  113382. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  113383. :
  113384. : "memory", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r3", "r12", "cc"
  113385. );
  113386. return (uint32_t)(size_t)r;
  113387. }
  113388. #else
  113389. /* Add b to a into r. (r = a + b)
  113390. *
  113391. * r A single precision integer.
  113392. * a A single precision integer.
  113393. * b A single precision integer.
  113394. */
  113395. static sp_digit sp_521_add_17(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p)
  113396. {
  113397. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  113398. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  113399. register const sp_digit* b asm ("r2") = (const sp_digit*)b_p;
  113400. __asm__ __volatile__ (
  113401. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  113402. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  113403. "adds r3, r3, r7\n\t"
  113404. "adcs r4, r4, r8\n\t"
  113405. "adcs r5, r5, r9\n\t"
  113406. "adcs r6, r6, r10\n\t"
  113407. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  113408. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  113409. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  113410. "adcs r3, r3, r7\n\t"
  113411. "adcs r4, r4, r8\n\t"
  113412. "adcs r5, r5, r9\n\t"
  113413. "adcs r6, r6, r10\n\t"
  113414. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  113415. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  113416. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  113417. "adcs r3, r3, r7\n\t"
  113418. "adcs r4, r4, r8\n\t"
  113419. "adcs r5, r5, r9\n\t"
  113420. "adcs r6, r6, r10\n\t"
  113421. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  113422. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  113423. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  113424. "adcs r3, r3, r7\n\t"
  113425. "adcs r4, r4, r8\n\t"
  113426. "adcs r5, r5, r9\n\t"
  113427. "adcs r6, r6, r10\n\t"
  113428. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  113429. "ldm %[a]!, {r3}\n\t"
  113430. "ldm %[b]!, {r7}\n\t"
  113431. "adcs r3, r3, r7\n\t"
  113432. "stm %[r]!, {r3}\n\t"
  113433. "mov %[r], #0\n\t"
  113434. "adc %[r], %[r], #0\n\t"
  113435. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  113436. :
  113437. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "cc"
  113438. );
  113439. return (uint32_t)(size_t)r;
  113440. }
  113441. #endif /* WOLFSSL_SP_SMALL */
  113442. /* Multiply a number by Montgomery normalizer mod modulus (prime).
  113443. *
  113444. * r The resulting Montgomery form number.
  113445. * a The number to convert.
  113446. * m The modulus (prime).
  113447. * returns MEMORY_E when memory allocation fails and MP_OKAY otherwise.
  113448. */
  113449. static int sp_521_mod_mul_norm_17(sp_digit* r, const sp_digit* a, const sp_digit* m)
  113450. {
  113451. (void)m;
  113452. if (r != a) {
  113453. XMEMCPY(r, a, 17 * sizeof(sp_digit));
  113454. }
  113455. return MP_OKAY;
  113456. }
  113457. /* Convert an mp_int to an array of sp_digit.
  113458. *
  113459. * r A single precision integer.
  113460. * size Maximum number of bytes to convert
  113461. * a A multi-precision integer.
  113462. */
  113463. static void sp_521_from_mp(sp_digit* r, int size, const mp_int* a)
  113464. {
  113465. #if DIGIT_BIT == 32
  113466. int i;
  113467. sp_digit j = (sp_digit)0 - (sp_digit)a->used;
  113468. int o = 0;
  113469. for (i = 0; i < size; i++) {
  113470. sp_digit mask = (sp_digit)0 - (j >> 31);
  113471. r[i] = a->dp[o] & mask;
  113472. j++;
  113473. o += (int)(j >> 31);
  113474. }
  113475. #elif DIGIT_BIT > 32
  113476. unsigned int i;
  113477. int j = 0;
  113478. word32 s = 0;
  113479. r[0] = 0;
  113480. for (i = 0; i < (unsigned int)a->used && j < size; i++) {
  113481. r[j] |= ((sp_digit)a->dp[i] << s);
  113482. r[j] &= 0xffffffff;
  113483. s = 32U - s;
  113484. if (j + 1 >= size) {
  113485. break;
  113486. }
  113487. /* lint allow cast of mismatch word32 and mp_digit */
  113488. r[++j] = (sp_digit)(a->dp[i] >> s); /*lint !e9033*/
  113489. while ((s + 32U) <= (word32)DIGIT_BIT) {
  113490. s += 32U;
  113491. r[j] &= 0xffffffff;
  113492. if (j + 1 >= size) {
  113493. break;
  113494. }
  113495. if (s < (word32)DIGIT_BIT) {
  113496. /* lint allow cast of mismatch word32 and mp_digit */
  113497. r[++j] = (sp_digit)(a->dp[i] >> s); /*lint !e9033*/
  113498. }
  113499. else {
  113500. r[++j] = (sp_digit)0;
  113501. }
  113502. }
  113503. s = (word32)DIGIT_BIT - s;
  113504. }
  113505. for (j++; j < size; j++) {
  113506. r[j] = 0;
  113507. }
  113508. #else
  113509. unsigned int i;
  113510. int j = 0;
  113511. int s = 0;
  113512. r[0] = 0;
  113513. for (i = 0; i < (unsigned int)a->used && j < size; i++) {
  113514. r[j] |= ((sp_digit)a->dp[i]) << s;
  113515. if (s + DIGIT_BIT >= 32) {
  113516. r[j] &= 0xffffffff;
  113517. if (j + 1 >= size) {
  113518. break;
  113519. }
  113520. s = 32 - s;
  113521. if (s == DIGIT_BIT) {
  113522. r[++j] = 0;
  113523. s = 0;
  113524. }
  113525. else {
  113526. r[++j] = a->dp[i] >> s;
  113527. s = DIGIT_BIT - s;
  113528. }
  113529. }
  113530. else {
  113531. s += DIGIT_BIT;
  113532. }
  113533. }
  113534. for (j++; j < size; j++) {
  113535. r[j] = 0;
  113536. }
  113537. #endif
  113538. }
  113539. /* Convert a point of type ecc_point to type sp_point_521.
  113540. *
  113541. * p Point of type sp_point_521 (result).
  113542. * pm Point of type ecc_point.
  113543. */
  113544. static void sp_521_point_from_ecc_point_17(sp_point_521* p,
  113545. const ecc_point* pm)
  113546. {
  113547. XMEMSET(p->x, 0, sizeof(p->x));
  113548. XMEMSET(p->y, 0, sizeof(p->y));
  113549. XMEMSET(p->z, 0, sizeof(p->z));
  113550. sp_521_from_mp(p->x, 17, pm->x);
  113551. sp_521_from_mp(p->y, 17, pm->y);
  113552. sp_521_from_mp(p->z, 17, pm->z);
  113553. p->infinity = 0;
  113554. }
  113555. /* Convert an array of sp_digit to an mp_int.
  113556. *
  113557. * a A single precision integer.
  113558. * r A multi-precision integer.
  113559. */
  113560. static int sp_521_to_mp(const sp_digit* a, mp_int* r)
  113561. {
  113562. int err;
  113563. err = mp_grow(r, (521 + DIGIT_BIT - 1) / DIGIT_BIT);
  113564. if (err == MP_OKAY) { /*lint !e774 case where err is always MP_OKAY*/
  113565. #if DIGIT_BIT == 32
  113566. XMEMCPY(r->dp, a, sizeof(sp_digit) * 17);
  113567. r->used = 17;
  113568. mp_clamp(r);
  113569. #elif DIGIT_BIT < 32
  113570. int i;
  113571. int j = 0;
  113572. int s = 0;
  113573. r->dp[0] = 0;
  113574. for (i = 0; i < 17; i++) {
  113575. r->dp[j] |= (mp_digit)(a[i] << s);
  113576. r->dp[j] &= ((sp_digit)1 << DIGIT_BIT) - 1;
  113577. s = DIGIT_BIT - s;
  113578. r->dp[++j] = (mp_digit)(a[i] >> s);
  113579. while (s + DIGIT_BIT <= 32) {
  113580. s += DIGIT_BIT;
  113581. r->dp[j++] &= ((sp_digit)1 << DIGIT_BIT) - 1;
  113582. if (s == SP_WORD_SIZE) {
  113583. r->dp[j] = 0;
  113584. }
  113585. else {
  113586. r->dp[j] = (mp_digit)(a[i] >> s);
  113587. }
  113588. }
  113589. s = 32 - s;
  113590. }
  113591. r->used = (521 + DIGIT_BIT - 1) / DIGIT_BIT;
  113592. mp_clamp(r);
  113593. #else
  113594. int i;
  113595. int j = 0;
  113596. int s = 0;
  113597. r->dp[0] = 0;
  113598. for (i = 0; i < 17; i++) {
  113599. r->dp[j] |= ((mp_digit)a[i]) << s;
  113600. if (s + 32 >= DIGIT_BIT) {
  113601. #if DIGIT_BIT != 32 && DIGIT_BIT != 64
  113602. r->dp[j] &= ((sp_digit)1 << DIGIT_BIT) - 1;
  113603. #endif
  113604. s = DIGIT_BIT - s;
  113605. r->dp[++j] = a[i] >> s;
  113606. s = 32 - s;
  113607. }
  113608. else {
  113609. s += 32;
  113610. }
  113611. }
  113612. r->used = (521 + DIGIT_BIT - 1) / DIGIT_BIT;
  113613. mp_clamp(r);
  113614. #endif
  113615. }
  113616. return err;
  113617. }
  113618. /* Convert a point of type sp_point_521 to type ecc_point.
  113619. *
  113620. * p Point of type sp_point_521.
  113621. * pm Point of type ecc_point (result).
  113622. * returns MEMORY_E when allocation of memory in ecc_point fails otherwise
  113623. * MP_OKAY.
  113624. */
  113625. static int sp_521_point_to_ecc_point_17(const sp_point_521* p, ecc_point* pm)
  113626. {
  113627. int err;
  113628. err = sp_521_to_mp(p->x, pm->x);
  113629. if (err == MP_OKAY) {
  113630. err = sp_521_to_mp(p->y, pm->y);
  113631. }
  113632. if (err == MP_OKAY) {
  113633. err = sp_521_to_mp(p->z, pm->z);
  113634. }
  113635. return err;
  113636. }
  113637. #ifdef WOLFSSL_SP_SMALL
  113638. /* Conditionally subtract b from a using the mask m.
  113639. * m is -1 to subtract and 0 when not copying.
  113640. *
  113641. * r A single precision number representing condition subtract result.
  113642. * a A single precision number to subtract from.
  113643. * b A single precision number to subtract.
  113644. * m Mask value to apply.
  113645. */
  113646. 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)
  113647. {
  113648. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  113649. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  113650. register const sp_digit* b asm ("r2") = (const sp_digit*)b_p;
  113651. register sp_digit m asm ("r3") = (sp_digit)m_p;
  113652. __asm__ __volatile__ (
  113653. "mov r6, #0\n\t"
  113654. "mov r12, #0\n\t"
  113655. "mov lr, #0\n\t"
  113656. "\n"
  113657. "L_sp_521_cond_sub_17_words_%=: \n\t"
  113658. "subs r12, r6, r12\n\t"
  113659. "ldr r4, [%[a], lr]\n\t"
  113660. "ldr r5, [%[b], lr]\n\t"
  113661. "and r5, r5, %[m]\n\t"
  113662. "sbcs r4, r4, r5\n\t"
  113663. "sbc r12, r6, r6\n\t"
  113664. "str r4, [%[r], lr]\n\t"
  113665. "add lr, lr, #4\n\t"
  113666. "cmp lr, #0x44\n\t"
  113667. "blt L_sp_521_cond_sub_17_words_%=\n\t"
  113668. "mov %[r], r12\n\t"
  113669. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b), [m] "+r" (m)
  113670. :
  113671. : "memory", "r12", "lr", "r4", "r5", "r6", "cc"
  113672. );
  113673. return (uint32_t)(size_t)r;
  113674. }
  113675. #else
  113676. /* Conditionally subtract b from a using the mask m.
  113677. * m is -1 to subtract and 0 when not copying.
  113678. *
  113679. * r A single precision number representing condition subtract result.
  113680. * a A single precision number to subtract from.
  113681. * b A single precision number to subtract.
  113682. * m Mask value to apply.
  113683. */
  113684. 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)
  113685. {
  113686. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  113687. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  113688. register const sp_digit* b asm ("r2") = (const sp_digit*)b_p;
  113689. register sp_digit m asm ("r3") = (sp_digit)m_p;
  113690. __asm__ __volatile__ (
  113691. "mov lr, #0\n\t"
  113692. "ldm %[a]!, {r4, r5}\n\t"
  113693. "ldm %[b]!, {r6, r7}\n\t"
  113694. "and r6, r6, %[m]\n\t"
  113695. "and r7, r7, %[m]\n\t"
  113696. "subs r4, r4, r6\n\t"
  113697. "sbcs r5, r5, r7\n\t"
  113698. "stm %[r]!, {r4, r5}\n\t"
  113699. "ldm %[a]!, {r4, r5}\n\t"
  113700. "ldm %[b]!, {r6, r7}\n\t"
  113701. "and r6, r6, %[m]\n\t"
  113702. "and r7, r7, %[m]\n\t"
  113703. "sbcs r4, r4, r6\n\t"
  113704. "sbcs r5, r5, r7\n\t"
  113705. "stm %[r]!, {r4, r5}\n\t"
  113706. "ldm %[a]!, {r4, r5}\n\t"
  113707. "ldm %[b]!, {r6, r7}\n\t"
  113708. "and r6, r6, %[m]\n\t"
  113709. "and r7, r7, %[m]\n\t"
  113710. "sbcs r4, r4, r6\n\t"
  113711. "sbcs r5, r5, r7\n\t"
  113712. "stm %[r]!, {r4, r5}\n\t"
  113713. "ldm %[a]!, {r4, r5}\n\t"
  113714. "ldm %[b]!, {r6, r7}\n\t"
  113715. "and r6, r6, %[m]\n\t"
  113716. "and r7, r7, %[m]\n\t"
  113717. "sbcs r4, r4, r6\n\t"
  113718. "sbcs r5, r5, r7\n\t"
  113719. "stm %[r]!, {r4, r5}\n\t"
  113720. "ldm %[a]!, {r4, r5}\n\t"
  113721. "ldm %[b]!, {r6, r7}\n\t"
  113722. "and r6, r6, %[m]\n\t"
  113723. "and r7, r7, %[m]\n\t"
  113724. "sbcs r4, r4, r6\n\t"
  113725. "sbcs r5, r5, r7\n\t"
  113726. "stm %[r]!, {r4, r5}\n\t"
  113727. "ldm %[a]!, {r4, r5}\n\t"
  113728. "ldm %[b]!, {r6, r7}\n\t"
  113729. "and r6, r6, %[m]\n\t"
  113730. "and r7, r7, %[m]\n\t"
  113731. "sbcs r4, r4, r6\n\t"
  113732. "sbcs r5, r5, r7\n\t"
  113733. "stm %[r]!, {r4, r5}\n\t"
  113734. "ldm %[a]!, {r4, r5}\n\t"
  113735. "ldm %[b]!, {r6, r7}\n\t"
  113736. "and r6, r6, %[m]\n\t"
  113737. "and r7, r7, %[m]\n\t"
  113738. "sbcs r4, r4, r6\n\t"
  113739. "sbcs r5, r5, r7\n\t"
  113740. "stm %[r]!, {r4, r5}\n\t"
  113741. "ldm %[a]!, {r4, r5}\n\t"
  113742. "ldm %[b]!, {r6, r7}\n\t"
  113743. "and r6, r6, %[m]\n\t"
  113744. "and r7, r7, %[m]\n\t"
  113745. "sbcs r4, r4, r6\n\t"
  113746. "sbcs r5, r5, r7\n\t"
  113747. "stm %[r]!, {r4, r5}\n\t"
  113748. "ldr r4, [%[a]]\n\t"
  113749. "ldr r6, [%[b]]\n\t"
  113750. "and r6, r6, %[m]\n\t"
  113751. "sbcs r4, r4, r6\n\t"
  113752. "str r4, [%[r]]\n\t"
  113753. "sbc %[r], lr, lr\n\t"
  113754. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b), [m] "+r" (m)
  113755. :
  113756. : "memory", "r12", "lr", "r4", "r5", "r6", "r7", "cc"
  113757. );
  113758. return (uint32_t)(size_t)r;
  113759. }
  113760. #endif /* WOLFSSL_SP_SMALL */
  113761. /* Reduce the number back to 521 bits using Montgomery reduction.
  113762. *
  113763. * a A single precision number to reduce in place.
  113764. * m The single precision number representing the modulus.
  113765. * mp The digit representing the negative inverse of m mod 2^n.
  113766. */
  113767. static SP_NOINLINE void sp_521_mont_reduce_17(sp_digit* a_p, const sp_digit* m_p, sp_digit mp_p)
  113768. {
  113769. register sp_digit* a asm ("r0") = (sp_digit*)a_p;
  113770. __asm__ __volatile__ (
  113771. "sub sp, sp, #0x44\n\t"
  113772. "mov r12, sp\n\t"
  113773. /* Shift top down by 9 bits */
  113774. "add lr, %[a], #0x40\n\t"
  113775. /* 0-7 */
  113776. "ldm lr!, {r1, r2, r3, r4, r5, r6, r7, r8, r9}\n\t"
  113777. "lsr r1, r1, #9\n\t"
  113778. "orr r1, r1, r2, lsl #23\n\t"
  113779. "lsr r2, r2, #9\n\t"
  113780. "orr r2, r2, r3, lsl #23\n\t"
  113781. "lsr r3, r3, #9\n\t"
  113782. "orr r3, r3, r4, lsl #23\n\t"
  113783. "lsr r4, r4, #9\n\t"
  113784. "orr r4, r4, r5, lsl #23\n\t"
  113785. "lsr r5, r5, #9\n\t"
  113786. "orr r5, r5, r6, lsl #23\n\t"
  113787. "lsr r6, r6, #9\n\t"
  113788. "orr r6, r6, r7, lsl #23\n\t"
  113789. "lsr r7, r7, #9\n\t"
  113790. "orr r7, r7, r8, lsl #23\n\t"
  113791. "lsr r8, r8, #9\n\t"
  113792. "orr r8, r8, r9, lsl #23\n\t"
  113793. "stm r12!, {r1, r2, r3, r4, r5, r6, r7, r8}\n\t"
  113794. "mov r1, r9\n\t"
  113795. /* 8-16 */
  113796. "ldm lr!, {r2, r3, r4, r5, r6, r7, r8, r9}\n\t"
  113797. "lsr r1, r1, #9\n\t"
  113798. "orr r1, r1, r2, lsl #23\n\t"
  113799. "lsr r2, r2, #9\n\t"
  113800. "orr r2, r2, r3, lsl #23\n\t"
  113801. "lsr r3, r3, #9\n\t"
  113802. "orr r3, r3, r4, lsl #23\n\t"
  113803. "lsr r4, r4, #9\n\t"
  113804. "orr r4, r4, r5, lsl #23\n\t"
  113805. "lsr r5, r5, #9\n\t"
  113806. "orr r5, r5, r6, lsl #23\n\t"
  113807. "lsr r6, r6, #9\n\t"
  113808. "orr r6, r6, r7, lsl #23\n\t"
  113809. "lsr r7, r7, #9\n\t"
  113810. "orr r7, r7, r8, lsl #23\n\t"
  113811. "lsr r8, r8, #9\n\t"
  113812. "orr r8, r8, r9, lsl #23\n\t"
  113813. "lsr r9, r9, #9\n\t"
  113814. "stm r12!, {r1, r2, r3, r4, r5, r6, r7, r8, r9}\n\t"
  113815. /* Add top to bottom */
  113816. /* 0-5 */
  113817. "ldm %[a], {r1, r2, r3, r4, r5, r6}\n\t"
  113818. "ldm sp!, {r7, r8, r9, r10, r11, r12}\n\t"
  113819. "adds r1, r1, r7\n\t"
  113820. "adcs r2, r2, r8\n\t"
  113821. "adcs r3, r3, r9\n\t"
  113822. "adcs r4, r4, r10\n\t"
  113823. "adcs r5, r5, r11\n\t"
  113824. "adcs r6, r6, r12\n\t"
  113825. "stm %[a]!, {r1, r2, r3, r4, r5, r6}\n\t"
  113826. /* 6-11 */
  113827. "ldm %[a], {r1, r2, r3, r4, r5, r6}\n\t"
  113828. "ldm sp!, {r7, r8, r9, r10, r11, r12}\n\t"
  113829. "adcs r1, r1, r7\n\t"
  113830. "adcs r2, r2, r8\n\t"
  113831. "adcs r3, r3, r9\n\t"
  113832. "adcs r4, r4, r10\n\t"
  113833. "adcs r5, r5, r11\n\t"
  113834. "adcs r6, r6, r12\n\t"
  113835. "stm %[a]!, {r1, r2, r3, r4, r5, r6}\n\t"
  113836. /* 12-16 */
  113837. "ldm %[a], {r1, r2, r3, r4, r5}\n\t"
  113838. "ldm sp!, {r7, r8, r9, r10, r11}\n\t"
  113839. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  113840. "mov lr, #0x1\n\t"
  113841. "lsl lr, lr, #8\n\t"
  113842. "add lr, lr, #0xff\n\t"
  113843. #else
  113844. "mov lr, #0x1ff\n\t"
  113845. #endif
  113846. "and r5, r5, lr\n\t"
  113847. "adcs r1, r1, r7\n\t"
  113848. "adcs r2, r2, r8\n\t"
  113849. "adcs r3, r3, r9\n\t"
  113850. "adcs r4, r4, r10\n\t"
  113851. "adcs r5, r5, r11\n\t"
  113852. "lsr r12, r5, #9\n\t"
  113853. "and r5, r5, lr\n\t"
  113854. "stm %[a]!, {r1, r2, r3, r4, r5}\n\t"
  113855. "sub %[a], %[a], #0x44\n\t"
  113856. /* Add overflow */
  113857. /* 0-8 */
  113858. "ldm %[a], {r1, r2, r3, r4, r5, r6, r7, r8, r9}\n\t"
  113859. "adds r1, r1, r12\n\t"
  113860. "adcs r2, r2, #0\n\t"
  113861. "adcs r3, r3, #0\n\t"
  113862. "adcs r4, r4, #0\n\t"
  113863. "adcs r5, r5, #0\n\t"
  113864. "adcs r6, r6, #0\n\t"
  113865. "adcs r7, r7, #0\n\t"
  113866. "adcs r8, r8, #0\n\t"
  113867. "adcs r9, r9, #0\n\t"
  113868. "stm %[a]!, {r1, r2, r3, r4, r5, r6, r7, r8, r9}\n\t"
  113869. /* 9-16 */
  113870. "ldm %[a], {r1, r2, r3, r4, r5, r6, r7, r8}\n\t"
  113871. "adcs r1, r1, #0\n\t"
  113872. "adcs r2, r2, #0\n\t"
  113873. "adcs r3, r3, #0\n\t"
  113874. "adcs r4, r4, #0\n\t"
  113875. "adcs r5, r5, #0\n\t"
  113876. "adcs r6, r6, #0\n\t"
  113877. "adcs r7, r7, #0\n\t"
  113878. "adcs r8, r8, #0\n\t"
  113879. "stm %[a]!, {r1, r2, r3, r4, r5, r6, r7, r8}\n\t"
  113880. : [a] "+r" (a)
  113881. :
  113882. : "memory", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "lr", "cc"
  113883. );
  113884. (void)m_p;
  113885. (void)mp_p;
  113886. }
  113887. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  113888. /* Reduce the number back to 521 bits using Montgomery reduction.
  113889. *
  113890. * a A single precision number to reduce in place.
  113891. * m The single precision number representing the modulus.
  113892. * mp The digit representing the negative inverse of m mod 2^n.
  113893. */
  113894. static SP_NOINLINE void sp_521_mont_reduce_order_17(sp_digit* a_p, const sp_digit* m_p, sp_digit mp_p)
  113895. {
  113896. register sp_digit* a asm ("r0") = (sp_digit*)a_p;
  113897. register const sp_digit* m asm ("r1") = (const sp_digit*)m_p;
  113898. register sp_digit mp asm ("r2") = (sp_digit)mp_p;
  113899. __asm__ __volatile__ (
  113900. #if !(defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4))
  113901. "ldr r11, [%[m]]\n\t"
  113902. #endif
  113903. /* i = 0 */
  113904. "mov r9, #0\n\t"
  113905. "mov r3, #0\n\t"
  113906. "ldr r12, [%[a]]\n\t"
  113907. "ldr lr, [%[a], #4]\n\t"
  113908. "\n"
  113909. "L_sp_521_mont_reduce_order_17_word_%=: \n\t"
  113910. /* mu = a[i] * mp */
  113911. "mul r8, %[mp], r12\n\t"
  113912. "cmp r9, #0x40\n\t"
  113913. "bne L_sp_521_mont_reduce_order_17_nomask_%=\n\t"
  113914. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  113915. "mov r7, #0x1\n\t"
  113916. "lsl r7, r7, #8\n\t"
  113917. "add r7, r7, #0xff\n\t"
  113918. #else
  113919. "mov r7, #0x1ff\n\t"
  113920. #endif
  113921. "and r8, r8, r7\n\t"
  113922. "\n"
  113923. "L_sp_521_mont_reduce_order_17_nomask_%=: \n\t"
  113924. /* a[i+0] += m[0] * mu */
  113925. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  113926. "ldr r11, [%[m]]\n\t"
  113927. #endif
  113928. "lsr r7, r11, #16\n\t"
  113929. "lsr r6, r8, #16\n\t"
  113930. "mul r5, r6, r7\n\t"
  113931. "lsl r7, r11, #16\n\t"
  113932. "lsr r7, r7, #16\n\t"
  113933. "mul r6, r7, r6\n\t"
  113934. "lsr r7, r6, #16\n\t"
  113935. "lsl r6, r6, #16\n\t"
  113936. "adds r12, r12, r6\n\t"
  113937. "adc r5, r5, r7\n\t"
  113938. "lsl r6, r8, #16\n\t"
  113939. "lsl r7, r11, #16\n\t"
  113940. "lsr r6, r6, #16\n\t"
  113941. "lsr r7, r7, #16\n\t"
  113942. "mul r7, r6, r7\n\t"
  113943. "adds r12, r12, r7\n\t"
  113944. "adc r5, r5, #0\n\t"
  113945. "lsr r7, r11, #16\n\t"
  113946. "mul r6, r7, r6\n\t"
  113947. "lsr r7, r6, #16\n\t"
  113948. "lsl r6, r6, #16\n\t"
  113949. "adds r12, r12, r6\n\t"
  113950. "adc r5, r5, r7\n\t"
  113951. "str r12, [%[a]]\n\t"
  113952. /* a[i+1] += m[1] * mu */
  113953. "ldr r7, [%[m], #4]\n\t"
  113954. "lsr r10, r7, #16\n\t"
  113955. "lsr r6, r8, #16\n\t"
  113956. "mul r4, r6, r10\n\t"
  113957. "lsl r10, r7, #16\n\t"
  113958. "lsr r10, r10, #16\n\t"
  113959. "mul r6, r10, r6\n\t"
  113960. "lsr r10, r6, #16\n\t"
  113961. "lsl r6, r6, #16\n\t"
  113962. "adds lr, lr, r6\n\t"
  113963. "adc r4, r4, r10\n\t"
  113964. "lsl r6, r8, #16\n\t"
  113965. "lsl r10, r7, #16\n\t"
  113966. "lsr r6, r6, #16\n\t"
  113967. "lsr r10, r10, #16\n\t"
  113968. "mul r10, r6, r10\n\t"
  113969. "adds lr, lr, r10\n\t"
  113970. "adc r4, r4, #0\n\t"
  113971. "lsr r10, r7, #16\n\t"
  113972. "mul r6, r10, r6\n\t"
  113973. "lsr r10, r6, #16\n\t"
  113974. "lsl r6, r6, #16\n\t"
  113975. "adds lr, lr, r6\n\t"
  113976. "adc r4, r4, r10\n\t"
  113977. "mov r12, lr\n\t"
  113978. "adds r12, r12, r5\n\t"
  113979. "adc r4, r4, #0\n\t"
  113980. /* a[i+2] += m[2] * mu */
  113981. "ldr r7, [%[m], #8]\n\t"
  113982. "ldr lr, [%[a], #8]\n\t"
  113983. "lsr r10, r7, #16\n\t"
  113984. "lsr r6, r8, #16\n\t"
  113985. "mul r5, r6, r10\n\t"
  113986. "lsl r10, r7, #16\n\t"
  113987. "lsr r10, r10, #16\n\t"
  113988. "mul r6, r10, r6\n\t"
  113989. "lsr r10, r6, #16\n\t"
  113990. "lsl r6, r6, #16\n\t"
  113991. "adds lr, lr, r6\n\t"
  113992. "adc r5, r5, r10\n\t"
  113993. "lsl r6, r8, #16\n\t"
  113994. "lsl r10, r7, #16\n\t"
  113995. "lsr r6, r6, #16\n\t"
  113996. "lsr r10, r10, #16\n\t"
  113997. "mul r10, r6, r10\n\t"
  113998. "adds lr, lr, r10\n\t"
  113999. "adc r5, r5, #0\n\t"
  114000. "lsr r10, r7, #16\n\t"
  114001. "mul r6, r10, r6\n\t"
  114002. "lsr r10, r6, #16\n\t"
  114003. "lsl r6, r6, #16\n\t"
  114004. "adds lr, lr, r6\n\t"
  114005. "adc r5, r5, r10\n\t"
  114006. "adds lr, lr, r4\n\t"
  114007. "adc r5, r5, #0\n\t"
  114008. /* a[i+3] += m[3] * mu */
  114009. "ldr r7, [%[m], #12]\n\t"
  114010. "ldr r10, [%[a], #12]\n\t"
  114011. "lsr r11, r7, #16\n\t"
  114012. "lsr r6, r8, #16\n\t"
  114013. "mul r4, r6, r11\n\t"
  114014. "lsl r11, r7, #16\n\t"
  114015. "lsr r11, r11, #16\n\t"
  114016. "mul r6, r11, r6\n\t"
  114017. "lsr r11, r6, #16\n\t"
  114018. "lsl r6, r6, #16\n\t"
  114019. "adds r10, r10, r6\n\t"
  114020. "adc r4, r4, r11\n\t"
  114021. "lsl r6, r8, #16\n\t"
  114022. "lsl r11, r7, #16\n\t"
  114023. "lsr r6, r6, #16\n\t"
  114024. "lsr r11, r11, #16\n\t"
  114025. "mul r11, r6, r11\n\t"
  114026. "adds r10, r10, r11\n\t"
  114027. "adc r4, r4, #0\n\t"
  114028. "lsr r11, r7, #16\n\t"
  114029. "mul r6, r11, r6\n\t"
  114030. "lsr r11, r6, #16\n\t"
  114031. "lsl r6, r6, #16\n\t"
  114032. "adds r10, r10, r6\n\t"
  114033. "adc r4, r4, r11\n\t"
  114034. "adds r10, r10, r5\n\t"
  114035. "str r10, [%[a], #12]\n\t"
  114036. "adc r4, r4, #0\n\t"
  114037. /* a[i+4] += m[4] * mu */
  114038. "ldr r7, [%[m], #16]\n\t"
  114039. "ldr r10, [%[a], #16]\n\t"
  114040. "lsr r11, r7, #16\n\t"
  114041. "lsr r6, r8, #16\n\t"
  114042. "mul r5, r6, r11\n\t"
  114043. "lsl r11, r7, #16\n\t"
  114044. "lsr r11, r11, #16\n\t"
  114045. "mul r6, r11, r6\n\t"
  114046. "lsr r11, r6, #16\n\t"
  114047. "lsl r6, r6, #16\n\t"
  114048. "adds r10, r10, r6\n\t"
  114049. "adc r5, r5, r11\n\t"
  114050. "lsl r6, r8, #16\n\t"
  114051. "lsl r11, r7, #16\n\t"
  114052. "lsr r6, r6, #16\n\t"
  114053. "lsr r11, r11, #16\n\t"
  114054. "mul r11, r6, r11\n\t"
  114055. "adds r10, r10, r11\n\t"
  114056. "adc r5, r5, #0\n\t"
  114057. "lsr r11, r7, #16\n\t"
  114058. "mul r6, r11, r6\n\t"
  114059. "lsr r11, r6, #16\n\t"
  114060. "lsl r6, r6, #16\n\t"
  114061. "adds r10, r10, r6\n\t"
  114062. "adc r5, r5, r11\n\t"
  114063. "adds r10, r10, r4\n\t"
  114064. "str r10, [%[a], #16]\n\t"
  114065. "adc r5, r5, #0\n\t"
  114066. /* a[i+5] += m[5] * mu */
  114067. "ldr r7, [%[m], #20]\n\t"
  114068. "ldr r10, [%[a], #20]\n\t"
  114069. "lsr r11, r7, #16\n\t"
  114070. "lsr r6, r8, #16\n\t"
  114071. "mul r4, r6, r11\n\t"
  114072. "lsl r11, r7, #16\n\t"
  114073. "lsr r11, r11, #16\n\t"
  114074. "mul r6, r11, r6\n\t"
  114075. "lsr r11, r6, #16\n\t"
  114076. "lsl r6, r6, #16\n\t"
  114077. "adds r10, r10, r6\n\t"
  114078. "adc r4, r4, r11\n\t"
  114079. "lsl r6, r8, #16\n\t"
  114080. "lsl r11, r7, #16\n\t"
  114081. "lsr r6, r6, #16\n\t"
  114082. "lsr r11, r11, #16\n\t"
  114083. "mul r11, r6, r11\n\t"
  114084. "adds r10, r10, r11\n\t"
  114085. "adc r4, r4, #0\n\t"
  114086. "lsr r11, r7, #16\n\t"
  114087. "mul r6, r11, r6\n\t"
  114088. "lsr r11, r6, #16\n\t"
  114089. "lsl r6, r6, #16\n\t"
  114090. "adds r10, r10, r6\n\t"
  114091. "adc r4, r4, r11\n\t"
  114092. "adds r10, r10, r5\n\t"
  114093. "str r10, [%[a], #20]\n\t"
  114094. "adc r4, r4, #0\n\t"
  114095. /* a[i+6] += m[6] * mu */
  114096. "ldr r7, [%[m], #24]\n\t"
  114097. "ldr r10, [%[a], #24]\n\t"
  114098. "lsr r11, r7, #16\n\t"
  114099. "lsr r6, r8, #16\n\t"
  114100. "mul r5, r6, r11\n\t"
  114101. "lsl r11, r7, #16\n\t"
  114102. "lsr r11, r11, #16\n\t"
  114103. "mul r6, r11, r6\n\t"
  114104. "lsr r11, r6, #16\n\t"
  114105. "lsl r6, r6, #16\n\t"
  114106. "adds r10, r10, r6\n\t"
  114107. "adc r5, r5, r11\n\t"
  114108. "lsl r6, r8, #16\n\t"
  114109. "lsl r11, r7, #16\n\t"
  114110. "lsr r6, r6, #16\n\t"
  114111. "lsr r11, r11, #16\n\t"
  114112. "mul r11, r6, r11\n\t"
  114113. "adds r10, r10, r11\n\t"
  114114. "adc r5, r5, #0\n\t"
  114115. "lsr r11, r7, #16\n\t"
  114116. "mul r6, r11, r6\n\t"
  114117. "lsr r11, r6, #16\n\t"
  114118. "lsl r6, r6, #16\n\t"
  114119. "adds r10, r10, r6\n\t"
  114120. "adc r5, r5, r11\n\t"
  114121. "adds r10, r10, r4\n\t"
  114122. "str r10, [%[a], #24]\n\t"
  114123. "adc r5, r5, #0\n\t"
  114124. /* a[i+7] += m[7] * mu */
  114125. "ldr r7, [%[m], #28]\n\t"
  114126. "ldr r10, [%[a], #28]\n\t"
  114127. "lsr r11, r7, #16\n\t"
  114128. "lsr r6, r8, #16\n\t"
  114129. "mul r4, r6, r11\n\t"
  114130. "lsl r11, r7, #16\n\t"
  114131. "lsr r11, r11, #16\n\t"
  114132. "mul r6, r11, r6\n\t"
  114133. "lsr r11, r6, #16\n\t"
  114134. "lsl r6, r6, #16\n\t"
  114135. "adds r10, r10, r6\n\t"
  114136. "adc r4, r4, r11\n\t"
  114137. "lsl r6, r8, #16\n\t"
  114138. "lsl r11, r7, #16\n\t"
  114139. "lsr r6, r6, #16\n\t"
  114140. "lsr r11, r11, #16\n\t"
  114141. "mul r11, r6, r11\n\t"
  114142. "adds r10, r10, r11\n\t"
  114143. "adc r4, r4, #0\n\t"
  114144. "lsr r11, r7, #16\n\t"
  114145. "mul r6, r11, r6\n\t"
  114146. "lsr r11, r6, #16\n\t"
  114147. "lsl r6, r6, #16\n\t"
  114148. "adds r10, r10, r6\n\t"
  114149. "adc r4, r4, r11\n\t"
  114150. "adds r10, r10, r5\n\t"
  114151. "str r10, [%[a], #28]\n\t"
  114152. "adc r4, r4, #0\n\t"
  114153. /* a[i+8] += m[8] * mu */
  114154. "ldr r7, [%[m], #32]\n\t"
  114155. "ldr r10, [%[a], #32]\n\t"
  114156. "lsr r11, r7, #16\n\t"
  114157. "lsr r6, r8, #16\n\t"
  114158. "mul r5, r6, r11\n\t"
  114159. "lsl r11, r7, #16\n\t"
  114160. "lsr r11, r11, #16\n\t"
  114161. "mul r6, r11, r6\n\t"
  114162. "lsr r11, r6, #16\n\t"
  114163. "lsl r6, r6, #16\n\t"
  114164. "adds r10, r10, r6\n\t"
  114165. "adc r5, r5, r11\n\t"
  114166. "lsl r6, r8, #16\n\t"
  114167. "lsl r11, r7, #16\n\t"
  114168. "lsr r6, r6, #16\n\t"
  114169. "lsr r11, r11, #16\n\t"
  114170. "mul r11, r6, r11\n\t"
  114171. "adds r10, r10, r11\n\t"
  114172. "adc r5, r5, #0\n\t"
  114173. "lsr r11, r7, #16\n\t"
  114174. "mul r6, r11, r6\n\t"
  114175. "lsr r11, r6, #16\n\t"
  114176. "lsl r6, r6, #16\n\t"
  114177. "adds r10, r10, r6\n\t"
  114178. "adc r5, r5, r11\n\t"
  114179. "adds r10, r10, r4\n\t"
  114180. "str r10, [%[a], #32]\n\t"
  114181. "adc r5, r5, #0\n\t"
  114182. /* a[i+9] += m[9] * mu */
  114183. "ldr r7, [%[m], #36]\n\t"
  114184. "ldr r10, [%[a], #36]\n\t"
  114185. "lsr r11, r7, #16\n\t"
  114186. "lsr r6, r8, #16\n\t"
  114187. "mul r4, r6, r11\n\t"
  114188. "lsl r11, r7, #16\n\t"
  114189. "lsr r11, r11, #16\n\t"
  114190. "mul r6, r11, r6\n\t"
  114191. "lsr r11, r6, #16\n\t"
  114192. "lsl r6, r6, #16\n\t"
  114193. "adds r10, r10, r6\n\t"
  114194. "adc r4, r4, r11\n\t"
  114195. "lsl r6, r8, #16\n\t"
  114196. "lsl r11, r7, #16\n\t"
  114197. "lsr r6, r6, #16\n\t"
  114198. "lsr r11, r11, #16\n\t"
  114199. "mul r11, r6, r11\n\t"
  114200. "adds r10, r10, r11\n\t"
  114201. "adc r4, r4, #0\n\t"
  114202. "lsr r11, r7, #16\n\t"
  114203. "mul r6, r11, r6\n\t"
  114204. "lsr r11, r6, #16\n\t"
  114205. "lsl r6, r6, #16\n\t"
  114206. "adds r10, r10, r6\n\t"
  114207. "adc r4, r4, r11\n\t"
  114208. "adds r10, r10, r5\n\t"
  114209. "str r10, [%[a], #36]\n\t"
  114210. "adc r4, r4, #0\n\t"
  114211. /* a[i+10] += m[10] * mu */
  114212. "ldr r7, [%[m], #40]\n\t"
  114213. "ldr r10, [%[a], #40]\n\t"
  114214. "lsr r11, r7, #16\n\t"
  114215. "lsr r6, r8, #16\n\t"
  114216. "mul r5, r6, r11\n\t"
  114217. "lsl r11, r7, #16\n\t"
  114218. "lsr r11, r11, #16\n\t"
  114219. "mul r6, r11, r6\n\t"
  114220. "lsr r11, r6, #16\n\t"
  114221. "lsl r6, r6, #16\n\t"
  114222. "adds r10, r10, r6\n\t"
  114223. "adc r5, r5, r11\n\t"
  114224. "lsl r6, r8, #16\n\t"
  114225. "lsl r11, r7, #16\n\t"
  114226. "lsr r6, r6, #16\n\t"
  114227. "lsr r11, r11, #16\n\t"
  114228. "mul r11, r6, r11\n\t"
  114229. "adds r10, r10, r11\n\t"
  114230. "adc r5, r5, #0\n\t"
  114231. "lsr r11, r7, #16\n\t"
  114232. "mul r6, r11, r6\n\t"
  114233. "lsr r11, r6, #16\n\t"
  114234. "lsl r6, r6, #16\n\t"
  114235. "adds r10, r10, r6\n\t"
  114236. "adc r5, r5, r11\n\t"
  114237. "adds r10, r10, r4\n\t"
  114238. "str r10, [%[a], #40]\n\t"
  114239. "adc r5, r5, #0\n\t"
  114240. /* a[i+11] += m[11] * mu */
  114241. "ldr r7, [%[m], #44]\n\t"
  114242. "ldr r10, [%[a], #44]\n\t"
  114243. "lsr r11, r7, #16\n\t"
  114244. "lsr r6, r8, #16\n\t"
  114245. "mul r4, r6, r11\n\t"
  114246. "lsl r11, r7, #16\n\t"
  114247. "lsr r11, r11, #16\n\t"
  114248. "mul r6, r11, r6\n\t"
  114249. "lsr r11, r6, #16\n\t"
  114250. "lsl r6, r6, #16\n\t"
  114251. "adds r10, r10, r6\n\t"
  114252. "adc r4, r4, r11\n\t"
  114253. "lsl r6, r8, #16\n\t"
  114254. "lsl r11, r7, #16\n\t"
  114255. "lsr r6, r6, #16\n\t"
  114256. "lsr r11, r11, #16\n\t"
  114257. "mul r11, r6, r11\n\t"
  114258. "adds r10, r10, r11\n\t"
  114259. "adc r4, r4, #0\n\t"
  114260. "lsr r11, r7, #16\n\t"
  114261. "mul r6, r11, r6\n\t"
  114262. "lsr r11, r6, #16\n\t"
  114263. "lsl r6, r6, #16\n\t"
  114264. "adds r10, r10, r6\n\t"
  114265. "adc r4, r4, r11\n\t"
  114266. "adds r10, r10, r5\n\t"
  114267. "str r10, [%[a], #44]\n\t"
  114268. "adc r4, r4, #0\n\t"
  114269. /* a[i+12] += m[12] * mu */
  114270. "ldr r7, [%[m], #48]\n\t"
  114271. "ldr r10, [%[a], #48]\n\t"
  114272. "lsr r11, r7, #16\n\t"
  114273. "lsr r6, r8, #16\n\t"
  114274. "mul r5, r6, r11\n\t"
  114275. "lsl r11, r7, #16\n\t"
  114276. "lsr r11, r11, #16\n\t"
  114277. "mul r6, r11, r6\n\t"
  114278. "lsr r11, r6, #16\n\t"
  114279. "lsl r6, r6, #16\n\t"
  114280. "adds r10, r10, r6\n\t"
  114281. "adc r5, r5, r11\n\t"
  114282. "lsl r6, r8, #16\n\t"
  114283. "lsl r11, r7, #16\n\t"
  114284. "lsr r6, r6, #16\n\t"
  114285. "lsr r11, r11, #16\n\t"
  114286. "mul r11, r6, r11\n\t"
  114287. "adds r10, r10, r11\n\t"
  114288. "adc r5, r5, #0\n\t"
  114289. "lsr r11, r7, #16\n\t"
  114290. "mul r6, r11, r6\n\t"
  114291. "lsr r11, r6, #16\n\t"
  114292. "lsl r6, r6, #16\n\t"
  114293. "adds r10, r10, r6\n\t"
  114294. "adc r5, r5, r11\n\t"
  114295. "adds r10, r10, r4\n\t"
  114296. "str r10, [%[a], #48]\n\t"
  114297. "adc r5, r5, #0\n\t"
  114298. /* a[i+13] += m[13] * mu */
  114299. "ldr r7, [%[m], #52]\n\t"
  114300. "ldr r10, [%[a], #52]\n\t"
  114301. "lsr r11, r7, #16\n\t"
  114302. "lsr r6, r8, #16\n\t"
  114303. "mul r4, r6, r11\n\t"
  114304. "lsl r11, r7, #16\n\t"
  114305. "lsr r11, r11, #16\n\t"
  114306. "mul r6, r11, r6\n\t"
  114307. "lsr r11, r6, #16\n\t"
  114308. "lsl r6, r6, #16\n\t"
  114309. "adds r10, r10, r6\n\t"
  114310. "adc r4, r4, r11\n\t"
  114311. "lsl r6, r8, #16\n\t"
  114312. "lsl r11, r7, #16\n\t"
  114313. "lsr r6, r6, #16\n\t"
  114314. "lsr r11, r11, #16\n\t"
  114315. "mul r11, r6, r11\n\t"
  114316. "adds r10, r10, r11\n\t"
  114317. "adc r4, r4, #0\n\t"
  114318. "lsr r11, r7, #16\n\t"
  114319. "mul r6, r11, r6\n\t"
  114320. "lsr r11, r6, #16\n\t"
  114321. "lsl r6, r6, #16\n\t"
  114322. "adds r10, r10, r6\n\t"
  114323. "adc r4, r4, r11\n\t"
  114324. "adds r10, r10, r5\n\t"
  114325. "str r10, [%[a], #52]\n\t"
  114326. "adc r4, r4, #0\n\t"
  114327. /* a[i+14] += m[14] * mu */
  114328. "ldr r7, [%[m], #56]\n\t"
  114329. "ldr r10, [%[a], #56]\n\t"
  114330. "lsr r11, r7, #16\n\t"
  114331. "lsr r6, r8, #16\n\t"
  114332. "mul r5, r6, r11\n\t"
  114333. "lsl r11, r7, #16\n\t"
  114334. "lsr r11, r11, #16\n\t"
  114335. "mul r6, r11, r6\n\t"
  114336. "lsr r11, r6, #16\n\t"
  114337. "lsl r6, r6, #16\n\t"
  114338. "adds r10, r10, r6\n\t"
  114339. "adc r5, r5, r11\n\t"
  114340. "lsl r6, r8, #16\n\t"
  114341. "lsl r11, r7, #16\n\t"
  114342. "lsr r6, r6, #16\n\t"
  114343. "lsr r11, r11, #16\n\t"
  114344. "mul r11, r6, r11\n\t"
  114345. "adds r10, r10, r11\n\t"
  114346. "adc r5, r5, #0\n\t"
  114347. "lsr r11, r7, #16\n\t"
  114348. "mul r6, r11, r6\n\t"
  114349. "lsr r11, r6, #16\n\t"
  114350. "lsl r6, r6, #16\n\t"
  114351. "adds r10, r10, r6\n\t"
  114352. "adc r5, r5, r11\n\t"
  114353. "adds r10, r10, r4\n\t"
  114354. "str r10, [%[a], #56]\n\t"
  114355. "adc r5, r5, #0\n\t"
  114356. /* a[i+15] += m[15] * mu */
  114357. "ldr r7, [%[m], #60]\n\t"
  114358. "ldr r10, [%[a], #60]\n\t"
  114359. "lsr r11, r7, #16\n\t"
  114360. "lsr r6, r8, #16\n\t"
  114361. "mul r4, r6, r11\n\t"
  114362. "lsl r11, r7, #16\n\t"
  114363. "lsr r11, r11, #16\n\t"
  114364. "mul r6, r11, r6\n\t"
  114365. "lsr r11, r6, #16\n\t"
  114366. "lsl r6, r6, #16\n\t"
  114367. "adds r10, r10, r6\n\t"
  114368. "adc r4, r4, r11\n\t"
  114369. "lsl r6, r8, #16\n\t"
  114370. "lsl r11, r7, #16\n\t"
  114371. "lsr r6, r6, #16\n\t"
  114372. "lsr r11, r11, #16\n\t"
  114373. "mul r11, r6, r11\n\t"
  114374. "adds r10, r10, r11\n\t"
  114375. "adc r4, r4, #0\n\t"
  114376. "lsr r11, r7, #16\n\t"
  114377. "mul r6, r11, r6\n\t"
  114378. "lsr r11, r6, #16\n\t"
  114379. "lsl r6, r6, #16\n\t"
  114380. "adds r10, r10, r6\n\t"
  114381. "adc r4, r4, r11\n\t"
  114382. "adds r10, r10, r5\n\t"
  114383. "str r10, [%[a], #60]\n\t"
  114384. "adc r4, r4, #0\n\t"
  114385. /* a[i+16] += m[16] * mu */
  114386. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  114387. "ldr r11, [%[m], #64]\n\t"
  114388. #else
  114389. "ldr r7, [%[m], #64]\n\t"
  114390. #endif
  114391. "ldr r10, [%[a], #64]\n\t"
  114392. "lsl r6, r8, #16\n\t"
  114393. "lsl r7, r11, #16\n\t"
  114394. "lsr r6, r6, #16\n\t"
  114395. "lsr r7, r7, #16\n\t"
  114396. "mul r7, r6, r7\n\t"
  114397. "adds r4, r4, r7\n\t"
  114398. "adcs r5, r3, #0\n\t"
  114399. "mov r3, #0\n\t"
  114400. "adc r3, r3, r3\n\t"
  114401. "lsr r7, r11, #16\n\t"
  114402. "mul r6, r7, r6\n\t"
  114403. "lsr r7, r6, #16\n\t"
  114404. "lsl r6, r6, #16\n\t"
  114405. "adds r4, r4, r6\n\t"
  114406. "adcs r5, r5, r7\n\t"
  114407. "adc r3, r3, #0\n\t"
  114408. "mov r6, r8\n\t"
  114409. "lsr r7, r11, #16\n\t"
  114410. "lsr r6, r6, #16\n\t"
  114411. "mul r7, r6, r7\n\t"
  114412. "adds r5, r5, r7\n\t"
  114413. "lsl r7, r11, #16\n\t"
  114414. "adc r3, r3, #0\n\t"
  114415. "lsr r7, r7, #16\n\t"
  114416. "mul r6, r7, r6\n\t"
  114417. "lsr r7, r6, #16\n\t"
  114418. "lsl r6, r6, #16\n\t"
  114419. "adds r4, r4, r6\n\t"
  114420. "adcs r5, r5, r7\n\t"
  114421. "adc r3, r3, #0\n\t"
  114422. "adds r10, r10, r4\n\t"
  114423. "str r10, [%[a], #64]\n\t"
  114424. "ldr r10, [%[a], #68]\n\t"
  114425. "adcs r10, r10, r5\n\t"
  114426. "str r10, [%[a], #68]\n\t"
  114427. "adc r3, r3, #0\n\t"
  114428. /* i += 1 */
  114429. "add r9, r9, #4\n\t"
  114430. "add %[a], %[a], #4\n\t"
  114431. "cmp r9, #0x44\n\t"
  114432. "blt L_sp_521_mont_reduce_order_17_word_%=\n\t"
  114433. /* Loop Done */
  114434. "str r12, [%[a]]\n\t"
  114435. "str lr, [%[a], #4]\n\t"
  114436. "sub %[a], %[a], #4\n\t"
  114437. "ldr r4, [%[a]]\n\t"
  114438. "ldr r5, [%[a], #4]\n\t"
  114439. "lsr r4, r4, #9\n\t"
  114440. "orr r4, r4, r5, lsl #23\n\t"
  114441. "str r4, [%[a], #4]\n\t"
  114442. "ldr r4, [%[a], #8]\n\t"
  114443. "lsr r5, r5, #9\n\t"
  114444. "orr r5, r5, r4, lsl #23\n\t"
  114445. "str r5, [%[a], #8]\n\t"
  114446. "ldr r5, [%[a], #12]\n\t"
  114447. "lsr r4, r4, #9\n\t"
  114448. "orr r4, r4, r5, lsl #23\n\t"
  114449. "str r4, [%[a], #12]\n\t"
  114450. "ldr r4, [%[a], #16]\n\t"
  114451. "lsr r5, r5, #9\n\t"
  114452. "orr r5, r5, r4, lsl #23\n\t"
  114453. "str r5, [%[a], #16]\n\t"
  114454. "ldr r5, [%[a], #20]\n\t"
  114455. "lsr r4, r4, #9\n\t"
  114456. "orr r4, r4, r5, lsl #23\n\t"
  114457. "str r4, [%[a], #20]\n\t"
  114458. "ldr r4, [%[a], #24]\n\t"
  114459. "lsr r5, r5, #9\n\t"
  114460. "orr r5, r5, r4, lsl #23\n\t"
  114461. "str r5, [%[a], #24]\n\t"
  114462. "ldr r5, [%[a], #28]\n\t"
  114463. "lsr r4, r4, #9\n\t"
  114464. "orr r4, r4, r5, lsl #23\n\t"
  114465. "str r4, [%[a], #28]\n\t"
  114466. "ldr r4, [%[a], #32]\n\t"
  114467. "lsr r5, r5, #9\n\t"
  114468. "orr r5, r5, r4, lsl #23\n\t"
  114469. "str r5, [%[a], #32]\n\t"
  114470. "ldr r5, [%[a], #36]\n\t"
  114471. "lsr r4, r4, #9\n\t"
  114472. "orr r4, r4, r5, lsl #23\n\t"
  114473. "str r4, [%[a], #36]\n\t"
  114474. "ldr r4, [%[a], #40]\n\t"
  114475. "lsr r5, r5, #9\n\t"
  114476. "orr r5, r5, r4, lsl #23\n\t"
  114477. "str r5, [%[a], #40]\n\t"
  114478. "ldr r5, [%[a], #44]\n\t"
  114479. "lsr r4, r4, #9\n\t"
  114480. "orr r4, r4, r5, lsl #23\n\t"
  114481. "str r4, [%[a], #44]\n\t"
  114482. "ldr r4, [%[a], #48]\n\t"
  114483. "lsr r5, r5, #9\n\t"
  114484. "orr r5, r5, r4, lsl #23\n\t"
  114485. "str r5, [%[a], #48]\n\t"
  114486. "ldr r5, [%[a], #52]\n\t"
  114487. "lsr r4, r4, #9\n\t"
  114488. "orr r4, r4, r5, lsl #23\n\t"
  114489. "str r4, [%[a], #52]\n\t"
  114490. "ldr r4, [%[a], #56]\n\t"
  114491. "lsr r5, r5, #9\n\t"
  114492. "orr r5, r5, r4, lsl #23\n\t"
  114493. "str r5, [%[a], #56]\n\t"
  114494. "ldr r5, [%[a], #60]\n\t"
  114495. "lsr r4, r4, #9\n\t"
  114496. "orr r4, r4, r5, lsl #23\n\t"
  114497. "str r4, [%[a], #60]\n\t"
  114498. "ldr r4, [%[a], #64]\n\t"
  114499. "lsr r5, r5, #9\n\t"
  114500. "orr r5, r5, r4, lsl #23\n\t"
  114501. "str r5, [%[a], #64]\n\t"
  114502. "lsr r4, r4, #9\n\t"
  114503. "str r4, [%[a], #68]\n\t"
  114504. "lsr r3, r4, #9\n\t"
  114505. "add %[a], %[a], #4\n\t"
  114506. "mov %[mp], r3\n\t"
  114507. : [a] "+r" (a), [m] "+r" (m), [mp] "+r" (mp)
  114508. :
  114509. : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "cc"
  114510. );
  114511. sp_521_cond_sub_17(a - 17, a, m, (sp_digit)0 - mp);
  114512. }
  114513. #elif defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  114514. /* Reduce the number back to 521 bits using Montgomery reduction.
  114515. *
  114516. * a A single precision number to reduce in place.
  114517. * m The single precision number representing the modulus.
  114518. * mp The digit representing the negative inverse of m mod 2^n.
  114519. */
  114520. static SP_NOINLINE void sp_521_mont_reduce_order_17(sp_digit* a_p, const sp_digit* m_p, sp_digit mp_p)
  114521. {
  114522. register sp_digit* a asm ("r0") = (sp_digit*)a_p;
  114523. register const sp_digit* m asm ("r1") = (const sp_digit*)m_p;
  114524. register sp_digit mp asm ("r2") = (sp_digit)mp_p;
  114525. __asm__ __volatile__ (
  114526. "ldr r11, [%[m]]\n\t"
  114527. /* i = 0 */
  114528. "mov r9, #0\n\t"
  114529. "mov r3, #0\n\t"
  114530. "ldr r12, [%[a]]\n\t"
  114531. "ldr lr, [%[a], #4]\n\t"
  114532. "\n"
  114533. "L_sp_521_mont_reduce_order_17_word_%=: \n\t"
  114534. /* mu = a[i] * mp */
  114535. "mul r8, %[mp], r12\n\t"
  114536. "cmp r9, #0x40\n\t"
  114537. "bne L_sp_521_mont_reduce_order_17_nomask_%=\n\t"
  114538. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  114539. "mov r7, #0x1\n\t"
  114540. "lsl r7, r7, #8\n\t"
  114541. "add r7, r7, #0xff\n\t"
  114542. #else
  114543. "mov r7, #0x1ff\n\t"
  114544. #endif
  114545. "and r8, r8, r7\n\t"
  114546. "\n"
  114547. "L_sp_521_mont_reduce_order_17_nomask_%=: \n\t"
  114548. /* a[i+0] += m[0] * mu */
  114549. "mov r5, #0\n\t"
  114550. "umlal r12, r5, r8, r11\n\t"
  114551. "str r12, [%[a]]\n\t"
  114552. /* a[i+1] += m[1] * mu */
  114553. "ldr r7, [%[m], #4]\n\t"
  114554. "mov r4, #0\n\t"
  114555. "umlal lr, r4, r8, r7\n\t"
  114556. "mov r12, lr\n\t"
  114557. "adds r12, r12, r5\n\t"
  114558. "adc r4, r4, #0\n\t"
  114559. /* a[i+2] += m[2] * mu */
  114560. "ldr r7, [%[m], #8]\n\t"
  114561. "ldr lr, [%[a], #8]\n\t"
  114562. "mov r5, #0\n\t"
  114563. "umlal lr, r5, r8, r7\n\t"
  114564. "adds lr, lr, r4\n\t"
  114565. "adc r5, r5, #0\n\t"
  114566. /* a[i+3] += m[3] * mu */
  114567. "ldr r7, [%[m], #12]\n\t"
  114568. "ldr r10, [%[a], #12]\n\t"
  114569. "mov r4, #0\n\t"
  114570. "umlal r10, r4, r8, r7\n\t"
  114571. "adds r10, r10, r5\n\t"
  114572. "str r10, [%[a], #12]\n\t"
  114573. "adc r4, r4, #0\n\t"
  114574. /* a[i+4] += m[4] * mu */
  114575. "ldr r7, [%[m], #16]\n\t"
  114576. "ldr r10, [%[a], #16]\n\t"
  114577. "mov r5, #0\n\t"
  114578. "umlal r10, r5, r8, r7\n\t"
  114579. "adds r10, r10, r4\n\t"
  114580. "str r10, [%[a], #16]\n\t"
  114581. "adc r5, r5, #0\n\t"
  114582. /* a[i+5] += m[5] * mu */
  114583. "ldr r7, [%[m], #20]\n\t"
  114584. "ldr r10, [%[a], #20]\n\t"
  114585. "mov r4, #0\n\t"
  114586. "umlal r10, r4, r8, r7\n\t"
  114587. "adds r10, r10, r5\n\t"
  114588. "str r10, [%[a], #20]\n\t"
  114589. "adc r4, r4, #0\n\t"
  114590. /* a[i+6] += m[6] * mu */
  114591. "ldr r7, [%[m], #24]\n\t"
  114592. "ldr r10, [%[a], #24]\n\t"
  114593. "mov r5, #0\n\t"
  114594. "umlal r10, r5, r8, r7\n\t"
  114595. "adds r10, r10, r4\n\t"
  114596. "str r10, [%[a], #24]\n\t"
  114597. "adc r5, r5, #0\n\t"
  114598. /* a[i+7] += m[7] * mu */
  114599. "ldr r7, [%[m], #28]\n\t"
  114600. "ldr r10, [%[a], #28]\n\t"
  114601. "mov r4, #0\n\t"
  114602. "umlal r10, r4, r8, r7\n\t"
  114603. "adds r10, r10, r5\n\t"
  114604. "str r10, [%[a], #28]\n\t"
  114605. "adc r4, r4, #0\n\t"
  114606. /* a[i+8] += m[8] * mu */
  114607. "ldr r7, [%[m], #32]\n\t"
  114608. "ldr r10, [%[a], #32]\n\t"
  114609. "mov r5, #0\n\t"
  114610. "umlal r10, r5, r8, r7\n\t"
  114611. "adds r10, r10, r4\n\t"
  114612. "str r10, [%[a], #32]\n\t"
  114613. "adc r5, r5, #0\n\t"
  114614. /* a[i+9] += m[9] * mu */
  114615. "ldr r7, [%[m], #36]\n\t"
  114616. "ldr r10, [%[a], #36]\n\t"
  114617. "mov r4, #0\n\t"
  114618. "umlal r10, r4, r8, r7\n\t"
  114619. "adds r10, r10, r5\n\t"
  114620. "str r10, [%[a], #36]\n\t"
  114621. "adc r4, r4, #0\n\t"
  114622. /* a[i+10] += m[10] * mu */
  114623. "ldr r7, [%[m], #40]\n\t"
  114624. "ldr r10, [%[a], #40]\n\t"
  114625. "mov r5, #0\n\t"
  114626. "umlal r10, r5, r8, r7\n\t"
  114627. "adds r10, r10, r4\n\t"
  114628. "str r10, [%[a], #40]\n\t"
  114629. "adc r5, r5, #0\n\t"
  114630. /* a[i+11] += m[11] * mu */
  114631. "ldr r7, [%[m], #44]\n\t"
  114632. "ldr r10, [%[a], #44]\n\t"
  114633. "mov r4, #0\n\t"
  114634. "umlal r10, r4, r8, r7\n\t"
  114635. "adds r10, r10, r5\n\t"
  114636. "str r10, [%[a], #44]\n\t"
  114637. "adc r4, r4, #0\n\t"
  114638. /* a[i+12] += m[12] * mu */
  114639. "ldr r7, [%[m], #48]\n\t"
  114640. "ldr r10, [%[a], #48]\n\t"
  114641. "mov r5, #0\n\t"
  114642. "umlal r10, r5, r8, r7\n\t"
  114643. "adds r10, r10, r4\n\t"
  114644. "str r10, [%[a], #48]\n\t"
  114645. "adc r5, r5, #0\n\t"
  114646. /* a[i+13] += m[13] * mu */
  114647. "ldr r7, [%[m], #52]\n\t"
  114648. "ldr r10, [%[a], #52]\n\t"
  114649. "mov r4, #0\n\t"
  114650. "umlal r10, r4, r8, r7\n\t"
  114651. "adds r10, r10, r5\n\t"
  114652. "str r10, [%[a], #52]\n\t"
  114653. "adc r4, r4, #0\n\t"
  114654. /* a[i+14] += m[14] * mu */
  114655. "ldr r7, [%[m], #56]\n\t"
  114656. "ldr r10, [%[a], #56]\n\t"
  114657. "mov r5, #0\n\t"
  114658. "umlal r10, r5, r8, r7\n\t"
  114659. "adds r10, r10, r4\n\t"
  114660. "str r10, [%[a], #56]\n\t"
  114661. "adc r5, r5, #0\n\t"
  114662. /* a[i+15] += m[15] * mu */
  114663. "ldr r7, [%[m], #60]\n\t"
  114664. "ldr r10, [%[a], #60]\n\t"
  114665. "mov r4, #0\n\t"
  114666. "umlal r10, r4, r8, r7\n\t"
  114667. "adds r10, r10, r5\n\t"
  114668. "str r10, [%[a], #60]\n\t"
  114669. "adc r4, r4, #0\n\t"
  114670. /* a[i+16] += m[16] * mu */
  114671. "ldr r7, [%[m], #64]\n\t"
  114672. "ldr r10, [%[a], #64]\n\t"
  114673. "umull r6, r7, r8, r7\n\t"
  114674. "adds r4, r4, r6\n\t"
  114675. "adcs r5, r7, r3\n\t"
  114676. "mov r3, #0\n\t"
  114677. "adc r3, r3, r3\n\t"
  114678. "adds r10, r10, r4\n\t"
  114679. "str r10, [%[a], #64]\n\t"
  114680. "ldr r10, [%[a], #68]\n\t"
  114681. "adcs r10, r10, r5\n\t"
  114682. "str r10, [%[a], #68]\n\t"
  114683. "adc r3, r3, #0\n\t"
  114684. /* i += 1 */
  114685. "add r9, r9, #4\n\t"
  114686. "add %[a], %[a], #4\n\t"
  114687. "cmp r9, #0x44\n\t"
  114688. "blt L_sp_521_mont_reduce_order_17_word_%=\n\t"
  114689. /* Loop Done */
  114690. "str r12, [%[a]]\n\t"
  114691. "str lr, [%[a], #4]\n\t"
  114692. "sub %[a], %[a], #4\n\t"
  114693. "ldr r4, [%[a]]\n\t"
  114694. "ldr r5, [%[a], #4]\n\t"
  114695. "lsr r4, r4, #9\n\t"
  114696. "orr r4, r4, r5, lsl #23\n\t"
  114697. "str r4, [%[a], #4]\n\t"
  114698. "ldr r4, [%[a], #8]\n\t"
  114699. "lsr r5, r5, #9\n\t"
  114700. "orr r5, r5, r4, lsl #23\n\t"
  114701. "str r5, [%[a], #8]\n\t"
  114702. "ldr r5, [%[a], #12]\n\t"
  114703. "lsr r4, r4, #9\n\t"
  114704. "orr r4, r4, r5, lsl #23\n\t"
  114705. "str r4, [%[a], #12]\n\t"
  114706. "ldr r4, [%[a], #16]\n\t"
  114707. "lsr r5, r5, #9\n\t"
  114708. "orr r5, r5, r4, lsl #23\n\t"
  114709. "str r5, [%[a], #16]\n\t"
  114710. "ldr r5, [%[a], #20]\n\t"
  114711. "lsr r4, r4, #9\n\t"
  114712. "orr r4, r4, r5, lsl #23\n\t"
  114713. "str r4, [%[a], #20]\n\t"
  114714. "ldr r4, [%[a], #24]\n\t"
  114715. "lsr r5, r5, #9\n\t"
  114716. "orr r5, r5, r4, lsl #23\n\t"
  114717. "str r5, [%[a], #24]\n\t"
  114718. "ldr r5, [%[a], #28]\n\t"
  114719. "lsr r4, r4, #9\n\t"
  114720. "orr r4, r4, r5, lsl #23\n\t"
  114721. "str r4, [%[a], #28]\n\t"
  114722. "ldr r4, [%[a], #32]\n\t"
  114723. "lsr r5, r5, #9\n\t"
  114724. "orr r5, r5, r4, lsl #23\n\t"
  114725. "str r5, [%[a], #32]\n\t"
  114726. "ldr r5, [%[a], #36]\n\t"
  114727. "lsr r4, r4, #9\n\t"
  114728. "orr r4, r4, r5, lsl #23\n\t"
  114729. "str r4, [%[a], #36]\n\t"
  114730. "ldr r4, [%[a], #40]\n\t"
  114731. "lsr r5, r5, #9\n\t"
  114732. "orr r5, r5, r4, lsl #23\n\t"
  114733. "str r5, [%[a], #40]\n\t"
  114734. "ldr r5, [%[a], #44]\n\t"
  114735. "lsr r4, r4, #9\n\t"
  114736. "orr r4, r4, r5, lsl #23\n\t"
  114737. "str r4, [%[a], #44]\n\t"
  114738. "ldr r4, [%[a], #48]\n\t"
  114739. "lsr r5, r5, #9\n\t"
  114740. "orr r5, r5, r4, lsl #23\n\t"
  114741. "str r5, [%[a], #48]\n\t"
  114742. "ldr r5, [%[a], #52]\n\t"
  114743. "lsr r4, r4, #9\n\t"
  114744. "orr r4, r4, r5, lsl #23\n\t"
  114745. "str r4, [%[a], #52]\n\t"
  114746. "ldr r4, [%[a], #56]\n\t"
  114747. "lsr r5, r5, #9\n\t"
  114748. "orr r5, r5, r4, lsl #23\n\t"
  114749. "str r5, [%[a], #56]\n\t"
  114750. "ldr r5, [%[a], #60]\n\t"
  114751. "lsr r4, r4, #9\n\t"
  114752. "orr r4, r4, r5, lsl #23\n\t"
  114753. "str r4, [%[a], #60]\n\t"
  114754. "ldr r4, [%[a], #64]\n\t"
  114755. "lsr r5, r5, #9\n\t"
  114756. "orr r5, r5, r4, lsl #23\n\t"
  114757. "str r5, [%[a], #64]\n\t"
  114758. "lsr r4, r4, #9\n\t"
  114759. "str r4, [%[a], #68]\n\t"
  114760. "lsr r3, r4, #9\n\t"
  114761. "add %[a], %[a], #4\n\t"
  114762. "mov %[mp], r3\n\t"
  114763. : [a] "+r" (a), [m] "+r" (m), [mp] "+r" (mp)
  114764. :
  114765. : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "cc"
  114766. );
  114767. sp_521_cond_sub_17(a - 17, a, m, (sp_digit)0 - mp);
  114768. }
  114769. #else
  114770. /* Reduce the number back to 521 bits using Montgomery reduction.
  114771. *
  114772. * a A single precision number to reduce in place.
  114773. * m The single precision number representing the modulus.
  114774. * mp The digit representing the negative inverse of m mod 2^n.
  114775. */
  114776. static SP_NOINLINE void sp_521_mont_reduce_order_17(sp_digit* a_p, const sp_digit* m_p, sp_digit mp_p)
  114777. {
  114778. register sp_digit* a asm ("r0") = (sp_digit*)a_p;
  114779. register const sp_digit* m asm ("r1") = (const sp_digit*)m_p;
  114780. register sp_digit mp asm ("r2") = (sp_digit)mp_p;
  114781. __asm__ __volatile__ (
  114782. /* i = 0 */
  114783. "mov r12, #0\n\t"
  114784. "mov lr, #0\n\t"
  114785. "ldr r4, [%[a]]\n\t"
  114786. "ldr r5, [%[a], #4]\n\t"
  114787. "ldr r6, [%[a], #8]\n\t"
  114788. "ldr r7, [%[a], #12]\n\t"
  114789. "ldr r8, [%[a], #16]\n\t"
  114790. "\n"
  114791. "L_sp_521_mont_reduce_order_17_word_%=: \n\t"
  114792. /* mu = a[i] * mp */
  114793. "mul r11, %[mp], r4\n\t"
  114794. "cmp r12, #0x40\n\t"
  114795. "bne L_sp_521_mont_reduce_order_17_nomask_%=\n\t"
  114796. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  114797. "mov r10, #0x1\n\t"
  114798. "lsl r10, r10, #8\n\t"
  114799. "add r10, r10, #0xff\n\t"
  114800. #else
  114801. "mov r10, #0x1ff\n\t"
  114802. #endif
  114803. "and r11, r11, r10\n\t"
  114804. "\n"
  114805. "L_sp_521_mont_reduce_order_17_nomask_%=: \n\t"
  114806. /* a[i+0] += m[0] * mu */
  114807. "ldr r10, [%[m]]\n\t"
  114808. "mov r3, #0\n\t"
  114809. "umaal r4, r3, r11, r10\n\t"
  114810. "str r4, [%[a]]\n\t"
  114811. /* a[i+1] += m[1] * mu */
  114812. "ldr r10, [%[m], #4]\n\t"
  114813. "mov r4, r5\n\t"
  114814. "umaal r4, r3, r11, r10\n\t"
  114815. /* a[i+2] += m[2] * mu */
  114816. "ldr r10, [%[m], #8]\n\t"
  114817. "mov r5, r6\n\t"
  114818. "umaal r5, r3, r11, r10\n\t"
  114819. /* a[i+3] += m[3] * mu */
  114820. "ldr r10, [%[m], #12]\n\t"
  114821. "mov r6, r7\n\t"
  114822. "umaal r6, r3, r11, r10\n\t"
  114823. /* a[i+4] += m[4] * mu */
  114824. "ldr r10, [%[m], #16]\n\t"
  114825. "mov r7, r8\n\t"
  114826. "umaal r7, r3, r11, r10\n\t"
  114827. /* a[i+5] += m[5] * mu */
  114828. "ldr r10, [%[m], #20]\n\t"
  114829. "ldr r8, [%[a], #20]\n\t"
  114830. "umaal r8, r3, r11, r10\n\t"
  114831. /* a[i+6] += m[6] * mu */
  114832. "ldr r10, [%[m], #24]\n\t"
  114833. "ldr r9, [%[a], #24]\n\t"
  114834. "umaal r9, r3, r11, r10\n\t"
  114835. "str r9, [%[a], #24]\n\t"
  114836. /* a[i+7] += m[7] * mu */
  114837. "ldr r10, [%[m], #28]\n\t"
  114838. "ldr r9, [%[a], #28]\n\t"
  114839. "umaal r9, r3, r11, r10\n\t"
  114840. "str r9, [%[a], #28]\n\t"
  114841. /* a[i+8] += m[8] * mu */
  114842. "ldr r10, [%[m], #32]\n\t"
  114843. "ldr r9, [%[a], #32]\n\t"
  114844. "umaal r9, r3, r11, r10\n\t"
  114845. "str r9, [%[a], #32]\n\t"
  114846. /* a[i+9] += m[9] * mu */
  114847. "ldr r10, [%[m], #36]\n\t"
  114848. "ldr r9, [%[a], #36]\n\t"
  114849. "umaal r9, r3, r11, r10\n\t"
  114850. "str r9, [%[a], #36]\n\t"
  114851. /* a[i+10] += m[10] * mu */
  114852. "ldr r10, [%[m], #40]\n\t"
  114853. "ldr r9, [%[a], #40]\n\t"
  114854. "umaal r9, r3, r11, r10\n\t"
  114855. "str r9, [%[a], #40]\n\t"
  114856. /* a[i+11] += m[11] * mu */
  114857. "ldr r10, [%[m], #44]\n\t"
  114858. "ldr r9, [%[a], #44]\n\t"
  114859. "umaal r9, r3, r11, r10\n\t"
  114860. "str r9, [%[a], #44]\n\t"
  114861. /* a[i+12] += m[12] * mu */
  114862. "ldr r10, [%[m], #48]\n\t"
  114863. "ldr r9, [%[a], #48]\n\t"
  114864. "umaal r9, r3, r11, r10\n\t"
  114865. "str r9, [%[a], #48]\n\t"
  114866. /* a[i+13] += m[13] * mu */
  114867. "ldr r10, [%[m], #52]\n\t"
  114868. "ldr r9, [%[a], #52]\n\t"
  114869. "umaal r9, r3, r11, r10\n\t"
  114870. "str r9, [%[a], #52]\n\t"
  114871. /* a[i+14] += m[14] * mu */
  114872. "ldr r10, [%[m], #56]\n\t"
  114873. "ldr r9, [%[a], #56]\n\t"
  114874. "umaal r9, r3, r11, r10\n\t"
  114875. "str r9, [%[a], #56]\n\t"
  114876. /* a[i+15] += m[15] * mu */
  114877. "ldr r10, [%[m], #60]\n\t"
  114878. "ldr r9, [%[a], #60]\n\t"
  114879. "umaal r9, r3, r11, r10\n\t"
  114880. "str r9, [%[a], #60]\n\t"
  114881. /* a[i+16] += m[16] * mu */
  114882. "ldr r10, [%[m], #64]\n\t"
  114883. "ldr r9, [%[a], #64]\n\t"
  114884. "umaal r9, r3, r11, r10\n\t"
  114885. "ldr r11, [%[a], #68]\n\t"
  114886. "mov r10, #0\n\t"
  114887. "umaal r3, r11, r10, r10\n\t"
  114888. "str r9, [%[a], #64]\n\t"
  114889. "adds r3, r3, lr\n\t"
  114890. "adc lr, r11, #0\n\t"
  114891. "str r3, [%[a], #68]\n\t"
  114892. /* i += 1 */
  114893. "add r12, r12, #4\n\t"
  114894. "add %[a], %[a], #4\n\t"
  114895. "cmp r12, #0x44\n\t"
  114896. "blt L_sp_521_mont_reduce_order_17_word_%=\n\t"
  114897. /* Loop Done */
  114898. "str r4, [%[a]]\n\t"
  114899. "str r5, [%[a], #4]\n\t"
  114900. "str r6, [%[a], #8]\n\t"
  114901. "str r7, [%[a], #12]\n\t"
  114902. "str r8, [%[a], #16]\n\t"
  114903. "sub %[a], %[a], #4\n\t"
  114904. "ldr r10, [%[a]]\n\t"
  114905. "ldr r3, [%[a], #4]\n\t"
  114906. "lsr r10, r10, #9\n\t"
  114907. "orr r10, r10, r3, lsl #23\n\t"
  114908. "str r10, [%[a], #4]\n\t"
  114909. "ldr r10, [%[a], #8]\n\t"
  114910. "lsr r3, r3, #9\n\t"
  114911. "orr r3, r3, r10, lsl #23\n\t"
  114912. "str r3, [%[a], #8]\n\t"
  114913. "ldr r3, [%[a], #12]\n\t"
  114914. "lsr r10, r10, #9\n\t"
  114915. "orr r10, r10, r3, lsl #23\n\t"
  114916. "str r10, [%[a], #12]\n\t"
  114917. "ldr r10, [%[a], #16]\n\t"
  114918. "lsr r3, r3, #9\n\t"
  114919. "orr r3, r3, r10, lsl #23\n\t"
  114920. "str r3, [%[a], #16]\n\t"
  114921. "ldr r3, [%[a], #20]\n\t"
  114922. "lsr r10, r10, #9\n\t"
  114923. "orr r10, r10, r3, lsl #23\n\t"
  114924. "str r10, [%[a], #20]\n\t"
  114925. "ldr r10, [%[a], #24]\n\t"
  114926. "lsr r3, r3, #9\n\t"
  114927. "orr r3, r3, r10, lsl #23\n\t"
  114928. "str r3, [%[a], #24]\n\t"
  114929. "ldr r3, [%[a], #28]\n\t"
  114930. "lsr r10, r10, #9\n\t"
  114931. "orr r10, r10, r3, lsl #23\n\t"
  114932. "str r10, [%[a], #28]\n\t"
  114933. "ldr r10, [%[a], #32]\n\t"
  114934. "lsr r3, r3, #9\n\t"
  114935. "orr r3, r3, r10, lsl #23\n\t"
  114936. "str r3, [%[a], #32]\n\t"
  114937. "ldr r3, [%[a], #36]\n\t"
  114938. "lsr r10, r10, #9\n\t"
  114939. "orr r10, r10, r3, lsl #23\n\t"
  114940. "str r10, [%[a], #36]\n\t"
  114941. "ldr r10, [%[a], #40]\n\t"
  114942. "lsr r3, r3, #9\n\t"
  114943. "orr r3, r3, r10, lsl #23\n\t"
  114944. "str r3, [%[a], #40]\n\t"
  114945. "ldr r3, [%[a], #44]\n\t"
  114946. "lsr r10, r10, #9\n\t"
  114947. "orr r10, r10, r3, lsl #23\n\t"
  114948. "str r10, [%[a], #44]\n\t"
  114949. "ldr r10, [%[a], #48]\n\t"
  114950. "lsr r3, r3, #9\n\t"
  114951. "orr r3, r3, r10, lsl #23\n\t"
  114952. "str r3, [%[a], #48]\n\t"
  114953. "ldr r3, [%[a], #52]\n\t"
  114954. "lsr r10, r10, #9\n\t"
  114955. "orr r10, r10, r3, lsl #23\n\t"
  114956. "str r10, [%[a], #52]\n\t"
  114957. "ldr r10, [%[a], #56]\n\t"
  114958. "lsr r3, r3, #9\n\t"
  114959. "orr r3, r3, r10, lsl #23\n\t"
  114960. "str r3, [%[a], #56]\n\t"
  114961. "ldr r3, [%[a], #60]\n\t"
  114962. "lsr r10, r10, #9\n\t"
  114963. "orr r10, r10, r3, lsl #23\n\t"
  114964. "str r10, [%[a], #60]\n\t"
  114965. "ldr r10, [%[a], #64]\n\t"
  114966. "lsr r3, r3, #9\n\t"
  114967. "orr r3, r3, r10, lsl #23\n\t"
  114968. "str r3, [%[a], #64]\n\t"
  114969. "lsr r10, r10, #9\n\t"
  114970. "str r10, [%[a], #68]\n\t"
  114971. "lsr lr, r10, #9\n\t"
  114972. "add %[a], %[a], #4\n\t"
  114973. "mov %[mp], lr\n\t"
  114974. : [a] "+r" (a), [m] "+r" (m), [mp] "+r" (mp)
  114975. :
  114976. : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "cc"
  114977. );
  114978. sp_521_cond_sub_17(a - 17, a, m, (sp_digit)0 - mp);
  114979. }
  114980. #endif
  114981. /* Multiply two Montgomery form numbers mod the modulus (prime).
  114982. * (r = a * b mod m)
  114983. *
  114984. * r Result of multiplication.
  114985. * a First number to multiply in Montgomery form.
  114986. * b Second number to multiply in Montgomery form.
  114987. * m Modulus (prime).
  114988. * mp Montgomery multiplier.
  114989. */
  114990. SP_NOINLINE static void sp_521_mont_mul_17(sp_digit* r, const sp_digit* a,
  114991. const sp_digit* b, const sp_digit* m, sp_digit mp)
  114992. {
  114993. sp_521_mul_17(r, a, b);
  114994. sp_521_mont_reduce_17(r, m, mp);
  114995. }
  114996. /* Square the Montgomery form number. (r = a * a mod m)
  114997. *
  114998. * r Result of squaring.
  114999. * a Number to square in Montgomery form.
  115000. * m Modulus (prime).
  115001. * mp Montgomery multiplier.
  115002. */
  115003. SP_NOINLINE static void sp_521_mont_sqr_17(sp_digit* r, const sp_digit* a,
  115004. const sp_digit* m, sp_digit mp)
  115005. {
  115006. sp_521_sqr_17(r, a);
  115007. sp_521_mont_reduce_17(r, m, mp);
  115008. }
  115009. #ifndef WOLFSSL_SP_SMALL
  115010. /* Square the Montgomery form number a number of times. (r = a ^ n mod m)
  115011. *
  115012. * r Result of squaring.
  115013. * a Number to square in Montgomery form.
  115014. * n Number of times to square.
  115015. * m Modulus (prime).
  115016. * mp Montgomery multiplier.
  115017. */
  115018. SP_NOINLINE static void sp_521_mont_sqr_n_17(sp_digit* r,
  115019. const sp_digit* a, int n, const sp_digit* m, sp_digit mp)
  115020. {
  115021. sp_521_mont_sqr_17(r, a, m, mp);
  115022. for (; n > 1; n--) {
  115023. sp_521_mont_sqr_17(r, r, m, mp);
  115024. }
  115025. }
  115026. #endif /* !WOLFSSL_SP_SMALL */
  115027. #ifdef WOLFSSL_SP_SMALL
  115028. /* Mod-2 for the P521 curve. */
  115029. static const uint32_t p521_mod_minus_2[17] = {
  115030. 0xfffffffdU,0xffffffffU,0xffffffffU,0xffffffffU,0xffffffffU,0xffffffffU,
  115031. 0xffffffffU,0xffffffffU,0xffffffffU,0xffffffffU,0xffffffffU,0xffffffffU,
  115032. 0xffffffffU,0xffffffffU,0xffffffffU,0xffffffffU,0x000001ffU
  115033. };
  115034. #endif /* !WOLFSSL_SP_SMALL */
  115035. /* Invert the number, in Montgomery form, modulo the modulus (prime) of the
  115036. * P521 curve. (r = 1 / a mod m)
  115037. *
  115038. * r Inverse result.
  115039. * a Number to invert.
  115040. * td Temporary data.
  115041. */
  115042. static void sp_521_mont_inv_17(sp_digit* r, const sp_digit* a, sp_digit* td)
  115043. {
  115044. #ifdef WOLFSSL_SP_SMALL
  115045. sp_digit* t = td;
  115046. int i;
  115047. XMEMCPY(t, a, sizeof(sp_digit) * 17);
  115048. for (i=519; i>=0; i--) {
  115049. sp_521_mont_sqr_17(t, t, p521_mod, p521_mp_mod);
  115050. if (p521_mod_minus_2[i / 32] & ((sp_digit)1 << (i % 32)))
  115051. sp_521_mont_mul_17(t, t, a, p521_mod, p521_mp_mod);
  115052. }
  115053. XMEMCPY(r, t, sizeof(sp_digit) * 17);
  115054. #else
  115055. sp_digit* t1 = td;
  115056. sp_digit* t2 = td + 2 * 17;
  115057. sp_digit* t3 = td + 4 * 17;
  115058. /* 0x2 */
  115059. sp_521_mont_sqr_17(t1, a, p521_mod, p521_mp_mod);
  115060. /* 0x3 */
  115061. sp_521_mont_mul_17(t2, t1, a, p521_mod, p521_mp_mod);
  115062. /* 0x6 */
  115063. sp_521_mont_sqr_17(t1, t2, p521_mod, p521_mp_mod);
  115064. /* 0x7 */
  115065. sp_521_mont_mul_17(t3, t1, a, p521_mod, p521_mp_mod);
  115066. /* 0xc */
  115067. sp_521_mont_sqr_n_17(t1, t2, 2, p521_mod, p521_mp_mod);
  115068. /* 0xf */
  115069. sp_521_mont_mul_17(t2, t2, t1, p521_mod, p521_mp_mod);
  115070. /* 0x78 */
  115071. sp_521_mont_sqr_n_17(t1, t2, 3, p521_mod, p521_mp_mod);
  115072. /* 0x7f */
  115073. sp_521_mont_mul_17(t3, t3, t1, p521_mod, p521_mp_mod);
  115074. /* 0xf0 */
  115075. sp_521_mont_sqr_n_17(t1, t2, 4, p521_mod, p521_mp_mod);
  115076. /* 0xff */
  115077. sp_521_mont_mul_17(t2, t2, t1, p521_mod, p521_mp_mod);
  115078. /* 0xff00 */
  115079. sp_521_mont_sqr_n_17(t1, t2, 8, p521_mod, p521_mp_mod);
  115080. /* 0xffff */
  115081. sp_521_mont_mul_17(t2, t2, t1, p521_mod, p521_mp_mod);
  115082. /* 0xffff0000 */
  115083. sp_521_mont_sqr_n_17(t1, t2, 16, p521_mod, p521_mp_mod);
  115084. /* 0xffffffff */
  115085. sp_521_mont_mul_17(t2, t2, t1, p521_mod, p521_mp_mod);
  115086. /* 0xffffffff00000000 */
  115087. sp_521_mont_sqr_n_17(t1, t2, 32, p521_mod, p521_mp_mod);
  115088. /* 0xffffffffffffffff */
  115089. sp_521_mont_mul_17(t2, t2, t1, p521_mod, p521_mp_mod);
  115090. /* 0xffffffffffffffff0000000000000000 */
  115091. sp_521_mont_sqr_n_17(t1, t2, 64, p521_mod, p521_mp_mod);
  115092. /* 0xffffffffffffffffffffffffffffffff */
  115093. sp_521_mont_mul_17(t2, t2, t1, p521_mod, p521_mp_mod);
  115094. /* 0xffffffffffffffffffffffffffffffff00000000000000000000000000000000 */
  115095. sp_521_mont_sqr_n_17(t1, t2, 128, p521_mod, p521_mp_mod);
  115096. /* 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff */
  115097. sp_521_mont_mul_17(t2, t2, t1, p521_mod, p521_mp_mod);
  115098. /* 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000000000000 */
  115099. sp_521_mont_sqr_n_17(t1, t2, 256, p521_mod, p521_mp_mod);
  115100. /* 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff */
  115101. sp_521_mont_mul_17(t2, t2, t1, p521_mod, p521_mp_mod);
  115102. /* 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80 */
  115103. sp_521_mont_sqr_n_17(t1, t2, 7, p521_mod, p521_mp_mod);
  115104. /* 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff */
  115105. sp_521_mont_mul_17(t2, t3, t1, p521_mod, p521_mp_mod);
  115106. /* 0x1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc */
  115107. sp_521_mont_sqr_n_17(t1, t2, 2, p521_mod, p521_mp_mod);
  115108. /* 0x1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd */
  115109. sp_521_mont_mul_17(r, t1, a, p521_mod, p521_mp_mod);
  115110. #endif /* WOLFSSL_SP_SMALL */
  115111. }
  115112. /* Compare a with b in constant time.
  115113. *
  115114. * a A single precision integer.
  115115. * b A single precision integer.
  115116. * return -ve, 0 or +ve if a is less than, equal to or greater than b
  115117. * respectively.
  115118. */
  115119. static sp_int32 sp_521_cmp_17(const sp_digit* a_p, const sp_digit* b_p)
  115120. {
  115121. register const sp_digit* a asm ("r0") = (const sp_digit*)a_p;
  115122. register const sp_digit* b asm ("r1") = (const sp_digit*)b_p;
  115123. __asm__ __volatile__ (
  115124. "mov r2, #-1\n\t"
  115125. "mov r6, #1\n\t"
  115126. "mov r5, #0\n\t"
  115127. "mov r3, #-1\n\t"
  115128. #ifdef WOLFSSL_SP_SMALL
  115129. "mov r4, #0x40\n\t"
  115130. "\n"
  115131. "L_sp_521_cmp_17_words_%=: \n\t"
  115132. "ldr r12, [%[a], r4]\n\t"
  115133. "ldr lr, [%[b], r4]\n\t"
  115134. "and r12, r12, r3\n\t"
  115135. "and lr, lr, r3\n\t"
  115136. "subs r12, r12, lr\n\t"
  115137. "it hi\n\t"
  115138. "movhi r2, r6\n\t"
  115139. "it lo\n\t"
  115140. "movlo r2, r3\n\t"
  115141. "it ne\n\t"
  115142. "movne r3, r5\n\t"
  115143. "subs r4, r4, #4\n\t"
  115144. "bcs L_sp_521_cmp_17_words_%=\n\t"
  115145. "eor r2, r2, r3\n\t"
  115146. #else
  115147. "ldr r12, [%[a], #64]\n\t"
  115148. "ldr lr, [%[b], #64]\n\t"
  115149. "and r12, r12, r3\n\t"
  115150. "and lr, lr, r3\n\t"
  115151. "subs r12, r12, lr\n\t"
  115152. "it hi\n\t"
  115153. "movhi r2, r6\n\t"
  115154. "it lo\n\t"
  115155. "movlo r2, r3\n\t"
  115156. "it ne\n\t"
  115157. "movne r3, r5\n\t"
  115158. "ldr r12, [%[a], #60]\n\t"
  115159. "ldr lr, [%[b], #60]\n\t"
  115160. "and r12, r12, r3\n\t"
  115161. "and lr, lr, r3\n\t"
  115162. "subs r12, r12, lr\n\t"
  115163. "it hi\n\t"
  115164. "movhi r2, r6\n\t"
  115165. "it lo\n\t"
  115166. "movlo r2, r3\n\t"
  115167. "it ne\n\t"
  115168. "movne r3, r5\n\t"
  115169. "ldr r12, [%[a], #56]\n\t"
  115170. "ldr lr, [%[b], #56]\n\t"
  115171. "and r12, r12, r3\n\t"
  115172. "and lr, lr, r3\n\t"
  115173. "subs r12, r12, lr\n\t"
  115174. "it hi\n\t"
  115175. "movhi r2, r6\n\t"
  115176. "it lo\n\t"
  115177. "movlo r2, r3\n\t"
  115178. "it ne\n\t"
  115179. "movne r3, r5\n\t"
  115180. "ldr r12, [%[a], #52]\n\t"
  115181. "ldr lr, [%[b], #52]\n\t"
  115182. "and r12, r12, r3\n\t"
  115183. "and lr, lr, r3\n\t"
  115184. "subs r12, r12, lr\n\t"
  115185. "it hi\n\t"
  115186. "movhi r2, r6\n\t"
  115187. "it lo\n\t"
  115188. "movlo r2, r3\n\t"
  115189. "it ne\n\t"
  115190. "movne r3, r5\n\t"
  115191. "ldr r12, [%[a], #48]\n\t"
  115192. "ldr lr, [%[b], #48]\n\t"
  115193. "and r12, r12, r3\n\t"
  115194. "and lr, lr, r3\n\t"
  115195. "subs r12, r12, lr\n\t"
  115196. "it hi\n\t"
  115197. "movhi r2, r6\n\t"
  115198. "it lo\n\t"
  115199. "movlo r2, r3\n\t"
  115200. "it ne\n\t"
  115201. "movne r3, r5\n\t"
  115202. "ldr r12, [%[a], #44]\n\t"
  115203. "ldr lr, [%[b], #44]\n\t"
  115204. "and r12, r12, r3\n\t"
  115205. "and lr, lr, r3\n\t"
  115206. "subs r12, r12, lr\n\t"
  115207. "it hi\n\t"
  115208. "movhi r2, r6\n\t"
  115209. "it lo\n\t"
  115210. "movlo r2, r3\n\t"
  115211. "it ne\n\t"
  115212. "movne r3, r5\n\t"
  115213. "ldr r12, [%[a], #40]\n\t"
  115214. "ldr lr, [%[b], #40]\n\t"
  115215. "and r12, r12, r3\n\t"
  115216. "and lr, lr, r3\n\t"
  115217. "subs r12, r12, lr\n\t"
  115218. "it hi\n\t"
  115219. "movhi r2, r6\n\t"
  115220. "it lo\n\t"
  115221. "movlo r2, r3\n\t"
  115222. "it ne\n\t"
  115223. "movne r3, r5\n\t"
  115224. "ldr r12, [%[a], #36]\n\t"
  115225. "ldr lr, [%[b], #36]\n\t"
  115226. "and r12, r12, r3\n\t"
  115227. "and lr, lr, r3\n\t"
  115228. "subs r12, r12, lr\n\t"
  115229. "it hi\n\t"
  115230. "movhi r2, r6\n\t"
  115231. "it lo\n\t"
  115232. "movlo r2, r3\n\t"
  115233. "it ne\n\t"
  115234. "movne r3, r5\n\t"
  115235. "ldr r12, [%[a], #32]\n\t"
  115236. "ldr lr, [%[b], #32]\n\t"
  115237. "and r12, r12, r3\n\t"
  115238. "and lr, lr, r3\n\t"
  115239. "subs r12, r12, lr\n\t"
  115240. "it hi\n\t"
  115241. "movhi r2, r6\n\t"
  115242. "it lo\n\t"
  115243. "movlo r2, r3\n\t"
  115244. "it ne\n\t"
  115245. "movne r3, r5\n\t"
  115246. "ldr r12, [%[a], #28]\n\t"
  115247. "ldr lr, [%[b], #28]\n\t"
  115248. "and r12, r12, r3\n\t"
  115249. "and lr, lr, r3\n\t"
  115250. "subs r12, r12, lr\n\t"
  115251. "it hi\n\t"
  115252. "movhi r2, r6\n\t"
  115253. "it lo\n\t"
  115254. "movlo r2, r3\n\t"
  115255. "it ne\n\t"
  115256. "movne r3, r5\n\t"
  115257. "ldr r12, [%[a], #24]\n\t"
  115258. "ldr lr, [%[b], #24]\n\t"
  115259. "and r12, r12, r3\n\t"
  115260. "and lr, lr, r3\n\t"
  115261. "subs r12, r12, lr\n\t"
  115262. "it hi\n\t"
  115263. "movhi r2, r6\n\t"
  115264. "it lo\n\t"
  115265. "movlo r2, r3\n\t"
  115266. "it ne\n\t"
  115267. "movne r3, r5\n\t"
  115268. "ldr r12, [%[a], #20]\n\t"
  115269. "ldr lr, [%[b], #20]\n\t"
  115270. "and r12, r12, r3\n\t"
  115271. "and lr, lr, r3\n\t"
  115272. "subs r12, r12, lr\n\t"
  115273. "it hi\n\t"
  115274. "movhi r2, r6\n\t"
  115275. "it lo\n\t"
  115276. "movlo r2, r3\n\t"
  115277. "it ne\n\t"
  115278. "movne r3, r5\n\t"
  115279. "ldr r12, [%[a], #16]\n\t"
  115280. "ldr lr, [%[b], #16]\n\t"
  115281. "and r12, r12, r3\n\t"
  115282. "and lr, lr, r3\n\t"
  115283. "subs r12, r12, lr\n\t"
  115284. "it hi\n\t"
  115285. "movhi r2, r6\n\t"
  115286. "it lo\n\t"
  115287. "movlo r2, r3\n\t"
  115288. "it ne\n\t"
  115289. "movne r3, r5\n\t"
  115290. "ldr r12, [%[a], #12]\n\t"
  115291. "ldr lr, [%[b], #12]\n\t"
  115292. "and r12, r12, r3\n\t"
  115293. "and lr, lr, r3\n\t"
  115294. "subs r12, r12, lr\n\t"
  115295. "it hi\n\t"
  115296. "movhi r2, r6\n\t"
  115297. "it lo\n\t"
  115298. "movlo r2, r3\n\t"
  115299. "it ne\n\t"
  115300. "movne r3, r5\n\t"
  115301. "ldr r12, [%[a], #8]\n\t"
  115302. "ldr lr, [%[b], #8]\n\t"
  115303. "and r12, r12, r3\n\t"
  115304. "and lr, lr, r3\n\t"
  115305. "subs r12, r12, lr\n\t"
  115306. "it hi\n\t"
  115307. "movhi r2, r6\n\t"
  115308. "it lo\n\t"
  115309. "movlo r2, r3\n\t"
  115310. "it ne\n\t"
  115311. "movne r3, r5\n\t"
  115312. "ldr r12, [%[a], #4]\n\t"
  115313. "ldr lr, [%[b], #4]\n\t"
  115314. "and r12, r12, r3\n\t"
  115315. "and lr, lr, r3\n\t"
  115316. "subs r12, r12, lr\n\t"
  115317. "it hi\n\t"
  115318. "movhi r2, r6\n\t"
  115319. "it lo\n\t"
  115320. "movlo r2, r3\n\t"
  115321. "it ne\n\t"
  115322. "movne r3, r5\n\t"
  115323. "ldr r12, [%[a]]\n\t"
  115324. "ldr lr, [%[b]]\n\t"
  115325. "and r12, r12, r3\n\t"
  115326. "and lr, lr, r3\n\t"
  115327. "subs r12, r12, lr\n\t"
  115328. "it hi\n\t"
  115329. "movhi r2, r6\n\t"
  115330. "it lo\n\t"
  115331. "movlo r2, r3\n\t"
  115332. "it ne\n\t"
  115333. "movne r3, r5\n\t"
  115334. "eor r2, r2, r3\n\t"
  115335. #endif /*WOLFSSL_SP_SMALL */
  115336. "mov %[a], r2\n\t"
  115337. : [a] "+r" (a), [b] "+r" (b)
  115338. :
  115339. : "memory", "r2", "r3", "r12", "lr", "r4", "r5", "r6", "cc"
  115340. );
  115341. return (uint32_t)(size_t)a;
  115342. }
  115343. /* Normalize the values in each word to 32.
  115344. *
  115345. * a Array of sp_digit to normalize.
  115346. */
  115347. #define sp_521_norm_17(a)
  115348. /* Map the Montgomery form projective coordinate point to an affine point.
  115349. *
  115350. * r Resulting affine coordinate point.
  115351. * p Montgomery form projective coordinate point.
  115352. * t Temporary ordinate data.
  115353. */
  115354. static void sp_521_map_17(sp_point_521* r, const sp_point_521* p,
  115355. sp_digit* t)
  115356. {
  115357. sp_digit* t1 = t;
  115358. sp_digit* t2 = t + 2*17;
  115359. sp_int32 n;
  115360. sp_521_mont_inv_17(t1, p->z, t + 2*17);
  115361. sp_521_mont_sqr_17(t2, t1, p521_mod, p521_mp_mod);
  115362. sp_521_mont_mul_17(t1, t2, t1, p521_mod, p521_mp_mod);
  115363. /* x /= z^2 */
  115364. sp_521_mont_mul_17(r->x, p->x, t2, p521_mod, p521_mp_mod);
  115365. XMEMSET(r->x + 17, 0, sizeof(sp_digit) * 17U);
  115366. sp_521_mont_reduce_17(r->x, p521_mod, p521_mp_mod);
  115367. /* Reduce x to less than modulus */
  115368. n = sp_521_cmp_17(r->x, p521_mod);
  115369. sp_521_cond_sub_17(r->x, r->x, p521_mod, ~(n >> 31));
  115370. sp_521_norm_17(r->x);
  115371. /* y /= z^3 */
  115372. sp_521_mont_mul_17(r->y, p->y, t1, p521_mod, p521_mp_mod);
  115373. XMEMSET(r->y + 17, 0, sizeof(sp_digit) * 17U);
  115374. sp_521_mont_reduce_17(r->y, p521_mod, p521_mp_mod);
  115375. /* Reduce y to less than modulus */
  115376. n = sp_521_cmp_17(r->y, p521_mod);
  115377. sp_521_cond_sub_17(r->y, r->y, p521_mod, ~(n >> 31));
  115378. sp_521_norm_17(r->y);
  115379. XMEMSET(r->z, 0, sizeof(r->z) / 2);
  115380. r->z[0] = 1;
  115381. }
  115382. /* Add two Montgomery form numbers (r = a + b % m).
  115383. *
  115384. * r Result of addition.
  115385. * a First number to add in Montgomery form.
  115386. * b Second number to add in Montgomery form.
  115387. * m Modulus (prime).
  115388. */
  115389. 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)
  115390. {
  115391. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  115392. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  115393. register const sp_digit* b asm ("r2") = (const sp_digit*)b_p;
  115394. __asm__ __volatile__ (
  115395. "mov r3, #0\n\t"
  115396. "ldm %[a]!, {r8, r9, r10, r11}\n\t"
  115397. "ldm %[b]!, {r4, r5, r6, r7}\n\t"
  115398. "adds r8, r8, r4\n\t"
  115399. "adcs r9, r9, r5\n\t"
  115400. "adcs r10, r10, r6\n\t"
  115401. "adcs r11, r11, r7\n\t"
  115402. "stm %[r]!, {r8, r9, r10, r11}\n\t"
  115403. "ldm %[a]!, {r8, r9, r10, r11}\n\t"
  115404. "ldm %[b]!, {r4, r5, r6, r7}\n\t"
  115405. "adcs r8, r8, r4\n\t"
  115406. "adcs r9, r9, r5\n\t"
  115407. "adcs r10, r10, r6\n\t"
  115408. "adcs r11, r11, r7\n\t"
  115409. "stm %[r]!, {r8, r9, r10, r11}\n\t"
  115410. "ldm %[a]!, {r8, r9, r10, r11}\n\t"
  115411. "ldm %[b]!, {r4, r5, r6, r7}\n\t"
  115412. "adcs r8, r8, r4\n\t"
  115413. "adcs r9, r9, r5\n\t"
  115414. "adcs r10, r10, r6\n\t"
  115415. "adcs r11, r11, r7\n\t"
  115416. "stm %[r]!, {r8, r9, r10, r11}\n\t"
  115417. "ldm %[a]!, {r8, r9, r10, r11}\n\t"
  115418. "ldm %[b]!, {r4, r5, r6, r7}\n\t"
  115419. "adcs r8, r8, r4\n\t"
  115420. "adcs r9, r9, r5\n\t"
  115421. "adcs r10, r10, r6\n\t"
  115422. "adcs r11, r11, r7\n\t"
  115423. "stm %[r]!, {r8, r9, r10, r11}\n\t"
  115424. "ldm %[a]!, {r8}\n\t"
  115425. "ldm %[b]!, {r4}\n\t"
  115426. "adcs r8, r8, r4\n\t"
  115427. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  115428. "mov r12, #0x1\n\t"
  115429. "lsl r12, r12, #8\n\t"
  115430. "add r12, r12, #0xff\n\t"
  115431. #else
  115432. "mov r12, #0x1ff\n\t"
  115433. #endif
  115434. "lsr r3, r8, #9\n\t"
  115435. "and r8, r8, r12\n\t"
  115436. "stm %[r]!, {r8}\n\t"
  115437. "sub %[r], %[r], #0x44\n\t"
  115438. "ldm %[r], {r4, r5, r6, r7, r8, r9, r10, r11}\n\t"
  115439. "adds r4, r4, r3\n\t"
  115440. "adcs r5, r5, #0\n\t"
  115441. "adcs r6, r6, #0\n\t"
  115442. "adcs r7, r7, #0\n\t"
  115443. "adcs r8, r8, #0\n\t"
  115444. "adcs r9, r9, #0\n\t"
  115445. "adcs r10, r10, #0\n\t"
  115446. "adcs r11, r11, #0\n\t"
  115447. "stm %[r]!, {r4, r5, r6, r7, r8, r9, r10, r11}\n\t"
  115448. "ldm %[r], {r4, r5, r6, r7, r8, r9, r10, r11}\n\t"
  115449. "adcs r4, r4, #0\n\t"
  115450. "adcs r5, r5, #0\n\t"
  115451. "adcs r6, r6, #0\n\t"
  115452. "adcs r7, r7, #0\n\t"
  115453. "adcs r8, r8, #0\n\t"
  115454. "adcs r9, r9, #0\n\t"
  115455. "adcs r10, r10, #0\n\t"
  115456. "adcs r11, r11, #0\n\t"
  115457. "stm %[r]!, {r4, r5, r6, r7, r8, r9, r10, r11}\n\t"
  115458. "ldm %[r], {r4}\n\t"
  115459. "adcs r4, r4, #0\n\t"
  115460. "stm %[r]!, {r4}\n\t"
  115461. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  115462. :
  115463. : "memory", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r3", "r12", "cc"
  115464. );
  115465. (void)m_p;
  115466. }
  115467. /* Double a Montgomery form number (r = a + a % m).
  115468. *
  115469. * r Result of doubling.
  115470. * a Number to double in Montgomery form.
  115471. * m Modulus (prime).
  115472. */
  115473. static void sp_521_mont_dbl_17(sp_digit* r_p, const sp_digit* a_p, const sp_digit* m_p)
  115474. {
  115475. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  115476. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  115477. __asm__ __volatile__ (
  115478. "mov r2, #0\n\t"
  115479. "ldm %[a]!, {r4, r5, r6, r7, r8, r9, r10, r11}\n\t"
  115480. "adds r4, r4, r4\n\t"
  115481. "adcs r5, r5, r5\n\t"
  115482. "adcs r6, r6, r6\n\t"
  115483. "adcs r7, r7, r7\n\t"
  115484. "adcs r8, r8, r8\n\t"
  115485. "adcs r9, r9, r9\n\t"
  115486. "adcs r10, r10, r10\n\t"
  115487. "adcs r11, r11, r11\n\t"
  115488. "stm %[r]!, {r4, r5, r6, r7, r8, r9, r10, r11}\n\t"
  115489. "ldm %[a]!, {r4, r5, r6, r7, r8, r9, r10, r11}\n\t"
  115490. "adcs r4, r4, r4\n\t"
  115491. "adcs r5, r5, r5\n\t"
  115492. "adcs r6, r6, r6\n\t"
  115493. "adcs r7, r7, r7\n\t"
  115494. "adcs r8, r8, r8\n\t"
  115495. "adcs r9, r9, r9\n\t"
  115496. "adcs r10, r10, r10\n\t"
  115497. "adcs r11, r11, r11\n\t"
  115498. "stm %[r]!, {r4, r5, r6, r7, r8, r9, r10, r11}\n\t"
  115499. "ldm %[a]!, {r4}\n\t"
  115500. "adcs r4, r4, r4\n\t"
  115501. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  115502. "mov r3, #0x1\n\t"
  115503. "lsl r3, r3, #8\n\t"
  115504. "add r3, r3, #0xff\n\t"
  115505. #else
  115506. "mov r3, #0x1ff\n\t"
  115507. #endif
  115508. "lsr r2, r4, #9\n\t"
  115509. "and r4, r4, r3\n\t"
  115510. "stm %[r]!, {r4}\n\t"
  115511. "sub %[r], %[r], #0x44\n\t"
  115512. "ldm %[r], {r4, r5, r6, r7, r8, r9, r10, r11}\n\t"
  115513. "adds r4, r4, r2\n\t"
  115514. "adcs r5, r5, #0\n\t"
  115515. "adcs r6, r6, #0\n\t"
  115516. "adcs r7, r7, #0\n\t"
  115517. "adcs r8, r8, #0\n\t"
  115518. "adcs r9, r9, #0\n\t"
  115519. "adcs r10, r10, #0\n\t"
  115520. "adcs r11, r11, #0\n\t"
  115521. "stm %[r]!, {r4, r5, r6, r7, r8, r9, r10, r11}\n\t"
  115522. "ldm %[r], {r4, r5, r6, r7, r8, r9, r10, r11}\n\t"
  115523. "adcs r4, r4, #0\n\t"
  115524. "adcs r5, r5, #0\n\t"
  115525. "adcs r6, r6, #0\n\t"
  115526. "adcs r7, r7, #0\n\t"
  115527. "adcs r8, r8, #0\n\t"
  115528. "adcs r9, r9, #0\n\t"
  115529. "adcs r10, r10, #0\n\t"
  115530. "adcs r11, r11, #0\n\t"
  115531. "stm %[r]!, {r4, r5, r6, r7, r8, r9, r10, r11}\n\t"
  115532. "ldm %[r], {r4}\n\t"
  115533. "adcs r4, r4, #0\n\t"
  115534. "stm %[r]!, {r4}\n\t"
  115535. : [r] "+r" (r), [a] "+r" (a)
  115536. :
  115537. : "memory", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r2", "r3", "cc"
  115538. );
  115539. (void)m_p;
  115540. }
  115541. /* Triple a Montgomery form number (r = a + a + a % m).
  115542. *
  115543. * r Result of Tripling.
  115544. * a Number to triple in Montgomery form.
  115545. * m Modulus (prime).
  115546. */
  115547. static void sp_521_mont_tpl_17(sp_digit* r_p, const sp_digit* a_p, const sp_digit* m_p)
  115548. {
  115549. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  115550. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  115551. __asm__ __volatile__ (
  115552. "mov r2, #0\n\t"
  115553. "ldm %[a]!, {r4, r5, r6, r7, r8, r9, r10, r11}\n\t"
  115554. "adds r4, r4, r4\n\t"
  115555. "adcs r5, r5, r5\n\t"
  115556. "adcs r6, r6, r6\n\t"
  115557. "adcs r7, r7, r7\n\t"
  115558. "adcs r8, r8, r8\n\t"
  115559. "adcs r9, r9, r9\n\t"
  115560. "adcs r10, r10, r10\n\t"
  115561. "adcs r11, r11, r11\n\t"
  115562. "stm %[r]!, {r4, r5, r6, r7, r8, r9, r10, r11}\n\t"
  115563. "ldm %[a]!, {r4, r5, r6, r7, r8, r9, r10, r11}\n\t"
  115564. "adcs r4, r4, r4\n\t"
  115565. "adcs r5, r5, r5\n\t"
  115566. "adcs r6, r6, r6\n\t"
  115567. "adcs r7, r7, r7\n\t"
  115568. "adcs r8, r8, r8\n\t"
  115569. "adcs r9, r9, r9\n\t"
  115570. "adcs r10, r10, r10\n\t"
  115571. "adcs r11, r11, r11\n\t"
  115572. "stm %[r]!, {r4, r5, r6, r7, r8, r9, r10, r11}\n\t"
  115573. "ldm %[a]!, {r4}\n\t"
  115574. "adcs r4, r4, r4\n\t"
  115575. "stm %[r]!, {r4}\n\t"
  115576. "sub %[r], %[r], #0x44\n\t"
  115577. "sub %[a], %[a], #0x44\n\t"
  115578. "ldm %[r], {r4, r5, r6, r7}\n\t"
  115579. "ldm %[a]!, {r8, r9, r10, r11}\n\t"
  115580. "adds r4, r4, r8\n\t"
  115581. "adcs r5, r5, r9\n\t"
  115582. "adcs r6, r6, r10\n\t"
  115583. "adcs r7, r7, r11\n\t"
  115584. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  115585. "ldm %[r], {r4, r5, r6, r7}\n\t"
  115586. "ldm %[a]!, {r8, r9, r10, r11}\n\t"
  115587. "adcs r4, r4, r8\n\t"
  115588. "adcs r5, r5, r9\n\t"
  115589. "adcs r6, r6, r10\n\t"
  115590. "adcs r7, r7, r11\n\t"
  115591. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  115592. "ldm %[r], {r4, r5, r6, r7}\n\t"
  115593. "ldm %[a]!, {r8, r9, r10, r11}\n\t"
  115594. "adcs r4, r4, r8\n\t"
  115595. "adcs r5, r5, r9\n\t"
  115596. "adcs r6, r6, r10\n\t"
  115597. "adcs r7, r7, r11\n\t"
  115598. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  115599. "ldm %[r], {r4, r5, r6, r7}\n\t"
  115600. "ldm %[a]!, {r8, r9, r10, r11}\n\t"
  115601. "adcs r4, r4, r8\n\t"
  115602. "adcs r5, r5, r9\n\t"
  115603. "adcs r6, r6, r10\n\t"
  115604. "adcs r7, r7, r11\n\t"
  115605. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  115606. "ldm %[r], {r4}\n\t"
  115607. "ldm %[a]!, {r8}\n\t"
  115608. "adcs r4, r4, r8\n\t"
  115609. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  115610. "mov r3, #0x1\n\t"
  115611. "lsl r3, r3, #8\n\t"
  115612. "add r3, r3, #0xff\n\t"
  115613. #else
  115614. "mov r3, #0x1ff\n\t"
  115615. #endif
  115616. "lsr r2, r4, #9\n\t"
  115617. "and r4, r4, r3\n\t"
  115618. "stm %[r]!, {r4}\n\t"
  115619. "sub %[r], %[r], #0x44\n\t"
  115620. "ldm %[r], {r4, r5, r6, r7, r8, r9, r10, r11}\n\t"
  115621. "adds r4, r4, r2\n\t"
  115622. "adcs r4, r4, #0\n\t"
  115623. "stm %[r]!, {r4, r5, r6, r7, r8, r9, r10, r11}\n\t"
  115624. "ldm %[r], {r4, r5, r6, r7, r8, r9, r10, r11}\n\t"
  115625. "stm %[r]!, {r4, r5, r6, r7, r8, r9, r10, r11}\n\t"
  115626. "ldm %[r], {r4}\n\t"
  115627. "adcs r4, r4, #0\n\t"
  115628. "stm %[r]!, {r4}\n\t"
  115629. : [r] "+r" (r), [a] "+r" (a)
  115630. :
  115631. : "memory", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r2", "r3", "cc"
  115632. );
  115633. (void)m_p;
  115634. }
  115635. /* Subtract two Montgomery form numbers (r = a - b % m).
  115636. *
  115637. * r Result of subtration.
  115638. * a Number to subtract from in Montgomery form.
  115639. * b Number to subtract with in Montgomery form.
  115640. * m Modulus (prime).
  115641. */
  115642. 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)
  115643. {
  115644. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  115645. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  115646. register const sp_digit* b asm ("r2") = (const sp_digit*)b_p;
  115647. __asm__ __volatile__ (
  115648. "mov r3, #0\n\t"
  115649. "ldm %[a]!, {r8, r9, r10, r11}\n\t"
  115650. "ldm %[b]!, {r4, r5, r6, r7}\n\t"
  115651. "subs r8, r8, r4\n\t"
  115652. "sbcs r9, r9, r5\n\t"
  115653. "sbcs r10, r10, r6\n\t"
  115654. "sbcs r11, r11, r7\n\t"
  115655. "stm %[r]!, {r8, r9, r10, r11}\n\t"
  115656. "ldm %[a]!, {r8, r9, r10, r11}\n\t"
  115657. "ldm %[b]!, {r4, r5, r6, r7}\n\t"
  115658. "sbcs r8, r8, r4\n\t"
  115659. "sbcs r9, r9, r5\n\t"
  115660. "sbcs r10, r10, r6\n\t"
  115661. "sbcs r11, r11, r7\n\t"
  115662. "stm %[r]!, {r8, r9, r10, r11}\n\t"
  115663. "ldm %[a]!, {r8, r9, r10, r11}\n\t"
  115664. "ldm %[b]!, {r4, r5, r6, r7}\n\t"
  115665. "sbcs r8, r8, r4\n\t"
  115666. "sbcs r9, r9, r5\n\t"
  115667. "sbcs r10, r10, r6\n\t"
  115668. "sbcs r11, r11, r7\n\t"
  115669. "stm %[r]!, {r8, r9, r10, r11}\n\t"
  115670. "ldm %[a]!, {r8, r9, r10, r11}\n\t"
  115671. "ldm %[b]!, {r4, r5, r6, r7}\n\t"
  115672. "sbcs r8, r8, r4\n\t"
  115673. "sbcs r9, r9, r5\n\t"
  115674. "sbcs r10, r10, r6\n\t"
  115675. "sbcs r11, r11, r7\n\t"
  115676. "stm %[r]!, {r8, r9, r10, r11}\n\t"
  115677. "ldm %[a]!, {r8}\n\t"
  115678. "ldm %[b]!, {r4}\n\t"
  115679. "sbcs r8, r8, r4\n\t"
  115680. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  115681. "mov r12, #0x1\n\t"
  115682. "lsl r12, r12, #8\n\t"
  115683. "add r12, r12, #0xff\n\t"
  115684. #else
  115685. "mov r12, #0x1ff\n\t"
  115686. #endif
  115687. "asr r3, r8, #9\n\t"
  115688. "and r8, r8, r12\n\t"
  115689. "neg r3, r3\n\t"
  115690. "stm %[r]!, {r8}\n\t"
  115691. "sub %[r], %[r], #0x44\n\t"
  115692. "ldm %[r], {r4, r5, r6, r7, r8, r9, r10, r11}\n\t"
  115693. "subs r4, r4, r3\n\t"
  115694. "sbcs r5, r5, #0\n\t"
  115695. "sbcs r6, r6, #0\n\t"
  115696. "sbcs r7, r7, #0\n\t"
  115697. "sbcs r8, r8, #0\n\t"
  115698. "sbcs r9, r9, #0\n\t"
  115699. "sbcs r10, r10, #0\n\t"
  115700. "sbcs r11, r11, #0\n\t"
  115701. "stm %[r]!, {r4, r5, r6, r7, r8, r9, r10, r11}\n\t"
  115702. "ldm %[r], {r4, r5, r6, r7, r8, r9, r10, r11}\n\t"
  115703. "sbcs r4, r4, #0\n\t"
  115704. "sbcs r5, r5, #0\n\t"
  115705. "sbcs r6, r6, #0\n\t"
  115706. "sbcs r7, r7, #0\n\t"
  115707. "sbcs r8, r8, #0\n\t"
  115708. "sbcs r9, r9, #0\n\t"
  115709. "sbcs r10, r10, #0\n\t"
  115710. "sbcs r11, r11, #0\n\t"
  115711. "stm %[r]!, {r4, r5, r6, r7, r8, r9, r10, r11}\n\t"
  115712. "ldm %[r], {r4}\n\t"
  115713. "sbcs r4, r4, #0\n\t"
  115714. "stm %[r]!, {r4}\n\t"
  115715. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  115716. :
  115717. : "memory", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r3", "r12", "cc"
  115718. );
  115719. (void)m_p;
  115720. }
  115721. static void sp_521_rshift1_17(sp_digit* r_p, const sp_digit* a_p)
  115722. {
  115723. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  115724. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  115725. __asm__ __volatile__ (
  115726. "ldm %[a], {r2, r3}\n\t"
  115727. "lsr r2, r2, #1\n\t"
  115728. "orr r2, r2, r3, lsl #31\n\t"
  115729. "lsr r3, r3, #1\n\t"
  115730. "ldr r4, [%[a], #8]\n\t"
  115731. "str r2, [%[r]]\n\t"
  115732. "orr r3, r3, r4, lsl #31\n\t"
  115733. "lsr r4, r4, #1\n\t"
  115734. "ldr r2, [%[a], #12]\n\t"
  115735. "str r3, [%[r], #4]\n\t"
  115736. "orr r4, r4, r2, lsl #31\n\t"
  115737. "lsr r2, r2, #1\n\t"
  115738. "ldr r3, [%[a], #16]\n\t"
  115739. "str r4, [%[r], #8]\n\t"
  115740. "orr r2, r2, r3, lsl #31\n\t"
  115741. "lsr r3, r3, #1\n\t"
  115742. "ldr r4, [%[a], #20]\n\t"
  115743. "str r2, [%[r], #12]\n\t"
  115744. "orr r3, r3, r4, lsl #31\n\t"
  115745. "lsr r4, r4, #1\n\t"
  115746. "ldr r2, [%[a], #24]\n\t"
  115747. "str r3, [%[r], #16]\n\t"
  115748. "orr r4, r4, r2, lsl #31\n\t"
  115749. "lsr r2, r2, #1\n\t"
  115750. "ldr r3, [%[a], #28]\n\t"
  115751. "str r4, [%[r], #20]\n\t"
  115752. "orr r2, r2, r3, lsl #31\n\t"
  115753. "lsr r3, r3, #1\n\t"
  115754. "ldr r4, [%[a], #32]\n\t"
  115755. "str r2, [%[r], #24]\n\t"
  115756. "orr r3, r3, r4, lsl #31\n\t"
  115757. "lsr r4, r4, #1\n\t"
  115758. "ldr r2, [%[a], #36]\n\t"
  115759. "str r3, [%[r], #28]\n\t"
  115760. "orr r4, r4, r2, lsl #31\n\t"
  115761. "lsr r2, r2, #1\n\t"
  115762. "ldr r3, [%[a], #40]\n\t"
  115763. "str r4, [%[r], #32]\n\t"
  115764. "orr r2, r2, r3, lsl #31\n\t"
  115765. "lsr r3, r3, #1\n\t"
  115766. "ldr r4, [%[a], #44]\n\t"
  115767. "str r2, [%[r], #36]\n\t"
  115768. "orr r3, r3, r4, lsl #31\n\t"
  115769. "lsr r4, r4, #1\n\t"
  115770. "ldr r2, [%[a], #48]\n\t"
  115771. "str r3, [%[r], #40]\n\t"
  115772. "orr r4, r4, r2, lsl #31\n\t"
  115773. "lsr r2, r2, #1\n\t"
  115774. "ldr r3, [%[a], #52]\n\t"
  115775. "str r4, [%[r], #44]\n\t"
  115776. "orr r2, r2, r3, lsl #31\n\t"
  115777. "lsr r3, r3, #1\n\t"
  115778. "ldr r4, [%[a], #56]\n\t"
  115779. "str r2, [%[r], #48]\n\t"
  115780. "orr r3, r3, r4, lsl #31\n\t"
  115781. "lsr r4, r4, #1\n\t"
  115782. "ldr r2, [%[a], #60]\n\t"
  115783. "str r3, [%[r], #52]\n\t"
  115784. "orr r4, r4, r2, lsl #31\n\t"
  115785. "lsr r2, r2, #1\n\t"
  115786. "ldr r3, [%[a], #64]\n\t"
  115787. "str r4, [%[r], #56]\n\t"
  115788. "orr r2, r2, r3, lsl #31\n\t"
  115789. "lsr r3, r3, #1\n\t"
  115790. "str r2, [%[r], #60]\n\t"
  115791. "str r3, [%[r], #64]\n\t"
  115792. : [r] "+r" (r), [a] "+r" (a)
  115793. :
  115794. : "memory", "r2", "r3", "r4", "cc"
  115795. );
  115796. }
  115797. /* Divide the number by 2 mod the modulus (prime). (r = a / 2 % m)
  115798. *
  115799. * r Result of division by 2.
  115800. * a Number to divide.
  115801. * m Modulus (prime).
  115802. */
  115803. static void sp_521_mont_div2_17(sp_digit* r, const sp_digit* a, const sp_digit* m)
  115804. {
  115805. sp_digit o = a[0] & 1;
  115806. (void)m;
  115807. sp_521_rshift1_17(r, r);
  115808. r[16] |= o << 8;
  115809. }
  115810. /* Double the Montgomery form projective point p.
  115811. *
  115812. * r Result of doubling point.
  115813. * p Point to double.
  115814. * t Temporary ordinate data.
  115815. */
  115816. static void sp_521_proj_point_dbl_17(sp_point_521* r, const sp_point_521* p,
  115817. sp_digit* t)
  115818. {
  115819. sp_digit* t1 = t;
  115820. sp_digit* t2 = t + 2*17;
  115821. sp_digit* x;
  115822. sp_digit* y;
  115823. sp_digit* z;
  115824. x = r->x;
  115825. y = r->y;
  115826. z = r->z;
  115827. /* Put infinity into result. */
  115828. if (r != p) {
  115829. r->infinity = p->infinity;
  115830. }
  115831. /* T1 = Z * Z */
  115832. sp_521_mont_sqr_17(t1, p->z, p521_mod, p521_mp_mod);
  115833. /* Z = Y * Z */
  115834. sp_521_mont_mul_17(z, p->y, p->z, p521_mod, p521_mp_mod);
  115835. /* Z = 2Z */
  115836. sp_521_mont_dbl_17(z, z, p521_mod);
  115837. /* T2 = X - T1 */
  115838. sp_521_mont_sub_17(t2, p->x, t1, p521_mod);
  115839. /* T1 = X + T1 */
  115840. sp_521_mont_add_17(t1, p->x, t1, p521_mod);
  115841. /* T2 = T1 * T2 */
  115842. sp_521_mont_mul_17(t2, t1, t2, p521_mod, p521_mp_mod);
  115843. /* T1 = 3T2 */
  115844. sp_521_mont_tpl_17(t1, t2, p521_mod);
  115845. /* Y = 2Y */
  115846. sp_521_mont_dbl_17(y, p->y, p521_mod);
  115847. /* Y = Y * Y */
  115848. sp_521_mont_sqr_17(y, y, p521_mod, p521_mp_mod);
  115849. /* T2 = Y * Y */
  115850. sp_521_mont_sqr_17(t2, y, p521_mod, p521_mp_mod);
  115851. /* T2 = T2/2 */
  115852. sp_521_mont_div2_17(t2, t2, p521_mod);
  115853. /* Y = Y * X */
  115854. sp_521_mont_mul_17(y, y, p->x, p521_mod, p521_mp_mod);
  115855. /* X = T1 * T1 */
  115856. sp_521_mont_sqr_17(x, t1, p521_mod, p521_mp_mod);
  115857. /* X = X - Y */
  115858. sp_521_mont_sub_17(x, x, y, p521_mod);
  115859. /* X = X - Y */
  115860. sp_521_mont_sub_17(x, x, y, p521_mod);
  115861. /* Y = Y - X */
  115862. sp_521_mont_sub_17(y, y, x, p521_mod);
  115863. /* Y = Y * T1 */
  115864. sp_521_mont_mul_17(y, y, t1, p521_mod, p521_mp_mod);
  115865. /* Y = Y - T2 */
  115866. sp_521_mont_sub_17(y, y, t2, p521_mod);
  115867. }
  115868. #ifdef WOLFSSL_SP_NONBLOCK
  115869. typedef struct sp_521_proj_point_dbl_17_ctx {
  115870. int state;
  115871. sp_digit* t1;
  115872. sp_digit* t2;
  115873. sp_digit* x;
  115874. sp_digit* y;
  115875. sp_digit* z;
  115876. } sp_521_proj_point_dbl_17_ctx;
  115877. /* Double the Montgomery form projective point p.
  115878. *
  115879. * r Result of doubling point.
  115880. * p Point to double.
  115881. * t Temporary ordinate data.
  115882. */
  115883. static int sp_521_proj_point_dbl_17_nb(sp_ecc_ctx_t* sp_ctx, sp_point_521* r,
  115884. const sp_point_521* p, sp_digit* t)
  115885. {
  115886. int err = FP_WOULDBLOCK;
  115887. sp_521_proj_point_dbl_17_ctx* ctx = (sp_521_proj_point_dbl_17_ctx*)sp_ctx->data;
  115888. typedef char ctx_size_test[sizeof(sp_521_proj_point_dbl_17_ctx) >= sizeof(*sp_ctx) ? -1 : 1];
  115889. (void)sizeof(ctx_size_test);
  115890. switch (ctx->state) {
  115891. case 0:
  115892. ctx->t1 = t;
  115893. ctx->t2 = t + 2*17;
  115894. ctx->x = r->x;
  115895. ctx->y = r->y;
  115896. ctx->z = r->z;
  115897. /* Put infinity into result. */
  115898. if (r != p) {
  115899. r->infinity = p->infinity;
  115900. }
  115901. ctx->state = 1;
  115902. break;
  115903. case 1:
  115904. /* T1 = Z * Z */
  115905. sp_521_mont_sqr_17(ctx->t1, p->z, p521_mod, p521_mp_mod);
  115906. ctx->state = 2;
  115907. break;
  115908. case 2:
  115909. /* Z = Y * Z */
  115910. sp_521_mont_mul_17(ctx->z, p->y, p->z, p521_mod, p521_mp_mod);
  115911. ctx->state = 3;
  115912. break;
  115913. case 3:
  115914. /* Z = 2Z */
  115915. sp_521_mont_dbl_17(ctx->z, ctx->z, p521_mod);
  115916. ctx->state = 4;
  115917. break;
  115918. case 4:
  115919. /* T2 = X - T1 */
  115920. sp_521_mont_sub_17(ctx->t2, p->x, ctx->t1, p521_mod);
  115921. ctx->state = 5;
  115922. break;
  115923. case 5:
  115924. /* T1 = X + T1 */
  115925. sp_521_mont_add_17(ctx->t1, p->x, ctx->t1, p521_mod);
  115926. ctx->state = 6;
  115927. break;
  115928. case 6:
  115929. /* T2 = T1 * T2 */
  115930. sp_521_mont_mul_17(ctx->t2, ctx->t1, ctx->t2, p521_mod, p521_mp_mod);
  115931. ctx->state = 7;
  115932. break;
  115933. case 7:
  115934. /* T1 = 3T2 */
  115935. sp_521_mont_tpl_17(ctx->t1, ctx->t2, p521_mod);
  115936. ctx->state = 8;
  115937. break;
  115938. case 8:
  115939. /* Y = 2Y */
  115940. sp_521_mont_dbl_17(ctx->y, p->y, p521_mod);
  115941. ctx->state = 9;
  115942. break;
  115943. case 9:
  115944. /* Y = Y * Y */
  115945. sp_521_mont_sqr_17(ctx->y, ctx->y, p521_mod, p521_mp_mod);
  115946. ctx->state = 10;
  115947. break;
  115948. case 10:
  115949. /* T2 = Y * Y */
  115950. sp_521_mont_sqr_17(ctx->t2, ctx->y, p521_mod, p521_mp_mod);
  115951. ctx->state = 11;
  115952. break;
  115953. case 11:
  115954. /* T2 = T2/2 */
  115955. sp_521_mont_div2_17(ctx->t2, ctx->t2, p521_mod);
  115956. ctx->state = 12;
  115957. break;
  115958. case 12:
  115959. /* Y = Y * X */
  115960. sp_521_mont_mul_17(ctx->y, ctx->y, p->x, p521_mod, p521_mp_mod);
  115961. ctx->state = 13;
  115962. break;
  115963. case 13:
  115964. /* X = T1 * T1 */
  115965. sp_521_mont_sqr_17(ctx->x, ctx->t1, p521_mod, p521_mp_mod);
  115966. ctx->state = 14;
  115967. break;
  115968. case 14:
  115969. /* X = X - Y */
  115970. sp_521_mont_sub_17(ctx->x, ctx->x, ctx->y, p521_mod);
  115971. ctx->state = 15;
  115972. break;
  115973. case 15:
  115974. /* X = X - Y */
  115975. sp_521_mont_sub_17(ctx->x, ctx->x, ctx->y, p521_mod);
  115976. ctx->state = 16;
  115977. break;
  115978. case 16:
  115979. /* Y = Y - X */
  115980. sp_521_mont_sub_17(ctx->y, ctx->y, ctx->x, p521_mod);
  115981. ctx->state = 17;
  115982. break;
  115983. case 17:
  115984. /* Y = Y * T1 */
  115985. sp_521_mont_mul_17(ctx->y, ctx->y, ctx->t1, p521_mod, p521_mp_mod);
  115986. ctx->state = 18;
  115987. break;
  115988. case 18:
  115989. /* Y = Y - T2 */
  115990. sp_521_mont_sub_17(ctx->y, ctx->y, ctx->t2, p521_mod);
  115991. ctx->state = 19;
  115992. /* fall-through */
  115993. case 19:
  115994. err = MP_OKAY;
  115995. break;
  115996. }
  115997. if (err == MP_OKAY && ctx->state != 19) {
  115998. err = FP_WOULDBLOCK;
  115999. }
  116000. return err;
  116001. }
  116002. #endif /* WOLFSSL_SP_NONBLOCK */
  116003. /* Compare two numbers to determine if they are equal.
  116004. * Constant time implementation.
  116005. *
  116006. * a First number to compare.
  116007. * b Second number to compare.
  116008. * returns 1 when equal and 0 otherwise.
  116009. */
  116010. static int sp_521_cmp_equal_17(const sp_digit* a, const sp_digit* b)
  116011. {
  116012. return ((a[0] ^ b[0]) | (a[1] ^ b[1]) | (a[2] ^ b[2]) |
  116013. (a[3] ^ b[3]) | (a[4] ^ b[4]) | (a[5] ^ b[5]) |
  116014. (a[6] ^ b[6]) | (a[7] ^ b[7]) | (a[8] ^ b[8]) |
  116015. (a[9] ^ b[9]) | (a[10] ^ b[10]) | (a[11] ^ b[11]) |
  116016. (a[12] ^ b[12]) | (a[13] ^ b[13]) | (a[14] ^ b[14]) |
  116017. (a[15] ^ b[15]) | (a[16] ^ b[16])) == 0;
  116018. }
  116019. /* Returns 1 if the number of zero.
  116020. * Implementation is constant time.
  116021. *
  116022. * a Number to check.
  116023. * returns 1 if the number is zero and 0 otherwise.
  116024. */
  116025. static int sp_521_iszero_17(const sp_digit* a)
  116026. {
  116027. return (a[0] | a[1] | a[2] | a[3] | a[4] | a[5] | a[6] | a[7] |
  116028. a[8] | a[9] | a[10] | a[11] | a[12] | a[13] | a[14] | a[15] |
  116029. a[16]) == 0;
  116030. }
  116031. /* Add two Montgomery form projective points.
  116032. *
  116033. * r Result of addition.
  116034. * p First point to add.
  116035. * q Second point to add.
  116036. * t Temporary ordinate data.
  116037. */
  116038. static void sp_521_proj_point_add_17(sp_point_521* r,
  116039. const sp_point_521* p, const sp_point_521* q, sp_digit* t)
  116040. {
  116041. sp_digit* t6 = t;
  116042. sp_digit* t1 = t + 2*17;
  116043. sp_digit* t2 = t + 4*17;
  116044. sp_digit* t3 = t + 6*17;
  116045. sp_digit* t4 = t + 8*17;
  116046. sp_digit* t5 = t + 10*17;
  116047. /* U1 = X1*Z2^2 */
  116048. sp_521_mont_sqr_17(t1, q->z, p521_mod, p521_mp_mod);
  116049. sp_521_mont_mul_17(t3, t1, q->z, p521_mod, p521_mp_mod);
  116050. sp_521_mont_mul_17(t1, t1, p->x, p521_mod, p521_mp_mod);
  116051. /* U2 = X2*Z1^2 */
  116052. sp_521_mont_sqr_17(t2, p->z, p521_mod, p521_mp_mod);
  116053. sp_521_mont_mul_17(t4, t2, p->z, p521_mod, p521_mp_mod);
  116054. sp_521_mont_mul_17(t2, t2, q->x, p521_mod, p521_mp_mod);
  116055. /* S1 = Y1*Z2^3 */
  116056. sp_521_mont_mul_17(t3, t3, p->y, p521_mod, p521_mp_mod);
  116057. /* S2 = Y2*Z1^3 */
  116058. sp_521_mont_mul_17(t4, t4, q->y, p521_mod, p521_mp_mod);
  116059. /* Check double */
  116060. if ((~p->infinity) & (~q->infinity) &
  116061. sp_521_cmp_equal_17(t2, t1) &
  116062. sp_521_cmp_equal_17(t4, t3)) {
  116063. sp_521_proj_point_dbl_17(r, p, t);
  116064. }
  116065. else {
  116066. sp_digit* x = t6;
  116067. sp_digit* y = t1;
  116068. sp_digit* z = t2;
  116069. /* H = U2 - U1 */
  116070. sp_521_mont_sub_17(t2, t2, t1, p521_mod);
  116071. /* R = S2 - S1 */
  116072. sp_521_mont_sub_17(t4, t4, t3, p521_mod);
  116073. /* X3 = R^2 - H^3 - 2*U1*H^2 */
  116074. sp_521_mont_sqr_17(t5, t2, p521_mod, p521_mp_mod);
  116075. sp_521_mont_mul_17(y, t1, t5, p521_mod, p521_mp_mod);
  116076. sp_521_mont_mul_17(t5, t5, t2, p521_mod, p521_mp_mod);
  116077. /* Z3 = H*Z1*Z2 */
  116078. sp_521_mont_mul_17(z, p->z, t2, p521_mod, p521_mp_mod);
  116079. sp_521_mont_mul_17(z, z, q->z, p521_mod, p521_mp_mod);
  116080. sp_521_mont_sqr_17(x, t4, p521_mod, p521_mp_mod);
  116081. sp_521_mont_sub_17(x, x, t5, p521_mod);
  116082. sp_521_mont_mul_17(t5, t5, t3, p521_mod, p521_mp_mod);
  116083. sp_521_mont_dbl_17(t3, y, p521_mod);
  116084. sp_521_mont_sub_17(x, x, t3, p521_mod);
  116085. /* Y3 = R*(U1*H^2 - X3) - S1*H^3 */
  116086. sp_521_mont_sub_17(y, y, x, p521_mod);
  116087. sp_521_mont_mul_17(y, y, t4, p521_mod, p521_mp_mod);
  116088. sp_521_mont_sub_17(y, y, t5, p521_mod);
  116089. {
  116090. int i;
  116091. sp_digit maskp = 0 - (q->infinity & (!p->infinity));
  116092. sp_digit maskq = 0 - (p->infinity & (!q->infinity));
  116093. sp_digit maskt = ~(maskp | maskq);
  116094. sp_digit inf = (sp_digit)(p->infinity & q->infinity);
  116095. for (i = 0; i < 17; i++) {
  116096. r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) |
  116097. (x[i] & maskt);
  116098. }
  116099. for (i = 0; i < 17; i++) {
  116100. r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) |
  116101. (y[i] & maskt);
  116102. }
  116103. for (i = 0; i < 17; i++) {
  116104. r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) |
  116105. (z[i] & maskt);
  116106. }
  116107. r->z[0] |= inf;
  116108. r->infinity = (word32)inf;
  116109. }
  116110. }
  116111. }
  116112. #ifdef WOLFSSL_SP_NONBLOCK
  116113. typedef struct sp_521_proj_point_add_17_ctx {
  116114. int state;
  116115. sp_521_proj_point_dbl_17_ctx dbl_ctx;
  116116. const sp_point_521* ap[2];
  116117. sp_point_521* rp[2];
  116118. sp_digit* t1;
  116119. sp_digit* t2;
  116120. sp_digit* t3;
  116121. sp_digit* t4;
  116122. sp_digit* t5;
  116123. sp_digit* t6;
  116124. sp_digit* x;
  116125. sp_digit* y;
  116126. sp_digit* z;
  116127. } sp_521_proj_point_add_17_ctx;
  116128. /* Add two Montgomery form projective points.
  116129. *
  116130. * r Result of addition.
  116131. * p First point to add.
  116132. * q Second point to add.
  116133. * t Temporary ordinate data.
  116134. */
  116135. static int sp_521_proj_point_add_17_nb(sp_ecc_ctx_t* sp_ctx, sp_point_521* r,
  116136. const sp_point_521* p, const sp_point_521* q, sp_digit* t)
  116137. {
  116138. int err = FP_WOULDBLOCK;
  116139. sp_521_proj_point_add_17_ctx* ctx = (sp_521_proj_point_add_17_ctx*)sp_ctx->data;
  116140. /* Ensure only the first point is the same as the result. */
  116141. if (q == r) {
  116142. const sp_point_521* a = p;
  116143. p = q;
  116144. q = a;
  116145. }
  116146. typedef char ctx_size_test[sizeof(sp_521_proj_point_add_17_ctx) >= sizeof(*sp_ctx) ? -1 : 1];
  116147. (void)sizeof(ctx_size_test);
  116148. switch (ctx->state) {
  116149. case 0: /* INIT */
  116150. ctx->t6 = t;
  116151. ctx->t1 = t + 2*17;
  116152. ctx->t2 = t + 4*17;
  116153. ctx->t3 = t + 6*17;
  116154. ctx->t4 = t + 8*17;
  116155. ctx->t5 = t + 10*17;
  116156. ctx->x = ctx->t6;
  116157. ctx->y = ctx->t1;
  116158. ctx->z = ctx->t2;
  116159. ctx->state = 1;
  116160. break;
  116161. case 1:
  116162. /* U1 = X1*Z2^2 */
  116163. sp_521_mont_sqr_17(ctx->t1, q->z, p521_mod, p521_mp_mod);
  116164. ctx->state = 2;
  116165. break;
  116166. case 2:
  116167. sp_521_mont_mul_17(ctx->t3, ctx->t1, q->z, p521_mod, p521_mp_mod);
  116168. ctx->state = 3;
  116169. break;
  116170. case 3:
  116171. sp_521_mont_mul_17(ctx->t1, ctx->t1, p->x, p521_mod, p521_mp_mod);
  116172. ctx->state = 4;
  116173. break;
  116174. case 4:
  116175. /* U2 = X2*Z1^2 */
  116176. sp_521_mont_sqr_17(ctx->t2, p->z, p521_mod, p521_mp_mod);
  116177. ctx->state = 5;
  116178. break;
  116179. case 5:
  116180. sp_521_mont_mul_17(ctx->t4, ctx->t2, p->z, p521_mod, p521_mp_mod);
  116181. ctx->state = 6;
  116182. break;
  116183. case 6:
  116184. sp_521_mont_mul_17(ctx->t2, ctx->t2, q->x, p521_mod, p521_mp_mod);
  116185. ctx->state = 7;
  116186. break;
  116187. case 7:
  116188. /* S1 = Y1*Z2^3 */
  116189. sp_521_mont_mul_17(ctx->t3, ctx->t3, p->y, p521_mod, p521_mp_mod);
  116190. ctx->state = 8;
  116191. break;
  116192. case 8:
  116193. /* S2 = Y2*Z1^3 */
  116194. sp_521_mont_mul_17(ctx->t4, ctx->t4, q->y, p521_mod, p521_mp_mod);
  116195. ctx->state = 9;
  116196. break;
  116197. case 9:
  116198. /* Check double */
  116199. if ((~p->infinity) & (~q->infinity) &
  116200. sp_521_cmp_equal_17(ctx->t2, ctx->t1) &
  116201. sp_521_cmp_equal_17(ctx->t4, ctx->t3)) {
  116202. XMEMSET(&ctx->dbl_ctx, 0, sizeof(ctx->dbl_ctx));
  116203. sp_521_proj_point_dbl_17(r, p, t);
  116204. ctx->state = 25;
  116205. }
  116206. else {
  116207. ctx->state = 10;
  116208. }
  116209. break;
  116210. case 10:
  116211. /* H = U2 - U1 */
  116212. sp_521_mont_sub_17(ctx->t2, ctx->t2, ctx->t1, p521_mod);
  116213. ctx->state = 11;
  116214. break;
  116215. case 11:
  116216. /* R = S2 - S1 */
  116217. sp_521_mont_sub_17(ctx->t4, ctx->t4, ctx->t3, p521_mod);
  116218. ctx->state = 12;
  116219. break;
  116220. case 12:
  116221. /* X3 = R^2 - H^3 - 2*U1*H^2 */
  116222. sp_521_mont_sqr_17(ctx->t5, ctx->t2, p521_mod, p521_mp_mod);
  116223. ctx->state = 13;
  116224. break;
  116225. case 13:
  116226. sp_521_mont_mul_17(ctx->y, ctx->t1, ctx->t5, p521_mod, p521_mp_mod);
  116227. ctx->state = 14;
  116228. break;
  116229. case 14:
  116230. sp_521_mont_mul_17(ctx->t5, ctx->t5, ctx->t2, p521_mod, p521_mp_mod);
  116231. ctx->state = 15;
  116232. break;
  116233. case 15:
  116234. /* Z3 = H*Z1*Z2 */
  116235. sp_521_mont_mul_17(ctx->z, p->z, ctx->t2, p521_mod, p521_mp_mod);
  116236. ctx->state = 16;
  116237. break;
  116238. case 16:
  116239. sp_521_mont_mul_17(ctx->z, ctx->z, q->z, p521_mod, p521_mp_mod);
  116240. ctx->state = 17;
  116241. break;
  116242. case 17:
  116243. sp_521_mont_sqr_17(ctx->x, ctx->t4, p521_mod, p521_mp_mod);
  116244. ctx->state = 18;
  116245. break;
  116246. case 18:
  116247. sp_521_mont_sub_17(ctx->x, ctx->x, ctx->t5, p521_mod);
  116248. ctx->state = 19;
  116249. break;
  116250. case 19:
  116251. sp_521_mont_mul_17(ctx->t5, ctx->t5, ctx->t3, p521_mod, p521_mp_mod);
  116252. ctx->state = 20;
  116253. break;
  116254. case 20:
  116255. sp_521_mont_dbl_17(ctx->t3, ctx->y, p521_mod);
  116256. sp_521_mont_sub_17(ctx->x, ctx->x, ctx->t3, p521_mod);
  116257. ctx->state = 21;
  116258. break;
  116259. case 21:
  116260. /* Y3 = R*(U1*H^2 - X3) - S1*H^3 */
  116261. sp_521_mont_sub_17(ctx->y, ctx->y, ctx->x, p521_mod);
  116262. ctx->state = 22;
  116263. break;
  116264. case 22:
  116265. sp_521_mont_mul_17(ctx->y, ctx->y, ctx->t4, p521_mod, p521_mp_mod);
  116266. ctx->state = 23;
  116267. break;
  116268. case 23:
  116269. sp_521_mont_sub_17(ctx->y, ctx->y, ctx->t5, p521_mod);
  116270. ctx->state = 24;
  116271. break;
  116272. case 24:
  116273. {
  116274. {
  116275. int i;
  116276. sp_digit maskp = 0 - (q->infinity & (!p->infinity));
  116277. sp_digit maskq = 0 - (p->infinity & (!q->infinity));
  116278. sp_digit maskt = ~(maskp | maskq);
  116279. sp_digit inf = (sp_digit)(p->infinity & q->infinity);
  116280. for (i = 0; i < 17; i++) {
  116281. r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) |
  116282. (ctx->x[i] & maskt);
  116283. }
  116284. for (i = 0; i < 17; i++) {
  116285. r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) |
  116286. (ctx->y[i] & maskt);
  116287. }
  116288. for (i = 0; i < 17; i++) {
  116289. r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) |
  116290. (ctx->z[i] & maskt);
  116291. }
  116292. r->z[0] |= inf;
  116293. r->infinity = (word32)inf;
  116294. }
  116295. ctx->state = 25;
  116296. break;
  116297. }
  116298. case 25:
  116299. err = MP_OKAY;
  116300. break;
  116301. }
  116302. if (err == MP_OKAY && ctx->state != 25) {
  116303. err = FP_WOULDBLOCK;
  116304. }
  116305. return err;
  116306. }
  116307. #endif /* WOLFSSL_SP_NONBLOCK */
  116308. #ifndef WC_NO_CACHE_RESISTANT
  116309. /* Touch each possible point that could be being copied.
  116310. *
  116311. * r Point to copy into.
  116312. * table Table - start of the entries to access
  116313. * idx Index of entry to retrieve.
  116314. */
  116315. static void sp_521_get_point_16_17(sp_point_521* r, const sp_point_521* table,
  116316. int idx)
  116317. {
  116318. int i;
  116319. sp_digit mask;
  116320. r->x[0] = 0;
  116321. r->x[1] = 0;
  116322. r->x[2] = 0;
  116323. r->x[3] = 0;
  116324. r->x[4] = 0;
  116325. r->x[5] = 0;
  116326. r->x[6] = 0;
  116327. r->x[7] = 0;
  116328. r->x[8] = 0;
  116329. r->x[9] = 0;
  116330. r->x[10] = 0;
  116331. r->x[11] = 0;
  116332. r->x[12] = 0;
  116333. r->x[13] = 0;
  116334. r->x[14] = 0;
  116335. r->x[15] = 0;
  116336. r->x[16] = 0;
  116337. r->y[0] = 0;
  116338. r->y[1] = 0;
  116339. r->y[2] = 0;
  116340. r->y[3] = 0;
  116341. r->y[4] = 0;
  116342. r->y[5] = 0;
  116343. r->y[6] = 0;
  116344. r->y[7] = 0;
  116345. r->y[8] = 0;
  116346. r->y[9] = 0;
  116347. r->y[10] = 0;
  116348. r->y[11] = 0;
  116349. r->y[12] = 0;
  116350. r->y[13] = 0;
  116351. r->y[14] = 0;
  116352. r->y[15] = 0;
  116353. r->y[16] = 0;
  116354. r->z[0] = 0;
  116355. r->z[1] = 0;
  116356. r->z[2] = 0;
  116357. r->z[3] = 0;
  116358. r->z[4] = 0;
  116359. r->z[5] = 0;
  116360. r->z[6] = 0;
  116361. r->z[7] = 0;
  116362. r->z[8] = 0;
  116363. r->z[9] = 0;
  116364. r->z[10] = 0;
  116365. r->z[11] = 0;
  116366. r->z[12] = 0;
  116367. r->z[13] = 0;
  116368. r->z[14] = 0;
  116369. r->z[15] = 0;
  116370. r->z[16] = 0;
  116371. for (i = 1; i < 16; i++) {
  116372. mask = 0 - (i == idx);
  116373. r->x[0] |= mask & table[i].x[0];
  116374. r->x[1] |= mask & table[i].x[1];
  116375. r->x[2] |= mask & table[i].x[2];
  116376. r->x[3] |= mask & table[i].x[3];
  116377. r->x[4] |= mask & table[i].x[4];
  116378. r->x[5] |= mask & table[i].x[5];
  116379. r->x[6] |= mask & table[i].x[6];
  116380. r->x[7] |= mask & table[i].x[7];
  116381. r->x[8] |= mask & table[i].x[8];
  116382. r->x[9] |= mask & table[i].x[9];
  116383. r->x[10] |= mask & table[i].x[10];
  116384. r->x[11] |= mask & table[i].x[11];
  116385. r->x[12] |= mask & table[i].x[12];
  116386. r->x[13] |= mask & table[i].x[13];
  116387. r->x[14] |= mask & table[i].x[14];
  116388. r->x[15] |= mask & table[i].x[15];
  116389. r->x[16] |= mask & table[i].x[16];
  116390. r->y[0] |= mask & table[i].y[0];
  116391. r->y[1] |= mask & table[i].y[1];
  116392. r->y[2] |= mask & table[i].y[2];
  116393. r->y[3] |= mask & table[i].y[3];
  116394. r->y[4] |= mask & table[i].y[4];
  116395. r->y[5] |= mask & table[i].y[5];
  116396. r->y[6] |= mask & table[i].y[6];
  116397. r->y[7] |= mask & table[i].y[7];
  116398. r->y[8] |= mask & table[i].y[8];
  116399. r->y[9] |= mask & table[i].y[9];
  116400. r->y[10] |= mask & table[i].y[10];
  116401. r->y[11] |= mask & table[i].y[11];
  116402. r->y[12] |= mask & table[i].y[12];
  116403. r->y[13] |= mask & table[i].y[13];
  116404. r->y[14] |= mask & table[i].y[14];
  116405. r->y[15] |= mask & table[i].y[15];
  116406. r->y[16] |= mask & table[i].y[16];
  116407. r->z[0] |= mask & table[i].z[0];
  116408. r->z[1] |= mask & table[i].z[1];
  116409. r->z[2] |= mask & table[i].z[2];
  116410. r->z[3] |= mask & table[i].z[3];
  116411. r->z[4] |= mask & table[i].z[4];
  116412. r->z[5] |= mask & table[i].z[5];
  116413. r->z[6] |= mask & table[i].z[6];
  116414. r->z[7] |= mask & table[i].z[7];
  116415. r->z[8] |= mask & table[i].z[8];
  116416. r->z[9] |= mask & table[i].z[9];
  116417. r->z[10] |= mask & table[i].z[10];
  116418. r->z[11] |= mask & table[i].z[11];
  116419. r->z[12] |= mask & table[i].z[12];
  116420. r->z[13] |= mask & table[i].z[13];
  116421. r->z[14] |= mask & table[i].z[14];
  116422. r->z[15] |= mask & table[i].z[15];
  116423. r->z[16] |= mask & table[i].z[16];
  116424. }
  116425. }
  116426. #endif /* !WC_NO_CACHE_RESISTANT */
  116427. /* Multiply the point by the scalar and return the result.
  116428. * If map is true then convert result to affine coordinates.
  116429. *
  116430. * Fast implementation that generates a pre-computation table.
  116431. * 4 bits of window (no sliding!).
  116432. * Uses add and double for calculating table.
  116433. * 521 doubles.
  116434. * 143 adds.
  116435. *
  116436. * r Resulting point.
  116437. * g Point to multiply.
  116438. * k Scalar to multiply by.
  116439. * map Indicates whether to convert result to affine.
  116440. * ct Constant time required.
  116441. * heap Heap to use for allocation.
  116442. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  116443. */
  116444. static int sp_521_ecc_mulmod_fast_17(sp_point_521* r, const sp_point_521* g, const sp_digit* k,
  116445. int map, int ct, void* heap)
  116446. {
  116447. #ifdef WOLFSSL_SP_SMALL_STACK
  116448. sp_point_521* t = NULL;
  116449. sp_digit* tmp = NULL;
  116450. #else
  116451. sp_point_521 t[16 + 1];
  116452. sp_digit tmp[2 * 17 * 6];
  116453. #endif
  116454. sp_point_521* rt = NULL;
  116455. #ifndef WC_NO_CACHE_RESISTANT
  116456. #ifdef WOLFSSL_SP_SMALL_STACK
  116457. sp_point_521* p = NULL;
  116458. #else
  116459. sp_point_521 p[1];
  116460. #endif
  116461. #endif /* !WC_NO_CACHE_RESISTANT */
  116462. sp_digit n;
  116463. int i;
  116464. int c;
  116465. int y;
  116466. int err = MP_OKAY;
  116467. /* Constant time used for cache attack resistance implementation. */
  116468. (void)ct;
  116469. (void)heap;
  116470. #ifdef WOLFSSL_SP_SMALL_STACK
  116471. t = (sp_point_521*)XMALLOC(sizeof(sp_point_521) * (16 + 1),
  116472. heap, DYNAMIC_TYPE_ECC);
  116473. if (t == NULL)
  116474. err = MEMORY_E;
  116475. #ifndef WC_NO_CACHE_RESISTANT
  116476. if (err == MP_OKAY) {
  116477. p = (sp_point_521*)XMALLOC(sizeof(sp_point_521),
  116478. heap, DYNAMIC_TYPE_ECC);
  116479. if (p == NULL)
  116480. err = MEMORY_E;
  116481. }
  116482. #endif
  116483. if (err == MP_OKAY) {
  116484. tmp = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 17 * 6, heap,
  116485. DYNAMIC_TYPE_ECC);
  116486. if (tmp == NULL)
  116487. err = MEMORY_E;
  116488. }
  116489. #endif
  116490. if (err == MP_OKAY) {
  116491. rt = t + 16;
  116492. /* t[0] = {0, 0, 1} * norm */
  116493. XMEMSET(&t[0], 0, sizeof(t[0]));
  116494. t[0].infinity = 1;
  116495. /* t[1] = {g->x, g->y, g->z} * norm */
  116496. (void)sp_521_mod_mul_norm_17(t[1].x, g->x, p521_mod);
  116497. (void)sp_521_mod_mul_norm_17(t[1].y, g->y, p521_mod);
  116498. (void)sp_521_mod_mul_norm_17(t[1].z, g->z, p521_mod);
  116499. t[1].infinity = 0;
  116500. sp_521_proj_point_dbl_17(&t[ 2], &t[ 1], tmp);
  116501. t[ 2].infinity = 0;
  116502. sp_521_proj_point_add_17(&t[ 3], &t[ 2], &t[ 1], tmp);
  116503. t[ 3].infinity = 0;
  116504. sp_521_proj_point_dbl_17(&t[ 4], &t[ 2], tmp);
  116505. t[ 4].infinity = 0;
  116506. sp_521_proj_point_add_17(&t[ 5], &t[ 3], &t[ 2], tmp);
  116507. t[ 5].infinity = 0;
  116508. sp_521_proj_point_dbl_17(&t[ 6], &t[ 3], tmp);
  116509. t[ 6].infinity = 0;
  116510. sp_521_proj_point_add_17(&t[ 7], &t[ 4], &t[ 3], tmp);
  116511. t[ 7].infinity = 0;
  116512. sp_521_proj_point_dbl_17(&t[ 8], &t[ 4], tmp);
  116513. t[ 8].infinity = 0;
  116514. sp_521_proj_point_add_17(&t[ 9], &t[ 5], &t[ 4], tmp);
  116515. t[ 9].infinity = 0;
  116516. sp_521_proj_point_dbl_17(&t[10], &t[ 5], tmp);
  116517. t[10].infinity = 0;
  116518. sp_521_proj_point_add_17(&t[11], &t[ 6], &t[ 5], tmp);
  116519. t[11].infinity = 0;
  116520. sp_521_proj_point_dbl_17(&t[12], &t[ 6], tmp);
  116521. t[12].infinity = 0;
  116522. sp_521_proj_point_add_17(&t[13], &t[ 7], &t[ 6], tmp);
  116523. t[13].infinity = 0;
  116524. sp_521_proj_point_dbl_17(&t[14], &t[ 7], tmp);
  116525. t[14].infinity = 0;
  116526. sp_521_proj_point_add_17(&t[15], &t[ 8], &t[ 7], tmp);
  116527. t[15].infinity = 0;
  116528. i = 15;
  116529. n = k[i+1] << 0;
  116530. c = 5;
  116531. y = (int)(n >> 5);
  116532. #ifndef WC_NO_CACHE_RESISTANT
  116533. if (ct) {
  116534. sp_521_get_point_16_17(rt, t, y);
  116535. rt->infinity = !y;
  116536. }
  116537. else
  116538. #endif
  116539. {
  116540. XMEMCPY(rt, &t[y], sizeof(sp_point_521));
  116541. }
  116542. n <<= 27;
  116543. for (; i>=0 || c>=4; ) {
  116544. if (c < 4) {
  116545. n = (k[i+1] << 31) | (k[i] >> 1);
  116546. i--;
  116547. c += 32;
  116548. }
  116549. y = (n >> 28) & 0xf;
  116550. n <<= 4;
  116551. c -= 4;
  116552. sp_521_proj_point_dbl_17(rt, rt, tmp);
  116553. sp_521_proj_point_dbl_17(rt, rt, tmp);
  116554. sp_521_proj_point_dbl_17(rt, rt, tmp);
  116555. sp_521_proj_point_dbl_17(rt, rt, tmp);
  116556. #ifndef WC_NO_CACHE_RESISTANT
  116557. if (ct) {
  116558. sp_521_get_point_16_17(p, t, y);
  116559. p->infinity = !y;
  116560. sp_521_proj_point_add_17(rt, rt, p, tmp);
  116561. }
  116562. else
  116563. #endif
  116564. {
  116565. sp_521_proj_point_add_17(rt, rt, &t[y], tmp);
  116566. }
  116567. }
  116568. y = k[0] & 0x1;
  116569. sp_521_proj_point_dbl_17(rt, rt, tmp);
  116570. sp_521_proj_point_add_17(rt, rt, &t[y], tmp);
  116571. if (map != 0) {
  116572. sp_521_map_17(r, rt, tmp);
  116573. }
  116574. else {
  116575. XMEMCPY(r, rt, sizeof(sp_point_521));
  116576. }
  116577. }
  116578. #ifdef WOLFSSL_SP_SMALL_STACK
  116579. if (tmp != NULL)
  116580. #endif
  116581. {
  116582. ForceZero(tmp, sizeof(sp_digit) * 2 * 17 * 6);
  116583. #ifdef WOLFSSL_SP_SMALL_STACK
  116584. XFREE(tmp, heap, DYNAMIC_TYPE_ECC);
  116585. #endif
  116586. }
  116587. #ifndef WC_NO_CACHE_RESISTANT
  116588. #ifdef WOLFSSL_SP_SMALL_STACK
  116589. if (p != NULL)
  116590. #endif
  116591. {
  116592. ForceZero(p, sizeof(sp_point_521));
  116593. #ifdef WOLFSSL_SP_SMALL_STACK
  116594. XFREE(p, heap, DYNAMIC_TYPE_ECC);
  116595. #endif
  116596. }
  116597. #endif /* !WC_NO_CACHE_RESISTANT */
  116598. #ifdef WOLFSSL_SP_SMALL_STACK
  116599. if (t != NULL)
  116600. #endif
  116601. {
  116602. ForceZero(t, sizeof(sp_point_521) * 17);
  116603. #ifdef WOLFSSL_SP_SMALL_STACK
  116604. XFREE(t, heap, DYNAMIC_TYPE_ECC);
  116605. #endif
  116606. }
  116607. return err;
  116608. }
  116609. #ifdef FP_ECC
  116610. /* Double the Montgomery form projective point p a number of times.
  116611. *
  116612. * r Result of repeated doubling of point.
  116613. * p Point to double.
  116614. * n Number of times to double
  116615. * t Temporary ordinate data.
  116616. */
  116617. static void sp_521_proj_point_dbl_n_17(sp_point_521* p, int i,
  116618. sp_digit* t)
  116619. {
  116620. sp_digit* w = t;
  116621. sp_digit* a = t + 2*17;
  116622. sp_digit* b = t + 4*17;
  116623. sp_digit* t1 = t + 6*17;
  116624. sp_digit* t2 = t + 8*17;
  116625. sp_digit* x;
  116626. sp_digit* y;
  116627. sp_digit* z;
  116628. volatile int n = i;
  116629. x = p->x;
  116630. y = p->y;
  116631. z = p->z;
  116632. /* Y = 2*Y */
  116633. sp_521_mont_dbl_17(y, y, p521_mod);
  116634. /* W = Z^4 */
  116635. sp_521_mont_sqr_17(w, z, p521_mod, p521_mp_mod);
  116636. sp_521_mont_sqr_17(w, w, p521_mod, p521_mp_mod);
  116637. #ifndef WOLFSSL_SP_SMALL
  116638. while (--n > 0)
  116639. #else
  116640. while (--n >= 0)
  116641. #endif
  116642. {
  116643. /* A = 3*(X^2 - W) */
  116644. sp_521_mont_sqr_17(t1, x, p521_mod, p521_mp_mod);
  116645. sp_521_mont_sub_17(t1, t1, w, p521_mod);
  116646. sp_521_mont_tpl_17(a, t1, p521_mod);
  116647. /* B = X*Y^2 */
  116648. sp_521_mont_sqr_17(t1, y, p521_mod, p521_mp_mod);
  116649. sp_521_mont_mul_17(b, t1, x, p521_mod, p521_mp_mod);
  116650. /* X = A^2 - 2B */
  116651. sp_521_mont_sqr_17(x, a, p521_mod, p521_mp_mod);
  116652. sp_521_mont_dbl_17(t2, b, p521_mod);
  116653. sp_521_mont_sub_17(x, x, t2, p521_mod);
  116654. /* B = 2.(B - X) */
  116655. sp_521_mont_sub_17(t2, b, x, p521_mod);
  116656. sp_521_mont_dbl_17(b, t2, p521_mod);
  116657. /* Z = Z*Y */
  116658. sp_521_mont_mul_17(z, z, y, p521_mod, p521_mp_mod);
  116659. /* t1 = Y^4 */
  116660. sp_521_mont_sqr_17(t1, t1, p521_mod, p521_mp_mod);
  116661. #ifdef WOLFSSL_SP_SMALL
  116662. if (n != 0)
  116663. #endif
  116664. {
  116665. /* W = W*Y^4 */
  116666. sp_521_mont_mul_17(w, w, t1, p521_mod, p521_mp_mod);
  116667. }
  116668. /* y = 2*A*(B - X) - Y^4 */
  116669. sp_521_mont_mul_17(y, b, a, p521_mod, p521_mp_mod);
  116670. sp_521_mont_sub_17(y, y, t1, p521_mod);
  116671. }
  116672. #ifndef WOLFSSL_SP_SMALL
  116673. /* A = 3*(X^2 - W) */
  116674. sp_521_mont_sqr_17(t1, x, p521_mod, p521_mp_mod);
  116675. sp_521_mont_sub_17(t1, t1, w, p521_mod);
  116676. sp_521_mont_tpl_17(a, t1, p521_mod);
  116677. /* B = X*Y^2 */
  116678. sp_521_mont_sqr_17(t1, y, p521_mod, p521_mp_mod);
  116679. sp_521_mont_mul_17(b, t1, x, p521_mod, p521_mp_mod);
  116680. /* X = A^2 - 2B */
  116681. sp_521_mont_sqr_17(x, a, p521_mod, p521_mp_mod);
  116682. sp_521_mont_dbl_17(t2, b, p521_mod);
  116683. sp_521_mont_sub_17(x, x, t2, p521_mod);
  116684. /* B = 2.(B - X) */
  116685. sp_521_mont_sub_17(t2, b, x, p521_mod);
  116686. sp_521_mont_dbl_17(b, t2, p521_mod);
  116687. /* Z = Z*Y */
  116688. sp_521_mont_mul_17(z, z, y, p521_mod, p521_mp_mod);
  116689. /* t1 = Y^4 */
  116690. sp_521_mont_sqr_17(t1, t1, p521_mod, p521_mp_mod);
  116691. /* y = 2*A*(B - X) - Y^4 */
  116692. sp_521_mont_mul_17(y, b, a, p521_mod, p521_mp_mod);
  116693. sp_521_mont_sub_17(y, y, t1, p521_mod);
  116694. #endif /* WOLFSSL_SP_SMALL */
  116695. /* Y = Y/2 */
  116696. sp_521_mont_div2_17(y, y, p521_mod);
  116697. }
  116698. /* Convert the projective point to affine.
  116699. * Ordinates are in Montgomery form.
  116700. *
  116701. * a Point to convert.
  116702. * t Temporary data.
  116703. */
  116704. static void sp_521_proj_to_affine_17(sp_point_521* a, sp_digit* t)
  116705. {
  116706. sp_digit* t1 = t;
  116707. sp_digit* t2 = t + 2 * 17;
  116708. sp_digit* tmp = t + 4 * 17;
  116709. sp_521_mont_inv_17(t1, a->z, tmp);
  116710. sp_521_mont_sqr_17(t2, t1, p521_mod, p521_mp_mod);
  116711. sp_521_mont_mul_17(t1, t2, t1, p521_mod, p521_mp_mod);
  116712. sp_521_mont_mul_17(a->x, a->x, t2, p521_mod, p521_mp_mod);
  116713. sp_521_mont_mul_17(a->y, a->y, t1, p521_mod, p521_mp_mod);
  116714. XMEMCPY(a->z, p521_norm_mod, sizeof(p521_norm_mod));
  116715. }
  116716. #endif /* FP_ECC */
  116717. /* A table entry for pre-computed points. */
  116718. typedef struct sp_table_entry_521 {
  116719. sp_digit x[17];
  116720. sp_digit y[17];
  116721. } sp_table_entry_521;
  116722. #ifdef FP_ECC
  116723. #endif /* FP_ECC */
  116724. /* Add two Montgomery form projective points. The second point has a q value of
  116725. * one.
  116726. * Only the first point can be the same pointer as the result point.
  116727. *
  116728. * r Result of addition.
  116729. * p First point to add.
  116730. * q Second point to add.
  116731. * t Temporary ordinate data.
  116732. */
  116733. static void sp_521_proj_point_add_qz1_17(sp_point_521* r,
  116734. const sp_point_521* p, const sp_point_521* q, sp_digit* t)
  116735. {
  116736. sp_digit* t2 = t;
  116737. sp_digit* t3 = t + 2*17;
  116738. sp_digit* t6 = t + 4*17;
  116739. sp_digit* t1 = t + 6*17;
  116740. sp_digit* t4 = t + 8*17;
  116741. sp_digit* t5 = t + 10*17;
  116742. /* Calculate values to subtract from P->x and P->y. */
  116743. /* U2 = X2*Z1^2 */
  116744. sp_521_mont_sqr_17(t2, p->z, p521_mod, p521_mp_mod);
  116745. sp_521_mont_mul_17(t4, t2, p->z, p521_mod, p521_mp_mod);
  116746. sp_521_mont_mul_17(t2, t2, q->x, p521_mod, p521_mp_mod);
  116747. /* S2 = Y2*Z1^3 */
  116748. sp_521_mont_mul_17(t4, t4, q->y, p521_mod, p521_mp_mod);
  116749. if ((~p->infinity) & (~q->infinity) &
  116750. sp_521_cmp_equal_17(p->x, t2) &
  116751. sp_521_cmp_equal_17(p->y, t4)) {
  116752. sp_521_proj_point_dbl_17(r, p, t);
  116753. }
  116754. else {
  116755. sp_digit* x = t2;
  116756. sp_digit* y = t3;
  116757. sp_digit* z = t6;
  116758. /* H = U2 - X1 */
  116759. sp_521_mont_sub_17(t2, t2, p->x, p521_mod);
  116760. /* R = S2 - Y1 */
  116761. sp_521_mont_sub_17(t4, t4, p->y, p521_mod);
  116762. /* Z3 = H*Z1 */
  116763. sp_521_mont_mul_17(z, p->z, t2, p521_mod, p521_mp_mod);
  116764. /* X3 = R^2 - H^3 - 2*X1*H^2 */
  116765. sp_521_mont_sqr_17(t1, t2, p521_mod, p521_mp_mod);
  116766. sp_521_mont_mul_17(t3, p->x, t1, p521_mod, p521_mp_mod);
  116767. sp_521_mont_mul_17(t1, t1, t2, p521_mod, p521_mp_mod);
  116768. sp_521_mont_sqr_17(t2, t4, p521_mod, p521_mp_mod);
  116769. sp_521_mont_sub_17(t2, t2, t1, p521_mod);
  116770. sp_521_mont_dbl_17(t5, t3, p521_mod);
  116771. sp_521_mont_sub_17(x, t2, t5, p521_mod);
  116772. /* Y3 = R*(X1*H^2 - X3) - Y1*H^3 */
  116773. sp_521_mont_sub_17(t3, t3, x, p521_mod);
  116774. sp_521_mont_mul_17(t3, t3, t4, p521_mod, p521_mp_mod);
  116775. sp_521_mont_mul_17(t1, t1, p->y, p521_mod, p521_mp_mod);
  116776. sp_521_mont_sub_17(y, t3, t1, p521_mod);
  116777. {
  116778. int i;
  116779. sp_digit maskp = 0 - (q->infinity & (!p->infinity));
  116780. sp_digit maskq = 0 - (p->infinity & (!q->infinity));
  116781. sp_digit maskt = ~(maskp | maskq);
  116782. sp_digit inf = (sp_digit)(p->infinity & q->infinity);
  116783. for (i = 0; i < 17; i++) {
  116784. r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) |
  116785. (x[i] & maskt);
  116786. }
  116787. for (i = 0; i < 17; i++) {
  116788. r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) |
  116789. (y[i] & maskt);
  116790. }
  116791. for (i = 0; i < 17; i++) {
  116792. r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) |
  116793. (z[i] & maskt);
  116794. }
  116795. r->z[0] |= inf;
  116796. r->infinity = (word32)inf;
  116797. }
  116798. }
  116799. }
  116800. #ifdef WOLFSSL_SP_SMALL
  116801. #ifdef FP_ECC
  116802. /* Generate the pre-computed table of points for the base point.
  116803. *
  116804. * width = 4
  116805. * 16 entries
  116806. * 130 bits between
  116807. *
  116808. * a The base point.
  116809. * table Place to store generated point data.
  116810. * tmp Temporary data.
  116811. * heap Heap to use for allocation.
  116812. */
  116813. static int sp_521_gen_stripe_table_17(const sp_point_521* a,
  116814. sp_table_entry_521* table, sp_digit* tmp, void* heap)
  116815. {
  116816. #ifdef WOLFSSL_SP_SMALL_STACK
  116817. sp_point_521* t = NULL;
  116818. #else
  116819. sp_point_521 t[3];
  116820. #endif
  116821. sp_point_521* s1 = NULL;
  116822. sp_point_521* s2 = NULL;
  116823. int i;
  116824. int j;
  116825. int err = MP_OKAY;
  116826. (void)heap;
  116827. #ifdef WOLFSSL_SP_SMALL_STACK
  116828. t = (sp_point_521*)XMALLOC(sizeof(sp_point_521) * 3, heap,
  116829. DYNAMIC_TYPE_ECC);
  116830. if (t == NULL)
  116831. err = MEMORY_E;
  116832. #endif
  116833. if (err == MP_OKAY) {
  116834. s1 = t + 1;
  116835. s2 = t + 2;
  116836. err = sp_521_mod_mul_norm_17(t->x, a->x, p521_mod);
  116837. }
  116838. if (err == MP_OKAY) {
  116839. err = sp_521_mod_mul_norm_17(t->y, a->y, p521_mod);
  116840. }
  116841. if (err == MP_OKAY) {
  116842. err = sp_521_mod_mul_norm_17(t->z, a->z, p521_mod);
  116843. }
  116844. if (err == MP_OKAY) {
  116845. t->infinity = 0;
  116846. sp_521_proj_to_affine_17(t, tmp);
  116847. XMEMCPY(s1->z, p521_norm_mod, sizeof(p521_norm_mod));
  116848. s1->infinity = 0;
  116849. XMEMCPY(s2->z, p521_norm_mod, sizeof(p521_norm_mod));
  116850. s2->infinity = 0;
  116851. /* table[0] = {0, 0, infinity} */
  116852. XMEMSET(&table[0], 0, sizeof(sp_table_entry_521));
  116853. /* table[1] = Affine version of 'a' in Montgomery form */
  116854. XMEMCPY(table[1].x, t->x, sizeof(table->x));
  116855. XMEMCPY(table[1].y, t->y, sizeof(table->y));
  116856. for (i=1; i<4; i++) {
  116857. sp_521_proj_point_dbl_n_17(t, 131, tmp);
  116858. sp_521_proj_to_affine_17(t, tmp);
  116859. XMEMCPY(table[1<<i].x, t->x, sizeof(table->x));
  116860. XMEMCPY(table[1<<i].y, t->y, sizeof(table->y));
  116861. }
  116862. for (i=1; i<4; i++) {
  116863. XMEMCPY(s1->x, table[1<<i].x, sizeof(table->x));
  116864. XMEMCPY(s1->y, table[1<<i].y, sizeof(table->y));
  116865. for (j=(1<<i)+1; j<(1<<(i+1)); j++) {
  116866. XMEMCPY(s2->x, table[j-(1<<i)].x, sizeof(table->x));
  116867. XMEMCPY(s2->y, table[j-(1<<i)].y, sizeof(table->y));
  116868. sp_521_proj_point_add_qz1_17(t, s1, s2, tmp);
  116869. sp_521_proj_to_affine_17(t, tmp);
  116870. XMEMCPY(table[j].x, t->x, sizeof(table->x));
  116871. XMEMCPY(table[j].y, t->y, sizeof(table->y));
  116872. }
  116873. }
  116874. }
  116875. #ifdef WOLFSSL_SP_SMALL_STACK
  116876. if (t != NULL)
  116877. XFREE(t, heap, DYNAMIC_TYPE_ECC);
  116878. #endif
  116879. return err;
  116880. }
  116881. #endif /* FP_ECC */
  116882. #ifndef WC_NO_CACHE_RESISTANT
  116883. /* Touch each possible entry that could be being copied.
  116884. *
  116885. * r Point to copy into.
  116886. * table Table - start of the entries to access
  116887. * idx Index of entry to retrieve.
  116888. */
  116889. static void sp_521_get_entry_16_17(sp_point_521* r,
  116890. const sp_table_entry_521* table, int idx)
  116891. {
  116892. int i;
  116893. sp_digit mask;
  116894. r->x[0] = 0;
  116895. r->x[1] = 0;
  116896. r->x[2] = 0;
  116897. r->x[3] = 0;
  116898. r->x[4] = 0;
  116899. r->x[5] = 0;
  116900. r->x[6] = 0;
  116901. r->x[7] = 0;
  116902. r->x[8] = 0;
  116903. r->x[9] = 0;
  116904. r->x[10] = 0;
  116905. r->x[11] = 0;
  116906. r->x[12] = 0;
  116907. r->x[13] = 0;
  116908. r->x[14] = 0;
  116909. r->x[15] = 0;
  116910. r->x[16] = 0;
  116911. r->y[0] = 0;
  116912. r->y[1] = 0;
  116913. r->y[2] = 0;
  116914. r->y[3] = 0;
  116915. r->y[4] = 0;
  116916. r->y[5] = 0;
  116917. r->y[6] = 0;
  116918. r->y[7] = 0;
  116919. r->y[8] = 0;
  116920. r->y[9] = 0;
  116921. r->y[10] = 0;
  116922. r->y[11] = 0;
  116923. r->y[12] = 0;
  116924. r->y[13] = 0;
  116925. r->y[14] = 0;
  116926. r->y[15] = 0;
  116927. r->y[16] = 0;
  116928. for (i = 1; i < 16; i++) {
  116929. mask = 0 - (i == idx);
  116930. r->x[0] |= mask & table[i].x[0];
  116931. r->x[1] |= mask & table[i].x[1];
  116932. r->x[2] |= mask & table[i].x[2];
  116933. r->x[3] |= mask & table[i].x[3];
  116934. r->x[4] |= mask & table[i].x[4];
  116935. r->x[5] |= mask & table[i].x[5];
  116936. r->x[6] |= mask & table[i].x[6];
  116937. r->x[7] |= mask & table[i].x[7];
  116938. r->x[8] |= mask & table[i].x[8];
  116939. r->x[9] |= mask & table[i].x[9];
  116940. r->x[10] |= mask & table[i].x[10];
  116941. r->x[11] |= mask & table[i].x[11];
  116942. r->x[12] |= mask & table[i].x[12];
  116943. r->x[13] |= mask & table[i].x[13];
  116944. r->x[14] |= mask & table[i].x[14];
  116945. r->x[15] |= mask & table[i].x[15];
  116946. r->x[16] |= mask & table[i].x[16];
  116947. r->y[0] |= mask & table[i].y[0];
  116948. r->y[1] |= mask & table[i].y[1];
  116949. r->y[2] |= mask & table[i].y[2];
  116950. r->y[3] |= mask & table[i].y[3];
  116951. r->y[4] |= mask & table[i].y[4];
  116952. r->y[5] |= mask & table[i].y[5];
  116953. r->y[6] |= mask & table[i].y[6];
  116954. r->y[7] |= mask & table[i].y[7];
  116955. r->y[8] |= mask & table[i].y[8];
  116956. r->y[9] |= mask & table[i].y[9];
  116957. r->y[10] |= mask & table[i].y[10];
  116958. r->y[11] |= mask & table[i].y[11];
  116959. r->y[12] |= mask & table[i].y[12];
  116960. r->y[13] |= mask & table[i].y[13];
  116961. r->y[14] |= mask & table[i].y[14];
  116962. r->y[15] |= mask & table[i].y[15];
  116963. r->y[16] |= mask & table[i].y[16];
  116964. }
  116965. }
  116966. #endif /* !WC_NO_CACHE_RESISTANT */
  116967. /* Multiply the point by the scalar and return the result.
  116968. * If map is true then convert result to affine coordinates.
  116969. *
  116970. * Stripe implementation.
  116971. * Pre-generated: 2^0, 2^130, ...
  116972. * Pre-generated: products of all combinations of above.
  116973. * 4 doubles and adds (with qz=1)
  116974. *
  116975. * r Resulting point.
  116976. * k Scalar to multiply by.
  116977. * table Pre-computed table.
  116978. * map Indicates whether to convert result to affine.
  116979. * ct Constant time required.
  116980. * heap Heap to use for allocation.
  116981. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  116982. */
  116983. static int sp_521_ecc_mulmod_stripe_17(sp_point_521* r, const sp_point_521* g,
  116984. const sp_table_entry_521* table, const sp_digit* k, int map,
  116985. int ct, void* heap)
  116986. {
  116987. #ifdef WOLFSSL_SP_SMALL_STACK
  116988. sp_point_521* rt = NULL;
  116989. sp_digit* t = NULL;
  116990. #else
  116991. sp_point_521 rt[2];
  116992. sp_digit t[2 * 17 * 6];
  116993. #endif
  116994. sp_point_521* p = NULL;
  116995. int i;
  116996. int j;
  116997. int y;
  116998. int x;
  116999. int err = MP_OKAY;
  117000. (void)g;
  117001. /* Constant time used for cache attack resistance implementation. */
  117002. (void)ct;
  117003. (void)heap;
  117004. #ifdef WOLFSSL_SP_SMALL_STACK
  117005. rt = (sp_point_521*)XMALLOC(sizeof(sp_point_521) * 2, heap,
  117006. DYNAMIC_TYPE_ECC);
  117007. if (rt == NULL)
  117008. err = MEMORY_E;
  117009. if (err == MP_OKAY) {
  117010. t = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 17 * 6, heap,
  117011. DYNAMIC_TYPE_ECC);
  117012. if (t == NULL)
  117013. err = MEMORY_E;
  117014. }
  117015. #endif
  117016. if (err == MP_OKAY) {
  117017. p = rt + 1;
  117018. XMEMCPY(p->z, p521_norm_mod, sizeof(p521_norm_mod));
  117019. XMEMCPY(rt->z, p521_norm_mod, sizeof(p521_norm_mod));
  117020. y = 0;
  117021. x = 130;
  117022. for (j=0; j<4 && x<521; j++) {
  117023. y |= (int)(((k[x / 32] >> (x % 32)) & 1) << j);
  117024. x += 131;
  117025. }
  117026. #ifndef WC_NO_CACHE_RESISTANT
  117027. if (ct) {
  117028. sp_521_get_entry_16_17(rt, table, y);
  117029. } else
  117030. #endif
  117031. {
  117032. XMEMCPY(rt->x, table[y].x, sizeof(table[y].x));
  117033. XMEMCPY(rt->y, table[y].y, sizeof(table[y].y));
  117034. }
  117035. rt->infinity = !y;
  117036. for (i=129; i>=0; i--) {
  117037. y = 0;
  117038. x = i;
  117039. for (j=0; j<4 && x<521; j++) {
  117040. y |= (int)(((k[x / 32] >> (x % 32)) & 1) << j);
  117041. x += 131;
  117042. }
  117043. sp_521_proj_point_dbl_17(rt, rt, t);
  117044. #ifndef WC_NO_CACHE_RESISTANT
  117045. if (ct) {
  117046. sp_521_get_entry_16_17(p, table, y);
  117047. }
  117048. else
  117049. #endif
  117050. {
  117051. XMEMCPY(p->x, table[y].x, sizeof(table[y].x));
  117052. XMEMCPY(p->y, table[y].y, sizeof(table[y].y));
  117053. }
  117054. p->infinity = !y;
  117055. sp_521_proj_point_add_qz1_17(rt, rt, p, t);
  117056. }
  117057. if (map != 0) {
  117058. sp_521_map_17(r, rt, t);
  117059. }
  117060. else {
  117061. XMEMCPY(r, rt, sizeof(sp_point_521));
  117062. }
  117063. }
  117064. #ifdef WOLFSSL_SP_SMALL_STACK
  117065. if (t != NULL)
  117066. XFREE(t, heap, DYNAMIC_TYPE_ECC);
  117067. if (rt != NULL)
  117068. XFREE(rt, heap, DYNAMIC_TYPE_ECC);
  117069. #endif
  117070. return err;
  117071. }
  117072. #ifdef FP_ECC
  117073. #ifndef FP_ENTRIES
  117074. #define FP_ENTRIES 16
  117075. #endif
  117076. /* Cache entry - holds precomputation tables for a point. */
  117077. typedef struct sp_cache_521_t {
  117078. /* X ordinate of point that table was generated from. */
  117079. sp_digit x[17];
  117080. /* Y ordinate of point that table was generated from. */
  117081. sp_digit y[17];
  117082. /* Precomputation table for point. */
  117083. sp_table_entry_521 table[16];
  117084. /* Count of entries in table. */
  117085. uint32_t cnt;
  117086. /* Point and table set in entry. */
  117087. int set;
  117088. } sp_cache_521_t;
  117089. /* Cache of tables. */
  117090. static THREAD_LS_T sp_cache_521_t sp_cache_521[FP_ENTRIES];
  117091. /* Index of last entry in cache. */
  117092. static THREAD_LS_T int sp_cache_521_last = -1;
  117093. /* Cache has been initialized. */
  117094. static THREAD_LS_T int sp_cache_521_inited = 0;
  117095. #ifndef HAVE_THREAD_LS
  117096. static volatile int initCacheMutex_521 = 0;
  117097. static wolfSSL_Mutex sp_cache_521_lock;
  117098. #endif
  117099. /* Get the cache entry for the point.
  117100. *
  117101. * g [in] Point scalar multiplying.
  117102. * cache [out] Cache table to use.
  117103. */
  117104. static void sp_ecc_get_cache_521(const sp_point_521* g, sp_cache_521_t** cache)
  117105. {
  117106. int i;
  117107. int j;
  117108. uint32_t least;
  117109. if (sp_cache_521_inited == 0) {
  117110. for (i=0; i<FP_ENTRIES; i++) {
  117111. sp_cache_521[i].set = 0;
  117112. }
  117113. sp_cache_521_inited = 1;
  117114. }
  117115. /* Compare point with those in cache. */
  117116. for (i=0; i<FP_ENTRIES; i++) {
  117117. if (!sp_cache_521[i].set)
  117118. continue;
  117119. if (sp_521_cmp_equal_17(g->x, sp_cache_521[i].x) &
  117120. sp_521_cmp_equal_17(g->y, sp_cache_521[i].y)) {
  117121. sp_cache_521[i].cnt++;
  117122. break;
  117123. }
  117124. }
  117125. /* No match. */
  117126. if (i == FP_ENTRIES) {
  117127. /* Find empty entry. */
  117128. i = (sp_cache_521_last + 1) % FP_ENTRIES;
  117129. for (; i != sp_cache_521_last; i=(i+1)%FP_ENTRIES) {
  117130. if (!sp_cache_521[i].set) {
  117131. break;
  117132. }
  117133. }
  117134. /* Evict least used. */
  117135. if (i == sp_cache_521_last) {
  117136. least = sp_cache_521[0].cnt;
  117137. for (j=1; j<FP_ENTRIES; j++) {
  117138. if (sp_cache_521[j].cnt < least) {
  117139. i = j;
  117140. least = sp_cache_521[i].cnt;
  117141. }
  117142. }
  117143. }
  117144. XMEMCPY(sp_cache_521[i].x, g->x, sizeof(sp_cache_521[i].x));
  117145. XMEMCPY(sp_cache_521[i].y, g->y, sizeof(sp_cache_521[i].y));
  117146. sp_cache_521[i].set = 1;
  117147. sp_cache_521[i].cnt = 1;
  117148. }
  117149. *cache = &sp_cache_521[i];
  117150. sp_cache_521_last = i;
  117151. }
  117152. #endif /* FP_ECC */
  117153. /* Multiply the base point of P521 by the scalar and return the result.
  117154. * If map is true then convert result to affine coordinates.
  117155. *
  117156. * r Resulting point.
  117157. * g Point to multiply.
  117158. * k Scalar to multiply by.
  117159. * map Indicates whether to convert result to affine.
  117160. * ct Constant time required.
  117161. * heap Heap to use for allocation.
  117162. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  117163. */
  117164. static int sp_521_ecc_mulmod_17(sp_point_521* r, const sp_point_521* g,
  117165. const sp_digit* k, int map, int ct, void* heap)
  117166. {
  117167. #ifndef FP_ECC
  117168. return sp_521_ecc_mulmod_fast_17(r, g, k, map, ct, heap);
  117169. #else
  117170. #ifdef WOLFSSL_SP_SMALL_STACK
  117171. sp_digit* tmp;
  117172. #else
  117173. sp_digit tmp[2 * 17 * 6];
  117174. #endif
  117175. sp_cache_521_t* cache;
  117176. int err = MP_OKAY;
  117177. #ifdef WOLFSSL_SP_SMALL_STACK
  117178. tmp = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 17 * 6, heap, DYNAMIC_TYPE_ECC);
  117179. if (tmp == NULL) {
  117180. err = MEMORY_E;
  117181. }
  117182. #endif
  117183. #ifndef HAVE_THREAD_LS
  117184. if (err == MP_OKAY) {
  117185. if (initCacheMutex_521 == 0) {
  117186. wc_InitMutex(&sp_cache_521_lock);
  117187. initCacheMutex_521 = 1;
  117188. }
  117189. if (wc_LockMutex(&sp_cache_521_lock) != 0) {
  117190. err = BAD_MUTEX_E;
  117191. }
  117192. }
  117193. #endif /* HAVE_THREAD_LS */
  117194. if (err == MP_OKAY) {
  117195. sp_ecc_get_cache_521(g, &cache);
  117196. if (cache->cnt == 2)
  117197. sp_521_gen_stripe_table_17(g, cache->table, tmp, heap);
  117198. #ifndef HAVE_THREAD_LS
  117199. wc_UnLockMutex(&sp_cache_521_lock);
  117200. #endif /* HAVE_THREAD_LS */
  117201. if (cache->cnt < 2) {
  117202. err = sp_521_ecc_mulmod_fast_17(r, g, k, map, ct, heap);
  117203. }
  117204. else {
  117205. err = sp_521_ecc_mulmod_stripe_17(r, g, cache->table, k,
  117206. map, ct, heap);
  117207. }
  117208. }
  117209. #ifdef WOLFSSL_SP_SMALL_STACK
  117210. XFREE(tmp, heap, DYNAMIC_TYPE_ECC);
  117211. #endif
  117212. return err;
  117213. #endif
  117214. }
  117215. #else
  117216. #ifdef FP_ECC
  117217. /* Generate the pre-computed table of points for the base point.
  117218. *
  117219. * width = 8
  117220. * 256 entries
  117221. * 65 bits between
  117222. *
  117223. * a The base point.
  117224. * table Place to store generated point data.
  117225. * tmp Temporary data.
  117226. * heap Heap to use for allocation.
  117227. */
  117228. static int sp_521_gen_stripe_table_17(const sp_point_521* a,
  117229. sp_table_entry_521* table, sp_digit* tmp, void* heap)
  117230. {
  117231. #ifdef WOLFSSL_SP_SMALL_STACK
  117232. sp_point_521* t = NULL;
  117233. #else
  117234. sp_point_521 t[3];
  117235. #endif
  117236. sp_point_521* s1 = NULL;
  117237. sp_point_521* s2 = NULL;
  117238. int i;
  117239. int j;
  117240. int err = MP_OKAY;
  117241. (void)heap;
  117242. #ifdef WOLFSSL_SP_SMALL_STACK
  117243. t = (sp_point_521*)XMALLOC(sizeof(sp_point_521) * 3, heap,
  117244. DYNAMIC_TYPE_ECC);
  117245. if (t == NULL)
  117246. err = MEMORY_E;
  117247. #endif
  117248. if (err == MP_OKAY) {
  117249. s1 = t + 1;
  117250. s2 = t + 2;
  117251. err = sp_521_mod_mul_norm_17(t->x, a->x, p521_mod);
  117252. }
  117253. if (err == MP_OKAY) {
  117254. err = sp_521_mod_mul_norm_17(t->y, a->y, p521_mod);
  117255. }
  117256. if (err == MP_OKAY) {
  117257. err = sp_521_mod_mul_norm_17(t->z, a->z, p521_mod);
  117258. }
  117259. if (err == MP_OKAY) {
  117260. t->infinity = 0;
  117261. sp_521_proj_to_affine_17(t, tmp);
  117262. XMEMCPY(s1->z, p521_norm_mod, sizeof(p521_norm_mod));
  117263. s1->infinity = 0;
  117264. XMEMCPY(s2->z, p521_norm_mod, sizeof(p521_norm_mod));
  117265. s2->infinity = 0;
  117266. /* table[0] = {0, 0, infinity} */
  117267. XMEMSET(&table[0], 0, sizeof(sp_table_entry_521));
  117268. /* table[1] = Affine version of 'a' in Montgomery form */
  117269. XMEMCPY(table[1].x, t->x, sizeof(table->x));
  117270. XMEMCPY(table[1].y, t->y, sizeof(table->y));
  117271. for (i=1; i<8; i++) {
  117272. sp_521_proj_point_dbl_n_17(t, 66, tmp);
  117273. sp_521_proj_to_affine_17(t, tmp);
  117274. XMEMCPY(table[1<<i].x, t->x, sizeof(table->x));
  117275. XMEMCPY(table[1<<i].y, t->y, sizeof(table->y));
  117276. }
  117277. for (i=1; i<8; i++) {
  117278. XMEMCPY(s1->x, table[1<<i].x, sizeof(table->x));
  117279. XMEMCPY(s1->y, table[1<<i].y, sizeof(table->y));
  117280. for (j=(1<<i)+1; j<(1<<(i+1)); j++) {
  117281. XMEMCPY(s2->x, table[j-(1<<i)].x, sizeof(table->x));
  117282. XMEMCPY(s2->y, table[j-(1<<i)].y, sizeof(table->y));
  117283. sp_521_proj_point_add_qz1_17(t, s1, s2, tmp);
  117284. sp_521_proj_to_affine_17(t, tmp);
  117285. XMEMCPY(table[j].x, t->x, sizeof(table->x));
  117286. XMEMCPY(table[j].y, t->y, sizeof(table->y));
  117287. }
  117288. }
  117289. }
  117290. #ifdef WOLFSSL_SP_SMALL_STACK
  117291. if (t != NULL)
  117292. XFREE(t, heap, DYNAMIC_TYPE_ECC);
  117293. #endif
  117294. return err;
  117295. }
  117296. #endif /* FP_ECC */
  117297. #ifndef WC_NO_CACHE_RESISTANT
  117298. /* Touch each possible entry that could be being copied.
  117299. *
  117300. * r Point to copy into.
  117301. * table Table - start of the entries to access
  117302. * idx Index of entry to retrieve.
  117303. */
  117304. static void sp_521_get_entry_256_17(sp_point_521* r,
  117305. const sp_table_entry_521* table, int idx)
  117306. {
  117307. int i;
  117308. sp_digit mask;
  117309. r->x[0] = 0;
  117310. r->x[1] = 0;
  117311. r->x[2] = 0;
  117312. r->x[3] = 0;
  117313. r->x[4] = 0;
  117314. r->x[5] = 0;
  117315. r->x[6] = 0;
  117316. r->x[7] = 0;
  117317. r->x[8] = 0;
  117318. r->x[9] = 0;
  117319. r->x[10] = 0;
  117320. r->x[11] = 0;
  117321. r->x[12] = 0;
  117322. r->x[13] = 0;
  117323. r->x[14] = 0;
  117324. r->x[15] = 0;
  117325. r->x[16] = 0;
  117326. r->y[0] = 0;
  117327. r->y[1] = 0;
  117328. r->y[2] = 0;
  117329. r->y[3] = 0;
  117330. r->y[4] = 0;
  117331. r->y[5] = 0;
  117332. r->y[6] = 0;
  117333. r->y[7] = 0;
  117334. r->y[8] = 0;
  117335. r->y[9] = 0;
  117336. r->y[10] = 0;
  117337. r->y[11] = 0;
  117338. r->y[12] = 0;
  117339. r->y[13] = 0;
  117340. r->y[14] = 0;
  117341. r->y[15] = 0;
  117342. r->y[16] = 0;
  117343. for (i = 1; i < 256; i++) {
  117344. mask = 0 - (i == idx);
  117345. r->x[0] |= mask & table[i].x[0];
  117346. r->x[1] |= mask & table[i].x[1];
  117347. r->x[2] |= mask & table[i].x[2];
  117348. r->x[3] |= mask & table[i].x[3];
  117349. r->x[4] |= mask & table[i].x[4];
  117350. r->x[5] |= mask & table[i].x[5];
  117351. r->x[6] |= mask & table[i].x[6];
  117352. r->x[7] |= mask & table[i].x[7];
  117353. r->x[8] |= mask & table[i].x[8];
  117354. r->x[9] |= mask & table[i].x[9];
  117355. r->x[10] |= mask & table[i].x[10];
  117356. r->x[11] |= mask & table[i].x[11];
  117357. r->x[12] |= mask & table[i].x[12];
  117358. r->x[13] |= mask & table[i].x[13];
  117359. r->x[14] |= mask & table[i].x[14];
  117360. r->x[15] |= mask & table[i].x[15];
  117361. r->x[16] |= mask & table[i].x[16];
  117362. r->y[0] |= mask & table[i].y[0];
  117363. r->y[1] |= mask & table[i].y[1];
  117364. r->y[2] |= mask & table[i].y[2];
  117365. r->y[3] |= mask & table[i].y[3];
  117366. r->y[4] |= mask & table[i].y[4];
  117367. r->y[5] |= mask & table[i].y[5];
  117368. r->y[6] |= mask & table[i].y[6];
  117369. r->y[7] |= mask & table[i].y[7];
  117370. r->y[8] |= mask & table[i].y[8];
  117371. r->y[9] |= mask & table[i].y[9];
  117372. r->y[10] |= mask & table[i].y[10];
  117373. r->y[11] |= mask & table[i].y[11];
  117374. r->y[12] |= mask & table[i].y[12];
  117375. r->y[13] |= mask & table[i].y[13];
  117376. r->y[14] |= mask & table[i].y[14];
  117377. r->y[15] |= mask & table[i].y[15];
  117378. r->y[16] |= mask & table[i].y[16];
  117379. }
  117380. }
  117381. #endif /* !WC_NO_CACHE_RESISTANT */
  117382. /* Multiply the point by the scalar and return the result.
  117383. * If map is true then convert result to affine coordinates.
  117384. *
  117385. * Stripe implementation.
  117386. * Pre-generated: 2^0, 2^65, ...
  117387. * Pre-generated: products of all combinations of above.
  117388. * 8 doubles and adds (with qz=1)
  117389. *
  117390. * r Resulting point.
  117391. * k Scalar to multiply by.
  117392. * table Pre-computed table.
  117393. * map Indicates whether to convert result to affine.
  117394. * ct Constant time required.
  117395. * heap Heap to use for allocation.
  117396. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  117397. */
  117398. static int sp_521_ecc_mulmod_stripe_17(sp_point_521* r, const sp_point_521* g,
  117399. const sp_table_entry_521* table, const sp_digit* k, int map,
  117400. int ct, void* heap)
  117401. {
  117402. #ifdef WOLFSSL_SP_SMALL_STACK
  117403. sp_point_521* rt = NULL;
  117404. sp_digit* t = NULL;
  117405. #else
  117406. sp_point_521 rt[2];
  117407. sp_digit t[2 * 17 * 6];
  117408. #endif
  117409. sp_point_521* p = NULL;
  117410. int i;
  117411. int j;
  117412. int y;
  117413. int x;
  117414. int err = MP_OKAY;
  117415. (void)g;
  117416. /* Constant time used for cache attack resistance implementation. */
  117417. (void)ct;
  117418. (void)heap;
  117419. #ifdef WOLFSSL_SP_SMALL_STACK
  117420. rt = (sp_point_521*)XMALLOC(sizeof(sp_point_521) * 2, heap,
  117421. DYNAMIC_TYPE_ECC);
  117422. if (rt == NULL)
  117423. err = MEMORY_E;
  117424. if (err == MP_OKAY) {
  117425. t = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 17 * 6, heap,
  117426. DYNAMIC_TYPE_ECC);
  117427. if (t == NULL)
  117428. err = MEMORY_E;
  117429. }
  117430. #endif
  117431. if (err == MP_OKAY) {
  117432. p = rt + 1;
  117433. XMEMCPY(p->z, p521_norm_mod, sizeof(p521_norm_mod));
  117434. XMEMCPY(rt->z, p521_norm_mod, sizeof(p521_norm_mod));
  117435. y = 0;
  117436. x = 65;
  117437. for (j=0; j<8 && x<521; j++) {
  117438. y |= (int)(((k[x / 32] >> (x % 32)) & 1) << j);
  117439. x += 66;
  117440. }
  117441. #ifndef WC_NO_CACHE_RESISTANT
  117442. if (ct) {
  117443. sp_521_get_entry_256_17(rt, table, y);
  117444. } else
  117445. #endif
  117446. {
  117447. XMEMCPY(rt->x, table[y].x, sizeof(table[y].x));
  117448. XMEMCPY(rt->y, table[y].y, sizeof(table[y].y));
  117449. }
  117450. rt->infinity = !y;
  117451. for (i=64; i>=0; i--) {
  117452. y = 0;
  117453. x = i;
  117454. for (j=0; j<8 && x<521; j++) {
  117455. y |= (int)(((k[x / 32] >> (x % 32)) & 1) << j);
  117456. x += 66;
  117457. }
  117458. sp_521_proj_point_dbl_17(rt, rt, t);
  117459. #ifndef WC_NO_CACHE_RESISTANT
  117460. if (ct) {
  117461. sp_521_get_entry_256_17(p, table, y);
  117462. }
  117463. else
  117464. #endif
  117465. {
  117466. XMEMCPY(p->x, table[y].x, sizeof(table[y].x));
  117467. XMEMCPY(p->y, table[y].y, sizeof(table[y].y));
  117468. }
  117469. p->infinity = !y;
  117470. sp_521_proj_point_add_qz1_17(rt, rt, p, t);
  117471. }
  117472. if (map != 0) {
  117473. sp_521_map_17(r, rt, t);
  117474. }
  117475. else {
  117476. XMEMCPY(r, rt, sizeof(sp_point_521));
  117477. }
  117478. }
  117479. #ifdef WOLFSSL_SP_SMALL_STACK
  117480. if (t != NULL)
  117481. XFREE(t, heap, DYNAMIC_TYPE_ECC);
  117482. if (rt != NULL)
  117483. XFREE(rt, heap, DYNAMIC_TYPE_ECC);
  117484. #endif
  117485. return err;
  117486. }
  117487. #ifdef FP_ECC
  117488. #ifndef FP_ENTRIES
  117489. #define FP_ENTRIES 16
  117490. #endif
  117491. /* Cache entry - holds precomputation tables for a point. */
  117492. typedef struct sp_cache_521_t {
  117493. /* X ordinate of point that table was generated from. */
  117494. sp_digit x[17];
  117495. /* Y ordinate of point that table was generated from. */
  117496. sp_digit y[17];
  117497. /* Precomputation table for point. */
  117498. sp_table_entry_521 table[256];
  117499. /* Count of entries in table. */
  117500. uint32_t cnt;
  117501. /* Point and table set in entry. */
  117502. int set;
  117503. } sp_cache_521_t;
  117504. /* Cache of tables. */
  117505. static THREAD_LS_T sp_cache_521_t sp_cache_521[FP_ENTRIES];
  117506. /* Index of last entry in cache. */
  117507. static THREAD_LS_T int sp_cache_521_last = -1;
  117508. /* Cache has been initialized. */
  117509. static THREAD_LS_T int sp_cache_521_inited = 0;
  117510. #ifndef HAVE_THREAD_LS
  117511. static volatile int initCacheMutex_521 = 0;
  117512. static wolfSSL_Mutex sp_cache_521_lock;
  117513. #endif
  117514. /* Get the cache entry for the point.
  117515. *
  117516. * g [in] Point scalar multiplying.
  117517. * cache [out] Cache table to use.
  117518. */
  117519. static void sp_ecc_get_cache_521(const sp_point_521* g, sp_cache_521_t** cache)
  117520. {
  117521. int i;
  117522. int j;
  117523. uint32_t least;
  117524. if (sp_cache_521_inited == 0) {
  117525. for (i=0; i<FP_ENTRIES; i++) {
  117526. sp_cache_521[i].set = 0;
  117527. }
  117528. sp_cache_521_inited = 1;
  117529. }
  117530. /* Compare point with those in cache. */
  117531. for (i=0; i<FP_ENTRIES; i++) {
  117532. if (!sp_cache_521[i].set)
  117533. continue;
  117534. if (sp_521_cmp_equal_17(g->x, sp_cache_521[i].x) &
  117535. sp_521_cmp_equal_17(g->y, sp_cache_521[i].y)) {
  117536. sp_cache_521[i].cnt++;
  117537. break;
  117538. }
  117539. }
  117540. /* No match. */
  117541. if (i == FP_ENTRIES) {
  117542. /* Find empty entry. */
  117543. i = (sp_cache_521_last + 1) % FP_ENTRIES;
  117544. for (; i != sp_cache_521_last; i=(i+1)%FP_ENTRIES) {
  117545. if (!sp_cache_521[i].set) {
  117546. break;
  117547. }
  117548. }
  117549. /* Evict least used. */
  117550. if (i == sp_cache_521_last) {
  117551. least = sp_cache_521[0].cnt;
  117552. for (j=1; j<FP_ENTRIES; j++) {
  117553. if (sp_cache_521[j].cnt < least) {
  117554. i = j;
  117555. least = sp_cache_521[i].cnt;
  117556. }
  117557. }
  117558. }
  117559. XMEMCPY(sp_cache_521[i].x, g->x, sizeof(sp_cache_521[i].x));
  117560. XMEMCPY(sp_cache_521[i].y, g->y, sizeof(sp_cache_521[i].y));
  117561. sp_cache_521[i].set = 1;
  117562. sp_cache_521[i].cnt = 1;
  117563. }
  117564. *cache = &sp_cache_521[i];
  117565. sp_cache_521_last = i;
  117566. }
  117567. #endif /* FP_ECC */
  117568. /* Multiply the base point of P521 by the scalar and return the result.
  117569. * If map is true then convert result to affine coordinates.
  117570. *
  117571. * r Resulting point.
  117572. * g Point to multiply.
  117573. * k Scalar to multiply by.
  117574. * map Indicates whether to convert result to affine.
  117575. * ct Constant time required.
  117576. * heap Heap to use for allocation.
  117577. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  117578. */
  117579. static int sp_521_ecc_mulmod_17(sp_point_521* r, const sp_point_521* g,
  117580. const sp_digit* k, int map, int ct, void* heap)
  117581. {
  117582. #ifndef FP_ECC
  117583. return sp_521_ecc_mulmod_fast_17(r, g, k, map, ct, heap);
  117584. #else
  117585. #ifdef WOLFSSL_SP_SMALL_STACK
  117586. sp_digit* tmp;
  117587. #else
  117588. sp_digit tmp[2 * 17 * 6];
  117589. #endif
  117590. sp_cache_521_t* cache;
  117591. int err = MP_OKAY;
  117592. #ifdef WOLFSSL_SP_SMALL_STACK
  117593. tmp = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 17 * 6, heap, DYNAMIC_TYPE_ECC);
  117594. if (tmp == NULL) {
  117595. err = MEMORY_E;
  117596. }
  117597. #endif
  117598. #ifndef HAVE_THREAD_LS
  117599. if (err == MP_OKAY) {
  117600. if (initCacheMutex_521 == 0) {
  117601. wc_InitMutex(&sp_cache_521_lock);
  117602. initCacheMutex_521 = 1;
  117603. }
  117604. if (wc_LockMutex(&sp_cache_521_lock) != 0) {
  117605. err = BAD_MUTEX_E;
  117606. }
  117607. }
  117608. #endif /* HAVE_THREAD_LS */
  117609. if (err == MP_OKAY) {
  117610. sp_ecc_get_cache_521(g, &cache);
  117611. if (cache->cnt == 2)
  117612. sp_521_gen_stripe_table_17(g, cache->table, tmp, heap);
  117613. #ifndef HAVE_THREAD_LS
  117614. wc_UnLockMutex(&sp_cache_521_lock);
  117615. #endif /* HAVE_THREAD_LS */
  117616. if (cache->cnt < 2) {
  117617. err = sp_521_ecc_mulmod_fast_17(r, g, k, map, ct, heap);
  117618. }
  117619. else {
  117620. err = sp_521_ecc_mulmod_stripe_17(r, g, cache->table, k,
  117621. map, ct, heap);
  117622. }
  117623. }
  117624. #ifdef WOLFSSL_SP_SMALL_STACK
  117625. XFREE(tmp, heap, DYNAMIC_TYPE_ECC);
  117626. #endif
  117627. return err;
  117628. #endif
  117629. }
  117630. #endif /* WOLFSSL_SP_SMALL */
  117631. /* Multiply the point by the scalar and return the result.
  117632. * If map is true then convert result to affine coordinates.
  117633. *
  117634. * km Scalar to multiply by.
  117635. * p Point to multiply.
  117636. * r Resulting point.
  117637. * map Indicates whether to convert result to affine.
  117638. * heap Heap to use for allocation.
  117639. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  117640. */
  117641. int sp_ecc_mulmod_521(const mp_int* km, const ecc_point* gm, ecc_point* r,
  117642. int map, void* heap)
  117643. {
  117644. #ifdef WOLFSSL_SP_SMALL_STACK
  117645. sp_point_521* point = NULL;
  117646. sp_digit* k = NULL;
  117647. #else
  117648. sp_point_521 point[1];
  117649. sp_digit k[17];
  117650. #endif
  117651. int err = MP_OKAY;
  117652. #ifdef WOLFSSL_SP_SMALL_STACK
  117653. point = (sp_point_521*)XMALLOC(sizeof(sp_point_521), heap,
  117654. DYNAMIC_TYPE_ECC);
  117655. if (point == NULL)
  117656. err = MEMORY_E;
  117657. if (err == MP_OKAY) {
  117658. k = (sp_digit*)XMALLOC(sizeof(sp_digit) * 17, heap,
  117659. DYNAMIC_TYPE_ECC);
  117660. if (k == NULL)
  117661. err = MEMORY_E;
  117662. }
  117663. #endif
  117664. if (err == MP_OKAY) {
  117665. sp_521_from_mp(k, 17, km);
  117666. sp_521_point_from_ecc_point_17(point, gm);
  117667. err = sp_521_ecc_mulmod_17(point, point, k, map, 1, heap);
  117668. }
  117669. if (err == MP_OKAY) {
  117670. err = sp_521_point_to_ecc_point_17(point, r);
  117671. }
  117672. #ifdef WOLFSSL_SP_SMALL_STACK
  117673. if (k != NULL)
  117674. XFREE(k, heap, DYNAMIC_TYPE_ECC);
  117675. if (point != NULL)
  117676. XFREE(point, heap, DYNAMIC_TYPE_ECC);
  117677. #endif
  117678. return err;
  117679. }
  117680. /* Multiply the point by the scalar, add point a and return the result.
  117681. * If map is true then convert result to affine coordinates.
  117682. *
  117683. * km Scalar to multiply by.
  117684. * p Point to multiply.
  117685. * am Point to add to scalar multiply result.
  117686. * inMont Point to add is in montgomery form.
  117687. * r Resulting point.
  117688. * map Indicates whether to convert result to affine.
  117689. * heap Heap to use for allocation.
  117690. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  117691. */
  117692. int sp_ecc_mulmod_add_521(const mp_int* km, const ecc_point* gm,
  117693. const ecc_point* am, int inMont, ecc_point* r, int map, void* heap)
  117694. {
  117695. #ifdef WOLFSSL_SP_SMALL_STACK
  117696. sp_point_521* point = NULL;
  117697. sp_digit* k = NULL;
  117698. #else
  117699. sp_point_521 point[2];
  117700. sp_digit k[17 + 17 * 2 * 6];
  117701. #endif
  117702. sp_point_521* addP = NULL;
  117703. sp_digit* tmp = NULL;
  117704. int err = MP_OKAY;
  117705. #ifdef WOLFSSL_SP_SMALL_STACK
  117706. point = (sp_point_521*)XMALLOC(sizeof(sp_point_521) * 2, heap,
  117707. DYNAMIC_TYPE_ECC);
  117708. if (point == NULL)
  117709. err = MEMORY_E;
  117710. if (err == MP_OKAY) {
  117711. k = (sp_digit*)XMALLOC(
  117712. sizeof(sp_digit) * (17 + 17 * 2 * 6), heap,
  117713. DYNAMIC_TYPE_ECC);
  117714. if (k == NULL)
  117715. err = MEMORY_E;
  117716. }
  117717. #endif
  117718. if (err == MP_OKAY) {
  117719. addP = point + 1;
  117720. tmp = k + 17;
  117721. sp_521_from_mp(k, 17, km);
  117722. sp_521_point_from_ecc_point_17(point, gm);
  117723. sp_521_point_from_ecc_point_17(addP, am);
  117724. }
  117725. if ((err == MP_OKAY) && (!inMont)) {
  117726. err = sp_521_mod_mul_norm_17(addP->x, addP->x, p521_mod);
  117727. }
  117728. if ((err == MP_OKAY) && (!inMont)) {
  117729. err = sp_521_mod_mul_norm_17(addP->y, addP->y, p521_mod);
  117730. }
  117731. if ((err == MP_OKAY) && (!inMont)) {
  117732. err = sp_521_mod_mul_norm_17(addP->z, addP->z, p521_mod);
  117733. }
  117734. if (err == MP_OKAY) {
  117735. err = sp_521_ecc_mulmod_17(point, point, k, 0, 0, heap);
  117736. }
  117737. if (err == MP_OKAY) {
  117738. sp_521_proj_point_add_17(point, point, addP, tmp);
  117739. if (map) {
  117740. sp_521_map_17(point, point, tmp);
  117741. }
  117742. err = sp_521_point_to_ecc_point_17(point, r);
  117743. }
  117744. #ifdef WOLFSSL_SP_SMALL_STACK
  117745. if (k != NULL)
  117746. XFREE(k, heap, DYNAMIC_TYPE_ECC);
  117747. if (point != NULL)
  117748. XFREE(point, heap, DYNAMIC_TYPE_ECC);
  117749. #endif
  117750. return err;
  117751. }
  117752. #ifdef WOLFSSL_SP_SMALL
  117753. /* Striping precomputation table.
  117754. * 4 points combined into a table of 16 points.
  117755. * Distance of 131 between points.
  117756. */
  117757. static const sp_table_entry_521 p521_table[16] = {
  117758. /* 0 */
  117759. { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  117760. 0x00, 0x00, 0x00, 0x00, 0x00 },
  117761. { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  117762. 0x00, 0x00, 0x00, 0x00, 0x00 } },
  117763. /* 1 */
  117764. { { 0xc2e5bd66,0xf97e7e31,0x856a429b,0x3348b3c1,0xa2ffa8de,0xfe1dc127,
  117765. 0xefe75928,0xa14b5e77,0x6b4d3dba,0xf828af60,0x053fb521,0x9c648139,
  117766. 0x2395b442,0x9e3ecb66,0x0404e9cd,0x858e06b7,0x000000c6 },
  117767. { 0x9fd16650,0x88be9476,0xa272c240,0x353c7086,0x3fad0761,0xc550b901,
  117768. 0x5ef42640,0x97ee7299,0x273e662c,0x17afbd17,0x579b4468,0x98f54449,
  117769. 0x2c7d1bd9,0x5c8a5fb4,0x9a3bc004,0x39296a78,0x00000118 } },
  117770. /* 2 */
  117771. { { 0x66fd07ca,0x1036eb9b,0x6b7fb490,0x6ca52cc1,0xd3e0c270,0x512e973e,
  117772. 0x73d92d11,0x889980bf,0xa4005eea,0x38b4cfe4,0x8ceb4313,0xb6f992cc,
  117773. 0x6daf7c23,0xd0ac2f8d,0xe32a93cb,0x1ccfbf17,0x000000c2 },
  117774. { 0x2f508cca,0x7bd9d6f1,0x595a72af,0xe82d7171,0x97512873,0x25d02976,
  117775. 0x8cf39fbc,0xefc1de8b,0x9a1237f4,0x25e6b77f,0xd4d98b5d,0x9f3b73e7,
  117776. 0xeccb07fe,0xe1fda62b,0x625350cf,0xdb813b03,0x00000014 } },
  117777. /* 3 */
  117778. { { 0x9b27bd61,0x415a1c9b,0x606854d6,0x74522753,0x92e73538,0x9e331ef4,
  117779. 0x817e7a6d,0x0b3dba85,0x49ac273b,0x55c4bd53,0xfcb5417f,0xad42c78d,
  117780. 0x92e08d38,0x528998b9,0xcc1914cc,0x14c2fff6,0x000000c1 },
  117781. { 0x767e9645,0x35b26fb0,0xc5e5a659,0x162b512f,0xcc47fbb8,0xa6e03696,
  117782. 0x0a29a69b,0x732db065,0xd56bdf5d,0x058a74ed,0x25c858d9,0x4b7b60a0,
  117783. 0xbd43373d,0x17f8a6d4,0xedf610b4,0x7b968f51,0x0000011f } },
  117784. /* 4 */
  117785. { { 0x1bc0fa77,0x5f56b5a4,0x64fd36f5,0x6cdd6bb5,0x8a5b7c7f,0xd0ac68b5,
  117786. 0x09919ef9,0x4a92d9bf,0x71c3c520,0xc305e12b,0xdb699aee,0x554a9d1c,
  117787. 0x61f54643,0x7fde0077,0x479115ce,0x99c13124,0x00000039 },
  117788. { 0xc271ac2d,0x25f890e1,0x94b370ac,0x1353ccd3,0x744d4011,0xc7b5adf6,
  117789. 0xbe378127,0x9ccd7687,0x06c4e3cd,0xa8489b5c,0x305505f9,0x1945580a,
  117790. 0x4ab3b12b,0x07190a20,0x1534ea4d,0x0ff53eb1,0x00000159 } },
  117791. /* 5 */
  117792. { { 0x91798548,0x877d4edd,0x031d657a,0xc43c7b25,0xfab18a04,0x47603671,
  117793. 0xf670b476,0x7e39e7f2,0xb02fcc03,0xf7b76431,0x877f46f5,0x7c5662f3,
  117794. 0x1c8b0c61,0x5bf8327e,0x4a8be322,0xe9cdb353,0x000001ae },
  117795. { 0x9d264420,0xa2d7092e,0x533ff3db,0x1f970352,0x99b5b52e,0x31dd232b,
  117796. 0x850f45e9,0x8a9ce16b,0xc3011849,0x01c99023,0xc8e9301e,0x4bc30989,
  117797. 0xcd95f64c,0x77a4de70,0x1026f289,0xbc8797bb,0x000000d7 } },
  117798. /* 6 */
  117799. { { 0x2be9edf8,0x98ea0934,0xfcb98199,0x6c2f3132,0xfaf83aeb,0xf579893d,
  117800. 0xc73fda0f,0x858e87bb,0x7a0b9d1c,0xd3c0b3fb,0x71ee68b1,0x21fe6305,
  117801. 0x66aa6f16,0x5bf8f01f,0xbca825ed,0x30934c99,0x000000d1 },
  117802. { 0x913022f2,0xe4309850,0xde5b80ce,0xfdc336c9,0x8b6130ef,0xb716d689,
  117803. 0xa758d2f4,0x8a58b405,0xaa5cbc1c,0x98879df8,0xc12ce0bb,0x847cfd06,
  117804. 0x8c02ff3c,0xa1006360,0x3438695b,0x836e906a,0x00000136 } },
  117805. /* 7 */
  117806. { { 0x259ce02d,0xac8fe351,0xdae5e0f7,0xa506da0c,0xf043421d,0x77b56e98,
  117807. 0xa1647490,0xe0d041c7,0x9cb90101,0xe41f0789,0xda3e72e6,0x29bbf572,
  117808. 0x04a14df0,0x6b635c47,0xe81ef5d3,0x56873f58,0x000001dd },
  117809. { 0x5cf9e33f,0x77abe79e,0x0a1117fd,0x91aab581,0xcbac2fe1,0x11edf3b1,
  117810. 0xd72113b7,0xef43e017,0x06b74002,0xf9ad685c,0x8fbd3b1a,0x7e6370ce,
  117811. 0x42f73a82,0x550dd50b,0xc5e64a9b,0x8f2146be,0x000001f2 } },
  117812. /* 8 */
  117813. { { 0x2934ed82,0x05a704cc,0x989edd8c,0x647089fb,0x0ce7c62d,0xe0b239d4,
  117814. 0x105a5eff,0x4c892ea6,0xd5ed6b04,0xa519395f,0x509ed794,0x806c7003,
  117815. 0xe70ce5c4,0x882e9886,0xff01f6a9,0x50730ca1,0x00000088 },
  117816. { 0xdbcc5484,0x90a78a16,0xfd454b50,0xc1ab078c,0xcb09e525,0x6f488252,
  117817. 0xe19b2ed7,0xdd663f53,0xa67bf59c,0x16b10da1,0x36bb770a,0xb47f6b95,
  117818. 0x777b2bce,0x6bdc8428,0x561553f8,0xcd02ae3d,0x00000017 } },
  117819. /* 9 */
  117820. { { 0x1579d15a,0x1e3633a0,0x3e98cd1f,0x574f0c23,0xc60f4f99,0x45969dca,
  117821. 0x49fb9f24,0x10062c93,0xd378f640,0xd29a29d7,0xd7d48c2f,0xec941760,
  117822. 0x31fbea5c,0xf0591c59,0xb40f9ebf,0xd6173e6b,0x00000063 },
  117823. { 0x5a984a72,0x220f4f39,0x32510f26,0x9a3f82ce,0x8c069a1d,0xf3d04c76,
  117824. 0x69a21e57,0xf1d6d891,0xdc4db601,0x6b96b30b,0x64dcf3e0,0x71eeb728,
  117825. 0xc7caaff3,0x6f80c483,0x571b66e4,0x45533092,0x000000b0 } },
  117826. /* 10 */
  117827. { { 0x87140dad,0x49ae4521,0x57e2803e,0xda73032b,0x026ea20a,0x13f5e5eb,
  117828. 0x6e00afb9,0x2d54c4b0,0x7a150474,0x4393b92b,0x13f1a7da,0xb5b41bf8,
  117829. 0x02b5867a,0x6d786907,0xaf2ea4d1,0x5193a9ac,0x000001b3 },
  117830. { 0xa6b186cb,0x2a1563f7,0xe28e57b6,0x73a70a44,0x78fc8a1d,0xd7c4fc6d,
  117831. 0xdf3d6d99,0x4c9b4581,0x1e373aab,0x544f5249,0xe913498e,0xe99434a2,
  117832. 0xc4700f4c,0x30159749,0xe5142766,0xb8ef02cc,0x000001d0 } },
  117833. /* 11 */
  117834. { { 0xb9e6ffc9,0xe99805a6,0xf74d977b,0x1a357f05,0x5c9941bc,0xc8ddef31,
  117835. 0xcbe842e7,0x4b6d66ca,0xa20dc12d,0x84e1f75f,0x5f0c02fc,0x8b1b2c50,
  117836. 0x037b493d,0x3fa1889e,0x95705046,0x720bd9e0,0x000001c2 },
  117837. { 0x93ab9309,0x1a1f3378,0x226a8f94,0xe05a30a2,0x4045f1bd,0x2c01a52d,
  117838. 0xab5f5115,0xf42e8fd5,0x0c05fecf,0x954d1d09,0x8d0650d3,0x47e964d1,
  117839. 0x3c860801,0x6866fa5d,0x5abbb4af,0xac2fecbf,0x0000012c } },
  117840. /* 12 */
  117841. { { 0xe5537747,0x846dc3d2,0x1f5f9f46,0xe28e00df,0x3f31e42d,0x041af624,
  117842. 0x256af225,0x4948947f,0xff4f9550,0x3896c61a,0x34bb5a3e,0xcb40c773,
  117843. 0xeceafacc,0xb9becb07,0x4d45e83e,0xfe29f049,0x000001aa },
  117844. { 0x6b5578db,0x83fb71b3,0x0a710526,0x3017f115,0x5f220d77,0x189ec946,
  117845. 0x48465e68,0xba87ae07,0x70e0cbea,0x1da474d5,0x2b2ba7c5,0xb92cb0a6,
  117846. 0x8b1fb7e2,0x35cb356d,0x2cc8cb18,0x1155296a,0x0000000f } },
  117847. /* 13 */
  117848. { { 0x6ed0f604,0x7f9c9d9b,0xcb49c6d7,0x765e43e9,0xae9be5ca,0x03c4dd67,
  117849. 0x405aed36,0x5480888b,0x920ccddb,0x3a69ebb2,0x03f0c7cc,0x44ec0573,
  117850. 0xce89b026,0x158e2437,0x4f179a17,0x86795029,0x0000003a },
  117851. { 0x9f193dd9,0xf7854032,0xdcc158a9,0x531e4068,0x3642b1a5,0x774171bf,
  117852. 0xc1e53aa3,0x12b4920f,0xfd87478d,0xd1c5fb53,0xa7cba7ca,0x48958c58,
  117853. 0x3f66f2c7,0x375b2cb2,0x598899bd,0x1b510d0f,0x000001b8 } },
  117854. /* 14 */
  117855. { { 0x52007e41,0xfe96299d,0xcd708dcd,0x997140b5,0xf655f6fa,0xe9294eed,
  117856. 0xd58b839d,0x7701d45d,0xb6f77cdb,0x5dbdf5ad,0x95a572f0,0x265189f4,
  117857. 0xb3515e7b,0xc162794e,0x72655e0b,0xbfb571e0,0x00000168 },
  117858. { 0xbda82a6b,0xf0d2b863,0x390a9cc7,0x3df5b283,0x700fcd7b,0xbab9995a,
  117859. 0xfa4e6c06,0xc01ef0af,0x76a392d4,0x10a98513,0x955392f0,0xa7e3fc72,
  117860. 0x1d7a8550,0x8e3c0128,0x361898a8,0xcbca551a,0x0000010f } },
  117861. /* 15 */
  117862. { { 0x3ab71115,0xc8a4cd40,0xbcb9b55b,0xb783170d,0xabd9b426,0x1be20f6a,
  117863. 0x5377b714,0x32d2ea64,0x6b358bbf,0xda342480,0x6e202211,0x782bc800,
  117864. 0xaa27c499,0xf80974c4,0x50341cde,0xc2e66fa9,0x0000004e },
  117865. { 0x24ae60c3,0x082cb95b,0x83ad7484,0xd4b80af4,0x6205256b,0x84b739ce,
  117866. 0xae1fe063,0x616f505e,0x342f218f,0xef14ea68,0x64a01186,0x2b17d66c,
  117867. 0x50858bce,0x60e889ce,0xd5881005,0xdb046c59,0x000001e1 } },
  117868. };
  117869. /* Multiply the base point of P521 by the scalar and return the result.
  117870. * If map is true then convert result to affine coordinates.
  117871. *
  117872. * Stripe implementation.
  117873. * Pre-generated: 2^0, 2^130, ...
  117874. * Pre-generated: products of all combinations of above.
  117875. * 4 doubles and adds (with qz=1)
  117876. *
  117877. * r Resulting point.
  117878. * k Scalar to multiply by.
  117879. * map Indicates whether to convert result to affine.
  117880. * ct Constant time required.
  117881. * heap Heap to use for allocation.
  117882. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  117883. */
  117884. static int sp_521_ecc_mulmod_base_17(sp_point_521* r, const sp_digit* k,
  117885. int map, int ct, void* heap)
  117886. {
  117887. return sp_521_ecc_mulmod_stripe_17(r, &p521_base, p521_table,
  117888. k, map, ct, heap);
  117889. }
  117890. #else
  117891. /* Striping precomputation table.
  117892. * 8 points combined into a table of 256 points.
  117893. * Distance of 66 between points.
  117894. */
  117895. static const sp_table_entry_521 p521_table[256] = {
  117896. /* 0 */
  117897. { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  117898. 0x00, 0x00, 0x00, 0x00, 0x00 },
  117899. { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  117900. 0x00, 0x00, 0x00, 0x00, 0x00 } },
  117901. /* 1 */
  117902. { { 0xc2e5bd66,0xf97e7e31,0x856a429b,0x3348b3c1,0xa2ffa8de,0xfe1dc127,
  117903. 0xefe75928,0xa14b5e77,0x6b4d3dba,0xf828af60,0x053fb521,0x9c648139,
  117904. 0x2395b442,0x9e3ecb66,0x0404e9cd,0x858e06b7,0x000000c6 },
  117905. { 0x9fd16650,0x88be9476,0xa272c240,0x353c7086,0x3fad0761,0xc550b901,
  117906. 0x5ef42640,0x97ee7299,0x273e662c,0x17afbd17,0x579b4468,0x98f54449,
  117907. 0x2c7d1bd9,0x5c8a5fb4,0x9a3bc004,0x39296a78,0x00000118 } },
  117908. /* 2 */
  117909. { { 0x0f0ccb51,0x80398667,0x3654974a,0xb87e1d01,0xb2b29ed9,0x7f58cf21,
  117910. 0xa3add337,0x06c0e9aa,0xe9d08ffb,0xf13b35d0,0x96761627,0xdd8bf44c,
  117911. 0x758a3ef4,0xa4a18c14,0xa0043adb,0x96a576dd,0x0000013e },
  117912. { 0x632d95a3,0x2bde24f8,0x4c524829,0x79f15ef1,0x9bdaba19,0xaadd863e,
  117913. 0xa962b707,0xdde053f4,0x14258d98,0xc598a2de,0x061c235c,0x9fa5a19d,
  117914. 0xe8ffd32c,0x0ed46510,0xef78ceac,0x2aea9dd1,0x00000185 } },
  117915. /* 3 */
  117916. { { 0xeaaf1fe3,0xd0a91dd8,0x4400b52b,0x0db38662,0x21abf0d2,0xff6a06a9,
  117917. 0xa768c940,0x9412879a,0x9a1eec37,0xf3791abc,0x2738343c,0xc913fbe6,
  117918. 0xe222abc1,0x728b42ab,0x2b9ef313,0x874c0a86,0x00000157 },
  117919. { 0xe6f03d49,0x0ac8f184,0x1e48be03,0xa9c357e4,0x815cbdef,0x02ce5ef3,
  117920. 0x5fd8dc3c,0x7a41c7ab,0xfaeb109d,0x4bef67c9,0xa84f4d38,0x2f98cca1,
  117921. 0x672f0aae,0x7e03d47d,0x1d58968b,0x24b1ab58,0x00000007 } },
  117922. /* 4 */
  117923. { { 0xdf9314e0,0x904f2d4b,0xe7a00aac,0xdaae850d,0x582efb03,0x79231083,
  117924. 0xec7fe6d2,0x80f1c283,0x199d74a8,0x2d5b3996,0x395007e7,0x5f120b9b,
  117925. 0x4773f03e,0x30d23773,0x3b78b686,0xf4c19273,0x00000121 },
  117926. { 0xfa8b51f0,0xf103ff6d,0x40e2bdf0,0xae7afb51,0x83254171,0x1130380e,
  117927. 0xcda10d95,0xe83501b8,0x4f3a8c01,0x1057771e,0xac807069,0x8f52196a,
  117928. 0xa5623821,0x3609b0aa,0x94a0a7f1,0x8c257906,0x000001db } },
  117929. /* 5 */
  117930. { { 0xb2c0958d,0x300370cc,0x69a7b387,0x89aef166,0x480c9b38,0x2792f3cf,
  117931. 0xfab3e149,0x0b2984f2,0x50748967,0x9751e436,0xad33db2a,0x9cab99d5,
  117932. 0xb44a4daa,0x4d945d32,0x16c77325,0xa26cca52,0x0000000a },
  117933. { 0xf9e66d18,0xcdbe1d41,0xaa117e7a,0x80aeef96,0xddb0d24b,0x053214a2,
  117934. 0x5c98b7bf,0x6dcfb227,0xdfd3c848,0x613e7436,0x3ca4d52c,0x6e703fa1,
  117935. 0x18551e64,0x0c8e2977,0xbfa8527d,0xf5e90eac,0x000001c6 } },
  117936. /* 6 */
  117937. { { 0x4ab2d58f,0xa2c2f1e7,0x2a097802,0xc1bbf82c,0x770bb76a,0x6583eb24,
  117938. 0x5667f7bd,0x8e4ed9ed,0xfd96897e,0xd8c01d86,0x3fbe0f15,0x66395a13,
  117939. 0xd99cdcb1,0x51e4f39d,0x720deb25,0xde08424a,0x00000082 },
  117940. { 0x60ea91af,0x97aa53b2,0x7a31dfdd,0xa4384af7,0x5cd09bbe,0xcd82f239,
  117941. 0xf30058e1,0x997c19da,0xe5c78e97,0x443b60c6,0x575b1845,0xfaae9b5f,
  117942. 0x08c2ce16,0x5ce86f33,0x4f63fa86,0x983ce58f,0x00000073 } },
  117943. /* 7 */
  117944. { { 0x8217609d,0xaee93131,0x2412fc00,0x7f8a9dd4,0x286c6329,0xe117e64c,
  117945. 0x7bf1c65e,0xcc3782d6,0x8d03eee5,0xe8c144db,0x9ab93799,0x01acacb2,
  117946. 0xb07784c7,0x215eb1b5,0x1affcd87,0x2c409fa8,0x000000f8 },
  117947. { 0x378139a4,0x007d3766,0xb55bea93,0xc6d969eb,0x68c8bc9d,0xc7c60d6f,
  117948. 0x5f93f242,0x844e8461,0x741717d9,0x8461ca2a,0xf0bf120e,0x8e930e79,
  117949. 0x6b5699d7,0xe1554a02,0x6a4fb6de,0xe69c7702,0x0000007d } },
  117950. /* 8 */
  117951. { { 0x4bee80d7,0x61b51bb0,0x7692de69,0x0e1f6a1f,0xa0ebc3bd,0x8379e46c,
  117952. 0x930644f0,0x1c0bffa7,0x390db077,0x97c67b87,0xfada1ce9,0x095c33e1,
  117953. 0xac54b512,0x3c500add,0xd3118656,0xc231d360,0x000000b0 },
  117954. { 0x39bcab2f,0x06289298,0x64dd220a,0xc0c06780,0x763dc2a0,0x062f6084,
  117955. 0x1938c3e3,0x88e9da73,0x52e46eb9,0x69be8f2d,0x6a5de0fd,0xe55c8d2d,
  117956. 0xdb2c0e26,0xf3a3fd63,0x1e4bff57,0x899c6d9f,0x0000014a } },
  117957. /* 9 */
  117958. { { 0xec05ce88,0x9ff6e3a1,0xb6afd202,0xf8fc2496,0x6fbeb007,0x0b9d2077,
  117959. 0xeebded40,0xb50ec0bd,0x693700f7,0xaef97742,0x3f7b030e,0x806e37a1,
  117960. 0x1b901f77,0x5cf17d17,0xca95ae0f,0x9036e5df,0x00000159 },
  117961. { 0x000e8e0c,0x00af64b5,0x06fb4df9,0xd3f2ae04,0x449f23ba,0x5f61da67,
  117962. 0x255b25a9,0x0ca91842,0x8e33c650,0xfa6af3e6,0xc2c027c1,0x14373c00,
  117963. 0x972840a5,0x99f3cda1,0xd0e84240,0x98c62b79,0x000000e7 } },
  117964. /* 10 */
  117965. { { 0xae4d0f28,0xe8c7c4a8,0x566d006e,0x3a8a55ef,0x066e4023,0x37985f65,
  117966. 0x5d321b76,0x8deccab5,0xb8351b07,0x38b966d6,0x57d548ab,0x2e889e53,
  117967. 0xe631ab0b,0x7a9e8e2f,0xe75c537b,0x45c60f95,0x00000059 },
  117968. { 0x7867d79c,0xbca27d34,0x81c81980,0x7f460b15,0x976b8c51,0x7ec2d9ab,
  117969. 0x61b91ed9,0xfcd04486,0xd9c1d15f,0x730a7a25,0xf94c9db9,0x8a2cf259,
  117970. 0x5dec5a3b,0x8e784b87,0x3e5131ee,0x06252607,0x00000004 } },
  117971. /* 11 */
  117972. { { 0xf1631bba,0xdee04e5c,0x156f4524,0x40e6c1df,0xe4c30990,0x06603f30,
  117973. 0x6b6abec7,0xdb649a43,0xf6b94f6e,0x354f509c,0x36b7e0b5,0x7fecf469,
  117974. 0xba1e6dd2,0xa7a7107e,0x689450ca,0x889edac5,0x00000022 },
  117975. { 0xd05596f2,0x9012916e,0xb023cb8b,0xe3901dac,0xe7d4abe1,0x2501d3ec,
  117976. 0xa9c90313,0xb2815040,0xc6d146d0,0x9dbcd3f1,0x74ee1896,0x6fa1d5b1,
  117977. 0xa91226fb,0x49aea161,0xb8a80984,0x754ceedf,0x00000154 } },
  117978. /* 12 */
  117979. { { 0x4270b2f0,0xb64e27b0,0xbf4d74d7,0x84b34e48,0x0c2722ba,0xb186be8b,
  117980. 0x9ff9b71c,0xf54a589d,0x34fd6bc4,0x9887e4df,0x7412f49d,0xb7c669fd,
  117981. 0x77f89d16,0x4008d9bb,0xc902e074,0xafb9426b,0x000001cf },
  117982. { 0x662935ca,0xcca4f2d1,0x997dcc46,0x2847c703,0x353c79f8,0xc089e9e5,
  117983. 0x5215f0f4,0x9ed8d989,0x80911b9d,0x59cf08bc,0x6de27aa3,0x4b03540e,
  117984. 0xf69e320d,0x52f4d63e,0x94ef193b,0xa0217fd6,0x000000e6 } },
  117985. /* 13 */
  117986. { { 0x74214780,0xb77de627,0x207459ea,0xca066817,0xe9c7fb01,0xf78579b7,
  117987. 0xd6d4b7c7,0xe55548c1,0xa66caa39,0x45756190,0x98505a4f,0xf8141b03,
  117988. 0x4c8864eb,0xa5ca0d7c,0x9e129d3f,0xbf8af950,0x00000053 },
  117989. { 0x85285092,0xbc9b29d8,0x8eed5e5f,0x82f31daa,0xf618aab9,0x9c33690e,
  117990. 0xd2626ed1,0x0eee14f4,0x07ed8e09,0x4229570b,0x8736d040,0x1977920e,
  117991. 0xede7d01d,0x47ee25ff,0xbc7ab73b,0x3c921c3a,0x000001b9 } },
  117992. /* 14 */
  117993. { { 0xa08b2b14,0x0b6a07cc,0xbf174c7f,0xaa978deb,0xc40cb2a4,0x291cb828,
  117994. 0x90adc838,0x95c78272,0x8c1edde6,0x08da8b2a,0x90fbd220,0x741ceb2f,
  117995. 0x322db94e,0x5f89c9e5,0xb73c548e,0x18266085,0x0000007d },
  117996. { 0x2defd012,0x69ebf82a,0x5a1537ef,0x01ecb094,0x3ef0811d,0x3c557535,
  117997. 0xb2bd4dea,0x59c882a7,0x7bf969c8,0x00a1f972,0x0b25ad1b,0x063adf5e,
  117998. 0xf2536005,0x4c1ff306,0x4112fe18,0x8e515bec,0x00000117 } },
  117999. /* 15 */
  118000. { { 0xefe3d3d5,0x9314787f,0x9d897227,0x29e76f65,0xe0b6acf5,0x15c77ed1,
  118001. 0x1c5e8dd9,0x9c2b7b20,0x5f5667af,0x788038f1,0xf3576ef4,0xf38c766f,
  118002. 0x0040154a,0x9f0623c8,0xde883b53,0x47d3c44b,0x00000096 },
  118003. { 0xde1b21a4,0x32075638,0x571081c1,0xbb6399c1,0x75c03599,0x322e6067,
  118004. 0xade60cf5,0x5c7fde7f,0xefc19059,0x1b195440,0xdd7b3960,0x7e70ac8c,
  118005. 0x6a6fa73e,0x4aa5a83d,0x63080764,0x34f8cfac,0x00000042 } },
  118006. /* 16 */
  118007. { { 0x286492ad,0xee31e71a,0x65f86ac4,0x08f3de44,0xda713cb4,0xe89700d4,
  118008. 0xa86b7104,0x7ad0f5e9,0x2572c161,0xd9a62e4f,0x25cc1c99,0x77d223ef,
  118009. 0x3b962e0c,0xedff6961,0x81d8b205,0x818d28f3,0x0000008e },
  118010. { 0x8cdf1f60,0x721231cf,0x6717760f,0x8b640f2b,0xe045a403,0xbe726f8c,
  118011. 0x0370689f,0x422285dc,0x72ea0dcb,0x7196bf8f,0xc8086623,0xa16f7855,
  118012. 0xc326fe48,0xd4e19fc7,0x8f68bf44,0xfdbc856e,0x0000013e } },
  118013. /* 17 */
  118014. { { 0xe6a3ace5,0xde34d04f,0x896191c1,0x0dbb603e,0xf75ed0f4,0xb4dc0007,
  118015. 0x95b259b5,0x15e0e6bc,0x2615f020,0xdfbcba66,0xd31ea3f8,0xb2ec5433,
  118016. 0x103ff824,0x42b0b0e4,0xc480332e,0x19315060,0x00000111 },
  118017. { 0x045452f1,0x9997ea28,0x71f3f73b,0x80b678cf,0x41e9328e,0x4a52bddc,
  118018. 0xe6af1c23,0xb7f2656e,0xb44215e7,0xc43805b9,0xf0a4028b,0x3aa734f2,
  118019. 0x422476e2,0xe3c72479,0x68c60cf7,0x6dc2e8b0,0x000001f1 } },
  118020. /* 18 */
  118021. { { 0xfffc0de5,0xbcdfae6f,0xab4a5f24,0xa801814f,0xea2aa8dd,0x19013658,
  118022. 0xda4f0441,0xf3b1caf5,0x34100611,0xf24b9cdb,0x96e0cf88,0x48c324ed,
  118023. 0x23055c82,0x4b7ea334,0x89092e29,0x6e835b64,0x000001d3 },
  118024. { 0x07372f27,0x7eb77ae7,0x83bae19a,0x4779b4fa,0x65429ebb,0xa175dae1,
  118025. 0xfc03ef3f,0x942ec266,0x6991c7c4,0x0e5fc6a9,0x56253d3c,0xa0f61e4f,
  118026. 0xde74e738,0x7a11ff58,0x624de919,0x60524cd4,0x00000002 } },
  118027. /* 19 */
  118028. { { 0x01342e08,0x45b5d0ca,0xb749f0af,0x509ed4f0,0x6529d804,0xeb5502d9,
  118029. 0x6d80359c,0x5eb087db,0x4c384800,0xeaa66a87,0xc75a8784,0xe972c7a0,
  118030. 0x6874317e,0x8c169e21,0xe5c9fbf4,0x81c556e0,0x0000014f },
  118031. { 0xe120674d,0x26b0b12b,0x219f00ac,0xc6bf09b9,0xd658caa6,0x1e1e732d,
  118032. 0x8292d99e,0xc771c5af,0x25fdbf80,0x5d813529,0x3666c37d,0xe61bd798,
  118033. 0x1d0df680,0x8dac946a,0xc39f0983,0x58dcf684,0x0000009f } },
  118034. /* 20 */
  118035. { { 0x7b7dc837,0x14169102,0xb50eb1c4,0x2d719754,0xd7e6741b,0x04f4092a,
  118036. 0xbc824a38,0x1d0a7f1d,0xc8e20bcf,0x570b2056,0xda181db0,0x6732e3b9,
  118037. 0x0a7b508a,0x7880636e,0xc9f70492,0x11af502c,0x00000045 },
  118038. { 0xc56f4ffa,0x0b820d94,0xc4f0c0fa,0x1c6205a2,0xa1a0606a,0x99f33d4e,
  118039. 0x79b316fb,0x1bab6466,0xe4f240fc,0x05aa0852,0x92d7dc43,0x22539b78,
  118040. 0x06e3c073,0x03657f12,0xcedb6633,0x28405280,0x00000059 } },
  118041. /* 21 */
  118042. { { 0x4397760c,0x90d08711,0x1c9fcd06,0xb9020b76,0x987e24f7,0xc7fec7fa,
  118043. 0x522335a0,0x0e33b8a0,0xae21ca10,0x73dbeafd,0x3b032220,0x458c060a,
  118044. 0xee145da6,0x9b9c73b8,0x27ff62ef,0x31c661e5,0x000000aa },
  118045. { 0x81430b5e,0xaf518eb0,0x50ee0d69,0xb32f9cea,0xaa6ebe8b,0x0ecdb0b5,
  118046. 0x9fe1d689,0x1f15f7f2,0x1a59cc9a,0xce5d68f3,0x08ab2a63,0xf4d67994,
  118047. 0x4347ce54,0xe85b1cef,0x286d0776,0x8ff423c0,0x00000176 } },
  118048. /* 22 */
  118049. { { 0x33dcec23,0x8564104c,0xcdd07519,0xbaf0d61b,0x4c4f309a,0x486daf51,
  118050. 0xde488715,0xf01bc8f5,0xd3539ba3,0xddd6baf1,0x3a3be8ec,0xbb7e665d,
  118051. 0xcb5d865f,0xf919dac3,0xf12149a0,0xfe203da3,0x00000173 },
  118052. { 0x78d4a3d1,0x043ae9a1,0x865316d8,0xa4d5cf58,0x41176463,0xeaf026c0,
  118053. 0xf84afa44,0x316c638f,0xffea422d,0x512f2397,0x6622b613,0x691eaa04,
  118054. 0x97e7068d,0x48856ea3,0xf4a1b33c,0x42d1b2e3,0x000001b5 } },
  118055. /* 23 */
  118056. { { 0x1f487402,0xf51b2d5e,0x7aaf1dd5,0xe36016e6,0x6da9c20a,0x1eb3f1f5,
  118057. 0xece45bfd,0x25b7d361,0x027a9e18,0x42db0633,0xe8411649,0xbf228777,
  118058. 0x458773d0,0xf5fce0c4,0x2dd7a5f0,0xb2b3151d,0x0000001f },
  118059. { 0xfbaa096a,0x102773e8,0xe093a878,0x152726eb,0x2c7f1781,0x5c53cd07,
  118060. 0xab5dca76,0x38d3dfd0,0x87ef2d4a,0xbb4a7d85,0xb7eb11c2,0x5c9c2013,
  118061. 0x0b6da22f,0x5e353c34,0xa325ecad,0x846d50a5,0x00000039 } },
  118062. /* 24 */
  118063. { { 0x1677df58,0x76da7736,0x1cb50d6c,0x364bd567,0x0a080ff2,0x0443c7d7,
  118064. 0x86532430,0xa0a85429,0xc35101e7,0x82002dd2,0x48c5cd76,0xbebc6143,
  118065. 0xca6cf13f,0xff1591ae,0x98bf8dc0,0x91c7c2e6,0x000000fb },
  118066. { 0x12de14d5,0x6a7c5cad,0x6561c822,0xbc448c5f,0x7cdbb3da,0x9f8de430,
  118067. 0xc76811d7,0x9c58f011,0x75462049,0x1e89806e,0xc9a74e49,0xe52ad0a2,
  118068. 0xb2be37c3,0x2034685c,0x0a0bc72d,0x7a863245,0x000000ec } },
  118069. /* 25 */
  118070. { { 0x8a86786e,0x33818c21,0x2137e2c8,0xed537f74,0xa7e6eb20,0x5d9690d1,
  118071. 0x5cdc4803,0x9790ec70,0x24f7bd75,0x469162c8,0x4e1f0f14,0x09e7ef9d,
  118072. 0xce9915ca,0xd30c128b,0x6c71226f,0x810145f6,0x0000002d },
  118073. { 0xb71d87e5,0x312749f5,0x7b02ceda,0x25f3b141,0xe0baff16,0x02456d2e,
  118074. 0xfcae6627,0x97f7b3a9,0x37bd985f,0x0d6ebf8f,0x7fa6d0c1,0x20aa81b9,
  118075. 0x21f2f137,0xb29f1a01,0x5cc0ddb1,0xe326a2f8,0x0000003d } },
  118076. /* 26 */
  118077. { { 0x38c2ee78,0x26f3398b,0xa75a0bee,0x40c3d101,0x565a7f8e,0x35a31706,
  118078. 0x04019e5d,0xd12985e3,0xb8174b6e,0x21e2a642,0xaf80a52a,0x25a15ee8,
  118079. 0x8518d80e,0x5d1e0fe6,0x04f6ea9a,0x8cbbc138,0x00000084 },
  118080. { 0xdfd45169,0x76828690,0x59d3e8d0,0x38d7e098,0xcdb8bfc2,0x23758811,
  118081. 0x162cf648,0x8499547a,0xb4d15b8c,0x494bab3b,0xc60499a6,0x822cbc57,
  118082. 0xa8a1cfed,0xac43224e,0x57c6598b,0x43563469,0x000000d9 } },
  118083. /* 27 */
  118084. { { 0x68271323,0x2b069253,0x49cd04d7,0x24d9e0a8,0x2b31cc7d,0xaae35fbf,
  118085. 0x57a3e361,0x44f64b4f,0x0294e856,0x14904686,0x43ced4ae,0xddc82ee7,
  118086. 0x7e2cda47,0xcb92a6a5,0xbfc1f968,0x989c42ef,0x0000013f },
  118087. { 0xb8651600,0xbed98bdf,0x7a3cfaee,0x8c363434,0x35b1a226,0x93a12543,
  118088. 0xd5825507,0x558da7dd,0x852eb1e9,0xa5173b23,0x2295f545,0xdf5ae585,
  118089. 0x6646d101,0xe546e2ef,0x5d89f862,0xf7e16a2c,0x000001fa } },
  118090. /* 28 */
  118091. { { 0xc7ec136d,0x0d746c8e,0xcd11351b,0xf8e1d827,0xf187a116,0x764a3ad3,
  118092. 0x136e8465,0x2f1b968f,0x850983c2,0xd41aa294,0xbe717259,0x2123ecc4,
  118093. 0x763c149c,0xdcdcab52,0x1022b82d,0xa7f50b18,0x0000016d },
  118094. { 0x0ca5e258,0xf99e532d,0x97b62a7b,0xa148ad17,0xc77fddef,0x8d0a242e,
  118095. 0x74f9b6c4,0x58518bcd,0x7fd122d4,0xc53b30b8,0xfb50b2d7,0xbb8cd193,
  118096. 0xbc01aae9,0x1a169aee,0x1de26e09,0x7e49b10a,0x000001c5 } },
  118097. /* 29 */
  118098. { { 0x21210716,0x2cabe675,0x07e02400,0x81a296a3,0x8c83795b,0x94afc11d,
  118099. 0xdd9efa6a,0x68f20334,0x677d686f,0x5be2f9eb,0xbf5ce275,0x6a13f277,
  118100. 0xb9757c5c,0xf7d92241,0xc74f4b8c,0x70c3d2f4,0x00000132 },
  118101. { 0x8d209aa4,0xf9c8609c,0xdb2b5436,0x46f413a2,0x2992345d,0x96b72d1a,
  118102. 0x9487c34f,0x186f2aeb,0xb440a375,0x4fa72176,0x7da5358e,0x3a420936,
  118103. 0xff25b310,0xf11eade3,0x505d60b8,0x9a570153,0x000001a9 } },
  118104. /* 30 */
  118105. { { 0x6e7495bb,0xae151393,0x490879d1,0xebd2fd28,0x29fd76fc,0x9c232b0b,
  118106. 0xc60e721c,0xa1a0d49b,0x517a09e2,0x9f582b83,0x9d8badf8,0xac37809e,
  118107. 0x0ad48bb4,0x4aa4de9e,0xcb6cc487,0xfd041312,0x00000027 },
  118108. { 0xead4fb6d,0xc05502ee,0x0a602cbe,0x760c25ed,0xbd7f4a07,0x58ba6841,
  118109. 0x54edce14,0xc28b6032,0x0397614c,0xb9d41e39,0x181eed93,0x4221b71d,
  118110. 0x332d4b0b,0xd010e3c2,0xdab0e419,0xdfe58a27,0x00000096 } },
  118111. /* 31 */
  118112. { { 0x7debd24e,0x4cd6fcd6,0x9ae2b075,0xbe3fca60,0xf217c26c,0xa7d8c22e,
  118113. 0xb9620e3f,0xd42d03e0,0xc7f9f87d,0x634bf216,0x8972ffee,0x22b1ec53,
  118114. 0xd60d3e77,0x83a957c1,0x0f6a537e,0xedfe5f86,0x00000162 },
  118115. { 0xf0ea20b8,0x40a05400,0x1d796900,0x2872ac7e,0x0edb0cac,0x7765a5c9,
  118116. 0xb62939a7,0x9df5b930,0xaf2cb708,0xf78a676e,0x52febc12,0x030732bf,
  118117. 0xba190ad3,0x3a6640de,0x93e7e341,0x36eae15f,0x000000d5 } },
  118118. /* 32 */
  118119. { { 0xa1c88f3c,0x6c6119f6,0x2ec6944a,0x924e5fec,0x5742ff2a,0x4c8aac60,
  118120. 0xddb22c7c,0x60adde1e,0xfa5d25bb,0x9728938c,0xec117de0,0xfa5ac4f7,
  118121. 0x482929c1,0x41f35ab7,0x0afd95f5,0xd1c4e8f9,0x00000180 },
  118122. { 0xa7cd8358,0x2fc4e73d,0xf2a1c920,0x39361a57,0xad94d288,0xf6f2f130,
  118123. 0x2b6a78e2,0xe37e2466,0x79c262cd,0x0babff8b,0x61b597b9,0x6cae01ef,
  118124. 0xa60d4e64,0x9c1e33f0,0xdd01f845,0x52a42280,0x0000000e } },
  118125. /* 33 */
  118126. { { 0x0f013755,0x72d640a4,0xfb8380e9,0x0b6dce77,0x7eb64b31,0x2789ce79,
  118127. 0x93ca5a36,0x8e704b0b,0x58bdffc9,0x18c360ff,0xb230c372,0x53b1f323,
  118128. 0x5a7385d1,0xd6b39088,0x56b93bf7,0x071130f5,0x0000004a },
  118129. { 0xfeef3f88,0x29a2096b,0xb82b3945,0x22eba869,0x872664a7,0x7fe2184a,
  118130. 0x858ff942,0xa0dc0ba1,0x7490c9da,0x33799eb5,0x81588ce8,0x1d356f62,
  118131. 0xa7b2cee2,0x7dd9bc7f,0xa3cfaee9,0x1e61a4e8,0x000000d2 } },
  118132. /* 34 */
  118133. { { 0xe9068656,0xec5db629,0x9fede4df,0x623bd70c,0xfcd45546,0xc78ad5bd,
  118134. 0x6291a741,0xf7981dd2,0x761e688e,0x3ac53d92,0x55b9272f,0x6a96892a,
  118135. 0x06546fec,0x4217e7b8,0xab9e2f56,0x793c03cb,0x0000015e },
  118136. { 0x6eff39be,0x08fd9543,0xdbff4f68,0x5a1af07e,0xb0241616,0x83d47abd,
  118137. 0xd4798029,0x37c5d2fd,0x60b2e6fb,0x9d86d978,0xce8db998,0xe3e3284e,
  118138. 0xd868b9bb,0x9f049eb5,0x9dad18b3,0x3b3e8a78,0x0000018e } },
  118139. /* 35 */
  118140. { { 0xe51e61f0,0x57026c56,0x307f2757,0xdddbcaa3,0xb1aeaf41,0x92a026eb,
  118141. 0xe2d7f5ba,0xa33e937c,0xbc5ead91,0x1f7cc01e,0x2e46807d,0x90ab665d,
  118142. 0x53419519,0xc2a44f55,0x79664049,0x099c1ca6,0x000000aa },
  118143. { 0x8f97e387,0xb561a909,0x45e1dd69,0xf6051778,0x7ff1d6ab,0x1ffa512b,
  118144. 0xd09a9c89,0x42da55a4,0xd2282e2b,0x5e5a7c71,0xe74185ad,0xdfa5a203,
  118145. 0xea0baeff,0x19b1369d,0x1ecc0a16,0xa5eef914,0x000001a3 } },
  118146. /* 36 */
  118147. { { 0x7a573b81,0x2af20d0a,0x66194cef,0x7eac1ca8,0x0b711c34,0xef0d2d8d,
  118148. 0xba099d42,0x6aea016c,0x5067a8ca,0xa6609d28,0x7a1351ef,0x6a52c600,
  118149. 0xb11c2634,0xdab85818,0xbb1c033c,0xf17fa45d,0x00000121 },
  118150. { 0xfc3279d6,0x9fb8b87a,0xc201f1e1,0xe30e76ab,0x806c21dd,0x02af6a83,
  118151. 0xc63f824f,0xeafd7e2b,0x46bd1a53,0x7b074e26,0xa2139164,0xcd6f4931,
  118152. 0xc172d9bf,0xab2cfd39,0x4db59cf1,0x62f3eb4b,0x0000010a } },
  118153. /* 37 */
  118154. { { 0xe0689a1b,0xe402de36,0x7dcafe72,0x9dccc9fd,0x255d0bfb,0xe4dead7e,
  118155. 0x4ada04d9,0xd7ee87ee,0xbfd2e774,0x5a85039e,0x770b2b9b,0x282c6657,
  118156. 0xba103bba,0xa7aca826,0xc7cd5071,0xac7028ba,0x0000011a },
  118157. { 0x680c8f04,0x2e61d39c,0xb48b3b5e,0x2f09c4cc,0x95744f3c,0x131609bd,
  118158. 0xaaccb593,0x6d72e4b4,0x5adfb209,0xdb7060ca,0x1fd3eccf,0xc67d9e43,
  118159. 0xe1752a73,0x1487a26f,0x64d0857c,0x3d953663,0x000001e3 } },
  118160. /* 38 */
  118161. { { 0x4cec9e7f,0xe664506b,0x30aab98f,0xa44564b4,0x173fa284,0x5e1b501f,
  118162. 0x15c97472,0xe7b7bd7e,0x82dec033,0xd6cc67a8,0x0a63b762,0x1fe2e934,
  118163. 0x3f8e2fcd,0x3a084e1b,0x9ae6e752,0xccce4da8,0x000000fd },
  118164. { 0xc12fd820,0x0797f8ee,0x96da4733,0x325f892a,0x55997bf4,0x597d241d,
  118165. 0x02b753cf,0x3aef35ac,0xf677ceba,0x8a73f95d,0xd1bbac6c,0x5b2892b7,
  118166. 0xcc5278b0,0x90751583,0xa47f45f6,0x2f5ed53f,0x0000001c } },
  118167. /* 39 */
  118168. { { 0xab40b79c,0x3914165e,0x25b489a8,0xbfb6eed8,0x8a6c107f,0xda136b7d,
  118169. 0x8e01f28b,0xd431db8b,0xa4d79907,0x84e5d0dd,0xa471e685,0x69a91472,
  118170. 0x98376ff8,0x58d06969,0xc46311fd,0xce369b74,0x00000006 },
  118171. { 0x1add1452,0x6c0773d1,0xed8e9a2a,0x2e4e9c95,0xca15a40c,0xe8ff8e32,
  118172. 0xaf62f18f,0x3fcb7d36,0xeec9484b,0x2ca336ee,0x3b20405b,0xa4d6e7a9,
  118173. 0x956d8352,0x6d90d031,0xd9ca03e7,0xdd375603,0x000000e5 } },
  118174. /* 40 */
  118175. { { 0x8b481bf7,0xcc5f297d,0x2a13383c,0x06a2a3e4,0xdc40b96c,0x9e14528c,
  118176. 0x1189da3c,0x9a2bf35f,0x6cd57fa7,0xb8adb989,0x9357d32b,0xc1a4935c,
  118177. 0xc2d76fad,0x51fb2580,0x24f23de1,0x98721eb4,0x000001ba },
  118178. { 0x52a4b397,0x8c02daaf,0x0d0b4e54,0xc3c5f4cc,0x7b7e79cd,0x29be4db3,
  118179. 0xb33970b6,0xf34336ec,0x92808c7f,0xed3dcb7c,0x02288db1,0xec290eff,
  118180. 0xe96ed59a,0x2a479d51,0x76d8fa5f,0x9d7ed870,0x00000092 } },
  118181. /* 41 */
  118182. { { 0xe660043c,0xd8edaf0b,0x016e074d,0x84aa2ccb,0xe2cc3b3d,0x9d2368e7,
  118183. 0x5c269fc4,0x47b50130,0x3de33e36,0xd0194ee1,0x789ca504,0xdb3361b9,
  118184. 0x984db11d,0x8cd51833,0xc8ec92f0,0xd5b801ec,0x000000c6 },
  118185. { 0x47ab9887,0x33f91c15,0x6b5ab011,0x2f285e2a,0x133fc818,0x9b734e5a,
  118186. 0x38d8692c,0x5c435a74,0x43282e81,0x3c92b47c,0x9c7bcdaa,0x191231f5,
  118187. 0x4d158c86,0x3ae425c3,0xc5a23cca,0x7f568feb,0x00000011 } },
  118188. /* 42 */
  118189. { { 0xbf5caa87,0x8ccbd9d5,0x68dd8c9d,0x17bfc60f,0xc7d4dede,0x63eb4dbb,
  118190. 0x8270b5bf,0xbf6e5945,0xcc098fe7,0x887137a5,0x05d7b8f5,0xca5eb687,
  118191. 0x4b25a533,0x4b7deeee,0x4a700a6c,0x8e045c32,0x000000ef },
  118192. { 0x70cf52bc,0x160c1c92,0x90cc6298,0x4bf3f63a,0xbf3028fb,0x5fff421c,
  118193. 0x523beff1,0x0a8102d7,0x8b9ce105,0xff3309a3,0x06621b1e,0x8e9da4d0,
  118194. 0xcc0a7807,0x9775f89f,0x00178612,0x59044865,0x000000eb } },
  118195. /* 43 */
  118196. { { 0xebbd33ec,0x8a6664fd,0xce5ad579,0x0cf9a660,0x50fb56ed,0xecd06c05,
  118197. 0x1d5aaa6e,0xb4ca5fad,0x948a7f07,0x36daee5b,0xefe1c11a,0xd2e37887,
  118198. 0x91d2544b,0x41f61ac4,0x2bffd8ea,0x49df7071,0x000000be },
  118199. { 0x65acdb56,0x60e2f1f5,0x5e5e5bde,0xf2f13c84,0xe17a0412,0xb97fd354,
  118200. 0xd9c93bef,0x8a2867cf,0x25a957e4,0x9ca9d16b,0x4a18635f,0x1f55c19b,
  118201. 0x8d26ae71,0x9b3868f5,0x4c94541d,0xac448041,0x00000000 } },
  118202. /* 44 */
  118203. { { 0xd4ad38db,0x6c1bcf89,0x3d714511,0x1180f381,0xcb70243a,0x5b4c2759,
  118204. 0x163a716c,0x5dd64d63,0x13648bdb,0xbbd2efea,0xe4de9969,0xa47187f9,
  118205. 0xe2de8c45,0x65de6912,0x4bdad0a7,0xe075f29c,0x00000048 },
  118206. { 0x5e4dd88d,0x00335474,0x80577afc,0x18283638,0x227288f7,0xe4b35c01,
  118207. 0xe68989de,0xd008fd91,0xcd3f71ba,0x42142315,0x3e4da1e2,0x5cb023ff,
  118208. 0xb5662bb1,0x7e6b9c35,0x7fb04fe5,0x143f4165,0x00000072 } },
  118209. /* 45 */
  118210. { { 0x26f40f2c,0xb06b046c,0x6cd7c31d,0xbd5d246c,0x1953a9b7,0xaaa56270,
  118211. 0x8f00436f,0x5ac929b8,0x21d0660d,0x1937392c,0x9bd6dbe6,0xd279ed15,
  118212. 0xd17c43f9,0x377c4d5a,0xb8fcd025,0x800eda50,0x00000179 },
  118213. { 0x36132f31,0xb88ddc0b,0x2ade73a3,0x6f8f4f01,0x203de2b9,0x38859ec3,
  118214. 0x231b6533,0xedb03814,0xa14093ca,0xad08cd20,0x5c2be2f9,0xb9f86d44,
  118215. 0xf6ebc09f,0xfd3d9532,0x1aef478d,0x757b5899,0x0000013d } },
  118216. /* 46 */
  118217. { { 0x580f894b,0x7d9ad100,0xd925e46f,0xb612488a,0x2e5a6865,0x45497e14,
  118218. 0x17f9a813,0xc86e1053,0xf8a33541,0xd8aa820a,0x7a66d578,0xa6790660,
  118219. 0x5f758e23,0x47df60ae,0xa7f8ab5c,0xcadd4c90,0x00000107 },
  118220. { 0x6764ad0e,0x356b044f,0x250189b3,0xf69fe0e1,0x5f14db6a,0x2deaca62,
  118221. 0x1bd77d54,0xe9f2779f,0x5cfa895c,0x979911f2,0xb6f19ac3,0xd4e94ced,
  118222. 0x01af44b1,0xc3533417,0x50c727f5,0xcac43fff,0x0000003b } },
  118223. /* 47 */
  118224. { { 0x83c1d4cf,0x1742951c,0xb245c34f,0xe03791d0,0x9c2dcc71,0xea8f8ef6,
  118225. 0x2a310767,0x2ea57a29,0xb12948bd,0x255b46bb,0x0feaeb83,0x2adc1e09,
  118226. 0x449abf59,0xa0d2d18c,0xc4a8a689,0x9e8c9ff5,0x00000019 },
  118227. { 0xeb28171a,0xc9f7b9cd,0xd576987b,0xefd78403,0x22ff824c,0x58b4f3bf,
  118228. 0xbf333cc5,0xee09b393,0xb01ceb72,0xebff83a2,0x220299cd,0x5bb34c45,
  118229. 0x66ebf751,0xa3c3e8a0,0x49d05cf3,0x5dee07bb,0x000001a6 } },
  118230. /* 48 */
  118231. { { 0xb114257b,0x09a958d6,0xd4975e30,0x729afd41,0x3aae7b11,0x072879b5,
  118232. 0xedd1ac83,0x0791b093,0x1eb67975,0xcfefc7d1,0xe2675b4a,0x0e54bd37,
  118233. 0x8d69517f,0x89a62d7e,0x202109a3,0x96f805d8,0x0000006b },
  118234. { 0x57b5f9f4,0x4815d517,0x405b44d1,0xe5c9e436,0xe4870160,0x3442dde0,
  118235. 0x1ef6b3f8,0x953fef95,0xf7497faf,0x919e4cf5,0x016ef0b7,0x24e3cc4d,
  118236. 0x2512eeed,0xfc5caa87,0xa3bd1703,0xf1ba4029,0x000001b6 } },
  118237. /* 49 */
  118238. { { 0x529252ac,0x2a668435,0x74e7b0d8,0x3da626c0,0xe0be86ab,0x55080cc1,
  118239. 0x4ed5dc53,0x534a53f7,0x0cd41fd0,0xa9eff140,0x5674891c,0x0e7c945c,
  118240. 0xec53b5ad,0xdea4b895,0x15150988,0xefc67bef,0x000001ff },
  118241. { 0x306033fd,0x988dc109,0xf36875d9,0x1b287979,0xe3c335c5,0x4d39af26,
  118242. 0x124e29d6,0xa47259fd,0xc41dbdfc,0x5d60c570,0x0cc0d895,0x06224b61,
  118243. 0xeea8ff86,0xa041d4e5,0xae4d8707,0x2920e15c,0x000001fd } },
  118244. /* 50 */
  118245. { { 0xcd67da85,0x66d15f0c,0x5ac54a15,0xae98b6f4,0xf1ac71c3,0x2f05e021,
  118246. 0x47559224,0x1feb2226,0x66e856dc,0x2a2f1561,0x6fb4ba47,0x65eb1456,
  118247. 0xa29d920b,0x34688bd2,0xf9d4cb9b,0x943ce86e,0x00000061 },
  118248. { 0xaac91174,0xb4696218,0x41dd9234,0x85b519ec,0x9f0763a4,0xb7efadf2,
  118249. 0x712c8b33,0x98517f27,0xb0538630,0xa02e7ec3,0x1ff3e3e4,0x46bc45bb,
  118250. 0x29496486,0x46ae896f,0xebd2b93f,0x2aeb1649,0x00000146 } },
  118251. /* 51 */
  118252. { { 0xe8e4d3c3,0x1f34f41f,0x5bb7e9db,0xc80d87ff,0xd910b579,0xf0216c0a,
  118253. 0xb87349ae,0x2a24b761,0x2b0a6cc0,0x054bc528,0xaf2d1957,0x3b4c7029,
  118254. 0xadbe6cdd,0x0e4b90e2,0x26060a34,0x8e774f81,0x000000cf },
  118255. { 0x2e229950,0x3c7f9dbc,0xd9f82b70,0xab11f846,0xf10c05f3,0x2b7ad9a3,
  118256. 0x0f1820ca,0x203ead4f,0xccbfb332,0x51dbcbc8,0x066706f1,0x3bd9caf0,
  118257. 0x06059d5e,0x5a39be25,0xdcafe64e,0x984387c8,0x0000014c } },
  118258. /* 52 */
  118259. { { 0x8e011531,0x708a757f,0xc3dcd57c,0x7f45b172,0xc2d99e29,0xa8eac9fd,
  118260. 0xb93b6415,0x9d4ee81f,0xa5488e86,0xa5833b54,0x0bb7ab70,0xddd561c3,
  118261. 0xb3bdf3a9,0xb5bda384,0x1ddf332b,0xf909f8e0,0x00000124 },
  118262. { 0xab41e782,0xc5b8aa84,0x851ddb87,0x1de20126,0x99482bd2,0xf49baa7d,
  118263. 0xf4b6413b,0x05963deb,0x7cd1e224,0xed369fbb,0x1bad60ee,0xdcf495dd,
  118264. 0x892e30ed,0xeb475693,0xaf0a212d,0xaaf11bd8,0x0000010b } },
  118265. /* 53 */
  118266. { { 0x16ec64e2,0x71460174,0x7d7c6ebe,0xbfd14acf,0x668b7176,0x1e3504a3,
  118267. 0x741b041c,0x72e3f3f3,0x2d3b67b0,0x651fa54a,0xe57d928d,0x623edca3,
  118268. 0x72c8f419,0x29b74e8b,0x327abaef,0x3d99cb47,0x00000038 },
  118269. { 0xda342a3f,0x808dd0b3,0xdef4a954,0x12002462,0xeab5a860,0x1b1c642e,
  118270. 0x06e54b6d,0x5e1e2a05,0x10c6cf1a,0x9ba1710f,0x0f903cd0,0x334fc366,
  118271. 0x134166f5,0x969e0001,0x155c4353,0xfaa26074,0x000000fa } },
  118272. /* 54 */
  118273. { { 0x712de285,0xc85cd0e6,0x869f5dc5,0xcd2ff8b0,0xdf4ed389,0x372a2b92,
  118274. 0x55b99c84,0x63524d30,0xe07a0033,0x46fef5a2,0xd6e09493,0x0a2c82da,
  118275. 0x72a8952b,0xb3626621,0xaf217eb6,0x9afcb188,0x0000002c },
  118276. { 0x9a64c5b5,0xd3b9d476,0x44c4cfe1,0xa0d8d5de,0x11c6dbff,0x560858ef,
  118277. 0x41c14aed,0xce1d978f,0x35efe854,0x251f9e72,0x0474575d,0xf9d0c14c,
  118278. 0xbda89c03,0x0d2c838e,0x36cc9dc0,0xa25f040b,0x0000016f } },
  118279. /* 55 */
  118280. { { 0x9cad682d,0xb23d9dea,0x46369391,0x87acb1b3,0x5c0f24d7,0x9f5c1988,
  118281. 0xd41883ce,0xdff62fc7,0x53555e46,0xd1ab29df,0x891cda05,0x569b1cb2,
  118282. 0x52c633ed,0xdb14dbc4,0x2a345428,0x1acbb86c,0x00000194 },
  118283. { 0x24db8127,0xd86a70c8,0x41b7cf5b,0x84a6563f,0xb908d9b4,0x8d84dabe,
  118284. 0x899c260a,0xaaeaae63,0x44436957,0x13ed6b2b,0xd0a92c8d,0x3bc94f99,
  118285. 0xd04bcb97,0x978f2e2b,0x716a565f,0x56a388ef,0x00000074 } },
  118286. /* 56 */
  118287. { { 0x96fc1f77,0x6082dfe4,0x1347ad6a,0xb04c435f,0x25ebe457,0xf42694dc,
  118288. 0xb6f764aa,0x64a17069,0x04d83da1,0xe03873d5,0xe0c82330,0xb0b9db52,
  118289. 0xd4239b3e,0x9886b34e,0x598814da,0x76587f2a,0x0000016a },
  118290. { 0xebc71a5d,0x6918f8e8,0x85405233,0x49141a42,0xc182cbcc,0xd63f09cc,
  118291. 0xe09057a7,0x4afe59d3,0xe239d8eb,0xe633db0d,0xfd9494b2,0xbac8582d,
  118292. 0x4704fd61,0x8b915a41,0xfceaefd9,0xe0866a9d,0x0000010e } },
  118293. /* 57 */
  118294. { { 0x52e07a4d,0x2b50c470,0xe5d745d0,0x7f6d38b8,0xe1af1226,0xb414c47c,
  118295. 0x39c505f7,0x03e4b44b,0x86f739be,0x59f3d795,0xe7c2f1bc,0xca19bca7,
  118296. 0xc063fad4,0x1c51c01e,0x7f428afb,0xda3937a5,0x00000080 },
  118297. { 0x102369fa,0xe9d8ca9d,0x706c0e35,0xe009bffb,0x96b55d80,0x2e0a19a7,
  118298. 0xac0d094c,0xda0e42de,0x787c187a,0x6c1be2c5,0x9cfa04b6,0x6d4ae2cc,
  118299. 0x76577340,0x5b0cea60,0xc7c96285,0x2d525245,0x000000d8 } },
  118300. /* 58 */
  118301. { { 0xae93de69,0x6dcb238c,0x3bfdae9b,0x4963c833,0xe8b79836,0x33c81f4d,
  118302. 0xae8bf8ae,0xe13a2244,0x4c3ebacc,0x0bc6e786,0x555a5ad6,0xa837a53c,
  118303. 0xbc7e9459,0x875d8d35,0xf9f46fcd,0xb3705534,0x0000001f },
  118304. { 0x7fb974a1,0x78e9270c,0xe9ed2481,0x23448fa0,0x64bffbd4,0x14166c3d,
  118305. 0xd79f4b3c,0xa05aa443,0x3b9f32a0,0xd855a4f1,0xac90235e,0x4bebcf8d,
  118306. 0x8db52b48,0x65849987,0xe48d09d1,0xaa4d59f1,0x00000183 } },
  118307. /* 59 */
  118308. { { 0xdbffad9f,0xee585d75,0xf419d8fc,0x64df6174,0xe6c69345,0x6f73bf59,
  118309. 0x83d59b0c,0xb80793d1,0x929c8950,0x6baf4fc3,0x29962bab,0xbd445a95,
  118310. 0xeaa91273,0x52b61945,0x3d1c785b,0x4fccdfff,0x000001be },
  118311. { 0x7cb2857f,0x05c384d9,0x06b7abf4,0x4cf83058,0x43ace6b2,0xf528dd17,
  118312. 0xbc43d6b6,0x2c7b8fa2,0x14e564b9,0x8f0e28bf,0xd2b9f01a,0x1b69bc73,
  118313. 0x3dd383e6,0xab8beb40,0x9791946b,0xaccea0c5,0x000000ae } },
  118314. /* 60 */
  118315. { { 0x0163c2de,0x9a68baee,0xeb2768a4,0xc42d0b2b,0xffdae767,0x5686f124,
  118316. 0x0aaca943,0x926da5d5,0xe01091cf,0x699c34ce,0x5324becd,0x3d254540,
  118317. 0x4193a0a9,0x1b6b58f1,0xd611cc9d,0xf144925e,0x0000014f },
  118318. { 0xc1ed9259,0x7f61a60c,0x2f1d5a7f,0x1be37aa3,0x07aef431,0x0384713d,
  118319. 0x4e6fa7ba,0x99f33d49,0x8bd3730c,0x43928c16,0x5b9557dc,0x73cf8ccf,
  118320. 0xd1a2bee5,0x0bc6d460,0x83b15610,0x27cd1943,0x00000145 } },
  118321. /* 61 */
  118322. { { 0x3427af4e,0x4be65135,0x310d937d,0x2e6c0bb1,0xcaa671c3,0xbd8ea76a,
  118323. 0xd3a9c376,0x9d7b3fd4,0x471709aa,0x124ce863,0x018051c0,0x225ce41d,
  118324. 0xf9e8ee1c,0x5489284f,0x535c4ec8,0x22d829c9,0x0000013d },
  118325. { 0xa1b15e02,0x6b01ed9d,0x301e5868,0x1d092bac,0x5764135b,0xbfa7a183,
  118326. 0x6f7159a4,0xc0ee59b7,0x18090d0d,0x9171a051,0xb8052196,0x5c1531bb,
  118327. 0x20927904,0x740930fc,0x76337685,0x963b48cc,0x00000008 } },
  118328. /* 62 */
  118329. { { 0xf4aaaed5,0x0fe8b620,0xfe871ee8,0x1068de7d,0xfebfcb4b,0x2b22030f,
  118330. 0xc3a2155b,0xd4dfbee7,0x2769b805,0xa7a26a8c,0x6d39eaf0,0x377de770,
  118331. 0xf615f032,0xf1a92447,0x42d9b731,0xa1b81a84,0x0000012a },
  118332. { 0xb1152e8f,0x299e67d0,0x92b5e14c,0x2e773d97,0xf1cb57a2,0xe0d81073,
  118333. 0xbf1da4a2,0x03af0a9c,0xc22b449a,0x169b160e,0xdd2d7d1d,0xb82c1ac8,
  118334. 0xbfc98ee4,0x7508aca6,0xe3cbea15,0x54992440,0x00000150 } },
  118335. /* 63 */
  118336. { { 0xa13a4602,0x70004a0a,0xd0d2c60e,0x505c71a3,0xa6d79bc5,0xa4fe2463,
  118337. 0xd54d9df4,0xe878eb3a,0x73d3c7b8,0x7ecca907,0x244ecfa5,0x5b3bb278,
  118338. 0xb124d179,0x8a30f61f,0x4f632af0,0x5b7e5001,0x00000115 },
  118339. { 0x9ef0021a,0x62c42ecc,0xf856c9d4,0x58017fd7,0x2e6478bc,0x10e243b8,
  118340. 0x1505a4db,0xaf074669,0x4cd7eea5,0xd9bb0a1c,0xd52aed0a,0xe8ba39a2,
  118341. 0xb549f09d,0x0747449a,0x9e57fa64,0xd5c8f7bd,0x0000013f } },
  118342. /* 64 */
  118343. { { 0x5a53c22b,0x1bd8ce7b,0x7cab446a,0x78733fcd,0x48acb394,0xc44ca4e2,
  118344. 0xa38c790f,0xa9888b1e,0x15c34237,0x36afb6eb,0xfb702063,0xb913b8a8,
  118345. 0x917508fa,0x34b77cc5,0xf9e4732b,0xa931d7a7,0x00000050 },
  118346. { 0x56d21d18,0xa90a4290,0x55b410a1,0x82666307,0x894a6b05,0xb4684a8b,
  118347. 0x828cf75c,0x8a1ade63,0x127702a3,0x4fb2f85a,0xadf7b709,0x83ff7d05,
  118348. 0xa68d1db6,0x1d3f5a92,0xc093cd5c,0x243ce1db,0x000000f5 } },
  118349. /* 65 */
  118350. { { 0xd37d7891,0x8fc183c3,0xfd865eca,0x17b50149,0x8f218441,0x0f6e43d6,
  118351. 0x5a07f658,0xaf51ec25,0xad303202,0x8fe5a6cb,0x10676ef5,0x95de68f3,
  118352. 0xca4e000c,0x7508e31f,0x77735254,0x783e5a95,0x00000159 },
  118353. { 0x2e537ad9,0xbc1db571,0x35be9cf7,0x5e87112d,0xd57f9bcb,0xbb522b48,
  118354. 0xa8b3cbc7,0x1eff7890,0xe5ecdb5c,0x4f306e11,0x3387e7ed,0x30da8392,
  118355. 0x72321e3d,0x4d91fcf4,0xe412a67c,0x8487bb62,0x0000009f } },
  118356. /* 66 */
  118357. { { 0x8cb8e08e,0x86f5f80f,0x2496fed6,0x7cfd2c41,0x60b7dcdf,0x0061b743,
  118358. 0x57f4d05f,0x4dbaffdf,0x458061f2,0xb1993c2a,0x9de994c4,0x6c6ca8d0,
  118359. 0x2747e062,0xef70d24d,0xb9995cbc,0xd4e5d4e3,0x000000ff },
  118360. { 0xc6f40077,0x3171e245,0x0723e506,0x1592e045,0x6a6bfd88,0x35c86f7e,
  118361. 0x6d9d9ce0,0xba0959d1,0x3eb5770c,0x2e7f8fe8,0xc40d63dd,0x58eb0881,
  118362. 0xeb9e4419,0x56333bda,0x3afd1f4d,0xfb0397df,0x00000034 } },
  118363. /* 67 */
  118364. { { 0xb358815c,0x7b84e05e,0xe41087d9,0x3abcb2d4,0x07f05d7a,0x87a75889,
  118365. 0x7a9d481c,0x350778d5,0x42d64cbd,0x9d34cff8,0xccf289fe,0x0859cd5a,
  118366. 0xdd2b2c6e,0x8372d591,0x18b40b62,0xc06d482e,0x0000006b },
  118367. { 0xda4ed375,0xd10695a0,0x298daaea,0x51baf588,0xf4b7092c,0xb028a1b4,
  118368. 0x7a335b35,0x8ab87dae,0x0567efd8,0xa7359362,0x3320c374,0x7a49fc10,
  118369. 0xa3558b30,0x737acac4,0x4c0fce9b,0xd30696a3,0x0000001e } },
  118370. /* 68 */
  118371. { { 0xbd3902fe,0xd9550ab0,0x86a9d3b3,0x9bba4b4b,0x975cac37,0x3a59e0a9,
  118372. 0x333605dc,0x045e8731,0x1afc2c58,0xf2c598c2,0xeef9cbf1,0x81ff8d6f,
  118373. 0x9bf83c42,0x82bed5d0,0x528131d5,0x9d1d9d5b,0x00000157 },
  118374. { 0x5519258e,0x687da305,0x027de2a8,0x73f539f9,0xd6a230d6,0x69fa9747,
  118375. 0x5f5d1684,0xab1aeb23,0x5f7e41f5,0x5bbfe947,0x16a7feb3,0xbd546abb,
  118376. 0xe16d5187,0x2afbd4e8,0xbcc953dd,0x7437be13,0x00000160 } },
  118377. /* 69 */
  118378. { { 0xee9755a3,0x55f165a9,0xb82c9ab1,0x0c8d5a1a,0xab6b97e6,0x65a1e45a,
  118379. 0xab05e271,0x3004cdb0,0x6db0830f,0x9e0c3b52,0x75acbdeb,0xaae1ec1a,
  118380. 0x761e8498,0x413d4484,0xb1b9c62e,0x589e09bb,0x000001e9 },
  118381. { 0x9c72258d,0x67512081,0x5c1593d4,0x61dcd734,0x91c11fdb,0x6c627a7b,
  118382. 0x8857908e,0xd1d3e9bf,0x530bc68e,0x9aac06fe,0x6b5b44ff,0x125c16bb,
  118383. 0xdb90edd5,0x38860bb6,0xfbbedb5c,0x96fe8b08,0x000001aa } },
  118384. /* 70 */
  118385. { { 0xf257c0f8,0x323a5dd8,0xdd3a10d9,0x4884dc92,0xbbb8ce03,0x03f379ce,
  118386. 0xa47262a9,0x6217ad53,0x52e06c6d,0xa1df2017,0xc32428cd,0xf5b723e0,
  118387. 0x2c30c62c,0x1e5d3889,0x477f82cc,0xd9a90f1f,0x000001fd },
  118388. { 0x1763ab59,0x830d27ba,0x723783e9,0xcf27d93e,0x945968aa,0x81558264,
  118389. 0x1700d5d5,0x63251a32,0x03146d9f,0xcf6bbe73,0xe65bf0f2,0x6cdcf455,
  118390. 0x632323fb,0x80aa00ce,0xd96a4744,0x6e49e62c,0x00000149 } },
  118391. /* 71 */
  118392. { { 0x40574c09,0xbeff0b7e,0x3fe80e96,0xb76f2643,0xeb237d91,0x0b3bd352,
  118393. 0x7edc3102,0x3c0c62b7,0x424a36dc,0xf989394b,0x7c6c435e,0xe9ea64c2,
  118394. 0xe388d076,0x2dfc21c4,0xa4e69e4b,0xcc3852f6,0x00000139 },
  118395. { 0xbb096b91,0x5238a3ff,0x73d8d43e,0xee72c9e5,0x8c577558,0xc116db11,
  118396. 0xdc47d4b4,0x54ec89d2,0x42e1955f,0x2006dd35,0x7437475c,0x004aed6a,
  118397. 0x2bee9041,0xc1ddc32a,0xed9332c9,0x597417a2,0x000001fb } },
  118398. /* 72 */
  118399. { { 0x859bae66,0x3c0f1981,0x845d7c1b,0xab48e9b1,0x452a3c1e,0xc6ce9c03,
  118400. 0xff810339,0x2384a00c,0x5f98d6fe,0xcd7ede11,0x38a0dd5b,0xf7a00e3d,
  118401. 0x3c7e1c06,0x56dd948a,0x8e53a61f,0x9d21a7d1,0x000000d0 },
  118402. { 0x880eb3fb,0xf9cfdbaf,0x5e83f7c9,0x64cfd297,0xa28a74b4,0x61ba7d6f,
  118403. 0xdfb13e03,0xb8200d5f,0x232a6128,0x03bc8f4b,0x81a8d86e,0xd1fb92c2,
  118404. 0x706d6ea7,0x68675fae,0xefab18c2,0x9b08608a,0x0000011d } },
  118405. /* 73 */
  118406. { { 0xbbd2f539,0x17cf6146,0x76e26ba2,0x96052fc0,0xd4be4a67,0x36821d18,
  118407. 0x9f3f39a8,0x8f823422,0x433f873a,0x68b846b9,0x716f4568,0x7a1d3f36,
  118408. 0x2fd47750,0xdf603e28,0x6975e226,0x77cb02c5,0x00000003 },
  118409. { 0x8c01dd59,0xf275add3,0xb9c1a37a,0x9c213a9e,0x4dfc5403,0x690ad104,
  118410. 0x07ee0d86,0x202ee206,0x661fc40e,0x896ede95,0xd0b02f56,0x6b4d7398,
  118411. 0xe5af1a24,0xccb96991,0xc13f7125,0xd5c281af,0x0000009f } },
  118412. /* 74 */
  118413. { { 0xd7073a5a,0xc858c54b,0x861eac7d,0x87c81a5c,0xe720201a,0x51f84a39,
  118414. 0x40e003ce,0x952a9f8e,0x58f199de,0x76bdc4ab,0xd56cc02b,0x1cf12322,
  118415. 0x83f162f3,0xb6634e63,0x8f969e11,0x84c017ee,0x00000169 },
  118416. { 0x5c89f1fa,0xf1f43362,0xb697b078,0x4a02a630,0x4b05b7f4,0x33311e5c,
  118417. 0x4fede4cc,0xa7ccae51,0x4b025aa4,0x0d26e874,0xf84db7ad,0x7d5b77bb,
  118418. 0xf571c1fe,0x39ef1aa8,0x418ccd20,0x65eba928,0x0000018d } },
  118419. /* 75 */
  118420. { { 0x8abb2537,0xa37866ab,0x65b3096f,0x14ac4cbb,0x2a428ad3,0x827fa7ed,
  118421. 0x10e9e196,0x95d19f62,0x89801b4e,0x31eb97a0,0xaae8b823,0xaae77a62,
  118422. 0x5f5c9642,0x9693d62a,0x3e368b84,0xff5bfe97,0x000000ad },
  118423. { 0x492b0dee,0xa3efae21,0x9602c2ce,0x2143e9ee,0x6f3b99e5,0x21367c99,
  118424. 0xe93b8f59,0xdd78b2b0,0x1064c13e,0x8d541c38,0xf5738e7a,0xe6b970da,
  118425. 0x8373b1a4,0xaf6ecc16,0x74ae208f,0xdbfa3f4f,0x00000180 } },
  118426. /* 76 */
  118427. { { 0x907a6aa0,0xb024621a,0x407879f6,0xef56cb68,0x8168a934,0x44c38b68,
  118428. 0x9b9a9048,0x70d638d3,0x82541f20,0x6968caa0,0x1fc88b50,0x0c597053,
  118429. 0xaf635784,0x5564ded5,0xc4d494cf,0xe7e898c7,0x00000097 },
  118430. { 0x6b6ebb2f,0xe1dc98d9,0x7aa9e126,0x292a17fc,0xfa2a2c68,0xb60f0fdb,
  118431. 0xb2e1851b,0x9c63270c,0x81ca4cfe,0x898db265,0xb11959d5,0x94082638,
  118432. 0xa54b8d19,0xe44f308e,0x44e63094,0x96399eb8,0x000000d6 } },
  118433. /* 77 */
  118434. { { 0xb83769ee,0xfa00f362,0x3efc4cb3,0x72d040ac,0x57abd687,0xc3933889,
  118435. 0x940a7128,0x62264425,0xec242a31,0x909c4c8f,0x65a1a551,0xd1e48f1e,
  118436. 0x049c2172,0x68bd70f1,0x709b7fd4,0xc8692d2b,0x00000041 },
  118437. { 0xdf816784,0x4e388aa1,0x01be75ce,0x4a58c8a5,0x02a67812,0x9b49dffb,
  118438. 0xeda721e0,0xa73299e0,0xe67a65ec,0x8a0bd1f5,0x856c71b6,0xd81e91e8,
  118439. 0xc005aa30,0x37aee2f4,0x0595bbf2,0xd9400750,0x00000073 } },
  118440. /* 78 */
  118441. { { 0x010c0ef3,0xa912ac4a,0x4e81b1a0,0x0e654bd8,0x4f353509,0x8f0563dc,
  118442. 0xb47d189a,0x10dc41f3,0xf238c09c,0x122edd06,0xc41acf67,0x224c16af,
  118443. 0x83758520,0x1ccb9334,0x2275ae6f,0x1a4b5f29,0x00000127 },
  118444. { 0x3ce688b5,0x792fd473,0xdca9c68b,0x14566d37,0x541711d0,0xfce9326e,
  118445. 0x3cc341a8,0xe3ba14ee,0x2122c11f,0x6b8ab4cc,0xf5d379b5,0xc0fa763b,
  118446. 0xf1522f91,0x95e2d2ae,0x31cf95a5,0xd4e21b3d,0x000000ac } },
  118447. /* 79 */
  118448. { { 0x1d8e061a,0x4013a779,0xacc84a30,0x62707e70,0xeb2f636a,0x6ac08266,
  118449. 0x77b25c9d,0xe917ea21,0x70ff35cf,0xddb78bbd,0x041898be,0x5008db2b,
  118450. 0xce0ae445,0x0f58a4fc,0x2257d0e7,0xed092397,0x00000043 },
  118451. { 0xe2e129e6,0x2cad77b3,0x0f1be4d7,0xfb8c4a87,0x20056333,0xaee50dff,
  118452. 0x2a691543,0xbc2658c1,0xb8fe2640,0x95dc0cca,0x1965a0af,0x694eb584,
  118453. 0xedd1d99e,0x7d3baa53,0x8a1edc87,0x2df13b20,0x00000083 } },
  118454. /* 80 */
  118455. { { 0xd181c3f2,0xfead2247,0xf337b23f,0x915d35be,0x74890672,0xdb4cfcba,
  118456. 0xfda7a3a1,0xe4f70d8f,0x79275686,0x226b6419,0x6ff1f79e,0xe8040863,
  118457. 0xcf5fa4e8,0x98e84b39,0xd8a09f60,0x57aa0be9,0x000000da },
  118458. { 0x4efcea66,0xd40cecf5,0xafc76fae,0x98df2aec,0xc91585a8,0x63f19a48,
  118459. 0x13f00aa5,0xb111bda7,0x44b5cb9f,0x6687afab,0x652620d1,0xc6d5fb12,
  118460. 0xbacb35ab,0xaf953f1b,0xff94c4d2,0x99709370,0x000000ed } },
  118461. /* 81 */
  118462. { { 0x68b54c89,0xac9f56e0,0xce737c22,0x08ecc17d,0xab089b53,0x208ee83f,
  118463. 0x543fbd1b,0xb0f3a129,0x844dd706,0x1b204cf8,0xdec2e40d,0x80975c89,
  118464. 0x9399914a,0x08b011ae,0x74674df7,0x6b4ba170,0x00000017 },
  118465. { 0x8fdfc175,0x71216ea9,0x7e0f5b0c,0x77b7fc63,0xceb33a34,0x88d0285f,
  118466. 0x0223eab7,0xb679814f,0x51c6d922,0x9078720b,0x9c13f51d,0x5859d5a4,
  118467. 0xfaed60b5,0xe69f850b,0x6d0ccab2,0x2499a844,0x0000005c } },
  118468. /* 82 */
  118469. { { 0x73e7bcf1,0x41d581fb,0xdd3c17be,0x16dde61c,0xfa199fd9,0xc62997ec,
  118470. 0xc159db97,0x1a758873,0x64132830,0x4ed77896,0x2942a918,0x9672ce89,
  118471. 0x816ba4bb,0xf3ee4587,0xce54dd7f,0x4fb7a148,0x00000123 },
  118472. { 0xf009be8c,0xf05d80af,0x78df1ba1,0x62e938d7,0x312de620,0xa7e22e84,
  118473. 0x6070c4b9,0x48d29e7f,0xa1b5da37,0x5cd9c3eb,0xa4717453,0x1e51bd2f,
  118474. 0x56ab9e67,0x94098ab0,0x49f7c6a1,0xbb584abc,0x00000049 } },
  118475. /* 83 */
  118476. { { 0x1ea470f7,0xa9f25530,0xe9254e30,0xa01bf808,0x71a0038d,0x098569ea,
  118477. 0x5913ca87,0x0d2b2ee1,0xb8281fdb,0xae17004b,0x118e5c2a,0xdb5c6eb0,
  118478. 0x1fa943ab,0xa56ac64c,0x1a92d501,0x1aaf6477,0x00000053 },
  118479. { 0x06345730,0x9679ef49,0x846f37c2,0x946aaa4e,0x1a7c3aab,0xf81726b0,
  118480. 0x8166df4e,0xcb808da2,0x4e04dc3e,0xe9fb3fc2,0x76ec19b4,0x9e0b61db,
  118481. 0xeed6d13e,0x6e7f665e,0x86a75384,0x70ed8c07,0x000000e5 } },
  118482. /* 84 */
  118483. { { 0x108ce13f,0x66456e58,0x0e397813,0xb5bfc58d,0xea3949e9,0x04b6a84b,
  118484. 0x75af667d,0xea9b66bc,0xa891566b,0x7cb4d6dc,0xbf61595a,0x1b3cecf0,
  118485. 0x002e2520,0x4312c73d,0x6135a5fa,0x81d76898,0x0000014b },
  118486. { 0x841078ec,0x4047bc25,0x179c454d,0x75aa9c96,0x4851f8fc,0x6a160609,
  118487. 0xce34091f,0x998d4e3e,0x88e54102,0x9a9f6704,0x5da8ac5e,0xbf280f88,
  118488. 0x8fec230c,0xc64caca0,0x5094b775,0x0ac864b0,0x0000002b } },
  118489. /* 85 */
  118490. { { 0x8f5daf7f,0x6b606e39,0x10927506,0x48385489,0x08c58a72,0xa2255c5c,
  118491. 0xc90f3ee3,0x2f362fd0,0x08795f02,0xc9633af4,0x0425f5aa,0x71710bd1,
  118492. 0xec06dbfb,0xc2017e05,0xc1b8bbcd,0xd9c7dc82,0x000001c8 },
  118493. { 0x18b8bed9,0x7db41fdf,0xe3a23125,0xe9483308,0x7291c4bb,0xbcf91de7,
  118494. 0x41448aaf,0x9b0b972b,0xc44da462,0x95dfc633,0x01bf50a2,0x90b9c463,
  118495. 0x869e3131,0x18b66f77,0x121baad9,0xa8a4e2fa,0x000000f5 } },
  118496. /* 86 */
  118497. { { 0xca0251ea,0x8ca55109,0x27a6c9b0,0xf2aeed8b,0x5620f528,0x901a8beb,
  118498. 0xae13fc56,0x9a8421e8,0x85993c07,0x1349f1c4,0x0d1ab0d7,0x29e08359,
  118499. 0xaeb5d909,0x96e2929b,0xf599a66f,0x96c2f1f8,0x000000ce },
  118500. { 0x12be8bd7,0xe4bc4b51,0x3c67e99b,0xf4846a0f,0x4d3a3864,0xd89cc7d3,
  118501. 0x73f43981,0x1f647112,0x26dce567,0xc32bc324,0xf02b096b,0xf7134ebf,
  118502. 0x0d0682b7,0x5604f00b,0xe3ce8b59,0xfd23d7ea,0x0000011c } },
  118503. /* 87 */
  118504. { { 0xa27689a6,0xf89646cc,0x5564172b,0xd6a7dc43,0xb57cbfcc,0x30bda48e,
  118505. 0x5b1adfe5,0x9b11fffb,0x711d8bf4,0x9f2d80db,0xb70e5a5b,0xe879fdf0,
  118506. 0x6bd18a1d,0x97534183,0x8cbfd504,0xc8c526bd,0x00000114 },
  118507. { 0xef7388bd,0xd5fe725b,0xe7ffaea7,0xf1c3dbdf,0x7e6de2ac,0x78395b89,
  118508. 0x9ebf1bfb,0x81a72c9a,0x69785146,0x65265707,0xf52670af,0x3925ecd9,
  118509. 0x83d57d48,0x437bcdd2,0xc80ecb02,0xb5d732a7,0x000001ce } },
  118510. /* 88 */
  118511. { { 0xcfd376d7,0xa7f9fcce,0xa66b084d,0x6b4eab3e,0xd5b91bd8,0x6ac90d08,
  118512. 0x8aa304d8,0xaa3d5b7e,0x7f866a4f,0x27f3d42b,0xbb813ae1,0x95d19fa8,
  118513. 0xe34a9206,0xd38798d7,0xa32c1cdd,0xdf7c0a69,0x00000073 },
  118514. { 0x38315b16,0xbe2c01bb,0x9e18c8f9,0x1daa7c89,0x08b6b853,0xa3d43fb4,
  118515. 0x68092a81,0xb159e48c,0x836faad4,0x77e93d9e,0xa4699730,0xd4ed6361,
  118516. 0x6297e476,0x569cb3f6,0xe7811fa6,0xb69d8183,0x00000185 } },
  118517. /* 89 */
  118518. { { 0xab9cb764,0x18f27eb3,0x8ebc1d6d,0xbbbefc21,0x0479aa79,0x47760ddb,
  118519. 0x09e542f5,0xb4d16d24,0xbc699b96,0xe35c38d1,0x8c8d8c8a,0x13b2ae25,
  118520. 0x67a3a45d,0x8579c152,0x6c554c04,0x773b7357,0x000000d9 },
  118521. { 0x0218c299,0x9620a473,0x99f78a33,0x69be29b3,0x484f414f,0x4684a009,
  118522. 0x9a2ca4d4,0xb2c74937,0x68db7ab3,0x09c0773e,0x935c357f,0x6181f059,
  118523. 0x8b7de3f2,0x0931303d,0xe0fb6e08,0xf3effcd0,0x00000060 } },
  118524. /* 90 */
  118525. { { 0xb25d6530,0x723c14be,0x9a97d40f,0x5e015b39,0xfbf7f622,0x209c3c4b,
  118526. 0x14b4f0f1,0x83d8c59c,0x3f7e8ecf,0xcf002fde,0x1eb1ef0f,0x35d353c9,
  118527. 0x201f0c60,0x394c42a5,0x7be8ee34,0x787128ab,0x000001b5 },
  118528. { 0xb70110cd,0xa0937d3a,0x477911b5,0xe0fa4efc,0xc53a4c19,0xc6acaf5b,
  118529. 0x38d509f2,0xbd3010f3,0xe54ac1c6,0x3ee2a82b,0xe4f2a3bf,0x31ea67c3,
  118530. 0xf089c7b9,0x7a4ca66e,0x34a2362f,0x5bda2c4f,0x000000b0 } },
  118531. /* 91 */
  118532. { { 0xd1f575cd,0xb424a071,0xa5237182,0x15693b01,0x9a2c9d40,0x14133602,
  118533. 0x9c914a60,0x50c4348b,0x095b31c1,0x9024573d,0x22fd4962,0x6f975fd2,
  118534. 0xe210b277,0xa1704886,0x6dba937b,0xac29b813,0x000001f6 },
  118535. { 0x775da491,0x09edef55,0x2b6aad82,0x25953f9e,0x1bb40d5b,0x6696a106,
  118536. 0x4d5127d8,0xcfc45311,0x81ead062,0x2f21dca9,0xaf3b7123,0x3f3e4f07,
  118537. 0x9646f20d,0x12cd06b8,0x6910f5bb,0x24136369,0x0000015e } },
  118538. /* 92 */
  118539. { { 0x3ecfc44e,0x0c844fd0,0x5043b3d5,0x4095f2c8,0xc9bd059a,0x9a5fe7db,
  118540. 0xf65becdf,0x239328fa,0xa67961cd,0xe3102471,0xbbb5dfdd,0xea9e39bf,
  118541. 0x133dc5ba,0x8022b6d0,0x5f12c379,0xbed7aa9b,0x00000141 },
  118542. { 0xfd94d941,0x096f0059,0x7d4ff018,0xfc6e9f00,0x779f05e3,0xe63af598,
  118543. 0x00483c99,0x4c40f0b3,0x72a19870,0x04d2feef,0x464a4a71,0xdb773b5b,
  118544. 0x49367f1e,0x00b6770f,0x2a9fbd2a,0x4f7e0301,0x00000169 } },
  118545. /* 93 */
  118546. { { 0x8a9095fd,0x0df5dd73,0xd3ce857a,0xc4b7a021,0xe5edc767,0x90aa796b,
  118547. 0x180a0808,0x56497eff,0x66f10aab,0xb9856e1f,0x39879766,0x31298824,
  118548. 0x3ba80601,0x61748cf7,0x555da929,0x07d9076c,0x00000012 },
  118549. { 0x1c44394d,0x0b049a01,0x0ce49e45,0xf5f25ef7,0xb1694265,0x1e3a09f0,
  118550. 0x109b33f8,0x2c5bd9fe,0xa30932e4,0x07f2a43f,0xc6cf8af2,0x736abfca,
  118551. 0xf3366722,0xadf7fa04,0xfa9d26b0,0x2f1e92fb,0x000000e0 } },
  118552. /* 94 */
  118553. { { 0x63be4d4a,0x9524e4a6,0x66f3cc91,0x1fa57bed,0x7e7a7ccd,0xdd7c93fa,
  118554. 0x88c5d1d3,0x70e8cf6a,0x3f251f1e,0xb257997a,0xe3554cf5,0x0a5ec58e,
  118555. 0x065a7109,0x68d268d7,0x085089ea,0x7c23d4d2,0x0000004c },
  118556. { 0xbd52d132,0x63ae575b,0x38c81cc5,0x0fb8daa7,0xe4e63b99,0x096a6e51,
  118557. 0xb239d387,0x51d6b366,0xa5d49fed,0xed5f8874,0x43a8c07a,0x025091d9,
  118558. 0xe4686ae2,0x100f845a,0x7eb4ef5a,0x1af59d74,0x000001c2 } },
  118559. /* 95 */
  118560. { { 0xdd441308,0x5f7bc01e,0x86308890,0x0dc34944,0x759611cd,0x2af38a74,
  118561. 0x4c23ce66,0x11a71261,0xf8bafed2,0x37f317b5,0x4c93e079,0x4efbb9ff,
  118562. 0x8ecc52cf,0x880f0edd,0xddc9d82a,0x480cdd2c,0x00000028 },
  118563. { 0xc3f807ac,0xe8f1ca0d,0xbd070549,0x6a3e4fc2,0x91f8bb6c,0xad3d0a14,
  118564. 0x3d6dfacd,0xe3ee1cfd,0x5fb46ffb,0xee46b1b9,0x7dd5cfbc,0x5207b3ac,
  118565. 0xb1b8e8b7,0xd580c0d9,0xc7bdd11a,0x52c669f4,0x00000084 } },
  118566. /* 96 */
  118567. { { 0xc0ace6d5,0xa42b4747,0xbe7287ad,0xd5acb64b,0x89bc2614,0xf3304899,
  118568. 0xff05c71e,0x817fe836,0xd35ac450,0x772eb246,0x375a9c3c,0x7f5fc216,
  118569. 0xcbc0d6fd,0xfb6f9e1a,0x720e9733,0x7643c315,0x0000009a },
  118570. { 0xf3845ccf,0x4b2216b4,0x90bc05bd,0x9c174e80,0xd6049037,0x7a550c74,
  118571. 0x6358c806,0xbd7220a1,0xaa677b6d,0x838f9c41,0x66e2e08e,0x37332c19,
  118572. 0x496f6da5,0xb032875e,0x9c30630d,0x52b274cf,0x0000000c } },
  118573. /* 97 */
  118574. { { 0x8ea58beb,0x6ec2e782,0x3665fa48,0x2b404c1d,0x20b40ff0,0x546d5fad,
  118575. 0x29d3e6a5,0xfb5df7b6,0x66c81991,0xf186846d,0x6e2cfe3e,0xbe690bde,
  118576. 0x1410d16b,0x97aeb9a0,0xbacc8e92,0x59d81548,0x000000cb },
  118577. { 0xbaf66a23,0xd905d3ad,0x40dfb081,0xc3337387,0x4b00f432,0x6d5535de,
  118578. 0x07d3a03e,0xe17fe8e8,0x066bca80,0x29544ff7,0xbadffa55,0x60c2b96c,
  118579. 0x45a26ea4,0x9f018d94,0x24a34ffc,0xd5438167,0x0000011e } },
  118580. /* 98 */
  118581. { { 0xbd7f8a61,0x62a873fb,0xbbe580bb,0x5e18cd71,0x667f6980,0xfd5c9eb3,
  118582. 0x571d3dc0,0xab8d4f61,0x783f9bc8,0xe2e45215,0x24398b14,0x36c3774b,
  118583. 0x74d811b5,0x2db4a363,0x2debe3c3,0x9f7f1297,0x00000138 },
  118584. { 0x798fefb2,0xbb97f21c,0x107baa72,0x9c76fcb5,0xfadbb568,0x12fbf760,
  118585. 0xd33ea6c5,0x1a648be7,0x236134a5,0x412a2993,0x8985893b,0x4a3d8169,
  118586. 0x3e66ada4,0x6144958f,0x7687b457,0xb4dfc79b,0x00000140 } },
  118587. /* 99 */
  118588. { { 0x7abe5bb9,0x83b14570,0xe51d81be,0xae0cbfd8,0xc9827aff,0x20dadf49,
  118589. 0xa687b554,0xc3a72548,0xeeb41733,0x080263fb,0xd3827c63,0x7014fdc3,
  118590. 0xb5e3b70e,0x7d018f84,0xfbcf7168,0x1d483e00,0x00000015 },
  118591. { 0x6b578aa3,0x154e3c7c,0xd3043dae,0x511ce9b5,0xb6008101,0x55f89e9b,
  118592. 0xf405ac6f,0x4ec31112,0x2008ac7b,0x7e66a4d8,0x25c52fa6,0x73c00d39,
  118593. 0x8acac2eb,0xee1b9998,0x60b57453,0xdfa31d95,0x0000008f } },
  118594. /* 100 */
  118595. { { 0x251cf8d8,0xcc74a0e0,0x041f2bd2,0xd4d8949d,0x33ebce52,0x0b734a49,
  118596. 0x5c5bcdae,0xe1ac5f51,0x16200b93,0xd3ecdfcc,0xa793736e,0x2506a266,
  118597. 0xea6e6940,0x585a1c8b,0x9190f935,0x081cdd53,0x0000000e },
  118598. { 0x53e28412,0x055f9956,0xdb27164b,0x0d1526f2,0x1df3adc7,0xcd5625eb,
  118599. 0xdd35dedd,0xd2c453ca,0xa838ffe2,0xed442849,0x5c0ce589,0xad20c137,
  118600. 0xbd99b609,0x2d5fba81,0x622efb07,0x5be41dcc,0x000001ad } },
  118601. /* 101 */
  118602. { { 0x8f850756,0x563af667,0x52f3b597,0x86d37aae,0x796842f5,0x10d38a53,
  118603. 0xf743f997,0xcdaaf99f,0x93f1a8ba,0x2fa755e5,0x409f7cd9,0x1af04e15,
  118604. 0xd6d0650b,0x63bf9a0a,0x55abfd9a,0x67b1cead,0x0000000e },
  118605. { 0xb5f43178,0x3660a8e0,0x9cc35b33,0x56bd412d,0x880f6808,0x3d7bfa63,
  118606. 0x2e622c71,0x7f372d66,0x6ff82445,0xad7b7be7,0x8db04e51,0x0f2bde80,
  118607. 0x4bd15c8d,0xe1e781fe,0xb8e502f2,0x1f475bfb,0x00000194 } },
  118608. /* 102 */
  118609. { { 0xd63543ec,0x79482bf9,0xa117ef3e,0x985cb67c,0x160ccc63,0x8ac50638,
  118610. 0x729bdc1e,0x556cbed5,0xa22686df,0xd62ed97d,0xc81eb77c,0xb124cb5f,
  118611. 0x72fa2ed9,0x4d7b4f66,0x78335b96,0x60b29aa7,0x00000172 },
  118612. { 0xa43df7c6,0x21bfc7b6,0xbc20706c,0x85acac23,0x345d9580,0xeb6f37bc,
  118613. 0xa32a08bc,0x9d8f20d2,0xd1953c5e,0xf08924f6,0xc4f680d0,0x7d25d7c6,
  118614. 0x2de9912c,0x64e6a237,0x52ce644c,0xda1c06c4,0x000000eb } },
  118615. /* 103 */
  118616. { { 0x411dd110,0x26677c5c,0x2c991c4a,0x0d6787aa,0xa45666d6,0x53be6a41,
  118617. 0xc15f9f15,0x73e716aa,0x0e0cc7b2,0xa93b863f,0x2a624ab0,0xa4057117,
  118618. 0x1a39c260,0xe5e7656e,0x2ef6f130,0xaf8d78b5,0x00000046 },
  118619. { 0x70f38dff,0x796214b1,0x123a1105,0x3e35d828,0x957ed812,0x046a44d4,
  118620. 0x0da60161,0x618fa9ba,0x54f84413,0xe7cdd2a5,0x19ea95ab,0xf1c2563e,
  118621. 0xcb2a30b4,0xc4459e14,0x61ff9aa9,0xc748add6,0x00000183 } },
  118622. /* 104 */
  118623. { { 0x9de58caf,0x32981f39,0x8753ea64,0x05bb80fd,0x2d119486,0xc83f9f24,
  118624. 0x03eeb00a,0xf490cf06,0x7c73d79c,0x4037f251,0x724d461b,0x844209fd,
  118625. 0x272420cf,0x6b03f6d2,0xb3438fa2,0x6f4bd29e,0x00000152 },
  118626. { 0xc389e51c,0x964d034a,0x6db7d98e,0xacda55e9,0xe913c583,0xb2ae97de,
  118627. 0xfeb03440,0x0793077b,0x9d461e29,0xaa16e378,0x043bf8be,0xb0a67533,
  118628. 0xba7d8c3f,0x9d749a42,0x6bb925dc,0x7c41e6d6,0x000000ec } },
  118629. /* 105 */
  118630. { { 0xc5da8398,0x2e9b345d,0xbb38c430,0xbc66841f,0x7c3bb47a,0xce3ac562,
  118631. 0x738d2cdd,0x8fbeb12b,0x68731185,0xd4bc2ad7,0xbbd4f4f4,0x9521db1c,
  118632. 0xfe4e1b0e,0x2a690cae,0x7bfebe3e,0x375215eb,0x00000194 },
  118633. { 0x2edfd661,0x4cb234f1,0xed52c1f4,0x0149984e,0xd8f8f98c,0x32d27260,
  118634. 0x7be38590,0xfe76e4e4,0x95e8b672,0x5435873d,0xf2b00e82,0x916c397f,
  118635. 0xbad61eb8,0x3b9bf705,0xae131bbe,0x7ee90182,0x00000000 } },
  118636. /* 106 */
  118637. { { 0x93fbcb5c,0xd36fea9e,0x9fa8529b,0x382be583,0xfd611ba0,0x0b243125,
  118638. 0xcd8a2637,0xa59ae37f,0x3d8d4704,0xab78c60e,0x44c41b79,0x1bac243d,
  118639. 0xeda49cc5,0xc4001fea,0x83dc7e9f,0x988ea44a,0x000000f6 },
  118640. { 0xf077f79e,0x4d90caa4,0xd9e2590d,0xf4d17601,0xd21b4b77,0x11debbb3,
  118641. 0x9037e1b6,0x031b3f60,0x135becf0,0xf113ed82,0xf2903dda,0xf6c01379,
  118642. 0xa6f19296,0x36bde7ca,0x9dbbad85,0x57d3b684,0x0000006c } },
  118643. /* 107 */
  118644. { { 0x9abfccb0,0x963fee38,0xb9676e63,0x6c6e2a24,0x84ba6d27,0xf8768f02,
  118645. 0x465853d1,0xc38ba3ba,0x1b8ab9b6,0x6e3ab36d,0x47a07331,0x01fc9742,
  118646. 0x25233f32,0xfdd41718,0xac61de7a,0x4dacfa81,0x00000021 },
  118647. { 0xeaa3198c,0x365a9f37,0xfc8b99d5,0xcbe8a345,0xd4f5ecbc,0xa427f12a,
  118648. 0x0c237514,0xe841ff60,0x28a27b05,0x5d9e8c5a,0x62859ff3,0x2d377444,
  118649. 0xea8bde37,0x1c0460ff,0x29cf5bf8,0x0a0e49a1,0x00000181 } },
  118650. /* 108 */
  118651. { { 0x45843c3e,0x688203af,0xaabebae7,0x4601e303,0x624df62b,0x397b08f3,
  118652. 0xd21e5aa8,0x5687348a,0x9a242b0e,0x2cf12c73,0x32a76c6d,0xc848ed01,
  118653. 0xf52751a2,0xb72aa1c2,0x92c02d05,0xb63296c3,0x000000f3 },
  118654. { 0xc6f3d1f0,0xce4b42ad,0x2f532b94,0x2f0dcc53,0x83443d9c,0x57813335,
  118655. 0xdc8dd9cb,0xb50118ee,0xee87192f,0x3039e1a5,0x557419c2,0x9977267d,
  118656. 0x30f96b0c,0x462efa4c,0x3cd3c35a,0x454fb796,0x000001f7 } },
  118657. /* 109 */
  118658. { { 0x9d153926,0x10f28194,0x82b57548,0x42e28c91,0x509e94c9,0x4b423b30,
  118659. 0xde9d6b57,0xc5acc52a,0x8b3ca314,0xaa746c39,0xc63d5bc5,0x0f4ea307,
  118660. 0xe1ccc989,0x425553a2,0xf76d9194,0x271198bf,0x0000008e },
  118661. { 0x3c8e672b,0xc7900e46,0x3f2dfc27,0x703675cd,0xaf2163c9,0x704951f7,
  118662. 0x7aceaab0,0x74d69908,0x7e8d2369,0x482f21a9,0x813dc115,0xdcfbc1dc,
  118663. 0x04f6cd13,0x0ce2bc80,0x82bfaff2,0x2a54662c,0x0000003f } },
  118664. /* 110 */
  118665. { { 0x1588a8bc,0x0dcf41e6,0x210c52cb,0x6f48cd0e,0x758e7a45,0x338562bd,
  118666. 0x48b9b957,0x1600d54b,0xa6b89b9e,0x461df80b,0x098cc82f,0xf7fd4f17,
  118667. 0x14977147,0x167f01cd,0x6116c5f9,0xb1338511,0x00000048 },
  118668. { 0x5d2617f0,0xdeb76333,0x6ecb8606,0x3f9a5772,0x1b91fce9,0xa93c032d,
  118669. 0x6c84b997,0xf7a4388b,0x823ca5be,0xbfe80225,0x35a32f6b,0x6f19c028,
  118670. 0xe3cb5c58,0xf26cd5ad,0x6d0c1dd9,0x7f5ddc77,0x000001e7 } },
  118671. /* 111 */
  118672. { { 0x6ee764c9,0x3c9feec8,0xb07c82cc,0xd1bec836,0xa005b142,0x6bf1b2e6,
  118673. 0x29e8a5ea,0x70ef51a3,0x3ffe241c,0x517d298e,0x72966c28,0xbb389e28,
  118674. 0x2c7acc76,0x3a2da8a9,0x732a21b5,0x902c9126,0x0000004a },
  118675. { 0x8f7ce110,0x96c51b9c,0xaeb036f1,0xdcc33a87,0x0a6a59e2,0x82695098,
  118676. 0xe78db500,0xceaf26a7,0xc95bb030,0x82f3c384,0x24c42f42,0x6dd6e9f7,
  118677. 0x70ac4a0a,0x768dde29,0x03d22efc,0x4aedce4b,0x0000016f } },
  118678. /* 112 */
  118679. { { 0xeded03c0,0x077f032a,0x588ddd4d,0x2684a052,0x9a85be0f,0x6d09bc4f,
  118680. 0xe0b9b6bb,0xbdda0c7f,0xf2fb5887,0x19689c7e,0xec3cce7e,0xf8a96960,
  118681. 0x768d2ae5,0xb043d9d5,0xdb21219a,0x29c8081b,0x00000068 },
  118682. { 0xde59f006,0x6bf872fa,0xcb97ef5a,0xc2b9ffc6,0x58ae7ef8,0x371915db,
  118683. 0xf4ccaa1f,0xc2e23ca1,0x89c27cc4,0x1af8c60e,0xc86bdcc6,0xeee5d7e7,
  118684. 0x9bd8de43,0x9225b47f,0x4b24f08b,0x53e7f463,0x000000b4 } },
  118685. /* 113 */
  118686. { { 0xe3048bda,0x54c496d0,0x43c3de4e,0xe2b67499,0x4c2d509e,0xac2049f7,
  118687. 0x543c5089,0xb01f691e,0x105a365b,0xcd9960a3,0x78b17049,0x34d93ffe,
  118688. 0xf82c9467,0x029f99b3,0x0161a755,0x785c5ea2,0x00000091 },
  118689. { 0x953dbdb6,0xb455f978,0x97eca19f,0xea9e84d9,0x36d4d75a,0x473bd029,
  118690. 0xc15276fa,0xa9c17ca8,0x47c76356,0x9cf66133,0x039738d2,0x4a68360b,
  118691. 0x69733609,0xd3e430a8,0xe2b27f21,0x0ae532de,0x000001b4 } },
  118692. /* 114 */
  118693. { { 0x5164cb8b,0x68110e82,0x2552a67d,0x6979af4f,0x8d185527,0xe10d6d0e,
  118694. 0xfb64eac4,0xcf6c5787,0xac424592,0x8408163b,0xfce0d810,0x5d8fff37,
  118695. 0xda84c15c,0x8b284e49,0x32663ec9,0xed805567,0x00000010 },
  118696. { 0x51f3ee9e,0x106f4030,0xb38adf1e,0x2e8e3ee9,0xa13d6449,0xd3c87a6e,
  118697. 0x80e1abb1,0x27b49f45,0x0bfd7298,0xc283d179,0xafc7a35f,0x8fe50fa5,
  118698. 0xade3ad4f,0x773da545,0xd9a21df2,0x78bfaae4,0x000001f8 } },
  118699. /* 115 */
  118700. { { 0xabad5678,0xae60d8e8,0xe600c25b,0x0afa72ce,0x4c288e21,0xb9d4e0b4,
  118701. 0xd254cf9f,0x64447f76,0x959e2ba5,0x1fb36bc4,0x2961132c,0x393c44d7,
  118702. 0xfc140f19,0xd7a8881f,0x8d096648,0x27a86128,0x00000091 },
  118703. { 0x8a9e690c,0xb536c021,0xeab4fa15,0x85dcc521,0xb00ee54c,0x09af4423,
  118704. 0xaf3a8e48,0xb3793525,0xb7731d85,0xe1f36308,0x141cfb55,0xb5361d78,
  118705. 0xeffc4529,0xea41f29e,0x9f7d2634,0xcf5755b1,0x000000e8 } },
  118706. /* 116 */
  118707. { { 0xd212b398,0x01edb80d,0xd53dd373,0xd0396181,0x8a52fa95,0x0e086047,
  118708. 0xa7825e6d,0xad1e6432,0x330ece4f,0xe0185bc5,0xb078936f,0x508f7313,
  118709. 0x9e7f6ea3,0x1dc982fd,0xd5556b60,0xdbf3a602,0x000000e8 },
  118710. { 0x279e05bc,0xc3763234,0xf44453d3,0x7f5f40ec,0x7fa30793,0x310c5f4d,
  118711. 0x108d7e22,0x5cffad36,0xc2a98bbc,0xf2f01ef3,0xd7d47f80,0x30ab1719,
  118712. 0xa9b22e1c,0x7bc9f918,0xe834df94,0xf53dc52a,0x000001f9 } },
  118713. /* 117 */
  118714. { { 0xc183f89b,0xf266b49e,0x5f5806d4,0xd3fb5f02,0x94ec3080,0xd30a42b5,
  118715. 0x371cd917,0x4b6b1940,0xb7f7e26d,0xf7541aab,0x2d5b7b64,0xe55269eb,
  118716. 0x7f8036c5,0x0e1a85c1,0xda5f2675,0xa0ff0f22,0x000001ce },
  118717. { 0x3a8e11f8,0x602bd56a,0xf5f9ab54,0x29864021,0x0ccc92d7,0xc6742c5a,
  118718. 0x523f650b,0xd64569e6,0xf7fabfb4,0xc8e4681b,0xc3c9e6cb,0xb4275947,
  118719. 0x38f5ff20,0x2b3952d5,0x1f04aea2,0x818f8e38,0x000001b0 } },
  118720. /* 118 */
  118721. { { 0xe50d90f0,0x3be5bffa,0xf5011cdc,0x4cb3b11b,0xa691dfac,0xe10ca711,
  118722. 0x4ea1a773,0x62ec211d,0xe586eeb6,0x5a979ebb,0xa0c2f1fd,0x4df16ab1,
  118723. 0xc57bbfea,0xfe9e3f7e,0x5ae526f6,0x1b05960e,0x0000015e },
  118724. { 0x8630e62e,0x1c8e04a5,0x6447e1b7,0x3d00310e,0x43b4447a,0xcf1e6b61,
  118725. 0x7462e7a3,0x92abb851,0x0002724d,0x8309ea08,0xe45296df,0x1d805d70,
  118726. 0x3d4ed812,0x0f3849b3,0x6834d44e,0x2d6bffbc,0x00000096 } },
  118727. /* 119 */
  118728. { { 0x48e07711,0xd13fe58d,0xd270a3b2,0x70f83648,0x8cdff04c,0x1517892d,
  118729. 0x51411f14,0x15bb6578,0x3e4f8a55,0x6c31cd90,0x0413362f,0x73f87152,
  118730. 0xeca06d4d,0x2fe025ee,0x954e317f,0x32a6e417,0x000000ad },
  118731. { 0x69d147df,0x7e38c63f,0x710bf37b,0xb69bb06e,0x28d514de,0xb94debef,
  118732. 0x8d11c3d9,0x4b2307fb,0x0385c604,0x3b369df9,0xe7800e83,0x68ea2f49,
  118733. 0x7d501c1c,0xf028b258,0x5cef7818,0x97078221,0x00000055 } },
  118734. /* 120 */
  118735. { { 0x54c1d751,0x10c351db,0xba0f9512,0x81445301,0xbfdc8bed,0xa77eb34f,
  118736. 0xcf23680a,0x498d8138,0xe04f2860,0x928c14a4,0x16a5b6da,0x96192dba,
  118737. 0x5f9a9103,0x49dea95b,0x01724102,0x80dd4578,0x00000085 },
  118738. { 0x0e09221c,0xe9072500,0xf21de056,0x62e05b21,0xe0e60950,0x448cafa1,
  118739. 0x6f775129,0x657fb97b,0xf1f34aca,0x5d2991bd,0x49ff15d6,0xa66cd5ac,
  118740. 0xd049ec79,0xdc1d6897,0xe72baea8,0x388fca84,0x00000067 } },
  118741. /* 121 */
  118742. { { 0xa6ef1dd3,0x6520b49d,0x3ba6cd76,0x391a045e,0xf33d5f48,0x9c84980a,
  118743. 0xef07474a,0xe53cf5b2,0x78bfb1ea,0xa35b2e9a,0xeda906fa,0xeca97fd6,
  118744. 0x1b9f2cf4,0xf1a93789,0x3ab28589,0x66753369,0x0000010d },
  118745. { 0x73691faf,0x5b510496,0xd57ec618,0xdc73d3a9,0x930a8525,0x7e2921bb,
  118746. 0x40b05b69,0x094f571e,0x413bedca,0x5e96a017,0x8d1a6b98,0x9e7d4f72,
  118747. 0x3eade8b7,0x55143fda,0xd16e454d,0x859b8444,0x000000fb } },
  118748. /* 122 */
  118749. { { 0x7c667aaf,0x7c22083e,0x4a91ccba,0x33545cb9,0x8ca0e94a,0xca1e9931,
  118750. 0xe4eaa0c7,0xc3afff23,0x42f56844,0xa21ac436,0x60d52d0b,0xfcc68a8b,
  118751. 0x6a9301d4,0x401a585b,0x907abce1,0x547f762c,0x000000a3 },
  118752. { 0xfbe260ce,0x63dd3ed3,0x80dc01fa,0x2717752d,0x6f1da3e4,0xd5fab75d,
  118753. 0x5261f10e,0x5f16864a,0xd20cd6bb,0xbe7b1f63,0x221ac656,0x9d638c10,
  118754. 0x673b918e,0x3137b8f6,0x4ada2fb8,0x23eb4438,0x00000174 } },
  118755. /* 123 */
  118756. { { 0x2a1fbcf4,0x194e27c4,0x5facd5ee,0x4c0d285b,0x915e6607,0x75c2ebdd,
  118757. 0xef0a6a9a,0x1e696510,0x067cf458,0x13c5afa1,0x7bee1fba,0x2be013c1,
  118758. 0xdad279e7,0x85a406d6,0x5142cf59,0x0042951d,0x00000031 },
  118759. { 0xa22bbc45,0x6a735ec1,0x7f56f4d8,0x4ee5391a,0x236001de,0x305af9d0,
  118760. 0xaa2f8d25,0xa8b21851,0x187db78a,0x0e2c36d8,0xa1a888c3,0xcfcc083f,
  118761. 0xbd3e7d5b,0xb91dab7f,0xf4fdd023,0x62d85460,0x000000f4 } },
  118762. /* 124 */
  118763. { { 0x4972d703,0xf568ba02,0x39098a03,0xfc44ca1d,0xae28c855,0xe9b8e542,
  118764. 0x5b1b4536,0x4fd4f360,0x4c7f7e48,0x2e08b07b,0x2230823d,0x042f3b98,
  118765. 0x1889fd13,0xc9ffd313,0xc6c68359,0x56af0652,0x000001bb },
  118766. { 0x06e0f16a,0xedbf05e2,0xd74644a5,0xfc1ac2fa,0x0f92c71a,0xe59a0a98,
  118767. 0x36c800a1,0x13ae37d7,0x236178dc,0x5f20efc6,0x2b46ef10,0x443a58b8,
  118768. 0x442509e4,0xc9517dcf,0x640ed9b0,0x7d0bb415,0x00000166 } },
  118769. /* 125 */
  118770. { { 0x3d22842d,0x3aa30a61,0xb3c4ece0,0x8c6e00f5,0x6df82b79,0x8764cf87,
  118771. 0x78d208c5,0xda92d86d,0xe788854a,0x0a52d391,0xa59b0994,0x499b26fb,
  118772. 0x04c5fc9a,0x5dc133ad,0x34e3f134,0xa5c09269,0x000001dd },
  118773. { 0xfad6d673,0x6f0dcac2,0x00f3b3fe,0x6d8fdf05,0x631756e9,0xece71941,
  118774. 0x0a4d80e3,0x3990f493,0x31d13001,0xf2aca936,0x75581638,0xee91966c,
  118775. 0xe6dd5679,0x6df0f574,0xccd71cda,0xbe124868,0x00000111 } },
  118776. /* 126 */
  118777. { { 0x475cc1b4,0xf644c726,0x2b73978c,0x915fc2f9,0x0e3d7eb7,0x65a7e6d1,
  118778. 0xf40c38e0,0xbb44e21a,0xe1ad24fc,0x988662b9,0xc35606e5,0x270ba4dd,
  118779. 0x1a4f93f7,0xc3834a2c,0x3362a4d7,0x93d0c9a2,0x00000021 },
  118780. { 0xf769fd7f,0xe2cb7b8c,0x89a213b9,0x1815da97,0x6b910fef,0x7b4f8c56,
  118781. 0x26931438,0x2088b309,0x925b37c0,0x477b71bd,0x26a640e5,0xa049a921,
  118782. 0xfd21c6ef,0xd3ddf1bd,0x232a56b2,0x9b5f9d7d,0x00000064 } },
  118783. /* 127 */
  118784. { { 0x679a9c35,0xd640adf8,0xcb74d796,0xcdad98e3,0x5f8e9daf,0x464b8ebb,
  118785. 0xad4a073c,0x4738614e,0x2edde557,0xbd86c0ee,0x576ce0b9,0x77331738,
  118786. 0x4095fb96,0x9b5d3327,0xee09aead,0x72f0aeb3,0x00000136 },
  118787. { 0x64e54ba5,0xa388c76d,0xdc474d21,0x63fe7af1,0xb2a77081,0x7fa3e9d1,
  118788. 0xde1240ad,0x0447b49e,0xc720303a,0xd9f64b66,0xe6bd0213,0xb1c78029,
  118789. 0x0aa03ea5,0x1caf1c70,0x3bb85d2b,0x179180eb,0x00000103 } },
  118790. /* 128 */
  118791. { { 0xaf2ed12f,0xadbf4f9f,0xf380fd8a,0xce1d19e4,0xa39e81ae,0x0957bdb5,
  118792. 0x626ef6bc,0xf9833321,0x0cf5b28d,0x110ae5ea,0x20392cd4,0xab159450,
  118793. 0x6bc67855,0x67c49887,0xa3fd61c6,0xce7e5938,0x0000004a },
  118794. { 0x28c7dea9,0x59c5b9ef,0x0a6a7184,0xd02f95ba,0x8202769c,0x034dc257,
  118795. 0x94dd6896,0x213b0b08,0xb5dea95a,0x03730b7f,0x617ca889,0xfe243ed0,
  118796. 0xfb1ba052,0x16cf4d17,0x226f96da,0xd8691d6b,0x000001c0 } },
  118797. /* 129 */
  118798. { { 0xbf8015c2,0xaa2edf3f,0xc49502d8,0xe7f8236d,0xa6a43157,0xe890f6e0,
  118799. 0xa2d04b0c,0x318ef325,0xa809dbab,0x9cc0668d,0xda67ca21,0xdd26937a,
  118800. 0x83febc49,0x8f27c12c,0x3c9b9844,0x87b3db2f,0x00000029 },
  118801. { 0xfd2e3dc7,0x37e7aed0,0x7415fd55,0x498e8bdb,0x58a45f25,0xfc0d6c9a,
  118802. 0x209c85d0,0x83d5baba,0xd579e1ee,0x31ec8dc6,0xa502bfed,0x1f4cad0b,
  118803. 0x1f41bef1,0xc432e6ce,0xbbffca65,0x3b10afaa,0x00000191 } },
  118804. /* 130 */
  118805. { { 0x53053af7,0xbd9f7df0,0xb28a1cf4,0x60304765,0x7ce90438,0x441778fc,
  118806. 0xac8c5ddd,0x8fbed36e,0xfb59ec61,0x27b1313b,0xa1b1becf,0x9d2656ff,
  118807. 0x945973a9,0x334e1345,0xc362b595,0x3261888c,0x0000018c },
  118808. { 0xaa7f6ff8,0xf413a414,0x3fab7c7a,0x092aeb88,0x7cc307ba,0xfa1d886b,
  118809. 0x2346100e,0xdc81c125,0x02140c93,0x93d4d273,0xe6104835,0xa1ed7e3c,
  118810. 0xdf1795f3,0xe2b91ecf,0x369ed416,0x160dc11a,0x00000191 } },
  118811. /* 131 */
  118812. { { 0x8b57d7cc,0x9a72f46e,0x4bf02386,0x3140b0e5,0x05b3a91d,0x886c396e,
  118813. 0xa4ec26e0,0x1b9ab3a9,0xc50f58e9,0x742feaeb,0x55e26af0,0x1592c608,
  118814. 0xbb1cd9f7,0x943cd476,0xc7f02c89,0x3ed97fd4,0x0000017c },
  118815. { 0xe6d54964,0x53b02503,0xc6a318c0,0xd9bd1162,0x9cc28c22,0x18ff6cf4,
  118816. 0x03534640,0xa45c7840,0xb4cc0668,0x8ea3335e,0xf42dbe03,0x7ad727f8,
  118817. 0xfdf6c3cd,0xb157e911,0xec992d76,0xa7f894c9,0x000001b3 } },
  118818. /* 132 */
  118819. { { 0xaf09ea77,0x91e6e397,0x75dc25c5,0x26a760b9,0xb94a197b,0x8c040c08,
  118820. 0xb68ce619,0x041baca8,0x5bd23564,0xa19a0d15,0xd977b33f,0x86ca5b94,
  118821. 0xe5fbd029,0xf31f87f8,0xb1901f99,0xf76c55a6,0x000000b8 },
  118822. { 0x3846ec9f,0x175bf8c3,0x9deaca46,0xf462205c,0xa3108df0,0x92cb5ec0,
  118823. 0xcfaed928,0x879db283,0x65049fb2,0x477dc004,0x96ee5031,0x48d24bac,
  118824. 0x56adce45,0xa7db6b16,0xab1c684f,0x0110cdab,0x000000fc } },
  118825. /* 133 */
  118826. { { 0x4d308bf2,0x151b66d8,0xd6638004,0x99013c9f,0xfd383bf9,0x6892df92,
  118827. 0x3ffc8efc,0xa10efd84,0x313ea287,0x527e316c,0x3a0df740,0x8ef6e3cd,
  118828. 0xf6ebd2a1,0xcb96e430,0xa70ee4ce,0xc1ebecf2,0x0000018c },
  118829. { 0x1a70404c,0x80d14ad7,0xf9ce2a30,0x6ad21dd0,0x3aa3e072,0xb94cbcde,
  118830. 0x6363a690,0x0ab59611,0xc6b1e2b4,0xe70bff45,0x66ceec5b,0x1296dd0b,
  118831. 0x747757c0,0xd4cb2a74,0x3d7d91e8,0x08988ca6,0x000000aa } },
  118832. /* 134 */
  118833. { { 0xf8db0396,0xaa2dcfca,0xb422da76,0xe8ae8f37,0x96485724,0x652f8349,
  118834. 0x7bf1493f,0xf647c3c4,0xb0247a4e,0x8b600b46,0x7aebda8e,0xabf3e439,
  118835. 0xa7958df0,0x2e1d231f,0xf881bab2,0x38e692b1,0x000000ef },
  118836. { 0x26cf3047,0x1f3c1689,0x59539858,0xdad14f94,0x293f20b6,0xfde85d1c,
  118837. 0xf57abb17,0x2ea5436e,0x1794de38,0x0d1a8ffc,0x2bfecd2f,0x9ba508e2,
  118838. 0xdb786042,0x110f0a7f,0x7cde31f8,0x2ade6f64,0x00000196 } },
  118839. /* 135 */
  118840. { { 0xfec78898,0xc996a537,0xde0fa77f,0x0b39de72,0xd34cb08f,0xf6d076ac,
  118841. 0xda78d353,0xacd8bb82,0xa0392cc1,0x5fe804d3,0xe581549d,0xab7adede,
  118842. 0xc067c6d9,0x883901a0,0x4ed93f37,0x5855ffa2,0x00000191 },
  118843. { 0xbf9ebef3,0x29570e36,0xdf4b3177,0xe21046a5,0xa6816b5c,0xf9b89a95,
  118844. 0x288d0e11,0xadf39281,0x3979159a,0xd6baabe5,0x5c8fabb2,0x411afee0,
  118845. 0xe5c7af10,0xf192c3af,0xd7dce37b,0xaa72e81c,0x000000f7 } },
  118846. /* 136 */
  118847. { { 0x16c386ee,0x20fa3c0f,0xd4c09839,0xb33b0469,0x876a3136,0x79e0d722,
  118848. 0x3c406c06,0x343c0a92,0x4debe27d,0xef220e3e,0x196f00ea,0x09d7b1e1,
  118849. 0x24a9dcff,0x4a0f5dd8,0x99c1d085,0x53582ec5,0x000001e2 },
  118850. { 0x5138c7ed,0xcc8ef262,0x6547f88d,0xdec43194,0xdd0a9488,0x2b6e53ad,
  118851. 0x8257ebdc,0xeb9f1efa,0x1f08c989,0xc583c6eb,0x40163768,0xf1736911,
  118852. 0xdbc20e3d,0x6282ff8b,0x9cbd514e,0x26b81005,0x000000d5 } },
  118853. /* 137 */
  118854. { { 0xa0025949,0x2449522f,0x0bbd8945,0xb26d888f,0xe637216f,0x33442f5f,
  118855. 0x472827f6,0xd8ec3b64,0x99fc2681,0x91d8a1a3,0x68c7710d,0x6d232ead,
  118856. 0xe51b2762,0x8e5bfe2f,0xfd109fa7,0x0f9f4fed,0x00000004 },
  118857. { 0x6b4a05e0,0x1952ea51,0xf21c78eb,0xcb0d48ee,0x1997dfdb,0x64d36619,
  118858. 0x8b4c21fd,0x0d11b204,0xbe92303a,0xa6f569b6,0x78c5e809,0x2b8f6096,
  118859. 0x36805d8e,0x7226b5ab,0xdb349ca2,0xd6cff180,0x000001bd } },
  118860. /* 138 */
  118861. { { 0x943cc612,0xa49f8576,0x832b31c7,0xc914319e,0xcccadebd,0x9225e297,
  118862. 0xb0619821,0x4918fb42,0x25b1cc7c,0xaccb3084,0xa646e5f0,0x751d3347,
  118863. 0x590e3e22,0xeafb4aae,0x2c4a0008,0x82146038,0x00000151 },
  118864. { 0xbf96a461,0x3c2481db,0xb52a3ba4,0x51c122e9,0x464db08b,0x21c2858e,
  118865. 0x6d6a081d,0xb1014b78,0xf533cef7,0x167d3ed4,0x81545f7c,0x6cfb3294,
  118866. 0x449b7b9f,0xea46d31c,0x9621c299,0xcfad7613,0x00000081 } },
  118867. /* 139 */
  118868. { { 0x478a7f0e,0xef796327,0xde17705d,0x914183e2,0x572117e8,0xd24a26df,
  118869. 0xb7cd52cf,0x3cdb1b09,0xad83c160,0x9e42b9fb,0x709ef8c9,0x6971d2ea,
  118870. 0x8ee54ccd,0x1894fc5b,0x34a520fc,0xf757b4e5,0x000000fc },
  118871. { 0x86b62347,0x5a5518cc,0x7bc2a928,0xec51c9d2,0x2966727f,0x2eea2b05,
  118872. 0x0ae43e6f,0xbc8a8e3a,0x05ca066b,0x80535b5e,0x8833986d,0x91ffcdb1,
  118873. 0x32374cdd,0x2f4a5bba,0x0d202243,0x08763a49,0x00000124 } },
  118874. /* 140 */
  118875. { { 0x4efac14d,0xe498b972,0xa79a9d3c,0xb6f4bf8d,0xd6e07c29,0x0f1e8dbd,
  118876. 0x71771538,0xfac30cfd,0x71b03263,0x4c91ed22,0x19b455f5,0xbf938335,
  118877. 0x127092bf,0x76a5e789,0xb4813bd9,0xa97674e1,0x00000128 },
  118878. { 0x583e5924,0x29b63c41,0x8f171d06,0x61f9aff1,0xab227a28,0x2b45b3cd,
  118879. 0x8a11ab70,0x939d5dda,0xe8db6971,0x2bfb47b0,0x0ec10805,0x562379df,
  118880. 0x24ce1801,0xaf5a6481,0x34f94aba,0x8d98c434,0x00000150 } },
  118881. /* 141 */
  118882. { { 0xcfffc80f,0xdea9fe73,0xd43473f6,0xe23e2e9b,0xc9d37ba7,0x27fb3ed3,
  118883. 0x7a3fc357,0x733766d2,0x8e04a03d,0xd0db4cf3,0x2bbe0f43,0x8ce01752,
  118884. 0xda986f4f,0xd87eb719,0x2fe6b037,0x6d1b50ae,0x00000153 },
  118885. { 0xda40bab1,0x371f5def,0x9b2bda63,0x07d6a8af,0x0d4aca87,0x5e8a5c89,
  118886. 0x643ff8ab,0x4d72f0ff,0x4bf8ec2f,0x9c4c10d9,0x0eb93e22,0x36b0eaba,
  118887. 0x1d2dfd01,0xbc4b0e8f,0x9d34a082,0x9f252e5a,0x00000142 } },
  118888. /* 142 */
  118889. { { 0x7d0e7020,0x4affd4c1,0xb5482168,0x9b169aaa,0x588f348f,0xdbe01708,
  118890. 0x885986bb,0xdaebf6ff,0x15f9c381,0xb33987f5,0x04a94a7b,0x7e455f2c,
  118891. 0xa0ed6849,0x39a41442,0x1ef7798c,0x1c1ad4a6,0x00000154 },
  118892. { 0x072709c4,0x7647b628,0x8810e5fe,0xb330d68b,0xe92e0f63,0xd1bd8874,
  118893. 0xf8bea9ba,0x144e4fb9,0x8318981a,0xc15afc18,0xb68c6a07,0xe19c5c82,
  118894. 0x36e00b66,0x858c57a2,0x07cb7aec,0x9b255110,0x00000011 } },
  118895. /* 143 */
  118896. { { 0xc887027d,0x121ced27,0x2bfab286,0x6050f335,0x19d511e2,0x6e373c1c,
  118897. 0x7f4c69f5,0x02d4c3a9,0x25226bb4,0xe6f356af,0x83e7ac30,0x3b9011c3,
  118898. 0x33d8fdfb,0x43b0c23d,0xaf2ea363,0xa8c390f7,0x0000000b },
  118899. { 0x7e851bac,0xc430c3d6,0xa5f544fc,0x8991c389,0x67fba061,0x006bbc64,
  118900. 0x97cbdbf4,0xd49d024e,0x7734adad,0x4539b7dd,0x28cb6d2a,0x90ba8f9f,
  118901. 0x4de4b3ad,0x7a921830,0xa7b96928,0xb28732ef,0x0000006a } },
  118902. /* 144 */
  118903. { { 0x22ed5986,0x71dab52d,0x58533e06,0xdeee627a,0xcf155fe3,0xe8fee37a,
  118904. 0x7ae8b132,0xcd61490d,0x34a08b94,0x2706e185,0xf9c15c30,0xa85ffd52,
  118905. 0x51a5ad46,0xd5a224f3,0x54d700bb,0x44d1b6d5,0x000001e6 },
  118906. { 0x862e4e9c,0x96830686,0x48763fe4,0xfe5cd76c,0xc0839caa,0x60309679,
  118907. 0x8d83d62d,0xc0e4cbeb,0x11bc4ae2,0x911e254e,0x64fca062,0x96a0d7c8,
  118908. 0xe9a27045,0xf5785dd5,0xf3e0412c,0x2f4677d0,0x000001be } },
  118909. /* 145 */
  118910. { { 0xab01a6dc,0x4c0012dd,0xae1adb69,0x391bd6c1,0xb9b05079,0x3ae7daec,
  118911. 0x62a1061f,0xc2714f9e,0xa96536b7,0x71978ee7,0x5e17654b,0xeec11bd0,
  118912. 0xefab3dd4,0xc71166e0,0x87edbf61,0x0f7aa572,0x000001d7 },
  118913. { 0x51eb5932,0x26ea6f7d,0x5f882ca4,0x354ea0aa,0x7739f7dc,0x175b6097,
  118914. 0x9be57934,0xd335192a,0x78545ecc,0x9801f423,0x7b643c9d,0x32b8e256,
  118915. 0x23e3abec,0xb9411dd7,0xcf1c6509,0x656dea68,0x000000ee } },
  118916. /* 146 */
  118917. { { 0xa0890deb,0x4d38e140,0xbceb84bd,0xbf7bd87d,0xba041dec,0x51f0ff72,
  118918. 0xa6820be9,0xafeec70a,0x8c486298,0x755190a3,0xe7010ec4,0xecdba558,
  118919. 0x8c7879b1,0xced91db8,0xef5e215c,0x08de3e4c,0x0000014c },
  118920. { 0x16266da2,0x9c1534ed,0x7b4c9009,0x9ce322eb,0x69927688,0x37decaef,
  118921. 0x05c2844d,0x6525097f,0x1ac519ab,0xd23b7e13,0x65a3cc86,0x682ebb72,
  118922. 0x628c4575,0x0c531db9,0x73805373,0x2e00e8b8,0x000000be } },
  118923. /* 147 */
  118924. { { 0x57ed32e9,0x3807c800,0x7c024997,0x427e40cf,0xabb54830,0x58506abb,
  118925. 0xce820bf4,0x5649776f,0xb2c43e81,0xb5353293,0xcfef6648,0x671e8353,
  118926. 0x903bdca5,0x27217d3f,0xa813fd79,0x40a9c109,0x000001dc },
  118927. { 0x3db21a38,0x6beaa6c3,0xd73ef7e4,0xcae222e1,0xbd1d507f,0x1ff684e7,
  118928. 0x587a77ab,0xf5bac664,0x0c64a4d6,0x58c74f62,0x6a7c378a,0x4ca837d9,
  118929. 0x3e42e409,0xf43df531,0xfb49e14f,0x8a9a4347,0x0000013f } },
  118930. /* 148 */
  118931. { { 0x992f8923,0x85ab4edf,0x6fd209f3,0xe24aa5e0,0x1b1340ee,0x27be9b87,
  118932. 0x91e0bb40,0x2957d11f,0xf3d4c62c,0x425afad2,0xc7ff7aaf,0x2d231286,
  118933. 0x0114cbe9,0x96412b2b,0xc3e23529,0x6706a231,0x0000019f },
  118934. { 0x225c02af,0x06b3bbd2,0x3fa3e98d,0x53ebc166,0xb84f482e,0xa6df2b75,
  118935. 0x2bfc55df,0x912b4521,0x512a73da,0x30bdbd40,0x3d53eaa4,0xac0f43d9,
  118936. 0x0c27fd53,0xfc358fe4,0x919424b4,0x2cb183be,0x000000a3 } },
  118937. /* 149 */
  118938. { { 0x3fa6a746,0xe39b0c2d,0x1d5a24a8,0xe84a7922,0x78cdf2b5,0x70a58914,
  118939. 0x30666cb3,0x8a88067d,0xf6d71d06,0xb09a709e,0x0065d184,0x50007a3e,
  118940. 0xb8dc9448,0x7046af4b,0xc65493ac,0x2b6a3129,0x000001fd },
  118941. { 0xe45f2771,0xd3d5d5bd,0xf432ed95,0x8542b08a,0xf232a6bb,0x2ecd40fb,
  118942. 0xe8beccb2,0x0fcb6143,0xbf8e247f,0xcecc513a,0x8da3039b,0x955d56f7,
  118943. 0x56c2a0df,0x9157c619,0x3031fe2a,0xa6d35cbf,0x0000018c } },
  118944. /* 150 */
  118945. { { 0xbe0c4923,0xdd800b1b,0x6902907b,0x046ae740,0x957bd0c7,0x2398b37f,
  118946. 0x9655f8b8,0xaa8e1a9d,0x500f4150,0xcd2927fa,0x202e7aee,0x826a9c6d,
  118947. 0x9f29692e,0xb4cf58b3,0xbf41577c,0x3093868c,0x0000011f },
  118948. { 0x333ed442,0xadcb5e7a,0x906fef7b,0xae5c8e2f,0x3d98f228,0x2d9b0123,
  118949. 0x7ffe125c,0x4632f2da,0xba231835,0x59487731,0x12d2c512,0xa0caae5b,
  118950. 0x9857d9c4,0xbf00e658,0x54f200f6,0xc5d10086,0x00000172 } },
  118951. /* 151 */
  118952. { { 0x2fc283e0,0x58954046,0x7ee0880e,0xf7633984,0xb7fd1622,0xfaf1b40e,
  118953. 0xf598c5ed,0xecf5151e,0x7e00d9bb,0x6b4d92f7,0xa8c43fd4,0x7543e3b3,
  118954. 0x6511d1d2,0x3994e12c,0xaf05b6d3,0xdd841a1d,0x000000c6 },
  118955. { 0x23b991ad,0x23da17e0,0x71fba514,0xaab2b213,0x0ddc1879,0xb417ec5a,
  118956. 0x5f63acdc,0x173bc8ad,0x1e2a7d50,0x2fcf5210,0x6106d008,0x63373fd0,
  118957. 0x7db012cf,0x1e8211de,0x576545ef,0xa07766d9,0x0000018c } },
  118958. /* 152 */
  118959. { { 0xaf80dfaf,0x8e4347b9,0x9c4667f3,0xa80b631f,0x6ddbc238,0x6ff1db26,
  118960. 0xaa8718a0,0x6161e365,0xaf31c35f,0xe7f7ac90,0xfc6846e8,0xc03831d1,
  118961. 0x684175b4,0x1e669d10,0x934b731a,0x6da9d620,0x000000c7 },
  118962. { 0xa3e4e78b,0x981f597b,0x55099f9a,0x2c14dedc,0x93088c61,0xbf373995,
  118963. 0x9b207458,0x7c568307,0xa2276900,0xc4440c47,0xf7e6daf3,0xb6df23c8,
  118964. 0x42929103,0x4f662c25,0x8b3b7963,0xf4ea6db1,0x000000f9 } },
  118965. /* 153 */
  118966. { { 0xced36049,0xc669eb88,0xf41b99f8,0x87a4ffe1,0x6a72e108,0x690b7563,
  118967. 0x65a0bb8a,0x67dd6a8c,0x96e42955,0x42cf8c58,0x1aabffad,0x5286b5f3,
  118968. 0x8f6f26a4,0x1f7dfaf2,0x0e1ae503,0xc5d9e0ac,0x00000120 },
  118969. { 0xacc10da7,0xafbee3ff,0x944946e5,0x67e2d5f9,0x3c4220ff,0x8ec17e86,
  118970. 0xbd6f632e,0xfe6f7414,0xc3fc9ef4,0x4a9e3c0f,0x03bfb870,0x25ff3cba,
  118971. 0xbb03342d,0x18fd3600,0x0050cd2e,0x1e63e753,0x000001ac } },
  118972. /* 154 */
  118973. { { 0x8f3d6a02,0xdd83d07c,0x7ef4d0d1,0x71fc143c,0xd4c7af61,0xca994bf0,
  118974. 0x827c5cf0,0xc8a93e98,0x2b697882,0x4a102c7b,0x8a55e8ba,0x633c87d5,
  118975. 0xcc2d64f0,0x1ae8822f,0x986d01fc,0x2ce9b53f,0x000001c1 },
  118976. { 0x95dc1b79,0x859639fd,0x3f4e616a,0x2728f754,0xede2fb9f,0x6e703c4c,
  118977. 0xd50fae9e,0x042f7680,0xc2d530ed,0x0546bc3b,0xcdd598ac,0x00a4006b,
  118978. 0xe1294910,0x3f3286c9,0xb6bf9629,0x77782255,0x00000146 } },
  118979. /* 155 */
  118980. { { 0xe30c98fe,0xaf81421e,0xfc2cd705,0xdeb0feb0,0x14df6ad2,0x9b2c4ca6,
  118981. 0x9ba314e8,0xd38134de,0x4f04b16d,0xa443deb8,0xf07f8ca8,0xfc556ee0,
  118982. 0x3a4f3917,0x3c1c83bb,0xb1adcd41,0x8397dd24,0x00000199 },
  118983. { 0xdf4781e6,0xca01e17e,0x46f1f901,0x32d7c319,0xb53090da,0xa227a613,
  118984. 0xa7c8c607,0x2495b1dc,0xddc69709,0x1cf2fbee,0x45608098,0x1d3d82bb,
  118985. 0x085134d7,0xcfcddda3,0x96798c41,0x3dd171b5,0x000000d2 } },
  118986. /* 156 */
  118987. { { 0xd4dd7e96,0x97a40f84,0x8409fc0c,0x7114c8ea,0xa9d11393,0xc56f29e6,
  118988. 0x8fd8c6d6,0x3b606621,0x00269e7c,0xad3baa86,0x05929d5f,0x1413c6b0,
  118989. 0x222e365b,0xc1ad7e40,0x4798aaec,0x6a82621a,0x000001d3 },
  118990. { 0xc1003c81,0xaeac45c4,0xf43d8602,0x9ef9ef5a,0x60f77469,0x36a65f5e,
  118991. 0xbf5d2858,0xf312e7ab,0xc84acef1,0x2f53ec81,0x9d248b52,0x63e32ca2,
  118992. 0x81e65c60,0xfe9aa7c5,0x52841973,0xe3686c9a,0x00000017 } },
  118993. /* 157 */
  118994. { { 0x9e90de99,0x0b2efe65,0xad05ab63,0xbe4485bc,0xe14e4892,0xc48a6a52,
  118995. 0x22628687,0x2ad85430,0x5eb3db54,0x261f0e95,0xd45e5841,0x48e81863,
  118996. 0x8ed75739,0xcfe1ce0f,0x7d84ade4,0xbd6f1ff5,0x0000003f },
  118997. { 0xd1bf968c,0xd43711dd,0x48dfa472,0xd558d7cd,0xe425a566,0x49f09223,
  118998. 0x5c26d041,0x0cf83338,0x7c2c1743,0xbe7b81f1,0x5143d9d9,0xe3bdc33e,
  118999. 0x94fd3fae,0xf385ac35,0x9fd1811a,0x7551cf42,0x00000113 } },
  119000. /* 158 */
  119001. { { 0x20193bb2,0x4928f55b,0x7310b872,0x96e579d0,0xd345d276,0x5ee06309,
  119002. 0xa871868a,0x9a43e432,0x11038683,0x28c113e1,0xa332f108,0x8286ecf3,
  119003. 0x0385cbb4,0x3348aa37,0xef158daf,0x698ffcaa,0x000000c6 },
  119004. { 0xf6908745,0xa044c54a,0x6a3353fb,0xa6b336e4,0xd561e821,0x694c2852,
  119005. 0x3634917f,0x1b297970,0x81f61315,0x6e1023b9,0xef46a5ef,0x6817dc2b,
  119006. 0x8e114f7f,0x93dea0af,0xed72c5bf,0xc3cf3cd5,0x00000136 } },
  119007. /* 159 */
  119008. { { 0x7b080de4,0xbb8799ab,0xd69d8396,0x3b8f781d,0x986f8f63,0x76b42aaa,
  119009. 0xa54bc5ca,0x5d74c038,0xa9c2fbb9,0x76fcb605,0x80178930,0x8451b440,
  119010. 0x9d286f0d,0x40f00c38,0x0c543263,0x3038e952,0x0000014c },
  119011. { 0x6977aad9,0xc94bc381,0xd7087be3,0xadbfd082,0x875fed08,0x06d0820c,
  119012. 0x345656fc,0xe1ce84d4,0x0fd6dd4e,0x71c4d8e0,0x6a5fab40,0x23338b22,
  119013. 0x0baeeb6f,0xd477eac1,0x5f80c26c,0xe4db08bb,0x00000078 } },
  119014. /* 160 */
  119015. { { 0x1078342a,0x0111d12a,0x559a1064,0x0534725e,0x0fd3ffdd,0xea459d59,
  119016. 0x06f0ac1f,0xcf694a9f,0x3e19bc69,0xf6d24adb,0xb9ddcd00,0x3ce38f5e,
  119017. 0xb632dd4e,0x38400f66,0xe15e1c55,0xcab8fdfb,0x00000085 },
  119018. { 0x8d09422f,0x0a943f6b,0x0f988c3b,0x17d29756,0x2ef2e4d9,0x55a441fa,
  119019. 0x35f7c13f,0x6743523b,0xedaad3ff,0x274d3407,0x9347242d,0x59411435,
  119020. 0x3bb8615d,0x1cb27301,0xbd7794cd,0xa0437004,0x0000007d } },
  119021. /* 161 */
  119022. { { 0x2d712c44,0x824b99a6,0xa6962577,0x148368f8,0xd65e2287,0x8ed68432,
  119023. 0x6f5bc5f8,0x14028306,0x4ec3479d,0xe6cf3121,0x9326db70,0x96db6f44,
  119024. 0xca32936b,0xca5ac098,0x2fea21af,0x69e248c7,0x0000004d },
  119025. { 0xa71269fb,0x0aa89092,0x18650b60,0x2f6bdba8,0x9fb55db2,0x1d9cc2a3,
  119026. 0x6311e9d0,0x0fceb0df,0x90ac2c1d,0x6faeb79c,0xcb1f372a,0x2393b222,
  119027. 0xbc8c4193,0x62a6f3df,0x2fe8e674,0x9dea30b2,0x00000001 } },
  119028. /* 162 */
  119029. { { 0x12b3118b,0x7df689ac,0x6cb6ea56,0xd06ee39d,0x187cd978,0xcfcc22c2,
  119030. 0x8d537d87,0xb985b681,0xe9f56db2,0x75845152,0x5e098c15,0x0f839871,
  119031. 0x3b212cd2,0xbe96a5c8,0xd9ac1c47,0x3dda0338,0x000001fb },
  119032. { 0xcfa0a9b8,0xf06b7fe0,0xe22dcf75,0x9478bac7,0x136887c8,0xf3815e04,
  119033. 0x914c54bc,0xed811dde,0x0f51ea64,0xc8c24160,0x4c870577,0x63914d83,
  119034. 0xa8abbcb4,0xed24e552,0x2644f52e,0x9e5eb9e8,0x00000001 } },
  119035. /* 163 */
  119036. { { 0x66d52313,0x1f65a04e,0x4d3f72bd,0xfd694545,0xa6b7ae11,0x2bc0ddaf,
  119037. 0x571ab247,0x921f79d8,0xae5a8d68,0xd4c5f966,0xaec5ce13,0xfde17716,
  119038. 0xb764bd39,0x70e6eda4,0x990d6783,0xffe94085,0x000001ef },
  119039. { 0xd88f92e8,0xf3fa0e27,0x9c77123c,0xa21ef0fd,0x89274dba,0x6259974c,
  119040. 0xb9ba2762,0xd4cfa4a5,0x46ebcaf6,0x10c909d2,0x8f8e2870,0x0317a10d,
  119041. 0x453aeea2,0xb0771de1,0x68c6b0a3,0xdf0c4791,0x000000ea } },
  119042. /* 164 */
  119043. { { 0x4c854477,0x11bc1e48,0x8638e47c,0x2bec25b4,0x869c54d9,0x43d4e02b,
  119044. 0xbe1e7ed2,0xe318de32,0x6b460c4a,0xf5471eb0,0xaa426afe,0x38ae7bf3,
  119045. 0xd8452dc1,0x23ae26dd,0x5782de9d,0x9d3fc1d5,0x00000164 },
  119046. { 0x0ade1979,0xd87cae31,0x3b4bc728,0xa847041d,0x56c3c9be,0x38923c40,
  119047. 0xd74ae467,0x36fe182a,0xecbe49ae,0x92bff6f4,0xdc41f9f5,0x6680db80,
  119048. 0xe4630715,0x35bac06f,0xd6d07307,0x6d68b4c7,0x000000c0 } },
  119049. /* 165 */
  119050. { { 0x854dfcf2,0xdbe22be7,0xa6ae3bd0,0xee21a7df,0xa521ec46,0xf4633ad1,
  119051. 0x41a9484c,0xee94527a,0x2aa123f3,0x1145eb9b,0xcae3ca92,0x5634a82a,
  119052. 0xfc85d925,0xe176aca0,0x19082d8c,0x504cf7fc,0x00000078 },
  119053. { 0x3799793c,0xd74ce7c4,0xb5519fb5,0x74ddd618,0x95ff9808,0x2cf6df93,
  119054. 0xb8bf61e6,0x00ea45d1,0xdcfcf54f,0x26863613,0x030035b0,0x67423b76,
  119055. 0x4028a9cb,0x9fbc7534,0x051a077e,0x7b52ce37,0x000000f4 } },
  119056. /* 166 */
  119057. { { 0x96bec962,0xebf7d8ad,0x17e0107a,0xd1cc81f6,0x214e1058,0x64c44509,
  119058. 0x42394c9f,0x6c298c43,0x1a660513,0xd910052d,0x90df8243,0xc3643754,
  119059. 0xfe5cdea4,0x2313be1e,0xd27fb7b1,0x249a60f7,0x00000076 },
  119060. { 0x1cf593a0,0x74975838,0x8364c59e,0x0c9ceefb,0xe05c9991,0x2f5a1333,
  119061. 0x421808e3,0x30ea5e1f,0x4f5e8f4f,0x56fb3a4f,0xb6c0cb47,0x2cae6e2e,
  119062. 0x08bdcc6a,0x60b307fd,0x0ff8c117,0xee17901c,0x0000001a } },
  119063. /* 167 */
  119064. { { 0x89aa9e14,0xc048336b,0xf676700f,0x66634271,0x906b6980,0x4daa0433,
  119065. 0xebb7ab23,0x30247ee1,0xeb59a053,0x969b4aa7,0x8000f4d5,0xd78ef825,
  119066. 0x46026b5b,0xe5db38eb,0x7d6856c4,0x06a43e5d,0x0000003b },
  119067. { 0xed2a0ee7,0xaa0ae838,0xf16e8813,0x04bbe528,0x4ea64137,0x8ab6df5c,
  119068. 0x06e29867,0x5be80cb6,0xf459ed2b,0xf19b1b72,0x1761521a,0x7a9cce4d,
  119069. 0xaa516f3b,0x39aff994,0xb3416925,0x97d92e86,0x00000007 } },
  119070. /* 168 */
  119071. { { 0x5af3a8ca,0x25aeede1,0xa5c351ec,0x33924782,0xf93ec080,0x41e7a3fb,
  119072. 0xe6f425b4,0xb04f93c4,0x81e76009,0xe4ec12ec,0x5180ffc6,0x797366d4,
  119073. 0x0e0aef3a,0xd293cbb5,0x68d71d91,0xa1496944,0x00000061 },
  119074. { 0x675a67a1,0xf52c541c,0x8f5fe906,0x67d38d30,0xf6be988e,0x2a70bccc,
  119075. 0x18589886,0xae03ecbe,0x7067045b,0xecd02616,0x10ca8d96,0x1facdd99,
  119076. 0x30c0735d,0x7aa10a82,0x3328f21c,0x2a27e554,0x00000015 } },
  119077. /* 169 */
  119078. { { 0xe6057e27,0x3dd609e0,0xc7a454da,0x87e8b6a7,0x1f32dd5b,0xff599145,
  119079. 0xd0ef51e2,0xea397a88,0x25567546,0xc49866a1,0x3228b480,0xea45c8b1,
  119080. 0xdd01997a,0x3dbe0e77,0xc51867d2,0x0e2ea28f,0x000001f8 },
  119081. { 0x69d0820b,0x6295412d,0x1ea65a18,0x03173127,0xeb06380d,0xc27c8221,
  119082. 0x75fe9706,0x7ffd4efc,0x5a71d250,0x7b396a57,0xc7cb7543,0x61c80051,
  119083. 0xad4dbee3,0xe07db4d7,0x9b192d45,0x1c7481f4,0x00000143 } },
  119084. /* 170 */
  119085. { { 0x08e1cc4d,0x5eab2d04,0xad2dc1ee,0xe93758d3,0x5c9c7393,0x0ceb7dfe,
  119086. 0xd3379683,0x530d86a9,0xe24f86d7,0xef5283ca,0xf0b1bb0b,0xab5d1a64,
  119087. 0x54db4e3c,0x96aabc1f,0x3bc00c59,0x3e3d87cc,0x00000144 },
  119088. { 0x1d60e7b0,0xe50a8213,0x5d33d018,0xfc9b629b,0xfd05338d,0xc54aee42,
  119089. 0xe821c6ea,0x0678f2c0,0x06ac09cb,0xe5c9d75f,0x53018df6,0x83357513,
  119090. 0x0bf8c667,0x81ca6fac,0x9d0ae2dd,0x7fc8020e,0x000000e1 } },
  119091. /* 171 */
  119092. { { 0x1baaa5eb,0x8add4741,0x79bd8036,0x02cbb759,0xcdffed22,0xd8680c40,
  119093. 0x4e091141,0x1c23a8f0,0x20748b87,0x65d141ed,0x659e9289,0x586a1575,
  119094. 0x5006dbfe,0x7c68d7cd,0x22569a74,0xda0ad0df,0x00000148 },
  119095. { 0x7f9069d7,0xc8fcc5db,0x5c0531a4,0x2487d245,0xe9a2db3a,0xc5ab4899,
  119096. 0xb4fe9720,0x52bfd538,0xd27f35e4,0x73a04ca4,0xee2dac93,0x7cbbc549,
  119097. 0xff3ee7e2,0x0287229d,0x28da9360,0x3179878d,0x000000d0 } },
  119098. /* 172 */
  119099. { { 0x3b66c047,0x89b7e9bb,0x602a3e1d,0x22e65869,0xc8db9c00,0x44f82297,
  119100. 0xd08a74a3,0x0e76aca3,0xfcd398de,0xfbf1a71d,0x8320e66a,0x2fbb6eaa,
  119101. 0x179c9fc5,0xa82d0ebc,0x4e7ab2b4,0x4e00cf6f,0x0000000f },
  119102. { 0x4890c439,0x424c0e9a,0xbc35a6b2,0x37564a2b,0xd9b7497d,0x95a4479d,
  119103. 0x612de942,0xa1ff3f0d,0xe60d0033,0x358627fc,0x522417da,0x815da8c0,
  119104. 0xef6b8385,0x506104d4,0xf16e96aa,0x800728d2,0x00000120 } },
  119105. /* 173 */
  119106. { { 0xab039042,0x976f2372,0x9fa084ed,0x10e6978c,0x58bec143,0xd03fdd2f,
  119107. 0xfe2045c3,0x3200c101,0xb0a5a928,0xe6868f7a,0xe61faff8,0x26c95d1d,
  119108. 0xb7b12265,0xa1e20127,0xc2a5ed17,0x8e63dd78,0x00000089 },
  119109. { 0x22bba4ee,0xbb6533da,0xf496a574,0x3eff6397,0x14f2a6b9,0x409329f7,
  119110. 0x1dfdd73f,0xa08248bd,0x69bca1b1,0x62f33f2e,0xba2e0327,0x9a177e64,
  119111. 0x75ddf741,0xbc50e993,0x4a56bd1c,0xb87a979f,0x00000095 } },
  119112. /* 174 */
  119113. { { 0x67c1f177,0xe83736a9,0x600133c9,0x1b6d3508,0x6eac9a5b,0x9424bb92,
  119114. 0xc27ef31c,0x7a9c01a6,0x122b4870,0xad93bba5,0x9d1ac985,0x9eb94e2a,
  119115. 0xd53f175b,0x511c0206,0x5102d914,0xd13eb252,0x000000b1 },
  119116. { 0x675a1171,0xcfe7dbeb,0x16c0d2b1,0xb228295c,0x057c88ca,0x8db25b5a,
  119117. 0xd300e9cf,0x73ea9e96,0x269552eb,0xb0e0037f,0x9e0f98df,0xea9d035c,
  119118. 0xd290480f,0x860e49b8,0xc036b319,0xa35e9512,0x00000037 } },
  119119. /* 175 */
  119120. { { 0x8f00df48,0xc56729ee,0x11ac8304,0xb89ca7b6,0x8b3a8123,0x497a57f9,
  119121. 0xc21ca3ea,0xe0431b19,0xe2bb3ce7,0x45a73deb,0xadc77819,0x2f86cc2b,
  119122. 0xe5eb3df1,0x5ff005e4,0xdd27dcf0,0xf955dd7a,0x0000005e },
  119123. { 0x00ee402f,0xe0c22ffa,0x3b30bb4c,0x5b335e2a,0x643cb101,0x542551d0,
  119124. 0x3cd19688,0xc6183f45,0xf0be54b4,0xc6664f22,0x4c20cde4,0xa5f4cfee,
  119125. 0x80a4c475,0xdcaa972f,0x59111ed9,0xde4af200,0x0000019c } },
  119126. /* 176 */
  119127. { { 0xd771f428,0x9e9d0bc8,0xe43ca382,0x3ac1ecd9,0xeb93acf0,0x8d5ee480,
  119128. 0x065a2a3f,0x16232f81,0x2f0b8a73,0x1fc04faa,0x025474a2,0x4a8df7e7,
  119129. 0x3bb15f6f,0x51ac4ff2,0xe0950e52,0x66e21b73,0x0000006b },
  119130. { 0x67a41dee,0x59c98480,0x7b3e2b3f,0x2cfa95ae,0x891454e1,0x54d98386,
  119131. 0xeefca6a4,0xf0dddbdf,0x11e9cb75,0x5f691b24,0xfef208c3,0xa9b9e766,
  119132. 0x18b33cf6,0xe8df1000,0xd1c174a9,0xb8a55ac9,0x000001c4 } },
  119133. /* 177 */
  119134. { { 0x5c4cccb8,0xa99f5862,0x2ef4d3ef,0x70bf5209,0x89efc878,0x28f4e576,
  119135. 0xda14206e,0xa2366f96,0x7c52107d,0x90331a00,0xd4a0f0f0,0x478d4cea,
  119136. 0x472a47b0,0xb2899ee2,0x64207549,0xae96534e,0x00000110 },
  119137. { 0xcced05b0,0x2cc1d655,0x01759543,0xabac3f09,0x8e577cd7,0xbaeb70a4,
  119138. 0x40e98d6d,0x84b00893,0x603d24f1,0x26983653,0x2572173d,0x6e145883,
  119139. 0x611141de,0x1d348b26,0xefa27f34,0xe52257dc,0x0000006b } },
  119140. /* 178 */
  119141. { { 0xc947e655,0x92678f33,0x08923795,0xff0fb76a,0x790239d1,0xb2dfe745,
  119142. 0x3cdbb7ce,0xea087492,0x05f6d41c,0x21326db9,0x79dc5588,0x5b1ae9ae,
  119143. 0xe9c31702,0xe145340c,0xa2c38a9c,0x07502c29,0x000000c3 },
  119144. { 0xc156ace2,0x0c124f11,0x79ff2529,0x2c170fe7,0x6e1171b2,0x60df9a81,
  119145. 0x55de2797,0xa19bca83,0x7c6cc79d,0x1ad927ea,0x1d61f770,0x28590112,
  119146. 0x261c06bb,0xfe80c826,0xaa2642bb,0x4050d338,0x0000015e } },
  119147. /* 179 */
  119148. { { 0xeaad87bc,0xc9397829,0x81e84cbd,0xe0ac9367,0x6ade4fde,0xb579c24d,
  119149. 0x690d7f56,0x50b9aba5,0xd14fb0b9,0xf09b29d3,0x25a0e7b6,0xd0684f23,
  119150. 0x606f4ff3,0x0514e9d3,0xe8ad733b,0xe63bdd26,0x00000077 },
  119151. { 0xe0d25c6d,0x0afd06ec,0x00ba2dcf,0xdd90021a,0x8c5bb398,0x1b025770,
  119152. 0x198ff8fc,0x077f06d8,0xb7e2cd68,0x87d50ff1,0x263a3572,0xef75e057,
  119153. 0xfa925a9a,0xbf257892,0x739d0e95,0x847d3df0,0x00000111 } },
  119154. /* 180 */
  119155. { { 0xfec82924,0x52ab9cc7,0xa7220d69,0x1c76dd69,0xa06ef0e2,0xa63527de,
  119156. 0x27183904,0xab3e51c2,0x716807c8,0xf4db35ea,0x748f1246,0x8f3ede0a,
  119157. 0x41156095,0xf1493644,0x874b38de,0x5f6583d1,0x000000f7 },
  119158. { 0x0b927eb7,0xa39189e1,0xc2e2f127,0xa87c6359,0x7fe966f4,0x0b72c233,
  119159. 0x105e5585,0x102b8382,0xe58c39f9,0x63fee006,0x991b5329,0x3f052ee3,
  119160. 0xcbaff97b,0x7f5b854c,0x5f805060,0x935e5f6c,0x0000016a } },
  119161. /* 181 */
  119162. { { 0xdfd88d38,0xf19a0355,0xc549df40,0x555cd8e3,0x04d006e1,0x322729e3,
  119163. 0xfd0b0ce6,0xf16b706c,0x35f2ad31,0xf156dc09,0xf7a3df9f,0xb30c5213,
  119164. 0xa55e5fb5,0x9f29cc92,0x2b858da2,0xa0ecfdd4,0x00000144 },
  119165. { 0x52658a92,0xb5c115df,0xc4281616,0xbce3ed17,0x7fd92a91,0xa5595f70,
  119166. 0x9cd5d896,0x663c8bfd,0x5a9472b1,0x0776343f,0xb033e1bd,0x14e44ca8,
  119167. 0x1e5c02fb,0x27a1c986,0xcc4ffb32,0xece0f2c4,0x000001b5 } },
  119168. /* 182 */
  119169. { { 0x31211943,0x17127bab,0x5684325c,0x44a8cac6,0xd855fc3e,0xd2fe0b88,
  119170. 0xce91eea5,0x47abab0c,0x78ec7d12,0x5d23ddc4,0x0cd9fefa,0xa3986de7,
  119171. 0x82655766,0x32c7b867,0xeeaec7fa,0x3e54018b,0x00000087 },
  119172. { 0xb38d17c1,0xc96e86f2,0x71fa040d,0x9cbfbd0c,0xf88499cb,0xe111ab79,
  119173. 0xf71ec80b,0x1d47c5ce,0x46c89692,0xacaa3bc1,0x3d316331,0x5f921c0e,
  119174. 0xe768765b,0x31fa081e,0x41eff270,0xd5dafd5f,0x000000fe } },
  119175. /* 183 */
  119176. { { 0x4cda1348,0x8af10b9d,0x25c3013a,0xb0769fd2,0x8957c22b,0x450aa5b1,
  119177. 0xf5acf1c4,0x5cafd6c7,0x9fef8029,0xcf71a140,0xee089f5d,0xe12029f5,
  119178. 0x0fbd2ba8,0x9752a8fb,0x6f70cb58,0x61e2275f,0x00000090 },
  119179. { 0x1fbda16a,0xb70a4ac5,0xf1dfa2a2,0x79910e79,0xd9945f6f,0xba2ce132,
  119180. 0xeb4ba4ef,0x450d59ae,0x4bf2d53d,0x6a8e09b3,0xe620c7a8,0x76010204,
  119181. 0x0a53c6f4,0x63f8943d,0x87eaf56a,0x14c91d19,0x00000132 } },
  119182. /* 184 */
  119183. { { 0x490d66c3,0xe54fb120,0xa0dc8204,0xeaed7328,0x04b4294d,0xba014c38,
  119184. 0x31ddc467,0x3f2fa2ab,0x8342ed11,0x70ff55ea,0x23034e0e,0xb18da72f,
  119185. 0xbd8ae3c1,0xadc30dbe,0x3e945a02,0x179bdf6f,0x0000009c },
  119186. { 0x7484c26f,0x46c928ef,0xef2adbb1,0x206b7db1,0x3f58dda7,0x0887f548,
  119187. 0x4bc7edb6,0xfde4e20c,0x975cafdc,0x484d121d,0x86beec20,0xc5b59670,
  119188. 0xa6d6db67,0xb579aa88,0x41187488,0x22c6d87e,0x00000015 } },
  119189. /* 185 */
  119190. { { 0xc471d4ae,0x0a890757,0x43a1da76,0xfef4b1a5,0x6aa701a1,0xb892b182,
  119191. 0x59c65f93,0xbf4d4e52,0xd789df35,0x923af929,0x0b79c3f2,0x3ccb46c6,
  119192. 0xcf4cf130,0x95582ce7,0x257f0ec4,0x7da081b4,0x0000011c },
  119193. { 0x9aeef274,0xf92c6ae5,0x1437c083,0xe6c5bf4f,0xe13c86af,0xaa74b023,
  119194. 0x2a225360,0xd21dace6,0x22589fa5,0xb3d572b8,0xdfa74b0f,0x3d4a3916,
  119195. 0xb12891a9,0xe76cd8dc,0x59f4cfbd,0xa0391a3f,0x0000019a } },
  119196. /* 186 */
  119197. { { 0x203fc3f1,0x054ba69e,0x62106a29,0x09168ccb,0xaad5fa9f,0xb0818540,
  119198. 0xbff7ed6f,0xecb8f20e,0xbef94afd,0x2c80a618,0xb0abd1db,0xe25d8ca0,
  119199. 0x028e0a7c,0x75e67a41,0xd6e95b9a,0xdd7662dd,0x000001b2 },
  119200. { 0xf289d7ee,0x87dff279,0xeea2205c,0x4d755d59,0xc18adac6,0xaeb0fd54,
  119201. 0x7ec01019,0x3a8c46cf,0xb48d70a4,0x6fc90e7e,0x10b39ef8,0x965c53c1,
  119202. 0x38545a20,0x455777cc,0x57dd023e,0xa33430f7,0x0000016e } },
  119203. /* 187 */
  119204. { { 0x0ff53d2c,0xfa9f3949,0xb00349b9,0x8dc91596,0xd5997967,0xf10a5014,
  119205. 0xa8a6b78a,0x4dd72dab,0x8b517b10,0xef5de540,0xa6d39be0,0x142b90bc,
  119206. 0xeda17f70,0xcaeaa3e9,0x06b31118,0xa01689d6,0x0000016d },
  119207. { 0xf46afff7,0xea6ca563,0x34a5e5f3,0x3945c7ba,0xaa998fd8,0xc1ffe4c8,
  119208. 0xb63f535e,0x42a60146,0xd1f509e5,0x50816888,0x9f8cd0db,0xd1918daa,
  119209. 0x78a36772,0x6505e6bb,0x9cc6dc66,0x4ab03a81,0x000001ef } },
  119210. /* 188 */
  119211. { { 0xd376d986,0x06089d14,0xa2dc35b0,0xd0f4e077,0x53ff2c86,0x1c11709a,
  119212. 0x123c3fc8,0xfef4ba45,0x1b656fc2,0x852cd5a7,0x1fefa8bb,0xb57c7489,
  119213. 0x48110b77,0x8f05383e,0x52c5a129,0x4b55d3ad,0x0000004c },
  119214. { 0xf3827633,0x5110cff3,0xe00afe96,0x086784d5,0x3ead32fa,0xcb387882,
  119215. 0x2b91cd86,0x3dcf4d16,0xe6f3638a,0x078b6a58,0xe8b7fd42,0x33792112,
  119216. 0xee5683e7,0x6964044d,0x28e28433,0x3b84210f,0x00000122 } },
  119217. /* 189 */
  119218. { { 0xc3ebeb27,0x6c28a9a9,0x3ef590f8,0xd7bcdcb5,0x4dae7f37,0xe88a2e11,
  119219. 0x726ea7c9,0x033522e4,0x8c141388,0x99d50386,0x61621575,0x59b1aeca,
  119220. 0xfcc564d8,0x719fcfeb,0x1aeb8e36,0x3a577af1,0x00000043 },
  119221. { 0x6feba922,0xc3f26ce0,0x475a5693,0x5f6c83ee,0x28bf378e,0x7f796740,
  119222. 0xbdc3f6f1,0xd2a5e368,0xa6ed90ae,0x3d034a0a,0x4a47cbd5,0x3b1c3a4c,
  119223. 0x4dce2bc8,0xa4f0aa6e,0x74ca00eb,0x97c7af43,0x000001c0 } },
  119224. /* 190 */
  119225. { { 0x79c28de7,0x00377178,0xab9c330c,0x617aa2aa,0x66bc61eb,0x43081826,
  119226. 0x4d78b504,0xe0b5b5cf,0x9870fc72,0xd76a752d,0xd40b7bc5,0x3b4689f5,
  119227. 0x87f2d03a,0xa97fd867,0xfd6060a9,0x6ab7b5ee,0x000001c0 },
  119228. { 0xffb71704,0xe99eadb1,0x390fe3b1,0x436e58bb,0xab4f19aa,0xeecab82c,
  119229. 0xe0f3d9dc,0xda492dfa,0x6e20ad12,0x2a0f54bd,0x7dbbd262,0xaf89fa0f,
  119230. 0xe8d2eb54,0xdcc50a1a,0xef7d0758,0x9799f816,0x000000b7 } },
  119231. /* 191 */
  119232. { { 0x104f98cc,0x9ec46462,0x72aedeae,0x45115922,0x7e62186f,0x7ae93dd0,
  119233. 0x8d6d69b6,0xd17ce026,0xfd43a8f3,0xb5347608,0x7c0ab797,0xe87f1c13,
  119234. 0x139f991d,0x3bf597a8,0xe547e0d6,0xe293a85b,0x0000008d },
  119235. { 0x8ef668b1,0x0982add3,0x611c9764,0xc54e6b2d,0x1c1d4263,0x3ce76b12,
  119236. 0xeff64e73,0x3134b28e,0x2871612a,0xaf71a9ac,0xba093594,0x31c88af2,
  119237. 0xba9108e8,0x0b649112,0x5cf437da,0x8febc5c5,0x00000113 } },
  119238. /* 192 */
  119239. { { 0xc4a2daa2,0x7e9ca589,0x400f608c,0x18ea703c,0xd5175103,0x6f8cd058,
  119240. 0x4abb6f29,0x26493472,0x94296ab4,0x0be553e1,0xac51657d,0x9af9398f,
  119241. 0x4f880ea8,0xe232deec,0x67b1e1b1,0x2f81761e,0x00000137 },
  119242. { 0x3a20f662,0x51014bc7,0x49ed9502,0x1fb7e77c,0xb62b9652,0x89f5096f,
  119243. 0xa2e8d37e,0x3a659c67,0x5804170e,0x0f2b2a26,0x9ed50a34,0x1674fce6,
  119244. 0xfdc3c00f,0xaaa4537e,0x4ce99d93,0xf3c3bfda,0x00000198 } },
  119245. /* 193 */
  119246. { { 0x81614189,0xbab1f5cd,0x24b259f7,0xc7d56c45,0x45fb415e,0xc7baa4b2,
  119247. 0x7af6bef9,0x302bc8dc,0x74b48e82,0x91b770e0,0x9b6d1b1f,0x4a1336e0,
  119248. 0xe6680c97,0x285c1357,0xc7ccb625,0x59bcb813,0x0000012d },
  119249. { 0x7c019927,0xddad83b4,0x630dfd5b,0xe10f2667,0x31e05d23,0x15dbec5a,
  119250. 0x456ac460,0x2aa6e5fa,0x243cac82,0x46956529,0x4dc8c9e9,0xc69c9c7f,
  119251. 0xe24a4065,0xadb27e09,0xae41301b,0xdfa7a34e,0x000001cc } },
  119252. /* 194 */
  119253. { { 0x59cb1a7d,0x176a864d,0x6aefb8ee,0x4d864ca3,0x1c22b0d8,0x0ee83acb,
  119254. 0xd980df1d,0x7e80a6eb,0x7f94ced9,0xf582acc4,0x3a72c115,0xa29cd123,
  119255. 0xc7107bb7,0xce12a2a8,0x4ed80a30,0x0229ca56,0x00000150 },
  119256. { 0x2f1c180b,0x9774bad5,0xd749aa10,0xd08be998,0x56dbd1ba,0x978c48ab,
  119257. 0x0afbea9a,0x6ed3e3e4,0x153dc5fc,0x8a8be97b,0x9be93ed0,0xadc7f095,
  119258. 0x2cee23bd,0x8d242908,0xdc2729de,0x417523c6,0x00000016 } },
  119259. /* 195 */
  119260. { { 0x6c14a31e,0x74eeccf1,0xb2de3c2d,0x488e2534,0x7cec43c3,0xf9bb3599,
  119261. 0x916ac936,0x4210459d,0x9f7e4400,0x71d15c02,0x44553583,0x8c9c7c12,
  119262. 0xec94a467,0xcc97548d,0x3167bad9,0x4ca67818,0x0000014e },
  119263. { 0x8d0312bf,0x033af055,0x54161e66,0xbd1bf4f5,0xfa41781d,0x259945a7,
  119264. 0x00eef1d5,0x33494da8,0x79c3b8d0,0x6c505ec0,0x1c9f6e69,0x70ae1ade,
  119265. 0x76830aaa,0x0288f0c1,0xa62a060c,0x7f4cfe3b,0x0000000c } },
  119266. /* 196 */
  119267. { { 0x057d6006,0x0d8b447d,0xfd71c8b0,0x38b976e6,0xabcf40f5,0x5e77e029,
  119268. 0xf103a783,0x13bee386,0x5e472c4b,0x20a6ac20,0x31fcb194,0x43b045f6,
  119269. 0xc00abf49,0xe5dc1d9f,0xa5556b79,0x28c0bc70,0x000001b5 },
  119270. { 0x8a8640b8,0xba9d07ee,0xd0e34012,0x25611023,0xbe24ae89,0xc7ce655b,
  119271. 0xfa579dcd,0xe358e524,0x377bbfe5,0x57ce2715,0x3c0947e4,0x64651c6c,
  119272. 0xf4a97826,0x5fbd8d50,0xe2e1c15a,0x6fcdd28f,0x0000008d } },
  119273. /* 197 */
  119274. { { 0x5c7202c8,0xb564a2f6,0x5a54b0d8,0x7d634052,0x1434fbf5,0x8414d672,
  119275. 0x1d9830a3,0x8114215e,0x5ef0fbe1,0xc7a758d5,0xe6f57f9f,0x5705dcf8,
  119276. 0xd92269d3,0x5dd49a56,0xbdb49f97,0x8f015d7a,0x000000f1 },
  119277. { 0xb4799ce6,0x07131110,0x2cbcb7db,0x35bbfb99,0xf7ba21e2,0xc1f00c9f,
  119278. 0xb18f49fe,0x009d6913,0xabcf959b,0x8da61951,0x0d42146e,0x0e687213,
  119279. 0xae5f23f1,0x55832817,0x9ae7386b,0xc9b5bb68,0x00000143 } },
  119280. /* 198 */
  119281. { { 0x48c74424,0x423328db,0xd19cb2eb,0x32616e11,0x40d6e217,0xe534192a,
  119282. 0x0cbdc752,0xdd83a94c,0xd733bb01,0x5c623050,0x5b7a4520,0xcd0d631a,
  119283. 0x9a4011c8,0xccdc0a25,0x646e7cd5,0x22f112cc,0x000001e6 },
  119284. { 0x3e1e4c4b,0x47d6e29a,0x9fb1548a,0xd5f82538,0x4fd3e319,0x7e3705b5,
  119285. 0x0a08b966,0x8c4ce59a,0xd8cbe8db,0xbca749e7,0xaeec3d75,0xcc4496ea,
  119286. 0x8a1a313d,0x17dc723a,0x8ceb9360,0x250ff77a,0x000001a5 } },
  119287. /* 199 */
  119288. { { 0xfe29bd79,0xa55a0726,0x4f990b34,0x6574a810,0xaad56983,0x6906946d,
  119289. 0x50d41fef,0x0e580ab9,0x6e6f7f45,0xbc75b514,0xf0f3718a,0x508cc97b,
  119290. 0xa5634087,0x51ba2ca4,0xe64d8910,0x75c39077,0x00000172 },
  119291. { 0xf77ca6bd,0xf37cccaf,0xbdb18df5,0xe0a0df41,0x019e01f7,0x9f46cff8,
  119292. 0xaa65d72b,0xbe4f3d44,0x6e3663e9,0x7822d8ac,0x3ef9db6d,0x5f37f922,
  119293. 0xabe4a9aa,0x7f0ad39d,0xf69cc8ba,0xa0a57c70,0x00000098 } },
  119294. /* 200 */
  119295. { { 0x00fd5286,0xd9c50cf4,0x72a4b03c,0x1ea5b9d5,0x051ae73e,0xf5e60f9e,
  119296. 0x951b3824,0xfe9b5142,0x9fb4d667,0xb034b2d0,0xedc50856,0x4b537a80,
  119297. 0x8cb0022e,0x69ee1012,0x6a548aee,0x7c8b9e5c,0x000000ed },
  119298. { 0xd933619b,0x746007bc,0x2b9dfe19,0x0ce7668e,0xcc6e2a2e,0xa9eed5d3,
  119299. 0x7eebf32f,0x35a14f5f,0x67cc4f64,0x75cb898d,0x7850c16c,0xcb2185fc,
  119300. 0x45f79c96,0x09874a76,0x27db4744,0x7468f8ae,0x00000139 } },
  119301. /* 201 */
  119302. { { 0xc88684f6,0xc5de68ad,0x619a7dbf,0x7c1edaab,0xb27a18f5,0x258d1735,
  119303. 0x8ecd89eb,0xb27e7b65,0xd879f7ea,0x3d8889c6,0x67d5befb,0xa8fdc96d,
  119304. 0x37bad73c,0xc84d86ae,0xce8e56d7,0xc7e91976,0x000001a4 },
  119305. { 0x6319ffa6,0x5001a540,0x134ec04c,0x0cae64ec,0xd541242c,0x1f69a96c,
  119306. 0xbf2caeee,0x9da259ee,0x28bee805,0x88e7978c,0xb8e890e4,0xe9484beb,
  119307. 0xfb227fd9,0x0e5246d0,0x625d6318,0x8be2a54a,0x000001b7 } },
  119308. /* 202 */
  119309. { { 0xf472f13a,0xa223554a,0x5733e91c,0xfac993b7,0x96c168a2,0x26afe9f0,
  119310. 0x4b127535,0x7cfe761d,0xe77070ca,0x84301873,0xc7e7cdf6,0x66b6aaad,
  119311. 0xa1562ed4,0xda2dd5ea,0x39faf8d8,0xa81a2e00,0x00000016 },
  119312. { 0x4e3de3bf,0xa880759c,0x52f3088a,0x0c1e2e11,0xaa7eba5b,0xcb2ded9a,
  119313. 0x9f9c11ca,0x4c65d553,0xb0dc5c19,0x0ab9bd87,0xca3f4b61,0xd32f8c96,
  119314. 0x28cb5f9f,0x49842fcc,0xb90e21df,0x31ae27cc,0x000000f4 } },
  119315. /* 203 */
  119316. { { 0x6a0ccd0a,0x3b2a0a0d,0x5993b555,0xa3eeec82,0x9de672a6,0xb13486fd,
  119317. 0x0da05dcf,0x8d9c5148,0x6739874d,0xc4aa444d,0xe29a35c9,0xd9cf35b2,
  119318. 0x89177ead,0xd6bd9b5f,0x2a0470a1,0x9af0f59d,0x000001d6 },
  119319. { 0xba7535fd,0xb2f844c7,0xa842ff39,0x45bd4c3d,0xe951974b,0x5fe149ed,
  119320. 0xfd4453ec,0x6982e997,0xe6c37c0e,0xa63f705d,0xd2c3ef6a,0x09b0f6a9,
  119321. 0x1776a8d6,0xbedd3586,0xede11b78,0x4048a46a,0x00000176 } },
  119322. /* 204 */
  119323. { { 0x51a251d1,0xa47c6ee5,0x0d279dfd,0xbef4bf12,0xec518a28,0x4c2d538c,
  119324. 0x3880be6e,0x1b2b7887,0x1be9b20b,0xc69ccf8e,0x3796a19e,0xe41dfeae,
  119325. 0xfb50bdea,0x25676fc9,0x03e180c0,0x8b815a05,0x0000016a },
  119326. { 0x53f5ef65,0x2ca085f6,0x77b25105,0x61dfbbf9,0xa3346fe6,0x88ea87e3,
  119327. 0x1b95f7ef,0x25ddfdee,0x5b65eaec,0x22074e69,0x4c2e023b,0x11869a15,
  119328. 0x42e83bb5,0x8601b577,0xfa877e7d,0x1464652c,0x00000015 } },
  119329. /* 205 */
  119330. { { 0x57fa58f1,0x250853c8,0x4ca4c670,0xb58a4e68,0x1b81f40d,0x07b96d0a,
  119331. 0x558e8cbd,0xa4651e10,0x42e388cf,0x1a64046e,0x44436088,0x51b0d539,
  119332. 0xe26b8fd0,0xc2bf35b3,0x5702cfce,0x4ae78709,0x000000fd },
  119333. { 0xdf53d498,0x3c79bc29,0x1137f624,0x4cf31c4e,0x17a3cedf,0x93b6856c,
  119334. 0x6cd9115d,0x2461131c,0x9228cddb,0xab30a453,0x8d202bf1,0xe97757b6,
  119335. 0xe6108612,0xa666de7c,0x4f6026b4,0xc200fe65,0x00000051 } },
  119336. /* 206 */
  119337. { { 0xb1a2b4b5,0xea96103c,0x843c0968,0x98dccbfe,0x986ffb5b,0x6a37072d,
  119338. 0x169d3ac2,0x2fa07af2,0x771371f1,0x8bb85b9a,0xe7c299ef,0xeae10d34,
  119339. 0xe2372efc,0x3d4bdc69,0x8dd856f1,0x378df75d,0x00000039 },
  119340. { 0xde7ff5d9,0x31e902ff,0x325a09ca,0x0e9a85d2,0xf4192fcd,0xd71b93a6,
  119341. 0x15b076b3,0xf52a5737,0x6e711d1c,0xd726aa86,0x2c292819,0x0b61b1df,
  119342. 0xc8015de6,0x224e575c,0x18b79e47,0x68e893e1,0x000001dc } },
  119343. /* 207 */
  119344. { { 0x6ffeda73,0xb7924ff9,0xa0da2018,0xe709f406,0xf89584df,0x368e20ea,
  119345. 0x8355a040,0x0095112e,0xfd777d7c,0x259d4528,0x2bf8f2c8,0xb0c49565,
  119346. 0x44c5311b,0x7f631928,0x8466d9d5,0x698d0e4f,0x000000d5 },
  119347. { 0x015d204d,0xe10d64fa,0x6dd10c53,0x7b626bfa,0xa7698c94,0x087f8e63,
  119348. 0x05337a56,0x525a6547,0xdf5c782f,0x558e2244,0x855fbaff,0x48aa1e41,
  119349. 0x47ee3830,0x48f2218e,0x138463d3,0xf2523959,0x0000004d } },
  119350. /* 208 */
  119351. { { 0xd8695310,0x76f4fd69,0x7e8768ea,0xe28eb09f,0xe0d532a8,0x039c1812,
  119352. 0xc572ac79,0xdda67744,0x785d6293,0x1f9800e0,0x3da76bb2,0x2bfe2a5a,
  119353. 0xa2bc7217,0x6ed15b90,0xd1788a8e,0xd80e61bf,0x0000004c },
  119354. { 0x16730056,0xb9f40370,0xdced3d43,0x46f45fef,0x1aa50742,0x0afd763c,
  119355. 0xff92ae73,0x21e5c652,0x1bb2063f,0x6ef0830d,0x12d22540,0x18306ecc,
  119356. 0x1f15001c,0x4edd9b3a,0xc0cc5424,0xe4eb25b8,0x000001f4 } },
  119357. /* 209 */
  119358. { { 0xa1db5c18,0xed61a714,0x7677074c,0x9454e61e,0x7bf685de,0xe970fbe5,
  119359. 0xd2145be5,0x221b0c53,0xee49a5f2,0xb931881b,0x14b11d03,0x00b91afa,
  119360. 0x3ec22137,0xc6aefe49,0x526200af,0x50554e94,0x0000013c },
  119361. { 0x7364c92e,0xd42c45e7,0x735218e8,0xe0500265,0x84d3f3c5,0xd281da02,
  119362. 0xdbf7646b,0x312f8424,0x485f304f,0xe1a88f2a,0x1127a513,0x583f5631,
  119363. 0x1a60e0bc,0xed7950c7,0x4b7b70a4,0x92855e10,0x000000c6 } },
  119364. /* 210 */
  119365. { { 0x644614e7,0x8d06185c,0x4749a424,0x2e906cae,0x2587e528,0x585412ea,
  119366. 0xd12857cd,0x3763990a,0xba5593b5,0x770c7f70,0xdd5d2a46,0xc2cf6dc4,
  119367. 0x3b69a1ba,0x564da456,0x187895da,0x639f7e14,0x000001c8 },
  119368. { 0xf8589620,0x05c96b02,0x41e44054,0x2fe468a3,0x096ad09c,0xbf22da11,
  119369. 0x9c652aee,0xbc73c298,0x547e1b8f,0xcdef9f8b,0x977dbf73,0x7073785a,
  119370. 0x7e13552d,0x0a92a1aa,0x3a393d3f,0x22761140,0x0000015b } },
  119371. /* 211 */
  119372. { { 0x1fbfaf32,0x89a5a7b0,0xbe661d21,0x5c5a62d0,0xf5e3b44d,0x47970f5e,
  119373. 0xf43bbf62,0x3ea001ed,0x260ae5a0,0xa8e74285,0x2697c62c,0xeb899ebd,
  119374. 0x751a7643,0x36a003e6,0xba0725a6,0xef178c51,0x000000ea },
  119375. { 0x9bd51f28,0xaacf8e9f,0xa8712044,0x39febbdb,0x5bfc8365,0x8780ad3a,
  119376. 0x10e6f08f,0x408a34cd,0x8241ab0e,0x8104ca10,0x98a662a1,0x843e71ce,
  119377. 0x232048d6,0x9dce8514,0x1cf3d187,0x5cba23be,0x000001fa } },
  119378. /* 212 */
  119379. { { 0x2973a15c,0x2fe8c9d2,0xd42979f3,0x66fec8dd,0x0b6afb3e,0x39af4a39,
  119380. 0xab65ef22,0x0bb1e436,0x66c5fcdb,0x8f26201e,0x5af4870b,0x3cffe8a3,
  119381. 0x2bb44e24,0x65ae286f,0x51dd1722,0xda2e283a,0x00000114 },
  119382. { 0xc1e3d708,0x4a9c9a56,0x1cb0efa6,0x4fe62d3f,0x97e87540,0xf0702984,
  119383. 0x3cea46fa,0x138b7d6b,0x83886263,0x0780634e,0x71c30909,0x27e84280,
  119384. 0xe5838647,0xf0af79d7,0xb236a267,0xc1b86582,0x00000104 } },
  119385. /* 213 */
  119386. { { 0xa526c894,0x32ff09ed,0x14ac7d23,0x95abf120,0x3cd92934,0xb6f94dcd,
  119387. 0x92e6b556,0xffaaeb12,0x1036c31b,0x193796ea,0x707ff32e,0xa9d237e7,
  119388. 0x829d67b8,0xd65a5b0d,0xdb29248b,0x48edb556,0x000001b3 },
  119389. { 0xded46575,0x6ee9f9b2,0xffa69acf,0x496ca08a,0xf16d37d1,0xd5aeb3a1,
  119390. 0x789e5d01,0x4a507db1,0xc827cc45,0x05e2ce29,0x2964e677,0x29b6e4a5,
  119391. 0x4c0e46f2,0x0563b0ba,0x4bc46485,0xe75c2448,0x000000a3 } },
  119392. /* 214 */
  119393. { { 0xd2f6615d,0x0fcb476f,0xd98da9a9,0x4b7f9b78,0xd2bdf107,0xe2fddf1c,
  119394. 0x9b956f31,0x2bda3086,0xb596eadf,0xf3cca2f7,0x355b2538,0x91c09f8b,
  119395. 0xc6c846db,0x46f3f6f3,0x2a14642e,0x9bb9398e,0x000001ff },
  119396. { 0xa17bd645,0x5118d4f5,0xdbd6d552,0x57033eab,0x734d0957,0x007e86fc,
  119397. 0x5f53c435,0x98ca065f,0xfd27dd19,0x9949d9bf,0x6952d1ca,0xddc4e304,
  119398. 0x81ac101c,0x84cab4fb,0x4a56b007,0x46d079f9,0x00000003 } },
  119399. /* 215 */
  119400. { { 0xa6bfdedd,0x95eb8e4f,0x7a74c6f9,0x993a285e,0x3d09a252,0x8bd5d4d1,
  119401. 0x19a5f767,0xeaa10be6,0x0cebb340,0xd3db083e,0x1dbf7a83,0xc633a78b,
  119402. 0xc30f23e1,0x2664bc3e,0x07a08379,0x6630f8f1,0x000001c9 },
  119403. { 0xdef86a80,0xbbf4cb4b,0x3f8259ab,0x1fa4ec78,0x609532c8,0xa4bf7604,
  119404. 0x8b909e92,0x71bb7acc,0x17884160,0xca1d7317,0xca1ab928,0x7f7f14be,
  119405. 0x5f8455a5,0xbfea016e,0xbf21e899,0x7b8c76b9,0x0000002d } },
  119406. /* 216 */
  119407. { { 0x4b9f8e7d,0x46860563,0x63fc58a8,0x201176b7,0x2feed68a,0xe7a5da7e,
  119408. 0x65183190,0xcc67763e,0xe9377ad6,0x7d7d0102,0x77032321,0xccfc4720,
  119409. 0x534bb505,0x573ee031,0x0f1a2769,0x1bf1ef8c,0x000000f3 },
  119410. { 0x0c935667,0x635f5c4b,0x060d2b8b,0x74152c39,0x37c3a574,0xeffaac2e,
  119411. 0x0b72e0cd,0xfd5fcc4c,0xf4f60247,0xb743f9b9,0x79e16f33,0x05c2e354,
  119412. 0x3074ef9c,0xa2234c47,0x495aace3,0x4092f279,0x00000124 } },
  119413. /* 217 */
  119414. { { 0xb30f9170,0x5bfd7851,0x37fce5b1,0x715aa1e9,0x928437b9,0xcffd55e0,
  119415. 0xc32f1273,0x88acd259,0x48be1e34,0x5a145cf2,0x7a5bc62b,0x3a340860,
  119416. 0x18156f46,0x6296eb15,0x2774e1c3,0x397fad19,0x000001e7 },
  119417. { 0x9c8225b5,0x362f99f4,0x46b77c4d,0x33efce49,0x8541e91b,0x451df530,
  119418. 0x38f3d693,0x0bd2d934,0xe727b54e,0x0b5de2d6,0x7622d940,0x42d929c2,
  119419. 0x56f6a94b,0x36ace723,0xfccaf205,0x64a18cd5,0x00000044 } },
  119420. /* 218 */
  119421. { { 0xaba95d63,0x8dbe0aab,0x7b4b346d,0x92780c61,0x0e0d8142,0x6430f863,
  119422. 0xb56ef04c,0x875be02a,0x785e3633,0xc28feb95,0xc12c93e4,0xd5401795,
  119423. 0xe36f82a3,0x89ff51c1,0x10eeafd6,0x3c48c895,0x0000016b },
  119424. { 0xd4f064be,0x79287eba,0x54ebda99,0x1a77d555,0x623727ea,0x46745ef2,
  119425. 0x89f366c6,0xa911f591,0xc59d6ebd,0x7e5435cd,0x7524d213,0x3a84daea,
  119426. 0x4395b38d,0xc7b1dd1c,0x1a823c49,0xca13e704,0x0000001c } },
  119427. /* 219 */
  119428. { { 0x874d64b0,0x6399860c,0x1653ce0c,0x3375b092,0xeaa11986,0x16700000,
  119429. 0x621cd15d,0x62c67909,0x77d70dcd,0xbe1d7dd6,0x305bd4cd,0xeff0f270,
  119430. 0x362f8f30,0x076ec621,0x7e445b78,0x81204816,0x000001d8 },
  119431. { 0x161f9758,0x81749a0e,0xa3c4fce2,0xe60915fe,0x911dd8af,0xf537ce41,
  119432. 0x79a51a09,0xfe36a8ac,0x2ca5cf8e,0x67fb54b4,0xe49057f5,0x1bdcae07,
  119433. 0xa4244b64,0xb71ff0c5,0x4b606583,0x4815a536,0x00000106 } },
  119434. /* 220 */
  119435. { { 0xef39cc39,0x78c69c3e,0xfa6356d1,0x98304564,0x412fb990,0xbd3c3542,
  119436. 0x79dbb2a5,0xa1d531d3,0xe7e75e3d,0x4865f188,0x0b0147b1,0x2dac4e22,
  119437. 0x33d29ab0,0xf59e51ca,0x37b074ef,0xc964f7fe,0x000000f1 },
  119438. { 0x0e301262,0x7080c0a6,0x5390a22d,0x9a458060,0xcc8a9029,0xda677f9a,
  119439. 0x14c0f1c2,0xdfae9057,0x6e66d9f7,0x3665ff16,0x47846924,0xc866dd8c,
  119440. 0xc4cc307c,0xc5afe98f,0xe0bf50e4,0x60e3ba63,0x00000039 } },
  119441. /* 221 */
  119442. { { 0x959ecdb3,0x1a785136,0xf9e959be,0x289af617,0xcde0dc88,0x5145b2b8,
  119443. 0x7c079e15,0xfe9070b0,0x50e22415,0xf77f04d3,0x358d6d42,0xb3ab7372,
  119444. 0xba7b629a,0x14fd41b9,0x7400fd25,0x7b32d80e,0x00000193 },
  119445. { 0x7147886f,0xe5d80d4d,0x576c81ca,0xe08ced61,0x642717bb,0xe14e8692,
  119446. 0xabb4bd21,0x9dcdf198,0x6530308b,0x658be646,0xd99d19c7,0xfbf192da,
  119447. 0x304ab126,0x55a3d1b3,0xfa24de31,0x943f4be5,0x0000000e } },
  119448. /* 222 */
  119449. { { 0x7fe9ea48,0xc5424058,0x61b57486,0xaf24f825,0x78719740,0x9d2c413c,
  119450. 0x70eb874d,0x27a9be79,0xb62ba3aa,0x43fef8e0,0x2c1bf0ac,0x0a23f286,
  119451. 0x4af130e1,0x51c276f3,0xae55cebf,0xf6cd1e9a,0x00000185 },
  119452. { 0x40369093,0x24defa7f,0x58581e0a,0x11f1d9d6,0xe512ed9e,0x9900bf33,
  119453. 0xed120896,0xbf8a8459,0x8b73c399,0x8324555e,0x8f6f54fe,0x54a30569,
  119454. 0x3c252355,0x2a9d6da5,0x2a093b31,0xe6a6f904,0x0000016a } },
  119455. /* 223 */
  119456. { { 0x152cdd35,0xb2e123c9,0x86402ef1,0xae6e43a8,0xb9ce5bd5,0x892bf0df,
  119457. 0x75804914,0xb4acb84a,0xf502eec2,0x8c7f55ff,0xaa33ef4e,0x9c8a7b93,
  119458. 0xfd9d2001,0x06b10357,0x0ba3bceb,0x3e319ff0,0x00000027 },
  119459. { 0xabe360a3,0x182c2f77,0xadfefca6,0x57ef5c84,0x650b6fcc,0x9a4f0ca6,
  119460. 0xaaf0b202,0x3f4f8e56,0xa24ef156,0x5c8508a0,0x1ea45f13,0xd8f62fd9,
  119461. 0x28036dbe,0xf2c923a0,0x1a4d103b,0x4a9ca4c0,0x0000018a } },
  119462. /* 224 */
  119463. { { 0x5448e339,0x2a3fb798,0x18a39976,0xde8770cf,0x7a69170c,0x1160574d,
  119464. 0x2b6067ac,0x4bb05c59,0x848138ab,0xde0d2db0,0x4909e794,0x149dab92,
  119465. 0x790315f7,0x83a336b6,0xa335a258,0xcd9074d9,0x0000013c },
  119466. { 0xac1b784d,0xe839c5e0,0xee527ae1,0xab65c8c6,0xa1c88ec0,0xd3c86146,
  119467. 0x46c1bf58,0x2201f790,0x3fda502a,0x71cec627,0x225b9065,0xff3f88eb,
  119468. 0xc556dfcd,0x6c1f0c98,0x484fa5cc,0xaa3222aa,0x000000ac } },
  119469. /* 225 */
  119470. { { 0xc9b4dfd6,0x17e74bc3,0xf8e76293,0x25ba8053,0x9d8c3520,0x0307dc05,
  119471. 0xb85a20b4,0x1c9036cc,0x23871359,0xf2c63f0a,0xca95fb4e,0x1a99d9d8,
  119472. 0x9850c6c6,0x3d7c4f39,0x68299668,0x162969c9,0x00000169 },
  119473. { 0xcb63ee53,0x7d13c267,0x75eac353,0x67b12e61,0x191abfca,0xb3369a11,
  119474. 0xee1af69f,0x5ad0649d,0x11dc11e7,0x4d7a6f00,0xdb9f9765,0x80f030b8,
  119475. 0xf0ab1332,0xa20001a3,0x39d8cc62,0xe17c98d2,0x00000194 } },
  119476. /* 226 */
  119477. { { 0x1d8fe898,0x720d80b4,0x32184534,0x8d7a28b7,0x04f21740,0xf1f3c385,
  119478. 0x166aa6af,0x5d381cd5,0xcc560e35,0x9cde6084,0x5e61e2cd,0xcb041f0a,
  119479. 0xd9b4951a,0x621116f5,0x7ee2ac2c,0x509e16d3,0x000000c4 },
  119480. { 0x2c6fd79e,0xb82a20c4,0x3af78b0e,0x95b7ee4e,0xbad819ca,0x3d9b63c1,
  119481. 0x98552569,0x10d674de,0xf9c19d0f,0x17de64b2,0x47c5e6a9,0xa03fabaf,
  119482. 0x2ce2db6f,0x858bc4ad,0x1fc9d18e,0x76c2380a,0x000000c9 } },
  119483. /* 227 */
  119484. { { 0xb064f114,0x91171ef8,0x4f2f0f4c,0x83cb1565,0x57b262b7,0x30525854,
  119485. 0x0f34936c,0x468c6701,0x99a41fed,0xef26d2fe,0xa7f7f6a9,0xf6da2267,
  119486. 0xa01bfc1b,0x2563b8db,0xc340ed40,0x14b36c85,0x0000000e },
  119487. { 0x25db67e6,0x5e57e264,0x7f2e905f,0x85df4e89,0x026c4268,0x7832e514,
  119488. 0x3e875093,0x312be262,0x3c538691,0x856b5bd8,0x95734f9d,0x5b1cae55,
  119489. 0xd5aa4861,0x5a07bfe2,0xce8abb58,0x7a4c96f0,0x000001d0 } },
  119490. /* 228 */
  119491. { { 0x523aa2e9,0x7bf54d05,0xed3d0860,0xc8841e0c,0x7f9bfb69,0x5683f6e2,
  119492. 0x162bdf85,0xdcb07f44,0x07b0dcc9,0x62d17839,0x657a536e,0xa2cbb8ab,
  119493. 0x7cf47d3c,0x98b9a0d2,0x5eea6370,0xff154d68,0x000001f2 },
  119494. { 0x56b232ac,0x568b768a,0x3f2a52ab,0x4e8d6e36,0x8837fc60,0xbae87a16,
  119495. 0xd10a7691,0xebc58a83,0xf9455fbe,0xad5e4af0,0x7d654e2e,0x1a20d6c3,
  119496. 0xda7c8255,0x8c40fcb9,0x60d9b931,0x6d7b3cd7,0x000000b2 } },
  119497. /* 229 */
  119498. { { 0xbb2eaf45,0x7b090c3e,0x62ffb92f,0xed24d91c,0xa736f23d,0xbf2a3ea4,
  119499. 0x6ff0fde3,0xb5b99ebd,0xca1102f5,0xbca2b55d,0x07e032a8,0xf6203cd8,
  119500. 0xa8bf17a8,0x5410b448,0xe1dc55b1,0xb86660a7,0x00000109 },
  119501. { 0x02a2fbd8,0xb148b1da,0x3b22e8a5,0xfed85e8b,0x8712b509,0x1378a0e4,
  119502. 0xc6a3e516,0x68560148,0x1633b503,0x7100921c,0x25512711,0x93925143,
  119503. 0x07d31047,0x7b4931d2,0x8542e0bb,0x623e722b,0x000000ea } },
  119504. /* 230 */
  119505. { { 0x24972688,0x084823d3,0x003f5762,0x58b83c12,0x6d0d4528,0x194d6690,
  119506. 0x2c6f747e,0x84219584,0x0146d89a,0xc8f8a2e9,0x7451bbc2,0x29ec1de7,
  119507. 0xf7f284fa,0xf622b6b8,0x7b71e44f,0x83f1dbe9,0x00000060 },
  119508. { 0x999dd56b,0x99649333,0x97a47de9,0x2cfac0ba,0xbbe8fb20,0x6660d8ae,
  119509. 0xf61d7bca,0x47c29dd8,0x85adc14d,0x6f5fb51d,0x4f9fd41c,0xe65ac788,
  119510. 0xff513e6c,0x1ce69dd4,0xffe59d3e,0x1ace591e,0x00000023 } },
  119511. /* 231 */
  119512. { { 0xa9fda771,0x2e67a438,0x8663100e,0x626f652c,0xe133f23b,0xdfb19e48,
  119513. 0x035d2d1f,0x599f88f2,0x8d13e878,0x1723a112,0xfb51ce07,0x890aa292,
  119514. 0xbbd9ba82,0xe5f3a70e,0x374514b4,0xdde82673,0x00000155 },
  119515. { 0xd6f59a95,0x08b2b77e,0x02020420,0x93f853e3,0xebac7797,0x52252ac1,
  119516. 0xb56b6676,0x6ecdcb99,0x9722a500,0x4abdb9f9,0x04e2bad0,0x26210f3f,
  119517. 0x3034dd4d,0x0ca5a0ff,0xdac0b80d,0x333d8080,0x00000041 } },
  119518. /* 232 */
  119519. { { 0x35a85a06,0xe8510709,0x42ef1b44,0x4e166e76,0xa07b3a6d,0x84a90b71,
  119520. 0x30329e6a,0xd6dd6c00,0x3d555259,0x20c4ba65,0x6f8ad05e,0xee3b26af,
  119521. 0x2ab4cccd,0x20e3d541,0xa9406424,0x79798934,0x000001bd },
  119522. { 0x8e0c7ff0,0xf2a1d184,0x9543b340,0xbae85efc,0xf51d318b,0xe96431ae,
  119523. 0x75878fa6,0xe5d3ed4e,0xc2895f52,0x4d2a29db,0x1f11067c,0x3af27877,
  119524. 0x9e7f4ee5,0x6ccde964,0xa56d74da,0x35188da1,0x00000192 } },
  119525. /* 233 */
  119526. { { 0x03d310ed,0xb0832120,0x987b0311,0xd20ee8cc,0x84c558a8,0x9e549d26,
  119527. 0xb7167ec8,0x5e25f3ce,0x4bf55bb5,0xacf114f4,0x061c9017,0x819edc77,
  119528. 0xdeb343c0,0x759a44e6,0x04c9b5ed,0x58df9f7e,0x00000078 },
  119529. { 0x3bf13222,0x4fa47ebb,0xea07da11,0x1e451dcd,0xc0d8242f,0x1be9fac3,
  119530. 0x36eb871e,0x93257d4d,0xbea3190d,0xf49e775a,0x4ebe2b33,0x406d191f,
  119531. 0x0c110096,0x67aac53c,0xd381ac78,0x5215cf8b,0x000001f4 } },
  119532. /* 234 */
  119533. { { 0xfa493b79,0x387e8a8e,0x4eb1c2ac,0xb20e270b,0x9ff22320,0x9f393fa0,
  119534. 0xa91c393d,0x5ee1baae,0x138a8d96,0xdeda961a,0x97bd50e4,0x69ab238c,
  119535. 0x2363c8e0,0xff68d48a,0xce4c4c16,0xaf8e00e5,0x00000158 },
  119536. { 0xcfc509a1,0x6ccdcf06,0xc26cc075,0x60f411ef,0x4d9c57f0,0x6d0cdfd6,
  119537. 0x32e99cac,0xa9514853,0x8b8e9510,0x58f9ab3d,0xb10dc3fd,0xa7e98709,
  119538. 0x75ef3509,0x8390843d,0x5a9312c7,0x28ccc9d0,0x000001b6 } },
  119539. /* 235 */
  119540. { { 0xe341463f,0x1d934f00,0x150da7a0,0x14c8a6ce,0x4109553f,0xdb4860fc,
  119541. 0xa93f4a91,0xc23bde5a,0x2cd58067,0x9f47c787,0x8433dc80,0x1d330054,
  119542. 0x75a32a7d,0x0c0be7f9,0x88c75da9,0x08b777d5,0x0000012e },
  119543. { 0x61a10d37,0xdfc12817,0x5c50f5a5,0xed7b6181,0x79477c60,0x28af95db,
  119544. 0x33c5310b,0xa0aa2b77,0x53118267,0x905faab8,0x6b41959f,0xf40e9816,
  119545. 0x16b37784,0x9ccb4252,0x69866acc,0x6835d77c,0x000000c5 } },
  119546. /* 236 */
  119547. { { 0x2b450a66,0xe9d714cb,0x7dbfdc14,0x1318885c,0xb466a0c0,0x655a8d85,
  119548. 0x5bdfc1a6,0x02a21e99,0xe67792d1,0x7a0d7c98,0xb550a797,0x2a01bb57,
  119549. 0x5d74d337,0x42c46233,0x88dad495,0x7be4e1c0,0x0000008b },
  119550. { 0x95812273,0x1873b03f,0xee3f757f,0x2e26ed32,0x6da6217a,0x2c710eae,
  119551. 0x261d9f4f,0x9b50b574,0xb7c1da2d,0x43971fa9,0xc4a85de7,0x22c4fb87,
  119552. 0xec22137b,0xf72c3451,0x77ba1926,0x1345668c,0x00000173 } },
  119553. /* 237 */
  119554. { { 0x8a3ba183,0x3e3e8c7a,0xfe389fa7,0x4e8cebbb,0x0f9ba60f,0x8ea44687,
  119555. 0xcb601a83,0x55176e35,0x12e52db4,0xf90bdc26,0x8f712bf1,0x95f9e459,
  119556. 0xbea054cd,0x9bd3200f,0xdd5fd40b,0x2cf19bf6,0x0000017a },
  119557. { 0x66736feb,0x71cf6ca2,0xde7cfe2f,0xbde86f49,0xfc290563,0xc60abce8,
  119558. 0x726b6e4f,0xaae8a3ce,0x3f29235b,0xd2382445,0x650ffa5e,0xa4b557f5,
  119559. 0x113ef744,0xa1453e54,0x3e426dd2,0x7c676a53,0x000001b0 } },
  119560. /* 238 */
  119561. { { 0x35d96872,0xf5e603f2,0x3fa5b8ca,0xab1a23cc,0xe988dc5f,0x5459871b,
  119562. 0xd430c0bd,0xe32e8489,0x764d9cc3,0x7ec269e0,0xf2c0c40d,0xf7238212,
  119563. 0x887b83b4,0x2d946183,0x2f18a411,0x281fa671,0x00000010 },
  119564. { 0x64858b37,0x8028048f,0x357de5d9,0xe0e149af,0x619ebb18,0xb2218791,
  119565. 0x9f2b0ba0,0x210200b3,0x1039cbae,0x5a87eae6,0x39579d1d,0x4efdcddb,
  119566. 0x2788515e,0x1b388eaa,0xc81878aa,0x1a552c3c,0x0000002c } },
  119567. /* 239 */
  119568. { { 0x0ea723dc,0x7ac7f500,0x42b15231,0x0a5f04f4,0xbe885c86,0x63d49445,
  119569. 0xff119702,0x61f9993f,0xc4c58cea,0xc3fba45c,0xb9cd6036,0xe6d151e6,
  119570. 0x57b923bb,0x75a3ab15,0xceb2fd46,0x4ec07c52,0x00000147 },
  119571. { 0xed88239d,0xc46a3d32,0x835ae694,0x0d1b8ae6,0x9feeb2e7,0xf4fde325,
  119572. 0x43bc0bb5,0x223bf71c,0x8f62a705,0x3cd220b7,0x9fe799a5,0x2224860e,
  119573. 0x24ab7f93,0xd8558703,0xb594958b,0x8e0f7330,0x0000010f } },
  119574. /* 240 */
  119575. { { 0x3c67d520,0xaf35c7bb,0x23fca9ec,0xd8f4958b,0x8bbaa808,0x0778f194,
  119576. 0x2135e8ae,0x418c30ce,0xc888eff7,0xcdd8d9a9,0xf73144ab,0x72075df0,
  119577. 0x4506a534,0xb549c895,0x5fbb7fc5,0x4ef38979,0x0000011c },
  119578. { 0x43f5e698,0x3fe2c9ac,0xe38a5e3a,0xce77fcbc,0x3089c2e1,0x6d05c90e,
  119579. 0xac1d5801,0x5a74f3ff,0x381b9d2a,0xaeeda220,0xf5f3960b,0xd958b143,
  119580. 0x0db7abbe,0x65ffd051,0x7a05b718,0x8e97e680,0x000000ce } },
  119581. /* 241 */
  119582. { { 0x8ce86a83,0x2251e61b,0xbf7e7160,0x8604159f,0x48f03377,0xfc127dd7,
  119583. 0x45052242,0x87cb2c37,0x934ea09b,0xbd4950f4,0xc4679441,0x5146c403,
  119584. 0x23ba416a,0xe8ad4710,0xaf638eb1,0x89b81a60,0x000001b3 },
  119585. { 0xe8150c69,0xe699934e,0xe27c14bc,0x74f75908,0x6a0194ff,0x5dc0a891,
  119586. 0x1bd51b76,0x38f49d32,0x18779630,0x6bc3305e,0xfd3b4a68,0xfe2f3fbf,
  119587. 0xd7caf189,0x1409b377,0x9b8f109b,0x029ea13b,0x000001b3 } },
  119588. /* 242 */
  119589. { { 0x25a2fd88,0xef7938d2,0xceba0603,0x890f2f7c,0xd7a6dff4,0x4c3e1c80,
  119590. 0x2883f986,0x00c78f36,0x998e5305,0xed92b592,0x325ddc73,0x018a8f1b,
  119591. 0xd5d3708a,0x6dffd987,0x0d1f28bb,0xdcd3554f,0x00000059 },
  119592. { 0x23a74e7d,0x17c6e41d,0x5db32df6,0x94b61ebe,0x9e7ffa0b,0x3c2fffa7,
  119593. 0x2ebb7a0d,0x473662b7,0x01adf9c3,0xa86415ee,0x54679264,0x1502c326,
  119594. 0x2fa09c57,0x16911349,0x24749086,0x897f34aa,0x00000195 } },
  119595. /* 243 */
  119596. { { 0xabadc253,0x4845d359,0xc797c95e,0xe054b92c,0x9a218212,0x22a9b5bd,
  119597. 0xa52b8827,0x9bb80a5e,0x2e61c676,0xea38e78e,0x08b0f8b3,0xfb274b1a,
  119598. 0xdb9d854c,0xb6aa42e3,0x56012d73,0x8ba22523,0x00000163 },
  119599. { 0x75c8c576,0x7cec0e6f,0xe4bc7dd2,0xabb20e7c,0x69d80726,0x0958a0c8,
  119600. 0x8a023eb7,0xa908c66a,0x76110b15,0xca9f50ea,0x186f61a6,0x668c9994,
  119601. 0x2a0a69d8,0x9ddf22ed,0xbbf8a10f,0xbfee1897,0x000001e0 } },
  119602. /* 244 */
  119603. { { 0x48319e4f,0x26d86818,0x5a586fa0,0x6be6f6b5,0x26713265,0xbef5d886,
  119604. 0x98529cfa,0xac252ac5,0x62b29cfb,0xe7cc45f1,0xa2a6358d,0xee050609,
  119605. 0x2940ac70,0xf7cb9ca4,0xa885b1f0,0xfb44aaec,0x000001ad },
  119606. { 0xe798678e,0x66b7a936,0x99540438,0xca01e103,0x816860b7,0xf2491e37,
  119607. 0xb745d857,0xeeffd483,0xa4705ed6,0x5dbb3628,0xb2a5d0f7,0x57d68d49,
  119608. 0x2389fee3,0xd1a8529a,0x1a7fd686,0xdbbc2549,0x000001ad } },
  119609. /* 245 */
  119610. { { 0x969686a3,0xe10cba20,0xe3c053f5,0x308b1c55,0x26f47102,0x1712b134,
  119611. 0x49033038,0x1f9165b1,0x2d01527b,0x45b72017,0xaa9a34e2,0x6fcf6647,
  119612. 0xb0be35c8,0x51f54b94,0x5a15e382,0xfccb22a5,0x000000e3 },
  119613. { 0x5b4dc0be,0xaa71e4ec,0xdb1cd5c4,0xbb136248,0x046e1007,0xf36bff43,
  119614. 0xda9c99a3,0x5a6806d7,0x8349bc50,0x9cbfc6ee,0xe13e0850,0x26871e73,
  119615. 0x67f448c1,0x5e6aa227,0x2da7baf9,0xba77787c,0x000001b9 } },
  119616. /* 246 */
  119617. { { 0xc5a73375,0x1abe58ee,0x7a8ac438,0x175df69d,0xceca835a,0x2cf3150a,
  119618. 0xf507d30f,0xb87b0609,0xc60b0424,0x9ae53a2b,0x410f90ec,0x4931e182,
  119619. 0xadd689bb,0x452c7d0f,0x47631a8e,0xab453491,0x00000013 },
  119620. { 0x8c84f3af,0xaf2dd856,0x1baae33e,0x829dc092,0x8b96b070,0x46542a85,
  119621. 0xe8a82516,0x42260d40,0x5c35322b,0xb9e5edac,0x39eda0d2,0xbca79560,
  119622. 0xb962b90a,0x86bd07c6,0xb1ec5302,0x2e22dac7,0x0000010a } },
  119623. /* 247 */
  119624. { { 0x239d8f0a,0x665fc09d,0xab8a1021,0x92b2e03c,0x0173477b,0xe4369768,
  119625. 0x8e361604,0xab38ed9f,0x9eb061be,0x79b0091d,0x3e845670,0xcd422654,
  119626. 0x2fe1a2e0,0xa0f77ec7,0x760a030f,0x1d242162,0x00000093 },
  119627. { 0xf8646bc3,0xfa9f834c,0x40ae96f9,0x7df94a52,0x379177d1,0x901c3890,
  119628. 0xffeb66cd,0x9dfd0644,0x77b92465,0x81aec2ec,0xcd981d4f,0x2df3b7f2,
  119629. 0xf377b093,0xc9bc3f69,0xdd859d8b,0xdaef34f3,0x00000125 } },
  119630. /* 248 */
  119631. { { 0xa2c123bc,0xac08451b,0x0818fa54,0xd1e83a68,0x98957b8a,0x56dd5702,
  119632. 0xf0f12f16,0xcc7f2e34,0x0a9fa14d,0x1f6a9c33,0xb2fe782c,0xefc9a2bb,
  119633. 0x709f54dd,0xd319c697,0xd6460a53,0x0b8238cb,0x000001dc },
  119634. { 0x44dfb6f6,0xf6492901,0x6e401d26,0x270d7cb4,0x48537ad8,0x1a70a40e,
  119635. 0x70d8dbd9,0x84d661b5,0xf170d58b,0xca27223a,0x6344e1d2,0xeeb4cf14,
  119636. 0xab9de1fa,0x2255fc95,0xdbdc5ea7,0xcd6e110a,0x000001f8 } },
  119637. /* 249 */
  119638. { { 0x78b8a0a7,0x2a57c6b9,0xe833edea,0x24b4aeb6,0x4bd13fe7,0x9e4617c1,
  119639. 0xfc2e8ee4,0xc4186888,0xfb147eef,0x8d398a49,0x2e662cfb,0xe9f191f1,
  119640. 0x958ba2ec,0x61872289,0x00b8d50d,0xbd6d0f1b,0x0000002d },
  119641. { 0x24c93cc9,0x895cfdfe,0xb9e718e7,0x29ed7780,0x38baf7eb,0x01c8ba58,
  119642. 0x4ddcbf69,0x0225387e,0xa180d6bb,0x64b250bf,0xc947c7c2,0x6d68e548,
  119643. 0x9923f3cd,0x82a7b632,0x2d103cd2,0xb8f03613,0x0000000f } },
  119644. /* 250 */
  119645. { { 0x8cd9d494,0x8198b3f0,0x94f4f9f3,0x9b2065b9,0x3c738fa9,0x7664a220,
  119646. 0xd8d229cb,0x199f4c14,0xc51c54b3,0xddad75c4,0xd213a332,0x9a32ce0b,
  119647. 0x888c7b2f,0xf3a21085,0x5b1ff20a,0x6defa362,0x000000d1 },
  119648. { 0x19a296eb,0x44e00548,0xd1a91313,0x1d94ff15,0xfeaa454f,0xd7dead2b,
  119649. 0x4d40bd7f,0xae65a803,0x1801a4af,0x604f147e,0xa5e0de77,0x983048f9,
  119650. 0xff572ca0,0xa3b19ca5,0x1821d117,0xa237dba7,0x000000e0 } },
  119651. /* 251 */
  119652. { { 0x91630ee8,0xedbabf84,0x05eb5301,0xde6589c2,0xa051f47b,0x9f7d2b2d,
  119653. 0x212bbe81,0xaeaa9f96,0x94292124,0xdced3d5e,0xf4435e5b,0x691f5b89,
  119654. 0x9411f66f,0x19604c33,0x4356f0da,0xb7fc09ca,0x000000e6 },
  119655. { 0xf74f811c,0x1294e413,0xdf8d8ddb,0x1a42d831,0x963418c9,0x27f57217,
  119656. 0x88ebcdec,0x5fde5218,0xea305bc9,0xfdd5e06e,0xac668b61,0xed1e6088,
  119657. 0xeb811861,0x333af016,0x15ddcebc,0x5ecb192d,0x000001c9 } },
  119658. /* 252 */
  119659. { { 0xe0bde442,0x927b37a3,0x66f7a73e,0xe0543fe8,0x8ed10c2e,0xd30d9d20,
  119660. 0xa6617a32,0xaf79c341,0xd1d5cf8b,0xe7367870,0xe3abcf8b,0x02d0dce9,
  119661. 0x772b5e7b,0xfe23d2dd,0x1ffc70c5,0x29fceea0,0x0000010b },
  119662. { 0x62d803ff,0x31bcae4d,0xdbc306a9,0x93ee913f,0xd8c10662,0xaf1de7ab,
  119663. 0xe7a6d658,0xd485782a,0x102f4e06,0x9126592e,0x136fafe6,0x91a3127f,
  119664. 0x88371213,0x46b93440,0xa31e1634,0x53bb4380,0x000000ba } },
  119665. /* 253 */
  119666. { { 0xca5636b0,0x62e517fc,0x6aba15c7,0x4296e021,0x212e7b2d,0x5aa8fd7c,
  119667. 0x5717ad84,0x9517ce6d,0x98b2f357,0xe762b85b,0xdf59b07c,0x42f996b5,
  119668. 0xf37ef6f0,0xf3732abb,0x4542b489,0xa5d145ea,0x0000015d },
  119669. { 0xaa7f6e3f,0x1e77c55e,0xaa4a05bc,0x3f4d99a7,0x45828227,0xa56d7d77,
  119670. 0x77b748fb,0xdb0895fb,0x0629f5d1,0x1c484cce,0x359803fb,0xf5b1c90a,
  119671. 0x1720b8d0,0x43ac4f29,0x72ac13f2,0x8c10bfe8,0x000000e9 } },
  119672. /* 254 */
  119673. { { 0xc06c4fd6,0x9d1c4785,0xd25c2b9d,0xbf4b9025,0xd4982f24,0x04135eb1,
  119674. 0xba4fef2b,0x3ab3edc2,0x98de07ab,0x55a5239f,0x096f4b7d,0xd5fc49ab,
  119675. 0x3844c815,0xc50a2960,0x15676b2b,0xdb1148d0,0x00000047 },
  119676. { 0x10f3bad9,0xc49f9cc5,0x022901d4,0x490888fc,0xc47b44df,0x917a55eb,
  119677. 0xf39f2b68,0x20b2ebc6,0x04e9962a,0x0c58e3af,0x573dd5b7,0x52ab7c1b,
  119678. 0xa329f76c,0x2b54add6,0x82f4ca3b,0x59dad1eb,0x00000108 } },
  119679. /* 255 */
  119680. { { 0xa182d1ad,0x662c4128,0x20916c45,0x7751796e,0xba681647,0xa7704272,
  119681. 0xb92c85c1,0xfac8b0fa,0xaefb2e07,0x207ab2df,0x7861b32d,0xc73530a0,
  119682. 0x88aed145,0x63dbed65,0x0a53a49d,0x547bcdca,0x000000bd },
  119683. { 0x87056b51,0xa7c1382f,0x130f9912,0xc3d91edb,0xd3805b42,0xf7c7de46,
  119684. 0xfd31a995,0x456101eb,0xcd3fb8aa,0x1efd22b4,0x9eb17bce,0xfe391df7,
  119685. 0x616c0c32,0xb4d4c0c6,0x711beef4,0x19f023be,0x00000112 } },
  119686. };
  119687. /* Multiply the base point of P521 by the scalar and return the result.
  119688. * If map is true then convert result to affine coordinates.
  119689. *
  119690. * Stripe implementation.
  119691. * Pre-generated: 2^0, 2^65, ...
  119692. * Pre-generated: products of all combinations of above.
  119693. * 8 doubles and adds (with qz=1)
  119694. *
  119695. * r Resulting point.
  119696. * k Scalar to multiply by.
  119697. * map Indicates whether to convert result to affine.
  119698. * ct Constant time required.
  119699. * heap Heap to use for allocation.
  119700. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  119701. */
  119702. static int sp_521_ecc_mulmod_base_17(sp_point_521* r, const sp_digit* k,
  119703. int map, int ct, void* heap)
  119704. {
  119705. return sp_521_ecc_mulmod_stripe_17(r, &p521_base, p521_table,
  119706. k, map, ct, heap);
  119707. }
  119708. #endif
  119709. /* Multiply the base point of P521 by the scalar and return the result.
  119710. * If map is true then convert result to affine coordinates.
  119711. *
  119712. * km Scalar to multiply by.
  119713. * r Resulting point.
  119714. * map Indicates whether to convert result to affine.
  119715. * heap Heap to use for allocation.
  119716. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  119717. */
  119718. int sp_ecc_mulmod_base_521(const mp_int* km, ecc_point* r, int map, void* heap)
  119719. {
  119720. #ifdef WOLFSSL_SP_SMALL_STACK
  119721. sp_point_521* point = NULL;
  119722. sp_digit* k = NULL;
  119723. #else
  119724. sp_point_521 point[1];
  119725. sp_digit k[17];
  119726. #endif
  119727. int err = MP_OKAY;
  119728. #ifdef WOLFSSL_SP_SMALL_STACK
  119729. point = (sp_point_521*)XMALLOC(sizeof(sp_point_521), heap,
  119730. DYNAMIC_TYPE_ECC);
  119731. if (point == NULL)
  119732. err = MEMORY_E;
  119733. if (err == MP_OKAY) {
  119734. k = (sp_digit*)XMALLOC(sizeof(sp_digit) * 17, heap,
  119735. DYNAMIC_TYPE_ECC);
  119736. if (k == NULL)
  119737. err = MEMORY_E;
  119738. }
  119739. #endif
  119740. if (err == MP_OKAY) {
  119741. sp_521_from_mp(k, 17, km);
  119742. err = sp_521_ecc_mulmod_base_17(point, k, map, 1, heap);
  119743. }
  119744. if (err == MP_OKAY) {
  119745. err = sp_521_point_to_ecc_point_17(point, r);
  119746. }
  119747. #ifdef WOLFSSL_SP_SMALL_STACK
  119748. if (k != NULL)
  119749. XFREE(k, heap, DYNAMIC_TYPE_ECC);
  119750. if (point != NULL)
  119751. XFREE(point, heap, DYNAMIC_TYPE_ECC);
  119752. #endif
  119753. return err;
  119754. }
  119755. /* Multiply the base point of P521 by the scalar, add point a and return
  119756. * the result. If map is true then convert result to affine coordinates.
  119757. *
  119758. * km Scalar to multiply by.
  119759. * am Point to add to scalar multiply result.
  119760. * inMont Point to add is in montgomery form.
  119761. * r Resulting point.
  119762. * map Indicates whether to convert result to affine.
  119763. * heap Heap to use for allocation.
  119764. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  119765. */
  119766. int sp_ecc_mulmod_base_add_521(const mp_int* km, const ecc_point* am,
  119767. int inMont, ecc_point* r, int map, void* heap)
  119768. {
  119769. #ifdef WOLFSSL_SP_SMALL_STACK
  119770. sp_point_521* point = NULL;
  119771. sp_digit* k = NULL;
  119772. #else
  119773. sp_point_521 point[2];
  119774. sp_digit k[17 + 17 * 2 * 6];
  119775. #endif
  119776. sp_point_521* addP = NULL;
  119777. sp_digit* tmp = NULL;
  119778. int err = MP_OKAY;
  119779. #ifdef WOLFSSL_SP_SMALL_STACK
  119780. point = (sp_point_521*)XMALLOC(sizeof(sp_point_521) * 2, heap,
  119781. DYNAMIC_TYPE_ECC);
  119782. if (point == NULL)
  119783. err = MEMORY_E;
  119784. if (err == MP_OKAY) {
  119785. k = (sp_digit*)XMALLOC(
  119786. sizeof(sp_digit) * (17 + 17 * 2 * 6),
  119787. heap, DYNAMIC_TYPE_ECC);
  119788. if (k == NULL)
  119789. err = MEMORY_E;
  119790. }
  119791. #endif
  119792. if (err == MP_OKAY) {
  119793. addP = point + 1;
  119794. tmp = k + 17;
  119795. sp_521_from_mp(k, 17, km);
  119796. sp_521_point_from_ecc_point_17(addP, am);
  119797. }
  119798. if ((err == MP_OKAY) && (!inMont)) {
  119799. err = sp_521_mod_mul_norm_17(addP->x, addP->x, p521_mod);
  119800. }
  119801. if ((err == MP_OKAY) && (!inMont)) {
  119802. err = sp_521_mod_mul_norm_17(addP->y, addP->y, p521_mod);
  119803. }
  119804. if ((err == MP_OKAY) && (!inMont)) {
  119805. err = sp_521_mod_mul_norm_17(addP->z, addP->z, p521_mod);
  119806. }
  119807. if (err == MP_OKAY) {
  119808. err = sp_521_ecc_mulmod_base_17(point, k, 0, 0, heap);
  119809. }
  119810. if (err == MP_OKAY) {
  119811. sp_521_proj_point_add_17(point, point, addP, tmp);
  119812. if (map) {
  119813. sp_521_map_17(point, point, tmp);
  119814. }
  119815. err = sp_521_point_to_ecc_point_17(point, r);
  119816. }
  119817. #ifdef WOLFSSL_SP_SMALL_STACK
  119818. if (k != NULL)
  119819. XFREE(k, heap, DYNAMIC_TYPE_ECC);
  119820. if (point)
  119821. XFREE(point, heap, DYNAMIC_TYPE_ECC);
  119822. #endif
  119823. return err;
  119824. }
  119825. #if defined(WOLFSSL_VALIDATE_ECC_KEYGEN) || defined(HAVE_ECC_SIGN) || \
  119826. defined(HAVE_ECC_VERIFY)
  119827. #endif /* WOLFSSL_VALIDATE_ECC_KEYGEN | HAVE_ECC_SIGN | HAVE_ECC_VERIFY */
  119828. /* Add 1 to a. (a = a + 1)
  119829. *
  119830. * a A single precision integer.
  119831. */
  119832. static void sp_521_add_one_17(sp_digit* a_p)
  119833. {
  119834. register sp_digit* a asm ("r0") = (sp_digit*)a_p;
  119835. __asm__ __volatile__ (
  119836. "ldm %[a], {r1, r2, r3, r4}\n\t"
  119837. "adds r1, r1, #1\n\t"
  119838. "adcs r2, r2, #0\n\t"
  119839. "adcs r3, r3, #0\n\t"
  119840. "adcs r4, r4, #0\n\t"
  119841. "stm %[a]!, {r1, r2, r3, r4}\n\t"
  119842. "ldm %[a], {r1, r2, r3, r4}\n\t"
  119843. "adcs r1, r1, #0\n\t"
  119844. "adcs r2, r2, #0\n\t"
  119845. "adcs r3, r3, #0\n\t"
  119846. "adcs r4, r4, #0\n\t"
  119847. "stm %[a]!, {r1, r2, r3, r4}\n\t"
  119848. "ldm %[a], {r1, r2, r3, r4}\n\t"
  119849. "adcs r1, r1, #0\n\t"
  119850. "adcs r2, r2, #0\n\t"
  119851. "adcs r3, r3, #0\n\t"
  119852. "adcs r4, r4, #0\n\t"
  119853. "stm %[a]!, {r1, r2, r3, r4}\n\t"
  119854. "ldm %[a], {r1, r2, r3, r4}\n\t"
  119855. "adcs r1, r1, #0\n\t"
  119856. "adcs r2, r2, #0\n\t"
  119857. "adcs r3, r3, #0\n\t"
  119858. "adcs r4, r4, #0\n\t"
  119859. "stm %[a]!, {r1, r2, r3, r4}\n\t"
  119860. "ldm %[a], {r1}\n\t"
  119861. "adcs r1, r1, #0\n\t"
  119862. "stm %[a]!, {r1}\n\t"
  119863. : [a] "+r" (a)
  119864. :
  119865. : "memory", "r1", "r2", "r3", "r4", "cc"
  119866. );
  119867. }
  119868. /* Read big endian unsigned byte array into r.
  119869. *
  119870. * r A single precision integer.
  119871. * size Maximum number of bytes to convert
  119872. * a Byte array.
  119873. * n Number of bytes in array to read.
  119874. */
  119875. static void sp_521_from_bin(sp_digit* r, int size, const byte* a, int n)
  119876. {
  119877. int i;
  119878. int j;
  119879. byte* d;
  119880. for (i = n - 1,j = 0; i >= 3; i -= 4) {
  119881. r[j] = ((sp_digit)a[i - 0] << 0) |
  119882. ((sp_digit)a[i - 1] << 8) |
  119883. ((sp_digit)a[i - 2] << 16) |
  119884. ((sp_digit)a[i - 3] << 24);
  119885. j++;
  119886. }
  119887. if (i >= 0) {
  119888. r[j] = 0;
  119889. d = (byte*)r;
  119890. switch (i) {
  119891. case 2: d[n - 1 - 2] = a[2]; //fallthrough
  119892. case 1: d[n - 1 - 1] = a[1]; //fallthrough
  119893. case 0: d[n - 1 - 0] = a[0]; //fallthrough
  119894. }
  119895. j++;
  119896. }
  119897. for (; j < size; j++) {
  119898. r[j] = 0;
  119899. }
  119900. }
  119901. /* Generates a scalar that is in the range 1..order-1.
  119902. *
  119903. * rng Random number generator.
  119904. * k Scalar value.
  119905. * returns RNG failures, MEMORY_E when memory allocation fails and
  119906. * MP_OKAY on success.
  119907. */
  119908. static int sp_521_ecc_gen_k_17(WC_RNG* rng, sp_digit* k)
  119909. {
  119910. int err;
  119911. byte buf[66];
  119912. do {
  119913. err = wc_RNG_GenerateBlock(rng, buf, sizeof(buf));
  119914. if (err == 0) {
  119915. buf[0] &= 0x1;
  119916. sp_521_from_bin(k, 17, buf, (int)sizeof(buf));
  119917. if (sp_521_cmp_17(k, p521_order2) <= 0) {
  119918. sp_521_add_one_17(k);
  119919. break;
  119920. }
  119921. }
  119922. }
  119923. while (err == 0);
  119924. return err;
  119925. }
  119926. /* Makes a random EC key pair.
  119927. *
  119928. * rng Random number generator.
  119929. * priv Generated private value.
  119930. * pub Generated public point.
  119931. * heap Heap to use for allocation.
  119932. * returns ECC_INF_E when the point does not have the correct order, RNG
  119933. * failures, MEMORY_E when memory allocation fails and MP_OKAY on success.
  119934. */
  119935. int sp_ecc_make_key_521(WC_RNG* rng, mp_int* priv, ecc_point* pub, void* heap)
  119936. {
  119937. #ifdef WOLFSSL_SP_SMALL_STACK
  119938. sp_point_521* point = NULL;
  119939. sp_digit* k = NULL;
  119940. #else
  119941. #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN
  119942. sp_point_521 point[2];
  119943. #else
  119944. sp_point_521 point[1];
  119945. #endif
  119946. sp_digit k[17];
  119947. #endif
  119948. #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN
  119949. sp_point_521* infinity = NULL;
  119950. #endif
  119951. int err = MP_OKAY;
  119952. (void)heap;
  119953. #ifdef WOLFSSL_SP_SMALL_STACK
  119954. #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN
  119955. point = (sp_point_521*)XMALLOC(sizeof(sp_point_521) * 2, heap, DYNAMIC_TYPE_ECC);
  119956. #else
  119957. point = (sp_point_521*)XMALLOC(sizeof(sp_point_521), heap, DYNAMIC_TYPE_ECC);
  119958. #endif
  119959. if (point == NULL)
  119960. err = MEMORY_E;
  119961. if (err == MP_OKAY) {
  119962. k = (sp_digit*)XMALLOC(sizeof(sp_digit) * 17, heap,
  119963. DYNAMIC_TYPE_ECC);
  119964. if (k == NULL)
  119965. err = MEMORY_E;
  119966. }
  119967. #endif
  119968. if (err == MP_OKAY) {
  119969. #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN
  119970. infinity = point + 1;
  119971. #endif
  119972. err = sp_521_ecc_gen_k_17(rng, k);
  119973. }
  119974. if (err == MP_OKAY) {
  119975. err = sp_521_ecc_mulmod_base_17(point, k, 1, 1, NULL);
  119976. }
  119977. #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN
  119978. if (err == MP_OKAY) {
  119979. err = sp_521_ecc_mulmod_17(infinity, point, p521_order, 1, 1, NULL);
  119980. }
  119981. if (err == MP_OKAY) {
  119982. if (sp_521_iszero_17(point->x) || sp_521_iszero_17(point->y)) {
  119983. err = ECC_INF_E;
  119984. }
  119985. }
  119986. #endif
  119987. if (err == MP_OKAY) {
  119988. err = sp_521_to_mp(k, priv);
  119989. }
  119990. if (err == MP_OKAY) {
  119991. err = sp_521_point_to_ecc_point_17(point, pub);
  119992. }
  119993. #ifdef WOLFSSL_SP_SMALL_STACK
  119994. if (k != NULL)
  119995. XFREE(k, heap, DYNAMIC_TYPE_ECC);
  119996. if (point != NULL) {
  119997. /* point is not sensitive, so no need to zeroize */
  119998. XFREE(point, heap, DYNAMIC_TYPE_ECC);
  119999. }
  120000. #endif
  120001. return err;
  120002. }
  120003. #ifdef WOLFSSL_SP_NONBLOCK
  120004. typedef struct sp_ecc_key_gen_521_ctx {
  120005. int state;
  120006. sp_521_ecc_mulmod_17_ctx mulmod_ctx;
  120007. sp_digit k[17];
  120008. #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN
  120009. sp_point_521 point[2];
  120010. #else
  120011. sp_point_521 point[1];
  120012. #endif /* WOLFSSL_VALIDATE_ECC_KEYGEN */
  120013. } sp_ecc_key_gen_521_ctx;
  120014. int sp_ecc_make_key_521_nb(sp_ecc_ctx_t* sp_ctx, WC_RNG* rng, mp_int* priv,
  120015. ecc_point* pub, void* heap)
  120016. {
  120017. int err = FP_WOULDBLOCK;
  120018. sp_ecc_key_gen_521_ctx* ctx = (sp_ecc_key_gen_521_ctx*)sp_ctx->data;
  120019. #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN
  120020. sp_point_521* infinity = ctx->point + 1;
  120021. #endif /* WOLFSSL_VALIDATE_ECC_KEYGEN */
  120022. typedef char ctx_size_test[sizeof(sp_ecc_key_gen_521_ctx)
  120023. >= sizeof(*sp_ctx) ? -1 : 1];
  120024. (void)sizeof(ctx_size_test);
  120025. switch (ctx->state) {
  120026. case 0:
  120027. err = sp_521_ecc_gen_k_17(rng, ctx->k);
  120028. if (err == MP_OKAY) {
  120029. err = FP_WOULDBLOCK;
  120030. ctx->state = 1;
  120031. }
  120032. break;
  120033. case 1:
  120034. err = sp_521_ecc_mulmod_base_17_nb((sp_ecc_ctx_t*)&ctx->mulmod_ctx,
  120035. ctx->point, ctx->k, 1, 1, heap);
  120036. if (err == MP_OKAY) {
  120037. err = FP_WOULDBLOCK;
  120038. #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN
  120039. XMEMSET(&ctx->mulmod_ctx, 0, sizeof(ctx->mulmod_ctx));
  120040. ctx->state = 2;
  120041. #else
  120042. ctx->state = 3;
  120043. #endif
  120044. }
  120045. break;
  120046. #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN
  120047. case 2:
  120048. err = sp_521_ecc_mulmod_17_nb((sp_ecc_ctx_t*)&ctx->mulmod_ctx,
  120049. infinity, ctx->point, p521_order, 1, 1);
  120050. if (err == MP_OKAY) {
  120051. if (sp_521_iszero_17(ctx->point->x) ||
  120052. sp_521_iszero_17(ctx->point->y)) {
  120053. err = ECC_INF_E;
  120054. }
  120055. else {
  120056. err = FP_WOULDBLOCK;
  120057. ctx->state = 3;
  120058. }
  120059. }
  120060. break;
  120061. #endif /* WOLFSSL_VALIDATE_ECC_KEYGEN */
  120062. case 3:
  120063. err = sp_521_to_mp(ctx->k, priv);
  120064. if (err == MP_OKAY) {
  120065. err = sp_521_point_to_ecc_point_17(ctx->point, pub);
  120066. }
  120067. break;
  120068. }
  120069. if (err != FP_WOULDBLOCK) {
  120070. XMEMSET(ctx, 0, sizeof(sp_ecc_key_gen_521_ctx));
  120071. }
  120072. return err;
  120073. }
  120074. #endif /* WOLFSSL_SP_NONBLOCK */
  120075. #ifdef HAVE_ECC_DHE
  120076. /* Write r as big endian to byte array.
  120077. * Fixed length number of bytes written: 66
  120078. *
  120079. * r A single precision integer.
  120080. * a Byte array.
  120081. */
  120082. static void sp_521_to_bin_17(sp_digit* r, byte* a)
  120083. {
  120084. int i;
  120085. int j = 0;
  120086. a[j++] = r[16] >> 8;
  120087. a[j++] = r[16] >> 0;
  120088. for (i = 15; i >= 0; i--) {
  120089. a[j++] = r[i] >> 24;
  120090. a[j++] = r[i] >> 16;
  120091. a[j++] = r[i] >> 8;
  120092. a[j++] = r[i] >> 0;
  120093. }
  120094. }
  120095. /* Multiply the point by the scalar and serialize the X ordinate.
  120096. * The number is 0 padded to maximum size on output.
  120097. *
  120098. * priv Scalar to multiply the point by.
  120099. * pub Point to multiply.
  120100. * out Buffer to hold X ordinate.
  120101. * outLen On entry, size of the buffer in bytes.
  120102. * On exit, length of data in buffer in bytes.
  120103. * heap Heap to use for allocation.
  120104. * returns BUFFER_E if the buffer is to small for output size,
  120105. * MEMORY_E when memory allocation fails and MP_OKAY on success.
  120106. */
  120107. int sp_ecc_secret_gen_521(const mp_int* priv, const ecc_point* pub, byte* out,
  120108. word32* outLen, void* heap)
  120109. {
  120110. #ifdef WOLFSSL_SP_SMALL_STACK
  120111. sp_point_521* point = NULL;
  120112. sp_digit* k = NULL;
  120113. #else
  120114. sp_point_521 point[1];
  120115. sp_digit k[17];
  120116. #endif
  120117. int err = MP_OKAY;
  120118. if (*outLen < 65U) {
  120119. err = BUFFER_E;
  120120. }
  120121. #ifdef WOLFSSL_SP_SMALL_STACK
  120122. if (err == MP_OKAY) {
  120123. point = (sp_point_521*)XMALLOC(sizeof(sp_point_521), heap,
  120124. DYNAMIC_TYPE_ECC);
  120125. if (point == NULL)
  120126. err = MEMORY_E;
  120127. }
  120128. if (err == MP_OKAY) {
  120129. k = (sp_digit*)XMALLOC(sizeof(sp_digit) * 17, heap,
  120130. DYNAMIC_TYPE_ECC);
  120131. if (k == NULL)
  120132. err = MEMORY_E;
  120133. }
  120134. #endif
  120135. if (err == MP_OKAY) {
  120136. sp_521_from_mp(k, 17, priv);
  120137. sp_521_point_from_ecc_point_17(point, pub);
  120138. err = sp_521_ecc_mulmod_17(point, point, k, 1, 1, heap);
  120139. }
  120140. if (err == MP_OKAY) {
  120141. sp_521_to_bin_17(point->x, out);
  120142. *outLen = 66;
  120143. }
  120144. #ifdef WOLFSSL_SP_SMALL_STACK
  120145. if (k != NULL)
  120146. XFREE(k, heap, DYNAMIC_TYPE_ECC);
  120147. if (point != NULL)
  120148. XFREE(point, heap, DYNAMIC_TYPE_ECC);
  120149. #endif
  120150. return err;
  120151. }
  120152. #ifdef WOLFSSL_SP_NONBLOCK
  120153. typedef struct sp_ecc_sec_gen_521_ctx {
  120154. int state;
  120155. union {
  120156. sp_521_ecc_mulmod_17_ctx mulmod_ctx;
  120157. };
  120158. sp_digit k[17];
  120159. sp_point_521 point;
  120160. } sp_ecc_sec_gen_521_ctx;
  120161. int sp_ecc_secret_gen_521_nb(sp_ecc_ctx_t* sp_ctx, const mp_int* priv,
  120162. const ecc_point* pub, byte* out, word32* outLen, void* heap)
  120163. {
  120164. int err = FP_WOULDBLOCK;
  120165. sp_ecc_sec_gen_521_ctx* ctx = (sp_ecc_sec_gen_521_ctx*)sp_ctx->data;
  120166. typedef char ctx_size_test[sizeof(sp_ecc_sec_gen_521_ctx) >= sizeof(*sp_ctx) ? -1 : 1];
  120167. (void)sizeof(ctx_size_test);
  120168. if (*outLen < 32U) {
  120169. err = BUFFER_E;
  120170. }
  120171. switch (ctx->state) {
  120172. case 0:
  120173. sp_521_from_mp(ctx->k, 17, priv);
  120174. sp_521_point_from_ecc_point_17(&ctx->point, pub);
  120175. ctx->state = 1;
  120176. break;
  120177. case 1:
  120178. err = sp_521_ecc_mulmod_17_nb((sp_ecc_ctx_t*)&ctx->mulmod_ctx,
  120179. &ctx->point, &ctx->point, ctx->k, 1, 1, heap);
  120180. if (err == MP_OKAY) {
  120181. sp_521_to_bin_17(ctx->point.x, out);
  120182. *outLen = 66;
  120183. }
  120184. break;
  120185. }
  120186. if (err == MP_OKAY && ctx->state != 1) {
  120187. err = FP_WOULDBLOCK;
  120188. }
  120189. if (err != FP_WOULDBLOCK) {
  120190. XMEMSET(ctx, 0, sizeof(sp_ecc_sec_gen_521_ctx));
  120191. }
  120192. return err;
  120193. }
  120194. #endif /* WOLFSSL_SP_NONBLOCK */
  120195. #endif /* HAVE_ECC_DHE */
  120196. #if defined(HAVE_ECC_SIGN) || defined(HAVE_ECC_VERIFY)
  120197. static void sp_521_rshift_17(sp_digit* r_p, const sp_digit* a_p, byte n_p)
  120198. {
  120199. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  120200. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  120201. register byte n asm ("r2") = (byte)n_p;
  120202. __asm__ __volatile__ (
  120203. "rsb r12, %[n], #32\n\t"
  120204. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  120205. "ldr r4, [%[a]]\n\t"
  120206. "ldr r5, [%[a], #4]\n\t"
  120207. #else
  120208. "ldrd r4, r5, [%[a]]\n\t"
  120209. #endif
  120210. "lsr r4, r4, %[n]\n\t"
  120211. "lsl r3, r5, r12\n\t"
  120212. "lsr r5, r5, %[n]\n\t"
  120213. "orr r4, r4, r3\n\t"
  120214. "ldr r6, [%[a], #8]\n\t"
  120215. "str r4, [%[a]]\n\t"
  120216. "lsl r3, r6, r12\n\t"
  120217. "lsr r6, r6, %[n]\n\t"
  120218. "orr r5, r5, r3\n\t"
  120219. "ldr r4, [%[a], #12]\n\t"
  120220. "str r5, [%[a], #4]\n\t"
  120221. "lsl r3, r4, r12\n\t"
  120222. "lsr r4, r4, %[n]\n\t"
  120223. "orr r6, r6, r3\n\t"
  120224. "ldr r5, [%[a], #16]\n\t"
  120225. "str r6, [%[a], #8]\n\t"
  120226. "lsl r3, r5, r12\n\t"
  120227. "lsr r5, r5, %[n]\n\t"
  120228. "orr r4, r4, r3\n\t"
  120229. "ldr r6, [%[a], #20]\n\t"
  120230. "str r4, [%[a], #12]\n\t"
  120231. "lsl r3, r6, r12\n\t"
  120232. "lsr r6, r6, %[n]\n\t"
  120233. "orr r5, r5, r3\n\t"
  120234. "ldr r4, [%[a], #24]\n\t"
  120235. "str r5, [%[a], #16]\n\t"
  120236. "lsl r3, r4, r12\n\t"
  120237. "lsr r4, r4, %[n]\n\t"
  120238. "orr r6, r6, r3\n\t"
  120239. "ldr r5, [%[a], #28]\n\t"
  120240. "str r6, [%[a], #20]\n\t"
  120241. "lsl r3, r5, r12\n\t"
  120242. "lsr r5, r5, %[n]\n\t"
  120243. "orr r4, r4, r3\n\t"
  120244. "ldr r6, [%[a], #32]\n\t"
  120245. "str r4, [%[a], #24]\n\t"
  120246. "lsl r3, r6, r12\n\t"
  120247. "lsr r6, r6, %[n]\n\t"
  120248. "orr r5, r5, r3\n\t"
  120249. "ldr r4, [%[a], #36]\n\t"
  120250. "str r5, [%[a], #28]\n\t"
  120251. "lsl r3, r4, r12\n\t"
  120252. "lsr r4, r4, %[n]\n\t"
  120253. "orr r6, r6, r3\n\t"
  120254. "ldr r5, [%[a], #40]\n\t"
  120255. "str r6, [%[a], #32]\n\t"
  120256. "lsl r3, r5, r12\n\t"
  120257. "lsr r5, r5, %[n]\n\t"
  120258. "orr r4, r4, r3\n\t"
  120259. "ldr r6, [%[a], #44]\n\t"
  120260. "str r4, [%[a], #36]\n\t"
  120261. "lsl r3, r6, r12\n\t"
  120262. "lsr r6, r6, %[n]\n\t"
  120263. "orr r5, r5, r3\n\t"
  120264. "ldr r4, [%[a], #48]\n\t"
  120265. "str r5, [%[a], #40]\n\t"
  120266. "lsl r3, r4, r12\n\t"
  120267. "lsr r4, r4, %[n]\n\t"
  120268. "orr r6, r6, r3\n\t"
  120269. "ldr r5, [%[a], #52]\n\t"
  120270. "str r6, [%[a], #44]\n\t"
  120271. "lsl r3, r5, r12\n\t"
  120272. "lsr r5, r5, %[n]\n\t"
  120273. "orr r4, r4, r3\n\t"
  120274. "ldr r6, [%[a], #56]\n\t"
  120275. "str r4, [%[a], #48]\n\t"
  120276. "lsl r3, r6, r12\n\t"
  120277. "lsr r6, r6, %[n]\n\t"
  120278. "orr r5, r5, r3\n\t"
  120279. "ldr r4, [%[a], #60]\n\t"
  120280. "str r5, [%[a], #52]\n\t"
  120281. "lsl r3, r4, r12\n\t"
  120282. "lsr r4, r4, %[n]\n\t"
  120283. "orr r6, r6, r3\n\t"
  120284. "ldr r5, [%[a], #64]\n\t"
  120285. "str r6, [%[a], #56]\n\t"
  120286. "lsl r3, r5, r12\n\t"
  120287. "lsr r5, r5, %[n]\n\t"
  120288. "orr r4, r4, r3\n\t"
  120289. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  120290. "str r4, [%[r], #60]\n\t"
  120291. "str r5, [%[r], #64]\n\t"
  120292. #else
  120293. "strd r4, r5, [%[r], #60]\n\t"
  120294. #endif
  120295. : [r] "+r" (r), [a] "+r" (a), [n] "+r" (n)
  120296. :
  120297. : "memory", "r4", "r5", "r6", "r3", "r12", "cc"
  120298. );
  120299. }
  120300. #endif
  120301. #if defined(HAVE_ECC_SIGN) || defined(HAVE_ECC_VERIFY)
  120302. #endif
  120303. #if defined(HAVE_ECC_SIGN) || defined(HAVE_ECC_VERIFY)
  120304. static void sp_521_lshift_17(sp_digit* r_p, const sp_digit* a_p, byte n_p)
  120305. {
  120306. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  120307. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  120308. register byte n asm ("r2") = (byte)n_p;
  120309. __asm__ __volatile__ (
  120310. "rsb r12, %[n], #31\n\t"
  120311. "ldr r5, [%[a], #64]\n\t"
  120312. "lsr r6, r5, #1\n\t"
  120313. "lsl r5, r5, %[n]\n\t"
  120314. "lsr r6, r6, r12\n\t"
  120315. "ldr r4, [%[a], #60]\n\t"
  120316. "str r6, [%[r], #68]\n\t"
  120317. "lsr r3, r4, #1\n\t"
  120318. "lsl r4, r4, %[n]\n\t"
  120319. "lsr r3, r3, r12\n\t"
  120320. "orr r5, r5, r3\n\t"
  120321. "ldr r6, [%[a], #56]\n\t"
  120322. "str r5, [%[r], #64]\n\t"
  120323. "lsr r3, r6, #1\n\t"
  120324. "lsl r6, r6, %[n]\n\t"
  120325. "lsr r3, r3, r12\n\t"
  120326. "orr r4, r4, r3\n\t"
  120327. "ldr r5, [%[a], #52]\n\t"
  120328. "str r4, [%[r], #60]\n\t"
  120329. "lsr r3, r5, #1\n\t"
  120330. "lsl r5, r5, %[n]\n\t"
  120331. "lsr r3, r3, r12\n\t"
  120332. "orr r6, r6, r3\n\t"
  120333. "ldr r4, [%[a], #48]\n\t"
  120334. "str r6, [%[r], #56]\n\t"
  120335. "lsr r3, r4, #1\n\t"
  120336. "lsl r4, r4, %[n]\n\t"
  120337. "lsr r3, r3, r12\n\t"
  120338. "orr r5, r5, r3\n\t"
  120339. "ldr r6, [%[a], #44]\n\t"
  120340. "str r5, [%[r], #52]\n\t"
  120341. "lsr r3, r6, #1\n\t"
  120342. "lsl r6, r6, %[n]\n\t"
  120343. "lsr r3, r3, r12\n\t"
  120344. "orr r4, r4, r3\n\t"
  120345. "ldr r5, [%[a], #40]\n\t"
  120346. "str r4, [%[r], #48]\n\t"
  120347. "lsr r3, r5, #1\n\t"
  120348. "lsl r5, r5, %[n]\n\t"
  120349. "lsr r3, r3, r12\n\t"
  120350. "orr r6, r6, r3\n\t"
  120351. "ldr r4, [%[a], #36]\n\t"
  120352. "str r6, [%[r], #44]\n\t"
  120353. "lsr r3, r4, #1\n\t"
  120354. "lsl r4, r4, %[n]\n\t"
  120355. "lsr r3, r3, r12\n\t"
  120356. "orr r5, r5, r3\n\t"
  120357. "ldr r6, [%[a], #32]\n\t"
  120358. "str r5, [%[r], #40]\n\t"
  120359. "lsr r3, r6, #1\n\t"
  120360. "lsl r6, r6, %[n]\n\t"
  120361. "lsr r3, r3, r12\n\t"
  120362. "orr r4, r4, r3\n\t"
  120363. "ldr r5, [%[a], #28]\n\t"
  120364. "str r4, [%[r], #36]\n\t"
  120365. "lsr r3, r5, #1\n\t"
  120366. "lsl r5, r5, %[n]\n\t"
  120367. "lsr r3, r3, r12\n\t"
  120368. "orr r6, r6, r3\n\t"
  120369. "ldr r4, [%[a], #24]\n\t"
  120370. "str r6, [%[r], #32]\n\t"
  120371. "lsr r3, r4, #1\n\t"
  120372. "lsl r4, r4, %[n]\n\t"
  120373. "lsr r3, r3, r12\n\t"
  120374. "orr r5, r5, r3\n\t"
  120375. "ldr r6, [%[a], #20]\n\t"
  120376. "str r5, [%[r], #28]\n\t"
  120377. "lsr r3, r6, #1\n\t"
  120378. "lsl r6, r6, %[n]\n\t"
  120379. "lsr r3, r3, r12\n\t"
  120380. "orr r4, r4, r3\n\t"
  120381. "ldr r5, [%[a], #16]\n\t"
  120382. "str r4, [%[r], #24]\n\t"
  120383. "lsr r3, r5, #1\n\t"
  120384. "lsl r5, r5, %[n]\n\t"
  120385. "lsr r3, r3, r12\n\t"
  120386. "orr r6, r6, r3\n\t"
  120387. "ldr r4, [%[a], #12]\n\t"
  120388. "str r6, [%[r], #20]\n\t"
  120389. "lsr r3, r4, #1\n\t"
  120390. "lsl r4, r4, %[n]\n\t"
  120391. "lsr r3, r3, r12\n\t"
  120392. "orr r5, r5, r3\n\t"
  120393. "ldr r6, [%[a], #8]\n\t"
  120394. "str r5, [%[r], #16]\n\t"
  120395. "lsr r3, r6, #1\n\t"
  120396. "lsl r6, r6, %[n]\n\t"
  120397. "lsr r3, r3, r12\n\t"
  120398. "orr r4, r4, r3\n\t"
  120399. "ldr r5, [%[a], #4]\n\t"
  120400. "str r4, [%[r], #12]\n\t"
  120401. "lsr r3, r5, #1\n\t"
  120402. "lsl r5, r5, %[n]\n\t"
  120403. "lsr r3, r3, r12\n\t"
  120404. "orr r6, r6, r3\n\t"
  120405. "ldr r4, [%[a]]\n\t"
  120406. "str r6, [%[r], #8]\n\t"
  120407. "lsr r3, r4, #1\n\t"
  120408. "lsl r4, r4, %[n]\n\t"
  120409. "lsr r3, r3, r12\n\t"
  120410. "orr r5, r5, r3\n\t"
  120411. "str r4, [%[r]]\n\t"
  120412. "str r5, [%[r], #4]\n\t"
  120413. : [r] "+r" (r), [a] "+r" (a), [n] "+r" (n)
  120414. :
  120415. : "memory", "r4", "r5", "r6", "r3", "r12", "cc"
  120416. );
  120417. }
  120418. static void sp_521_lshift_34(sp_digit* r_p, const sp_digit* a_p, byte n_p)
  120419. {
  120420. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  120421. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  120422. register byte n asm ("r2") = (byte)n_p;
  120423. __asm__ __volatile__ (
  120424. "rsb r12, %[n], #31\n\t"
  120425. "ldr r5, [%[a], #132]\n\t"
  120426. "lsr r6, r5, #1\n\t"
  120427. "lsl r5, r5, %[n]\n\t"
  120428. "lsr r6, r6, r12\n\t"
  120429. "ldr r4, [%[a], #128]\n\t"
  120430. "str r6, [%[r], #136]\n\t"
  120431. "lsr r3, r4, #1\n\t"
  120432. "lsl r4, r4, %[n]\n\t"
  120433. "lsr r3, r3, r12\n\t"
  120434. "orr r5, r5, r3\n\t"
  120435. "ldr r6, [%[a], #124]\n\t"
  120436. "str r5, [%[r], #132]\n\t"
  120437. "lsr r3, r6, #1\n\t"
  120438. "lsl r6, r6, %[n]\n\t"
  120439. "lsr r3, r3, r12\n\t"
  120440. "orr r4, r4, r3\n\t"
  120441. "ldr r5, [%[a], #120]\n\t"
  120442. "str r4, [%[r], #128]\n\t"
  120443. "lsr r3, r5, #1\n\t"
  120444. "lsl r5, r5, %[n]\n\t"
  120445. "lsr r3, r3, r12\n\t"
  120446. "orr r6, r6, r3\n\t"
  120447. "ldr r4, [%[a], #116]\n\t"
  120448. "str r6, [%[r], #124]\n\t"
  120449. "lsr r3, r4, #1\n\t"
  120450. "lsl r4, r4, %[n]\n\t"
  120451. "lsr r3, r3, r12\n\t"
  120452. "orr r5, r5, r3\n\t"
  120453. "ldr r6, [%[a], #112]\n\t"
  120454. "str r5, [%[r], #120]\n\t"
  120455. "lsr r3, r6, #1\n\t"
  120456. "lsl r6, r6, %[n]\n\t"
  120457. "lsr r3, r3, r12\n\t"
  120458. "orr r4, r4, r3\n\t"
  120459. "ldr r5, [%[a], #108]\n\t"
  120460. "str r4, [%[r], #116]\n\t"
  120461. "lsr r3, r5, #1\n\t"
  120462. "lsl r5, r5, %[n]\n\t"
  120463. "lsr r3, r3, r12\n\t"
  120464. "orr r6, r6, r3\n\t"
  120465. "ldr r4, [%[a], #104]\n\t"
  120466. "str r6, [%[r], #112]\n\t"
  120467. "lsr r3, r4, #1\n\t"
  120468. "lsl r4, r4, %[n]\n\t"
  120469. "lsr r3, r3, r12\n\t"
  120470. "orr r5, r5, r3\n\t"
  120471. "ldr r6, [%[a], #100]\n\t"
  120472. "str r5, [%[r], #108]\n\t"
  120473. "lsr r3, r6, #1\n\t"
  120474. "lsl r6, r6, %[n]\n\t"
  120475. "lsr r3, r3, r12\n\t"
  120476. "orr r4, r4, r3\n\t"
  120477. "ldr r5, [%[a], #96]\n\t"
  120478. "str r4, [%[r], #104]\n\t"
  120479. "lsr r3, r5, #1\n\t"
  120480. "lsl r5, r5, %[n]\n\t"
  120481. "lsr r3, r3, r12\n\t"
  120482. "orr r6, r6, r3\n\t"
  120483. "ldr r4, [%[a], #92]\n\t"
  120484. "str r6, [%[r], #100]\n\t"
  120485. "lsr r3, r4, #1\n\t"
  120486. "lsl r4, r4, %[n]\n\t"
  120487. "lsr r3, r3, r12\n\t"
  120488. "orr r5, r5, r3\n\t"
  120489. "ldr r6, [%[a], #88]\n\t"
  120490. "str r5, [%[r], #96]\n\t"
  120491. "lsr r3, r6, #1\n\t"
  120492. "lsl r6, r6, %[n]\n\t"
  120493. "lsr r3, r3, r12\n\t"
  120494. "orr r4, r4, r3\n\t"
  120495. "ldr r5, [%[a], #84]\n\t"
  120496. "str r4, [%[r], #92]\n\t"
  120497. "lsr r3, r5, #1\n\t"
  120498. "lsl r5, r5, %[n]\n\t"
  120499. "lsr r3, r3, r12\n\t"
  120500. "orr r6, r6, r3\n\t"
  120501. "ldr r4, [%[a], #80]\n\t"
  120502. "str r6, [%[r], #88]\n\t"
  120503. "lsr r3, r4, #1\n\t"
  120504. "lsl r4, r4, %[n]\n\t"
  120505. "lsr r3, r3, r12\n\t"
  120506. "orr r5, r5, r3\n\t"
  120507. "ldr r6, [%[a], #76]\n\t"
  120508. "str r5, [%[r], #84]\n\t"
  120509. "lsr r3, r6, #1\n\t"
  120510. "lsl r6, r6, %[n]\n\t"
  120511. "lsr r3, r3, r12\n\t"
  120512. "orr r4, r4, r3\n\t"
  120513. "ldr r5, [%[a], #72]\n\t"
  120514. "str r4, [%[r], #80]\n\t"
  120515. "lsr r3, r5, #1\n\t"
  120516. "lsl r5, r5, %[n]\n\t"
  120517. "lsr r3, r3, r12\n\t"
  120518. "orr r6, r6, r3\n\t"
  120519. "ldr r4, [%[a], #68]\n\t"
  120520. "str r6, [%[r], #76]\n\t"
  120521. "lsr r3, r4, #1\n\t"
  120522. "lsl r4, r4, %[n]\n\t"
  120523. "lsr r3, r3, r12\n\t"
  120524. "orr r5, r5, r3\n\t"
  120525. "ldr r6, [%[a], #64]\n\t"
  120526. "str r5, [%[r], #72]\n\t"
  120527. "lsr r3, r6, #1\n\t"
  120528. "lsl r6, r6, %[n]\n\t"
  120529. "lsr r3, r3, r12\n\t"
  120530. "orr r4, r4, r3\n\t"
  120531. "ldr r5, [%[a], #60]\n\t"
  120532. "str r4, [%[r], #68]\n\t"
  120533. "lsr r3, r5, #1\n\t"
  120534. "lsl r5, r5, %[n]\n\t"
  120535. "lsr r3, r3, r12\n\t"
  120536. "orr r6, r6, r3\n\t"
  120537. "ldr r4, [%[a], #56]\n\t"
  120538. "str r6, [%[r], #64]\n\t"
  120539. "lsr r3, r4, #1\n\t"
  120540. "lsl r4, r4, %[n]\n\t"
  120541. "lsr r3, r3, r12\n\t"
  120542. "orr r5, r5, r3\n\t"
  120543. "ldr r6, [%[a], #52]\n\t"
  120544. "str r5, [%[r], #60]\n\t"
  120545. "lsr r3, r6, #1\n\t"
  120546. "lsl r6, r6, %[n]\n\t"
  120547. "lsr r3, r3, r12\n\t"
  120548. "orr r4, r4, r3\n\t"
  120549. "ldr r5, [%[a], #48]\n\t"
  120550. "str r4, [%[r], #56]\n\t"
  120551. "lsr r3, r5, #1\n\t"
  120552. "lsl r5, r5, %[n]\n\t"
  120553. "lsr r3, r3, r12\n\t"
  120554. "orr r6, r6, r3\n\t"
  120555. "ldr r4, [%[a], #44]\n\t"
  120556. "str r6, [%[r], #52]\n\t"
  120557. "lsr r3, r4, #1\n\t"
  120558. "lsl r4, r4, %[n]\n\t"
  120559. "lsr r3, r3, r12\n\t"
  120560. "orr r5, r5, r3\n\t"
  120561. "ldr r6, [%[a], #40]\n\t"
  120562. "str r5, [%[r], #48]\n\t"
  120563. "lsr r3, r6, #1\n\t"
  120564. "lsl r6, r6, %[n]\n\t"
  120565. "lsr r3, r3, r12\n\t"
  120566. "orr r4, r4, r3\n\t"
  120567. "ldr r5, [%[a], #36]\n\t"
  120568. "str r4, [%[r], #44]\n\t"
  120569. "lsr r3, r5, #1\n\t"
  120570. "lsl r5, r5, %[n]\n\t"
  120571. "lsr r3, r3, r12\n\t"
  120572. "orr r6, r6, r3\n\t"
  120573. "ldr r4, [%[a], #32]\n\t"
  120574. "str r6, [%[r], #40]\n\t"
  120575. "lsr r3, r4, #1\n\t"
  120576. "lsl r4, r4, %[n]\n\t"
  120577. "lsr r3, r3, r12\n\t"
  120578. "orr r5, r5, r3\n\t"
  120579. "ldr r6, [%[a], #28]\n\t"
  120580. "str r5, [%[r], #36]\n\t"
  120581. "lsr r3, r6, #1\n\t"
  120582. "lsl r6, r6, %[n]\n\t"
  120583. "lsr r3, r3, r12\n\t"
  120584. "orr r4, r4, r3\n\t"
  120585. "ldr r5, [%[a], #24]\n\t"
  120586. "str r4, [%[r], #32]\n\t"
  120587. "lsr r3, r5, #1\n\t"
  120588. "lsl r5, r5, %[n]\n\t"
  120589. "lsr r3, r3, r12\n\t"
  120590. "orr r6, r6, r3\n\t"
  120591. "ldr r4, [%[a], #20]\n\t"
  120592. "str r6, [%[r], #28]\n\t"
  120593. "lsr r3, r4, #1\n\t"
  120594. "lsl r4, r4, %[n]\n\t"
  120595. "lsr r3, r3, r12\n\t"
  120596. "orr r5, r5, r3\n\t"
  120597. "ldr r6, [%[a], #16]\n\t"
  120598. "str r5, [%[r], #24]\n\t"
  120599. "lsr r3, r6, #1\n\t"
  120600. "lsl r6, r6, %[n]\n\t"
  120601. "lsr r3, r3, r12\n\t"
  120602. "orr r4, r4, r3\n\t"
  120603. "ldr r5, [%[a], #12]\n\t"
  120604. "str r4, [%[r], #20]\n\t"
  120605. "lsr r3, r5, #1\n\t"
  120606. "lsl r5, r5, %[n]\n\t"
  120607. "lsr r3, r3, r12\n\t"
  120608. "orr r6, r6, r3\n\t"
  120609. "ldr r4, [%[a], #8]\n\t"
  120610. "str r6, [%[r], #16]\n\t"
  120611. "lsr r3, r4, #1\n\t"
  120612. "lsl r4, r4, %[n]\n\t"
  120613. "lsr r3, r3, r12\n\t"
  120614. "orr r5, r5, r3\n\t"
  120615. "ldr r6, [%[a], #4]\n\t"
  120616. "str r5, [%[r], #12]\n\t"
  120617. "lsr r3, r6, #1\n\t"
  120618. "lsl r6, r6, %[n]\n\t"
  120619. "lsr r3, r3, r12\n\t"
  120620. "orr r4, r4, r3\n\t"
  120621. "ldr r5, [%[a]]\n\t"
  120622. "str r4, [%[r], #8]\n\t"
  120623. "lsr r3, r5, #1\n\t"
  120624. "lsl r5, r5, %[n]\n\t"
  120625. "lsr r3, r3, r12\n\t"
  120626. "orr r6, r6, r3\n\t"
  120627. "str r5, [%[r]]\n\t"
  120628. "str r6, [%[r], #4]\n\t"
  120629. : [r] "+r" (r), [a] "+r" (a), [n] "+r" (n)
  120630. :
  120631. : "memory", "r4", "r5", "r6", "r3", "r12", "cc"
  120632. );
  120633. }
  120634. #ifdef WOLFSSL_SP_SMALL
  120635. /* Sub b from a into a. (a -= b)
  120636. *
  120637. * a A single precision integer.
  120638. * b A single precision integer.
  120639. */
  120640. static sp_digit sp_521_sub_in_place_17(sp_digit* a_p, const sp_digit* b_p)
  120641. {
  120642. register sp_digit* a asm ("r0") = (sp_digit*)a_p;
  120643. register const sp_digit* b asm ("r1") = (const sp_digit*)b_p;
  120644. __asm__ __volatile__ (
  120645. "mov r12, #0\n\t"
  120646. "add lr, %[a], #0x40\n\t"
  120647. "\n"
  120648. "L_sp_521_sub_in_pkace_17_word_%=: \n\t"
  120649. "rsbs r12, r12, #0\n\t"
  120650. "ldm %[a], {r2, r3, r4, r5}\n\t"
  120651. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  120652. "sbcs r2, r2, r6\n\t"
  120653. "sbcs r3, r3, r7\n\t"
  120654. "sbcs r4, r4, r8\n\t"
  120655. "sbcs r5, r5, r9\n\t"
  120656. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  120657. "sbc r12, r12, r12\n\t"
  120658. "cmp %[a], lr\n\t"
  120659. "bne L_sp_521_sub_in_pkace_17_word_%=\n\t"
  120660. "rsbs r12, r12, #0\n\t"
  120661. "ldm %[a], {r2}\n\t"
  120662. "ldm %[b]!, {r6}\n\t"
  120663. "sbcs r2, r2, r6\n\t"
  120664. "stm %[a]!, {r2}\n\t"
  120665. "sbc %[a], %[a], %[a]\n\t"
  120666. : [a] "+r" (a), [b] "+r" (b)
  120667. :
  120668. : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r12", "lr", "cc"
  120669. );
  120670. return (uint32_t)(size_t)a;
  120671. }
  120672. #else
  120673. /* Sub b from a into a. (a -= b)
  120674. *
  120675. * a A single precision integer and result.
  120676. * b A single precision integer.
  120677. */
  120678. static sp_digit sp_521_sub_in_place_17(sp_digit* a_p, const sp_digit* b_p)
  120679. {
  120680. register sp_digit* a asm ("r0") = (sp_digit*)a_p;
  120681. register const sp_digit* b asm ("r1") = (const sp_digit*)b_p;
  120682. __asm__ __volatile__ (
  120683. "ldm %[a], {r2, r3, r4, r5}\n\t"
  120684. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  120685. "subs r2, r2, r6\n\t"
  120686. "sbcs r3, r3, r7\n\t"
  120687. "sbcs r4, r4, r8\n\t"
  120688. "sbcs r5, r5, r9\n\t"
  120689. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  120690. "ldm %[a], {r2, r3, r4, r5}\n\t"
  120691. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  120692. "sbcs r2, r2, r6\n\t"
  120693. "sbcs r3, r3, r7\n\t"
  120694. "sbcs r4, r4, r8\n\t"
  120695. "sbcs r5, r5, r9\n\t"
  120696. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  120697. "ldm %[a], {r2, r3, r4, r5}\n\t"
  120698. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  120699. "sbcs r2, r2, r6\n\t"
  120700. "sbcs r3, r3, r7\n\t"
  120701. "sbcs r4, r4, r8\n\t"
  120702. "sbcs r5, r5, r9\n\t"
  120703. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  120704. "ldm %[a], {r2, r3, r4, r5}\n\t"
  120705. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  120706. "sbcs r2, r2, r6\n\t"
  120707. "sbcs r3, r3, r7\n\t"
  120708. "sbcs r4, r4, r8\n\t"
  120709. "sbcs r5, r5, r9\n\t"
  120710. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  120711. "ldm %[a], {r2}\n\t"
  120712. "ldm %[b]!, {r6}\n\t"
  120713. "sbcs r2, r2, r6\n\t"
  120714. "stm %[a]!, {r2}\n\t"
  120715. "sbc %[a], r9, r9\n\t"
  120716. : [a] "+r" (a), [b] "+r" (b)
  120717. :
  120718. : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "cc"
  120719. );
  120720. return (uint32_t)(size_t)a;
  120721. }
  120722. #endif /* WOLFSSL_SP_SMALL */
  120723. #ifdef WOLFSSL_SP_SMALL
  120724. /* Mul a by digit b into r. (r = a * b)
  120725. *
  120726. * r A single precision integer.
  120727. * a A single precision integer.
  120728. * b A single precision digit.
  120729. */
  120730. static void sp_521_mul_d_17(sp_digit* r_p, const sp_digit* a_p, sp_digit b_p)
  120731. {
  120732. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  120733. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  120734. register sp_digit b asm ("r2") = (sp_digit)b_p;
  120735. __asm__ __volatile__ (
  120736. /* A[0] * B */
  120737. "ldr r8, [%[a]]\n\t"
  120738. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  120739. "lsl r6, %[b], #16\n\t"
  120740. "lsl r5, r8, #16\n\t"
  120741. "lsr r6, r6, #16\n\t"
  120742. "lsr r5, r5, #16\n\t"
  120743. "mul r5, r6, r5\n\t"
  120744. "lsr r7, r8, #16\n\t"
  120745. "mul r6, r7, r6\n\t"
  120746. "lsr r3, r6, #16\n\t"
  120747. "lsl r6, r6, #16\n\t"
  120748. "adds r5, r5, r6\n\t"
  120749. "adc r3, r3, #0\n\t"
  120750. "lsr r6, %[b], #16\n\t"
  120751. "mul r7, r6, r7\n\t"
  120752. "add r3, r3, r7\n\t"
  120753. "lsl r7, r8, #16\n\t"
  120754. "lsr r7, r7, #16\n\t"
  120755. "mul r6, r7, r6\n\t"
  120756. "lsr r7, r6, #16\n\t"
  120757. "lsl r6, r6, #16\n\t"
  120758. "adds r5, r5, r6\n\t"
  120759. "adc r3, r3, r7\n\t"
  120760. #else
  120761. "umull r5, r3, %[b], r8\n\t"
  120762. #endif
  120763. "mov r4, #0\n\t"
  120764. "str r5, [%[r]]\n\t"
  120765. "mov r5, #0\n\t"
  120766. "mov r9, #4\n\t"
  120767. "\n"
  120768. "L_sp_521_mul_d_17_word_%=: \n\t"
  120769. /* A[i] * B */
  120770. "ldr r8, [%[a], r9]\n\t"
  120771. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  120772. "lsl r6, %[b], #16\n\t"
  120773. "lsl r7, r8, #16\n\t"
  120774. "lsr r6, r6, #16\n\t"
  120775. "lsr r7, r7, #16\n\t"
  120776. "mul r7, r6, r7\n\t"
  120777. "adds r3, r3, r7\n\t"
  120778. "adcs r4, r4, #0\n\t"
  120779. "adc r5, r5, #0\n\t"
  120780. "lsr r7, r8, #16\n\t"
  120781. "mul r6, r7, r6\n\t"
  120782. "lsr r7, r6, #16\n\t"
  120783. "lsl r6, r6, #16\n\t"
  120784. "adds r3, r3, r6\n\t"
  120785. "adcs r4, r4, r7\n\t"
  120786. "adc r5, r5, #0\n\t"
  120787. "lsr r6, %[b], #16\n\t"
  120788. "lsr r7, r8, #16\n\t"
  120789. "mul r7, r6, r7\n\t"
  120790. "adds r4, r4, r7\n\t"
  120791. "adc r5, r5, #0\n\t"
  120792. "lsl r7, r8, #16\n\t"
  120793. "lsr r7, r7, #16\n\t"
  120794. "mul r6, r7, r6\n\t"
  120795. "lsr r7, r6, #16\n\t"
  120796. "lsl r6, r6, #16\n\t"
  120797. "adds r3, r3, r6\n\t"
  120798. "adcs r4, r4, r7\n\t"
  120799. "adc r5, r5, #0\n\t"
  120800. #else
  120801. "umull r6, r7, %[b], r8\n\t"
  120802. "adds r3, r3, r6\n\t"
  120803. "adcs r4, r4, r7\n\t"
  120804. "adc r5, r5, #0\n\t"
  120805. #endif
  120806. "str r3, [%[r], r9]\n\t"
  120807. "mov r3, r4\n\t"
  120808. "mov r4, r5\n\t"
  120809. "mov r5, #0\n\t"
  120810. "add r9, r9, #4\n\t"
  120811. "cmp r9, #0x44\n\t"
  120812. "blt L_sp_521_mul_d_17_word_%=\n\t"
  120813. "str r3, [%[r], #68]\n\t"
  120814. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  120815. :
  120816. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "cc"
  120817. );
  120818. }
  120819. #else
  120820. /* Mul a by digit b into r. (r = a * b)
  120821. *
  120822. * r A single precision integer.
  120823. * a A single precision integer.
  120824. * b A single precision digit.
  120825. */
  120826. static void sp_521_mul_d_17(sp_digit* r_p, const sp_digit* a_p, sp_digit b_p)
  120827. {
  120828. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  120829. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  120830. register sp_digit b asm ("r2") = (sp_digit)b_p;
  120831. __asm__ __volatile__ (
  120832. /* A[0] * B */
  120833. "ldm %[a]!, {r8}\n\t"
  120834. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  120835. "lsl r6, %[b], #16\n\t"
  120836. "lsl r3, r8, #16\n\t"
  120837. "lsr r6, r6, #16\n\t"
  120838. "lsr r3, r3, #16\n\t"
  120839. "mul r3, r6, r3\n\t"
  120840. "lsr r7, r8, #16\n\t"
  120841. "mul r6, r7, r6\n\t"
  120842. "lsr r4, r6, #16\n\t"
  120843. "lsl r6, r6, #16\n\t"
  120844. "adds r3, r3, r6\n\t"
  120845. "adc r4, r4, #0\n\t"
  120846. "lsr r6, %[b], #16\n\t"
  120847. "mul r7, r6, r7\n\t"
  120848. "add r4, r4, r7\n\t"
  120849. "lsl r7, r8, #16\n\t"
  120850. "lsr r7, r7, #16\n\t"
  120851. "mul r6, r7, r6\n\t"
  120852. "lsr r7, r6, #16\n\t"
  120853. "lsl r6, r6, #16\n\t"
  120854. "adds r3, r3, r6\n\t"
  120855. "adc r4, r4, r7\n\t"
  120856. #else
  120857. "umull r3, r4, %[b], r8\n\t"
  120858. #endif
  120859. "stm %[r]!, {r3}\n\t"
  120860. "mov r5, #0\n\t"
  120861. /* A[1] * B */
  120862. "ldm %[a]!, {r8}\n\t"
  120863. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  120864. "lsl r6, %[b], #16\n\t"
  120865. "lsl r7, r8, #16\n\t"
  120866. "lsr r6, r6, #16\n\t"
  120867. "lsr r7, r7, #16\n\t"
  120868. "mul r7, r6, r7\n\t"
  120869. "adds r4, r4, r7\n\t"
  120870. "adc r5, r5, #0\n\t"
  120871. "lsr r7, r8, #16\n\t"
  120872. "mul r6, r7, r6\n\t"
  120873. "lsr r7, r6, #16\n\t"
  120874. "lsl r6, r6, #16\n\t"
  120875. "adds r4, r4, r6\n\t"
  120876. "adc r5, r5, r7\n\t"
  120877. "lsr r6, %[b], #16\n\t"
  120878. "lsr r7, r8, #16\n\t"
  120879. "mul r7, r6, r7\n\t"
  120880. "add r5, r5, r7\n\t"
  120881. "lsl r7, r8, #16\n\t"
  120882. "lsr r7, r7, #16\n\t"
  120883. "mul r6, r7, r6\n\t"
  120884. "lsr r7, r6, #16\n\t"
  120885. "lsl r6, r6, #16\n\t"
  120886. "adds r4, r4, r6\n\t"
  120887. "adc r5, r5, r7\n\t"
  120888. #else
  120889. "umlal r4, r5, %[b], r8\n\t"
  120890. #endif
  120891. "stm %[r]!, {r4}\n\t"
  120892. "mov r3, #0\n\t"
  120893. /* A[2] * B */
  120894. "ldm %[a]!, {r8}\n\t"
  120895. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  120896. "lsl r6, %[b], #16\n\t"
  120897. "lsl r7, r8, #16\n\t"
  120898. "lsr r6, r6, #16\n\t"
  120899. "lsr r7, r7, #16\n\t"
  120900. "mul r7, r6, r7\n\t"
  120901. "adds r5, r5, r7\n\t"
  120902. "adc r3, r3, #0\n\t"
  120903. "lsr r7, r8, #16\n\t"
  120904. "mul r6, r7, r6\n\t"
  120905. "lsr r7, r6, #16\n\t"
  120906. "lsl r6, r6, #16\n\t"
  120907. "adds r5, r5, r6\n\t"
  120908. "adc r3, r3, r7\n\t"
  120909. "lsr r6, %[b], #16\n\t"
  120910. "lsr r7, r8, #16\n\t"
  120911. "mul r7, r6, r7\n\t"
  120912. "add r3, r3, r7\n\t"
  120913. "lsl r7, r8, #16\n\t"
  120914. "lsr r7, r7, #16\n\t"
  120915. "mul r6, r7, r6\n\t"
  120916. "lsr r7, r6, #16\n\t"
  120917. "lsl r6, r6, #16\n\t"
  120918. "adds r5, r5, r6\n\t"
  120919. "adc r3, r3, r7\n\t"
  120920. #else
  120921. "umlal r5, r3, %[b], r8\n\t"
  120922. #endif
  120923. "stm %[r]!, {r5}\n\t"
  120924. "mov r4, #0\n\t"
  120925. /* A[3] * B */
  120926. "ldm %[a]!, {r8}\n\t"
  120927. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  120928. "lsl r6, %[b], #16\n\t"
  120929. "lsl r7, r8, #16\n\t"
  120930. "lsr r6, r6, #16\n\t"
  120931. "lsr r7, r7, #16\n\t"
  120932. "mul r7, r6, r7\n\t"
  120933. "adds r3, r3, r7\n\t"
  120934. "adc r4, r4, #0\n\t"
  120935. "lsr r7, r8, #16\n\t"
  120936. "mul r6, r7, r6\n\t"
  120937. "lsr r7, r6, #16\n\t"
  120938. "lsl r6, r6, #16\n\t"
  120939. "adds r3, r3, r6\n\t"
  120940. "adc r4, r4, r7\n\t"
  120941. "lsr r6, %[b], #16\n\t"
  120942. "lsr r7, r8, #16\n\t"
  120943. "mul r7, r6, r7\n\t"
  120944. "add r4, r4, r7\n\t"
  120945. "lsl r7, r8, #16\n\t"
  120946. "lsr r7, r7, #16\n\t"
  120947. "mul r6, r7, r6\n\t"
  120948. "lsr r7, r6, #16\n\t"
  120949. "lsl r6, r6, #16\n\t"
  120950. "adds r3, r3, r6\n\t"
  120951. "adc r4, r4, r7\n\t"
  120952. #else
  120953. "umlal r3, r4, %[b], r8\n\t"
  120954. #endif
  120955. "stm %[r]!, {r3}\n\t"
  120956. "mov r5, #0\n\t"
  120957. /* A[4] * B */
  120958. "ldm %[a]!, {r8}\n\t"
  120959. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  120960. "lsl r6, %[b], #16\n\t"
  120961. "lsl r7, r8, #16\n\t"
  120962. "lsr r6, r6, #16\n\t"
  120963. "lsr r7, r7, #16\n\t"
  120964. "mul r7, r6, r7\n\t"
  120965. "adds r4, r4, r7\n\t"
  120966. "adc r5, r5, #0\n\t"
  120967. "lsr r7, r8, #16\n\t"
  120968. "mul r6, r7, r6\n\t"
  120969. "lsr r7, r6, #16\n\t"
  120970. "lsl r6, r6, #16\n\t"
  120971. "adds r4, r4, r6\n\t"
  120972. "adc r5, r5, r7\n\t"
  120973. "lsr r6, %[b], #16\n\t"
  120974. "lsr r7, r8, #16\n\t"
  120975. "mul r7, r6, r7\n\t"
  120976. "add r5, r5, r7\n\t"
  120977. "lsl r7, r8, #16\n\t"
  120978. "lsr r7, r7, #16\n\t"
  120979. "mul r6, r7, r6\n\t"
  120980. "lsr r7, r6, #16\n\t"
  120981. "lsl r6, r6, #16\n\t"
  120982. "adds r4, r4, r6\n\t"
  120983. "adc r5, r5, r7\n\t"
  120984. #else
  120985. "umlal r4, r5, %[b], r8\n\t"
  120986. #endif
  120987. "stm %[r]!, {r4}\n\t"
  120988. "mov r3, #0\n\t"
  120989. /* A[5] * B */
  120990. "ldm %[a]!, {r8}\n\t"
  120991. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  120992. "lsl r6, %[b], #16\n\t"
  120993. "lsl r7, r8, #16\n\t"
  120994. "lsr r6, r6, #16\n\t"
  120995. "lsr r7, r7, #16\n\t"
  120996. "mul r7, r6, r7\n\t"
  120997. "adds r5, r5, r7\n\t"
  120998. "adc r3, r3, #0\n\t"
  120999. "lsr r7, r8, #16\n\t"
  121000. "mul r6, r7, r6\n\t"
  121001. "lsr r7, r6, #16\n\t"
  121002. "lsl r6, r6, #16\n\t"
  121003. "adds r5, r5, r6\n\t"
  121004. "adc r3, r3, r7\n\t"
  121005. "lsr r6, %[b], #16\n\t"
  121006. "lsr r7, r8, #16\n\t"
  121007. "mul r7, r6, r7\n\t"
  121008. "add r3, r3, r7\n\t"
  121009. "lsl r7, r8, #16\n\t"
  121010. "lsr r7, r7, #16\n\t"
  121011. "mul r6, r7, r6\n\t"
  121012. "lsr r7, r6, #16\n\t"
  121013. "lsl r6, r6, #16\n\t"
  121014. "adds r5, r5, r6\n\t"
  121015. "adc r3, r3, r7\n\t"
  121016. #else
  121017. "umlal r5, r3, %[b], r8\n\t"
  121018. #endif
  121019. "stm %[r]!, {r5}\n\t"
  121020. "mov r4, #0\n\t"
  121021. /* A[6] * B */
  121022. "ldm %[a]!, {r8}\n\t"
  121023. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  121024. "lsl r6, %[b], #16\n\t"
  121025. "lsl r7, r8, #16\n\t"
  121026. "lsr r6, r6, #16\n\t"
  121027. "lsr r7, r7, #16\n\t"
  121028. "mul r7, r6, r7\n\t"
  121029. "adds r3, r3, r7\n\t"
  121030. "adc r4, r4, #0\n\t"
  121031. "lsr r7, r8, #16\n\t"
  121032. "mul r6, r7, r6\n\t"
  121033. "lsr r7, r6, #16\n\t"
  121034. "lsl r6, r6, #16\n\t"
  121035. "adds r3, r3, r6\n\t"
  121036. "adc r4, r4, r7\n\t"
  121037. "lsr r6, %[b], #16\n\t"
  121038. "lsr r7, r8, #16\n\t"
  121039. "mul r7, r6, r7\n\t"
  121040. "add r4, r4, r7\n\t"
  121041. "lsl r7, r8, #16\n\t"
  121042. "lsr r7, r7, #16\n\t"
  121043. "mul r6, r7, r6\n\t"
  121044. "lsr r7, r6, #16\n\t"
  121045. "lsl r6, r6, #16\n\t"
  121046. "adds r3, r3, r6\n\t"
  121047. "adc r4, r4, r7\n\t"
  121048. #else
  121049. "umlal r3, r4, %[b], r8\n\t"
  121050. #endif
  121051. "stm %[r]!, {r3}\n\t"
  121052. "mov r5, #0\n\t"
  121053. /* A[7] * B */
  121054. "ldm %[a]!, {r8}\n\t"
  121055. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  121056. "lsl r6, %[b], #16\n\t"
  121057. "lsl r7, r8, #16\n\t"
  121058. "lsr r6, r6, #16\n\t"
  121059. "lsr r7, r7, #16\n\t"
  121060. "mul r7, r6, r7\n\t"
  121061. "adds r4, r4, r7\n\t"
  121062. "adc r5, r5, #0\n\t"
  121063. "lsr r7, r8, #16\n\t"
  121064. "mul r6, r7, r6\n\t"
  121065. "lsr r7, r6, #16\n\t"
  121066. "lsl r6, r6, #16\n\t"
  121067. "adds r4, r4, r6\n\t"
  121068. "adc r5, r5, r7\n\t"
  121069. "lsr r6, %[b], #16\n\t"
  121070. "lsr r7, r8, #16\n\t"
  121071. "mul r7, r6, r7\n\t"
  121072. "add r5, r5, r7\n\t"
  121073. "lsl r7, r8, #16\n\t"
  121074. "lsr r7, r7, #16\n\t"
  121075. "mul r6, r7, r6\n\t"
  121076. "lsr r7, r6, #16\n\t"
  121077. "lsl r6, r6, #16\n\t"
  121078. "adds r4, r4, r6\n\t"
  121079. "adc r5, r5, r7\n\t"
  121080. #else
  121081. "umlal r4, r5, %[b], r8\n\t"
  121082. #endif
  121083. "stm %[r]!, {r4}\n\t"
  121084. "mov r3, #0\n\t"
  121085. /* A[8] * B */
  121086. "ldm %[a]!, {r8}\n\t"
  121087. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  121088. "lsl r6, %[b], #16\n\t"
  121089. "lsl r7, r8, #16\n\t"
  121090. "lsr r6, r6, #16\n\t"
  121091. "lsr r7, r7, #16\n\t"
  121092. "mul r7, r6, r7\n\t"
  121093. "adds r5, r5, r7\n\t"
  121094. "adc r3, r3, #0\n\t"
  121095. "lsr r7, r8, #16\n\t"
  121096. "mul r6, r7, r6\n\t"
  121097. "lsr r7, r6, #16\n\t"
  121098. "lsl r6, r6, #16\n\t"
  121099. "adds r5, r5, r6\n\t"
  121100. "adc r3, r3, r7\n\t"
  121101. "lsr r6, %[b], #16\n\t"
  121102. "lsr r7, r8, #16\n\t"
  121103. "mul r7, r6, r7\n\t"
  121104. "add r3, r3, r7\n\t"
  121105. "lsl r7, r8, #16\n\t"
  121106. "lsr r7, r7, #16\n\t"
  121107. "mul r6, r7, r6\n\t"
  121108. "lsr r7, r6, #16\n\t"
  121109. "lsl r6, r6, #16\n\t"
  121110. "adds r5, r5, r6\n\t"
  121111. "adc r3, r3, r7\n\t"
  121112. #else
  121113. "umlal r5, r3, %[b], r8\n\t"
  121114. #endif
  121115. "stm %[r]!, {r5}\n\t"
  121116. "mov r4, #0\n\t"
  121117. /* A[9] * B */
  121118. "ldm %[a]!, {r8}\n\t"
  121119. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  121120. "lsl r6, %[b], #16\n\t"
  121121. "lsl r7, r8, #16\n\t"
  121122. "lsr r6, r6, #16\n\t"
  121123. "lsr r7, r7, #16\n\t"
  121124. "mul r7, r6, r7\n\t"
  121125. "adds r3, r3, r7\n\t"
  121126. "adc r4, r4, #0\n\t"
  121127. "lsr r7, r8, #16\n\t"
  121128. "mul r6, r7, r6\n\t"
  121129. "lsr r7, r6, #16\n\t"
  121130. "lsl r6, r6, #16\n\t"
  121131. "adds r3, r3, r6\n\t"
  121132. "adc r4, r4, r7\n\t"
  121133. "lsr r6, %[b], #16\n\t"
  121134. "lsr r7, r8, #16\n\t"
  121135. "mul r7, r6, r7\n\t"
  121136. "add r4, r4, r7\n\t"
  121137. "lsl r7, r8, #16\n\t"
  121138. "lsr r7, r7, #16\n\t"
  121139. "mul r6, r7, r6\n\t"
  121140. "lsr r7, r6, #16\n\t"
  121141. "lsl r6, r6, #16\n\t"
  121142. "adds r3, r3, r6\n\t"
  121143. "adc r4, r4, r7\n\t"
  121144. #else
  121145. "umlal r3, r4, %[b], r8\n\t"
  121146. #endif
  121147. "stm %[r]!, {r3}\n\t"
  121148. "mov r5, #0\n\t"
  121149. /* A[10] * B */
  121150. "ldm %[a]!, {r8}\n\t"
  121151. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  121152. "lsl r6, %[b], #16\n\t"
  121153. "lsl r7, r8, #16\n\t"
  121154. "lsr r6, r6, #16\n\t"
  121155. "lsr r7, r7, #16\n\t"
  121156. "mul r7, r6, r7\n\t"
  121157. "adds r4, r4, r7\n\t"
  121158. "adc r5, r5, #0\n\t"
  121159. "lsr r7, r8, #16\n\t"
  121160. "mul r6, r7, r6\n\t"
  121161. "lsr r7, r6, #16\n\t"
  121162. "lsl r6, r6, #16\n\t"
  121163. "adds r4, r4, r6\n\t"
  121164. "adc r5, r5, r7\n\t"
  121165. "lsr r6, %[b], #16\n\t"
  121166. "lsr r7, r8, #16\n\t"
  121167. "mul r7, r6, r7\n\t"
  121168. "add r5, r5, r7\n\t"
  121169. "lsl r7, r8, #16\n\t"
  121170. "lsr r7, r7, #16\n\t"
  121171. "mul r6, r7, r6\n\t"
  121172. "lsr r7, r6, #16\n\t"
  121173. "lsl r6, r6, #16\n\t"
  121174. "adds r4, r4, r6\n\t"
  121175. "adc r5, r5, r7\n\t"
  121176. #else
  121177. "umlal r4, r5, %[b], r8\n\t"
  121178. #endif
  121179. "stm %[r]!, {r4}\n\t"
  121180. "mov r3, #0\n\t"
  121181. /* A[11] * B */
  121182. "ldm %[a]!, {r8}\n\t"
  121183. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  121184. "lsl r6, %[b], #16\n\t"
  121185. "lsl r7, r8, #16\n\t"
  121186. "lsr r6, r6, #16\n\t"
  121187. "lsr r7, r7, #16\n\t"
  121188. "mul r7, r6, r7\n\t"
  121189. "adds r5, r5, r7\n\t"
  121190. "adc r3, r3, #0\n\t"
  121191. "lsr r7, r8, #16\n\t"
  121192. "mul r6, r7, r6\n\t"
  121193. "lsr r7, r6, #16\n\t"
  121194. "lsl r6, r6, #16\n\t"
  121195. "adds r5, r5, r6\n\t"
  121196. "adc r3, r3, r7\n\t"
  121197. "lsr r6, %[b], #16\n\t"
  121198. "lsr r7, r8, #16\n\t"
  121199. "mul r7, r6, r7\n\t"
  121200. "add r3, r3, r7\n\t"
  121201. "lsl r7, r8, #16\n\t"
  121202. "lsr r7, r7, #16\n\t"
  121203. "mul r6, r7, r6\n\t"
  121204. "lsr r7, r6, #16\n\t"
  121205. "lsl r6, r6, #16\n\t"
  121206. "adds r5, r5, r6\n\t"
  121207. "adc r3, r3, r7\n\t"
  121208. #else
  121209. "umlal r5, r3, %[b], r8\n\t"
  121210. #endif
  121211. "stm %[r]!, {r5}\n\t"
  121212. "mov r4, #0\n\t"
  121213. /* A[12] * B */
  121214. "ldm %[a]!, {r8}\n\t"
  121215. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  121216. "lsl r6, %[b], #16\n\t"
  121217. "lsl r7, r8, #16\n\t"
  121218. "lsr r6, r6, #16\n\t"
  121219. "lsr r7, r7, #16\n\t"
  121220. "mul r7, r6, r7\n\t"
  121221. "adds r3, r3, r7\n\t"
  121222. "adc r4, r4, #0\n\t"
  121223. "lsr r7, r8, #16\n\t"
  121224. "mul r6, r7, r6\n\t"
  121225. "lsr r7, r6, #16\n\t"
  121226. "lsl r6, r6, #16\n\t"
  121227. "adds r3, r3, r6\n\t"
  121228. "adc r4, r4, r7\n\t"
  121229. "lsr r6, %[b], #16\n\t"
  121230. "lsr r7, r8, #16\n\t"
  121231. "mul r7, r6, r7\n\t"
  121232. "add r4, r4, r7\n\t"
  121233. "lsl r7, r8, #16\n\t"
  121234. "lsr r7, r7, #16\n\t"
  121235. "mul r6, r7, r6\n\t"
  121236. "lsr r7, r6, #16\n\t"
  121237. "lsl r6, r6, #16\n\t"
  121238. "adds r3, r3, r6\n\t"
  121239. "adc r4, r4, r7\n\t"
  121240. #else
  121241. "umlal r3, r4, %[b], r8\n\t"
  121242. #endif
  121243. "stm %[r]!, {r3}\n\t"
  121244. "mov r5, #0\n\t"
  121245. /* A[13] * B */
  121246. "ldm %[a]!, {r8}\n\t"
  121247. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  121248. "lsl r6, %[b], #16\n\t"
  121249. "lsl r7, r8, #16\n\t"
  121250. "lsr r6, r6, #16\n\t"
  121251. "lsr r7, r7, #16\n\t"
  121252. "mul r7, r6, r7\n\t"
  121253. "adds r4, r4, r7\n\t"
  121254. "adc r5, r5, #0\n\t"
  121255. "lsr r7, r8, #16\n\t"
  121256. "mul r6, r7, r6\n\t"
  121257. "lsr r7, r6, #16\n\t"
  121258. "lsl r6, r6, #16\n\t"
  121259. "adds r4, r4, r6\n\t"
  121260. "adc r5, r5, r7\n\t"
  121261. "lsr r6, %[b], #16\n\t"
  121262. "lsr r7, r8, #16\n\t"
  121263. "mul r7, r6, r7\n\t"
  121264. "add r5, r5, r7\n\t"
  121265. "lsl r7, r8, #16\n\t"
  121266. "lsr r7, r7, #16\n\t"
  121267. "mul r6, r7, r6\n\t"
  121268. "lsr r7, r6, #16\n\t"
  121269. "lsl r6, r6, #16\n\t"
  121270. "adds r4, r4, r6\n\t"
  121271. "adc r5, r5, r7\n\t"
  121272. #else
  121273. "umlal r4, r5, %[b], r8\n\t"
  121274. #endif
  121275. "stm %[r]!, {r4}\n\t"
  121276. "mov r3, #0\n\t"
  121277. /* A[14] * B */
  121278. "ldm %[a]!, {r8}\n\t"
  121279. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  121280. "lsl r6, %[b], #16\n\t"
  121281. "lsl r7, r8, #16\n\t"
  121282. "lsr r6, r6, #16\n\t"
  121283. "lsr r7, r7, #16\n\t"
  121284. "mul r7, r6, r7\n\t"
  121285. "adds r5, r5, r7\n\t"
  121286. "adc r3, r3, #0\n\t"
  121287. "lsr r7, r8, #16\n\t"
  121288. "mul r6, r7, r6\n\t"
  121289. "lsr r7, r6, #16\n\t"
  121290. "lsl r6, r6, #16\n\t"
  121291. "adds r5, r5, r6\n\t"
  121292. "adc r3, r3, r7\n\t"
  121293. "lsr r6, %[b], #16\n\t"
  121294. "lsr r7, r8, #16\n\t"
  121295. "mul r7, r6, r7\n\t"
  121296. "add r3, r3, r7\n\t"
  121297. "lsl r7, r8, #16\n\t"
  121298. "lsr r7, r7, #16\n\t"
  121299. "mul r6, r7, r6\n\t"
  121300. "lsr r7, r6, #16\n\t"
  121301. "lsl r6, r6, #16\n\t"
  121302. "adds r5, r5, r6\n\t"
  121303. "adc r3, r3, r7\n\t"
  121304. #else
  121305. "umlal r5, r3, %[b], r8\n\t"
  121306. #endif
  121307. "stm %[r]!, {r5}\n\t"
  121308. "mov r4, #0\n\t"
  121309. /* A[15] * B */
  121310. "ldm %[a]!, {r8}\n\t"
  121311. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  121312. "lsl r6, %[b], #16\n\t"
  121313. "lsl r7, r8, #16\n\t"
  121314. "lsr r6, r6, #16\n\t"
  121315. "lsr r7, r7, #16\n\t"
  121316. "mul r7, r6, r7\n\t"
  121317. "adds r3, r3, r7\n\t"
  121318. "adc r4, r4, #0\n\t"
  121319. "lsr r7, r8, #16\n\t"
  121320. "mul r6, r7, r6\n\t"
  121321. "lsr r7, r6, #16\n\t"
  121322. "lsl r6, r6, #16\n\t"
  121323. "adds r3, r3, r6\n\t"
  121324. "adc r4, r4, r7\n\t"
  121325. "lsr r6, %[b], #16\n\t"
  121326. "lsr r7, r8, #16\n\t"
  121327. "mul r7, r6, r7\n\t"
  121328. "add r4, r4, r7\n\t"
  121329. "lsl r7, r8, #16\n\t"
  121330. "lsr r7, r7, #16\n\t"
  121331. "mul r6, r7, r6\n\t"
  121332. "lsr r7, r6, #16\n\t"
  121333. "lsl r6, r6, #16\n\t"
  121334. "adds r3, r3, r6\n\t"
  121335. "adc r4, r4, r7\n\t"
  121336. #else
  121337. "umlal r3, r4, %[b], r8\n\t"
  121338. #endif
  121339. "stm %[r]!, {r3}\n\t"
  121340. "mov r5, #0\n\t"
  121341. /* A[16] * B */
  121342. "ldm %[a]!, {r8}\n\t"
  121343. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  121344. "lsl r6, %[b], #16\n\t"
  121345. "lsl r7, r8, #16\n\t"
  121346. "lsr r6, r6, #16\n\t"
  121347. "lsr r7, r7, #16\n\t"
  121348. "mul r7, r6, r7\n\t"
  121349. "adds r4, r4, r7\n\t"
  121350. "adc r5, r5, #0\n\t"
  121351. "lsr r7, r8, #16\n\t"
  121352. "mul r6, r7, r6\n\t"
  121353. "lsr r7, r6, #16\n\t"
  121354. "lsl r6, r6, #16\n\t"
  121355. "adds r4, r4, r6\n\t"
  121356. "adc r5, r5, r7\n\t"
  121357. "lsr r6, %[b], #16\n\t"
  121358. "lsr r7, r8, #16\n\t"
  121359. "mul r7, r6, r7\n\t"
  121360. "add r5, r5, r7\n\t"
  121361. "lsl r7, r8, #16\n\t"
  121362. "lsr r7, r7, #16\n\t"
  121363. "mul r6, r7, r6\n\t"
  121364. "lsr r7, r6, #16\n\t"
  121365. "lsl r6, r6, #16\n\t"
  121366. "adds r4, r4, r6\n\t"
  121367. "adc r5, r5, r7\n\t"
  121368. #else
  121369. "umlal r4, r5, %[b], r8\n\t"
  121370. #endif
  121371. "stm %[r]!, {r4}\n\t"
  121372. "str r5, [%[r]]\n\t"
  121373. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  121374. :
  121375. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "cc"
  121376. );
  121377. }
  121378. #endif /* WOLFSSL_SP_SMALL */
  121379. #ifdef WOLFSSL_SP_USE_UDIV
  121380. /* Divide the double width number (d1|d0) by the divisor. (d1|d0 / div)
  121381. *
  121382. * d1 The high order half of the number to divide.
  121383. * d0 The low order half of the number to divide.
  121384. * div The divisor.
  121385. * returns the result of the division.
  121386. *
  121387. * Note that this is an approximate div. It may give an answer 1 larger.
  121388. */
  121389. static sp_digit div_521_word_17(sp_digit d1_p, sp_digit d0_p, sp_digit div_p)
  121390. {
  121391. register sp_digit d1 asm ("r0") = (sp_digit)d1_p;
  121392. register sp_digit d0 asm ("r1") = (sp_digit)d0_p;
  121393. register sp_digit div asm ("r2") = (sp_digit)div_p;
  121394. __asm__ __volatile__ (
  121395. "lsr r6, %[div], #16\n\t"
  121396. "add lr, r6, #1\n\t"
  121397. "udiv r4, %[d1], lr\n\t"
  121398. "lsl r5, %[div], #16\n\t"
  121399. "lsl r4, r4, #16\n\t"
  121400. "umull r3, r12, %[div], r4\n\t"
  121401. "subs %[d0], %[d0], r3\n\t"
  121402. "sbc %[d1], %[d1], r12\n\t"
  121403. "subs r3, %[d1], lr\n\t"
  121404. "sbc r7, r7, r7\n\t"
  121405. "add r7, r7, #1\n\t"
  121406. "rsb r8, r7, #0\n\t"
  121407. "lsl r7, r7, #16\n\t"
  121408. "and r5, r5, r8\n\t"
  121409. "and r6, r6, r8\n\t"
  121410. "subs %[d0], %[d0], r5\n\t"
  121411. "add r4, r4, r7\n\t"
  121412. "sbc %[d1], %[d1], r6\n\t"
  121413. "lsl r12, %[d1], #16\n\t"
  121414. "lsr r3, %[d0], #16\n\t"
  121415. "orr r3, r3, r12\n\t"
  121416. "udiv r3, r3, lr\n\t"
  121417. "add r4, r4, r3\n\t"
  121418. "umull r3, r12, %[div], r3\n\t"
  121419. "subs %[d0], %[d0], r3\n\t"
  121420. "sbc %[d1], %[d1], r12\n\t"
  121421. "lsl r12, %[d1], #16\n\t"
  121422. "lsr r3, %[d0], #16\n\t"
  121423. "orr r3, r3, r12\n\t"
  121424. "udiv r3, r3, lr\n\t"
  121425. "add r4, r4, r3\n\t"
  121426. "mul r3, %[div], r3\n\t"
  121427. "sub %[d0], %[d0], r3\n\t"
  121428. "udiv r3, %[d0], %[div]\n\t"
  121429. "add %[d1], r4, r3\n\t"
  121430. : [d1] "+r" (d1), [d0] "+r" (d0), [div] "+r" (div)
  121431. :
  121432. : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8", "cc"
  121433. );
  121434. return (uint32_t)(size_t)d1;
  121435. }
  121436. #else
  121437. /* Divide the double width number (d1|d0) by the divisor. (d1|d0 / div)
  121438. *
  121439. * d1 The high order half of the number to divide.
  121440. * d0 The low order half of the number to divide.
  121441. * div The divisor.
  121442. * returns the result of the division.
  121443. *
  121444. * Note that this is an approximate div. It may give an answer 1 larger.
  121445. */
  121446. static sp_digit div_521_word_17(sp_digit d1_p, sp_digit d0_p, sp_digit div_p)
  121447. {
  121448. register sp_digit d1 asm ("r0") = (sp_digit)d1_p;
  121449. register sp_digit d0 asm ("r1") = (sp_digit)d0_p;
  121450. register sp_digit div asm ("r2") = (sp_digit)div_p;
  121451. __asm__ __volatile__ (
  121452. "lsr lr, %[div], #1\n\t"
  121453. "add lr, lr, #1\n\t"
  121454. "mov r4, %[d0]\n\t"
  121455. "mov r5, %[d1]\n\t"
  121456. /* Do top 32 */
  121457. "subs r6, lr, r5\n\t"
  121458. "sbc r6, r6, r6\n\t"
  121459. "mov r3, #0\n\t"
  121460. "sub r3, r3, r6\n\t"
  121461. "and r6, r6, lr\n\t"
  121462. "subs r5, r5, r6\n\t"
  121463. /* Next 30 bits */
  121464. "mov r12, #29\n\t"
  121465. "\n"
  121466. "L_div_521_word_17_bit_%=: \n\t"
  121467. "lsls r4, r4, #1\n\t"
  121468. "adc r5, r5, r5\n\t"
  121469. "subs r6, lr, r5\n\t"
  121470. "sbc r6, r6, r6\n\t"
  121471. "add r3, r3, r3\n\t"
  121472. "sub r3, r3, r6\n\t"
  121473. "and r6, r6, lr\n\t"
  121474. "subs r5, r5, r6\n\t"
  121475. "subs r12, r12, #1\n\t"
  121476. "bpl L_div_521_word_17_bit_%=\n\t"
  121477. "add r3, r3, r3\n\t"
  121478. "add r3, r3, #1\n\t"
  121479. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  121480. "lsl r7, r3, #16\n\t"
  121481. "lsl r4, %[div], #16\n\t"
  121482. "lsr r7, r7, #16\n\t"
  121483. "lsr r4, r4, #16\n\t"
  121484. "mul r4, r7, r4\n\t"
  121485. "lsr r8, %[div], #16\n\t"
  121486. "mul r7, r8, r7\n\t"
  121487. "lsr r5, r7, #16\n\t"
  121488. "lsl r7, r7, #16\n\t"
  121489. "adds r4, r4, r7\n\t"
  121490. "adc r5, r5, #0\n\t"
  121491. "lsr r7, r3, #16\n\t"
  121492. "mul r8, r7, r8\n\t"
  121493. "add r5, r5, r8\n\t"
  121494. "lsl r8, %[div], #16\n\t"
  121495. "lsr r8, r8, #16\n\t"
  121496. "mul r7, r8, r7\n\t"
  121497. "lsr r8, r7, #16\n\t"
  121498. "lsl r7, r7, #16\n\t"
  121499. "adds r4, r4, r7\n\t"
  121500. "adc r5, r5, r8\n\t"
  121501. #else
  121502. "umull r4, r5, r3, %[div]\n\t"
  121503. #endif
  121504. "subs r7, %[d0], r4\n\t"
  121505. "sbc r8, %[d1], r5\n\t"
  121506. "add r3, r3, r8\n\t"
  121507. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  121508. "lsl r7, r3, #16\n\t"
  121509. "lsl r4, %[div], #16\n\t"
  121510. "lsr r7, r7, #16\n\t"
  121511. "lsr r4, r4, #16\n\t"
  121512. "mul r4, r7, r4\n\t"
  121513. "lsr r8, %[div], #16\n\t"
  121514. "mul r7, r8, r7\n\t"
  121515. "lsr r5, r7, #16\n\t"
  121516. "lsl r7, r7, #16\n\t"
  121517. "adds r4, r4, r7\n\t"
  121518. "adc r5, r5, #0\n\t"
  121519. "lsr r7, r3, #16\n\t"
  121520. "mul r8, r7, r8\n\t"
  121521. "add r5, r5, r8\n\t"
  121522. "lsl r8, %[div], #16\n\t"
  121523. "lsr r8, r8, #16\n\t"
  121524. "mul r7, r8, r7\n\t"
  121525. "lsr r8, r7, #16\n\t"
  121526. "lsl r7, r7, #16\n\t"
  121527. "adds r4, r4, r7\n\t"
  121528. "adc r5, r5, r8\n\t"
  121529. #else
  121530. "umull r4, r5, r3, %[div]\n\t"
  121531. #endif
  121532. "subs r7, %[d0], r4\n\t"
  121533. "sbc r8, %[d1], r5\n\t"
  121534. "add r3, r3, r8\n\t"
  121535. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  121536. "lsl r7, r3, #16\n\t"
  121537. "lsl r4, %[div], #16\n\t"
  121538. "lsr r7, r7, #16\n\t"
  121539. "lsr r4, r4, #16\n\t"
  121540. "mul r4, r7, r4\n\t"
  121541. "lsr r8, %[div], #16\n\t"
  121542. "mul r7, r8, r7\n\t"
  121543. "lsr r5, r7, #16\n\t"
  121544. "lsl r7, r7, #16\n\t"
  121545. "adds r4, r4, r7\n\t"
  121546. "adc r5, r5, #0\n\t"
  121547. "lsr r7, r3, #16\n\t"
  121548. "mul r8, r7, r8\n\t"
  121549. "add r5, r5, r8\n\t"
  121550. "lsl r8, %[div], #16\n\t"
  121551. "lsr r8, r8, #16\n\t"
  121552. "mul r7, r8, r7\n\t"
  121553. "lsr r8, r7, #16\n\t"
  121554. "lsl r7, r7, #16\n\t"
  121555. "adds r4, r4, r7\n\t"
  121556. "adc r5, r5, r8\n\t"
  121557. #else
  121558. "umull r4, r5, r3, %[div]\n\t"
  121559. #endif
  121560. "subs r7, %[d0], r4\n\t"
  121561. "sbc r8, %[d1], r5\n\t"
  121562. "add r3, r3, r8\n\t"
  121563. "subs r6, %[div], r7\n\t"
  121564. "sbc r6, r6, r6\n\t"
  121565. "sub %[d1], r3, r6\n\t"
  121566. : [d1] "+r" (d1), [d0] "+r" (d0), [div] "+r" (div)
  121567. :
  121568. : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8", "cc"
  121569. );
  121570. return (uint32_t)(size_t)d1;
  121571. }
  121572. #endif
  121573. /* AND m into each word of a and store in r.
  121574. *
  121575. * r A single precision integer.
  121576. * a A single precision integer.
  121577. * m Mask to AND against each digit.
  121578. */
  121579. static void sp_521_mask_17(sp_digit* r, const sp_digit* a, sp_digit m)
  121580. {
  121581. #ifdef WOLFSSL_SP_SMALL
  121582. int i;
  121583. for (i=0; i<17; i++) {
  121584. r[i] = a[i] & m;
  121585. }
  121586. #else
  121587. int i;
  121588. for (i = 0; i < 16; i += 8) {
  121589. r[i+0] = a[i+0] & m;
  121590. r[i+1] = a[i+1] & m;
  121591. r[i+2] = a[i+2] & m;
  121592. r[i+3] = a[i+3] & m;
  121593. r[i+4] = a[i+4] & m;
  121594. r[i+5] = a[i+5] & m;
  121595. r[i+6] = a[i+6] & m;
  121596. r[i+7] = a[i+7] & m;
  121597. }
  121598. r[16] = a[16] & m;
  121599. #endif
  121600. }
  121601. /* Divide d in a and put remainder into r (m*d + r = a)
  121602. * m is not calculated as it is not needed at this time.
  121603. *
  121604. * a Number to be divided.
  121605. * d Number to divide with.
  121606. * m Multiplier result.
  121607. * r Remainder from the division.
  121608. * returns MP_OKAY indicating success.
  121609. */
  121610. static WC_INLINE int sp_521_div_17(const sp_digit* a, const sp_digit* d,
  121611. sp_digit* m, sp_digit* r)
  121612. {
  121613. sp_digit t1[35];
  121614. sp_digit t2[18];
  121615. sp_digit sd[18];
  121616. sp_digit div;
  121617. sp_digit r1;
  121618. int i;
  121619. ASSERT_SAVED_VECTOR_REGISTERS();
  121620. (void)m;
  121621. div = (d[16] << 23) | (d[15] >> 9);
  121622. XMEMCPY(t1, a, sizeof(*t1) * 2 * 17);
  121623. r1 = sp_521_cmp_17(&t1[17], d) >= 0;
  121624. sp_521_cond_sub_17(&t1[17], &t1[17], d, (sp_digit)0 - r1);
  121625. sp_521_lshift_17(sd, d, 23);
  121626. sp_521_lshift_34(t1, t1, 23);
  121627. for (i = 16; i >= 0; i--) {
  121628. sp_digit hi = t1[17 + i] - (t1[17 + i] == div);
  121629. r1 = div_521_word_17(hi, t1[17 + i - 1], div);
  121630. sp_521_mul_d_17(t2, sd, r1);
  121631. t1[17 + i] += sp_521_sub_in_place_17(&t1[i], t2);
  121632. t1[17 + i] -= t2[17];
  121633. sp_521_mask_17(t2, sd, t1[17 + i]);
  121634. t1[17 + i] += sp_521_add_17(&t1[i], &t1[i], t2);
  121635. sp_521_mask_17(t2, sd, t1[17 + i]);
  121636. t1[17 + i] += sp_521_add_17(&t1[i], &t1[i], t2);
  121637. }
  121638. r1 = sp_521_cmp_17(t1, sd) >= 0;
  121639. sp_521_cond_sub_17(r, t1, sd, (sp_digit)0 - r1);
  121640. sp_521_rshift_17(r, r, 23);
  121641. return MP_OKAY;
  121642. }
  121643. /* Reduce a modulo m into r. (r = a mod m)
  121644. *
  121645. * r A single precision number that is the reduced result.
  121646. * a A single precision number that is to be reduced.
  121647. * m A single precision number that is the modulus to reduce with.
  121648. * returns MP_OKAY indicating success.
  121649. */
  121650. static WC_INLINE int sp_521_mod_17(sp_digit* r, const sp_digit* a,
  121651. const sp_digit* m)
  121652. {
  121653. return sp_521_div_17(a, m, NULL, r);
  121654. }
  121655. #endif
  121656. #if defined(HAVE_ECC_SIGN) || defined(HAVE_ECC_VERIFY)
  121657. /* Multiply two number mod the order of P521 curve. (r = a * b mod order)
  121658. *
  121659. * r Result of the multiplication.
  121660. * a First operand of the multiplication.
  121661. * b Second operand of the multiplication.
  121662. */
  121663. static void sp_521_mont_mul_order_17(sp_digit* r, const sp_digit* a, const sp_digit* b)
  121664. {
  121665. sp_521_mul_17(r, a, b);
  121666. sp_521_mont_reduce_order_17(r, p521_order, p521_mp_order);
  121667. }
  121668. #if defined(HAVE_ECC_SIGN) || (defined(HAVE_ECC_VERIFY) && defined(WOLFSSL_SP_SMALL))
  121669. #ifdef WOLFSSL_SP_SMALL
  121670. /* Order-2 for the P521 curve. */
  121671. static const uint32_t p521_order_minus_2[17] = {
  121672. 0x91386407U,0xbb6fb71eU,0x899c47aeU,0x3bb5c9b8U,0xf709a5d0U,0x7fcc0148U,
  121673. 0xbf2f966bU,0x51868783U,0xfffffffaU,0xffffffffU,0xffffffffU,0xffffffffU,
  121674. 0xffffffffU,0xffffffffU,0xffffffffU,0xffffffffU,0x000001ffU
  121675. };
  121676. #else
  121677. /* The low half of the order-2 of the P521 curve. */
  121678. static const uint32_t p521_order_low[9] = {
  121679. 0x91386407U,0xbb6fb71eU,0x899c47aeU,0x3bb5c9b8U,0xf709a5d0U,0x7fcc0148U,
  121680. 0xbf2f966bU,0x51868783U,0xfffffffaU
  121681. };
  121682. #endif /* WOLFSSL_SP_SMALL */
  121683. /* Square number mod the order of P521 curve. (r = a * a mod order)
  121684. *
  121685. * r Result of the squaring.
  121686. * a Number to square.
  121687. */
  121688. static void sp_521_mont_sqr_order_17(sp_digit* r, const sp_digit* a)
  121689. {
  121690. sp_521_sqr_17(r, a);
  121691. sp_521_mont_reduce_order_17(r, p521_order, p521_mp_order);
  121692. }
  121693. #ifndef WOLFSSL_SP_SMALL
  121694. /* Square number mod the order of P521 curve a number of times.
  121695. * (r = a ^ n mod order)
  121696. *
  121697. * r Result of the squaring.
  121698. * a Number to square.
  121699. */
  121700. static void sp_521_mont_sqr_n_order_17(sp_digit* r, const sp_digit* a, int n)
  121701. {
  121702. int i;
  121703. sp_521_mont_sqr_order_17(r, a);
  121704. for (i=1; i<n; i++) {
  121705. sp_521_mont_sqr_order_17(r, r);
  121706. }
  121707. }
  121708. #endif /* !WOLFSSL_SP_SMALL */
  121709. /* Invert the number, in Montgomery form, modulo the order of the P521 curve.
  121710. * (r = 1 / a mod order)
  121711. *
  121712. * r Inverse result.
  121713. * a Number to invert.
  121714. * td Temporary data.
  121715. */
  121716. #ifdef WOLFSSL_SP_NONBLOCK
  121717. typedef struct sp_521_mont_inv_order_17_ctx {
  121718. int state;
  121719. int i;
  121720. } sp_521_mont_inv_order_17_ctx;
  121721. static int sp_521_mont_inv_order_17_nb(sp_ecc_ctx_t* sp_ctx, sp_digit* r, const sp_digit* a,
  121722. sp_digit* t)
  121723. {
  121724. int err = FP_WOULDBLOCK;
  121725. sp_521_mont_inv_order_17_ctx* ctx = (sp_521_mont_inv_order_17_ctx*)sp_ctx;
  121726. typedef char ctx_size_test[sizeof(sp_521_mont_inv_order_17_ctx) >= sizeof(*sp_ctx) ? -1 : 1];
  121727. (void)sizeof(ctx_size_test);
  121728. switch (ctx->state) {
  121729. case 0:
  121730. XMEMCPY(t, a, sizeof(sp_digit) * 17);
  121731. ctx->i = 519;
  121732. ctx->state = 1;
  121733. break;
  121734. case 1:
  121735. sp_521_mont_sqr_order_17(t, t);
  121736. ctx->state = 2;
  121737. break;
  121738. case 2:
  121739. if ((p521_order_minus_2[ctx->i / 32] & ((sp_int_digit)1 << (ctx->i % 32))) != 0) {
  121740. sp_521_mont_mul_order_17(t, t, a);
  121741. }
  121742. ctx->i--;
  121743. ctx->state = (ctx->i == 0) ? 3 : 1;
  121744. break;
  121745. case 3:
  121746. XMEMCPY(r, t, sizeof(sp_digit) * 17U);
  121747. err = MP_OKAY;
  121748. break;
  121749. }
  121750. return err;
  121751. }
  121752. #endif /* WOLFSSL_SP_NONBLOCK */
  121753. static void sp_521_mont_inv_order_17(sp_digit* r, const sp_digit* a,
  121754. sp_digit* td)
  121755. {
  121756. #ifdef WOLFSSL_SP_SMALL
  121757. sp_digit* t = td;
  121758. int i;
  121759. XMEMCPY(t, a, sizeof(sp_digit) * 17);
  121760. for (i=519; i>=0; i--) {
  121761. sp_521_mont_sqr_order_17(t, t);
  121762. if ((p521_order_minus_2[i / 32] & ((sp_int_digit)1 << (i % 32))) != 0) {
  121763. sp_521_mont_mul_order_17(t, t, a);
  121764. }
  121765. }
  121766. XMEMCPY(r, t, sizeof(sp_digit) * 17U);
  121767. #else
  121768. sp_digit* t = td;
  121769. sp_digit* t2 = td + 2 * 17;
  121770. sp_digit* t3 = td + 4 * 17;
  121771. int i;
  121772. /* t = a^2 */
  121773. sp_521_mont_sqr_order_17(t, a);
  121774. /* t = a^3 = t * a */
  121775. sp_521_mont_mul_order_17(t, t, a);
  121776. /* t= a^c = t ^ 2 ^ 2 */
  121777. sp_521_mont_sqr_n_order_17(t2, t, 2);
  121778. /* t = a^f = t2 * t */
  121779. sp_521_mont_mul_order_17(t, t2, t);
  121780. /* t3 = a^1e */
  121781. sp_521_mont_sqr_order_17(t3, t);
  121782. /* t3 = a^1f = t3 * a */
  121783. sp_521_mont_mul_order_17(t3, t3, a);
  121784. /* t2= a^f0 = t ^ 2 ^ 4 */
  121785. sp_521_mont_sqr_n_order_17(t2, t, 4);
  121786. /* t = a^ff = t2 * t */
  121787. sp_521_mont_mul_order_17(t, t2, t);
  121788. /* t2= a^ff00 = t ^ 2 ^ 8 */
  121789. sp_521_mont_sqr_n_order_17(t2, t, 8);
  121790. /* t3= a^ffff = t2 * t */
  121791. sp_521_mont_mul_order_17(t, t2, t);
  121792. /* t2= a^ffff0000 = t ^ 2 ^ 16 */
  121793. sp_521_mont_sqr_n_order_17(t2, t, 16);
  121794. /* t = a^ffffffff = t2 * t */
  121795. sp_521_mont_mul_order_17(t, t2, t);
  121796. /* t2= a^ffffffff00000000 = t ^ 2 ^ 32 */
  121797. sp_521_mont_sqr_n_order_17(t2, t, 32);
  121798. /* t = a^ffffffffffffffff = t2 * t */
  121799. sp_521_mont_mul_order_17(t, t2, t);
  121800. /* t2= a^ffffffffffffffff0000000000000000 = t ^ 2 ^ 64 */
  121801. sp_521_mont_sqr_n_order_17(t2, t, 64);
  121802. /* t = a^ffffffffffffffffffffffffffffffff = t2 * t */
  121803. sp_521_mont_mul_order_17(t, t2, t);
  121804. /* t2= a^ffffffffffffffffffffffffffffffff00000000000000000000000000000000 = t ^ 2 ^ 128 */
  121805. sp_521_mont_sqr_n_order_17(t2, t, 128);
  121806. /* t = a^ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff = t2 * t */
  121807. sp_521_mont_mul_order_17(t, t2, t);
  121808. /* t2 = a^1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0 */
  121809. sp_521_mont_sqr_n_order_17(t2, t, 5);
  121810. /* t2 = a^1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff = t * t3 */
  121811. sp_521_mont_mul_order_17(t2, t2, t3);
  121812. for (i=259; i>=1; i--) {
  121813. sp_521_mont_sqr_order_17(t2, t2);
  121814. if ((p521_order_low[i / 32] & ((sp_int_digit)1 << (i % 32))) != 0) {
  121815. sp_521_mont_mul_order_17(t2, t2, a);
  121816. }
  121817. }
  121818. sp_521_mont_sqr_order_17(t2, t2);
  121819. sp_521_mont_mul_order_17(r, t2, a);
  121820. #endif /* WOLFSSL_SP_SMALL */
  121821. }
  121822. #endif /* HAVE_ECC_SIGN || (HAVE_ECC_VERIFY && WOLFSSL_SP_SMALL) */
  121823. #endif /* HAVE_ECC_SIGN | HAVE_ECC_VERIFY */
  121824. #ifdef HAVE_ECC_SIGN
  121825. #ifndef SP_ECC_MAX_SIG_GEN
  121826. #define SP_ECC_MAX_SIG_GEN 64
  121827. #endif
  121828. /* Calculate second signature value S from R, k and private value.
  121829. *
  121830. * s = (r * x + e) / k
  121831. *
  121832. * s Signature value.
  121833. * r First signature value.
  121834. * k Ephemeral private key.
  121835. * x Private key as a number.
  121836. * e Hash of message as a number.
  121837. * tmp Temporary storage for intermediate numbers.
  121838. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  121839. */
  121840. static int sp_521_calc_s_17(sp_digit* s, const sp_digit* r, sp_digit* k,
  121841. sp_digit* x, const sp_digit* e, sp_digit* tmp)
  121842. {
  121843. int err;
  121844. sp_digit carry;
  121845. sp_int32 c;
  121846. sp_digit* kInv = k;
  121847. /* Conv k to Montgomery form (mod order) */
  121848. sp_521_mul_17(k, k, p521_norm_order);
  121849. err = sp_521_mod_17(k, k, p521_order);
  121850. if (err == MP_OKAY) {
  121851. sp_521_norm_17(k);
  121852. /* kInv = 1/k mod order */
  121853. sp_521_mont_inv_order_17(kInv, k, tmp);
  121854. sp_521_norm_17(kInv);
  121855. /* s = r * x + e */
  121856. sp_521_mul_17(x, x, r);
  121857. err = sp_521_mod_17(x, x, p521_order);
  121858. }
  121859. if (err == MP_OKAY) {
  121860. sp_521_norm_17(x);
  121861. carry = sp_521_add_17(s, e, x);
  121862. sp_521_cond_sub_17(s, s, p521_order, 0 - carry);
  121863. sp_521_norm_17(s);
  121864. c = sp_521_cmp_17(s, p521_order);
  121865. sp_521_cond_sub_17(s, s, p521_order,
  121866. (sp_digit)0 - (sp_digit)(c >= 0));
  121867. sp_521_norm_17(s);
  121868. /* s = s * k^-1 mod order */
  121869. sp_521_mont_mul_order_17(s, s, kInv);
  121870. sp_521_norm_17(s);
  121871. }
  121872. return err;
  121873. }
  121874. /* Sign the hash using the private key.
  121875. * e = [hash, 521 bits] from binary
  121876. * r = (k.G)->x mod order
  121877. * s = (r * x + e) / k mod order
  121878. * The hash is truncated to the first 521 bits.
  121879. *
  121880. * hash Hash to sign.
  121881. * hashLen Length of the hash data.
  121882. * rng Random number generator.
  121883. * priv Private part of key - scalar.
  121884. * rm First part of result as an mp_int.
  121885. * sm Sirst part of result as an mp_int.
  121886. * heap Heap to use for allocation.
  121887. * returns RNG failures, MEMORY_E when memory allocation fails and
  121888. * MP_OKAY on success.
  121889. */
  121890. int sp_ecc_sign_521(const byte* hash, word32 hashLen, WC_RNG* rng,
  121891. const mp_int* priv, mp_int* rm, mp_int* sm, mp_int* km, void* heap)
  121892. {
  121893. #ifdef WOLFSSL_SP_SMALL_STACK
  121894. sp_digit* e = NULL;
  121895. sp_point_521* point = NULL;
  121896. #else
  121897. sp_digit e[7 * 2 * 17];
  121898. sp_point_521 point[1];
  121899. #endif
  121900. sp_digit* x = NULL;
  121901. sp_digit* k = NULL;
  121902. sp_digit* r = NULL;
  121903. sp_digit* tmp = NULL;
  121904. sp_digit* s = NULL;
  121905. sp_int32 c;
  121906. int err = MP_OKAY;
  121907. int i;
  121908. (void)heap;
  121909. #ifdef WOLFSSL_SP_SMALL_STACK
  121910. if (err == MP_OKAY) {
  121911. point = (sp_point_521*)XMALLOC(sizeof(sp_point_521), heap,
  121912. DYNAMIC_TYPE_ECC);
  121913. if (point == NULL)
  121914. err = MEMORY_E;
  121915. }
  121916. if (err == MP_OKAY) {
  121917. e = (sp_digit*)XMALLOC(sizeof(sp_digit) * 7 * 2 * 17, heap,
  121918. DYNAMIC_TYPE_ECC);
  121919. if (e == NULL)
  121920. err = MEMORY_E;
  121921. }
  121922. #endif
  121923. if (err == MP_OKAY) {
  121924. x = e + 2 * 17;
  121925. k = e + 4 * 17;
  121926. r = e + 6 * 17;
  121927. tmp = e + 8 * 17;
  121928. s = e;
  121929. if (hashLen > 66U) {
  121930. hashLen = 66U;
  121931. }
  121932. }
  121933. for (i = SP_ECC_MAX_SIG_GEN; err == MP_OKAY && i > 0; i--) {
  121934. /* New random point. */
  121935. if (km == NULL || mp_iszero(km)) {
  121936. err = sp_521_ecc_gen_k_17(rng, k);
  121937. }
  121938. else {
  121939. sp_521_from_mp(k, 17, km);
  121940. mp_zero(km);
  121941. }
  121942. if (err == MP_OKAY) {
  121943. err = sp_521_ecc_mulmod_base_17(point, k, 1, 1, heap);
  121944. }
  121945. if (err == MP_OKAY) {
  121946. /* r = point->x mod order */
  121947. XMEMCPY(r, point->x, sizeof(sp_digit) * 17U);
  121948. sp_521_norm_17(r);
  121949. c = sp_521_cmp_17(r, p521_order);
  121950. sp_521_cond_sub_17(r, r, p521_order,
  121951. (sp_digit)0 - (sp_digit)(c >= 0));
  121952. sp_521_norm_17(r);
  121953. if (!sp_521_iszero_17(r)) {
  121954. /* x is modified in calculation of s. */
  121955. sp_521_from_mp(x, 17, priv);
  121956. /* s ptr == e ptr, e is modified in calculation of s. */
  121957. sp_521_from_bin(e, 17, hash, (int)hashLen);
  121958. /* Take 521 leftmost bits of hash. */
  121959. if (hashLen == 66U) {
  121960. sp_521_rshift_17(e, e, 7);
  121961. }
  121962. err = sp_521_calc_s_17(s, r, k, x, e, tmp);
  121963. /* Check that signature is usable. */
  121964. if ((err == MP_OKAY) && (!sp_521_iszero_17(s))) {
  121965. break;
  121966. }
  121967. }
  121968. }
  121969. #ifdef WOLFSSL_ECDSA_SET_K_ONE_LOOP
  121970. i = 1;
  121971. #endif
  121972. }
  121973. if (i == 0) {
  121974. err = RNG_FAILURE_E;
  121975. }
  121976. if (err == MP_OKAY) {
  121977. err = sp_521_to_mp(r, rm);
  121978. }
  121979. if (err == MP_OKAY) {
  121980. err = sp_521_to_mp(s, sm);
  121981. }
  121982. #ifdef WOLFSSL_SP_SMALL_STACK
  121983. if (e != NULL)
  121984. #endif
  121985. {
  121986. ForceZero(e, sizeof(sp_digit) * 7 * 2 * 17);
  121987. #ifdef WOLFSSL_SP_SMALL_STACK
  121988. XFREE(e, heap, DYNAMIC_TYPE_ECC);
  121989. #endif
  121990. }
  121991. #ifdef WOLFSSL_SP_SMALL_STACK
  121992. if (point != NULL)
  121993. #endif
  121994. {
  121995. ForceZero(point, sizeof(sp_point_521));
  121996. #ifdef WOLFSSL_SP_SMALL_STACK
  121997. XFREE(point, heap, DYNAMIC_TYPE_ECC);
  121998. #endif
  121999. }
  122000. return err;
  122001. }
  122002. #ifdef WOLFSSL_SP_NONBLOCK
  122003. typedef struct sp_ecc_sign_521_ctx {
  122004. int state;
  122005. union {
  122006. sp_521_ecc_mulmod_17_ctx mulmod_ctx;
  122007. sp_521_mont_inv_order_17_ctx mont_inv_order_ctx;
  122008. };
  122009. sp_digit e[2*17];
  122010. sp_digit x[2*17];
  122011. sp_digit k[2*17];
  122012. sp_digit r[2*17];
  122013. sp_digit tmp[3 * 2*17];
  122014. sp_point_521 point;
  122015. sp_digit* s;
  122016. sp_digit* kInv;
  122017. int i;
  122018. } sp_ecc_sign_521_ctx;
  122019. int sp_ecc_sign_521_nb(sp_ecc_ctx_t* sp_ctx, const byte* hash, word32 hashLen, WC_RNG* rng,
  122020. mp_int* priv, mp_int* rm, mp_int* sm, mp_int* km, void* heap)
  122021. {
  122022. int err = FP_WOULDBLOCK;
  122023. sp_ecc_sign_521_ctx* ctx = (sp_ecc_sign_521_ctx*)sp_ctx->data;
  122024. typedef char ctx_size_test[sizeof(sp_ecc_sign_521_ctx) >= sizeof(*sp_ctx) ? -1 : 1];
  122025. (void)sizeof(ctx_size_test);
  122026. switch (ctx->state) {
  122027. case 0: /* INIT */
  122028. ctx->s = ctx->e;
  122029. ctx->kInv = ctx->k;
  122030. ctx->i = SP_ECC_MAX_SIG_GEN;
  122031. ctx->state = 1;
  122032. break;
  122033. case 1: /* GEN */
  122034. /* New random point. */
  122035. if (km == NULL || mp_iszero(km)) {
  122036. err = sp_521_ecc_gen_k_17(rng, ctx->k);
  122037. }
  122038. else {
  122039. sp_521_from_mp(ctx->k, 17, km);
  122040. mp_zero(km);
  122041. }
  122042. XMEMSET(&ctx->mulmod_ctx, 0, sizeof(ctx->mulmod_ctx));
  122043. ctx->state = 2;
  122044. break;
  122045. case 2: /* MULMOD */
  122046. err = sp_521_ecc_mulmod_17_nb((sp_ecc_ctx_t*)&ctx->mulmod_ctx,
  122047. &ctx->point, &p521_base, ctx->k, 1, 1, heap);
  122048. if (err == MP_OKAY) {
  122049. ctx->state = 3;
  122050. }
  122051. break;
  122052. case 3: /* MODORDER */
  122053. {
  122054. sp_int32 c;
  122055. /* r = point->x mod order */
  122056. XMEMCPY(ctx->r, ctx->point.x, sizeof(sp_digit) * 17U);
  122057. sp_521_norm_17(ctx->r);
  122058. c = sp_521_cmp_17(ctx->r, p521_order);
  122059. sp_521_cond_sub_17(ctx->r, ctx->r, p521_order,
  122060. (sp_digit)0 - (sp_digit)(c >= 0));
  122061. sp_521_norm_17(ctx->r);
  122062. if (hashLen > 66U) {
  122063. hashLen = 66U;
  122064. }
  122065. sp_521_from_mp(ctx->x, 17, priv);
  122066. sp_521_from_bin(ctx->e, 17, hash, (int)hashLen);
  122067. if (hashLen == 66U) {
  122068. sp_521_rshift_17(ctx->e, ctx->e, 7);
  122069. }
  122070. ctx->state = 4;
  122071. break;
  122072. }
  122073. case 4: /* KMODORDER */
  122074. /* Conv k to Montgomery form (mod order) */
  122075. sp_521_mul_17(ctx->k, ctx->k, p521_norm_order);
  122076. err = sp_521_mod_17(ctx->k, ctx->k, p521_order);
  122077. if (err == MP_OKAY) {
  122078. sp_521_norm_17(ctx->k);
  122079. XMEMSET(&ctx->mont_inv_order_ctx, 0, sizeof(ctx->mont_inv_order_ctx));
  122080. ctx->state = 5;
  122081. }
  122082. break;
  122083. case 5: /* KINV */
  122084. /* kInv = 1/k mod order */
  122085. err = sp_521_mont_inv_order_17_nb((sp_ecc_ctx_t*)&ctx->mont_inv_order_ctx, ctx->kInv, ctx->k, ctx->tmp);
  122086. if (err == MP_OKAY) {
  122087. XMEMSET(&ctx->mont_inv_order_ctx, 0, sizeof(ctx->mont_inv_order_ctx));
  122088. ctx->state = 6;
  122089. }
  122090. break;
  122091. case 6: /* KINVNORM */
  122092. sp_521_norm_17(ctx->kInv);
  122093. ctx->state = 7;
  122094. break;
  122095. case 7: /* R */
  122096. /* s = r * x + e */
  122097. sp_521_mul_17(ctx->x, ctx->x, ctx->r);
  122098. ctx->state = 8;
  122099. break;
  122100. case 8: /* S1 */
  122101. err = sp_521_mod_17(ctx->x, ctx->x, p521_order);
  122102. if (err == MP_OKAY)
  122103. ctx->state = 9;
  122104. break;
  122105. case 9: /* S2 */
  122106. {
  122107. sp_digit carry;
  122108. sp_int32 c;
  122109. sp_521_norm_17(ctx->x);
  122110. carry = sp_521_add_17(ctx->s, ctx->e, ctx->x);
  122111. sp_521_cond_sub_17(ctx->s, ctx->s,
  122112. p521_order, 0 - carry);
  122113. sp_521_norm_17(ctx->s);
  122114. c = sp_521_cmp_17(ctx->s, p521_order);
  122115. sp_521_cond_sub_17(ctx->s, ctx->s, p521_order,
  122116. (sp_digit)0 - (sp_digit)(c >= 0));
  122117. sp_521_norm_17(ctx->s);
  122118. /* s = s * k^-1 mod order */
  122119. sp_521_mont_mul_order_17(ctx->s, ctx->s, ctx->kInv);
  122120. sp_521_norm_17(ctx->s);
  122121. /* Check that signature is usable. */
  122122. if (sp_521_iszero_17(ctx->s) == 0) {
  122123. ctx->state = 10;
  122124. break;
  122125. }
  122126. #ifdef WOLFSSL_ECDSA_SET_K_ONE_LOOP
  122127. ctx->i = 1;
  122128. #endif
  122129. /* not usable gen, try again */
  122130. ctx->i--;
  122131. if (ctx->i == 0) {
  122132. err = RNG_FAILURE_E;
  122133. }
  122134. ctx->state = 1;
  122135. break;
  122136. }
  122137. case 10: /* RES */
  122138. err = sp_521_to_mp(ctx->r, rm);
  122139. if (err == MP_OKAY) {
  122140. err = sp_521_to_mp(ctx->s, sm);
  122141. }
  122142. break;
  122143. }
  122144. if (err == MP_OKAY && ctx->state != 10) {
  122145. err = FP_WOULDBLOCK;
  122146. }
  122147. if (err != FP_WOULDBLOCK) {
  122148. XMEMSET(ctx->e, 0, sizeof(sp_digit) * 2U * 17U);
  122149. XMEMSET(ctx->x, 0, sizeof(sp_digit) * 2U * 17U);
  122150. XMEMSET(ctx->k, 0, sizeof(sp_digit) * 2U * 17U);
  122151. XMEMSET(ctx->r, 0, sizeof(sp_digit) * 2U * 17U);
  122152. XMEMSET(ctx->tmp, 0, sizeof(sp_digit) * 3U * 2U * 17U);
  122153. }
  122154. return err;
  122155. }
  122156. #endif /* WOLFSSL_SP_NONBLOCK */
  122157. #endif /* HAVE_ECC_SIGN */
  122158. #ifndef WOLFSSL_SP_SMALL
  122159. #ifdef WOLFSSL_SP_SMALL
  122160. /* Sub b from a into r. (r = a - b)
  122161. *
  122162. * r A single precision integer.
  122163. * a A single precision integer.
  122164. * b A single precision integer.
  122165. */
  122166. static sp_digit sp_521_sub_17(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p)
  122167. {
  122168. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  122169. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  122170. register const sp_digit* b asm ("r2") = (const sp_digit*)b_p;
  122171. __asm__ __volatile__ (
  122172. "mov r12, #0\n\t"
  122173. "add lr, %[a], #0x40\n\t"
  122174. "\n"
  122175. "L_sp_521_sub_17_word_%=: \n\t"
  122176. "rsbs r12, r12, #0\n\t"
  122177. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  122178. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  122179. "sbcs r3, r3, r7\n\t"
  122180. "sbcs r4, r4, r8\n\t"
  122181. "sbcs r5, r5, r9\n\t"
  122182. "sbcs r6, r6, r10\n\t"
  122183. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  122184. "sbc r12, r3, r3\n\t"
  122185. "cmp %[a], lr\n\t"
  122186. "bne L_sp_521_sub_17_word_%=\n\t"
  122187. "rsbs r12, r12, #0\n\t"
  122188. "ldm %[a]!, {r3}\n\t"
  122189. "ldm %[b]!, {r7}\n\t"
  122190. "sbcs r3, r3, r7\n\t"
  122191. "stm %[r]!, {r3}\n\t"
  122192. "sbc %[r], r6, r6\n\t"
  122193. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  122194. :
  122195. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r12", "lr", "cc"
  122196. );
  122197. return (uint32_t)(size_t)r;
  122198. }
  122199. #else
  122200. /* Sub b from a into r. (r = a - b)
  122201. *
  122202. * r A single precision integer.
  122203. * a A single precision integer.
  122204. * b A single precision integer.
  122205. */
  122206. static sp_digit sp_521_sub_17(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p)
  122207. {
  122208. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  122209. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  122210. register const sp_digit* b asm ("r2") = (const sp_digit*)b_p;
  122211. __asm__ __volatile__ (
  122212. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  122213. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  122214. "subs r3, r3, r7\n\t"
  122215. "sbcs r4, r4, r8\n\t"
  122216. "sbcs r5, r5, r9\n\t"
  122217. "sbcs r6, r6, r10\n\t"
  122218. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  122219. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  122220. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  122221. "sbcs r3, r3, r7\n\t"
  122222. "sbcs r4, r4, r8\n\t"
  122223. "sbcs r5, r5, r9\n\t"
  122224. "sbcs r6, r6, r10\n\t"
  122225. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  122226. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  122227. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  122228. "sbcs r3, r3, r7\n\t"
  122229. "sbcs r4, r4, r8\n\t"
  122230. "sbcs r5, r5, r9\n\t"
  122231. "sbcs r6, r6, r10\n\t"
  122232. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  122233. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  122234. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  122235. "sbcs r3, r3, r7\n\t"
  122236. "sbcs r4, r4, r8\n\t"
  122237. "sbcs r5, r5, r9\n\t"
  122238. "sbcs r6, r6, r10\n\t"
  122239. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  122240. "ldm %[a]!, {r3}\n\t"
  122241. "ldm %[b]!, {r7}\n\t"
  122242. "sbcs r3, r3, r7\n\t"
  122243. "stm %[r]!, {r3}\n\t"
  122244. "sbc %[r], r6, r6\n\t"
  122245. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  122246. :
  122247. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "cc"
  122248. );
  122249. return (uint32_t)(size_t)r;
  122250. }
  122251. #endif /* WOLFSSL_SP_SMALL */
  122252. /* Divide the number by 2 mod the modulus. (r = a / 2 % m)
  122253. *
  122254. * r Result of division by 2.
  122255. * a Number to divide.
  122256. * m Modulus.
  122257. */
  122258. static void sp_521_div2_mod_17(sp_digit* r_p, const sp_digit* a_p, const sp_digit* m_p)
  122259. {
  122260. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  122261. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  122262. register const sp_digit* m asm ("r2") = (const sp_digit*)m_p;
  122263. __asm__ __volatile__ (
  122264. "ldm %[a]!, {r4}\n\t"
  122265. "ands r3, r4, #1\n\t"
  122266. "beq L_sp_521_div2_mod_17_even_%=\n\t"
  122267. "mov r12, #0\n\t"
  122268. "ldm %[a]!, {r5, r6, r7}\n\t"
  122269. "ldm %[m]!, {r8, r9, r10, r11}\n\t"
  122270. "adds r4, r4, r8\n\t"
  122271. "adcs r5, r5, r9\n\t"
  122272. "adcs r6, r6, r10\n\t"
  122273. "adcs r7, r7, r11\n\t"
  122274. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  122275. "ldm %[a]!, {r4, r5, r6, r7}\n\t"
  122276. "ldm %[m]!, {r8, r9, r10, r11}\n\t"
  122277. "adcs r4, r4, r8\n\t"
  122278. "adcs r5, r5, r9\n\t"
  122279. "adcs r6, r6, r10\n\t"
  122280. "adcs r7, r7, r11\n\t"
  122281. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  122282. "ldm %[a]!, {r4, r5, r6, r7}\n\t"
  122283. "ldm %[m]!, {r8, r9, r10, r11}\n\t"
  122284. "adcs r4, r4, r8\n\t"
  122285. "adcs r5, r5, r9\n\t"
  122286. "adcs r6, r6, r10\n\t"
  122287. "adcs r7, r7, r11\n\t"
  122288. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  122289. "ldm %[a]!, {r4, r5, r6, r7}\n\t"
  122290. "ldm %[m]!, {r8, r9, r10, r11}\n\t"
  122291. "adcs r4, r4, r8\n\t"
  122292. "adcs r5, r5, r9\n\t"
  122293. "adcs r6, r6, r10\n\t"
  122294. "adcs r7, r7, r11\n\t"
  122295. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  122296. "ldm %[a]!, {r4}\n\t"
  122297. "ldm %[m]!, {r8}\n\t"
  122298. "adcs r4, r4, r8\n\t"
  122299. "stm %[r]!, {r4}\n\t"
  122300. "adc r3, r12, r12\n\t"
  122301. "b L_sp_521_div2_mod_17_div2_%=\n\t"
  122302. "\n"
  122303. "L_sp_521_div2_mod_17_even_%=: \n\t"
  122304. "ldm %[a]!, {r5, r6, r7}\n\t"
  122305. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  122306. "ldm %[a]!, {r4, r5, r6, r7}\n\t"
  122307. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  122308. "ldm %[a]!, {r4, r5, r6, r7}\n\t"
  122309. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  122310. "ldm %[a]!, {r4, r5, r6, r7}\n\t"
  122311. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  122312. "ldm %[a]!, {r4}\n\t"
  122313. "stm %[r]!, {r4}\n\t"
  122314. "\n"
  122315. "L_sp_521_div2_mod_17_div2_%=: \n\t"
  122316. "sub %[r], %[r], #0x44\n\t"
  122317. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  122318. "ldr r8, [%[r]]\n\t"
  122319. "ldr r9, [%[r], #4]\n\t"
  122320. #else
  122321. "ldrd r8, r9, [%[r]]\n\t"
  122322. #endif
  122323. "lsr r8, r8, #1\n\t"
  122324. "orr r8, r8, r9, lsl #31\n\t"
  122325. "lsr r9, r9, #1\n\t"
  122326. "ldr r10, [%[r], #8]\n\t"
  122327. "str r8, [%[r]]\n\t"
  122328. "orr r9, r9, r10, lsl #31\n\t"
  122329. "lsr r10, r10, #1\n\t"
  122330. "ldr r8, [%[r], #12]\n\t"
  122331. "str r9, [%[r], #4]\n\t"
  122332. "orr r10, r10, r8, lsl #31\n\t"
  122333. "lsr r8, r8, #1\n\t"
  122334. "ldr r9, [%[r], #16]\n\t"
  122335. "str r10, [%[r], #8]\n\t"
  122336. "orr r8, r8, r9, lsl #31\n\t"
  122337. "lsr r9, r9, #1\n\t"
  122338. "ldr r10, [%[r], #20]\n\t"
  122339. "str r8, [%[r], #12]\n\t"
  122340. "orr r9, r9, r10, lsl #31\n\t"
  122341. "lsr r10, r10, #1\n\t"
  122342. "ldr r8, [%[r], #24]\n\t"
  122343. "str r9, [%[r], #16]\n\t"
  122344. "orr r10, r10, r8, lsl #31\n\t"
  122345. "lsr r8, r8, #1\n\t"
  122346. "ldr r9, [%[r], #28]\n\t"
  122347. "str r10, [%[r], #20]\n\t"
  122348. "orr r8, r8, r9, lsl #31\n\t"
  122349. "lsr r9, r9, #1\n\t"
  122350. "ldr r10, [%[r], #32]\n\t"
  122351. "str r8, [%[r], #24]\n\t"
  122352. "orr r9, r9, r10, lsl #31\n\t"
  122353. "lsr r10, r10, #1\n\t"
  122354. "ldr r8, [%[r], #36]\n\t"
  122355. "str r9, [%[r], #28]\n\t"
  122356. "orr r10, r10, r8, lsl #31\n\t"
  122357. "lsr r8, r8, #1\n\t"
  122358. "ldr r9, [%[r], #40]\n\t"
  122359. "str r10, [%[r], #32]\n\t"
  122360. "orr r8, r8, r9, lsl #31\n\t"
  122361. "lsr r9, r9, #1\n\t"
  122362. "ldr r10, [%[r], #44]\n\t"
  122363. "str r8, [%[r], #36]\n\t"
  122364. "orr r9, r9, r10, lsl #31\n\t"
  122365. "lsr r10, r10, #1\n\t"
  122366. "ldr r8, [%[r], #48]\n\t"
  122367. "str r9, [%[r], #40]\n\t"
  122368. "orr r10, r10, r8, lsl #31\n\t"
  122369. "lsr r8, r8, #1\n\t"
  122370. "ldr r9, [%[r], #52]\n\t"
  122371. "str r10, [%[r], #44]\n\t"
  122372. "orr r8, r8, r9, lsl #31\n\t"
  122373. "lsr r9, r9, #1\n\t"
  122374. "ldr r10, [%[r], #56]\n\t"
  122375. "str r8, [%[r], #48]\n\t"
  122376. "orr r9, r9, r10, lsl #31\n\t"
  122377. "lsr r10, r10, #1\n\t"
  122378. "ldr r8, [%[r], #60]\n\t"
  122379. "str r9, [%[r], #52]\n\t"
  122380. "orr r10, r10, r8, lsl #31\n\t"
  122381. "lsr r8, r8, #1\n\t"
  122382. "ldr r9, [%[r], #64]\n\t"
  122383. "str r10, [%[r], #56]\n\t"
  122384. "orr r8, r8, r9, lsl #31\n\t"
  122385. "lsr r9, r9, #1\n\t"
  122386. "orr r9, r9, r3, lsl #31\n\t"
  122387. "str r8, [%[r], #60]\n\t"
  122388. "str r9, [%[r], #64]\n\t"
  122389. : [r] "+r" (r), [a] "+r" (a), [m] "+r" (m)
  122390. :
  122391. : "memory", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r3", "r12", "cc"
  122392. );
  122393. }
  122394. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  122395. static const unsigned char L_sp_521_num_bits_17_table[] = {
  122396. 0x00, 0x01, 0x02, 0x02, 0x03, 0x03, 0x03, 0x03,
  122397. 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04,
  122398. 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05,
  122399. 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05,
  122400. 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
  122401. 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
  122402. 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
  122403. 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
  122404. 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07,
  122405. 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07,
  122406. 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07,
  122407. 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07,
  122408. 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07,
  122409. 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07,
  122410. 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07,
  122411. 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07,
  122412. 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
  122413. 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
  122414. 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
  122415. 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
  122416. 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
  122417. 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
  122418. 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
  122419. 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
  122420. 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
  122421. 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
  122422. 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
  122423. 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
  122424. 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
  122425. 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
  122426. 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
  122427. 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
  122428. };
  122429. static int sp_521_num_bits_17(const sp_digit* a_p)
  122430. {
  122431. register const sp_digit* a asm ("r0") = (const sp_digit*)a_p;
  122432. register unsigned char* L_sp_521_num_bits_17_table_c asm ("r1") = (unsigned char*)&L_sp_521_num_bits_17_table;
  122433. __asm__ __volatile__ (
  122434. "mov lr, %[L_sp_521_num_bits_17_table]\n\t"
  122435. "ldr r1, [%[a], #64]\n\t"
  122436. "cmp r1, #0\n\t"
  122437. "beq L_sp_521_num_bits_17_16_%=\n\t"
  122438. "lsr r3, r1, #24\n\t"
  122439. "cmp r3, #0\n\t"
  122440. "beq L_sp_521_num_bits_17_16_3_%=\n\t"
  122441. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  122442. "mov r2, #0x2\n\t"
  122443. "lsl r2, r2, #8\n\t"
  122444. "add r2, r2, #0x18\n\t"
  122445. #else
  122446. "mov r2, #0x218\n\t"
  122447. #endif
  122448. "ldrb r12, [lr, r3]\n\t"
  122449. "add r12, r2, r12\n\t"
  122450. "b L_sp_521_num_bits_17_18_%=\n\t"
  122451. "\n"
  122452. "L_sp_521_num_bits_17_16_3_%=: \n\t"
  122453. "lsr r3, r1, #16\n\t"
  122454. "and r3, r3, #0xff\n\t"
  122455. "cmp r3, #0\n\t"
  122456. "beq L_sp_521_num_bits_17_16_2_%=\n\t"
  122457. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  122458. "mov r2, #0x2\n\t"
  122459. "lsl r2, r2, #8\n\t"
  122460. "add r2, r2, #0x10\n\t"
  122461. #else
  122462. "mov r2, #0x210\n\t"
  122463. #endif
  122464. "ldrb r12, [lr, r3]\n\t"
  122465. "add r12, r2, r12\n\t"
  122466. "b L_sp_521_num_bits_17_18_%=\n\t"
  122467. "\n"
  122468. "L_sp_521_num_bits_17_16_2_%=: \n\t"
  122469. "lsr r3, r1, #8\n\t"
  122470. "and r3, r3, #0xff\n\t"
  122471. "cmp r3, #0\n\t"
  122472. "beq L_sp_521_num_bits_17_16_1_%=\n\t"
  122473. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  122474. "mov r2, #0x2\n\t"
  122475. "lsl r2, r2, #8\n\t"
  122476. "add r2, r2, #0x8\n\t"
  122477. #else
  122478. "mov r2, #0x208\n\t"
  122479. #endif
  122480. "ldrb r12, [lr, r3]\n\t"
  122481. "add r12, r2, r12\n\t"
  122482. "b L_sp_521_num_bits_17_18_%=\n\t"
  122483. "\n"
  122484. "L_sp_521_num_bits_17_16_1_%=: \n\t"
  122485. "and r3, r1, #0xff\n\t"
  122486. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  122487. "mov r2, #0x2\n\t"
  122488. "lsl r2, r2, #8\n\t"
  122489. "add r2, r2, #0x0\n\t"
  122490. #else
  122491. "mov r2, #0x200\n\t"
  122492. #endif
  122493. "ldrb r12, [lr, r3]\n\t"
  122494. "add r12, r2, r12\n\t"
  122495. "b L_sp_521_num_bits_17_18_%=\n\t"
  122496. "\n"
  122497. "L_sp_521_num_bits_17_16_%=: \n\t"
  122498. "ldr r1, [%[a], #60]\n\t"
  122499. "cmp r1, #0\n\t"
  122500. "beq L_sp_521_num_bits_17_15_%=\n\t"
  122501. "lsr r3, r1, #24\n\t"
  122502. "cmp r3, #0\n\t"
  122503. "beq L_sp_521_num_bits_17_15_3_%=\n\t"
  122504. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  122505. "mov r2, #0x1\n\t"
  122506. "lsl r2, r2, #8\n\t"
  122507. "add r2, r2, #0xf8\n\t"
  122508. #else
  122509. "mov r2, #0x1f8\n\t"
  122510. #endif
  122511. "ldrb r12, [lr, r3]\n\t"
  122512. "add r12, r2, r12\n\t"
  122513. "b L_sp_521_num_bits_17_18_%=\n\t"
  122514. "\n"
  122515. "L_sp_521_num_bits_17_15_3_%=: \n\t"
  122516. "lsr r3, r1, #16\n\t"
  122517. "and r3, r3, #0xff\n\t"
  122518. "cmp r3, #0\n\t"
  122519. "beq L_sp_521_num_bits_17_15_2_%=\n\t"
  122520. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  122521. "mov r2, #0x1\n\t"
  122522. "lsl r2, r2, #8\n\t"
  122523. "add r2, r2, #0xf0\n\t"
  122524. #else
  122525. "mov r2, #0x1f0\n\t"
  122526. #endif
  122527. "ldrb r12, [lr, r3]\n\t"
  122528. "add r12, r2, r12\n\t"
  122529. "b L_sp_521_num_bits_17_18_%=\n\t"
  122530. "\n"
  122531. "L_sp_521_num_bits_17_15_2_%=: \n\t"
  122532. "lsr r3, r1, #8\n\t"
  122533. "and r3, r3, #0xff\n\t"
  122534. "cmp r3, #0\n\t"
  122535. "beq L_sp_521_num_bits_17_15_1_%=\n\t"
  122536. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  122537. "mov r2, #0x1\n\t"
  122538. "lsl r2, r2, #8\n\t"
  122539. "add r2, r2, #0xe8\n\t"
  122540. #else
  122541. "mov r2, #0x1e8\n\t"
  122542. #endif
  122543. "ldrb r12, [lr, r3]\n\t"
  122544. "add r12, r2, r12\n\t"
  122545. "b L_sp_521_num_bits_17_18_%=\n\t"
  122546. "\n"
  122547. "L_sp_521_num_bits_17_15_1_%=: \n\t"
  122548. "and r3, r1, #0xff\n\t"
  122549. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  122550. "mov r2, #0x1\n\t"
  122551. "lsl r2, r2, #8\n\t"
  122552. "add r2, r2, #0xe0\n\t"
  122553. #else
  122554. "mov r2, #0x1e0\n\t"
  122555. #endif
  122556. "ldrb r12, [lr, r3]\n\t"
  122557. "add r12, r2, r12\n\t"
  122558. "b L_sp_521_num_bits_17_18_%=\n\t"
  122559. "\n"
  122560. "L_sp_521_num_bits_17_15_%=: \n\t"
  122561. "ldr r1, [%[a], #56]\n\t"
  122562. "cmp r1, #0\n\t"
  122563. "beq L_sp_521_num_bits_17_14_%=\n\t"
  122564. "lsr r3, r1, #24\n\t"
  122565. "cmp r3, #0\n\t"
  122566. "beq L_sp_521_num_bits_17_14_3_%=\n\t"
  122567. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  122568. "mov r2, #0x1\n\t"
  122569. "lsl r2, r2, #8\n\t"
  122570. "add r2, r2, #0xd8\n\t"
  122571. #else
  122572. "mov r2, #0x1d8\n\t"
  122573. #endif
  122574. "ldrb r12, [lr, r3]\n\t"
  122575. "add r12, r2, r12\n\t"
  122576. "b L_sp_521_num_bits_17_18_%=\n\t"
  122577. "\n"
  122578. "L_sp_521_num_bits_17_14_3_%=: \n\t"
  122579. "lsr r3, r1, #16\n\t"
  122580. "and r3, r3, #0xff\n\t"
  122581. "cmp r3, #0\n\t"
  122582. "beq L_sp_521_num_bits_17_14_2_%=\n\t"
  122583. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  122584. "mov r2, #0x1\n\t"
  122585. "lsl r2, r2, #8\n\t"
  122586. "add r2, r2, #0xd0\n\t"
  122587. #else
  122588. "mov r2, #0x1d0\n\t"
  122589. #endif
  122590. "ldrb r12, [lr, r3]\n\t"
  122591. "add r12, r2, r12\n\t"
  122592. "b L_sp_521_num_bits_17_18_%=\n\t"
  122593. "\n"
  122594. "L_sp_521_num_bits_17_14_2_%=: \n\t"
  122595. "lsr r3, r1, #8\n\t"
  122596. "and r3, r3, #0xff\n\t"
  122597. "cmp r3, #0\n\t"
  122598. "beq L_sp_521_num_bits_17_14_1_%=\n\t"
  122599. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  122600. "mov r2, #0x1\n\t"
  122601. "lsl r2, r2, #8\n\t"
  122602. "add r2, r2, #0xc8\n\t"
  122603. #else
  122604. "mov r2, #0x1c8\n\t"
  122605. #endif
  122606. "ldrb r12, [lr, r3]\n\t"
  122607. "add r12, r2, r12\n\t"
  122608. "b L_sp_521_num_bits_17_18_%=\n\t"
  122609. "\n"
  122610. "L_sp_521_num_bits_17_14_1_%=: \n\t"
  122611. "and r3, r1, #0xff\n\t"
  122612. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  122613. "mov r2, #0x1\n\t"
  122614. "lsl r2, r2, #8\n\t"
  122615. "add r2, r2, #0xc0\n\t"
  122616. #else
  122617. "mov r2, #0x1c0\n\t"
  122618. #endif
  122619. "ldrb r12, [lr, r3]\n\t"
  122620. "add r12, r2, r12\n\t"
  122621. "b L_sp_521_num_bits_17_18_%=\n\t"
  122622. "\n"
  122623. "L_sp_521_num_bits_17_14_%=: \n\t"
  122624. "ldr r1, [%[a], #52]\n\t"
  122625. "cmp r1, #0\n\t"
  122626. "beq L_sp_521_num_bits_17_13_%=\n\t"
  122627. "lsr r3, r1, #24\n\t"
  122628. "cmp r3, #0\n\t"
  122629. "beq L_sp_521_num_bits_17_13_3_%=\n\t"
  122630. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  122631. "mov r2, #0x1\n\t"
  122632. "lsl r2, r2, #8\n\t"
  122633. "add r2, r2, #0xb8\n\t"
  122634. #else
  122635. "mov r2, #0x1b8\n\t"
  122636. #endif
  122637. "ldrb r12, [lr, r3]\n\t"
  122638. "add r12, r2, r12\n\t"
  122639. "b L_sp_521_num_bits_17_18_%=\n\t"
  122640. "\n"
  122641. "L_sp_521_num_bits_17_13_3_%=: \n\t"
  122642. "lsr r3, r1, #16\n\t"
  122643. "and r3, r3, #0xff\n\t"
  122644. "cmp r3, #0\n\t"
  122645. "beq L_sp_521_num_bits_17_13_2_%=\n\t"
  122646. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  122647. "mov r2, #0x1\n\t"
  122648. "lsl r2, r2, #8\n\t"
  122649. "add r2, r2, #0xb0\n\t"
  122650. #else
  122651. "mov r2, #0x1b0\n\t"
  122652. #endif
  122653. "ldrb r12, [lr, r3]\n\t"
  122654. "add r12, r2, r12\n\t"
  122655. "b L_sp_521_num_bits_17_18_%=\n\t"
  122656. "\n"
  122657. "L_sp_521_num_bits_17_13_2_%=: \n\t"
  122658. "lsr r3, r1, #8\n\t"
  122659. "and r3, r3, #0xff\n\t"
  122660. "cmp r3, #0\n\t"
  122661. "beq L_sp_521_num_bits_17_13_1_%=\n\t"
  122662. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  122663. "mov r2, #0x1\n\t"
  122664. "lsl r2, r2, #8\n\t"
  122665. "add r2, r2, #0xa8\n\t"
  122666. #else
  122667. "mov r2, #0x1a8\n\t"
  122668. #endif
  122669. "ldrb r12, [lr, r3]\n\t"
  122670. "add r12, r2, r12\n\t"
  122671. "b L_sp_521_num_bits_17_18_%=\n\t"
  122672. "\n"
  122673. "L_sp_521_num_bits_17_13_1_%=: \n\t"
  122674. "and r3, r1, #0xff\n\t"
  122675. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  122676. "mov r2, #0x1\n\t"
  122677. "lsl r2, r2, #8\n\t"
  122678. "add r2, r2, #0xa0\n\t"
  122679. #else
  122680. "mov r2, #0x1a0\n\t"
  122681. #endif
  122682. "ldrb r12, [lr, r3]\n\t"
  122683. "add r12, r2, r12\n\t"
  122684. "b L_sp_521_num_bits_17_18_%=\n\t"
  122685. "\n"
  122686. "L_sp_521_num_bits_17_13_%=: \n\t"
  122687. "ldr r1, [%[a], #48]\n\t"
  122688. "cmp r1, #0\n\t"
  122689. "beq L_sp_521_num_bits_17_12_%=\n\t"
  122690. "lsr r3, r1, #24\n\t"
  122691. "cmp r3, #0\n\t"
  122692. "beq L_sp_521_num_bits_17_12_3_%=\n\t"
  122693. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  122694. "mov r2, #0x1\n\t"
  122695. "lsl r2, r2, #8\n\t"
  122696. "add r2, r2, #0x98\n\t"
  122697. #else
  122698. "mov r2, #0x198\n\t"
  122699. #endif
  122700. "ldrb r12, [lr, r3]\n\t"
  122701. "add r12, r2, r12\n\t"
  122702. "b L_sp_521_num_bits_17_18_%=\n\t"
  122703. "\n"
  122704. "L_sp_521_num_bits_17_12_3_%=: \n\t"
  122705. "lsr r3, r1, #16\n\t"
  122706. "and r3, r3, #0xff\n\t"
  122707. "cmp r3, #0\n\t"
  122708. "beq L_sp_521_num_bits_17_12_2_%=\n\t"
  122709. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  122710. "mov r2, #0x1\n\t"
  122711. "lsl r2, r2, #8\n\t"
  122712. "add r2, r2, #0x90\n\t"
  122713. #else
  122714. "mov r2, #0x190\n\t"
  122715. #endif
  122716. "ldrb r12, [lr, r3]\n\t"
  122717. "add r12, r2, r12\n\t"
  122718. "b L_sp_521_num_bits_17_18_%=\n\t"
  122719. "\n"
  122720. "L_sp_521_num_bits_17_12_2_%=: \n\t"
  122721. "lsr r3, r1, #8\n\t"
  122722. "and r3, r3, #0xff\n\t"
  122723. "cmp r3, #0\n\t"
  122724. "beq L_sp_521_num_bits_17_12_1_%=\n\t"
  122725. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  122726. "mov r2, #0x1\n\t"
  122727. "lsl r2, r2, #8\n\t"
  122728. "add r2, r2, #0x88\n\t"
  122729. #else
  122730. "mov r2, #0x188\n\t"
  122731. #endif
  122732. "ldrb r12, [lr, r3]\n\t"
  122733. "add r12, r2, r12\n\t"
  122734. "b L_sp_521_num_bits_17_18_%=\n\t"
  122735. "\n"
  122736. "L_sp_521_num_bits_17_12_1_%=: \n\t"
  122737. "and r3, r1, #0xff\n\t"
  122738. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  122739. "mov r2, #0x1\n\t"
  122740. "lsl r2, r2, #8\n\t"
  122741. "add r2, r2, #0x80\n\t"
  122742. #else
  122743. "mov r2, #0x180\n\t"
  122744. #endif
  122745. "ldrb r12, [lr, r3]\n\t"
  122746. "add r12, r2, r12\n\t"
  122747. "b L_sp_521_num_bits_17_18_%=\n\t"
  122748. "\n"
  122749. "L_sp_521_num_bits_17_12_%=: \n\t"
  122750. "ldr r1, [%[a], #44]\n\t"
  122751. "cmp r1, #0\n\t"
  122752. "beq L_sp_521_num_bits_17_11_%=\n\t"
  122753. "lsr r3, r1, #24\n\t"
  122754. "cmp r3, #0\n\t"
  122755. "beq L_sp_521_num_bits_17_11_3_%=\n\t"
  122756. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  122757. "mov r2, #0x1\n\t"
  122758. "lsl r2, r2, #8\n\t"
  122759. "add r2, r2, #0x78\n\t"
  122760. #else
  122761. "mov r2, #0x178\n\t"
  122762. #endif
  122763. "ldrb r12, [lr, r3]\n\t"
  122764. "add r12, r2, r12\n\t"
  122765. "b L_sp_521_num_bits_17_18_%=\n\t"
  122766. "\n"
  122767. "L_sp_521_num_bits_17_11_3_%=: \n\t"
  122768. "lsr r3, r1, #16\n\t"
  122769. "and r3, r3, #0xff\n\t"
  122770. "cmp r3, #0\n\t"
  122771. "beq L_sp_521_num_bits_17_11_2_%=\n\t"
  122772. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  122773. "mov r2, #0x1\n\t"
  122774. "lsl r2, r2, #8\n\t"
  122775. "add r2, r2, #0x70\n\t"
  122776. #else
  122777. "mov r2, #0x170\n\t"
  122778. #endif
  122779. "ldrb r12, [lr, r3]\n\t"
  122780. "add r12, r2, r12\n\t"
  122781. "b L_sp_521_num_bits_17_18_%=\n\t"
  122782. "\n"
  122783. "L_sp_521_num_bits_17_11_2_%=: \n\t"
  122784. "lsr r3, r1, #8\n\t"
  122785. "and r3, r3, #0xff\n\t"
  122786. "cmp r3, #0\n\t"
  122787. "beq L_sp_521_num_bits_17_11_1_%=\n\t"
  122788. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  122789. "mov r2, #0x1\n\t"
  122790. "lsl r2, r2, #8\n\t"
  122791. "add r2, r2, #0x68\n\t"
  122792. #else
  122793. "mov r2, #0x168\n\t"
  122794. #endif
  122795. "ldrb r12, [lr, r3]\n\t"
  122796. "add r12, r2, r12\n\t"
  122797. "b L_sp_521_num_bits_17_18_%=\n\t"
  122798. "\n"
  122799. "L_sp_521_num_bits_17_11_1_%=: \n\t"
  122800. "and r3, r1, #0xff\n\t"
  122801. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  122802. "mov r2, #0x1\n\t"
  122803. "lsl r2, r2, #8\n\t"
  122804. "add r2, r2, #0x60\n\t"
  122805. #else
  122806. "mov r2, #0x160\n\t"
  122807. #endif
  122808. "ldrb r12, [lr, r3]\n\t"
  122809. "add r12, r2, r12\n\t"
  122810. "b L_sp_521_num_bits_17_18_%=\n\t"
  122811. "\n"
  122812. "L_sp_521_num_bits_17_11_%=: \n\t"
  122813. "ldr r1, [%[a], #40]\n\t"
  122814. "cmp r1, #0\n\t"
  122815. "beq L_sp_521_num_bits_17_10_%=\n\t"
  122816. "lsr r3, r1, #24\n\t"
  122817. "cmp r3, #0\n\t"
  122818. "beq L_sp_521_num_bits_17_10_3_%=\n\t"
  122819. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  122820. "mov r2, #0x1\n\t"
  122821. "lsl r2, r2, #8\n\t"
  122822. "add r2, r2, #0x58\n\t"
  122823. #else
  122824. "mov r2, #0x158\n\t"
  122825. #endif
  122826. "ldrb r12, [lr, r3]\n\t"
  122827. "add r12, r2, r12\n\t"
  122828. "b L_sp_521_num_bits_17_18_%=\n\t"
  122829. "\n"
  122830. "L_sp_521_num_bits_17_10_3_%=: \n\t"
  122831. "lsr r3, r1, #16\n\t"
  122832. "and r3, r3, #0xff\n\t"
  122833. "cmp r3, #0\n\t"
  122834. "beq L_sp_521_num_bits_17_10_2_%=\n\t"
  122835. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  122836. "mov r2, #0x1\n\t"
  122837. "lsl r2, r2, #8\n\t"
  122838. "add r2, r2, #0x50\n\t"
  122839. #else
  122840. "mov r2, #0x150\n\t"
  122841. #endif
  122842. "ldrb r12, [lr, r3]\n\t"
  122843. "add r12, r2, r12\n\t"
  122844. "b L_sp_521_num_bits_17_18_%=\n\t"
  122845. "\n"
  122846. "L_sp_521_num_bits_17_10_2_%=: \n\t"
  122847. "lsr r3, r1, #8\n\t"
  122848. "and r3, r3, #0xff\n\t"
  122849. "cmp r3, #0\n\t"
  122850. "beq L_sp_521_num_bits_17_10_1_%=\n\t"
  122851. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  122852. "mov r2, #0x1\n\t"
  122853. "lsl r2, r2, #8\n\t"
  122854. "add r2, r2, #0x48\n\t"
  122855. #else
  122856. "mov r2, #0x148\n\t"
  122857. #endif
  122858. "ldrb r12, [lr, r3]\n\t"
  122859. "add r12, r2, r12\n\t"
  122860. "b L_sp_521_num_bits_17_18_%=\n\t"
  122861. "\n"
  122862. "L_sp_521_num_bits_17_10_1_%=: \n\t"
  122863. "and r3, r1, #0xff\n\t"
  122864. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  122865. "mov r2, #0x1\n\t"
  122866. "lsl r2, r2, #8\n\t"
  122867. "add r2, r2, #0x40\n\t"
  122868. #else
  122869. "mov r2, #0x140\n\t"
  122870. #endif
  122871. "ldrb r12, [lr, r3]\n\t"
  122872. "add r12, r2, r12\n\t"
  122873. "b L_sp_521_num_bits_17_18_%=\n\t"
  122874. "\n"
  122875. "L_sp_521_num_bits_17_10_%=: \n\t"
  122876. "ldr r1, [%[a], #36]\n\t"
  122877. "cmp r1, #0\n\t"
  122878. "beq L_sp_521_num_bits_17_9_%=\n\t"
  122879. "lsr r3, r1, #24\n\t"
  122880. "cmp r3, #0\n\t"
  122881. "beq L_sp_521_num_bits_17_9_3_%=\n\t"
  122882. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  122883. "mov r2, #0x1\n\t"
  122884. "lsl r2, r2, #8\n\t"
  122885. "add r2, r2, #0x38\n\t"
  122886. #else
  122887. "mov r2, #0x138\n\t"
  122888. #endif
  122889. "ldrb r12, [lr, r3]\n\t"
  122890. "add r12, r2, r12\n\t"
  122891. "b L_sp_521_num_bits_17_18_%=\n\t"
  122892. "\n"
  122893. "L_sp_521_num_bits_17_9_3_%=: \n\t"
  122894. "lsr r3, r1, #16\n\t"
  122895. "and r3, r3, #0xff\n\t"
  122896. "cmp r3, #0\n\t"
  122897. "beq L_sp_521_num_bits_17_9_2_%=\n\t"
  122898. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  122899. "mov r2, #0x1\n\t"
  122900. "lsl r2, r2, #8\n\t"
  122901. "add r2, r2, #0x30\n\t"
  122902. #else
  122903. "mov r2, #0x130\n\t"
  122904. #endif
  122905. "ldrb r12, [lr, r3]\n\t"
  122906. "add r12, r2, r12\n\t"
  122907. "b L_sp_521_num_bits_17_18_%=\n\t"
  122908. "\n"
  122909. "L_sp_521_num_bits_17_9_2_%=: \n\t"
  122910. "lsr r3, r1, #8\n\t"
  122911. "and r3, r3, #0xff\n\t"
  122912. "cmp r3, #0\n\t"
  122913. "beq L_sp_521_num_bits_17_9_1_%=\n\t"
  122914. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  122915. "mov r2, #0x1\n\t"
  122916. "lsl r2, r2, #8\n\t"
  122917. "add r2, r2, #0x28\n\t"
  122918. #else
  122919. "mov r2, #0x128\n\t"
  122920. #endif
  122921. "ldrb r12, [lr, r3]\n\t"
  122922. "add r12, r2, r12\n\t"
  122923. "b L_sp_521_num_bits_17_18_%=\n\t"
  122924. "\n"
  122925. "L_sp_521_num_bits_17_9_1_%=: \n\t"
  122926. "and r3, r1, #0xff\n\t"
  122927. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  122928. "mov r2, #0x1\n\t"
  122929. "lsl r2, r2, #8\n\t"
  122930. "add r2, r2, #0x20\n\t"
  122931. #else
  122932. "mov r2, #0x120\n\t"
  122933. #endif
  122934. "ldrb r12, [lr, r3]\n\t"
  122935. "add r12, r2, r12\n\t"
  122936. "b L_sp_521_num_bits_17_18_%=\n\t"
  122937. "\n"
  122938. "L_sp_521_num_bits_17_9_%=: \n\t"
  122939. "ldr r1, [%[a], #32]\n\t"
  122940. "cmp r1, #0\n\t"
  122941. "beq L_sp_521_num_bits_17_8_%=\n\t"
  122942. "lsr r3, r1, #24\n\t"
  122943. "cmp r3, #0\n\t"
  122944. "beq L_sp_521_num_bits_17_8_3_%=\n\t"
  122945. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  122946. "mov r2, #0x1\n\t"
  122947. "lsl r2, r2, #8\n\t"
  122948. "add r2, r2, #0x18\n\t"
  122949. #else
  122950. "mov r2, #0x118\n\t"
  122951. #endif
  122952. "ldrb r12, [lr, r3]\n\t"
  122953. "add r12, r2, r12\n\t"
  122954. "b L_sp_521_num_bits_17_18_%=\n\t"
  122955. "\n"
  122956. "L_sp_521_num_bits_17_8_3_%=: \n\t"
  122957. "lsr r3, r1, #16\n\t"
  122958. "and r3, r3, #0xff\n\t"
  122959. "cmp r3, #0\n\t"
  122960. "beq L_sp_521_num_bits_17_8_2_%=\n\t"
  122961. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  122962. "mov r2, #0x1\n\t"
  122963. "lsl r2, r2, #8\n\t"
  122964. "add r2, r2, #0x10\n\t"
  122965. #else
  122966. "mov r2, #0x110\n\t"
  122967. #endif
  122968. "ldrb r12, [lr, r3]\n\t"
  122969. "add r12, r2, r12\n\t"
  122970. "b L_sp_521_num_bits_17_18_%=\n\t"
  122971. "\n"
  122972. "L_sp_521_num_bits_17_8_2_%=: \n\t"
  122973. "lsr r3, r1, #8\n\t"
  122974. "and r3, r3, #0xff\n\t"
  122975. "cmp r3, #0\n\t"
  122976. "beq L_sp_521_num_bits_17_8_1_%=\n\t"
  122977. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  122978. "mov r2, #0x1\n\t"
  122979. "lsl r2, r2, #8\n\t"
  122980. "add r2, r2, #0x8\n\t"
  122981. #else
  122982. "mov r2, #0x108\n\t"
  122983. #endif
  122984. "ldrb r12, [lr, r3]\n\t"
  122985. "add r12, r2, r12\n\t"
  122986. "b L_sp_521_num_bits_17_18_%=\n\t"
  122987. "\n"
  122988. "L_sp_521_num_bits_17_8_1_%=: \n\t"
  122989. "and r3, r1, #0xff\n\t"
  122990. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  122991. "mov r2, #0x1\n\t"
  122992. "lsl r2, r2, #8\n\t"
  122993. "add r2, r2, #0x0\n\t"
  122994. #else
  122995. "mov r2, #0x100\n\t"
  122996. #endif
  122997. "ldrb r12, [lr, r3]\n\t"
  122998. "add r12, r2, r12\n\t"
  122999. "b L_sp_521_num_bits_17_18_%=\n\t"
  123000. "\n"
  123001. "L_sp_521_num_bits_17_8_%=: \n\t"
  123002. "ldr r1, [%[a], #28]\n\t"
  123003. "cmp r1, #0\n\t"
  123004. "beq L_sp_521_num_bits_17_7_%=\n\t"
  123005. "lsr r3, r1, #24\n\t"
  123006. "cmp r3, #0\n\t"
  123007. "beq L_sp_521_num_bits_17_7_3_%=\n\t"
  123008. "mov r2, #0xf8\n\t"
  123009. "ldrb r12, [lr, r3]\n\t"
  123010. "add r12, r2, r12\n\t"
  123011. "b L_sp_521_num_bits_17_18_%=\n\t"
  123012. "\n"
  123013. "L_sp_521_num_bits_17_7_3_%=: \n\t"
  123014. "lsr r3, r1, #16\n\t"
  123015. "and r3, r3, #0xff\n\t"
  123016. "cmp r3, #0\n\t"
  123017. "beq L_sp_521_num_bits_17_7_2_%=\n\t"
  123018. "mov r2, #0xf0\n\t"
  123019. "ldrb r12, [lr, r3]\n\t"
  123020. "add r12, r2, r12\n\t"
  123021. "b L_sp_521_num_bits_17_18_%=\n\t"
  123022. "\n"
  123023. "L_sp_521_num_bits_17_7_2_%=: \n\t"
  123024. "lsr r3, r1, #8\n\t"
  123025. "and r3, r3, #0xff\n\t"
  123026. "cmp r3, #0\n\t"
  123027. "beq L_sp_521_num_bits_17_7_1_%=\n\t"
  123028. "mov r2, #0xe8\n\t"
  123029. "ldrb r12, [lr, r3]\n\t"
  123030. "add r12, r2, r12\n\t"
  123031. "b L_sp_521_num_bits_17_18_%=\n\t"
  123032. "\n"
  123033. "L_sp_521_num_bits_17_7_1_%=: \n\t"
  123034. "and r3, r1, #0xff\n\t"
  123035. "mov r2, #0xe0\n\t"
  123036. "ldrb r12, [lr, r3]\n\t"
  123037. "add r12, r2, r12\n\t"
  123038. "b L_sp_521_num_bits_17_18_%=\n\t"
  123039. "\n"
  123040. "L_sp_521_num_bits_17_7_%=: \n\t"
  123041. "ldr r1, [%[a], #24]\n\t"
  123042. "cmp r1, #0\n\t"
  123043. "beq L_sp_521_num_bits_17_6_%=\n\t"
  123044. "lsr r3, r1, #24\n\t"
  123045. "cmp r3, #0\n\t"
  123046. "beq L_sp_521_num_bits_17_6_3_%=\n\t"
  123047. "mov r2, #0xd8\n\t"
  123048. "ldrb r12, [lr, r3]\n\t"
  123049. "add r12, r2, r12\n\t"
  123050. "b L_sp_521_num_bits_17_18_%=\n\t"
  123051. "\n"
  123052. "L_sp_521_num_bits_17_6_3_%=: \n\t"
  123053. "lsr r3, r1, #16\n\t"
  123054. "and r3, r3, #0xff\n\t"
  123055. "cmp r3, #0\n\t"
  123056. "beq L_sp_521_num_bits_17_6_2_%=\n\t"
  123057. "mov r2, #0xd0\n\t"
  123058. "ldrb r12, [lr, r3]\n\t"
  123059. "add r12, r2, r12\n\t"
  123060. "b L_sp_521_num_bits_17_18_%=\n\t"
  123061. "\n"
  123062. "L_sp_521_num_bits_17_6_2_%=: \n\t"
  123063. "lsr r3, r1, #8\n\t"
  123064. "and r3, r3, #0xff\n\t"
  123065. "cmp r3, #0\n\t"
  123066. "beq L_sp_521_num_bits_17_6_1_%=\n\t"
  123067. "mov r2, #0xc8\n\t"
  123068. "ldrb r12, [lr, r3]\n\t"
  123069. "add r12, r2, r12\n\t"
  123070. "b L_sp_521_num_bits_17_18_%=\n\t"
  123071. "\n"
  123072. "L_sp_521_num_bits_17_6_1_%=: \n\t"
  123073. "and r3, r1, #0xff\n\t"
  123074. "mov r2, #0xc0\n\t"
  123075. "ldrb r12, [lr, r3]\n\t"
  123076. "add r12, r2, r12\n\t"
  123077. "b L_sp_521_num_bits_17_18_%=\n\t"
  123078. "\n"
  123079. "L_sp_521_num_bits_17_6_%=: \n\t"
  123080. "ldr r1, [%[a], #20]\n\t"
  123081. "cmp r1, #0\n\t"
  123082. "beq L_sp_521_num_bits_17_5_%=\n\t"
  123083. "lsr r3, r1, #24\n\t"
  123084. "cmp r3, #0\n\t"
  123085. "beq L_sp_521_num_bits_17_5_3_%=\n\t"
  123086. "mov r2, #0xb8\n\t"
  123087. "ldrb r12, [lr, r3]\n\t"
  123088. "add r12, r2, r12\n\t"
  123089. "b L_sp_521_num_bits_17_18_%=\n\t"
  123090. "\n"
  123091. "L_sp_521_num_bits_17_5_3_%=: \n\t"
  123092. "lsr r3, r1, #16\n\t"
  123093. "and r3, r3, #0xff\n\t"
  123094. "cmp r3, #0\n\t"
  123095. "beq L_sp_521_num_bits_17_5_2_%=\n\t"
  123096. "mov r2, #0xb0\n\t"
  123097. "ldrb r12, [lr, r3]\n\t"
  123098. "add r12, r2, r12\n\t"
  123099. "b L_sp_521_num_bits_17_18_%=\n\t"
  123100. "\n"
  123101. "L_sp_521_num_bits_17_5_2_%=: \n\t"
  123102. "lsr r3, r1, #8\n\t"
  123103. "and r3, r3, #0xff\n\t"
  123104. "cmp r3, #0\n\t"
  123105. "beq L_sp_521_num_bits_17_5_1_%=\n\t"
  123106. "mov r2, #0xa8\n\t"
  123107. "ldrb r12, [lr, r3]\n\t"
  123108. "add r12, r2, r12\n\t"
  123109. "b L_sp_521_num_bits_17_18_%=\n\t"
  123110. "\n"
  123111. "L_sp_521_num_bits_17_5_1_%=: \n\t"
  123112. "and r3, r1, #0xff\n\t"
  123113. "mov r2, #0xa0\n\t"
  123114. "ldrb r12, [lr, r3]\n\t"
  123115. "add r12, r2, r12\n\t"
  123116. "b L_sp_521_num_bits_17_18_%=\n\t"
  123117. "\n"
  123118. "L_sp_521_num_bits_17_5_%=: \n\t"
  123119. "ldr r1, [%[a], #16]\n\t"
  123120. "cmp r1, #0\n\t"
  123121. "beq L_sp_521_num_bits_17_4_%=\n\t"
  123122. "lsr r3, r1, #24\n\t"
  123123. "cmp r3, #0\n\t"
  123124. "beq L_sp_521_num_bits_17_4_3_%=\n\t"
  123125. "mov r2, #0x98\n\t"
  123126. "ldrb r12, [lr, r3]\n\t"
  123127. "add r12, r2, r12\n\t"
  123128. "b L_sp_521_num_bits_17_18_%=\n\t"
  123129. "\n"
  123130. "L_sp_521_num_bits_17_4_3_%=: \n\t"
  123131. "lsr r3, r1, #16\n\t"
  123132. "and r3, r3, #0xff\n\t"
  123133. "cmp r3, #0\n\t"
  123134. "beq L_sp_521_num_bits_17_4_2_%=\n\t"
  123135. "mov r2, #0x90\n\t"
  123136. "ldrb r12, [lr, r3]\n\t"
  123137. "add r12, r2, r12\n\t"
  123138. "b L_sp_521_num_bits_17_18_%=\n\t"
  123139. "\n"
  123140. "L_sp_521_num_bits_17_4_2_%=: \n\t"
  123141. "lsr r3, r1, #8\n\t"
  123142. "and r3, r3, #0xff\n\t"
  123143. "cmp r3, #0\n\t"
  123144. "beq L_sp_521_num_bits_17_4_1_%=\n\t"
  123145. "mov r2, #0x88\n\t"
  123146. "ldrb r12, [lr, r3]\n\t"
  123147. "add r12, r2, r12\n\t"
  123148. "b L_sp_521_num_bits_17_18_%=\n\t"
  123149. "\n"
  123150. "L_sp_521_num_bits_17_4_1_%=: \n\t"
  123151. "and r3, r1, #0xff\n\t"
  123152. "mov r2, #0x80\n\t"
  123153. "ldrb r12, [lr, r3]\n\t"
  123154. "add r12, r2, r12\n\t"
  123155. "b L_sp_521_num_bits_17_18_%=\n\t"
  123156. "\n"
  123157. "L_sp_521_num_bits_17_4_%=: \n\t"
  123158. "ldr r1, [%[a], #12]\n\t"
  123159. "cmp r1, #0\n\t"
  123160. "beq L_sp_521_num_bits_17_3_%=\n\t"
  123161. "lsr r3, r1, #24\n\t"
  123162. "cmp r3, #0\n\t"
  123163. "beq L_sp_521_num_bits_17_3_3_%=\n\t"
  123164. "mov r2, #0x78\n\t"
  123165. "ldrb r12, [lr, r3]\n\t"
  123166. "add r12, r2, r12\n\t"
  123167. "b L_sp_521_num_bits_17_18_%=\n\t"
  123168. "\n"
  123169. "L_sp_521_num_bits_17_3_3_%=: \n\t"
  123170. "lsr r3, r1, #16\n\t"
  123171. "and r3, r3, #0xff\n\t"
  123172. "cmp r3, #0\n\t"
  123173. "beq L_sp_521_num_bits_17_3_2_%=\n\t"
  123174. "mov r2, #0x70\n\t"
  123175. "ldrb r12, [lr, r3]\n\t"
  123176. "add r12, r2, r12\n\t"
  123177. "b L_sp_521_num_bits_17_18_%=\n\t"
  123178. "\n"
  123179. "L_sp_521_num_bits_17_3_2_%=: \n\t"
  123180. "lsr r3, r1, #8\n\t"
  123181. "and r3, r3, #0xff\n\t"
  123182. "cmp r3, #0\n\t"
  123183. "beq L_sp_521_num_bits_17_3_1_%=\n\t"
  123184. "mov r2, #0x68\n\t"
  123185. "ldrb r12, [lr, r3]\n\t"
  123186. "add r12, r2, r12\n\t"
  123187. "b L_sp_521_num_bits_17_18_%=\n\t"
  123188. "\n"
  123189. "L_sp_521_num_bits_17_3_1_%=: \n\t"
  123190. "and r3, r1, #0xff\n\t"
  123191. "mov r2, #0x60\n\t"
  123192. "ldrb r12, [lr, r3]\n\t"
  123193. "add r12, r2, r12\n\t"
  123194. "b L_sp_521_num_bits_17_18_%=\n\t"
  123195. "\n"
  123196. "L_sp_521_num_bits_17_3_%=: \n\t"
  123197. "ldr r1, [%[a], #8]\n\t"
  123198. "cmp r1, #0\n\t"
  123199. "beq L_sp_521_num_bits_17_2_%=\n\t"
  123200. "lsr r3, r1, #24\n\t"
  123201. "cmp r3, #0\n\t"
  123202. "beq L_sp_521_num_bits_17_2_3_%=\n\t"
  123203. "mov r2, #0x58\n\t"
  123204. "ldrb r12, [lr, r3]\n\t"
  123205. "add r12, r2, r12\n\t"
  123206. "b L_sp_521_num_bits_17_18_%=\n\t"
  123207. "\n"
  123208. "L_sp_521_num_bits_17_2_3_%=: \n\t"
  123209. "lsr r3, r1, #16\n\t"
  123210. "and r3, r3, #0xff\n\t"
  123211. "cmp r3, #0\n\t"
  123212. "beq L_sp_521_num_bits_17_2_2_%=\n\t"
  123213. "mov r2, #0x50\n\t"
  123214. "ldrb r12, [lr, r3]\n\t"
  123215. "add r12, r2, r12\n\t"
  123216. "b L_sp_521_num_bits_17_18_%=\n\t"
  123217. "\n"
  123218. "L_sp_521_num_bits_17_2_2_%=: \n\t"
  123219. "lsr r3, r1, #8\n\t"
  123220. "and r3, r3, #0xff\n\t"
  123221. "cmp r3, #0\n\t"
  123222. "beq L_sp_521_num_bits_17_2_1_%=\n\t"
  123223. "mov r2, #0x48\n\t"
  123224. "ldrb r12, [lr, r3]\n\t"
  123225. "add r12, r2, r12\n\t"
  123226. "b L_sp_521_num_bits_17_18_%=\n\t"
  123227. "\n"
  123228. "L_sp_521_num_bits_17_2_1_%=: \n\t"
  123229. "and r3, r1, #0xff\n\t"
  123230. "mov r2, #0x40\n\t"
  123231. "ldrb r12, [lr, r3]\n\t"
  123232. "add r12, r2, r12\n\t"
  123233. "b L_sp_521_num_bits_17_18_%=\n\t"
  123234. "\n"
  123235. "L_sp_521_num_bits_17_2_%=: \n\t"
  123236. "ldr r1, [%[a], #4]\n\t"
  123237. "cmp r1, #0\n\t"
  123238. "beq L_sp_521_num_bits_17_1_%=\n\t"
  123239. "lsr r3, r1, #24\n\t"
  123240. "cmp r3, #0\n\t"
  123241. "beq L_sp_521_num_bits_17_1_3_%=\n\t"
  123242. "mov r2, #56\n\t"
  123243. "ldrb r12, [lr, r3]\n\t"
  123244. "add r12, r2, r12\n\t"
  123245. "b L_sp_521_num_bits_17_18_%=\n\t"
  123246. "\n"
  123247. "L_sp_521_num_bits_17_1_3_%=: \n\t"
  123248. "lsr r3, r1, #16\n\t"
  123249. "and r3, r3, #0xff\n\t"
  123250. "cmp r3, #0\n\t"
  123251. "beq L_sp_521_num_bits_17_1_2_%=\n\t"
  123252. "mov r2, #48\n\t"
  123253. "ldrb r12, [lr, r3]\n\t"
  123254. "add r12, r2, r12\n\t"
  123255. "b L_sp_521_num_bits_17_18_%=\n\t"
  123256. "\n"
  123257. "L_sp_521_num_bits_17_1_2_%=: \n\t"
  123258. "lsr r3, r1, #8\n\t"
  123259. "and r3, r3, #0xff\n\t"
  123260. "cmp r3, #0\n\t"
  123261. "beq L_sp_521_num_bits_17_1_1_%=\n\t"
  123262. "mov r2, #40\n\t"
  123263. "ldrb r12, [lr, r3]\n\t"
  123264. "add r12, r2, r12\n\t"
  123265. "b L_sp_521_num_bits_17_18_%=\n\t"
  123266. "\n"
  123267. "L_sp_521_num_bits_17_1_1_%=: \n\t"
  123268. "and r3, r1, #0xff\n\t"
  123269. "mov r2, #32\n\t"
  123270. "ldrb r12, [lr, r3]\n\t"
  123271. "add r12, r2, r12\n\t"
  123272. "b L_sp_521_num_bits_17_18_%=\n\t"
  123273. "\n"
  123274. "L_sp_521_num_bits_17_1_%=: \n\t"
  123275. "ldr r1, [%[a]]\n\t"
  123276. "lsr r3, r1, #24\n\t"
  123277. "cmp r3, #0\n\t"
  123278. "beq L_sp_521_num_bits_17_0_3_%=\n\t"
  123279. "mov r2, #24\n\t"
  123280. "ldrb r12, [lr, r3]\n\t"
  123281. "add r12, r2, r12\n\t"
  123282. "b L_sp_521_num_bits_17_18_%=\n\t"
  123283. "\n"
  123284. "L_sp_521_num_bits_17_0_3_%=: \n\t"
  123285. "lsr r3, r1, #16\n\t"
  123286. "and r3, r3, #0xff\n\t"
  123287. "cmp r3, #0\n\t"
  123288. "beq L_sp_521_num_bits_17_0_2_%=\n\t"
  123289. "mov r2, #16\n\t"
  123290. "ldrb r12, [lr, r3]\n\t"
  123291. "add r12, r2, r12\n\t"
  123292. "b L_sp_521_num_bits_17_18_%=\n\t"
  123293. "\n"
  123294. "L_sp_521_num_bits_17_0_2_%=: \n\t"
  123295. "lsr r3, r1, #8\n\t"
  123296. "and r3, r3, #0xff\n\t"
  123297. "cmp r3, #0\n\t"
  123298. "beq L_sp_521_num_bits_17_0_1_%=\n\t"
  123299. "mov r2, #8\n\t"
  123300. "ldrb r12, [lr, r3]\n\t"
  123301. "add r12, r2, r12\n\t"
  123302. "b L_sp_521_num_bits_17_18_%=\n\t"
  123303. "\n"
  123304. "L_sp_521_num_bits_17_0_1_%=: \n\t"
  123305. "and r3, r1, #0xff\n\t"
  123306. "ldrb r12, [lr, r3]\n\t"
  123307. "\n"
  123308. "L_sp_521_num_bits_17_18_%=: \n\t"
  123309. "mov %[a], r12\n\t"
  123310. : [a] "+r" (a), [L_sp_521_num_bits_17_table] "+r" (L_sp_521_num_bits_17_table_c)
  123311. :
  123312. : "memory", "r2", "r3", "r12", "lr", "cc"
  123313. );
  123314. return (uint32_t)(size_t)a;
  123315. }
  123316. #else
  123317. static int sp_521_num_bits_17(const sp_digit* a_p)
  123318. {
  123319. register const sp_digit* a asm ("r0") = (const sp_digit*)a_p;
  123320. __asm__ __volatile__ (
  123321. "ldr r1, [%[a], #64]\n\t"
  123322. "cmp r1, #0\n\t"
  123323. "beq L_sp_521_num_bits_17_16_%=\n\t"
  123324. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  123325. "mov r2, #0x2\n\t"
  123326. "lsl r2, r2, #8\n\t"
  123327. "add r2, r2, #0x20\n\t"
  123328. #else
  123329. "mov r2, #0x220\n\t"
  123330. #endif
  123331. "clz r12, r1\n\t"
  123332. "sub r12, r2, r12\n\t"
  123333. "b L_sp_521_num_bits_17_18_%=\n\t"
  123334. "\n"
  123335. "L_sp_521_num_bits_17_16_%=: \n\t"
  123336. "ldr r1, [%[a], #60]\n\t"
  123337. "cmp r1, #0\n\t"
  123338. "beq L_sp_521_num_bits_17_15_%=\n\t"
  123339. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  123340. "mov r2, #0x2\n\t"
  123341. "lsl r2, r2, #8\n\t"
  123342. "add r2, r2, #0x0\n\t"
  123343. #else
  123344. "mov r2, #0x200\n\t"
  123345. #endif
  123346. "clz r12, r1\n\t"
  123347. "sub r12, r2, r12\n\t"
  123348. "b L_sp_521_num_bits_17_18_%=\n\t"
  123349. "\n"
  123350. "L_sp_521_num_bits_17_15_%=: \n\t"
  123351. "ldr r1, [%[a], #56]\n\t"
  123352. "cmp r1, #0\n\t"
  123353. "beq L_sp_521_num_bits_17_14_%=\n\t"
  123354. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  123355. "mov r2, #0x1\n\t"
  123356. "lsl r2, r2, #8\n\t"
  123357. "add r2, r2, #0xe0\n\t"
  123358. #else
  123359. "mov r2, #0x1e0\n\t"
  123360. #endif
  123361. "clz r12, r1\n\t"
  123362. "sub r12, r2, r12\n\t"
  123363. "b L_sp_521_num_bits_17_18_%=\n\t"
  123364. "\n"
  123365. "L_sp_521_num_bits_17_14_%=: \n\t"
  123366. "ldr r1, [%[a], #52]\n\t"
  123367. "cmp r1, #0\n\t"
  123368. "beq L_sp_521_num_bits_17_13_%=\n\t"
  123369. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  123370. "mov r2, #0x1\n\t"
  123371. "lsl r2, r2, #8\n\t"
  123372. "add r2, r2, #0xc0\n\t"
  123373. #else
  123374. "mov r2, #0x1c0\n\t"
  123375. #endif
  123376. "clz r12, r1\n\t"
  123377. "sub r12, r2, r12\n\t"
  123378. "b L_sp_521_num_bits_17_18_%=\n\t"
  123379. "\n"
  123380. "L_sp_521_num_bits_17_13_%=: \n\t"
  123381. "ldr r1, [%[a], #48]\n\t"
  123382. "cmp r1, #0\n\t"
  123383. "beq L_sp_521_num_bits_17_12_%=\n\t"
  123384. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  123385. "mov r2, #0x1\n\t"
  123386. "lsl r2, r2, #8\n\t"
  123387. "add r2, r2, #0xa0\n\t"
  123388. #else
  123389. "mov r2, #0x1a0\n\t"
  123390. #endif
  123391. "clz r12, r1\n\t"
  123392. "sub r12, r2, r12\n\t"
  123393. "b L_sp_521_num_bits_17_18_%=\n\t"
  123394. "\n"
  123395. "L_sp_521_num_bits_17_12_%=: \n\t"
  123396. "ldr r1, [%[a], #44]\n\t"
  123397. "cmp r1, #0\n\t"
  123398. "beq L_sp_521_num_bits_17_11_%=\n\t"
  123399. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  123400. "mov r2, #0x1\n\t"
  123401. "lsl r2, r2, #8\n\t"
  123402. "add r2, r2, #0x80\n\t"
  123403. #else
  123404. "mov r2, #0x180\n\t"
  123405. #endif
  123406. "clz r12, r1\n\t"
  123407. "sub r12, r2, r12\n\t"
  123408. "b L_sp_521_num_bits_17_18_%=\n\t"
  123409. "\n"
  123410. "L_sp_521_num_bits_17_11_%=: \n\t"
  123411. "ldr r1, [%[a], #40]\n\t"
  123412. "cmp r1, #0\n\t"
  123413. "beq L_sp_521_num_bits_17_10_%=\n\t"
  123414. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  123415. "mov r2, #0x1\n\t"
  123416. "lsl r2, r2, #8\n\t"
  123417. "add r2, r2, #0x60\n\t"
  123418. #else
  123419. "mov r2, #0x160\n\t"
  123420. #endif
  123421. "clz r12, r1\n\t"
  123422. "sub r12, r2, r12\n\t"
  123423. "b L_sp_521_num_bits_17_18_%=\n\t"
  123424. "\n"
  123425. "L_sp_521_num_bits_17_10_%=: \n\t"
  123426. "ldr r1, [%[a], #36]\n\t"
  123427. "cmp r1, #0\n\t"
  123428. "beq L_sp_521_num_bits_17_9_%=\n\t"
  123429. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  123430. "mov r2, #0x1\n\t"
  123431. "lsl r2, r2, #8\n\t"
  123432. "add r2, r2, #0x40\n\t"
  123433. #else
  123434. "mov r2, #0x140\n\t"
  123435. #endif
  123436. "clz r12, r1\n\t"
  123437. "sub r12, r2, r12\n\t"
  123438. "b L_sp_521_num_bits_17_18_%=\n\t"
  123439. "\n"
  123440. "L_sp_521_num_bits_17_9_%=: \n\t"
  123441. "ldr r1, [%[a], #32]\n\t"
  123442. "cmp r1, #0\n\t"
  123443. "beq L_sp_521_num_bits_17_8_%=\n\t"
  123444. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  123445. "mov r2, #0x1\n\t"
  123446. "lsl r2, r2, #8\n\t"
  123447. "add r2, r2, #0x20\n\t"
  123448. #else
  123449. "mov r2, #0x120\n\t"
  123450. #endif
  123451. "clz r12, r1\n\t"
  123452. "sub r12, r2, r12\n\t"
  123453. "b L_sp_521_num_bits_17_18_%=\n\t"
  123454. "\n"
  123455. "L_sp_521_num_bits_17_8_%=: \n\t"
  123456. "ldr r1, [%[a], #28]\n\t"
  123457. "cmp r1, #0\n\t"
  123458. "beq L_sp_521_num_bits_17_7_%=\n\t"
  123459. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  123460. "mov r2, #0x1\n\t"
  123461. "lsl r2, r2, #8\n\t"
  123462. "add r2, r2, #0x0\n\t"
  123463. #else
  123464. "mov r2, #0x100\n\t"
  123465. #endif
  123466. "clz r12, r1\n\t"
  123467. "sub r12, r2, r12\n\t"
  123468. "b L_sp_521_num_bits_17_18_%=\n\t"
  123469. "\n"
  123470. "L_sp_521_num_bits_17_7_%=: \n\t"
  123471. "ldr r1, [%[a], #24]\n\t"
  123472. "cmp r1, #0\n\t"
  123473. "beq L_sp_521_num_bits_17_6_%=\n\t"
  123474. "mov r2, #0xe0\n\t"
  123475. "clz r12, r1\n\t"
  123476. "sub r12, r2, r12\n\t"
  123477. "b L_sp_521_num_bits_17_18_%=\n\t"
  123478. "\n"
  123479. "L_sp_521_num_bits_17_6_%=: \n\t"
  123480. "ldr r1, [%[a], #20]\n\t"
  123481. "cmp r1, #0\n\t"
  123482. "beq L_sp_521_num_bits_17_5_%=\n\t"
  123483. "mov r2, #0xc0\n\t"
  123484. "clz r12, r1\n\t"
  123485. "sub r12, r2, r12\n\t"
  123486. "b L_sp_521_num_bits_17_18_%=\n\t"
  123487. "\n"
  123488. "L_sp_521_num_bits_17_5_%=: \n\t"
  123489. "ldr r1, [%[a], #16]\n\t"
  123490. "cmp r1, #0\n\t"
  123491. "beq L_sp_521_num_bits_17_4_%=\n\t"
  123492. "mov r2, #0xa0\n\t"
  123493. "clz r12, r1\n\t"
  123494. "sub r12, r2, r12\n\t"
  123495. "b L_sp_521_num_bits_17_18_%=\n\t"
  123496. "\n"
  123497. "L_sp_521_num_bits_17_4_%=: \n\t"
  123498. "ldr r1, [%[a], #12]\n\t"
  123499. "cmp r1, #0\n\t"
  123500. "beq L_sp_521_num_bits_17_3_%=\n\t"
  123501. "mov r2, #0x80\n\t"
  123502. "clz r12, r1\n\t"
  123503. "sub r12, r2, r12\n\t"
  123504. "b L_sp_521_num_bits_17_18_%=\n\t"
  123505. "\n"
  123506. "L_sp_521_num_bits_17_3_%=: \n\t"
  123507. "ldr r1, [%[a], #8]\n\t"
  123508. "cmp r1, #0\n\t"
  123509. "beq L_sp_521_num_bits_17_2_%=\n\t"
  123510. "mov r2, #0x60\n\t"
  123511. "clz r12, r1\n\t"
  123512. "sub r12, r2, r12\n\t"
  123513. "b L_sp_521_num_bits_17_18_%=\n\t"
  123514. "\n"
  123515. "L_sp_521_num_bits_17_2_%=: \n\t"
  123516. "ldr r1, [%[a], #4]\n\t"
  123517. "cmp r1, #0\n\t"
  123518. "beq L_sp_521_num_bits_17_1_%=\n\t"
  123519. "mov r2, #0x40\n\t"
  123520. "clz r12, r1\n\t"
  123521. "sub r12, r2, r12\n\t"
  123522. "b L_sp_521_num_bits_17_18_%=\n\t"
  123523. "\n"
  123524. "L_sp_521_num_bits_17_1_%=: \n\t"
  123525. "ldr r1, [%[a]]\n\t"
  123526. "mov r2, #32\n\t"
  123527. "clz r12, r1\n\t"
  123528. "sub r12, r2, r12\n\t"
  123529. "\n"
  123530. "L_sp_521_num_bits_17_18_%=: \n\t"
  123531. "mov %[a], r12\n\t"
  123532. : [a] "+r" (a)
  123533. :
  123534. : "memory", "r1", "r2", "r3", "r12", "lr", "cc"
  123535. );
  123536. return (uint32_t)(size_t)a;
  123537. }
  123538. #endif /* WOLFSSL_ARM_ARCH && (WOLFSSL_ARM_ARCH < 7) */
  123539. /* Non-constant time modular inversion.
  123540. *
  123541. * @param [out] r Resulting number.
  123542. * @param [in] a Number to invert.
  123543. * @param [in] m Modulus.
  123544. * @return MP_OKAY on success.
  123545. */
  123546. static int sp_521_mod_inv_17(sp_digit* r, const sp_digit* a, const sp_digit* m)
  123547. {
  123548. sp_digit u[17];
  123549. sp_digit v[17];
  123550. sp_digit b[17];
  123551. sp_digit d[17];
  123552. int ut, vt;
  123553. sp_digit o;
  123554. XMEMCPY(u, m, sizeof(u));
  123555. XMEMCPY(v, a, sizeof(v));
  123556. ut = sp_521_num_bits_17(u);
  123557. vt = sp_521_num_bits_17(v);
  123558. XMEMSET(b, 0, sizeof(b));
  123559. if ((v[0] & 1) == 0) {
  123560. sp_521_rshift1_17(v, v);
  123561. XMEMCPY(d, m, sizeof(u));
  123562. d[0] += 1;
  123563. sp_521_rshift1_17(d, d);
  123564. vt--;
  123565. while ((v[0] & 1) == 0) {
  123566. sp_521_rshift1_17(v, v);
  123567. sp_521_div2_mod_17(d, d, m);
  123568. vt--;
  123569. }
  123570. }
  123571. else {
  123572. XMEMSET(d+1, 0, sizeof(d)-sizeof(sp_digit));
  123573. d[0] = 1;
  123574. }
  123575. while (ut > 1 && vt > 1) {
  123576. if ((ut > vt) || ((ut == vt) && (sp_521_cmp_17(u, v) >= 0))) {
  123577. sp_521_sub_17(u, u, v);
  123578. o = sp_521_sub_17(b, b, d);
  123579. if (o != 0)
  123580. sp_521_add_17(b, b, m);
  123581. ut = sp_521_num_bits_17(u);
  123582. do {
  123583. sp_521_rshift1_17(u, u);
  123584. sp_521_div2_mod_17(b, b, m);
  123585. ut--;
  123586. }
  123587. while (ut > 0 && (u[0] & 1) == 0);
  123588. }
  123589. else {
  123590. sp_521_sub_17(v, v, u);
  123591. o = sp_521_sub_17(d, d, b);
  123592. if (o != 0)
  123593. sp_521_add_17(d, d, m);
  123594. vt = sp_521_num_bits_17(v);
  123595. do {
  123596. sp_521_rshift1_17(v, v);
  123597. sp_521_div2_mod_17(d, d, m);
  123598. vt--;
  123599. }
  123600. while (vt > 0 && (v[0] & 1) == 0);
  123601. }
  123602. }
  123603. if (ut == 1)
  123604. XMEMCPY(r, b, sizeof(b));
  123605. else
  123606. XMEMCPY(r, d, sizeof(d));
  123607. return MP_OKAY;
  123608. }
  123609. #endif /* WOLFSSL_SP_SMALL */
  123610. /* Add point p1 into point p2. Handles p1 == p2 and result at infinity.
  123611. *
  123612. * p1 First point to add and holds result.
  123613. * p2 Second point to add.
  123614. * tmp Temporary storage for intermediate numbers.
  123615. */
  123616. static void sp_521_add_points_17(sp_point_521* p1, const sp_point_521* p2,
  123617. sp_digit* tmp)
  123618. {
  123619. sp_521_proj_point_add_17(p1, p1, p2, tmp);
  123620. if (sp_521_iszero_17(p1->z)) {
  123621. if (sp_521_iszero_17(p1->x) && sp_521_iszero_17(p1->y)) {
  123622. sp_521_proj_point_dbl_17(p1, p2, tmp);
  123623. }
  123624. else {
  123625. /* Y ordinate is not used from here - don't set. */
  123626. p1->x[0] = 0;
  123627. p1->x[1] = 0;
  123628. p1->x[2] = 0;
  123629. p1->x[3] = 0;
  123630. p1->x[4] = 0;
  123631. p1->x[5] = 0;
  123632. p1->x[6] = 0;
  123633. p1->x[7] = 0;
  123634. p1->x[8] = 0;
  123635. p1->x[9] = 0;
  123636. p1->x[10] = 0;
  123637. p1->x[11] = 0;
  123638. p1->x[12] = 0;
  123639. p1->x[13] = 0;
  123640. p1->x[14] = 0;
  123641. p1->x[15] = 0;
  123642. p1->x[16] = 0;
  123643. XMEMCPY(p1->z, p521_norm_mod, sizeof(p521_norm_mod));
  123644. }
  123645. }
  123646. }
  123647. /* Calculate the verification point: [e/s]G + [r/s]Q
  123648. *
  123649. * p1 Calculated point.
  123650. * p2 Public point and temporary.
  123651. * s Second part of signature as a number.
  123652. * u1 Temporary number.
  123653. * u2 Temporary number.
  123654. * heap Heap to use for allocation.
  123655. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  123656. */
  123657. static int sp_521_calc_vfy_point_17(sp_point_521* p1, sp_point_521* p2,
  123658. sp_digit* s, sp_digit* u1, sp_digit* u2, sp_digit* tmp, void* heap)
  123659. {
  123660. int err;
  123661. #ifndef WOLFSSL_SP_SMALL
  123662. err = sp_521_mod_inv_17(s, s, p521_order);
  123663. if (err == MP_OKAY)
  123664. #endif /* !WOLFSSL_SP_SMALL */
  123665. {
  123666. sp_521_mul_17(s, s, p521_norm_order);
  123667. err = sp_521_mod_17(s, s, p521_order);
  123668. }
  123669. if (err == MP_OKAY) {
  123670. sp_521_norm_17(s);
  123671. #ifdef WOLFSSL_SP_SMALL
  123672. {
  123673. sp_521_mont_inv_order_17(s, s, tmp);
  123674. sp_521_mont_mul_order_17(u1, u1, s);
  123675. sp_521_mont_mul_order_17(u2, u2, s);
  123676. }
  123677. #else
  123678. {
  123679. sp_521_mont_mul_order_17(u1, u1, s);
  123680. sp_521_mont_mul_order_17(u2, u2, s);
  123681. }
  123682. #endif /* WOLFSSL_SP_SMALL */
  123683. {
  123684. err = sp_521_ecc_mulmod_base_17(p1, u1, 0, 0, heap);
  123685. }
  123686. }
  123687. if ((err == MP_OKAY) && sp_521_iszero_17(p1->z)) {
  123688. p1->infinity = 1;
  123689. }
  123690. if (err == MP_OKAY) {
  123691. err = sp_521_ecc_mulmod_17(p2, p2, u2, 0, 0, heap);
  123692. }
  123693. if ((err == MP_OKAY) && sp_521_iszero_17(p2->z)) {
  123694. p2->infinity = 1;
  123695. }
  123696. if (err == MP_OKAY) {
  123697. sp_521_add_points_17(p1, p2, tmp);
  123698. }
  123699. return err;
  123700. }
  123701. #ifdef HAVE_ECC_VERIFY
  123702. /* Verify the signature values with the hash and public key.
  123703. * e = Truncate(hash, 521)
  123704. * u1 = e/s mod order
  123705. * u2 = r/s mod order
  123706. * r == (u1.G + u2.Q)->x mod order
  123707. * Optimization: Leave point in projective form.
  123708. * (x, y, 1) == (x' / z'*z', y' / z'*z'*z', z' / z')
  123709. * (r + n*order).z'.z' mod prime == (u1.G + u2.Q)->x'
  123710. * The hash is truncated to the first 521 bits.
  123711. *
  123712. * hash Hash to sign.
  123713. * hashLen Length of the hash data.
  123714. * rng Random number generator.
  123715. * priv Private part of key - scalar.
  123716. * rm First part of result as an mp_int.
  123717. * sm Sirst part of result as an mp_int.
  123718. * heap Heap to use for allocation.
  123719. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  123720. */
  123721. int sp_ecc_verify_521(const byte* hash, word32 hashLen, const mp_int* pX,
  123722. const mp_int* pY, const mp_int* pZ, const mp_int* rm, const mp_int* sm,
  123723. int* res, void* heap)
  123724. {
  123725. #ifdef WOLFSSL_SP_SMALL_STACK
  123726. sp_digit* u1 = NULL;
  123727. sp_point_521* p1 = NULL;
  123728. #else
  123729. sp_digit u1[18 * 17];
  123730. sp_point_521 p1[2];
  123731. #endif
  123732. sp_digit* u2 = NULL;
  123733. sp_digit* s = NULL;
  123734. sp_digit* tmp = NULL;
  123735. sp_point_521* p2 = NULL;
  123736. sp_digit carry;
  123737. sp_int32 c = 0;
  123738. int err = MP_OKAY;
  123739. #ifdef WOLFSSL_SP_SMALL_STACK
  123740. if (err == MP_OKAY) {
  123741. p1 = (sp_point_521*)XMALLOC(sizeof(sp_point_521) * 2, heap,
  123742. DYNAMIC_TYPE_ECC);
  123743. if (p1 == NULL)
  123744. err = MEMORY_E;
  123745. }
  123746. if (err == MP_OKAY) {
  123747. u1 = (sp_digit*)XMALLOC(sizeof(sp_digit) * 18 * 17, heap,
  123748. DYNAMIC_TYPE_ECC);
  123749. if (u1 == NULL)
  123750. err = MEMORY_E;
  123751. }
  123752. #endif
  123753. if (err == MP_OKAY) {
  123754. u2 = u1 + 2 * 17;
  123755. s = u1 + 4 * 17;
  123756. tmp = u1 + 6 * 17;
  123757. p2 = p1 + 1;
  123758. if (hashLen > 66U) {
  123759. hashLen = 66U;
  123760. }
  123761. sp_521_from_bin(u1, 17, hash, (int)hashLen);
  123762. sp_521_from_mp(u2, 17, rm);
  123763. sp_521_from_mp(s, 17, sm);
  123764. sp_521_from_mp(p2->x, 17, pX);
  123765. sp_521_from_mp(p2->y, 17, pY);
  123766. sp_521_from_mp(p2->z, 17, pZ);
  123767. if (hashLen == 66U) {
  123768. sp_521_rshift_17(u1, u1, 7);
  123769. }
  123770. err = sp_521_calc_vfy_point_17(p1, p2, s, u1, u2, tmp, heap);
  123771. }
  123772. if (err == MP_OKAY) {
  123773. /* (r + n*order).z'.z' mod prime == (u1.G + u2.Q)->x' */
  123774. /* Reload r and convert to Montgomery form. */
  123775. sp_521_from_mp(u2, 17, rm);
  123776. err = sp_521_mod_mul_norm_17(u2, u2, p521_mod);
  123777. }
  123778. if (err == MP_OKAY) {
  123779. /* u1 = r.z'.z' mod prime */
  123780. sp_521_mont_sqr_17(p1->z, p1->z, p521_mod, p521_mp_mod);
  123781. sp_521_mont_mul_17(u1, u2, p1->z, p521_mod, p521_mp_mod);
  123782. *res = (int)(sp_521_cmp_17(p1->x, u1) == 0);
  123783. if (*res == 0) {
  123784. /* Reload r and add order. */
  123785. sp_521_from_mp(u2, 17, rm);
  123786. carry = sp_521_add_17(u2, u2, p521_order);
  123787. /* Carry means result is greater than mod and is not valid. */
  123788. if (carry == 0) {
  123789. sp_521_norm_17(u2);
  123790. /* Compare with mod and if greater or equal then not valid. */
  123791. c = sp_521_cmp_17(u2, p521_mod);
  123792. }
  123793. }
  123794. if ((*res == 0) && (c < 0)) {
  123795. /* Convert to Montogomery form */
  123796. err = sp_521_mod_mul_norm_17(u2, u2, p521_mod);
  123797. if (err == MP_OKAY) {
  123798. /* u1 = (r + 1*order).z'.z' mod prime */
  123799. {
  123800. sp_521_mont_mul_17(u1, u2, p1->z, p521_mod, p521_mp_mod);
  123801. }
  123802. *res = (sp_521_cmp_17(p1->x, u1) == 0);
  123803. }
  123804. }
  123805. }
  123806. #ifdef WOLFSSL_SP_SMALL_STACK
  123807. if (u1 != NULL)
  123808. XFREE(u1, heap, DYNAMIC_TYPE_ECC);
  123809. if (p1 != NULL)
  123810. XFREE(p1, heap, DYNAMIC_TYPE_ECC);
  123811. #endif
  123812. return err;
  123813. }
  123814. #ifdef WOLFSSL_SP_NONBLOCK
  123815. typedef struct sp_ecc_verify_521_ctx {
  123816. int state;
  123817. union {
  123818. sp_521_ecc_mulmod_17_ctx mulmod_ctx;
  123819. sp_521_mont_inv_order_17_ctx mont_inv_order_ctx;
  123820. sp_521_proj_point_dbl_17_ctx dbl_ctx;
  123821. sp_521_proj_point_add_17_ctx add_ctx;
  123822. };
  123823. sp_digit u1[2*17];
  123824. sp_digit u2[2*17];
  123825. sp_digit s[2*17];
  123826. sp_digit tmp[2*17 * 6];
  123827. sp_point_521 p1;
  123828. sp_point_521 p2;
  123829. } sp_ecc_verify_521_ctx;
  123830. int sp_ecc_verify_521_nb(sp_ecc_ctx_t* sp_ctx, const byte* hash,
  123831. word32 hashLen, const mp_int* pX, const mp_int* pY, const mp_int* pZ,
  123832. const mp_int* rm, const mp_int* sm, int* res, void* heap)
  123833. {
  123834. int err = FP_WOULDBLOCK;
  123835. sp_ecc_verify_521_ctx* ctx = (sp_ecc_verify_521_ctx*)sp_ctx->data;
  123836. typedef char ctx_size_test[sizeof(sp_ecc_verify_521_ctx) >= sizeof(*sp_ctx) ? -1 : 1];
  123837. (void)sizeof(ctx_size_test);
  123838. switch (ctx->state) {
  123839. case 0: /* INIT */
  123840. if (hashLen > 66U) {
  123841. hashLen = 66U;
  123842. }
  123843. sp_521_from_bin(ctx->u1, 17, hash, (int)hashLen);
  123844. sp_521_from_mp(ctx->u2, 17, rm);
  123845. sp_521_from_mp(ctx->s, 17, sm);
  123846. sp_521_from_mp(ctx->p2.x, 17, pX);
  123847. sp_521_from_mp(ctx->p2.y, 17, pY);
  123848. sp_521_from_mp(ctx->p2.z, 17, pZ);
  123849. if (hashLen == 66U) {
  123850. sp_521_rshift_17(ctx->u1, ctx->u1, 7);
  123851. }
  123852. ctx->state = 1;
  123853. break;
  123854. case 1: /* NORMS0 */
  123855. sp_521_mul_17(ctx->s, ctx->s, p521_norm_order);
  123856. err = sp_521_mod_17(ctx->s, ctx->s, p521_order);
  123857. if (err == MP_OKAY)
  123858. ctx->state = 2;
  123859. break;
  123860. case 2: /* NORMS1 */
  123861. sp_521_norm_17(ctx->s);
  123862. XMEMSET(&ctx->mont_inv_order_ctx, 0, sizeof(ctx->mont_inv_order_ctx));
  123863. ctx->state = 3;
  123864. break;
  123865. case 3: /* NORMS2 */
  123866. err = sp_521_mont_inv_order_17_nb((sp_ecc_ctx_t*)&ctx->mont_inv_order_ctx, ctx->s, ctx->s, ctx->tmp);
  123867. if (err == MP_OKAY) {
  123868. ctx->state = 4;
  123869. }
  123870. break;
  123871. case 4: /* NORMS3 */
  123872. sp_521_mont_mul_order_17(ctx->u1, ctx->u1, ctx->s);
  123873. ctx->state = 5;
  123874. break;
  123875. case 5: /* NORMS4 */
  123876. sp_521_mont_mul_order_17(ctx->u2, ctx->u2, ctx->s);
  123877. XMEMSET(&ctx->mulmod_ctx, 0, sizeof(ctx->mulmod_ctx));
  123878. ctx->state = 6;
  123879. break;
  123880. case 6: /* MULBASE */
  123881. err = sp_521_ecc_mulmod_17_nb((sp_ecc_ctx_t*)&ctx->mulmod_ctx, &ctx->p1, &p521_base, ctx->u1, 0, 0, heap);
  123882. if (err == MP_OKAY) {
  123883. if (sp_521_iszero_17(ctx->p1.z)) {
  123884. ctx->p1.infinity = 1;
  123885. }
  123886. XMEMSET(&ctx->mulmod_ctx, 0, sizeof(ctx->mulmod_ctx));
  123887. ctx->state = 7;
  123888. }
  123889. break;
  123890. case 7: /* MULMOD */
  123891. err = sp_521_ecc_mulmod_17_nb((sp_ecc_ctx_t*)&ctx->mulmod_ctx, &ctx->p2, &ctx->p2, ctx->u2, 0, 0, heap);
  123892. if (err == MP_OKAY) {
  123893. if (sp_521_iszero_17(ctx->p2.z)) {
  123894. ctx->p2.infinity = 1;
  123895. }
  123896. XMEMSET(&ctx->add_ctx, 0, sizeof(ctx->add_ctx));
  123897. ctx->state = 8;
  123898. }
  123899. break;
  123900. case 8: /* ADD */
  123901. err = sp_521_proj_point_add_17_nb((sp_ecc_ctx_t*)&ctx->add_ctx, &ctx->p1, &ctx->p1, &ctx->p2, ctx->tmp);
  123902. if (err == MP_OKAY)
  123903. ctx->state = 9;
  123904. break;
  123905. case 9: /* MONT */
  123906. /* (r + n*order).z'.z' mod prime == (u1.G + u2.Q)->x' */
  123907. /* Reload r and convert to Montgomery form. */
  123908. sp_521_from_mp(ctx->u2, 17, rm);
  123909. err = sp_521_mod_mul_norm_17(ctx->u2, ctx->u2, p521_mod);
  123910. if (err == MP_OKAY)
  123911. ctx->state = 10;
  123912. break;
  123913. case 10: /* SQR */
  123914. /* u1 = r.z'.z' mod prime */
  123915. sp_521_mont_sqr_17(ctx->p1.z, ctx->p1.z, p521_mod, p521_mp_mod);
  123916. ctx->state = 11;
  123917. break;
  123918. case 11: /* MUL */
  123919. sp_521_mont_mul_17(ctx->u1, ctx->u2, ctx->p1.z, p521_mod, p521_mp_mod);
  123920. ctx->state = 12;
  123921. break;
  123922. case 12: /* RES */
  123923. {
  123924. sp_int32 c = 0;
  123925. err = MP_OKAY; /* math okay, now check result */
  123926. *res = (int)(sp_521_cmp_17(ctx->p1.x, ctx->u1) == 0);
  123927. if (*res == 0) {
  123928. sp_digit carry;
  123929. /* Reload r and add order. */
  123930. sp_521_from_mp(ctx->u2, 17, rm);
  123931. carry = sp_521_add_17(ctx->u2, ctx->u2, p521_order);
  123932. /* Carry means result is greater than mod and is not valid. */
  123933. if (carry == 0) {
  123934. sp_521_norm_17(ctx->u2);
  123935. /* Compare with mod and if greater or equal then not valid. */
  123936. c = sp_521_cmp_17(ctx->u2, p521_mod);
  123937. }
  123938. }
  123939. if ((*res == 0) && (c < 0)) {
  123940. /* Convert to Montogomery form */
  123941. err = sp_521_mod_mul_norm_17(ctx->u2, ctx->u2, p521_mod);
  123942. if (err == MP_OKAY) {
  123943. /* u1 = (r + 1*order).z'.z' mod prime */
  123944. sp_521_mont_mul_17(ctx->u1, ctx->u2, ctx->p1.z, p521_mod,
  123945. p521_mp_mod);
  123946. *res = (int)(sp_521_cmp_17(ctx->p1.x, ctx->u1) == 0);
  123947. }
  123948. }
  123949. break;
  123950. }
  123951. } /* switch */
  123952. if (err == MP_OKAY && ctx->state != 12) {
  123953. err = FP_WOULDBLOCK;
  123954. }
  123955. return err;
  123956. }
  123957. #endif /* WOLFSSL_SP_NONBLOCK */
  123958. #endif /* HAVE_ECC_VERIFY */
  123959. #ifdef HAVE_ECC_CHECK_KEY
  123960. /* Check that the x and y ordinates are a valid point on the curve.
  123961. *
  123962. * point EC point.
  123963. * heap Heap to use if dynamically allocating.
  123964. * returns MEMORY_E if dynamic memory allocation fails, MP_VAL if the point is
  123965. * not on the curve and MP_OKAY otherwise.
  123966. */
  123967. static int sp_521_ecc_is_point_17(const sp_point_521* point,
  123968. void* heap)
  123969. {
  123970. #ifdef WOLFSSL_SP_SMALL_STACK
  123971. sp_digit* t1 = NULL;
  123972. #else
  123973. sp_digit t1[17 * 4];
  123974. #endif
  123975. sp_digit* t2 = NULL;
  123976. int err = MP_OKAY;
  123977. #ifdef WOLFSSL_SP_SMALL_STACK
  123978. t1 = (sp_digit*)XMALLOC(sizeof(sp_digit) * 17 * 4, heap, DYNAMIC_TYPE_ECC);
  123979. if (t1 == NULL)
  123980. err = MEMORY_E;
  123981. #endif
  123982. (void)heap;
  123983. if (err == MP_OKAY) {
  123984. t2 = t1 + 2 * 17;
  123985. /* y^2 - x^3 - a.x = b */
  123986. sp_521_sqr_17(t1, point->y);
  123987. (void)sp_521_mod_17(t1, t1, p521_mod);
  123988. sp_521_sqr_17(t2, point->x);
  123989. (void)sp_521_mod_17(t2, t2, p521_mod);
  123990. sp_521_mul_17(t2, t2, point->x);
  123991. (void)sp_521_mod_17(t2, t2, p521_mod);
  123992. sp_521_mont_sub_17(t1, t1, t2, p521_mod);
  123993. /* y^2 - x^3 + 3.x = b, when a = -3 */
  123994. sp_521_mont_add_17(t1, t1, point->x, p521_mod);
  123995. sp_521_mont_add_17(t1, t1, point->x, p521_mod);
  123996. sp_521_mont_add_17(t1, t1, point->x, p521_mod);
  123997. if (sp_521_cmp_17(t1, p521_b) != 0) {
  123998. err = MP_VAL;
  123999. }
  124000. }
  124001. #ifdef WOLFSSL_SP_SMALL_STACK
  124002. if (t1 != NULL)
  124003. XFREE(t1, heap, DYNAMIC_TYPE_ECC);
  124004. #endif
  124005. return err;
  124006. }
  124007. /* Check that the x and y ordinates are a valid point on the curve.
  124008. *
  124009. * pX X ordinate of EC point.
  124010. * pY Y ordinate of EC point.
  124011. * returns MEMORY_E if dynamic memory allocation fails, MP_VAL if the point is
  124012. * not on the curve and MP_OKAY otherwise.
  124013. */
  124014. int sp_ecc_is_point_521(const mp_int* pX, const mp_int* pY)
  124015. {
  124016. #ifdef WOLFSSL_SP_SMALL_STACK
  124017. sp_point_521* pub = NULL;
  124018. #else
  124019. sp_point_521 pub[1];
  124020. #endif
  124021. const byte one[1] = { 1 };
  124022. int err = MP_OKAY;
  124023. #ifdef WOLFSSL_SP_SMALL_STACK
  124024. pub = (sp_point_521*)XMALLOC(sizeof(sp_point_521), NULL,
  124025. DYNAMIC_TYPE_ECC);
  124026. if (pub == NULL)
  124027. err = MEMORY_E;
  124028. #endif
  124029. if (err == MP_OKAY) {
  124030. sp_521_from_mp(pub->x, 17, pX);
  124031. sp_521_from_mp(pub->y, 17, pY);
  124032. sp_521_from_bin(pub->z, 17, one, (int)sizeof(one));
  124033. err = sp_521_ecc_is_point_17(pub, NULL);
  124034. }
  124035. #ifdef WOLFSSL_SP_SMALL_STACK
  124036. if (pub != NULL)
  124037. XFREE(pub, NULL, DYNAMIC_TYPE_ECC);
  124038. #endif
  124039. return err;
  124040. }
  124041. /* Check that the private scalar generates the EC point (px, py), the point is
  124042. * on the curve and the point has the correct order.
  124043. *
  124044. * pX X ordinate of EC point.
  124045. * pY Y ordinate of EC point.
  124046. * privm Private scalar that generates EC point.
  124047. * returns MEMORY_E if dynamic memory allocation fails, MP_VAL if the point is
  124048. * not on the curve, ECC_INF_E if the point does not have the correct order,
  124049. * ECC_PRIV_KEY_E when the private scalar doesn't generate the EC point and
  124050. * MP_OKAY otherwise.
  124051. */
  124052. int sp_ecc_check_key_521(const mp_int* pX, const mp_int* pY,
  124053. const mp_int* privm, void* heap)
  124054. {
  124055. #ifdef WOLFSSL_SP_SMALL_STACK
  124056. sp_digit* priv = NULL;
  124057. sp_point_521* pub = NULL;
  124058. #else
  124059. sp_digit priv[17];
  124060. sp_point_521 pub[2];
  124061. #endif
  124062. sp_point_521* p = NULL;
  124063. const byte one[1] = { 1 };
  124064. int err = MP_OKAY;
  124065. /* Quick check the lengs of public key ordinates and private key are in
  124066. * range. Proper check later.
  124067. */
  124068. if (((mp_count_bits(pX) > 521) ||
  124069. (mp_count_bits(pY) > 521) ||
  124070. ((privm != NULL) && (mp_count_bits(privm) > 521)))) {
  124071. err = ECC_OUT_OF_RANGE_E;
  124072. }
  124073. #ifdef WOLFSSL_SP_SMALL_STACK
  124074. if (err == MP_OKAY) {
  124075. pub = (sp_point_521*)XMALLOC(sizeof(sp_point_521) * 2, heap,
  124076. DYNAMIC_TYPE_ECC);
  124077. if (pub == NULL)
  124078. err = MEMORY_E;
  124079. }
  124080. if (err == MP_OKAY && privm) {
  124081. priv = (sp_digit*)XMALLOC(sizeof(sp_digit) * 17, heap,
  124082. DYNAMIC_TYPE_ECC);
  124083. if (priv == NULL)
  124084. err = MEMORY_E;
  124085. }
  124086. #endif
  124087. if (err == MP_OKAY) {
  124088. p = pub + 1;
  124089. sp_521_from_mp(pub->x, 17, pX);
  124090. sp_521_from_mp(pub->y, 17, pY);
  124091. sp_521_from_bin(pub->z, 17, one, (int)sizeof(one));
  124092. if (privm)
  124093. sp_521_from_mp(priv, 17, privm);
  124094. /* Check point at infinitiy. */
  124095. if ((sp_521_iszero_17(pub->x) != 0) &&
  124096. (sp_521_iszero_17(pub->y) != 0)) {
  124097. err = ECC_INF_E;
  124098. }
  124099. }
  124100. /* Check range of X and Y */
  124101. if ((err == MP_OKAY) &&
  124102. ((sp_521_cmp_17(pub->x, p521_mod) >= 0) ||
  124103. (sp_521_cmp_17(pub->y, p521_mod) >= 0))) {
  124104. err = ECC_OUT_OF_RANGE_E;
  124105. }
  124106. if (err == MP_OKAY) {
  124107. /* Check point is on curve */
  124108. err = sp_521_ecc_is_point_17(pub, heap);
  124109. }
  124110. if (err == MP_OKAY) {
  124111. /* Point * order = infinity */
  124112. err = sp_521_ecc_mulmod_17(p, pub, p521_order, 1, 1, heap);
  124113. }
  124114. /* Check result is infinity */
  124115. if ((err == MP_OKAY) && ((sp_521_iszero_17(p->x) == 0) ||
  124116. (sp_521_iszero_17(p->y) == 0))) {
  124117. err = ECC_INF_E;
  124118. }
  124119. if (privm) {
  124120. if (err == MP_OKAY) {
  124121. /* Base * private = point */
  124122. err = sp_521_ecc_mulmod_base_17(p, priv, 1, 1, heap);
  124123. }
  124124. /* Check result is public key */
  124125. if ((err == MP_OKAY) &&
  124126. ((sp_521_cmp_17(p->x, pub->x) != 0) ||
  124127. (sp_521_cmp_17(p->y, pub->y) != 0))) {
  124128. err = ECC_PRIV_KEY_E;
  124129. }
  124130. }
  124131. #ifdef WOLFSSL_SP_SMALL_STACK
  124132. if (pub != NULL)
  124133. XFREE(pub, heap, DYNAMIC_TYPE_ECC);
  124134. if (priv != NULL)
  124135. XFREE(priv, heap, DYNAMIC_TYPE_ECC);
  124136. #endif
  124137. return err;
  124138. }
  124139. #endif
  124140. #ifdef WOLFSSL_PUBLIC_ECC_ADD_DBL
  124141. /* Add two projective EC points together.
  124142. * (pX, pY, pZ) + (qX, qY, qZ) = (rX, rY, rZ)
  124143. *
  124144. * pX First EC point's X ordinate.
  124145. * pY First EC point's Y ordinate.
  124146. * pZ First EC point's Z ordinate.
  124147. * qX Second EC point's X ordinate.
  124148. * qY Second EC point's Y ordinate.
  124149. * qZ Second EC point's Z ordinate.
  124150. * rX Resultant EC point's X ordinate.
  124151. * rY Resultant EC point's Y ordinate.
  124152. * rZ Resultant EC point's Z ordinate.
  124153. * returns MEMORY_E if dynamic memory allocation fails and MP_OKAY otherwise.
  124154. */
  124155. int sp_ecc_proj_add_point_521(mp_int* pX, mp_int* pY, mp_int* pZ,
  124156. mp_int* qX, mp_int* qY, mp_int* qZ,
  124157. mp_int* rX, mp_int* rY, mp_int* rZ)
  124158. {
  124159. #ifdef WOLFSSL_SP_SMALL_STACK
  124160. sp_digit* tmp = NULL;
  124161. sp_point_521* p = NULL;
  124162. #else
  124163. sp_digit tmp[2 * 17 * 6];
  124164. sp_point_521 p[2];
  124165. #endif
  124166. sp_point_521* q = NULL;
  124167. int err = MP_OKAY;
  124168. #ifdef WOLFSSL_SP_SMALL_STACK
  124169. if (err == MP_OKAY) {
  124170. p = (sp_point_521*)XMALLOC(sizeof(sp_point_521) * 2, NULL,
  124171. DYNAMIC_TYPE_ECC);
  124172. if (p == NULL)
  124173. err = MEMORY_E;
  124174. }
  124175. if (err == MP_OKAY) {
  124176. tmp = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 17 * 6, NULL,
  124177. DYNAMIC_TYPE_ECC);
  124178. if (tmp == NULL) {
  124179. err = MEMORY_E;
  124180. }
  124181. }
  124182. #endif
  124183. if (err == MP_OKAY) {
  124184. q = p + 1;
  124185. sp_521_from_mp(p->x, 17, pX);
  124186. sp_521_from_mp(p->y, 17, pY);
  124187. sp_521_from_mp(p->z, 17, pZ);
  124188. sp_521_from_mp(q->x, 17, qX);
  124189. sp_521_from_mp(q->y, 17, qY);
  124190. sp_521_from_mp(q->z, 17, qZ);
  124191. p->infinity = sp_521_iszero_17(p->x) &
  124192. sp_521_iszero_17(p->y);
  124193. q->infinity = sp_521_iszero_17(q->x) &
  124194. sp_521_iszero_17(q->y);
  124195. sp_521_proj_point_add_17(p, p, q, tmp);
  124196. }
  124197. if (err == MP_OKAY) {
  124198. err = sp_521_to_mp(p->x, rX);
  124199. }
  124200. if (err == MP_OKAY) {
  124201. err = sp_521_to_mp(p->y, rY);
  124202. }
  124203. if (err == MP_OKAY) {
  124204. err = sp_521_to_mp(p->z, rZ);
  124205. }
  124206. #ifdef WOLFSSL_SP_SMALL_STACK
  124207. if (tmp != NULL)
  124208. XFREE(tmp, NULL, DYNAMIC_TYPE_ECC);
  124209. if (p != NULL)
  124210. XFREE(p, NULL, DYNAMIC_TYPE_ECC);
  124211. #endif
  124212. return err;
  124213. }
  124214. /* Double a projective EC point.
  124215. * (pX, pY, pZ) + (pX, pY, pZ) = (rX, rY, rZ)
  124216. *
  124217. * pX EC point's X ordinate.
  124218. * pY EC point's Y ordinate.
  124219. * pZ EC point's Z ordinate.
  124220. * rX Resultant EC point's X ordinate.
  124221. * rY Resultant EC point's Y ordinate.
  124222. * rZ Resultant EC point's Z ordinate.
  124223. * returns MEMORY_E if dynamic memory allocation fails and MP_OKAY otherwise.
  124224. */
  124225. int sp_ecc_proj_dbl_point_521(mp_int* pX, mp_int* pY, mp_int* pZ,
  124226. mp_int* rX, mp_int* rY, mp_int* rZ)
  124227. {
  124228. #ifdef WOLFSSL_SP_SMALL_STACK
  124229. sp_digit* tmp = NULL;
  124230. sp_point_521* p = NULL;
  124231. #else
  124232. sp_digit tmp[2 * 17 * 2];
  124233. sp_point_521 p[1];
  124234. #endif
  124235. int err = MP_OKAY;
  124236. #ifdef WOLFSSL_SP_SMALL_STACK
  124237. if (err == MP_OKAY) {
  124238. p = (sp_point_521*)XMALLOC(sizeof(sp_point_521), NULL,
  124239. DYNAMIC_TYPE_ECC);
  124240. if (p == NULL)
  124241. err = MEMORY_E;
  124242. }
  124243. if (err == MP_OKAY) {
  124244. tmp = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 17 * 2, NULL,
  124245. DYNAMIC_TYPE_ECC);
  124246. if (tmp == NULL)
  124247. err = MEMORY_E;
  124248. }
  124249. #endif
  124250. if (err == MP_OKAY) {
  124251. sp_521_from_mp(p->x, 17, pX);
  124252. sp_521_from_mp(p->y, 17, pY);
  124253. sp_521_from_mp(p->z, 17, pZ);
  124254. p->infinity = sp_521_iszero_17(p->x) &
  124255. sp_521_iszero_17(p->y);
  124256. sp_521_proj_point_dbl_17(p, p, tmp);
  124257. }
  124258. if (err == MP_OKAY) {
  124259. err = sp_521_to_mp(p->x, rX);
  124260. }
  124261. if (err == MP_OKAY) {
  124262. err = sp_521_to_mp(p->y, rY);
  124263. }
  124264. if (err == MP_OKAY) {
  124265. err = sp_521_to_mp(p->z, rZ);
  124266. }
  124267. #ifdef WOLFSSL_SP_SMALL_STACK
  124268. if (tmp != NULL)
  124269. XFREE(tmp, NULL, DYNAMIC_TYPE_ECC);
  124270. if (p != NULL)
  124271. XFREE(p, NULL, DYNAMIC_TYPE_ECC);
  124272. #endif
  124273. return err;
  124274. }
  124275. /* Map a projective EC point to affine in place.
  124276. * pZ will be one.
  124277. *
  124278. * pX EC point's X ordinate.
  124279. * pY EC point's Y ordinate.
  124280. * pZ EC point's Z ordinate.
  124281. * returns MEMORY_E if dynamic memory allocation fails and MP_OKAY otherwise.
  124282. */
  124283. int sp_ecc_map_521(mp_int* pX, mp_int* pY, mp_int* pZ)
  124284. {
  124285. #ifdef WOLFSSL_SP_SMALL_STACK
  124286. sp_digit* tmp = NULL;
  124287. sp_point_521* p = NULL;
  124288. #else
  124289. sp_digit tmp[2 * 17 * 5];
  124290. sp_point_521 p[1];
  124291. #endif
  124292. int err = MP_OKAY;
  124293. #ifdef WOLFSSL_SP_SMALL_STACK
  124294. if (err == MP_OKAY) {
  124295. p = (sp_point_521*)XMALLOC(sizeof(sp_point_521), NULL,
  124296. DYNAMIC_TYPE_ECC);
  124297. if (p == NULL)
  124298. err = MEMORY_E;
  124299. }
  124300. if (err == MP_OKAY) {
  124301. tmp = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 17 * 5, NULL,
  124302. DYNAMIC_TYPE_ECC);
  124303. if (tmp == NULL)
  124304. err = MEMORY_E;
  124305. }
  124306. #endif
  124307. if (err == MP_OKAY) {
  124308. sp_521_from_mp(p->x, 17, pX);
  124309. sp_521_from_mp(p->y, 17, pY);
  124310. sp_521_from_mp(p->z, 17, pZ);
  124311. p->infinity = sp_521_iszero_17(p->x) &
  124312. sp_521_iszero_17(p->y);
  124313. sp_521_map_17(p, p, tmp);
  124314. }
  124315. if (err == MP_OKAY) {
  124316. err = sp_521_to_mp(p->x, pX);
  124317. }
  124318. if (err == MP_OKAY) {
  124319. err = sp_521_to_mp(p->y, pY);
  124320. }
  124321. if (err == MP_OKAY) {
  124322. err = sp_521_to_mp(p->z, pZ);
  124323. }
  124324. #ifdef WOLFSSL_SP_SMALL_STACK
  124325. if (tmp != NULL)
  124326. XFREE(tmp, NULL, DYNAMIC_TYPE_ECC);
  124327. if (p != NULL)
  124328. XFREE(p, NULL, DYNAMIC_TYPE_ECC);
  124329. #endif
  124330. return err;
  124331. }
  124332. #endif /* WOLFSSL_PUBLIC_ECC_ADD_DBL */
  124333. #ifdef HAVE_COMP_KEY
  124334. /* Square root power for the P521 curve. */
  124335. static const uint32_t p521_sqrt_power[17] = {
  124336. 0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,
  124337. 0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,
  124338. 0x00000000,0x00000000,0x00000080
  124339. };
  124340. /* Find the square root of a number mod the prime of the curve.
  124341. *
  124342. * y The number to operate on and the result.
  124343. * returns MEMORY_E if dynamic memory allocation fails and MP_OKAY otherwise.
  124344. */
  124345. static int sp_521_mont_sqrt_17(sp_digit* y)
  124346. {
  124347. #ifdef WOLFSSL_SP_SMALL_STACK
  124348. sp_digit* t = NULL;
  124349. #else
  124350. sp_digit t[2 * 17];
  124351. #endif
  124352. int err = MP_OKAY;
  124353. #ifdef WOLFSSL_SP_SMALL_STACK
  124354. t = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 17, NULL, DYNAMIC_TYPE_ECC);
  124355. if (t == NULL)
  124356. err = MEMORY_E;
  124357. #endif
  124358. if (err == MP_OKAY) {
  124359. {
  124360. int i;
  124361. XMEMCPY(t, y, sizeof(sp_digit) * 17);
  124362. for (i=518; i>=0; i--) {
  124363. sp_521_mont_sqr_17(t, t, p521_mod, p521_mp_mod);
  124364. if (p521_sqrt_power[i / 32] & ((sp_digit)1 << (i % 32)))
  124365. sp_521_mont_mul_17(t, t, y, p521_mod, p521_mp_mod);
  124366. }
  124367. XMEMCPY(y, t, sizeof(sp_digit) * 17);
  124368. }
  124369. }
  124370. #ifdef WOLFSSL_SP_SMALL_STACK
  124371. if (t != NULL)
  124372. XFREE(t, NULL, DYNAMIC_TYPE_ECC);
  124373. #endif
  124374. return err;
  124375. }
  124376. /* Uncompress the point given the X ordinate.
  124377. *
  124378. * xm X ordinate.
  124379. * odd Whether the Y ordinate is odd.
  124380. * ym Calculated Y ordinate.
  124381. * returns MEMORY_E if dynamic memory allocation fails and MP_OKAY otherwise.
  124382. */
  124383. int sp_ecc_uncompress_521(mp_int* xm, int odd, mp_int* ym)
  124384. {
  124385. #ifdef WOLFSSL_SP_SMALL_STACK
  124386. sp_digit* x = NULL;
  124387. #else
  124388. sp_digit x[4 * 17];
  124389. #endif
  124390. sp_digit* y = NULL;
  124391. int err = MP_OKAY;
  124392. #ifdef WOLFSSL_SP_SMALL_STACK
  124393. x = (sp_digit*)XMALLOC(sizeof(sp_digit) * 4 * 17, NULL, DYNAMIC_TYPE_ECC);
  124394. if (x == NULL)
  124395. err = MEMORY_E;
  124396. #endif
  124397. if (err == MP_OKAY) {
  124398. y = x + 2 * 17;
  124399. sp_521_from_mp(x, 17, xm);
  124400. err = sp_521_mod_mul_norm_17(x, x, p521_mod);
  124401. }
  124402. if (err == MP_OKAY) {
  124403. /* y = x^3 */
  124404. {
  124405. sp_521_mont_sqr_17(y, x, p521_mod, p521_mp_mod);
  124406. sp_521_mont_mul_17(y, y, x, p521_mod, p521_mp_mod);
  124407. }
  124408. /* y = x^3 - 3x */
  124409. sp_521_mont_sub_17(y, y, x, p521_mod);
  124410. sp_521_mont_sub_17(y, y, x, p521_mod);
  124411. sp_521_mont_sub_17(y, y, x, p521_mod);
  124412. /* y = x^3 - 3x + b */
  124413. err = sp_521_mod_mul_norm_17(x, p521_b, p521_mod);
  124414. }
  124415. if (err == MP_OKAY) {
  124416. sp_521_mont_add_17(y, y, x, p521_mod);
  124417. /* y = sqrt(x^3 - 3x + b) */
  124418. err = sp_521_mont_sqrt_17(y);
  124419. }
  124420. if (err == MP_OKAY) {
  124421. XMEMSET(y + 17, 0, 17U * sizeof(sp_digit));
  124422. sp_521_mont_reduce_17(y, p521_mod, p521_mp_mod);
  124423. if ((((word32)y[0] ^ (word32)odd) & 1U) != 0U) {
  124424. sp_521_mont_sub_17(y, p521_mod, y, p521_mod);
  124425. }
  124426. err = sp_521_to_mp(y, ym);
  124427. }
  124428. #ifdef WOLFSSL_SP_SMALL_STACK
  124429. if (x != NULL)
  124430. XFREE(x, NULL, DYNAMIC_TYPE_ECC);
  124431. #endif
  124432. return err;
  124433. }
  124434. #endif
  124435. #endif /* WOLFSSL_SP_521 */
  124436. #ifdef WOLFCRYPT_HAVE_SAKKE
  124437. #ifdef WOLFSSL_SP_1024
  124438. /* Point structure to use. */
  124439. typedef struct sp_point_1024 {
  124440. /* X ordinate of point. */
  124441. sp_digit x[2 * 32];
  124442. /* Y ordinate of point. */
  124443. sp_digit y[2 * 32];
  124444. /* Z ordinate of point. */
  124445. sp_digit z[2 * 32];
  124446. /* Indicates point is at infinity. */
  124447. int infinity;
  124448. } sp_point_1024;
  124449. #ifndef WOLFSSL_SP_SMALL
  124450. /* Multiply a and b into r. (r = a * b)
  124451. *
  124452. * r A single precision integer.
  124453. * a A single precision integer.
  124454. * b A single precision integer.
  124455. */
  124456. static void sp_1024_mul_16(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p)
  124457. {
  124458. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  124459. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  124460. register const sp_digit* b asm ("r2") = (const sp_digit*)b_p;
  124461. __asm__ __volatile__ (
  124462. "sub sp, sp, #0x40\n\t"
  124463. /* A[0] * B[0] */
  124464. "ldr r11, [%[a]]\n\t"
  124465. "ldr r12, [%[b]]\n\t"
  124466. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  124467. "lsl r6, r11, #16\n\t"
  124468. "lsl r3, r12, #16\n\t"
  124469. "lsr r6, r6, #16\n\t"
  124470. "lsr r3, r3, #16\n\t"
  124471. "mul r3, r6, r3\n\t"
  124472. "lsr r7, r12, #16\n\t"
  124473. "mul r6, r7, r6\n\t"
  124474. "lsr r4, r6, #16\n\t"
  124475. "lsl r6, r6, #16\n\t"
  124476. "adds r3, r3, r6\n\t"
  124477. "adc r4, r4, #0\n\t"
  124478. "lsr r6, r11, #16\n\t"
  124479. "mul r7, r6, r7\n\t"
  124480. "add r4, r4, r7\n\t"
  124481. "lsl r7, r12, #16\n\t"
  124482. "lsr r7, r7, #16\n\t"
  124483. "mul r6, r7, r6\n\t"
  124484. "lsr r7, r6, #16\n\t"
  124485. "lsl r6, r6, #16\n\t"
  124486. "adds r3, r3, r6\n\t"
  124487. "adc r4, r4, r7\n\t"
  124488. "mov r5, #0\n\t"
  124489. #else
  124490. "umull r3, r4, r11, r12\n\t"
  124491. "mov r5, #0\n\t"
  124492. #endif
  124493. "str r3, [sp]\n\t"
  124494. /* A[0] * B[1] */
  124495. "ldr r9, [%[b], #4]\n\t"
  124496. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  124497. "lsl r6, r11, #16\n\t"
  124498. "lsl r7, r9, #16\n\t"
  124499. "lsr r6, r6, #16\n\t"
  124500. "lsr r7, r7, #16\n\t"
  124501. "mul r7, r6, r7\n\t"
  124502. "adds r4, r4, r7\n\t"
  124503. "adcs r5, r5, #0\n\t"
  124504. "mov r3, #0\n\t"
  124505. "adc r3, r3, #0\n\t"
  124506. "lsr r7, r9, #16\n\t"
  124507. "mul r6, r7, r6\n\t"
  124508. "lsr r7, r6, #16\n\t"
  124509. "lsl r6, r6, #16\n\t"
  124510. "adds r4, r4, r6\n\t"
  124511. "adcs r5, r5, r7\n\t"
  124512. "adc r3, r3, #0\n\t"
  124513. "lsr r6, r11, #16\n\t"
  124514. "lsr r7, r9, #16\n\t"
  124515. "mul r7, r6, r7\n\t"
  124516. "adds r5, r5, r7\n\t"
  124517. "adc r3, r3, #0\n\t"
  124518. "lsl r7, r9, #16\n\t"
  124519. "lsr r7, r7, #16\n\t"
  124520. "mul r6, r7, r6\n\t"
  124521. "lsr r7, r6, #16\n\t"
  124522. "lsl r6, r6, #16\n\t"
  124523. "adds r4, r4, r6\n\t"
  124524. "adcs r5, r5, r7\n\t"
  124525. "adc r3, r3, #0\n\t"
  124526. #else
  124527. "umull r6, r7, r11, r9\n\t"
  124528. "adds r4, r4, r6\n\t"
  124529. "adcs r5, r5, r7\n\t"
  124530. "mov r3, #0\n\t"
  124531. "adc r3, r3, #0\n\t"
  124532. #endif
  124533. /* A[1] * B[0] */
  124534. "ldr r8, [%[a], #4]\n\t"
  124535. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  124536. "lsl r6, r8, #16\n\t"
  124537. "lsl r7, r12, #16\n\t"
  124538. "lsr r6, r6, #16\n\t"
  124539. "lsr r7, r7, #16\n\t"
  124540. "mul r7, r6, r7\n\t"
  124541. "adds r4, r4, r7\n\t"
  124542. "adcs r5, r5, #0\n\t"
  124543. "adc r3, r3, #0\n\t"
  124544. "lsr r7, r12, #16\n\t"
  124545. "mul r6, r7, r6\n\t"
  124546. "lsr r7, r6, #16\n\t"
  124547. "lsl r6, r6, #16\n\t"
  124548. "adds r4, r4, r6\n\t"
  124549. "adcs r5, r5, r7\n\t"
  124550. "adc r3, r3, #0\n\t"
  124551. "lsr r6, r8, #16\n\t"
  124552. "lsr r7, r12, #16\n\t"
  124553. "mul r7, r6, r7\n\t"
  124554. "adds r5, r5, r7\n\t"
  124555. "adc r3, r3, #0\n\t"
  124556. "lsl r7, r12, #16\n\t"
  124557. "lsr r7, r7, #16\n\t"
  124558. "mul r6, r7, r6\n\t"
  124559. "lsr r7, r6, #16\n\t"
  124560. "lsl r6, r6, #16\n\t"
  124561. "adds r4, r4, r6\n\t"
  124562. "adcs r5, r5, r7\n\t"
  124563. "adc r3, r3, #0\n\t"
  124564. #else
  124565. "umull r6, r7, r8, r12\n\t"
  124566. "adds r4, r4, r6\n\t"
  124567. "adcs r5, r5, r7\n\t"
  124568. "adc r3, r3, #0\n\t"
  124569. #endif
  124570. "str r4, [sp, #4]\n\t"
  124571. /* A[2] * B[0] */
  124572. "ldr r8, [%[a], #8]\n\t"
  124573. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  124574. "lsl r6, r8, #16\n\t"
  124575. "lsl r7, r12, #16\n\t"
  124576. "lsr r6, r6, #16\n\t"
  124577. "lsr r7, r7, #16\n\t"
  124578. "mul r7, r6, r7\n\t"
  124579. "adds r5, r5, r7\n\t"
  124580. "adcs r3, r3, #0\n\t"
  124581. "mov r4, #0\n\t"
  124582. "adc r4, r4, #0\n\t"
  124583. "lsr r7, r12, #16\n\t"
  124584. "mul r6, r7, r6\n\t"
  124585. "lsr r7, r6, #16\n\t"
  124586. "lsl r6, r6, #16\n\t"
  124587. "adds r5, r5, r6\n\t"
  124588. "adcs r3, r3, r7\n\t"
  124589. "adc r4, r4, #0\n\t"
  124590. "lsr r6, r8, #16\n\t"
  124591. "lsr r7, r12, #16\n\t"
  124592. "mul r7, r6, r7\n\t"
  124593. "adds r3, r3, r7\n\t"
  124594. "adc r4, r4, #0\n\t"
  124595. "lsl r7, r12, #16\n\t"
  124596. "lsr r7, r7, #16\n\t"
  124597. "mul r6, r7, r6\n\t"
  124598. "lsr r7, r6, #16\n\t"
  124599. "lsl r6, r6, #16\n\t"
  124600. "adds r5, r5, r6\n\t"
  124601. "adcs r3, r3, r7\n\t"
  124602. "adc r4, r4, #0\n\t"
  124603. #else
  124604. "umull r6, r7, r8, r12\n\t"
  124605. "adds r5, r5, r6\n\t"
  124606. "adcs r3, r3, r7\n\t"
  124607. "mov r4, #0\n\t"
  124608. "adc r4, r4, #0\n\t"
  124609. #endif
  124610. /* A[1] * B[1] */
  124611. "ldr r11, [%[a], #4]\n\t"
  124612. "ldr r12, [%[b], #4]\n\t"
  124613. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  124614. "lsl r6, r11, #16\n\t"
  124615. "lsl r7, r12, #16\n\t"
  124616. "lsr r6, r6, #16\n\t"
  124617. "lsr r7, r7, #16\n\t"
  124618. "mul r7, r6, r7\n\t"
  124619. "adds r5, r5, r7\n\t"
  124620. "adcs r3, r3, #0\n\t"
  124621. "adc r4, r4, #0\n\t"
  124622. "lsr r7, r12, #16\n\t"
  124623. "mul r6, r7, r6\n\t"
  124624. "lsr r7, r6, #16\n\t"
  124625. "lsl r6, r6, #16\n\t"
  124626. "adds r5, r5, r6\n\t"
  124627. "adcs r3, r3, r7\n\t"
  124628. "adc r4, r4, #0\n\t"
  124629. "lsr r6, r11, #16\n\t"
  124630. "lsr r7, r12, #16\n\t"
  124631. "mul r7, r6, r7\n\t"
  124632. "adds r3, r3, r7\n\t"
  124633. "adc r4, r4, #0\n\t"
  124634. "lsl r7, r12, #16\n\t"
  124635. "lsr r7, r7, #16\n\t"
  124636. "mul r6, r7, r6\n\t"
  124637. "lsr r7, r6, #16\n\t"
  124638. "lsl r6, r6, #16\n\t"
  124639. "adds r5, r5, r6\n\t"
  124640. "adcs r3, r3, r7\n\t"
  124641. "adc r4, r4, #0\n\t"
  124642. #else
  124643. "umull r6, r7, r11, r12\n\t"
  124644. "adds r5, r5, r6\n\t"
  124645. "adcs r3, r3, r7\n\t"
  124646. "adc r4, r4, #0\n\t"
  124647. #endif
  124648. /* A[0] * B[2] */
  124649. "ldr r8, [%[a]]\n\t"
  124650. "ldr r9, [%[b], #8]\n\t"
  124651. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  124652. "lsl r6, r8, #16\n\t"
  124653. "lsl r7, r9, #16\n\t"
  124654. "lsr r6, r6, #16\n\t"
  124655. "lsr r7, r7, #16\n\t"
  124656. "mul r7, r6, r7\n\t"
  124657. "adds r5, r5, r7\n\t"
  124658. "adcs r3, r3, #0\n\t"
  124659. "adc r4, r4, #0\n\t"
  124660. "lsr r7, r9, #16\n\t"
  124661. "mul r6, r7, r6\n\t"
  124662. "lsr r7, r6, #16\n\t"
  124663. "lsl r6, r6, #16\n\t"
  124664. "adds r5, r5, r6\n\t"
  124665. "adcs r3, r3, r7\n\t"
  124666. "adc r4, r4, #0\n\t"
  124667. "lsr r6, r8, #16\n\t"
  124668. "lsr r7, r9, #16\n\t"
  124669. "mul r7, r6, r7\n\t"
  124670. "adds r3, r3, r7\n\t"
  124671. "adc r4, r4, #0\n\t"
  124672. "lsl r7, r9, #16\n\t"
  124673. "lsr r7, r7, #16\n\t"
  124674. "mul r6, r7, r6\n\t"
  124675. "lsr r7, r6, #16\n\t"
  124676. "lsl r6, r6, #16\n\t"
  124677. "adds r5, r5, r6\n\t"
  124678. "adcs r3, r3, r7\n\t"
  124679. "adc r4, r4, #0\n\t"
  124680. #else
  124681. "umull r6, r7, r8, r9\n\t"
  124682. "adds r5, r5, r6\n\t"
  124683. "adcs r3, r3, r7\n\t"
  124684. "adc r4, r4, #0\n\t"
  124685. #endif
  124686. "str r5, [sp, #8]\n\t"
  124687. /* A[0] * B[3] */
  124688. "ldr r9, [%[b], #12]\n\t"
  124689. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  124690. "lsl r6, r8, #16\n\t"
  124691. "lsl r7, r9, #16\n\t"
  124692. "lsr r6, r6, #16\n\t"
  124693. "lsr r7, r7, #16\n\t"
  124694. "mul r7, r6, r7\n\t"
  124695. "adds r3, r3, r7\n\t"
  124696. "adcs r4, r4, #0\n\t"
  124697. "mov r5, #0\n\t"
  124698. "adc r5, r5, #0\n\t"
  124699. "lsr r7, r9, #16\n\t"
  124700. "mul r6, r7, r6\n\t"
  124701. "lsr r7, r6, #16\n\t"
  124702. "lsl r6, r6, #16\n\t"
  124703. "adds r3, r3, r6\n\t"
  124704. "adcs r4, r4, r7\n\t"
  124705. "adc r5, r5, #0\n\t"
  124706. "lsr r6, r8, #16\n\t"
  124707. "lsr r7, r9, #16\n\t"
  124708. "mul r7, r6, r7\n\t"
  124709. "adds r4, r4, r7\n\t"
  124710. "adc r5, r5, #0\n\t"
  124711. "lsl r7, r9, #16\n\t"
  124712. "lsr r7, r7, #16\n\t"
  124713. "mul r6, r7, r6\n\t"
  124714. "lsr r7, r6, #16\n\t"
  124715. "lsl r6, r6, #16\n\t"
  124716. "adds r3, r3, r6\n\t"
  124717. "adcs r4, r4, r7\n\t"
  124718. "adc r5, r5, #0\n\t"
  124719. #else
  124720. "umull r6, r7, r8, r9\n\t"
  124721. "adds r3, r3, r6\n\t"
  124722. "adcs r4, r4, r7\n\t"
  124723. "mov r5, #0\n\t"
  124724. "adc r5, r5, #0\n\t"
  124725. #endif
  124726. /* A[1] * B[2] */
  124727. "ldr r9, [%[b], #8]\n\t"
  124728. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  124729. "lsl r6, r11, #16\n\t"
  124730. "lsl r7, r9, #16\n\t"
  124731. "lsr r6, r6, #16\n\t"
  124732. "lsr r7, r7, #16\n\t"
  124733. "mul r7, r6, r7\n\t"
  124734. "adds r3, r3, r7\n\t"
  124735. "adcs r4, r4, #0\n\t"
  124736. "adc r5, r5, #0\n\t"
  124737. "lsr r7, r9, #16\n\t"
  124738. "mul r6, r7, r6\n\t"
  124739. "lsr r7, r6, #16\n\t"
  124740. "lsl r6, r6, #16\n\t"
  124741. "adds r3, r3, r6\n\t"
  124742. "adcs r4, r4, r7\n\t"
  124743. "adc r5, r5, #0\n\t"
  124744. "lsr r6, r11, #16\n\t"
  124745. "lsr r7, r9, #16\n\t"
  124746. "mul r7, r6, r7\n\t"
  124747. "adds r4, r4, r7\n\t"
  124748. "adc r5, r5, #0\n\t"
  124749. "lsl r7, r9, #16\n\t"
  124750. "lsr r7, r7, #16\n\t"
  124751. "mul r6, r7, r6\n\t"
  124752. "lsr r7, r6, #16\n\t"
  124753. "lsl r6, r6, #16\n\t"
  124754. "adds r3, r3, r6\n\t"
  124755. "adcs r4, r4, r7\n\t"
  124756. "adc r5, r5, #0\n\t"
  124757. #else
  124758. "umull r6, r7, r11, r9\n\t"
  124759. "adds r3, r3, r6\n\t"
  124760. "adcs r4, r4, r7\n\t"
  124761. "adc r5, r5, #0\n\t"
  124762. #endif
  124763. /* A[2] * B[1] */
  124764. "ldr r8, [%[a], #8]\n\t"
  124765. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  124766. "lsl r6, r8, #16\n\t"
  124767. "lsl r7, r12, #16\n\t"
  124768. "lsr r6, r6, #16\n\t"
  124769. "lsr r7, r7, #16\n\t"
  124770. "mul r7, r6, r7\n\t"
  124771. "adds r3, r3, r7\n\t"
  124772. "adcs r4, r4, #0\n\t"
  124773. "adc r5, r5, #0\n\t"
  124774. "lsr r7, r12, #16\n\t"
  124775. "mul r6, r7, r6\n\t"
  124776. "lsr r7, r6, #16\n\t"
  124777. "lsl r6, r6, #16\n\t"
  124778. "adds r3, r3, r6\n\t"
  124779. "adcs r4, r4, r7\n\t"
  124780. "adc r5, r5, #0\n\t"
  124781. "lsr r6, r8, #16\n\t"
  124782. "lsr r7, r12, #16\n\t"
  124783. "mul r7, r6, r7\n\t"
  124784. "adds r4, r4, r7\n\t"
  124785. "adc r5, r5, #0\n\t"
  124786. "lsl r7, r12, #16\n\t"
  124787. "lsr r7, r7, #16\n\t"
  124788. "mul r6, r7, r6\n\t"
  124789. "lsr r7, r6, #16\n\t"
  124790. "lsl r6, r6, #16\n\t"
  124791. "adds r3, r3, r6\n\t"
  124792. "adcs r4, r4, r7\n\t"
  124793. "adc r5, r5, #0\n\t"
  124794. #else
  124795. "umull r6, r7, r8, r12\n\t"
  124796. "adds r3, r3, r6\n\t"
  124797. "adcs r4, r4, r7\n\t"
  124798. "adc r5, r5, #0\n\t"
  124799. #endif
  124800. /* A[3] * B[0] */
  124801. "ldr r8, [%[a], #12]\n\t"
  124802. "ldr r9, [%[b]]\n\t"
  124803. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  124804. "lsl r6, r8, #16\n\t"
  124805. "lsl r7, r9, #16\n\t"
  124806. "lsr r6, r6, #16\n\t"
  124807. "lsr r7, r7, #16\n\t"
  124808. "mul r7, r6, r7\n\t"
  124809. "adds r3, r3, r7\n\t"
  124810. "adcs r4, r4, #0\n\t"
  124811. "adc r5, r5, #0\n\t"
  124812. "lsr r7, r9, #16\n\t"
  124813. "mul r6, r7, r6\n\t"
  124814. "lsr r7, r6, #16\n\t"
  124815. "lsl r6, r6, #16\n\t"
  124816. "adds r3, r3, r6\n\t"
  124817. "adcs r4, r4, r7\n\t"
  124818. "adc r5, r5, #0\n\t"
  124819. "lsr r6, r8, #16\n\t"
  124820. "lsr r7, r9, #16\n\t"
  124821. "mul r7, r6, r7\n\t"
  124822. "adds r4, r4, r7\n\t"
  124823. "adc r5, r5, #0\n\t"
  124824. "lsl r7, r9, #16\n\t"
  124825. "lsr r7, r7, #16\n\t"
  124826. "mul r6, r7, r6\n\t"
  124827. "lsr r7, r6, #16\n\t"
  124828. "lsl r6, r6, #16\n\t"
  124829. "adds r3, r3, r6\n\t"
  124830. "adcs r4, r4, r7\n\t"
  124831. "adc r5, r5, #0\n\t"
  124832. #else
  124833. "umull r6, r7, r8, r9\n\t"
  124834. "adds r3, r3, r6\n\t"
  124835. "adcs r4, r4, r7\n\t"
  124836. "adc r5, r5, #0\n\t"
  124837. #endif
  124838. "str r3, [sp, #12]\n\t"
  124839. /* A[4] * B[0] */
  124840. "ldr r8, [%[a], #16]\n\t"
  124841. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  124842. "lsl r6, r8, #16\n\t"
  124843. "lsl r7, r9, #16\n\t"
  124844. "lsr r6, r6, #16\n\t"
  124845. "lsr r7, r7, #16\n\t"
  124846. "mul r7, r6, r7\n\t"
  124847. "adds r4, r4, r7\n\t"
  124848. "adcs r5, r5, #0\n\t"
  124849. "mov r3, #0\n\t"
  124850. "adc r3, r3, #0\n\t"
  124851. "lsr r7, r9, #16\n\t"
  124852. "mul r6, r7, r6\n\t"
  124853. "lsr r7, r6, #16\n\t"
  124854. "lsl r6, r6, #16\n\t"
  124855. "adds r4, r4, r6\n\t"
  124856. "adcs r5, r5, r7\n\t"
  124857. "adc r3, r3, #0\n\t"
  124858. "lsr r6, r8, #16\n\t"
  124859. "lsr r7, r9, #16\n\t"
  124860. "mul r7, r6, r7\n\t"
  124861. "adds r5, r5, r7\n\t"
  124862. "adc r3, r3, #0\n\t"
  124863. "lsl r7, r9, #16\n\t"
  124864. "lsr r7, r7, #16\n\t"
  124865. "mul r6, r7, r6\n\t"
  124866. "lsr r7, r6, #16\n\t"
  124867. "lsl r6, r6, #16\n\t"
  124868. "adds r4, r4, r6\n\t"
  124869. "adcs r5, r5, r7\n\t"
  124870. "adc r3, r3, #0\n\t"
  124871. #else
  124872. "umull r6, r7, r8, r9\n\t"
  124873. "adds r4, r4, r6\n\t"
  124874. "adcs r5, r5, r7\n\t"
  124875. "mov r3, #0\n\t"
  124876. "adc r3, r3, #0\n\t"
  124877. #endif
  124878. /* A[3] * B[1] */
  124879. "ldr r8, [%[a], #12]\n\t"
  124880. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  124881. "lsl r6, r8, #16\n\t"
  124882. "lsl r7, r12, #16\n\t"
  124883. "lsr r6, r6, #16\n\t"
  124884. "lsr r7, r7, #16\n\t"
  124885. "mul r7, r6, r7\n\t"
  124886. "adds r4, r4, r7\n\t"
  124887. "adcs r5, r5, #0\n\t"
  124888. "adc r3, r3, #0\n\t"
  124889. "lsr r7, r12, #16\n\t"
  124890. "mul r6, r7, r6\n\t"
  124891. "lsr r7, r6, #16\n\t"
  124892. "lsl r6, r6, #16\n\t"
  124893. "adds r4, r4, r6\n\t"
  124894. "adcs r5, r5, r7\n\t"
  124895. "adc r3, r3, #0\n\t"
  124896. "lsr r6, r8, #16\n\t"
  124897. "lsr r7, r12, #16\n\t"
  124898. "mul r7, r6, r7\n\t"
  124899. "adds r5, r5, r7\n\t"
  124900. "adc r3, r3, #0\n\t"
  124901. "lsl r7, r12, #16\n\t"
  124902. "lsr r7, r7, #16\n\t"
  124903. "mul r6, r7, r6\n\t"
  124904. "lsr r7, r6, #16\n\t"
  124905. "lsl r6, r6, #16\n\t"
  124906. "adds r4, r4, r6\n\t"
  124907. "adcs r5, r5, r7\n\t"
  124908. "adc r3, r3, #0\n\t"
  124909. #else
  124910. "umull r6, r7, r8, r12\n\t"
  124911. "adds r4, r4, r6\n\t"
  124912. "adcs r5, r5, r7\n\t"
  124913. "adc r3, r3, #0\n\t"
  124914. #endif
  124915. /* A[2] * B[2] */
  124916. "ldr r11, [%[a], #8]\n\t"
  124917. "ldr r12, [%[b], #8]\n\t"
  124918. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  124919. "lsl r6, r11, #16\n\t"
  124920. "lsl r7, r12, #16\n\t"
  124921. "lsr r6, r6, #16\n\t"
  124922. "lsr r7, r7, #16\n\t"
  124923. "mul r7, r6, r7\n\t"
  124924. "adds r4, r4, r7\n\t"
  124925. "adcs r5, r5, #0\n\t"
  124926. "adc r3, r3, #0\n\t"
  124927. "lsr r7, r12, #16\n\t"
  124928. "mul r6, r7, r6\n\t"
  124929. "lsr r7, r6, #16\n\t"
  124930. "lsl r6, r6, #16\n\t"
  124931. "adds r4, r4, r6\n\t"
  124932. "adcs r5, r5, r7\n\t"
  124933. "adc r3, r3, #0\n\t"
  124934. "lsr r6, r11, #16\n\t"
  124935. "lsr r7, r12, #16\n\t"
  124936. "mul r7, r6, r7\n\t"
  124937. "adds r5, r5, r7\n\t"
  124938. "adc r3, r3, #0\n\t"
  124939. "lsl r7, r12, #16\n\t"
  124940. "lsr r7, r7, #16\n\t"
  124941. "mul r6, r7, r6\n\t"
  124942. "lsr r7, r6, #16\n\t"
  124943. "lsl r6, r6, #16\n\t"
  124944. "adds r4, r4, r6\n\t"
  124945. "adcs r5, r5, r7\n\t"
  124946. "adc r3, r3, #0\n\t"
  124947. #else
  124948. "umull r6, r7, r11, r12\n\t"
  124949. "adds r4, r4, r6\n\t"
  124950. "adcs r5, r5, r7\n\t"
  124951. "adc r3, r3, #0\n\t"
  124952. #endif
  124953. /* A[1] * B[3] */
  124954. "ldr r8, [%[a], #4]\n\t"
  124955. "ldr r9, [%[b], #12]\n\t"
  124956. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  124957. "lsl r6, r8, #16\n\t"
  124958. "lsl r7, r9, #16\n\t"
  124959. "lsr r6, r6, #16\n\t"
  124960. "lsr r7, r7, #16\n\t"
  124961. "mul r7, r6, r7\n\t"
  124962. "adds r4, r4, r7\n\t"
  124963. "adcs r5, r5, #0\n\t"
  124964. "adc r3, r3, #0\n\t"
  124965. "lsr r7, r9, #16\n\t"
  124966. "mul r6, r7, r6\n\t"
  124967. "lsr r7, r6, #16\n\t"
  124968. "lsl r6, r6, #16\n\t"
  124969. "adds r4, r4, r6\n\t"
  124970. "adcs r5, r5, r7\n\t"
  124971. "adc r3, r3, #0\n\t"
  124972. "lsr r6, r8, #16\n\t"
  124973. "lsr r7, r9, #16\n\t"
  124974. "mul r7, r6, r7\n\t"
  124975. "adds r5, r5, r7\n\t"
  124976. "adc r3, r3, #0\n\t"
  124977. "lsl r7, r9, #16\n\t"
  124978. "lsr r7, r7, #16\n\t"
  124979. "mul r6, r7, r6\n\t"
  124980. "lsr r7, r6, #16\n\t"
  124981. "lsl r6, r6, #16\n\t"
  124982. "adds r4, r4, r6\n\t"
  124983. "adcs r5, r5, r7\n\t"
  124984. "adc r3, r3, #0\n\t"
  124985. #else
  124986. "umull r6, r7, r8, r9\n\t"
  124987. "adds r4, r4, r6\n\t"
  124988. "adcs r5, r5, r7\n\t"
  124989. "adc r3, r3, #0\n\t"
  124990. #endif
  124991. /* A[0] * B[4] */
  124992. "ldr r8, [%[a]]\n\t"
  124993. "ldr r9, [%[b], #16]\n\t"
  124994. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  124995. "lsl r6, r8, #16\n\t"
  124996. "lsl r7, r9, #16\n\t"
  124997. "lsr r6, r6, #16\n\t"
  124998. "lsr r7, r7, #16\n\t"
  124999. "mul r7, r6, r7\n\t"
  125000. "adds r4, r4, r7\n\t"
  125001. "adcs r5, r5, #0\n\t"
  125002. "adc r3, r3, #0\n\t"
  125003. "lsr r7, r9, #16\n\t"
  125004. "mul r6, r7, r6\n\t"
  125005. "lsr r7, r6, #16\n\t"
  125006. "lsl r6, r6, #16\n\t"
  125007. "adds r4, r4, r6\n\t"
  125008. "adcs r5, r5, r7\n\t"
  125009. "adc r3, r3, #0\n\t"
  125010. "lsr r6, r8, #16\n\t"
  125011. "lsr r7, r9, #16\n\t"
  125012. "mul r7, r6, r7\n\t"
  125013. "adds r5, r5, r7\n\t"
  125014. "adc r3, r3, #0\n\t"
  125015. "lsl r7, r9, #16\n\t"
  125016. "lsr r7, r7, #16\n\t"
  125017. "mul r6, r7, r6\n\t"
  125018. "lsr r7, r6, #16\n\t"
  125019. "lsl r6, r6, #16\n\t"
  125020. "adds r4, r4, r6\n\t"
  125021. "adcs r5, r5, r7\n\t"
  125022. "adc r3, r3, #0\n\t"
  125023. #else
  125024. "umull r6, r7, r8, r9\n\t"
  125025. "adds r4, r4, r6\n\t"
  125026. "adcs r5, r5, r7\n\t"
  125027. "adc r3, r3, #0\n\t"
  125028. #endif
  125029. "str r4, [sp, #16]\n\t"
  125030. /* A[0] * B[5] */
  125031. "ldr r9, [%[b], #20]\n\t"
  125032. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  125033. "lsl r6, r8, #16\n\t"
  125034. "lsl r7, r9, #16\n\t"
  125035. "lsr r6, r6, #16\n\t"
  125036. "lsr r7, r7, #16\n\t"
  125037. "mul r7, r6, r7\n\t"
  125038. "adds r5, r5, r7\n\t"
  125039. "adcs r3, r3, #0\n\t"
  125040. "mov r4, #0\n\t"
  125041. "adc r4, r4, #0\n\t"
  125042. "lsr r7, r9, #16\n\t"
  125043. "mul r6, r7, r6\n\t"
  125044. "lsr r7, r6, #16\n\t"
  125045. "lsl r6, r6, #16\n\t"
  125046. "adds r5, r5, r6\n\t"
  125047. "adcs r3, r3, r7\n\t"
  125048. "adc r4, r4, #0\n\t"
  125049. "lsr r6, r8, #16\n\t"
  125050. "lsr r7, r9, #16\n\t"
  125051. "mul r7, r6, r7\n\t"
  125052. "adds r3, r3, r7\n\t"
  125053. "adc r4, r4, #0\n\t"
  125054. "lsl r7, r9, #16\n\t"
  125055. "lsr r7, r7, #16\n\t"
  125056. "mul r6, r7, r6\n\t"
  125057. "lsr r7, r6, #16\n\t"
  125058. "lsl r6, r6, #16\n\t"
  125059. "adds r5, r5, r6\n\t"
  125060. "adcs r3, r3, r7\n\t"
  125061. "adc r4, r4, #0\n\t"
  125062. #else
  125063. "umull r6, r7, r8, r9\n\t"
  125064. "adds r5, r5, r6\n\t"
  125065. "adcs r3, r3, r7\n\t"
  125066. "mov r4, #0\n\t"
  125067. "adc r4, r4, #0\n\t"
  125068. #endif
  125069. /* A[1] * B[4] */
  125070. "ldr r8, [%[a], #4]\n\t"
  125071. "ldr r9, [%[b], #16]\n\t"
  125072. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  125073. "lsl r6, r8, #16\n\t"
  125074. "lsl r7, r9, #16\n\t"
  125075. "lsr r6, r6, #16\n\t"
  125076. "lsr r7, r7, #16\n\t"
  125077. "mul r7, r6, r7\n\t"
  125078. "adds r5, r5, r7\n\t"
  125079. "adcs r3, r3, #0\n\t"
  125080. "adc r4, r4, #0\n\t"
  125081. "lsr r7, r9, #16\n\t"
  125082. "mul r6, r7, r6\n\t"
  125083. "lsr r7, r6, #16\n\t"
  125084. "lsl r6, r6, #16\n\t"
  125085. "adds r5, r5, r6\n\t"
  125086. "adcs r3, r3, r7\n\t"
  125087. "adc r4, r4, #0\n\t"
  125088. "lsr r6, r8, #16\n\t"
  125089. "lsr r7, r9, #16\n\t"
  125090. "mul r7, r6, r7\n\t"
  125091. "adds r3, r3, r7\n\t"
  125092. "adc r4, r4, #0\n\t"
  125093. "lsl r7, r9, #16\n\t"
  125094. "lsr r7, r7, #16\n\t"
  125095. "mul r6, r7, r6\n\t"
  125096. "lsr r7, r6, #16\n\t"
  125097. "lsl r6, r6, #16\n\t"
  125098. "adds r5, r5, r6\n\t"
  125099. "adcs r3, r3, r7\n\t"
  125100. "adc r4, r4, #0\n\t"
  125101. #else
  125102. "umull r6, r7, r8, r9\n\t"
  125103. "adds r5, r5, r6\n\t"
  125104. "adcs r3, r3, r7\n\t"
  125105. "adc r4, r4, #0\n\t"
  125106. #endif
  125107. /* A[2] * B[3] */
  125108. "ldr r9, [%[b], #12]\n\t"
  125109. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  125110. "lsl r6, r11, #16\n\t"
  125111. "lsl r7, r9, #16\n\t"
  125112. "lsr r6, r6, #16\n\t"
  125113. "lsr r7, r7, #16\n\t"
  125114. "mul r7, r6, r7\n\t"
  125115. "adds r5, r5, r7\n\t"
  125116. "adcs r3, r3, #0\n\t"
  125117. "adc r4, r4, #0\n\t"
  125118. "lsr r7, r9, #16\n\t"
  125119. "mul r6, r7, r6\n\t"
  125120. "lsr r7, r6, #16\n\t"
  125121. "lsl r6, r6, #16\n\t"
  125122. "adds r5, r5, r6\n\t"
  125123. "adcs r3, r3, r7\n\t"
  125124. "adc r4, r4, #0\n\t"
  125125. "lsr r6, r11, #16\n\t"
  125126. "lsr r7, r9, #16\n\t"
  125127. "mul r7, r6, r7\n\t"
  125128. "adds r3, r3, r7\n\t"
  125129. "adc r4, r4, #0\n\t"
  125130. "lsl r7, r9, #16\n\t"
  125131. "lsr r7, r7, #16\n\t"
  125132. "mul r6, r7, r6\n\t"
  125133. "lsr r7, r6, #16\n\t"
  125134. "lsl r6, r6, #16\n\t"
  125135. "adds r5, r5, r6\n\t"
  125136. "adcs r3, r3, r7\n\t"
  125137. "adc r4, r4, #0\n\t"
  125138. #else
  125139. "umull r6, r7, r11, r9\n\t"
  125140. "adds r5, r5, r6\n\t"
  125141. "adcs r3, r3, r7\n\t"
  125142. "adc r4, r4, #0\n\t"
  125143. #endif
  125144. /* A[3] * B[2] */
  125145. "ldr r8, [%[a], #12]\n\t"
  125146. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  125147. "lsl r6, r8, #16\n\t"
  125148. "lsl r7, r12, #16\n\t"
  125149. "lsr r6, r6, #16\n\t"
  125150. "lsr r7, r7, #16\n\t"
  125151. "mul r7, r6, r7\n\t"
  125152. "adds r5, r5, r7\n\t"
  125153. "adcs r3, r3, #0\n\t"
  125154. "adc r4, r4, #0\n\t"
  125155. "lsr r7, r12, #16\n\t"
  125156. "mul r6, r7, r6\n\t"
  125157. "lsr r7, r6, #16\n\t"
  125158. "lsl r6, r6, #16\n\t"
  125159. "adds r5, r5, r6\n\t"
  125160. "adcs r3, r3, r7\n\t"
  125161. "adc r4, r4, #0\n\t"
  125162. "lsr r6, r8, #16\n\t"
  125163. "lsr r7, r12, #16\n\t"
  125164. "mul r7, r6, r7\n\t"
  125165. "adds r3, r3, r7\n\t"
  125166. "adc r4, r4, #0\n\t"
  125167. "lsl r7, r12, #16\n\t"
  125168. "lsr r7, r7, #16\n\t"
  125169. "mul r6, r7, r6\n\t"
  125170. "lsr r7, r6, #16\n\t"
  125171. "lsl r6, r6, #16\n\t"
  125172. "adds r5, r5, r6\n\t"
  125173. "adcs r3, r3, r7\n\t"
  125174. "adc r4, r4, #0\n\t"
  125175. #else
  125176. "umull r6, r7, r8, r12\n\t"
  125177. "adds r5, r5, r6\n\t"
  125178. "adcs r3, r3, r7\n\t"
  125179. "adc r4, r4, #0\n\t"
  125180. #endif
  125181. /* A[4] * B[1] */
  125182. "ldr r8, [%[a], #16]\n\t"
  125183. "ldr r9, [%[b], #4]\n\t"
  125184. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  125185. "lsl r6, r8, #16\n\t"
  125186. "lsl r7, r9, #16\n\t"
  125187. "lsr r6, r6, #16\n\t"
  125188. "lsr r7, r7, #16\n\t"
  125189. "mul r7, r6, r7\n\t"
  125190. "adds r5, r5, r7\n\t"
  125191. "adcs r3, r3, #0\n\t"
  125192. "adc r4, r4, #0\n\t"
  125193. "lsr r7, r9, #16\n\t"
  125194. "mul r6, r7, r6\n\t"
  125195. "lsr r7, r6, #16\n\t"
  125196. "lsl r6, r6, #16\n\t"
  125197. "adds r5, r5, r6\n\t"
  125198. "adcs r3, r3, r7\n\t"
  125199. "adc r4, r4, #0\n\t"
  125200. "lsr r6, r8, #16\n\t"
  125201. "lsr r7, r9, #16\n\t"
  125202. "mul r7, r6, r7\n\t"
  125203. "adds r3, r3, r7\n\t"
  125204. "adc r4, r4, #0\n\t"
  125205. "lsl r7, r9, #16\n\t"
  125206. "lsr r7, r7, #16\n\t"
  125207. "mul r6, r7, r6\n\t"
  125208. "lsr r7, r6, #16\n\t"
  125209. "lsl r6, r6, #16\n\t"
  125210. "adds r5, r5, r6\n\t"
  125211. "adcs r3, r3, r7\n\t"
  125212. "adc r4, r4, #0\n\t"
  125213. #else
  125214. "umull r6, r7, r8, r9\n\t"
  125215. "adds r5, r5, r6\n\t"
  125216. "adcs r3, r3, r7\n\t"
  125217. "adc r4, r4, #0\n\t"
  125218. #endif
  125219. /* A[5] * B[0] */
  125220. "ldr r8, [%[a], #20]\n\t"
  125221. "ldr r9, [%[b]]\n\t"
  125222. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  125223. "lsl r6, r8, #16\n\t"
  125224. "lsl r7, r9, #16\n\t"
  125225. "lsr r6, r6, #16\n\t"
  125226. "lsr r7, r7, #16\n\t"
  125227. "mul r7, r6, r7\n\t"
  125228. "adds r5, r5, r7\n\t"
  125229. "adcs r3, r3, #0\n\t"
  125230. "adc r4, r4, #0\n\t"
  125231. "lsr r7, r9, #16\n\t"
  125232. "mul r6, r7, r6\n\t"
  125233. "lsr r7, r6, #16\n\t"
  125234. "lsl r6, r6, #16\n\t"
  125235. "adds r5, r5, r6\n\t"
  125236. "adcs r3, r3, r7\n\t"
  125237. "adc r4, r4, #0\n\t"
  125238. "lsr r6, r8, #16\n\t"
  125239. "lsr r7, r9, #16\n\t"
  125240. "mul r7, r6, r7\n\t"
  125241. "adds r3, r3, r7\n\t"
  125242. "adc r4, r4, #0\n\t"
  125243. "lsl r7, r9, #16\n\t"
  125244. "lsr r7, r7, #16\n\t"
  125245. "mul r6, r7, r6\n\t"
  125246. "lsr r7, r6, #16\n\t"
  125247. "lsl r6, r6, #16\n\t"
  125248. "adds r5, r5, r6\n\t"
  125249. "adcs r3, r3, r7\n\t"
  125250. "adc r4, r4, #0\n\t"
  125251. #else
  125252. "umull r6, r7, r8, r9\n\t"
  125253. "adds r5, r5, r6\n\t"
  125254. "adcs r3, r3, r7\n\t"
  125255. "adc r4, r4, #0\n\t"
  125256. #endif
  125257. "str r5, [sp, #20]\n\t"
  125258. /* A[6] * B[0] */
  125259. "ldr r8, [%[a], #24]\n\t"
  125260. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  125261. "lsl r6, r8, #16\n\t"
  125262. "lsl r7, r9, #16\n\t"
  125263. "lsr r6, r6, #16\n\t"
  125264. "lsr r7, r7, #16\n\t"
  125265. "mul r7, r6, r7\n\t"
  125266. "adds r3, r3, r7\n\t"
  125267. "adcs r4, r4, #0\n\t"
  125268. "mov r5, #0\n\t"
  125269. "adc r5, r5, #0\n\t"
  125270. "lsr r7, r9, #16\n\t"
  125271. "mul r6, r7, r6\n\t"
  125272. "lsr r7, r6, #16\n\t"
  125273. "lsl r6, r6, #16\n\t"
  125274. "adds r3, r3, r6\n\t"
  125275. "adcs r4, r4, r7\n\t"
  125276. "adc r5, r5, #0\n\t"
  125277. "lsr r6, r8, #16\n\t"
  125278. "lsr r7, r9, #16\n\t"
  125279. "mul r7, r6, r7\n\t"
  125280. "adds r4, r4, r7\n\t"
  125281. "adc r5, r5, #0\n\t"
  125282. "lsl r7, r9, #16\n\t"
  125283. "lsr r7, r7, #16\n\t"
  125284. "mul r6, r7, r6\n\t"
  125285. "lsr r7, r6, #16\n\t"
  125286. "lsl r6, r6, #16\n\t"
  125287. "adds r3, r3, r6\n\t"
  125288. "adcs r4, r4, r7\n\t"
  125289. "adc r5, r5, #0\n\t"
  125290. #else
  125291. "umull r6, r7, r8, r9\n\t"
  125292. "adds r3, r3, r6\n\t"
  125293. "adcs r4, r4, r7\n\t"
  125294. "mov r5, #0\n\t"
  125295. "adc r5, r5, #0\n\t"
  125296. #endif
  125297. /* A[5] * B[1] */
  125298. "ldr r8, [%[a], #20]\n\t"
  125299. "ldr r9, [%[b], #4]\n\t"
  125300. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  125301. "lsl r6, r8, #16\n\t"
  125302. "lsl r7, r9, #16\n\t"
  125303. "lsr r6, r6, #16\n\t"
  125304. "lsr r7, r7, #16\n\t"
  125305. "mul r7, r6, r7\n\t"
  125306. "adds r3, r3, r7\n\t"
  125307. "adcs r4, r4, #0\n\t"
  125308. "adc r5, r5, #0\n\t"
  125309. "lsr r7, r9, #16\n\t"
  125310. "mul r6, r7, r6\n\t"
  125311. "lsr r7, r6, #16\n\t"
  125312. "lsl r6, r6, #16\n\t"
  125313. "adds r3, r3, r6\n\t"
  125314. "adcs r4, r4, r7\n\t"
  125315. "adc r5, r5, #0\n\t"
  125316. "lsr r6, r8, #16\n\t"
  125317. "lsr r7, r9, #16\n\t"
  125318. "mul r7, r6, r7\n\t"
  125319. "adds r4, r4, r7\n\t"
  125320. "adc r5, r5, #0\n\t"
  125321. "lsl r7, r9, #16\n\t"
  125322. "lsr r7, r7, #16\n\t"
  125323. "mul r6, r7, r6\n\t"
  125324. "lsr r7, r6, #16\n\t"
  125325. "lsl r6, r6, #16\n\t"
  125326. "adds r3, r3, r6\n\t"
  125327. "adcs r4, r4, r7\n\t"
  125328. "adc r5, r5, #0\n\t"
  125329. #else
  125330. "umull r6, r7, r8, r9\n\t"
  125331. "adds r3, r3, r6\n\t"
  125332. "adcs r4, r4, r7\n\t"
  125333. "adc r5, r5, #0\n\t"
  125334. #endif
  125335. /* A[4] * B[2] */
  125336. "ldr r8, [%[a], #16]\n\t"
  125337. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  125338. "lsl r6, r8, #16\n\t"
  125339. "lsl r7, r12, #16\n\t"
  125340. "lsr r6, r6, #16\n\t"
  125341. "lsr r7, r7, #16\n\t"
  125342. "mul r7, r6, r7\n\t"
  125343. "adds r3, r3, r7\n\t"
  125344. "adcs r4, r4, #0\n\t"
  125345. "adc r5, r5, #0\n\t"
  125346. "lsr r7, r12, #16\n\t"
  125347. "mul r6, r7, r6\n\t"
  125348. "lsr r7, r6, #16\n\t"
  125349. "lsl r6, r6, #16\n\t"
  125350. "adds r3, r3, r6\n\t"
  125351. "adcs r4, r4, r7\n\t"
  125352. "adc r5, r5, #0\n\t"
  125353. "lsr r6, r8, #16\n\t"
  125354. "lsr r7, r12, #16\n\t"
  125355. "mul r7, r6, r7\n\t"
  125356. "adds r4, r4, r7\n\t"
  125357. "adc r5, r5, #0\n\t"
  125358. "lsl r7, r12, #16\n\t"
  125359. "lsr r7, r7, #16\n\t"
  125360. "mul r6, r7, r6\n\t"
  125361. "lsr r7, r6, #16\n\t"
  125362. "lsl r6, r6, #16\n\t"
  125363. "adds r3, r3, r6\n\t"
  125364. "adcs r4, r4, r7\n\t"
  125365. "adc r5, r5, #0\n\t"
  125366. #else
  125367. "umull r6, r7, r8, r12\n\t"
  125368. "adds r3, r3, r6\n\t"
  125369. "adcs r4, r4, r7\n\t"
  125370. "adc r5, r5, #0\n\t"
  125371. #endif
  125372. /* A[3] * B[3] */
  125373. "ldr r11, [%[a], #12]\n\t"
  125374. "ldr r12, [%[b], #12]\n\t"
  125375. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  125376. "lsl r6, r11, #16\n\t"
  125377. "lsl r7, r12, #16\n\t"
  125378. "lsr r6, r6, #16\n\t"
  125379. "lsr r7, r7, #16\n\t"
  125380. "mul r7, r6, r7\n\t"
  125381. "adds r3, r3, r7\n\t"
  125382. "adcs r4, r4, #0\n\t"
  125383. "adc r5, r5, #0\n\t"
  125384. "lsr r7, r12, #16\n\t"
  125385. "mul r6, r7, r6\n\t"
  125386. "lsr r7, r6, #16\n\t"
  125387. "lsl r6, r6, #16\n\t"
  125388. "adds r3, r3, r6\n\t"
  125389. "adcs r4, r4, r7\n\t"
  125390. "adc r5, r5, #0\n\t"
  125391. "lsr r6, r11, #16\n\t"
  125392. "lsr r7, r12, #16\n\t"
  125393. "mul r7, r6, r7\n\t"
  125394. "adds r4, r4, r7\n\t"
  125395. "adc r5, r5, #0\n\t"
  125396. "lsl r7, r12, #16\n\t"
  125397. "lsr r7, r7, #16\n\t"
  125398. "mul r6, r7, r6\n\t"
  125399. "lsr r7, r6, #16\n\t"
  125400. "lsl r6, r6, #16\n\t"
  125401. "adds r3, r3, r6\n\t"
  125402. "adcs r4, r4, r7\n\t"
  125403. "adc r5, r5, #0\n\t"
  125404. #else
  125405. "umull r6, r7, r11, r12\n\t"
  125406. "adds r3, r3, r6\n\t"
  125407. "adcs r4, r4, r7\n\t"
  125408. "adc r5, r5, #0\n\t"
  125409. #endif
  125410. /* A[2] * B[4] */
  125411. "ldr r8, [%[a], #8]\n\t"
  125412. "ldr r9, [%[b], #16]\n\t"
  125413. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  125414. "lsl r6, r8, #16\n\t"
  125415. "lsl r7, r9, #16\n\t"
  125416. "lsr r6, r6, #16\n\t"
  125417. "lsr r7, r7, #16\n\t"
  125418. "mul r7, r6, r7\n\t"
  125419. "adds r3, r3, r7\n\t"
  125420. "adcs r4, r4, #0\n\t"
  125421. "adc r5, r5, #0\n\t"
  125422. "lsr r7, r9, #16\n\t"
  125423. "mul r6, r7, r6\n\t"
  125424. "lsr r7, r6, #16\n\t"
  125425. "lsl r6, r6, #16\n\t"
  125426. "adds r3, r3, r6\n\t"
  125427. "adcs r4, r4, r7\n\t"
  125428. "adc r5, r5, #0\n\t"
  125429. "lsr r6, r8, #16\n\t"
  125430. "lsr r7, r9, #16\n\t"
  125431. "mul r7, r6, r7\n\t"
  125432. "adds r4, r4, r7\n\t"
  125433. "adc r5, r5, #0\n\t"
  125434. "lsl r7, r9, #16\n\t"
  125435. "lsr r7, r7, #16\n\t"
  125436. "mul r6, r7, r6\n\t"
  125437. "lsr r7, r6, #16\n\t"
  125438. "lsl r6, r6, #16\n\t"
  125439. "adds r3, r3, r6\n\t"
  125440. "adcs r4, r4, r7\n\t"
  125441. "adc r5, r5, #0\n\t"
  125442. #else
  125443. "umull r6, r7, r8, r9\n\t"
  125444. "adds r3, r3, r6\n\t"
  125445. "adcs r4, r4, r7\n\t"
  125446. "adc r5, r5, #0\n\t"
  125447. #endif
  125448. /* A[1] * B[5] */
  125449. "ldr r8, [%[a], #4]\n\t"
  125450. "ldr r9, [%[b], #20]\n\t"
  125451. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  125452. "lsl r6, r8, #16\n\t"
  125453. "lsl r7, r9, #16\n\t"
  125454. "lsr r6, r6, #16\n\t"
  125455. "lsr r7, r7, #16\n\t"
  125456. "mul r7, r6, r7\n\t"
  125457. "adds r3, r3, r7\n\t"
  125458. "adcs r4, r4, #0\n\t"
  125459. "adc r5, r5, #0\n\t"
  125460. "lsr r7, r9, #16\n\t"
  125461. "mul r6, r7, r6\n\t"
  125462. "lsr r7, r6, #16\n\t"
  125463. "lsl r6, r6, #16\n\t"
  125464. "adds r3, r3, r6\n\t"
  125465. "adcs r4, r4, r7\n\t"
  125466. "adc r5, r5, #0\n\t"
  125467. "lsr r6, r8, #16\n\t"
  125468. "lsr r7, r9, #16\n\t"
  125469. "mul r7, r6, r7\n\t"
  125470. "adds r4, r4, r7\n\t"
  125471. "adc r5, r5, #0\n\t"
  125472. "lsl r7, r9, #16\n\t"
  125473. "lsr r7, r7, #16\n\t"
  125474. "mul r6, r7, r6\n\t"
  125475. "lsr r7, r6, #16\n\t"
  125476. "lsl r6, r6, #16\n\t"
  125477. "adds r3, r3, r6\n\t"
  125478. "adcs r4, r4, r7\n\t"
  125479. "adc r5, r5, #0\n\t"
  125480. #else
  125481. "umull r6, r7, r8, r9\n\t"
  125482. "adds r3, r3, r6\n\t"
  125483. "adcs r4, r4, r7\n\t"
  125484. "adc r5, r5, #0\n\t"
  125485. #endif
  125486. /* A[0] * B[6] */
  125487. "ldr r8, [%[a]]\n\t"
  125488. "ldr r9, [%[b], #24]\n\t"
  125489. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  125490. "lsl r6, r8, #16\n\t"
  125491. "lsl r7, r9, #16\n\t"
  125492. "lsr r6, r6, #16\n\t"
  125493. "lsr r7, r7, #16\n\t"
  125494. "mul r7, r6, r7\n\t"
  125495. "adds r3, r3, r7\n\t"
  125496. "adcs r4, r4, #0\n\t"
  125497. "adc r5, r5, #0\n\t"
  125498. "lsr r7, r9, #16\n\t"
  125499. "mul r6, r7, r6\n\t"
  125500. "lsr r7, r6, #16\n\t"
  125501. "lsl r6, r6, #16\n\t"
  125502. "adds r3, r3, r6\n\t"
  125503. "adcs r4, r4, r7\n\t"
  125504. "adc r5, r5, #0\n\t"
  125505. "lsr r6, r8, #16\n\t"
  125506. "lsr r7, r9, #16\n\t"
  125507. "mul r7, r6, r7\n\t"
  125508. "adds r4, r4, r7\n\t"
  125509. "adc r5, r5, #0\n\t"
  125510. "lsl r7, r9, #16\n\t"
  125511. "lsr r7, r7, #16\n\t"
  125512. "mul r6, r7, r6\n\t"
  125513. "lsr r7, r6, #16\n\t"
  125514. "lsl r6, r6, #16\n\t"
  125515. "adds r3, r3, r6\n\t"
  125516. "adcs r4, r4, r7\n\t"
  125517. "adc r5, r5, #0\n\t"
  125518. #else
  125519. "umull r6, r7, r8, r9\n\t"
  125520. "adds r3, r3, r6\n\t"
  125521. "adcs r4, r4, r7\n\t"
  125522. "adc r5, r5, #0\n\t"
  125523. #endif
  125524. "str r3, [sp, #24]\n\t"
  125525. /* A[0] * B[7] */
  125526. "ldr r9, [%[b], #28]\n\t"
  125527. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  125528. "lsl r6, r8, #16\n\t"
  125529. "lsl r7, r9, #16\n\t"
  125530. "lsr r6, r6, #16\n\t"
  125531. "lsr r7, r7, #16\n\t"
  125532. "mul r7, r6, r7\n\t"
  125533. "adds r4, r4, r7\n\t"
  125534. "adcs r5, r5, #0\n\t"
  125535. "mov r3, #0\n\t"
  125536. "adc r3, r3, #0\n\t"
  125537. "lsr r7, r9, #16\n\t"
  125538. "mul r6, r7, r6\n\t"
  125539. "lsr r7, r6, #16\n\t"
  125540. "lsl r6, r6, #16\n\t"
  125541. "adds r4, r4, r6\n\t"
  125542. "adcs r5, r5, r7\n\t"
  125543. "adc r3, r3, #0\n\t"
  125544. "lsr r6, r8, #16\n\t"
  125545. "lsr r7, r9, #16\n\t"
  125546. "mul r7, r6, r7\n\t"
  125547. "adds r5, r5, r7\n\t"
  125548. "adc r3, r3, #0\n\t"
  125549. "lsl r7, r9, #16\n\t"
  125550. "lsr r7, r7, #16\n\t"
  125551. "mul r6, r7, r6\n\t"
  125552. "lsr r7, r6, #16\n\t"
  125553. "lsl r6, r6, #16\n\t"
  125554. "adds r4, r4, r6\n\t"
  125555. "adcs r5, r5, r7\n\t"
  125556. "adc r3, r3, #0\n\t"
  125557. #else
  125558. "umull r6, r7, r8, r9\n\t"
  125559. "adds r4, r4, r6\n\t"
  125560. "adcs r5, r5, r7\n\t"
  125561. "mov r3, #0\n\t"
  125562. "adc r3, r3, #0\n\t"
  125563. #endif
  125564. /* A[1] * B[6] */
  125565. "ldr r8, [%[a], #4]\n\t"
  125566. "ldr r9, [%[b], #24]\n\t"
  125567. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  125568. "lsl r6, r8, #16\n\t"
  125569. "lsl r7, r9, #16\n\t"
  125570. "lsr r6, r6, #16\n\t"
  125571. "lsr r7, r7, #16\n\t"
  125572. "mul r7, r6, r7\n\t"
  125573. "adds r4, r4, r7\n\t"
  125574. "adcs r5, r5, #0\n\t"
  125575. "adc r3, r3, #0\n\t"
  125576. "lsr r7, r9, #16\n\t"
  125577. "mul r6, r7, r6\n\t"
  125578. "lsr r7, r6, #16\n\t"
  125579. "lsl r6, r6, #16\n\t"
  125580. "adds r4, r4, r6\n\t"
  125581. "adcs r5, r5, r7\n\t"
  125582. "adc r3, r3, #0\n\t"
  125583. "lsr r6, r8, #16\n\t"
  125584. "lsr r7, r9, #16\n\t"
  125585. "mul r7, r6, r7\n\t"
  125586. "adds r5, r5, r7\n\t"
  125587. "adc r3, r3, #0\n\t"
  125588. "lsl r7, r9, #16\n\t"
  125589. "lsr r7, r7, #16\n\t"
  125590. "mul r6, r7, r6\n\t"
  125591. "lsr r7, r6, #16\n\t"
  125592. "lsl r6, r6, #16\n\t"
  125593. "adds r4, r4, r6\n\t"
  125594. "adcs r5, r5, r7\n\t"
  125595. "adc r3, r3, #0\n\t"
  125596. #else
  125597. "umull r6, r7, r8, r9\n\t"
  125598. "adds r4, r4, r6\n\t"
  125599. "adcs r5, r5, r7\n\t"
  125600. "adc r3, r3, #0\n\t"
  125601. #endif
  125602. /* A[2] * B[5] */
  125603. "ldr r8, [%[a], #8]\n\t"
  125604. "ldr r9, [%[b], #20]\n\t"
  125605. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  125606. "lsl r6, r8, #16\n\t"
  125607. "lsl r7, r9, #16\n\t"
  125608. "lsr r6, r6, #16\n\t"
  125609. "lsr r7, r7, #16\n\t"
  125610. "mul r7, r6, r7\n\t"
  125611. "adds r4, r4, r7\n\t"
  125612. "adcs r5, r5, #0\n\t"
  125613. "adc r3, r3, #0\n\t"
  125614. "lsr r7, r9, #16\n\t"
  125615. "mul r6, r7, r6\n\t"
  125616. "lsr r7, r6, #16\n\t"
  125617. "lsl r6, r6, #16\n\t"
  125618. "adds r4, r4, r6\n\t"
  125619. "adcs r5, r5, r7\n\t"
  125620. "adc r3, r3, #0\n\t"
  125621. "lsr r6, r8, #16\n\t"
  125622. "lsr r7, r9, #16\n\t"
  125623. "mul r7, r6, r7\n\t"
  125624. "adds r5, r5, r7\n\t"
  125625. "adc r3, r3, #0\n\t"
  125626. "lsl r7, r9, #16\n\t"
  125627. "lsr r7, r7, #16\n\t"
  125628. "mul r6, r7, r6\n\t"
  125629. "lsr r7, r6, #16\n\t"
  125630. "lsl r6, r6, #16\n\t"
  125631. "adds r4, r4, r6\n\t"
  125632. "adcs r5, r5, r7\n\t"
  125633. "adc r3, r3, #0\n\t"
  125634. #else
  125635. "umull r6, r7, r8, r9\n\t"
  125636. "adds r4, r4, r6\n\t"
  125637. "adcs r5, r5, r7\n\t"
  125638. "adc r3, r3, #0\n\t"
  125639. #endif
  125640. /* A[3] * B[4] */
  125641. "ldr r9, [%[b], #16]\n\t"
  125642. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  125643. "lsl r6, r11, #16\n\t"
  125644. "lsl r7, r9, #16\n\t"
  125645. "lsr r6, r6, #16\n\t"
  125646. "lsr r7, r7, #16\n\t"
  125647. "mul r7, r6, r7\n\t"
  125648. "adds r4, r4, r7\n\t"
  125649. "adcs r5, r5, #0\n\t"
  125650. "adc r3, r3, #0\n\t"
  125651. "lsr r7, r9, #16\n\t"
  125652. "mul r6, r7, r6\n\t"
  125653. "lsr r7, r6, #16\n\t"
  125654. "lsl r6, r6, #16\n\t"
  125655. "adds r4, r4, r6\n\t"
  125656. "adcs r5, r5, r7\n\t"
  125657. "adc r3, r3, #0\n\t"
  125658. "lsr r6, r11, #16\n\t"
  125659. "lsr r7, r9, #16\n\t"
  125660. "mul r7, r6, r7\n\t"
  125661. "adds r5, r5, r7\n\t"
  125662. "adc r3, r3, #0\n\t"
  125663. "lsl r7, r9, #16\n\t"
  125664. "lsr r7, r7, #16\n\t"
  125665. "mul r6, r7, r6\n\t"
  125666. "lsr r7, r6, #16\n\t"
  125667. "lsl r6, r6, #16\n\t"
  125668. "adds r4, r4, r6\n\t"
  125669. "adcs r5, r5, r7\n\t"
  125670. "adc r3, r3, #0\n\t"
  125671. #else
  125672. "umull r6, r7, r11, r9\n\t"
  125673. "adds r4, r4, r6\n\t"
  125674. "adcs r5, r5, r7\n\t"
  125675. "adc r3, r3, #0\n\t"
  125676. #endif
  125677. /* A[4] * B[3] */
  125678. "ldr r8, [%[a], #16]\n\t"
  125679. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  125680. "lsl r6, r8, #16\n\t"
  125681. "lsl r7, r12, #16\n\t"
  125682. "lsr r6, r6, #16\n\t"
  125683. "lsr r7, r7, #16\n\t"
  125684. "mul r7, r6, r7\n\t"
  125685. "adds r4, r4, r7\n\t"
  125686. "adcs r5, r5, #0\n\t"
  125687. "adc r3, r3, #0\n\t"
  125688. "lsr r7, r12, #16\n\t"
  125689. "mul r6, r7, r6\n\t"
  125690. "lsr r7, r6, #16\n\t"
  125691. "lsl r6, r6, #16\n\t"
  125692. "adds r4, r4, r6\n\t"
  125693. "adcs r5, r5, r7\n\t"
  125694. "adc r3, r3, #0\n\t"
  125695. "lsr r6, r8, #16\n\t"
  125696. "lsr r7, r12, #16\n\t"
  125697. "mul r7, r6, r7\n\t"
  125698. "adds r5, r5, r7\n\t"
  125699. "adc r3, r3, #0\n\t"
  125700. "lsl r7, r12, #16\n\t"
  125701. "lsr r7, r7, #16\n\t"
  125702. "mul r6, r7, r6\n\t"
  125703. "lsr r7, r6, #16\n\t"
  125704. "lsl r6, r6, #16\n\t"
  125705. "adds r4, r4, r6\n\t"
  125706. "adcs r5, r5, r7\n\t"
  125707. "adc r3, r3, #0\n\t"
  125708. #else
  125709. "umull r6, r7, r8, r12\n\t"
  125710. "adds r4, r4, r6\n\t"
  125711. "adcs r5, r5, r7\n\t"
  125712. "adc r3, r3, #0\n\t"
  125713. #endif
  125714. /* A[5] * B[2] */
  125715. "ldr r8, [%[a], #20]\n\t"
  125716. "ldr r9, [%[b], #8]\n\t"
  125717. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  125718. "lsl r6, r8, #16\n\t"
  125719. "lsl r7, r9, #16\n\t"
  125720. "lsr r6, r6, #16\n\t"
  125721. "lsr r7, r7, #16\n\t"
  125722. "mul r7, r6, r7\n\t"
  125723. "adds r4, r4, r7\n\t"
  125724. "adcs r5, r5, #0\n\t"
  125725. "adc r3, r3, #0\n\t"
  125726. "lsr r7, r9, #16\n\t"
  125727. "mul r6, r7, r6\n\t"
  125728. "lsr r7, r6, #16\n\t"
  125729. "lsl r6, r6, #16\n\t"
  125730. "adds r4, r4, r6\n\t"
  125731. "adcs r5, r5, r7\n\t"
  125732. "adc r3, r3, #0\n\t"
  125733. "lsr r6, r8, #16\n\t"
  125734. "lsr r7, r9, #16\n\t"
  125735. "mul r7, r6, r7\n\t"
  125736. "adds r5, r5, r7\n\t"
  125737. "adc r3, r3, #0\n\t"
  125738. "lsl r7, r9, #16\n\t"
  125739. "lsr r7, r7, #16\n\t"
  125740. "mul r6, r7, r6\n\t"
  125741. "lsr r7, r6, #16\n\t"
  125742. "lsl r6, r6, #16\n\t"
  125743. "adds r4, r4, r6\n\t"
  125744. "adcs r5, r5, r7\n\t"
  125745. "adc r3, r3, #0\n\t"
  125746. #else
  125747. "umull r6, r7, r8, r9\n\t"
  125748. "adds r4, r4, r6\n\t"
  125749. "adcs r5, r5, r7\n\t"
  125750. "adc r3, r3, #0\n\t"
  125751. #endif
  125752. /* A[6] * B[1] */
  125753. "ldr r8, [%[a], #24]\n\t"
  125754. "ldr r9, [%[b], #4]\n\t"
  125755. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  125756. "lsl r6, r8, #16\n\t"
  125757. "lsl r7, r9, #16\n\t"
  125758. "lsr r6, r6, #16\n\t"
  125759. "lsr r7, r7, #16\n\t"
  125760. "mul r7, r6, r7\n\t"
  125761. "adds r4, r4, r7\n\t"
  125762. "adcs r5, r5, #0\n\t"
  125763. "adc r3, r3, #0\n\t"
  125764. "lsr r7, r9, #16\n\t"
  125765. "mul r6, r7, r6\n\t"
  125766. "lsr r7, r6, #16\n\t"
  125767. "lsl r6, r6, #16\n\t"
  125768. "adds r4, r4, r6\n\t"
  125769. "adcs r5, r5, r7\n\t"
  125770. "adc r3, r3, #0\n\t"
  125771. "lsr r6, r8, #16\n\t"
  125772. "lsr r7, r9, #16\n\t"
  125773. "mul r7, r6, r7\n\t"
  125774. "adds r5, r5, r7\n\t"
  125775. "adc r3, r3, #0\n\t"
  125776. "lsl r7, r9, #16\n\t"
  125777. "lsr r7, r7, #16\n\t"
  125778. "mul r6, r7, r6\n\t"
  125779. "lsr r7, r6, #16\n\t"
  125780. "lsl r6, r6, #16\n\t"
  125781. "adds r4, r4, r6\n\t"
  125782. "adcs r5, r5, r7\n\t"
  125783. "adc r3, r3, #0\n\t"
  125784. #else
  125785. "umull r6, r7, r8, r9\n\t"
  125786. "adds r4, r4, r6\n\t"
  125787. "adcs r5, r5, r7\n\t"
  125788. "adc r3, r3, #0\n\t"
  125789. #endif
  125790. /* A[7] * B[0] */
  125791. "ldr r8, [%[a], #28]\n\t"
  125792. "ldr r9, [%[b]]\n\t"
  125793. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  125794. "lsl r6, r8, #16\n\t"
  125795. "lsl r7, r9, #16\n\t"
  125796. "lsr r6, r6, #16\n\t"
  125797. "lsr r7, r7, #16\n\t"
  125798. "mul r7, r6, r7\n\t"
  125799. "adds r4, r4, r7\n\t"
  125800. "adcs r5, r5, #0\n\t"
  125801. "adc r3, r3, #0\n\t"
  125802. "lsr r7, r9, #16\n\t"
  125803. "mul r6, r7, r6\n\t"
  125804. "lsr r7, r6, #16\n\t"
  125805. "lsl r6, r6, #16\n\t"
  125806. "adds r4, r4, r6\n\t"
  125807. "adcs r5, r5, r7\n\t"
  125808. "adc r3, r3, #0\n\t"
  125809. "lsr r6, r8, #16\n\t"
  125810. "lsr r7, r9, #16\n\t"
  125811. "mul r7, r6, r7\n\t"
  125812. "adds r5, r5, r7\n\t"
  125813. "adc r3, r3, #0\n\t"
  125814. "lsl r7, r9, #16\n\t"
  125815. "lsr r7, r7, #16\n\t"
  125816. "mul r6, r7, r6\n\t"
  125817. "lsr r7, r6, #16\n\t"
  125818. "lsl r6, r6, #16\n\t"
  125819. "adds r4, r4, r6\n\t"
  125820. "adcs r5, r5, r7\n\t"
  125821. "adc r3, r3, #0\n\t"
  125822. #else
  125823. "umull r6, r7, r8, r9\n\t"
  125824. "adds r4, r4, r6\n\t"
  125825. "adcs r5, r5, r7\n\t"
  125826. "adc r3, r3, #0\n\t"
  125827. #endif
  125828. "str r4, [sp, #28]\n\t"
  125829. /* A[8] * B[0] */
  125830. "ldr r8, [%[a], #32]\n\t"
  125831. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  125832. "lsl r6, r8, #16\n\t"
  125833. "lsl r7, r9, #16\n\t"
  125834. "lsr r6, r6, #16\n\t"
  125835. "lsr r7, r7, #16\n\t"
  125836. "mul r7, r6, r7\n\t"
  125837. "adds r5, r5, r7\n\t"
  125838. "adcs r3, r3, #0\n\t"
  125839. "mov r4, #0\n\t"
  125840. "adc r4, r4, #0\n\t"
  125841. "lsr r7, r9, #16\n\t"
  125842. "mul r6, r7, r6\n\t"
  125843. "lsr r7, r6, #16\n\t"
  125844. "lsl r6, r6, #16\n\t"
  125845. "adds r5, r5, r6\n\t"
  125846. "adcs r3, r3, r7\n\t"
  125847. "adc r4, r4, #0\n\t"
  125848. "lsr r6, r8, #16\n\t"
  125849. "lsr r7, r9, #16\n\t"
  125850. "mul r7, r6, r7\n\t"
  125851. "adds r3, r3, r7\n\t"
  125852. "adc r4, r4, #0\n\t"
  125853. "lsl r7, r9, #16\n\t"
  125854. "lsr r7, r7, #16\n\t"
  125855. "mul r6, r7, r6\n\t"
  125856. "lsr r7, r6, #16\n\t"
  125857. "lsl r6, r6, #16\n\t"
  125858. "adds r5, r5, r6\n\t"
  125859. "adcs r3, r3, r7\n\t"
  125860. "adc r4, r4, #0\n\t"
  125861. #else
  125862. "umull r6, r7, r8, r9\n\t"
  125863. "adds r5, r5, r6\n\t"
  125864. "adcs r3, r3, r7\n\t"
  125865. "mov r4, #0\n\t"
  125866. "adc r4, r4, #0\n\t"
  125867. #endif
  125868. /* A[7] * B[1] */
  125869. "ldr r8, [%[a], #28]\n\t"
  125870. "ldr r9, [%[b], #4]\n\t"
  125871. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  125872. "lsl r6, r8, #16\n\t"
  125873. "lsl r7, r9, #16\n\t"
  125874. "lsr r6, r6, #16\n\t"
  125875. "lsr r7, r7, #16\n\t"
  125876. "mul r7, r6, r7\n\t"
  125877. "adds r5, r5, r7\n\t"
  125878. "adcs r3, r3, #0\n\t"
  125879. "adc r4, r4, #0\n\t"
  125880. "lsr r7, r9, #16\n\t"
  125881. "mul r6, r7, r6\n\t"
  125882. "lsr r7, r6, #16\n\t"
  125883. "lsl r6, r6, #16\n\t"
  125884. "adds r5, r5, r6\n\t"
  125885. "adcs r3, r3, r7\n\t"
  125886. "adc r4, r4, #0\n\t"
  125887. "lsr r6, r8, #16\n\t"
  125888. "lsr r7, r9, #16\n\t"
  125889. "mul r7, r6, r7\n\t"
  125890. "adds r3, r3, r7\n\t"
  125891. "adc r4, r4, #0\n\t"
  125892. "lsl r7, r9, #16\n\t"
  125893. "lsr r7, r7, #16\n\t"
  125894. "mul r6, r7, r6\n\t"
  125895. "lsr r7, r6, #16\n\t"
  125896. "lsl r6, r6, #16\n\t"
  125897. "adds r5, r5, r6\n\t"
  125898. "adcs r3, r3, r7\n\t"
  125899. "adc r4, r4, #0\n\t"
  125900. #else
  125901. "umull r6, r7, r8, r9\n\t"
  125902. "adds r5, r5, r6\n\t"
  125903. "adcs r3, r3, r7\n\t"
  125904. "adc r4, r4, #0\n\t"
  125905. #endif
  125906. /* A[6] * B[2] */
  125907. "ldr r8, [%[a], #24]\n\t"
  125908. "ldr r9, [%[b], #8]\n\t"
  125909. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  125910. "lsl r6, r8, #16\n\t"
  125911. "lsl r7, r9, #16\n\t"
  125912. "lsr r6, r6, #16\n\t"
  125913. "lsr r7, r7, #16\n\t"
  125914. "mul r7, r6, r7\n\t"
  125915. "adds r5, r5, r7\n\t"
  125916. "adcs r3, r3, #0\n\t"
  125917. "adc r4, r4, #0\n\t"
  125918. "lsr r7, r9, #16\n\t"
  125919. "mul r6, r7, r6\n\t"
  125920. "lsr r7, r6, #16\n\t"
  125921. "lsl r6, r6, #16\n\t"
  125922. "adds r5, r5, r6\n\t"
  125923. "adcs r3, r3, r7\n\t"
  125924. "adc r4, r4, #0\n\t"
  125925. "lsr r6, r8, #16\n\t"
  125926. "lsr r7, r9, #16\n\t"
  125927. "mul r7, r6, r7\n\t"
  125928. "adds r3, r3, r7\n\t"
  125929. "adc r4, r4, #0\n\t"
  125930. "lsl r7, r9, #16\n\t"
  125931. "lsr r7, r7, #16\n\t"
  125932. "mul r6, r7, r6\n\t"
  125933. "lsr r7, r6, #16\n\t"
  125934. "lsl r6, r6, #16\n\t"
  125935. "adds r5, r5, r6\n\t"
  125936. "adcs r3, r3, r7\n\t"
  125937. "adc r4, r4, #0\n\t"
  125938. #else
  125939. "umull r6, r7, r8, r9\n\t"
  125940. "adds r5, r5, r6\n\t"
  125941. "adcs r3, r3, r7\n\t"
  125942. "adc r4, r4, #0\n\t"
  125943. #endif
  125944. /* A[5] * B[3] */
  125945. "ldr r8, [%[a], #20]\n\t"
  125946. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  125947. "lsl r6, r8, #16\n\t"
  125948. "lsl r7, r12, #16\n\t"
  125949. "lsr r6, r6, #16\n\t"
  125950. "lsr r7, r7, #16\n\t"
  125951. "mul r7, r6, r7\n\t"
  125952. "adds r5, r5, r7\n\t"
  125953. "adcs r3, r3, #0\n\t"
  125954. "adc r4, r4, #0\n\t"
  125955. "lsr r7, r12, #16\n\t"
  125956. "mul r6, r7, r6\n\t"
  125957. "lsr r7, r6, #16\n\t"
  125958. "lsl r6, r6, #16\n\t"
  125959. "adds r5, r5, r6\n\t"
  125960. "adcs r3, r3, r7\n\t"
  125961. "adc r4, r4, #0\n\t"
  125962. "lsr r6, r8, #16\n\t"
  125963. "lsr r7, r12, #16\n\t"
  125964. "mul r7, r6, r7\n\t"
  125965. "adds r3, r3, r7\n\t"
  125966. "adc r4, r4, #0\n\t"
  125967. "lsl r7, r12, #16\n\t"
  125968. "lsr r7, r7, #16\n\t"
  125969. "mul r6, r7, r6\n\t"
  125970. "lsr r7, r6, #16\n\t"
  125971. "lsl r6, r6, #16\n\t"
  125972. "adds r5, r5, r6\n\t"
  125973. "adcs r3, r3, r7\n\t"
  125974. "adc r4, r4, #0\n\t"
  125975. #else
  125976. "umull r6, r7, r8, r12\n\t"
  125977. "adds r5, r5, r6\n\t"
  125978. "adcs r3, r3, r7\n\t"
  125979. "adc r4, r4, #0\n\t"
  125980. #endif
  125981. /* A[4] * B[4] */
  125982. "ldr r11, [%[a], #16]\n\t"
  125983. "ldr r12, [%[b], #16]\n\t"
  125984. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  125985. "lsl r6, r11, #16\n\t"
  125986. "lsl r7, r12, #16\n\t"
  125987. "lsr r6, r6, #16\n\t"
  125988. "lsr r7, r7, #16\n\t"
  125989. "mul r7, r6, r7\n\t"
  125990. "adds r5, r5, r7\n\t"
  125991. "adcs r3, r3, #0\n\t"
  125992. "adc r4, r4, #0\n\t"
  125993. "lsr r7, r12, #16\n\t"
  125994. "mul r6, r7, r6\n\t"
  125995. "lsr r7, r6, #16\n\t"
  125996. "lsl r6, r6, #16\n\t"
  125997. "adds r5, r5, r6\n\t"
  125998. "adcs r3, r3, r7\n\t"
  125999. "adc r4, r4, #0\n\t"
  126000. "lsr r6, r11, #16\n\t"
  126001. "lsr r7, r12, #16\n\t"
  126002. "mul r7, r6, r7\n\t"
  126003. "adds r3, r3, r7\n\t"
  126004. "adc r4, r4, #0\n\t"
  126005. "lsl r7, r12, #16\n\t"
  126006. "lsr r7, r7, #16\n\t"
  126007. "mul r6, r7, r6\n\t"
  126008. "lsr r7, r6, #16\n\t"
  126009. "lsl r6, r6, #16\n\t"
  126010. "adds r5, r5, r6\n\t"
  126011. "adcs r3, r3, r7\n\t"
  126012. "adc r4, r4, #0\n\t"
  126013. #else
  126014. "umull r6, r7, r11, r12\n\t"
  126015. "adds r5, r5, r6\n\t"
  126016. "adcs r3, r3, r7\n\t"
  126017. "adc r4, r4, #0\n\t"
  126018. #endif
  126019. /* A[3] * B[5] */
  126020. "ldr r8, [%[a], #12]\n\t"
  126021. "ldr r9, [%[b], #20]\n\t"
  126022. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  126023. "lsl r6, r8, #16\n\t"
  126024. "lsl r7, r9, #16\n\t"
  126025. "lsr r6, r6, #16\n\t"
  126026. "lsr r7, r7, #16\n\t"
  126027. "mul r7, r6, r7\n\t"
  126028. "adds r5, r5, r7\n\t"
  126029. "adcs r3, r3, #0\n\t"
  126030. "adc r4, r4, #0\n\t"
  126031. "lsr r7, r9, #16\n\t"
  126032. "mul r6, r7, r6\n\t"
  126033. "lsr r7, r6, #16\n\t"
  126034. "lsl r6, r6, #16\n\t"
  126035. "adds r5, r5, r6\n\t"
  126036. "adcs r3, r3, r7\n\t"
  126037. "adc r4, r4, #0\n\t"
  126038. "lsr r6, r8, #16\n\t"
  126039. "lsr r7, r9, #16\n\t"
  126040. "mul r7, r6, r7\n\t"
  126041. "adds r3, r3, r7\n\t"
  126042. "adc r4, r4, #0\n\t"
  126043. "lsl r7, r9, #16\n\t"
  126044. "lsr r7, r7, #16\n\t"
  126045. "mul r6, r7, r6\n\t"
  126046. "lsr r7, r6, #16\n\t"
  126047. "lsl r6, r6, #16\n\t"
  126048. "adds r5, r5, r6\n\t"
  126049. "adcs r3, r3, r7\n\t"
  126050. "adc r4, r4, #0\n\t"
  126051. #else
  126052. "umull r6, r7, r8, r9\n\t"
  126053. "adds r5, r5, r6\n\t"
  126054. "adcs r3, r3, r7\n\t"
  126055. "adc r4, r4, #0\n\t"
  126056. #endif
  126057. /* A[2] * B[6] */
  126058. "ldr r8, [%[a], #8]\n\t"
  126059. "ldr r9, [%[b], #24]\n\t"
  126060. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  126061. "lsl r6, r8, #16\n\t"
  126062. "lsl r7, r9, #16\n\t"
  126063. "lsr r6, r6, #16\n\t"
  126064. "lsr r7, r7, #16\n\t"
  126065. "mul r7, r6, r7\n\t"
  126066. "adds r5, r5, r7\n\t"
  126067. "adcs r3, r3, #0\n\t"
  126068. "adc r4, r4, #0\n\t"
  126069. "lsr r7, r9, #16\n\t"
  126070. "mul r6, r7, r6\n\t"
  126071. "lsr r7, r6, #16\n\t"
  126072. "lsl r6, r6, #16\n\t"
  126073. "adds r5, r5, r6\n\t"
  126074. "adcs r3, r3, r7\n\t"
  126075. "adc r4, r4, #0\n\t"
  126076. "lsr r6, r8, #16\n\t"
  126077. "lsr r7, r9, #16\n\t"
  126078. "mul r7, r6, r7\n\t"
  126079. "adds r3, r3, r7\n\t"
  126080. "adc r4, r4, #0\n\t"
  126081. "lsl r7, r9, #16\n\t"
  126082. "lsr r7, r7, #16\n\t"
  126083. "mul r6, r7, r6\n\t"
  126084. "lsr r7, r6, #16\n\t"
  126085. "lsl r6, r6, #16\n\t"
  126086. "adds r5, r5, r6\n\t"
  126087. "adcs r3, r3, r7\n\t"
  126088. "adc r4, r4, #0\n\t"
  126089. #else
  126090. "umull r6, r7, r8, r9\n\t"
  126091. "adds r5, r5, r6\n\t"
  126092. "adcs r3, r3, r7\n\t"
  126093. "adc r4, r4, #0\n\t"
  126094. #endif
  126095. /* A[1] * B[7] */
  126096. "ldr r8, [%[a], #4]\n\t"
  126097. "ldr r9, [%[b], #28]\n\t"
  126098. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  126099. "lsl r6, r8, #16\n\t"
  126100. "lsl r7, r9, #16\n\t"
  126101. "lsr r6, r6, #16\n\t"
  126102. "lsr r7, r7, #16\n\t"
  126103. "mul r7, r6, r7\n\t"
  126104. "adds r5, r5, r7\n\t"
  126105. "adcs r3, r3, #0\n\t"
  126106. "adc r4, r4, #0\n\t"
  126107. "lsr r7, r9, #16\n\t"
  126108. "mul r6, r7, r6\n\t"
  126109. "lsr r7, r6, #16\n\t"
  126110. "lsl r6, r6, #16\n\t"
  126111. "adds r5, r5, r6\n\t"
  126112. "adcs r3, r3, r7\n\t"
  126113. "adc r4, r4, #0\n\t"
  126114. "lsr r6, r8, #16\n\t"
  126115. "lsr r7, r9, #16\n\t"
  126116. "mul r7, r6, r7\n\t"
  126117. "adds r3, r3, r7\n\t"
  126118. "adc r4, r4, #0\n\t"
  126119. "lsl r7, r9, #16\n\t"
  126120. "lsr r7, r7, #16\n\t"
  126121. "mul r6, r7, r6\n\t"
  126122. "lsr r7, r6, #16\n\t"
  126123. "lsl r6, r6, #16\n\t"
  126124. "adds r5, r5, r6\n\t"
  126125. "adcs r3, r3, r7\n\t"
  126126. "adc r4, r4, #0\n\t"
  126127. #else
  126128. "umull r6, r7, r8, r9\n\t"
  126129. "adds r5, r5, r6\n\t"
  126130. "adcs r3, r3, r7\n\t"
  126131. "adc r4, r4, #0\n\t"
  126132. #endif
  126133. /* A[0] * B[8] */
  126134. "ldr r8, [%[a]]\n\t"
  126135. "ldr r9, [%[b], #32]\n\t"
  126136. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  126137. "lsl r6, r8, #16\n\t"
  126138. "lsl r7, r9, #16\n\t"
  126139. "lsr r6, r6, #16\n\t"
  126140. "lsr r7, r7, #16\n\t"
  126141. "mul r7, r6, r7\n\t"
  126142. "adds r5, r5, r7\n\t"
  126143. "adcs r3, r3, #0\n\t"
  126144. "adc r4, r4, #0\n\t"
  126145. "lsr r7, r9, #16\n\t"
  126146. "mul r6, r7, r6\n\t"
  126147. "lsr r7, r6, #16\n\t"
  126148. "lsl r6, r6, #16\n\t"
  126149. "adds r5, r5, r6\n\t"
  126150. "adcs r3, r3, r7\n\t"
  126151. "adc r4, r4, #0\n\t"
  126152. "lsr r6, r8, #16\n\t"
  126153. "lsr r7, r9, #16\n\t"
  126154. "mul r7, r6, r7\n\t"
  126155. "adds r3, r3, r7\n\t"
  126156. "adc r4, r4, #0\n\t"
  126157. "lsl r7, r9, #16\n\t"
  126158. "lsr r7, r7, #16\n\t"
  126159. "mul r6, r7, r6\n\t"
  126160. "lsr r7, r6, #16\n\t"
  126161. "lsl r6, r6, #16\n\t"
  126162. "adds r5, r5, r6\n\t"
  126163. "adcs r3, r3, r7\n\t"
  126164. "adc r4, r4, #0\n\t"
  126165. #else
  126166. "umull r6, r7, r8, r9\n\t"
  126167. "adds r5, r5, r6\n\t"
  126168. "adcs r3, r3, r7\n\t"
  126169. "adc r4, r4, #0\n\t"
  126170. #endif
  126171. "str r5, [sp, #32]\n\t"
  126172. /* A[0] * B[9] */
  126173. "ldr r9, [%[b], #36]\n\t"
  126174. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  126175. "lsl r6, r8, #16\n\t"
  126176. "lsl r7, r9, #16\n\t"
  126177. "lsr r6, r6, #16\n\t"
  126178. "lsr r7, r7, #16\n\t"
  126179. "mul r7, r6, r7\n\t"
  126180. "adds r3, r3, r7\n\t"
  126181. "adcs r4, r4, #0\n\t"
  126182. "mov r5, #0\n\t"
  126183. "adc r5, r5, #0\n\t"
  126184. "lsr r7, r9, #16\n\t"
  126185. "mul r6, r7, r6\n\t"
  126186. "lsr r7, r6, #16\n\t"
  126187. "lsl r6, r6, #16\n\t"
  126188. "adds r3, r3, r6\n\t"
  126189. "adcs r4, r4, r7\n\t"
  126190. "adc r5, r5, #0\n\t"
  126191. "lsr r6, r8, #16\n\t"
  126192. "lsr r7, r9, #16\n\t"
  126193. "mul r7, r6, r7\n\t"
  126194. "adds r4, r4, r7\n\t"
  126195. "adc r5, r5, #0\n\t"
  126196. "lsl r7, r9, #16\n\t"
  126197. "lsr r7, r7, #16\n\t"
  126198. "mul r6, r7, r6\n\t"
  126199. "lsr r7, r6, #16\n\t"
  126200. "lsl r6, r6, #16\n\t"
  126201. "adds r3, r3, r6\n\t"
  126202. "adcs r4, r4, r7\n\t"
  126203. "adc r5, r5, #0\n\t"
  126204. #else
  126205. "umull r6, r7, r8, r9\n\t"
  126206. "adds r3, r3, r6\n\t"
  126207. "adcs r4, r4, r7\n\t"
  126208. "mov r5, #0\n\t"
  126209. "adc r5, r5, #0\n\t"
  126210. #endif
  126211. /* A[1] * B[8] */
  126212. "ldr r8, [%[a], #4]\n\t"
  126213. "ldr r9, [%[b], #32]\n\t"
  126214. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  126215. "lsl r6, r8, #16\n\t"
  126216. "lsl r7, r9, #16\n\t"
  126217. "lsr r6, r6, #16\n\t"
  126218. "lsr r7, r7, #16\n\t"
  126219. "mul r7, r6, r7\n\t"
  126220. "adds r3, r3, r7\n\t"
  126221. "adcs r4, r4, #0\n\t"
  126222. "adc r5, r5, #0\n\t"
  126223. "lsr r7, r9, #16\n\t"
  126224. "mul r6, r7, r6\n\t"
  126225. "lsr r7, r6, #16\n\t"
  126226. "lsl r6, r6, #16\n\t"
  126227. "adds r3, r3, r6\n\t"
  126228. "adcs r4, r4, r7\n\t"
  126229. "adc r5, r5, #0\n\t"
  126230. "lsr r6, r8, #16\n\t"
  126231. "lsr r7, r9, #16\n\t"
  126232. "mul r7, r6, r7\n\t"
  126233. "adds r4, r4, r7\n\t"
  126234. "adc r5, r5, #0\n\t"
  126235. "lsl r7, r9, #16\n\t"
  126236. "lsr r7, r7, #16\n\t"
  126237. "mul r6, r7, r6\n\t"
  126238. "lsr r7, r6, #16\n\t"
  126239. "lsl r6, r6, #16\n\t"
  126240. "adds r3, r3, r6\n\t"
  126241. "adcs r4, r4, r7\n\t"
  126242. "adc r5, r5, #0\n\t"
  126243. #else
  126244. "umull r6, r7, r8, r9\n\t"
  126245. "adds r3, r3, r6\n\t"
  126246. "adcs r4, r4, r7\n\t"
  126247. "adc r5, r5, #0\n\t"
  126248. #endif
  126249. /* A[2] * B[7] */
  126250. "ldr r8, [%[a], #8]\n\t"
  126251. "ldr r9, [%[b], #28]\n\t"
  126252. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  126253. "lsl r6, r8, #16\n\t"
  126254. "lsl r7, r9, #16\n\t"
  126255. "lsr r6, r6, #16\n\t"
  126256. "lsr r7, r7, #16\n\t"
  126257. "mul r7, r6, r7\n\t"
  126258. "adds r3, r3, r7\n\t"
  126259. "adcs r4, r4, #0\n\t"
  126260. "adc r5, r5, #0\n\t"
  126261. "lsr r7, r9, #16\n\t"
  126262. "mul r6, r7, r6\n\t"
  126263. "lsr r7, r6, #16\n\t"
  126264. "lsl r6, r6, #16\n\t"
  126265. "adds r3, r3, r6\n\t"
  126266. "adcs r4, r4, r7\n\t"
  126267. "adc r5, r5, #0\n\t"
  126268. "lsr r6, r8, #16\n\t"
  126269. "lsr r7, r9, #16\n\t"
  126270. "mul r7, r6, r7\n\t"
  126271. "adds r4, r4, r7\n\t"
  126272. "adc r5, r5, #0\n\t"
  126273. "lsl r7, r9, #16\n\t"
  126274. "lsr r7, r7, #16\n\t"
  126275. "mul r6, r7, r6\n\t"
  126276. "lsr r7, r6, #16\n\t"
  126277. "lsl r6, r6, #16\n\t"
  126278. "adds r3, r3, r6\n\t"
  126279. "adcs r4, r4, r7\n\t"
  126280. "adc r5, r5, #0\n\t"
  126281. #else
  126282. "umull r6, r7, r8, r9\n\t"
  126283. "adds r3, r3, r6\n\t"
  126284. "adcs r4, r4, r7\n\t"
  126285. "adc r5, r5, #0\n\t"
  126286. #endif
  126287. /* A[3] * B[6] */
  126288. "ldr r8, [%[a], #12]\n\t"
  126289. "ldr r9, [%[b], #24]\n\t"
  126290. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  126291. "lsl r6, r8, #16\n\t"
  126292. "lsl r7, r9, #16\n\t"
  126293. "lsr r6, r6, #16\n\t"
  126294. "lsr r7, r7, #16\n\t"
  126295. "mul r7, r6, r7\n\t"
  126296. "adds r3, r3, r7\n\t"
  126297. "adcs r4, r4, #0\n\t"
  126298. "adc r5, r5, #0\n\t"
  126299. "lsr r7, r9, #16\n\t"
  126300. "mul r6, r7, r6\n\t"
  126301. "lsr r7, r6, #16\n\t"
  126302. "lsl r6, r6, #16\n\t"
  126303. "adds r3, r3, r6\n\t"
  126304. "adcs r4, r4, r7\n\t"
  126305. "adc r5, r5, #0\n\t"
  126306. "lsr r6, r8, #16\n\t"
  126307. "lsr r7, r9, #16\n\t"
  126308. "mul r7, r6, r7\n\t"
  126309. "adds r4, r4, r7\n\t"
  126310. "adc r5, r5, #0\n\t"
  126311. "lsl r7, r9, #16\n\t"
  126312. "lsr r7, r7, #16\n\t"
  126313. "mul r6, r7, r6\n\t"
  126314. "lsr r7, r6, #16\n\t"
  126315. "lsl r6, r6, #16\n\t"
  126316. "adds r3, r3, r6\n\t"
  126317. "adcs r4, r4, r7\n\t"
  126318. "adc r5, r5, #0\n\t"
  126319. #else
  126320. "umull r6, r7, r8, r9\n\t"
  126321. "adds r3, r3, r6\n\t"
  126322. "adcs r4, r4, r7\n\t"
  126323. "adc r5, r5, #0\n\t"
  126324. #endif
  126325. /* A[4] * B[5] */
  126326. "ldr r9, [%[b], #20]\n\t"
  126327. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  126328. "lsl r6, r11, #16\n\t"
  126329. "lsl r7, r9, #16\n\t"
  126330. "lsr r6, r6, #16\n\t"
  126331. "lsr r7, r7, #16\n\t"
  126332. "mul r7, r6, r7\n\t"
  126333. "adds r3, r3, r7\n\t"
  126334. "adcs r4, r4, #0\n\t"
  126335. "adc r5, r5, #0\n\t"
  126336. "lsr r7, r9, #16\n\t"
  126337. "mul r6, r7, r6\n\t"
  126338. "lsr r7, r6, #16\n\t"
  126339. "lsl r6, r6, #16\n\t"
  126340. "adds r3, r3, r6\n\t"
  126341. "adcs r4, r4, r7\n\t"
  126342. "adc r5, r5, #0\n\t"
  126343. "lsr r6, r11, #16\n\t"
  126344. "lsr r7, r9, #16\n\t"
  126345. "mul r7, r6, r7\n\t"
  126346. "adds r4, r4, r7\n\t"
  126347. "adc r5, r5, #0\n\t"
  126348. "lsl r7, r9, #16\n\t"
  126349. "lsr r7, r7, #16\n\t"
  126350. "mul r6, r7, r6\n\t"
  126351. "lsr r7, r6, #16\n\t"
  126352. "lsl r6, r6, #16\n\t"
  126353. "adds r3, r3, r6\n\t"
  126354. "adcs r4, r4, r7\n\t"
  126355. "adc r5, r5, #0\n\t"
  126356. #else
  126357. "umull r6, r7, r11, r9\n\t"
  126358. "adds r3, r3, r6\n\t"
  126359. "adcs r4, r4, r7\n\t"
  126360. "adc r5, r5, #0\n\t"
  126361. #endif
  126362. /* A[5] * B[4] */
  126363. "ldr r8, [%[a], #20]\n\t"
  126364. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  126365. "lsl r6, r8, #16\n\t"
  126366. "lsl r7, r12, #16\n\t"
  126367. "lsr r6, r6, #16\n\t"
  126368. "lsr r7, r7, #16\n\t"
  126369. "mul r7, r6, r7\n\t"
  126370. "adds r3, r3, r7\n\t"
  126371. "adcs r4, r4, #0\n\t"
  126372. "adc r5, r5, #0\n\t"
  126373. "lsr r7, r12, #16\n\t"
  126374. "mul r6, r7, r6\n\t"
  126375. "lsr r7, r6, #16\n\t"
  126376. "lsl r6, r6, #16\n\t"
  126377. "adds r3, r3, r6\n\t"
  126378. "adcs r4, r4, r7\n\t"
  126379. "adc r5, r5, #0\n\t"
  126380. "lsr r6, r8, #16\n\t"
  126381. "lsr r7, r12, #16\n\t"
  126382. "mul r7, r6, r7\n\t"
  126383. "adds r4, r4, r7\n\t"
  126384. "adc r5, r5, #0\n\t"
  126385. "lsl r7, r12, #16\n\t"
  126386. "lsr r7, r7, #16\n\t"
  126387. "mul r6, r7, r6\n\t"
  126388. "lsr r7, r6, #16\n\t"
  126389. "lsl r6, r6, #16\n\t"
  126390. "adds r3, r3, r6\n\t"
  126391. "adcs r4, r4, r7\n\t"
  126392. "adc r5, r5, #0\n\t"
  126393. #else
  126394. "umull r6, r7, r8, r12\n\t"
  126395. "adds r3, r3, r6\n\t"
  126396. "adcs r4, r4, r7\n\t"
  126397. "adc r5, r5, #0\n\t"
  126398. #endif
  126399. /* A[6] * B[3] */
  126400. "ldr r8, [%[a], #24]\n\t"
  126401. "ldr r9, [%[b], #12]\n\t"
  126402. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  126403. "lsl r6, r8, #16\n\t"
  126404. "lsl r7, r9, #16\n\t"
  126405. "lsr r6, r6, #16\n\t"
  126406. "lsr r7, r7, #16\n\t"
  126407. "mul r7, r6, r7\n\t"
  126408. "adds r3, r3, r7\n\t"
  126409. "adcs r4, r4, #0\n\t"
  126410. "adc r5, r5, #0\n\t"
  126411. "lsr r7, r9, #16\n\t"
  126412. "mul r6, r7, r6\n\t"
  126413. "lsr r7, r6, #16\n\t"
  126414. "lsl r6, r6, #16\n\t"
  126415. "adds r3, r3, r6\n\t"
  126416. "adcs r4, r4, r7\n\t"
  126417. "adc r5, r5, #0\n\t"
  126418. "lsr r6, r8, #16\n\t"
  126419. "lsr r7, r9, #16\n\t"
  126420. "mul r7, r6, r7\n\t"
  126421. "adds r4, r4, r7\n\t"
  126422. "adc r5, r5, #0\n\t"
  126423. "lsl r7, r9, #16\n\t"
  126424. "lsr r7, r7, #16\n\t"
  126425. "mul r6, r7, r6\n\t"
  126426. "lsr r7, r6, #16\n\t"
  126427. "lsl r6, r6, #16\n\t"
  126428. "adds r3, r3, r6\n\t"
  126429. "adcs r4, r4, r7\n\t"
  126430. "adc r5, r5, #0\n\t"
  126431. #else
  126432. "umull r6, r7, r8, r9\n\t"
  126433. "adds r3, r3, r6\n\t"
  126434. "adcs r4, r4, r7\n\t"
  126435. "adc r5, r5, #0\n\t"
  126436. #endif
  126437. /* A[7] * B[2] */
  126438. "ldr r8, [%[a], #28]\n\t"
  126439. "ldr r9, [%[b], #8]\n\t"
  126440. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  126441. "lsl r6, r8, #16\n\t"
  126442. "lsl r7, r9, #16\n\t"
  126443. "lsr r6, r6, #16\n\t"
  126444. "lsr r7, r7, #16\n\t"
  126445. "mul r7, r6, r7\n\t"
  126446. "adds r3, r3, r7\n\t"
  126447. "adcs r4, r4, #0\n\t"
  126448. "adc r5, r5, #0\n\t"
  126449. "lsr r7, r9, #16\n\t"
  126450. "mul r6, r7, r6\n\t"
  126451. "lsr r7, r6, #16\n\t"
  126452. "lsl r6, r6, #16\n\t"
  126453. "adds r3, r3, r6\n\t"
  126454. "adcs r4, r4, r7\n\t"
  126455. "adc r5, r5, #0\n\t"
  126456. "lsr r6, r8, #16\n\t"
  126457. "lsr r7, r9, #16\n\t"
  126458. "mul r7, r6, r7\n\t"
  126459. "adds r4, r4, r7\n\t"
  126460. "adc r5, r5, #0\n\t"
  126461. "lsl r7, r9, #16\n\t"
  126462. "lsr r7, r7, #16\n\t"
  126463. "mul r6, r7, r6\n\t"
  126464. "lsr r7, r6, #16\n\t"
  126465. "lsl r6, r6, #16\n\t"
  126466. "adds r3, r3, r6\n\t"
  126467. "adcs r4, r4, r7\n\t"
  126468. "adc r5, r5, #0\n\t"
  126469. #else
  126470. "umull r6, r7, r8, r9\n\t"
  126471. "adds r3, r3, r6\n\t"
  126472. "adcs r4, r4, r7\n\t"
  126473. "adc r5, r5, #0\n\t"
  126474. #endif
  126475. /* A[8] * B[1] */
  126476. "ldr r8, [%[a], #32]\n\t"
  126477. "ldr r9, [%[b], #4]\n\t"
  126478. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  126479. "lsl r6, r8, #16\n\t"
  126480. "lsl r7, r9, #16\n\t"
  126481. "lsr r6, r6, #16\n\t"
  126482. "lsr r7, r7, #16\n\t"
  126483. "mul r7, r6, r7\n\t"
  126484. "adds r3, r3, r7\n\t"
  126485. "adcs r4, r4, #0\n\t"
  126486. "adc r5, r5, #0\n\t"
  126487. "lsr r7, r9, #16\n\t"
  126488. "mul r6, r7, r6\n\t"
  126489. "lsr r7, r6, #16\n\t"
  126490. "lsl r6, r6, #16\n\t"
  126491. "adds r3, r3, r6\n\t"
  126492. "adcs r4, r4, r7\n\t"
  126493. "adc r5, r5, #0\n\t"
  126494. "lsr r6, r8, #16\n\t"
  126495. "lsr r7, r9, #16\n\t"
  126496. "mul r7, r6, r7\n\t"
  126497. "adds r4, r4, r7\n\t"
  126498. "adc r5, r5, #0\n\t"
  126499. "lsl r7, r9, #16\n\t"
  126500. "lsr r7, r7, #16\n\t"
  126501. "mul r6, r7, r6\n\t"
  126502. "lsr r7, r6, #16\n\t"
  126503. "lsl r6, r6, #16\n\t"
  126504. "adds r3, r3, r6\n\t"
  126505. "adcs r4, r4, r7\n\t"
  126506. "adc r5, r5, #0\n\t"
  126507. #else
  126508. "umull r6, r7, r8, r9\n\t"
  126509. "adds r3, r3, r6\n\t"
  126510. "adcs r4, r4, r7\n\t"
  126511. "adc r5, r5, #0\n\t"
  126512. #endif
  126513. /* A[9] * B[0] */
  126514. "ldr r8, [%[a], #36]\n\t"
  126515. "ldr r9, [%[b]]\n\t"
  126516. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  126517. "lsl r6, r8, #16\n\t"
  126518. "lsl r7, r9, #16\n\t"
  126519. "lsr r6, r6, #16\n\t"
  126520. "lsr r7, r7, #16\n\t"
  126521. "mul r7, r6, r7\n\t"
  126522. "adds r3, r3, r7\n\t"
  126523. "adcs r4, r4, #0\n\t"
  126524. "adc r5, r5, #0\n\t"
  126525. "lsr r7, r9, #16\n\t"
  126526. "mul r6, r7, r6\n\t"
  126527. "lsr r7, r6, #16\n\t"
  126528. "lsl r6, r6, #16\n\t"
  126529. "adds r3, r3, r6\n\t"
  126530. "adcs r4, r4, r7\n\t"
  126531. "adc r5, r5, #0\n\t"
  126532. "lsr r6, r8, #16\n\t"
  126533. "lsr r7, r9, #16\n\t"
  126534. "mul r7, r6, r7\n\t"
  126535. "adds r4, r4, r7\n\t"
  126536. "adc r5, r5, #0\n\t"
  126537. "lsl r7, r9, #16\n\t"
  126538. "lsr r7, r7, #16\n\t"
  126539. "mul r6, r7, r6\n\t"
  126540. "lsr r7, r6, #16\n\t"
  126541. "lsl r6, r6, #16\n\t"
  126542. "adds r3, r3, r6\n\t"
  126543. "adcs r4, r4, r7\n\t"
  126544. "adc r5, r5, #0\n\t"
  126545. #else
  126546. "umull r6, r7, r8, r9\n\t"
  126547. "adds r3, r3, r6\n\t"
  126548. "adcs r4, r4, r7\n\t"
  126549. "adc r5, r5, #0\n\t"
  126550. #endif
  126551. "str r3, [sp, #36]\n\t"
  126552. /* A[10] * B[0] */
  126553. "ldr r8, [%[a], #40]\n\t"
  126554. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  126555. "lsl r6, r8, #16\n\t"
  126556. "lsl r7, r9, #16\n\t"
  126557. "lsr r6, r6, #16\n\t"
  126558. "lsr r7, r7, #16\n\t"
  126559. "mul r7, r6, r7\n\t"
  126560. "adds r4, r4, r7\n\t"
  126561. "adcs r5, r5, #0\n\t"
  126562. "mov r3, #0\n\t"
  126563. "adc r3, r3, #0\n\t"
  126564. "lsr r7, r9, #16\n\t"
  126565. "mul r6, r7, r6\n\t"
  126566. "lsr r7, r6, #16\n\t"
  126567. "lsl r6, r6, #16\n\t"
  126568. "adds r4, r4, r6\n\t"
  126569. "adcs r5, r5, r7\n\t"
  126570. "adc r3, r3, #0\n\t"
  126571. "lsr r6, r8, #16\n\t"
  126572. "lsr r7, r9, #16\n\t"
  126573. "mul r7, r6, r7\n\t"
  126574. "adds r5, r5, r7\n\t"
  126575. "adc r3, r3, #0\n\t"
  126576. "lsl r7, r9, #16\n\t"
  126577. "lsr r7, r7, #16\n\t"
  126578. "mul r6, r7, r6\n\t"
  126579. "lsr r7, r6, #16\n\t"
  126580. "lsl r6, r6, #16\n\t"
  126581. "adds r4, r4, r6\n\t"
  126582. "adcs r5, r5, r7\n\t"
  126583. "adc r3, r3, #0\n\t"
  126584. #else
  126585. "umull r6, r7, r8, r9\n\t"
  126586. "adds r4, r4, r6\n\t"
  126587. "adcs r5, r5, r7\n\t"
  126588. "mov r3, #0\n\t"
  126589. "adc r3, r3, #0\n\t"
  126590. #endif
  126591. /* A[9] * B[1] */
  126592. "ldr r8, [%[a], #36]\n\t"
  126593. "ldr r9, [%[b], #4]\n\t"
  126594. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  126595. "lsl r6, r8, #16\n\t"
  126596. "lsl r7, r9, #16\n\t"
  126597. "lsr r6, r6, #16\n\t"
  126598. "lsr r7, r7, #16\n\t"
  126599. "mul r7, r6, r7\n\t"
  126600. "adds r4, r4, r7\n\t"
  126601. "adcs r5, r5, #0\n\t"
  126602. "adc r3, r3, #0\n\t"
  126603. "lsr r7, r9, #16\n\t"
  126604. "mul r6, r7, r6\n\t"
  126605. "lsr r7, r6, #16\n\t"
  126606. "lsl r6, r6, #16\n\t"
  126607. "adds r4, r4, r6\n\t"
  126608. "adcs r5, r5, r7\n\t"
  126609. "adc r3, r3, #0\n\t"
  126610. "lsr r6, r8, #16\n\t"
  126611. "lsr r7, r9, #16\n\t"
  126612. "mul r7, r6, r7\n\t"
  126613. "adds r5, r5, r7\n\t"
  126614. "adc r3, r3, #0\n\t"
  126615. "lsl r7, r9, #16\n\t"
  126616. "lsr r7, r7, #16\n\t"
  126617. "mul r6, r7, r6\n\t"
  126618. "lsr r7, r6, #16\n\t"
  126619. "lsl r6, r6, #16\n\t"
  126620. "adds r4, r4, r6\n\t"
  126621. "adcs r5, r5, r7\n\t"
  126622. "adc r3, r3, #0\n\t"
  126623. #else
  126624. "umull r6, r7, r8, r9\n\t"
  126625. "adds r4, r4, r6\n\t"
  126626. "adcs r5, r5, r7\n\t"
  126627. "adc r3, r3, #0\n\t"
  126628. #endif
  126629. /* A[8] * B[2] */
  126630. "ldr r8, [%[a], #32]\n\t"
  126631. "ldr r9, [%[b], #8]\n\t"
  126632. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  126633. "lsl r6, r8, #16\n\t"
  126634. "lsl r7, r9, #16\n\t"
  126635. "lsr r6, r6, #16\n\t"
  126636. "lsr r7, r7, #16\n\t"
  126637. "mul r7, r6, r7\n\t"
  126638. "adds r4, r4, r7\n\t"
  126639. "adcs r5, r5, #0\n\t"
  126640. "adc r3, r3, #0\n\t"
  126641. "lsr r7, r9, #16\n\t"
  126642. "mul r6, r7, r6\n\t"
  126643. "lsr r7, r6, #16\n\t"
  126644. "lsl r6, r6, #16\n\t"
  126645. "adds r4, r4, r6\n\t"
  126646. "adcs r5, r5, r7\n\t"
  126647. "adc r3, r3, #0\n\t"
  126648. "lsr r6, r8, #16\n\t"
  126649. "lsr r7, r9, #16\n\t"
  126650. "mul r7, r6, r7\n\t"
  126651. "adds r5, r5, r7\n\t"
  126652. "adc r3, r3, #0\n\t"
  126653. "lsl r7, r9, #16\n\t"
  126654. "lsr r7, r7, #16\n\t"
  126655. "mul r6, r7, r6\n\t"
  126656. "lsr r7, r6, #16\n\t"
  126657. "lsl r6, r6, #16\n\t"
  126658. "adds r4, r4, r6\n\t"
  126659. "adcs r5, r5, r7\n\t"
  126660. "adc r3, r3, #0\n\t"
  126661. #else
  126662. "umull r6, r7, r8, r9\n\t"
  126663. "adds r4, r4, r6\n\t"
  126664. "adcs r5, r5, r7\n\t"
  126665. "adc r3, r3, #0\n\t"
  126666. #endif
  126667. /* A[7] * B[3] */
  126668. "ldr r8, [%[a], #28]\n\t"
  126669. "ldr r9, [%[b], #12]\n\t"
  126670. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  126671. "lsl r6, r8, #16\n\t"
  126672. "lsl r7, r9, #16\n\t"
  126673. "lsr r6, r6, #16\n\t"
  126674. "lsr r7, r7, #16\n\t"
  126675. "mul r7, r6, r7\n\t"
  126676. "adds r4, r4, r7\n\t"
  126677. "adcs r5, r5, #0\n\t"
  126678. "adc r3, r3, #0\n\t"
  126679. "lsr r7, r9, #16\n\t"
  126680. "mul r6, r7, r6\n\t"
  126681. "lsr r7, r6, #16\n\t"
  126682. "lsl r6, r6, #16\n\t"
  126683. "adds r4, r4, r6\n\t"
  126684. "adcs r5, r5, r7\n\t"
  126685. "adc r3, r3, #0\n\t"
  126686. "lsr r6, r8, #16\n\t"
  126687. "lsr r7, r9, #16\n\t"
  126688. "mul r7, r6, r7\n\t"
  126689. "adds r5, r5, r7\n\t"
  126690. "adc r3, r3, #0\n\t"
  126691. "lsl r7, r9, #16\n\t"
  126692. "lsr r7, r7, #16\n\t"
  126693. "mul r6, r7, r6\n\t"
  126694. "lsr r7, r6, #16\n\t"
  126695. "lsl r6, r6, #16\n\t"
  126696. "adds r4, r4, r6\n\t"
  126697. "adcs r5, r5, r7\n\t"
  126698. "adc r3, r3, #0\n\t"
  126699. #else
  126700. "umull r6, r7, r8, r9\n\t"
  126701. "adds r4, r4, r6\n\t"
  126702. "adcs r5, r5, r7\n\t"
  126703. "adc r3, r3, #0\n\t"
  126704. #endif
  126705. /* A[6] * B[4] */
  126706. "ldr r8, [%[a], #24]\n\t"
  126707. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  126708. "lsl r6, r8, #16\n\t"
  126709. "lsl r7, r12, #16\n\t"
  126710. "lsr r6, r6, #16\n\t"
  126711. "lsr r7, r7, #16\n\t"
  126712. "mul r7, r6, r7\n\t"
  126713. "adds r4, r4, r7\n\t"
  126714. "adcs r5, r5, #0\n\t"
  126715. "adc r3, r3, #0\n\t"
  126716. "lsr r7, r12, #16\n\t"
  126717. "mul r6, r7, r6\n\t"
  126718. "lsr r7, r6, #16\n\t"
  126719. "lsl r6, r6, #16\n\t"
  126720. "adds r4, r4, r6\n\t"
  126721. "adcs r5, r5, r7\n\t"
  126722. "adc r3, r3, #0\n\t"
  126723. "lsr r6, r8, #16\n\t"
  126724. "lsr r7, r12, #16\n\t"
  126725. "mul r7, r6, r7\n\t"
  126726. "adds r5, r5, r7\n\t"
  126727. "adc r3, r3, #0\n\t"
  126728. "lsl r7, r12, #16\n\t"
  126729. "lsr r7, r7, #16\n\t"
  126730. "mul r6, r7, r6\n\t"
  126731. "lsr r7, r6, #16\n\t"
  126732. "lsl r6, r6, #16\n\t"
  126733. "adds r4, r4, r6\n\t"
  126734. "adcs r5, r5, r7\n\t"
  126735. "adc r3, r3, #0\n\t"
  126736. #else
  126737. "umull r6, r7, r8, r12\n\t"
  126738. "adds r4, r4, r6\n\t"
  126739. "adcs r5, r5, r7\n\t"
  126740. "adc r3, r3, #0\n\t"
  126741. #endif
  126742. /* A[5] * B[5] */
  126743. "ldr r11, [%[a], #20]\n\t"
  126744. "ldr r12, [%[b], #20]\n\t"
  126745. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  126746. "lsl r6, r11, #16\n\t"
  126747. "lsl r7, r12, #16\n\t"
  126748. "lsr r6, r6, #16\n\t"
  126749. "lsr r7, r7, #16\n\t"
  126750. "mul r7, r6, r7\n\t"
  126751. "adds r4, r4, r7\n\t"
  126752. "adcs r5, r5, #0\n\t"
  126753. "adc r3, r3, #0\n\t"
  126754. "lsr r7, r12, #16\n\t"
  126755. "mul r6, r7, r6\n\t"
  126756. "lsr r7, r6, #16\n\t"
  126757. "lsl r6, r6, #16\n\t"
  126758. "adds r4, r4, r6\n\t"
  126759. "adcs r5, r5, r7\n\t"
  126760. "adc r3, r3, #0\n\t"
  126761. "lsr r6, r11, #16\n\t"
  126762. "lsr r7, r12, #16\n\t"
  126763. "mul r7, r6, r7\n\t"
  126764. "adds r5, r5, r7\n\t"
  126765. "adc r3, r3, #0\n\t"
  126766. "lsl r7, r12, #16\n\t"
  126767. "lsr r7, r7, #16\n\t"
  126768. "mul r6, r7, r6\n\t"
  126769. "lsr r7, r6, #16\n\t"
  126770. "lsl r6, r6, #16\n\t"
  126771. "adds r4, r4, r6\n\t"
  126772. "adcs r5, r5, r7\n\t"
  126773. "adc r3, r3, #0\n\t"
  126774. #else
  126775. "umull r6, r7, r11, r12\n\t"
  126776. "adds r4, r4, r6\n\t"
  126777. "adcs r5, r5, r7\n\t"
  126778. "adc r3, r3, #0\n\t"
  126779. #endif
  126780. /* A[4] * B[6] */
  126781. "ldr r8, [%[a], #16]\n\t"
  126782. "ldr r9, [%[b], #24]\n\t"
  126783. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  126784. "lsl r6, r8, #16\n\t"
  126785. "lsl r7, r9, #16\n\t"
  126786. "lsr r6, r6, #16\n\t"
  126787. "lsr r7, r7, #16\n\t"
  126788. "mul r7, r6, r7\n\t"
  126789. "adds r4, r4, r7\n\t"
  126790. "adcs r5, r5, #0\n\t"
  126791. "adc r3, r3, #0\n\t"
  126792. "lsr r7, r9, #16\n\t"
  126793. "mul r6, r7, r6\n\t"
  126794. "lsr r7, r6, #16\n\t"
  126795. "lsl r6, r6, #16\n\t"
  126796. "adds r4, r4, r6\n\t"
  126797. "adcs r5, r5, r7\n\t"
  126798. "adc r3, r3, #0\n\t"
  126799. "lsr r6, r8, #16\n\t"
  126800. "lsr r7, r9, #16\n\t"
  126801. "mul r7, r6, r7\n\t"
  126802. "adds r5, r5, r7\n\t"
  126803. "adc r3, r3, #0\n\t"
  126804. "lsl r7, r9, #16\n\t"
  126805. "lsr r7, r7, #16\n\t"
  126806. "mul r6, r7, r6\n\t"
  126807. "lsr r7, r6, #16\n\t"
  126808. "lsl r6, r6, #16\n\t"
  126809. "adds r4, r4, r6\n\t"
  126810. "adcs r5, r5, r7\n\t"
  126811. "adc r3, r3, #0\n\t"
  126812. #else
  126813. "umull r6, r7, r8, r9\n\t"
  126814. "adds r4, r4, r6\n\t"
  126815. "adcs r5, r5, r7\n\t"
  126816. "adc r3, r3, #0\n\t"
  126817. #endif
  126818. /* A[3] * B[7] */
  126819. "ldr r8, [%[a], #12]\n\t"
  126820. "ldr r9, [%[b], #28]\n\t"
  126821. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  126822. "lsl r6, r8, #16\n\t"
  126823. "lsl r7, r9, #16\n\t"
  126824. "lsr r6, r6, #16\n\t"
  126825. "lsr r7, r7, #16\n\t"
  126826. "mul r7, r6, r7\n\t"
  126827. "adds r4, r4, r7\n\t"
  126828. "adcs r5, r5, #0\n\t"
  126829. "adc r3, r3, #0\n\t"
  126830. "lsr r7, r9, #16\n\t"
  126831. "mul r6, r7, r6\n\t"
  126832. "lsr r7, r6, #16\n\t"
  126833. "lsl r6, r6, #16\n\t"
  126834. "adds r4, r4, r6\n\t"
  126835. "adcs r5, r5, r7\n\t"
  126836. "adc r3, r3, #0\n\t"
  126837. "lsr r6, r8, #16\n\t"
  126838. "lsr r7, r9, #16\n\t"
  126839. "mul r7, r6, r7\n\t"
  126840. "adds r5, r5, r7\n\t"
  126841. "adc r3, r3, #0\n\t"
  126842. "lsl r7, r9, #16\n\t"
  126843. "lsr r7, r7, #16\n\t"
  126844. "mul r6, r7, r6\n\t"
  126845. "lsr r7, r6, #16\n\t"
  126846. "lsl r6, r6, #16\n\t"
  126847. "adds r4, r4, r6\n\t"
  126848. "adcs r5, r5, r7\n\t"
  126849. "adc r3, r3, #0\n\t"
  126850. #else
  126851. "umull r6, r7, r8, r9\n\t"
  126852. "adds r4, r4, r6\n\t"
  126853. "adcs r5, r5, r7\n\t"
  126854. "adc r3, r3, #0\n\t"
  126855. #endif
  126856. /* A[2] * B[8] */
  126857. "ldr r8, [%[a], #8]\n\t"
  126858. "ldr r9, [%[b], #32]\n\t"
  126859. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  126860. "lsl r6, r8, #16\n\t"
  126861. "lsl r7, r9, #16\n\t"
  126862. "lsr r6, r6, #16\n\t"
  126863. "lsr r7, r7, #16\n\t"
  126864. "mul r7, r6, r7\n\t"
  126865. "adds r4, r4, r7\n\t"
  126866. "adcs r5, r5, #0\n\t"
  126867. "adc r3, r3, #0\n\t"
  126868. "lsr r7, r9, #16\n\t"
  126869. "mul r6, r7, r6\n\t"
  126870. "lsr r7, r6, #16\n\t"
  126871. "lsl r6, r6, #16\n\t"
  126872. "adds r4, r4, r6\n\t"
  126873. "adcs r5, r5, r7\n\t"
  126874. "adc r3, r3, #0\n\t"
  126875. "lsr r6, r8, #16\n\t"
  126876. "lsr r7, r9, #16\n\t"
  126877. "mul r7, r6, r7\n\t"
  126878. "adds r5, r5, r7\n\t"
  126879. "adc r3, r3, #0\n\t"
  126880. "lsl r7, r9, #16\n\t"
  126881. "lsr r7, r7, #16\n\t"
  126882. "mul r6, r7, r6\n\t"
  126883. "lsr r7, r6, #16\n\t"
  126884. "lsl r6, r6, #16\n\t"
  126885. "adds r4, r4, r6\n\t"
  126886. "adcs r5, r5, r7\n\t"
  126887. "adc r3, r3, #0\n\t"
  126888. #else
  126889. "umull r6, r7, r8, r9\n\t"
  126890. "adds r4, r4, r6\n\t"
  126891. "adcs r5, r5, r7\n\t"
  126892. "adc r3, r3, #0\n\t"
  126893. #endif
  126894. /* A[1] * B[9] */
  126895. "ldr r8, [%[a], #4]\n\t"
  126896. "ldr r9, [%[b], #36]\n\t"
  126897. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  126898. "lsl r6, r8, #16\n\t"
  126899. "lsl r7, r9, #16\n\t"
  126900. "lsr r6, r6, #16\n\t"
  126901. "lsr r7, r7, #16\n\t"
  126902. "mul r7, r6, r7\n\t"
  126903. "adds r4, r4, r7\n\t"
  126904. "adcs r5, r5, #0\n\t"
  126905. "adc r3, r3, #0\n\t"
  126906. "lsr r7, r9, #16\n\t"
  126907. "mul r6, r7, r6\n\t"
  126908. "lsr r7, r6, #16\n\t"
  126909. "lsl r6, r6, #16\n\t"
  126910. "adds r4, r4, r6\n\t"
  126911. "adcs r5, r5, r7\n\t"
  126912. "adc r3, r3, #0\n\t"
  126913. "lsr r6, r8, #16\n\t"
  126914. "lsr r7, r9, #16\n\t"
  126915. "mul r7, r6, r7\n\t"
  126916. "adds r5, r5, r7\n\t"
  126917. "adc r3, r3, #0\n\t"
  126918. "lsl r7, r9, #16\n\t"
  126919. "lsr r7, r7, #16\n\t"
  126920. "mul r6, r7, r6\n\t"
  126921. "lsr r7, r6, #16\n\t"
  126922. "lsl r6, r6, #16\n\t"
  126923. "adds r4, r4, r6\n\t"
  126924. "adcs r5, r5, r7\n\t"
  126925. "adc r3, r3, #0\n\t"
  126926. #else
  126927. "umull r6, r7, r8, r9\n\t"
  126928. "adds r4, r4, r6\n\t"
  126929. "adcs r5, r5, r7\n\t"
  126930. "adc r3, r3, #0\n\t"
  126931. #endif
  126932. /* A[0] * B[10] */
  126933. "ldr r8, [%[a]]\n\t"
  126934. "ldr r9, [%[b], #40]\n\t"
  126935. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  126936. "lsl r6, r8, #16\n\t"
  126937. "lsl r7, r9, #16\n\t"
  126938. "lsr r6, r6, #16\n\t"
  126939. "lsr r7, r7, #16\n\t"
  126940. "mul r7, r6, r7\n\t"
  126941. "adds r4, r4, r7\n\t"
  126942. "adcs r5, r5, #0\n\t"
  126943. "adc r3, r3, #0\n\t"
  126944. "lsr r7, r9, #16\n\t"
  126945. "mul r6, r7, r6\n\t"
  126946. "lsr r7, r6, #16\n\t"
  126947. "lsl r6, r6, #16\n\t"
  126948. "adds r4, r4, r6\n\t"
  126949. "adcs r5, r5, r7\n\t"
  126950. "adc r3, r3, #0\n\t"
  126951. "lsr r6, r8, #16\n\t"
  126952. "lsr r7, r9, #16\n\t"
  126953. "mul r7, r6, r7\n\t"
  126954. "adds r5, r5, r7\n\t"
  126955. "adc r3, r3, #0\n\t"
  126956. "lsl r7, r9, #16\n\t"
  126957. "lsr r7, r7, #16\n\t"
  126958. "mul r6, r7, r6\n\t"
  126959. "lsr r7, r6, #16\n\t"
  126960. "lsl r6, r6, #16\n\t"
  126961. "adds r4, r4, r6\n\t"
  126962. "adcs r5, r5, r7\n\t"
  126963. "adc r3, r3, #0\n\t"
  126964. #else
  126965. "umull r6, r7, r8, r9\n\t"
  126966. "adds r4, r4, r6\n\t"
  126967. "adcs r5, r5, r7\n\t"
  126968. "adc r3, r3, #0\n\t"
  126969. #endif
  126970. "str r4, [sp, #40]\n\t"
  126971. /* A[0] * B[11] */
  126972. "ldr r9, [%[b], #44]\n\t"
  126973. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  126974. "lsl r6, r8, #16\n\t"
  126975. "lsl r7, r9, #16\n\t"
  126976. "lsr r6, r6, #16\n\t"
  126977. "lsr r7, r7, #16\n\t"
  126978. "mul r7, r6, r7\n\t"
  126979. "adds r5, r5, r7\n\t"
  126980. "adcs r3, r3, #0\n\t"
  126981. "mov r4, #0\n\t"
  126982. "adc r4, r4, #0\n\t"
  126983. "lsr r7, r9, #16\n\t"
  126984. "mul r6, r7, r6\n\t"
  126985. "lsr r7, r6, #16\n\t"
  126986. "lsl r6, r6, #16\n\t"
  126987. "adds r5, r5, r6\n\t"
  126988. "adcs r3, r3, r7\n\t"
  126989. "adc r4, r4, #0\n\t"
  126990. "lsr r6, r8, #16\n\t"
  126991. "lsr r7, r9, #16\n\t"
  126992. "mul r7, r6, r7\n\t"
  126993. "adds r3, r3, r7\n\t"
  126994. "adc r4, r4, #0\n\t"
  126995. "lsl r7, r9, #16\n\t"
  126996. "lsr r7, r7, #16\n\t"
  126997. "mul r6, r7, r6\n\t"
  126998. "lsr r7, r6, #16\n\t"
  126999. "lsl r6, r6, #16\n\t"
  127000. "adds r5, r5, r6\n\t"
  127001. "adcs r3, r3, r7\n\t"
  127002. "adc r4, r4, #0\n\t"
  127003. #else
  127004. "umull r6, r7, r8, r9\n\t"
  127005. "adds r5, r5, r6\n\t"
  127006. "adcs r3, r3, r7\n\t"
  127007. "mov r4, #0\n\t"
  127008. "adc r4, r4, #0\n\t"
  127009. #endif
  127010. /* A[1] * B[10] */
  127011. "ldr r8, [%[a], #4]\n\t"
  127012. "ldr r9, [%[b], #40]\n\t"
  127013. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  127014. "lsl r6, r8, #16\n\t"
  127015. "lsl r7, r9, #16\n\t"
  127016. "lsr r6, r6, #16\n\t"
  127017. "lsr r7, r7, #16\n\t"
  127018. "mul r7, r6, r7\n\t"
  127019. "adds r5, r5, r7\n\t"
  127020. "adcs r3, r3, #0\n\t"
  127021. "adc r4, r4, #0\n\t"
  127022. "lsr r7, r9, #16\n\t"
  127023. "mul r6, r7, r6\n\t"
  127024. "lsr r7, r6, #16\n\t"
  127025. "lsl r6, r6, #16\n\t"
  127026. "adds r5, r5, r6\n\t"
  127027. "adcs r3, r3, r7\n\t"
  127028. "adc r4, r4, #0\n\t"
  127029. "lsr r6, r8, #16\n\t"
  127030. "lsr r7, r9, #16\n\t"
  127031. "mul r7, r6, r7\n\t"
  127032. "adds r3, r3, r7\n\t"
  127033. "adc r4, r4, #0\n\t"
  127034. "lsl r7, r9, #16\n\t"
  127035. "lsr r7, r7, #16\n\t"
  127036. "mul r6, r7, r6\n\t"
  127037. "lsr r7, r6, #16\n\t"
  127038. "lsl r6, r6, #16\n\t"
  127039. "adds r5, r5, r6\n\t"
  127040. "adcs r3, r3, r7\n\t"
  127041. "adc r4, r4, #0\n\t"
  127042. #else
  127043. "umull r6, r7, r8, r9\n\t"
  127044. "adds r5, r5, r6\n\t"
  127045. "adcs r3, r3, r7\n\t"
  127046. "adc r4, r4, #0\n\t"
  127047. #endif
  127048. /* A[2] * B[9] */
  127049. "ldr r8, [%[a], #8]\n\t"
  127050. "ldr r9, [%[b], #36]\n\t"
  127051. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  127052. "lsl r6, r8, #16\n\t"
  127053. "lsl r7, r9, #16\n\t"
  127054. "lsr r6, r6, #16\n\t"
  127055. "lsr r7, r7, #16\n\t"
  127056. "mul r7, r6, r7\n\t"
  127057. "adds r5, r5, r7\n\t"
  127058. "adcs r3, r3, #0\n\t"
  127059. "adc r4, r4, #0\n\t"
  127060. "lsr r7, r9, #16\n\t"
  127061. "mul r6, r7, r6\n\t"
  127062. "lsr r7, r6, #16\n\t"
  127063. "lsl r6, r6, #16\n\t"
  127064. "adds r5, r5, r6\n\t"
  127065. "adcs r3, r3, r7\n\t"
  127066. "adc r4, r4, #0\n\t"
  127067. "lsr r6, r8, #16\n\t"
  127068. "lsr r7, r9, #16\n\t"
  127069. "mul r7, r6, r7\n\t"
  127070. "adds r3, r3, r7\n\t"
  127071. "adc r4, r4, #0\n\t"
  127072. "lsl r7, r9, #16\n\t"
  127073. "lsr r7, r7, #16\n\t"
  127074. "mul r6, r7, r6\n\t"
  127075. "lsr r7, r6, #16\n\t"
  127076. "lsl r6, r6, #16\n\t"
  127077. "adds r5, r5, r6\n\t"
  127078. "adcs r3, r3, r7\n\t"
  127079. "adc r4, r4, #0\n\t"
  127080. #else
  127081. "umull r6, r7, r8, r9\n\t"
  127082. "adds r5, r5, r6\n\t"
  127083. "adcs r3, r3, r7\n\t"
  127084. "adc r4, r4, #0\n\t"
  127085. #endif
  127086. /* A[3] * B[8] */
  127087. "ldr r8, [%[a], #12]\n\t"
  127088. "ldr r9, [%[b], #32]\n\t"
  127089. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  127090. "lsl r6, r8, #16\n\t"
  127091. "lsl r7, r9, #16\n\t"
  127092. "lsr r6, r6, #16\n\t"
  127093. "lsr r7, r7, #16\n\t"
  127094. "mul r7, r6, r7\n\t"
  127095. "adds r5, r5, r7\n\t"
  127096. "adcs r3, r3, #0\n\t"
  127097. "adc r4, r4, #0\n\t"
  127098. "lsr r7, r9, #16\n\t"
  127099. "mul r6, r7, r6\n\t"
  127100. "lsr r7, r6, #16\n\t"
  127101. "lsl r6, r6, #16\n\t"
  127102. "adds r5, r5, r6\n\t"
  127103. "adcs r3, r3, r7\n\t"
  127104. "adc r4, r4, #0\n\t"
  127105. "lsr r6, r8, #16\n\t"
  127106. "lsr r7, r9, #16\n\t"
  127107. "mul r7, r6, r7\n\t"
  127108. "adds r3, r3, r7\n\t"
  127109. "adc r4, r4, #0\n\t"
  127110. "lsl r7, r9, #16\n\t"
  127111. "lsr r7, r7, #16\n\t"
  127112. "mul r6, r7, r6\n\t"
  127113. "lsr r7, r6, #16\n\t"
  127114. "lsl r6, r6, #16\n\t"
  127115. "adds r5, r5, r6\n\t"
  127116. "adcs r3, r3, r7\n\t"
  127117. "adc r4, r4, #0\n\t"
  127118. #else
  127119. "umull r6, r7, r8, r9\n\t"
  127120. "adds r5, r5, r6\n\t"
  127121. "adcs r3, r3, r7\n\t"
  127122. "adc r4, r4, #0\n\t"
  127123. #endif
  127124. /* A[4] * B[7] */
  127125. "ldr r8, [%[a], #16]\n\t"
  127126. "ldr r9, [%[b], #28]\n\t"
  127127. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  127128. "lsl r6, r8, #16\n\t"
  127129. "lsl r7, r9, #16\n\t"
  127130. "lsr r6, r6, #16\n\t"
  127131. "lsr r7, r7, #16\n\t"
  127132. "mul r7, r6, r7\n\t"
  127133. "adds r5, r5, r7\n\t"
  127134. "adcs r3, r3, #0\n\t"
  127135. "adc r4, r4, #0\n\t"
  127136. "lsr r7, r9, #16\n\t"
  127137. "mul r6, r7, r6\n\t"
  127138. "lsr r7, r6, #16\n\t"
  127139. "lsl r6, r6, #16\n\t"
  127140. "adds r5, r5, r6\n\t"
  127141. "adcs r3, r3, r7\n\t"
  127142. "adc r4, r4, #0\n\t"
  127143. "lsr r6, r8, #16\n\t"
  127144. "lsr r7, r9, #16\n\t"
  127145. "mul r7, r6, r7\n\t"
  127146. "adds r3, r3, r7\n\t"
  127147. "adc r4, r4, #0\n\t"
  127148. "lsl r7, r9, #16\n\t"
  127149. "lsr r7, r7, #16\n\t"
  127150. "mul r6, r7, r6\n\t"
  127151. "lsr r7, r6, #16\n\t"
  127152. "lsl r6, r6, #16\n\t"
  127153. "adds r5, r5, r6\n\t"
  127154. "adcs r3, r3, r7\n\t"
  127155. "adc r4, r4, #0\n\t"
  127156. #else
  127157. "umull r6, r7, r8, r9\n\t"
  127158. "adds r5, r5, r6\n\t"
  127159. "adcs r3, r3, r7\n\t"
  127160. "adc r4, r4, #0\n\t"
  127161. #endif
  127162. /* A[5] * B[6] */
  127163. "ldr r9, [%[b], #24]\n\t"
  127164. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  127165. "lsl r6, r11, #16\n\t"
  127166. "lsl r7, r9, #16\n\t"
  127167. "lsr r6, r6, #16\n\t"
  127168. "lsr r7, r7, #16\n\t"
  127169. "mul r7, r6, r7\n\t"
  127170. "adds r5, r5, r7\n\t"
  127171. "adcs r3, r3, #0\n\t"
  127172. "adc r4, r4, #0\n\t"
  127173. "lsr r7, r9, #16\n\t"
  127174. "mul r6, r7, r6\n\t"
  127175. "lsr r7, r6, #16\n\t"
  127176. "lsl r6, r6, #16\n\t"
  127177. "adds r5, r5, r6\n\t"
  127178. "adcs r3, r3, r7\n\t"
  127179. "adc r4, r4, #0\n\t"
  127180. "lsr r6, r11, #16\n\t"
  127181. "lsr r7, r9, #16\n\t"
  127182. "mul r7, r6, r7\n\t"
  127183. "adds r3, r3, r7\n\t"
  127184. "adc r4, r4, #0\n\t"
  127185. "lsl r7, r9, #16\n\t"
  127186. "lsr r7, r7, #16\n\t"
  127187. "mul r6, r7, r6\n\t"
  127188. "lsr r7, r6, #16\n\t"
  127189. "lsl r6, r6, #16\n\t"
  127190. "adds r5, r5, r6\n\t"
  127191. "adcs r3, r3, r7\n\t"
  127192. "adc r4, r4, #0\n\t"
  127193. #else
  127194. "umull r6, r7, r11, r9\n\t"
  127195. "adds r5, r5, r6\n\t"
  127196. "adcs r3, r3, r7\n\t"
  127197. "adc r4, r4, #0\n\t"
  127198. #endif
  127199. /* A[6] * B[5] */
  127200. "ldr r8, [%[a], #24]\n\t"
  127201. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  127202. "lsl r6, r8, #16\n\t"
  127203. "lsl r7, r12, #16\n\t"
  127204. "lsr r6, r6, #16\n\t"
  127205. "lsr r7, r7, #16\n\t"
  127206. "mul r7, r6, r7\n\t"
  127207. "adds r5, r5, r7\n\t"
  127208. "adcs r3, r3, #0\n\t"
  127209. "adc r4, r4, #0\n\t"
  127210. "lsr r7, r12, #16\n\t"
  127211. "mul r6, r7, r6\n\t"
  127212. "lsr r7, r6, #16\n\t"
  127213. "lsl r6, r6, #16\n\t"
  127214. "adds r5, r5, r6\n\t"
  127215. "adcs r3, r3, r7\n\t"
  127216. "adc r4, r4, #0\n\t"
  127217. "lsr r6, r8, #16\n\t"
  127218. "lsr r7, r12, #16\n\t"
  127219. "mul r7, r6, r7\n\t"
  127220. "adds r3, r3, r7\n\t"
  127221. "adc r4, r4, #0\n\t"
  127222. "lsl r7, r12, #16\n\t"
  127223. "lsr r7, r7, #16\n\t"
  127224. "mul r6, r7, r6\n\t"
  127225. "lsr r7, r6, #16\n\t"
  127226. "lsl r6, r6, #16\n\t"
  127227. "adds r5, r5, r6\n\t"
  127228. "adcs r3, r3, r7\n\t"
  127229. "adc r4, r4, #0\n\t"
  127230. #else
  127231. "umull r6, r7, r8, r12\n\t"
  127232. "adds r5, r5, r6\n\t"
  127233. "adcs r3, r3, r7\n\t"
  127234. "adc r4, r4, #0\n\t"
  127235. #endif
  127236. /* A[7] * B[4] */
  127237. "ldr r8, [%[a], #28]\n\t"
  127238. "ldr r9, [%[b], #16]\n\t"
  127239. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  127240. "lsl r6, r8, #16\n\t"
  127241. "lsl r7, r9, #16\n\t"
  127242. "lsr r6, r6, #16\n\t"
  127243. "lsr r7, r7, #16\n\t"
  127244. "mul r7, r6, r7\n\t"
  127245. "adds r5, r5, r7\n\t"
  127246. "adcs r3, r3, #0\n\t"
  127247. "adc r4, r4, #0\n\t"
  127248. "lsr r7, r9, #16\n\t"
  127249. "mul r6, r7, r6\n\t"
  127250. "lsr r7, r6, #16\n\t"
  127251. "lsl r6, r6, #16\n\t"
  127252. "adds r5, r5, r6\n\t"
  127253. "adcs r3, r3, r7\n\t"
  127254. "adc r4, r4, #0\n\t"
  127255. "lsr r6, r8, #16\n\t"
  127256. "lsr r7, r9, #16\n\t"
  127257. "mul r7, r6, r7\n\t"
  127258. "adds r3, r3, r7\n\t"
  127259. "adc r4, r4, #0\n\t"
  127260. "lsl r7, r9, #16\n\t"
  127261. "lsr r7, r7, #16\n\t"
  127262. "mul r6, r7, r6\n\t"
  127263. "lsr r7, r6, #16\n\t"
  127264. "lsl r6, r6, #16\n\t"
  127265. "adds r5, r5, r6\n\t"
  127266. "adcs r3, r3, r7\n\t"
  127267. "adc r4, r4, #0\n\t"
  127268. #else
  127269. "umull r6, r7, r8, r9\n\t"
  127270. "adds r5, r5, r6\n\t"
  127271. "adcs r3, r3, r7\n\t"
  127272. "adc r4, r4, #0\n\t"
  127273. #endif
  127274. /* A[8] * B[3] */
  127275. "ldr r8, [%[a], #32]\n\t"
  127276. "ldr r9, [%[b], #12]\n\t"
  127277. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  127278. "lsl r6, r8, #16\n\t"
  127279. "lsl r7, r9, #16\n\t"
  127280. "lsr r6, r6, #16\n\t"
  127281. "lsr r7, r7, #16\n\t"
  127282. "mul r7, r6, r7\n\t"
  127283. "adds r5, r5, r7\n\t"
  127284. "adcs r3, r3, #0\n\t"
  127285. "adc r4, r4, #0\n\t"
  127286. "lsr r7, r9, #16\n\t"
  127287. "mul r6, r7, r6\n\t"
  127288. "lsr r7, r6, #16\n\t"
  127289. "lsl r6, r6, #16\n\t"
  127290. "adds r5, r5, r6\n\t"
  127291. "adcs r3, r3, r7\n\t"
  127292. "adc r4, r4, #0\n\t"
  127293. "lsr r6, r8, #16\n\t"
  127294. "lsr r7, r9, #16\n\t"
  127295. "mul r7, r6, r7\n\t"
  127296. "adds r3, r3, r7\n\t"
  127297. "adc r4, r4, #0\n\t"
  127298. "lsl r7, r9, #16\n\t"
  127299. "lsr r7, r7, #16\n\t"
  127300. "mul r6, r7, r6\n\t"
  127301. "lsr r7, r6, #16\n\t"
  127302. "lsl r6, r6, #16\n\t"
  127303. "adds r5, r5, r6\n\t"
  127304. "adcs r3, r3, r7\n\t"
  127305. "adc r4, r4, #0\n\t"
  127306. #else
  127307. "umull r6, r7, r8, r9\n\t"
  127308. "adds r5, r5, r6\n\t"
  127309. "adcs r3, r3, r7\n\t"
  127310. "adc r4, r4, #0\n\t"
  127311. #endif
  127312. /* A[9] * B[2] */
  127313. "ldr r8, [%[a], #36]\n\t"
  127314. "ldr r9, [%[b], #8]\n\t"
  127315. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  127316. "lsl r6, r8, #16\n\t"
  127317. "lsl r7, r9, #16\n\t"
  127318. "lsr r6, r6, #16\n\t"
  127319. "lsr r7, r7, #16\n\t"
  127320. "mul r7, r6, r7\n\t"
  127321. "adds r5, r5, r7\n\t"
  127322. "adcs r3, r3, #0\n\t"
  127323. "adc r4, r4, #0\n\t"
  127324. "lsr r7, r9, #16\n\t"
  127325. "mul r6, r7, r6\n\t"
  127326. "lsr r7, r6, #16\n\t"
  127327. "lsl r6, r6, #16\n\t"
  127328. "adds r5, r5, r6\n\t"
  127329. "adcs r3, r3, r7\n\t"
  127330. "adc r4, r4, #0\n\t"
  127331. "lsr r6, r8, #16\n\t"
  127332. "lsr r7, r9, #16\n\t"
  127333. "mul r7, r6, r7\n\t"
  127334. "adds r3, r3, r7\n\t"
  127335. "adc r4, r4, #0\n\t"
  127336. "lsl r7, r9, #16\n\t"
  127337. "lsr r7, r7, #16\n\t"
  127338. "mul r6, r7, r6\n\t"
  127339. "lsr r7, r6, #16\n\t"
  127340. "lsl r6, r6, #16\n\t"
  127341. "adds r5, r5, r6\n\t"
  127342. "adcs r3, r3, r7\n\t"
  127343. "adc r4, r4, #0\n\t"
  127344. #else
  127345. "umull r6, r7, r8, r9\n\t"
  127346. "adds r5, r5, r6\n\t"
  127347. "adcs r3, r3, r7\n\t"
  127348. "adc r4, r4, #0\n\t"
  127349. #endif
  127350. /* A[10] * B[1] */
  127351. "ldr r8, [%[a], #40]\n\t"
  127352. "ldr r9, [%[b], #4]\n\t"
  127353. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  127354. "lsl r6, r8, #16\n\t"
  127355. "lsl r7, r9, #16\n\t"
  127356. "lsr r6, r6, #16\n\t"
  127357. "lsr r7, r7, #16\n\t"
  127358. "mul r7, r6, r7\n\t"
  127359. "adds r5, r5, r7\n\t"
  127360. "adcs r3, r3, #0\n\t"
  127361. "adc r4, r4, #0\n\t"
  127362. "lsr r7, r9, #16\n\t"
  127363. "mul r6, r7, r6\n\t"
  127364. "lsr r7, r6, #16\n\t"
  127365. "lsl r6, r6, #16\n\t"
  127366. "adds r5, r5, r6\n\t"
  127367. "adcs r3, r3, r7\n\t"
  127368. "adc r4, r4, #0\n\t"
  127369. "lsr r6, r8, #16\n\t"
  127370. "lsr r7, r9, #16\n\t"
  127371. "mul r7, r6, r7\n\t"
  127372. "adds r3, r3, r7\n\t"
  127373. "adc r4, r4, #0\n\t"
  127374. "lsl r7, r9, #16\n\t"
  127375. "lsr r7, r7, #16\n\t"
  127376. "mul r6, r7, r6\n\t"
  127377. "lsr r7, r6, #16\n\t"
  127378. "lsl r6, r6, #16\n\t"
  127379. "adds r5, r5, r6\n\t"
  127380. "adcs r3, r3, r7\n\t"
  127381. "adc r4, r4, #0\n\t"
  127382. #else
  127383. "umull r6, r7, r8, r9\n\t"
  127384. "adds r5, r5, r6\n\t"
  127385. "adcs r3, r3, r7\n\t"
  127386. "adc r4, r4, #0\n\t"
  127387. #endif
  127388. /* A[11] * B[0] */
  127389. "ldr r8, [%[a], #44]\n\t"
  127390. "ldr r9, [%[b]]\n\t"
  127391. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  127392. "lsl r6, r8, #16\n\t"
  127393. "lsl r7, r9, #16\n\t"
  127394. "lsr r6, r6, #16\n\t"
  127395. "lsr r7, r7, #16\n\t"
  127396. "mul r7, r6, r7\n\t"
  127397. "adds r5, r5, r7\n\t"
  127398. "adcs r3, r3, #0\n\t"
  127399. "adc r4, r4, #0\n\t"
  127400. "lsr r7, r9, #16\n\t"
  127401. "mul r6, r7, r6\n\t"
  127402. "lsr r7, r6, #16\n\t"
  127403. "lsl r6, r6, #16\n\t"
  127404. "adds r5, r5, r6\n\t"
  127405. "adcs r3, r3, r7\n\t"
  127406. "adc r4, r4, #0\n\t"
  127407. "lsr r6, r8, #16\n\t"
  127408. "lsr r7, r9, #16\n\t"
  127409. "mul r7, r6, r7\n\t"
  127410. "adds r3, r3, r7\n\t"
  127411. "adc r4, r4, #0\n\t"
  127412. "lsl r7, r9, #16\n\t"
  127413. "lsr r7, r7, #16\n\t"
  127414. "mul r6, r7, r6\n\t"
  127415. "lsr r7, r6, #16\n\t"
  127416. "lsl r6, r6, #16\n\t"
  127417. "adds r5, r5, r6\n\t"
  127418. "adcs r3, r3, r7\n\t"
  127419. "adc r4, r4, #0\n\t"
  127420. #else
  127421. "umull r6, r7, r8, r9\n\t"
  127422. "adds r5, r5, r6\n\t"
  127423. "adcs r3, r3, r7\n\t"
  127424. "adc r4, r4, #0\n\t"
  127425. #endif
  127426. "str r5, [sp, #44]\n\t"
  127427. /* A[12] * B[0] */
  127428. "ldr r8, [%[a], #48]\n\t"
  127429. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  127430. "lsl r6, r8, #16\n\t"
  127431. "lsl r7, r9, #16\n\t"
  127432. "lsr r6, r6, #16\n\t"
  127433. "lsr r7, r7, #16\n\t"
  127434. "mul r7, r6, r7\n\t"
  127435. "adds r3, r3, r7\n\t"
  127436. "adcs r4, r4, #0\n\t"
  127437. "mov r5, #0\n\t"
  127438. "adc r5, r5, #0\n\t"
  127439. "lsr r7, r9, #16\n\t"
  127440. "mul r6, r7, r6\n\t"
  127441. "lsr r7, r6, #16\n\t"
  127442. "lsl r6, r6, #16\n\t"
  127443. "adds r3, r3, r6\n\t"
  127444. "adcs r4, r4, r7\n\t"
  127445. "adc r5, r5, #0\n\t"
  127446. "lsr r6, r8, #16\n\t"
  127447. "lsr r7, r9, #16\n\t"
  127448. "mul r7, r6, r7\n\t"
  127449. "adds r4, r4, r7\n\t"
  127450. "adc r5, r5, #0\n\t"
  127451. "lsl r7, r9, #16\n\t"
  127452. "lsr r7, r7, #16\n\t"
  127453. "mul r6, r7, r6\n\t"
  127454. "lsr r7, r6, #16\n\t"
  127455. "lsl r6, r6, #16\n\t"
  127456. "adds r3, r3, r6\n\t"
  127457. "adcs r4, r4, r7\n\t"
  127458. "adc r5, r5, #0\n\t"
  127459. #else
  127460. "umull r6, r7, r8, r9\n\t"
  127461. "adds r3, r3, r6\n\t"
  127462. "adcs r4, r4, r7\n\t"
  127463. "mov r5, #0\n\t"
  127464. "adc r5, r5, #0\n\t"
  127465. #endif
  127466. /* A[11] * B[1] */
  127467. "ldr r8, [%[a], #44]\n\t"
  127468. "ldr r9, [%[b], #4]\n\t"
  127469. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  127470. "lsl r6, r8, #16\n\t"
  127471. "lsl r7, r9, #16\n\t"
  127472. "lsr r6, r6, #16\n\t"
  127473. "lsr r7, r7, #16\n\t"
  127474. "mul r7, r6, r7\n\t"
  127475. "adds r3, r3, r7\n\t"
  127476. "adcs r4, r4, #0\n\t"
  127477. "adc r5, r5, #0\n\t"
  127478. "lsr r7, r9, #16\n\t"
  127479. "mul r6, r7, r6\n\t"
  127480. "lsr r7, r6, #16\n\t"
  127481. "lsl r6, r6, #16\n\t"
  127482. "adds r3, r3, r6\n\t"
  127483. "adcs r4, r4, r7\n\t"
  127484. "adc r5, r5, #0\n\t"
  127485. "lsr r6, r8, #16\n\t"
  127486. "lsr r7, r9, #16\n\t"
  127487. "mul r7, r6, r7\n\t"
  127488. "adds r4, r4, r7\n\t"
  127489. "adc r5, r5, #0\n\t"
  127490. "lsl r7, r9, #16\n\t"
  127491. "lsr r7, r7, #16\n\t"
  127492. "mul r6, r7, r6\n\t"
  127493. "lsr r7, r6, #16\n\t"
  127494. "lsl r6, r6, #16\n\t"
  127495. "adds r3, r3, r6\n\t"
  127496. "adcs r4, r4, r7\n\t"
  127497. "adc r5, r5, #0\n\t"
  127498. #else
  127499. "umull r6, r7, r8, r9\n\t"
  127500. "adds r3, r3, r6\n\t"
  127501. "adcs r4, r4, r7\n\t"
  127502. "adc r5, r5, #0\n\t"
  127503. #endif
  127504. /* A[10] * B[2] */
  127505. "ldr r8, [%[a], #40]\n\t"
  127506. "ldr r9, [%[b], #8]\n\t"
  127507. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  127508. "lsl r6, r8, #16\n\t"
  127509. "lsl r7, r9, #16\n\t"
  127510. "lsr r6, r6, #16\n\t"
  127511. "lsr r7, r7, #16\n\t"
  127512. "mul r7, r6, r7\n\t"
  127513. "adds r3, r3, r7\n\t"
  127514. "adcs r4, r4, #0\n\t"
  127515. "adc r5, r5, #0\n\t"
  127516. "lsr r7, r9, #16\n\t"
  127517. "mul r6, r7, r6\n\t"
  127518. "lsr r7, r6, #16\n\t"
  127519. "lsl r6, r6, #16\n\t"
  127520. "adds r3, r3, r6\n\t"
  127521. "adcs r4, r4, r7\n\t"
  127522. "adc r5, r5, #0\n\t"
  127523. "lsr r6, r8, #16\n\t"
  127524. "lsr r7, r9, #16\n\t"
  127525. "mul r7, r6, r7\n\t"
  127526. "adds r4, r4, r7\n\t"
  127527. "adc r5, r5, #0\n\t"
  127528. "lsl r7, r9, #16\n\t"
  127529. "lsr r7, r7, #16\n\t"
  127530. "mul r6, r7, r6\n\t"
  127531. "lsr r7, r6, #16\n\t"
  127532. "lsl r6, r6, #16\n\t"
  127533. "adds r3, r3, r6\n\t"
  127534. "adcs r4, r4, r7\n\t"
  127535. "adc r5, r5, #0\n\t"
  127536. #else
  127537. "umull r6, r7, r8, r9\n\t"
  127538. "adds r3, r3, r6\n\t"
  127539. "adcs r4, r4, r7\n\t"
  127540. "adc r5, r5, #0\n\t"
  127541. #endif
  127542. /* A[9] * B[3] */
  127543. "ldr r8, [%[a], #36]\n\t"
  127544. "ldr r9, [%[b], #12]\n\t"
  127545. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  127546. "lsl r6, r8, #16\n\t"
  127547. "lsl r7, r9, #16\n\t"
  127548. "lsr r6, r6, #16\n\t"
  127549. "lsr r7, r7, #16\n\t"
  127550. "mul r7, r6, r7\n\t"
  127551. "adds r3, r3, r7\n\t"
  127552. "adcs r4, r4, #0\n\t"
  127553. "adc r5, r5, #0\n\t"
  127554. "lsr r7, r9, #16\n\t"
  127555. "mul r6, r7, r6\n\t"
  127556. "lsr r7, r6, #16\n\t"
  127557. "lsl r6, r6, #16\n\t"
  127558. "adds r3, r3, r6\n\t"
  127559. "adcs r4, r4, r7\n\t"
  127560. "adc r5, r5, #0\n\t"
  127561. "lsr r6, r8, #16\n\t"
  127562. "lsr r7, r9, #16\n\t"
  127563. "mul r7, r6, r7\n\t"
  127564. "adds r4, r4, r7\n\t"
  127565. "adc r5, r5, #0\n\t"
  127566. "lsl r7, r9, #16\n\t"
  127567. "lsr r7, r7, #16\n\t"
  127568. "mul r6, r7, r6\n\t"
  127569. "lsr r7, r6, #16\n\t"
  127570. "lsl r6, r6, #16\n\t"
  127571. "adds r3, r3, r6\n\t"
  127572. "adcs r4, r4, r7\n\t"
  127573. "adc r5, r5, #0\n\t"
  127574. #else
  127575. "umull r6, r7, r8, r9\n\t"
  127576. "adds r3, r3, r6\n\t"
  127577. "adcs r4, r4, r7\n\t"
  127578. "adc r5, r5, #0\n\t"
  127579. #endif
  127580. /* A[8] * B[4] */
  127581. "ldr r8, [%[a], #32]\n\t"
  127582. "ldr r9, [%[b], #16]\n\t"
  127583. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  127584. "lsl r6, r8, #16\n\t"
  127585. "lsl r7, r9, #16\n\t"
  127586. "lsr r6, r6, #16\n\t"
  127587. "lsr r7, r7, #16\n\t"
  127588. "mul r7, r6, r7\n\t"
  127589. "adds r3, r3, r7\n\t"
  127590. "adcs r4, r4, #0\n\t"
  127591. "adc r5, r5, #0\n\t"
  127592. "lsr r7, r9, #16\n\t"
  127593. "mul r6, r7, r6\n\t"
  127594. "lsr r7, r6, #16\n\t"
  127595. "lsl r6, r6, #16\n\t"
  127596. "adds r3, r3, r6\n\t"
  127597. "adcs r4, r4, r7\n\t"
  127598. "adc r5, r5, #0\n\t"
  127599. "lsr r6, r8, #16\n\t"
  127600. "lsr r7, r9, #16\n\t"
  127601. "mul r7, r6, r7\n\t"
  127602. "adds r4, r4, r7\n\t"
  127603. "adc r5, r5, #0\n\t"
  127604. "lsl r7, r9, #16\n\t"
  127605. "lsr r7, r7, #16\n\t"
  127606. "mul r6, r7, r6\n\t"
  127607. "lsr r7, r6, #16\n\t"
  127608. "lsl r6, r6, #16\n\t"
  127609. "adds r3, r3, r6\n\t"
  127610. "adcs r4, r4, r7\n\t"
  127611. "adc r5, r5, #0\n\t"
  127612. #else
  127613. "umull r6, r7, r8, r9\n\t"
  127614. "adds r3, r3, r6\n\t"
  127615. "adcs r4, r4, r7\n\t"
  127616. "adc r5, r5, #0\n\t"
  127617. #endif
  127618. /* A[7] * B[5] */
  127619. "ldr r8, [%[a], #28]\n\t"
  127620. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  127621. "lsl r6, r8, #16\n\t"
  127622. "lsl r7, r12, #16\n\t"
  127623. "lsr r6, r6, #16\n\t"
  127624. "lsr r7, r7, #16\n\t"
  127625. "mul r7, r6, r7\n\t"
  127626. "adds r3, r3, r7\n\t"
  127627. "adcs r4, r4, #0\n\t"
  127628. "adc r5, r5, #0\n\t"
  127629. "lsr r7, r12, #16\n\t"
  127630. "mul r6, r7, r6\n\t"
  127631. "lsr r7, r6, #16\n\t"
  127632. "lsl r6, r6, #16\n\t"
  127633. "adds r3, r3, r6\n\t"
  127634. "adcs r4, r4, r7\n\t"
  127635. "adc r5, r5, #0\n\t"
  127636. "lsr r6, r8, #16\n\t"
  127637. "lsr r7, r12, #16\n\t"
  127638. "mul r7, r6, r7\n\t"
  127639. "adds r4, r4, r7\n\t"
  127640. "adc r5, r5, #0\n\t"
  127641. "lsl r7, r12, #16\n\t"
  127642. "lsr r7, r7, #16\n\t"
  127643. "mul r6, r7, r6\n\t"
  127644. "lsr r7, r6, #16\n\t"
  127645. "lsl r6, r6, #16\n\t"
  127646. "adds r3, r3, r6\n\t"
  127647. "adcs r4, r4, r7\n\t"
  127648. "adc r5, r5, #0\n\t"
  127649. #else
  127650. "umull r6, r7, r8, r12\n\t"
  127651. "adds r3, r3, r6\n\t"
  127652. "adcs r4, r4, r7\n\t"
  127653. "adc r5, r5, #0\n\t"
  127654. #endif
  127655. /* A[6] * B[6] */
  127656. "ldr r11, [%[a], #24]\n\t"
  127657. "ldr r12, [%[b], #24]\n\t"
  127658. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  127659. "lsl r6, r11, #16\n\t"
  127660. "lsl r7, r12, #16\n\t"
  127661. "lsr r6, r6, #16\n\t"
  127662. "lsr r7, r7, #16\n\t"
  127663. "mul r7, r6, r7\n\t"
  127664. "adds r3, r3, r7\n\t"
  127665. "adcs r4, r4, #0\n\t"
  127666. "adc r5, r5, #0\n\t"
  127667. "lsr r7, r12, #16\n\t"
  127668. "mul r6, r7, r6\n\t"
  127669. "lsr r7, r6, #16\n\t"
  127670. "lsl r6, r6, #16\n\t"
  127671. "adds r3, r3, r6\n\t"
  127672. "adcs r4, r4, r7\n\t"
  127673. "adc r5, r5, #0\n\t"
  127674. "lsr r6, r11, #16\n\t"
  127675. "lsr r7, r12, #16\n\t"
  127676. "mul r7, r6, r7\n\t"
  127677. "adds r4, r4, r7\n\t"
  127678. "adc r5, r5, #0\n\t"
  127679. "lsl r7, r12, #16\n\t"
  127680. "lsr r7, r7, #16\n\t"
  127681. "mul r6, r7, r6\n\t"
  127682. "lsr r7, r6, #16\n\t"
  127683. "lsl r6, r6, #16\n\t"
  127684. "adds r3, r3, r6\n\t"
  127685. "adcs r4, r4, r7\n\t"
  127686. "adc r5, r5, #0\n\t"
  127687. #else
  127688. "umull r6, r7, r11, r12\n\t"
  127689. "adds r3, r3, r6\n\t"
  127690. "adcs r4, r4, r7\n\t"
  127691. "adc r5, r5, #0\n\t"
  127692. #endif
  127693. /* A[5] * B[7] */
  127694. "ldr r8, [%[a], #20]\n\t"
  127695. "ldr r9, [%[b], #28]\n\t"
  127696. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  127697. "lsl r6, r8, #16\n\t"
  127698. "lsl r7, r9, #16\n\t"
  127699. "lsr r6, r6, #16\n\t"
  127700. "lsr r7, r7, #16\n\t"
  127701. "mul r7, r6, r7\n\t"
  127702. "adds r3, r3, r7\n\t"
  127703. "adcs r4, r4, #0\n\t"
  127704. "adc r5, r5, #0\n\t"
  127705. "lsr r7, r9, #16\n\t"
  127706. "mul r6, r7, r6\n\t"
  127707. "lsr r7, r6, #16\n\t"
  127708. "lsl r6, r6, #16\n\t"
  127709. "adds r3, r3, r6\n\t"
  127710. "adcs r4, r4, r7\n\t"
  127711. "adc r5, r5, #0\n\t"
  127712. "lsr r6, r8, #16\n\t"
  127713. "lsr r7, r9, #16\n\t"
  127714. "mul r7, r6, r7\n\t"
  127715. "adds r4, r4, r7\n\t"
  127716. "adc r5, r5, #0\n\t"
  127717. "lsl r7, r9, #16\n\t"
  127718. "lsr r7, r7, #16\n\t"
  127719. "mul r6, r7, r6\n\t"
  127720. "lsr r7, r6, #16\n\t"
  127721. "lsl r6, r6, #16\n\t"
  127722. "adds r3, r3, r6\n\t"
  127723. "adcs r4, r4, r7\n\t"
  127724. "adc r5, r5, #0\n\t"
  127725. #else
  127726. "umull r6, r7, r8, r9\n\t"
  127727. "adds r3, r3, r6\n\t"
  127728. "adcs r4, r4, r7\n\t"
  127729. "adc r5, r5, #0\n\t"
  127730. #endif
  127731. /* A[4] * B[8] */
  127732. "ldr r8, [%[a], #16]\n\t"
  127733. "ldr r9, [%[b], #32]\n\t"
  127734. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  127735. "lsl r6, r8, #16\n\t"
  127736. "lsl r7, r9, #16\n\t"
  127737. "lsr r6, r6, #16\n\t"
  127738. "lsr r7, r7, #16\n\t"
  127739. "mul r7, r6, r7\n\t"
  127740. "adds r3, r3, r7\n\t"
  127741. "adcs r4, r4, #0\n\t"
  127742. "adc r5, r5, #0\n\t"
  127743. "lsr r7, r9, #16\n\t"
  127744. "mul r6, r7, r6\n\t"
  127745. "lsr r7, r6, #16\n\t"
  127746. "lsl r6, r6, #16\n\t"
  127747. "adds r3, r3, r6\n\t"
  127748. "adcs r4, r4, r7\n\t"
  127749. "adc r5, r5, #0\n\t"
  127750. "lsr r6, r8, #16\n\t"
  127751. "lsr r7, r9, #16\n\t"
  127752. "mul r7, r6, r7\n\t"
  127753. "adds r4, r4, r7\n\t"
  127754. "adc r5, r5, #0\n\t"
  127755. "lsl r7, r9, #16\n\t"
  127756. "lsr r7, r7, #16\n\t"
  127757. "mul r6, r7, r6\n\t"
  127758. "lsr r7, r6, #16\n\t"
  127759. "lsl r6, r6, #16\n\t"
  127760. "adds r3, r3, r6\n\t"
  127761. "adcs r4, r4, r7\n\t"
  127762. "adc r5, r5, #0\n\t"
  127763. #else
  127764. "umull r6, r7, r8, r9\n\t"
  127765. "adds r3, r3, r6\n\t"
  127766. "adcs r4, r4, r7\n\t"
  127767. "adc r5, r5, #0\n\t"
  127768. #endif
  127769. /* A[3] * B[9] */
  127770. "ldr r8, [%[a], #12]\n\t"
  127771. "ldr r9, [%[b], #36]\n\t"
  127772. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  127773. "lsl r6, r8, #16\n\t"
  127774. "lsl r7, r9, #16\n\t"
  127775. "lsr r6, r6, #16\n\t"
  127776. "lsr r7, r7, #16\n\t"
  127777. "mul r7, r6, r7\n\t"
  127778. "adds r3, r3, r7\n\t"
  127779. "adcs r4, r4, #0\n\t"
  127780. "adc r5, r5, #0\n\t"
  127781. "lsr r7, r9, #16\n\t"
  127782. "mul r6, r7, r6\n\t"
  127783. "lsr r7, r6, #16\n\t"
  127784. "lsl r6, r6, #16\n\t"
  127785. "adds r3, r3, r6\n\t"
  127786. "adcs r4, r4, r7\n\t"
  127787. "adc r5, r5, #0\n\t"
  127788. "lsr r6, r8, #16\n\t"
  127789. "lsr r7, r9, #16\n\t"
  127790. "mul r7, r6, r7\n\t"
  127791. "adds r4, r4, r7\n\t"
  127792. "adc r5, r5, #0\n\t"
  127793. "lsl r7, r9, #16\n\t"
  127794. "lsr r7, r7, #16\n\t"
  127795. "mul r6, r7, r6\n\t"
  127796. "lsr r7, r6, #16\n\t"
  127797. "lsl r6, r6, #16\n\t"
  127798. "adds r3, r3, r6\n\t"
  127799. "adcs r4, r4, r7\n\t"
  127800. "adc r5, r5, #0\n\t"
  127801. #else
  127802. "umull r6, r7, r8, r9\n\t"
  127803. "adds r3, r3, r6\n\t"
  127804. "adcs r4, r4, r7\n\t"
  127805. "adc r5, r5, #0\n\t"
  127806. #endif
  127807. /* A[2] * B[10] */
  127808. "ldr r8, [%[a], #8]\n\t"
  127809. "ldr r9, [%[b], #40]\n\t"
  127810. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  127811. "lsl r6, r8, #16\n\t"
  127812. "lsl r7, r9, #16\n\t"
  127813. "lsr r6, r6, #16\n\t"
  127814. "lsr r7, r7, #16\n\t"
  127815. "mul r7, r6, r7\n\t"
  127816. "adds r3, r3, r7\n\t"
  127817. "adcs r4, r4, #0\n\t"
  127818. "adc r5, r5, #0\n\t"
  127819. "lsr r7, r9, #16\n\t"
  127820. "mul r6, r7, r6\n\t"
  127821. "lsr r7, r6, #16\n\t"
  127822. "lsl r6, r6, #16\n\t"
  127823. "adds r3, r3, r6\n\t"
  127824. "adcs r4, r4, r7\n\t"
  127825. "adc r5, r5, #0\n\t"
  127826. "lsr r6, r8, #16\n\t"
  127827. "lsr r7, r9, #16\n\t"
  127828. "mul r7, r6, r7\n\t"
  127829. "adds r4, r4, r7\n\t"
  127830. "adc r5, r5, #0\n\t"
  127831. "lsl r7, r9, #16\n\t"
  127832. "lsr r7, r7, #16\n\t"
  127833. "mul r6, r7, r6\n\t"
  127834. "lsr r7, r6, #16\n\t"
  127835. "lsl r6, r6, #16\n\t"
  127836. "adds r3, r3, r6\n\t"
  127837. "adcs r4, r4, r7\n\t"
  127838. "adc r5, r5, #0\n\t"
  127839. #else
  127840. "umull r6, r7, r8, r9\n\t"
  127841. "adds r3, r3, r6\n\t"
  127842. "adcs r4, r4, r7\n\t"
  127843. "adc r5, r5, #0\n\t"
  127844. #endif
  127845. /* A[1] * B[11] */
  127846. "ldr r8, [%[a], #4]\n\t"
  127847. "ldr r9, [%[b], #44]\n\t"
  127848. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  127849. "lsl r6, r8, #16\n\t"
  127850. "lsl r7, r9, #16\n\t"
  127851. "lsr r6, r6, #16\n\t"
  127852. "lsr r7, r7, #16\n\t"
  127853. "mul r7, r6, r7\n\t"
  127854. "adds r3, r3, r7\n\t"
  127855. "adcs r4, r4, #0\n\t"
  127856. "adc r5, r5, #0\n\t"
  127857. "lsr r7, r9, #16\n\t"
  127858. "mul r6, r7, r6\n\t"
  127859. "lsr r7, r6, #16\n\t"
  127860. "lsl r6, r6, #16\n\t"
  127861. "adds r3, r3, r6\n\t"
  127862. "adcs r4, r4, r7\n\t"
  127863. "adc r5, r5, #0\n\t"
  127864. "lsr r6, r8, #16\n\t"
  127865. "lsr r7, r9, #16\n\t"
  127866. "mul r7, r6, r7\n\t"
  127867. "adds r4, r4, r7\n\t"
  127868. "adc r5, r5, #0\n\t"
  127869. "lsl r7, r9, #16\n\t"
  127870. "lsr r7, r7, #16\n\t"
  127871. "mul r6, r7, r6\n\t"
  127872. "lsr r7, r6, #16\n\t"
  127873. "lsl r6, r6, #16\n\t"
  127874. "adds r3, r3, r6\n\t"
  127875. "adcs r4, r4, r7\n\t"
  127876. "adc r5, r5, #0\n\t"
  127877. #else
  127878. "umull r6, r7, r8, r9\n\t"
  127879. "adds r3, r3, r6\n\t"
  127880. "adcs r4, r4, r7\n\t"
  127881. "adc r5, r5, #0\n\t"
  127882. #endif
  127883. /* A[0] * B[12] */
  127884. "ldr r8, [%[a]]\n\t"
  127885. "ldr r9, [%[b], #48]\n\t"
  127886. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  127887. "lsl r6, r8, #16\n\t"
  127888. "lsl r7, r9, #16\n\t"
  127889. "lsr r6, r6, #16\n\t"
  127890. "lsr r7, r7, #16\n\t"
  127891. "mul r7, r6, r7\n\t"
  127892. "adds r3, r3, r7\n\t"
  127893. "adcs r4, r4, #0\n\t"
  127894. "adc r5, r5, #0\n\t"
  127895. "lsr r7, r9, #16\n\t"
  127896. "mul r6, r7, r6\n\t"
  127897. "lsr r7, r6, #16\n\t"
  127898. "lsl r6, r6, #16\n\t"
  127899. "adds r3, r3, r6\n\t"
  127900. "adcs r4, r4, r7\n\t"
  127901. "adc r5, r5, #0\n\t"
  127902. "lsr r6, r8, #16\n\t"
  127903. "lsr r7, r9, #16\n\t"
  127904. "mul r7, r6, r7\n\t"
  127905. "adds r4, r4, r7\n\t"
  127906. "adc r5, r5, #0\n\t"
  127907. "lsl r7, r9, #16\n\t"
  127908. "lsr r7, r7, #16\n\t"
  127909. "mul r6, r7, r6\n\t"
  127910. "lsr r7, r6, #16\n\t"
  127911. "lsl r6, r6, #16\n\t"
  127912. "adds r3, r3, r6\n\t"
  127913. "adcs r4, r4, r7\n\t"
  127914. "adc r5, r5, #0\n\t"
  127915. #else
  127916. "umull r6, r7, r8, r9\n\t"
  127917. "adds r3, r3, r6\n\t"
  127918. "adcs r4, r4, r7\n\t"
  127919. "adc r5, r5, #0\n\t"
  127920. #endif
  127921. "str r3, [sp, #48]\n\t"
  127922. /* A[0] * B[13] */
  127923. "ldr r9, [%[b], #52]\n\t"
  127924. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  127925. "lsl r6, r8, #16\n\t"
  127926. "lsl r7, r9, #16\n\t"
  127927. "lsr r6, r6, #16\n\t"
  127928. "lsr r7, r7, #16\n\t"
  127929. "mul r7, r6, r7\n\t"
  127930. "adds r4, r4, r7\n\t"
  127931. "adcs r5, r5, #0\n\t"
  127932. "mov r3, #0\n\t"
  127933. "adc r3, r3, #0\n\t"
  127934. "lsr r7, r9, #16\n\t"
  127935. "mul r6, r7, r6\n\t"
  127936. "lsr r7, r6, #16\n\t"
  127937. "lsl r6, r6, #16\n\t"
  127938. "adds r4, r4, r6\n\t"
  127939. "adcs r5, r5, r7\n\t"
  127940. "adc r3, r3, #0\n\t"
  127941. "lsr r6, r8, #16\n\t"
  127942. "lsr r7, r9, #16\n\t"
  127943. "mul r7, r6, r7\n\t"
  127944. "adds r5, r5, r7\n\t"
  127945. "adc r3, r3, #0\n\t"
  127946. "lsl r7, r9, #16\n\t"
  127947. "lsr r7, r7, #16\n\t"
  127948. "mul r6, r7, r6\n\t"
  127949. "lsr r7, r6, #16\n\t"
  127950. "lsl r6, r6, #16\n\t"
  127951. "adds r4, r4, r6\n\t"
  127952. "adcs r5, r5, r7\n\t"
  127953. "adc r3, r3, #0\n\t"
  127954. #else
  127955. "umull r6, r7, r8, r9\n\t"
  127956. "adds r4, r4, r6\n\t"
  127957. "adcs r5, r5, r7\n\t"
  127958. "mov r3, #0\n\t"
  127959. "adc r3, r3, #0\n\t"
  127960. #endif
  127961. /* A[1] * B[12] */
  127962. "ldr r8, [%[a], #4]\n\t"
  127963. "ldr r9, [%[b], #48]\n\t"
  127964. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  127965. "lsl r6, r8, #16\n\t"
  127966. "lsl r7, r9, #16\n\t"
  127967. "lsr r6, r6, #16\n\t"
  127968. "lsr r7, r7, #16\n\t"
  127969. "mul r7, r6, r7\n\t"
  127970. "adds r4, r4, r7\n\t"
  127971. "adcs r5, r5, #0\n\t"
  127972. "adc r3, r3, #0\n\t"
  127973. "lsr r7, r9, #16\n\t"
  127974. "mul r6, r7, r6\n\t"
  127975. "lsr r7, r6, #16\n\t"
  127976. "lsl r6, r6, #16\n\t"
  127977. "adds r4, r4, r6\n\t"
  127978. "adcs r5, r5, r7\n\t"
  127979. "adc r3, r3, #0\n\t"
  127980. "lsr r6, r8, #16\n\t"
  127981. "lsr r7, r9, #16\n\t"
  127982. "mul r7, r6, r7\n\t"
  127983. "adds r5, r5, r7\n\t"
  127984. "adc r3, r3, #0\n\t"
  127985. "lsl r7, r9, #16\n\t"
  127986. "lsr r7, r7, #16\n\t"
  127987. "mul r6, r7, r6\n\t"
  127988. "lsr r7, r6, #16\n\t"
  127989. "lsl r6, r6, #16\n\t"
  127990. "adds r4, r4, r6\n\t"
  127991. "adcs r5, r5, r7\n\t"
  127992. "adc r3, r3, #0\n\t"
  127993. #else
  127994. "umull r6, r7, r8, r9\n\t"
  127995. "adds r4, r4, r6\n\t"
  127996. "adcs r5, r5, r7\n\t"
  127997. "adc r3, r3, #0\n\t"
  127998. #endif
  127999. /* A[2] * B[11] */
  128000. "ldr r8, [%[a], #8]\n\t"
  128001. "ldr r9, [%[b], #44]\n\t"
  128002. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  128003. "lsl r6, r8, #16\n\t"
  128004. "lsl r7, r9, #16\n\t"
  128005. "lsr r6, r6, #16\n\t"
  128006. "lsr r7, r7, #16\n\t"
  128007. "mul r7, r6, r7\n\t"
  128008. "adds r4, r4, r7\n\t"
  128009. "adcs r5, r5, #0\n\t"
  128010. "adc r3, r3, #0\n\t"
  128011. "lsr r7, r9, #16\n\t"
  128012. "mul r6, r7, r6\n\t"
  128013. "lsr r7, r6, #16\n\t"
  128014. "lsl r6, r6, #16\n\t"
  128015. "adds r4, r4, r6\n\t"
  128016. "adcs r5, r5, r7\n\t"
  128017. "adc r3, r3, #0\n\t"
  128018. "lsr r6, r8, #16\n\t"
  128019. "lsr r7, r9, #16\n\t"
  128020. "mul r7, r6, r7\n\t"
  128021. "adds r5, r5, r7\n\t"
  128022. "adc r3, r3, #0\n\t"
  128023. "lsl r7, r9, #16\n\t"
  128024. "lsr r7, r7, #16\n\t"
  128025. "mul r6, r7, r6\n\t"
  128026. "lsr r7, r6, #16\n\t"
  128027. "lsl r6, r6, #16\n\t"
  128028. "adds r4, r4, r6\n\t"
  128029. "adcs r5, r5, r7\n\t"
  128030. "adc r3, r3, #0\n\t"
  128031. #else
  128032. "umull r6, r7, r8, r9\n\t"
  128033. "adds r4, r4, r6\n\t"
  128034. "adcs r5, r5, r7\n\t"
  128035. "adc r3, r3, #0\n\t"
  128036. #endif
  128037. /* A[3] * B[10] */
  128038. "ldr r8, [%[a], #12]\n\t"
  128039. "ldr r9, [%[b], #40]\n\t"
  128040. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  128041. "lsl r6, r8, #16\n\t"
  128042. "lsl r7, r9, #16\n\t"
  128043. "lsr r6, r6, #16\n\t"
  128044. "lsr r7, r7, #16\n\t"
  128045. "mul r7, r6, r7\n\t"
  128046. "adds r4, r4, r7\n\t"
  128047. "adcs r5, r5, #0\n\t"
  128048. "adc r3, r3, #0\n\t"
  128049. "lsr r7, r9, #16\n\t"
  128050. "mul r6, r7, r6\n\t"
  128051. "lsr r7, r6, #16\n\t"
  128052. "lsl r6, r6, #16\n\t"
  128053. "adds r4, r4, r6\n\t"
  128054. "adcs r5, r5, r7\n\t"
  128055. "adc r3, r3, #0\n\t"
  128056. "lsr r6, r8, #16\n\t"
  128057. "lsr r7, r9, #16\n\t"
  128058. "mul r7, r6, r7\n\t"
  128059. "adds r5, r5, r7\n\t"
  128060. "adc r3, r3, #0\n\t"
  128061. "lsl r7, r9, #16\n\t"
  128062. "lsr r7, r7, #16\n\t"
  128063. "mul r6, r7, r6\n\t"
  128064. "lsr r7, r6, #16\n\t"
  128065. "lsl r6, r6, #16\n\t"
  128066. "adds r4, r4, r6\n\t"
  128067. "adcs r5, r5, r7\n\t"
  128068. "adc r3, r3, #0\n\t"
  128069. #else
  128070. "umull r6, r7, r8, r9\n\t"
  128071. "adds r4, r4, r6\n\t"
  128072. "adcs r5, r5, r7\n\t"
  128073. "adc r3, r3, #0\n\t"
  128074. #endif
  128075. /* A[4] * B[9] */
  128076. "ldr r8, [%[a], #16]\n\t"
  128077. "ldr r9, [%[b], #36]\n\t"
  128078. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  128079. "lsl r6, r8, #16\n\t"
  128080. "lsl r7, r9, #16\n\t"
  128081. "lsr r6, r6, #16\n\t"
  128082. "lsr r7, r7, #16\n\t"
  128083. "mul r7, r6, r7\n\t"
  128084. "adds r4, r4, r7\n\t"
  128085. "adcs r5, r5, #0\n\t"
  128086. "adc r3, r3, #0\n\t"
  128087. "lsr r7, r9, #16\n\t"
  128088. "mul r6, r7, r6\n\t"
  128089. "lsr r7, r6, #16\n\t"
  128090. "lsl r6, r6, #16\n\t"
  128091. "adds r4, r4, r6\n\t"
  128092. "adcs r5, r5, r7\n\t"
  128093. "adc r3, r3, #0\n\t"
  128094. "lsr r6, r8, #16\n\t"
  128095. "lsr r7, r9, #16\n\t"
  128096. "mul r7, r6, r7\n\t"
  128097. "adds r5, r5, r7\n\t"
  128098. "adc r3, r3, #0\n\t"
  128099. "lsl r7, r9, #16\n\t"
  128100. "lsr r7, r7, #16\n\t"
  128101. "mul r6, r7, r6\n\t"
  128102. "lsr r7, r6, #16\n\t"
  128103. "lsl r6, r6, #16\n\t"
  128104. "adds r4, r4, r6\n\t"
  128105. "adcs r5, r5, r7\n\t"
  128106. "adc r3, r3, #0\n\t"
  128107. #else
  128108. "umull r6, r7, r8, r9\n\t"
  128109. "adds r4, r4, r6\n\t"
  128110. "adcs r5, r5, r7\n\t"
  128111. "adc r3, r3, #0\n\t"
  128112. #endif
  128113. /* A[5] * B[8] */
  128114. "ldr r8, [%[a], #20]\n\t"
  128115. "ldr r9, [%[b], #32]\n\t"
  128116. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  128117. "lsl r6, r8, #16\n\t"
  128118. "lsl r7, r9, #16\n\t"
  128119. "lsr r6, r6, #16\n\t"
  128120. "lsr r7, r7, #16\n\t"
  128121. "mul r7, r6, r7\n\t"
  128122. "adds r4, r4, r7\n\t"
  128123. "adcs r5, r5, #0\n\t"
  128124. "adc r3, r3, #0\n\t"
  128125. "lsr r7, r9, #16\n\t"
  128126. "mul r6, r7, r6\n\t"
  128127. "lsr r7, r6, #16\n\t"
  128128. "lsl r6, r6, #16\n\t"
  128129. "adds r4, r4, r6\n\t"
  128130. "adcs r5, r5, r7\n\t"
  128131. "adc r3, r3, #0\n\t"
  128132. "lsr r6, r8, #16\n\t"
  128133. "lsr r7, r9, #16\n\t"
  128134. "mul r7, r6, r7\n\t"
  128135. "adds r5, r5, r7\n\t"
  128136. "adc r3, r3, #0\n\t"
  128137. "lsl r7, r9, #16\n\t"
  128138. "lsr r7, r7, #16\n\t"
  128139. "mul r6, r7, r6\n\t"
  128140. "lsr r7, r6, #16\n\t"
  128141. "lsl r6, r6, #16\n\t"
  128142. "adds r4, r4, r6\n\t"
  128143. "adcs r5, r5, r7\n\t"
  128144. "adc r3, r3, #0\n\t"
  128145. #else
  128146. "umull r6, r7, r8, r9\n\t"
  128147. "adds r4, r4, r6\n\t"
  128148. "adcs r5, r5, r7\n\t"
  128149. "adc r3, r3, #0\n\t"
  128150. #endif
  128151. /* A[6] * B[7] */
  128152. "ldr r9, [%[b], #28]\n\t"
  128153. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  128154. "lsl r6, r11, #16\n\t"
  128155. "lsl r7, r9, #16\n\t"
  128156. "lsr r6, r6, #16\n\t"
  128157. "lsr r7, r7, #16\n\t"
  128158. "mul r7, r6, r7\n\t"
  128159. "adds r4, r4, r7\n\t"
  128160. "adcs r5, r5, #0\n\t"
  128161. "adc r3, r3, #0\n\t"
  128162. "lsr r7, r9, #16\n\t"
  128163. "mul r6, r7, r6\n\t"
  128164. "lsr r7, r6, #16\n\t"
  128165. "lsl r6, r6, #16\n\t"
  128166. "adds r4, r4, r6\n\t"
  128167. "adcs r5, r5, r7\n\t"
  128168. "adc r3, r3, #0\n\t"
  128169. "lsr r6, r11, #16\n\t"
  128170. "lsr r7, r9, #16\n\t"
  128171. "mul r7, r6, r7\n\t"
  128172. "adds r5, r5, r7\n\t"
  128173. "adc r3, r3, #0\n\t"
  128174. "lsl r7, r9, #16\n\t"
  128175. "lsr r7, r7, #16\n\t"
  128176. "mul r6, r7, r6\n\t"
  128177. "lsr r7, r6, #16\n\t"
  128178. "lsl r6, r6, #16\n\t"
  128179. "adds r4, r4, r6\n\t"
  128180. "adcs r5, r5, r7\n\t"
  128181. "adc r3, r3, #0\n\t"
  128182. #else
  128183. "umull r6, r7, r11, r9\n\t"
  128184. "adds r4, r4, r6\n\t"
  128185. "adcs r5, r5, r7\n\t"
  128186. "adc r3, r3, #0\n\t"
  128187. #endif
  128188. /* A[7] * B[6] */
  128189. "ldr r8, [%[a], #28]\n\t"
  128190. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  128191. "lsl r6, r8, #16\n\t"
  128192. "lsl r7, r12, #16\n\t"
  128193. "lsr r6, r6, #16\n\t"
  128194. "lsr r7, r7, #16\n\t"
  128195. "mul r7, r6, r7\n\t"
  128196. "adds r4, r4, r7\n\t"
  128197. "adcs r5, r5, #0\n\t"
  128198. "adc r3, r3, #0\n\t"
  128199. "lsr r7, r12, #16\n\t"
  128200. "mul r6, r7, r6\n\t"
  128201. "lsr r7, r6, #16\n\t"
  128202. "lsl r6, r6, #16\n\t"
  128203. "adds r4, r4, r6\n\t"
  128204. "adcs r5, r5, r7\n\t"
  128205. "adc r3, r3, #0\n\t"
  128206. "lsr r6, r8, #16\n\t"
  128207. "lsr r7, r12, #16\n\t"
  128208. "mul r7, r6, r7\n\t"
  128209. "adds r5, r5, r7\n\t"
  128210. "adc r3, r3, #0\n\t"
  128211. "lsl r7, r12, #16\n\t"
  128212. "lsr r7, r7, #16\n\t"
  128213. "mul r6, r7, r6\n\t"
  128214. "lsr r7, r6, #16\n\t"
  128215. "lsl r6, r6, #16\n\t"
  128216. "adds r4, r4, r6\n\t"
  128217. "adcs r5, r5, r7\n\t"
  128218. "adc r3, r3, #0\n\t"
  128219. #else
  128220. "umull r6, r7, r8, r12\n\t"
  128221. "adds r4, r4, r6\n\t"
  128222. "adcs r5, r5, r7\n\t"
  128223. "adc r3, r3, #0\n\t"
  128224. #endif
  128225. /* A[8] * B[5] */
  128226. "ldr r8, [%[a], #32]\n\t"
  128227. "ldr r9, [%[b], #20]\n\t"
  128228. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  128229. "lsl r6, r8, #16\n\t"
  128230. "lsl r7, r9, #16\n\t"
  128231. "lsr r6, r6, #16\n\t"
  128232. "lsr r7, r7, #16\n\t"
  128233. "mul r7, r6, r7\n\t"
  128234. "adds r4, r4, r7\n\t"
  128235. "adcs r5, r5, #0\n\t"
  128236. "adc r3, r3, #0\n\t"
  128237. "lsr r7, r9, #16\n\t"
  128238. "mul r6, r7, r6\n\t"
  128239. "lsr r7, r6, #16\n\t"
  128240. "lsl r6, r6, #16\n\t"
  128241. "adds r4, r4, r6\n\t"
  128242. "adcs r5, r5, r7\n\t"
  128243. "adc r3, r3, #0\n\t"
  128244. "lsr r6, r8, #16\n\t"
  128245. "lsr r7, r9, #16\n\t"
  128246. "mul r7, r6, r7\n\t"
  128247. "adds r5, r5, r7\n\t"
  128248. "adc r3, r3, #0\n\t"
  128249. "lsl r7, r9, #16\n\t"
  128250. "lsr r7, r7, #16\n\t"
  128251. "mul r6, r7, r6\n\t"
  128252. "lsr r7, r6, #16\n\t"
  128253. "lsl r6, r6, #16\n\t"
  128254. "adds r4, r4, r6\n\t"
  128255. "adcs r5, r5, r7\n\t"
  128256. "adc r3, r3, #0\n\t"
  128257. #else
  128258. "umull r6, r7, r8, r9\n\t"
  128259. "adds r4, r4, r6\n\t"
  128260. "adcs r5, r5, r7\n\t"
  128261. "adc r3, r3, #0\n\t"
  128262. #endif
  128263. /* A[9] * B[4] */
  128264. "ldr r8, [%[a], #36]\n\t"
  128265. "ldr r9, [%[b], #16]\n\t"
  128266. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  128267. "lsl r6, r8, #16\n\t"
  128268. "lsl r7, r9, #16\n\t"
  128269. "lsr r6, r6, #16\n\t"
  128270. "lsr r7, r7, #16\n\t"
  128271. "mul r7, r6, r7\n\t"
  128272. "adds r4, r4, r7\n\t"
  128273. "adcs r5, r5, #0\n\t"
  128274. "adc r3, r3, #0\n\t"
  128275. "lsr r7, r9, #16\n\t"
  128276. "mul r6, r7, r6\n\t"
  128277. "lsr r7, r6, #16\n\t"
  128278. "lsl r6, r6, #16\n\t"
  128279. "adds r4, r4, r6\n\t"
  128280. "adcs r5, r5, r7\n\t"
  128281. "adc r3, r3, #0\n\t"
  128282. "lsr r6, r8, #16\n\t"
  128283. "lsr r7, r9, #16\n\t"
  128284. "mul r7, r6, r7\n\t"
  128285. "adds r5, r5, r7\n\t"
  128286. "adc r3, r3, #0\n\t"
  128287. "lsl r7, r9, #16\n\t"
  128288. "lsr r7, r7, #16\n\t"
  128289. "mul r6, r7, r6\n\t"
  128290. "lsr r7, r6, #16\n\t"
  128291. "lsl r6, r6, #16\n\t"
  128292. "adds r4, r4, r6\n\t"
  128293. "adcs r5, r5, r7\n\t"
  128294. "adc r3, r3, #0\n\t"
  128295. #else
  128296. "umull r6, r7, r8, r9\n\t"
  128297. "adds r4, r4, r6\n\t"
  128298. "adcs r5, r5, r7\n\t"
  128299. "adc r3, r3, #0\n\t"
  128300. #endif
  128301. /* A[10] * B[3] */
  128302. "ldr r8, [%[a], #40]\n\t"
  128303. "ldr r9, [%[b], #12]\n\t"
  128304. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  128305. "lsl r6, r8, #16\n\t"
  128306. "lsl r7, r9, #16\n\t"
  128307. "lsr r6, r6, #16\n\t"
  128308. "lsr r7, r7, #16\n\t"
  128309. "mul r7, r6, r7\n\t"
  128310. "adds r4, r4, r7\n\t"
  128311. "adcs r5, r5, #0\n\t"
  128312. "adc r3, r3, #0\n\t"
  128313. "lsr r7, r9, #16\n\t"
  128314. "mul r6, r7, r6\n\t"
  128315. "lsr r7, r6, #16\n\t"
  128316. "lsl r6, r6, #16\n\t"
  128317. "adds r4, r4, r6\n\t"
  128318. "adcs r5, r5, r7\n\t"
  128319. "adc r3, r3, #0\n\t"
  128320. "lsr r6, r8, #16\n\t"
  128321. "lsr r7, r9, #16\n\t"
  128322. "mul r7, r6, r7\n\t"
  128323. "adds r5, r5, r7\n\t"
  128324. "adc r3, r3, #0\n\t"
  128325. "lsl r7, r9, #16\n\t"
  128326. "lsr r7, r7, #16\n\t"
  128327. "mul r6, r7, r6\n\t"
  128328. "lsr r7, r6, #16\n\t"
  128329. "lsl r6, r6, #16\n\t"
  128330. "adds r4, r4, r6\n\t"
  128331. "adcs r5, r5, r7\n\t"
  128332. "adc r3, r3, #0\n\t"
  128333. #else
  128334. "umull r6, r7, r8, r9\n\t"
  128335. "adds r4, r4, r6\n\t"
  128336. "adcs r5, r5, r7\n\t"
  128337. "adc r3, r3, #0\n\t"
  128338. #endif
  128339. /* A[11] * B[2] */
  128340. "ldr r8, [%[a], #44]\n\t"
  128341. "ldr r9, [%[b], #8]\n\t"
  128342. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  128343. "lsl r6, r8, #16\n\t"
  128344. "lsl r7, r9, #16\n\t"
  128345. "lsr r6, r6, #16\n\t"
  128346. "lsr r7, r7, #16\n\t"
  128347. "mul r7, r6, r7\n\t"
  128348. "adds r4, r4, r7\n\t"
  128349. "adcs r5, r5, #0\n\t"
  128350. "adc r3, r3, #0\n\t"
  128351. "lsr r7, r9, #16\n\t"
  128352. "mul r6, r7, r6\n\t"
  128353. "lsr r7, r6, #16\n\t"
  128354. "lsl r6, r6, #16\n\t"
  128355. "adds r4, r4, r6\n\t"
  128356. "adcs r5, r5, r7\n\t"
  128357. "adc r3, r3, #0\n\t"
  128358. "lsr r6, r8, #16\n\t"
  128359. "lsr r7, r9, #16\n\t"
  128360. "mul r7, r6, r7\n\t"
  128361. "adds r5, r5, r7\n\t"
  128362. "adc r3, r3, #0\n\t"
  128363. "lsl r7, r9, #16\n\t"
  128364. "lsr r7, r7, #16\n\t"
  128365. "mul r6, r7, r6\n\t"
  128366. "lsr r7, r6, #16\n\t"
  128367. "lsl r6, r6, #16\n\t"
  128368. "adds r4, r4, r6\n\t"
  128369. "adcs r5, r5, r7\n\t"
  128370. "adc r3, r3, #0\n\t"
  128371. #else
  128372. "umull r6, r7, r8, r9\n\t"
  128373. "adds r4, r4, r6\n\t"
  128374. "adcs r5, r5, r7\n\t"
  128375. "adc r3, r3, #0\n\t"
  128376. #endif
  128377. /* A[12] * B[1] */
  128378. "ldr r8, [%[a], #48]\n\t"
  128379. "ldr r9, [%[b], #4]\n\t"
  128380. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  128381. "lsl r6, r8, #16\n\t"
  128382. "lsl r7, r9, #16\n\t"
  128383. "lsr r6, r6, #16\n\t"
  128384. "lsr r7, r7, #16\n\t"
  128385. "mul r7, r6, r7\n\t"
  128386. "adds r4, r4, r7\n\t"
  128387. "adcs r5, r5, #0\n\t"
  128388. "adc r3, r3, #0\n\t"
  128389. "lsr r7, r9, #16\n\t"
  128390. "mul r6, r7, r6\n\t"
  128391. "lsr r7, r6, #16\n\t"
  128392. "lsl r6, r6, #16\n\t"
  128393. "adds r4, r4, r6\n\t"
  128394. "adcs r5, r5, r7\n\t"
  128395. "adc r3, r3, #0\n\t"
  128396. "lsr r6, r8, #16\n\t"
  128397. "lsr r7, r9, #16\n\t"
  128398. "mul r7, r6, r7\n\t"
  128399. "adds r5, r5, r7\n\t"
  128400. "adc r3, r3, #0\n\t"
  128401. "lsl r7, r9, #16\n\t"
  128402. "lsr r7, r7, #16\n\t"
  128403. "mul r6, r7, r6\n\t"
  128404. "lsr r7, r6, #16\n\t"
  128405. "lsl r6, r6, #16\n\t"
  128406. "adds r4, r4, r6\n\t"
  128407. "adcs r5, r5, r7\n\t"
  128408. "adc r3, r3, #0\n\t"
  128409. #else
  128410. "umull r6, r7, r8, r9\n\t"
  128411. "adds r4, r4, r6\n\t"
  128412. "adcs r5, r5, r7\n\t"
  128413. "adc r3, r3, #0\n\t"
  128414. #endif
  128415. /* A[13] * B[0] */
  128416. "ldr r8, [%[a], #52]\n\t"
  128417. "ldr r9, [%[b]]\n\t"
  128418. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  128419. "lsl r6, r8, #16\n\t"
  128420. "lsl r7, r9, #16\n\t"
  128421. "lsr r6, r6, #16\n\t"
  128422. "lsr r7, r7, #16\n\t"
  128423. "mul r7, r6, r7\n\t"
  128424. "adds r4, r4, r7\n\t"
  128425. "adcs r5, r5, #0\n\t"
  128426. "adc r3, r3, #0\n\t"
  128427. "lsr r7, r9, #16\n\t"
  128428. "mul r6, r7, r6\n\t"
  128429. "lsr r7, r6, #16\n\t"
  128430. "lsl r6, r6, #16\n\t"
  128431. "adds r4, r4, r6\n\t"
  128432. "adcs r5, r5, r7\n\t"
  128433. "adc r3, r3, #0\n\t"
  128434. "lsr r6, r8, #16\n\t"
  128435. "lsr r7, r9, #16\n\t"
  128436. "mul r7, r6, r7\n\t"
  128437. "adds r5, r5, r7\n\t"
  128438. "adc r3, r3, #0\n\t"
  128439. "lsl r7, r9, #16\n\t"
  128440. "lsr r7, r7, #16\n\t"
  128441. "mul r6, r7, r6\n\t"
  128442. "lsr r7, r6, #16\n\t"
  128443. "lsl r6, r6, #16\n\t"
  128444. "adds r4, r4, r6\n\t"
  128445. "adcs r5, r5, r7\n\t"
  128446. "adc r3, r3, #0\n\t"
  128447. #else
  128448. "umull r6, r7, r8, r9\n\t"
  128449. "adds r4, r4, r6\n\t"
  128450. "adcs r5, r5, r7\n\t"
  128451. "adc r3, r3, #0\n\t"
  128452. #endif
  128453. "str r4, [sp, #52]\n\t"
  128454. /* A[14] * B[0] */
  128455. "ldr r8, [%[a], #56]\n\t"
  128456. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  128457. "lsl r6, r8, #16\n\t"
  128458. "lsl r7, r9, #16\n\t"
  128459. "lsr r6, r6, #16\n\t"
  128460. "lsr r7, r7, #16\n\t"
  128461. "mul r7, r6, r7\n\t"
  128462. "adds r5, r5, r7\n\t"
  128463. "adcs r3, r3, #0\n\t"
  128464. "mov r4, #0\n\t"
  128465. "adc r4, r4, #0\n\t"
  128466. "lsr r7, r9, #16\n\t"
  128467. "mul r6, r7, r6\n\t"
  128468. "lsr r7, r6, #16\n\t"
  128469. "lsl r6, r6, #16\n\t"
  128470. "adds r5, r5, r6\n\t"
  128471. "adcs r3, r3, r7\n\t"
  128472. "adc r4, r4, #0\n\t"
  128473. "lsr r6, r8, #16\n\t"
  128474. "lsr r7, r9, #16\n\t"
  128475. "mul r7, r6, r7\n\t"
  128476. "adds r3, r3, r7\n\t"
  128477. "adc r4, r4, #0\n\t"
  128478. "lsl r7, r9, #16\n\t"
  128479. "lsr r7, r7, #16\n\t"
  128480. "mul r6, r7, r6\n\t"
  128481. "lsr r7, r6, #16\n\t"
  128482. "lsl r6, r6, #16\n\t"
  128483. "adds r5, r5, r6\n\t"
  128484. "adcs r3, r3, r7\n\t"
  128485. "adc r4, r4, #0\n\t"
  128486. #else
  128487. "umull r6, r7, r8, r9\n\t"
  128488. "adds r5, r5, r6\n\t"
  128489. "adcs r3, r3, r7\n\t"
  128490. "mov r4, #0\n\t"
  128491. "adc r4, r4, #0\n\t"
  128492. #endif
  128493. /* A[13] * B[1] */
  128494. "ldr r8, [%[a], #52]\n\t"
  128495. "ldr r9, [%[b], #4]\n\t"
  128496. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  128497. "lsl r6, r8, #16\n\t"
  128498. "lsl r7, r9, #16\n\t"
  128499. "lsr r6, r6, #16\n\t"
  128500. "lsr r7, r7, #16\n\t"
  128501. "mul r7, r6, r7\n\t"
  128502. "adds r5, r5, r7\n\t"
  128503. "adcs r3, r3, #0\n\t"
  128504. "adc r4, r4, #0\n\t"
  128505. "lsr r7, r9, #16\n\t"
  128506. "mul r6, r7, r6\n\t"
  128507. "lsr r7, r6, #16\n\t"
  128508. "lsl r6, r6, #16\n\t"
  128509. "adds r5, r5, r6\n\t"
  128510. "adcs r3, r3, r7\n\t"
  128511. "adc r4, r4, #0\n\t"
  128512. "lsr r6, r8, #16\n\t"
  128513. "lsr r7, r9, #16\n\t"
  128514. "mul r7, r6, r7\n\t"
  128515. "adds r3, r3, r7\n\t"
  128516. "adc r4, r4, #0\n\t"
  128517. "lsl r7, r9, #16\n\t"
  128518. "lsr r7, r7, #16\n\t"
  128519. "mul r6, r7, r6\n\t"
  128520. "lsr r7, r6, #16\n\t"
  128521. "lsl r6, r6, #16\n\t"
  128522. "adds r5, r5, r6\n\t"
  128523. "adcs r3, r3, r7\n\t"
  128524. "adc r4, r4, #0\n\t"
  128525. #else
  128526. "umull r6, r7, r8, r9\n\t"
  128527. "adds r5, r5, r6\n\t"
  128528. "adcs r3, r3, r7\n\t"
  128529. "adc r4, r4, #0\n\t"
  128530. #endif
  128531. /* A[12] * B[2] */
  128532. "ldr r8, [%[a], #48]\n\t"
  128533. "ldr r9, [%[b], #8]\n\t"
  128534. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  128535. "lsl r6, r8, #16\n\t"
  128536. "lsl r7, r9, #16\n\t"
  128537. "lsr r6, r6, #16\n\t"
  128538. "lsr r7, r7, #16\n\t"
  128539. "mul r7, r6, r7\n\t"
  128540. "adds r5, r5, r7\n\t"
  128541. "adcs r3, r3, #0\n\t"
  128542. "adc r4, r4, #0\n\t"
  128543. "lsr r7, r9, #16\n\t"
  128544. "mul r6, r7, r6\n\t"
  128545. "lsr r7, r6, #16\n\t"
  128546. "lsl r6, r6, #16\n\t"
  128547. "adds r5, r5, r6\n\t"
  128548. "adcs r3, r3, r7\n\t"
  128549. "adc r4, r4, #0\n\t"
  128550. "lsr r6, r8, #16\n\t"
  128551. "lsr r7, r9, #16\n\t"
  128552. "mul r7, r6, r7\n\t"
  128553. "adds r3, r3, r7\n\t"
  128554. "adc r4, r4, #0\n\t"
  128555. "lsl r7, r9, #16\n\t"
  128556. "lsr r7, r7, #16\n\t"
  128557. "mul r6, r7, r6\n\t"
  128558. "lsr r7, r6, #16\n\t"
  128559. "lsl r6, r6, #16\n\t"
  128560. "adds r5, r5, r6\n\t"
  128561. "adcs r3, r3, r7\n\t"
  128562. "adc r4, r4, #0\n\t"
  128563. #else
  128564. "umull r6, r7, r8, r9\n\t"
  128565. "adds r5, r5, r6\n\t"
  128566. "adcs r3, r3, r7\n\t"
  128567. "adc r4, r4, #0\n\t"
  128568. #endif
  128569. /* A[11] * B[3] */
  128570. "ldr r8, [%[a], #44]\n\t"
  128571. "ldr r9, [%[b], #12]\n\t"
  128572. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  128573. "lsl r6, r8, #16\n\t"
  128574. "lsl r7, r9, #16\n\t"
  128575. "lsr r6, r6, #16\n\t"
  128576. "lsr r7, r7, #16\n\t"
  128577. "mul r7, r6, r7\n\t"
  128578. "adds r5, r5, r7\n\t"
  128579. "adcs r3, r3, #0\n\t"
  128580. "adc r4, r4, #0\n\t"
  128581. "lsr r7, r9, #16\n\t"
  128582. "mul r6, r7, r6\n\t"
  128583. "lsr r7, r6, #16\n\t"
  128584. "lsl r6, r6, #16\n\t"
  128585. "adds r5, r5, r6\n\t"
  128586. "adcs r3, r3, r7\n\t"
  128587. "adc r4, r4, #0\n\t"
  128588. "lsr r6, r8, #16\n\t"
  128589. "lsr r7, r9, #16\n\t"
  128590. "mul r7, r6, r7\n\t"
  128591. "adds r3, r3, r7\n\t"
  128592. "adc r4, r4, #0\n\t"
  128593. "lsl r7, r9, #16\n\t"
  128594. "lsr r7, r7, #16\n\t"
  128595. "mul r6, r7, r6\n\t"
  128596. "lsr r7, r6, #16\n\t"
  128597. "lsl r6, r6, #16\n\t"
  128598. "adds r5, r5, r6\n\t"
  128599. "adcs r3, r3, r7\n\t"
  128600. "adc r4, r4, #0\n\t"
  128601. #else
  128602. "umull r6, r7, r8, r9\n\t"
  128603. "adds r5, r5, r6\n\t"
  128604. "adcs r3, r3, r7\n\t"
  128605. "adc r4, r4, #0\n\t"
  128606. #endif
  128607. /* A[10] * B[4] */
  128608. "ldr r8, [%[a], #40]\n\t"
  128609. "ldr r9, [%[b], #16]\n\t"
  128610. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  128611. "lsl r6, r8, #16\n\t"
  128612. "lsl r7, r9, #16\n\t"
  128613. "lsr r6, r6, #16\n\t"
  128614. "lsr r7, r7, #16\n\t"
  128615. "mul r7, r6, r7\n\t"
  128616. "adds r5, r5, r7\n\t"
  128617. "adcs r3, r3, #0\n\t"
  128618. "adc r4, r4, #0\n\t"
  128619. "lsr r7, r9, #16\n\t"
  128620. "mul r6, r7, r6\n\t"
  128621. "lsr r7, r6, #16\n\t"
  128622. "lsl r6, r6, #16\n\t"
  128623. "adds r5, r5, r6\n\t"
  128624. "adcs r3, r3, r7\n\t"
  128625. "adc r4, r4, #0\n\t"
  128626. "lsr r6, r8, #16\n\t"
  128627. "lsr r7, r9, #16\n\t"
  128628. "mul r7, r6, r7\n\t"
  128629. "adds r3, r3, r7\n\t"
  128630. "adc r4, r4, #0\n\t"
  128631. "lsl r7, r9, #16\n\t"
  128632. "lsr r7, r7, #16\n\t"
  128633. "mul r6, r7, r6\n\t"
  128634. "lsr r7, r6, #16\n\t"
  128635. "lsl r6, r6, #16\n\t"
  128636. "adds r5, r5, r6\n\t"
  128637. "adcs r3, r3, r7\n\t"
  128638. "adc r4, r4, #0\n\t"
  128639. #else
  128640. "umull r6, r7, r8, r9\n\t"
  128641. "adds r5, r5, r6\n\t"
  128642. "adcs r3, r3, r7\n\t"
  128643. "adc r4, r4, #0\n\t"
  128644. #endif
  128645. /* A[9] * B[5] */
  128646. "ldr r8, [%[a], #36]\n\t"
  128647. "ldr r9, [%[b], #20]\n\t"
  128648. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  128649. "lsl r6, r8, #16\n\t"
  128650. "lsl r7, r9, #16\n\t"
  128651. "lsr r6, r6, #16\n\t"
  128652. "lsr r7, r7, #16\n\t"
  128653. "mul r7, r6, r7\n\t"
  128654. "adds r5, r5, r7\n\t"
  128655. "adcs r3, r3, #0\n\t"
  128656. "adc r4, r4, #0\n\t"
  128657. "lsr r7, r9, #16\n\t"
  128658. "mul r6, r7, r6\n\t"
  128659. "lsr r7, r6, #16\n\t"
  128660. "lsl r6, r6, #16\n\t"
  128661. "adds r5, r5, r6\n\t"
  128662. "adcs r3, r3, r7\n\t"
  128663. "adc r4, r4, #0\n\t"
  128664. "lsr r6, r8, #16\n\t"
  128665. "lsr r7, r9, #16\n\t"
  128666. "mul r7, r6, r7\n\t"
  128667. "adds r3, r3, r7\n\t"
  128668. "adc r4, r4, #0\n\t"
  128669. "lsl r7, r9, #16\n\t"
  128670. "lsr r7, r7, #16\n\t"
  128671. "mul r6, r7, r6\n\t"
  128672. "lsr r7, r6, #16\n\t"
  128673. "lsl r6, r6, #16\n\t"
  128674. "adds r5, r5, r6\n\t"
  128675. "adcs r3, r3, r7\n\t"
  128676. "adc r4, r4, #0\n\t"
  128677. #else
  128678. "umull r6, r7, r8, r9\n\t"
  128679. "adds r5, r5, r6\n\t"
  128680. "adcs r3, r3, r7\n\t"
  128681. "adc r4, r4, #0\n\t"
  128682. #endif
  128683. /* A[8] * B[6] */
  128684. "ldr r8, [%[a], #32]\n\t"
  128685. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  128686. "lsl r6, r8, #16\n\t"
  128687. "lsl r7, r12, #16\n\t"
  128688. "lsr r6, r6, #16\n\t"
  128689. "lsr r7, r7, #16\n\t"
  128690. "mul r7, r6, r7\n\t"
  128691. "adds r5, r5, r7\n\t"
  128692. "adcs r3, r3, #0\n\t"
  128693. "adc r4, r4, #0\n\t"
  128694. "lsr r7, r12, #16\n\t"
  128695. "mul r6, r7, r6\n\t"
  128696. "lsr r7, r6, #16\n\t"
  128697. "lsl r6, r6, #16\n\t"
  128698. "adds r5, r5, r6\n\t"
  128699. "adcs r3, r3, r7\n\t"
  128700. "adc r4, r4, #0\n\t"
  128701. "lsr r6, r8, #16\n\t"
  128702. "lsr r7, r12, #16\n\t"
  128703. "mul r7, r6, r7\n\t"
  128704. "adds r3, r3, r7\n\t"
  128705. "adc r4, r4, #0\n\t"
  128706. "lsl r7, r12, #16\n\t"
  128707. "lsr r7, r7, #16\n\t"
  128708. "mul r6, r7, r6\n\t"
  128709. "lsr r7, r6, #16\n\t"
  128710. "lsl r6, r6, #16\n\t"
  128711. "adds r5, r5, r6\n\t"
  128712. "adcs r3, r3, r7\n\t"
  128713. "adc r4, r4, #0\n\t"
  128714. #else
  128715. "umull r6, r7, r8, r12\n\t"
  128716. "adds r5, r5, r6\n\t"
  128717. "adcs r3, r3, r7\n\t"
  128718. "adc r4, r4, #0\n\t"
  128719. #endif
  128720. /* A[7] * B[7] */
  128721. "ldr r11, [%[a], #28]\n\t"
  128722. "ldr r12, [%[b], #28]\n\t"
  128723. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  128724. "lsl r6, r11, #16\n\t"
  128725. "lsl r7, r12, #16\n\t"
  128726. "lsr r6, r6, #16\n\t"
  128727. "lsr r7, r7, #16\n\t"
  128728. "mul r7, r6, r7\n\t"
  128729. "adds r5, r5, r7\n\t"
  128730. "adcs r3, r3, #0\n\t"
  128731. "adc r4, r4, #0\n\t"
  128732. "lsr r7, r12, #16\n\t"
  128733. "mul r6, r7, r6\n\t"
  128734. "lsr r7, r6, #16\n\t"
  128735. "lsl r6, r6, #16\n\t"
  128736. "adds r5, r5, r6\n\t"
  128737. "adcs r3, r3, r7\n\t"
  128738. "adc r4, r4, #0\n\t"
  128739. "lsr r6, r11, #16\n\t"
  128740. "lsr r7, r12, #16\n\t"
  128741. "mul r7, r6, r7\n\t"
  128742. "adds r3, r3, r7\n\t"
  128743. "adc r4, r4, #0\n\t"
  128744. "lsl r7, r12, #16\n\t"
  128745. "lsr r7, r7, #16\n\t"
  128746. "mul r6, r7, r6\n\t"
  128747. "lsr r7, r6, #16\n\t"
  128748. "lsl r6, r6, #16\n\t"
  128749. "adds r5, r5, r6\n\t"
  128750. "adcs r3, r3, r7\n\t"
  128751. "adc r4, r4, #0\n\t"
  128752. #else
  128753. "umull r6, r7, r11, r12\n\t"
  128754. "adds r5, r5, r6\n\t"
  128755. "adcs r3, r3, r7\n\t"
  128756. "adc r4, r4, #0\n\t"
  128757. #endif
  128758. /* A[6] * B[8] */
  128759. "ldr r8, [%[a], #24]\n\t"
  128760. "ldr r9, [%[b], #32]\n\t"
  128761. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  128762. "lsl r6, r8, #16\n\t"
  128763. "lsl r7, r9, #16\n\t"
  128764. "lsr r6, r6, #16\n\t"
  128765. "lsr r7, r7, #16\n\t"
  128766. "mul r7, r6, r7\n\t"
  128767. "adds r5, r5, r7\n\t"
  128768. "adcs r3, r3, #0\n\t"
  128769. "adc r4, r4, #0\n\t"
  128770. "lsr r7, r9, #16\n\t"
  128771. "mul r6, r7, r6\n\t"
  128772. "lsr r7, r6, #16\n\t"
  128773. "lsl r6, r6, #16\n\t"
  128774. "adds r5, r5, r6\n\t"
  128775. "adcs r3, r3, r7\n\t"
  128776. "adc r4, r4, #0\n\t"
  128777. "lsr r6, r8, #16\n\t"
  128778. "lsr r7, r9, #16\n\t"
  128779. "mul r7, r6, r7\n\t"
  128780. "adds r3, r3, r7\n\t"
  128781. "adc r4, r4, #0\n\t"
  128782. "lsl r7, r9, #16\n\t"
  128783. "lsr r7, r7, #16\n\t"
  128784. "mul r6, r7, r6\n\t"
  128785. "lsr r7, r6, #16\n\t"
  128786. "lsl r6, r6, #16\n\t"
  128787. "adds r5, r5, r6\n\t"
  128788. "adcs r3, r3, r7\n\t"
  128789. "adc r4, r4, #0\n\t"
  128790. #else
  128791. "umull r6, r7, r8, r9\n\t"
  128792. "adds r5, r5, r6\n\t"
  128793. "adcs r3, r3, r7\n\t"
  128794. "adc r4, r4, #0\n\t"
  128795. #endif
  128796. /* A[5] * B[9] */
  128797. "ldr r8, [%[a], #20]\n\t"
  128798. "ldr r9, [%[b], #36]\n\t"
  128799. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  128800. "lsl r6, r8, #16\n\t"
  128801. "lsl r7, r9, #16\n\t"
  128802. "lsr r6, r6, #16\n\t"
  128803. "lsr r7, r7, #16\n\t"
  128804. "mul r7, r6, r7\n\t"
  128805. "adds r5, r5, r7\n\t"
  128806. "adcs r3, r3, #0\n\t"
  128807. "adc r4, r4, #0\n\t"
  128808. "lsr r7, r9, #16\n\t"
  128809. "mul r6, r7, r6\n\t"
  128810. "lsr r7, r6, #16\n\t"
  128811. "lsl r6, r6, #16\n\t"
  128812. "adds r5, r5, r6\n\t"
  128813. "adcs r3, r3, r7\n\t"
  128814. "adc r4, r4, #0\n\t"
  128815. "lsr r6, r8, #16\n\t"
  128816. "lsr r7, r9, #16\n\t"
  128817. "mul r7, r6, r7\n\t"
  128818. "adds r3, r3, r7\n\t"
  128819. "adc r4, r4, #0\n\t"
  128820. "lsl r7, r9, #16\n\t"
  128821. "lsr r7, r7, #16\n\t"
  128822. "mul r6, r7, r6\n\t"
  128823. "lsr r7, r6, #16\n\t"
  128824. "lsl r6, r6, #16\n\t"
  128825. "adds r5, r5, r6\n\t"
  128826. "adcs r3, r3, r7\n\t"
  128827. "adc r4, r4, #0\n\t"
  128828. #else
  128829. "umull r6, r7, r8, r9\n\t"
  128830. "adds r5, r5, r6\n\t"
  128831. "adcs r3, r3, r7\n\t"
  128832. "adc r4, r4, #0\n\t"
  128833. #endif
  128834. /* A[4] * B[10] */
  128835. "ldr r8, [%[a], #16]\n\t"
  128836. "ldr r9, [%[b], #40]\n\t"
  128837. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  128838. "lsl r6, r8, #16\n\t"
  128839. "lsl r7, r9, #16\n\t"
  128840. "lsr r6, r6, #16\n\t"
  128841. "lsr r7, r7, #16\n\t"
  128842. "mul r7, r6, r7\n\t"
  128843. "adds r5, r5, r7\n\t"
  128844. "adcs r3, r3, #0\n\t"
  128845. "adc r4, r4, #0\n\t"
  128846. "lsr r7, r9, #16\n\t"
  128847. "mul r6, r7, r6\n\t"
  128848. "lsr r7, r6, #16\n\t"
  128849. "lsl r6, r6, #16\n\t"
  128850. "adds r5, r5, r6\n\t"
  128851. "adcs r3, r3, r7\n\t"
  128852. "adc r4, r4, #0\n\t"
  128853. "lsr r6, r8, #16\n\t"
  128854. "lsr r7, r9, #16\n\t"
  128855. "mul r7, r6, r7\n\t"
  128856. "adds r3, r3, r7\n\t"
  128857. "adc r4, r4, #0\n\t"
  128858. "lsl r7, r9, #16\n\t"
  128859. "lsr r7, r7, #16\n\t"
  128860. "mul r6, r7, r6\n\t"
  128861. "lsr r7, r6, #16\n\t"
  128862. "lsl r6, r6, #16\n\t"
  128863. "adds r5, r5, r6\n\t"
  128864. "adcs r3, r3, r7\n\t"
  128865. "adc r4, r4, #0\n\t"
  128866. #else
  128867. "umull r6, r7, r8, r9\n\t"
  128868. "adds r5, r5, r6\n\t"
  128869. "adcs r3, r3, r7\n\t"
  128870. "adc r4, r4, #0\n\t"
  128871. #endif
  128872. /* A[3] * B[11] */
  128873. "ldr r8, [%[a], #12]\n\t"
  128874. "ldr r9, [%[b], #44]\n\t"
  128875. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  128876. "lsl r6, r8, #16\n\t"
  128877. "lsl r7, r9, #16\n\t"
  128878. "lsr r6, r6, #16\n\t"
  128879. "lsr r7, r7, #16\n\t"
  128880. "mul r7, r6, r7\n\t"
  128881. "adds r5, r5, r7\n\t"
  128882. "adcs r3, r3, #0\n\t"
  128883. "adc r4, r4, #0\n\t"
  128884. "lsr r7, r9, #16\n\t"
  128885. "mul r6, r7, r6\n\t"
  128886. "lsr r7, r6, #16\n\t"
  128887. "lsl r6, r6, #16\n\t"
  128888. "adds r5, r5, r6\n\t"
  128889. "adcs r3, r3, r7\n\t"
  128890. "adc r4, r4, #0\n\t"
  128891. "lsr r6, r8, #16\n\t"
  128892. "lsr r7, r9, #16\n\t"
  128893. "mul r7, r6, r7\n\t"
  128894. "adds r3, r3, r7\n\t"
  128895. "adc r4, r4, #0\n\t"
  128896. "lsl r7, r9, #16\n\t"
  128897. "lsr r7, r7, #16\n\t"
  128898. "mul r6, r7, r6\n\t"
  128899. "lsr r7, r6, #16\n\t"
  128900. "lsl r6, r6, #16\n\t"
  128901. "adds r5, r5, r6\n\t"
  128902. "adcs r3, r3, r7\n\t"
  128903. "adc r4, r4, #0\n\t"
  128904. #else
  128905. "umull r6, r7, r8, r9\n\t"
  128906. "adds r5, r5, r6\n\t"
  128907. "adcs r3, r3, r7\n\t"
  128908. "adc r4, r4, #0\n\t"
  128909. #endif
  128910. /* A[2] * B[12] */
  128911. "ldr r8, [%[a], #8]\n\t"
  128912. "ldr r9, [%[b], #48]\n\t"
  128913. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  128914. "lsl r6, r8, #16\n\t"
  128915. "lsl r7, r9, #16\n\t"
  128916. "lsr r6, r6, #16\n\t"
  128917. "lsr r7, r7, #16\n\t"
  128918. "mul r7, r6, r7\n\t"
  128919. "adds r5, r5, r7\n\t"
  128920. "adcs r3, r3, #0\n\t"
  128921. "adc r4, r4, #0\n\t"
  128922. "lsr r7, r9, #16\n\t"
  128923. "mul r6, r7, r6\n\t"
  128924. "lsr r7, r6, #16\n\t"
  128925. "lsl r6, r6, #16\n\t"
  128926. "adds r5, r5, r6\n\t"
  128927. "adcs r3, r3, r7\n\t"
  128928. "adc r4, r4, #0\n\t"
  128929. "lsr r6, r8, #16\n\t"
  128930. "lsr r7, r9, #16\n\t"
  128931. "mul r7, r6, r7\n\t"
  128932. "adds r3, r3, r7\n\t"
  128933. "adc r4, r4, #0\n\t"
  128934. "lsl r7, r9, #16\n\t"
  128935. "lsr r7, r7, #16\n\t"
  128936. "mul r6, r7, r6\n\t"
  128937. "lsr r7, r6, #16\n\t"
  128938. "lsl r6, r6, #16\n\t"
  128939. "adds r5, r5, r6\n\t"
  128940. "adcs r3, r3, r7\n\t"
  128941. "adc r4, r4, #0\n\t"
  128942. #else
  128943. "umull r6, r7, r8, r9\n\t"
  128944. "adds r5, r5, r6\n\t"
  128945. "adcs r3, r3, r7\n\t"
  128946. "adc r4, r4, #0\n\t"
  128947. #endif
  128948. /* A[1] * B[13] */
  128949. "ldr r8, [%[a], #4]\n\t"
  128950. "ldr r9, [%[b], #52]\n\t"
  128951. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  128952. "lsl r6, r8, #16\n\t"
  128953. "lsl r7, r9, #16\n\t"
  128954. "lsr r6, r6, #16\n\t"
  128955. "lsr r7, r7, #16\n\t"
  128956. "mul r7, r6, r7\n\t"
  128957. "adds r5, r5, r7\n\t"
  128958. "adcs r3, r3, #0\n\t"
  128959. "adc r4, r4, #0\n\t"
  128960. "lsr r7, r9, #16\n\t"
  128961. "mul r6, r7, r6\n\t"
  128962. "lsr r7, r6, #16\n\t"
  128963. "lsl r6, r6, #16\n\t"
  128964. "adds r5, r5, r6\n\t"
  128965. "adcs r3, r3, r7\n\t"
  128966. "adc r4, r4, #0\n\t"
  128967. "lsr r6, r8, #16\n\t"
  128968. "lsr r7, r9, #16\n\t"
  128969. "mul r7, r6, r7\n\t"
  128970. "adds r3, r3, r7\n\t"
  128971. "adc r4, r4, #0\n\t"
  128972. "lsl r7, r9, #16\n\t"
  128973. "lsr r7, r7, #16\n\t"
  128974. "mul r6, r7, r6\n\t"
  128975. "lsr r7, r6, #16\n\t"
  128976. "lsl r6, r6, #16\n\t"
  128977. "adds r5, r5, r6\n\t"
  128978. "adcs r3, r3, r7\n\t"
  128979. "adc r4, r4, #0\n\t"
  128980. #else
  128981. "umull r6, r7, r8, r9\n\t"
  128982. "adds r5, r5, r6\n\t"
  128983. "adcs r3, r3, r7\n\t"
  128984. "adc r4, r4, #0\n\t"
  128985. #endif
  128986. /* A[0] * B[14] */
  128987. "ldr r8, [%[a]]\n\t"
  128988. "ldr r9, [%[b], #56]\n\t"
  128989. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  128990. "lsl r6, r8, #16\n\t"
  128991. "lsl r7, r9, #16\n\t"
  128992. "lsr r6, r6, #16\n\t"
  128993. "lsr r7, r7, #16\n\t"
  128994. "mul r7, r6, r7\n\t"
  128995. "adds r5, r5, r7\n\t"
  128996. "adcs r3, r3, #0\n\t"
  128997. "adc r4, r4, #0\n\t"
  128998. "lsr r7, r9, #16\n\t"
  128999. "mul r6, r7, r6\n\t"
  129000. "lsr r7, r6, #16\n\t"
  129001. "lsl r6, r6, #16\n\t"
  129002. "adds r5, r5, r6\n\t"
  129003. "adcs r3, r3, r7\n\t"
  129004. "adc r4, r4, #0\n\t"
  129005. "lsr r6, r8, #16\n\t"
  129006. "lsr r7, r9, #16\n\t"
  129007. "mul r7, r6, r7\n\t"
  129008. "adds r3, r3, r7\n\t"
  129009. "adc r4, r4, #0\n\t"
  129010. "lsl r7, r9, #16\n\t"
  129011. "lsr r7, r7, #16\n\t"
  129012. "mul r6, r7, r6\n\t"
  129013. "lsr r7, r6, #16\n\t"
  129014. "lsl r6, r6, #16\n\t"
  129015. "adds r5, r5, r6\n\t"
  129016. "adcs r3, r3, r7\n\t"
  129017. "adc r4, r4, #0\n\t"
  129018. #else
  129019. "umull r6, r7, r8, r9\n\t"
  129020. "adds r5, r5, r6\n\t"
  129021. "adcs r3, r3, r7\n\t"
  129022. "adc r4, r4, #0\n\t"
  129023. #endif
  129024. "str r5, [sp, #56]\n\t"
  129025. /* A[0] * B[15] */
  129026. "ldr r9, [%[b], #60]\n\t"
  129027. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  129028. "lsl r6, r8, #16\n\t"
  129029. "lsl r7, r9, #16\n\t"
  129030. "lsr r6, r6, #16\n\t"
  129031. "lsr r7, r7, #16\n\t"
  129032. "mul r7, r6, r7\n\t"
  129033. "adds r3, r3, r7\n\t"
  129034. "adcs r4, r4, #0\n\t"
  129035. "mov r5, #0\n\t"
  129036. "adc r5, r5, #0\n\t"
  129037. "lsr r7, r9, #16\n\t"
  129038. "mul r6, r7, r6\n\t"
  129039. "lsr r7, r6, #16\n\t"
  129040. "lsl r6, r6, #16\n\t"
  129041. "adds r3, r3, r6\n\t"
  129042. "adcs r4, r4, r7\n\t"
  129043. "adc r5, r5, #0\n\t"
  129044. "lsr r6, r8, #16\n\t"
  129045. "lsr r7, r9, #16\n\t"
  129046. "mul r7, r6, r7\n\t"
  129047. "adds r4, r4, r7\n\t"
  129048. "adc r5, r5, #0\n\t"
  129049. "lsl r7, r9, #16\n\t"
  129050. "lsr r7, r7, #16\n\t"
  129051. "mul r6, r7, r6\n\t"
  129052. "lsr r7, r6, #16\n\t"
  129053. "lsl r6, r6, #16\n\t"
  129054. "adds r3, r3, r6\n\t"
  129055. "adcs r4, r4, r7\n\t"
  129056. "adc r5, r5, #0\n\t"
  129057. #else
  129058. "umull r6, r7, r8, r9\n\t"
  129059. "adds r3, r3, r6\n\t"
  129060. "adcs r4, r4, r7\n\t"
  129061. "mov r5, #0\n\t"
  129062. "adc r5, r5, #0\n\t"
  129063. #endif
  129064. /* A[1] * B[14] */
  129065. "ldr r8, [%[a], #4]\n\t"
  129066. "ldr r9, [%[b], #56]\n\t"
  129067. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  129068. "lsl r6, r8, #16\n\t"
  129069. "lsl r7, r9, #16\n\t"
  129070. "lsr r6, r6, #16\n\t"
  129071. "lsr r7, r7, #16\n\t"
  129072. "mul r7, r6, r7\n\t"
  129073. "adds r3, r3, r7\n\t"
  129074. "adcs r4, r4, #0\n\t"
  129075. "adc r5, r5, #0\n\t"
  129076. "lsr r7, r9, #16\n\t"
  129077. "mul r6, r7, r6\n\t"
  129078. "lsr r7, r6, #16\n\t"
  129079. "lsl r6, r6, #16\n\t"
  129080. "adds r3, r3, r6\n\t"
  129081. "adcs r4, r4, r7\n\t"
  129082. "adc r5, r5, #0\n\t"
  129083. "lsr r6, r8, #16\n\t"
  129084. "lsr r7, r9, #16\n\t"
  129085. "mul r7, r6, r7\n\t"
  129086. "adds r4, r4, r7\n\t"
  129087. "adc r5, r5, #0\n\t"
  129088. "lsl r7, r9, #16\n\t"
  129089. "lsr r7, r7, #16\n\t"
  129090. "mul r6, r7, r6\n\t"
  129091. "lsr r7, r6, #16\n\t"
  129092. "lsl r6, r6, #16\n\t"
  129093. "adds r3, r3, r6\n\t"
  129094. "adcs r4, r4, r7\n\t"
  129095. "adc r5, r5, #0\n\t"
  129096. #else
  129097. "umull r6, r7, r8, r9\n\t"
  129098. "adds r3, r3, r6\n\t"
  129099. "adcs r4, r4, r7\n\t"
  129100. "adc r5, r5, #0\n\t"
  129101. #endif
  129102. /* A[2] * B[13] */
  129103. "ldr r8, [%[a], #8]\n\t"
  129104. "ldr r9, [%[b], #52]\n\t"
  129105. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  129106. "lsl r6, r8, #16\n\t"
  129107. "lsl r7, r9, #16\n\t"
  129108. "lsr r6, r6, #16\n\t"
  129109. "lsr r7, r7, #16\n\t"
  129110. "mul r7, r6, r7\n\t"
  129111. "adds r3, r3, r7\n\t"
  129112. "adcs r4, r4, #0\n\t"
  129113. "adc r5, r5, #0\n\t"
  129114. "lsr r7, r9, #16\n\t"
  129115. "mul r6, r7, r6\n\t"
  129116. "lsr r7, r6, #16\n\t"
  129117. "lsl r6, r6, #16\n\t"
  129118. "adds r3, r3, r6\n\t"
  129119. "adcs r4, r4, r7\n\t"
  129120. "adc r5, r5, #0\n\t"
  129121. "lsr r6, r8, #16\n\t"
  129122. "lsr r7, r9, #16\n\t"
  129123. "mul r7, r6, r7\n\t"
  129124. "adds r4, r4, r7\n\t"
  129125. "adc r5, r5, #0\n\t"
  129126. "lsl r7, r9, #16\n\t"
  129127. "lsr r7, r7, #16\n\t"
  129128. "mul r6, r7, r6\n\t"
  129129. "lsr r7, r6, #16\n\t"
  129130. "lsl r6, r6, #16\n\t"
  129131. "adds r3, r3, r6\n\t"
  129132. "adcs r4, r4, r7\n\t"
  129133. "adc r5, r5, #0\n\t"
  129134. #else
  129135. "umull r6, r7, r8, r9\n\t"
  129136. "adds r3, r3, r6\n\t"
  129137. "adcs r4, r4, r7\n\t"
  129138. "adc r5, r5, #0\n\t"
  129139. #endif
  129140. /* A[3] * B[12] */
  129141. "ldr r8, [%[a], #12]\n\t"
  129142. "ldr r9, [%[b], #48]\n\t"
  129143. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  129144. "lsl r6, r8, #16\n\t"
  129145. "lsl r7, r9, #16\n\t"
  129146. "lsr r6, r6, #16\n\t"
  129147. "lsr r7, r7, #16\n\t"
  129148. "mul r7, r6, r7\n\t"
  129149. "adds r3, r3, r7\n\t"
  129150. "adcs r4, r4, #0\n\t"
  129151. "adc r5, r5, #0\n\t"
  129152. "lsr r7, r9, #16\n\t"
  129153. "mul r6, r7, r6\n\t"
  129154. "lsr r7, r6, #16\n\t"
  129155. "lsl r6, r6, #16\n\t"
  129156. "adds r3, r3, r6\n\t"
  129157. "adcs r4, r4, r7\n\t"
  129158. "adc r5, r5, #0\n\t"
  129159. "lsr r6, r8, #16\n\t"
  129160. "lsr r7, r9, #16\n\t"
  129161. "mul r7, r6, r7\n\t"
  129162. "adds r4, r4, r7\n\t"
  129163. "adc r5, r5, #0\n\t"
  129164. "lsl r7, r9, #16\n\t"
  129165. "lsr r7, r7, #16\n\t"
  129166. "mul r6, r7, r6\n\t"
  129167. "lsr r7, r6, #16\n\t"
  129168. "lsl r6, r6, #16\n\t"
  129169. "adds r3, r3, r6\n\t"
  129170. "adcs r4, r4, r7\n\t"
  129171. "adc r5, r5, #0\n\t"
  129172. #else
  129173. "umull r6, r7, r8, r9\n\t"
  129174. "adds r3, r3, r6\n\t"
  129175. "adcs r4, r4, r7\n\t"
  129176. "adc r5, r5, #0\n\t"
  129177. #endif
  129178. /* A[4] * B[11] */
  129179. "ldr r8, [%[a], #16]\n\t"
  129180. "ldr r9, [%[b], #44]\n\t"
  129181. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  129182. "lsl r6, r8, #16\n\t"
  129183. "lsl r7, r9, #16\n\t"
  129184. "lsr r6, r6, #16\n\t"
  129185. "lsr r7, r7, #16\n\t"
  129186. "mul r7, r6, r7\n\t"
  129187. "adds r3, r3, r7\n\t"
  129188. "adcs r4, r4, #0\n\t"
  129189. "adc r5, r5, #0\n\t"
  129190. "lsr r7, r9, #16\n\t"
  129191. "mul r6, r7, r6\n\t"
  129192. "lsr r7, r6, #16\n\t"
  129193. "lsl r6, r6, #16\n\t"
  129194. "adds r3, r3, r6\n\t"
  129195. "adcs r4, r4, r7\n\t"
  129196. "adc r5, r5, #0\n\t"
  129197. "lsr r6, r8, #16\n\t"
  129198. "lsr r7, r9, #16\n\t"
  129199. "mul r7, r6, r7\n\t"
  129200. "adds r4, r4, r7\n\t"
  129201. "adc r5, r5, #0\n\t"
  129202. "lsl r7, r9, #16\n\t"
  129203. "lsr r7, r7, #16\n\t"
  129204. "mul r6, r7, r6\n\t"
  129205. "lsr r7, r6, #16\n\t"
  129206. "lsl r6, r6, #16\n\t"
  129207. "adds r3, r3, r6\n\t"
  129208. "adcs r4, r4, r7\n\t"
  129209. "adc r5, r5, #0\n\t"
  129210. #else
  129211. "umull r6, r7, r8, r9\n\t"
  129212. "adds r3, r3, r6\n\t"
  129213. "adcs r4, r4, r7\n\t"
  129214. "adc r5, r5, #0\n\t"
  129215. #endif
  129216. /* A[5] * B[10] */
  129217. "ldr r8, [%[a], #20]\n\t"
  129218. "ldr r9, [%[b], #40]\n\t"
  129219. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  129220. "lsl r6, r8, #16\n\t"
  129221. "lsl r7, r9, #16\n\t"
  129222. "lsr r6, r6, #16\n\t"
  129223. "lsr r7, r7, #16\n\t"
  129224. "mul r7, r6, r7\n\t"
  129225. "adds r3, r3, r7\n\t"
  129226. "adcs r4, r4, #0\n\t"
  129227. "adc r5, r5, #0\n\t"
  129228. "lsr r7, r9, #16\n\t"
  129229. "mul r6, r7, r6\n\t"
  129230. "lsr r7, r6, #16\n\t"
  129231. "lsl r6, r6, #16\n\t"
  129232. "adds r3, r3, r6\n\t"
  129233. "adcs r4, r4, r7\n\t"
  129234. "adc r5, r5, #0\n\t"
  129235. "lsr r6, r8, #16\n\t"
  129236. "lsr r7, r9, #16\n\t"
  129237. "mul r7, r6, r7\n\t"
  129238. "adds r4, r4, r7\n\t"
  129239. "adc r5, r5, #0\n\t"
  129240. "lsl r7, r9, #16\n\t"
  129241. "lsr r7, r7, #16\n\t"
  129242. "mul r6, r7, r6\n\t"
  129243. "lsr r7, r6, #16\n\t"
  129244. "lsl r6, r6, #16\n\t"
  129245. "adds r3, r3, r6\n\t"
  129246. "adcs r4, r4, r7\n\t"
  129247. "adc r5, r5, #0\n\t"
  129248. #else
  129249. "umull r6, r7, r8, r9\n\t"
  129250. "adds r3, r3, r6\n\t"
  129251. "adcs r4, r4, r7\n\t"
  129252. "adc r5, r5, #0\n\t"
  129253. #endif
  129254. /* A[6] * B[9] */
  129255. "ldr r8, [%[a], #24]\n\t"
  129256. "ldr r9, [%[b], #36]\n\t"
  129257. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  129258. "lsl r6, r8, #16\n\t"
  129259. "lsl r7, r9, #16\n\t"
  129260. "lsr r6, r6, #16\n\t"
  129261. "lsr r7, r7, #16\n\t"
  129262. "mul r7, r6, r7\n\t"
  129263. "adds r3, r3, r7\n\t"
  129264. "adcs r4, r4, #0\n\t"
  129265. "adc r5, r5, #0\n\t"
  129266. "lsr r7, r9, #16\n\t"
  129267. "mul r6, r7, r6\n\t"
  129268. "lsr r7, r6, #16\n\t"
  129269. "lsl r6, r6, #16\n\t"
  129270. "adds r3, r3, r6\n\t"
  129271. "adcs r4, r4, r7\n\t"
  129272. "adc r5, r5, #0\n\t"
  129273. "lsr r6, r8, #16\n\t"
  129274. "lsr r7, r9, #16\n\t"
  129275. "mul r7, r6, r7\n\t"
  129276. "adds r4, r4, r7\n\t"
  129277. "adc r5, r5, #0\n\t"
  129278. "lsl r7, r9, #16\n\t"
  129279. "lsr r7, r7, #16\n\t"
  129280. "mul r6, r7, r6\n\t"
  129281. "lsr r7, r6, #16\n\t"
  129282. "lsl r6, r6, #16\n\t"
  129283. "adds r3, r3, r6\n\t"
  129284. "adcs r4, r4, r7\n\t"
  129285. "adc r5, r5, #0\n\t"
  129286. #else
  129287. "umull r6, r7, r8, r9\n\t"
  129288. "adds r3, r3, r6\n\t"
  129289. "adcs r4, r4, r7\n\t"
  129290. "adc r5, r5, #0\n\t"
  129291. #endif
  129292. /* A[7] * B[8] */
  129293. "ldr r9, [%[b], #32]\n\t"
  129294. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  129295. "lsl r6, r11, #16\n\t"
  129296. "lsl r7, r9, #16\n\t"
  129297. "lsr r6, r6, #16\n\t"
  129298. "lsr r7, r7, #16\n\t"
  129299. "mul r7, r6, r7\n\t"
  129300. "adds r3, r3, r7\n\t"
  129301. "adcs r4, r4, #0\n\t"
  129302. "adc r5, r5, #0\n\t"
  129303. "lsr r7, r9, #16\n\t"
  129304. "mul r6, r7, r6\n\t"
  129305. "lsr r7, r6, #16\n\t"
  129306. "lsl r6, r6, #16\n\t"
  129307. "adds r3, r3, r6\n\t"
  129308. "adcs r4, r4, r7\n\t"
  129309. "adc r5, r5, #0\n\t"
  129310. "lsr r6, r11, #16\n\t"
  129311. "lsr r7, r9, #16\n\t"
  129312. "mul r7, r6, r7\n\t"
  129313. "adds r4, r4, r7\n\t"
  129314. "adc r5, r5, #0\n\t"
  129315. "lsl r7, r9, #16\n\t"
  129316. "lsr r7, r7, #16\n\t"
  129317. "mul r6, r7, r6\n\t"
  129318. "lsr r7, r6, #16\n\t"
  129319. "lsl r6, r6, #16\n\t"
  129320. "adds r3, r3, r6\n\t"
  129321. "adcs r4, r4, r7\n\t"
  129322. "adc r5, r5, #0\n\t"
  129323. #else
  129324. "umull r6, r7, r11, r9\n\t"
  129325. "adds r3, r3, r6\n\t"
  129326. "adcs r4, r4, r7\n\t"
  129327. "adc r5, r5, #0\n\t"
  129328. #endif
  129329. /* A[8] * B[7] */
  129330. "ldr r8, [%[a], #32]\n\t"
  129331. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  129332. "lsl r6, r8, #16\n\t"
  129333. "lsl r7, r12, #16\n\t"
  129334. "lsr r6, r6, #16\n\t"
  129335. "lsr r7, r7, #16\n\t"
  129336. "mul r7, r6, r7\n\t"
  129337. "adds r3, r3, r7\n\t"
  129338. "adcs r4, r4, #0\n\t"
  129339. "adc r5, r5, #0\n\t"
  129340. "lsr r7, r12, #16\n\t"
  129341. "mul r6, r7, r6\n\t"
  129342. "lsr r7, r6, #16\n\t"
  129343. "lsl r6, r6, #16\n\t"
  129344. "adds r3, r3, r6\n\t"
  129345. "adcs r4, r4, r7\n\t"
  129346. "adc r5, r5, #0\n\t"
  129347. "lsr r6, r8, #16\n\t"
  129348. "lsr r7, r12, #16\n\t"
  129349. "mul r7, r6, r7\n\t"
  129350. "adds r4, r4, r7\n\t"
  129351. "adc r5, r5, #0\n\t"
  129352. "lsl r7, r12, #16\n\t"
  129353. "lsr r7, r7, #16\n\t"
  129354. "mul r6, r7, r6\n\t"
  129355. "lsr r7, r6, #16\n\t"
  129356. "lsl r6, r6, #16\n\t"
  129357. "adds r3, r3, r6\n\t"
  129358. "adcs r4, r4, r7\n\t"
  129359. "adc r5, r5, #0\n\t"
  129360. #else
  129361. "umull r6, r7, r8, r12\n\t"
  129362. "adds r3, r3, r6\n\t"
  129363. "adcs r4, r4, r7\n\t"
  129364. "adc r5, r5, #0\n\t"
  129365. #endif
  129366. /* A[9] * B[6] */
  129367. "ldr r8, [%[a], #36]\n\t"
  129368. "ldr r9, [%[b], #24]\n\t"
  129369. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  129370. "lsl r6, r8, #16\n\t"
  129371. "lsl r7, r9, #16\n\t"
  129372. "lsr r6, r6, #16\n\t"
  129373. "lsr r7, r7, #16\n\t"
  129374. "mul r7, r6, r7\n\t"
  129375. "adds r3, r3, r7\n\t"
  129376. "adcs r4, r4, #0\n\t"
  129377. "adc r5, r5, #0\n\t"
  129378. "lsr r7, r9, #16\n\t"
  129379. "mul r6, r7, r6\n\t"
  129380. "lsr r7, r6, #16\n\t"
  129381. "lsl r6, r6, #16\n\t"
  129382. "adds r3, r3, r6\n\t"
  129383. "adcs r4, r4, r7\n\t"
  129384. "adc r5, r5, #0\n\t"
  129385. "lsr r6, r8, #16\n\t"
  129386. "lsr r7, r9, #16\n\t"
  129387. "mul r7, r6, r7\n\t"
  129388. "adds r4, r4, r7\n\t"
  129389. "adc r5, r5, #0\n\t"
  129390. "lsl r7, r9, #16\n\t"
  129391. "lsr r7, r7, #16\n\t"
  129392. "mul r6, r7, r6\n\t"
  129393. "lsr r7, r6, #16\n\t"
  129394. "lsl r6, r6, #16\n\t"
  129395. "adds r3, r3, r6\n\t"
  129396. "adcs r4, r4, r7\n\t"
  129397. "adc r5, r5, #0\n\t"
  129398. #else
  129399. "umull r6, r7, r8, r9\n\t"
  129400. "adds r3, r3, r6\n\t"
  129401. "adcs r4, r4, r7\n\t"
  129402. "adc r5, r5, #0\n\t"
  129403. #endif
  129404. /* A[10] * B[5] */
  129405. "ldr r8, [%[a], #40]\n\t"
  129406. "ldr r9, [%[b], #20]\n\t"
  129407. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  129408. "lsl r6, r8, #16\n\t"
  129409. "lsl r7, r9, #16\n\t"
  129410. "lsr r6, r6, #16\n\t"
  129411. "lsr r7, r7, #16\n\t"
  129412. "mul r7, r6, r7\n\t"
  129413. "adds r3, r3, r7\n\t"
  129414. "adcs r4, r4, #0\n\t"
  129415. "adc r5, r5, #0\n\t"
  129416. "lsr r7, r9, #16\n\t"
  129417. "mul r6, r7, r6\n\t"
  129418. "lsr r7, r6, #16\n\t"
  129419. "lsl r6, r6, #16\n\t"
  129420. "adds r3, r3, r6\n\t"
  129421. "adcs r4, r4, r7\n\t"
  129422. "adc r5, r5, #0\n\t"
  129423. "lsr r6, r8, #16\n\t"
  129424. "lsr r7, r9, #16\n\t"
  129425. "mul r7, r6, r7\n\t"
  129426. "adds r4, r4, r7\n\t"
  129427. "adc r5, r5, #0\n\t"
  129428. "lsl r7, r9, #16\n\t"
  129429. "lsr r7, r7, #16\n\t"
  129430. "mul r6, r7, r6\n\t"
  129431. "lsr r7, r6, #16\n\t"
  129432. "lsl r6, r6, #16\n\t"
  129433. "adds r3, r3, r6\n\t"
  129434. "adcs r4, r4, r7\n\t"
  129435. "adc r5, r5, #0\n\t"
  129436. #else
  129437. "umull r6, r7, r8, r9\n\t"
  129438. "adds r3, r3, r6\n\t"
  129439. "adcs r4, r4, r7\n\t"
  129440. "adc r5, r5, #0\n\t"
  129441. #endif
  129442. /* A[11] * B[4] */
  129443. "ldr r8, [%[a], #44]\n\t"
  129444. "ldr r9, [%[b], #16]\n\t"
  129445. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  129446. "lsl r6, r8, #16\n\t"
  129447. "lsl r7, r9, #16\n\t"
  129448. "lsr r6, r6, #16\n\t"
  129449. "lsr r7, r7, #16\n\t"
  129450. "mul r7, r6, r7\n\t"
  129451. "adds r3, r3, r7\n\t"
  129452. "adcs r4, r4, #0\n\t"
  129453. "adc r5, r5, #0\n\t"
  129454. "lsr r7, r9, #16\n\t"
  129455. "mul r6, r7, r6\n\t"
  129456. "lsr r7, r6, #16\n\t"
  129457. "lsl r6, r6, #16\n\t"
  129458. "adds r3, r3, r6\n\t"
  129459. "adcs r4, r4, r7\n\t"
  129460. "adc r5, r5, #0\n\t"
  129461. "lsr r6, r8, #16\n\t"
  129462. "lsr r7, r9, #16\n\t"
  129463. "mul r7, r6, r7\n\t"
  129464. "adds r4, r4, r7\n\t"
  129465. "adc r5, r5, #0\n\t"
  129466. "lsl r7, r9, #16\n\t"
  129467. "lsr r7, r7, #16\n\t"
  129468. "mul r6, r7, r6\n\t"
  129469. "lsr r7, r6, #16\n\t"
  129470. "lsl r6, r6, #16\n\t"
  129471. "adds r3, r3, r6\n\t"
  129472. "adcs r4, r4, r7\n\t"
  129473. "adc r5, r5, #0\n\t"
  129474. #else
  129475. "umull r6, r7, r8, r9\n\t"
  129476. "adds r3, r3, r6\n\t"
  129477. "adcs r4, r4, r7\n\t"
  129478. "adc r5, r5, #0\n\t"
  129479. #endif
  129480. /* A[12] * B[3] */
  129481. "ldr r8, [%[a], #48]\n\t"
  129482. "ldr r9, [%[b], #12]\n\t"
  129483. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  129484. "lsl r6, r8, #16\n\t"
  129485. "lsl r7, r9, #16\n\t"
  129486. "lsr r6, r6, #16\n\t"
  129487. "lsr r7, r7, #16\n\t"
  129488. "mul r7, r6, r7\n\t"
  129489. "adds r3, r3, r7\n\t"
  129490. "adcs r4, r4, #0\n\t"
  129491. "adc r5, r5, #0\n\t"
  129492. "lsr r7, r9, #16\n\t"
  129493. "mul r6, r7, r6\n\t"
  129494. "lsr r7, r6, #16\n\t"
  129495. "lsl r6, r6, #16\n\t"
  129496. "adds r3, r3, r6\n\t"
  129497. "adcs r4, r4, r7\n\t"
  129498. "adc r5, r5, #0\n\t"
  129499. "lsr r6, r8, #16\n\t"
  129500. "lsr r7, r9, #16\n\t"
  129501. "mul r7, r6, r7\n\t"
  129502. "adds r4, r4, r7\n\t"
  129503. "adc r5, r5, #0\n\t"
  129504. "lsl r7, r9, #16\n\t"
  129505. "lsr r7, r7, #16\n\t"
  129506. "mul r6, r7, r6\n\t"
  129507. "lsr r7, r6, #16\n\t"
  129508. "lsl r6, r6, #16\n\t"
  129509. "adds r3, r3, r6\n\t"
  129510. "adcs r4, r4, r7\n\t"
  129511. "adc r5, r5, #0\n\t"
  129512. #else
  129513. "umull r6, r7, r8, r9\n\t"
  129514. "adds r3, r3, r6\n\t"
  129515. "adcs r4, r4, r7\n\t"
  129516. "adc r5, r5, #0\n\t"
  129517. #endif
  129518. /* A[13] * B[2] */
  129519. "ldr r8, [%[a], #52]\n\t"
  129520. "ldr r9, [%[b], #8]\n\t"
  129521. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  129522. "lsl r6, r8, #16\n\t"
  129523. "lsl r7, r9, #16\n\t"
  129524. "lsr r6, r6, #16\n\t"
  129525. "lsr r7, r7, #16\n\t"
  129526. "mul r7, r6, r7\n\t"
  129527. "adds r3, r3, r7\n\t"
  129528. "adcs r4, r4, #0\n\t"
  129529. "adc r5, r5, #0\n\t"
  129530. "lsr r7, r9, #16\n\t"
  129531. "mul r6, r7, r6\n\t"
  129532. "lsr r7, r6, #16\n\t"
  129533. "lsl r6, r6, #16\n\t"
  129534. "adds r3, r3, r6\n\t"
  129535. "adcs r4, r4, r7\n\t"
  129536. "adc r5, r5, #0\n\t"
  129537. "lsr r6, r8, #16\n\t"
  129538. "lsr r7, r9, #16\n\t"
  129539. "mul r7, r6, r7\n\t"
  129540. "adds r4, r4, r7\n\t"
  129541. "adc r5, r5, #0\n\t"
  129542. "lsl r7, r9, #16\n\t"
  129543. "lsr r7, r7, #16\n\t"
  129544. "mul r6, r7, r6\n\t"
  129545. "lsr r7, r6, #16\n\t"
  129546. "lsl r6, r6, #16\n\t"
  129547. "adds r3, r3, r6\n\t"
  129548. "adcs r4, r4, r7\n\t"
  129549. "adc r5, r5, #0\n\t"
  129550. #else
  129551. "umull r6, r7, r8, r9\n\t"
  129552. "adds r3, r3, r6\n\t"
  129553. "adcs r4, r4, r7\n\t"
  129554. "adc r5, r5, #0\n\t"
  129555. #endif
  129556. /* A[14] * B[1] */
  129557. "ldr r8, [%[a], #56]\n\t"
  129558. "ldr r9, [%[b], #4]\n\t"
  129559. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  129560. "lsl r6, r8, #16\n\t"
  129561. "lsl r7, r9, #16\n\t"
  129562. "lsr r6, r6, #16\n\t"
  129563. "lsr r7, r7, #16\n\t"
  129564. "mul r7, r6, r7\n\t"
  129565. "adds r3, r3, r7\n\t"
  129566. "adcs r4, r4, #0\n\t"
  129567. "adc r5, r5, #0\n\t"
  129568. "lsr r7, r9, #16\n\t"
  129569. "mul r6, r7, r6\n\t"
  129570. "lsr r7, r6, #16\n\t"
  129571. "lsl r6, r6, #16\n\t"
  129572. "adds r3, r3, r6\n\t"
  129573. "adcs r4, r4, r7\n\t"
  129574. "adc r5, r5, #0\n\t"
  129575. "lsr r6, r8, #16\n\t"
  129576. "lsr r7, r9, #16\n\t"
  129577. "mul r7, r6, r7\n\t"
  129578. "adds r4, r4, r7\n\t"
  129579. "adc r5, r5, #0\n\t"
  129580. "lsl r7, r9, #16\n\t"
  129581. "lsr r7, r7, #16\n\t"
  129582. "mul r6, r7, r6\n\t"
  129583. "lsr r7, r6, #16\n\t"
  129584. "lsl r6, r6, #16\n\t"
  129585. "adds r3, r3, r6\n\t"
  129586. "adcs r4, r4, r7\n\t"
  129587. "adc r5, r5, #0\n\t"
  129588. #else
  129589. "umull r6, r7, r8, r9\n\t"
  129590. "adds r3, r3, r6\n\t"
  129591. "adcs r4, r4, r7\n\t"
  129592. "adc r5, r5, #0\n\t"
  129593. #endif
  129594. /* A[15] * B[0] */
  129595. "ldr r8, [%[a], #60]\n\t"
  129596. "ldr r9, [%[b]]\n\t"
  129597. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  129598. "lsl r6, r8, #16\n\t"
  129599. "lsl r7, r9, #16\n\t"
  129600. "lsr r6, r6, #16\n\t"
  129601. "lsr r7, r7, #16\n\t"
  129602. "mul r7, r6, r7\n\t"
  129603. "adds r3, r3, r7\n\t"
  129604. "adcs r4, r4, #0\n\t"
  129605. "adc r5, r5, #0\n\t"
  129606. "lsr r7, r9, #16\n\t"
  129607. "mul r6, r7, r6\n\t"
  129608. "lsr r7, r6, #16\n\t"
  129609. "lsl r6, r6, #16\n\t"
  129610. "adds r3, r3, r6\n\t"
  129611. "adcs r4, r4, r7\n\t"
  129612. "adc r5, r5, #0\n\t"
  129613. "lsr r6, r8, #16\n\t"
  129614. "lsr r7, r9, #16\n\t"
  129615. "mul r7, r6, r7\n\t"
  129616. "adds r4, r4, r7\n\t"
  129617. "adc r5, r5, #0\n\t"
  129618. "lsl r7, r9, #16\n\t"
  129619. "lsr r7, r7, #16\n\t"
  129620. "mul r6, r7, r6\n\t"
  129621. "lsr r7, r6, #16\n\t"
  129622. "lsl r6, r6, #16\n\t"
  129623. "adds r3, r3, r6\n\t"
  129624. "adcs r4, r4, r7\n\t"
  129625. "adc r5, r5, #0\n\t"
  129626. #else
  129627. "umull r6, r7, r8, r9\n\t"
  129628. "adds r3, r3, r6\n\t"
  129629. "adcs r4, r4, r7\n\t"
  129630. "adc r5, r5, #0\n\t"
  129631. #endif
  129632. "str r3, [sp, #60]\n\t"
  129633. /* A[15] * B[1] */
  129634. "ldr r9, [%[b], #4]\n\t"
  129635. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  129636. "lsl r6, r8, #16\n\t"
  129637. "lsl r7, r9, #16\n\t"
  129638. "lsr r6, r6, #16\n\t"
  129639. "lsr r7, r7, #16\n\t"
  129640. "mul r7, r6, r7\n\t"
  129641. "adds r4, r4, r7\n\t"
  129642. "adcs r5, r5, #0\n\t"
  129643. "mov r3, #0\n\t"
  129644. "adc r3, r3, #0\n\t"
  129645. "lsr r7, r9, #16\n\t"
  129646. "mul r6, r7, r6\n\t"
  129647. "lsr r7, r6, #16\n\t"
  129648. "lsl r6, r6, #16\n\t"
  129649. "adds r4, r4, r6\n\t"
  129650. "adcs r5, r5, r7\n\t"
  129651. "adc r3, r3, #0\n\t"
  129652. "lsr r6, r8, #16\n\t"
  129653. "lsr r7, r9, #16\n\t"
  129654. "mul r7, r6, r7\n\t"
  129655. "adds r5, r5, r7\n\t"
  129656. "adc r3, r3, #0\n\t"
  129657. "lsl r7, r9, #16\n\t"
  129658. "lsr r7, r7, #16\n\t"
  129659. "mul r6, r7, r6\n\t"
  129660. "lsr r7, r6, #16\n\t"
  129661. "lsl r6, r6, #16\n\t"
  129662. "adds r4, r4, r6\n\t"
  129663. "adcs r5, r5, r7\n\t"
  129664. "adc r3, r3, #0\n\t"
  129665. #else
  129666. "umull r6, r7, r8, r9\n\t"
  129667. "adds r4, r4, r6\n\t"
  129668. "adcs r5, r5, r7\n\t"
  129669. "mov r3, #0\n\t"
  129670. "adc r3, r3, #0\n\t"
  129671. #endif
  129672. /* A[14] * B[2] */
  129673. "ldr r8, [%[a], #56]\n\t"
  129674. "ldr r9, [%[b], #8]\n\t"
  129675. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  129676. "lsl r6, r8, #16\n\t"
  129677. "lsl r7, r9, #16\n\t"
  129678. "lsr r6, r6, #16\n\t"
  129679. "lsr r7, r7, #16\n\t"
  129680. "mul r7, r6, r7\n\t"
  129681. "adds r4, r4, r7\n\t"
  129682. "adcs r5, r5, #0\n\t"
  129683. "adc r3, r3, #0\n\t"
  129684. "lsr r7, r9, #16\n\t"
  129685. "mul r6, r7, r6\n\t"
  129686. "lsr r7, r6, #16\n\t"
  129687. "lsl r6, r6, #16\n\t"
  129688. "adds r4, r4, r6\n\t"
  129689. "adcs r5, r5, r7\n\t"
  129690. "adc r3, r3, #0\n\t"
  129691. "lsr r6, r8, #16\n\t"
  129692. "lsr r7, r9, #16\n\t"
  129693. "mul r7, r6, r7\n\t"
  129694. "adds r5, r5, r7\n\t"
  129695. "adc r3, r3, #0\n\t"
  129696. "lsl r7, r9, #16\n\t"
  129697. "lsr r7, r7, #16\n\t"
  129698. "mul r6, r7, r6\n\t"
  129699. "lsr r7, r6, #16\n\t"
  129700. "lsl r6, r6, #16\n\t"
  129701. "adds r4, r4, r6\n\t"
  129702. "adcs r5, r5, r7\n\t"
  129703. "adc r3, r3, #0\n\t"
  129704. #else
  129705. "umull r6, r7, r8, r9\n\t"
  129706. "adds r4, r4, r6\n\t"
  129707. "adcs r5, r5, r7\n\t"
  129708. "adc r3, r3, #0\n\t"
  129709. #endif
  129710. /* A[13] * B[3] */
  129711. "ldr r8, [%[a], #52]\n\t"
  129712. "ldr r9, [%[b], #12]\n\t"
  129713. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  129714. "lsl r6, r8, #16\n\t"
  129715. "lsl r7, r9, #16\n\t"
  129716. "lsr r6, r6, #16\n\t"
  129717. "lsr r7, r7, #16\n\t"
  129718. "mul r7, r6, r7\n\t"
  129719. "adds r4, r4, r7\n\t"
  129720. "adcs r5, r5, #0\n\t"
  129721. "adc r3, r3, #0\n\t"
  129722. "lsr r7, r9, #16\n\t"
  129723. "mul r6, r7, r6\n\t"
  129724. "lsr r7, r6, #16\n\t"
  129725. "lsl r6, r6, #16\n\t"
  129726. "adds r4, r4, r6\n\t"
  129727. "adcs r5, r5, r7\n\t"
  129728. "adc r3, r3, #0\n\t"
  129729. "lsr r6, r8, #16\n\t"
  129730. "lsr r7, r9, #16\n\t"
  129731. "mul r7, r6, r7\n\t"
  129732. "adds r5, r5, r7\n\t"
  129733. "adc r3, r3, #0\n\t"
  129734. "lsl r7, r9, #16\n\t"
  129735. "lsr r7, r7, #16\n\t"
  129736. "mul r6, r7, r6\n\t"
  129737. "lsr r7, r6, #16\n\t"
  129738. "lsl r6, r6, #16\n\t"
  129739. "adds r4, r4, r6\n\t"
  129740. "adcs r5, r5, r7\n\t"
  129741. "adc r3, r3, #0\n\t"
  129742. #else
  129743. "umull r6, r7, r8, r9\n\t"
  129744. "adds r4, r4, r6\n\t"
  129745. "adcs r5, r5, r7\n\t"
  129746. "adc r3, r3, #0\n\t"
  129747. #endif
  129748. /* A[12] * B[4] */
  129749. "ldr r8, [%[a], #48]\n\t"
  129750. "ldr r9, [%[b], #16]\n\t"
  129751. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  129752. "lsl r6, r8, #16\n\t"
  129753. "lsl r7, r9, #16\n\t"
  129754. "lsr r6, r6, #16\n\t"
  129755. "lsr r7, r7, #16\n\t"
  129756. "mul r7, r6, r7\n\t"
  129757. "adds r4, r4, r7\n\t"
  129758. "adcs r5, r5, #0\n\t"
  129759. "adc r3, r3, #0\n\t"
  129760. "lsr r7, r9, #16\n\t"
  129761. "mul r6, r7, r6\n\t"
  129762. "lsr r7, r6, #16\n\t"
  129763. "lsl r6, r6, #16\n\t"
  129764. "adds r4, r4, r6\n\t"
  129765. "adcs r5, r5, r7\n\t"
  129766. "adc r3, r3, #0\n\t"
  129767. "lsr r6, r8, #16\n\t"
  129768. "lsr r7, r9, #16\n\t"
  129769. "mul r7, r6, r7\n\t"
  129770. "adds r5, r5, r7\n\t"
  129771. "adc r3, r3, #0\n\t"
  129772. "lsl r7, r9, #16\n\t"
  129773. "lsr r7, r7, #16\n\t"
  129774. "mul r6, r7, r6\n\t"
  129775. "lsr r7, r6, #16\n\t"
  129776. "lsl r6, r6, #16\n\t"
  129777. "adds r4, r4, r6\n\t"
  129778. "adcs r5, r5, r7\n\t"
  129779. "adc r3, r3, #0\n\t"
  129780. #else
  129781. "umull r6, r7, r8, r9\n\t"
  129782. "adds r4, r4, r6\n\t"
  129783. "adcs r5, r5, r7\n\t"
  129784. "adc r3, r3, #0\n\t"
  129785. #endif
  129786. /* A[11] * B[5] */
  129787. "ldr r8, [%[a], #44]\n\t"
  129788. "ldr r9, [%[b], #20]\n\t"
  129789. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  129790. "lsl r6, r8, #16\n\t"
  129791. "lsl r7, r9, #16\n\t"
  129792. "lsr r6, r6, #16\n\t"
  129793. "lsr r7, r7, #16\n\t"
  129794. "mul r7, r6, r7\n\t"
  129795. "adds r4, r4, r7\n\t"
  129796. "adcs r5, r5, #0\n\t"
  129797. "adc r3, r3, #0\n\t"
  129798. "lsr r7, r9, #16\n\t"
  129799. "mul r6, r7, r6\n\t"
  129800. "lsr r7, r6, #16\n\t"
  129801. "lsl r6, r6, #16\n\t"
  129802. "adds r4, r4, r6\n\t"
  129803. "adcs r5, r5, r7\n\t"
  129804. "adc r3, r3, #0\n\t"
  129805. "lsr r6, r8, #16\n\t"
  129806. "lsr r7, r9, #16\n\t"
  129807. "mul r7, r6, r7\n\t"
  129808. "adds r5, r5, r7\n\t"
  129809. "adc r3, r3, #0\n\t"
  129810. "lsl r7, r9, #16\n\t"
  129811. "lsr r7, r7, #16\n\t"
  129812. "mul r6, r7, r6\n\t"
  129813. "lsr r7, r6, #16\n\t"
  129814. "lsl r6, r6, #16\n\t"
  129815. "adds r4, r4, r6\n\t"
  129816. "adcs r5, r5, r7\n\t"
  129817. "adc r3, r3, #0\n\t"
  129818. #else
  129819. "umull r6, r7, r8, r9\n\t"
  129820. "adds r4, r4, r6\n\t"
  129821. "adcs r5, r5, r7\n\t"
  129822. "adc r3, r3, #0\n\t"
  129823. #endif
  129824. /* A[10] * B[6] */
  129825. "ldr r8, [%[a], #40]\n\t"
  129826. "ldr r9, [%[b], #24]\n\t"
  129827. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  129828. "lsl r6, r8, #16\n\t"
  129829. "lsl r7, r9, #16\n\t"
  129830. "lsr r6, r6, #16\n\t"
  129831. "lsr r7, r7, #16\n\t"
  129832. "mul r7, r6, r7\n\t"
  129833. "adds r4, r4, r7\n\t"
  129834. "adcs r5, r5, #0\n\t"
  129835. "adc r3, r3, #0\n\t"
  129836. "lsr r7, r9, #16\n\t"
  129837. "mul r6, r7, r6\n\t"
  129838. "lsr r7, r6, #16\n\t"
  129839. "lsl r6, r6, #16\n\t"
  129840. "adds r4, r4, r6\n\t"
  129841. "adcs r5, r5, r7\n\t"
  129842. "adc r3, r3, #0\n\t"
  129843. "lsr r6, r8, #16\n\t"
  129844. "lsr r7, r9, #16\n\t"
  129845. "mul r7, r6, r7\n\t"
  129846. "adds r5, r5, r7\n\t"
  129847. "adc r3, r3, #0\n\t"
  129848. "lsl r7, r9, #16\n\t"
  129849. "lsr r7, r7, #16\n\t"
  129850. "mul r6, r7, r6\n\t"
  129851. "lsr r7, r6, #16\n\t"
  129852. "lsl r6, r6, #16\n\t"
  129853. "adds r4, r4, r6\n\t"
  129854. "adcs r5, r5, r7\n\t"
  129855. "adc r3, r3, #0\n\t"
  129856. #else
  129857. "umull r6, r7, r8, r9\n\t"
  129858. "adds r4, r4, r6\n\t"
  129859. "adcs r5, r5, r7\n\t"
  129860. "adc r3, r3, #0\n\t"
  129861. #endif
  129862. /* A[9] * B[7] */
  129863. "ldr r8, [%[a], #36]\n\t"
  129864. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  129865. "lsl r6, r8, #16\n\t"
  129866. "lsl r7, r12, #16\n\t"
  129867. "lsr r6, r6, #16\n\t"
  129868. "lsr r7, r7, #16\n\t"
  129869. "mul r7, r6, r7\n\t"
  129870. "adds r4, r4, r7\n\t"
  129871. "adcs r5, r5, #0\n\t"
  129872. "adc r3, r3, #0\n\t"
  129873. "lsr r7, r12, #16\n\t"
  129874. "mul r6, r7, r6\n\t"
  129875. "lsr r7, r6, #16\n\t"
  129876. "lsl r6, r6, #16\n\t"
  129877. "adds r4, r4, r6\n\t"
  129878. "adcs r5, r5, r7\n\t"
  129879. "adc r3, r3, #0\n\t"
  129880. "lsr r6, r8, #16\n\t"
  129881. "lsr r7, r12, #16\n\t"
  129882. "mul r7, r6, r7\n\t"
  129883. "adds r5, r5, r7\n\t"
  129884. "adc r3, r3, #0\n\t"
  129885. "lsl r7, r12, #16\n\t"
  129886. "lsr r7, r7, #16\n\t"
  129887. "mul r6, r7, r6\n\t"
  129888. "lsr r7, r6, #16\n\t"
  129889. "lsl r6, r6, #16\n\t"
  129890. "adds r4, r4, r6\n\t"
  129891. "adcs r5, r5, r7\n\t"
  129892. "adc r3, r3, #0\n\t"
  129893. #else
  129894. "umull r6, r7, r8, r12\n\t"
  129895. "adds r4, r4, r6\n\t"
  129896. "adcs r5, r5, r7\n\t"
  129897. "adc r3, r3, #0\n\t"
  129898. #endif
  129899. /* A[8] * B[8] */
  129900. "ldr r11, [%[a], #32]\n\t"
  129901. "ldr r12, [%[b], #32]\n\t"
  129902. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  129903. "lsl r6, r11, #16\n\t"
  129904. "lsl r7, r12, #16\n\t"
  129905. "lsr r6, r6, #16\n\t"
  129906. "lsr r7, r7, #16\n\t"
  129907. "mul r7, r6, r7\n\t"
  129908. "adds r4, r4, r7\n\t"
  129909. "adcs r5, r5, #0\n\t"
  129910. "adc r3, r3, #0\n\t"
  129911. "lsr r7, r12, #16\n\t"
  129912. "mul r6, r7, r6\n\t"
  129913. "lsr r7, r6, #16\n\t"
  129914. "lsl r6, r6, #16\n\t"
  129915. "adds r4, r4, r6\n\t"
  129916. "adcs r5, r5, r7\n\t"
  129917. "adc r3, r3, #0\n\t"
  129918. "lsr r6, r11, #16\n\t"
  129919. "lsr r7, r12, #16\n\t"
  129920. "mul r7, r6, r7\n\t"
  129921. "adds r5, r5, r7\n\t"
  129922. "adc r3, r3, #0\n\t"
  129923. "lsl r7, r12, #16\n\t"
  129924. "lsr r7, r7, #16\n\t"
  129925. "mul r6, r7, r6\n\t"
  129926. "lsr r7, r6, #16\n\t"
  129927. "lsl r6, r6, #16\n\t"
  129928. "adds r4, r4, r6\n\t"
  129929. "adcs r5, r5, r7\n\t"
  129930. "adc r3, r3, #0\n\t"
  129931. #else
  129932. "umull r6, r7, r11, r12\n\t"
  129933. "adds r4, r4, r6\n\t"
  129934. "adcs r5, r5, r7\n\t"
  129935. "adc r3, r3, #0\n\t"
  129936. #endif
  129937. /* A[7] * B[9] */
  129938. "ldr r8, [%[a], #28]\n\t"
  129939. "ldr r9, [%[b], #36]\n\t"
  129940. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  129941. "lsl r6, r8, #16\n\t"
  129942. "lsl r7, r9, #16\n\t"
  129943. "lsr r6, r6, #16\n\t"
  129944. "lsr r7, r7, #16\n\t"
  129945. "mul r7, r6, r7\n\t"
  129946. "adds r4, r4, r7\n\t"
  129947. "adcs r5, r5, #0\n\t"
  129948. "adc r3, r3, #0\n\t"
  129949. "lsr r7, r9, #16\n\t"
  129950. "mul r6, r7, r6\n\t"
  129951. "lsr r7, r6, #16\n\t"
  129952. "lsl r6, r6, #16\n\t"
  129953. "adds r4, r4, r6\n\t"
  129954. "adcs r5, r5, r7\n\t"
  129955. "adc r3, r3, #0\n\t"
  129956. "lsr r6, r8, #16\n\t"
  129957. "lsr r7, r9, #16\n\t"
  129958. "mul r7, r6, r7\n\t"
  129959. "adds r5, r5, r7\n\t"
  129960. "adc r3, r3, #0\n\t"
  129961. "lsl r7, r9, #16\n\t"
  129962. "lsr r7, r7, #16\n\t"
  129963. "mul r6, r7, r6\n\t"
  129964. "lsr r7, r6, #16\n\t"
  129965. "lsl r6, r6, #16\n\t"
  129966. "adds r4, r4, r6\n\t"
  129967. "adcs r5, r5, r7\n\t"
  129968. "adc r3, r3, #0\n\t"
  129969. #else
  129970. "umull r6, r7, r8, r9\n\t"
  129971. "adds r4, r4, r6\n\t"
  129972. "adcs r5, r5, r7\n\t"
  129973. "adc r3, r3, #0\n\t"
  129974. #endif
  129975. /* A[6] * B[10] */
  129976. "ldr r8, [%[a], #24]\n\t"
  129977. "ldr r9, [%[b], #40]\n\t"
  129978. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  129979. "lsl r6, r8, #16\n\t"
  129980. "lsl r7, r9, #16\n\t"
  129981. "lsr r6, r6, #16\n\t"
  129982. "lsr r7, r7, #16\n\t"
  129983. "mul r7, r6, r7\n\t"
  129984. "adds r4, r4, r7\n\t"
  129985. "adcs r5, r5, #0\n\t"
  129986. "adc r3, r3, #0\n\t"
  129987. "lsr r7, r9, #16\n\t"
  129988. "mul r6, r7, r6\n\t"
  129989. "lsr r7, r6, #16\n\t"
  129990. "lsl r6, r6, #16\n\t"
  129991. "adds r4, r4, r6\n\t"
  129992. "adcs r5, r5, r7\n\t"
  129993. "adc r3, r3, #0\n\t"
  129994. "lsr r6, r8, #16\n\t"
  129995. "lsr r7, r9, #16\n\t"
  129996. "mul r7, r6, r7\n\t"
  129997. "adds r5, r5, r7\n\t"
  129998. "adc r3, r3, #0\n\t"
  129999. "lsl r7, r9, #16\n\t"
  130000. "lsr r7, r7, #16\n\t"
  130001. "mul r6, r7, r6\n\t"
  130002. "lsr r7, r6, #16\n\t"
  130003. "lsl r6, r6, #16\n\t"
  130004. "adds r4, r4, r6\n\t"
  130005. "adcs r5, r5, r7\n\t"
  130006. "adc r3, r3, #0\n\t"
  130007. #else
  130008. "umull r6, r7, r8, r9\n\t"
  130009. "adds r4, r4, r6\n\t"
  130010. "adcs r5, r5, r7\n\t"
  130011. "adc r3, r3, #0\n\t"
  130012. #endif
  130013. /* A[5] * B[11] */
  130014. "ldr r8, [%[a], #20]\n\t"
  130015. "ldr r9, [%[b], #44]\n\t"
  130016. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  130017. "lsl r6, r8, #16\n\t"
  130018. "lsl r7, r9, #16\n\t"
  130019. "lsr r6, r6, #16\n\t"
  130020. "lsr r7, r7, #16\n\t"
  130021. "mul r7, r6, r7\n\t"
  130022. "adds r4, r4, r7\n\t"
  130023. "adcs r5, r5, #0\n\t"
  130024. "adc r3, r3, #0\n\t"
  130025. "lsr r7, r9, #16\n\t"
  130026. "mul r6, r7, r6\n\t"
  130027. "lsr r7, r6, #16\n\t"
  130028. "lsl r6, r6, #16\n\t"
  130029. "adds r4, r4, r6\n\t"
  130030. "adcs r5, r5, r7\n\t"
  130031. "adc r3, r3, #0\n\t"
  130032. "lsr r6, r8, #16\n\t"
  130033. "lsr r7, r9, #16\n\t"
  130034. "mul r7, r6, r7\n\t"
  130035. "adds r5, r5, r7\n\t"
  130036. "adc r3, r3, #0\n\t"
  130037. "lsl r7, r9, #16\n\t"
  130038. "lsr r7, r7, #16\n\t"
  130039. "mul r6, r7, r6\n\t"
  130040. "lsr r7, r6, #16\n\t"
  130041. "lsl r6, r6, #16\n\t"
  130042. "adds r4, r4, r6\n\t"
  130043. "adcs r5, r5, r7\n\t"
  130044. "adc r3, r3, #0\n\t"
  130045. #else
  130046. "umull r6, r7, r8, r9\n\t"
  130047. "adds r4, r4, r6\n\t"
  130048. "adcs r5, r5, r7\n\t"
  130049. "adc r3, r3, #0\n\t"
  130050. #endif
  130051. /* A[4] * B[12] */
  130052. "ldr r8, [%[a], #16]\n\t"
  130053. "ldr r9, [%[b], #48]\n\t"
  130054. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  130055. "lsl r6, r8, #16\n\t"
  130056. "lsl r7, r9, #16\n\t"
  130057. "lsr r6, r6, #16\n\t"
  130058. "lsr r7, r7, #16\n\t"
  130059. "mul r7, r6, r7\n\t"
  130060. "adds r4, r4, r7\n\t"
  130061. "adcs r5, r5, #0\n\t"
  130062. "adc r3, r3, #0\n\t"
  130063. "lsr r7, r9, #16\n\t"
  130064. "mul r6, r7, r6\n\t"
  130065. "lsr r7, r6, #16\n\t"
  130066. "lsl r6, r6, #16\n\t"
  130067. "adds r4, r4, r6\n\t"
  130068. "adcs r5, r5, r7\n\t"
  130069. "adc r3, r3, #0\n\t"
  130070. "lsr r6, r8, #16\n\t"
  130071. "lsr r7, r9, #16\n\t"
  130072. "mul r7, r6, r7\n\t"
  130073. "adds r5, r5, r7\n\t"
  130074. "adc r3, r3, #0\n\t"
  130075. "lsl r7, r9, #16\n\t"
  130076. "lsr r7, r7, #16\n\t"
  130077. "mul r6, r7, r6\n\t"
  130078. "lsr r7, r6, #16\n\t"
  130079. "lsl r6, r6, #16\n\t"
  130080. "adds r4, r4, r6\n\t"
  130081. "adcs r5, r5, r7\n\t"
  130082. "adc r3, r3, #0\n\t"
  130083. #else
  130084. "umull r6, r7, r8, r9\n\t"
  130085. "adds r4, r4, r6\n\t"
  130086. "adcs r5, r5, r7\n\t"
  130087. "adc r3, r3, #0\n\t"
  130088. #endif
  130089. /* A[3] * B[13] */
  130090. "ldr r8, [%[a], #12]\n\t"
  130091. "ldr r9, [%[b], #52]\n\t"
  130092. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  130093. "lsl r6, r8, #16\n\t"
  130094. "lsl r7, r9, #16\n\t"
  130095. "lsr r6, r6, #16\n\t"
  130096. "lsr r7, r7, #16\n\t"
  130097. "mul r7, r6, r7\n\t"
  130098. "adds r4, r4, r7\n\t"
  130099. "adcs r5, r5, #0\n\t"
  130100. "adc r3, r3, #0\n\t"
  130101. "lsr r7, r9, #16\n\t"
  130102. "mul r6, r7, r6\n\t"
  130103. "lsr r7, r6, #16\n\t"
  130104. "lsl r6, r6, #16\n\t"
  130105. "adds r4, r4, r6\n\t"
  130106. "adcs r5, r5, r7\n\t"
  130107. "adc r3, r3, #0\n\t"
  130108. "lsr r6, r8, #16\n\t"
  130109. "lsr r7, r9, #16\n\t"
  130110. "mul r7, r6, r7\n\t"
  130111. "adds r5, r5, r7\n\t"
  130112. "adc r3, r3, #0\n\t"
  130113. "lsl r7, r9, #16\n\t"
  130114. "lsr r7, r7, #16\n\t"
  130115. "mul r6, r7, r6\n\t"
  130116. "lsr r7, r6, #16\n\t"
  130117. "lsl r6, r6, #16\n\t"
  130118. "adds r4, r4, r6\n\t"
  130119. "adcs r5, r5, r7\n\t"
  130120. "adc r3, r3, #0\n\t"
  130121. #else
  130122. "umull r6, r7, r8, r9\n\t"
  130123. "adds r4, r4, r6\n\t"
  130124. "adcs r5, r5, r7\n\t"
  130125. "adc r3, r3, #0\n\t"
  130126. #endif
  130127. /* A[2] * B[14] */
  130128. "ldr r8, [%[a], #8]\n\t"
  130129. "ldr r9, [%[b], #56]\n\t"
  130130. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  130131. "lsl r6, r8, #16\n\t"
  130132. "lsl r7, r9, #16\n\t"
  130133. "lsr r6, r6, #16\n\t"
  130134. "lsr r7, r7, #16\n\t"
  130135. "mul r7, r6, r7\n\t"
  130136. "adds r4, r4, r7\n\t"
  130137. "adcs r5, r5, #0\n\t"
  130138. "adc r3, r3, #0\n\t"
  130139. "lsr r7, r9, #16\n\t"
  130140. "mul r6, r7, r6\n\t"
  130141. "lsr r7, r6, #16\n\t"
  130142. "lsl r6, r6, #16\n\t"
  130143. "adds r4, r4, r6\n\t"
  130144. "adcs r5, r5, r7\n\t"
  130145. "adc r3, r3, #0\n\t"
  130146. "lsr r6, r8, #16\n\t"
  130147. "lsr r7, r9, #16\n\t"
  130148. "mul r7, r6, r7\n\t"
  130149. "adds r5, r5, r7\n\t"
  130150. "adc r3, r3, #0\n\t"
  130151. "lsl r7, r9, #16\n\t"
  130152. "lsr r7, r7, #16\n\t"
  130153. "mul r6, r7, r6\n\t"
  130154. "lsr r7, r6, #16\n\t"
  130155. "lsl r6, r6, #16\n\t"
  130156. "adds r4, r4, r6\n\t"
  130157. "adcs r5, r5, r7\n\t"
  130158. "adc r3, r3, #0\n\t"
  130159. #else
  130160. "umull r6, r7, r8, r9\n\t"
  130161. "adds r4, r4, r6\n\t"
  130162. "adcs r5, r5, r7\n\t"
  130163. "adc r3, r3, #0\n\t"
  130164. #endif
  130165. /* A[1] * B[15] */
  130166. "ldr r8, [%[a], #4]\n\t"
  130167. "ldr r9, [%[b], #60]\n\t"
  130168. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  130169. "lsl r6, r8, #16\n\t"
  130170. "lsl r7, r9, #16\n\t"
  130171. "lsr r6, r6, #16\n\t"
  130172. "lsr r7, r7, #16\n\t"
  130173. "mul r7, r6, r7\n\t"
  130174. "adds r4, r4, r7\n\t"
  130175. "adcs r5, r5, #0\n\t"
  130176. "adc r3, r3, #0\n\t"
  130177. "lsr r7, r9, #16\n\t"
  130178. "mul r6, r7, r6\n\t"
  130179. "lsr r7, r6, #16\n\t"
  130180. "lsl r6, r6, #16\n\t"
  130181. "adds r4, r4, r6\n\t"
  130182. "adcs r5, r5, r7\n\t"
  130183. "adc r3, r3, #0\n\t"
  130184. "lsr r6, r8, #16\n\t"
  130185. "lsr r7, r9, #16\n\t"
  130186. "mul r7, r6, r7\n\t"
  130187. "adds r5, r5, r7\n\t"
  130188. "adc r3, r3, #0\n\t"
  130189. "lsl r7, r9, #16\n\t"
  130190. "lsr r7, r7, #16\n\t"
  130191. "mul r6, r7, r6\n\t"
  130192. "lsr r7, r6, #16\n\t"
  130193. "lsl r6, r6, #16\n\t"
  130194. "adds r4, r4, r6\n\t"
  130195. "adcs r5, r5, r7\n\t"
  130196. "adc r3, r3, #0\n\t"
  130197. #else
  130198. "umull r6, r7, r8, r9\n\t"
  130199. "adds r4, r4, r6\n\t"
  130200. "adcs r5, r5, r7\n\t"
  130201. "adc r3, r3, #0\n\t"
  130202. #endif
  130203. "str r4, [%[r], #64]\n\t"
  130204. /* A[2] * B[15] */
  130205. "ldr r8, [%[a], #8]\n\t"
  130206. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  130207. "lsl r6, r8, #16\n\t"
  130208. "lsl r7, r9, #16\n\t"
  130209. "lsr r6, r6, #16\n\t"
  130210. "lsr r7, r7, #16\n\t"
  130211. "mul r7, r6, r7\n\t"
  130212. "adds r5, r5, r7\n\t"
  130213. "adcs r3, r3, #0\n\t"
  130214. "mov r4, #0\n\t"
  130215. "adc r4, r4, #0\n\t"
  130216. "lsr r7, r9, #16\n\t"
  130217. "mul r6, r7, r6\n\t"
  130218. "lsr r7, r6, #16\n\t"
  130219. "lsl r6, r6, #16\n\t"
  130220. "adds r5, r5, r6\n\t"
  130221. "adcs r3, r3, r7\n\t"
  130222. "adc r4, r4, #0\n\t"
  130223. "lsr r6, r8, #16\n\t"
  130224. "lsr r7, r9, #16\n\t"
  130225. "mul r7, r6, r7\n\t"
  130226. "adds r3, r3, r7\n\t"
  130227. "adc r4, r4, #0\n\t"
  130228. "lsl r7, r9, #16\n\t"
  130229. "lsr r7, r7, #16\n\t"
  130230. "mul r6, r7, r6\n\t"
  130231. "lsr r7, r6, #16\n\t"
  130232. "lsl r6, r6, #16\n\t"
  130233. "adds r5, r5, r6\n\t"
  130234. "adcs r3, r3, r7\n\t"
  130235. "adc r4, r4, #0\n\t"
  130236. #else
  130237. "umull r6, r7, r8, r9\n\t"
  130238. "adds r5, r5, r6\n\t"
  130239. "adcs r3, r3, r7\n\t"
  130240. "mov r4, #0\n\t"
  130241. "adc r4, r4, #0\n\t"
  130242. #endif
  130243. /* A[3] * B[14] */
  130244. "ldr r8, [%[a], #12]\n\t"
  130245. "ldr r9, [%[b], #56]\n\t"
  130246. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  130247. "lsl r6, r8, #16\n\t"
  130248. "lsl r7, r9, #16\n\t"
  130249. "lsr r6, r6, #16\n\t"
  130250. "lsr r7, r7, #16\n\t"
  130251. "mul r7, r6, r7\n\t"
  130252. "adds r5, r5, r7\n\t"
  130253. "adcs r3, r3, #0\n\t"
  130254. "adc r4, r4, #0\n\t"
  130255. "lsr r7, r9, #16\n\t"
  130256. "mul r6, r7, r6\n\t"
  130257. "lsr r7, r6, #16\n\t"
  130258. "lsl r6, r6, #16\n\t"
  130259. "adds r5, r5, r6\n\t"
  130260. "adcs r3, r3, r7\n\t"
  130261. "adc r4, r4, #0\n\t"
  130262. "lsr r6, r8, #16\n\t"
  130263. "lsr r7, r9, #16\n\t"
  130264. "mul r7, r6, r7\n\t"
  130265. "adds r3, r3, r7\n\t"
  130266. "adc r4, r4, #0\n\t"
  130267. "lsl r7, r9, #16\n\t"
  130268. "lsr r7, r7, #16\n\t"
  130269. "mul r6, r7, r6\n\t"
  130270. "lsr r7, r6, #16\n\t"
  130271. "lsl r6, r6, #16\n\t"
  130272. "adds r5, r5, r6\n\t"
  130273. "adcs r3, r3, r7\n\t"
  130274. "adc r4, r4, #0\n\t"
  130275. #else
  130276. "umull r6, r7, r8, r9\n\t"
  130277. "adds r5, r5, r6\n\t"
  130278. "adcs r3, r3, r7\n\t"
  130279. "adc r4, r4, #0\n\t"
  130280. #endif
  130281. /* A[4] * B[13] */
  130282. "ldr r8, [%[a], #16]\n\t"
  130283. "ldr r9, [%[b], #52]\n\t"
  130284. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  130285. "lsl r6, r8, #16\n\t"
  130286. "lsl r7, r9, #16\n\t"
  130287. "lsr r6, r6, #16\n\t"
  130288. "lsr r7, r7, #16\n\t"
  130289. "mul r7, r6, r7\n\t"
  130290. "adds r5, r5, r7\n\t"
  130291. "adcs r3, r3, #0\n\t"
  130292. "adc r4, r4, #0\n\t"
  130293. "lsr r7, r9, #16\n\t"
  130294. "mul r6, r7, r6\n\t"
  130295. "lsr r7, r6, #16\n\t"
  130296. "lsl r6, r6, #16\n\t"
  130297. "adds r5, r5, r6\n\t"
  130298. "adcs r3, r3, r7\n\t"
  130299. "adc r4, r4, #0\n\t"
  130300. "lsr r6, r8, #16\n\t"
  130301. "lsr r7, r9, #16\n\t"
  130302. "mul r7, r6, r7\n\t"
  130303. "adds r3, r3, r7\n\t"
  130304. "adc r4, r4, #0\n\t"
  130305. "lsl r7, r9, #16\n\t"
  130306. "lsr r7, r7, #16\n\t"
  130307. "mul r6, r7, r6\n\t"
  130308. "lsr r7, r6, #16\n\t"
  130309. "lsl r6, r6, #16\n\t"
  130310. "adds r5, r5, r6\n\t"
  130311. "adcs r3, r3, r7\n\t"
  130312. "adc r4, r4, #0\n\t"
  130313. #else
  130314. "umull r6, r7, r8, r9\n\t"
  130315. "adds r5, r5, r6\n\t"
  130316. "adcs r3, r3, r7\n\t"
  130317. "adc r4, r4, #0\n\t"
  130318. #endif
  130319. /* A[5] * B[12] */
  130320. "ldr r8, [%[a], #20]\n\t"
  130321. "ldr r9, [%[b], #48]\n\t"
  130322. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  130323. "lsl r6, r8, #16\n\t"
  130324. "lsl r7, r9, #16\n\t"
  130325. "lsr r6, r6, #16\n\t"
  130326. "lsr r7, r7, #16\n\t"
  130327. "mul r7, r6, r7\n\t"
  130328. "adds r5, r5, r7\n\t"
  130329. "adcs r3, r3, #0\n\t"
  130330. "adc r4, r4, #0\n\t"
  130331. "lsr r7, r9, #16\n\t"
  130332. "mul r6, r7, r6\n\t"
  130333. "lsr r7, r6, #16\n\t"
  130334. "lsl r6, r6, #16\n\t"
  130335. "adds r5, r5, r6\n\t"
  130336. "adcs r3, r3, r7\n\t"
  130337. "adc r4, r4, #0\n\t"
  130338. "lsr r6, r8, #16\n\t"
  130339. "lsr r7, r9, #16\n\t"
  130340. "mul r7, r6, r7\n\t"
  130341. "adds r3, r3, r7\n\t"
  130342. "adc r4, r4, #0\n\t"
  130343. "lsl r7, r9, #16\n\t"
  130344. "lsr r7, r7, #16\n\t"
  130345. "mul r6, r7, r6\n\t"
  130346. "lsr r7, r6, #16\n\t"
  130347. "lsl r6, r6, #16\n\t"
  130348. "adds r5, r5, r6\n\t"
  130349. "adcs r3, r3, r7\n\t"
  130350. "adc r4, r4, #0\n\t"
  130351. #else
  130352. "umull r6, r7, r8, r9\n\t"
  130353. "adds r5, r5, r6\n\t"
  130354. "adcs r3, r3, r7\n\t"
  130355. "adc r4, r4, #0\n\t"
  130356. #endif
  130357. /* A[6] * B[11] */
  130358. "ldr r8, [%[a], #24]\n\t"
  130359. "ldr r9, [%[b], #44]\n\t"
  130360. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  130361. "lsl r6, r8, #16\n\t"
  130362. "lsl r7, r9, #16\n\t"
  130363. "lsr r6, r6, #16\n\t"
  130364. "lsr r7, r7, #16\n\t"
  130365. "mul r7, r6, r7\n\t"
  130366. "adds r5, r5, r7\n\t"
  130367. "adcs r3, r3, #0\n\t"
  130368. "adc r4, r4, #0\n\t"
  130369. "lsr r7, r9, #16\n\t"
  130370. "mul r6, r7, r6\n\t"
  130371. "lsr r7, r6, #16\n\t"
  130372. "lsl r6, r6, #16\n\t"
  130373. "adds r5, r5, r6\n\t"
  130374. "adcs r3, r3, r7\n\t"
  130375. "adc r4, r4, #0\n\t"
  130376. "lsr r6, r8, #16\n\t"
  130377. "lsr r7, r9, #16\n\t"
  130378. "mul r7, r6, r7\n\t"
  130379. "adds r3, r3, r7\n\t"
  130380. "adc r4, r4, #0\n\t"
  130381. "lsl r7, r9, #16\n\t"
  130382. "lsr r7, r7, #16\n\t"
  130383. "mul r6, r7, r6\n\t"
  130384. "lsr r7, r6, #16\n\t"
  130385. "lsl r6, r6, #16\n\t"
  130386. "adds r5, r5, r6\n\t"
  130387. "adcs r3, r3, r7\n\t"
  130388. "adc r4, r4, #0\n\t"
  130389. #else
  130390. "umull r6, r7, r8, r9\n\t"
  130391. "adds r5, r5, r6\n\t"
  130392. "adcs r3, r3, r7\n\t"
  130393. "adc r4, r4, #0\n\t"
  130394. #endif
  130395. /* A[7] * B[10] */
  130396. "ldr r8, [%[a], #28]\n\t"
  130397. "ldr r9, [%[b], #40]\n\t"
  130398. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  130399. "lsl r6, r8, #16\n\t"
  130400. "lsl r7, r9, #16\n\t"
  130401. "lsr r6, r6, #16\n\t"
  130402. "lsr r7, r7, #16\n\t"
  130403. "mul r7, r6, r7\n\t"
  130404. "adds r5, r5, r7\n\t"
  130405. "adcs r3, r3, #0\n\t"
  130406. "adc r4, r4, #0\n\t"
  130407. "lsr r7, r9, #16\n\t"
  130408. "mul r6, r7, r6\n\t"
  130409. "lsr r7, r6, #16\n\t"
  130410. "lsl r6, r6, #16\n\t"
  130411. "adds r5, r5, r6\n\t"
  130412. "adcs r3, r3, r7\n\t"
  130413. "adc r4, r4, #0\n\t"
  130414. "lsr r6, r8, #16\n\t"
  130415. "lsr r7, r9, #16\n\t"
  130416. "mul r7, r6, r7\n\t"
  130417. "adds r3, r3, r7\n\t"
  130418. "adc r4, r4, #0\n\t"
  130419. "lsl r7, r9, #16\n\t"
  130420. "lsr r7, r7, #16\n\t"
  130421. "mul r6, r7, r6\n\t"
  130422. "lsr r7, r6, #16\n\t"
  130423. "lsl r6, r6, #16\n\t"
  130424. "adds r5, r5, r6\n\t"
  130425. "adcs r3, r3, r7\n\t"
  130426. "adc r4, r4, #0\n\t"
  130427. #else
  130428. "umull r6, r7, r8, r9\n\t"
  130429. "adds r5, r5, r6\n\t"
  130430. "adcs r3, r3, r7\n\t"
  130431. "adc r4, r4, #0\n\t"
  130432. #endif
  130433. /* A[8] * B[9] */
  130434. "ldr r9, [%[b], #36]\n\t"
  130435. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  130436. "lsl r6, r11, #16\n\t"
  130437. "lsl r7, r9, #16\n\t"
  130438. "lsr r6, r6, #16\n\t"
  130439. "lsr r7, r7, #16\n\t"
  130440. "mul r7, r6, r7\n\t"
  130441. "adds r5, r5, r7\n\t"
  130442. "adcs r3, r3, #0\n\t"
  130443. "adc r4, r4, #0\n\t"
  130444. "lsr r7, r9, #16\n\t"
  130445. "mul r6, r7, r6\n\t"
  130446. "lsr r7, r6, #16\n\t"
  130447. "lsl r6, r6, #16\n\t"
  130448. "adds r5, r5, r6\n\t"
  130449. "adcs r3, r3, r7\n\t"
  130450. "adc r4, r4, #0\n\t"
  130451. "lsr r6, r11, #16\n\t"
  130452. "lsr r7, r9, #16\n\t"
  130453. "mul r7, r6, r7\n\t"
  130454. "adds r3, r3, r7\n\t"
  130455. "adc r4, r4, #0\n\t"
  130456. "lsl r7, r9, #16\n\t"
  130457. "lsr r7, r7, #16\n\t"
  130458. "mul r6, r7, r6\n\t"
  130459. "lsr r7, r6, #16\n\t"
  130460. "lsl r6, r6, #16\n\t"
  130461. "adds r5, r5, r6\n\t"
  130462. "adcs r3, r3, r7\n\t"
  130463. "adc r4, r4, #0\n\t"
  130464. #else
  130465. "umull r6, r7, r11, r9\n\t"
  130466. "adds r5, r5, r6\n\t"
  130467. "adcs r3, r3, r7\n\t"
  130468. "adc r4, r4, #0\n\t"
  130469. #endif
  130470. /* A[9] * B[8] */
  130471. "ldr r8, [%[a], #36]\n\t"
  130472. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  130473. "lsl r6, r8, #16\n\t"
  130474. "lsl r7, r12, #16\n\t"
  130475. "lsr r6, r6, #16\n\t"
  130476. "lsr r7, r7, #16\n\t"
  130477. "mul r7, r6, r7\n\t"
  130478. "adds r5, r5, r7\n\t"
  130479. "adcs r3, r3, #0\n\t"
  130480. "adc r4, r4, #0\n\t"
  130481. "lsr r7, r12, #16\n\t"
  130482. "mul r6, r7, r6\n\t"
  130483. "lsr r7, r6, #16\n\t"
  130484. "lsl r6, r6, #16\n\t"
  130485. "adds r5, r5, r6\n\t"
  130486. "adcs r3, r3, r7\n\t"
  130487. "adc r4, r4, #0\n\t"
  130488. "lsr r6, r8, #16\n\t"
  130489. "lsr r7, r12, #16\n\t"
  130490. "mul r7, r6, r7\n\t"
  130491. "adds r3, r3, r7\n\t"
  130492. "adc r4, r4, #0\n\t"
  130493. "lsl r7, r12, #16\n\t"
  130494. "lsr r7, r7, #16\n\t"
  130495. "mul r6, r7, r6\n\t"
  130496. "lsr r7, r6, #16\n\t"
  130497. "lsl r6, r6, #16\n\t"
  130498. "adds r5, r5, r6\n\t"
  130499. "adcs r3, r3, r7\n\t"
  130500. "adc r4, r4, #0\n\t"
  130501. #else
  130502. "umull r6, r7, r8, r12\n\t"
  130503. "adds r5, r5, r6\n\t"
  130504. "adcs r3, r3, r7\n\t"
  130505. "adc r4, r4, #0\n\t"
  130506. #endif
  130507. /* A[10] * B[7] */
  130508. "ldr r8, [%[a], #40]\n\t"
  130509. "ldr r9, [%[b], #28]\n\t"
  130510. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  130511. "lsl r6, r8, #16\n\t"
  130512. "lsl r7, r9, #16\n\t"
  130513. "lsr r6, r6, #16\n\t"
  130514. "lsr r7, r7, #16\n\t"
  130515. "mul r7, r6, r7\n\t"
  130516. "adds r5, r5, r7\n\t"
  130517. "adcs r3, r3, #0\n\t"
  130518. "adc r4, r4, #0\n\t"
  130519. "lsr r7, r9, #16\n\t"
  130520. "mul r6, r7, r6\n\t"
  130521. "lsr r7, r6, #16\n\t"
  130522. "lsl r6, r6, #16\n\t"
  130523. "adds r5, r5, r6\n\t"
  130524. "adcs r3, r3, r7\n\t"
  130525. "adc r4, r4, #0\n\t"
  130526. "lsr r6, r8, #16\n\t"
  130527. "lsr r7, r9, #16\n\t"
  130528. "mul r7, r6, r7\n\t"
  130529. "adds r3, r3, r7\n\t"
  130530. "adc r4, r4, #0\n\t"
  130531. "lsl r7, r9, #16\n\t"
  130532. "lsr r7, r7, #16\n\t"
  130533. "mul r6, r7, r6\n\t"
  130534. "lsr r7, r6, #16\n\t"
  130535. "lsl r6, r6, #16\n\t"
  130536. "adds r5, r5, r6\n\t"
  130537. "adcs r3, r3, r7\n\t"
  130538. "adc r4, r4, #0\n\t"
  130539. #else
  130540. "umull r6, r7, r8, r9\n\t"
  130541. "adds r5, r5, r6\n\t"
  130542. "adcs r3, r3, r7\n\t"
  130543. "adc r4, r4, #0\n\t"
  130544. #endif
  130545. /* A[11] * B[6] */
  130546. "ldr r8, [%[a], #44]\n\t"
  130547. "ldr r9, [%[b], #24]\n\t"
  130548. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  130549. "lsl r6, r8, #16\n\t"
  130550. "lsl r7, r9, #16\n\t"
  130551. "lsr r6, r6, #16\n\t"
  130552. "lsr r7, r7, #16\n\t"
  130553. "mul r7, r6, r7\n\t"
  130554. "adds r5, r5, r7\n\t"
  130555. "adcs r3, r3, #0\n\t"
  130556. "adc r4, r4, #0\n\t"
  130557. "lsr r7, r9, #16\n\t"
  130558. "mul r6, r7, r6\n\t"
  130559. "lsr r7, r6, #16\n\t"
  130560. "lsl r6, r6, #16\n\t"
  130561. "adds r5, r5, r6\n\t"
  130562. "adcs r3, r3, r7\n\t"
  130563. "adc r4, r4, #0\n\t"
  130564. "lsr r6, r8, #16\n\t"
  130565. "lsr r7, r9, #16\n\t"
  130566. "mul r7, r6, r7\n\t"
  130567. "adds r3, r3, r7\n\t"
  130568. "adc r4, r4, #0\n\t"
  130569. "lsl r7, r9, #16\n\t"
  130570. "lsr r7, r7, #16\n\t"
  130571. "mul r6, r7, r6\n\t"
  130572. "lsr r7, r6, #16\n\t"
  130573. "lsl r6, r6, #16\n\t"
  130574. "adds r5, r5, r6\n\t"
  130575. "adcs r3, r3, r7\n\t"
  130576. "adc r4, r4, #0\n\t"
  130577. #else
  130578. "umull r6, r7, r8, r9\n\t"
  130579. "adds r5, r5, r6\n\t"
  130580. "adcs r3, r3, r7\n\t"
  130581. "adc r4, r4, #0\n\t"
  130582. #endif
  130583. /* A[12] * B[5] */
  130584. "ldr r8, [%[a], #48]\n\t"
  130585. "ldr r9, [%[b], #20]\n\t"
  130586. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  130587. "lsl r6, r8, #16\n\t"
  130588. "lsl r7, r9, #16\n\t"
  130589. "lsr r6, r6, #16\n\t"
  130590. "lsr r7, r7, #16\n\t"
  130591. "mul r7, r6, r7\n\t"
  130592. "adds r5, r5, r7\n\t"
  130593. "adcs r3, r3, #0\n\t"
  130594. "adc r4, r4, #0\n\t"
  130595. "lsr r7, r9, #16\n\t"
  130596. "mul r6, r7, r6\n\t"
  130597. "lsr r7, r6, #16\n\t"
  130598. "lsl r6, r6, #16\n\t"
  130599. "adds r5, r5, r6\n\t"
  130600. "adcs r3, r3, r7\n\t"
  130601. "adc r4, r4, #0\n\t"
  130602. "lsr r6, r8, #16\n\t"
  130603. "lsr r7, r9, #16\n\t"
  130604. "mul r7, r6, r7\n\t"
  130605. "adds r3, r3, r7\n\t"
  130606. "adc r4, r4, #0\n\t"
  130607. "lsl r7, r9, #16\n\t"
  130608. "lsr r7, r7, #16\n\t"
  130609. "mul r6, r7, r6\n\t"
  130610. "lsr r7, r6, #16\n\t"
  130611. "lsl r6, r6, #16\n\t"
  130612. "adds r5, r5, r6\n\t"
  130613. "adcs r3, r3, r7\n\t"
  130614. "adc r4, r4, #0\n\t"
  130615. #else
  130616. "umull r6, r7, r8, r9\n\t"
  130617. "adds r5, r5, r6\n\t"
  130618. "adcs r3, r3, r7\n\t"
  130619. "adc r4, r4, #0\n\t"
  130620. #endif
  130621. /* A[13] * B[4] */
  130622. "ldr r8, [%[a], #52]\n\t"
  130623. "ldr r9, [%[b], #16]\n\t"
  130624. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  130625. "lsl r6, r8, #16\n\t"
  130626. "lsl r7, r9, #16\n\t"
  130627. "lsr r6, r6, #16\n\t"
  130628. "lsr r7, r7, #16\n\t"
  130629. "mul r7, r6, r7\n\t"
  130630. "adds r5, r5, r7\n\t"
  130631. "adcs r3, r3, #0\n\t"
  130632. "adc r4, r4, #0\n\t"
  130633. "lsr r7, r9, #16\n\t"
  130634. "mul r6, r7, r6\n\t"
  130635. "lsr r7, r6, #16\n\t"
  130636. "lsl r6, r6, #16\n\t"
  130637. "adds r5, r5, r6\n\t"
  130638. "adcs r3, r3, r7\n\t"
  130639. "adc r4, r4, #0\n\t"
  130640. "lsr r6, r8, #16\n\t"
  130641. "lsr r7, r9, #16\n\t"
  130642. "mul r7, r6, r7\n\t"
  130643. "adds r3, r3, r7\n\t"
  130644. "adc r4, r4, #0\n\t"
  130645. "lsl r7, r9, #16\n\t"
  130646. "lsr r7, r7, #16\n\t"
  130647. "mul r6, r7, r6\n\t"
  130648. "lsr r7, r6, #16\n\t"
  130649. "lsl r6, r6, #16\n\t"
  130650. "adds r5, r5, r6\n\t"
  130651. "adcs r3, r3, r7\n\t"
  130652. "adc r4, r4, #0\n\t"
  130653. #else
  130654. "umull r6, r7, r8, r9\n\t"
  130655. "adds r5, r5, r6\n\t"
  130656. "adcs r3, r3, r7\n\t"
  130657. "adc r4, r4, #0\n\t"
  130658. #endif
  130659. /* A[14] * B[3] */
  130660. "ldr r8, [%[a], #56]\n\t"
  130661. "ldr r9, [%[b], #12]\n\t"
  130662. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  130663. "lsl r6, r8, #16\n\t"
  130664. "lsl r7, r9, #16\n\t"
  130665. "lsr r6, r6, #16\n\t"
  130666. "lsr r7, r7, #16\n\t"
  130667. "mul r7, r6, r7\n\t"
  130668. "adds r5, r5, r7\n\t"
  130669. "adcs r3, r3, #0\n\t"
  130670. "adc r4, r4, #0\n\t"
  130671. "lsr r7, r9, #16\n\t"
  130672. "mul r6, r7, r6\n\t"
  130673. "lsr r7, r6, #16\n\t"
  130674. "lsl r6, r6, #16\n\t"
  130675. "adds r5, r5, r6\n\t"
  130676. "adcs r3, r3, r7\n\t"
  130677. "adc r4, r4, #0\n\t"
  130678. "lsr r6, r8, #16\n\t"
  130679. "lsr r7, r9, #16\n\t"
  130680. "mul r7, r6, r7\n\t"
  130681. "adds r3, r3, r7\n\t"
  130682. "adc r4, r4, #0\n\t"
  130683. "lsl r7, r9, #16\n\t"
  130684. "lsr r7, r7, #16\n\t"
  130685. "mul r6, r7, r6\n\t"
  130686. "lsr r7, r6, #16\n\t"
  130687. "lsl r6, r6, #16\n\t"
  130688. "adds r5, r5, r6\n\t"
  130689. "adcs r3, r3, r7\n\t"
  130690. "adc r4, r4, #0\n\t"
  130691. #else
  130692. "umull r6, r7, r8, r9\n\t"
  130693. "adds r5, r5, r6\n\t"
  130694. "adcs r3, r3, r7\n\t"
  130695. "adc r4, r4, #0\n\t"
  130696. #endif
  130697. /* A[15] * B[2] */
  130698. "ldr r8, [%[a], #60]\n\t"
  130699. "ldr r9, [%[b], #8]\n\t"
  130700. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  130701. "lsl r6, r8, #16\n\t"
  130702. "lsl r7, r9, #16\n\t"
  130703. "lsr r6, r6, #16\n\t"
  130704. "lsr r7, r7, #16\n\t"
  130705. "mul r7, r6, r7\n\t"
  130706. "adds r5, r5, r7\n\t"
  130707. "adcs r3, r3, #0\n\t"
  130708. "adc r4, r4, #0\n\t"
  130709. "lsr r7, r9, #16\n\t"
  130710. "mul r6, r7, r6\n\t"
  130711. "lsr r7, r6, #16\n\t"
  130712. "lsl r6, r6, #16\n\t"
  130713. "adds r5, r5, r6\n\t"
  130714. "adcs r3, r3, r7\n\t"
  130715. "adc r4, r4, #0\n\t"
  130716. "lsr r6, r8, #16\n\t"
  130717. "lsr r7, r9, #16\n\t"
  130718. "mul r7, r6, r7\n\t"
  130719. "adds r3, r3, r7\n\t"
  130720. "adc r4, r4, #0\n\t"
  130721. "lsl r7, r9, #16\n\t"
  130722. "lsr r7, r7, #16\n\t"
  130723. "mul r6, r7, r6\n\t"
  130724. "lsr r7, r6, #16\n\t"
  130725. "lsl r6, r6, #16\n\t"
  130726. "adds r5, r5, r6\n\t"
  130727. "adcs r3, r3, r7\n\t"
  130728. "adc r4, r4, #0\n\t"
  130729. #else
  130730. "umull r6, r7, r8, r9\n\t"
  130731. "adds r5, r5, r6\n\t"
  130732. "adcs r3, r3, r7\n\t"
  130733. "adc r4, r4, #0\n\t"
  130734. #endif
  130735. "str r5, [%[r], #68]\n\t"
  130736. /* A[15] * B[3] */
  130737. "ldr r9, [%[b], #12]\n\t"
  130738. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  130739. "lsl r6, r8, #16\n\t"
  130740. "lsl r7, r9, #16\n\t"
  130741. "lsr r6, r6, #16\n\t"
  130742. "lsr r7, r7, #16\n\t"
  130743. "mul r7, r6, r7\n\t"
  130744. "adds r3, r3, r7\n\t"
  130745. "adcs r4, r4, #0\n\t"
  130746. "mov r5, #0\n\t"
  130747. "adc r5, r5, #0\n\t"
  130748. "lsr r7, r9, #16\n\t"
  130749. "mul r6, r7, r6\n\t"
  130750. "lsr r7, r6, #16\n\t"
  130751. "lsl r6, r6, #16\n\t"
  130752. "adds r3, r3, r6\n\t"
  130753. "adcs r4, r4, r7\n\t"
  130754. "adc r5, r5, #0\n\t"
  130755. "lsr r6, r8, #16\n\t"
  130756. "lsr r7, r9, #16\n\t"
  130757. "mul r7, r6, r7\n\t"
  130758. "adds r4, r4, r7\n\t"
  130759. "adc r5, r5, #0\n\t"
  130760. "lsl r7, r9, #16\n\t"
  130761. "lsr r7, r7, #16\n\t"
  130762. "mul r6, r7, r6\n\t"
  130763. "lsr r7, r6, #16\n\t"
  130764. "lsl r6, r6, #16\n\t"
  130765. "adds r3, r3, r6\n\t"
  130766. "adcs r4, r4, r7\n\t"
  130767. "adc r5, r5, #0\n\t"
  130768. #else
  130769. "umull r6, r7, r8, r9\n\t"
  130770. "adds r3, r3, r6\n\t"
  130771. "adcs r4, r4, r7\n\t"
  130772. "mov r5, #0\n\t"
  130773. "adc r5, r5, #0\n\t"
  130774. #endif
  130775. /* A[14] * B[4] */
  130776. "ldr r8, [%[a], #56]\n\t"
  130777. "ldr r9, [%[b], #16]\n\t"
  130778. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  130779. "lsl r6, r8, #16\n\t"
  130780. "lsl r7, r9, #16\n\t"
  130781. "lsr r6, r6, #16\n\t"
  130782. "lsr r7, r7, #16\n\t"
  130783. "mul r7, r6, r7\n\t"
  130784. "adds r3, r3, r7\n\t"
  130785. "adcs r4, r4, #0\n\t"
  130786. "adc r5, r5, #0\n\t"
  130787. "lsr r7, r9, #16\n\t"
  130788. "mul r6, r7, r6\n\t"
  130789. "lsr r7, r6, #16\n\t"
  130790. "lsl r6, r6, #16\n\t"
  130791. "adds r3, r3, r6\n\t"
  130792. "adcs r4, r4, r7\n\t"
  130793. "adc r5, r5, #0\n\t"
  130794. "lsr r6, r8, #16\n\t"
  130795. "lsr r7, r9, #16\n\t"
  130796. "mul r7, r6, r7\n\t"
  130797. "adds r4, r4, r7\n\t"
  130798. "adc r5, r5, #0\n\t"
  130799. "lsl r7, r9, #16\n\t"
  130800. "lsr r7, r7, #16\n\t"
  130801. "mul r6, r7, r6\n\t"
  130802. "lsr r7, r6, #16\n\t"
  130803. "lsl r6, r6, #16\n\t"
  130804. "adds r3, r3, r6\n\t"
  130805. "adcs r4, r4, r7\n\t"
  130806. "adc r5, r5, #0\n\t"
  130807. #else
  130808. "umull r6, r7, r8, r9\n\t"
  130809. "adds r3, r3, r6\n\t"
  130810. "adcs r4, r4, r7\n\t"
  130811. "adc r5, r5, #0\n\t"
  130812. #endif
  130813. /* A[13] * B[5] */
  130814. "ldr r8, [%[a], #52]\n\t"
  130815. "ldr r9, [%[b], #20]\n\t"
  130816. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  130817. "lsl r6, r8, #16\n\t"
  130818. "lsl r7, r9, #16\n\t"
  130819. "lsr r6, r6, #16\n\t"
  130820. "lsr r7, r7, #16\n\t"
  130821. "mul r7, r6, r7\n\t"
  130822. "adds r3, r3, r7\n\t"
  130823. "adcs r4, r4, #0\n\t"
  130824. "adc r5, r5, #0\n\t"
  130825. "lsr r7, r9, #16\n\t"
  130826. "mul r6, r7, r6\n\t"
  130827. "lsr r7, r6, #16\n\t"
  130828. "lsl r6, r6, #16\n\t"
  130829. "adds r3, r3, r6\n\t"
  130830. "adcs r4, r4, r7\n\t"
  130831. "adc r5, r5, #0\n\t"
  130832. "lsr r6, r8, #16\n\t"
  130833. "lsr r7, r9, #16\n\t"
  130834. "mul r7, r6, r7\n\t"
  130835. "adds r4, r4, r7\n\t"
  130836. "adc r5, r5, #0\n\t"
  130837. "lsl r7, r9, #16\n\t"
  130838. "lsr r7, r7, #16\n\t"
  130839. "mul r6, r7, r6\n\t"
  130840. "lsr r7, r6, #16\n\t"
  130841. "lsl r6, r6, #16\n\t"
  130842. "adds r3, r3, r6\n\t"
  130843. "adcs r4, r4, r7\n\t"
  130844. "adc r5, r5, #0\n\t"
  130845. #else
  130846. "umull r6, r7, r8, r9\n\t"
  130847. "adds r3, r3, r6\n\t"
  130848. "adcs r4, r4, r7\n\t"
  130849. "adc r5, r5, #0\n\t"
  130850. #endif
  130851. /* A[12] * B[6] */
  130852. "ldr r8, [%[a], #48]\n\t"
  130853. "ldr r9, [%[b], #24]\n\t"
  130854. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  130855. "lsl r6, r8, #16\n\t"
  130856. "lsl r7, r9, #16\n\t"
  130857. "lsr r6, r6, #16\n\t"
  130858. "lsr r7, r7, #16\n\t"
  130859. "mul r7, r6, r7\n\t"
  130860. "adds r3, r3, r7\n\t"
  130861. "adcs r4, r4, #0\n\t"
  130862. "adc r5, r5, #0\n\t"
  130863. "lsr r7, r9, #16\n\t"
  130864. "mul r6, r7, r6\n\t"
  130865. "lsr r7, r6, #16\n\t"
  130866. "lsl r6, r6, #16\n\t"
  130867. "adds r3, r3, r6\n\t"
  130868. "adcs r4, r4, r7\n\t"
  130869. "adc r5, r5, #0\n\t"
  130870. "lsr r6, r8, #16\n\t"
  130871. "lsr r7, r9, #16\n\t"
  130872. "mul r7, r6, r7\n\t"
  130873. "adds r4, r4, r7\n\t"
  130874. "adc r5, r5, #0\n\t"
  130875. "lsl r7, r9, #16\n\t"
  130876. "lsr r7, r7, #16\n\t"
  130877. "mul r6, r7, r6\n\t"
  130878. "lsr r7, r6, #16\n\t"
  130879. "lsl r6, r6, #16\n\t"
  130880. "adds r3, r3, r6\n\t"
  130881. "adcs r4, r4, r7\n\t"
  130882. "adc r5, r5, #0\n\t"
  130883. #else
  130884. "umull r6, r7, r8, r9\n\t"
  130885. "adds r3, r3, r6\n\t"
  130886. "adcs r4, r4, r7\n\t"
  130887. "adc r5, r5, #0\n\t"
  130888. #endif
  130889. /* A[11] * B[7] */
  130890. "ldr r8, [%[a], #44]\n\t"
  130891. "ldr r9, [%[b], #28]\n\t"
  130892. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  130893. "lsl r6, r8, #16\n\t"
  130894. "lsl r7, r9, #16\n\t"
  130895. "lsr r6, r6, #16\n\t"
  130896. "lsr r7, r7, #16\n\t"
  130897. "mul r7, r6, r7\n\t"
  130898. "adds r3, r3, r7\n\t"
  130899. "adcs r4, r4, #0\n\t"
  130900. "adc r5, r5, #0\n\t"
  130901. "lsr r7, r9, #16\n\t"
  130902. "mul r6, r7, r6\n\t"
  130903. "lsr r7, r6, #16\n\t"
  130904. "lsl r6, r6, #16\n\t"
  130905. "adds r3, r3, r6\n\t"
  130906. "adcs r4, r4, r7\n\t"
  130907. "adc r5, r5, #0\n\t"
  130908. "lsr r6, r8, #16\n\t"
  130909. "lsr r7, r9, #16\n\t"
  130910. "mul r7, r6, r7\n\t"
  130911. "adds r4, r4, r7\n\t"
  130912. "adc r5, r5, #0\n\t"
  130913. "lsl r7, r9, #16\n\t"
  130914. "lsr r7, r7, #16\n\t"
  130915. "mul r6, r7, r6\n\t"
  130916. "lsr r7, r6, #16\n\t"
  130917. "lsl r6, r6, #16\n\t"
  130918. "adds r3, r3, r6\n\t"
  130919. "adcs r4, r4, r7\n\t"
  130920. "adc r5, r5, #0\n\t"
  130921. #else
  130922. "umull r6, r7, r8, r9\n\t"
  130923. "adds r3, r3, r6\n\t"
  130924. "adcs r4, r4, r7\n\t"
  130925. "adc r5, r5, #0\n\t"
  130926. #endif
  130927. /* A[10] * B[8] */
  130928. "ldr r8, [%[a], #40]\n\t"
  130929. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  130930. "lsl r6, r8, #16\n\t"
  130931. "lsl r7, r12, #16\n\t"
  130932. "lsr r6, r6, #16\n\t"
  130933. "lsr r7, r7, #16\n\t"
  130934. "mul r7, r6, r7\n\t"
  130935. "adds r3, r3, r7\n\t"
  130936. "adcs r4, r4, #0\n\t"
  130937. "adc r5, r5, #0\n\t"
  130938. "lsr r7, r12, #16\n\t"
  130939. "mul r6, r7, r6\n\t"
  130940. "lsr r7, r6, #16\n\t"
  130941. "lsl r6, r6, #16\n\t"
  130942. "adds r3, r3, r6\n\t"
  130943. "adcs r4, r4, r7\n\t"
  130944. "adc r5, r5, #0\n\t"
  130945. "lsr r6, r8, #16\n\t"
  130946. "lsr r7, r12, #16\n\t"
  130947. "mul r7, r6, r7\n\t"
  130948. "adds r4, r4, r7\n\t"
  130949. "adc r5, r5, #0\n\t"
  130950. "lsl r7, r12, #16\n\t"
  130951. "lsr r7, r7, #16\n\t"
  130952. "mul r6, r7, r6\n\t"
  130953. "lsr r7, r6, #16\n\t"
  130954. "lsl r6, r6, #16\n\t"
  130955. "adds r3, r3, r6\n\t"
  130956. "adcs r4, r4, r7\n\t"
  130957. "adc r5, r5, #0\n\t"
  130958. #else
  130959. "umull r6, r7, r8, r12\n\t"
  130960. "adds r3, r3, r6\n\t"
  130961. "adcs r4, r4, r7\n\t"
  130962. "adc r5, r5, #0\n\t"
  130963. #endif
  130964. /* A[9] * B[9] */
  130965. "ldr r11, [%[a], #36]\n\t"
  130966. "ldr r12, [%[b], #36]\n\t"
  130967. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  130968. "lsl r6, r11, #16\n\t"
  130969. "lsl r7, r12, #16\n\t"
  130970. "lsr r6, r6, #16\n\t"
  130971. "lsr r7, r7, #16\n\t"
  130972. "mul r7, r6, r7\n\t"
  130973. "adds r3, r3, r7\n\t"
  130974. "adcs r4, r4, #0\n\t"
  130975. "adc r5, r5, #0\n\t"
  130976. "lsr r7, r12, #16\n\t"
  130977. "mul r6, r7, r6\n\t"
  130978. "lsr r7, r6, #16\n\t"
  130979. "lsl r6, r6, #16\n\t"
  130980. "adds r3, r3, r6\n\t"
  130981. "adcs r4, r4, r7\n\t"
  130982. "adc r5, r5, #0\n\t"
  130983. "lsr r6, r11, #16\n\t"
  130984. "lsr r7, r12, #16\n\t"
  130985. "mul r7, r6, r7\n\t"
  130986. "adds r4, r4, r7\n\t"
  130987. "adc r5, r5, #0\n\t"
  130988. "lsl r7, r12, #16\n\t"
  130989. "lsr r7, r7, #16\n\t"
  130990. "mul r6, r7, r6\n\t"
  130991. "lsr r7, r6, #16\n\t"
  130992. "lsl r6, r6, #16\n\t"
  130993. "adds r3, r3, r6\n\t"
  130994. "adcs r4, r4, r7\n\t"
  130995. "adc r5, r5, #0\n\t"
  130996. #else
  130997. "umull r6, r7, r11, r12\n\t"
  130998. "adds r3, r3, r6\n\t"
  130999. "adcs r4, r4, r7\n\t"
  131000. "adc r5, r5, #0\n\t"
  131001. #endif
  131002. /* A[8] * B[10] */
  131003. "ldr r8, [%[a], #32]\n\t"
  131004. "ldr r9, [%[b], #40]\n\t"
  131005. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  131006. "lsl r6, r8, #16\n\t"
  131007. "lsl r7, r9, #16\n\t"
  131008. "lsr r6, r6, #16\n\t"
  131009. "lsr r7, r7, #16\n\t"
  131010. "mul r7, r6, r7\n\t"
  131011. "adds r3, r3, r7\n\t"
  131012. "adcs r4, r4, #0\n\t"
  131013. "adc r5, r5, #0\n\t"
  131014. "lsr r7, r9, #16\n\t"
  131015. "mul r6, r7, r6\n\t"
  131016. "lsr r7, r6, #16\n\t"
  131017. "lsl r6, r6, #16\n\t"
  131018. "adds r3, r3, r6\n\t"
  131019. "adcs r4, r4, r7\n\t"
  131020. "adc r5, r5, #0\n\t"
  131021. "lsr r6, r8, #16\n\t"
  131022. "lsr r7, r9, #16\n\t"
  131023. "mul r7, r6, r7\n\t"
  131024. "adds r4, r4, r7\n\t"
  131025. "adc r5, r5, #0\n\t"
  131026. "lsl r7, r9, #16\n\t"
  131027. "lsr r7, r7, #16\n\t"
  131028. "mul r6, r7, r6\n\t"
  131029. "lsr r7, r6, #16\n\t"
  131030. "lsl r6, r6, #16\n\t"
  131031. "adds r3, r3, r6\n\t"
  131032. "adcs r4, r4, r7\n\t"
  131033. "adc r5, r5, #0\n\t"
  131034. #else
  131035. "umull r6, r7, r8, r9\n\t"
  131036. "adds r3, r3, r6\n\t"
  131037. "adcs r4, r4, r7\n\t"
  131038. "adc r5, r5, #0\n\t"
  131039. #endif
  131040. /* A[7] * B[11] */
  131041. "ldr r8, [%[a], #28]\n\t"
  131042. "ldr r9, [%[b], #44]\n\t"
  131043. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  131044. "lsl r6, r8, #16\n\t"
  131045. "lsl r7, r9, #16\n\t"
  131046. "lsr r6, r6, #16\n\t"
  131047. "lsr r7, r7, #16\n\t"
  131048. "mul r7, r6, r7\n\t"
  131049. "adds r3, r3, r7\n\t"
  131050. "adcs r4, r4, #0\n\t"
  131051. "adc r5, r5, #0\n\t"
  131052. "lsr r7, r9, #16\n\t"
  131053. "mul r6, r7, r6\n\t"
  131054. "lsr r7, r6, #16\n\t"
  131055. "lsl r6, r6, #16\n\t"
  131056. "adds r3, r3, r6\n\t"
  131057. "adcs r4, r4, r7\n\t"
  131058. "adc r5, r5, #0\n\t"
  131059. "lsr r6, r8, #16\n\t"
  131060. "lsr r7, r9, #16\n\t"
  131061. "mul r7, r6, r7\n\t"
  131062. "adds r4, r4, r7\n\t"
  131063. "adc r5, r5, #0\n\t"
  131064. "lsl r7, r9, #16\n\t"
  131065. "lsr r7, r7, #16\n\t"
  131066. "mul r6, r7, r6\n\t"
  131067. "lsr r7, r6, #16\n\t"
  131068. "lsl r6, r6, #16\n\t"
  131069. "adds r3, r3, r6\n\t"
  131070. "adcs r4, r4, r7\n\t"
  131071. "adc r5, r5, #0\n\t"
  131072. #else
  131073. "umull r6, r7, r8, r9\n\t"
  131074. "adds r3, r3, r6\n\t"
  131075. "adcs r4, r4, r7\n\t"
  131076. "adc r5, r5, #0\n\t"
  131077. #endif
  131078. /* A[6] * B[12] */
  131079. "ldr r8, [%[a], #24]\n\t"
  131080. "ldr r9, [%[b], #48]\n\t"
  131081. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  131082. "lsl r6, r8, #16\n\t"
  131083. "lsl r7, r9, #16\n\t"
  131084. "lsr r6, r6, #16\n\t"
  131085. "lsr r7, r7, #16\n\t"
  131086. "mul r7, r6, r7\n\t"
  131087. "adds r3, r3, r7\n\t"
  131088. "adcs r4, r4, #0\n\t"
  131089. "adc r5, r5, #0\n\t"
  131090. "lsr r7, r9, #16\n\t"
  131091. "mul r6, r7, r6\n\t"
  131092. "lsr r7, r6, #16\n\t"
  131093. "lsl r6, r6, #16\n\t"
  131094. "adds r3, r3, r6\n\t"
  131095. "adcs r4, r4, r7\n\t"
  131096. "adc r5, r5, #0\n\t"
  131097. "lsr r6, r8, #16\n\t"
  131098. "lsr r7, r9, #16\n\t"
  131099. "mul r7, r6, r7\n\t"
  131100. "adds r4, r4, r7\n\t"
  131101. "adc r5, r5, #0\n\t"
  131102. "lsl r7, r9, #16\n\t"
  131103. "lsr r7, r7, #16\n\t"
  131104. "mul r6, r7, r6\n\t"
  131105. "lsr r7, r6, #16\n\t"
  131106. "lsl r6, r6, #16\n\t"
  131107. "adds r3, r3, r6\n\t"
  131108. "adcs r4, r4, r7\n\t"
  131109. "adc r5, r5, #0\n\t"
  131110. #else
  131111. "umull r6, r7, r8, r9\n\t"
  131112. "adds r3, r3, r6\n\t"
  131113. "adcs r4, r4, r7\n\t"
  131114. "adc r5, r5, #0\n\t"
  131115. #endif
  131116. /* A[5] * B[13] */
  131117. "ldr r8, [%[a], #20]\n\t"
  131118. "ldr r9, [%[b], #52]\n\t"
  131119. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  131120. "lsl r6, r8, #16\n\t"
  131121. "lsl r7, r9, #16\n\t"
  131122. "lsr r6, r6, #16\n\t"
  131123. "lsr r7, r7, #16\n\t"
  131124. "mul r7, r6, r7\n\t"
  131125. "adds r3, r3, r7\n\t"
  131126. "adcs r4, r4, #0\n\t"
  131127. "adc r5, r5, #0\n\t"
  131128. "lsr r7, r9, #16\n\t"
  131129. "mul r6, r7, r6\n\t"
  131130. "lsr r7, r6, #16\n\t"
  131131. "lsl r6, r6, #16\n\t"
  131132. "adds r3, r3, r6\n\t"
  131133. "adcs r4, r4, r7\n\t"
  131134. "adc r5, r5, #0\n\t"
  131135. "lsr r6, r8, #16\n\t"
  131136. "lsr r7, r9, #16\n\t"
  131137. "mul r7, r6, r7\n\t"
  131138. "adds r4, r4, r7\n\t"
  131139. "adc r5, r5, #0\n\t"
  131140. "lsl r7, r9, #16\n\t"
  131141. "lsr r7, r7, #16\n\t"
  131142. "mul r6, r7, r6\n\t"
  131143. "lsr r7, r6, #16\n\t"
  131144. "lsl r6, r6, #16\n\t"
  131145. "adds r3, r3, r6\n\t"
  131146. "adcs r4, r4, r7\n\t"
  131147. "adc r5, r5, #0\n\t"
  131148. #else
  131149. "umull r6, r7, r8, r9\n\t"
  131150. "adds r3, r3, r6\n\t"
  131151. "adcs r4, r4, r7\n\t"
  131152. "adc r5, r5, #0\n\t"
  131153. #endif
  131154. /* A[4] * B[14] */
  131155. "ldr r8, [%[a], #16]\n\t"
  131156. "ldr r9, [%[b], #56]\n\t"
  131157. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  131158. "lsl r6, r8, #16\n\t"
  131159. "lsl r7, r9, #16\n\t"
  131160. "lsr r6, r6, #16\n\t"
  131161. "lsr r7, r7, #16\n\t"
  131162. "mul r7, r6, r7\n\t"
  131163. "adds r3, r3, r7\n\t"
  131164. "adcs r4, r4, #0\n\t"
  131165. "adc r5, r5, #0\n\t"
  131166. "lsr r7, r9, #16\n\t"
  131167. "mul r6, r7, r6\n\t"
  131168. "lsr r7, r6, #16\n\t"
  131169. "lsl r6, r6, #16\n\t"
  131170. "adds r3, r3, r6\n\t"
  131171. "adcs r4, r4, r7\n\t"
  131172. "adc r5, r5, #0\n\t"
  131173. "lsr r6, r8, #16\n\t"
  131174. "lsr r7, r9, #16\n\t"
  131175. "mul r7, r6, r7\n\t"
  131176. "adds r4, r4, r7\n\t"
  131177. "adc r5, r5, #0\n\t"
  131178. "lsl r7, r9, #16\n\t"
  131179. "lsr r7, r7, #16\n\t"
  131180. "mul r6, r7, r6\n\t"
  131181. "lsr r7, r6, #16\n\t"
  131182. "lsl r6, r6, #16\n\t"
  131183. "adds r3, r3, r6\n\t"
  131184. "adcs r4, r4, r7\n\t"
  131185. "adc r5, r5, #0\n\t"
  131186. #else
  131187. "umull r6, r7, r8, r9\n\t"
  131188. "adds r3, r3, r6\n\t"
  131189. "adcs r4, r4, r7\n\t"
  131190. "adc r5, r5, #0\n\t"
  131191. #endif
  131192. /* A[3] * B[15] */
  131193. "ldr r8, [%[a], #12]\n\t"
  131194. "ldr r9, [%[b], #60]\n\t"
  131195. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  131196. "lsl r6, r8, #16\n\t"
  131197. "lsl r7, r9, #16\n\t"
  131198. "lsr r6, r6, #16\n\t"
  131199. "lsr r7, r7, #16\n\t"
  131200. "mul r7, r6, r7\n\t"
  131201. "adds r3, r3, r7\n\t"
  131202. "adcs r4, r4, #0\n\t"
  131203. "adc r5, r5, #0\n\t"
  131204. "lsr r7, r9, #16\n\t"
  131205. "mul r6, r7, r6\n\t"
  131206. "lsr r7, r6, #16\n\t"
  131207. "lsl r6, r6, #16\n\t"
  131208. "adds r3, r3, r6\n\t"
  131209. "adcs r4, r4, r7\n\t"
  131210. "adc r5, r5, #0\n\t"
  131211. "lsr r6, r8, #16\n\t"
  131212. "lsr r7, r9, #16\n\t"
  131213. "mul r7, r6, r7\n\t"
  131214. "adds r4, r4, r7\n\t"
  131215. "adc r5, r5, #0\n\t"
  131216. "lsl r7, r9, #16\n\t"
  131217. "lsr r7, r7, #16\n\t"
  131218. "mul r6, r7, r6\n\t"
  131219. "lsr r7, r6, #16\n\t"
  131220. "lsl r6, r6, #16\n\t"
  131221. "adds r3, r3, r6\n\t"
  131222. "adcs r4, r4, r7\n\t"
  131223. "adc r5, r5, #0\n\t"
  131224. #else
  131225. "umull r6, r7, r8, r9\n\t"
  131226. "adds r3, r3, r6\n\t"
  131227. "adcs r4, r4, r7\n\t"
  131228. "adc r5, r5, #0\n\t"
  131229. #endif
  131230. "str r3, [%[r], #72]\n\t"
  131231. /* A[4] * B[15] */
  131232. "ldr r8, [%[a], #16]\n\t"
  131233. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  131234. "lsl r6, r8, #16\n\t"
  131235. "lsl r7, r9, #16\n\t"
  131236. "lsr r6, r6, #16\n\t"
  131237. "lsr r7, r7, #16\n\t"
  131238. "mul r7, r6, r7\n\t"
  131239. "adds r4, r4, r7\n\t"
  131240. "adcs r5, r5, #0\n\t"
  131241. "mov r3, #0\n\t"
  131242. "adc r3, r3, #0\n\t"
  131243. "lsr r7, r9, #16\n\t"
  131244. "mul r6, r7, r6\n\t"
  131245. "lsr r7, r6, #16\n\t"
  131246. "lsl r6, r6, #16\n\t"
  131247. "adds r4, r4, r6\n\t"
  131248. "adcs r5, r5, r7\n\t"
  131249. "adc r3, r3, #0\n\t"
  131250. "lsr r6, r8, #16\n\t"
  131251. "lsr r7, r9, #16\n\t"
  131252. "mul r7, r6, r7\n\t"
  131253. "adds r5, r5, r7\n\t"
  131254. "adc r3, r3, #0\n\t"
  131255. "lsl r7, r9, #16\n\t"
  131256. "lsr r7, r7, #16\n\t"
  131257. "mul r6, r7, r6\n\t"
  131258. "lsr r7, r6, #16\n\t"
  131259. "lsl r6, r6, #16\n\t"
  131260. "adds r4, r4, r6\n\t"
  131261. "adcs r5, r5, r7\n\t"
  131262. "adc r3, r3, #0\n\t"
  131263. #else
  131264. "umull r6, r7, r8, r9\n\t"
  131265. "adds r4, r4, r6\n\t"
  131266. "adcs r5, r5, r7\n\t"
  131267. "mov r3, #0\n\t"
  131268. "adc r3, r3, #0\n\t"
  131269. #endif
  131270. /* A[5] * B[14] */
  131271. "ldr r8, [%[a], #20]\n\t"
  131272. "ldr r9, [%[b], #56]\n\t"
  131273. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  131274. "lsl r6, r8, #16\n\t"
  131275. "lsl r7, r9, #16\n\t"
  131276. "lsr r6, r6, #16\n\t"
  131277. "lsr r7, r7, #16\n\t"
  131278. "mul r7, r6, r7\n\t"
  131279. "adds r4, r4, r7\n\t"
  131280. "adcs r5, r5, #0\n\t"
  131281. "adc r3, r3, #0\n\t"
  131282. "lsr r7, r9, #16\n\t"
  131283. "mul r6, r7, r6\n\t"
  131284. "lsr r7, r6, #16\n\t"
  131285. "lsl r6, r6, #16\n\t"
  131286. "adds r4, r4, r6\n\t"
  131287. "adcs r5, r5, r7\n\t"
  131288. "adc r3, r3, #0\n\t"
  131289. "lsr r6, r8, #16\n\t"
  131290. "lsr r7, r9, #16\n\t"
  131291. "mul r7, r6, r7\n\t"
  131292. "adds r5, r5, r7\n\t"
  131293. "adc r3, r3, #0\n\t"
  131294. "lsl r7, r9, #16\n\t"
  131295. "lsr r7, r7, #16\n\t"
  131296. "mul r6, r7, r6\n\t"
  131297. "lsr r7, r6, #16\n\t"
  131298. "lsl r6, r6, #16\n\t"
  131299. "adds r4, r4, r6\n\t"
  131300. "adcs r5, r5, r7\n\t"
  131301. "adc r3, r3, #0\n\t"
  131302. #else
  131303. "umull r6, r7, r8, r9\n\t"
  131304. "adds r4, r4, r6\n\t"
  131305. "adcs r5, r5, r7\n\t"
  131306. "adc r3, r3, #0\n\t"
  131307. #endif
  131308. /* A[6] * B[13] */
  131309. "ldr r8, [%[a], #24]\n\t"
  131310. "ldr r9, [%[b], #52]\n\t"
  131311. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  131312. "lsl r6, r8, #16\n\t"
  131313. "lsl r7, r9, #16\n\t"
  131314. "lsr r6, r6, #16\n\t"
  131315. "lsr r7, r7, #16\n\t"
  131316. "mul r7, r6, r7\n\t"
  131317. "adds r4, r4, r7\n\t"
  131318. "adcs r5, r5, #0\n\t"
  131319. "adc r3, r3, #0\n\t"
  131320. "lsr r7, r9, #16\n\t"
  131321. "mul r6, r7, r6\n\t"
  131322. "lsr r7, r6, #16\n\t"
  131323. "lsl r6, r6, #16\n\t"
  131324. "adds r4, r4, r6\n\t"
  131325. "adcs r5, r5, r7\n\t"
  131326. "adc r3, r3, #0\n\t"
  131327. "lsr r6, r8, #16\n\t"
  131328. "lsr r7, r9, #16\n\t"
  131329. "mul r7, r6, r7\n\t"
  131330. "adds r5, r5, r7\n\t"
  131331. "adc r3, r3, #0\n\t"
  131332. "lsl r7, r9, #16\n\t"
  131333. "lsr r7, r7, #16\n\t"
  131334. "mul r6, r7, r6\n\t"
  131335. "lsr r7, r6, #16\n\t"
  131336. "lsl r6, r6, #16\n\t"
  131337. "adds r4, r4, r6\n\t"
  131338. "adcs r5, r5, r7\n\t"
  131339. "adc r3, r3, #0\n\t"
  131340. #else
  131341. "umull r6, r7, r8, r9\n\t"
  131342. "adds r4, r4, r6\n\t"
  131343. "adcs r5, r5, r7\n\t"
  131344. "adc r3, r3, #0\n\t"
  131345. #endif
  131346. /* A[7] * B[12] */
  131347. "ldr r8, [%[a], #28]\n\t"
  131348. "ldr r9, [%[b], #48]\n\t"
  131349. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  131350. "lsl r6, r8, #16\n\t"
  131351. "lsl r7, r9, #16\n\t"
  131352. "lsr r6, r6, #16\n\t"
  131353. "lsr r7, r7, #16\n\t"
  131354. "mul r7, r6, r7\n\t"
  131355. "adds r4, r4, r7\n\t"
  131356. "adcs r5, r5, #0\n\t"
  131357. "adc r3, r3, #0\n\t"
  131358. "lsr r7, r9, #16\n\t"
  131359. "mul r6, r7, r6\n\t"
  131360. "lsr r7, r6, #16\n\t"
  131361. "lsl r6, r6, #16\n\t"
  131362. "adds r4, r4, r6\n\t"
  131363. "adcs r5, r5, r7\n\t"
  131364. "adc r3, r3, #0\n\t"
  131365. "lsr r6, r8, #16\n\t"
  131366. "lsr r7, r9, #16\n\t"
  131367. "mul r7, r6, r7\n\t"
  131368. "adds r5, r5, r7\n\t"
  131369. "adc r3, r3, #0\n\t"
  131370. "lsl r7, r9, #16\n\t"
  131371. "lsr r7, r7, #16\n\t"
  131372. "mul r6, r7, r6\n\t"
  131373. "lsr r7, r6, #16\n\t"
  131374. "lsl r6, r6, #16\n\t"
  131375. "adds r4, r4, r6\n\t"
  131376. "adcs r5, r5, r7\n\t"
  131377. "adc r3, r3, #0\n\t"
  131378. #else
  131379. "umull r6, r7, r8, r9\n\t"
  131380. "adds r4, r4, r6\n\t"
  131381. "adcs r5, r5, r7\n\t"
  131382. "adc r3, r3, #0\n\t"
  131383. #endif
  131384. /* A[8] * B[11] */
  131385. "ldr r8, [%[a], #32]\n\t"
  131386. "ldr r9, [%[b], #44]\n\t"
  131387. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  131388. "lsl r6, r8, #16\n\t"
  131389. "lsl r7, r9, #16\n\t"
  131390. "lsr r6, r6, #16\n\t"
  131391. "lsr r7, r7, #16\n\t"
  131392. "mul r7, r6, r7\n\t"
  131393. "adds r4, r4, r7\n\t"
  131394. "adcs r5, r5, #0\n\t"
  131395. "adc r3, r3, #0\n\t"
  131396. "lsr r7, r9, #16\n\t"
  131397. "mul r6, r7, r6\n\t"
  131398. "lsr r7, r6, #16\n\t"
  131399. "lsl r6, r6, #16\n\t"
  131400. "adds r4, r4, r6\n\t"
  131401. "adcs r5, r5, r7\n\t"
  131402. "adc r3, r3, #0\n\t"
  131403. "lsr r6, r8, #16\n\t"
  131404. "lsr r7, r9, #16\n\t"
  131405. "mul r7, r6, r7\n\t"
  131406. "adds r5, r5, r7\n\t"
  131407. "adc r3, r3, #0\n\t"
  131408. "lsl r7, r9, #16\n\t"
  131409. "lsr r7, r7, #16\n\t"
  131410. "mul r6, r7, r6\n\t"
  131411. "lsr r7, r6, #16\n\t"
  131412. "lsl r6, r6, #16\n\t"
  131413. "adds r4, r4, r6\n\t"
  131414. "adcs r5, r5, r7\n\t"
  131415. "adc r3, r3, #0\n\t"
  131416. #else
  131417. "umull r6, r7, r8, r9\n\t"
  131418. "adds r4, r4, r6\n\t"
  131419. "adcs r5, r5, r7\n\t"
  131420. "adc r3, r3, #0\n\t"
  131421. #endif
  131422. /* A[9] * B[10] */
  131423. "ldr r9, [%[b], #40]\n\t"
  131424. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  131425. "lsl r6, r11, #16\n\t"
  131426. "lsl r7, r9, #16\n\t"
  131427. "lsr r6, r6, #16\n\t"
  131428. "lsr r7, r7, #16\n\t"
  131429. "mul r7, r6, r7\n\t"
  131430. "adds r4, r4, r7\n\t"
  131431. "adcs r5, r5, #0\n\t"
  131432. "adc r3, r3, #0\n\t"
  131433. "lsr r7, r9, #16\n\t"
  131434. "mul r6, r7, r6\n\t"
  131435. "lsr r7, r6, #16\n\t"
  131436. "lsl r6, r6, #16\n\t"
  131437. "adds r4, r4, r6\n\t"
  131438. "adcs r5, r5, r7\n\t"
  131439. "adc r3, r3, #0\n\t"
  131440. "lsr r6, r11, #16\n\t"
  131441. "lsr r7, r9, #16\n\t"
  131442. "mul r7, r6, r7\n\t"
  131443. "adds r5, r5, r7\n\t"
  131444. "adc r3, r3, #0\n\t"
  131445. "lsl r7, r9, #16\n\t"
  131446. "lsr r7, r7, #16\n\t"
  131447. "mul r6, r7, r6\n\t"
  131448. "lsr r7, r6, #16\n\t"
  131449. "lsl r6, r6, #16\n\t"
  131450. "adds r4, r4, r6\n\t"
  131451. "adcs r5, r5, r7\n\t"
  131452. "adc r3, r3, #0\n\t"
  131453. #else
  131454. "umull r6, r7, r11, r9\n\t"
  131455. "adds r4, r4, r6\n\t"
  131456. "adcs r5, r5, r7\n\t"
  131457. "adc r3, r3, #0\n\t"
  131458. #endif
  131459. /* A[10] * B[9] */
  131460. "ldr r8, [%[a], #40]\n\t"
  131461. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  131462. "lsl r6, r8, #16\n\t"
  131463. "lsl r7, r12, #16\n\t"
  131464. "lsr r6, r6, #16\n\t"
  131465. "lsr r7, r7, #16\n\t"
  131466. "mul r7, r6, r7\n\t"
  131467. "adds r4, r4, r7\n\t"
  131468. "adcs r5, r5, #0\n\t"
  131469. "adc r3, r3, #0\n\t"
  131470. "lsr r7, r12, #16\n\t"
  131471. "mul r6, r7, r6\n\t"
  131472. "lsr r7, r6, #16\n\t"
  131473. "lsl r6, r6, #16\n\t"
  131474. "adds r4, r4, r6\n\t"
  131475. "adcs r5, r5, r7\n\t"
  131476. "adc r3, r3, #0\n\t"
  131477. "lsr r6, r8, #16\n\t"
  131478. "lsr r7, r12, #16\n\t"
  131479. "mul r7, r6, r7\n\t"
  131480. "adds r5, r5, r7\n\t"
  131481. "adc r3, r3, #0\n\t"
  131482. "lsl r7, r12, #16\n\t"
  131483. "lsr r7, r7, #16\n\t"
  131484. "mul r6, r7, r6\n\t"
  131485. "lsr r7, r6, #16\n\t"
  131486. "lsl r6, r6, #16\n\t"
  131487. "adds r4, r4, r6\n\t"
  131488. "adcs r5, r5, r7\n\t"
  131489. "adc r3, r3, #0\n\t"
  131490. #else
  131491. "umull r6, r7, r8, r12\n\t"
  131492. "adds r4, r4, r6\n\t"
  131493. "adcs r5, r5, r7\n\t"
  131494. "adc r3, r3, #0\n\t"
  131495. #endif
  131496. /* A[11] * B[8] */
  131497. "ldr r8, [%[a], #44]\n\t"
  131498. "ldr r9, [%[b], #32]\n\t"
  131499. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  131500. "lsl r6, r8, #16\n\t"
  131501. "lsl r7, r9, #16\n\t"
  131502. "lsr r6, r6, #16\n\t"
  131503. "lsr r7, r7, #16\n\t"
  131504. "mul r7, r6, r7\n\t"
  131505. "adds r4, r4, r7\n\t"
  131506. "adcs r5, r5, #0\n\t"
  131507. "adc r3, r3, #0\n\t"
  131508. "lsr r7, r9, #16\n\t"
  131509. "mul r6, r7, r6\n\t"
  131510. "lsr r7, r6, #16\n\t"
  131511. "lsl r6, r6, #16\n\t"
  131512. "adds r4, r4, r6\n\t"
  131513. "adcs r5, r5, r7\n\t"
  131514. "adc r3, r3, #0\n\t"
  131515. "lsr r6, r8, #16\n\t"
  131516. "lsr r7, r9, #16\n\t"
  131517. "mul r7, r6, r7\n\t"
  131518. "adds r5, r5, r7\n\t"
  131519. "adc r3, r3, #0\n\t"
  131520. "lsl r7, r9, #16\n\t"
  131521. "lsr r7, r7, #16\n\t"
  131522. "mul r6, r7, r6\n\t"
  131523. "lsr r7, r6, #16\n\t"
  131524. "lsl r6, r6, #16\n\t"
  131525. "adds r4, r4, r6\n\t"
  131526. "adcs r5, r5, r7\n\t"
  131527. "adc r3, r3, #0\n\t"
  131528. #else
  131529. "umull r6, r7, r8, r9\n\t"
  131530. "adds r4, r4, r6\n\t"
  131531. "adcs r5, r5, r7\n\t"
  131532. "adc r3, r3, #0\n\t"
  131533. #endif
  131534. /* A[12] * B[7] */
  131535. "ldr r8, [%[a], #48]\n\t"
  131536. "ldr r9, [%[b], #28]\n\t"
  131537. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  131538. "lsl r6, r8, #16\n\t"
  131539. "lsl r7, r9, #16\n\t"
  131540. "lsr r6, r6, #16\n\t"
  131541. "lsr r7, r7, #16\n\t"
  131542. "mul r7, r6, r7\n\t"
  131543. "adds r4, r4, r7\n\t"
  131544. "adcs r5, r5, #0\n\t"
  131545. "adc r3, r3, #0\n\t"
  131546. "lsr r7, r9, #16\n\t"
  131547. "mul r6, r7, r6\n\t"
  131548. "lsr r7, r6, #16\n\t"
  131549. "lsl r6, r6, #16\n\t"
  131550. "adds r4, r4, r6\n\t"
  131551. "adcs r5, r5, r7\n\t"
  131552. "adc r3, r3, #0\n\t"
  131553. "lsr r6, r8, #16\n\t"
  131554. "lsr r7, r9, #16\n\t"
  131555. "mul r7, r6, r7\n\t"
  131556. "adds r5, r5, r7\n\t"
  131557. "adc r3, r3, #0\n\t"
  131558. "lsl r7, r9, #16\n\t"
  131559. "lsr r7, r7, #16\n\t"
  131560. "mul r6, r7, r6\n\t"
  131561. "lsr r7, r6, #16\n\t"
  131562. "lsl r6, r6, #16\n\t"
  131563. "adds r4, r4, r6\n\t"
  131564. "adcs r5, r5, r7\n\t"
  131565. "adc r3, r3, #0\n\t"
  131566. #else
  131567. "umull r6, r7, r8, r9\n\t"
  131568. "adds r4, r4, r6\n\t"
  131569. "adcs r5, r5, r7\n\t"
  131570. "adc r3, r3, #0\n\t"
  131571. #endif
  131572. /* A[13] * B[6] */
  131573. "ldr r8, [%[a], #52]\n\t"
  131574. "ldr r9, [%[b], #24]\n\t"
  131575. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  131576. "lsl r6, r8, #16\n\t"
  131577. "lsl r7, r9, #16\n\t"
  131578. "lsr r6, r6, #16\n\t"
  131579. "lsr r7, r7, #16\n\t"
  131580. "mul r7, r6, r7\n\t"
  131581. "adds r4, r4, r7\n\t"
  131582. "adcs r5, r5, #0\n\t"
  131583. "adc r3, r3, #0\n\t"
  131584. "lsr r7, r9, #16\n\t"
  131585. "mul r6, r7, r6\n\t"
  131586. "lsr r7, r6, #16\n\t"
  131587. "lsl r6, r6, #16\n\t"
  131588. "adds r4, r4, r6\n\t"
  131589. "adcs r5, r5, r7\n\t"
  131590. "adc r3, r3, #0\n\t"
  131591. "lsr r6, r8, #16\n\t"
  131592. "lsr r7, r9, #16\n\t"
  131593. "mul r7, r6, r7\n\t"
  131594. "adds r5, r5, r7\n\t"
  131595. "adc r3, r3, #0\n\t"
  131596. "lsl r7, r9, #16\n\t"
  131597. "lsr r7, r7, #16\n\t"
  131598. "mul r6, r7, r6\n\t"
  131599. "lsr r7, r6, #16\n\t"
  131600. "lsl r6, r6, #16\n\t"
  131601. "adds r4, r4, r6\n\t"
  131602. "adcs r5, r5, r7\n\t"
  131603. "adc r3, r3, #0\n\t"
  131604. #else
  131605. "umull r6, r7, r8, r9\n\t"
  131606. "adds r4, r4, r6\n\t"
  131607. "adcs r5, r5, r7\n\t"
  131608. "adc r3, r3, #0\n\t"
  131609. #endif
  131610. /* A[14] * B[5] */
  131611. "ldr r8, [%[a], #56]\n\t"
  131612. "ldr r9, [%[b], #20]\n\t"
  131613. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  131614. "lsl r6, r8, #16\n\t"
  131615. "lsl r7, r9, #16\n\t"
  131616. "lsr r6, r6, #16\n\t"
  131617. "lsr r7, r7, #16\n\t"
  131618. "mul r7, r6, r7\n\t"
  131619. "adds r4, r4, r7\n\t"
  131620. "adcs r5, r5, #0\n\t"
  131621. "adc r3, r3, #0\n\t"
  131622. "lsr r7, r9, #16\n\t"
  131623. "mul r6, r7, r6\n\t"
  131624. "lsr r7, r6, #16\n\t"
  131625. "lsl r6, r6, #16\n\t"
  131626. "adds r4, r4, r6\n\t"
  131627. "adcs r5, r5, r7\n\t"
  131628. "adc r3, r3, #0\n\t"
  131629. "lsr r6, r8, #16\n\t"
  131630. "lsr r7, r9, #16\n\t"
  131631. "mul r7, r6, r7\n\t"
  131632. "adds r5, r5, r7\n\t"
  131633. "adc r3, r3, #0\n\t"
  131634. "lsl r7, r9, #16\n\t"
  131635. "lsr r7, r7, #16\n\t"
  131636. "mul r6, r7, r6\n\t"
  131637. "lsr r7, r6, #16\n\t"
  131638. "lsl r6, r6, #16\n\t"
  131639. "adds r4, r4, r6\n\t"
  131640. "adcs r5, r5, r7\n\t"
  131641. "adc r3, r3, #0\n\t"
  131642. #else
  131643. "umull r6, r7, r8, r9\n\t"
  131644. "adds r4, r4, r6\n\t"
  131645. "adcs r5, r5, r7\n\t"
  131646. "adc r3, r3, #0\n\t"
  131647. #endif
  131648. /* A[15] * B[4] */
  131649. "ldr r8, [%[a], #60]\n\t"
  131650. "ldr r9, [%[b], #16]\n\t"
  131651. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  131652. "lsl r6, r8, #16\n\t"
  131653. "lsl r7, r9, #16\n\t"
  131654. "lsr r6, r6, #16\n\t"
  131655. "lsr r7, r7, #16\n\t"
  131656. "mul r7, r6, r7\n\t"
  131657. "adds r4, r4, r7\n\t"
  131658. "adcs r5, r5, #0\n\t"
  131659. "adc r3, r3, #0\n\t"
  131660. "lsr r7, r9, #16\n\t"
  131661. "mul r6, r7, r6\n\t"
  131662. "lsr r7, r6, #16\n\t"
  131663. "lsl r6, r6, #16\n\t"
  131664. "adds r4, r4, r6\n\t"
  131665. "adcs r5, r5, r7\n\t"
  131666. "adc r3, r3, #0\n\t"
  131667. "lsr r6, r8, #16\n\t"
  131668. "lsr r7, r9, #16\n\t"
  131669. "mul r7, r6, r7\n\t"
  131670. "adds r5, r5, r7\n\t"
  131671. "adc r3, r3, #0\n\t"
  131672. "lsl r7, r9, #16\n\t"
  131673. "lsr r7, r7, #16\n\t"
  131674. "mul r6, r7, r6\n\t"
  131675. "lsr r7, r6, #16\n\t"
  131676. "lsl r6, r6, #16\n\t"
  131677. "adds r4, r4, r6\n\t"
  131678. "adcs r5, r5, r7\n\t"
  131679. "adc r3, r3, #0\n\t"
  131680. #else
  131681. "umull r6, r7, r8, r9\n\t"
  131682. "adds r4, r4, r6\n\t"
  131683. "adcs r5, r5, r7\n\t"
  131684. "adc r3, r3, #0\n\t"
  131685. #endif
  131686. "str r4, [%[r], #76]\n\t"
  131687. /* A[15] * B[5] */
  131688. "ldr r9, [%[b], #20]\n\t"
  131689. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  131690. "lsl r6, r8, #16\n\t"
  131691. "lsl r7, r9, #16\n\t"
  131692. "lsr r6, r6, #16\n\t"
  131693. "lsr r7, r7, #16\n\t"
  131694. "mul r7, r6, r7\n\t"
  131695. "adds r5, r5, r7\n\t"
  131696. "adcs r3, r3, #0\n\t"
  131697. "mov r4, #0\n\t"
  131698. "adc r4, r4, #0\n\t"
  131699. "lsr r7, r9, #16\n\t"
  131700. "mul r6, r7, r6\n\t"
  131701. "lsr r7, r6, #16\n\t"
  131702. "lsl r6, r6, #16\n\t"
  131703. "adds r5, r5, r6\n\t"
  131704. "adcs r3, r3, r7\n\t"
  131705. "adc r4, r4, #0\n\t"
  131706. "lsr r6, r8, #16\n\t"
  131707. "lsr r7, r9, #16\n\t"
  131708. "mul r7, r6, r7\n\t"
  131709. "adds r3, r3, r7\n\t"
  131710. "adc r4, r4, #0\n\t"
  131711. "lsl r7, r9, #16\n\t"
  131712. "lsr r7, r7, #16\n\t"
  131713. "mul r6, r7, r6\n\t"
  131714. "lsr r7, r6, #16\n\t"
  131715. "lsl r6, r6, #16\n\t"
  131716. "adds r5, r5, r6\n\t"
  131717. "adcs r3, r3, r7\n\t"
  131718. "adc r4, r4, #0\n\t"
  131719. #else
  131720. "umull r6, r7, r8, r9\n\t"
  131721. "adds r5, r5, r6\n\t"
  131722. "adcs r3, r3, r7\n\t"
  131723. "mov r4, #0\n\t"
  131724. "adc r4, r4, #0\n\t"
  131725. #endif
  131726. /* A[14] * B[6] */
  131727. "ldr r8, [%[a], #56]\n\t"
  131728. "ldr r9, [%[b], #24]\n\t"
  131729. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  131730. "lsl r6, r8, #16\n\t"
  131731. "lsl r7, r9, #16\n\t"
  131732. "lsr r6, r6, #16\n\t"
  131733. "lsr r7, r7, #16\n\t"
  131734. "mul r7, r6, r7\n\t"
  131735. "adds r5, r5, r7\n\t"
  131736. "adcs r3, r3, #0\n\t"
  131737. "adc r4, r4, #0\n\t"
  131738. "lsr r7, r9, #16\n\t"
  131739. "mul r6, r7, r6\n\t"
  131740. "lsr r7, r6, #16\n\t"
  131741. "lsl r6, r6, #16\n\t"
  131742. "adds r5, r5, r6\n\t"
  131743. "adcs r3, r3, r7\n\t"
  131744. "adc r4, r4, #0\n\t"
  131745. "lsr r6, r8, #16\n\t"
  131746. "lsr r7, r9, #16\n\t"
  131747. "mul r7, r6, r7\n\t"
  131748. "adds r3, r3, r7\n\t"
  131749. "adc r4, r4, #0\n\t"
  131750. "lsl r7, r9, #16\n\t"
  131751. "lsr r7, r7, #16\n\t"
  131752. "mul r6, r7, r6\n\t"
  131753. "lsr r7, r6, #16\n\t"
  131754. "lsl r6, r6, #16\n\t"
  131755. "adds r5, r5, r6\n\t"
  131756. "adcs r3, r3, r7\n\t"
  131757. "adc r4, r4, #0\n\t"
  131758. #else
  131759. "umull r6, r7, r8, r9\n\t"
  131760. "adds r5, r5, r6\n\t"
  131761. "adcs r3, r3, r7\n\t"
  131762. "adc r4, r4, #0\n\t"
  131763. #endif
  131764. /* A[13] * B[7] */
  131765. "ldr r8, [%[a], #52]\n\t"
  131766. "ldr r9, [%[b], #28]\n\t"
  131767. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  131768. "lsl r6, r8, #16\n\t"
  131769. "lsl r7, r9, #16\n\t"
  131770. "lsr r6, r6, #16\n\t"
  131771. "lsr r7, r7, #16\n\t"
  131772. "mul r7, r6, r7\n\t"
  131773. "adds r5, r5, r7\n\t"
  131774. "adcs r3, r3, #0\n\t"
  131775. "adc r4, r4, #0\n\t"
  131776. "lsr r7, r9, #16\n\t"
  131777. "mul r6, r7, r6\n\t"
  131778. "lsr r7, r6, #16\n\t"
  131779. "lsl r6, r6, #16\n\t"
  131780. "adds r5, r5, r6\n\t"
  131781. "adcs r3, r3, r7\n\t"
  131782. "adc r4, r4, #0\n\t"
  131783. "lsr r6, r8, #16\n\t"
  131784. "lsr r7, r9, #16\n\t"
  131785. "mul r7, r6, r7\n\t"
  131786. "adds r3, r3, r7\n\t"
  131787. "adc r4, r4, #0\n\t"
  131788. "lsl r7, r9, #16\n\t"
  131789. "lsr r7, r7, #16\n\t"
  131790. "mul r6, r7, r6\n\t"
  131791. "lsr r7, r6, #16\n\t"
  131792. "lsl r6, r6, #16\n\t"
  131793. "adds r5, r5, r6\n\t"
  131794. "adcs r3, r3, r7\n\t"
  131795. "adc r4, r4, #0\n\t"
  131796. #else
  131797. "umull r6, r7, r8, r9\n\t"
  131798. "adds r5, r5, r6\n\t"
  131799. "adcs r3, r3, r7\n\t"
  131800. "adc r4, r4, #0\n\t"
  131801. #endif
  131802. /* A[12] * B[8] */
  131803. "ldr r8, [%[a], #48]\n\t"
  131804. "ldr r9, [%[b], #32]\n\t"
  131805. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  131806. "lsl r6, r8, #16\n\t"
  131807. "lsl r7, r9, #16\n\t"
  131808. "lsr r6, r6, #16\n\t"
  131809. "lsr r7, r7, #16\n\t"
  131810. "mul r7, r6, r7\n\t"
  131811. "adds r5, r5, r7\n\t"
  131812. "adcs r3, r3, #0\n\t"
  131813. "adc r4, r4, #0\n\t"
  131814. "lsr r7, r9, #16\n\t"
  131815. "mul r6, r7, r6\n\t"
  131816. "lsr r7, r6, #16\n\t"
  131817. "lsl r6, r6, #16\n\t"
  131818. "adds r5, r5, r6\n\t"
  131819. "adcs r3, r3, r7\n\t"
  131820. "adc r4, r4, #0\n\t"
  131821. "lsr r6, r8, #16\n\t"
  131822. "lsr r7, r9, #16\n\t"
  131823. "mul r7, r6, r7\n\t"
  131824. "adds r3, r3, r7\n\t"
  131825. "adc r4, r4, #0\n\t"
  131826. "lsl r7, r9, #16\n\t"
  131827. "lsr r7, r7, #16\n\t"
  131828. "mul r6, r7, r6\n\t"
  131829. "lsr r7, r6, #16\n\t"
  131830. "lsl r6, r6, #16\n\t"
  131831. "adds r5, r5, r6\n\t"
  131832. "adcs r3, r3, r7\n\t"
  131833. "adc r4, r4, #0\n\t"
  131834. #else
  131835. "umull r6, r7, r8, r9\n\t"
  131836. "adds r5, r5, r6\n\t"
  131837. "adcs r3, r3, r7\n\t"
  131838. "adc r4, r4, #0\n\t"
  131839. #endif
  131840. /* A[11] * B[9] */
  131841. "ldr r8, [%[a], #44]\n\t"
  131842. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  131843. "lsl r6, r8, #16\n\t"
  131844. "lsl r7, r12, #16\n\t"
  131845. "lsr r6, r6, #16\n\t"
  131846. "lsr r7, r7, #16\n\t"
  131847. "mul r7, r6, r7\n\t"
  131848. "adds r5, r5, r7\n\t"
  131849. "adcs r3, r3, #0\n\t"
  131850. "adc r4, r4, #0\n\t"
  131851. "lsr r7, r12, #16\n\t"
  131852. "mul r6, r7, r6\n\t"
  131853. "lsr r7, r6, #16\n\t"
  131854. "lsl r6, r6, #16\n\t"
  131855. "adds r5, r5, r6\n\t"
  131856. "adcs r3, r3, r7\n\t"
  131857. "adc r4, r4, #0\n\t"
  131858. "lsr r6, r8, #16\n\t"
  131859. "lsr r7, r12, #16\n\t"
  131860. "mul r7, r6, r7\n\t"
  131861. "adds r3, r3, r7\n\t"
  131862. "adc r4, r4, #0\n\t"
  131863. "lsl r7, r12, #16\n\t"
  131864. "lsr r7, r7, #16\n\t"
  131865. "mul r6, r7, r6\n\t"
  131866. "lsr r7, r6, #16\n\t"
  131867. "lsl r6, r6, #16\n\t"
  131868. "adds r5, r5, r6\n\t"
  131869. "adcs r3, r3, r7\n\t"
  131870. "adc r4, r4, #0\n\t"
  131871. #else
  131872. "umull r6, r7, r8, r12\n\t"
  131873. "adds r5, r5, r6\n\t"
  131874. "adcs r3, r3, r7\n\t"
  131875. "adc r4, r4, #0\n\t"
  131876. #endif
  131877. /* A[10] * B[10] */
  131878. "ldr r11, [%[a], #40]\n\t"
  131879. "ldr r12, [%[b], #40]\n\t"
  131880. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  131881. "lsl r6, r11, #16\n\t"
  131882. "lsl r7, r12, #16\n\t"
  131883. "lsr r6, r6, #16\n\t"
  131884. "lsr r7, r7, #16\n\t"
  131885. "mul r7, r6, r7\n\t"
  131886. "adds r5, r5, r7\n\t"
  131887. "adcs r3, r3, #0\n\t"
  131888. "adc r4, r4, #0\n\t"
  131889. "lsr r7, r12, #16\n\t"
  131890. "mul r6, r7, r6\n\t"
  131891. "lsr r7, r6, #16\n\t"
  131892. "lsl r6, r6, #16\n\t"
  131893. "adds r5, r5, r6\n\t"
  131894. "adcs r3, r3, r7\n\t"
  131895. "adc r4, r4, #0\n\t"
  131896. "lsr r6, r11, #16\n\t"
  131897. "lsr r7, r12, #16\n\t"
  131898. "mul r7, r6, r7\n\t"
  131899. "adds r3, r3, r7\n\t"
  131900. "adc r4, r4, #0\n\t"
  131901. "lsl r7, r12, #16\n\t"
  131902. "lsr r7, r7, #16\n\t"
  131903. "mul r6, r7, r6\n\t"
  131904. "lsr r7, r6, #16\n\t"
  131905. "lsl r6, r6, #16\n\t"
  131906. "adds r5, r5, r6\n\t"
  131907. "adcs r3, r3, r7\n\t"
  131908. "adc r4, r4, #0\n\t"
  131909. #else
  131910. "umull r6, r7, r11, r12\n\t"
  131911. "adds r5, r5, r6\n\t"
  131912. "adcs r3, r3, r7\n\t"
  131913. "adc r4, r4, #0\n\t"
  131914. #endif
  131915. /* A[9] * B[11] */
  131916. "ldr r8, [%[a], #36]\n\t"
  131917. "ldr r9, [%[b], #44]\n\t"
  131918. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  131919. "lsl r6, r8, #16\n\t"
  131920. "lsl r7, r9, #16\n\t"
  131921. "lsr r6, r6, #16\n\t"
  131922. "lsr r7, r7, #16\n\t"
  131923. "mul r7, r6, r7\n\t"
  131924. "adds r5, r5, r7\n\t"
  131925. "adcs r3, r3, #0\n\t"
  131926. "adc r4, r4, #0\n\t"
  131927. "lsr r7, r9, #16\n\t"
  131928. "mul r6, r7, r6\n\t"
  131929. "lsr r7, r6, #16\n\t"
  131930. "lsl r6, r6, #16\n\t"
  131931. "adds r5, r5, r6\n\t"
  131932. "adcs r3, r3, r7\n\t"
  131933. "adc r4, r4, #0\n\t"
  131934. "lsr r6, r8, #16\n\t"
  131935. "lsr r7, r9, #16\n\t"
  131936. "mul r7, r6, r7\n\t"
  131937. "adds r3, r3, r7\n\t"
  131938. "adc r4, r4, #0\n\t"
  131939. "lsl r7, r9, #16\n\t"
  131940. "lsr r7, r7, #16\n\t"
  131941. "mul r6, r7, r6\n\t"
  131942. "lsr r7, r6, #16\n\t"
  131943. "lsl r6, r6, #16\n\t"
  131944. "adds r5, r5, r6\n\t"
  131945. "adcs r3, r3, r7\n\t"
  131946. "adc r4, r4, #0\n\t"
  131947. #else
  131948. "umull r6, r7, r8, r9\n\t"
  131949. "adds r5, r5, r6\n\t"
  131950. "adcs r3, r3, r7\n\t"
  131951. "adc r4, r4, #0\n\t"
  131952. #endif
  131953. /* A[8] * B[12] */
  131954. "ldr r8, [%[a], #32]\n\t"
  131955. "ldr r9, [%[b], #48]\n\t"
  131956. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  131957. "lsl r6, r8, #16\n\t"
  131958. "lsl r7, r9, #16\n\t"
  131959. "lsr r6, r6, #16\n\t"
  131960. "lsr r7, r7, #16\n\t"
  131961. "mul r7, r6, r7\n\t"
  131962. "adds r5, r5, r7\n\t"
  131963. "adcs r3, r3, #0\n\t"
  131964. "adc r4, r4, #0\n\t"
  131965. "lsr r7, r9, #16\n\t"
  131966. "mul r6, r7, r6\n\t"
  131967. "lsr r7, r6, #16\n\t"
  131968. "lsl r6, r6, #16\n\t"
  131969. "adds r5, r5, r6\n\t"
  131970. "adcs r3, r3, r7\n\t"
  131971. "adc r4, r4, #0\n\t"
  131972. "lsr r6, r8, #16\n\t"
  131973. "lsr r7, r9, #16\n\t"
  131974. "mul r7, r6, r7\n\t"
  131975. "adds r3, r3, r7\n\t"
  131976. "adc r4, r4, #0\n\t"
  131977. "lsl r7, r9, #16\n\t"
  131978. "lsr r7, r7, #16\n\t"
  131979. "mul r6, r7, r6\n\t"
  131980. "lsr r7, r6, #16\n\t"
  131981. "lsl r6, r6, #16\n\t"
  131982. "adds r5, r5, r6\n\t"
  131983. "adcs r3, r3, r7\n\t"
  131984. "adc r4, r4, #0\n\t"
  131985. #else
  131986. "umull r6, r7, r8, r9\n\t"
  131987. "adds r5, r5, r6\n\t"
  131988. "adcs r3, r3, r7\n\t"
  131989. "adc r4, r4, #0\n\t"
  131990. #endif
  131991. /* A[7] * B[13] */
  131992. "ldr r8, [%[a], #28]\n\t"
  131993. "ldr r9, [%[b], #52]\n\t"
  131994. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  131995. "lsl r6, r8, #16\n\t"
  131996. "lsl r7, r9, #16\n\t"
  131997. "lsr r6, r6, #16\n\t"
  131998. "lsr r7, r7, #16\n\t"
  131999. "mul r7, r6, r7\n\t"
  132000. "adds r5, r5, r7\n\t"
  132001. "adcs r3, r3, #0\n\t"
  132002. "adc r4, r4, #0\n\t"
  132003. "lsr r7, r9, #16\n\t"
  132004. "mul r6, r7, r6\n\t"
  132005. "lsr r7, r6, #16\n\t"
  132006. "lsl r6, r6, #16\n\t"
  132007. "adds r5, r5, r6\n\t"
  132008. "adcs r3, r3, r7\n\t"
  132009. "adc r4, r4, #0\n\t"
  132010. "lsr r6, r8, #16\n\t"
  132011. "lsr r7, r9, #16\n\t"
  132012. "mul r7, r6, r7\n\t"
  132013. "adds r3, r3, r7\n\t"
  132014. "adc r4, r4, #0\n\t"
  132015. "lsl r7, r9, #16\n\t"
  132016. "lsr r7, r7, #16\n\t"
  132017. "mul r6, r7, r6\n\t"
  132018. "lsr r7, r6, #16\n\t"
  132019. "lsl r6, r6, #16\n\t"
  132020. "adds r5, r5, r6\n\t"
  132021. "adcs r3, r3, r7\n\t"
  132022. "adc r4, r4, #0\n\t"
  132023. #else
  132024. "umull r6, r7, r8, r9\n\t"
  132025. "adds r5, r5, r6\n\t"
  132026. "adcs r3, r3, r7\n\t"
  132027. "adc r4, r4, #0\n\t"
  132028. #endif
  132029. /* A[6] * B[14] */
  132030. "ldr r8, [%[a], #24]\n\t"
  132031. "ldr r9, [%[b], #56]\n\t"
  132032. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  132033. "lsl r6, r8, #16\n\t"
  132034. "lsl r7, r9, #16\n\t"
  132035. "lsr r6, r6, #16\n\t"
  132036. "lsr r7, r7, #16\n\t"
  132037. "mul r7, r6, r7\n\t"
  132038. "adds r5, r5, r7\n\t"
  132039. "adcs r3, r3, #0\n\t"
  132040. "adc r4, r4, #0\n\t"
  132041. "lsr r7, r9, #16\n\t"
  132042. "mul r6, r7, r6\n\t"
  132043. "lsr r7, r6, #16\n\t"
  132044. "lsl r6, r6, #16\n\t"
  132045. "adds r5, r5, r6\n\t"
  132046. "adcs r3, r3, r7\n\t"
  132047. "adc r4, r4, #0\n\t"
  132048. "lsr r6, r8, #16\n\t"
  132049. "lsr r7, r9, #16\n\t"
  132050. "mul r7, r6, r7\n\t"
  132051. "adds r3, r3, r7\n\t"
  132052. "adc r4, r4, #0\n\t"
  132053. "lsl r7, r9, #16\n\t"
  132054. "lsr r7, r7, #16\n\t"
  132055. "mul r6, r7, r6\n\t"
  132056. "lsr r7, r6, #16\n\t"
  132057. "lsl r6, r6, #16\n\t"
  132058. "adds r5, r5, r6\n\t"
  132059. "adcs r3, r3, r7\n\t"
  132060. "adc r4, r4, #0\n\t"
  132061. #else
  132062. "umull r6, r7, r8, r9\n\t"
  132063. "adds r5, r5, r6\n\t"
  132064. "adcs r3, r3, r7\n\t"
  132065. "adc r4, r4, #0\n\t"
  132066. #endif
  132067. /* A[5] * B[15] */
  132068. "ldr r8, [%[a], #20]\n\t"
  132069. "ldr r9, [%[b], #60]\n\t"
  132070. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  132071. "lsl r6, r8, #16\n\t"
  132072. "lsl r7, r9, #16\n\t"
  132073. "lsr r6, r6, #16\n\t"
  132074. "lsr r7, r7, #16\n\t"
  132075. "mul r7, r6, r7\n\t"
  132076. "adds r5, r5, r7\n\t"
  132077. "adcs r3, r3, #0\n\t"
  132078. "adc r4, r4, #0\n\t"
  132079. "lsr r7, r9, #16\n\t"
  132080. "mul r6, r7, r6\n\t"
  132081. "lsr r7, r6, #16\n\t"
  132082. "lsl r6, r6, #16\n\t"
  132083. "adds r5, r5, r6\n\t"
  132084. "adcs r3, r3, r7\n\t"
  132085. "adc r4, r4, #0\n\t"
  132086. "lsr r6, r8, #16\n\t"
  132087. "lsr r7, r9, #16\n\t"
  132088. "mul r7, r6, r7\n\t"
  132089. "adds r3, r3, r7\n\t"
  132090. "adc r4, r4, #0\n\t"
  132091. "lsl r7, r9, #16\n\t"
  132092. "lsr r7, r7, #16\n\t"
  132093. "mul r6, r7, r6\n\t"
  132094. "lsr r7, r6, #16\n\t"
  132095. "lsl r6, r6, #16\n\t"
  132096. "adds r5, r5, r6\n\t"
  132097. "adcs r3, r3, r7\n\t"
  132098. "adc r4, r4, #0\n\t"
  132099. #else
  132100. "umull r6, r7, r8, r9\n\t"
  132101. "adds r5, r5, r6\n\t"
  132102. "adcs r3, r3, r7\n\t"
  132103. "adc r4, r4, #0\n\t"
  132104. #endif
  132105. "str r5, [%[r], #80]\n\t"
  132106. /* A[6] * B[15] */
  132107. "ldr r8, [%[a], #24]\n\t"
  132108. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  132109. "lsl r6, r8, #16\n\t"
  132110. "lsl r7, r9, #16\n\t"
  132111. "lsr r6, r6, #16\n\t"
  132112. "lsr r7, r7, #16\n\t"
  132113. "mul r7, r6, r7\n\t"
  132114. "adds r3, r3, r7\n\t"
  132115. "adcs r4, r4, #0\n\t"
  132116. "mov r5, #0\n\t"
  132117. "adc r5, r5, #0\n\t"
  132118. "lsr r7, r9, #16\n\t"
  132119. "mul r6, r7, r6\n\t"
  132120. "lsr r7, r6, #16\n\t"
  132121. "lsl r6, r6, #16\n\t"
  132122. "adds r3, r3, r6\n\t"
  132123. "adcs r4, r4, r7\n\t"
  132124. "adc r5, r5, #0\n\t"
  132125. "lsr r6, r8, #16\n\t"
  132126. "lsr r7, r9, #16\n\t"
  132127. "mul r7, r6, r7\n\t"
  132128. "adds r4, r4, r7\n\t"
  132129. "adc r5, r5, #0\n\t"
  132130. "lsl r7, r9, #16\n\t"
  132131. "lsr r7, r7, #16\n\t"
  132132. "mul r6, r7, r6\n\t"
  132133. "lsr r7, r6, #16\n\t"
  132134. "lsl r6, r6, #16\n\t"
  132135. "adds r3, r3, r6\n\t"
  132136. "adcs r4, r4, r7\n\t"
  132137. "adc r5, r5, #0\n\t"
  132138. #else
  132139. "umull r6, r7, r8, r9\n\t"
  132140. "adds r3, r3, r6\n\t"
  132141. "adcs r4, r4, r7\n\t"
  132142. "mov r5, #0\n\t"
  132143. "adc r5, r5, #0\n\t"
  132144. #endif
  132145. /* A[7] * B[14] */
  132146. "ldr r8, [%[a], #28]\n\t"
  132147. "ldr r9, [%[b], #56]\n\t"
  132148. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  132149. "lsl r6, r8, #16\n\t"
  132150. "lsl r7, r9, #16\n\t"
  132151. "lsr r6, r6, #16\n\t"
  132152. "lsr r7, r7, #16\n\t"
  132153. "mul r7, r6, r7\n\t"
  132154. "adds r3, r3, r7\n\t"
  132155. "adcs r4, r4, #0\n\t"
  132156. "adc r5, r5, #0\n\t"
  132157. "lsr r7, r9, #16\n\t"
  132158. "mul r6, r7, r6\n\t"
  132159. "lsr r7, r6, #16\n\t"
  132160. "lsl r6, r6, #16\n\t"
  132161. "adds r3, r3, r6\n\t"
  132162. "adcs r4, r4, r7\n\t"
  132163. "adc r5, r5, #0\n\t"
  132164. "lsr r6, r8, #16\n\t"
  132165. "lsr r7, r9, #16\n\t"
  132166. "mul r7, r6, r7\n\t"
  132167. "adds r4, r4, r7\n\t"
  132168. "adc r5, r5, #0\n\t"
  132169. "lsl r7, r9, #16\n\t"
  132170. "lsr r7, r7, #16\n\t"
  132171. "mul r6, r7, r6\n\t"
  132172. "lsr r7, r6, #16\n\t"
  132173. "lsl r6, r6, #16\n\t"
  132174. "adds r3, r3, r6\n\t"
  132175. "adcs r4, r4, r7\n\t"
  132176. "adc r5, r5, #0\n\t"
  132177. #else
  132178. "umull r6, r7, r8, r9\n\t"
  132179. "adds r3, r3, r6\n\t"
  132180. "adcs r4, r4, r7\n\t"
  132181. "adc r5, r5, #0\n\t"
  132182. #endif
  132183. /* A[8] * B[13] */
  132184. "ldr r8, [%[a], #32]\n\t"
  132185. "ldr r9, [%[b], #52]\n\t"
  132186. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  132187. "lsl r6, r8, #16\n\t"
  132188. "lsl r7, r9, #16\n\t"
  132189. "lsr r6, r6, #16\n\t"
  132190. "lsr r7, r7, #16\n\t"
  132191. "mul r7, r6, r7\n\t"
  132192. "adds r3, r3, r7\n\t"
  132193. "adcs r4, r4, #0\n\t"
  132194. "adc r5, r5, #0\n\t"
  132195. "lsr r7, r9, #16\n\t"
  132196. "mul r6, r7, r6\n\t"
  132197. "lsr r7, r6, #16\n\t"
  132198. "lsl r6, r6, #16\n\t"
  132199. "adds r3, r3, r6\n\t"
  132200. "adcs r4, r4, r7\n\t"
  132201. "adc r5, r5, #0\n\t"
  132202. "lsr r6, r8, #16\n\t"
  132203. "lsr r7, r9, #16\n\t"
  132204. "mul r7, r6, r7\n\t"
  132205. "adds r4, r4, r7\n\t"
  132206. "adc r5, r5, #0\n\t"
  132207. "lsl r7, r9, #16\n\t"
  132208. "lsr r7, r7, #16\n\t"
  132209. "mul r6, r7, r6\n\t"
  132210. "lsr r7, r6, #16\n\t"
  132211. "lsl r6, r6, #16\n\t"
  132212. "adds r3, r3, r6\n\t"
  132213. "adcs r4, r4, r7\n\t"
  132214. "adc r5, r5, #0\n\t"
  132215. #else
  132216. "umull r6, r7, r8, r9\n\t"
  132217. "adds r3, r3, r6\n\t"
  132218. "adcs r4, r4, r7\n\t"
  132219. "adc r5, r5, #0\n\t"
  132220. #endif
  132221. /* A[9] * B[12] */
  132222. "ldr r8, [%[a], #36]\n\t"
  132223. "ldr r9, [%[b], #48]\n\t"
  132224. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  132225. "lsl r6, r8, #16\n\t"
  132226. "lsl r7, r9, #16\n\t"
  132227. "lsr r6, r6, #16\n\t"
  132228. "lsr r7, r7, #16\n\t"
  132229. "mul r7, r6, r7\n\t"
  132230. "adds r3, r3, r7\n\t"
  132231. "adcs r4, r4, #0\n\t"
  132232. "adc r5, r5, #0\n\t"
  132233. "lsr r7, r9, #16\n\t"
  132234. "mul r6, r7, r6\n\t"
  132235. "lsr r7, r6, #16\n\t"
  132236. "lsl r6, r6, #16\n\t"
  132237. "adds r3, r3, r6\n\t"
  132238. "adcs r4, r4, r7\n\t"
  132239. "adc r5, r5, #0\n\t"
  132240. "lsr r6, r8, #16\n\t"
  132241. "lsr r7, r9, #16\n\t"
  132242. "mul r7, r6, r7\n\t"
  132243. "adds r4, r4, r7\n\t"
  132244. "adc r5, r5, #0\n\t"
  132245. "lsl r7, r9, #16\n\t"
  132246. "lsr r7, r7, #16\n\t"
  132247. "mul r6, r7, r6\n\t"
  132248. "lsr r7, r6, #16\n\t"
  132249. "lsl r6, r6, #16\n\t"
  132250. "adds r3, r3, r6\n\t"
  132251. "adcs r4, r4, r7\n\t"
  132252. "adc r5, r5, #0\n\t"
  132253. #else
  132254. "umull r6, r7, r8, r9\n\t"
  132255. "adds r3, r3, r6\n\t"
  132256. "adcs r4, r4, r7\n\t"
  132257. "adc r5, r5, #0\n\t"
  132258. #endif
  132259. /* A[10] * B[11] */
  132260. "ldr r9, [%[b], #44]\n\t"
  132261. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  132262. "lsl r6, r11, #16\n\t"
  132263. "lsl r7, r9, #16\n\t"
  132264. "lsr r6, r6, #16\n\t"
  132265. "lsr r7, r7, #16\n\t"
  132266. "mul r7, r6, r7\n\t"
  132267. "adds r3, r3, r7\n\t"
  132268. "adcs r4, r4, #0\n\t"
  132269. "adc r5, r5, #0\n\t"
  132270. "lsr r7, r9, #16\n\t"
  132271. "mul r6, r7, r6\n\t"
  132272. "lsr r7, r6, #16\n\t"
  132273. "lsl r6, r6, #16\n\t"
  132274. "adds r3, r3, r6\n\t"
  132275. "adcs r4, r4, r7\n\t"
  132276. "adc r5, r5, #0\n\t"
  132277. "lsr r6, r11, #16\n\t"
  132278. "lsr r7, r9, #16\n\t"
  132279. "mul r7, r6, r7\n\t"
  132280. "adds r4, r4, r7\n\t"
  132281. "adc r5, r5, #0\n\t"
  132282. "lsl r7, r9, #16\n\t"
  132283. "lsr r7, r7, #16\n\t"
  132284. "mul r6, r7, r6\n\t"
  132285. "lsr r7, r6, #16\n\t"
  132286. "lsl r6, r6, #16\n\t"
  132287. "adds r3, r3, r6\n\t"
  132288. "adcs r4, r4, r7\n\t"
  132289. "adc r5, r5, #0\n\t"
  132290. #else
  132291. "umull r6, r7, r11, r9\n\t"
  132292. "adds r3, r3, r6\n\t"
  132293. "adcs r4, r4, r7\n\t"
  132294. "adc r5, r5, #0\n\t"
  132295. #endif
  132296. /* A[11] * B[10] */
  132297. "ldr r8, [%[a], #44]\n\t"
  132298. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  132299. "lsl r6, r8, #16\n\t"
  132300. "lsl r7, r12, #16\n\t"
  132301. "lsr r6, r6, #16\n\t"
  132302. "lsr r7, r7, #16\n\t"
  132303. "mul r7, r6, r7\n\t"
  132304. "adds r3, r3, r7\n\t"
  132305. "adcs r4, r4, #0\n\t"
  132306. "adc r5, r5, #0\n\t"
  132307. "lsr r7, r12, #16\n\t"
  132308. "mul r6, r7, r6\n\t"
  132309. "lsr r7, r6, #16\n\t"
  132310. "lsl r6, r6, #16\n\t"
  132311. "adds r3, r3, r6\n\t"
  132312. "adcs r4, r4, r7\n\t"
  132313. "adc r5, r5, #0\n\t"
  132314. "lsr r6, r8, #16\n\t"
  132315. "lsr r7, r12, #16\n\t"
  132316. "mul r7, r6, r7\n\t"
  132317. "adds r4, r4, r7\n\t"
  132318. "adc r5, r5, #0\n\t"
  132319. "lsl r7, r12, #16\n\t"
  132320. "lsr r7, r7, #16\n\t"
  132321. "mul r6, r7, r6\n\t"
  132322. "lsr r7, r6, #16\n\t"
  132323. "lsl r6, r6, #16\n\t"
  132324. "adds r3, r3, r6\n\t"
  132325. "adcs r4, r4, r7\n\t"
  132326. "adc r5, r5, #0\n\t"
  132327. #else
  132328. "umull r6, r7, r8, r12\n\t"
  132329. "adds r3, r3, r6\n\t"
  132330. "adcs r4, r4, r7\n\t"
  132331. "adc r5, r5, #0\n\t"
  132332. #endif
  132333. /* A[12] * B[9] */
  132334. "ldr r8, [%[a], #48]\n\t"
  132335. "ldr r9, [%[b], #36]\n\t"
  132336. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  132337. "lsl r6, r8, #16\n\t"
  132338. "lsl r7, r9, #16\n\t"
  132339. "lsr r6, r6, #16\n\t"
  132340. "lsr r7, r7, #16\n\t"
  132341. "mul r7, r6, r7\n\t"
  132342. "adds r3, r3, r7\n\t"
  132343. "adcs r4, r4, #0\n\t"
  132344. "adc r5, r5, #0\n\t"
  132345. "lsr r7, r9, #16\n\t"
  132346. "mul r6, r7, r6\n\t"
  132347. "lsr r7, r6, #16\n\t"
  132348. "lsl r6, r6, #16\n\t"
  132349. "adds r3, r3, r6\n\t"
  132350. "adcs r4, r4, r7\n\t"
  132351. "adc r5, r5, #0\n\t"
  132352. "lsr r6, r8, #16\n\t"
  132353. "lsr r7, r9, #16\n\t"
  132354. "mul r7, r6, r7\n\t"
  132355. "adds r4, r4, r7\n\t"
  132356. "adc r5, r5, #0\n\t"
  132357. "lsl r7, r9, #16\n\t"
  132358. "lsr r7, r7, #16\n\t"
  132359. "mul r6, r7, r6\n\t"
  132360. "lsr r7, r6, #16\n\t"
  132361. "lsl r6, r6, #16\n\t"
  132362. "adds r3, r3, r6\n\t"
  132363. "adcs r4, r4, r7\n\t"
  132364. "adc r5, r5, #0\n\t"
  132365. #else
  132366. "umull r6, r7, r8, r9\n\t"
  132367. "adds r3, r3, r6\n\t"
  132368. "adcs r4, r4, r7\n\t"
  132369. "adc r5, r5, #0\n\t"
  132370. #endif
  132371. /* A[13] * B[8] */
  132372. "ldr r8, [%[a], #52]\n\t"
  132373. "ldr r9, [%[b], #32]\n\t"
  132374. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  132375. "lsl r6, r8, #16\n\t"
  132376. "lsl r7, r9, #16\n\t"
  132377. "lsr r6, r6, #16\n\t"
  132378. "lsr r7, r7, #16\n\t"
  132379. "mul r7, r6, r7\n\t"
  132380. "adds r3, r3, r7\n\t"
  132381. "adcs r4, r4, #0\n\t"
  132382. "adc r5, r5, #0\n\t"
  132383. "lsr r7, r9, #16\n\t"
  132384. "mul r6, r7, r6\n\t"
  132385. "lsr r7, r6, #16\n\t"
  132386. "lsl r6, r6, #16\n\t"
  132387. "adds r3, r3, r6\n\t"
  132388. "adcs r4, r4, r7\n\t"
  132389. "adc r5, r5, #0\n\t"
  132390. "lsr r6, r8, #16\n\t"
  132391. "lsr r7, r9, #16\n\t"
  132392. "mul r7, r6, r7\n\t"
  132393. "adds r4, r4, r7\n\t"
  132394. "adc r5, r5, #0\n\t"
  132395. "lsl r7, r9, #16\n\t"
  132396. "lsr r7, r7, #16\n\t"
  132397. "mul r6, r7, r6\n\t"
  132398. "lsr r7, r6, #16\n\t"
  132399. "lsl r6, r6, #16\n\t"
  132400. "adds r3, r3, r6\n\t"
  132401. "adcs r4, r4, r7\n\t"
  132402. "adc r5, r5, #0\n\t"
  132403. #else
  132404. "umull r6, r7, r8, r9\n\t"
  132405. "adds r3, r3, r6\n\t"
  132406. "adcs r4, r4, r7\n\t"
  132407. "adc r5, r5, #0\n\t"
  132408. #endif
  132409. /* A[14] * B[7] */
  132410. "ldr r8, [%[a], #56]\n\t"
  132411. "ldr r9, [%[b], #28]\n\t"
  132412. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  132413. "lsl r6, r8, #16\n\t"
  132414. "lsl r7, r9, #16\n\t"
  132415. "lsr r6, r6, #16\n\t"
  132416. "lsr r7, r7, #16\n\t"
  132417. "mul r7, r6, r7\n\t"
  132418. "adds r3, r3, r7\n\t"
  132419. "adcs r4, r4, #0\n\t"
  132420. "adc r5, r5, #0\n\t"
  132421. "lsr r7, r9, #16\n\t"
  132422. "mul r6, r7, r6\n\t"
  132423. "lsr r7, r6, #16\n\t"
  132424. "lsl r6, r6, #16\n\t"
  132425. "adds r3, r3, r6\n\t"
  132426. "adcs r4, r4, r7\n\t"
  132427. "adc r5, r5, #0\n\t"
  132428. "lsr r6, r8, #16\n\t"
  132429. "lsr r7, r9, #16\n\t"
  132430. "mul r7, r6, r7\n\t"
  132431. "adds r4, r4, r7\n\t"
  132432. "adc r5, r5, #0\n\t"
  132433. "lsl r7, r9, #16\n\t"
  132434. "lsr r7, r7, #16\n\t"
  132435. "mul r6, r7, r6\n\t"
  132436. "lsr r7, r6, #16\n\t"
  132437. "lsl r6, r6, #16\n\t"
  132438. "adds r3, r3, r6\n\t"
  132439. "adcs r4, r4, r7\n\t"
  132440. "adc r5, r5, #0\n\t"
  132441. #else
  132442. "umull r6, r7, r8, r9\n\t"
  132443. "adds r3, r3, r6\n\t"
  132444. "adcs r4, r4, r7\n\t"
  132445. "adc r5, r5, #0\n\t"
  132446. #endif
  132447. /* A[15] * B[6] */
  132448. "ldr r8, [%[a], #60]\n\t"
  132449. "ldr r9, [%[b], #24]\n\t"
  132450. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  132451. "lsl r6, r8, #16\n\t"
  132452. "lsl r7, r9, #16\n\t"
  132453. "lsr r6, r6, #16\n\t"
  132454. "lsr r7, r7, #16\n\t"
  132455. "mul r7, r6, r7\n\t"
  132456. "adds r3, r3, r7\n\t"
  132457. "adcs r4, r4, #0\n\t"
  132458. "adc r5, r5, #0\n\t"
  132459. "lsr r7, r9, #16\n\t"
  132460. "mul r6, r7, r6\n\t"
  132461. "lsr r7, r6, #16\n\t"
  132462. "lsl r6, r6, #16\n\t"
  132463. "adds r3, r3, r6\n\t"
  132464. "adcs r4, r4, r7\n\t"
  132465. "adc r5, r5, #0\n\t"
  132466. "lsr r6, r8, #16\n\t"
  132467. "lsr r7, r9, #16\n\t"
  132468. "mul r7, r6, r7\n\t"
  132469. "adds r4, r4, r7\n\t"
  132470. "adc r5, r5, #0\n\t"
  132471. "lsl r7, r9, #16\n\t"
  132472. "lsr r7, r7, #16\n\t"
  132473. "mul r6, r7, r6\n\t"
  132474. "lsr r7, r6, #16\n\t"
  132475. "lsl r6, r6, #16\n\t"
  132476. "adds r3, r3, r6\n\t"
  132477. "adcs r4, r4, r7\n\t"
  132478. "adc r5, r5, #0\n\t"
  132479. #else
  132480. "umull r6, r7, r8, r9\n\t"
  132481. "adds r3, r3, r6\n\t"
  132482. "adcs r4, r4, r7\n\t"
  132483. "adc r5, r5, #0\n\t"
  132484. #endif
  132485. "str r3, [%[r], #84]\n\t"
  132486. /* A[15] * B[7] */
  132487. "ldr r9, [%[b], #28]\n\t"
  132488. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  132489. "lsl r6, r8, #16\n\t"
  132490. "lsl r7, r9, #16\n\t"
  132491. "lsr r6, r6, #16\n\t"
  132492. "lsr r7, r7, #16\n\t"
  132493. "mul r7, r6, r7\n\t"
  132494. "adds r4, r4, r7\n\t"
  132495. "adcs r5, r5, #0\n\t"
  132496. "mov r3, #0\n\t"
  132497. "adc r3, r3, #0\n\t"
  132498. "lsr r7, r9, #16\n\t"
  132499. "mul r6, r7, r6\n\t"
  132500. "lsr r7, r6, #16\n\t"
  132501. "lsl r6, r6, #16\n\t"
  132502. "adds r4, r4, r6\n\t"
  132503. "adcs r5, r5, r7\n\t"
  132504. "adc r3, r3, #0\n\t"
  132505. "lsr r6, r8, #16\n\t"
  132506. "lsr r7, r9, #16\n\t"
  132507. "mul r7, r6, r7\n\t"
  132508. "adds r5, r5, r7\n\t"
  132509. "adc r3, r3, #0\n\t"
  132510. "lsl r7, r9, #16\n\t"
  132511. "lsr r7, r7, #16\n\t"
  132512. "mul r6, r7, r6\n\t"
  132513. "lsr r7, r6, #16\n\t"
  132514. "lsl r6, r6, #16\n\t"
  132515. "adds r4, r4, r6\n\t"
  132516. "adcs r5, r5, r7\n\t"
  132517. "adc r3, r3, #0\n\t"
  132518. #else
  132519. "umull r6, r7, r8, r9\n\t"
  132520. "adds r4, r4, r6\n\t"
  132521. "adcs r5, r5, r7\n\t"
  132522. "mov r3, #0\n\t"
  132523. "adc r3, r3, #0\n\t"
  132524. #endif
  132525. /* A[14] * B[8] */
  132526. "ldr r8, [%[a], #56]\n\t"
  132527. "ldr r9, [%[b], #32]\n\t"
  132528. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  132529. "lsl r6, r8, #16\n\t"
  132530. "lsl r7, r9, #16\n\t"
  132531. "lsr r6, r6, #16\n\t"
  132532. "lsr r7, r7, #16\n\t"
  132533. "mul r7, r6, r7\n\t"
  132534. "adds r4, r4, r7\n\t"
  132535. "adcs r5, r5, #0\n\t"
  132536. "adc r3, r3, #0\n\t"
  132537. "lsr r7, r9, #16\n\t"
  132538. "mul r6, r7, r6\n\t"
  132539. "lsr r7, r6, #16\n\t"
  132540. "lsl r6, r6, #16\n\t"
  132541. "adds r4, r4, r6\n\t"
  132542. "adcs r5, r5, r7\n\t"
  132543. "adc r3, r3, #0\n\t"
  132544. "lsr r6, r8, #16\n\t"
  132545. "lsr r7, r9, #16\n\t"
  132546. "mul r7, r6, r7\n\t"
  132547. "adds r5, r5, r7\n\t"
  132548. "adc r3, r3, #0\n\t"
  132549. "lsl r7, r9, #16\n\t"
  132550. "lsr r7, r7, #16\n\t"
  132551. "mul r6, r7, r6\n\t"
  132552. "lsr r7, r6, #16\n\t"
  132553. "lsl r6, r6, #16\n\t"
  132554. "adds r4, r4, r6\n\t"
  132555. "adcs r5, r5, r7\n\t"
  132556. "adc r3, r3, #0\n\t"
  132557. #else
  132558. "umull r6, r7, r8, r9\n\t"
  132559. "adds r4, r4, r6\n\t"
  132560. "adcs r5, r5, r7\n\t"
  132561. "adc r3, r3, #0\n\t"
  132562. #endif
  132563. /* A[13] * B[9] */
  132564. "ldr r8, [%[a], #52]\n\t"
  132565. "ldr r9, [%[b], #36]\n\t"
  132566. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  132567. "lsl r6, r8, #16\n\t"
  132568. "lsl r7, r9, #16\n\t"
  132569. "lsr r6, r6, #16\n\t"
  132570. "lsr r7, r7, #16\n\t"
  132571. "mul r7, r6, r7\n\t"
  132572. "adds r4, r4, r7\n\t"
  132573. "adcs r5, r5, #0\n\t"
  132574. "adc r3, r3, #0\n\t"
  132575. "lsr r7, r9, #16\n\t"
  132576. "mul r6, r7, r6\n\t"
  132577. "lsr r7, r6, #16\n\t"
  132578. "lsl r6, r6, #16\n\t"
  132579. "adds r4, r4, r6\n\t"
  132580. "adcs r5, r5, r7\n\t"
  132581. "adc r3, r3, #0\n\t"
  132582. "lsr r6, r8, #16\n\t"
  132583. "lsr r7, r9, #16\n\t"
  132584. "mul r7, r6, r7\n\t"
  132585. "adds r5, r5, r7\n\t"
  132586. "adc r3, r3, #0\n\t"
  132587. "lsl r7, r9, #16\n\t"
  132588. "lsr r7, r7, #16\n\t"
  132589. "mul r6, r7, r6\n\t"
  132590. "lsr r7, r6, #16\n\t"
  132591. "lsl r6, r6, #16\n\t"
  132592. "adds r4, r4, r6\n\t"
  132593. "adcs r5, r5, r7\n\t"
  132594. "adc r3, r3, #0\n\t"
  132595. #else
  132596. "umull r6, r7, r8, r9\n\t"
  132597. "adds r4, r4, r6\n\t"
  132598. "adcs r5, r5, r7\n\t"
  132599. "adc r3, r3, #0\n\t"
  132600. #endif
  132601. /* A[12] * B[10] */
  132602. "ldr r8, [%[a], #48]\n\t"
  132603. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  132604. "lsl r6, r8, #16\n\t"
  132605. "lsl r7, r12, #16\n\t"
  132606. "lsr r6, r6, #16\n\t"
  132607. "lsr r7, r7, #16\n\t"
  132608. "mul r7, r6, r7\n\t"
  132609. "adds r4, r4, r7\n\t"
  132610. "adcs r5, r5, #0\n\t"
  132611. "adc r3, r3, #0\n\t"
  132612. "lsr r7, r12, #16\n\t"
  132613. "mul r6, r7, r6\n\t"
  132614. "lsr r7, r6, #16\n\t"
  132615. "lsl r6, r6, #16\n\t"
  132616. "adds r4, r4, r6\n\t"
  132617. "adcs r5, r5, r7\n\t"
  132618. "adc r3, r3, #0\n\t"
  132619. "lsr r6, r8, #16\n\t"
  132620. "lsr r7, r12, #16\n\t"
  132621. "mul r7, r6, r7\n\t"
  132622. "adds r5, r5, r7\n\t"
  132623. "adc r3, r3, #0\n\t"
  132624. "lsl r7, r12, #16\n\t"
  132625. "lsr r7, r7, #16\n\t"
  132626. "mul r6, r7, r6\n\t"
  132627. "lsr r7, r6, #16\n\t"
  132628. "lsl r6, r6, #16\n\t"
  132629. "adds r4, r4, r6\n\t"
  132630. "adcs r5, r5, r7\n\t"
  132631. "adc r3, r3, #0\n\t"
  132632. #else
  132633. "umull r6, r7, r8, r12\n\t"
  132634. "adds r4, r4, r6\n\t"
  132635. "adcs r5, r5, r7\n\t"
  132636. "adc r3, r3, #0\n\t"
  132637. #endif
  132638. /* A[11] * B[11] */
  132639. "ldr r11, [%[a], #44]\n\t"
  132640. "ldr r12, [%[b], #44]\n\t"
  132641. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  132642. "lsl r6, r11, #16\n\t"
  132643. "lsl r7, r12, #16\n\t"
  132644. "lsr r6, r6, #16\n\t"
  132645. "lsr r7, r7, #16\n\t"
  132646. "mul r7, r6, r7\n\t"
  132647. "adds r4, r4, r7\n\t"
  132648. "adcs r5, r5, #0\n\t"
  132649. "adc r3, r3, #0\n\t"
  132650. "lsr r7, r12, #16\n\t"
  132651. "mul r6, r7, r6\n\t"
  132652. "lsr r7, r6, #16\n\t"
  132653. "lsl r6, r6, #16\n\t"
  132654. "adds r4, r4, r6\n\t"
  132655. "adcs r5, r5, r7\n\t"
  132656. "adc r3, r3, #0\n\t"
  132657. "lsr r6, r11, #16\n\t"
  132658. "lsr r7, r12, #16\n\t"
  132659. "mul r7, r6, r7\n\t"
  132660. "adds r5, r5, r7\n\t"
  132661. "adc r3, r3, #0\n\t"
  132662. "lsl r7, r12, #16\n\t"
  132663. "lsr r7, r7, #16\n\t"
  132664. "mul r6, r7, r6\n\t"
  132665. "lsr r7, r6, #16\n\t"
  132666. "lsl r6, r6, #16\n\t"
  132667. "adds r4, r4, r6\n\t"
  132668. "adcs r5, r5, r7\n\t"
  132669. "adc r3, r3, #0\n\t"
  132670. #else
  132671. "umull r6, r7, r11, r12\n\t"
  132672. "adds r4, r4, r6\n\t"
  132673. "adcs r5, r5, r7\n\t"
  132674. "adc r3, r3, #0\n\t"
  132675. #endif
  132676. /* A[10] * B[12] */
  132677. "ldr r8, [%[a], #40]\n\t"
  132678. "ldr r9, [%[b], #48]\n\t"
  132679. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  132680. "lsl r6, r8, #16\n\t"
  132681. "lsl r7, r9, #16\n\t"
  132682. "lsr r6, r6, #16\n\t"
  132683. "lsr r7, r7, #16\n\t"
  132684. "mul r7, r6, r7\n\t"
  132685. "adds r4, r4, r7\n\t"
  132686. "adcs r5, r5, #0\n\t"
  132687. "adc r3, r3, #0\n\t"
  132688. "lsr r7, r9, #16\n\t"
  132689. "mul r6, r7, r6\n\t"
  132690. "lsr r7, r6, #16\n\t"
  132691. "lsl r6, r6, #16\n\t"
  132692. "adds r4, r4, r6\n\t"
  132693. "adcs r5, r5, r7\n\t"
  132694. "adc r3, r3, #0\n\t"
  132695. "lsr r6, r8, #16\n\t"
  132696. "lsr r7, r9, #16\n\t"
  132697. "mul r7, r6, r7\n\t"
  132698. "adds r5, r5, r7\n\t"
  132699. "adc r3, r3, #0\n\t"
  132700. "lsl r7, r9, #16\n\t"
  132701. "lsr r7, r7, #16\n\t"
  132702. "mul r6, r7, r6\n\t"
  132703. "lsr r7, r6, #16\n\t"
  132704. "lsl r6, r6, #16\n\t"
  132705. "adds r4, r4, r6\n\t"
  132706. "adcs r5, r5, r7\n\t"
  132707. "adc r3, r3, #0\n\t"
  132708. #else
  132709. "umull r6, r7, r8, r9\n\t"
  132710. "adds r4, r4, r6\n\t"
  132711. "adcs r5, r5, r7\n\t"
  132712. "adc r3, r3, #0\n\t"
  132713. #endif
  132714. /* A[9] * B[13] */
  132715. "ldr r8, [%[a], #36]\n\t"
  132716. "ldr r9, [%[b], #52]\n\t"
  132717. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  132718. "lsl r6, r8, #16\n\t"
  132719. "lsl r7, r9, #16\n\t"
  132720. "lsr r6, r6, #16\n\t"
  132721. "lsr r7, r7, #16\n\t"
  132722. "mul r7, r6, r7\n\t"
  132723. "adds r4, r4, r7\n\t"
  132724. "adcs r5, r5, #0\n\t"
  132725. "adc r3, r3, #0\n\t"
  132726. "lsr r7, r9, #16\n\t"
  132727. "mul r6, r7, r6\n\t"
  132728. "lsr r7, r6, #16\n\t"
  132729. "lsl r6, r6, #16\n\t"
  132730. "adds r4, r4, r6\n\t"
  132731. "adcs r5, r5, r7\n\t"
  132732. "adc r3, r3, #0\n\t"
  132733. "lsr r6, r8, #16\n\t"
  132734. "lsr r7, r9, #16\n\t"
  132735. "mul r7, r6, r7\n\t"
  132736. "adds r5, r5, r7\n\t"
  132737. "adc r3, r3, #0\n\t"
  132738. "lsl r7, r9, #16\n\t"
  132739. "lsr r7, r7, #16\n\t"
  132740. "mul r6, r7, r6\n\t"
  132741. "lsr r7, r6, #16\n\t"
  132742. "lsl r6, r6, #16\n\t"
  132743. "adds r4, r4, r6\n\t"
  132744. "adcs r5, r5, r7\n\t"
  132745. "adc r3, r3, #0\n\t"
  132746. #else
  132747. "umull r6, r7, r8, r9\n\t"
  132748. "adds r4, r4, r6\n\t"
  132749. "adcs r5, r5, r7\n\t"
  132750. "adc r3, r3, #0\n\t"
  132751. #endif
  132752. /* A[8] * B[14] */
  132753. "ldr r8, [%[a], #32]\n\t"
  132754. "ldr r9, [%[b], #56]\n\t"
  132755. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  132756. "lsl r6, r8, #16\n\t"
  132757. "lsl r7, r9, #16\n\t"
  132758. "lsr r6, r6, #16\n\t"
  132759. "lsr r7, r7, #16\n\t"
  132760. "mul r7, r6, r7\n\t"
  132761. "adds r4, r4, r7\n\t"
  132762. "adcs r5, r5, #0\n\t"
  132763. "adc r3, r3, #0\n\t"
  132764. "lsr r7, r9, #16\n\t"
  132765. "mul r6, r7, r6\n\t"
  132766. "lsr r7, r6, #16\n\t"
  132767. "lsl r6, r6, #16\n\t"
  132768. "adds r4, r4, r6\n\t"
  132769. "adcs r5, r5, r7\n\t"
  132770. "adc r3, r3, #0\n\t"
  132771. "lsr r6, r8, #16\n\t"
  132772. "lsr r7, r9, #16\n\t"
  132773. "mul r7, r6, r7\n\t"
  132774. "adds r5, r5, r7\n\t"
  132775. "adc r3, r3, #0\n\t"
  132776. "lsl r7, r9, #16\n\t"
  132777. "lsr r7, r7, #16\n\t"
  132778. "mul r6, r7, r6\n\t"
  132779. "lsr r7, r6, #16\n\t"
  132780. "lsl r6, r6, #16\n\t"
  132781. "adds r4, r4, r6\n\t"
  132782. "adcs r5, r5, r7\n\t"
  132783. "adc r3, r3, #0\n\t"
  132784. #else
  132785. "umull r6, r7, r8, r9\n\t"
  132786. "adds r4, r4, r6\n\t"
  132787. "adcs r5, r5, r7\n\t"
  132788. "adc r3, r3, #0\n\t"
  132789. #endif
  132790. /* A[7] * B[15] */
  132791. "ldr r8, [%[a], #28]\n\t"
  132792. "ldr r9, [%[b], #60]\n\t"
  132793. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  132794. "lsl r6, r8, #16\n\t"
  132795. "lsl r7, r9, #16\n\t"
  132796. "lsr r6, r6, #16\n\t"
  132797. "lsr r7, r7, #16\n\t"
  132798. "mul r7, r6, r7\n\t"
  132799. "adds r4, r4, r7\n\t"
  132800. "adcs r5, r5, #0\n\t"
  132801. "adc r3, r3, #0\n\t"
  132802. "lsr r7, r9, #16\n\t"
  132803. "mul r6, r7, r6\n\t"
  132804. "lsr r7, r6, #16\n\t"
  132805. "lsl r6, r6, #16\n\t"
  132806. "adds r4, r4, r6\n\t"
  132807. "adcs r5, r5, r7\n\t"
  132808. "adc r3, r3, #0\n\t"
  132809. "lsr r6, r8, #16\n\t"
  132810. "lsr r7, r9, #16\n\t"
  132811. "mul r7, r6, r7\n\t"
  132812. "adds r5, r5, r7\n\t"
  132813. "adc r3, r3, #0\n\t"
  132814. "lsl r7, r9, #16\n\t"
  132815. "lsr r7, r7, #16\n\t"
  132816. "mul r6, r7, r6\n\t"
  132817. "lsr r7, r6, #16\n\t"
  132818. "lsl r6, r6, #16\n\t"
  132819. "adds r4, r4, r6\n\t"
  132820. "adcs r5, r5, r7\n\t"
  132821. "adc r3, r3, #0\n\t"
  132822. #else
  132823. "umull r6, r7, r8, r9\n\t"
  132824. "adds r4, r4, r6\n\t"
  132825. "adcs r5, r5, r7\n\t"
  132826. "adc r3, r3, #0\n\t"
  132827. #endif
  132828. "str r4, [%[r], #88]\n\t"
  132829. /* A[8] * B[15] */
  132830. "ldr r8, [%[a], #32]\n\t"
  132831. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  132832. "lsl r6, r8, #16\n\t"
  132833. "lsl r7, r9, #16\n\t"
  132834. "lsr r6, r6, #16\n\t"
  132835. "lsr r7, r7, #16\n\t"
  132836. "mul r7, r6, r7\n\t"
  132837. "adds r5, r5, r7\n\t"
  132838. "adcs r3, r3, #0\n\t"
  132839. "mov r4, #0\n\t"
  132840. "adc r4, r4, #0\n\t"
  132841. "lsr r7, r9, #16\n\t"
  132842. "mul r6, r7, r6\n\t"
  132843. "lsr r7, r6, #16\n\t"
  132844. "lsl r6, r6, #16\n\t"
  132845. "adds r5, r5, r6\n\t"
  132846. "adcs r3, r3, r7\n\t"
  132847. "adc r4, r4, #0\n\t"
  132848. "lsr r6, r8, #16\n\t"
  132849. "lsr r7, r9, #16\n\t"
  132850. "mul r7, r6, r7\n\t"
  132851. "adds r3, r3, r7\n\t"
  132852. "adc r4, r4, #0\n\t"
  132853. "lsl r7, r9, #16\n\t"
  132854. "lsr r7, r7, #16\n\t"
  132855. "mul r6, r7, r6\n\t"
  132856. "lsr r7, r6, #16\n\t"
  132857. "lsl r6, r6, #16\n\t"
  132858. "adds r5, r5, r6\n\t"
  132859. "adcs r3, r3, r7\n\t"
  132860. "adc r4, r4, #0\n\t"
  132861. #else
  132862. "umull r6, r7, r8, r9\n\t"
  132863. "adds r5, r5, r6\n\t"
  132864. "adcs r3, r3, r7\n\t"
  132865. "mov r4, #0\n\t"
  132866. "adc r4, r4, #0\n\t"
  132867. #endif
  132868. /* A[9] * B[14] */
  132869. "ldr r8, [%[a], #36]\n\t"
  132870. "ldr r9, [%[b], #56]\n\t"
  132871. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  132872. "lsl r6, r8, #16\n\t"
  132873. "lsl r7, r9, #16\n\t"
  132874. "lsr r6, r6, #16\n\t"
  132875. "lsr r7, r7, #16\n\t"
  132876. "mul r7, r6, r7\n\t"
  132877. "adds r5, r5, r7\n\t"
  132878. "adcs r3, r3, #0\n\t"
  132879. "adc r4, r4, #0\n\t"
  132880. "lsr r7, r9, #16\n\t"
  132881. "mul r6, r7, r6\n\t"
  132882. "lsr r7, r6, #16\n\t"
  132883. "lsl r6, r6, #16\n\t"
  132884. "adds r5, r5, r6\n\t"
  132885. "adcs r3, r3, r7\n\t"
  132886. "adc r4, r4, #0\n\t"
  132887. "lsr r6, r8, #16\n\t"
  132888. "lsr r7, r9, #16\n\t"
  132889. "mul r7, r6, r7\n\t"
  132890. "adds r3, r3, r7\n\t"
  132891. "adc r4, r4, #0\n\t"
  132892. "lsl r7, r9, #16\n\t"
  132893. "lsr r7, r7, #16\n\t"
  132894. "mul r6, r7, r6\n\t"
  132895. "lsr r7, r6, #16\n\t"
  132896. "lsl r6, r6, #16\n\t"
  132897. "adds r5, r5, r6\n\t"
  132898. "adcs r3, r3, r7\n\t"
  132899. "adc r4, r4, #0\n\t"
  132900. #else
  132901. "umull r6, r7, r8, r9\n\t"
  132902. "adds r5, r5, r6\n\t"
  132903. "adcs r3, r3, r7\n\t"
  132904. "adc r4, r4, #0\n\t"
  132905. #endif
  132906. /* A[10] * B[13] */
  132907. "ldr r8, [%[a], #40]\n\t"
  132908. "ldr r9, [%[b], #52]\n\t"
  132909. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  132910. "lsl r6, r8, #16\n\t"
  132911. "lsl r7, r9, #16\n\t"
  132912. "lsr r6, r6, #16\n\t"
  132913. "lsr r7, r7, #16\n\t"
  132914. "mul r7, r6, r7\n\t"
  132915. "adds r5, r5, r7\n\t"
  132916. "adcs r3, r3, #0\n\t"
  132917. "adc r4, r4, #0\n\t"
  132918. "lsr r7, r9, #16\n\t"
  132919. "mul r6, r7, r6\n\t"
  132920. "lsr r7, r6, #16\n\t"
  132921. "lsl r6, r6, #16\n\t"
  132922. "adds r5, r5, r6\n\t"
  132923. "adcs r3, r3, r7\n\t"
  132924. "adc r4, r4, #0\n\t"
  132925. "lsr r6, r8, #16\n\t"
  132926. "lsr r7, r9, #16\n\t"
  132927. "mul r7, r6, r7\n\t"
  132928. "adds r3, r3, r7\n\t"
  132929. "adc r4, r4, #0\n\t"
  132930. "lsl r7, r9, #16\n\t"
  132931. "lsr r7, r7, #16\n\t"
  132932. "mul r6, r7, r6\n\t"
  132933. "lsr r7, r6, #16\n\t"
  132934. "lsl r6, r6, #16\n\t"
  132935. "adds r5, r5, r6\n\t"
  132936. "adcs r3, r3, r7\n\t"
  132937. "adc r4, r4, #0\n\t"
  132938. #else
  132939. "umull r6, r7, r8, r9\n\t"
  132940. "adds r5, r5, r6\n\t"
  132941. "adcs r3, r3, r7\n\t"
  132942. "adc r4, r4, #0\n\t"
  132943. #endif
  132944. /* A[11] * B[12] */
  132945. "ldr r9, [%[b], #48]\n\t"
  132946. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  132947. "lsl r6, r11, #16\n\t"
  132948. "lsl r7, r9, #16\n\t"
  132949. "lsr r6, r6, #16\n\t"
  132950. "lsr r7, r7, #16\n\t"
  132951. "mul r7, r6, r7\n\t"
  132952. "adds r5, r5, r7\n\t"
  132953. "adcs r3, r3, #0\n\t"
  132954. "adc r4, r4, #0\n\t"
  132955. "lsr r7, r9, #16\n\t"
  132956. "mul r6, r7, r6\n\t"
  132957. "lsr r7, r6, #16\n\t"
  132958. "lsl r6, r6, #16\n\t"
  132959. "adds r5, r5, r6\n\t"
  132960. "adcs r3, r3, r7\n\t"
  132961. "adc r4, r4, #0\n\t"
  132962. "lsr r6, r11, #16\n\t"
  132963. "lsr r7, r9, #16\n\t"
  132964. "mul r7, r6, r7\n\t"
  132965. "adds r3, r3, r7\n\t"
  132966. "adc r4, r4, #0\n\t"
  132967. "lsl r7, r9, #16\n\t"
  132968. "lsr r7, r7, #16\n\t"
  132969. "mul r6, r7, r6\n\t"
  132970. "lsr r7, r6, #16\n\t"
  132971. "lsl r6, r6, #16\n\t"
  132972. "adds r5, r5, r6\n\t"
  132973. "adcs r3, r3, r7\n\t"
  132974. "adc r4, r4, #0\n\t"
  132975. #else
  132976. "umull r6, r7, r11, r9\n\t"
  132977. "adds r5, r5, r6\n\t"
  132978. "adcs r3, r3, r7\n\t"
  132979. "adc r4, r4, #0\n\t"
  132980. #endif
  132981. /* A[12] * B[11] */
  132982. "ldr r8, [%[a], #48]\n\t"
  132983. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  132984. "lsl r6, r8, #16\n\t"
  132985. "lsl r7, r12, #16\n\t"
  132986. "lsr r6, r6, #16\n\t"
  132987. "lsr r7, r7, #16\n\t"
  132988. "mul r7, r6, r7\n\t"
  132989. "adds r5, r5, r7\n\t"
  132990. "adcs r3, r3, #0\n\t"
  132991. "adc r4, r4, #0\n\t"
  132992. "lsr r7, r12, #16\n\t"
  132993. "mul r6, r7, r6\n\t"
  132994. "lsr r7, r6, #16\n\t"
  132995. "lsl r6, r6, #16\n\t"
  132996. "adds r5, r5, r6\n\t"
  132997. "adcs r3, r3, r7\n\t"
  132998. "adc r4, r4, #0\n\t"
  132999. "lsr r6, r8, #16\n\t"
  133000. "lsr r7, r12, #16\n\t"
  133001. "mul r7, r6, r7\n\t"
  133002. "adds r3, r3, r7\n\t"
  133003. "adc r4, r4, #0\n\t"
  133004. "lsl r7, r12, #16\n\t"
  133005. "lsr r7, r7, #16\n\t"
  133006. "mul r6, r7, r6\n\t"
  133007. "lsr r7, r6, #16\n\t"
  133008. "lsl r6, r6, #16\n\t"
  133009. "adds r5, r5, r6\n\t"
  133010. "adcs r3, r3, r7\n\t"
  133011. "adc r4, r4, #0\n\t"
  133012. #else
  133013. "umull r6, r7, r8, r12\n\t"
  133014. "adds r5, r5, r6\n\t"
  133015. "adcs r3, r3, r7\n\t"
  133016. "adc r4, r4, #0\n\t"
  133017. #endif
  133018. /* A[13] * B[10] */
  133019. "ldr r8, [%[a], #52]\n\t"
  133020. "ldr r9, [%[b], #40]\n\t"
  133021. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  133022. "lsl r6, r8, #16\n\t"
  133023. "lsl r7, r9, #16\n\t"
  133024. "lsr r6, r6, #16\n\t"
  133025. "lsr r7, r7, #16\n\t"
  133026. "mul r7, r6, r7\n\t"
  133027. "adds r5, r5, r7\n\t"
  133028. "adcs r3, r3, #0\n\t"
  133029. "adc r4, r4, #0\n\t"
  133030. "lsr r7, r9, #16\n\t"
  133031. "mul r6, r7, r6\n\t"
  133032. "lsr r7, r6, #16\n\t"
  133033. "lsl r6, r6, #16\n\t"
  133034. "adds r5, r5, r6\n\t"
  133035. "adcs r3, r3, r7\n\t"
  133036. "adc r4, r4, #0\n\t"
  133037. "lsr r6, r8, #16\n\t"
  133038. "lsr r7, r9, #16\n\t"
  133039. "mul r7, r6, r7\n\t"
  133040. "adds r3, r3, r7\n\t"
  133041. "adc r4, r4, #0\n\t"
  133042. "lsl r7, r9, #16\n\t"
  133043. "lsr r7, r7, #16\n\t"
  133044. "mul r6, r7, r6\n\t"
  133045. "lsr r7, r6, #16\n\t"
  133046. "lsl r6, r6, #16\n\t"
  133047. "adds r5, r5, r6\n\t"
  133048. "adcs r3, r3, r7\n\t"
  133049. "adc r4, r4, #0\n\t"
  133050. #else
  133051. "umull r6, r7, r8, r9\n\t"
  133052. "adds r5, r5, r6\n\t"
  133053. "adcs r3, r3, r7\n\t"
  133054. "adc r4, r4, #0\n\t"
  133055. #endif
  133056. /* A[14] * B[9] */
  133057. "ldr r8, [%[a], #56]\n\t"
  133058. "ldr r9, [%[b], #36]\n\t"
  133059. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  133060. "lsl r6, r8, #16\n\t"
  133061. "lsl r7, r9, #16\n\t"
  133062. "lsr r6, r6, #16\n\t"
  133063. "lsr r7, r7, #16\n\t"
  133064. "mul r7, r6, r7\n\t"
  133065. "adds r5, r5, r7\n\t"
  133066. "adcs r3, r3, #0\n\t"
  133067. "adc r4, r4, #0\n\t"
  133068. "lsr r7, r9, #16\n\t"
  133069. "mul r6, r7, r6\n\t"
  133070. "lsr r7, r6, #16\n\t"
  133071. "lsl r6, r6, #16\n\t"
  133072. "adds r5, r5, r6\n\t"
  133073. "adcs r3, r3, r7\n\t"
  133074. "adc r4, r4, #0\n\t"
  133075. "lsr r6, r8, #16\n\t"
  133076. "lsr r7, r9, #16\n\t"
  133077. "mul r7, r6, r7\n\t"
  133078. "adds r3, r3, r7\n\t"
  133079. "adc r4, r4, #0\n\t"
  133080. "lsl r7, r9, #16\n\t"
  133081. "lsr r7, r7, #16\n\t"
  133082. "mul r6, r7, r6\n\t"
  133083. "lsr r7, r6, #16\n\t"
  133084. "lsl r6, r6, #16\n\t"
  133085. "adds r5, r5, r6\n\t"
  133086. "adcs r3, r3, r7\n\t"
  133087. "adc r4, r4, #0\n\t"
  133088. #else
  133089. "umull r6, r7, r8, r9\n\t"
  133090. "adds r5, r5, r6\n\t"
  133091. "adcs r3, r3, r7\n\t"
  133092. "adc r4, r4, #0\n\t"
  133093. #endif
  133094. /* A[15] * B[8] */
  133095. "ldr r8, [%[a], #60]\n\t"
  133096. "ldr r9, [%[b], #32]\n\t"
  133097. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  133098. "lsl r6, r8, #16\n\t"
  133099. "lsl r7, r9, #16\n\t"
  133100. "lsr r6, r6, #16\n\t"
  133101. "lsr r7, r7, #16\n\t"
  133102. "mul r7, r6, r7\n\t"
  133103. "adds r5, r5, r7\n\t"
  133104. "adcs r3, r3, #0\n\t"
  133105. "adc r4, r4, #0\n\t"
  133106. "lsr r7, r9, #16\n\t"
  133107. "mul r6, r7, r6\n\t"
  133108. "lsr r7, r6, #16\n\t"
  133109. "lsl r6, r6, #16\n\t"
  133110. "adds r5, r5, r6\n\t"
  133111. "adcs r3, r3, r7\n\t"
  133112. "adc r4, r4, #0\n\t"
  133113. "lsr r6, r8, #16\n\t"
  133114. "lsr r7, r9, #16\n\t"
  133115. "mul r7, r6, r7\n\t"
  133116. "adds r3, r3, r7\n\t"
  133117. "adc r4, r4, #0\n\t"
  133118. "lsl r7, r9, #16\n\t"
  133119. "lsr r7, r7, #16\n\t"
  133120. "mul r6, r7, r6\n\t"
  133121. "lsr r7, r6, #16\n\t"
  133122. "lsl r6, r6, #16\n\t"
  133123. "adds r5, r5, r6\n\t"
  133124. "adcs r3, r3, r7\n\t"
  133125. "adc r4, r4, #0\n\t"
  133126. #else
  133127. "umull r6, r7, r8, r9\n\t"
  133128. "adds r5, r5, r6\n\t"
  133129. "adcs r3, r3, r7\n\t"
  133130. "adc r4, r4, #0\n\t"
  133131. #endif
  133132. "str r5, [%[r], #92]\n\t"
  133133. /* A[15] * B[9] */
  133134. "ldr r9, [%[b], #36]\n\t"
  133135. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  133136. "lsl r6, r8, #16\n\t"
  133137. "lsl r7, r9, #16\n\t"
  133138. "lsr r6, r6, #16\n\t"
  133139. "lsr r7, r7, #16\n\t"
  133140. "mul r7, r6, r7\n\t"
  133141. "adds r3, r3, r7\n\t"
  133142. "adcs r4, r4, #0\n\t"
  133143. "mov r5, #0\n\t"
  133144. "adc r5, r5, #0\n\t"
  133145. "lsr r7, r9, #16\n\t"
  133146. "mul r6, r7, r6\n\t"
  133147. "lsr r7, r6, #16\n\t"
  133148. "lsl r6, r6, #16\n\t"
  133149. "adds r3, r3, r6\n\t"
  133150. "adcs r4, r4, r7\n\t"
  133151. "adc r5, r5, #0\n\t"
  133152. "lsr r6, r8, #16\n\t"
  133153. "lsr r7, r9, #16\n\t"
  133154. "mul r7, r6, r7\n\t"
  133155. "adds r4, r4, r7\n\t"
  133156. "adc r5, r5, #0\n\t"
  133157. "lsl r7, r9, #16\n\t"
  133158. "lsr r7, r7, #16\n\t"
  133159. "mul r6, r7, r6\n\t"
  133160. "lsr r7, r6, #16\n\t"
  133161. "lsl r6, r6, #16\n\t"
  133162. "adds r3, r3, r6\n\t"
  133163. "adcs r4, r4, r7\n\t"
  133164. "adc r5, r5, #0\n\t"
  133165. #else
  133166. "umull r6, r7, r8, r9\n\t"
  133167. "adds r3, r3, r6\n\t"
  133168. "adcs r4, r4, r7\n\t"
  133169. "mov r5, #0\n\t"
  133170. "adc r5, r5, #0\n\t"
  133171. #endif
  133172. /* A[14] * B[10] */
  133173. "ldr r8, [%[a], #56]\n\t"
  133174. "ldr r9, [%[b], #40]\n\t"
  133175. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  133176. "lsl r6, r8, #16\n\t"
  133177. "lsl r7, r9, #16\n\t"
  133178. "lsr r6, r6, #16\n\t"
  133179. "lsr r7, r7, #16\n\t"
  133180. "mul r7, r6, r7\n\t"
  133181. "adds r3, r3, r7\n\t"
  133182. "adcs r4, r4, #0\n\t"
  133183. "adc r5, r5, #0\n\t"
  133184. "lsr r7, r9, #16\n\t"
  133185. "mul r6, r7, r6\n\t"
  133186. "lsr r7, r6, #16\n\t"
  133187. "lsl r6, r6, #16\n\t"
  133188. "adds r3, r3, r6\n\t"
  133189. "adcs r4, r4, r7\n\t"
  133190. "adc r5, r5, #0\n\t"
  133191. "lsr r6, r8, #16\n\t"
  133192. "lsr r7, r9, #16\n\t"
  133193. "mul r7, r6, r7\n\t"
  133194. "adds r4, r4, r7\n\t"
  133195. "adc r5, r5, #0\n\t"
  133196. "lsl r7, r9, #16\n\t"
  133197. "lsr r7, r7, #16\n\t"
  133198. "mul r6, r7, r6\n\t"
  133199. "lsr r7, r6, #16\n\t"
  133200. "lsl r6, r6, #16\n\t"
  133201. "adds r3, r3, r6\n\t"
  133202. "adcs r4, r4, r7\n\t"
  133203. "adc r5, r5, #0\n\t"
  133204. #else
  133205. "umull r6, r7, r8, r9\n\t"
  133206. "adds r3, r3, r6\n\t"
  133207. "adcs r4, r4, r7\n\t"
  133208. "adc r5, r5, #0\n\t"
  133209. #endif
  133210. /* A[13] * B[11] */
  133211. "ldr r8, [%[a], #52]\n\t"
  133212. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  133213. "lsl r6, r8, #16\n\t"
  133214. "lsl r7, r12, #16\n\t"
  133215. "lsr r6, r6, #16\n\t"
  133216. "lsr r7, r7, #16\n\t"
  133217. "mul r7, r6, r7\n\t"
  133218. "adds r3, r3, r7\n\t"
  133219. "adcs r4, r4, #0\n\t"
  133220. "adc r5, r5, #0\n\t"
  133221. "lsr r7, r12, #16\n\t"
  133222. "mul r6, r7, r6\n\t"
  133223. "lsr r7, r6, #16\n\t"
  133224. "lsl r6, r6, #16\n\t"
  133225. "adds r3, r3, r6\n\t"
  133226. "adcs r4, r4, r7\n\t"
  133227. "adc r5, r5, #0\n\t"
  133228. "lsr r6, r8, #16\n\t"
  133229. "lsr r7, r12, #16\n\t"
  133230. "mul r7, r6, r7\n\t"
  133231. "adds r4, r4, r7\n\t"
  133232. "adc r5, r5, #0\n\t"
  133233. "lsl r7, r12, #16\n\t"
  133234. "lsr r7, r7, #16\n\t"
  133235. "mul r6, r7, r6\n\t"
  133236. "lsr r7, r6, #16\n\t"
  133237. "lsl r6, r6, #16\n\t"
  133238. "adds r3, r3, r6\n\t"
  133239. "adcs r4, r4, r7\n\t"
  133240. "adc r5, r5, #0\n\t"
  133241. #else
  133242. "umull r6, r7, r8, r12\n\t"
  133243. "adds r3, r3, r6\n\t"
  133244. "adcs r4, r4, r7\n\t"
  133245. "adc r5, r5, #0\n\t"
  133246. #endif
  133247. /* A[12] * B[12] */
  133248. "ldr r11, [%[a], #48]\n\t"
  133249. "ldr r12, [%[b], #48]\n\t"
  133250. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  133251. "lsl r6, r11, #16\n\t"
  133252. "lsl r7, r12, #16\n\t"
  133253. "lsr r6, r6, #16\n\t"
  133254. "lsr r7, r7, #16\n\t"
  133255. "mul r7, r6, r7\n\t"
  133256. "adds r3, r3, r7\n\t"
  133257. "adcs r4, r4, #0\n\t"
  133258. "adc r5, r5, #0\n\t"
  133259. "lsr r7, r12, #16\n\t"
  133260. "mul r6, r7, r6\n\t"
  133261. "lsr r7, r6, #16\n\t"
  133262. "lsl r6, r6, #16\n\t"
  133263. "adds r3, r3, r6\n\t"
  133264. "adcs r4, r4, r7\n\t"
  133265. "adc r5, r5, #0\n\t"
  133266. "lsr r6, r11, #16\n\t"
  133267. "lsr r7, r12, #16\n\t"
  133268. "mul r7, r6, r7\n\t"
  133269. "adds r4, r4, r7\n\t"
  133270. "adc r5, r5, #0\n\t"
  133271. "lsl r7, r12, #16\n\t"
  133272. "lsr r7, r7, #16\n\t"
  133273. "mul r6, r7, r6\n\t"
  133274. "lsr r7, r6, #16\n\t"
  133275. "lsl r6, r6, #16\n\t"
  133276. "adds r3, r3, r6\n\t"
  133277. "adcs r4, r4, r7\n\t"
  133278. "adc r5, r5, #0\n\t"
  133279. #else
  133280. "umull r6, r7, r11, r12\n\t"
  133281. "adds r3, r3, r6\n\t"
  133282. "adcs r4, r4, r7\n\t"
  133283. "adc r5, r5, #0\n\t"
  133284. #endif
  133285. /* A[11] * B[13] */
  133286. "ldr r8, [%[a], #44]\n\t"
  133287. "ldr r9, [%[b], #52]\n\t"
  133288. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  133289. "lsl r6, r8, #16\n\t"
  133290. "lsl r7, r9, #16\n\t"
  133291. "lsr r6, r6, #16\n\t"
  133292. "lsr r7, r7, #16\n\t"
  133293. "mul r7, r6, r7\n\t"
  133294. "adds r3, r3, r7\n\t"
  133295. "adcs r4, r4, #0\n\t"
  133296. "adc r5, r5, #0\n\t"
  133297. "lsr r7, r9, #16\n\t"
  133298. "mul r6, r7, r6\n\t"
  133299. "lsr r7, r6, #16\n\t"
  133300. "lsl r6, r6, #16\n\t"
  133301. "adds r3, r3, r6\n\t"
  133302. "adcs r4, r4, r7\n\t"
  133303. "adc r5, r5, #0\n\t"
  133304. "lsr r6, r8, #16\n\t"
  133305. "lsr r7, r9, #16\n\t"
  133306. "mul r7, r6, r7\n\t"
  133307. "adds r4, r4, r7\n\t"
  133308. "adc r5, r5, #0\n\t"
  133309. "lsl r7, r9, #16\n\t"
  133310. "lsr r7, r7, #16\n\t"
  133311. "mul r6, r7, r6\n\t"
  133312. "lsr r7, r6, #16\n\t"
  133313. "lsl r6, r6, #16\n\t"
  133314. "adds r3, r3, r6\n\t"
  133315. "adcs r4, r4, r7\n\t"
  133316. "adc r5, r5, #0\n\t"
  133317. #else
  133318. "umull r6, r7, r8, r9\n\t"
  133319. "adds r3, r3, r6\n\t"
  133320. "adcs r4, r4, r7\n\t"
  133321. "adc r5, r5, #0\n\t"
  133322. #endif
  133323. /* A[10] * B[14] */
  133324. "ldr r8, [%[a], #40]\n\t"
  133325. "ldr r9, [%[b], #56]\n\t"
  133326. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  133327. "lsl r6, r8, #16\n\t"
  133328. "lsl r7, r9, #16\n\t"
  133329. "lsr r6, r6, #16\n\t"
  133330. "lsr r7, r7, #16\n\t"
  133331. "mul r7, r6, r7\n\t"
  133332. "adds r3, r3, r7\n\t"
  133333. "adcs r4, r4, #0\n\t"
  133334. "adc r5, r5, #0\n\t"
  133335. "lsr r7, r9, #16\n\t"
  133336. "mul r6, r7, r6\n\t"
  133337. "lsr r7, r6, #16\n\t"
  133338. "lsl r6, r6, #16\n\t"
  133339. "adds r3, r3, r6\n\t"
  133340. "adcs r4, r4, r7\n\t"
  133341. "adc r5, r5, #0\n\t"
  133342. "lsr r6, r8, #16\n\t"
  133343. "lsr r7, r9, #16\n\t"
  133344. "mul r7, r6, r7\n\t"
  133345. "adds r4, r4, r7\n\t"
  133346. "adc r5, r5, #0\n\t"
  133347. "lsl r7, r9, #16\n\t"
  133348. "lsr r7, r7, #16\n\t"
  133349. "mul r6, r7, r6\n\t"
  133350. "lsr r7, r6, #16\n\t"
  133351. "lsl r6, r6, #16\n\t"
  133352. "adds r3, r3, r6\n\t"
  133353. "adcs r4, r4, r7\n\t"
  133354. "adc r5, r5, #0\n\t"
  133355. #else
  133356. "umull r6, r7, r8, r9\n\t"
  133357. "adds r3, r3, r6\n\t"
  133358. "adcs r4, r4, r7\n\t"
  133359. "adc r5, r5, #0\n\t"
  133360. #endif
  133361. /* A[9] * B[15] */
  133362. "ldr r8, [%[a], #36]\n\t"
  133363. "ldr r9, [%[b], #60]\n\t"
  133364. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  133365. "lsl r6, r8, #16\n\t"
  133366. "lsl r7, r9, #16\n\t"
  133367. "lsr r6, r6, #16\n\t"
  133368. "lsr r7, r7, #16\n\t"
  133369. "mul r7, r6, r7\n\t"
  133370. "adds r3, r3, r7\n\t"
  133371. "adcs r4, r4, #0\n\t"
  133372. "adc r5, r5, #0\n\t"
  133373. "lsr r7, r9, #16\n\t"
  133374. "mul r6, r7, r6\n\t"
  133375. "lsr r7, r6, #16\n\t"
  133376. "lsl r6, r6, #16\n\t"
  133377. "adds r3, r3, r6\n\t"
  133378. "adcs r4, r4, r7\n\t"
  133379. "adc r5, r5, #0\n\t"
  133380. "lsr r6, r8, #16\n\t"
  133381. "lsr r7, r9, #16\n\t"
  133382. "mul r7, r6, r7\n\t"
  133383. "adds r4, r4, r7\n\t"
  133384. "adc r5, r5, #0\n\t"
  133385. "lsl r7, r9, #16\n\t"
  133386. "lsr r7, r7, #16\n\t"
  133387. "mul r6, r7, r6\n\t"
  133388. "lsr r7, r6, #16\n\t"
  133389. "lsl r6, r6, #16\n\t"
  133390. "adds r3, r3, r6\n\t"
  133391. "adcs r4, r4, r7\n\t"
  133392. "adc r5, r5, #0\n\t"
  133393. #else
  133394. "umull r6, r7, r8, r9\n\t"
  133395. "adds r3, r3, r6\n\t"
  133396. "adcs r4, r4, r7\n\t"
  133397. "adc r5, r5, #0\n\t"
  133398. #endif
  133399. "str r3, [%[r], #96]\n\t"
  133400. /* A[10] * B[15] */
  133401. "ldr r8, [%[a], #40]\n\t"
  133402. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  133403. "lsl r6, r8, #16\n\t"
  133404. "lsl r7, r9, #16\n\t"
  133405. "lsr r6, r6, #16\n\t"
  133406. "lsr r7, r7, #16\n\t"
  133407. "mul r7, r6, r7\n\t"
  133408. "adds r4, r4, r7\n\t"
  133409. "adcs r5, r5, #0\n\t"
  133410. "mov r3, #0\n\t"
  133411. "adc r3, r3, #0\n\t"
  133412. "lsr r7, r9, #16\n\t"
  133413. "mul r6, r7, r6\n\t"
  133414. "lsr r7, r6, #16\n\t"
  133415. "lsl r6, r6, #16\n\t"
  133416. "adds r4, r4, r6\n\t"
  133417. "adcs r5, r5, r7\n\t"
  133418. "adc r3, r3, #0\n\t"
  133419. "lsr r6, r8, #16\n\t"
  133420. "lsr r7, r9, #16\n\t"
  133421. "mul r7, r6, r7\n\t"
  133422. "adds r5, r5, r7\n\t"
  133423. "adc r3, r3, #0\n\t"
  133424. "lsl r7, r9, #16\n\t"
  133425. "lsr r7, r7, #16\n\t"
  133426. "mul r6, r7, r6\n\t"
  133427. "lsr r7, r6, #16\n\t"
  133428. "lsl r6, r6, #16\n\t"
  133429. "adds r4, r4, r6\n\t"
  133430. "adcs r5, r5, r7\n\t"
  133431. "adc r3, r3, #0\n\t"
  133432. #else
  133433. "umull r6, r7, r8, r9\n\t"
  133434. "adds r4, r4, r6\n\t"
  133435. "adcs r5, r5, r7\n\t"
  133436. "mov r3, #0\n\t"
  133437. "adc r3, r3, #0\n\t"
  133438. #endif
  133439. /* A[11] * B[14] */
  133440. "ldr r8, [%[a], #44]\n\t"
  133441. "ldr r9, [%[b], #56]\n\t"
  133442. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  133443. "lsl r6, r8, #16\n\t"
  133444. "lsl r7, r9, #16\n\t"
  133445. "lsr r6, r6, #16\n\t"
  133446. "lsr r7, r7, #16\n\t"
  133447. "mul r7, r6, r7\n\t"
  133448. "adds r4, r4, r7\n\t"
  133449. "adcs r5, r5, #0\n\t"
  133450. "adc r3, r3, #0\n\t"
  133451. "lsr r7, r9, #16\n\t"
  133452. "mul r6, r7, r6\n\t"
  133453. "lsr r7, r6, #16\n\t"
  133454. "lsl r6, r6, #16\n\t"
  133455. "adds r4, r4, r6\n\t"
  133456. "adcs r5, r5, r7\n\t"
  133457. "adc r3, r3, #0\n\t"
  133458. "lsr r6, r8, #16\n\t"
  133459. "lsr r7, r9, #16\n\t"
  133460. "mul r7, r6, r7\n\t"
  133461. "adds r5, r5, r7\n\t"
  133462. "adc r3, r3, #0\n\t"
  133463. "lsl r7, r9, #16\n\t"
  133464. "lsr r7, r7, #16\n\t"
  133465. "mul r6, r7, r6\n\t"
  133466. "lsr r7, r6, #16\n\t"
  133467. "lsl r6, r6, #16\n\t"
  133468. "adds r4, r4, r6\n\t"
  133469. "adcs r5, r5, r7\n\t"
  133470. "adc r3, r3, #0\n\t"
  133471. #else
  133472. "umull r6, r7, r8, r9\n\t"
  133473. "adds r4, r4, r6\n\t"
  133474. "adcs r5, r5, r7\n\t"
  133475. "adc r3, r3, #0\n\t"
  133476. #endif
  133477. /* A[12] * B[13] */
  133478. "ldr r9, [%[b], #52]\n\t"
  133479. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  133480. "lsl r6, r11, #16\n\t"
  133481. "lsl r7, r9, #16\n\t"
  133482. "lsr r6, r6, #16\n\t"
  133483. "lsr r7, r7, #16\n\t"
  133484. "mul r7, r6, r7\n\t"
  133485. "adds r4, r4, r7\n\t"
  133486. "adcs r5, r5, #0\n\t"
  133487. "adc r3, r3, #0\n\t"
  133488. "lsr r7, r9, #16\n\t"
  133489. "mul r6, r7, r6\n\t"
  133490. "lsr r7, r6, #16\n\t"
  133491. "lsl r6, r6, #16\n\t"
  133492. "adds r4, r4, r6\n\t"
  133493. "adcs r5, r5, r7\n\t"
  133494. "adc r3, r3, #0\n\t"
  133495. "lsr r6, r11, #16\n\t"
  133496. "lsr r7, r9, #16\n\t"
  133497. "mul r7, r6, r7\n\t"
  133498. "adds r5, r5, r7\n\t"
  133499. "adc r3, r3, #0\n\t"
  133500. "lsl r7, r9, #16\n\t"
  133501. "lsr r7, r7, #16\n\t"
  133502. "mul r6, r7, r6\n\t"
  133503. "lsr r7, r6, #16\n\t"
  133504. "lsl r6, r6, #16\n\t"
  133505. "adds r4, r4, r6\n\t"
  133506. "adcs r5, r5, r7\n\t"
  133507. "adc r3, r3, #0\n\t"
  133508. #else
  133509. "umull r6, r7, r11, r9\n\t"
  133510. "adds r4, r4, r6\n\t"
  133511. "adcs r5, r5, r7\n\t"
  133512. "adc r3, r3, #0\n\t"
  133513. #endif
  133514. /* A[13] * B[12] */
  133515. "ldr r8, [%[a], #52]\n\t"
  133516. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  133517. "lsl r6, r8, #16\n\t"
  133518. "lsl r7, r12, #16\n\t"
  133519. "lsr r6, r6, #16\n\t"
  133520. "lsr r7, r7, #16\n\t"
  133521. "mul r7, r6, r7\n\t"
  133522. "adds r4, r4, r7\n\t"
  133523. "adcs r5, r5, #0\n\t"
  133524. "adc r3, r3, #0\n\t"
  133525. "lsr r7, r12, #16\n\t"
  133526. "mul r6, r7, r6\n\t"
  133527. "lsr r7, r6, #16\n\t"
  133528. "lsl r6, r6, #16\n\t"
  133529. "adds r4, r4, r6\n\t"
  133530. "adcs r5, r5, r7\n\t"
  133531. "adc r3, r3, #0\n\t"
  133532. "lsr r6, r8, #16\n\t"
  133533. "lsr r7, r12, #16\n\t"
  133534. "mul r7, r6, r7\n\t"
  133535. "adds r5, r5, r7\n\t"
  133536. "adc r3, r3, #0\n\t"
  133537. "lsl r7, r12, #16\n\t"
  133538. "lsr r7, r7, #16\n\t"
  133539. "mul r6, r7, r6\n\t"
  133540. "lsr r7, r6, #16\n\t"
  133541. "lsl r6, r6, #16\n\t"
  133542. "adds r4, r4, r6\n\t"
  133543. "adcs r5, r5, r7\n\t"
  133544. "adc r3, r3, #0\n\t"
  133545. #else
  133546. "umull r6, r7, r8, r12\n\t"
  133547. "adds r4, r4, r6\n\t"
  133548. "adcs r5, r5, r7\n\t"
  133549. "adc r3, r3, #0\n\t"
  133550. #endif
  133551. /* A[14] * B[11] */
  133552. "ldr r8, [%[a], #56]\n\t"
  133553. "ldr r9, [%[b], #44]\n\t"
  133554. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  133555. "lsl r6, r8, #16\n\t"
  133556. "lsl r7, r9, #16\n\t"
  133557. "lsr r6, r6, #16\n\t"
  133558. "lsr r7, r7, #16\n\t"
  133559. "mul r7, r6, r7\n\t"
  133560. "adds r4, r4, r7\n\t"
  133561. "adcs r5, r5, #0\n\t"
  133562. "adc r3, r3, #0\n\t"
  133563. "lsr r7, r9, #16\n\t"
  133564. "mul r6, r7, r6\n\t"
  133565. "lsr r7, r6, #16\n\t"
  133566. "lsl r6, r6, #16\n\t"
  133567. "adds r4, r4, r6\n\t"
  133568. "adcs r5, r5, r7\n\t"
  133569. "adc r3, r3, #0\n\t"
  133570. "lsr r6, r8, #16\n\t"
  133571. "lsr r7, r9, #16\n\t"
  133572. "mul r7, r6, r7\n\t"
  133573. "adds r5, r5, r7\n\t"
  133574. "adc r3, r3, #0\n\t"
  133575. "lsl r7, r9, #16\n\t"
  133576. "lsr r7, r7, #16\n\t"
  133577. "mul r6, r7, r6\n\t"
  133578. "lsr r7, r6, #16\n\t"
  133579. "lsl r6, r6, #16\n\t"
  133580. "adds r4, r4, r6\n\t"
  133581. "adcs r5, r5, r7\n\t"
  133582. "adc r3, r3, #0\n\t"
  133583. #else
  133584. "umull r6, r7, r8, r9\n\t"
  133585. "adds r4, r4, r6\n\t"
  133586. "adcs r5, r5, r7\n\t"
  133587. "adc r3, r3, #0\n\t"
  133588. #endif
  133589. /* A[15] * B[10] */
  133590. "ldr r8, [%[a], #60]\n\t"
  133591. "ldr r9, [%[b], #40]\n\t"
  133592. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  133593. "lsl r6, r8, #16\n\t"
  133594. "lsl r7, r9, #16\n\t"
  133595. "lsr r6, r6, #16\n\t"
  133596. "lsr r7, r7, #16\n\t"
  133597. "mul r7, r6, r7\n\t"
  133598. "adds r4, r4, r7\n\t"
  133599. "adcs r5, r5, #0\n\t"
  133600. "adc r3, r3, #0\n\t"
  133601. "lsr r7, r9, #16\n\t"
  133602. "mul r6, r7, r6\n\t"
  133603. "lsr r7, r6, #16\n\t"
  133604. "lsl r6, r6, #16\n\t"
  133605. "adds r4, r4, r6\n\t"
  133606. "adcs r5, r5, r7\n\t"
  133607. "adc r3, r3, #0\n\t"
  133608. "lsr r6, r8, #16\n\t"
  133609. "lsr r7, r9, #16\n\t"
  133610. "mul r7, r6, r7\n\t"
  133611. "adds r5, r5, r7\n\t"
  133612. "adc r3, r3, #0\n\t"
  133613. "lsl r7, r9, #16\n\t"
  133614. "lsr r7, r7, #16\n\t"
  133615. "mul r6, r7, r6\n\t"
  133616. "lsr r7, r6, #16\n\t"
  133617. "lsl r6, r6, #16\n\t"
  133618. "adds r4, r4, r6\n\t"
  133619. "adcs r5, r5, r7\n\t"
  133620. "adc r3, r3, #0\n\t"
  133621. #else
  133622. "umull r6, r7, r8, r9\n\t"
  133623. "adds r4, r4, r6\n\t"
  133624. "adcs r5, r5, r7\n\t"
  133625. "adc r3, r3, #0\n\t"
  133626. #endif
  133627. "str r4, [%[r], #100]\n\t"
  133628. /* A[15] * B[11] */
  133629. "ldr r9, [%[b], #44]\n\t"
  133630. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  133631. "lsl r6, r8, #16\n\t"
  133632. "lsl r7, r9, #16\n\t"
  133633. "lsr r6, r6, #16\n\t"
  133634. "lsr r7, r7, #16\n\t"
  133635. "mul r7, r6, r7\n\t"
  133636. "adds r5, r5, r7\n\t"
  133637. "adcs r3, r3, #0\n\t"
  133638. "mov r4, #0\n\t"
  133639. "adc r4, r4, #0\n\t"
  133640. "lsr r7, r9, #16\n\t"
  133641. "mul r6, r7, r6\n\t"
  133642. "lsr r7, r6, #16\n\t"
  133643. "lsl r6, r6, #16\n\t"
  133644. "adds r5, r5, r6\n\t"
  133645. "adcs r3, r3, r7\n\t"
  133646. "adc r4, r4, #0\n\t"
  133647. "lsr r6, r8, #16\n\t"
  133648. "lsr r7, r9, #16\n\t"
  133649. "mul r7, r6, r7\n\t"
  133650. "adds r3, r3, r7\n\t"
  133651. "adc r4, r4, #0\n\t"
  133652. "lsl r7, r9, #16\n\t"
  133653. "lsr r7, r7, #16\n\t"
  133654. "mul r6, r7, r6\n\t"
  133655. "lsr r7, r6, #16\n\t"
  133656. "lsl r6, r6, #16\n\t"
  133657. "adds r5, r5, r6\n\t"
  133658. "adcs r3, r3, r7\n\t"
  133659. "adc r4, r4, #0\n\t"
  133660. #else
  133661. "umull r6, r7, r8, r9\n\t"
  133662. "adds r5, r5, r6\n\t"
  133663. "adcs r3, r3, r7\n\t"
  133664. "mov r4, #0\n\t"
  133665. "adc r4, r4, #0\n\t"
  133666. #endif
  133667. /* A[14] * B[12] */
  133668. "ldr r8, [%[a], #56]\n\t"
  133669. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  133670. "lsl r6, r8, #16\n\t"
  133671. "lsl r7, r12, #16\n\t"
  133672. "lsr r6, r6, #16\n\t"
  133673. "lsr r7, r7, #16\n\t"
  133674. "mul r7, r6, r7\n\t"
  133675. "adds r5, r5, r7\n\t"
  133676. "adcs r3, r3, #0\n\t"
  133677. "adc r4, r4, #0\n\t"
  133678. "lsr r7, r12, #16\n\t"
  133679. "mul r6, r7, r6\n\t"
  133680. "lsr r7, r6, #16\n\t"
  133681. "lsl r6, r6, #16\n\t"
  133682. "adds r5, r5, r6\n\t"
  133683. "adcs r3, r3, r7\n\t"
  133684. "adc r4, r4, #0\n\t"
  133685. "lsr r6, r8, #16\n\t"
  133686. "lsr r7, r12, #16\n\t"
  133687. "mul r7, r6, r7\n\t"
  133688. "adds r3, r3, r7\n\t"
  133689. "adc r4, r4, #0\n\t"
  133690. "lsl r7, r12, #16\n\t"
  133691. "lsr r7, r7, #16\n\t"
  133692. "mul r6, r7, r6\n\t"
  133693. "lsr r7, r6, #16\n\t"
  133694. "lsl r6, r6, #16\n\t"
  133695. "adds r5, r5, r6\n\t"
  133696. "adcs r3, r3, r7\n\t"
  133697. "adc r4, r4, #0\n\t"
  133698. #else
  133699. "umull r6, r7, r8, r12\n\t"
  133700. "adds r5, r5, r6\n\t"
  133701. "adcs r3, r3, r7\n\t"
  133702. "adc r4, r4, #0\n\t"
  133703. #endif
  133704. /* A[13] * B[13] */
  133705. "ldr r11, [%[a], #52]\n\t"
  133706. "ldr r12, [%[b], #52]\n\t"
  133707. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  133708. "lsl r6, r11, #16\n\t"
  133709. "lsl r7, r12, #16\n\t"
  133710. "lsr r6, r6, #16\n\t"
  133711. "lsr r7, r7, #16\n\t"
  133712. "mul r7, r6, r7\n\t"
  133713. "adds r5, r5, r7\n\t"
  133714. "adcs r3, r3, #0\n\t"
  133715. "adc r4, r4, #0\n\t"
  133716. "lsr r7, r12, #16\n\t"
  133717. "mul r6, r7, r6\n\t"
  133718. "lsr r7, r6, #16\n\t"
  133719. "lsl r6, r6, #16\n\t"
  133720. "adds r5, r5, r6\n\t"
  133721. "adcs r3, r3, r7\n\t"
  133722. "adc r4, r4, #0\n\t"
  133723. "lsr r6, r11, #16\n\t"
  133724. "lsr r7, r12, #16\n\t"
  133725. "mul r7, r6, r7\n\t"
  133726. "adds r3, r3, r7\n\t"
  133727. "adc r4, r4, #0\n\t"
  133728. "lsl r7, r12, #16\n\t"
  133729. "lsr r7, r7, #16\n\t"
  133730. "mul r6, r7, r6\n\t"
  133731. "lsr r7, r6, #16\n\t"
  133732. "lsl r6, r6, #16\n\t"
  133733. "adds r5, r5, r6\n\t"
  133734. "adcs r3, r3, r7\n\t"
  133735. "adc r4, r4, #0\n\t"
  133736. #else
  133737. "umull r6, r7, r11, r12\n\t"
  133738. "adds r5, r5, r6\n\t"
  133739. "adcs r3, r3, r7\n\t"
  133740. "adc r4, r4, #0\n\t"
  133741. #endif
  133742. /* A[12] * B[14] */
  133743. "ldr r8, [%[a], #48]\n\t"
  133744. "ldr r9, [%[b], #56]\n\t"
  133745. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  133746. "lsl r6, r8, #16\n\t"
  133747. "lsl r7, r9, #16\n\t"
  133748. "lsr r6, r6, #16\n\t"
  133749. "lsr r7, r7, #16\n\t"
  133750. "mul r7, r6, r7\n\t"
  133751. "adds r5, r5, r7\n\t"
  133752. "adcs r3, r3, #0\n\t"
  133753. "adc r4, r4, #0\n\t"
  133754. "lsr r7, r9, #16\n\t"
  133755. "mul r6, r7, r6\n\t"
  133756. "lsr r7, r6, #16\n\t"
  133757. "lsl r6, r6, #16\n\t"
  133758. "adds r5, r5, r6\n\t"
  133759. "adcs r3, r3, r7\n\t"
  133760. "adc r4, r4, #0\n\t"
  133761. "lsr r6, r8, #16\n\t"
  133762. "lsr r7, r9, #16\n\t"
  133763. "mul r7, r6, r7\n\t"
  133764. "adds r3, r3, r7\n\t"
  133765. "adc r4, r4, #0\n\t"
  133766. "lsl r7, r9, #16\n\t"
  133767. "lsr r7, r7, #16\n\t"
  133768. "mul r6, r7, r6\n\t"
  133769. "lsr r7, r6, #16\n\t"
  133770. "lsl r6, r6, #16\n\t"
  133771. "adds r5, r5, r6\n\t"
  133772. "adcs r3, r3, r7\n\t"
  133773. "adc r4, r4, #0\n\t"
  133774. #else
  133775. "umull r6, r7, r8, r9\n\t"
  133776. "adds r5, r5, r6\n\t"
  133777. "adcs r3, r3, r7\n\t"
  133778. "adc r4, r4, #0\n\t"
  133779. #endif
  133780. /* A[11] * B[15] */
  133781. "ldr r8, [%[a], #44]\n\t"
  133782. "ldr r9, [%[b], #60]\n\t"
  133783. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  133784. "lsl r6, r8, #16\n\t"
  133785. "lsl r7, r9, #16\n\t"
  133786. "lsr r6, r6, #16\n\t"
  133787. "lsr r7, r7, #16\n\t"
  133788. "mul r7, r6, r7\n\t"
  133789. "adds r5, r5, r7\n\t"
  133790. "adcs r3, r3, #0\n\t"
  133791. "adc r4, r4, #0\n\t"
  133792. "lsr r7, r9, #16\n\t"
  133793. "mul r6, r7, r6\n\t"
  133794. "lsr r7, r6, #16\n\t"
  133795. "lsl r6, r6, #16\n\t"
  133796. "adds r5, r5, r6\n\t"
  133797. "adcs r3, r3, r7\n\t"
  133798. "adc r4, r4, #0\n\t"
  133799. "lsr r6, r8, #16\n\t"
  133800. "lsr r7, r9, #16\n\t"
  133801. "mul r7, r6, r7\n\t"
  133802. "adds r3, r3, r7\n\t"
  133803. "adc r4, r4, #0\n\t"
  133804. "lsl r7, r9, #16\n\t"
  133805. "lsr r7, r7, #16\n\t"
  133806. "mul r6, r7, r6\n\t"
  133807. "lsr r7, r6, #16\n\t"
  133808. "lsl r6, r6, #16\n\t"
  133809. "adds r5, r5, r6\n\t"
  133810. "adcs r3, r3, r7\n\t"
  133811. "adc r4, r4, #0\n\t"
  133812. #else
  133813. "umull r6, r7, r8, r9\n\t"
  133814. "adds r5, r5, r6\n\t"
  133815. "adcs r3, r3, r7\n\t"
  133816. "adc r4, r4, #0\n\t"
  133817. #endif
  133818. "str r5, [%[r], #104]\n\t"
  133819. /* A[12] * B[15] */
  133820. "ldr r8, [%[a], #48]\n\t"
  133821. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  133822. "lsl r6, r8, #16\n\t"
  133823. "lsl r7, r9, #16\n\t"
  133824. "lsr r6, r6, #16\n\t"
  133825. "lsr r7, r7, #16\n\t"
  133826. "mul r7, r6, r7\n\t"
  133827. "adds r3, r3, r7\n\t"
  133828. "adcs r4, r4, #0\n\t"
  133829. "mov r5, #0\n\t"
  133830. "adc r5, r5, #0\n\t"
  133831. "lsr r7, r9, #16\n\t"
  133832. "mul r6, r7, r6\n\t"
  133833. "lsr r7, r6, #16\n\t"
  133834. "lsl r6, r6, #16\n\t"
  133835. "adds r3, r3, r6\n\t"
  133836. "adcs r4, r4, r7\n\t"
  133837. "adc r5, r5, #0\n\t"
  133838. "lsr r6, r8, #16\n\t"
  133839. "lsr r7, r9, #16\n\t"
  133840. "mul r7, r6, r7\n\t"
  133841. "adds r4, r4, r7\n\t"
  133842. "adc r5, r5, #0\n\t"
  133843. "lsl r7, r9, #16\n\t"
  133844. "lsr r7, r7, #16\n\t"
  133845. "mul r6, r7, r6\n\t"
  133846. "lsr r7, r6, #16\n\t"
  133847. "lsl r6, r6, #16\n\t"
  133848. "adds r3, r3, r6\n\t"
  133849. "adcs r4, r4, r7\n\t"
  133850. "adc r5, r5, #0\n\t"
  133851. #else
  133852. "umull r6, r7, r8, r9\n\t"
  133853. "adds r3, r3, r6\n\t"
  133854. "adcs r4, r4, r7\n\t"
  133855. "mov r5, #0\n\t"
  133856. "adc r5, r5, #0\n\t"
  133857. #endif
  133858. /* A[13] * B[14] */
  133859. "ldr r9, [%[b], #56]\n\t"
  133860. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  133861. "lsl r6, r11, #16\n\t"
  133862. "lsl r7, r9, #16\n\t"
  133863. "lsr r6, r6, #16\n\t"
  133864. "lsr r7, r7, #16\n\t"
  133865. "mul r7, r6, r7\n\t"
  133866. "adds r3, r3, r7\n\t"
  133867. "adcs r4, r4, #0\n\t"
  133868. "adc r5, r5, #0\n\t"
  133869. "lsr r7, r9, #16\n\t"
  133870. "mul r6, r7, r6\n\t"
  133871. "lsr r7, r6, #16\n\t"
  133872. "lsl r6, r6, #16\n\t"
  133873. "adds r3, r3, r6\n\t"
  133874. "adcs r4, r4, r7\n\t"
  133875. "adc r5, r5, #0\n\t"
  133876. "lsr r6, r11, #16\n\t"
  133877. "lsr r7, r9, #16\n\t"
  133878. "mul r7, r6, r7\n\t"
  133879. "adds r4, r4, r7\n\t"
  133880. "adc r5, r5, #0\n\t"
  133881. "lsl r7, r9, #16\n\t"
  133882. "lsr r7, r7, #16\n\t"
  133883. "mul r6, r7, r6\n\t"
  133884. "lsr r7, r6, #16\n\t"
  133885. "lsl r6, r6, #16\n\t"
  133886. "adds r3, r3, r6\n\t"
  133887. "adcs r4, r4, r7\n\t"
  133888. "adc r5, r5, #0\n\t"
  133889. #else
  133890. "umull r6, r7, r11, r9\n\t"
  133891. "adds r3, r3, r6\n\t"
  133892. "adcs r4, r4, r7\n\t"
  133893. "adc r5, r5, #0\n\t"
  133894. #endif
  133895. /* A[14] * B[13] */
  133896. "ldr r8, [%[a], #56]\n\t"
  133897. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  133898. "lsl r6, r8, #16\n\t"
  133899. "lsl r7, r12, #16\n\t"
  133900. "lsr r6, r6, #16\n\t"
  133901. "lsr r7, r7, #16\n\t"
  133902. "mul r7, r6, r7\n\t"
  133903. "adds r3, r3, r7\n\t"
  133904. "adcs r4, r4, #0\n\t"
  133905. "adc r5, r5, #0\n\t"
  133906. "lsr r7, r12, #16\n\t"
  133907. "mul r6, r7, r6\n\t"
  133908. "lsr r7, r6, #16\n\t"
  133909. "lsl r6, r6, #16\n\t"
  133910. "adds r3, r3, r6\n\t"
  133911. "adcs r4, r4, r7\n\t"
  133912. "adc r5, r5, #0\n\t"
  133913. "lsr r6, r8, #16\n\t"
  133914. "lsr r7, r12, #16\n\t"
  133915. "mul r7, r6, r7\n\t"
  133916. "adds r4, r4, r7\n\t"
  133917. "adc r5, r5, #0\n\t"
  133918. "lsl r7, r12, #16\n\t"
  133919. "lsr r7, r7, #16\n\t"
  133920. "mul r6, r7, r6\n\t"
  133921. "lsr r7, r6, #16\n\t"
  133922. "lsl r6, r6, #16\n\t"
  133923. "adds r3, r3, r6\n\t"
  133924. "adcs r4, r4, r7\n\t"
  133925. "adc r5, r5, #0\n\t"
  133926. #else
  133927. "umull r6, r7, r8, r12\n\t"
  133928. "adds r3, r3, r6\n\t"
  133929. "adcs r4, r4, r7\n\t"
  133930. "adc r5, r5, #0\n\t"
  133931. #endif
  133932. /* A[15] * B[12] */
  133933. "ldr r8, [%[a], #60]\n\t"
  133934. "ldr r9, [%[b], #48]\n\t"
  133935. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  133936. "lsl r6, r8, #16\n\t"
  133937. "lsl r7, r9, #16\n\t"
  133938. "lsr r6, r6, #16\n\t"
  133939. "lsr r7, r7, #16\n\t"
  133940. "mul r7, r6, r7\n\t"
  133941. "adds r3, r3, r7\n\t"
  133942. "adcs r4, r4, #0\n\t"
  133943. "adc r5, r5, #0\n\t"
  133944. "lsr r7, r9, #16\n\t"
  133945. "mul r6, r7, r6\n\t"
  133946. "lsr r7, r6, #16\n\t"
  133947. "lsl r6, r6, #16\n\t"
  133948. "adds r3, r3, r6\n\t"
  133949. "adcs r4, r4, r7\n\t"
  133950. "adc r5, r5, #0\n\t"
  133951. "lsr r6, r8, #16\n\t"
  133952. "lsr r7, r9, #16\n\t"
  133953. "mul r7, r6, r7\n\t"
  133954. "adds r4, r4, r7\n\t"
  133955. "adc r5, r5, #0\n\t"
  133956. "lsl r7, r9, #16\n\t"
  133957. "lsr r7, r7, #16\n\t"
  133958. "mul r6, r7, r6\n\t"
  133959. "lsr r7, r6, #16\n\t"
  133960. "lsl r6, r6, #16\n\t"
  133961. "adds r3, r3, r6\n\t"
  133962. "adcs r4, r4, r7\n\t"
  133963. "adc r5, r5, #0\n\t"
  133964. #else
  133965. "umull r6, r7, r8, r9\n\t"
  133966. "adds r3, r3, r6\n\t"
  133967. "adcs r4, r4, r7\n\t"
  133968. "adc r5, r5, #0\n\t"
  133969. #endif
  133970. "str r3, [%[r], #108]\n\t"
  133971. /* A[15] * B[13] */
  133972. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  133973. "lsl r6, r8, #16\n\t"
  133974. "lsl r7, r12, #16\n\t"
  133975. "lsr r6, r6, #16\n\t"
  133976. "lsr r7, r7, #16\n\t"
  133977. "mul r7, r6, r7\n\t"
  133978. "adds r4, r4, r7\n\t"
  133979. "adcs r5, r5, #0\n\t"
  133980. "mov r3, #0\n\t"
  133981. "adc r3, r3, #0\n\t"
  133982. "lsr r7, r12, #16\n\t"
  133983. "mul r6, r7, r6\n\t"
  133984. "lsr r7, r6, #16\n\t"
  133985. "lsl r6, r6, #16\n\t"
  133986. "adds r4, r4, r6\n\t"
  133987. "adcs r5, r5, r7\n\t"
  133988. "adc r3, r3, #0\n\t"
  133989. "lsr r6, r8, #16\n\t"
  133990. "lsr r7, r12, #16\n\t"
  133991. "mul r7, r6, r7\n\t"
  133992. "adds r5, r5, r7\n\t"
  133993. "adc r3, r3, #0\n\t"
  133994. "lsl r7, r12, #16\n\t"
  133995. "lsr r7, r7, #16\n\t"
  133996. "mul r6, r7, r6\n\t"
  133997. "lsr r7, r6, #16\n\t"
  133998. "lsl r6, r6, #16\n\t"
  133999. "adds r4, r4, r6\n\t"
  134000. "adcs r5, r5, r7\n\t"
  134001. "adc r3, r3, #0\n\t"
  134002. #else
  134003. "umull r6, r7, r8, r12\n\t"
  134004. "adds r4, r4, r6\n\t"
  134005. "adcs r5, r5, r7\n\t"
  134006. "mov r3, #0\n\t"
  134007. "adc r3, r3, #0\n\t"
  134008. #endif
  134009. /* A[14] * B[14] */
  134010. "ldr r11, [%[a], #56]\n\t"
  134011. "ldr r12, [%[b], #56]\n\t"
  134012. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  134013. "lsl r6, r11, #16\n\t"
  134014. "lsl r7, r12, #16\n\t"
  134015. "lsr r6, r6, #16\n\t"
  134016. "lsr r7, r7, #16\n\t"
  134017. "mul r7, r6, r7\n\t"
  134018. "adds r4, r4, r7\n\t"
  134019. "adcs r5, r5, #0\n\t"
  134020. "adc r3, r3, #0\n\t"
  134021. "lsr r7, r12, #16\n\t"
  134022. "mul r6, r7, r6\n\t"
  134023. "lsr r7, r6, #16\n\t"
  134024. "lsl r6, r6, #16\n\t"
  134025. "adds r4, r4, r6\n\t"
  134026. "adcs r5, r5, r7\n\t"
  134027. "adc r3, r3, #0\n\t"
  134028. "lsr r6, r11, #16\n\t"
  134029. "lsr r7, r12, #16\n\t"
  134030. "mul r7, r6, r7\n\t"
  134031. "adds r5, r5, r7\n\t"
  134032. "adc r3, r3, #0\n\t"
  134033. "lsl r7, r12, #16\n\t"
  134034. "lsr r7, r7, #16\n\t"
  134035. "mul r6, r7, r6\n\t"
  134036. "lsr r7, r6, #16\n\t"
  134037. "lsl r6, r6, #16\n\t"
  134038. "adds r4, r4, r6\n\t"
  134039. "adcs r5, r5, r7\n\t"
  134040. "adc r3, r3, #0\n\t"
  134041. #else
  134042. "umull r6, r7, r11, r12\n\t"
  134043. "adds r4, r4, r6\n\t"
  134044. "adcs r5, r5, r7\n\t"
  134045. "adc r3, r3, #0\n\t"
  134046. #endif
  134047. /* A[13] * B[15] */
  134048. "ldr r8, [%[a], #52]\n\t"
  134049. "ldr r9, [%[b], #60]\n\t"
  134050. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  134051. "lsl r6, r8, #16\n\t"
  134052. "lsl r7, r9, #16\n\t"
  134053. "lsr r6, r6, #16\n\t"
  134054. "lsr r7, r7, #16\n\t"
  134055. "mul r7, r6, r7\n\t"
  134056. "adds r4, r4, r7\n\t"
  134057. "adcs r5, r5, #0\n\t"
  134058. "adc r3, r3, #0\n\t"
  134059. "lsr r7, r9, #16\n\t"
  134060. "mul r6, r7, r6\n\t"
  134061. "lsr r7, r6, #16\n\t"
  134062. "lsl r6, r6, #16\n\t"
  134063. "adds r4, r4, r6\n\t"
  134064. "adcs r5, r5, r7\n\t"
  134065. "adc r3, r3, #0\n\t"
  134066. "lsr r6, r8, #16\n\t"
  134067. "lsr r7, r9, #16\n\t"
  134068. "mul r7, r6, r7\n\t"
  134069. "adds r5, r5, r7\n\t"
  134070. "adc r3, r3, #0\n\t"
  134071. "lsl r7, r9, #16\n\t"
  134072. "lsr r7, r7, #16\n\t"
  134073. "mul r6, r7, r6\n\t"
  134074. "lsr r7, r6, #16\n\t"
  134075. "lsl r6, r6, #16\n\t"
  134076. "adds r4, r4, r6\n\t"
  134077. "adcs r5, r5, r7\n\t"
  134078. "adc r3, r3, #0\n\t"
  134079. #else
  134080. "umull r6, r7, r8, r9\n\t"
  134081. "adds r4, r4, r6\n\t"
  134082. "adcs r5, r5, r7\n\t"
  134083. "adc r3, r3, #0\n\t"
  134084. #endif
  134085. "str r4, [%[r], #112]\n\t"
  134086. /* A[14] * B[15] */
  134087. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  134088. "lsl r6, r11, #16\n\t"
  134089. "lsl r7, r9, #16\n\t"
  134090. "lsr r6, r6, #16\n\t"
  134091. "lsr r7, r7, #16\n\t"
  134092. "mul r7, r6, r7\n\t"
  134093. "adds r5, r5, r7\n\t"
  134094. "adcs r3, r3, #0\n\t"
  134095. "mov r4, #0\n\t"
  134096. "adc r4, r4, #0\n\t"
  134097. "lsr r7, r9, #16\n\t"
  134098. "mul r6, r7, r6\n\t"
  134099. "lsr r7, r6, #16\n\t"
  134100. "lsl r6, r6, #16\n\t"
  134101. "adds r5, r5, r6\n\t"
  134102. "adcs r3, r3, r7\n\t"
  134103. "adc r4, r4, #0\n\t"
  134104. "lsr r6, r11, #16\n\t"
  134105. "lsr r7, r9, #16\n\t"
  134106. "mul r7, r6, r7\n\t"
  134107. "adds r3, r3, r7\n\t"
  134108. "adc r4, r4, #0\n\t"
  134109. "lsl r7, r9, #16\n\t"
  134110. "lsr r7, r7, #16\n\t"
  134111. "mul r6, r7, r6\n\t"
  134112. "lsr r7, r6, #16\n\t"
  134113. "lsl r6, r6, #16\n\t"
  134114. "adds r5, r5, r6\n\t"
  134115. "adcs r3, r3, r7\n\t"
  134116. "adc r4, r4, #0\n\t"
  134117. #else
  134118. "umull r6, r7, r11, r9\n\t"
  134119. "adds r5, r5, r6\n\t"
  134120. "adcs r3, r3, r7\n\t"
  134121. "mov r4, #0\n\t"
  134122. "adc r4, r4, #0\n\t"
  134123. #endif
  134124. /* A[15] * B[14] */
  134125. "ldr r8, [%[a], #60]\n\t"
  134126. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  134127. "lsl r6, r8, #16\n\t"
  134128. "lsl r7, r12, #16\n\t"
  134129. "lsr r6, r6, #16\n\t"
  134130. "lsr r7, r7, #16\n\t"
  134131. "mul r7, r6, r7\n\t"
  134132. "adds r5, r5, r7\n\t"
  134133. "adcs r3, r3, #0\n\t"
  134134. "adc r4, r4, #0\n\t"
  134135. "lsr r7, r12, #16\n\t"
  134136. "mul r6, r7, r6\n\t"
  134137. "lsr r7, r6, #16\n\t"
  134138. "lsl r6, r6, #16\n\t"
  134139. "adds r5, r5, r6\n\t"
  134140. "adcs r3, r3, r7\n\t"
  134141. "adc r4, r4, #0\n\t"
  134142. "lsr r6, r8, #16\n\t"
  134143. "lsr r7, r12, #16\n\t"
  134144. "mul r7, r6, r7\n\t"
  134145. "adds r3, r3, r7\n\t"
  134146. "adc r4, r4, #0\n\t"
  134147. "lsl r7, r12, #16\n\t"
  134148. "lsr r7, r7, #16\n\t"
  134149. "mul r6, r7, r6\n\t"
  134150. "lsr r7, r6, #16\n\t"
  134151. "lsl r6, r6, #16\n\t"
  134152. "adds r5, r5, r6\n\t"
  134153. "adcs r3, r3, r7\n\t"
  134154. "adc r4, r4, #0\n\t"
  134155. #else
  134156. "umull r6, r7, r8, r12\n\t"
  134157. "adds r5, r5, r6\n\t"
  134158. "adcs r3, r3, r7\n\t"
  134159. "adc r4, r4, #0\n\t"
  134160. #endif
  134161. "str r5, [%[r], #116]\n\t"
  134162. /* A[15] * B[15] */
  134163. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  134164. "lsl r6, r8, #16\n\t"
  134165. "lsl r7, r9, #16\n\t"
  134166. "lsr r6, r6, #16\n\t"
  134167. "lsr r7, r7, #16\n\t"
  134168. "mul r7, r6, r7\n\t"
  134169. "adds r3, r3, r7\n\t"
  134170. "adc r4, r4, #0\n\t"
  134171. "lsr r7, r9, #16\n\t"
  134172. "mul r6, r7, r6\n\t"
  134173. "lsr r7, r6, #16\n\t"
  134174. "lsl r6, r6, #16\n\t"
  134175. "adds r3, r3, r6\n\t"
  134176. "adc r4, r4, r7\n\t"
  134177. "lsr r6, r8, #16\n\t"
  134178. "lsr r7, r9, #16\n\t"
  134179. "mul r7, r6, r7\n\t"
  134180. "add r4, r4, r7\n\t"
  134181. "lsl r7, r9, #16\n\t"
  134182. "lsr r7, r7, #16\n\t"
  134183. "mul r6, r7, r6\n\t"
  134184. "lsr r7, r6, #16\n\t"
  134185. "lsl r6, r6, #16\n\t"
  134186. "adds r3, r3, r6\n\t"
  134187. "adc r4, r4, r7\n\t"
  134188. #else
  134189. "umlal r3, r4, r8, r9\n\t"
  134190. #endif
  134191. "str r3, [%[r], #120]\n\t"
  134192. "str r4, [%[r], #124]\n\t"
  134193. "ldm sp!, {r3, r4, r5, r6}\n\t"
  134194. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  134195. "ldm sp!, {r3, r4, r5, r6}\n\t"
  134196. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  134197. "ldm sp!, {r3, r4, r5, r6}\n\t"
  134198. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  134199. "ldm sp!, {r3, r4, r5, r6}\n\t"
  134200. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  134201. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  134202. :
  134203. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r11", "r12", "cc"
  134204. );
  134205. }
  134206. /* Square a and put result in r. (r = a * a)
  134207. *
  134208. * r A single precision integer.
  134209. * a A single precision integer.
  134210. */
  134211. static void sp_1024_sqr_16(sp_digit* r_p, const sp_digit* a_p)
  134212. {
  134213. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  134214. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  134215. __asm__ __volatile__ (
  134216. "sub sp, sp, #0x40\n\t"
  134217. /* A[0] * A[0] */
  134218. "ldr r10, [%[a]]\n\t"
  134219. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  134220. "lsr r9, r10, #16\n\t"
  134221. "lsl r2, r10, #16\n\t"
  134222. "lsr r2, r2, #16\n\t"
  134223. "mul r8, r2, r2\n\t"
  134224. "mul r3, r9, r9\n\t"
  134225. "mul r2, r9, r2\n\t"
  134226. "lsr r9, r2, #15\n\t"
  134227. "lsl r2, r2, #17\n\t"
  134228. "adds r8, r8, r2\n\t"
  134229. "adc r3, r3, r9\n\t"
  134230. #else
  134231. "umull r8, r3, r10, r10\n\t"
  134232. #endif
  134233. "mov r4, #0\n\t"
  134234. "str r8, [sp]\n\t"
  134235. /* A[0] * A[1] */
  134236. "ldr r10, [%[a], #4]\n\t"
  134237. "ldr r12, [%[a]]\n\t"
  134238. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  134239. "lsl r8, r10, #16\n\t"
  134240. "lsl r9, r12, #16\n\t"
  134241. "lsr r8, r8, #16\n\t"
  134242. "lsr r9, r9, #16\n\t"
  134243. "mul r9, r8, r9\n\t"
  134244. "adds r3, r3, r9\n\t"
  134245. "adcs r4, r4, #0\n\t"
  134246. "mov r2, #0\n\t"
  134247. "adc r2, r2, #0\n\t"
  134248. "adds r3, r3, r9\n\t"
  134249. "adcs r4, r4, #0\n\t"
  134250. "adc r2, r2, #0\n\t"
  134251. "lsr r9, r12, #16\n\t"
  134252. "mul r8, r9, r8\n\t"
  134253. "lsr r9, r8, #16\n\t"
  134254. "lsl r8, r8, #16\n\t"
  134255. "adds r3, r3, r8\n\t"
  134256. "adcs r4, r4, r9\n\t"
  134257. "adc r2, r2, #0\n\t"
  134258. "adds r3, r3, r8\n\t"
  134259. "adcs r4, r4, r9\n\t"
  134260. "adc r2, r2, #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 r4, r4, r9\n\t"
  134265. "adc r2, r2, #0\n\t"
  134266. "adds r4, r4, r9\n\t"
  134267. "adc r2, r2, #0\n\t"
  134268. "lsl r9, r12, #16\n\t"
  134269. "lsr r9, r9, #16\n\t"
  134270. "mul r8, r9, r8\n\t"
  134271. "lsr r9, r8, #16\n\t"
  134272. "lsl r8, r8, #16\n\t"
  134273. "adds r3, r3, r8\n\t"
  134274. "adcs r4, r4, r9\n\t"
  134275. "adc r2, r2, #0\n\t"
  134276. "adds r3, r3, r8\n\t"
  134277. "adcs r4, r4, r9\n\t"
  134278. "adc r2, r2, #0\n\t"
  134279. #else
  134280. "umull r8, r9, r10, r12\n\t"
  134281. "adds r3, r3, r8\n\t"
  134282. "adcs r4, r4, r9\n\t"
  134283. "mov r2, #0\n\t"
  134284. "adc r2, r2, #0\n\t"
  134285. "adds r3, r3, r8\n\t"
  134286. "adcs r4, r4, r9\n\t"
  134287. "mov r2, #0\n\t"
  134288. "adc r2, r2, #0\n\t"
  134289. #endif
  134290. "str r3, [sp, #4]\n\t"
  134291. /* A[0] * A[2] */
  134292. "ldr r10, [%[a], #8]\n\t"
  134293. "ldr r12, [%[a]]\n\t"
  134294. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  134295. "lsl r8, r10, #16\n\t"
  134296. "lsl r9, r12, #16\n\t"
  134297. "lsr r8, r8, #16\n\t"
  134298. "lsr r9, r9, #16\n\t"
  134299. "mul r9, r8, r9\n\t"
  134300. "adds r4, r4, r9\n\t"
  134301. "adcs r2, r2, #0\n\t"
  134302. "mov r3, #0\n\t"
  134303. "adc r3, r3, #0\n\t"
  134304. "adds r4, r4, r9\n\t"
  134305. "adcs r2, r2, #0\n\t"
  134306. "adc r3, r3, #0\n\t"
  134307. "lsr r9, r12, #16\n\t"
  134308. "mul r8, r9, r8\n\t"
  134309. "lsr r9, r8, #16\n\t"
  134310. "lsl r8, r8, #16\n\t"
  134311. "adds r4, r4, r8\n\t"
  134312. "adcs r2, r2, r9\n\t"
  134313. "adc r3, r3, #0\n\t"
  134314. "adds r4, r4, r8\n\t"
  134315. "adcs r2, r2, r9\n\t"
  134316. "adc r3, r3, #0\n\t"
  134317. "lsr r8, r10, #16\n\t"
  134318. "lsr r9, r12, #16\n\t"
  134319. "mul r9, r8, r9\n\t"
  134320. "adds r2, r2, r9\n\t"
  134321. "adc r3, r3, #0\n\t"
  134322. "adds r2, r2, r9\n\t"
  134323. "adc r3, r3, #0\n\t"
  134324. "lsl r9, r12, #16\n\t"
  134325. "lsr r9, r9, #16\n\t"
  134326. "mul r8, r9, r8\n\t"
  134327. "lsr r9, r8, #16\n\t"
  134328. "lsl r8, r8, #16\n\t"
  134329. "adds r4, r4, r8\n\t"
  134330. "adcs r2, r2, r9\n\t"
  134331. "adc r3, r3, #0\n\t"
  134332. "adds r4, r4, r8\n\t"
  134333. "adcs r2, r2, r9\n\t"
  134334. "adc r3, r3, #0\n\t"
  134335. #else
  134336. "umull r8, r9, r10, r12\n\t"
  134337. "adds r4, r4, r8\n\t"
  134338. "adcs r2, r2, r9\n\t"
  134339. "mov r3, #0\n\t"
  134340. "adc r3, r3, #0\n\t"
  134341. "adds r4, r4, r8\n\t"
  134342. "adcs r2, r2, r9\n\t"
  134343. "mov r3, #0\n\t"
  134344. "adc r3, r3, #0\n\t"
  134345. #endif
  134346. /* A[1] * A[1] */
  134347. "ldr r10, [%[a], #4]\n\t"
  134348. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  134349. "lsl r8, r10, #16\n\t"
  134350. "lsr r9, r10, #16\n\t"
  134351. "lsr r8, r8, #16\n\t"
  134352. "mov r12, r8\n\t"
  134353. "mul r8, r12, r8\n\t"
  134354. "mov r12, r9\n\t"
  134355. "mul r9, r12, r9\n\t"
  134356. "adds r4, r4, r8\n\t"
  134357. "adcs r2, r2, r9\n\t"
  134358. "adc r3, r3, #0\n\t"
  134359. "lsr r9, r10, #16\n\t"
  134360. "lsl r8, r10, #16\n\t"
  134361. "lsr r8, r8, #16\n\t"
  134362. "mul r8, r9, r8\n\t"
  134363. "lsr r9, r8, #15\n\t"
  134364. "lsl r8, r8, #17\n\t"
  134365. "adds r4, r4, r8\n\t"
  134366. "adcs r2, r2, r9\n\t"
  134367. "adc r3, r3, #0\n\t"
  134368. #else
  134369. "umull r8, r9, r10, r10\n\t"
  134370. "adds r4, r4, r8\n\t"
  134371. "adcs r2, r2, r9\n\t"
  134372. "adc r3, r3, #0\n\t"
  134373. #endif
  134374. "str r4, [sp, #8]\n\t"
  134375. /* A[0] * A[3] */
  134376. "ldr r10, [%[a], #12]\n\t"
  134377. "ldr r12, [%[a]]\n\t"
  134378. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  134379. "lsl r8, r10, #16\n\t"
  134380. "lsl r9, r12, #16\n\t"
  134381. "lsr r8, r8, #16\n\t"
  134382. "lsr r9, r9, #16\n\t"
  134383. "mul r9, r8, r9\n\t"
  134384. "adds r2, r2, r9\n\t"
  134385. "adcs r3, r3, #0\n\t"
  134386. "mov r4, #0\n\t"
  134387. "adc r4, r4, #0\n\t"
  134388. "adds r2, r2, r9\n\t"
  134389. "adcs r3, r3, #0\n\t"
  134390. "adc r4, r4, #0\n\t"
  134391. "lsr r9, r12, #16\n\t"
  134392. "mul r8, r9, r8\n\t"
  134393. "lsr r9, r8, #16\n\t"
  134394. "lsl r8, r8, #16\n\t"
  134395. "adds r2, r2, r8\n\t"
  134396. "adcs r3, r3, r9\n\t"
  134397. "adc r4, r4, #0\n\t"
  134398. "adds r2, r2, r8\n\t"
  134399. "adcs r3, r3, r9\n\t"
  134400. "adc r4, r4, #0\n\t"
  134401. "lsr r8, r10, #16\n\t"
  134402. "lsr r9, r12, #16\n\t"
  134403. "mul r9, r8, r9\n\t"
  134404. "adds r3, r3, r9\n\t"
  134405. "adc r4, r4, #0\n\t"
  134406. "adds r3, r3, r9\n\t"
  134407. "adc r4, r4, #0\n\t"
  134408. "lsl r9, r12, #16\n\t"
  134409. "lsr r9, r9, #16\n\t"
  134410. "mul r8, r9, r8\n\t"
  134411. "lsr r9, r8, #16\n\t"
  134412. "lsl r8, r8, #16\n\t"
  134413. "adds r2, r2, r8\n\t"
  134414. "adcs r3, r3, r9\n\t"
  134415. "adc r4, r4, #0\n\t"
  134416. "adds r2, r2, r8\n\t"
  134417. "adcs r3, r3, r9\n\t"
  134418. "adc r4, r4, #0\n\t"
  134419. #else
  134420. "umull r8, r9, r10, r12\n\t"
  134421. "adds r2, r2, r8\n\t"
  134422. "adcs r3, r3, r9\n\t"
  134423. "mov r4, #0\n\t"
  134424. "adc r4, r4, #0\n\t"
  134425. "adds r2, r2, r8\n\t"
  134426. "adcs r3, r3, r9\n\t"
  134427. "mov r4, #0\n\t"
  134428. "adc r4, r4, #0\n\t"
  134429. #endif
  134430. /* A[1] * A[2] */
  134431. "ldr r10, [%[a], #8]\n\t"
  134432. "ldr r12, [%[a], #4]\n\t"
  134433. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  134434. "lsl r8, r10, #16\n\t"
  134435. "lsl r9, r12, #16\n\t"
  134436. "lsr r8, r8, #16\n\t"
  134437. "lsr r9, r9, #16\n\t"
  134438. "mul r9, r8, r9\n\t"
  134439. "adds r2, r2, r9\n\t"
  134440. "adcs r3, r3, #0\n\t"
  134441. "adc r4, r4, #0\n\t"
  134442. "adds r2, r2, r9\n\t"
  134443. "adcs r3, r3, #0\n\t"
  134444. "adc r4, r4, #0\n\t"
  134445. "lsr r9, r12, #16\n\t"
  134446. "mul r8, r9, r8\n\t"
  134447. "lsr r9, r8, #16\n\t"
  134448. "lsl r8, r8, #16\n\t"
  134449. "adds r2, r2, r8\n\t"
  134450. "adcs r3, r3, r9\n\t"
  134451. "adc r4, r4, #0\n\t"
  134452. "adds r2, r2, r8\n\t"
  134453. "adcs r3, r3, r9\n\t"
  134454. "adc r4, r4, #0\n\t"
  134455. "lsr r8, r10, #16\n\t"
  134456. "lsr r9, r12, #16\n\t"
  134457. "mul r9, r8, r9\n\t"
  134458. "adds r3, r3, r9\n\t"
  134459. "adc r4, r4, #0\n\t"
  134460. "adds r3, r3, r9\n\t"
  134461. "adc r4, r4, #0\n\t"
  134462. "lsl r9, r12, #16\n\t"
  134463. "lsr r9, r9, #16\n\t"
  134464. "mul r8, r9, r8\n\t"
  134465. "lsr r9, r8, #16\n\t"
  134466. "lsl r8, r8, #16\n\t"
  134467. "adds r2, r2, r8\n\t"
  134468. "adcs r3, r3, r9\n\t"
  134469. "adc r4, r4, #0\n\t"
  134470. "adds r2, r2, r8\n\t"
  134471. "adcs r3, r3, r9\n\t"
  134472. "adc r4, r4, #0\n\t"
  134473. #else
  134474. "umull r8, r9, r10, r12\n\t"
  134475. "adds r2, r2, r8\n\t"
  134476. "adcs r3, r3, r9\n\t"
  134477. "adc r4, r4, #0\n\t"
  134478. "adds r2, r2, r8\n\t"
  134479. "adcs r3, r3, r9\n\t"
  134480. "adc r4, r4, #0\n\t"
  134481. #endif
  134482. "str r2, [sp, #12]\n\t"
  134483. /* A[0] * A[4] */
  134484. "ldr r10, [%[a], #16]\n\t"
  134485. "ldr r12, [%[a]]\n\t"
  134486. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  134487. "lsl r8, r10, #16\n\t"
  134488. "lsl r9, r12, #16\n\t"
  134489. "lsr r8, r8, #16\n\t"
  134490. "lsr r9, r9, #16\n\t"
  134491. "mul r9, r8, r9\n\t"
  134492. "adds r3, r3, r9\n\t"
  134493. "adcs r4, r4, #0\n\t"
  134494. "mov r2, #0\n\t"
  134495. "adc r2, r2, #0\n\t"
  134496. "adds r3, r3, r9\n\t"
  134497. "adcs r4, r4, #0\n\t"
  134498. "adc r2, r2, #0\n\t"
  134499. "lsr r9, r12, #16\n\t"
  134500. "mul r8, r9, r8\n\t"
  134501. "lsr r9, r8, #16\n\t"
  134502. "lsl r8, r8, #16\n\t"
  134503. "adds r3, r3, r8\n\t"
  134504. "adcs r4, r4, r9\n\t"
  134505. "adc r2, r2, #0\n\t"
  134506. "adds r3, r3, r8\n\t"
  134507. "adcs r4, r4, r9\n\t"
  134508. "adc r2, r2, #0\n\t"
  134509. "lsr r8, r10, #16\n\t"
  134510. "lsr r9, r12, #16\n\t"
  134511. "mul r9, r8, r9\n\t"
  134512. "adds r4, r4, r9\n\t"
  134513. "adc r2, r2, #0\n\t"
  134514. "adds r4, r4, r9\n\t"
  134515. "adc r2, r2, #0\n\t"
  134516. "lsl r9, r12, #16\n\t"
  134517. "lsr r9, r9, #16\n\t"
  134518. "mul r8, r9, r8\n\t"
  134519. "lsr r9, r8, #16\n\t"
  134520. "lsl r8, r8, #16\n\t"
  134521. "adds r3, r3, r8\n\t"
  134522. "adcs r4, r4, r9\n\t"
  134523. "adc r2, r2, #0\n\t"
  134524. "adds r3, r3, r8\n\t"
  134525. "adcs r4, r4, r9\n\t"
  134526. "adc r2, r2, #0\n\t"
  134527. #else
  134528. "umull r8, r9, r10, r12\n\t"
  134529. "adds r3, r3, r8\n\t"
  134530. "adcs r4, r4, r9\n\t"
  134531. "mov r2, #0\n\t"
  134532. "adc r2, r2, #0\n\t"
  134533. "adds r3, r3, r8\n\t"
  134534. "adcs r4, r4, r9\n\t"
  134535. "mov r2, #0\n\t"
  134536. "adc r2, r2, #0\n\t"
  134537. #endif
  134538. /* A[1] * A[3] */
  134539. "ldr r10, [%[a], #12]\n\t"
  134540. "ldr r12, [%[a], #4]\n\t"
  134541. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  134542. "lsl r8, r10, #16\n\t"
  134543. "lsl r9, r12, #16\n\t"
  134544. "lsr r8, r8, #16\n\t"
  134545. "lsr r9, r9, #16\n\t"
  134546. "mul r9, r8, r9\n\t"
  134547. "adds r3, r3, r9\n\t"
  134548. "adcs r4, r4, #0\n\t"
  134549. "adc r2, r2, #0\n\t"
  134550. "adds r3, r3, r9\n\t"
  134551. "adcs r4, r4, #0\n\t"
  134552. "adc r2, r2, #0\n\t"
  134553. "lsr r9, r12, #16\n\t"
  134554. "mul r8, r9, r8\n\t"
  134555. "lsr r9, r8, #16\n\t"
  134556. "lsl r8, r8, #16\n\t"
  134557. "adds r3, r3, r8\n\t"
  134558. "adcs r4, r4, r9\n\t"
  134559. "adc r2, r2, #0\n\t"
  134560. "adds r3, r3, r8\n\t"
  134561. "adcs r4, r4, r9\n\t"
  134562. "adc r2, r2, #0\n\t"
  134563. "lsr r8, r10, #16\n\t"
  134564. "lsr r9, r12, #16\n\t"
  134565. "mul r9, r8, r9\n\t"
  134566. "adds r4, r4, r9\n\t"
  134567. "adc r2, r2, #0\n\t"
  134568. "adds r4, r4, r9\n\t"
  134569. "adc r2, r2, #0\n\t"
  134570. "lsl r9, r12, #16\n\t"
  134571. "lsr r9, r9, #16\n\t"
  134572. "mul r8, r9, r8\n\t"
  134573. "lsr r9, r8, #16\n\t"
  134574. "lsl r8, r8, #16\n\t"
  134575. "adds r3, r3, r8\n\t"
  134576. "adcs r4, r4, r9\n\t"
  134577. "adc r2, r2, #0\n\t"
  134578. "adds r3, r3, r8\n\t"
  134579. "adcs r4, r4, r9\n\t"
  134580. "adc r2, r2, #0\n\t"
  134581. #else
  134582. "umull r8, r9, r10, r12\n\t"
  134583. "adds r3, r3, r8\n\t"
  134584. "adcs r4, r4, r9\n\t"
  134585. "adc r2, r2, #0\n\t"
  134586. "adds r3, r3, r8\n\t"
  134587. "adcs r4, r4, r9\n\t"
  134588. "adc r2, r2, #0\n\t"
  134589. #endif
  134590. /* A[2] * A[2] */
  134591. "ldr r10, [%[a], #8]\n\t"
  134592. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  134593. "lsl r8, r10, #16\n\t"
  134594. "lsr r9, r10, #16\n\t"
  134595. "lsr r8, r8, #16\n\t"
  134596. "mov r12, r8\n\t"
  134597. "mul r8, r12, r8\n\t"
  134598. "mov r12, r9\n\t"
  134599. "mul r9, r12, r9\n\t"
  134600. "adds r3, r3, r8\n\t"
  134601. "adcs r4, r4, r9\n\t"
  134602. "adc r2, r2, #0\n\t"
  134603. "lsr r9, r10, #16\n\t"
  134604. "lsl r8, r10, #16\n\t"
  134605. "lsr r8, r8, #16\n\t"
  134606. "mul r8, r9, r8\n\t"
  134607. "lsr r9, r8, #15\n\t"
  134608. "lsl r8, r8, #17\n\t"
  134609. "adds r3, r3, r8\n\t"
  134610. "adcs r4, r4, r9\n\t"
  134611. "adc r2, r2, #0\n\t"
  134612. #else
  134613. "umull r8, r9, r10, r10\n\t"
  134614. "adds r3, r3, r8\n\t"
  134615. "adcs r4, r4, r9\n\t"
  134616. "adc r2, r2, #0\n\t"
  134617. #endif
  134618. "str r3, [sp, #16]\n\t"
  134619. /* A[0] * A[5] */
  134620. "ldr r10, [%[a], #20]\n\t"
  134621. "ldr r12, [%[a]]\n\t"
  134622. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  134623. "lsl r8, r10, #16\n\t"
  134624. "lsl r5, r12, #16\n\t"
  134625. "lsr r8, r8, #16\n\t"
  134626. "lsr r5, r5, #16\n\t"
  134627. "mul r5, r8, r5\n\t"
  134628. "lsr r9, r12, #16\n\t"
  134629. "mul r8, r9, r8\n\t"
  134630. "lsr r6, r8, #16\n\t"
  134631. "lsl r8, r8, #16\n\t"
  134632. "adds r5, r5, r8\n\t"
  134633. "adc r6, r6, #0\n\t"
  134634. "lsr r8, r10, #16\n\t"
  134635. "mul r9, r8, r9\n\t"
  134636. "add r6, r6, r9\n\t"
  134637. "lsl r9, r12, #16\n\t"
  134638. "lsr r9, r9, #16\n\t"
  134639. "mul r8, r9, r8\n\t"
  134640. "lsr r9, r8, #16\n\t"
  134641. "lsl r8, r8, #16\n\t"
  134642. "adds r5, r5, r8\n\t"
  134643. "adc r6, r6, r9\n\t"
  134644. #else
  134645. "umull r5, r6, r10, r12\n\t"
  134646. #endif
  134647. "mov r3, #0\n\t"
  134648. "mov r7, #0\n\t"
  134649. /* A[1] * A[4] */
  134650. "ldr r10, [%[a], #16]\n\t"
  134651. "ldr r12, [%[a], #4]\n\t"
  134652. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  134653. "lsl r8, r10, #16\n\t"
  134654. "lsl r9, r12, #16\n\t"
  134655. "lsr r8, r8, #16\n\t"
  134656. "lsr r9, r9, #16\n\t"
  134657. "mul r9, r8, r9\n\t"
  134658. "adds r5, r5, r9\n\t"
  134659. "adcs r6, r6, #0\n\t"
  134660. "adc r7, r7, #0\n\t"
  134661. "lsr r9, r12, #16\n\t"
  134662. "mul r8, r9, r8\n\t"
  134663. "lsr r9, r8, #16\n\t"
  134664. "lsl r8, r8, #16\n\t"
  134665. "adds r5, r5, r8\n\t"
  134666. "adcs r6, r6, r9\n\t"
  134667. "adc r7, r7, #0\n\t"
  134668. "lsr r8, r10, #16\n\t"
  134669. "lsr r9, r12, #16\n\t"
  134670. "mul r9, r8, r9\n\t"
  134671. "adds r6, r6, r9\n\t"
  134672. "adc r7, r7, #0\n\t"
  134673. "lsl r9, r12, #16\n\t"
  134674. "lsr r9, r9, #16\n\t"
  134675. "mul r8, r9, r8\n\t"
  134676. "lsr r9, r8, #16\n\t"
  134677. "lsl r8, r8, #16\n\t"
  134678. "adds r5, r5, r8\n\t"
  134679. "adcs r6, r6, r9\n\t"
  134680. "adc r7, r7, #0\n\t"
  134681. #else
  134682. "umull r8, r9, r10, r12\n\t"
  134683. "adds r5, r5, r8\n\t"
  134684. "adcs r6, r6, r9\n\t"
  134685. "adc r7, r7, #0\n\t"
  134686. #endif
  134687. /* A[2] * A[3] */
  134688. "ldr r10, [%[a], #12]\n\t"
  134689. "ldr r12, [%[a], #8]\n\t"
  134690. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  134691. "lsl r8, r10, #16\n\t"
  134692. "lsl r9, r12, #16\n\t"
  134693. "lsr r8, r8, #16\n\t"
  134694. "lsr r9, r9, #16\n\t"
  134695. "mul r9, r8, r9\n\t"
  134696. "adds r5, r5, r9\n\t"
  134697. "adcs r6, r6, #0\n\t"
  134698. "adc r7, r7, #0\n\t"
  134699. "lsr r9, r12, #16\n\t"
  134700. "mul r8, r9, r8\n\t"
  134701. "lsr r9, r8, #16\n\t"
  134702. "lsl r8, r8, #16\n\t"
  134703. "adds r5, r5, r8\n\t"
  134704. "adcs r6, r6, r9\n\t"
  134705. "adc r7, r7, #0\n\t"
  134706. "lsr r8, r10, #16\n\t"
  134707. "lsr r9, r12, #16\n\t"
  134708. "mul r9, r8, r9\n\t"
  134709. "adds r6, r6, r9\n\t"
  134710. "adc r7, r7, #0\n\t"
  134711. "lsl r9, r12, #16\n\t"
  134712. "lsr r9, r9, #16\n\t"
  134713. "mul r8, r9, r8\n\t"
  134714. "lsr r9, r8, #16\n\t"
  134715. "lsl r8, r8, #16\n\t"
  134716. "adds r5, r5, r8\n\t"
  134717. "adcs r6, r6, r9\n\t"
  134718. "adc r7, r7, #0\n\t"
  134719. #else
  134720. "umull r8, r9, r10, r12\n\t"
  134721. "adds r5, r5, r8\n\t"
  134722. "adcs r6, r6, r9\n\t"
  134723. "adc r7, r7, #0\n\t"
  134724. #endif
  134725. "adds r5, r5, r5\n\t"
  134726. "adcs r6, r6, r6\n\t"
  134727. "adc r7, r7, r7\n\t"
  134728. "adds r4, r4, r5\n\t"
  134729. "adcs r2, r2, r6\n\t"
  134730. "adc r3, r3, r7\n\t"
  134731. "str r4, [sp, #20]\n\t"
  134732. /* A[0] * A[6] */
  134733. "ldr r10, [%[a], #24]\n\t"
  134734. "ldr r12, [%[a]]\n\t"
  134735. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  134736. "lsl r8, r10, #16\n\t"
  134737. "lsl r5, r12, #16\n\t"
  134738. "lsr r8, r8, #16\n\t"
  134739. "lsr r5, r5, #16\n\t"
  134740. "mul r5, r8, r5\n\t"
  134741. "lsr r9, r12, #16\n\t"
  134742. "mul r8, r9, r8\n\t"
  134743. "lsr r6, r8, #16\n\t"
  134744. "lsl r8, r8, #16\n\t"
  134745. "adds r5, r5, r8\n\t"
  134746. "adc r6, r6, #0\n\t"
  134747. "lsr r8, r10, #16\n\t"
  134748. "mul r9, r8, r9\n\t"
  134749. "add r6, r6, r9\n\t"
  134750. "lsl r9, r12, #16\n\t"
  134751. "lsr r9, r9, #16\n\t"
  134752. "mul r8, r9, r8\n\t"
  134753. "lsr r9, r8, #16\n\t"
  134754. "lsl r8, r8, #16\n\t"
  134755. "adds r5, r5, r8\n\t"
  134756. "adc r6, r6, r9\n\t"
  134757. #else
  134758. "umull r5, r6, r10, r12\n\t"
  134759. #endif
  134760. "mov r4, #0\n\t"
  134761. "mov r7, #0\n\t"
  134762. /* A[1] * A[5] */
  134763. "ldr r10, [%[a], #20]\n\t"
  134764. "ldr r12, [%[a], #4]\n\t"
  134765. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  134766. "lsl r8, r10, #16\n\t"
  134767. "lsl r9, r12, #16\n\t"
  134768. "lsr r8, r8, #16\n\t"
  134769. "lsr r9, r9, #16\n\t"
  134770. "mul r9, r8, r9\n\t"
  134771. "adds r5, r5, r9\n\t"
  134772. "adcs r6, r6, #0\n\t"
  134773. "adc r7, r7, #0\n\t"
  134774. "lsr r9, r12, #16\n\t"
  134775. "mul r8, r9, r8\n\t"
  134776. "lsr r9, r8, #16\n\t"
  134777. "lsl r8, r8, #16\n\t"
  134778. "adds r5, r5, r8\n\t"
  134779. "adcs r6, r6, r9\n\t"
  134780. "adc r7, r7, #0\n\t"
  134781. "lsr r8, r10, #16\n\t"
  134782. "lsr r9, r12, #16\n\t"
  134783. "mul r9, r8, r9\n\t"
  134784. "adds r6, r6, r9\n\t"
  134785. "adc r7, r7, #0\n\t"
  134786. "lsl r9, r12, #16\n\t"
  134787. "lsr r9, r9, #16\n\t"
  134788. "mul r8, r9, r8\n\t"
  134789. "lsr r9, r8, #16\n\t"
  134790. "lsl r8, r8, #16\n\t"
  134791. "adds r5, r5, r8\n\t"
  134792. "adcs r6, r6, r9\n\t"
  134793. "adc r7, r7, #0\n\t"
  134794. #else
  134795. "umull r8, r9, r10, r12\n\t"
  134796. "adds r5, r5, r8\n\t"
  134797. "adcs r6, r6, r9\n\t"
  134798. "adc r7, r7, #0\n\t"
  134799. #endif
  134800. /* A[2] * A[4] */
  134801. "ldr r10, [%[a], #16]\n\t"
  134802. "ldr r12, [%[a], #8]\n\t"
  134803. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  134804. "lsl r8, r10, #16\n\t"
  134805. "lsl r9, r12, #16\n\t"
  134806. "lsr r8, r8, #16\n\t"
  134807. "lsr r9, r9, #16\n\t"
  134808. "mul r9, r8, r9\n\t"
  134809. "adds r5, r5, r9\n\t"
  134810. "adcs r6, r6, #0\n\t"
  134811. "adc r7, r7, #0\n\t"
  134812. "lsr r9, r12, #16\n\t"
  134813. "mul r8, r9, r8\n\t"
  134814. "lsr r9, r8, #16\n\t"
  134815. "lsl r8, r8, #16\n\t"
  134816. "adds r5, r5, r8\n\t"
  134817. "adcs r6, r6, r9\n\t"
  134818. "adc r7, r7, #0\n\t"
  134819. "lsr r8, r10, #16\n\t"
  134820. "lsr r9, r12, #16\n\t"
  134821. "mul r9, r8, r9\n\t"
  134822. "adds r6, r6, r9\n\t"
  134823. "adc r7, r7, #0\n\t"
  134824. "lsl r9, r12, #16\n\t"
  134825. "lsr r9, r9, #16\n\t"
  134826. "mul r8, r9, r8\n\t"
  134827. "lsr r9, r8, #16\n\t"
  134828. "lsl r8, r8, #16\n\t"
  134829. "adds r5, r5, r8\n\t"
  134830. "adcs r6, r6, r9\n\t"
  134831. "adc r7, r7, #0\n\t"
  134832. #else
  134833. "umull r8, r9, r10, r12\n\t"
  134834. "adds r5, r5, r8\n\t"
  134835. "adcs r6, r6, r9\n\t"
  134836. "adc r7, r7, #0\n\t"
  134837. #endif
  134838. /* A[3] * A[3] */
  134839. "ldr r10, [%[a], #12]\n\t"
  134840. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  134841. "lsl r8, r10, #16\n\t"
  134842. "lsr r9, r10, #16\n\t"
  134843. "lsr r8, r8, #16\n\t"
  134844. "mov r12, r8\n\t"
  134845. "mul r8, r12, r8\n\t"
  134846. "mov r12, r9\n\t"
  134847. "mul r9, r12, r9\n\t"
  134848. "adds r2, r2, r8\n\t"
  134849. "adcs r3, r3, r9\n\t"
  134850. "adc r4, r4, #0\n\t"
  134851. "lsr r9, r10, #16\n\t"
  134852. "lsl r8, r10, #16\n\t"
  134853. "lsr r8, r8, #16\n\t"
  134854. "mul r8, r9, r8\n\t"
  134855. "lsr r9, r8, #15\n\t"
  134856. "lsl r8, r8, #17\n\t"
  134857. "adds r2, r2, r8\n\t"
  134858. "adcs r3, r3, r9\n\t"
  134859. "adc r4, r4, #0\n\t"
  134860. "adds r5, r5, r5\n\t"
  134861. "adcs r6, r6, r6\n\t"
  134862. "adc r7, r7, r7\n\t"
  134863. #else
  134864. "umull r8, r9, r10, r10\n\t"
  134865. "adds r5, r5, r5\n\t"
  134866. "adcs r6, r6, r6\n\t"
  134867. "adc r7, r7, r7\n\t"
  134868. "adds r2, r2, r8\n\t"
  134869. "adcs r3, r3, r9\n\t"
  134870. "adc r4, r4, #0\n\t"
  134871. #endif
  134872. "adds r2, r2, r5\n\t"
  134873. "adcs r3, r3, r6\n\t"
  134874. "adc r4, r4, r7\n\t"
  134875. "str r2, [sp, #24]\n\t"
  134876. /* A[0] * A[7] */
  134877. "ldr r10, [%[a], #28]\n\t"
  134878. "ldr r12, [%[a]]\n\t"
  134879. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  134880. "lsl r8, r10, #16\n\t"
  134881. "lsl r5, r12, #16\n\t"
  134882. "lsr r8, r8, #16\n\t"
  134883. "lsr r5, r5, #16\n\t"
  134884. "mul r5, r8, r5\n\t"
  134885. "lsr r9, r12, #16\n\t"
  134886. "mul r8, r9, r8\n\t"
  134887. "lsr r6, r8, #16\n\t"
  134888. "lsl r8, r8, #16\n\t"
  134889. "adds r5, r5, r8\n\t"
  134890. "adc r6, r6, #0\n\t"
  134891. "lsr r8, r10, #16\n\t"
  134892. "mul r9, r8, r9\n\t"
  134893. "add r6, r6, r9\n\t"
  134894. "lsl r9, r12, #16\n\t"
  134895. "lsr r9, r9, #16\n\t"
  134896. "mul r8, r9, r8\n\t"
  134897. "lsr r9, r8, #16\n\t"
  134898. "lsl r8, r8, #16\n\t"
  134899. "adds r5, r5, r8\n\t"
  134900. "adc r6, r6, r9\n\t"
  134901. #else
  134902. "umull r5, r6, r10, r12\n\t"
  134903. #endif
  134904. "mov r2, #0\n\t"
  134905. "mov r7, #0\n\t"
  134906. /* A[1] * A[6] */
  134907. "ldr r10, [%[a], #24]\n\t"
  134908. "ldr r12, [%[a], #4]\n\t"
  134909. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  134910. "lsl r8, r10, #16\n\t"
  134911. "lsl r9, r12, #16\n\t"
  134912. "lsr r8, r8, #16\n\t"
  134913. "lsr r9, r9, #16\n\t"
  134914. "mul r9, r8, r9\n\t"
  134915. "adds r5, r5, r9\n\t"
  134916. "adcs r6, r6, #0\n\t"
  134917. "adc r7, r7, #0\n\t"
  134918. "lsr r9, r12, #16\n\t"
  134919. "mul r8, r9, r8\n\t"
  134920. "lsr r9, r8, #16\n\t"
  134921. "lsl r8, r8, #16\n\t"
  134922. "adds r5, r5, r8\n\t"
  134923. "adcs r6, r6, r9\n\t"
  134924. "adc r7, r7, #0\n\t"
  134925. "lsr r8, r10, #16\n\t"
  134926. "lsr r9, r12, #16\n\t"
  134927. "mul r9, r8, r9\n\t"
  134928. "adds r6, r6, r9\n\t"
  134929. "adc r7, r7, #0\n\t"
  134930. "lsl r9, r12, #16\n\t"
  134931. "lsr r9, r9, #16\n\t"
  134932. "mul r8, r9, r8\n\t"
  134933. "lsr r9, r8, #16\n\t"
  134934. "lsl r8, r8, #16\n\t"
  134935. "adds r5, r5, r8\n\t"
  134936. "adcs r6, r6, r9\n\t"
  134937. "adc r7, r7, #0\n\t"
  134938. #else
  134939. "umull r8, r9, r10, r12\n\t"
  134940. "adds r5, r5, r8\n\t"
  134941. "adcs r6, r6, r9\n\t"
  134942. "adc r7, r7, #0\n\t"
  134943. #endif
  134944. /* A[2] * A[5] */
  134945. "ldr r10, [%[a], #20]\n\t"
  134946. "ldr r12, [%[a], #8]\n\t"
  134947. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  134948. "lsl r8, r10, #16\n\t"
  134949. "lsl r9, r12, #16\n\t"
  134950. "lsr r8, r8, #16\n\t"
  134951. "lsr r9, r9, #16\n\t"
  134952. "mul r9, r8, r9\n\t"
  134953. "adds r5, r5, r9\n\t"
  134954. "adcs r6, r6, #0\n\t"
  134955. "adc r7, r7, #0\n\t"
  134956. "lsr r9, r12, #16\n\t"
  134957. "mul r8, r9, r8\n\t"
  134958. "lsr r9, r8, #16\n\t"
  134959. "lsl r8, r8, #16\n\t"
  134960. "adds r5, r5, r8\n\t"
  134961. "adcs r6, r6, r9\n\t"
  134962. "adc r7, r7, #0\n\t"
  134963. "lsr r8, r10, #16\n\t"
  134964. "lsr r9, r12, #16\n\t"
  134965. "mul r9, r8, r9\n\t"
  134966. "adds r6, r6, r9\n\t"
  134967. "adc r7, r7, #0\n\t"
  134968. "lsl r9, r12, #16\n\t"
  134969. "lsr r9, r9, #16\n\t"
  134970. "mul r8, r9, r8\n\t"
  134971. "lsr r9, r8, #16\n\t"
  134972. "lsl r8, r8, #16\n\t"
  134973. "adds r5, r5, r8\n\t"
  134974. "adcs r6, r6, r9\n\t"
  134975. "adc r7, r7, #0\n\t"
  134976. #else
  134977. "umull r8, r9, r10, r12\n\t"
  134978. "adds r5, r5, r8\n\t"
  134979. "adcs r6, r6, r9\n\t"
  134980. "adc r7, r7, #0\n\t"
  134981. #endif
  134982. /* A[3] * A[4] */
  134983. "ldr r10, [%[a], #16]\n\t"
  134984. "ldr r12, [%[a], #12]\n\t"
  134985. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  134986. "lsl r8, r10, #16\n\t"
  134987. "lsl r9, r12, #16\n\t"
  134988. "lsr r8, r8, #16\n\t"
  134989. "lsr r9, r9, #16\n\t"
  134990. "mul r9, r8, r9\n\t"
  134991. "adds r5, r5, r9\n\t"
  134992. "adcs r6, r6, #0\n\t"
  134993. "adc r7, r7, #0\n\t"
  134994. "lsr r9, r12, #16\n\t"
  134995. "mul r8, r9, r8\n\t"
  134996. "lsr r9, r8, #16\n\t"
  134997. "lsl r8, r8, #16\n\t"
  134998. "adds r5, r5, r8\n\t"
  134999. "adcs r6, r6, r9\n\t"
  135000. "adc r7, r7, #0\n\t"
  135001. "lsr r8, r10, #16\n\t"
  135002. "lsr r9, r12, #16\n\t"
  135003. "mul r9, r8, r9\n\t"
  135004. "adds r6, r6, r9\n\t"
  135005. "adc r7, r7, #0\n\t"
  135006. "lsl r9, r12, #16\n\t"
  135007. "lsr r9, r9, #16\n\t"
  135008. "mul r8, r9, r8\n\t"
  135009. "lsr r9, r8, #16\n\t"
  135010. "lsl r8, r8, #16\n\t"
  135011. "adds r5, r5, r8\n\t"
  135012. "adcs r6, r6, r9\n\t"
  135013. "adc r7, r7, #0\n\t"
  135014. #else
  135015. "umull r8, r9, r10, r12\n\t"
  135016. "adds r5, r5, r8\n\t"
  135017. "adcs r6, r6, r9\n\t"
  135018. "adc r7, r7, #0\n\t"
  135019. #endif
  135020. "adds r5, r5, r5\n\t"
  135021. "adcs r6, r6, r6\n\t"
  135022. "adc r7, r7, r7\n\t"
  135023. "adds r3, r3, r5\n\t"
  135024. "adcs r4, r4, r6\n\t"
  135025. "adc r2, r2, r7\n\t"
  135026. "str r3, [sp, #28]\n\t"
  135027. /* A[0] * A[8] */
  135028. "ldr r10, [%[a], #32]\n\t"
  135029. "ldr r12, [%[a]]\n\t"
  135030. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  135031. "lsl r8, r10, #16\n\t"
  135032. "lsl r5, r12, #16\n\t"
  135033. "lsr r8, r8, #16\n\t"
  135034. "lsr r5, r5, #16\n\t"
  135035. "mul r5, r8, r5\n\t"
  135036. "lsr r9, r12, #16\n\t"
  135037. "mul r8, r9, r8\n\t"
  135038. "lsr r6, r8, #16\n\t"
  135039. "lsl r8, r8, #16\n\t"
  135040. "adds r5, r5, r8\n\t"
  135041. "adc r6, r6, #0\n\t"
  135042. "lsr r8, r10, #16\n\t"
  135043. "mul r9, r8, r9\n\t"
  135044. "add r6, r6, r9\n\t"
  135045. "lsl r9, r12, #16\n\t"
  135046. "lsr r9, r9, #16\n\t"
  135047. "mul r8, r9, r8\n\t"
  135048. "lsr r9, r8, #16\n\t"
  135049. "lsl r8, r8, #16\n\t"
  135050. "adds r5, r5, r8\n\t"
  135051. "adc r6, r6, r9\n\t"
  135052. #else
  135053. "umull r5, r6, r10, r12\n\t"
  135054. #endif
  135055. "mov r3, #0\n\t"
  135056. "mov r7, #0\n\t"
  135057. /* A[1] * A[7] */
  135058. "ldr r10, [%[a], #28]\n\t"
  135059. "ldr r12, [%[a], #4]\n\t"
  135060. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  135061. "lsl r8, r10, #16\n\t"
  135062. "lsl r9, r12, #16\n\t"
  135063. "lsr r8, r8, #16\n\t"
  135064. "lsr r9, r9, #16\n\t"
  135065. "mul r9, r8, r9\n\t"
  135066. "adds r5, r5, r9\n\t"
  135067. "adcs r6, r6, #0\n\t"
  135068. "adc r7, r7, #0\n\t"
  135069. "lsr r9, r12, #16\n\t"
  135070. "mul r8, r9, r8\n\t"
  135071. "lsr r9, r8, #16\n\t"
  135072. "lsl r8, r8, #16\n\t"
  135073. "adds r5, r5, r8\n\t"
  135074. "adcs r6, r6, r9\n\t"
  135075. "adc r7, r7, #0\n\t"
  135076. "lsr r8, r10, #16\n\t"
  135077. "lsr r9, r12, #16\n\t"
  135078. "mul r9, r8, r9\n\t"
  135079. "adds r6, r6, r9\n\t"
  135080. "adc r7, r7, #0\n\t"
  135081. "lsl r9, r12, #16\n\t"
  135082. "lsr r9, r9, #16\n\t"
  135083. "mul r8, r9, r8\n\t"
  135084. "lsr r9, r8, #16\n\t"
  135085. "lsl r8, r8, #16\n\t"
  135086. "adds r5, r5, r8\n\t"
  135087. "adcs r6, r6, r9\n\t"
  135088. "adc r7, r7, #0\n\t"
  135089. #else
  135090. "umull r8, r9, r10, r12\n\t"
  135091. "adds r5, r5, r8\n\t"
  135092. "adcs r6, r6, r9\n\t"
  135093. "adc r7, r7, #0\n\t"
  135094. #endif
  135095. /* A[2] * A[6] */
  135096. "ldr r10, [%[a], #24]\n\t"
  135097. "ldr r12, [%[a], #8]\n\t"
  135098. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  135099. "lsl r8, r10, #16\n\t"
  135100. "lsl r9, r12, #16\n\t"
  135101. "lsr r8, r8, #16\n\t"
  135102. "lsr r9, r9, #16\n\t"
  135103. "mul r9, r8, r9\n\t"
  135104. "adds r5, r5, r9\n\t"
  135105. "adcs r6, r6, #0\n\t"
  135106. "adc r7, r7, #0\n\t"
  135107. "lsr r9, r12, #16\n\t"
  135108. "mul r8, r9, r8\n\t"
  135109. "lsr r9, r8, #16\n\t"
  135110. "lsl r8, r8, #16\n\t"
  135111. "adds r5, r5, r8\n\t"
  135112. "adcs r6, r6, r9\n\t"
  135113. "adc r7, r7, #0\n\t"
  135114. "lsr r8, r10, #16\n\t"
  135115. "lsr r9, r12, #16\n\t"
  135116. "mul r9, r8, r9\n\t"
  135117. "adds r6, r6, r9\n\t"
  135118. "adc r7, r7, #0\n\t"
  135119. "lsl r9, r12, #16\n\t"
  135120. "lsr r9, r9, #16\n\t"
  135121. "mul r8, r9, r8\n\t"
  135122. "lsr r9, r8, #16\n\t"
  135123. "lsl r8, r8, #16\n\t"
  135124. "adds r5, r5, r8\n\t"
  135125. "adcs r6, r6, r9\n\t"
  135126. "adc r7, r7, #0\n\t"
  135127. #else
  135128. "umull r8, r9, r10, r12\n\t"
  135129. "adds r5, r5, r8\n\t"
  135130. "adcs r6, r6, r9\n\t"
  135131. "adc r7, r7, #0\n\t"
  135132. #endif
  135133. /* A[3] * A[5] */
  135134. "ldr r10, [%[a], #20]\n\t"
  135135. "ldr r12, [%[a], #12]\n\t"
  135136. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  135137. "lsl r8, r10, #16\n\t"
  135138. "lsl r9, r12, #16\n\t"
  135139. "lsr r8, r8, #16\n\t"
  135140. "lsr r9, r9, #16\n\t"
  135141. "mul r9, r8, r9\n\t"
  135142. "adds r5, r5, r9\n\t"
  135143. "adcs r6, r6, #0\n\t"
  135144. "adc r7, r7, #0\n\t"
  135145. "lsr r9, r12, #16\n\t"
  135146. "mul r8, r9, r8\n\t"
  135147. "lsr r9, r8, #16\n\t"
  135148. "lsl r8, r8, #16\n\t"
  135149. "adds r5, r5, r8\n\t"
  135150. "adcs r6, r6, r9\n\t"
  135151. "adc r7, r7, #0\n\t"
  135152. "lsr r8, r10, #16\n\t"
  135153. "lsr r9, r12, #16\n\t"
  135154. "mul r9, r8, r9\n\t"
  135155. "adds r6, r6, r9\n\t"
  135156. "adc r7, r7, #0\n\t"
  135157. "lsl r9, r12, #16\n\t"
  135158. "lsr r9, r9, #16\n\t"
  135159. "mul r8, r9, r8\n\t"
  135160. "lsr r9, r8, #16\n\t"
  135161. "lsl r8, r8, #16\n\t"
  135162. "adds r5, r5, r8\n\t"
  135163. "adcs r6, r6, r9\n\t"
  135164. "adc r7, r7, #0\n\t"
  135165. #else
  135166. "umull r8, r9, r10, r12\n\t"
  135167. "adds r5, r5, r8\n\t"
  135168. "adcs r6, r6, r9\n\t"
  135169. "adc r7, r7, #0\n\t"
  135170. #endif
  135171. /* A[4] * A[4] */
  135172. "ldr r10, [%[a], #16]\n\t"
  135173. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  135174. "lsl r8, r10, #16\n\t"
  135175. "lsr r9, r10, #16\n\t"
  135176. "lsr r8, r8, #16\n\t"
  135177. "mov r12, r8\n\t"
  135178. "mul r8, r12, r8\n\t"
  135179. "mov r12, r9\n\t"
  135180. "mul r9, r12, r9\n\t"
  135181. "adds r4, r4, r8\n\t"
  135182. "adcs r2, r2, r9\n\t"
  135183. "adc r3, r3, #0\n\t"
  135184. "lsr r9, r10, #16\n\t"
  135185. "lsl r8, r10, #16\n\t"
  135186. "lsr r8, r8, #16\n\t"
  135187. "mul r8, r9, r8\n\t"
  135188. "lsr r9, r8, #15\n\t"
  135189. "lsl r8, r8, #17\n\t"
  135190. "adds r4, r4, r8\n\t"
  135191. "adcs r2, r2, r9\n\t"
  135192. "adc r3, r3, #0\n\t"
  135193. "adds r5, r5, r5\n\t"
  135194. "adcs r6, r6, r6\n\t"
  135195. "adc r7, r7, r7\n\t"
  135196. #else
  135197. "umull r8, r9, r10, r10\n\t"
  135198. "adds r5, r5, r5\n\t"
  135199. "adcs r6, r6, r6\n\t"
  135200. "adc r7, r7, r7\n\t"
  135201. "adds r4, r4, r8\n\t"
  135202. "adcs r2, r2, r9\n\t"
  135203. "adc r3, r3, #0\n\t"
  135204. #endif
  135205. "adds r4, r4, r5\n\t"
  135206. "adcs r2, r2, r6\n\t"
  135207. "adc r3, r3, r7\n\t"
  135208. "str r4, [sp, #32]\n\t"
  135209. /* A[0] * A[9] */
  135210. "ldr r10, [%[a], #36]\n\t"
  135211. "ldr r12, [%[a]]\n\t"
  135212. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  135213. "lsl r8, r10, #16\n\t"
  135214. "lsl r5, r12, #16\n\t"
  135215. "lsr r8, r8, #16\n\t"
  135216. "lsr r5, r5, #16\n\t"
  135217. "mul r5, r8, r5\n\t"
  135218. "lsr r9, r12, #16\n\t"
  135219. "mul r8, r9, r8\n\t"
  135220. "lsr r6, r8, #16\n\t"
  135221. "lsl r8, r8, #16\n\t"
  135222. "adds r5, r5, r8\n\t"
  135223. "adc r6, r6, #0\n\t"
  135224. "lsr r8, r10, #16\n\t"
  135225. "mul r9, r8, r9\n\t"
  135226. "add r6, r6, r9\n\t"
  135227. "lsl r9, r12, #16\n\t"
  135228. "lsr r9, r9, #16\n\t"
  135229. "mul r8, r9, r8\n\t"
  135230. "lsr r9, r8, #16\n\t"
  135231. "lsl r8, r8, #16\n\t"
  135232. "adds r5, r5, r8\n\t"
  135233. "adc r6, r6, r9\n\t"
  135234. #else
  135235. "umull r5, r6, r10, r12\n\t"
  135236. #endif
  135237. "mov r4, #0\n\t"
  135238. "mov r7, #0\n\t"
  135239. /* A[1] * A[8] */
  135240. "ldr r10, [%[a], #32]\n\t"
  135241. "ldr r12, [%[a], #4]\n\t"
  135242. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  135243. "lsl r8, r10, #16\n\t"
  135244. "lsl r9, r12, #16\n\t"
  135245. "lsr r8, r8, #16\n\t"
  135246. "lsr r9, r9, #16\n\t"
  135247. "mul r9, r8, r9\n\t"
  135248. "adds r5, r5, r9\n\t"
  135249. "adcs r6, r6, #0\n\t"
  135250. "adc r7, r7, #0\n\t"
  135251. "lsr r9, r12, #16\n\t"
  135252. "mul r8, r9, r8\n\t"
  135253. "lsr r9, r8, #16\n\t"
  135254. "lsl r8, r8, #16\n\t"
  135255. "adds r5, r5, r8\n\t"
  135256. "adcs r6, r6, r9\n\t"
  135257. "adc r7, r7, #0\n\t"
  135258. "lsr r8, r10, #16\n\t"
  135259. "lsr r9, r12, #16\n\t"
  135260. "mul r9, r8, r9\n\t"
  135261. "adds r6, r6, r9\n\t"
  135262. "adc r7, r7, #0\n\t"
  135263. "lsl r9, r12, #16\n\t"
  135264. "lsr r9, r9, #16\n\t"
  135265. "mul r8, r9, r8\n\t"
  135266. "lsr r9, r8, #16\n\t"
  135267. "lsl r8, r8, #16\n\t"
  135268. "adds r5, r5, r8\n\t"
  135269. "adcs r6, r6, r9\n\t"
  135270. "adc r7, r7, #0\n\t"
  135271. #else
  135272. "umull r8, r9, r10, r12\n\t"
  135273. "adds r5, r5, r8\n\t"
  135274. "adcs r6, r6, r9\n\t"
  135275. "adc r7, r7, #0\n\t"
  135276. #endif
  135277. /* A[2] * A[7] */
  135278. "ldr r10, [%[a], #28]\n\t"
  135279. "ldr r12, [%[a], #8]\n\t"
  135280. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  135281. "lsl r8, r10, #16\n\t"
  135282. "lsl r9, r12, #16\n\t"
  135283. "lsr r8, r8, #16\n\t"
  135284. "lsr r9, r9, #16\n\t"
  135285. "mul r9, r8, r9\n\t"
  135286. "adds r5, r5, r9\n\t"
  135287. "adcs r6, r6, #0\n\t"
  135288. "adc r7, r7, #0\n\t"
  135289. "lsr r9, r12, #16\n\t"
  135290. "mul r8, r9, r8\n\t"
  135291. "lsr r9, r8, #16\n\t"
  135292. "lsl r8, r8, #16\n\t"
  135293. "adds r5, r5, r8\n\t"
  135294. "adcs r6, r6, r9\n\t"
  135295. "adc r7, r7, #0\n\t"
  135296. "lsr r8, r10, #16\n\t"
  135297. "lsr r9, r12, #16\n\t"
  135298. "mul r9, r8, r9\n\t"
  135299. "adds r6, r6, r9\n\t"
  135300. "adc r7, r7, #0\n\t"
  135301. "lsl r9, r12, #16\n\t"
  135302. "lsr r9, r9, #16\n\t"
  135303. "mul r8, r9, r8\n\t"
  135304. "lsr r9, r8, #16\n\t"
  135305. "lsl r8, r8, #16\n\t"
  135306. "adds r5, r5, r8\n\t"
  135307. "adcs r6, r6, r9\n\t"
  135308. "adc r7, r7, #0\n\t"
  135309. #else
  135310. "umull r8, r9, r10, r12\n\t"
  135311. "adds r5, r5, r8\n\t"
  135312. "adcs r6, r6, r9\n\t"
  135313. "adc r7, r7, #0\n\t"
  135314. #endif
  135315. /* A[3] * A[6] */
  135316. "ldr r10, [%[a], #24]\n\t"
  135317. "ldr r12, [%[a], #12]\n\t"
  135318. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  135319. "lsl r8, r10, #16\n\t"
  135320. "lsl r9, r12, #16\n\t"
  135321. "lsr r8, r8, #16\n\t"
  135322. "lsr r9, r9, #16\n\t"
  135323. "mul r9, r8, r9\n\t"
  135324. "adds r5, r5, r9\n\t"
  135325. "adcs r6, r6, #0\n\t"
  135326. "adc r7, r7, #0\n\t"
  135327. "lsr r9, r12, #16\n\t"
  135328. "mul r8, r9, r8\n\t"
  135329. "lsr r9, r8, #16\n\t"
  135330. "lsl r8, r8, #16\n\t"
  135331. "adds r5, r5, r8\n\t"
  135332. "adcs r6, r6, r9\n\t"
  135333. "adc r7, r7, #0\n\t"
  135334. "lsr r8, r10, #16\n\t"
  135335. "lsr r9, r12, #16\n\t"
  135336. "mul r9, r8, r9\n\t"
  135337. "adds r6, r6, r9\n\t"
  135338. "adc r7, r7, #0\n\t"
  135339. "lsl r9, r12, #16\n\t"
  135340. "lsr r9, r9, #16\n\t"
  135341. "mul r8, r9, r8\n\t"
  135342. "lsr r9, r8, #16\n\t"
  135343. "lsl r8, r8, #16\n\t"
  135344. "adds r5, r5, r8\n\t"
  135345. "adcs r6, r6, r9\n\t"
  135346. "adc r7, r7, #0\n\t"
  135347. #else
  135348. "umull r8, r9, r10, r12\n\t"
  135349. "adds r5, r5, r8\n\t"
  135350. "adcs r6, r6, r9\n\t"
  135351. "adc r7, r7, #0\n\t"
  135352. #endif
  135353. /* A[4] * A[5] */
  135354. "ldr r10, [%[a], #20]\n\t"
  135355. "ldr r12, [%[a], #16]\n\t"
  135356. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  135357. "lsl r8, r10, #16\n\t"
  135358. "lsl r9, r12, #16\n\t"
  135359. "lsr r8, r8, #16\n\t"
  135360. "lsr r9, r9, #16\n\t"
  135361. "mul r9, r8, r9\n\t"
  135362. "adds r5, r5, r9\n\t"
  135363. "adcs r6, r6, #0\n\t"
  135364. "adc r7, r7, #0\n\t"
  135365. "lsr r9, r12, #16\n\t"
  135366. "mul r8, r9, r8\n\t"
  135367. "lsr r9, r8, #16\n\t"
  135368. "lsl r8, r8, #16\n\t"
  135369. "adds r5, r5, r8\n\t"
  135370. "adcs r6, r6, r9\n\t"
  135371. "adc r7, r7, #0\n\t"
  135372. "lsr r8, r10, #16\n\t"
  135373. "lsr r9, r12, #16\n\t"
  135374. "mul r9, r8, r9\n\t"
  135375. "adds r6, r6, r9\n\t"
  135376. "adc r7, r7, #0\n\t"
  135377. "lsl r9, r12, #16\n\t"
  135378. "lsr r9, r9, #16\n\t"
  135379. "mul r8, r9, r8\n\t"
  135380. "lsr r9, r8, #16\n\t"
  135381. "lsl r8, r8, #16\n\t"
  135382. "adds r5, r5, r8\n\t"
  135383. "adcs r6, r6, r9\n\t"
  135384. "adc r7, r7, #0\n\t"
  135385. #else
  135386. "umull r8, r9, r10, r12\n\t"
  135387. "adds r5, r5, r8\n\t"
  135388. "adcs r6, r6, r9\n\t"
  135389. "adc r7, r7, #0\n\t"
  135390. #endif
  135391. "adds r5, r5, r5\n\t"
  135392. "adcs r6, r6, r6\n\t"
  135393. "adc r7, r7, r7\n\t"
  135394. "adds r2, r2, r5\n\t"
  135395. "adcs r3, r3, r6\n\t"
  135396. "adc r4, r4, r7\n\t"
  135397. "str r2, [sp, #36]\n\t"
  135398. /* A[0] * A[10] */
  135399. "ldr r10, [%[a], #40]\n\t"
  135400. "ldr r12, [%[a]]\n\t"
  135401. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  135402. "lsl r8, r10, #16\n\t"
  135403. "lsl r5, r12, #16\n\t"
  135404. "lsr r8, r8, #16\n\t"
  135405. "lsr r5, r5, #16\n\t"
  135406. "mul r5, r8, r5\n\t"
  135407. "lsr r9, r12, #16\n\t"
  135408. "mul r8, r9, r8\n\t"
  135409. "lsr r6, r8, #16\n\t"
  135410. "lsl r8, r8, #16\n\t"
  135411. "adds r5, r5, r8\n\t"
  135412. "adc r6, r6, #0\n\t"
  135413. "lsr r8, r10, #16\n\t"
  135414. "mul r9, r8, r9\n\t"
  135415. "add r6, r6, r9\n\t"
  135416. "lsl r9, r12, #16\n\t"
  135417. "lsr r9, r9, #16\n\t"
  135418. "mul r8, r9, r8\n\t"
  135419. "lsr r9, r8, #16\n\t"
  135420. "lsl r8, r8, #16\n\t"
  135421. "adds r5, r5, r8\n\t"
  135422. "adc r6, r6, r9\n\t"
  135423. #else
  135424. "umull r5, r6, r10, r12\n\t"
  135425. #endif
  135426. "mov r2, #0\n\t"
  135427. "mov r7, #0\n\t"
  135428. /* A[1] * A[9] */
  135429. "ldr r10, [%[a], #36]\n\t"
  135430. "ldr r12, [%[a], #4]\n\t"
  135431. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  135432. "lsl r8, r10, #16\n\t"
  135433. "lsl r9, r12, #16\n\t"
  135434. "lsr r8, r8, #16\n\t"
  135435. "lsr r9, r9, #16\n\t"
  135436. "mul r9, r8, r9\n\t"
  135437. "adds r5, r5, r9\n\t"
  135438. "adcs r6, r6, #0\n\t"
  135439. "adc r7, r7, #0\n\t"
  135440. "lsr r9, r12, #16\n\t"
  135441. "mul r8, r9, r8\n\t"
  135442. "lsr r9, r8, #16\n\t"
  135443. "lsl r8, r8, #16\n\t"
  135444. "adds r5, r5, r8\n\t"
  135445. "adcs r6, r6, r9\n\t"
  135446. "adc r7, r7, #0\n\t"
  135447. "lsr r8, r10, #16\n\t"
  135448. "lsr r9, r12, #16\n\t"
  135449. "mul r9, r8, r9\n\t"
  135450. "adds r6, r6, r9\n\t"
  135451. "adc r7, r7, #0\n\t"
  135452. "lsl r9, r12, #16\n\t"
  135453. "lsr r9, r9, #16\n\t"
  135454. "mul r8, r9, r8\n\t"
  135455. "lsr r9, r8, #16\n\t"
  135456. "lsl r8, r8, #16\n\t"
  135457. "adds r5, r5, r8\n\t"
  135458. "adcs r6, r6, r9\n\t"
  135459. "adc r7, r7, #0\n\t"
  135460. #else
  135461. "umull r8, r9, r10, r12\n\t"
  135462. "adds r5, r5, r8\n\t"
  135463. "adcs r6, r6, r9\n\t"
  135464. "adc r7, r7, #0\n\t"
  135465. #endif
  135466. /* A[2] * A[8] */
  135467. "ldr r10, [%[a], #32]\n\t"
  135468. "ldr r12, [%[a], #8]\n\t"
  135469. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  135470. "lsl r8, r10, #16\n\t"
  135471. "lsl r9, r12, #16\n\t"
  135472. "lsr r8, r8, #16\n\t"
  135473. "lsr r9, r9, #16\n\t"
  135474. "mul r9, r8, r9\n\t"
  135475. "adds r5, r5, r9\n\t"
  135476. "adcs r6, r6, #0\n\t"
  135477. "adc r7, r7, #0\n\t"
  135478. "lsr r9, r12, #16\n\t"
  135479. "mul r8, r9, r8\n\t"
  135480. "lsr r9, r8, #16\n\t"
  135481. "lsl r8, r8, #16\n\t"
  135482. "adds r5, r5, r8\n\t"
  135483. "adcs r6, r6, r9\n\t"
  135484. "adc r7, r7, #0\n\t"
  135485. "lsr r8, r10, #16\n\t"
  135486. "lsr r9, r12, #16\n\t"
  135487. "mul r9, r8, r9\n\t"
  135488. "adds r6, r6, r9\n\t"
  135489. "adc r7, r7, #0\n\t"
  135490. "lsl r9, r12, #16\n\t"
  135491. "lsr r9, r9, #16\n\t"
  135492. "mul r8, r9, r8\n\t"
  135493. "lsr r9, r8, #16\n\t"
  135494. "lsl r8, r8, #16\n\t"
  135495. "adds r5, r5, r8\n\t"
  135496. "adcs r6, r6, r9\n\t"
  135497. "adc r7, r7, #0\n\t"
  135498. #else
  135499. "umull r8, r9, r10, r12\n\t"
  135500. "adds r5, r5, r8\n\t"
  135501. "adcs r6, r6, r9\n\t"
  135502. "adc r7, r7, #0\n\t"
  135503. #endif
  135504. /* A[3] * A[7] */
  135505. "ldr r10, [%[a], #28]\n\t"
  135506. "ldr r12, [%[a], #12]\n\t"
  135507. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  135508. "lsl r8, r10, #16\n\t"
  135509. "lsl r9, r12, #16\n\t"
  135510. "lsr r8, r8, #16\n\t"
  135511. "lsr r9, r9, #16\n\t"
  135512. "mul r9, r8, r9\n\t"
  135513. "adds r5, r5, r9\n\t"
  135514. "adcs r6, r6, #0\n\t"
  135515. "adc r7, r7, #0\n\t"
  135516. "lsr r9, r12, #16\n\t"
  135517. "mul r8, r9, r8\n\t"
  135518. "lsr r9, r8, #16\n\t"
  135519. "lsl r8, r8, #16\n\t"
  135520. "adds r5, r5, r8\n\t"
  135521. "adcs r6, r6, r9\n\t"
  135522. "adc r7, r7, #0\n\t"
  135523. "lsr r8, r10, #16\n\t"
  135524. "lsr r9, r12, #16\n\t"
  135525. "mul r9, r8, r9\n\t"
  135526. "adds r6, r6, r9\n\t"
  135527. "adc r7, r7, #0\n\t"
  135528. "lsl r9, r12, #16\n\t"
  135529. "lsr r9, r9, #16\n\t"
  135530. "mul r8, r9, r8\n\t"
  135531. "lsr r9, r8, #16\n\t"
  135532. "lsl r8, r8, #16\n\t"
  135533. "adds r5, r5, r8\n\t"
  135534. "adcs r6, r6, r9\n\t"
  135535. "adc r7, r7, #0\n\t"
  135536. #else
  135537. "umull r8, r9, r10, r12\n\t"
  135538. "adds r5, r5, r8\n\t"
  135539. "adcs r6, r6, r9\n\t"
  135540. "adc r7, r7, #0\n\t"
  135541. #endif
  135542. /* A[4] * A[6] */
  135543. "ldr r10, [%[a], #24]\n\t"
  135544. "ldr r12, [%[a], #16]\n\t"
  135545. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  135546. "lsl r8, r10, #16\n\t"
  135547. "lsl r9, r12, #16\n\t"
  135548. "lsr r8, r8, #16\n\t"
  135549. "lsr r9, r9, #16\n\t"
  135550. "mul r9, r8, r9\n\t"
  135551. "adds r5, r5, r9\n\t"
  135552. "adcs r6, r6, #0\n\t"
  135553. "adc r7, r7, #0\n\t"
  135554. "lsr r9, r12, #16\n\t"
  135555. "mul r8, r9, r8\n\t"
  135556. "lsr r9, r8, #16\n\t"
  135557. "lsl r8, r8, #16\n\t"
  135558. "adds r5, r5, r8\n\t"
  135559. "adcs r6, r6, r9\n\t"
  135560. "adc r7, r7, #0\n\t"
  135561. "lsr r8, r10, #16\n\t"
  135562. "lsr r9, r12, #16\n\t"
  135563. "mul r9, r8, r9\n\t"
  135564. "adds r6, r6, r9\n\t"
  135565. "adc r7, r7, #0\n\t"
  135566. "lsl r9, r12, #16\n\t"
  135567. "lsr r9, r9, #16\n\t"
  135568. "mul r8, r9, r8\n\t"
  135569. "lsr r9, r8, #16\n\t"
  135570. "lsl r8, r8, #16\n\t"
  135571. "adds r5, r5, r8\n\t"
  135572. "adcs r6, r6, r9\n\t"
  135573. "adc r7, r7, #0\n\t"
  135574. #else
  135575. "umull r8, r9, r10, r12\n\t"
  135576. "adds r5, r5, r8\n\t"
  135577. "adcs r6, r6, r9\n\t"
  135578. "adc r7, r7, #0\n\t"
  135579. #endif
  135580. /* A[5] * A[5] */
  135581. "ldr r10, [%[a], #20]\n\t"
  135582. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  135583. "lsl r8, r10, #16\n\t"
  135584. "lsr r9, r10, #16\n\t"
  135585. "lsr r8, r8, #16\n\t"
  135586. "mov r12, r8\n\t"
  135587. "mul r8, r12, r8\n\t"
  135588. "mov r12, r9\n\t"
  135589. "mul r9, r12, r9\n\t"
  135590. "adds r3, r3, r8\n\t"
  135591. "adcs r4, r4, r9\n\t"
  135592. "adc r2, r2, #0\n\t"
  135593. "lsr r9, r10, #16\n\t"
  135594. "lsl r8, r10, #16\n\t"
  135595. "lsr r8, r8, #16\n\t"
  135596. "mul r8, r9, r8\n\t"
  135597. "lsr r9, r8, #15\n\t"
  135598. "lsl r8, r8, #17\n\t"
  135599. "adds r3, r3, r8\n\t"
  135600. "adcs r4, r4, r9\n\t"
  135601. "adc r2, r2, #0\n\t"
  135602. "adds r5, r5, r5\n\t"
  135603. "adcs r6, r6, r6\n\t"
  135604. "adc r7, r7, r7\n\t"
  135605. #else
  135606. "umull r8, r9, r10, r10\n\t"
  135607. "adds r5, r5, r5\n\t"
  135608. "adcs r6, r6, r6\n\t"
  135609. "adc r7, r7, r7\n\t"
  135610. "adds r3, r3, r8\n\t"
  135611. "adcs r4, r4, r9\n\t"
  135612. "adc r2, r2, #0\n\t"
  135613. #endif
  135614. "adds r3, r3, r5\n\t"
  135615. "adcs r4, r4, r6\n\t"
  135616. "adc r2, r2, r7\n\t"
  135617. "str r3, [sp, #40]\n\t"
  135618. /* A[0] * A[11] */
  135619. "ldr r10, [%[a], #44]\n\t"
  135620. "ldr r12, [%[a]]\n\t"
  135621. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  135622. "lsl r8, r10, #16\n\t"
  135623. "lsl r5, r12, #16\n\t"
  135624. "lsr r8, r8, #16\n\t"
  135625. "lsr r5, r5, #16\n\t"
  135626. "mul r5, r8, r5\n\t"
  135627. "lsr r9, r12, #16\n\t"
  135628. "mul r8, r9, r8\n\t"
  135629. "lsr r6, r8, #16\n\t"
  135630. "lsl r8, r8, #16\n\t"
  135631. "adds r5, r5, r8\n\t"
  135632. "adc r6, r6, #0\n\t"
  135633. "lsr r8, r10, #16\n\t"
  135634. "mul r9, r8, r9\n\t"
  135635. "add r6, r6, r9\n\t"
  135636. "lsl r9, r12, #16\n\t"
  135637. "lsr r9, r9, #16\n\t"
  135638. "mul r8, r9, r8\n\t"
  135639. "lsr r9, r8, #16\n\t"
  135640. "lsl r8, r8, #16\n\t"
  135641. "adds r5, r5, r8\n\t"
  135642. "adc r6, r6, r9\n\t"
  135643. #else
  135644. "umull r5, r6, r10, r12\n\t"
  135645. #endif
  135646. "mov r3, #0\n\t"
  135647. "mov r7, #0\n\t"
  135648. /* A[1] * A[10] */
  135649. "ldr r10, [%[a], #40]\n\t"
  135650. "ldr r12, [%[a], #4]\n\t"
  135651. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  135652. "lsl r8, r10, #16\n\t"
  135653. "lsl r9, r12, #16\n\t"
  135654. "lsr r8, r8, #16\n\t"
  135655. "lsr r9, r9, #16\n\t"
  135656. "mul r9, r8, r9\n\t"
  135657. "adds r5, r5, r9\n\t"
  135658. "adcs r6, r6, #0\n\t"
  135659. "adc r7, r7, #0\n\t"
  135660. "lsr r9, r12, #16\n\t"
  135661. "mul r8, r9, r8\n\t"
  135662. "lsr r9, r8, #16\n\t"
  135663. "lsl r8, r8, #16\n\t"
  135664. "adds r5, r5, r8\n\t"
  135665. "adcs r6, r6, r9\n\t"
  135666. "adc r7, r7, #0\n\t"
  135667. "lsr r8, r10, #16\n\t"
  135668. "lsr r9, r12, #16\n\t"
  135669. "mul r9, r8, r9\n\t"
  135670. "adds r6, r6, r9\n\t"
  135671. "adc r7, r7, #0\n\t"
  135672. "lsl r9, r12, #16\n\t"
  135673. "lsr r9, r9, #16\n\t"
  135674. "mul r8, r9, r8\n\t"
  135675. "lsr r9, r8, #16\n\t"
  135676. "lsl r8, r8, #16\n\t"
  135677. "adds r5, r5, r8\n\t"
  135678. "adcs r6, r6, r9\n\t"
  135679. "adc r7, r7, #0\n\t"
  135680. #else
  135681. "umull r8, r9, r10, r12\n\t"
  135682. "adds r5, r5, r8\n\t"
  135683. "adcs r6, r6, r9\n\t"
  135684. "adc r7, r7, #0\n\t"
  135685. #endif
  135686. /* A[2] * A[9] */
  135687. "ldr r10, [%[a], #36]\n\t"
  135688. "ldr r12, [%[a], #8]\n\t"
  135689. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  135690. "lsl r8, r10, #16\n\t"
  135691. "lsl r9, r12, #16\n\t"
  135692. "lsr r8, r8, #16\n\t"
  135693. "lsr r9, r9, #16\n\t"
  135694. "mul r9, r8, r9\n\t"
  135695. "adds r5, r5, r9\n\t"
  135696. "adcs r6, r6, #0\n\t"
  135697. "adc r7, r7, #0\n\t"
  135698. "lsr r9, r12, #16\n\t"
  135699. "mul r8, r9, r8\n\t"
  135700. "lsr r9, r8, #16\n\t"
  135701. "lsl r8, r8, #16\n\t"
  135702. "adds r5, r5, r8\n\t"
  135703. "adcs r6, r6, r9\n\t"
  135704. "adc r7, r7, #0\n\t"
  135705. "lsr r8, r10, #16\n\t"
  135706. "lsr r9, r12, #16\n\t"
  135707. "mul r9, r8, r9\n\t"
  135708. "adds r6, r6, r9\n\t"
  135709. "adc r7, r7, #0\n\t"
  135710. "lsl r9, r12, #16\n\t"
  135711. "lsr r9, r9, #16\n\t"
  135712. "mul r8, r9, r8\n\t"
  135713. "lsr r9, r8, #16\n\t"
  135714. "lsl r8, r8, #16\n\t"
  135715. "adds r5, r5, r8\n\t"
  135716. "adcs r6, r6, r9\n\t"
  135717. "adc r7, r7, #0\n\t"
  135718. #else
  135719. "umull r8, r9, r10, r12\n\t"
  135720. "adds r5, r5, r8\n\t"
  135721. "adcs r6, r6, r9\n\t"
  135722. "adc r7, r7, #0\n\t"
  135723. #endif
  135724. /* A[3] * A[8] */
  135725. "ldr r10, [%[a], #32]\n\t"
  135726. "ldr r12, [%[a], #12]\n\t"
  135727. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  135728. "lsl r8, r10, #16\n\t"
  135729. "lsl r9, r12, #16\n\t"
  135730. "lsr r8, r8, #16\n\t"
  135731. "lsr r9, r9, #16\n\t"
  135732. "mul r9, r8, r9\n\t"
  135733. "adds r5, r5, r9\n\t"
  135734. "adcs r6, r6, #0\n\t"
  135735. "adc r7, r7, #0\n\t"
  135736. "lsr r9, r12, #16\n\t"
  135737. "mul r8, r9, r8\n\t"
  135738. "lsr r9, r8, #16\n\t"
  135739. "lsl r8, r8, #16\n\t"
  135740. "adds r5, r5, r8\n\t"
  135741. "adcs r6, r6, r9\n\t"
  135742. "adc r7, r7, #0\n\t"
  135743. "lsr r8, r10, #16\n\t"
  135744. "lsr r9, r12, #16\n\t"
  135745. "mul r9, r8, r9\n\t"
  135746. "adds r6, r6, r9\n\t"
  135747. "adc r7, r7, #0\n\t"
  135748. "lsl r9, r12, #16\n\t"
  135749. "lsr r9, r9, #16\n\t"
  135750. "mul r8, r9, r8\n\t"
  135751. "lsr r9, r8, #16\n\t"
  135752. "lsl r8, r8, #16\n\t"
  135753. "adds r5, r5, r8\n\t"
  135754. "adcs r6, r6, r9\n\t"
  135755. "adc r7, r7, #0\n\t"
  135756. #else
  135757. "umull r8, r9, r10, r12\n\t"
  135758. "adds r5, r5, r8\n\t"
  135759. "adcs r6, r6, r9\n\t"
  135760. "adc r7, r7, #0\n\t"
  135761. #endif
  135762. /* A[4] * A[7] */
  135763. "ldr r10, [%[a], #28]\n\t"
  135764. "ldr r12, [%[a], #16]\n\t"
  135765. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  135766. "lsl r8, r10, #16\n\t"
  135767. "lsl r9, r12, #16\n\t"
  135768. "lsr r8, r8, #16\n\t"
  135769. "lsr r9, r9, #16\n\t"
  135770. "mul r9, r8, r9\n\t"
  135771. "adds r5, r5, r9\n\t"
  135772. "adcs r6, r6, #0\n\t"
  135773. "adc r7, r7, #0\n\t"
  135774. "lsr r9, r12, #16\n\t"
  135775. "mul r8, r9, r8\n\t"
  135776. "lsr r9, r8, #16\n\t"
  135777. "lsl r8, r8, #16\n\t"
  135778. "adds r5, r5, r8\n\t"
  135779. "adcs r6, r6, r9\n\t"
  135780. "adc r7, r7, #0\n\t"
  135781. "lsr r8, r10, #16\n\t"
  135782. "lsr r9, r12, #16\n\t"
  135783. "mul r9, r8, r9\n\t"
  135784. "adds r6, r6, r9\n\t"
  135785. "adc r7, r7, #0\n\t"
  135786. "lsl r9, r12, #16\n\t"
  135787. "lsr r9, r9, #16\n\t"
  135788. "mul r8, r9, r8\n\t"
  135789. "lsr r9, r8, #16\n\t"
  135790. "lsl r8, r8, #16\n\t"
  135791. "adds r5, r5, r8\n\t"
  135792. "adcs r6, r6, r9\n\t"
  135793. "adc r7, r7, #0\n\t"
  135794. #else
  135795. "umull r8, r9, r10, r12\n\t"
  135796. "adds r5, r5, r8\n\t"
  135797. "adcs r6, r6, r9\n\t"
  135798. "adc r7, r7, #0\n\t"
  135799. #endif
  135800. /* A[5] * A[6] */
  135801. "ldr r10, [%[a], #24]\n\t"
  135802. "ldr r12, [%[a], #20]\n\t"
  135803. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  135804. "lsl r8, r10, #16\n\t"
  135805. "lsl r9, r12, #16\n\t"
  135806. "lsr r8, r8, #16\n\t"
  135807. "lsr r9, r9, #16\n\t"
  135808. "mul r9, r8, r9\n\t"
  135809. "adds r5, r5, r9\n\t"
  135810. "adcs r6, r6, #0\n\t"
  135811. "adc r7, r7, #0\n\t"
  135812. "lsr r9, r12, #16\n\t"
  135813. "mul r8, r9, r8\n\t"
  135814. "lsr r9, r8, #16\n\t"
  135815. "lsl r8, r8, #16\n\t"
  135816. "adds r5, r5, r8\n\t"
  135817. "adcs r6, r6, r9\n\t"
  135818. "adc r7, r7, #0\n\t"
  135819. "lsr r8, r10, #16\n\t"
  135820. "lsr r9, r12, #16\n\t"
  135821. "mul r9, r8, r9\n\t"
  135822. "adds r6, r6, r9\n\t"
  135823. "adc r7, r7, #0\n\t"
  135824. "lsl r9, r12, #16\n\t"
  135825. "lsr r9, r9, #16\n\t"
  135826. "mul r8, r9, r8\n\t"
  135827. "lsr r9, r8, #16\n\t"
  135828. "lsl r8, r8, #16\n\t"
  135829. "adds r5, r5, r8\n\t"
  135830. "adcs r6, r6, r9\n\t"
  135831. "adc r7, r7, #0\n\t"
  135832. #else
  135833. "umull r8, r9, r10, r12\n\t"
  135834. "adds r5, r5, r8\n\t"
  135835. "adcs r6, r6, r9\n\t"
  135836. "adc r7, r7, #0\n\t"
  135837. #endif
  135838. "adds r5, r5, r5\n\t"
  135839. "adcs r6, r6, r6\n\t"
  135840. "adc r7, r7, r7\n\t"
  135841. "adds r4, r4, r5\n\t"
  135842. "adcs r2, r2, r6\n\t"
  135843. "adc r3, r3, r7\n\t"
  135844. "str r4, [sp, #44]\n\t"
  135845. /* A[0] * A[12] */
  135846. "ldr r10, [%[a], #48]\n\t"
  135847. "ldr r12, [%[a]]\n\t"
  135848. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  135849. "lsl r8, r10, #16\n\t"
  135850. "lsl r5, r12, #16\n\t"
  135851. "lsr r8, r8, #16\n\t"
  135852. "lsr r5, r5, #16\n\t"
  135853. "mul r5, r8, r5\n\t"
  135854. "lsr r9, r12, #16\n\t"
  135855. "mul r8, r9, r8\n\t"
  135856. "lsr r6, r8, #16\n\t"
  135857. "lsl r8, r8, #16\n\t"
  135858. "adds r5, r5, r8\n\t"
  135859. "adc r6, r6, #0\n\t"
  135860. "lsr r8, r10, #16\n\t"
  135861. "mul r9, r8, r9\n\t"
  135862. "add r6, r6, r9\n\t"
  135863. "lsl r9, r12, #16\n\t"
  135864. "lsr r9, r9, #16\n\t"
  135865. "mul r8, r9, r8\n\t"
  135866. "lsr r9, r8, #16\n\t"
  135867. "lsl r8, r8, #16\n\t"
  135868. "adds r5, r5, r8\n\t"
  135869. "adc r6, r6, r9\n\t"
  135870. #else
  135871. "umull r5, r6, r10, r12\n\t"
  135872. #endif
  135873. "mov r4, #0\n\t"
  135874. "mov r7, #0\n\t"
  135875. /* A[1] * A[11] */
  135876. "ldr r10, [%[a], #44]\n\t"
  135877. "ldr r12, [%[a], #4]\n\t"
  135878. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  135879. "lsl r8, r10, #16\n\t"
  135880. "lsl r9, r12, #16\n\t"
  135881. "lsr r8, r8, #16\n\t"
  135882. "lsr r9, r9, #16\n\t"
  135883. "mul r9, r8, r9\n\t"
  135884. "adds r5, r5, r9\n\t"
  135885. "adcs r6, r6, #0\n\t"
  135886. "adc r7, r7, #0\n\t"
  135887. "lsr r9, r12, #16\n\t"
  135888. "mul r8, r9, r8\n\t"
  135889. "lsr r9, r8, #16\n\t"
  135890. "lsl r8, r8, #16\n\t"
  135891. "adds r5, r5, r8\n\t"
  135892. "adcs r6, r6, r9\n\t"
  135893. "adc r7, r7, #0\n\t"
  135894. "lsr r8, r10, #16\n\t"
  135895. "lsr r9, r12, #16\n\t"
  135896. "mul r9, r8, r9\n\t"
  135897. "adds r6, r6, r9\n\t"
  135898. "adc r7, r7, #0\n\t"
  135899. "lsl r9, r12, #16\n\t"
  135900. "lsr r9, r9, #16\n\t"
  135901. "mul r8, r9, r8\n\t"
  135902. "lsr r9, r8, #16\n\t"
  135903. "lsl r8, r8, #16\n\t"
  135904. "adds r5, r5, r8\n\t"
  135905. "adcs r6, r6, r9\n\t"
  135906. "adc r7, r7, #0\n\t"
  135907. #else
  135908. "umull r8, r9, r10, r12\n\t"
  135909. "adds r5, r5, r8\n\t"
  135910. "adcs r6, r6, r9\n\t"
  135911. "adc r7, r7, #0\n\t"
  135912. #endif
  135913. /* A[2] * A[10] */
  135914. "ldr r10, [%[a], #40]\n\t"
  135915. "ldr r12, [%[a], #8]\n\t"
  135916. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  135917. "lsl r8, r10, #16\n\t"
  135918. "lsl r9, r12, #16\n\t"
  135919. "lsr r8, r8, #16\n\t"
  135920. "lsr r9, r9, #16\n\t"
  135921. "mul r9, r8, r9\n\t"
  135922. "adds r5, r5, r9\n\t"
  135923. "adcs r6, r6, #0\n\t"
  135924. "adc r7, r7, #0\n\t"
  135925. "lsr r9, r12, #16\n\t"
  135926. "mul r8, r9, r8\n\t"
  135927. "lsr r9, r8, #16\n\t"
  135928. "lsl r8, r8, #16\n\t"
  135929. "adds r5, r5, r8\n\t"
  135930. "adcs r6, r6, r9\n\t"
  135931. "adc r7, r7, #0\n\t"
  135932. "lsr r8, r10, #16\n\t"
  135933. "lsr r9, r12, #16\n\t"
  135934. "mul r9, r8, r9\n\t"
  135935. "adds r6, r6, r9\n\t"
  135936. "adc r7, r7, #0\n\t"
  135937. "lsl r9, r12, #16\n\t"
  135938. "lsr r9, r9, #16\n\t"
  135939. "mul r8, r9, r8\n\t"
  135940. "lsr r9, r8, #16\n\t"
  135941. "lsl r8, r8, #16\n\t"
  135942. "adds r5, r5, r8\n\t"
  135943. "adcs r6, r6, r9\n\t"
  135944. "adc r7, r7, #0\n\t"
  135945. #else
  135946. "umull r8, r9, r10, r12\n\t"
  135947. "adds r5, r5, r8\n\t"
  135948. "adcs r6, r6, r9\n\t"
  135949. "adc r7, r7, #0\n\t"
  135950. #endif
  135951. /* A[3] * A[9] */
  135952. "ldr r10, [%[a], #36]\n\t"
  135953. "ldr r12, [%[a], #12]\n\t"
  135954. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  135955. "lsl r8, r10, #16\n\t"
  135956. "lsl r9, r12, #16\n\t"
  135957. "lsr r8, r8, #16\n\t"
  135958. "lsr r9, r9, #16\n\t"
  135959. "mul r9, r8, r9\n\t"
  135960. "adds r5, r5, r9\n\t"
  135961. "adcs r6, r6, #0\n\t"
  135962. "adc r7, r7, #0\n\t"
  135963. "lsr r9, r12, #16\n\t"
  135964. "mul r8, r9, r8\n\t"
  135965. "lsr r9, r8, #16\n\t"
  135966. "lsl r8, r8, #16\n\t"
  135967. "adds r5, r5, r8\n\t"
  135968. "adcs r6, r6, r9\n\t"
  135969. "adc r7, r7, #0\n\t"
  135970. "lsr r8, r10, #16\n\t"
  135971. "lsr r9, r12, #16\n\t"
  135972. "mul r9, r8, r9\n\t"
  135973. "adds r6, r6, r9\n\t"
  135974. "adc r7, r7, #0\n\t"
  135975. "lsl r9, r12, #16\n\t"
  135976. "lsr r9, r9, #16\n\t"
  135977. "mul r8, r9, r8\n\t"
  135978. "lsr r9, r8, #16\n\t"
  135979. "lsl r8, r8, #16\n\t"
  135980. "adds r5, r5, r8\n\t"
  135981. "adcs r6, r6, r9\n\t"
  135982. "adc r7, r7, #0\n\t"
  135983. #else
  135984. "umull r8, r9, r10, r12\n\t"
  135985. "adds r5, r5, r8\n\t"
  135986. "adcs r6, r6, r9\n\t"
  135987. "adc r7, r7, #0\n\t"
  135988. #endif
  135989. /* A[4] * A[8] */
  135990. "ldr r10, [%[a], #32]\n\t"
  135991. "ldr r12, [%[a], #16]\n\t"
  135992. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  135993. "lsl r8, r10, #16\n\t"
  135994. "lsl r9, r12, #16\n\t"
  135995. "lsr r8, r8, #16\n\t"
  135996. "lsr r9, r9, #16\n\t"
  135997. "mul r9, r8, r9\n\t"
  135998. "adds r5, r5, r9\n\t"
  135999. "adcs r6, r6, #0\n\t"
  136000. "adc r7, r7, #0\n\t"
  136001. "lsr r9, r12, #16\n\t"
  136002. "mul r8, r9, r8\n\t"
  136003. "lsr r9, r8, #16\n\t"
  136004. "lsl r8, r8, #16\n\t"
  136005. "adds r5, r5, r8\n\t"
  136006. "adcs r6, r6, r9\n\t"
  136007. "adc r7, r7, #0\n\t"
  136008. "lsr r8, r10, #16\n\t"
  136009. "lsr r9, r12, #16\n\t"
  136010. "mul r9, r8, r9\n\t"
  136011. "adds r6, r6, r9\n\t"
  136012. "adc r7, r7, #0\n\t"
  136013. "lsl r9, r12, #16\n\t"
  136014. "lsr r9, r9, #16\n\t"
  136015. "mul r8, r9, r8\n\t"
  136016. "lsr r9, r8, #16\n\t"
  136017. "lsl r8, r8, #16\n\t"
  136018. "adds r5, r5, r8\n\t"
  136019. "adcs r6, r6, r9\n\t"
  136020. "adc r7, r7, #0\n\t"
  136021. #else
  136022. "umull r8, r9, r10, r12\n\t"
  136023. "adds r5, r5, r8\n\t"
  136024. "adcs r6, r6, r9\n\t"
  136025. "adc r7, r7, #0\n\t"
  136026. #endif
  136027. /* A[5] * A[7] */
  136028. "ldr r10, [%[a], #28]\n\t"
  136029. "ldr r12, [%[a], #20]\n\t"
  136030. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  136031. "lsl r8, r10, #16\n\t"
  136032. "lsl r9, r12, #16\n\t"
  136033. "lsr r8, r8, #16\n\t"
  136034. "lsr r9, r9, #16\n\t"
  136035. "mul r9, r8, r9\n\t"
  136036. "adds r5, r5, r9\n\t"
  136037. "adcs r6, r6, #0\n\t"
  136038. "adc r7, r7, #0\n\t"
  136039. "lsr r9, r12, #16\n\t"
  136040. "mul r8, r9, r8\n\t"
  136041. "lsr r9, r8, #16\n\t"
  136042. "lsl r8, r8, #16\n\t"
  136043. "adds r5, r5, r8\n\t"
  136044. "adcs r6, r6, r9\n\t"
  136045. "adc r7, r7, #0\n\t"
  136046. "lsr r8, r10, #16\n\t"
  136047. "lsr r9, r12, #16\n\t"
  136048. "mul r9, r8, r9\n\t"
  136049. "adds r6, r6, r9\n\t"
  136050. "adc r7, r7, #0\n\t"
  136051. "lsl r9, r12, #16\n\t"
  136052. "lsr r9, r9, #16\n\t"
  136053. "mul r8, r9, r8\n\t"
  136054. "lsr r9, r8, #16\n\t"
  136055. "lsl r8, r8, #16\n\t"
  136056. "adds r5, r5, r8\n\t"
  136057. "adcs r6, r6, r9\n\t"
  136058. "adc r7, r7, #0\n\t"
  136059. #else
  136060. "umull r8, r9, r10, r12\n\t"
  136061. "adds r5, r5, r8\n\t"
  136062. "adcs r6, r6, r9\n\t"
  136063. "adc r7, r7, #0\n\t"
  136064. #endif
  136065. /* A[6] * A[6] */
  136066. "ldr r10, [%[a], #24]\n\t"
  136067. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  136068. "lsl r8, r10, #16\n\t"
  136069. "lsr r9, r10, #16\n\t"
  136070. "lsr r8, r8, #16\n\t"
  136071. "mov r12, r8\n\t"
  136072. "mul r8, r12, r8\n\t"
  136073. "mov r12, r9\n\t"
  136074. "mul r9, r12, r9\n\t"
  136075. "adds r2, r2, r8\n\t"
  136076. "adcs r3, r3, r9\n\t"
  136077. "adc r4, r4, #0\n\t"
  136078. "lsr r9, r10, #16\n\t"
  136079. "lsl r8, r10, #16\n\t"
  136080. "lsr r8, r8, #16\n\t"
  136081. "mul r8, r9, r8\n\t"
  136082. "lsr r9, r8, #15\n\t"
  136083. "lsl r8, r8, #17\n\t"
  136084. "adds r2, r2, r8\n\t"
  136085. "adcs r3, r3, r9\n\t"
  136086. "adc r4, r4, #0\n\t"
  136087. "adds r5, r5, r5\n\t"
  136088. "adcs r6, r6, r6\n\t"
  136089. "adc r7, r7, r7\n\t"
  136090. #else
  136091. "umull r8, r9, r10, r10\n\t"
  136092. "adds r5, r5, r5\n\t"
  136093. "adcs r6, r6, r6\n\t"
  136094. "adc r7, r7, r7\n\t"
  136095. "adds r2, r2, r8\n\t"
  136096. "adcs r3, r3, r9\n\t"
  136097. "adc r4, r4, #0\n\t"
  136098. #endif
  136099. "adds r2, r2, r5\n\t"
  136100. "adcs r3, r3, r6\n\t"
  136101. "adc r4, r4, r7\n\t"
  136102. "str r2, [sp, #48]\n\t"
  136103. /* A[0] * A[13] */
  136104. "ldr r10, [%[a], #52]\n\t"
  136105. "ldr r12, [%[a]]\n\t"
  136106. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  136107. "lsl r8, r10, #16\n\t"
  136108. "lsl r5, r12, #16\n\t"
  136109. "lsr r8, r8, #16\n\t"
  136110. "lsr r5, r5, #16\n\t"
  136111. "mul r5, r8, r5\n\t"
  136112. "lsr r9, r12, #16\n\t"
  136113. "mul r8, r9, r8\n\t"
  136114. "lsr r6, r8, #16\n\t"
  136115. "lsl r8, r8, #16\n\t"
  136116. "adds r5, r5, r8\n\t"
  136117. "adc r6, r6, #0\n\t"
  136118. "lsr r8, r10, #16\n\t"
  136119. "mul r9, r8, r9\n\t"
  136120. "add r6, r6, r9\n\t"
  136121. "lsl r9, r12, #16\n\t"
  136122. "lsr r9, r9, #16\n\t"
  136123. "mul r8, r9, r8\n\t"
  136124. "lsr r9, r8, #16\n\t"
  136125. "lsl r8, r8, #16\n\t"
  136126. "adds r5, r5, r8\n\t"
  136127. "adc r6, r6, r9\n\t"
  136128. #else
  136129. "umull r5, r6, r10, r12\n\t"
  136130. #endif
  136131. "mov r2, #0\n\t"
  136132. "mov r7, #0\n\t"
  136133. /* A[1] * A[12] */
  136134. "ldr r10, [%[a], #48]\n\t"
  136135. "ldr r12, [%[a], #4]\n\t"
  136136. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  136137. "lsl r8, r10, #16\n\t"
  136138. "lsl r9, r12, #16\n\t"
  136139. "lsr r8, r8, #16\n\t"
  136140. "lsr r9, r9, #16\n\t"
  136141. "mul r9, r8, r9\n\t"
  136142. "adds r5, r5, r9\n\t"
  136143. "adcs r6, r6, #0\n\t"
  136144. "adc r7, r7, #0\n\t"
  136145. "lsr r9, r12, #16\n\t"
  136146. "mul r8, r9, r8\n\t"
  136147. "lsr r9, r8, #16\n\t"
  136148. "lsl r8, r8, #16\n\t"
  136149. "adds r5, r5, r8\n\t"
  136150. "adcs r6, r6, r9\n\t"
  136151. "adc r7, r7, #0\n\t"
  136152. "lsr r8, r10, #16\n\t"
  136153. "lsr r9, r12, #16\n\t"
  136154. "mul r9, r8, r9\n\t"
  136155. "adds r6, r6, r9\n\t"
  136156. "adc r7, r7, #0\n\t"
  136157. "lsl r9, r12, #16\n\t"
  136158. "lsr r9, r9, #16\n\t"
  136159. "mul r8, r9, r8\n\t"
  136160. "lsr r9, r8, #16\n\t"
  136161. "lsl r8, r8, #16\n\t"
  136162. "adds r5, r5, r8\n\t"
  136163. "adcs r6, r6, r9\n\t"
  136164. "adc r7, r7, #0\n\t"
  136165. #else
  136166. "umull r8, r9, r10, r12\n\t"
  136167. "adds r5, r5, r8\n\t"
  136168. "adcs r6, r6, r9\n\t"
  136169. "adc r7, r7, #0\n\t"
  136170. #endif
  136171. /* A[2] * A[11] */
  136172. "ldr r10, [%[a], #44]\n\t"
  136173. "ldr r12, [%[a], #8]\n\t"
  136174. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  136175. "lsl r8, r10, #16\n\t"
  136176. "lsl r9, r12, #16\n\t"
  136177. "lsr r8, r8, #16\n\t"
  136178. "lsr r9, r9, #16\n\t"
  136179. "mul r9, r8, r9\n\t"
  136180. "adds r5, r5, r9\n\t"
  136181. "adcs r6, r6, #0\n\t"
  136182. "adc r7, r7, #0\n\t"
  136183. "lsr r9, r12, #16\n\t"
  136184. "mul r8, r9, r8\n\t"
  136185. "lsr r9, r8, #16\n\t"
  136186. "lsl r8, r8, #16\n\t"
  136187. "adds r5, r5, r8\n\t"
  136188. "adcs r6, r6, r9\n\t"
  136189. "adc r7, r7, #0\n\t"
  136190. "lsr r8, r10, #16\n\t"
  136191. "lsr r9, r12, #16\n\t"
  136192. "mul r9, r8, r9\n\t"
  136193. "adds r6, r6, r9\n\t"
  136194. "adc r7, r7, #0\n\t"
  136195. "lsl r9, r12, #16\n\t"
  136196. "lsr r9, r9, #16\n\t"
  136197. "mul r8, r9, r8\n\t"
  136198. "lsr r9, r8, #16\n\t"
  136199. "lsl r8, r8, #16\n\t"
  136200. "adds r5, r5, r8\n\t"
  136201. "adcs r6, r6, r9\n\t"
  136202. "adc r7, r7, #0\n\t"
  136203. #else
  136204. "umull r8, r9, r10, r12\n\t"
  136205. "adds r5, r5, r8\n\t"
  136206. "adcs r6, r6, r9\n\t"
  136207. "adc r7, r7, #0\n\t"
  136208. #endif
  136209. /* A[3] * A[10] */
  136210. "ldr r10, [%[a], #40]\n\t"
  136211. "ldr r12, [%[a], #12]\n\t"
  136212. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  136213. "lsl r8, r10, #16\n\t"
  136214. "lsl r9, r12, #16\n\t"
  136215. "lsr r8, r8, #16\n\t"
  136216. "lsr r9, r9, #16\n\t"
  136217. "mul r9, r8, r9\n\t"
  136218. "adds r5, r5, r9\n\t"
  136219. "adcs r6, r6, #0\n\t"
  136220. "adc r7, r7, #0\n\t"
  136221. "lsr r9, r12, #16\n\t"
  136222. "mul r8, r9, r8\n\t"
  136223. "lsr r9, r8, #16\n\t"
  136224. "lsl r8, r8, #16\n\t"
  136225. "adds r5, r5, r8\n\t"
  136226. "adcs r6, r6, r9\n\t"
  136227. "adc r7, r7, #0\n\t"
  136228. "lsr r8, r10, #16\n\t"
  136229. "lsr r9, r12, #16\n\t"
  136230. "mul r9, r8, r9\n\t"
  136231. "adds r6, r6, r9\n\t"
  136232. "adc r7, r7, #0\n\t"
  136233. "lsl r9, r12, #16\n\t"
  136234. "lsr r9, r9, #16\n\t"
  136235. "mul r8, r9, r8\n\t"
  136236. "lsr r9, r8, #16\n\t"
  136237. "lsl r8, r8, #16\n\t"
  136238. "adds r5, r5, r8\n\t"
  136239. "adcs r6, r6, r9\n\t"
  136240. "adc r7, r7, #0\n\t"
  136241. #else
  136242. "umull r8, r9, r10, r12\n\t"
  136243. "adds r5, r5, r8\n\t"
  136244. "adcs r6, r6, r9\n\t"
  136245. "adc r7, r7, #0\n\t"
  136246. #endif
  136247. /* A[4] * A[9] */
  136248. "ldr r10, [%[a], #36]\n\t"
  136249. "ldr r12, [%[a], #16]\n\t"
  136250. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  136251. "lsl r8, r10, #16\n\t"
  136252. "lsl r9, r12, #16\n\t"
  136253. "lsr r8, r8, #16\n\t"
  136254. "lsr r9, r9, #16\n\t"
  136255. "mul r9, r8, r9\n\t"
  136256. "adds r5, r5, r9\n\t"
  136257. "adcs r6, r6, #0\n\t"
  136258. "adc r7, r7, #0\n\t"
  136259. "lsr r9, r12, #16\n\t"
  136260. "mul r8, r9, r8\n\t"
  136261. "lsr r9, r8, #16\n\t"
  136262. "lsl r8, r8, #16\n\t"
  136263. "adds r5, r5, r8\n\t"
  136264. "adcs r6, r6, r9\n\t"
  136265. "adc r7, r7, #0\n\t"
  136266. "lsr r8, r10, #16\n\t"
  136267. "lsr r9, r12, #16\n\t"
  136268. "mul r9, r8, r9\n\t"
  136269. "adds r6, r6, r9\n\t"
  136270. "adc r7, r7, #0\n\t"
  136271. "lsl r9, r12, #16\n\t"
  136272. "lsr r9, r9, #16\n\t"
  136273. "mul r8, r9, r8\n\t"
  136274. "lsr r9, r8, #16\n\t"
  136275. "lsl r8, r8, #16\n\t"
  136276. "adds r5, r5, r8\n\t"
  136277. "adcs r6, r6, r9\n\t"
  136278. "adc r7, r7, #0\n\t"
  136279. #else
  136280. "umull r8, r9, r10, r12\n\t"
  136281. "adds r5, r5, r8\n\t"
  136282. "adcs r6, r6, r9\n\t"
  136283. "adc r7, r7, #0\n\t"
  136284. #endif
  136285. /* A[5] * A[8] */
  136286. "ldr r10, [%[a], #32]\n\t"
  136287. "ldr r12, [%[a], #20]\n\t"
  136288. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  136289. "lsl r8, r10, #16\n\t"
  136290. "lsl r9, r12, #16\n\t"
  136291. "lsr r8, r8, #16\n\t"
  136292. "lsr r9, r9, #16\n\t"
  136293. "mul r9, r8, r9\n\t"
  136294. "adds r5, r5, r9\n\t"
  136295. "adcs r6, r6, #0\n\t"
  136296. "adc r7, r7, #0\n\t"
  136297. "lsr r9, r12, #16\n\t"
  136298. "mul r8, r9, r8\n\t"
  136299. "lsr r9, r8, #16\n\t"
  136300. "lsl r8, r8, #16\n\t"
  136301. "adds r5, r5, r8\n\t"
  136302. "adcs r6, r6, r9\n\t"
  136303. "adc r7, r7, #0\n\t"
  136304. "lsr r8, r10, #16\n\t"
  136305. "lsr r9, r12, #16\n\t"
  136306. "mul r9, r8, r9\n\t"
  136307. "adds r6, r6, r9\n\t"
  136308. "adc r7, r7, #0\n\t"
  136309. "lsl r9, r12, #16\n\t"
  136310. "lsr r9, r9, #16\n\t"
  136311. "mul r8, r9, r8\n\t"
  136312. "lsr r9, r8, #16\n\t"
  136313. "lsl r8, r8, #16\n\t"
  136314. "adds r5, r5, r8\n\t"
  136315. "adcs r6, r6, r9\n\t"
  136316. "adc r7, r7, #0\n\t"
  136317. #else
  136318. "umull r8, r9, r10, r12\n\t"
  136319. "adds r5, r5, r8\n\t"
  136320. "adcs r6, r6, r9\n\t"
  136321. "adc r7, r7, #0\n\t"
  136322. #endif
  136323. /* A[6] * A[7] */
  136324. "ldr r10, [%[a], #28]\n\t"
  136325. "ldr r12, [%[a], #24]\n\t"
  136326. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  136327. "lsl r8, r10, #16\n\t"
  136328. "lsl r9, r12, #16\n\t"
  136329. "lsr r8, r8, #16\n\t"
  136330. "lsr r9, r9, #16\n\t"
  136331. "mul r9, r8, r9\n\t"
  136332. "adds r5, r5, r9\n\t"
  136333. "adcs r6, r6, #0\n\t"
  136334. "adc r7, r7, #0\n\t"
  136335. "lsr r9, r12, #16\n\t"
  136336. "mul r8, r9, r8\n\t"
  136337. "lsr r9, r8, #16\n\t"
  136338. "lsl r8, r8, #16\n\t"
  136339. "adds r5, r5, r8\n\t"
  136340. "adcs r6, r6, r9\n\t"
  136341. "adc r7, r7, #0\n\t"
  136342. "lsr r8, r10, #16\n\t"
  136343. "lsr r9, r12, #16\n\t"
  136344. "mul r9, r8, r9\n\t"
  136345. "adds r6, r6, r9\n\t"
  136346. "adc r7, r7, #0\n\t"
  136347. "lsl r9, r12, #16\n\t"
  136348. "lsr r9, r9, #16\n\t"
  136349. "mul r8, r9, r8\n\t"
  136350. "lsr r9, r8, #16\n\t"
  136351. "lsl r8, r8, #16\n\t"
  136352. "adds r5, r5, r8\n\t"
  136353. "adcs r6, r6, r9\n\t"
  136354. "adc r7, r7, #0\n\t"
  136355. #else
  136356. "umull r8, r9, r10, r12\n\t"
  136357. "adds r5, r5, r8\n\t"
  136358. "adcs r6, r6, r9\n\t"
  136359. "adc r7, r7, #0\n\t"
  136360. #endif
  136361. "adds r5, r5, r5\n\t"
  136362. "adcs r6, r6, r6\n\t"
  136363. "adc r7, r7, r7\n\t"
  136364. "adds r3, r3, r5\n\t"
  136365. "adcs r4, r4, r6\n\t"
  136366. "adc r2, r2, r7\n\t"
  136367. "str r3, [sp, #52]\n\t"
  136368. /* A[0] * A[14] */
  136369. "ldr r10, [%[a], #56]\n\t"
  136370. "ldr r12, [%[a]]\n\t"
  136371. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  136372. "lsl r8, r10, #16\n\t"
  136373. "lsl r5, r12, #16\n\t"
  136374. "lsr r8, r8, #16\n\t"
  136375. "lsr r5, r5, #16\n\t"
  136376. "mul r5, r8, r5\n\t"
  136377. "lsr r9, r12, #16\n\t"
  136378. "mul r8, r9, r8\n\t"
  136379. "lsr r6, r8, #16\n\t"
  136380. "lsl r8, r8, #16\n\t"
  136381. "adds r5, r5, r8\n\t"
  136382. "adc r6, r6, #0\n\t"
  136383. "lsr r8, r10, #16\n\t"
  136384. "mul r9, r8, r9\n\t"
  136385. "add r6, r6, r9\n\t"
  136386. "lsl r9, r12, #16\n\t"
  136387. "lsr r9, r9, #16\n\t"
  136388. "mul r8, r9, r8\n\t"
  136389. "lsr r9, r8, #16\n\t"
  136390. "lsl r8, r8, #16\n\t"
  136391. "adds r5, r5, r8\n\t"
  136392. "adc r6, r6, r9\n\t"
  136393. #else
  136394. "umull r5, r6, r10, r12\n\t"
  136395. #endif
  136396. "mov r3, #0\n\t"
  136397. "mov r7, #0\n\t"
  136398. /* A[1] * A[13] */
  136399. "ldr r10, [%[a], #52]\n\t"
  136400. "ldr r12, [%[a], #4]\n\t"
  136401. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  136402. "lsl r8, r10, #16\n\t"
  136403. "lsl r9, r12, #16\n\t"
  136404. "lsr r8, r8, #16\n\t"
  136405. "lsr r9, r9, #16\n\t"
  136406. "mul r9, r8, r9\n\t"
  136407. "adds r5, r5, r9\n\t"
  136408. "adcs r6, r6, #0\n\t"
  136409. "adc r7, r7, #0\n\t"
  136410. "lsr r9, r12, #16\n\t"
  136411. "mul r8, r9, r8\n\t"
  136412. "lsr r9, r8, #16\n\t"
  136413. "lsl r8, r8, #16\n\t"
  136414. "adds r5, r5, r8\n\t"
  136415. "adcs r6, r6, r9\n\t"
  136416. "adc r7, r7, #0\n\t"
  136417. "lsr r8, r10, #16\n\t"
  136418. "lsr r9, r12, #16\n\t"
  136419. "mul r9, r8, r9\n\t"
  136420. "adds r6, r6, r9\n\t"
  136421. "adc r7, r7, #0\n\t"
  136422. "lsl r9, r12, #16\n\t"
  136423. "lsr r9, r9, #16\n\t"
  136424. "mul r8, r9, r8\n\t"
  136425. "lsr r9, r8, #16\n\t"
  136426. "lsl r8, r8, #16\n\t"
  136427. "adds r5, r5, r8\n\t"
  136428. "adcs r6, r6, r9\n\t"
  136429. "adc r7, r7, #0\n\t"
  136430. #else
  136431. "umull r8, r9, r10, r12\n\t"
  136432. "adds r5, r5, r8\n\t"
  136433. "adcs r6, r6, r9\n\t"
  136434. "adc r7, r7, #0\n\t"
  136435. #endif
  136436. /* A[2] * A[12] */
  136437. "ldr r10, [%[a], #48]\n\t"
  136438. "ldr r12, [%[a], #8]\n\t"
  136439. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  136440. "lsl r8, r10, #16\n\t"
  136441. "lsl r9, r12, #16\n\t"
  136442. "lsr r8, r8, #16\n\t"
  136443. "lsr r9, r9, #16\n\t"
  136444. "mul r9, r8, r9\n\t"
  136445. "adds r5, r5, r9\n\t"
  136446. "adcs r6, r6, #0\n\t"
  136447. "adc r7, r7, #0\n\t"
  136448. "lsr r9, r12, #16\n\t"
  136449. "mul r8, r9, r8\n\t"
  136450. "lsr r9, r8, #16\n\t"
  136451. "lsl r8, r8, #16\n\t"
  136452. "adds r5, r5, r8\n\t"
  136453. "adcs r6, r6, r9\n\t"
  136454. "adc r7, r7, #0\n\t"
  136455. "lsr r8, r10, #16\n\t"
  136456. "lsr r9, r12, #16\n\t"
  136457. "mul r9, r8, r9\n\t"
  136458. "adds r6, r6, r9\n\t"
  136459. "adc r7, r7, #0\n\t"
  136460. "lsl r9, r12, #16\n\t"
  136461. "lsr r9, r9, #16\n\t"
  136462. "mul r8, r9, r8\n\t"
  136463. "lsr r9, r8, #16\n\t"
  136464. "lsl r8, r8, #16\n\t"
  136465. "adds r5, r5, r8\n\t"
  136466. "adcs r6, r6, r9\n\t"
  136467. "adc r7, r7, #0\n\t"
  136468. #else
  136469. "umull r8, r9, r10, r12\n\t"
  136470. "adds r5, r5, r8\n\t"
  136471. "adcs r6, r6, r9\n\t"
  136472. "adc r7, r7, #0\n\t"
  136473. #endif
  136474. /* A[3] * A[11] */
  136475. "ldr r10, [%[a], #44]\n\t"
  136476. "ldr r12, [%[a], #12]\n\t"
  136477. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  136478. "lsl r8, r10, #16\n\t"
  136479. "lsl r9, r12, #16\n\t"
  136480. "lsr r8, r8, #16\n\t"
  136481. "lsr r9, r9, #16\n\t"
  136482. "mul r9, r8, r9\n\t"
  136483. "adds r5, r5, r9\n\t"
  136484. "adcs r6, r6, #0\n\t"
  136485. "adc r7, r7, #0\n\t"
  136486. "lsr r9, r12, #16\n\t"
  136487. "mul r8, r9, r8\n\t"
  136488. "lsr r9, r8, #16\n\t"
  136489. "lsl r8, r8, #16\n\t"
  136490. "adds r5, r5, r8\n\t"
  136491. "adcs r6, r6, r9\n\t"
  136492. "adc r7, r7, #0\n\t"
  136493. "lsr r8, r10, #16\n\t"
  136494. "lsr r9, r12, #16\n\t"
  136495. "mul r9, r8, r9\n\t"
  136496. "adds r6, r6, r9\n\t"
  136497. "adc r7, r7, #0\n\t"
  136498. "lsl r9, r12, #16\n\t"
  136499. "lsr r9, r9, #16\n\t"
  136500. "mul r8, r9, r8\n\t"
  136501. "lsr r9, r8, #16\n\t"
  136502. "lsl r8, r8, #16\n\t"
  136503. "adds r5, r5, r8\n\t"
  136504. "adcs r6, r6, r9\n\t"
  136505. "adc r7, r7, #0\n\t"
  136506. #else
  136507. "umull r8, r9, r10, r12\n\t"
  136508. "adds r5, r5, r8\n\t"
  136509. "adcs r6, r6, r9\n\t"
  136510. "adc r7, r7, #0\n\t"
  136511. #endif
  136512. /* A[4] * A[10] */
  136513. "ldr r10, [%[a], #40]\n\t"
  136514. "ldr r12, [%[a], #16]\n\t"
  136515. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  136516. "lsl r8, r10, #16\n\t"
  136517. "lsl r9, r12, #16\n\t"
  136518. "lsr r8, r8, #16\n\t"
  136519. "lsr r9, r9, #16\n\t"
  136520. "mul r9, r8, r9\n\t"
  136521. "adds r5, r5, r9\n\t"
  136522. "adcs r6, r6, #0\n\t"
  136523. "adc r7, r7, #0\n\t"
  136524. "lsr r9, r12, #16\n\t"
  136525. "mul r8, r9, r8\n\t"
  136526. "lsr r9, r8, #16\n\t"
  136527. "lsl r8, r8, #16\n\t"
  136528. "adds r5, r5, r8\n\t"
  136529. "adcs r6, r6, r9\n\t"
  136530. "adc r7, r7, #0\n\t"
  136531. "lsr r8, r10, #16\n\t"
  136532. "lsr r9, r12, #16\n\t"
  136533. "mul r9, r8, r9\n\t"
  136534. "adds r6, r6, r9\n\t"
  136535. "adc r7, r7, #0\n\t"
  136536. "lsl r9, r12, #16\n\t"
  136537. "lsr r9, r9, #16\n\t"
  136538. "mul r8, r9, r8\n\t"
  136539. "lsr r9, r8, #16\n\t"
  136540. "lsl r8, r8, #16\n\t"
  136541. "adds r5, r5, r8\n\t"
  136542. "adcs r6, r6, r9\n\t"
  136543. "adc r7, r7, #0\n\t"
  136544. #else
  136545. "umull r8, r9, r10, r12\n\t"
  136546. "adds r5, r5, r8\n\t"
  136547. "adcs r6, r6, r9\n\t"
  136548. "adc r7, r7, #0\n\t"
  136549. #endif
  136550. /* A[5] * A[9] */
  136551. "ldr r10, [%[a], #36]\n\t"
  136552. "ldr r12, [%[a], #20]\n\t"
  136553. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  136554. "lsl r8, r10, #16\n\t"
  136555. "lsl r9, r12, #16\n\t"
  136556. "lsr r8, r8, #16\n\t"
  136557. "lsr r9, r9, #16\n\t"
  136558. "mul r9, r8, r9\n\t"
  136559. "adds r5, r5, r9\n\t"
  136560. "adcs r6, r6, #0\n\t"
  136561. "adc r7, r7, #0\n\t"
  136562. "lsr r9, r12, #16\n\t"
  136563. "mul r8, r9, r8\n\t"
  136564. "lsr r9, r8, #16\n\t"
  136565. "lsl r8, r8, #16\n\t"
  136566. "adds r5, r5, r8\n\t"
  136567. "adcs r6, r6, r9\n\t"
  136568. "adc r7, r7, #0\n\t"
  136569. "lsr r8, r10, #16\n\t"
  136570. "lsr r9, r12, #16\n\t"
  136571. "mul r9, r8, r9\n\t"
  136572. "adds r6, r6, r9\n\t"
  136573. "adc r7, r7, #0\n\t"
  136574. "lsl r9, r12, #16\n\t"
  136575. "lsr r9, r9, #16\n\t"
  136576. "mul r8, r9, r8\n\t"
  136577. "lsr r9, r8, #16\n\t"
  136578. "lsl r8, r8, #16\n\t"
  136579. "adds r5, r5, r8\n\t"
  136580. "adcs r6, r6, r9\n\t"
  136581. "adc r7, r7, #0\n\t"
  136582. #else
  136583. "umull r8, r9, r10, r12\n\t"
  136584. "adds r5, r5, r8\n\t"
  136585. "adcs r6, r6, r9\n\t"
  136586. "adc r7, r7, #0\n\t"
  136587. #endif
  136588. /* A[6] * A[8] */
  136589. "ldr r10, [%[a], #32]\n\t"
  136590. "ldr r12, [%[a], #24]\n\t"
  136591. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  136592. "lsl r8, r10, #16\n\t"
  136593. "lsl r9, r12, #16\n\t"
  136594. "lsr r8, r8, #16\n\t"
  136595. "lsr r9, r9, #16\n\t"
  136596. "mul r9, r8, r9\n\t"
  136597. "adds r5, r5, r9\n\t"
  136598. "adcs r6, r6, #0\n\t"
  136599. "adc r7, r7, #0\n\t"
  136600. "lsr r9, r12, #16\n\t"
  136601. "mul r8, r9, r8\n\t"
  136602. "lsr r9, r8, #16\n\t"
  136603. "lsl r8, r8, #16\n\t"
  136604. "adds r5, r5, r8\n\t"
  136605. "adcs r6, r6, r9\n\t"
  136606. "adc r7, r7, #0\n\t"
  136607. "lsr r8, r10, #16\n\t"
  136608. "lsr r9, r12, #16\n\t"
  136609. "mul r9, r8, r9\n\t"
  136610. "adds r6, r6, r9\n\t"
  136611. "adc r7, r7, #0\n\t"
  136612. "lsl r9, r12, #16\n\t"
  136613. "lsr r9, r9, #16\n\t"
  136614. "mul r8, r9, r8\n\t"
  136615. "lsr r9, r8, #16\n\t"
  136616. "lsl r8, r8, #16\n\t"
  136617. "adds r5, r5, r8\n\t"
  136618. "adcs r6, r6, r9\n\t"
  136619. "adc r7, r7, #0\n\t"
  136620. #else
  136621. "umull r8, r9, r10, r12\n\t"
  136622. "adds r5, r5, r8\n\t"
  136623. "adcs r6, r6, r9\n\t"
  136624. "adc r7, r7, #0\n\t"
  136625. #endif
  136626. /* A[7] * A[7] */
  136627. "ldr r10, [%[a], #28]\n\t"
  136628. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  136629. "lsl r8, r10, #16\n\t"
  136630. "lsr r9, r10, #16\n\t"
  136631. "lsr r8, r8, #16\n\t"
  136632. "mov r12, r8\n\t"
  136633. "mul r8, r12, r8\n\t"
  136634. "mov r12, r9\n\t"
  136635. "mul r9, r12, r9\n\t"
  136636. "adds r4, r4, r8\n\t"
  136637. "adcs r2, r2, r9\n\t"
  136638. "adc r3, r3, #0\n\t"
  136639. "lsr r9, r10, #16\n\t"
  136640. "lsl r8, r10, #16\n\t"
  136641. "lsr r8, r8, #16\n\t"
  136642. "mul r8, r9, r8\n\t"
  136643. "lsr r9, r8, #15\n\t"
  136644. "lsl r8, r8, #17\n\t"
  136645. "adds r4, r4, r8\n\t"
  136646. "adcs r2, r2, r9\n\t"
  136647. "adc r3, r3, #0\n\t"
  136648. "adds r5, r5, r5\n\t"
  136649. "adcs r6, r6, r6\n\t"
  136650. "adc r7, r7, r7\n\t"
  136651. #else
  136652. "umull r8, r9, r10, r10\n\t"
  136653. "adds r5, r5, r5\n\t"
  136654. "adcs r6, r6, r6\n\t"
  136655. "adc r7, r7, r7\n\t"
  136656. "adds r4, r4, r8\n\t"
  136657. "adcs r2, r2, r9\n\t"
  136658. "adc r3, r3, #0\n\t"
  136659. #endif
  136660. "adds r4, r4, r5\n\t"
  136661. "adcs r2, r2, r6\n\t"
  136662. "adc r3, r3, r7\n\t"
  136663. "str r4, [sp, #56]\n\t"
  136664. /* A[0] * A[15] */
  136665. "ldr r10, [%[a], #60]\n\t"
  136666. "ldr r12, [%[a]]\n\t"
  136667. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  136668. "lsl r8, r10, #16\n\t"
  136669. "lsl r5, r12, #16\n\t"
  136670. "lsr r8, r8, #16\n\t"
  136671. "lsr r5, r5, #16\n\t"
  136672. "mul r5, r8, r5\n\t"
  136673. "lsr r9, r12, #16\n\t"
  136674. "mul r8, r9, r8\n\t"
  136675. "lsr r6, r8, #16\n\t"
  136676. "lsl r8, r8, #16\n\t"
  136677. "adds r5, r5, r8\n\t"
  136678. "adc r6, r6, #0\n\t"
  136679. "lsr r8, r10, #16\n\t"
  136680. "mul r9, r8, r9\n\t"
  136681. "add r6, r6, r9\n\t"
  136682. "lsl r9, r12, #16\n\t"
  136683. "lsr r9, r9, #16\n\t"
  136684. "mul r8, r9, r8\n\t"
  136685. "lsr r9, r8, #16\n\t"
  136686. "lsl r8, r8, #16\n\t"
  136687. "adds r5, r5, r8\n\t"
  136688. "adc r6, r6, r9\n\t"
  136689. #else
  136690. "umull r5, r6, r10, r12\n\t"
  136691. #endif
  136692. "mov r4, #0\n\t"
  136693. "mov r7, #0\n\t"
  136694. /* A[1] * A[14] */
  136695. "ldr r10, [%[a], #56]\n\t"
  136696. "ldr r12, [%[a], #4]\n\t"
  136697. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  136698. "lsl r8, r10, #16\n\t"
  136699. "lsl r9, r12, #16\n\t"
  136700. "lsr r8, r8, #16\n\t"
  136701. "lsr r9, r9, #16\n\t"
  136702. "mul r9, r8, r9\n\t"
  136703. "adds r5, r5, r9\n\t"
  136704. "adcs r6, r6, #0\n\t"
  136705. "adc r7, r7, #0\n\t"
  136706. "lsr r9, r12, #16\n\t"
  136707. "mul r8, r9, r8\n\t"
  136708. "lsr r9, r8, #16\n\t"
  136709. "lsl r8, r8, #16\n\t"
  136710. "adds r5, r5, r8\n\t"
  136711. "adcs r6, r6, r9\n\t"
  136712. "adc r7, r7, #0\n\t"
  136713. "lsr r8, r10, #16\n\t"
  136714. "lsr r9, r12, #16\n\t"
  136715. "mul r9, r8, r9\n\t"
  136716. "adds r6, r6, r9\n\t"
  136717. "adc r7, r7, #0\n\t"
  136718. "lsl r9, r12, #16\n\t"
  136719. "lsr r9, r9, #16\n\t"
  136720. "mul r8, r9, r8\n\t"
  136721. "lsr r9, r8, #16\n\t"
  136722. "lsl r8, r8, #16\n\t"
  136723. "adds r5, r5, r8\n\t"
  136724. "adcs r6, r6, r9\n\t"
  136725. "adc r7, r7, #0\n\t"
  136726. #else
  136727. "umull r8, r9, r10, r12\n\t"
  136728. "adds r5, r5, r8\n\t"
  136729. "adcs r6, r6, r9\n\t"
  136730. "adc r7, r7, #0\n\t"
  136731. #endif
  136732. /* A[2] * A[13] */
  136733. "ldr r10, [%[a], #52]\n\t"
  136734. "ldr r12, [%[a], #8]\n\t"
  136735. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  136736. "lsl r8, r10, #16\n\t"
  136737. "lsl r9, r12, #16\n\t"
  136738. "lsr r8, r8, #16\n\t"
  136739. "lsr r9, r9, #16\n\t"
  136740. "mul r9, r8, r9\n\t"
  136741. "adds r5, r5, r9\n\t"
  136742. "adcs r6, r6, #0\n\t"
  136743. "adc r7, r7, #0\n\t"
  136744. "lsr r9, r12, #16\n\t"
  136745. "mul r8, r9, r8\n\t"
  136746. "lsr r9, r8, #16\n\t"
  136747. "lsl r8, r8, #16\n\t"
  136748. "adds r5, r5, r8\n\t"
  136749. "adcs r6, r6, r9\n\t"
  136750. "adc r7, r7, #0\n\t"
  136751. "lsr r8, r10, #16\n\t"
  136752. "lsr r9, r12, #16\n\t"
  136753. "mul r9, r8, r9\n\t"
  136754. "adds r6, r6, r9\n\t"
  136755. "adc r7, r7, #0\n\t"
  136756. "lsl r9, r12, #16\n\t"
  136757. "lsr r9, r9, #16\n\t"
  136758. "mul r8, r9, r8\n\t"
  136759. "lsr r9, r8, #16\n\t"
  136760. "lsl r8, r8, #16\n\t"
  136761. "adds r5, r5, r8\n\t"
  136762. "adcs r6, r6, r9\n\t"
  136763. "adc r7, r7, #0\n\t"
  136764. #else
  136765. "umull r8, r9, r10, r12\n\t"
  136766. "adds r5, r5, r8\n\t"
  136767. "adcs r6, r6, r9\n\t"
  136768. "adc r7, r7, #0\n\t"
  136769. #endif
  136770. /* A[3] * A[12] */
  136771. "ldr r10, [%[a], #48]\n\t"
  136772. "ldr r12, [%[a], #12]\n\t"
  136773. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  136774. "lsl r8, r10, #16\n\t"
  136775. "lsl r9, r12, #16\n\t"
  136776. "lsr r8, r8, #16\n\t"
  136777. "lsr r9, r9, #16\n\t"
  136778. "mul r9, r8, r9\n\t"
  136779. "adds r5, r5, r9\n\t"
  136780. "adcs r6, r6, #0\n\t"
  136781. "adc r7, r7, #0\n\t"
  136782. "lsr r9, r12, #16\n\t"
  136783. "mul r8, r9, r8\n\t"
  136784. "lsr r9, r8, #16\n\t"
  136785. "lsl r8, r8, #16\n\t"
  136786. "adds r5, r5, r8\n\t"
  136787. "adcs r6, r6, r9\n\t"
  136788. "adc r7, r7, #0\n\t"
  136789. "lsr r8, r10, #16\n\t"
  136790. "lsr r9, r12, #16\n\t"
  136791. "mul r9, r8, r9\n\t"
  136792. "adds r6, r6, r9\n\t"
  136793. "adc r7, r7, #0\n\t"
  136794. "lsl r9, r12, #16\n\t"
  136795. "lsr r9, r9, #16\n\t"
  136796. "mul r8, r9, r8\n\t"
  136797. "lsr r9, r8, #16\n\t"
  136798. "lsl r8, r8, #16\n\t"
  136799. "adds r5, r5, r8\n\t"
  136800. "adcs r6, r6, r9\n\t"
  136801. "adc r7, r7, #0\n\t"
  136802. #else
  136803. "umull r8, r9, r10, r12\n\t"
  136804. "adds r5, r5, r8\n\t"
  136805. "adcs r6, r6, r9\n\t"
  136806. "adc r7, r7, #0\n\t"
  136807. #endif
  136808. /* A[4] * A[11] */
  136809. "ldr r10, [%[a], #44]\n\t"
  136810. "ldr r12, [%[a], #16]\n\t"
  136811. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  136812. "lsl r8, r10, #16\n\t"
  136813. "lsl r9, r12, #16\n\t"
  136814. "lsr r8, r8, #16\n\t"
  136815. "lsr r9, r9, #16\n\t"
  136816. "mul r9, r8, r9\n\t"
  136817. "adds r5, r5, r9\n\t"
  136818. "adcs r6, r6, #0\n\t"
  136819. "adc r7, r7, #0\n\t"
  136820. "lsr r9, r12, #16\n\t"
  136821. "mul r8, r9, r8\n\t"
  136822. "lsr r9, r8, #16\n\t"
  136823. "lsl r8, r8, #16\n\t"
  136824. "adds r5, r5, r8\n\t"
  136825. "adcs r6, r6, r9\n\t"
  136826. "adc r7, r7, #0\n\t"
  136827. "lsr r8, r10, #16\n\t"
  136828. "lsr r9, r12, #16\n\t"
  136829. "mul r9, r8, r9\n\t"
  136830. "adds r6, r6, r9\n\t"
  136831. "adc r7, r7, #0\n\t"
  136832. "lsl r9, r12, #16\n\t"
  136833. "lsr r9, r9, #16\n\t"
  136834. "mul r8, r9, r8\n\t"
  136835. "lsr r9, r8, #16\n\t"
  136836. "lsl r8, r8, #16\n\t"
  136837. "adds r5, r5, r8\n\t"
  136838. "adcs r6, r6, r9\n\t"
  136839. "adc r7, r7, #0\n\t"
  136840. #else
  136841. "umull r8, r9, r10, r12\n\t"
  136842. "adds r5, r5, r8\n\t"
  136843. "adcs r6, r6, r9\n\t"
  136844. "adc r7, r7, #0\n\t"
  136845. #endif
  136846. /* A[5] * A[10] */
  136847. "ldr r10, [%[a], #40]\n\t"
  136848. "ldr r12, [%[a], #20]\n\t"
  136849. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  136850. "lsl r8, r10, #16\n\t"
  136851. "lsl r9, r12, #16\n\t"
  136852. "lsr r8, r8, #16\n\t"
  136853. "lsr r9, r9, #16\n\t"
  136854. "mul r9, r8, r9\n\t"
  136855. "adds r5, r5, r9\n\t"
  136856. "adcs r6, r6, #0\n\t"
  136857. "adc r7, r7, #0\n\t"
  136858. "lsr r9, r12, #16\n\t"
  136859. "mul r8, r9, r8\n\t"
  136860. "lsr r9, r8, #16\n\t"
  136861. "lsl r8, r8, #16\n\t"
  136862. "adds r5, r5, r8\n\t"
  136863. "adcs r6, r6, r9\n\t"
  136864. "adc r7, r7, #0\n\t"
  136865. "lsr r8, r10, #16\n\t"
  136866. "lsr r9, r12, #16\n\t"
  136867. "mul r9, r8, r9\n\t"
  136868. "adds r6, r6, r9\n\t"
  136869. "adc r7, r7, #0\n\t"
  136870. "lsl r9, r12, #16\n\t"
  136871. "lsr r9, r9, #16\n\t"
  136872. "mul r8, r9, r8\n\t"
  136873. "lsr r9, r8, #16\n\t"
  136874. "lsl r8, r8, #16\n\t"
  136875. "adds r5, r5, r8\n\t"
  136876. "adcs r6, r6, r9\n\t"
  136877. "adc r7, r7, #0\n\t"
  136878. #else
  136879. "umull r8, r9, r10, r12\n\t"
  136880. "adds r5, r5, r8\n\t"
  136881. "adcs r6, r6, r9\n\t"
  136882. "adc r7, r7, #0\n\t"
  136883. #endif
  136884. /* A[6] * A[9] */
  136885. "ldr r10, [%[a], #36]\n\t"
  136886. "ldr r12, [%[a], #24]\n\t"
  136887. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  136888. "lsl r8, r10, #16\n\t"
  136889. "lsl r9, r12, #16\n\t"
  136890. "lsr r8, r8, #16\n\t"
  136891. "lsr r9, r9, #16\n\t"
  136892. "mul r9, r8, r9\n\t"
  136893. "adds r5, r5, r9\n\t"
  136894. "adcs r6, r6, #0\n\t"
  136895. "adc r7, r7, #0\n\t"
  136896. "lsr r9, r12, #16\n\t"
  136897. "mul r8, r9, r8\n\t"
  136898. "lsr r9, r8, #16\n\t"
  136899. "lsl r8, r8, #16\n\t"
  136900. "adds r5, r5, r8\n\t"
  136901. "adcs r6, r6, r9\n\t"
  136902. "adc r7, r7, #0\n\t"
  136903. "lsr r8, r10, #16\n\t"
  136904. "lsr r9, r12, #16\n\t"
  136905. "mul r9, r8, r9\n\t"
  136906. "adds r6, r6, r9\n\t"
  136907. "adc r7, r7, #0\n\t"
  136908. "lsl r9, r12, #16\n\t"
  136909. "lsr r9, r9, #16\n\t"
  136910. "mul r8, r9, r8\n\t"
  136911. "lsr r9, r8, #16\n\t"
  136912. "lsl r8, r8, #16\n\t"
  136913. "adds r5, r5, r8\n\t"
  136914. "adcs r6, r6, r9\n\t"
  136915. "adc r7, r7, #0\n\t"
  136916. #else
  136917. "umull r8, r9, r10, r12\n\t"
  136918. "adds r5, r5, r8\n\t"
  136919. "adcs r6, r6, r9\n\t"
  136920. "adc r7, r7, #0\n\t"
  136921. #endif
  136922. /* A[7] * A[8] */
  136923. "ldr r10, [%[a], #32]\n\t"
  136924. "ldr r12, [%[a], #28]\n\t"
  136925. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  136926. "lsl r8, r10, #16\n\t"
  136927. "lsl r9, r12, #16\n\t"
  136928. "lsr r8, r8, #16\n\t"
  136929. "lsr r9, r9, #16\n\t"
  136930. "mul r9, r8, r9\n\t"
  136931. "adds r5, r5, r9\n\t"
  136932. "adcs r6, r6, #0\n\t"
  136933. "adc r7, r7, #0\n\t"
  136934. "lsr r9, r12, #16\n\t"
  136935. "mul r8, r9, r8\n\t"
  136936. "lsr r9, r8, #16\n\t"
  136937. "lsl r8, r8, #16\n\t"
  136938. "adds r5, r5, r8\n\t"
  136939. "adcs r6, r6, r9\n\t"
  136940. "adc r7, r7, #0\n\t"
  136941. "lsr r8, r10, #16\n\t"
  136942. "lsr r9, r12, #16\n\t"
  136943. "mul r9, r8, r9\n\t"
  136944. "adds r6, r6, r9\n\t"
  136945. "adc r7, r7, #0\n\t"
  136946. "lsl r9, r12, #16\n\t"
  136947. "lsr r9, r9, #16\n\t"
  136948. "mul r8, r9, r8\n\t"
  136949. "lsr r9, r8, #16\n\t"
  136950. "lsl r8, r8, #16\n\t"
  136951. "adds r5, r5, r8\n\t"
  136952. "adcs r6, r6, r9\n\t"
  136953. "adc r7, r7, #0\n\t"
  136954. #else
  136955. "umull r8, r9, r10, r12\n\t"
  136956. "adds r5, r5, r8\n\t"
  136957. "adcs r6, r6, r9\n\t"
  136958. "adc r7, r7, #0\n\t"
  136959. #endif
  136960. "adds r5, r5, r5\n\t"
  136961. "adcs r6, r6, r6\n\t"
  136962. "adc r7, r7, r7\n\t"
  136963. "adds r2, r2, r5\n\t"
  136964. "adcs r3, r3, r6\n\t"
  136965. "adc r4, r4, r7\n\t"
  136966. "str r2, [sp, #60]\n\t"
  136967. /* A[1] * A[15] */
  136968. "ldr r10, [%[a], #60]\n\t"
  136969. "ldr r12, [%[a], #4]\n\t"
  136970. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  136971. "lsl r8, r10, #16\n\t"
  136972. "lsl r5, r12, #16\n\t"
  136973. "lsr r8, r8, #16\n\t"
  136974. "lsr r5, r5, #16\n\t"
  136975. "mul r5, r8, r5\n\t"
  136976. "lsr r9, r12, #16\n\t"
  136977. "mul r8, r9, r8\n\t"
  136978. "lsr r6, r8, #16\n\t"
  136979. "lsl r8, r8, #16\n\t"
  136980. "adds r5, r5, r8\n\t"
  136981. "adc r6, r6, #0\n\t"
  136982. "lsr r8, r10, #16\n\t"
  136983. "mul r9, r8, r9\n\t"
  136984. "add r6, r6, r9\n\t"
  136985. "lsl r9, r12, #16\n\t"
  136986. "lsr r9, r9, #16\n\t"
  136987. "mul r8, r9, r8\n\t"
  136988. "lsr r9, r8, #16\n\t"
  136989. "lsl r8, r8, #16\n\t"
  136990. "adds r5, r5, r8\n\t"
  136991. "adc r6, r6, r9\n\t"
  136992. #else
  136993. "umull r5, r6, r10, r12\n\t"
  136994. #endif
  136995. "mov r2, #0\n\t"
  136996. "mov r7, #0\n\t"
  136997. /* A[2] * A[14] */
  136998. "ldr r10, [%[a], #56]\n\t"
  136999. "ldr r12, [%[a], #8]\n\t"
  137000. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  137001. "lsl r8, r10, #16\n\t"
  137002. "lsl r9, r12, #16\n\t"
  137003. "lsr r8, r8, #16\n\t"
  137004. "lsr r9, r9, #16\n\t"
  137005. "mul r9, r8, r9\n\t"
  137006. "adds r5, r5, r9\n\t"
  137007. "adcs r6, r6, #0\n\t"
  137008. "adc r7, r7, #0\n\t"
  137009. "lsr r9, r12, #16\n\t"
  137010. "mul r8, r9, r8\n\t"
  137011. "lsr r9, r8, #16\n\t"
  137012. "lsl r8, r8, #16\n\t"
  137013. "adds r5, r5, r8\n\t"
  137014. "adcs r6, r6, r9\n\t"
  137015. "adc r7, r7, #0\n\t"
  137016. "lsr r8, r10, #16\n\t"
  137017. "lsr r9, r12, #16\n\t"
  137018. "mul r9, r8, r9\n\t"
  137019. "adds r6, r6, r9\n\t"
  137020. "adc r7, r7, #0\n\t"
  137021. "lsl r9, r12, #16\n\t"
  137022. "lsr r9, r9, #16\n\t"
  137023. "mul r8, r9, r8\n\t"
  137024. "lsr r9, r8, #16\n\t"
  137025. "lsl r8, r8, #16\n\t"
  137026. "adds r5, r5, r8\n\t"
  137027. "adcs r6, r6, r9\n\t"
  137028. "adc r7, r7, #0\n\t"
  137029. #else
  137030. "umull r8, r9, r10, r12\n\t"
  137031. "adds r5, r5, r8\n\t"
  137032. "adcs r6, r6, r9\n\t"
  137033. "adc r7, r7, #0\n\t"
  137034. #endif
  137035. /* A[3] * A[13] */
  137036. "ldr r10, [%[a], #52]\n\t"
  137037. "ldr r12, [%[a], #12]\n\t"
  137038. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  137039. "lsl r8, r10, #16\n\t"
  137040. "lsl r9, r12, #16\n\t"
  137041. "lsr r8, r8, #16\n\t"
  137042. "lsr r9, r9, #16\n\t"
  137043. "mul r9, r8, r9\n\t"
  137044. "adds r5, r5, r9\n\t"
  137045. "adcs r6, r6, #0\n\t"
  137046. "adc r7, r7, #0\n\t"
  137047. "lsr r9, r12, #16\n\t"
  137048. "mul r8, r9, r8\n\t"
  137049. "lsr r9, r8, #16\n\t"
  137050. "lsl r8, r8, #16\n\t"
  137051. "adds r5, r5, r8\n\t"
  137052. "adcs r6, r6, r9\n\t"
  137053. "adc r7, r7, #0\n\t"
  137054. "lsr r8, r10, #16\n\t"
  137055. "lsr r9, r12, #16\n\t"
  137056. "mul r9, r8, r9\n\t"
  137057. "adds r6, r6, r9\n\t"
  137058. "adc r7, r7, #0\n\t"
  137059. "lsl r9, r12, #16\n\t"
  137060. "lsr r9, r9, #16\n\t"
  137061. "mul r8, r9, r8\n\t"
  137062. "lsr r9, r8, #16\n\t"
  137063. "lsl r8, r8, #16\n\t"
  137064. "adds r5, r5, r8\n\t"
  137065. "adcs r6, r6, r9\n\t"
  137066. "adc r7, r7, #0\n\t"
  137067. #else
  137068. "umull r8, r9, r10, r12\n\t"
  137069. "adds r5, r5, r8\n\t"
  137070. "adcs r6, r6, r9\n\t"
  137071. "adc r7, r7, #0\n\t"
  137072. #endif
  137073. /* A[4] * A[12] */
  137074. "ldr r10, [%[a], #48]\n\t"
  137075. "ldr r12, [%[a], #16]\n\t"
  137076. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  137077. "lsl r8, r10, #16\n\t"
  137078. "lsl r9, r12, #16\n\t"
  137079. "lsr r8, r8, #16\n\t"
  137080. "lsr r9, r9, #16\n\t"
  137081. "mul r9, r8, r9\n\t"
  137082. "adds r5, r5, r9\n\t"
  137083. "adcs r6, r6, #0\n\t"
  137084. "adc r7, r7, #0\n\t"
  137085. "lsr r9, r12, #16\n\t"
  137086. "mul r8, r9, r8\n\t"
  137087. "lsr r9, r8, #16\n\t"
  137088. "lsl r8, r8, #16\n\t"
  137089. "adds r5, r5, r8\n\t"
  137090. "adcs r6, r6, r9\n\t"
  137091. "adc r7, r7, #0\n\t"
  137092. "lsr r8, r10, #16\n\t"
  137093. "lsr r9, r12, #16\n\t"
  137094. "mul r9, r8, r9\n\t"
  137095. "adds r6, r6, r9\n\t"
  137096. "adc r7, r7, #0\n\t"
  137097. "lsl r9, r12, #16\n\t"
  137098. "lsr r9, r9, #16\n\t"
  137099. "mul r8, r9, r8\n\t"
  137100. "lsr r9, r8, #16\n\t"
  137101. "lsl r8, r8, #16\n\t"
  137102. "adds r5, r5, r8\n\t"
  137103. "adcs r6, r6, r9\n\t"
  137104. "adc r7, r7, #0\n\t"
  137105. #else
  137106. "umull r8, r9, r10, r12\n\t"
  137107. "adds r5, r5, r8\n\t"
  137108. "adcs r6, r6, r9\n\t"
  137109. "adc r7, r7, #0\n\t"
  137110. #endif
  137111. /* A[5] * A[11] */
  137112. "ldr r10, [%[a], #44]\n\t"
  137113. "ldr r12, [%[a], #20]\n\t"
  137114. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  137115. "lsl r8, r10, #16\n\t"
  137116. "lsl r9, r12, #16\n\t"
  137117. "lsr r8, r8, #16\n\t"
  137118. "lsr r9, r9, #16\n\t"
  137119. "mul r9, r8, r9\n\t"
  137120. "adds r5, r5, r9\n\t"
  137121. "adcs r6, r6, #0\n\t"
  137122. "adc r7, r7, #0\n\t"
  137123. "lsr r9, r12, #16\n\t"
  137124. "mul r8, r9, r8\n\t"
  137125. "lsr r9, r8, #16\n\t"
  137126. "lsl r8, r8, #16\n\t"
  137127. "adds r5, r5, r8\n\t"
  137128. "adcs r6, r6, r9\n\t"
  137129. "adc r7, r7, #0\n\t"
  137130. "lsr r8, r10, #16\n\t"
  137131. "lsr r9, r12, #16\n\t"
  137132. "mul r9, r8, r9\n\t"
  137133. "adds r6, r6, r9\n\t"
  137134. "adc r7, r7, #0\n\t"
  137135. "lsl r9, r12, #16\n\t"
  137136. "lsr r9, r9, #16\n\t"
  137137. "mul r8, r9, r8\n\t"
  137138. "lsr r9, r8, #16\n\t"
  137139. "lsl r8, r8, #16\n\t"
  137140. "adds r5, r5, r8\n\t"
  137141. "adcs r6, r6, r9\n\t"
  137142. "adc r7, r7, #0\n\t"
  137143. #else
  137144. "umull r8, r9, r10, r12\n\t"
  137145. "adds r5, r5, r8\n\t"
  137146. "adcs r6, r6, r9\n\t"
  137147. "adc r7, r7, #0\n\t"
  137148. #endif
  137149. /* A[6] * A[10] */
  137150. "ldr r10, [%[a], #40]\n\t"
  137151. "ldr r12, [%[a], #24]\n\t"
  137152. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  137153. "lsl r8, r10, #16\n\t"
  137154. "lsl r9, r12, #16\n\t"
  137155. "lsr r8, r8, #16\n\t"
  137156. "lsr r9, r9, #16\n\t"
  137157. "mul r9, r8, r9\n\t"
  137158. "adds r5, r5, r9\n\t"
  137159. "adcs r6, r6, #0\n\t"
  137160. "adc r7, r7, #0\n\t"
  137161. "lsr r9, r12, #16\n\t"
  137162. "mul r8, r9, r8\n\t"
  137163. "lsr r9, r8, #16\n\t"
  137164. "lsl r8, r8, #16\n\t"
  137165. "adds r5, r5, r8\n\t"
  137166. "adcs r6, r6, r9\n\t"
  137167. "adc r7, r7, #0\n\t"
  137168. "lsr r8, r10, #16\n\t"
  137169. "lsr r9, r12, #16\n\t"
  137170. "mul r9, r8, r9\n\t"
  137171. "adds r6, r6, r9\n\t"
  137172. "adc r7, r7, #0\n\t"
  137173. "lsl r9, r12, #16\n\t"
  137174. "lsr r9, r9, #16\n\t"
  137175. "mul r8, r9, r8\n\t"
  137176. "lsr r9, r8, #16\n\t"
  137177. "lsl r8, r8, #16\n\t"
  137178. "adds r5, r5, r8\n\t"
  137179. "adcs r6, r6, r9\n\t"
  137180. "adc r7, r7, #0\n\t"
  137181. #else
  137182. "umull r8, r9, r10, r12\n\t"
  137183. "adds r5, r5, r8\n\t"
  137184. "adcs r6, r6, r9\n\t"
  137185. "adc r7, r7, #0\n\t"
  137186. #endif
  137187. /* A[7] * A[9] */
  137188. "ldr r10, [%[a], #36]\n\t"
  137189. "ldr r12, [%[a], #28]\n\t"
  137190. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  137191. "lsl r8, r10, #16\n\t"
  137192. "lsl r9, r12, #16\n\t"
  137193. "lsr r8, r8, #16\n\t"
  137194. "lsr r9, r9, #16\n\t"
  137195. "mul r9, r8, r9\n\t"
  137196. "adds r5, r5, r9\n\t"
  137197. "adcs r6, r6, #0\n\t"
  137198. "adc r7, r7, #0\n\t"
  137199. "lsr r9, r12, #16\n\t"
  137200. "mul r8, r9, r8\n\t"
  137201. "lsr r9, r8, #16\n\t"
  137202. "lsl r8, r8, #16\n\t"
  137203. "adds r5, r5, r8\n\t"
  137204. "adcs r6, r6, r9\n\t"
  137205. "adc r7, r7, #0\n\t"
  137206. "lsr r8, r10, #16\n\t"
  137207. "lsr r9, r12, #16\n\t"
  137208. "mul r9, r8, r9\n\t"
  137209. "adds r6, r6, r9\n\t"
  137210. "adc r7, r7, #0\n\t"
  137211. "lsl r9, r12, #16\n\t"
  137212. "lsr r9, r9, #16\n\t"
  137213. "mul r8, r9, r8\n\t"
  137214. "lsr r9, r8, #16\n\t"
  137215. "lsl r8, r8, #16\n\t"
  137216. "adds r5, r5, r8\n\t"
  137217. "adcs r6, r6, r9\n\t"
  137218. "adc r7, r7, #0\n\t"
  137219. #else
  137220. "umull r8, r9, r10, r12\n\t"
  137221. "adds r5, r5, r8\n\t"
  137222. "adcs r6, r6, r9\n\t"
  137223. "adc r7, r7, #0\n\t"
  137224. #endif
  137225. /* A[8] * A[8] */
  137226. "ldr r10, [%[a], #32]\n\t"
  137227. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  137228. "lsl r8, r10, #16\n\t"
  137229. "lsr r9, r10, #16\n\t"
  137230. "lsr r8, r8, #16\n\t"
  137231. "mov r12, r8\n\t"
  137232. "mul r8, r12, r8\n\t"
  137233. "mov r12, r9\n\t"
  137234. "mul r9, r12, r9\n\t"
  137235. "adds r3, r3, r8\n\t"
  137236. "adcs r4, r4, r9\n\t"
  137237. "adc r2, r2, #0\n\t"
  137238. "lsr r9, r10, #16\n\t"
  137239. "lsl r8, r10, #16\n\t"
  137240. "lsr r8, r8, #16\n\t"
  137241. "mul r8, r9, r8\n\t"
  137242. "lsr r9, r8, #15\n\t"
  137243. "lsl r8, r8, #17\n\t"
  137244. "adds r3, r3, r8\n\t"
  137245. "adcs r4, r4, r9\n\t"
  137246. "adc r2, r2, #0\n\t"
  137247. "adds r5, r5, r5\n\t"
  137248. "adcs r6, r6, r6\n\t"
  137249. "adc r7, r7, r7\n\t"
  137250. #else
  137251. "umull r8, r9, r10, r10\n\t"
  137252. "adds r5, r5, r5\n\t"
  137253. "adcs r6, r6, r6\n\t"
  137254. "adc r7, r7, r7\n\t"
  137255. "adds r3, r3, r8\n\t"
  137256. "adcs r4, r4, r9\n\t"
  137257. "adc r2, r2, #0\n\t"
  137258. #endif
  137259. "adds r3, r3, r5\n\t"
  137260. "adcs r4, r4, r6\n\t"
  137261. "adc r2, r2, r7\n\t"
  137262. "str r3, [%[r], #64]\n\t"
  137263. /* A[2] * A[15] */
  137264. "ldr r10, [%[a], #60]\n\t"
  137265. "ldr r12, [%[a], #8]\n\t"
  137266. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  137267. "lsl r8, r10, #16\n\t"
  137268. "lsl r5, r12, #16\n\t"
  137269. "lsr r8, r8, #16\n\t"
  137270. "lsr r5, r5, #16\n\t"
  137271. "mul r5, r8, r5\n\t"
  137272. "lsr r9, r12, #16\n\t"
  137273. "mul r8, r9, r8\n\t"
  137274. "lsr r6, r8, #16\n\t"
  137275. "lsl r8, r8, #16\n\t"
  137276. "adds r5, r5, r8\n\t"
  137277. "adc r6, r6, #0\n\t"
  137278. "lsr r8, r10, #16\n\t"
  137279. "mul r9, r8, r9\n\t"
  137280. "add r6, r6, r9\n\t"
  137281. "lsl r9, r12, #16\n\t"
  137282. "lsr r9, r9, #16\n\t"
  137283. "mul r8, r9, r8\n\t"
  137284. "lsr r9, r8, #16\n\t"
  137285. "lsl r8, r8, #16\n\t"
  137286. "adds r5, r5, r8\n\t"
  137287. "adc r6, r6, r9\n\t"
  137288. #else
  137289. "umull r5, r6, r10, r12\n\t"
  137290. #endif
  137291. "mov r3, #0\n\t"
  137292. "mov r7, #0\n\t"
  137293. /* A[3] * A[14] */
  137294. "ldr r10, [%[a], #56]\n\t"
  137295. "ldr r12, [%[a], #12]\n\t"
  137296. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  137297. "lsl r8, r10, #16\n\t"
  137298. "lsl r9, r12, #16\n\t"
  137299. "lsr r8, r8, #16\n\t"
  137300. "lsr r9, r9, #16\n\t"
  137301. "mul r9, r8, r9\n\t"
  137302. "adds r5, r5, r9\n\t"
  137303. "adcs r6, r6, #0\n\t"
  137304. "adc r7, r7, #0\n\t"
  137305. "lsr r9, r12, #16\n\t"
  137306. "mul r8, r9, r8\n\t"
  137307. "lsr r9, r8, #16\n\t"
  137308. "lsl r8, r8, #16\n\t"
  137309. "adds r5, r5, r8\n\t"
  137310. "adcs r6, r6, r9\n\t"
  137311. "adc r7, r7, #0\n\t"
  137312. "lsr r8, r10, #16\n\t"
  137313. "lsr r9, r12, #16\n\t"
  137314. "mul r9, r8, r9\n\t"
  137315. "adds r6, r6, r9\n\t"
  137316. "adc r7, r7, #0\n\t"
  137317. "lsl r9, r12, #16\n\t"
  137318. "lsr r9, r9, #16\n\t"
  137319. "mul r8, r9, r8\n\t"
  137320. "lsr r9, r8, #16\n\t"
  137321. "lsl r8, r8, #16\n\t"
  137322. "adds r5, r5, r8\n\t"
  137323. "adcs r6, r6, r9\n\t"
  137324. "adc r7, r7, #0\n\t"
  137325. #else
  137326. "umull r8, r9, r10, r12\n\t"
  137327. "adds r5, r5, r8\n\t"
  137328. "adcs r6, r6, r9\n\t"
  137329. "adc r7, r7, #0\n\t"
  137330. #endif
  137331. /* A[4] * A[13] */
  137332. "ldr r10, [%[a], #52]\n\t"
  137333. "ldr r12, [%[a], #16]\n\t"
  137334. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  137335. "lsl r8, r10, #16\n\t"
  137336. "lsl r9, r12, #16\n\t"
  137337. "lsr r8, r8, #16\n\t"
  137338. "lsr r9, r9, #16\n\t"
  137339. "mul r9, r8, r9\n\t"
  137340. "adds r5, r5, r9\n\t"
  137341. "adcs r6, r6, #0\n\t"
  137342. "adc r7, r7, #0\n\t"
  137343. "lsr r9, r12, #16\n\t"
  137344. "mul r8, r9, r8\n\t"
  137345. "lsr r9, r8, #16\n\t"
  137346. "lsl r8, r8, #16\n\t"
  137347. "adds r5, r5, r8\n\t"
  137348. "adcs r6, r6, r9\n\t"
  137349. "adc r7, r7, #0\n\t"
  137350. "lsr r8, r10, #16\n\t"
  137351. "lsr r9, r12, #16\n\t"
  137352. "mul r9, r8, r9\n\t"
  137353. "adds r6, r6, r9\n\t"
  137354. "adc r7, r7, #0\n\t"
  137355. "lsl r9, r12, #16\n\t"
  137356. "lsr r9, r9, #16\n\t"
  137357. "mul r8, r9, r8\n\t"
  137358. "lsr r9, r8, #16\n\t"
  137359. "lsl r8, r8, #16\n\t"
  137360. "adds r5, r5, r8\n\t"
  137361. "adcs r6, r6, r9\n\t"
  137362. "adc r7, r7, #0\n\t"
  137363. #else
  137364. "umull r8, r9, r10, r12\n\t"
  137365. "adds r5, r5, r8\n\t"
  137366. "adcs r6, r6, r9\n\t"
  137367. "adc r7, r7, #0\n\t"
  137368. #endif
  137369. /* A[5] * A[12] */
  137370. "ldr r10, [%[a], #48]\n\t"
  137371. "ldr r12, [%[a], #20]\n\t"
  137372. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  137373. "lsl r8, r10, #16\n\t"
  137374. "lsl r9, r12, #16\n\t"
  137375. "lsr r8, r8, #16\n\t"
  137376. "lsr r9, r9, #16\n\t"
  137377. "mul r9, r8, r9\n\t"
  137378. "adds r5, r5, r9\n\t"
  137379. "adcs r6, r6, #0\n\t"
  137380. "adc r7, r7, #0\n\t"
  137381. "lsr r9, r12, #16\n\t"
  137382. "mul r8, r9, r8\n\t"
  137383. "lsr r9, r8, #16\n\t"
  137384. "lsl r8, r8, #16\n\t"
  137385. "adds r5, r5, r8\n\t"
  137386. "adcs r6, r6, r9\n\t"
  137387. "adc r7, r7, #0\n\t"
  137388. "lsr r8, r10, #16\n\t"
  137389. "lsr r9, r12, #16\n\t"
  137390. "mul r9, r8, r9\n\t"
  137391. "adds r6, r6, r9\n\t"
  137392. "adc r7, r7, #0\n\t"
  137393. "lsl r9, r12, #16\n\t"
  137394. "lsr r9, r9, #16\n\t"
  137395. "mul r8, r9, r8\n\t"
  137396. "lsr r9, r8, #16\n\t"
  137397. "lsl r8, r8, #16\n\t"
  137398. "adds r5, r5, r8\n\t"
  137399. "adcs r6, r6, r9\n\t"
  137400. "adc r7, r7, #0\n\t"
  137401. #else
  137402. "umull r8, r9, r10, r12\n\t"
  137403. "adds r5, r5, r8\n\t"
  137404. "adcs r6, r6, r9\n\t"
  137405. "adc r7, r7, #0\n\t"
  137406. #endif
  137407. /* A[6] * A[11] */
  137408. "ldr r10, [%[a], #44]\n\t"
  137409. "ldr r12, [%[a], #24]\n\t"
  137410. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  137411. "lsl r8, r10, #16\n\t"
  137412. "lsl r9, r12, #16\n\t"
  137413. "lsr r8, r8, #16\n\t"
  137414. "lsr r9, r9, #16\n\t"
  137415. "mul r9, r8, r9\n\t"
  137416. "adds r5, r5, r9\n\t"
  137417. "adcs r6, r6, #0\n\t"
  137418. "adc r7, r7, #0\n\t"
  137419. "lsr r9, r12, #16\n\t"
  137420. "mul r8, r9, r8\n\t"
  137421. "lsr r9, r8, #16\n\t"
  137422. "lsl r8, r8, #16\n\t"
  137423. "adds r5, r5, r8\n\t"
  137424. "adcs r6, r6, r9\n\t"
  137425. "adc r7, r7, #0\n\t"
  137426. "lsr r8, r10, #16\n\t"
  137427. "lsr r9, r12, #16\n\t"
  137428. "mul r9, r8, r9\n\t"
  137429. "adds r6, r6, r9\n\t"
  137430. "adc r7, r7, #0\n\t"
  137431. "lsl r9, r12, #16\n\t"
  137432. "lsr r9, r9, #16\n\t"
  137433. "mul r8, r9, r8\n\t"
  137434. "lsr r9, r8, #16\n\t"
  137435. "lsl r8, r8, #16\n\t"
  137436. "adds r5, r5, r8\n\t"
  137437. "adcs r6, r6, r9\n\t"
  137438. "adc r7, r7, #0\n\t"
  137439. #else
  137440. "umull r8, r9, r10, r12\n\t"
  137441. "adds r5, r5, r8\n\t"
  137442. "adcs r6, r6, r9\n\t"
  137443. "adc r7, r7, #0\n\t"
  137444. #endif
  137445. /* A[7] * A[10] */
  137446. "ldr r10, [%[a], #40]\n\t"
  137447. "ldr r12, [%[a], #28]\n\t"
  137448. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  137449. "lsl r8, r10, #16\n\t"
  137450. "lsl r9, r12, #16\n\t"
  137451. "lsr r8, r8, #16\n\t"
  137452. "lsr r9, r9, #16\n\t"
  137453. "mul r9, r8, r9\n\t"
  137454. "adds r5, r5, r9\n\t"
  137455. "adcs r6, r6, #0\n\t"
  137456. "adc r7, r7, #0\n\t"
  137457. "lsr r9, r12, #16\n\t"
  137458. "mul r8, r9, r8\n\t"
  137459. "lsr r9, r8, #16\n\t"
  137460. "lsl r8, r8, #16\n\t"
  137461. "adds r5, r5, r8\n\t"
  137462. "adcs r6, r6, r9\n\t"
  137463. "adc r7, r7, #0\n\t"
  137464. "lsr r8, r10, #16\n\t"
  137465. "lsr r9, r12, #16\n\t"
  137466. "mul r9, r8, r9\n\t"
  137467. "adds r6, r6, r9\n\t"
  137468. "adc r7, r7, #0\n\t"
  137469. "lsl r9, r12, #16\n\t"
  137470. "lsr r9, r9, #16\n\t"
  137471. "mul r8, r9, r8\n\t"
  137472. "lsr r9, r8, #16\n\t"
  137473. "lsl r8, r8, #16\n\t"
  137474. "adds r5, r5, r8\n\t"
  137475. "adcs r6, r6, r9\n\t"
  137476. "adc r7, r7, #0\n\t"
  137477. #else
  137478. "umull r8, r9, r10, r12\n\t"
  137479. "adds r5, r5, r8\n\t"
  137480. "adcs r6, r6, r9\n\t"
  137481. "adc r7, r7, #0\n\t"
  137482. #endif
  137483. /* A[8] * A[9] */
  137484. "ldr r10, [%[a], #36]\n\t"
  137485. "ldr r12, [%[a], #32]\n\t"
  137486. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  137487. "lsl r8, r10, #16\n\t"
  137488. "lsl r9, r12, #16\n\t"
  137489. "lsr r8, r8, #16\n\t"
  137490. "lsr r9, r9, #16\n\t"
  137491. "mul r9, r8, r9\n\t"
  137492. "adds r5, r5, r9\n\t"
  137493. "adcs r6, r6, #0\n\t"
  137494. "adc r7, r7, #0\n\t"
  137495. "lsr r9, r12, #16\n\t"
  137496. "mul r8, r9, r8\n\t"
  137497. "lsr r9, r8, #16\n\t"
  137498. "lsl r8, r8, #16\n\t"
  137499. "adds r5, r5, r8\n\t"
  137500. "adcs r6, r6, r9\n\t"
  137501. "adc r7, r7, #0\n\t"
  137502. "lsr r8, r10, #16\n\t"
  137503. "lsr r9, r12, #16\n\t"
  137504. "mul r9, r8, r9\n\t"
  137505. "adds r6, r6, r9\n\t"
  137506. "adc r7, r7, #0\n\t"
  137507. "lsl r9, r12, #16\n\t"
  137508. "lsr r9, r9, #16\n\t"
  137509. "mul r8, r9, r8\n\t"
  137510. "lsr r9, r8, #16\n\t"
  137511. "lsl r8, r8, #16\n\t"
  137512. "adds r5, r5, r8\n\t"
  137513. "adcs r6, r6, r9\n\t"
  137514. "adc r7, r7, #0\n\t"
  137515. #else
  137516. "umull r8, r9, r10, r12\n\t"
  137517. "adds r5, r5, r8\n\t"
  137518. "adcs r6, r6, r9\n\t"
  137519. "adc r7, r7, #0\n\t"
  137520. #endif
  137521. "adds r5, r5, r5\n\t"
  137522. "adcs r6, r6, r6\n\t"
  137523. "adc r7, r7, r7\n\t"
  137524. "adds r4, r4, r5\n\t"
  137525. "adcs r2, r2, r6\n\t"
  137526. "adc r3, r3, r7\n\t"
  137527. "str r4, [%[r], #68]\n\t"
  137528. /* A[3] * A[15] */
  137529. "ldr r10, [%[a], #60]\n\t"
  137530. "ldr r12, [%[a], #12]\n\t"
  137531. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  137532. "lsl r8, r10, #16\n\t"
  137533. "lsl r5, r12, #16\n\t"
  137534. "lsr r8, r8, #16\n\t"
  137535. "lsr r5, r5, #16\n\t"
  137536. "mul r5, r8, r5\n\t"
  137537. "lsr r9, r12, #16\n\t"
  137538. "mul r8, r9, r8\n\t"
  137539. "lsr r6, r8, #16\n\t"
  137540. "lsl r8, r8, #16\n\t"
  137541. "adds r5, r5, r8\n\t"
  137542. "adc r6, r6, #0\n\t"
  137543. "lsr r8, r10, #16\n\t"
  137544. "mul r9, r8, r9\n\t"
  137545. "add r6, r6, r9\n\t"
  137546. "lsl r9, r12, #16\n\t"
  137547. "lsr r9, r9, #16\n\t"
  137548. "mul r8, r9, r8\n\t"
  137549. "lsr r9, r8, #16\n\t"
  137550. "lsl r8, r8, #16\n\t"
  137551. "adds r5, r5, r8\n\t"
  137552. "adc r6, r6, r9\n\t"
  137553. #else
  137554. "umull r5, r6, r10, r12\n\t"
  137555. #endif
  137556. "mov r4, #0\n\t"
  137557. "mov r7, #0\n\t"
  137558. /* A[4] * A[14] */
  137559. "ldr r10, [%[a], #56]\n\t"
  137560. "ldr r12, [%[a], #16]\n\t"
  137561. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  137562. "lsl r8, r10, #16\n\t"
  137563. "lsl r9, r12, #16\n\t"
  137564. "lsr r8, r8, #16\n\t"
  137565. "lsr r9, r9, #16\n\t"
  137566. "mul r9, r8, r9\n\t"
  137567. "adds r5, r5, r9\n\t"
  137568. "adcs r6, r6, #0\n\t"
  137569. "adc r7, r7, #0\n\t"
  137570. "lsr r9, r12, #16\n\t"
  137571. "mul r8, r9, r8\n\t"
  137572. "lsr r9, r8, #16\n\t"
  137573. "lsl r8, r8, #16\n\t"
  137574. "adds r5, r5, r8\n\t"
  137575. "adcs r6, r6, r9\n\t"
  137576. "adc r7, r7, #0\n\t"
  137577. "lsr r8, r10, #16\n\t"
  137578. "lsr r9, r12, #16\n\t"
  137579. "mul r9, r8, r9\n\t"
  137580. "adds r6, r6, r9\n\t"
  137581. "adc r7, r7, #0\n\t"
  137582. "lsl r9, r12, #16\n\t"
  137583. "lsr r9, r9, #16\n\t"
  137584. "mul r8, r9, r8\n\t"
  137585. "lsr r9, r8, #16\n\t"
  137586. "lsl r8, r8, #16\n\t"
  137587. "adds r5, r5, r8\n\t"
  137588. "adcs r6, r6, r9\n\t"
  137589. "adc r7, r7, #0\n\t"
  137590. #else
  137591. "umull r8, r9, r10, r12\n\t"
  137592. "adds r5, r5, r8\n\t"
  137593. "adcs r6, r6, r9\n\t"
  137594. "adc r7, r7, #0\n\t"
  137595. #endif
  137596. /* A[5] * A[13] */
  137597. "ldr r10, [%[a], #52]\n\t"
  137598. "ldr r12, [%[a], #20]\n\t"
  137599. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  137600. "lsl r8, r10, #16\n\t"
  137601. "lsl r9, r12, #16\n\t"
  137602. "lsr r8, r8, #16\n\t"
  137603. "lsr r9, r9, #16\n\t"
  137604. "mul r9, r8, r9\n\t"
  137605. "adds r5, r5, r9\n\t"
  137606. "adcs r6, r6, #0\n\t"
  137607. "adc r7, r7, #0\n\t"
  137608. "lsr r9, r12, #16\n\t"
  137609. "mul r8, r9, r8\n\t"
  137610. "lsr r9, r8, #16\n\t"
  137611. "lsl r8, r8, #16\n\t"
  137612. "adds r5, r5, r8\n\t"
  137613. "adcs r6, r6, r9\n\t"
  137614. "adc r7, r7, #0\n\t"
  137615. "lsr r8, r10, #16\n\t"
  137616. "lsr r9, r12, #16\n\t"
  137617. "mul r9, r8, r9\n\t"
  137618. "adds r6, r6, r9\n\t"
  137619. "adc r7, r7, #0\n\t"
  137620. "lsl r9, r12, #16\n\t"
  137621. "lsr r9, r9, #16\n\t"
  137622. "mul r8, r9, r8\n\t"
  137623. "lsr r9, r8, #16\n\t"
  137624. "lsl r8, r8, #16\n\t"
  137625. "adds r5, r5, r8\n\t"
  137626. "adcs r6, r6, r9\n\t"
  137627. "adc r7, r7, #0\n\t"
  137628. #else
  137629. "umull r8, r9, r10, r12\n\t"
  137630. "adds r5, r5, r8\n\t"
  137631. "adcs r6, r6, r9\n\t"
  137632. "adc r7, r7, #0\n\t"
  137633. #endif
  137634. /* A[6] * A[12] */
  137635. "ldr r10, [%[a], #48]\n\t"
  137636. "ldr r12, [%[a], #24]\n\t"
  137637. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  137638. "lsl r8, r10, #16\n\t"
  137639. "lsl r9, r12, #16\n\t"
  137640. "lsr r8, r8, #16\n\t"
  137641. "lsr r9, r9, #16\n\t"
  137642. "mul r9, r8, r9\n\t"
  137643. "adds r5, r5, r9\n\t"
  137644. "adcs r6, r6, #0\n\t"
  137645. "adc r7, r7, #0\n\t"
  137646. "lsr r9, r12, #16\n\t"
  137647. "mul r8, r9, r8\n\t"
  137648. "lsr r9, r8, #16\n\t"
  137649. "lsl r8, r8, #16\n\t"
  137650. "adds r5, r5, r8\n\t"
  137651. "adcs r6, r6, r9\n\t"
  137652. "adc r7, r7, #0\n\t"
  137653. "lsr r8, r10, #16\n\t"
  137654. "lsr r9, r12, #16\n\t"
  137655. "mul r9, r8, r9\n\t"
  137656. "adds r6, r6, r9\n\t"
  137657. "adc r7, r7, #0\n\t"
  137658. "lsl r9, r12, #16\n\t"
  137659. "lsr r9, r9, #16\n\t"
  137660. "mul r8, r9, r8\n\t"
  137661. "lsr r9, r8, #16\n\t"
  137662. "lsl r8, r8, #16\n\t"
  137663. "adds r5, r5, r8\n\t"
  137664. "adcs r6, r6, r9\n\t"
  137665. "adc r7, r7, #0\n\t"
  137666. #else
  137667. "umull r8, r9, r10, r12\n\t"
  137668. "adds r5, r5, r8\n\t"
  137669. "adcs r6, r6, r9\n\t"
  137670. "adc r7, r7, #0\n\t"
  137671. #endif
  137672. /* A[7] * A[11] */
  137673. "ldr r10, [%[a], #44]\n\t"
  137674. "ldr r12, [%[a], #28]\n\t"
  137675. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  137676. "lsl r8, r10, #16\n\t"
  137677. "lsl r9, r12, #16\n\t"
  137678. "lsr r8, r8, #16\n\t"
  137679. "lsr r9, r9, #16\n\t"
  137680. "mul r9, r8, r9\n\t"
  137681. "adds r5, r5, r9\n\t"
  137682. "adcs r6, r6, #0\n\t"
  137683. "adc r7, r7, #0\n\t"
  137684. "lsr r9, r12, #16\n\t"
  137685. "mul r8, r9, r8\n\t"
  137686. "lsr r9, r8, #16\n\t"
  137687. "lsl r8, r8, #16\n\t"
  137688. "adds r5, r5, r8\n\t"
  137689. "adcs r6, r6, r9\n\t"
  137690. "adc r7, r7, #0\n\t"
  137691. "lsr r8, r10, #16\n\t"
  137692. "lsr r9, r12, #16\n\t"
  137693. "mul r9, r8, r9\n\t"
  137694. "adds r6, r6, r9\n\t"
  137695. "adc r7, r7, #0\n\t"
  137696. "lsl r9, r12, #16\n\t"
  137697. "lsr r9, r9, #16\n\t"
  137698. "mul r8, r9, r8\n\t"
  137699. "lsr r9, r8, #16\n\t"
  137700. "lsl r8, r8, #16\n\t"
  137701. "adds r5, r5, r8\n\t"
  137702. "adcs r6, r6, r9\n\t"
  137703. "adc r7, r7, #0\n\t"
  137704. #else
  137705. "umull r8, r9, r10, r12\n\t"
  137706. "adds r5, r5, r8\n\t"
  137707. "adcs r6, r6, r9\n\t"
  137708. "adc r7, r7, #0\n\t"
  137709. #endif
  137710. /* A[8] * A[10] */
  137711. "ldr r10, [%[a], #40]\n\t"
  137712. "ldr r12, [%[a], #32]\n\t"
  137713. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  137714. "lsl r8, r10, #16\n\t"
  137715. "lsl r9, r12, #16\n\t"
  137716. "lsr r8, r8, #16\n\t"
  137717. "lsr r9, r9, #16\n\t"
  137718. "mul r9, r8, r9\n\t"
  137719. "adds r5, r5, r9\n\t"
  137720. "adcs r6, r6, #0\n\t"
  137721. "adc r7, r7, #0\n\t"
  137722. "lsr r9, r12, #16\n\t"
  137723. "mul r8, r9, r8\n\t"
  137724. "lsr r9, r8, #16\n\t"
  137725. "lsl r8, r8, #16\n\t"
  137726. "adds r5, r5, r8\n\t"
  137727. "adcs r6, r6, r9\n\t"
  137728. "adc r7, r7, #0\n\t"
  137729. "lsr r8, r10, #16\n\t"
  137730. "lsr r9, r12, #16\n\t"
  137731. "mul r9, r8, r9\n\t"
  137732. "adds r6, r6, r9\n\t"
  137733. "adc r7, r7, #0\n\t"
  137734. "lsl r9, r12, #16\n\t"
  137735. "lsr r9, r9, #16\n\t"
  137736. "mul r8, r9, r8\n\t"
  137737. "lsr r9, r8, #16\n\t"
  137738. "lsl r8, r8, #16\n\t"
  137739. "adds r5, r5, r8\n\t"
  137740. "adcs r6, r6, r9\n\t"
  137741. "adc r7, r7, #0\n\t"
  137742. #else
  137743. "umull r8, r9, r10, r12\n\t"
  137744. "adds r5, r5, r8\n\t"
  137745. "adcs r6, r6, r9\n\t"
  137746. "adc r7, r7, #0\n\t"
  137747. #endif
  137748. /* A[9] * A[9] */
  137749. "ldr r10, [%[a], #36]\n\t"
  137750. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  137751. "lsl r8, r10, #16\n\t"
  137752. "lsr r9, r10, #16\n\t"
  137753. "lsr r8, r8, #16\n\t"
  137754. "mov r12, r8\n\t"
  137755. "mul r8, r12, r8\n\t"
  137756. "mov r12, r9\n\t"
  137757. "mul r9, r12, r9\n\t"
  137758. "adds r2, r2, r8\n\t"
  137759. "adcs r3, r3, r9\n\t"
  137760. "adc r4, r4, #0\n\t"
  137761. "lsr r9, r10, #16\n\t"
  137762. "lsl r8, r10, #16\n\t"
  137763. "lsr r8, r8, #16\n\t"
  137764. "mul r8, r9, r8\n\t"
  137765. "lsr r9, r8, #15\n\t"
  137766. "lsl r8, r8, #17\n\t"
  137767. "adds r2, r2, r8\n\t"
  137768. "adcs r3, r3, r9\n\t"
  137769. "adc r4, r4, #0\n\t"
  137770. "adds r5, r5, r5\n\t"
  137771. "adcs r6, r6, r6\n\t"
  137772. "adc r7, r7, r7\n\t"
  137773. #else
  137774. "umull r8, r9, r10, r10\n\t"
  137775. "adds r5, r5, r5\n\t"
  137776. "adcs r6, r6, r6\n\t"
  137777. "adc r7, r7, r7\n\t"
  137778. "adds r2, r2, r8\n\t"
  137779. "adcs r3, r3, r9\n\t"
  137780. "adc r4, r4, #0\n\t"
  137781. #endif
  137782. "adds r2, r2, r5\n\t"
  137783. "adcs r3, r3, r6\n\t"
  137784. "adc r4, r4, r7\n\t"
  137785. "str r2, [%[r], #72]\n\t"
  137786. /* A[4] * A[15] */
  137787. "ldr r10, [%[a], #60]\n\t"
  137788. "ldr r12, [%[a], #16]\n\t"
  137789. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  137790. "lsl r8, r10, #16\n\t"
  137791. "lsl r5, r12, #16\n\t"
  137792. "lsr r8, r8, #16\n\t"
  137793. "lsr r5, r5, #16\n\t"
  137794. "mul r5, r8, r5\n\t"
  137795. "lsr r9, r12, #16\n\t"
  137796. "mul r8, r9, r8\n\t"
  137797. "lsr r6, r8, #16\n\t"
  137798. "lsl r8, r8, #16\n\t"
  137799. "adds r5, r5, r8\n\t"
  137800. "adc r6, r6, #0\n\t"
  137801. "lsr r8, r10, #16\n\t"
  137802. "mul r9, r8, r9\n\t"
  137803. "add r6, r6, r9\n\t"
  137804. "lsl r9, r12, #16\n\t"
  137805. "lsr r9, r9, #16\n\t"
  137806. "mul r8, r9, r8\n\t"
  137807. "lsr r9, r8, #16\n\t"
  137808. "lsl r8, r8, #16\n\t"
  137809. "adds r5, r5, r8\n\t"
  137810. "adc r6, r6, r9\n\t"
  137811. #else
  137812. "umull r5, r6, r10, r12\n\t"
  137813. #endif
  137814. "mov r2, #0\n\t"
  137815. "mov r7, #0\n\t"
  137816. /* A[5] * A[14] */
  137817. "ldr r10, [%[a], #56]\n\t"
  137818. "ldr r12, [%[a], #20]\n\t"
  137819. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  137820. "lsl r8, r10, #16\n\t"
  137821. "lsl r9, r12, #16\n\t"
  137822. "lsr r8, r8, #16\n\t"
  137823. "lsr r9, r9, #16\n\t"
  137824. "mul r9, r8, r9\n\t"
  137825. "adds r5, r5, r9\n\t"
  137826. "adcs r6, r6, #0\n\t"
  137827. "adc r7, r7, #0\n\t"
  137828. "lsr r9, r12, #16\n\t"
  137829. "mul r8, r9, r8\n\t"
  137830. "lsr r9, r8, #16\n\t"
  137831. "lsl r8, r8, #16\n\t"
  137832. "adds r5, r5, r8\n\t"
  137833. "adcs r6, r6, r9\n\t"
  137834. "adc r7, r7, #0\n\t"
  137835. "lsr r8, r10, #16\n\t"
  137836. "lsr r9, r12, #16\n\t"
  137837. "mul r9, r8, r9\n\t"
  137838. "adds r6, r6, r9\n\t"
  137839. "adc r7, r7, #0\n\t"
  137840. "lsl r9, r12, #16\n\t"
  137841. "lsr r9, r9, #16\n\t"
  137842. "mul r8, r9, r8\n\t"
  137843. "lsr r9, r8, #16\n\t"
  137844. "lsl r8, r8, #16\n\t"
  137845. "adds r5, r5, r8\n\t"
  137846. "adcs r6, r6, r9\n\t"
  137847. "adc r7, r7, #0\n\t"
  137848. #else
  137849. "umull r8, r9, r10, r12\n\t"
  137850. "adds r5, r5, r8\n\t"
  137851. "adcs r6, r6, r9\n\t"
  137852. "adc r7, r7, #0\n\t"
  137853. #endif
  137854. /* A[6] * A[13] */
  137855. "ldr r10, [%[a], #52]\n\t"
  137856. "ldr r12, [%[a], #24]\n\t"
  137857. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  137858. "lsl r8, r10, #16\n\t"
  137859. "lsl r9, r12, #16\n\t"
  137860. "lsr r8, r8, #16\n\t"
  137861. "lsr r9, r9, #16\n\t"
  137862. "mul r9, r8, r9\n\t"
  137863. "adds r5, r5, r9\n\t"
  137864. "adcs r6, r6, #0\n\t"
  137865. "adc r7, r7, #0\n\t"
  137866. "lsr r9, r12, #16\n\t"
  137867. "mul r8, r9, r8\n\t"
  137868. "lsr r9, r8, #16\n\t"
  137869. "lsl r8, r8, #16\n\t"
  137870. "adds r5, r5, r8\n\t"
  137871. "adcs r6, r6, r9\n\t"
  137872. "adc r7, r7, #0\n\t"
  137873. "lsr r8, r10, #16\n\t"
  137874. "lsr r9, r12, #16\n\t"
  137875. "mul r9, r8, r9\n\t"
  137876. "adds r6, r6, r9\n\t"
  137877. "adc r7, r7, #0\n\t"
  137878. "lsl r9, r12, #16\n\t"
  137879. "lsr r9, r9, #16\n\t"
  137880. "mul r8, r9, r8\n\t"
  137881. "lsr r9, r8, #16\n\t"
  137882. "lsl r8, r8, #16\n\t"
  137883. "adds r5, r5, r8\n\t"
  137884. "adcs r6, r6, r9\n\t"
  137885. "adc r7, r7, #0\n\t"
  137886. #else
  137887. "umull r8, r9, r10, r12\n\t"
  137888. "adds r5, r5, r8\n\t"
  137889. "adcs r6, r6, r9\n\t"
  137890. "adc r7, r7, #0\n\t"
  137891. #endif
  137892. /* A[7] * A[12] */
  137893. "ldr r10, [%[a], #48]\n\t"
  137894. "ldr r12, [%[a], #28]\n\t"
  137895. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  137896. "lsl r8, r10, #16\n\t"
  137897. "lsl r9, r12, #16\n\t"
  137898. "lsr r8, r8, #16\n\t"
  137899. "lsr r9, r9, #16\n\t"
  137900. "mul r9, r8, r9\n\t"
  137901. "adds r5, r5, r9\n\t"
  137902. "adcs r6, r6, #0\n\t"
  137903. "adc r7, r7, #0\n\t"
  137904. "lsr r9, r12, #16\n\t"
  137905. "mul r8, r9, r8\n\t"
  137906. "lsr r9, r8, #16\n\t"
  137907. "lsl r8, r8, #16\n\t"
  137908. "adds r5, r5, r8\n\t"
  137909. "adcs r6, r6, r9\n\t"
  137910. "adc r7, r7, #0\n\t"
  137911. "lsr r8, r10, #16\n\t"
  137912. "lsr r9, r12, #16\n\t"
  137913. "mul r9, r8, r9\n\t"
  137914. "adds r6, r6, r9\n\t"
  137915. "adc r7, r7, #0\n\t"
  137916. "lsl r9, r12, #16\n\t"
  137917. "lsr r9, r9, #16\n\t"
  137918. "mul r8, r9, r8\n\t"
  137919. "lsr r9, r8, #16\n\t"
  137920. "lsl r8, r8, #16\n\t"
  137921. "adds r5, r5, r8\n\t"
  137922. "adcs r6, r6, r9\n\t"
  137923. "adc r7, r7, #0\n\t"
  137924. #else
  137925. "umull r8, r9, r10, r12\n\t"
  137926. "adds r5, r5, r8\n\t"
  137927. "adcs r6, r6, r9\n\t"
  137928. "adc r7, r7, #0\n\t"
  137929. #endif
  137930. /* A[8] * A[11] */
  137931. "ldr r10, [%[a], #44]\n\t"
  137932. "ldr r12, [%[a], #32]\n\t"
  137933. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  137934. "lsl r8, r10, #16\n\t"
  137935. "lsl r9, r12, #16\n\t"
  137936. "lsr r8, r8, #16\n\t"
  137937. "lsr r9, r9, #16\n\t"
  137938. "mul r9, r8, r9\n\t"
  137939. "adds r5, r5, r9\n\t"
  137940. "adcs r6, r6, #0\n\t"
  137941. "adc r7, r7, #0\n\t"
  137942. "lsr r9, r12, #16\n\t"
  137943. "mul r8, r9, r8\n\t"
  137944. "lsr r9, r8, #16\n\t"
  137945. "lsl r8, r8, #16\n\t"
  137946. "adds r5, r5, r8\n\t"
  137947. "adcs r6, r6, r9\n\t"
  137948. "adc r7, r7, #0\n\t"
  137949. "lsr r8, r10, #16\n\t"
  137950. "lsr r9, r12, #16\n\t"
  137951. "mul r9, r8, r9\n\t"
  137952. "adds r6, r6, r9\n\t"
  137953. "adc r7, r7, #0\n\t"
  137954. "lsl r9, r12, #16\n\t"
  137955. "lsr r9, r9, #16\n\t"
  137956. "mul r8, r9, r8\n\t"
  137957. "lsr r9, r8, #16\n\t"
  137958. "lsl r8, r8, #16\n\t"
  137959. "adds r5, r5, r8\n\t"
  137960. "adcs r6, r6, r9\n\t"
  137961. "adc r7, r7, #0\n\t"
  137962. #else
  137963. "umull r8, r9, r10, r12\n\t"
  137964. "adds r5, r5, r8\n\t"
  137965. "adcs r6, r6, r9\n\t"
  137966. "adc r7, r7, #0\n\t"
  137967. #endif
  137968. /* A[9] * A[10] */
  137969. "ldr r10, [%[a], #40]\n\t"
  137970. "ldr r12, [%[a], #36]\n\t"
  137971. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  137972. "lsl r8, r10, #16\n\t"
  137973. "lsl r9, r12, #16\n\t"
  137974. "lsr r8, r8, #16\n\t"
  137975. "lsr r9, r9, #16\n\t"
  137976. "mul r9, r8, r9\n\t"
  137977. "adds r5, r5, r9\n\t"
  137978. "adcs r6, r6, #0\n\t"
  137979. "adc r7, r7, #0\n\t"
  137980. "lsr r9, r12, #16\n\t"
  137981. "mul r8, r9, r8\n\t"
  137982. "lsr r9, r8, #16\n\t"
  137983. "lsl r8, r8, #16\n\t"
  137984. "adds r5, r5, r8\n\t"
  137985. "adcs r6, r6, r9\n\t"
  137986. "adc r7, r7, #0\n\t"
  137987. "lsr r8, r10, #16\n\t"
  137988. "lsr r9, r12, #16\n\t"
  137989. "mul r9, r8, r9\n\t"
  137990. "adds r6, r6, r9\n\t"
  137991. "adc r7, r7, #0\n\t"
  137992. "lsl r9, r12, #16\n\t"
  137993. "lsr r9, r9, #16\n\t"
  137994. "mul r8, r9, r8\n\t"
  137995. "lsr r9, r8, #16\n\t"
  137996. "lsl r8, r8, #16\n\t"
  137997. "adds r5, r5, r8\n\t"
  137998. "adcs r6, r6, r9\n\t"
  137999. "adc r7, r7, #0\n\t"
  138000. #else
  138001. "umull r8, r9, r10, r12\n\t"
  138002. "adds r5, r5, r8\n\t"
  138003. "adcs r6, r6, r9\n\t"
  138004. "adc r7, r7, #0\n\t"
  138005. #endif
  138006. "adds r5, r5, r5\n\t"
  138007. "adcs r6, r6, r6\n\t"
  138008. "adc r7, r7, r7\n\t"
  138009. "adds r3, r3, r5\n\t"
  138010. "adcs r4, r4, r6\n\t"
  138011. "adc r2, r2, r7\n\t"
  138012. "str r3, [%[r], #76]\n\t"
  138013. /* A[5] * A[15] */
  138014. "ldr r10, [%[a], #60]\n\t"
  138015. "ldr r12, [%[a], #20]\n\t"
  138016. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  138017. "lsl r8, r10, #16\n\t"
  138018. "lsl r5, r12, #16\n\t"
  138019. "lsr r8, r8, #16\n\t"
  138020. "lsr r5, r5, #16\n\t"
  138021. "mul r5, r8, r5\n\t"
  138022. "lsr r9, r12, #16\n\t"
  138023. "mul r8, r9, r8\n\t"
  138024. "lsr r6, r8, #16\n\t"
  138025. "lsl r8, r8, #16\n\t"
  138026. "adds r5, r5, r8\n\t"
  138027. "adc r6, r6, #0\n\t"
  138028. "lsr r8, r10, #16\n\t"
  138029. "mul r9, r8, r9\n\t"
  138030. "add r6, r6, r9\n\t"
  138031. "lsl r9, r12, #16\n\t"
  138032. "lsr r9, r9, #16\n\t"
  138033. "mul r8, r9, r8\n\t"
  138034. "lsr r9, r8, #16\n\t"
  138035. "lsl r8, r8, #16\n\t"
  138036. "adds r5, r5, r8\n\t"
  138037. "adc r6, r6, r9\n\t"
  138038. #else
  138039. "umull r5, r6, r10, r12\n\t"
  138040. #endif
  138041. "mov r3, #0\n\t"
  138042. "mov r7, #0\n\t"
  138043. /* A[6] * A[14] */
  138044. "ldr r10, [%[a], #56]\n\t"
  138045. "ldr r12, [%[a], #24]\n\t"
  138046. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  138047. "lsl r8, r10, #16\n\t"
  138048. "lsl r9, r12, #16\n\t"
  138049. "lsr r8, r8, #16\n\t"
  138050. "lsr r9, r9, #16\n\t"
  138051. "mul r9, r8, r9\n\t"
  138052. "adds r5, r5, r9\n\t"
  138053. "adcs r6, r6, #0\n\t"
  138054. "adc r7, r7, #0\n\t"
  138055. "lsr r9, r12, #16\n\t"
  138056. "mul r8, r9, r8\n\t"
  138057. "lsr r9, r8, #16\n\t"
  138058. "lsl r8, r8, #16\n\t"
  138059. "adds r5, r5, r8\n\t"
  138060. "adcs r6, r6, r9\n\t"
  138061. "adc r7, r7, #0\n\t"
  138062. "lsr r8, r10, #16\n\t"
  138063. "lsr r9, r12, #16\n\t"
  138064. "mul r9, r8, r9\n\t"
  138065. "adds r6, r6, r9\n\t"
  138066. "adc r7, r7, #0\n\t"
  138067. "lsl r9, r12, #16\n\t"
  138068. "lsr r9, r9, #16\n\t"
  138069. "mul r8, r9, r8\n\t"
  138070. "lsr r9, r8, #16\n\t"
  138071. "lsl r8, r8, #16\n\t"
  138072. "adds r5, r5, r8\n\t"
  138073. "adcs r6, r6, r9\n\t"
  138074. "adc r7, r7, #0\n\t"
  138075. #else
  138076. "umull r8, r9, r10, r12\n\t"
  138077. "adds r5, r5, r8\n\t"
  138078. "adcs r6, r6, r9\n\t"
  138079. "adc r7, r7, #0\n\t"
  138080. #endif
  138081. /* A[7] * A[13] */
  138082. "ldr r10, [%[a], #52]\n\t"
  138083. "ldr r12, [%[a], #28]\n\t"
  138084. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  138085. "lsl r8, r10, #16\n\t"
  138086. "lsl r9, r12, #16\n\t"
  138087. "lsr r8, r8, #16\n\t"
  138088. "lsr r9, r9, #16\n\t"
  138089. "mul r9, r8, r9\n\t"
  138090. "adds r5, r5, r9\n\t"
  138091. "adcs r6, r6, #0\n\t"
  138092. "adc r7, r7, #0\n\t"
  138093. "lsr r9, r12, #16\n\t"
  138094. "mul r8, r9, r8\n\t"
  138095. "lsr r9, r8, #16\n\t"
  138096. "lsl r8, r8, #16\n\t"
  138097. "adds r5, r5, r8\n\t"
  138098. "adcs r6, r6, r9\n\t"
  138099. "adc r7, r7, #0\n\t"
  138100. "lsr r8, r10, #16\n\t"
  138101. "lsr r9, r12, #16\n\t"
  138102. "mul r9, r8, r9\n\t"
  138103. "adds r6, r6, r9\n\t"
  138104. "adc r7, r7, #0\n\t"
  138105. "lsl r9, r12, #16\n\t"
  138106. "lsr r9, r9, #16\n\t"
  138107. "mul r8, r9, r8\n\t"
  138108. "lsr r9, r8, #16\n\t"
  138109. "lsl r8, r8, #16\n\t"
  138110. "adds r5, r5, r8\n\t"
  138111. "adcs r6, r6, r9\n\t"
  138112. "adc r7, r7, #0\n\t"
  138113. #else
  138114. "umull r8, r9, r10, r12\n\t"
  138115. "adds r5, r5, r8\n\t"
  138116. "adcs r6, r6, r9\n\t"
  138117. "adc r7, r7, #0\n\t"
  138118. #endif
  138119. /* A[8] * A[12] */
  138120. "ldr r10, [%[a], #48]\n\t"
  138121. "ldr r12, [%[a], #32]\n\t"
  138122. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  138123. "lsl r8, r10, #16\n\t"
  138124. "lsl r9, r12, #16\n\t"
  138125. "lsr r8, r8, #16\n\t"
  138126. "lsr r9, r9, #16\n\t"
  138127. "mul r9, r8, r9\n\t"
  138128. "adds r5, r5, r9\n\t"
  138129. "adcs r6, r6, #0\n\t"
  138130. "adc r7, r7, #0\n\t"
  138131. "lsr r9, r12, #16\n\t"
  138132. "mul r8, r9, r8\n\t"
  138133. "lsr r9, r8, #16\n\t"
  138134. "lsl r8, r8, #16\n\t"
  138135. "adds r5, r5, r8\n\t"
  138136. "adcs r6, r6, r9\n\t"
  138137. "adc r7, r7, #0\n\t"
  138138. "lsr r8, r10, #16\n\t"
  138139. "lsr r9, r12, #16\n\t"
  138140. "mul r9, r8, r9\n\t"
  138141. "adds r6, r6, r9\n\t"
  138142. "adc r7, r7, #0\n\t"
  138143. "lsl r9, r12, #16\n\t"
  138144. "lsr r9, r9, #16\n\t"
  138145. "mul r8, r9, r8\n\t"
  138146. "lsr r9, r8, #16\n\t"
  138147. "lsl r8, r8, #16\n\t"
  138148. "adds r5, r5, r8\n\t"
  138149. "adcs r6, r6, r9\n\t"
  138150. "adc r7, r7, #0\n\t"
  138151. #else
  138152. "umull r8, r9, r10, r12\n\t"
  138153. "adds r5, r5, r8\n\t"
  138154. "adcs r6, r6, r9\n\t"
  138155. "adc r7, r7, #0\n\t"
  138156. #endif
  138157. /* A[9] * A[11] */
  138158. "ldr r10, [%[a], #44]\n\t"
  138159. "ldr r12, [%[a], #36]\n\t"
  138160. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  138161. "lsl r8, r10, #16\n\t"
  138162. "lsl r9, r12, #16\n\t"
  138163. "lsr r8, r8, #16\n\t"
  138164. "lsr r9, r9, #16\n\t"
  138165. "mul r9, r8, r9\n\t"
  138166. "adds r5, r5, r9\n\t"
  138167. "adcs r6, r6, #0\n\t"
  138168. "adc r7, r7, #0\n\t"
  138169. "lsr r9, r12, #16\n\t"
  138170. "mul r8, r9, r8\n\t"
  138171. "lsr r9, r8, #16\n\t"
  138172. "lsl r8, r8, #16\n\t"
  138173. "adds r5, r5, r8\n\t"
  138174. "adcs r6, r6, r9\n\t"
  138175. "adc r7, r7, #0\n\t"
  138176. "lsr r8, r10, #16\n\t"
  138177. "lsr r9, r12, #16\n\t"
  138178. "mul r9, r8, r9\n\t"
  138179. "adds r6, r6, r9\n\t"
  138180. "adc r7, r7, #0\n\t"
  138181. "lsl r9, r12, #16\n\t"
  138182. "lsr r9, r9, #16\n\t"
  138183. "mul r8, r9, r8\n\t"
  138184. "lsr r9, r8, #16\n\t"
  138185. "lsl r8, r8, #16\n\t"
  138186. "adds r5, r5, r8\n\t"
  138187. "adcs r6, r6, r9\n\t"
  138188. "adc r7, r7, #0\n\t"
  138189. #else
  138190. "umull r8, r9, r10, r12\n\t"
  138191. "adds r5, r5, r8\n\t"
  138192. "adcs r6, r6, r9\n\t"
  138193. "adc r7, r7, #0\n\t"
  138194. #endif
  138195. /* A[10] * A[10] */
  138196. "ldr r10, [%[a], #40]\n\t"
  138197. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  138198. "lsl r8, r10, #16\n\t"
  138199. "lsr r9, r10, #16\n\t"
  138200. "lsr r8, r8, #16\n\t"
  138201. "mov r12, r8\n\t"
  138202. "mul r8, r12, r8\n\t"
  138203. "mov r12, r9\n\t"
  138204. "mul r9, r12, r9\n\t"
  138205. "adds r4, r4, r8\n\t"
  138206. "adcs r2, r2, r9\n\t"
  138207. "adc r3, r3, #0\n\t"
  138208. "lsr r9, r10, #16\n\t"
  138209. "lsl r8, r10, #16\n\t"
  138210. "lsr r8, r8, #16\n\t"
  138211. "mul r8, r9, r8\n\t"
  138212. "lsr r9, r8, #15\n\t"
  138213. "lsl r8, r8, #17\n\t"
  138214. "adds r4, r4, r8\n\t"
  138215. "adcs r2, r2, r9\n\t"
  138216. "adc r3, r3, #0\n\t"
  138217. "adds r5, r5, r5\n\t"
  138218. "adcs r6, r6, r6\n\t"
  138219. "adc r7, r7, r7\n\t"
  138220. #else
  138221. "umull r8, r9, r10, r10\n\t"
  138222. "adds r5, r5, r5\n\t"
  138223. "adcs r6, r6, r6\n\t"
  138224. "adc r7, r7, r7\n\t"
  138225. "adds r4, r4, r8\n\t"
  138226. "adcs r2, r2, r9\n\t"
  138227. "adc r3, r3, #0\n\t"
  138228. #endif
  138229. "adds r4, r4, r5\n\t"
  138230. "adcs r2, r2, r6\n\t"
  138231. "adc r3, r3, r7\n\t"
  138232. "str r4, [%[r], #80]\n\t"
  138233. /* A[6] * A[15] */
  138234. "ldr r10, [%[a], #60]\n\t"
  138235. "ldr r12, [%[a], #24]\n\t"
  138236. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  138237. "lsl r8, r10, #16\n\t"
  138238. "lsl r5, r12, #16\n\t"
  138239. "lsr r8, r8, #16\n\t"
  138240. "lsr r5, r5, #16\n\t"
  138241. "mul r5, r8, r5\n\t"
  138242. "lsr r9, r12, #16\n\t"
  138243. "mul r8, r9, r8\n\t"
  138244. "lsr r6, r8, #16\n\t"
  138245. "lsl r8, r8, #16\n\t"
  138246. "adds r5, r5, r8\n\t"
  138247. "adc r6, r6, #0\n\t"
  138248. "lsr r8, r10, #16\n\t"
  138249. "mul r9, r8, r9\n\t"
  138250. "add r6, r6, r9\n\t"
  138251. "lsl r9, r12, #16\n\t"
  138252. "lsr r9, r9, #16\n\t"
  138253. "mul r8, r9, r8\n\t"
  138254. "lsr r9, r8, #16\n\t"
  138255. "lsl r8, r8, #16\n\t"
  138256. "adds r5, r5, r8\n\t"
  138257. "adc r6, r6, r9\n\t"
  138258. #else
  138259. "umull r5, r6, r10, r12\n\t"
  138260. #endif
  138261. "mov r4, #0\n\t"
  138262. "mov r7, #0\n\t"
  138263. /* A[7] * A[14] */
  138264. "ldr r10, [%[a], #56]\n\t"
  138265. "ldr r12, [%[a], #28]\n\t"
  138266. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  138267. "lsl r8, r10, #16\n\t"
  138268. "lsl r9, r12, #16\n\t"
  138269. "lsr r8, r8, #16\n\t"
  138270. "lsr r9, r9, #16\n\t"
  138271. "mul r9, r8, r9\n\t"
  138272. "adds r5, r5, r9\n\t"
  138273. "adcs r6, r6, #0\n\t"
  138274. "adc r7, r7, #0\n\t"
  138275. "lsr r9, r12, #16\n\t"
  138276. "mul r8, r9, r8\n\t"
  138277. "lsr r9, r8, #16\n\t"
  138278. "lsl r8, r8, #16\n\t"
  138279. "adds r5, r5, r8\n\t"
  138280. "adcs r6, r6, r9\n\t"
  138281. "adc r7, r7, #0\n\t"
  138282. "lsr r8, r10, #16\n\t"
  138283. "lsr r9, r12, #16\n\t"
  138284. "mul r9, r8, r9\n\t"
  138285. "adds r6, r6, r9\n\t"
  138286. "adc r7, r7, #0\n\t"
  138287. "lsl r9, r12, #16\n\t"
  138288. "lsr r9, r9, #16\n\t"
  138289. "mul r8, r9, r8\n\t"
  138290. "lsr r9, r8, #16\n\t"
  138291. "lsl r8, r8, #16\n\t"
  138292. "adds r5, r5, r8\n\t"
  138293. "adcs r6, r6, r9\n\t"
  138294. "adc r7, r7, #0\n\t"
  138295. #else
  138296. "umull r8, r9, r10, r12\n\t"
  138297. "adds r5, r5, r8\n\t"
  138298. "adcs r6, r6, r9\n\t"
  138299. "adc r7, r7, #0\n\t"
  138300. #endif
  138301. /* A[8] * A[13] */
  138302. "ldr r10, [%[a], #52]\n\t"
  138303. "ldr r12, [%[a], #32]\n\t"
  138304. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  138305. "lsl r8, r10, #16\n\t"
  138306. "lsl r9, r12, #16\n\t"
  138307. "lsr r8, r8, #16\n\t"
  138308. "lsr r9, r9, #16\n\t"
  138309. "mul r9, r8, r9\n\t"
  138310. "adds r5, r5, r9\n\t"
  138311. "adcs r6, r6, #0\n\t"
  138312. "adc r7, r7, #0\n\t"
  138313. "lsr r9, r12, #16\n\t"
  138314. "mul r8, r9, r8\n\t"
  138315. "lsr r9, r8, #16\n\t"
  138316. "lsl r8, r8, #16\n\t"
  138317. "adds r5, r5, r8\n\t"
  138318. "adcs r6, r6, r9\n\t"
  138319. "adc r7, r7, #0\n\t"
  138320. "lsr r8, r10, #16\n\t"
  138321. "lsr r9, r12, #16\n\t"
  138322. "mul r9, r8, r9\n\t"
  138323. "adds r6, r6, r9\n\t"
  138324. "adc r7, r7, #0\n\t"
  138325. "lsl r9, r12, #16\n\t"
  138326. "lsr r9, r9, #16\n\t"
  138327. "mul r8, r9, r8\n\t"
  138328. "lsr r9, r8, #16\n\t"
  138329. "lsl r8, r8, #16\n\t"
  138330. "adds r5, r5, r8\n\t"
  138331. "adcs r6, r6, r9\n\t"
  138332. "adc r7, r7, #0\n\t"
  138333. #else
  138334. "umull r8, r9, r10, r12\n\t"
  138335. "adds r5, r5, r8\n\t"
  138336. "adcs r6, r6, r9\n\t"
  138337. "adc r7, r7, #0\n\t"
  138338. #endif
  138339. /* A[9] * A[12] */
  138340. "ldr r10, [%[a], #48]\n\t"
  138341. "ldr r12, [%[a], #36]\n\t"
  138342. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  138343. "lsl r8, r10, #16\n\t"
  138344. "lsl r9, r12, #16\n\t"
  138345. "lsr r8, r8, #16\n\t"
  138346. "lsr r9, r9, #16\n\t"
  138347. "mul r9, r8, r9\n\t"
  138348. "adds r5, r5, r9\n\t"
  138349. "adcs r6, r6, #0\n\t"
  138350. "adc r7, r7, #0\n\t"
  138351. "lsr r9, r12, #16\n\t"
  138352. "mul r8, r9, r8\n\t"
  138353. "lsr r9, r8, #16\n\t"
  138354. "lsl r8, r8, #16\n\t"
  138355. "adds r5, r5, r8\n\t"
  138356. "adcs r6, r6, r9\n\t"
  138357. "adc r7, r7, #0\n\t"
  138358. "lsr r8, r10, #16\n\t"
  138359. "lsr r9, r12, #16\n\t"
  138360. "mul r9, r8, r9\n\t"
  138361. "adds r6, r6, r9\n\t"
  138362. "adc r7, r7, #0\n\t"
  138363. "lsl r9, r12, #16\n\t"
  138364. "lsr r9, r9, #16\n\t"
  138365. "mul r8, r9, r8\n\t"
  138366. "lsr r9, r8, #16\n\t"
  138367. "lsl r8, r8, #16\n\t"
  138368. "adds r5, r5, r8\n\t"
  138369. "adcs r6, r6, r9\n\t"
  138370. "adc r7, r7, #0\n\t"
  138371. #else
  138372. "umull r8, r9, r10, r12\n\t"
  138373. "adds r5, r5, r8\n\t"
  138374. "adcs r6, r6, r9\n\t"
  138375. "adc r7, r7, #0\n\t"
  138376. #endif
  138377. /* A[10] * A[11] */
  138378. "ldr r10, [%[a], #44]\n\t"
  138379. "ldr r12, [%[a], #40]\n\t"
  138380. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  138381. "lsl r8, r10, #16\n\t"
  138382. "lsl r9, r12, #16\n\t"
  138383. "lsr r8, r8, #16\n\t"
  138384. "lsr r9, r9, #16\n\t"
  138385. "mul r9, r8, r9\n\t"
  138386. "adds r5, r5, r9\n\t"
  138387. "adcs r6, r6, #0\n\t"
  138388. "adc r7, r7, #0\n\t"
  138389. "lsr r9, r12, #16\n\t"
  138390. "mul r8, r9, r8\n\t"
  138391. "lsr r9, r8, #16\n\t"
  138392. "lsl r8, r8, #16\n\t"
  138393. "adds r5, r5, r8\n\t"
  138394. "adcs r6, r6, r9\n\t"
  138395. "adc r7, r7, #0\n\t"
  138396. "lsr r8, r10, #16\n\t"
  138397. "lsr r9, r12, #16\n\t"
  138398. "mul r9, r8, r9\n\t"
  138399. "adds r6, r6, r9\n\t"
  138400. "adc r7, r7, #0\n\t"
  138401. "lsl r9, r12, #16\n\t"
  138402. "lsr r9, r9, #16\n\t"
  138403. "mul r8, r9, r8\n\t"
  138404. "lsr r9, r8, #16\n\t"
  138405. "lsl r8, r8, #16\n\t"
  138406. "adds r5, r5, r8\n\t"
  138407. "adcs r6, r6, r9\n\t"
  138408. "adc r7, r7, #0\n\t"
  138409. #else
  138410. "umull r8, r9, r10, r12\n\t"
  138411. "adds r5, r5, r8\n\t"
  138412. "adcs r6, r6, r9\n\t"
  138413. "adc r7, r7, #0\n\t"
  138414. #endif
  138415. "adds r5, r5, r5\n\t"
  138416. "adcs r6, r6, r6\n\t"
  138417. "adc r7, r7, r7\n\t"
  138418. "adds r2, r2, r5\n\t"
  138419. "adcs r3, r3, r6\n\t"
  138420. "adc r4, r4, r7\n\t"
  138421. "str r2, [%[r], #84]\n\t"
  138422. /* A[7] * A[15] */
  138423. "ldr r10, [%[a], #60]\n\t"
  138424. "ldr r12, [%[a], #28]\n\t"
  138425. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  138426. "lsl r8, r10, #16\n\t"
  138427. "lsl r5, r12, #16\n\t"
  138428. "lsr r8, r8, #16\n\t"
  138429. "lsr r5, r5, #16\n\t"
  138430. "mul r5, r8, r5\n\t"
  138431. "lsr r9, r12, #16\n\t"
  138432. "mul r8, r9, r8\n\t"
  138433. "lsr r6, r8, #16\n\t"
  138434. "lsl r8, r8, #16\n\t"
  138435. "adds r5, r5, r8\n\t"
  138436. "adc r6, r6, #0\n\t"
  138437. "lsr r8, r10, #16\n\t"
  138438. "mul r9, r8, r9\n\t"
  138439. "add r6, r6, r9\n\t"
  138440. "lsl r9, r12, #16\n\t"
  138441. "lsr r9, r9, #16\n\t"
  138442. "mul r8, r9, r8\n\t"
  138443. "lsr r9, r8, #16\n\t"
  138444. "lsl r8, r8, #16\n\t"
  138445. "adds r5, r5, r8\n\t"
  138446. "adc r6, r6, r9\n\t"
  138447. #else
  138448. "umull r5, r6, r10, r12\n\t"
  138449. #endif
  138450. "mov r2, #0\n\t"
  138451. "mov r7, #0\n\t"
  138452. /* A[8] * A[14] */
  138453. "ldr r10, [%[a], #56]\n\t"
  138454. "ldr r12, [%[a], #32]\n\t"
  138455. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  138456. "lsl r8, r10, #16\n\t"
  138457. "lsl r9, r12, #16\n\t"
  138458. "lsr r8, r8, #16\n\t"
  138459. "lsr r9, r9, #16\n\t"
  138460. "mul r9, r8, r9\n\t"
  138461. "adds r5, r5, r9\n\t"
  138462. "adcs r6, r6, #0\n\t"
  138463. "adc r7, r7, #0\n\t"
  138464. "lsr r9, r12, #16\n\t"
  138465. "mul r8, r9, r8\n\t"
  138466. "lsr r9, r8, #16\n\t"
  138467. "lsl r8, r8, #16\n\t"
  138468. "adds r5, r5, r8\n\t"
  138469. "adcs r6, r6, r9\n\t"
  138470. "adc r7, r7, #0\n\t"
  138471. "lsr r8, r10, #16\n\t"
  138472. "lsr r9, r12, #16\n\t"
  138473. "mul r9, r8, r9\n\t"
  138474. "adds r6, r6, r9\n\t"
  138475. "adc r7, r7, #0\n\t"
  138476. "lsl r9, r12, #16\n\t"
  138477. "lsr r9, r9, #16\n\t"
  138478. "mul r8, r9, r8\n\t"
  138479. "lsr r9, r8, #16\n\t"
  138480. "lsl r8, r8, #16\n\t"
  138481. "adds r5, r5, r8\n\t"
  138482. "adcs r6, r6, r9\n\t"
  138483. "adc r7, r7, #0\n\t"
  138484. #else
  138485. "umull r8, r9, r10, r12\n\t"
  138486. "adds r5, r5, r8\n\t"
  138487. "adcs r6, r6, r9\n\t"
  138488. "adc r7, r7, #0\n\t"
  138489. #endif
  138490. /* A[9] * A[13] */
  138491. "ldr r10, [%[a], #52]\n\t"
  138492. "ldr r12, [%[a], #36]\n\t"
  138493. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  138494. "lsl r8, r10, #16\n\t"
  138495. "lsl r9, r12, #16\n\t"
  138496. "lsr r8, r8, #16\n\t"
  138497. "lsr r9, r9, #16\n\t"
  138498. "mul r9, r8, r9\n\t"
  138499. "adds r5, r5, r9\n\t"
  138500. "adcs r6, r6, #0\n\t"
  138501. "adc r7, r7, #0\n\t"
  138502. "lsr r9, r12, #16\n\t"
  138503. "mul r8, r9, r8\n\t"
  138504. "lsr r9, r8, #16\n\t"
  138505. "lsl r8, r8, #16\n\t"
  138506. "adds r5, r5, r8\n\t"
  138507. "adcs r6, r6, r9\n\t"
  138508. "adc r7, r7, #0\n\t"
  138509. "lsr r8, r10, #16\n\t"
  138510. "lsr r9, r12, #16\n\t"
  138511. "mul r9, r8, r9\n\t"
  138512. "adds r6, r6, r9\n\t"
  138513. "adc r7, r7, #0\n\t"
  138514. "lsl r9, r12, #16\n\t"
  138515. "lsr r9, r9, #16\n\t"
  138516. "mul r8, r9, r8\n\t"
  138517. "lsr r9, r8, #16\n\t"
  138518. "lsl r8, r8, #16\n\t"
  138519. "adds r5, r5, r8\n\t"
  138520. "adcs r6, r6, r9\n\t"
  138521. "adc r7, r7, #0\n\t"
  138522. #else
  138523. "umull r8, r9, r10, r12\n\t"
  138524. "adds r5, r5, r8\n\t"
  138525. "adcs r6, r6, r9\n\t"
  138526. "adc r7, r7, #0\n\t"
  138527. #endif
  138528. /* A[10] * A[12] */
  138529. "ldr r10, [%[a], #48]\n\t"
  138530. "ldr r12, [%[a], #40]\n\t"
  138531. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  138532. "lsl r8, r10, #16\n\t"
  138533. "lsl r9, r12, #16\n\t"
  138534. "lsr r8, r8, #16\n\t"
  138535. "lsr r9, r9, #16\n\t"
  138536. "mul r9, r8, r9\n\t"
  138537. "adds r5, r5, r9\n\t"
  138538. "adcs r6, r6, #0\n\t"
  138539. "adc r7, r7, #0\n\t"
  138540. "lsr r9, r12, #16\n\t"
  138541. "mul r8, r9, r8\n\t"
  138542. "lsr r9, r8, #16\n\t"
  138543. "lsl r8, r8, #16\n\t"
  138544. "adds r5, r5, r8\n\t"
  138545. "adcs r6, r6, r9\n\t"
  138546. "adc r7, r7, #0\n\t"
  138547. "lsr r8, r10, #16\n\t"
  138548. "lsr r9, r12, #16\n\t"
  138549. "mul r9, r8, r9\n\t"
  138550. "adds r6, r6, r9\n\t"
  138551. "adc r7, r7, #0\n\t"
  138552. "lsl r9, r12, #16\n\t"
  138553. "lsr r9, r9, #16\n\t"
  138554. "mul r8, r9, r8\n\t"
  138555. "lsr r9, r8, #16\n\t"
  138556. "lsl r8, r8, #16\n\t"
  138557. "adds r5, r5, r8\n\t"
  138558. "adcs r6, r6, r9\n\t"
  138559. "adc r7, r7, #0\n\t"
  138560. #else
  138561. "umull r8, r9, r10, r12\n\t"
  138562. "adds r5, r5, r8\n\t"
  138563. "adcs r6, r6, r9\n\t"
  138564. "adc r7, r7, #0\n\t"
  138565. #endif
  138566. /* A[11] * A[11] */
  138567. "ldr r10, [%[a], #44]\n\t"
  138568. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  138569. "lsl r8, r10, #16\n\t"
  138570. "lsr r9, r10, #16\n\t"
  138571. "lsr r8, r8, #16\n\t"
  138572. "mov r12, r8\n\t"
  138573. "mul r8, r12, r8\n\t"
  138574. "mov r12, r9\n\t"
  138575. "mul r9, r12, r9\n\t"
  138576. "adds r3, r3, r8\n\t"
  138577. "adcs r4, r4, r9\n\t"
  138578. "adc r2, r2, #0\n\t"
  138579. "lsr r9, r10, #16\n\t"
  138580. "lsl r8, r10, #16\n\t"
  138581. "lsr r8, r8, #16\n\t"
  138582. "mul r8, r9, r8\n\t"
  138583. "lsr r9, r8, #15\n\t"
  138584. "lsl r8, r8, #17\n\t"
  138585. "adds r3, r3, r8\n\t"
  138586. "adcs r4, r4, r9\n\t"
  138587. "adc r2, r2, #0\n\t"
  138588. "adds r5, r5, r5\n\t"
  138589. "adcs r6, r6, r6\n\t"
  138590. "adc r7, r7, r7\n\t"
  138591. #else
  138592. "umull r8, r9, r10, r10\n\t"
  138593. "adds r5, r5, r5\n\t"
  138594. "adcs r6, r6, r6\n\t"
  138595. "adc r7, r7, r7\n\t"
  138596. "adds r3, r3, r8\n\t"
  138597. "adcs r4, r4, r9\n\t"
  138598. "adc r2, r2, #0\n\t"
  138599. #endif
  138600. "adds r3, r3, r5\n\t"
  138601. "adcs r4, r4, r6\n\t"
  138602. "adc r2, r2, r7\n\t"
  138603. "str r3, [%[r], #88]\n\t"
  138604. /* A[8] * A[15] */
  138605. "ldr r10, [%[a], #60]\n\t"
  138606. "ldr r12, [%[a], #32]\n\t"
  138607. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  138608. "lsl r8, r10, #16\n\t"
  138609. "lsl r5, r12, #16\n\t"
  138610. "lsr r8, r8, #16\n\t"
  138611. "lsr r5, r5, #16\n\t"
  138612. "mul r5, r8, r5\n\t"
  138613. "lsr r9, r12, #16\n\t"
  138614. "mul r8, r9, r8\n\t"
  138615. "lsr r6, r8, #16\n\t"
  138616. "lsl r8, r8, #16\n\t"
  138617. "adds r5, r5, r8\n\t"
  138618. "adc r6, r6, #0\n\t"
  138619. "lsr r8, r10, #16\n\t"
  138620. "mul r9, r8, r9\n\t"
  138621. "add r6, r6, r9\n\t"
  138622. "lsl r9, r12, #16\n\t"
  138623. "lsr r9, r9, #16\n\t"
  138624. "mul r8, r9, r8\n\t"
  138625. "lsr r9, r8, #16\n\t"
  138626. "lsl r8, r8, #16\n\t"
  138627. "adds r5, r5, r8\n\t"
  138628. "adc r6, r6, r9\n\t"
  138629. #else
  138630. "umull r5, r6, r10, r12\n\t"
  138631. #endif
  138632. "mov r3, #0\n\t"
  138633. "mov r7, #0\n\t"
  138634. /* A[9] * A[14] */
  138635. "ldr r10, [%[a], #56]\n\t"
  138636. "ldr r12, [%[a], #36]\n\t"
  138637. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  138638. "lsl r8, r10, #16\n\t"
  138639. "lsl r9, r12, #16\n\t"
  138640. "lsr r8, r8, #16\n\t"
  138641. "lsr r9, r9, #16\n\t"
  138642. "mul r9, r8, r9\n\t"
  138643. "adds r5, r5, r9\n\t"
  138644. "adcs r6, r6, #0\n\t"
  138645. "adc r7, r7, #0\n\t"
  138646. "lsr r9, r12, #16\n\t"
  138647. "mul r8, r9, r8\n\t"
  138648. "lsr r9, r8, #16\n\t"
  138649. "lsl r8, r8, #16\n\t"
  138650. "adds r5, r5, r8\n\t"
  138651. "adcs r6, r6, r9\n\t"
  138652. "adc r7, r7, #0\n\t"
  138653. "lsr r8, r10, #16\n\t"
  138654. "lsr r9, r12, #16\n\t"
  138655. "mul r9, r8, r9\n\t"
  138656. "adds r6, r6, r9\n\t"
  138657. "adc r7, r7, #0\n\t"
  138658. "lsl r9, r12, #16\n\t"
  138659. "lsr r9, r9, #16\n\t"
  138660. "mul r8, r9, r8\n\t"
  138661. "lsr r9, r8, #16\n\t"
  138662. "lsl r8, r8, #16\n\t"
  138663. "adds r5, r5, r8\n\t"
  138664. "adcs r6, r6, r9\n\t"
  138665. "adc r7, r7, #0\n\t"
  138666. #else
  138667. "umull r8, r9, r10, r12\n\t"
  138668. "adds r5, r5, r8\n\t"
  138669. "adcs r6, r6, r9\n\t"
  138670. "adc r7, r7, #0\n\t"
  138671. #endif
  138672. /* A[10] * A[13] */
  138673. "ldr r10, [%[a], #52]\n\t"
  138674. "ldr r12, [%[a], #40]\n\t"
  138675. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  138676. "lsl r8, r10, #16\n\t"
  138677. "lsl r9, r12, #16\n\t"
  138678. "lsr r8, r8, #16\n\t"
  138679. "lsr r9, r9, #16\n\t"
  138680. "mul r9, r8, r9\n\t"
  138681. "adds r5, r5, r9\n\t"
  138682. "adcs r6, r6, #0\n\t"
  138683. "adc r7, r7, #0\n\t"
  138684. "lsr r9, r12, #16\n\t"
  138685. "mul r8, r9, r8\n\t"
  138686. "lsr r9, r8, #16\n\t"
  138687. "lsl r8, r8, #16\n\t"
  138688. "adds r5, r5, r8\n\t"
  138689. "adcs r6, r6, r9\n\t"
  138690. "adc r7, r7, #0\n\t"
  138691. "lsr r8, r10, #16\n\t"
  138692. "lsr r9, r12, #16\n\t"
  138693. "mul r9, r8, r9\n\t"
  138694. "adds r6, r6, r9\n\t"
  138695. "adc r7, r7, #0\n\t"
  138696. "lsl r9, r12, #16\n\t"
  138697. "lsr r9, r9, #16\n\t"
  138698. "mul r8, r9, r8\n\t"
  138699. "lsr r9, r8, #16\n\t"
  138700. "lsl r8, r8, #16\n\t"
  138701. "adds r5, r5, r8\n\t"
  138702. "adcs r6, r6, r9\n\t"
  138703. "adc r7, r7, #0\n\t"
  138704. #else
  138705. "umull r8, r9, r10, r12\n\t"
  138706. "adds r5, r5, r8\n\t"
  138707. "adcs r6, r6, r9\n\t"
  138708. "adc r7, r7, #0\n\t"
  138709. #endif
  138710. /* A[11] * A[12] */
  138711. "ldr r10, [%[a], #48]\n\t"
  138712. "ldr r12, [%[a], #44]\n\t"
  138713. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  138714. "lsl r8, r10, #16\n\t"
  138715. "lsl r9, r12, #16\n\t"
  138716. "lsr r8, r8, #16\n\t"
  138717. "lsr r9, r9, #16\n\t"
  138718. "mul r9, r8, r9\n\t"
  138719. "adds r5, r5, r9\n\t"
  138720. "adcs r6, r6, #0\n\t"
  138721. "adc r7, r7, #0\n\t"
  138722. "lsr r9, r12, #16\n\t"
  138723. "mul r8, r9, r8\n\t"
  138724. "lsr r9, r8, #16\n\t"
  138725. "lsl r8, r8, #16\n\t"
  138726. "adds r5, r5, r8\n\t"
  138727. "adcs r6, r6, r9\n\t"
  138728. "adc r7, r7, #0\n\t"
  138729. "lsr r8, r10, #16\n\t"
  138730. "lsr r9, r12, #16\n\t"
  138731. "mul r9, r8, r9\n\t"
  138732. "adds r6, r6, r9\n\t"
  138733. "adc r7, r7, #0\n\t"
  138734. "lsl r9, r12, #16\n\t"
  138735. "lsr r9, r9, #16\n\t"
  138736. "mul r8, r9, r8\n\t"
  138737. "lsr r9, r8, #16\n\t"
  138738. "lsl r8, r8, #16\n\t"
  138739. "adds r5, r5, r8\n\t"
  138740. "adcs r6, r6, r9\n\t"
  138741. "adc r7, r7, #0\n\t"
  138742. #else
  138743. "umull r8, r9, r10, r12\n\t"
  138744. "adds r5, r5, r8\n\t"
  138745. "adcs r6, r6, r9\n\t"
  138746. "adc r7, r7, #0\n\t"
  138747. #endif
  138748. "adds r5, r5, r5\n\t"
  138749. "adcs r6, r6, r6\n\t"
  138750. "adc r7, r7, r7\n\t"
  138751. "adds r4, r4, r5\n\t"
  138752. "adcs r2, r2, r6\n\t"
  138753. "adc r3, r3, r7\n\t"
  138754. "str r4, [%[r], #92]\n\t"
  138755. /* A[9] * A[15] */
  138756. "ldr r10, [%[a], #60]\n\t"
  138757. "ldr r12, [%[a], #36]\n\t"
  138758. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  138759. "lsl r8, r10, #16\n\t"
  138760. "lsl r5, r12, #16\n\t"
  138761. "lsr r8, r8, #16\n\t"
  138762. "lsr r5, r5, #16\n\t"
  138763. "mul r5, r8, r5\n\t"
  138764. "lsr r9, r12, #16\n\t"
  138765. "mul r8, r9, r8\n\t"
  138766. "lsr r6, r8, #16\n\t"
  138767. "lsl r8, r8, #16\n\t"
  138768. "adds r5, r5, r8\n\t"
  138769. "adc r6, r6, #0\n\t"
  138770. "lsr r8, r10, #16\n\t"
  138771. "mul r9, r8, r9\n\t"
  138772. "add r6, r6, r9\n\t"
  138773. "lsl r9, r12, #16\n\t"
  138774. "lsr r9, r9, #16\n\t"
  138775. "mul r8, r9, r8\n\t"
  138776. "lsr r9, r8, #16\n\t"
  138777. "lsl r8, r8, #16\n\t"
  138778. "adds r5, r5, r8\n\t"
  138779. "adc r6, r6, r9\n\t"
  138780. #else
  138781. "umull r5, r6, r10, r12\n\t"
  138782. #endif
  138783. "mov r4, #0\n\t"
  138784. "mov r7, #0\n\t"
  138785. /* A[10] * A[14] */
  138786. "ldr r10, [%[a], #56]\n\t"
  138787. "ldr r12, [%[a], #40]\n\t"
  138788. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  138789. "lsl r8, r10, #16\n\t"
  138790. "lsl r9, r12, #16\n\t"
  138791. "lsr r8, r8, #16\n\t"
  138792. "lsr r9, r9, #16\n\t"
  138793. "mul r9, r8, r9\n\t"
  138794. "adds r5, r5, r9\n\t"
  138795. "adcs r6, r6, #0\n\t"
  138796. "adc r7, r7, #0\n\t"
  138797. "lsr r9, r12, #16\n\t"
  138798. "mul r8, r9, r8\n\t"
  138799. "lsr r9, r8, #16\n\t"
  138800. "lsl r8, r8, #16\n\t"
  138801. "adds r5, r5, r8\n\t"
  138802. "adcs r6, r6, r9\n\t"
  138803. "adc r7, r7, #0\n\t"
  138804. "lsr r8, r10, #16\n\t"
  138805. "lsr r9, r12, #16\n\t"
  138806. "mul r9, r8, r9\n\t"
  138807. "adds r6, r6, r9\n\t"
  138808. "adc r7, r7, #0\n\t"
  138809. "lsl r9, r12, #16\n\t"
  138810. "lsr r9, r9, #16\n\t"
  138811. "mul r8, r9, r8\n\t"
  138812. "lsr r9, r8, #16\n\t"
  138813. "lsl r8, r8, #16\n\t"
  138814. "adds r5, r5, r8\n\t"
  138815. "adcs r6, r6, r9\n\t"
  138816. "adc r7, r7, #0\n\t"
  138817. #else
  138818. "umull r8, r9, r10, r12\n\t"
  138819. "adds r5, r5, r8\n\t"
  138820. "adcs r6, r6, r9\n\t"
  138821. "adc r7, r7, #0\n\t"
  138822. #endif
  138823. /* A[11] * A[13] */
  138824. "ldr r10, [%[a], #52]\n\t"
  138825. "ldr r12, [%[a], #44]\n\t"
  138826. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  138827. "lsl r8, r10, #16\n\t"
  138828. "lsl r9, r12, #16\n\t"
  138829. "lsr r8, r8, #16\n\t"
  138830. "lsr r9, r9, #16\n\t"
  138831. "mul r9, r8, r9\n\t"
  138832. "adds r5, r5, r9\n\t"
  138833. "adcs r6, r6, #0\n\t"
  138834. "adc r7, r7, #0\n\t"
  138835. "lsr r9, r12, #16\n\t"
  138836. "mul r8, r9, r8\n\t"
  138837. "lsr r9, r8, #16\n\t"
  138838. "lsl r8, r8, #16\n\t"
  138839. "adds r5, r5, r8\n\t"
  138840. "adcs r6, r6, r9\n\t"
  138841. "adc r7, r7, #0\n\t"
  138842. "lsr r8, r10, #16\n\t"
  138843. "lsr r9, r12, #16\n\t"
  138844. "mul r9, r8, r9\n\t"
  138845. "adds r6, r6, r9\n\t"
  138846. "adc r7, r7, #0\n\t"
  138847. "lsl r9, r12, #16\n\t"
  138848. "lsr r9, r9, #16\n\t"
  138849. "mul r8, r9, r8\n\t"
  138850. "lsr r9, r8, #16\n\t"
  138851. "lsl r8, r8, #16\n\t"
  138852. "adds r5, r5, r8\n\t"
  138853. "adcs r6, r6, r9\n\t"
  138854. "adc r7, r7, #0\n\t"
  138855. #else
  138856. "umull r8, r9, r10, r12\n\t"
  138857. "adds r5, r5, r8\n\t"
  138858. "adcs r6, r6, r9\n\t"
  138859. "adc r7, r7, #0\n\t"
  138860. #endif
  138861. /* A[12] * A[12] */
  138862. "ldr r10, [%[a], #48]\n\t"
  138863. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  138864. "lsl r8, r10, #16\n\t"
  138865. "lsr r9, r10, #16\n\t"
  138866. "lsr r8, r8, #16\n\t"
  138867. "mov r12, r8\n\t"
  138868. "mul r8, r12, r8\n\t"
  138869. "mov r12, r9\n\t"
  138870. "mul r9, r12, r9\n\t"
  138871. "adds r2, r2, r8\n\t"
  138872. "adcs r3, r3, r9\n\t"
  138873. "adc r4, r4, #0\n\t"
  138874. "lsr r9, r10, #16\n\t"
  138875. "lsl r8, r10, #16\n\t"
  138876. "lsr r8, r8, #16\n\t"
  138877. "mul r8, r9, r8\n\t"
  138878. "lsr r9, r8, #15\n\t"
  138879. "lsl r8, r8, #17\n\t"
  138880. "adds r2, r2, r8\n\t"
  138881. "adcs r3, r3, r9\n\t"
  138882. "adc r4, r4, #0\n\t"
  138883. "adds r5, r5, r5\n\t"
  138884. "adcs r6, r6, r6\n\t"
  138885. "adc r7, r7, r7\n\t"
  138886. #else
  138887. "umull r8, r9, r10, r10\n\t"
  138888. "adds r5, r5, r5\n\t"
  138889. "adcs r6, r6, r6\n\t"
  138890. "adc r7, r7, r7\n\t"
  138891. "adds r2, r2, r8\n\t"
  138892. "adcs r3, r3, r9\n\t"
  138893. "adc r4, r4, #0\n\t"
  138894. #endif
  138895. "adds r2, r2, r5\n\t"
  138896. "adcs r3, r3, r6\n\t"
  138897. "adc r4, r4, r7\n\t"
  138898. "str r2, [%[r], #96]\n\t"
  138899. /* A[10] * A[15] */
  138900. "ldr r10, [%[a], #60]\n\t"
  138901. "ldr r12, [%[a], #40]\n\t"
  138902. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  138903. "lsl r8, r10, #16\n\t"
  138904. "lsl r5, r12, #16\n\t"
  138905. "lsr r8, r8, #16\n\t"
  138906. "lsr r5, r5, #16\n\t"
  138907. "mul r5, r8, r5\n\t"
  138908. "lsr r9, r12, #16\n\t"
  138909. "mul r8, r9, r8\n\t"
  138910. "lsr r6, r8, #16\n\t"
  138911. "lsl r8, r8, #16\n\t"
  138912. "adds r5, r5, r8\n\t"
  138913. "adc r6, r6, #0\n\t"
  138914. "lsr r8, r10, #16\n\t"
  138915. "mul r9, r8, r9\n\t"
  138916. "add r6, r6, r9\n\t"
  138917. "lsl r9, r12, #16\n\t"
  138918. "lsr r9, r9, #16\n\t"
  138919. "mul r8, r9, r8\n\t"
  138920. "lsr r9, r8, #16\n\t"
  138921. "lsl r8, r8, #16\n\t"
  138922. "adds r5, r5, r8\n\t"
  138923. "adc r6, r6, r9\n\t"
  138924. #else
  138925. "umull r5, r6, r10, r12\n\t"
  138926. #endif
  138927. "mov r2, #0\n\t"
  138928. "mov r7, #0\n\t"
  138929. /* A[11] * A[14] */
  138930. "ldr r10, [%[a], #56]\n\t"
  138931. "ldr r12, [%[a], #44]\n\t"
  138932. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  138933. "lsl r8, r10, #16\n\t"
  138934. "lsl r9, r12, #16\n\t"
  138935. "lsr r8, r8, #16\n\t"
  138936. "lsr r9, r9, #16\n\t"
  138937. "mul r9, r8, r9\n\t"
  138938. "adds r5, r5, r9\n\t"
  138939. "adcs r6, r6, #0\n\t"
  138940. "adc r7, r7, #0\n\t"
  138941. "lsr r9, r12, #16\n\t"
  138942. "mul r8, r9, r8\n\t"
  138943. "lsr r9, r8, #16\n\t"
  138944. "lsl r8, r8, #16\n\t"
  138945. "adds r5, r5, r8\n\t"
  138946. "adcs r6, r6, r9\n\t"
  138947. "adc r7, r7, #0\n\t"
  138948. "lsr r8, r10, #16\n\t"
  138949. "lsr r9, r12, #16\n\t"
  138950. "mul r9, r8, r9\n\t"
  138951. "adds r6, r6, r9\n\t"
  138952. "adc r7, r7, #0\n\t"
  138953. "lsl r9, r12, #16\n\t"
  138954. "lsr r9, r9, #16\n\t"
  138955. "mul r8, r9, r8\n\t"
  138956. "lsr r9, r8, #16\n\t"
  138957. "lsl r8, r8, #16\n\t"
  138958. "adds r5, r5, r8\n\t"
  138959. "adcs r6, r6, r9\n\t"
  138960. "adc r7, r7, #0\n\t"
  138961. #else
  138962. "umull r8, r9, r10, r12\n\t"
  138963. "adds r5, r5, r8\n\t"
  138964. "adcs r6, r6, r9\n\t"
  138965. "adc r7, r7, #0\n\t"
  138966. #endif
  138967. /* A[12] * A[13] */
  138968. "ldr r10, [%[a], #52]\n\t"
  138969. "ldr r12, [%[a], #48]\n\t"
  138970. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  138971. "lsl r8, r10, #16\n\t"
  138972. "lsl r9, r12, #16\n\t"
  138973. "lsr r8, r8, #16\n\t"
  138974. "lsr r9, r9, #16\n\t"
  138975. "mul r9, r8, r9\n\t"
  138976. "adds r5, r5, r9\n\t"
  138977. "adcs r6, r6, #0\n\t"
  138978. "adc r7, r7, #0\n\t"
  138979. "lsr r9, r12, #16\n\t"
  138980. "mul r8, r9, r8\n\t"
  138981. "lsr r9, r8, #16\n\t"
  138982. "lsl r8, r8, #16\n\t"
  138983. "adds r5, r5, r8\n\t"
  138984. "adcs r6, r6, r9\n\t"
  138985. "adc r7, r7, #0\n\t"
  138986. "lsr r8, r10, #16\n\t"
  138987. "lsr r9, r12, #16\n\t"
  138988. "mul r9, r8, r9\n\t"
  138989. "adds r6, r6, r9\n\t"
  138990. "adc r7, r7, #0\n\t"
  138991. "lsl r9, r12, #16\n\t"
  138992. "lsr r9, r9, #16\n\t"
  138993. "mul r8, r9, r8\n\t"
  138994. "lsr r9, r8, #16\n\t"
  138995. "lsl r8, r8, #16\n\t"
  138996. "adds r5, r5, r8\n\t"
  138997. "adcs r6, r6, r9\n\t"
  138998. "adc r7, r7, #0\n\t"
  138999. #else
  139000. "umull r8, r9, r10, r12\n\t"
  139001. "adds r5, r5, r8\n\t"
  139002. "adcs r6, r6, r9\n\t"
  139003. "adc r7, r7, #0\n\t"
  139004. #endif
  139005. "adds r5, r5, r5\n\t"
  139006. "adcs r6, r6, r6\n\t"
  139007. "adc r7, r7, r7\n\t"
  139008. "adds r3, r3, r5\n\t"
  139009. "adcs r4, r4, r6\n\t"
  139010. "adc r2, r2, r7\n\t"
  139011. "str r3, [%[r], #100]\n\t"
  139012. /* A[11] * A[15] */
  139013. "ldr r10, [%[a], #60]\n\t"
  139014. "ldr r12, [%[a], #44]\n\t"
  139015. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  139016. "lsl r8, r10, #16\n\t"
  139017. "lsl r9, r12, #16\n\t"
  139018. "lsr r8, r8, #16\n\t"
  139019. "lsr r9, r9, #16\n\t"
  139020. "mul r9, r8, r9\n\t"
  139021. "adds r4, r4, r9\n\t"
  139022. "adcs r2, r2, #0\n\t"
  139023. "mov r3, #0\n\t"
  139024. "adc r3, r3, #0\n\t"
  139025. "adds r4, r4, r9\n\t"
  139026. "adcs r2, r2, #0\n\t"
  139027. "adc r3, r3, #0\n\t"
  139028. "lsr r9, r12, #16\n\t"
  139029. "mul r8, r9, r8\n\t"
  139030. "lsr r9, r8, #16\n\t"
  139031. "lsl r8, r8, #16\n\t"
  139032. "adds r4, r4, r8\n\t"
  139033. "adcs r2, r2, r9\n\t"
  139034. "adc r3, r3, #0\n\t"
  139035. "adds r4, r4, r8\n\t"
  139036. "adcs r2, r2, r9\n\t"
  139037. "adc r3, r3, #0\n\t"
  139038. "lsr r8, r10, #16\n\t"
  139039. "lsr r9, r12, #16\n\t"
  139040. "mul r9, r8, r9\n\t"
  139041. "adds r2, r2, r9\n\t"
  139042. "adc r3, r3, #0\n\t"
  139043. "adds r2, r2, r9\n\t"
  139044. "adc r3, r3, #0\n\t"
  139045. "lsl r9, r12, #16\n\t"
  139046. "lsr r9, r9, #16\n\t"
  139047. "mul r8, r9, r8\n\t"
  139048. "lsr r9, r8, #16\n\t"
  139049. "lsl r8, r8, #16\n\t"
  139050. "adds r4, r4, r8\n\t"
  139051. "adcs r2, r2, r9\n\t"
  139052. "adc r3, r3, #0\n\t"
  139053. "adds r4, r4, r8\n\t"
  139054. "adcs r2, r2, r9\n\t"
  139055. "adc r3, r3, #0\n\t"
  139056. #else
  139057. "umull r8, r9, r10, r12\n\t"
  139058. "adds r4, r4, r8\n\t"
  139059. "adcs r2, r2, r9\n\t"
  139060. "mov r3, #0\n\t"
  139061. "adc r3, r3, #0\n\t"
  139062. "adds r4, r4, r8\n\t"
  139063. "adcs r2, r2, r9\n\t"
  139064. "mov r3, #0\n\t"
  139065. "adc r3, r3, #0\n\t"
  139066. #endif
  139067. /* A[12] * A[14] */
  139068. "ldr r10, [%[a], #56]\n\t"
  139069. "ldr r12, [%[a], #48]\n\t"
  139070. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  139071. "lsl r8, r10, #16\n\t"
  139072. "lsl r9, r12, #16\n\t"
  139073. "lsr r8, r8, #16\n\t"
  139074. "lsr r9, r9, #16\n\t"
  139075. "mul r9, r8, r9\n\t"
  139076. "adds r4, r4, r9\n\t"
  139077. "adcs r2, r2, #0\n\t"
  139078. "adc r3, r3, #0\n\t"
  139079. "adds r4, r4, r9\n\t"
  139080. "adcs r2, r2, #0\n\t"
  139081. "adc r3, r3, #0\n\t"
  139082. "lsr r9, r12, #16\n\t"
  139083. "mul r8, r9, r8\n\t"
  139084. "lsr r9, r8, #16\n\t"
  139085. "lsl r8, r8, #16\n\t"
  139086. "adds r4, r4, r8\n\t"
  139087. "adcs r2, r2, r9\n\t"
  139088. "adc r3, r3, #0\n\t"
  139089. "adds r4, r4, r8\n\t"
  139090. "adcs r2, r2, r9\n\t"
  139091. "adc r3, r3, #0\n\t"
  139092. "lsr r8, r10, #16\n\t"
  139093. "lsr r9, r12, #16\n\t"
  139094. "mul r9, r8, r9\n\t"
  139095. "adds r2, r2, r9\n\t"
  139096. "adc r3, r3, #0\n\t"
  139097. "adds r2, r2, r9\n\t"
  139098. "adc r3, r3, #0\n\t"
  139099. "lsl r9, r12, #16\n\t"
  139100. "lsr r9, r9, #16\n\t"
  139101. "mul r8, r9, r8\n\t"
  139102. "lsr r9, r8, #16\n\t"
  139103. "lsl r8, r8, #16\n\t"
  139104. "adds r4, r4, r8\n\t"
  139105. "adcs r2, r2, r9\n\t"
  139106. "adc r3, r3, #0\n\t"
  139107. "adds r4, r4, r8\n\t"
  139108. "adcs r2, r2, r9\n\t"
  139109. "adc r3, r3, #0\n\t"
  139110. #else
  139111. "umull r8, r9, r10, r12\n\t"
  139112. "adds r4, r4, r8\n\t"
  139113. "adcs r2, r2, r9\n\t"
  139114. "adc r3, r3, #0\n\t"
  139115. "adds r4, r4, r8\n\t"
  139116. "adcs r2, r2, r9\n\t"
  139117. "adc r3, r3, #0\n\t"
  139118. #endif
  139119. /* A[13] * A[13] */
  139120. "ldr r10, [%[a], #52]\n\t"
  139121. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  139122. "lsl r8, r10, #16\n\t"
  139123. "lsr r9, r10, #16\n\t"
  139124. "lsr r8, r8, #16\n\t"
  139125. "mov r12, r8\n\t"
  139126. "mul r8, r12, r8\n\t"
  139127. "mov r12, r9\n\t"
  139128. "mul r9, r12, r9\n\t"
  139129. "adds r4, r4, r8\n\t"
  139130. "adcs r2, r2, r9\n\t"
  139131. "adc r3, r3, #0\n\t"
  139132. "lsr r9, r10, #16\n\t"
  139133. "lsl r8, r10, #16\n\t"
  139134. "lsr r8, r8, #16\n\t"
  139135. "mul r8, r9, r8\n\t"
  139136. "lsr r9, r8, #15\n\t"
  139137. "lsl r8, r8, #17\n\t"
  139138. "adds r4, r4, r8\n\t"
  139139. "adcs r2, r2, r9\n\t"
  139140. "adc r3, r3, #0\n\t"
  139141. #else
  139142. "umull r8, r9, r10, r10\n\t"
  139143. "adds r4, r4, r8\n\t"
  139144. "adcs r2, r2, r9\n\t"
  139145. "adc r3, r3, #0\n\t"
  139146. #endif
  139147. "str r4, [%[r], #104]\n\t"
  139148. /* A[12] * A[15] */
  139149. "ldr r10, [%[a], #60]\n\t"
  139150. "ldr r12, [%[a], #48]\n\t"
  139151. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  139152. "lsl r8, r10, #16\n\t"
  139153. "lsl r9, r12, #16\n\t"
  139154. "lsr r8, r8, #16\n\t"
  139155. "lsr r9, r9, #16\n\t"
  139156. "mul r9, r8, r9\n\t"
  139157. "adds r2, r2, r9\n\t"
  139158. "adcs r3, r3, #0\n\t"
  139159. "mov r4, #0\n\t"
  139160. "adc r4, r4, #0\n\t"
  139161. "adds r2, r2, r9\n\t"
  139162. "adcs r3, r3, #0\n\t"
  139163. "adc r4, r4, #0\n\t"
  139164. "lsr r9, r12, #16\n\t"
  139165. "mul r8, r9, r8\n\t"
  139166. "lsr r9, r8, #16\n\t"
  139167. "lsl r8, r8, #16\n\t"
  139168. "adds r2, r2, r8\n\t"
  139169. "adcs r3, r3, r9\n\t"
  139170. "adc r4, r4, #0\n\t"
  139171. "adds r2, r2, r8\n\t"
  139172. "adcs r3, r3, r9\n\t"
  139173. "adc r4, r4, #0\n\t"
  139174. "lsr r8, r10, #16\n\t"
  139175. "lsr r9, r12, #16\n\t"
  139176. "mul r9, r8, r9\n\t"
  139177. "adds r3, r3, r9\n\t"
  139178. "adc r4, r4, #0\n\t"
  139179. "adds r3, r3, r9\n\t"
  139180. "adc r4, r4, #0\n\t"
  139181. "lsl r9, r12, #16\n\t"
  139182. "lsr r9, r9, #16\n\t"
  139183. "mul r8, r9, r8\n\t"
  139184. "lsr r9, r8, #16\n\t"
  139185. "lsl r8, r8, #16\n\t"
  139186. "adds r2, r2, r8\n\t"
  139187. "adcs r3, r3, r9\n\t"
  139188. "adc r4, r4, #0\n\t"
  139189. "adds r2, r2, r8\n\t"
  139190. "adcs r3, r3, r9\n\t"
  139191. "adc r4, r4, #0\n\t"
  139192. #else
  139193. "umull r8, r9, r10, r12\n\t"
  139194. "adds r2, r2, r8\n\t"
  139195. "adcs r3, r3, r9\n\t"
  139196. "mov r4, #0\n\t"
  139197. "adc r4, r4, #0\n\t"
  139198. "adds r2, r2, r8\n\t"
  139199. "adcs r3, r3, r9\n\t"
  139200. "mov r4, #0\n\t"
  139201. "adc r4, r4, #0\n\t"
  139202. #endif
  139203. /* A[13] * A[14] */
  139204. "ldr r10, [%[a], #56]\n\t"
  139205. "ldr r12, [%[a], #52]\n\t"
  139206. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  139207. "lsl r8, r10, #16\n\t"
  139208. "lsl r9, r12, #16\n\t"
  139209. "lsr r8, r8, #16\n\t"
  139210. "lsr r9, r9, #16\n\t"
  139211. "mul r9, r8, r9\n\t"
  139212. "adds r2, r2, r9\n\t"
  139213. "adcs r3, r3, #0\n\t"
  139214. "adc r4, r4, #0\n\t"
  139215. "adds r2, r2, r9\n\t"
  139216. "adcs r3, r3, #0\n\t"
  139217. "adc r4, r4, #0\n\t"
  139218. "lsr r9, r12, #16\n\t"
  139219. "mul r8, r9, r8\n\t"
  139220. "lsr r9, r8, #16\n\t"
  139221. "lsl r8, r8, #16\n\t"
  139222. "adds r2, r2, r8\n\t"
  139223. "adcs r3, r3, r9\n\t"
  139224. "adc r4, r4, #0\n\t"
  139225. "adds r2, r2, r8\n\t"
  139226. "adcs r3, r3, r9\n\t"
  139227. "adc r4, r4, #0\n\t"
  139228. "lsr r8, r10, #16\n\t"
  139229. "lsr r9, r12, #16\n\t"
  139230. "mul r9, r8, r9\n\t"
  139231. "adds r3, r3, r9\n\t"
  139232. "adc r4, r4, #0\n\t"
  139233. "adds r3, r3, r9\n\t"
  139234. "adc r4, r4, #0\n\t"
  139235. "lsl r9, r12, #16\n\t"
  139236. "lsr r9, r9, #16\n\t"
  139237. "mul r8, r9, r8\n\t"
  139238. "lsr r9, r8, #16\n\t"
  139239. "lsl r8, r8, #16\n\t"
  139240. "adds r2, r2, r8\n\t"
  139241. "adcs r3, r3, r9\n\t"
  139242. "adc r4, r4, #0\n\t"
  139243. "adds r2, r2, r8\n\t"
  139244. "adcs r3, r3, r9\n\t"
  139245. "adc r4, r4, #0\n\t"
  139246. #else
  139247. "umull r8, r9, r10, r12\n\t"
  139248. "adds r2, r2, r8\n\t"
  139249. "adcs r3, r3, r9\n\t"
  139250. "adc r4, r4, #0\n\t"
  139251. "adds r2, r2, r8\n\t"
  139252. "adcs r3, r3, r9\n\t"
  139253. "adc r4, r4, #0\n\t"
  139254. #endif
  139255. "str r2, [%[r], #108]\n\t"
  139256. /* A[13] * A[15] */
  139257. "ldr r10, [%[a], #60]\n\t"
  139258. "ldr r12, [%[a], #52]\n\t"
  139259. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  139260. "lsl r8, r10, #16\n\t"
  139261. "lsl r9, r12, #16\n\t"
  139262. "lsr r8, r8, #16\n\t"
  139263. "lsr r9, r9, #16\n\t"
  139264. "mul r9, r8, r9\n\t"
  139265. "adds r3, r3, r9\n\t"
  139266. "adcs r4, r4, #0\n\t"
  139267. "mov r2, #0\n\t"
  139268. "adc r2, r2, #0\n\t"
  139269. "adds r3, r3, r9\n\t"
  139270. "adcs r4, r4, #0\n\t"
  139271. "adc r2, r2, #0\n\t"
  139272. "lsr r9, r12, #16\n\t"
  139273. "mul r8, r9, r8\n\t"
  139274. "lsr r9, r8, #16\n\t"
  139275. "lsl r8, r8, #16\n\t"
  139276. "adds r3, r3, r8\n\t"
  139277. "adcs r4, r4, r9\n\t"
  139278. "adc r2, r2, #0\n\t"
  139279. "adds r3, r3, r8\n\t"
  139280. "adcs r4, r4, r9\n\t"
  139281. "adc r2, r2, #0\n\t"
  139282. "lsr r8, r10, #16\n\t"
  139283. "lsr r9, r12, #16\n\t"
  139284. "mul r9, r8, r9\n\t"
  139285. "adds r4, r4, r9\n\t"
  139286. "adc r2, r2, #0\n\t"
  139287. "adds r4, r4, r9\n\t"
  139288. "adc r2, r2, #0\n\t"
  139289. "lsl r9, r12, #16\n\t"
  139290. "lsr r9, r9, #16\n\t"
  139291. "mul r8, r9, r8\n\t"
  139292. "lsr r9, r8, #16\n\t"
  139293. "lsl r8, r8, #16\n\t"
  139294. "adds r3, r3, r8\n\t"
  139295. "adcs r4, r4, r9\n\t"
  139296. "adc r2, r2, #0\n\t"
  139297. "adds r3, r3, r8\n\t"
  139298. "adcs r4, r4, r9\n\t"
  139299. "adc r2, r2, #0\n\t"
  139300. #else
  139301. "umull r8, r9, r10, r12\n\t"
  139302. "adds r3, r3, r8\n\t"
  139303. "adcs r4, r4, r9\n\t"
  139304. "mov r2, #0\n\t"
  139305. "adc r2, r2, #0\n\t"
  139306. "adds r3, r3, r8\n\t"
  139307. "adcs r4, r4, r9\n\t"
  139308. "mov r2, #0\n\t"
  139309. "adc r2, r2, #0\n\t"
  139310. #endif
  139311. /* A[14] * A[14] */
  139312. "ldr r10, [%[a], #56]\n\t"
  139313. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  139314. "lsl r8, r10, #16\n\t"
  139315. "lsr r9, r10, #16\n\t"
  139316. "lsr r8, r8, #16\n\t"
  139317. "mov r12, r8\n\t"
  139318. "mul r8, r12, r8\n\t"
  139319. "mov r12, r9\n\t"
  139320. "mul r9, r12, r9\n\t"
  139321. "adds r3, r3, r8\n\t"
  139322. "adcs r4, r4, r9\n\t"
  139323. "adc r2, r2, #0\n\t"
  139324. "lsr r9, r10, #16\n\t"
  139325. "lsl r8, r10, #16\n\t"
  139326. "lsr r8, r8, #16\n\t"
  139327. "mul r8, r9, r8\n\t"
  139328. "lsr r9, r8, #15\n\t"
  139329. "lsl r8, r8, #17\n\t"
  139330. "adds r3, r3, r8\n\t"
  139331. "adcs r4, r4, r9\n\t"
  139332. "adc r2, r2, #0\n\t"
  139333. #else
  139334. "umull r8, r9, r10, r10\n\t"
  139335. "adds r3, r3, r8\n\t"
  139336. "adcs r4, r4, r9\n\t"
  139337. "adc r2, r2, #0\n\t"
  139338. #endif
  139339. "str r3, [%[r], #112]\n\t"
  139340. /* A[14] * A[15] */
  139341. "ldr r10, [%[a], #60]\n\t"
  139342. "ldr r12, [%[a], #56]\n\t"
  139343. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  139344. "lsl r8, r10, #16\n\t"
  139345. "lsl r9, r12, #16\n\t"
  139346. "lsr r8, r8, #16\n\t"
  139347. "lsr r9, r9, #16\n\t"
  139348. "mul r9, r8, r9\n\t"
  139349. "adds r4, r4, r9\n\t"
  139350. "adcs r2, r2, #0\n\t"
  139351. "mov r3, #0\n\t"
  139352. "adc r3, r3, #0\n\t"
  139353. "adds r4, r4, r9\n\t"
  139354. "adcs r2, r2, #0\n\t"
  139355. "adc r3, r3, #0\n\t"
  139356. "lsr r9, r12, #16\n\t"
  139357. "mul r8, r9, r8\n\t"
  139358. "lsr r9, r8, #16\n\t"
  139359. "lsl r8, r8, #16\n\t"
  139360. "adds r4, r4, r8\n\t"
  139361. "adcs r2, r2, r9\n\t"
  139362. "adc r3, r3, #0\n\t"
  139363. "adds r4, r4, r8\n\t"
  139364. "adcs r2, r2, r9\n\t"
  139365. "adc r3, r3, #0\n\t"
  139366. "lsr r8, r10, #16\n\t"
  139367. "lsr r9, r12, #16\n\t"
  139368. "mul r9, r8, r9\n\t"
  139369. "adds r2, r2, r9\n\t"
  139370. "adc r3, r3, #0\n\t"
  139371. "adds r2, r2, r9\n\t"
  139372. "adc r3, r3, #0\n\t"
  139373. "lsl r9, r12, #16\n\t"
  139374. "lsr r9, r9, #16\n\t"
  139375. "mul r8, r9, r8\n\t"
  139376. "lsr r9, r8, #16\n\t"
  139377. "lsl r8, r8, #16\n\t"
  139378. "adds r4, r4, r8\n\t"
  139379. "adcs r2, r2, r9\n\t"
  139380. "adc r3, r3, #0\n\t"
  139381. "adds r4, r4, r8\n\t"
  139382. "adcs r2, r2, r9\n\t"
  139383. "adc r3, r3, #0\n\t"
  139384. #else
  139385. "umull r8, r9, r10, r12\n\t"
  139386. "adds r4, r4, r8\n\t"
  139387. "adcs r2, r2, r9\n\t"
  139388. "mov r3, #0\n\t"
  139389. "adc r3, r3, #0\n\t"
  139390. "adds r4, r4, r8\n\t"
  139391. "adcs r2, r2, r9\n\t"
  139392. "mov r3, #0\n\t"
  139393. "adc r3, r3, #0\n\t"
  139394. #endif
  139395. "str r4, [%[r], #116]\n\t"
  139396. /* A[15] * A[15] */
  139397. "ldr r10, [%[a], #60]\n\t"
  139398. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  139399. "lsl r8, r10, #16\n\t"
  139400. "lsr r9, r10, #16\n\t"
  139401. "lsr r8, r8, #16\n\t"
  139402. "mov r12, r8\n\t"
  139403. "mul r8, r12, r8\n\t"
  139404. "mov r12, r9\n\t"
  139405. "mul r9, r12, r9\n\t"
  139406. "adds r2, r2, r8\n\t"
  139407. "adc r3, r3, r9\n\t"
  139408. "lsr r9, r10, #16\n\t"
  139409. "lsl r8, r10, #16\n\t"
  139410. "lsr r8, r8, #16\n\t"
  139411. "mul r8, r9, r8\n\t"
  139412. "lsr r9, r8, #15\n\t"
  139413. "lsl r8, r8, #17\n\t"
  139414. "adds r2, r2, r8\n\t"
  139415. "adc r3, r3, r9\n\t"
  139416. #else
  139417. "umull r8, r9, r10, r10\n\t"
  139418. "adds r2, r2, r8\n\t"
  139419. "adc r3, r3, r9\n\t"
  139420. #endif
  139421. "str r2, [%[r], #120]\n\t"
  139422. "str r3, [%[r], #124]\n\t"
  139423. "ldm sp!, {r2, r3, r4, r8}\n\t"
  139424. "stm %[r]!, {r2, r3, r4, r8}\n\t"
  139425. "ldm sp!, {r2, r3, r4, r8}\n\t"
  139426. "stm %[r]!, {r2, r3, r4, r8}\n\t"
  139427. "ldm sp!, {r2, r3, r4, r8}\n\t"
  139428. "stm %[r]!, {r2, r3, r4, r8}\n\t"
  139429. "ldm sp!, {r2, r3, r4, r8}\n\t"
  139430. "stm %[r]!, {r2, r3, r4, r8}\n\t"
  139431. : [r] "+r" (r), [a] "+r" (a)
  139432. :
  139433. : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r12", "cc"
  139434. );
  139435. }
  139436. /* Add b to a into r. (r = a + b)
  139437. *
  139438. * r A single precision integer.
  139439. * a A single precision integer.
  139440. * b A single precision integer.
  139441. */
  139442. static sp_digit sp_1024_add_16(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p)
  139443. {
  139444. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  139445. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  139446. register const sp_digit* b asm ("r2") = (const sp_digit*)b_p;
  139447. __asm__ __volatile__ (
  139448. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  139449. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  139450. "adds r3, r3, r7\n\t"
  139451. "adcs r4, r4, r8\n\t"
  139452. "adcs r5, r5, r9\n\t"
  139453. "adcs r6, r6, r10\n\t"
  139454. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  139455. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  139456. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  139457. "adcs r3, r3, r7\n\t"
  139458. "adcs r4, r4, r8\n\t"
  139459. "adcs r5, r5, r9\n\t"
  139460. "adcs r6, r6, r10\n\t"
  139461. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  139462. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  139463. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  139464. "adcs r3, r3, r7\n\t"
  139465. "adcs r4, r4, r8\n\t"
  139466. "adcs r5, r5, r9\n\t"
  139467. "adcs r6, r6, r10\n\t"
  139468. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  139469. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  139470. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  139471. "adcs r3, r3, r7\n\t"
  139472. "adcs r4, r4, r8\n\t"
  139473. "adcs r5, r5, r9\n\t"
  139474. "adcs r6, r6, r10\n\t"
  139475. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  139476. "mov %[r], #0\n\t"
  139477. "adc %[r], %[r], #0\n\t"
  139478. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  139479. :
  139480. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "cc"
  139481. );
  139482. return (uint32_t)(size_t)r;
  139483. }
  139484. /* Sub b from a into a. (a -= b)
  139485. *
  139486. * a A single precision integer and result.
  139487. * b A single precision integer.
  139488. */
  139489. static sp_digit sp_1024_sub_in_place_32(sp_digit* a_p, const sp_digit* b_p)
  139490. {
  139491. register sp_digit* a asm ("r0") = (sp_digit*)a_p;
  139492. register const sp_digit* b asm ("r1") = (const sp_digit*)b_p;
  139493. __asm__ __volatile__ (
  139494. "ldm %[a], {r2, r3, r4, r5}\n\t"
  139495. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  139496. "subs r2, r2, r6\n\t"
  139497. "sbcs r3, r3, r7\n\t"
  139498. "sbcs r4, r4, r8\n\t"
  139499. "sbcs r5, r5, r9\n\t"
  139500. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  139501. "ldm %[a], {r2, r3, r4, r5}\n\t"
  139502. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  139503. "sbcs r2, r2, r6\n\t"
  139504. "sbcs r3, r3, r7\n\t"
  139505. "sbcs r4, r4, r8\n\t"
  139506. "sbcs r5, r5, r9\n\t"
  139507. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  139508. "ldm %[a], {r2, r3, r4, r5}\n\t"
  139509. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  139510. "sbcs r2, r2, r6\n\t"
  139511. "sbcs r3, r3, r7\n\t"
  139512. "sbcs r4, r4, r8\n\t"
  139513. "sbcs r5, r5, r9\n\t"
  139514. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  139515. "ldm %[a], {r2, r3, r4, r5}\n\t"
  139516. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  139517. "sbcs r2, r2, r6\n\t"
  139518. "sbcs r3, r3, r7\n\t"
  139519. "sbcs r4, r4, r8\n\t"
  139520. "sbcs r5, r5, r9\n\t"
  139521. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  139522. "ldm %[a], {r2, r3, r4, r5}\n\t"
  139523. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  139524. "sbcs r2, r2, r6\n\t"
  139525. "sbcs r3, r3, r7\n\t"
  139526. "sbcs r4, r4, r8\n\t"
  139527. "sbcs r5, r5, r9\n\t"
  139528. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  139529. "ldm %[a], {r2, r3, r4, r5}\n\t"
  139530. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  139531. "sbcs r2, r2, r6\n\t"
  139532. "sbcs r3, r3, r7\n\t"
  139533. "sbcs r4, r4, r8\n\t"
  139534. "sbcs r5, r5, r9\n\t"
  139535. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  139536. "ldm %[a], {r2, r3, r4, r5}\n\t"
  139537. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  139538. "sbcs r2, r2, r6\n\t"
  139539. "sbcs r3, r3, r7\n\t"
  139540. "sbcs r4, r4, r8\n\t"
  139541. "sbcs r5, r5, r9\n\t"
  139542. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  139543. "ldm %[a], {r2, r3, r4, r5}\n\t"
  139544. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  139545. "sbcs r2, r2, r6\n\t"
  139546. "sbcs r3, r3, r7\n\t"
  139547. "sbcs r4, r4, r8\n\t"
  139548. "sbcs r5, r5, r9\n\t"
  139549. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  139550. "sbc %[a], r9, r9\n\t"
  139551. : [a] "+r" (a), [b] "+r" (b)
  139552. :
  139553. : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "cc"
  139554. );
  139555. return (uint32_t)(size_t)a;
  139556. }
  139557. /* Add b to a into r. (r = a + b)
  139558. *
  139559. * r A single precision integer.
  139560. * a A single precision integer.
  139561. * b A single precision integer.
  139562. */
  139563. static sp_digit sp_1024_add_32(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p)
  139564. {
  139565. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  139566. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  139567. register const sp_digit* b asm ("r2") = (const sp_digit*)b_p;
  139568. __asm__ __volatile__ (
  139569. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  139570. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  139571. "adds r3, r3, r7\n\t"
  139572. "adcs r4, r4, r8\n\t"
  139573. "adcs r5, r5, r9\n\t"
  139574. "adcs r6, r6, r10\n\t"
  139575. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  139576. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  139577. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  139578. "adcs r3, r3, r7\n\t"
  139579. "adcs r4, r4, r8\n\t"
  139580. "adcs r5, r5, r9\n\t"
  139581. "adcs r6, r6, r10\n\t"
  139582. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  139583. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  139584. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  139585. "adcs r3, r3, r7\n\t"
  139586. "adcs r4, r4, r8\n\t"
  139587. "adcs r5, r5, r9\n\t"
  139588. "adcs r6, r6, r10\n\t"
  139589. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  139590. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  139591. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  139592. "adcs r3, r3, r7\n\t"
  139593. "adcs r4, r4, r8\n\t"
  139594. "adcs r5, r5, r9\n\t"
  139595. "adcs r6, r6, r10\n\t"
  139596. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  139597. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  139598. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  139599. "adcs r3, r3, r7\n\t"
  139600. "adcs r4, r4, r8\n\t"
  139601. "adcs r5, r5, r9\n\t"
  139602. "adcs r6, r6, r10\n\t"
  139603. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  139604. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  139605. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  139606. "adcs r3, r3, r7\n\t"
  139607. "adcs r4, r4, r8\n\t"
  139608. "adcs r5, r5, r9\n\t"
  139609. "adcs r6, r6, r10\n\t"
  139610. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  139611. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  139612. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  139613. "adcs r3, r3, r7\n\t"
  139614. "adcs r4, r4, r8\n\t"
  139615. "adcs r5, r5, r9\n\t"
  139616. "adcs r6, r6, r10\n\t"
  139617. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  139618. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  139619. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  139620. "adcs r3, r3, r7\n\t"
  139621. "adcs r4, r4, r8\n\t"
  139622. "adcs r5, r5, r9\n\t"
  139623. "adcs r6, r6, r10\n\t"
  139624. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  139625. "mov %[r], #0\n\t"
  139626. "adc %[r], %[r], #0\n\t"
  139627. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  139628. :
  139629. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "cc"
  139630. );
  139631. return (uint32_t)(size_t)r;
  139632. }
  139633. /* AND m into each word of a and store in r.
  139634. *
  139635. * r A single precision integer.
  139636. * a A single precision integer.
  139637. * m Mask to AND against each digit.
  139638. */
  139639. static void sp_1024_mask_16(sp_digit* r, const sp_digit* a, sp_digit m)
  139640. {
  139641. #ifdef WOLFSSL_SP_SMALL
  139642. int i;
  139643. for (i=0; i<16; i++) {
  139644. r[i] = a[i] & m;
  139645. }
  139646. #else
  139647. int i;
  139648. for (i = 0; i < 16; i += 8) {
  139649. r[i+0] = a[i+0] & m;
  139650. r[i+1] = a[i+1] & m;
  139651. r[i+2] = a[i+2] & m;
  139652. r[i+3] = a[i+3] & m;
  139653. r[i+4] = a[i+4] & m;
  139654. r[i+5] = a[i+5] & m;
  139655. r[i+6] = a[i+6] & m;
  139656. r[i+7] = a[i+7] & m;
  139657. }
  139658. #endif
  139659. }
  139660. /* Multiply a and b into r. (r = a * b)
  139661. *
  139662. * r A single precision integer.
  139663. * a A single precision integer.
  139664. * b A single precision integer.
  139665. */
  139666. SP_NOINLINE static void sp_1024_mul_32(sp_digit* r, const sp_digit* a,
  139667. const sp_digit* b)
  139668. {
  139669. sp_digit* z0 = r;
  139670. sp_digit z1[32];
  139671. sp_digit a1[16];
  139672. sp_digit b1[16];
  139673. sp_digit* z2 = r + 32;
  139674. sp_digit u;
  139675. sp_digit ca;
  139676. sp_digit cb;
  139677. ca = sp_1024_add_16(a1, a, &a[16]);
  139678. cb = sp_1024_add_16(b1, b, &b[16]);
  139679. u = ca & cb;
  139680. sp_1024_mul_16(z2, &a[16], &b[16]);
  139681. sp_1024_mul_16(z0, a, b);
  139682. sp_1024_mul_16(z1, a1, b1);
  139683. u += sp_1024_sub_in_place_32(z1, z0);
  139684. u += sp_1024_sub_in_place_32(z1, z2);
  139685. sp_1024_mask_16(a1, a1, 0 - cb);
  139686. u += sp_1024_add_16(z1 + 16, z1 + 16, a1);
  139687. sp_1024_mask_16(b1, b1, 0 - ca);
  139688. u += sp_1024_add_16(z1 + 16, z1 + 16, b1);
  139689. u += sp_1024_add_32(r + 16, r + 16, z1);
  139690. XMEMSET(a1 + 1, 0, sizeof(sp_digit) * (16 - 1));
  139691. a1[0] = u;
  139692. (void)sp_1024_add_16(r + 48, r + 48, a1);
  139693. }
  139694. /* Sub b from a into r. (r = a - b)
  139695. *
  139696. * r A single precision integer.
  139697. * a A single precision integer.
  139698. * b A single precision integer.
  139699. */
  139700. static sp_digit sp_1024_sub_16(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p)
  139701. {
  139702. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  139703. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  139704. register const sp_digit* b asm ("r2") = (const sp_digit*)b_p;
  139705. __asm__ __volatile__ (
  139706. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  139707. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  139708. "subs r3, r3, r7\n\t"
  139709. "sbcs r4, r4, r8\n\t"
  139710. "sbcs r5, r5, r9\n\t"
  139711. "sbcs r6, r6, r10\n\t"
  139712. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  139713. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  139714. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  139715. "sbcs r3, r3, r7\n\t"
  139716. "sbcs r4, r4, r8\n\t"
  139717. "sbcs r5, r5, r9\n\t"
  139718. "sbcs r6, r6, r10\n\t"
  139719. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  139720. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  139721. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  139722. "sbcs r3, r3, r7\n\t"
  139723. "sbcs r4, r4, r8\n\t"
  139724. "sbcs r5, r5, r9\n\t"
  139725. "sbcs r6, r6, r10\n\t"
  139726. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  139727. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  139728. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  139729. "sbcs r3, r3, r7\n\t"
  139730. "sbcs r4, r4, r8\n\t"
  139731. "sbcs r5, r5, r9\n\t"
  139732. "sbcs r6, r6, r10\n\t"
  139733. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  139734. "sbc %[r], r6, r6\n\t"
  139735. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  139736. :
  139737. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "cc"
  139738. );
  139739. return (uint32_t)(size_t)r;
  139740. }
  139741. /* Square a and put result in r. (r = a * a)
  139742. *
  139743. * r A single precision integer.
  139744. * a A single precision integer.
  139745. */
  139746. SP_NOINLINE static void sp_1024_sqr_32(sp_digit* r, const sp_digit* a)
  139747. {
  139748. sp_digit* z0 = r;
  139749. sp_digit* z2 = r + 32;
  139750. sp_digit z1[32];
  139751. sp_digit* a1 = z1;
  139752. sp_digit zero[16];
  139753. sp_digit u;
  139754. sp_digit mask;
  139755. sp_digit* p1;
  139756. sp_digit* p2;
  139757. XMEMSET(zero, 0, sizeof(sp_digit) * 16);
  139758. mask = sp_1024_sub_16(a1, a, &a[16]);
  139759. p1 = (sp_digit*)(((sp_digit)zero & mask ) | ((sp_digit)a1 & (~mask)));
  139760. p2 = (sp_digit*)(((sp_digit)zero & (~mask)) | ((sp_digit)a1 & mask ));
  139761. (void)sp_1024_sub_16(a1, p1, p2);
  139762. sp_1024_sqr_16(z2, &a[16]);
  139763. sp_1024_sqr_16(z0, a);
  139764. sp_1024_sqr_16(z1, a1);
  139765. u = 0;
  139766. u -= sp_1024_sub_in_place_32(z1, z2);
  139767. u -= sp_1024_sub_in_place_32(z1, z0);
  139768. u += sp_1024_sub_in_place_32(r + 16, z1);
  139769. zero[0] = u;
  139770. (void)sp_1024_add_16(r + 48, r + 48, zero);
  139771. }
  139772. #else
  139773. /* Multiply a and b into r. (r = a * b)
  139774. *
  139775. * r A single precision integer.
  139776. * a A single precision integer.
  139777. * b A single precision integer.
  139778. */
  139779. static void sp_1024_mul_32(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p)
  139780. {
  139781. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  139782. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  139783. register const sp_digit* b asm ("r2") = (const sp_digit*)b_p;
  139784. __asm__ __volatile__ (
  139785. "sub sp, sp, #0x100\n\t"
  139786. "ldr lr, [%[a]]\n\t"
  139787. "ldr r11, [%[b]]\n\t"
  139788. "umull r8, r6, lr, r11\n\t"
  139789. "str r8, [sp]\n\t"
  139790. "mov r7, #0\n\t"
  139791. "mov r8, #0\n\t"
  139792. "mov r5, #4\n\t"
  139793. "\n"
  139794. "L_sp_1024_mul_32_outer_%=: \n\t"
  139795. "subs r3, r5, #0x7c\n\t"
  139796. "it cc\n\t"
  139797. "movcc r3, #0\n\t"
  139798. "sub r4, r5, r3\n\t"
  139799. "\n"
  139800. "L_sp_1024_mul_32_inner_%=: \n\t"
  139801. "ldr lr, [%[a], r3]\n\t"
  139802. "ldr r11, [%[b], r4]\n\t"
  139803. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  139804. "lsl r9, lr, #16\n\t"
  139805. "lsl r10, r11, #16\n\t"
  139806. "lsr r9, r9, #16\n\t"
  139807. "lsr r10, r10, #16\n\t"
  139808. "mul r10, r9, r10\n\t"
  139809. "adds r6, r6, r10\n\t"
  139810. "adcs r7, r7, #0\n\t"
  139811. "adc r8, r8, #0\n\t"
  139812. "lsr r10, r11, #16\n\t"
  139813. "mul r9, r10, r9\n\t"
  139814. "lsr r10, r9, #16\n\t"
  139815. "lsl r9, r9, #16\n\t"
  139816. "adds r6, r6, r9\n\t"
  139817. "adcs r7, r7, r10\n\t"
  139818. "adc r8, r8, #0\n\t"
  139819. "lsr r9, lr, #16\n\t"
  139820. "lsr r10, r11, #16\n\t"
  139821. "mul r10, r9, r10\n\t"
  139822. "adds r7, r7, r10\n\t"
  139823. "adc r8, r8, #0\n\t"
  139824. "lsl r10, r11, #16\n\t"
  139825. "lsr r10, r10, #16\n\t"
  139826. "mul r9, r10, r9\n\t"
  139827. "lsr r10, r9, #16\n\t"
  139828. "lsl r9, r9, #16\n\t"
  139829. "adds r6, r6, r9\n\t"
  139830. "adcs r7, r7, r10\n\t"
  139831. "adc r8, r8, #0\n\t"
  139832. #else
  139833. "umull r9, r10, lr, r11\n\t"
  139834. "adds r6, r6, r9\n\t"
  139835. "adcs r7, r7, r10\n\t"
  139836. "adc r8, r8, #0\n\t"
  139837. #endif
  139838. "ldr lr, [%[a], r4]\n\t"
  139839. "ldr r11, [%[b], r3]\n\t"
  139840. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  139841. "lsl r9, lr, #16\n\t"
  139842. "lsl r10, r11, #16\n\t"
  139843. "lsr r9, r9, #16\n\t"
  139844. "lsr r10, r10, #16\n\t"
  139845. "mul r10, r9, r10\n\t"
  139846. "adds r6, r6, r10\n\t"
  139847. "adcs r7, r7, #0\n\t"
  139848. "adc r8, r8, #0\n\t"
  139849. "lsr r10, r11, #16\n\t"
  139850. "mul r9, r10, r9\n\t"
  139851. "lsr r10, r9, #16\n\t"
  139852. "lsl r9, r9, #16\n\t"
  139853. "adds r6, r6, r9\n\t"
  139854. "adcs r7, r7, r10\n\t"
  139855. "adc r8, r8, #0\n\t"
  139856. "lsr r9, lr, #16\n\t"
  139857. "lsr r10, r11, #16\n\t"
  139858. "mul r10, r9, r10\n\t"
  139859. "adds r7, r7, r10\n\t"
  139860. "adc r8, r8, #0\n\t"
  139861. "lsl r10, r11, #16\n\t"
  139862. "lsr r10, r10, #16\n\t"
  139863. "mul r9, r10, r9\n\t"
  139864. "lsr r10, r9, #16\n\t"
  139865. "lsl r9, r9, #16\n\t"
  139866. "adds r6, r6, r9\n\t"
  139867. "adcs r7, r7, r10\n\t"
  139868. "adc r8, r8, #0\n\t"
  139869. #else
  139870. "umull r9, r10, lr, r11\n\t"
  139871. "adds r6, r6, r9\n\t"
  139872. "adcs r7, r7, r10\n\t"
  139873. "adc r8, r8, #0\n\t"
  139874. #endif
  139875. "add r3, r3, #4\n\t"
  139876. "sub r4, r4, #4\n\t"
  139877. "cmp r3, r4\n\t"
  139878. "bgt L_sp_1024_mul_32_inner_done_%=\n\t"
  139879. "blt L_sp_1024_mul_32_inner_%=\n\t"
  139880. "ldr lr, [%[a], r3]\n\t"
  139881. "ldr r11, [%[b], r3]\n\t"
  139882. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  139883. "lsl r9, lr, #16\n\t"
  139884. "lsl r10, r11, #16\n\t"
  139885. "lsr r9, r9, #16\n\t"
  139886. "lsr r10, r10, #16\n\t"
  139887. "mul r10, r9, r10\n\t"
  139888. "adds r6, r6, r10\n\t"
  139889. "adcs r7, r7, #0\n\t"
  139890. "adc r8, r8, #0\n\t"
  139891. "lsr r10, r11, #16\n\t"
  139892. "mul r9, r10, r9\n\t"
  139893. "lsr r10, r9, #16\n\t"
  139894. "lsl r9, r9, #16\n\t"
  139895. "adds r6, r6, r9\n\t"
  139896. "adcs r7, r7, r10\n\t"
  139897. "adc r8, r8, #0\n\t"
  139898. "lsr r9, lr, #16\n\t"
  139899. "lsr r10, r11, #16\n\t"
  139900. "mul r10, r9, r10\n\t"
  139901. "adds r7, r7, r10\n\t"
  139902. "adc r8, r8, #0\n\t"
  139903. "lsl r10, r11, #16\n\t"
  139904. "lsr r10, r10, #16\n\t"
  139905. "mul r9, r10, r9\n\t"
  139906. "lsr r10, r9, #16\n\t"
  139907. "lsl r9, r9, #16\n\t"
  139908. "adds r6, r6, r9\n\t"
  139909. "adcs r7, r7, r10\n\t"
  139910. "adc r8, r8, #0\n\t"
  139911. #else
  139912. "umull r9, r10, lr, r11\n\t"
  139913. "adds r6, r6, r9\n\t"
  139914. "adcs r7, r7, r10\n\t"
  139915. "adc r8, r8, #0\n\t"
  139916. #endif
  139917. "\n"
  139918. "L_sp_1024_mul_32_inner_done_%=: \n\t"
  139919. "str r6, [sp, r5]\n\t"
  139920. "mov r6, r7\n\t"
  139921. "mov r7, r8\n\t"
  139922. "mov r8, #0\n\t"
  139923. "add r5, r5, #4\n\t"
  139924. "cmp r5, #0xf4\n\t"
  139925. "ble L_sp_1024_mul_32_outer_%=\n\t"
  139926. "ldr lr, [%[a], #124]\n\t"
  139927. "ldr r11, [%[b], #124]\n\t"
  139928. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  139929. "lsl r9, lr, #16\n\t"
  139930. "lsl r10, r11, #16\n\t"
  139931. "lsr r9, r9, #16\n\t"
  139932. "lsr r10, r10, #16\n\t"
  139933. "mul r10, r9, r10\n\t"
  139934. "adds r6, r6, r10\n\t"
  139935. "adc r7, r7, #0\n\t"
  139936. "lsr r10, r11, #16\n\t"
  139937. "mul r9, r10, r9\n\t"
  139938. "lsr r10, r9, #16\n\t"
  139939. "lsl r9, r9, #16\n\t"
  139940. "adds r6, r6, r9\n\t"
  139941. "adc r7, r7, r10\n\t"
  139942. "lsr r9, lr, #16\n\t"
  139943. "lsr r10, r11, #16\n\t"
  139944. "mul r10, r9, r10\n\t"
  139945. "add r7, r7, r10\n\t"
  139946. "lsl r10, r11, #16\n\t"
  139947. "lsr r10, r10, #16\n\t"
  139948. "mul r9, r10, r9\n\t"
  139949. "lsr r10, r9, #16\n\t"
  139950. "lsl r9, r9, #16\n\t"
  139951. "adds r6, r6, r9\n\t"
  139952. "adc r7, r7, r10\n\t"
  139953. #else
  139954. "umlal r6, r7, lr, r11\n\t"
  139955. #endif
  139956. "str r6, [sp, r5]\n\t"
  139957. "add r5, r5, #4\n\t"
  139958. "str r7, [sp, r5]\n\t"
  139959. "\n"
  139960. "L_sp_1024_mul_32_store_%=: \n\t"
  139961. "ldm sp!, {r3, r4, r6, r7, r8, r9, r10, r11}\n\t"
  139962. "stm %[r]!, {r3, r4, r6, r7, r8, r9, r10, r11}\n\t"
  139963. "subs r5, r5, #32\n\t"
  139964. "bgt L_sp_1024_mul_32_store_%=\n\t"
  139965. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  139966. :
  139967. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "lr", "r11", "cc"
  139968. );
  139969. }
  139970. /* Square a and put result in r. (r = a * a)
  139971. *
  139972. * r A single precision integer.
  139973. * a A single precision integer.
  139974. */
  139975. static void sp_1024_sqr_32(sp_digit* r_p, const sp_digit* a_p)
  139976. {
  139977. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  139978. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  139979. __asm__ __volatile__ (
  139980. "sub sp, sp, #0x100\n\t"
  139981. "ldr lr, [%[a]]\n\t"
  139982. "umull r8, r6, lr, lr\n\t"
  139983. "str r8, [sp]\n\t"
  139984. "mov r7, #0\n\t"
  139985. "mov r8, #0\n\t"
  139986. "mov r5, #4\n\t"
  139987. "\n"
  139988. "L_sp_1024_sqr_32_outer_%=: \n\t"
  139989. "subs r3, r5, #0x7c\n\t"
  139990. "it cc\n\t"
  139991. "movcc r3, #0\n\t"
  139992. "sub r4, r5, r3\n\t"
  139993. "\n"
  139994. "L_sp_1024_sqr_32_inner_%=: \n\t"
  139995. "ldr lr, [%[a], r3]\n\t"
  139996. "ldr r11, [%[a], r4]\n\t"
  139997. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  139998. "lsl r9, lr, #16\n\t"
  139999. "lsl r10, r11, #16\n\t"
  140000. "lsr r9, r9, #16\n\t"
  140001. "lsr r10, r10, #16\n\t"
  140002. "mul r10, r9, r10\n\t"
  140003. "adds r6, r6, r10\n\t"
  140004. "adcs r7, r7, #0\n\t"
  140005. "adc r8, r8, #0\n\t"
  140006. "adds r6, r6, r10\n\t"
  140007. "adcs r7, r7, #0\n\t"
  140008. "adc r8, r8, #0\n\t"
  140009. "lsr r10, r11, #16\n\t"
  140010. "mul r9, r10, r9\n\t"
  140011. "lsr r10, r9, #16\n\t"
  140012. "lsl r9, r9, #16\n\t"
  140013. "adds r6, r6, r9\n\t"
  140014. "adcs r7, r7, r10\n\t"
  140015. "adc r8, r8, #0\n\t"
  140016. "adds r6, r6, r9\n\t"
  140017. "adcs r7, r7, r10\n\t"
  140018. "adc r8, r8, #0\n\t"
  140019. "lsr r9, lr, #16\n\t"
  140020. "lsr r10, r11, #16\n\t"
  140021. "mul r10, r9, r10\n\t"
  140022. "adds r7, r7, r10\n\t"
  140023. "adc r8, r8, #0\n\t"
  140024. "adds r7, r7, r10\n\t"
  140025. "adc r8, r8, #0\n\t"
  140026. "lsl r10, r11, #16\n\t"
  140027. "lsr r10, r10, #16\n\t"
  140028. "mul r9, r10, r9\n\t"
  140029. "lsr r10, r9, #16\n\t"
  140030. "lsl r9, r9, #16\n\t"
  140031. "adds r6, r6, r9\n\t"
  140032. "adcs r7, r7, r10\n\t"
  140033. "adc r8, r8, #0\n\t"
  140034. "adds r6, r6, r9\n\t"
  140035. "adcs r7, r7, r10\n\t"
  140036. "adc r8, r8, #0\n\t"
  140037. #else
  140038. "umull r9, r10, lr, r11\n\t"
  140039. "adds r6, r6, r9\n\t"
  140040. "adcs r7, r7, r10\n\t"
  140041. "adc r8, r8, #0\n\t"
  140042. "adds r6, r6, r9\n\t"
  140043. "adcs r7, r7, r10\n\t"
  140044. "adc r8, r8, #0\n\t"
  140045. #endif
  140046. "add r3, r3, #4\n\t"
  140047. "sub r4, r4, #4\n\t"
  140048. "cmp r3, r4\n\t"
  140049. "bgt L_sp_1024_sqr_32_inner_done_%=\n\t"
  140050. "blt L_sp_1024_sqr_32_inner_%=\n\t"
  140051. "ldr lr, [%[a], r3]\n\t"
  140052. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  140053. "lsl r9, lr, #16\n\t"
  140054. "lsr r10, lr, #16\n\t"
  140055. "lsr r9, r9, #16\n\t"
  140056. "mov r11, r9\n\t"
  140057. "mul r9, r11, r9\n\t"
  140058. "mov r11, r10\n\t"
  140059. "mul r10, r11, r10\n\t"
  140060. "adds r6, r6, r9\n\t"
  140061. "adcs r7, r7, r10\n\t"
  140062. "adc r8, r8, #0\n\t"
  140063. "lsr r10, lr, #16\n\t"
  140064. "lsl r9, lr, #16\n\t"
  140065. "lsr r9, r9, #16\n\t"
  140066. "mul r9, r10, r9\n\t"
  140067. "lsr r10, r9, #15\n\t"
  140068. "lsl r9, r9, #17\n\t"
  140069. "adds r6, r6, r9\n\t"
  140070. "adcs r7, r7, r10\n\t"
  140071. "adc r8, r8, #0\n\t"
  140072. #else
  140073. "umull r9, r10, lr, lr\n\t"
  140074. "adds r6, r6, r9\n\t"
  140075. "adcs r7, r7, r10\n\t"
  140076. "adc r8, r8, #0\n\t"
  140077. #endif
  140078. "\n"
  140079. "L_sp_1024_sqr_32_inner_done_%=: \n\t"
  140080. "str r6, [sp, r5]\n\t"
  140081. "mov r6, r7\n\t"
  140082. "mov r7, r8\n\t"
  140083. "mov r8, #0\n\t"
  140084. "add r5, r5, #4\n\t"
  140085. "cmp r5, #0xf4\n\t"
  140086. "ble L_sp_1024_sqr_32_outer_%=\n\t"
  140087. "ldr lr, [%[a], #124]\n\t"
  140088. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  140089. "lsl r9, lr, #16\n\t"
  140090. "lsr r10, lr, #16\n\t"
  140091. "lsr r9, r9, #16\n\t"
  140092. "mov r11, r9\n\t"
  140093. "mul r9, r11, r9\n\t"
  140094. "mov r11, r10\n\t"
  140095. "mul r10, r11, r10\n\t"
  140096. "adds r6, r6, r9\n\t"
  140097. "adc r7, r7, r10\n\t"
  140098. "lsr r10, lr, #16\n\t"
  140099. "lsl r9, lr, #16\n\t"
  140100. "lsr r9, r9, #16\n\t"
  140101. "mul r9, r10, r9\n\t"
  140102. "lsr r10, r9, #15\n\t"
  140103. "lsl r9, r9, #17\n\t"
  140104. "adds r6, r6, r9\n\t"
  140105. "adc r7, r7, r10\n\t"
  140106. #else
  140107. "umull r9, r10, lr, lr\n\t"
  140108. "adds r6, r6, r9\n\t"
  140109. "adc r7, r7, r10\n\t"
  140110. #endif
  140111. "str r6, [sp, r5]\n\t"
  140112. "add r5, r5, #4\n\t"
  140113. "str r7, [sp, r5]\n\t"
  140114. "\n"
  140115. "L_sp_1024_sqr_32_store_%=: \n\t"
  140116. "ldm sp!, {r3, r4, r6, r7, r8, r9, r10, r11}\n\t"
  140117. "stm %[r]!, {r3, r4, r6, r7, r8, r9, r10, r11}\n\t"
  140118. "subs r5, r5, #32\n\t"
  140119. "bgt L_sp_1024_sqr_32_store_%=\n\t"
  140120. : [r] "+r" (r), [a] "+r" (a)
  140121. :
  140122. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "lr", "r11", "cc"
  140123. );
  140124. }
  140125. #endif /* !WOLFSSL_SP_SMALL */
  140126. /* The modulus (prime) of the curve P1024. */
  140127. static const sp_digit p1024_mod[32] = {
  140128. 0xfea85feb,0x666d807a,0xac7ace87,0x80c5df10,0x89857db0,0xfce3e823,
  140129. 0x56971f1f,0x9f94d6af,0x1c3c09aa,0xa7cf3c52,0x31852a82,0xb6aff4a8,
  140130. 0x65681ce1,0x512ac5cd,0x326b4cd4,0xe26c6487,0xa666a6d0,0x356d27f4,
  140131. 0xf7c88a19,0xe791b39f,0x31a59cb0,0x228730d5,0xe2fc0f1b,0xf40aab27,
  140132. 0xb3e01a2e,0xbe9ae358,0x9cb48261,0x416c0ce1,0xdad0657a,0x65c61198,
  140133. 0x0a563fda,0x997abb1f
  140134. };
  140135. /* The Montgomery normalizer for modulus of the curve P1024. */
  140136. static const sp_digit p1024_norm_mod[32] = {
  140137. 0x0157a015,0x99927f85,0x53853178,0x7f3a20ef,0x767a824f,0x031c17dc,
  140138. 0xa968e0e0,0x606b2950,0xe3c3f655,0x5830c3ad,0xce7ad57d,0x49500b57,
  140139. 0x9a97e31e,0xaed53a32,0xcd94b32b,0x1d939b78,0x5999592f,0xca92d80b,
  140140. 0x083775e6,0x186e4c60,0xce5a634f,0xdd78cf2a,0x1d03f0e4,0x0bf554d8,
  140141. 0x4c1fe5d1,0x41651ca7,0x634b7d9e,0xbe93f31e,0x252f9a85,0x9a39ee67,
  140142. 0xf5a9c025,0x668544e0
  140143. };
  140144. /* The Montgomery multiplier for modulus of the curve P1024. */
  140145. static sp_digit p1024_mp_mod = 0x7c8f2f3d;
  140146. #if defined(WOLFSSL_SP_SMALL) || defined(HAVE_ECC_CHECK_KEY)
  140147. /* The order of the curve P1024. */
  140148. static const sp_digit p1024_order[32] = {
  140149. 0xbfaa17fb,0xd99b601e,0x2b1eb3a1,0x203177c4,0xe2615f6c,0xff38fa08,
  140150. 0xd5a5c7c7,0xa7e535ab,0x870f026a,0xa9f3cf14,0x0c614aa0,0x6dabfd2a,
  140151. 0x595a0738,0x144ab173,0xcc9ad335,0x389b1921,0x2999a9b4,0x4d5b49fd,
  140152. 0xfdf22286,0x39e46ce7,0x4c69672c,0xc8a1cc35,0xf8bf03c6,0xbd02aac9,
  140153. 0x2cf8068b,0x6fa6b8d6,0x672d2098,0x905b0338,0x36b4195e,0x99718466,
  140154. 0xc2958ff6,0x265eaec7
  140155. };
  140156. #endif
  140157. /* The base point of curve P1024. */
  140158. static const sp_point_1024 p1024_base = {
  140159. /* X ordinate */
  140160. {
  140161. 0xeae63895,0x880dc8ab,0x967e0979,0x80ec46c4,0xb63f73ec,0xee9163a5,
  140162. 0x80728d87,0xd5cfb4cc,0xba66910d,0xa7c1514d,0x7a60de74,0xa702c339,
  140163. 0x8b72f2e1,0x337c8654,0x5dd5bccb,0x9760af76,0x406ce890,0x718bd9e7,
  140164. 0xdb9dfa55,0x43d5f22c,0x30b09e10,0xab10db90,0xf6ce2308,0xb5edb6c0,
  140165. 0xb6ff7cbf,0x98b2f204,0x0aec69c6,0x2b1a2fd6,0x3ed9b52a,0x0a799005,
  140166. 0x332c29ad,0x53fc09ee,
  140167. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  140168. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  140169. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  140170. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  140171. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  140172. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  140173. (sp_digit)0, (sp_digit)0
  140174. },
  140175. /* Y ordinate */
  140176. {
  140177. 0x1bef16d7,0x75573fd7,0x6a67dcde,0xadb9b570,0xd5bb4636,0x80bdad5a,
  140178. 0xe9cb99a9,0x13515ad7,0xc5a4d5f2,0x492d979f,0x164aa989,0xac6f1e80,
  140179. 0xb7652fe0,0xcad696b5,0xad547c6c,0x70dae117,0xa9e032b9,0x416cff0c,
  140180. 0x9a140b2e,0x6b598ccf,0xf0de55f6,0xe7f7f5e5,0x654ec2b9,0xf5ea69f4,
  140181. 0x1e141178,0x3d778d82,0x02990696,0xd3e82016,0x3634a135,0xf9f1f053,
  140182. 0x3f6009f1,0x0a824906,
  140183. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  140184. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  140185. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  140186. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  140187. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  140188. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  140189. (sp_digit)0, (sp_digit)0
  140190. },
  140191. /* Z ordinate */
  140192. {
  140193. 0x00000001,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,
  140194. 0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,
  140195. 0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,
  140196. 0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,
  140197. 0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,
  140198. 0x00000000,0x00000000,
  140199. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  140200. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  140201. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  140202. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  140203. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  140204. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  140205. (sp_digit)0, (sp_digit)0
  140206. },
  140207. /* infinity */
  140208. 0
  140209. };
  140210. #ifdef WOLFSSL_SP_SMALL
  140211. /* Sub b from a into a. (a -= b)
  140212. *
  140213. * a A single precision integer.
  140214. * b A single precision integer.
  140215. */
  140216. static sp_digit sp_1024_sub_in_place_32(sp_digit* a_p, const sp_digit* b_p)
  140217. {
  140218. register sp_digit* a asm ("r0") = (sp_digit*)a_p;
  140219. register const sp_digit* b asm ("r1") = (const sp_digit*)b_p;
  140220. __asm__ __volatile__ (
  140221. "mov r12, #0\n\t"
  140222. "add lr, %[a], #0x80\n\t"
  140223. "\n"
  140224. "L_sp_1024_sub_in_pkace_32_word_%=: \n\t"
  140225. "rsbs r12, r12, #0\n\t"
  140226. "ldm %[a], {r2, r3, r4, r5}\n\t"
  140227. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  140228. "sbcs r2, r2, r6\n\t"
  140229. "sbcs r3, r3, r7\n\t"
  140230. "sbcs r4, r4, r8\n\t"
  140231. "sbcs r5, r5, r9\n\t"
  140232. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  140233. "sbc r12, r12, r12\n\t"
  140234. "cmp %[a], lr\n\t"
  140235. "bne L_sp_1024_sub_in_pkace_32_word_%=\n\t"
  140236. "mov %[a], r12\n\t"
  140237. : [a] "+r" (a), [b] "+r" (b)
  140238. :
  140239. : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r12", "lr", "cc"
  140240. );
  140241. return (uint32_t)(size_t)a;
  140242. }
  140243. #endif /* WOLFSSL_SP_SMALL */
  140244. #ifdef WOLFSSL_SP_SMALL
  140245. /* Conditionally subtract b from a using the mask m.
  140246. * m is -1 to subtract and 0 when not copying.
  140247. *
  140248. * r A single precision number representing condition subtract result.
  140249. * a A single precision number to subtract from.
  140250. * b A single precision number to subtract.
  140251. * m Mask value to apply.
  140252. */
  140253. 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)
  140254. {
  140255. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  140256. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  140257. register const sp_digit* b asm ("r2") = (const sp_digit*)b_p;
  140258. register sp_digit m asm ("r3") = (sp_digit)m_p;
  140259. __asm__ __volatile__ (
  140260. "mov r6, #0\n\t"
  140261. "mov r12, #0\n\t"
  140262. "mov lr, #0\n\t"
  140263. "\n"
  140264. "L_sp_1024_cond_sub_32_words_%=: \n\t"
  140265. "subs r12, r6, r12\n\t"
  140266. "ldr r4, [%[a], lr]\n\t"
  140267. "ldr r5, [%[b], lr]\n\t"
  140268. "and r5, r5, %[m]\n\t"
  140269. "sbcs r4, r4, r5\n\t"
  140270. "sbc r12, r6, r6\n\t"
  140271. "str r4, [%[r], lr]\n\t"
  140272. "add lr, lr, #4\n\t"
  140273. "cmp lr, #0x80\n\t"
  140274. "blt L_sp_1024_cond_sub_32_words_%=\n\t"
  140275. "mov %[r], r12\n\t"
  140276. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b), [m] "+r" (m)
  140277. :
  140278. : "memory", "r12", "lr", "r4", "r5", "r6", "cc"
  140279. );
  140280. return (uint32_t)(size_t)r;
  140281. }
  140282. #else
  140283. /* Conditionally subtract b from a using the mask m.
  140284. * m is -1 to subtract and 0 when not copying.
  140285. *
  140286. * r A single precision number representing condition subtract result.
  140287. * a A single precision number to subtract from.
  140288. * b A single precision number to subtract.
  140289. * m Mask value to apply.
  140290. */
  140291. 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)
  140292. {
  140293. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  140294. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  140295. register const sp_digit* b asm ("r2") = (const sp_digit*)b_p;
  140296. register sp_digit m asm ("r3") = (sp_digit)m_p;
  140297. __asm__ __volatile__ (
  140298. "mov lr, #0\n\t"
  140299. "ldm %[a]!, {r4, r5}\n\t"
  140300. "ldm %[b]!, {r6, r7}\n\t"
  140301. "and r6, r6, %[m]\n\t"
  140302. "and r7, r7, %[m]\n\t"
  140303. "subs r4, r4, r6\n\t"
  140304. "sbcs r5, r5, r7\n\t"
  140305. "stm %[r]!, {r4, r5}\n\t"
  140306. "ldm %[a]!, {r4, r5}\n\t"
  140307. "ldm %[b]!, {r6, r7}\n\t"
  140308. "and r6, r6, %[m]\n\t"
  140309. "and r7, r7, %[m]\n\t"
  140310. "sbcs r4, r4, r6\n\t"
  140311. "sbcs r5, r5, r7\n\t"
  140312. "stm %[r]!, {r4, r5}\n\t"
  140313. "ldm %[a]!, {r4, r5}\n\t"
  140314. "ldm %[b]!, {r6, r7}\n\t"
  140315. "and r6, r6, %[m]\n\t"
  140316. "and r7, r7, %[m]\n\t"
  140317. "sbcs r4, r4, r6\n\t"
  140318. "sbcs r5, r5, r7\n\t"
  140319. "stm %[r]!, {r4, r5}\n\t"
  140320. "ldm %[a]!, {r4, r5}\n\t"
  140321. "ldm %[b]!, {r6, r7}\n\t"
  140322. "and r6, r6, %[m]\n\t"
  140323. "and r7, r7, %[m]\n\t"
  140324. "sbcs r4, r4, r6\n\t"
  140325. "sbcs r5, r5, r7\n\t"
  140326. "stm %[r]!, {r4, r5}\n\t"
  140327. "ldm %[a]!, {r4, r5}\n\t"
  140328. "ldm %[b]!, {r6, r7}\n\t"
  140329. "and r6, r6, %[m]\n\t"
  140330. "and r7, r7, %[m]\n\t"
  140331. "sbcs r4, r4, r6\n\t"
  140332. "sbcs r5, r5, r7\n\t"
  140333. "stm %[r]!, {r4, r5}\n\t"
  140334. "ldm %[a]!, {r4, r5}\n\t"
  140335. "ldm %[b]!, {r6, r7}\n\t"
  140336. "and r6, r6, %[m]\n\t"
  140337. "and r7, r7, %[m]\n\t"
  140338. "sbcs r4, r4, r6\n\t"
  140339. "sbcs r5, r5, r7\n\t"
  140340. "stm %[r]!, {r4, r5}\n\t"
  140341. "ldm %[a]!, {r4, r5}\n\t"
  140342. "ldm %[b]!, {r6, r7}\n\t"
  140343. "and r6, r6, %[m]\n\t"
  140344. "and r7, r7, %[m]\n\t"
  140345. "sbcs r4, r4, r6\n\t"
  140346. "sbcs r5, r5, r7\n\t"
  140347. "stm %[r]!, {r4, r5}\n\t"
  140348. "ldm %[a]!, {r4, r5}\n\t"
  140349. "ldm %[b]!, {r6, r7}\n\t"
  140350. "and r6, r6, %[m]\n\t"
  140351. "and r7, r7, %[m]\n\t"
  140352. "sbcs r4, r4, r6\n\t"
  140353. "sbcs r5, r5, r7\n\t"
  140354. "stm %[r]!, {r4, r5}\n\t"
  140355. "ldm %[a]!, {r4, r5}\n\t"
  140356. "ldm %[b]!, {r6, r7}\n\t"
  140357. "and r6, r6, %[m]\n\t"
  140358. "and r7, r7, %[m]\n\t"
  140359. "sbcs r4, r4, r6\n\t"
  140360. "sbcs r5, r5, r7\n\t"
  140361. "stm %[r]!, {r4, r5}\n\t"
  140362. "ldm %[a]!, {r4, r5}\n\t"
  140363. "ldm %[b]!, {r6, r7}\n\t"
  140364. "and r6, r6, %[m]\n\t"
  140365. "and r7, r7, %[m]\n\t"
  140366. "sbcs r4, r4, r6\n\t"
  140367. "sbcs r5, r5, r7\n\t"
  140368. "stm %[r]!, {r4, r5}\n\t"
  140369. "ldm %[a]!, {r4, r5}\n\t"
  140370. "ldm %[b]!, {r6, r7}\n\t"
  140371. "and r6, r6, %[m]\n\t"
  140372. "and r7, r7, %[m]\n\t"
  140373. "sbcs r4, r4, r6\n\t"
  140374. "sbcs r5, r5, r7\n\t"
  140375. "stm %[r]!, {r4, r5}\n\t"
  140376. "ldm %[a]!, {r4, r5}\n\t"
  140377. "ldm %[b]!, {r6, r7}\n\t"
  140378. "and r6, r6, %[m]\n\t"
  140379. "and r7, r7, %[m]\n\t"
  140380. "sbcs r4, r4, r6\n\t"
  140381. "sbcs r5, r5, r7\n\t"
  140382. "stm %[r]!, {r4, r5}\n\t"
  140383. "ldm %[a]!, {r4, r5}\n\t"
  140384. "ldm %[b]!, {r6, r7}\n\t"
  140385. "and r6, r6, %[m]\n\t"
  140386. "and r7, r7, %[m]\n\t"
  140387. "sbcs r4, r4, r6\n\t"
  140388. "sbcs r5, r5, r7\n\t"
  140389. "stm %[r]!, {r4, r5}\n\t"
  140390. "ldm %[a]!, {r4, r5}\n\t"
  140391. "ldm %[b]!, {r6, r7}\n\t"
  140392. "and r6, r6, %[m]\n\t"
  140393. "and r7, r7, %[m]\n\t"
  140394. "sbcs r4, r4, r6\n\t"
  140395. "sbcs r5, r5, r7\n\t"
  140396. "stm %[r]!, {r4, r5}\n\t"
  140397. "ldm %[a]!, {r4, r5}\n\t"
  140398. "ldm %[b]!, {r6, r7}\n\t"
  140399. "and r6, r6, %[m]\n\t"
  140400. "and r7, r7, %[m]\n\t"
  140401. "sbcs r4, r4, r6\n\t"
  140402. "sbcs r5, r5, r7\n\t"
  140403. "stm %[r]!, {r4, r5}\n\t"
  140404. "ldm %[a]!, {r4, r5}\n\t"
  140405. "ldm %[b]!, {r6, r7}\n\t"
  140406. "and r6, r6, %[m]\n\t"
  140407. "and r7, r7, %[m]\n\t"
  140408. "sbcs r4, r4, r6\n\t"
  140409. "sbcs r5, r5, r7\n\t"
  140410. "stm %[r]!, {r4, r5}\n\t"
  140411. "sbc %[r], lr, lr\n\t"
  140412. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b), [m] "+r" (m)
  140413. :
  140414. : "memory", "r12", "lr", "r4", "r5", "r6", "r7", "cc"
  140415. );
  140416. return (uint32_t)(size_t)r;
  140417. }
  140418. #endif /* WOLFSSL_SP_SMALL */
  140419. #ifdef WOLFSSL_SP_SMALL
  140420. /* Add b to a into r. (r = a + b)
  140421. *
  140422. * r A single precision integer.
  140423. * a A single precision integer.
  140424. * b A single precision integer.
  140425. */
  140426. static sp_digit sp_1024_add_32(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p)
  140427. {
  140428. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  140429. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  140430. register const sp_digit* b asm ("r2") = (const sp_digit*)b_p;
  140431. __asm__ __volatile__ (
  140432. "mov r3, #0\n\t"
  140433. "add r12, %[a], #0x80\n\t"
  140434. "\n"
  140435. "L_sp_1024_add_32_word_%=: \n\t"
  140436. "adds r3, r3, #-1\n\t"
  140437. "ldm %[a]!, {r4, r5, r6, r7}\n\t"
  140438. "ldm %[b]!, {r8, r9, r10, r11}\n\t"
  140439. "adcs r4, r4, r8\n\t"
  140440. "adcs r5, r5, r9\n\t"
  140441. "adcs r6, r6, r10\n\t"
  140442. "adcs r7, r7, r11\n\t"
  140443. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  140444. "mov r4, #0\n\t"
  140445. "adc r3, r4, #0\n\t"
  140446. "cmp %[a], r12\n\t"
  140447. "bne L_sp_1024_add_32_word_%=\n\t"
  140448. "mov %[r], r3\n\t"
  140449. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  140450. :
  140451. : "memory", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r3", "r12", "cc"
  140452. );
  140453. return (uint32_t)(size_t)r;
  140454. }
  140455. #endif /* WOLFSSL_SP_SMALL */
  140456. #ifdef WOLFSSL_SP_SMALL
  140457. /* Mul a by digit b into r. (r = a * b)
  140458. *
  140459. * r A single precision integer.
  140460. * a A single precision integer.
  140461. * b A single precision digit.
  140462. */
  140463. static void sp_1024_mul_d_32(sp_digit* r_p, const sp_digit* a_p, sp_digit b_p)
  140464. {
  140465. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  140466. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  140467. register sp_digit b asm ("r2") = (sp_digit)b_p;
  140468. __asm__ __volatile__ (
  140469. /* A[0] * B */
  140470. "ldr r8, [%[a]]\n\t"
  140471. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  140472. "lsl r6, %[b], #16\n\t"
  140473. "lsl r5, r8, #16\n\t"
  140474. "lsr r6, r6, #16\n\t"
  140475. "lsr r5, r5, #16\n\t"
  140476. "mul r5, r6, r5\n\t"
  140477. "lsr r7, r8, #16\n\t"
  140478. "mul r6, r7, r6\n\t"
  140479. "lsr r3, r6, #16\n\t"
  140480. "lsl r6, r6, #16\n\t"
  140481. "adds r5, r5, r6\n\t"
  140482. "adc r3, r3, #0\n\t"
  140483. "lsr r6, %[b], #16\n\t"
  140484. "mul r7, r6, r7\n\t"
  140485. "add r3, r3, r7\n\t"
  140486. "lsl r7, r8, #16\n\t"
  140487. "lsr r7, r7, #16\n\t"
  140488. "mul r6, r7, r6\n\t"
  140489. "lsr r7, r6, #16\n\t"
  140490. "lsl r6, r6, #16\n\t"
  140491. "adds r5, r5, r6\n\t"
  140492. "adc r3, r3, r7\n\t"
  140493. #else
  140494. "umull r5, r3, %[b], r8\n\t"
  140495. #endif
  140496. "mov r4, #0\n\t"
  140497. "str r5, [%[r]]\n\t"
  140498. "mov r5, #0\n\t"
  140499. "mov r9, #4\n\t"
  140500. "\n"
  140501. "L_sp_1024_mul_d_32_word_%=: \n\t"
  140502. /* A[i] * B */
  140503. "ldr r8, [%[a], r9]\n\t"
  140504. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  140505. "lsl r6, %[b], #16\n\t"
  140506. "lsl r7, r8, #16\n\t"
  140507. "lsr r6, r6, #16\n\t"
  140508. "lsr r7, r7, #16\n\t"
  140509. "mul r7, r6, r7\n\t"
  140510. "adds r3, r3, r7\n\t"
  140511. "adcs r4, r4, #0\n\t"
  140512. "adc r5, r5, #0\n\t"
  140513. "lsr r7, r8, #16\n\t"
  140514. "mul r6, r7, r6\n\t"
  140515. "lsr r7, r6, #16\n\t"
  140516. "lsl r6, r6, #16\n\t"
  140517. "adds r3, r3, r6\n\t"
  140518. "adcs r4, r4, r7\n\t"
  140519. "adc r5, r5, #0\n\t"
  140520. "lsr r6, %[b], #16\n\t"
  140521. "lsr r7, r8, #16\n\t"
  140522. "mul r7, r6, r7\n\t"
  140523. "adds r4, r4, r7\n\t"
  140524. "adc r5, r5, #0\n\t"
  140525. "lsl r7, r8, #16\n\t"
  140526. "lsr r7, r7, #16\n\t"
  140527. "mul r6, r7, r6\n\t"
  140528. "lsr r7, r6, #16\n\t"
  140529. "lsl r6, r6, #16\n\t"
  140530. "adds r3, r3, r6\n\t"
  140531. "adcs r4, r4, r7\n\t"
  140532. "adc r5, r5, #0\n\t"
  140533. #else
  140534. "umull r6, r7, %[b], r8\n\t"
  140535. "adds r3, r3, r6\n\t"
  140536. "adcs r4, r4, r7\n\t"
  140537. "adc r5, r5, #0\n\t"
  140538. #endif
  140539. "str r3, [%[r], r9]\n\t"
  140540. "mov r3, r4\n\t"
  140541. "mov r4, r5\n\t"
  140542. "mov r5, #0\n\t"
  140543. "add r9, r9, #4\n\t"
  140544. "cmp r9, #0x80\n\t"
  140545. "blt L_sp_1024_mul_d_32_word_%=\n\t"
  140546. "str r3, [%[r], #128]\n\t"
  140547. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  140548. :
  140549. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "cc"
  140550. );
  140551. }
  140552. #else
  140553. /* Mul a by digit b into r. (r = a * b)
  140554. *
  140555. * r A single precision integer.
  140556. * a A single precision integer.
  140557. * b A single precision digit.
  140558. */
  140559. static void sp_1024_mul_d_32(sp_digit* r_p, const sp_digit* a_p, sp_digit b_p)
  140560. {
  140561. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  140562. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  140563. register sp_digit b asm ("r2") = (sp_digit)b_p;
  140564. __asm__ __volatile__ (
  140565. /* A[0] * B */
  140566. "ldm %[a]!, {r8}\n\t"
  140567. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  140568. "lsl r6, %[b], #16\n\t"
  140569. "lsl r3, r8, #16\n\t"
  140570. "lsr r6, r6, #16\n\t"
  140571. "lsr r3, r3, #16\n\t"
  140572. "mul r3, r6, r3\n\t"
  140573. "lsr r7, r8, #16\n\t"
  140574. "mul r6, r7, r6\n\t"
  140575. "lsr r4, r6, #16\n\t"
  140576. "lsl r6, r6, #16\n\t"
  140577. "adds r3, r3, r6\n\t"
  140578. "adc r4, r4, #0\n\t"
  140579. "lsr r6, %[b], #16\n\t"
  140580. "mul r7, r6, r7\n\t"
  140581. "add r4, r4, r7\n\t"
  140582. "lsl r7, r8, #16\n\t"
  140583. "lsr r7, r7, #16\n\t"
  140584. "mul r6, r7, r6\n\t"
  140585. "lsr r7, r6, #16\n\t"
  140586. "lsl r6, r6, #16\n\t"
  140587. "adds r3, r3, r6\n\t"
  140588. "adc r4, r4, r7\n\t"
  140589. #else
  140590. "umull r3, r4, %[b], r8\n\t"
  140591. #endif
  140592. "stm %[r]!, {r3}\n\t"
  140593. "mov r5, #0\n\t"
  140594. /* A[1] * B */
  140595. "ldm %[a]!, {r8}\n\t"
  140596. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  140597. "lsl r6, %[b], #16\n\t"
  140598. "lsl r7, r8, #16\n\t"
  140599. "lsr r6, r6, #16\n\t"
  140600. "lsr r7, r7, #16\n\t"
  140601. "mul r7, r6, r7\n\t"
  140602. "adds r4, r4, r7\n\t"
  140603. "adc r5, r5, #0\n\t"
  140604. "lsr r7, r8, #16\n\t"
  140605. "mul r6, r7, r6\n\t"
  140606. "lsr r7, r6, #16\n\t"
  140607. "lsl r6, r6, #16\n\t"
  140608. "adds r4, r4, r6\n\t"
  140609. "adc r5, r5, r7\n\t"
  140610. "lsr r6, %[b], #16\n\t"
  140611. "lsr r7, r8, #16\n\t"
  140612. "mul r7, r6, r7\n\t"
  140613. "add r5, r5, r7\n\t"
  140614. "lsl r7, r8, #16\n\t"
  140615. "lsr r7, r7, #16\n\t"
  140616. "mul r6, r7, r6\n\t"
  140617. "lsr r7, r6, #16\n\t"
  140618. "lsl r6, r6, #16\n\t"
  140619. "adds r4, r4, r6\n\t"
  140620. "adc r5, r5, r7\n\t"
  140621. #else
  140622. "umlal r4, r5, %[b], r8\n\t"
  140623. #endif
  140624. "stm %[r]!, {r4}\n\t"
  140625. "mov r3, #0\n\t"
  140626. /* A[2] * B */
  140627. "ldm %[a]!, {r8}\n\t"
  140628. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  140629. "lsl r6, %[b], #16\n\t"
  140630. "lsl r7, r8, #16\n\t"
  140631. "lsr r6, r6, #16\n\t"
  140632. "lsr r7, r7, #16\n\t"
  140633. "mul r7, r6, r7\n\t"
  140634. "adds r5, r5, r7\n\t"
  140635. "adc r3, r3, #0\n\t"
  140636. "lsr r7, r8, #16\n\t"
  140637. "mul r6, r7, r6\n\t"
  140638. "lsr r7, r6, #16\n\t"
  140639. "lsl r6, r6, #16\n\t"
  140640. "adds r5, r5, r6\n\t"
  140641. "adc r3, r3, r7\n\t"
  140642. "lsr r6, %[b], #16\n\t"
  140643. "lsr r7, r8, #16\n\t"
  140644. "mul r7, r6, r7\n\t"
  140645. "add r3, r3, r7\n\t"
  140646. "lsl r7, r8, #16\n\t"
  140647. "lsr r7, r7, #16\n\t"
  140648. "mul r6, r7, r6\n\t"
  140649. "lsr r7, r6, #16\n\t"
  140650. "lsl r6, r6, #16\n\t"
  140651. "adds r5, r5, r6\n\t"
  140652. "adc r3, r3, r7\n\t"
  140653. #else
  140654. "umlal r5, r3, %[b], r8\n\t"
  140655. #endif
  140656. "stm %[r]!, {r5}\n\t"
  140657. "mov r4, #0\n\t"
  140658. /* A[3] * B */
  140659. "ldm %[a]!, {r8}\n\t"
  140660. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  140661. "lsl r6, %[b], #16\n\t"
  140662. "lsl r7, r8, #16\n\t"
  140663. "lsr r6, r6, #16\n\t"
  140664. "lsr r7, r7, #16\n\t"
  140665. "mul r7, r6, r7\n\t"
  140666. "adds r3, r3, r7\n\t"
  140667. "adc r4, r4, #0\n\t"
  140668. "lsr r7, r8, #16\n\t"
  140669. "mul r6, r7, r6\n\t"
  140670. "lsr r7, r6, #16\n\t"
  140671. "lsl r6, r6, #16\n\t"
  140672. "adds r3, r3, r6\n\t"
  140673. "adc r4, r4, r7\n\t"
  140674. "lsr r6, %[b], #16\n\t"
  140675. "lsr r7, r8, #16\n\t"
  140676. "mul r7, r6, r7\n\t"
  140677. "add r4, r4, r7\n\t"
  140678. "lsl r7, r8, #16\n\t"
  140679. "lsr r7, r7, #16\n\t"
  140680. "mul r6, r7, r6\n\t"
  140681. "lsr r7, r6, #16\n\t"
  140682. "lsl r6, r6, #16\n\t"
  140683. "adds r3, r3, r6\n\t"
  140684. "adc r4, r4, r7\n\t"
  140685. #else
  140686. "umlal r3, r4, %[b], r8\n\t"
  140687. #endif
  140688. "stm %[r]!, {r3}\n\t"
  140689. "mov r5, #0\n\t"
  140690. /* A[4] * B */
  140691. "ldm %[a]!, {r8}\n\t"
  140692. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  140693. "lsl r6, %[b], #16\n\t"
  140694. "lsl r7, r8, #16\n\t"
  140695. "lsr r6, r6, #16\n\t"
  140696. "lsr r7, r7, #16\n\t"
  140697. "mul r7, r6, r7\n\t"
  140698. "adds r4, r4, r7\n\t"
  140699. "adc r5, r5, #0\n\t"
  140700. "lsr r7, r8, #16\n\t"
  140701. "mul r6, r7, r6\n\t"
  140702. "lsr r7, r6, #16\n\t"
  140703. "lsl r6, r6, #16\n\t"
  140704. "adds r4, r4, r6\n\t"
  140705. "adc r5, r5, r7\n\t"
  140706. "lsr r6, %[b], #16\n\t"
  140707. "lsr r7, r8, #16\n\t"
  140708. "mul r7, r6, r7\n\t"
  140709. "add r5, r5, r7\n\t"
  140710. "lsl r7, r8, #16\n\t"
  140711. "lsr r7, r7, #16\n\t"
  140712. "mul r6, r7, r6\n\t"
  140713. "lsr r7, r6, #16\n\t"
  140714. "lsl r6, r6, #16\n\t"
  140715. "adds r4, r4, r6\n\t"
  140716. "adc r5, r5, r7\n\t"
  140717. #else
  140718. "umlal r4, r5, %[b], r8\n\t"
  140719. #endif
  140720. "stm %[r]!, {r4}\n\t"
  140721. "mov r3, #0\n\t"
  140722. /* A[5] * B */
  140723. "ldm %[a]!, {r8}\n\t"
  140724. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  140725. "lsl r6, %[b], #16\n\t"
  140726. "lsl r7, r8, #16\n\t"
  140727. "lsr r6, r6, #16\n\t"
  140728. "lsr r7, r7, #16\n\t"
  140729. "mul r7, r6, r7\n\t"
  140730. "adds r5, r5, r7\n\t"
  140731. "adc r3, r3, #0\n\t"
  140732. "lsr r7, r8, #16\n\t"
  140733. "mul r6, r7, r6\n\t"
  140734. "lsr r7, r6, #16\n\t"
  140735. "lsl r6, r6, #16\n\t"
  140736. "adds r5, r5, r6\n\t"
  140737. "adc r3, r3, r7\n\t"
  140738. "lsr r6, %[b], #16\n\t"
  140739. "lsr r7, r8, #16\n\t"
  140740. "mul r7, r6, r7\n\t"
  140741. "add r3, r3, r7\n\t"
  140742. "lsl r7, r8, #16\n\t"
  140743. "lsr r7, r7, #16\n\t"
  140744. "mul r6, r7, r6\n\t"
  140745. "lsr r7, r6, #16\n\t"
  140746. "lsl r6, r6, #16\n\t"
  140747. "adds r5, r5, r6\n\t"
  140748. "adc r3, r3, r7\n\t"
  140749. #else
  140750. "umlal r5, r3, %[b], r8\n\t"
  140751. #endif
  140752. "stm %[r]!, {r5}\n\t"
  140753. "mov r4, #0\n\t"
  140754. /* A[6] * B */
  140755. "ldm %[a]!, {r8}\n\t"
  140756. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  140757. "lsl r6, %[b], #16\n\t"
  140758. "lsl r7, r8, #16\n\t"
  140759. "lsr r6, r6, #16\n\t"
  140760. "lsr r7, r7, #16\n\t"
  140761. "mul r7, r6, r7\n\t"
  140762. "adds r3, r3, r7\n\t"
  140763. "adc r4, r4, #0\n\t"
  140764. "lsr r7, r8, #16\n\t"
  140765. "mul r6, r7, r6\n\t"
  140766. "lsr r7, r6, #16\n\t"
  140767. "lsl r6, r6, #16\n\t"
  140768. "adds r3, r3, r6\n\t"
  140769. "adc r4, r4, r7\n\t"
  140770. "lsr r6, %[b], #16\n\t"
  140771. "lsr r7, r8, #16\n\t"
  140772. "mul r7, r6, r7\n\t"
  140773. "add r4, r4, r7\n\t"
  140774. "lsl r7, r8, #16\n\t"
  140775. "lsr r7, r7, #16\n\t"
  140776. "mul r6, r7, r6\n\t"
  140777. "lsr r7, r6, #16\n\t"
  140778. "lsl r6, r6, #16\n\t"
  140779. "adds r3, r3, r6\n\t"
  140780. "adc r4, r4, r7\n\t"
  140781. #else
  140782. "umlal r3, r4, %[b], r8\n\t"
  140783. #endif
  140784. "stm %[r]!, {r3}\n\t"
  140785. "mov r5, #0\n\t"
  140786. /* A[7] * B */
  140787. "ldm %[a]!, {r8}\n\t"
  140788. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  140789. "lsl r6, %[b], #16\n\t"
  140790. "lsl r7, r8, #16\n\t"
  140791. "lsr r6, r6, #16\n\t"
  140792. "lsr r7, r7, #16\n\t"
  140793. "mul r7, r6, r7\n\t"
  140794. "adds r4, r4, r7\n\t"
  140795. "adc r5, r5, #0\n\t"
  140796. "lsr r7, r8, #16\n\t"
  140797. "mul r6, r7, r6\n\t"
  140798. "lsr r7, r6, #16\n\t"
  140799. "lsl r6, r6, #16\n\t"
  140800. "adds r4, r4, r6\n\t"
  140801. "adc r5, r5, r7\n\t"
  140802. "lsr r6, %[b], #16\n\t"
  140803. "lsr r7, r8, #16\n\t"
  140804. "mul r7, r6, r7\n\t"
  140805. "add r5, r5, r7\n\t"
  140806. "lsl r7, r8, #16\n\t"
  140807. "lsr r7, r7, #16\n\t"
  140808. "mul r6, r7, r6\n\t"
  140809. "lsr r7, r6, #16\n\t"
  140810. "lsl r6, r6, #16\n\t"
  140811. "adds r4, r4, r6\n\t"
  140812. "adc r5, r5, r7\n\t"
  140813. #else
  140814. "umlal r4, r5, %[b], r8\n\t"
  140815. #endif
  140816. "stm %[r]!, {r4}\n\t"
  140817. "mov r3, #0\n\t"
  140818. /* A[8] * B */
  140819. "ldm %[a]!, {r8}\n\t"
  140820. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  140821. "lsl r6, %[b], #16\n\t"
  140822. "lsl r7, r8, #16\n\t"
  140823. "lsr r6, r6, #16\n\t"
  140824. "lsr r7, r7, #16\n\t"
  140825. "mul r7, r6, r7\n\t"
  140826. "adds r5, r5, r7\n\t"
  140827. "adc r3, r3, #0\n\t"
  140828. "lsr r7, r8, #16\n\t"
  140829. "mul r6, r7, r6\n\t"
  140830. "lsr r7, r6, #16\n\t"
  140831. "lsl r6, r6, #16\n\t"
  140832. "adds r5, r5, r6\n\t"
  140833. "adc r3, r3, r7\n\t"
  140834. "lsr r6, %[b], #16\n\t"
  140835. "lsr r7, r8, #16\n\t"
  140836. "mul r7, r6, r7\n\t"
  140837. "add r3, r3, r7\n\t"
  140838. "lsl r7, r8, #16\n\t"
  140839. "lsr r7, r7, #16\n\t"
  140840. "mul r6, r7, r6\n\t"
  140841. "lsr r7, r6, #16\n\t"
  140842. "lsl r6, r6, #16\n\t"
  140843. "adds r5, r5, r6\n\t"
  140844. "adc r3, r3, r7\n\t"
  140845. #else
  140846. "umlal r5, r3, %[b], r8\n\t"
  140847. #endif
  140848. "stm %[r]!, {r5}\n\t"
  140849. "mov r4, #0\n\t"
  140850. /* A[9] * B */
  140851. "ldm %[a]!, {r8}\n\t"
  140852. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  140853. "lsl r6, %[b], #16\n\t"
  140854. "lsl r7, r8, #16\n\t"
  140855. "lsr r6, r6, #16\n\t"
  140856. "lsr r7, r7, #16\n\t"
  140857. "mul r7, r6, r7\n\t"
  140858. "adds r3, r3, r7\n\t"
  140859. "adc r4, r4, #0\n\t"
  140860. "lsr r7, r8, #16\n\t"
  140861. "mul r6, r7, r6\n\t"
  140862. "lsr r7, r6, #16\n\t"
  140863. "lsl r6, r6, #16\n\t"
  140864. "adds r3, r3, r6\n\t"
  140865. "adc r4, r4, r7\n\t"
  140866. "lsr r6, %[b], #16\n\t"
  140867. "lsr r7, r8, #16\n\t"
  140868. "mul r7, r6, r7\n\t"
  140869. "add r4, r4, r7\n\t"
  140870. "lsl r7, r8, #16\n\t"
  140871. "lsr r7, r7, #16\n\t"
  140872. "mul r6, r7, r6\n\t"
  140873. "lsr r7, r6, #16\n\t"
  140874. "lsl r6, r6, #16\n\t"
  140875. "adds r3, r3, r6\n\t"
  140876. "adc r4, r4, r7\n\t"
  140877. #else
  140878. "umlal r3, r4, %[b], r8\n\t"
  140879. #endif
  140880. "stm %[r]!, {r3}\n\t"
  140881. "mov r5, #0\n\t"
  140882. /* A[10] * B */
  140883. "ldm %[a]!, {r8}\n\t"
  140884. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  140885. "lsl r6, %[b], #16\n\t"
  140886. "lsl r7, r8, #16\n\t"
  140887. "lsr r6, r6, #16\n\t"
  140888. "lsr r7, r7, #16\n\t"
  140889. "mul r7, r6, r7\n\t"
  140890. "adds r4, r4, r7\n\t"
  140891. "adc r5, r5, #0\n\t"
  140892. "lsr r7, r8, #16\n\t"
  140893. "mul r6, r7, r6\n\t"
  140894. "lsr r7, r6, #16\n\t"
  140895. "lsl r6, r6, #16\n\t"
  140896. "adds r4, r4, r6\n\t"
  140897. "adc r5, r5, r7\n\t"
  140898. "lsr r6, %[b], #16\n\t"
  140899. "lsr r7, r8, #16\n\t"
  140900. "mul r7, r6, r7\n\t"
  140901. "add r5, r5, r7\n\t"
  140902. "lsl r7, r8, #16\n\t"
  140903. "lsr r7, r7, #16\n\t"
  140904. "mul r6, r7, r6\n\t"
  140905. "lsr r7, r6, #16\n\t"
  140906. "lsl r6, r6, #16\n\t"
  140907. "adds r4, r4, r6\n\t"
  140908. "adc r5, r5, r7\n\t"
  140909. #else
  140910. "umlal r4, r5, %[b], r8\n\t"
  140911. #endif
  140912. "stm %[r]!, {r4}\n\t"
  140913. "mov r3, #0\n\t"
  140914. /* A[11] * B */
  140915. "ldm %[a]!, {r8}\n\t"
  140916. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  140917. "lsl r6, %[b], #16\n\t"
  140918. "lsl r7, r8, #16\n\t"
  140919. "lsr r6, r6, #16\n\t"
  140920. "lsr r7, r7, #16\n\t"
  140921. "mul r7, r6, r7\n\t"
  140922. "adds r5, r5, r7\n\t"
  140923. "adc r3, r3, #0\n\t"
  140924. "lsr r7, r8, #16\n\t"
  140925. "mul r6, r7, r6\n\t"
  140926. "lsr r7, r6, #16\n\t"
  140927. "lsl r6, r6, #16\n\t"
  140928. "adds r5, r5, r6\n\t"
  140929. "adc r3, r3, r7\n\t"
  140930. "lsr r6, %[b], #16\n\t"
  140931. "lsr r7, r8, #16\n\t"
  140932. "mul r7, r6, r7\n\t"
  140933. "add r3, r3, r7\n\t"
  140934. "lsl r7, r8, #16\n\t"
  140935. "lsr r7, r7, #16\n\t"
  140936. "mul r6, r7, r6\n\t"
  140937. "lsr r7, r6, #16\n\t"
  140938. "lsl r6, r6, #16\n\t"
  140939. "adds r5, r5, r6\n\t"
  140940. "adc r3, r3, r7\n\t"
  140941. #else
  140942. "umlal r5, r3, %[b], r8\n\t"
  140943. #endif
  140944. "stm %[r]!, {r5}\n\t"
  140945. "mov r4, #0\n\t"
  140946. /* A[12] * B */
  140947. "ldm %[a]!, {r8}\n\t"
  140948. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  140949. "lsl r6, %[b], #16\n\t"
  140950. "lsl r7, r8, #16\n\t"
  140951. "lsr r6, r6, #16\n\t"
  140952. "lsr r7, r7, #16\n\t"
  140953. "mul r7, r6, r7\n\t"
  140954. "adds r3, r3, r7\n\t"
  140955. "adc r4, r4, #0\n\t"
  140956. "lsr r7, r8, #16\n\t"
  140957. "mul r6, r7, r6\n\t"
  140958. "lsr r7, r6, #16\n\t"
  140959. "lsl r6, r6, #16\n\t"
  140960. "adds r3, r3, r6\n\t"
  140961. "adc r4, r4, r7\n\t"
  140962. "lsr r6, %[b], #16\n\t"
  140963. "lsr r7, r8, #16\n\t"
  140964. "mul r7, r6, r7\n\t"
  140965. "add r4, r4, r7\n\t"
  140966. "lsl r7, r8, #16\n\t"
  140967. "lsr r7, r7, #16\n\t"
  140968. "mul r6, r7, r6\n\t"
  140969. "lsr r7, r6, #16\n\t"
  140970. "lsl r6, r6, #16\n\t"
  140971. "adds r3, r3, r6\n\t"
  140972. "adc r4, r4, r7\n\t"
  140973. #else
  140974. "umlal r3, r4, %[b], r8\n\t"
  140975. #endif
  140976. "stm %[r]!, {r3}\n\t"
  140977. "mov r5, #0\n\t"
  140978. /* A[13] * B */
  140979. "ldm %[a]!, {r8}\n\t"
  140980. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  140981. "lsl r6, %[b], #16\n\t"
  140982. "lsl r7, r8, #16\n\t"
  140983. "lsr r6, r6, #16\n\t"
  140984. "lsr r7, r7, #16\n\t"
  140985. "mul r7, r6, r7\n\t"
  140986. "adds r4, r4, r7\n\t"
  140987. "adc r5, r5, #0\n\t"
  140988. "lsr r7, r8, #16\n\t"
  140989. "mul r6, r7, r6\n\t"
  140990. "lsr r7, r6, #16\n\t"
  140991. "lsl r6, r6, #16\n\t"
  140992. "adds r4, r4, r6\n\t"
  140993. "adc r5, r5, r7\n\t"
  140994. "lsr r6, %[b], #16\n\t"
  140995. "lsr r7, r8, #16\n\t"
  140996. "mul r7, r6, r7\n\t"
  140997. "add r5, r5, r7\n\t"
  140998. "lsl r7, r8, #16\n\t"
  140999. "lsr r7, r7, #16\n\t"
  141000. "mul r6, r7, r6\n\t"
  141001. "lsr r7, r6, #16\n\t"
  141002. "lsl r6, r6, #16\n\t"
  141003. "adds r4, r4, r6\n\t"
  141004. "adc r5, r5, r7\n\t"
  141005. #else
  141006. "umlal r4, r5, %[b], r8\n\t"
  141007. #endif
  141008. "stm %[r]!, {r4}\n\t"
  141009. "mov r3, #0\n\t"
  141010. /* A[14] * B */
  141011. "ldm %[a]!, {r8}\n\t"
  141012. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  141013. "lsl r6, %[b], #16\n\t"
  141014. "lsl r7, r8, #16\n\t"
  141015. "lsr r6, r6, #16\n\t"
  141016. "lsr r7, r7, #16\n\t"
  141017. "mul r7, r6, r7\n\t"
  141018. "adds r5, r5, r7\n\t"
  141019. "adc r3, r3, #0\n\t"
  141020. "lsr r7, r8, #16\n\t"
  141021. "mul r6, r7, r6\n\t"
  141022. "lsr r7, r6, #16\n\t"
  141023. "lsl r6, r6, #16\n\t"
  141024. "adds r5, r5, r6\n\t"
  141025. "adc r3, r3, r7\n\t"
  141026. "lsr r6, %[b], #16\n\t"
  141027. "lsr r7, r8, #16\n\t"
  141028. "mul r7, r6, r7\n\t"
  141029. "add r3, r3, r7\n\t"
  141030. "lsl r7, r8, #16\n\t"
  141031. "lsr r7, r7, #16\n\t"
  141032. "mul r6, r7, r6\n\t"
  141033. "lsr r7, r6, #16\n\t"
  141034. "lsl r6, r6, #16\n\t"
  141035. "adds r5, r5, r6\n\t"
  141036. "adc r3, r3, r7\n\t"
  141037. #else
  141038. "umlal r5, r3, %[b], r8\n\t"
  141039. #endif
  141040. "stm %[r]!, {r5}\n\t"
  141041. "mov r4, #0\n\t"
  141042. /* A[15] * B */
  141043. "ldm %[a]!, {r8}\n\t"
  141044. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  141045. "lsl r6, %[b], #16\n\t"
  141046. "lsl r7, r8, #16\n\t"
  141047. "lsr r6, r6, #16\n\t"
  141048. "lsr r7, r7, #16\n\t"
  141049. "mul r7, r6, r7\n\t"
  141050. "adds r3, r3, r7\n\t"
  141051. "adc r4, r4, #0\n\t"
  141052. "lsr r7, r8, #16\n\t"
  141053. "mul r6, r7, r6\n\t"
  141054. "lsr r7, r6, #16\n\t"
  141055. "lsl r6, r6, #16\n\t"
  141056. "adds r3, r3, r6\n\t"
  141057. "adc r4, r4, r7\n\t"
  141058. "lsr r6, %[b], #16\n\t"
  141059. "lsr r7, r8, #16\n\t"
  141060. "mul r7, r6, r7\n\t"
  141061. "add r4, r4, r7\n\t"
  141062. "lsl r7, r8, #16\n\t"
  141063. "lsr r7, r7, #16\n\t"
  141064. "mul r6, r7, r6\n\t"
  141065. "lsr r7, r6, #16\n\t"
  141066. "lsl r6, r6, #16\n\t"
  141067. "adds r3, r3, r6\n\t"
  141068. "adc r4, r4, r7\n\t"
  141069. #else
  141070. "umlal r3, r4, %[b], r8\n\t"
  141071. #endif
  141072. "stm %[r]!, {r3}\n\t"
  141073. "mov r5, #0\n\t"
  141074. /* A[16] * B */
  141075. "ldm %[a]!, {r8}\n\t"
  141076. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  141077. "lsl r6, %[b], #16\n\t"
  141078. "lsl r7, r8, #16\n\t"
  141079. "lsr r6, r6, #16\n\t"
  141080. "lsr r7, r7, #16\n\t"
  141081. "mul r7, r6, r7\n\t"
  141082. "adds r4, r4, r7\n\t"
  141083. "adc r5, r5, #0\n\t"
  141084. "lsr r7, r8, #16\n\t"
  141085. "mul r6, r7, r6\n\t"
  141086. "lsr r7, r6, #16\n\t"
  141087. "lsl r6, r6, #16\n\t"
  141088. "adds r4, r4, r6\n\t"
  141089. "adc r5, r5, r7\n\t"
  141090. "lsr r6, %[b], #16\n\t"
  141091. "lsr r7, r8, #16\n\t"
  141092. "mul r7, r6, r7\n\t"
  141093. "add r5, r5, r7\n\t"
  141094. "lsl r7, r8, #16\n\t"
  141095. "lsr r7, r7, #16\n\t"
  141096. "mul r6, r7, r6\n\t"
  141097. "lsr r7, r6, #16\n\t"
  141098. "lsl r6, r6, #16\n\t"
  141099. "adds r4, r4, r6\n\t"
  141100. "adc r5, r5, r7\n\t"
  141101. #else
  141102. "umlal r4, r5, %[b], r8\n\t"
  141103. #endif
  141104. "stm %[r]!, {r4}\n\t"
  141105. "mov r3, #0\n\t"
  141106. /* A[17] * B */
  141107. "ldm %[a]!, {r8}\n\t"
  141108. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  141109. "lsl r6, %[b], #16\n\t"
  141110. "lsl r7, r8, #16\n\t"
  141111. "lsr r6, r6, #16\n\t"
  141112. "lsr r7, r7, #16\n\t"
  141113. "mul r7, r6, r7\n\t"
  141114. "adds r5, r5, r7\n\t"
  141115. "adc r3, r3, #0\n\t"
  141116. "lsr r7, r8, #16\n\t"
  141117. "mul r6, r7, r6\n\t"
  141118. "lsr r7, r6, #16\n\t"
  141119. "lsl r6, r6, #16\n\t"
  141120. "adds r5, r5, r6\n\t"
  141121. "adc r3, r3, r7\n\t"
  141122. "lsr r6, %[b], #16\n\t"
  141123. "lsr r7, r8, #16\n\t"
  141124. "mul r7, r6, r7\n\t"
  141125. "add r3, r3, r7\n\t"
  141126. "lsl r7, r8, #16\n\t"
  141127. "lsr r7, r7, #16\n\t"
  141128. "mul r6, r7, r6\n\t"
  141129. "lsr r7, r6, #16\n\t"
  141130. "lsl r6, r6, #16\n\t"
  141131. "adds r5, r5, r6\n\t"
  141132. "adc r3, r3, r7\n\t"
  141133. #else
  141134. "umlal r5, r3, %[b], r8\n\t"
  141135. #endif
  141136. "stm %[r]!, {r5}\n\t"
  141137. "mov r4, #0\n\t"
  141138. /* A[18] * B */
  141139. "ldm %[a]!, {r8}\n\t"
  141140. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  141141. "lsl r6, %[b], #16\n\t"
  141142. "lsl r7, r8, #16\n\t"
  141143. "lsr r6, r6, #16\n\t"
  141144. "lsr r7, r7, #16\n\t"
  141145. "mul r7, r6, r7\n\t"
  141146. "adds r3, r3, r7\n\t"
  141147. "adc r4, r4, #0\n\t"
  141148. "lsr r7, r8, #16\n\t"
  141149. "mul r6, r7, r6\n\t"
  141150. "lsr r7, r6, #16\n\t"
  141151. "lsl r6, r6, #16\n\t"
  141152. "adds r3, r3, r6\n\t"
  141153. "adc r4, r4, r7\n\t"
  141154. "lsr r6, %[b], #16\n\t"
  141155. "lsr r7, r8, #16\n\t"
  141156. "mul r7, r6, r7\n\t"
  141157. "add r4, r4, r7\n\t"
  141158. "lsl r7, r8, #16\n\t"
  141159. "lsr r7, r7, #16\n\t"
  141160. "mul r6, r7, r6\n\t"
  141161. "lsr r7, r6, #16\n\t"
  141162. "lsl r6, r6, #16\n\t"
  141163. "adds r3, r3, r6\n\t"
  141164. "adc r4, r4, r7\n\t"
  141165. #else
  141166. "umlal r3, r4, %[b], r8\n\t"
  141167. #endif
  141168. "stm %[r]!, {r3}\n\t"
  141169. "mov r5, #0\n\t"
  141170. /* A[19] * B */
  141171. "ldm %[a]!, {r8}\n\t"
  141172. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  141173. "lsl r6, %[b], #16\n\t"
  141174. "lsl r7, r8, #16\n\t"
  141175. "lsr r6, r6, #16\n\t"
  141176. "lsr r7, r7, #16\n\t"
  141177. "mul r7, r6, r7\n\t"
  141178. "adds r4, r4, r7\n\t"
  141179. "adc r5, r5, #0\n\t"
  141180. "lsr r7, r8, #16\n\t"
  141181. "mul r6, r7, r6\n\t"
  141182. "lsr r7, r6, #16\n\t"
  141183. "lsl r6, r6, #16\n\t"
  141184. "adds r4, r4, r6\n\t"
  141185. "adc r5, r5, r7\n\t"
  141186. "lsr r6, %[b], #16\n\t"
  141187. "lsr r7, r8, #16\n\t"
  141188. "mul r7, r6, r7\n\t"
  141189. "add r5, r5, r7\n\t"
  141190. "lsl r7, r8, #16\n\t"
  141191. "lsr r7, r7, #16\n\t"
  141192. "mul r6, r7, r6\n\t"
  141193. "lsr r7, r6, #16\n\t"
  141194. "lsl r6, r6, #16\n\t"
  141195. "adds r4, r4, r6\n\t"
  141196. "adc r5, r5, r7\n\t"
  141197. #else
  141198. "umlal r4, r5, %[b], r8\n\t"
  141199. #endif
  141200. "stm %[r]!, {r4}\n\t"
  141201. "mov r3, #0\n\t"
  141202. /* A[20] * B */
  141203. "ldm %[a]!, {r8}\n\t"
  141204. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  141205. "lsl r6, %[b], #16\n\t"
  141206. "lsl r7, r8, #16\n\t"
  141207. "lsr r6, r6, #16\n\t"
  141208. "lsr r7, r7, #16\n\t"
  141209. "mul r7, r6, r7\n\t"
  141210. "adds r5, r5, r7\n\t"
  141211. "adc r3, r3, #0\n\t"
  141212. "lsr r7, r8, #16\n\t"
  141213. "mul r6, r7, r6\n\t"
  141214. "lsr r7, r6, #16\n\t"
  141215. "lsl r6, r6, #16\n\t"
  141216. "adds r5, r5, r6\n\t"
  141217. "adc r3, r3, r7\n\t"
  141218. "lsr r6, %[b], #16\n\t"
  141219. "lsr r7, r8, #16\n\t"
  141220. "mul r7, r6, r7\n\t"
  141221. "add r3, r3, r7\n\t"
  141222. "lsl r7, r8, #16\n\t"
  141223. "lsr r7, r7, #16\n\t"
  141224. "mul r6, r7, r6\n\t"
  141225. "lsr r7, r6, #16\n\t"
  141226. "lsl r6, r6, #16\n\t"
  141227. "adds r5, r5, r6\n\t"
  141228. "adc r3, r3, r7\n\t"
  141229. #else
  141230. "umlal r5, r3, %[b], r8\n\t"
  141231. #endif
  141232. "stm %[r]!, {r5}\n\t"
  141233. "mov r4, #0\n\t"
  141234. /* A[21] * B */
  141235. "ldm %[a]!, {r8}\n\t"
  141236. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  141237. "lsl r6, %[b], #16\n\t"
  141238. "lsl r7, r8, #16\n\t"
  141239. "lsr r6, r6, #16\n\t"
  141240. "lsr r7, r7, #16\n\t"
  141241. "mul r7, r6, r7\n\t"
  141242. "adds r3, r3, r7\n\t"
  141243. "adc r4, r4, #0\n\t"
  141244. "lsr r7, r8, #16\n\t"
  141245. "mul r6, r7, r6\n\t"
  141246. "lsr r7, r6, #16\n\t"
  141247. "lsl r6, r6, #16\n\t"
  141248. "adds r3, r3, r6\n\t"
  141249. "adc r4, r4, r7\n\t"
  141250. "lsr r6, %[b], #16\n\t"
  141251. "lsr r7, r8, #16\n\t"
  141252. "mul r7, r6, r7\n\t"
  141253. "add r4, r4, r7\n\t"
  141254. "lsl r7, r8, #16\n\t"
  141255. "lsr r7, r7, #16\n\t"
  141256. "mul r6, r7, r6\n\t"
  141257. "lsr r7, r6, #16\n\t"
  141258. "lsl r6, r6, #16\n\t"
  141259. "adds r3, r3, r6\n\t"
  141260. "adc r4, r4, r7\n\t"
  141261. #else
  141262. "umlal r3, r4, %[b], r8\n\t"
  141263. #endif
  141264. "stm %[r]!, {r3}\n\t"
  141265. "mov r5, #0\n\t"
  141266. /* A[22] * B */
  141267. "ldm %[a]!, {r8}\n\t"
  141268. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  141269. "lsl r6, %[b], #16\n\t"
  141270. "lsl r7, r8, #16\n\t"
  141271. "lsr r6, r6, #16\n\t"
  141272. "lsr r7, r7, #16\n\t"
  141273. "mul r7, r6, r7\n\t"
  141274. "adds r4, r4, r7\n\t"
  141275. "adc r5, r5, #0\n\t"
  141276. "lsr r7, r8, #16\n\t"
  141277. "mul r6, r7, r6\n\t"
  141278. "lsr r7, r6, #16\n\t"
  141279. "lsl r6, r6, #16\n\t"
  141280. "adds r4, r4, r6\n\t"
  141281. "adc r5, r5, r7\n\t"
  141282. "lsr r6, %[b], #16\n\t"
  141283. "lsr r7, r8, #16\n\t"
  141284. "mul r7, r6, r7\n\t"
  141285. "add r5, r5, r7\n\t"
  141286. "lsl r7, r8, #16\n\t"
  141287. "lsr r7, r7, #16\n\t"
  141288. "mul r6, r7, r6\n\t"
  141289. "lsr r7, r6, #16\n\t"
  141290. "lsl r6, r6, #16\n\t"
  141291. "adds r4, r4, r6\n\t"
  141292. "adc r5, r5, r7\n\t"
  141293. #else
  141294. "umlal r4, r5, %[b], r8\n\t"
  141295. #endif
  141296. "stm %[r]!, {r4}\n\t"
  141297. "mov r3, #0\n\t"
  141298. /* A[23] * B */
  141299. "ldm %[a]!, {r8}\n\t"
  141300. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  141301. "lsl r6, %[b], #16\n\t"
  141302. "lsl r7, r8, #16\n\t"
  141303. "lsr r6, r6, #16\n\t"
  141304. "lsr r7, r7, #16\n\t"
  141305. "mul r7, r6, r7\n\t"
  141306. "adds r5, r5, r7\n\t"
  141307. "adc r3, r3, #0\n\t"
  141308. "lsr r7, r8, #16\n\t"
  141309. "mul r6, r7, r6\n\t"
  141310. "lsr r7, r6, #16\n\t"
  141311. "lsl r6, r6, #16\n\t"
  141312. "adds r5, r5, r6\n\t"
  141313. "adc r3, r3, r7\n\t"
  141314. "lsr r6, %[b], #16\n\t"
  141315. "lsr r7, r8, #16\n\t"
  141316. "mul r7, r6, r7\n\t"
  141317. "add r3, r3, r7\n\t"
  141318. "lsl r7, r8, #16\n\t"
  141319. "lsr r7, r7, #16\n\t"
  141320. "mul r6, r7, r6\n\t"
  141321. "lsr r7, r6, #16\n\t"
  141322. "lsl r6, r6, #16\n\t"
  141323. "adds r5, r5, r6\n\t"
  141324. "adc r3, r3, r7\n\t"
  141325. #else
  141326. "umlal r5, r3, %[b], r8\n\t"
  141327. #endif
  141328. "stm %[r]!, {r5}\n\t"
  141329. "mov r4, #0\n\t"
  141330. /* A[24] * B */
  141331. "ldm %[a]!, {r8}\n\t"
  141332. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  141333. "lsl r6, %[b], #16\n\t"
  141334. "lsl r7, r8, #16\n\t"
  141335. "lsr r6, r6, #16\n\t"
  141336. "lsr r7, r7, #16\n\t"
  141337. "mul r7, r6, r7\n\t"
  141338. "adds r3, r3, r7\n\t"
  141339. "adc r4, r4, #0\n\t"
  141340. "lsr r7, r8, #16\n\t"
  141341. "mul r6, r7, r6\n\t"
  141342. "lsr r7, r6, #16\n\t"
  141343. "lsl r6, r6, #16\n\t"
  141344. "adds r3, r3, r6\n\t"
  141345. "adc r4, r4, r7\n\t"
  141346. "lsr r6, %[b], #16\n\t"
  141347. "lsr r7, r8, #16\n\t"
  141348. "mul r7, r6, r7\n\t"
  141349. "add r4, r4, r7\n\t"
  141350. "lsl r7, r8, #16\n\t"
  141351. "lsr r7, r7, #16\n\t"
  141352. "mul r6, r7, r6\n\t"
  141353. "lsr r7, r6, #16\n\t"
  141354. "lsl r6, r6, #16\n\t"
  141355. "adds r3, r3, r6\n\t"
  141356. "adc r4, r4, r7\n\t"
  141357. #else
  141358. "umlal r3, r4, %[b], r8\n\t"
  141359. #endif
  141360. "stm %[r]!, {r3}\n\t"
  141361. "mov r5, #0\n\t"
  141362. /* A[25] * B */
  141363. "ldm %[a]!, {r8}\n\t"
  141364. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  141365. "lsl r6, %[b], #16\n\t"
  141366. "lsl r7, r8, #16\n\t"
  141367. "lsr r6, r6, #16\n\t"
  141368. "lsr r7, r7, #16\n\t"
  141369. "mul r7, r6, r7\n\t"
  141370. "adds r4, r4, r7\n\t"
  141371. "adc r5, r5, #0\n\t"
  141372. "lsr r7, r8, #16\n\t"
  141373. "mul r6, r7, r6\n\t"
  141374. "lsr r7, r6, #16\n\t"
  141375. "lsl r6, r6, #16\n\t"
  141376. "adds r4, r4, r6\n\t"
  141377. "adc r5, r5, r7\n\t"
  141378. "lsr r6, %[b], #16\n\t"
  141379. "lsr r7, r8, #16\n\t"
  141380. "mul r7, r6, r7\n\t"
  141381. "add r5, r5, r7\n\t"
  141382. "lsl r7, r8, #16\n\t"
  141383. "lsr r7, r7, #16\n\t"
  141384. "mul r6, r7, r6\n\t"
  141385. "lsr r7, r6, #16\n\t"
  141386. "lsl r6, r6, #16\n\t"
  141387. "adds r4, r4, r6\n\t"
  141388. "adc r5, r5, r7\n\t"
  141389. #else
  141390. "umlal r4, r5, %[b], r8\n\t"
  141391. #endif
  141392. "stm %[r]!, {r4}\n\t"
  141393. "mov r3, #0\n\t"
  141394. /* A[26] * B */
  141395. "ldm %[a]!, {r8}\n\t"
  141396. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  141397. "lsl r6, %[b], #16\n\t"
  141398. "lsl r7, r8, #16\n\t"
  141399. "lsr r6, r6, #16\n\t"
  141400. "lsr r7, r7, #16\n\t"
  141401. "mul r7, r6, r7\n\t"
  141402. "adds r5, r5, r7\n\t"
  141403. "adc r3, r3, #0\n\t"
  141404. "lsr r7, r8, #16\n\t"
  141405. "mul r6, r7, r6\n\t"
  141406. "lsr r7, r6, #16\n\t"
  141407. "lsl r6, r6, #16\n\t"
  141408. "adds r5, r5, r6\n\t"
  141409. "adc r3, r3, r7\n\t"
  141410. "lsr r6, %[b], #16\n\t"
  141411. "lsr r7, r8, #16\n\t"
  141412. "mul r7, r6, r7\n\t"
  141413. "add r3, r3, r7\n\t"
  141414. "lsl r7, r8, #16\n\t"
  141415. "lsr r7, r7, #16\n\t"
  141416. "mul r6, r7, r6\n\t"
  141417. "lsr r7, r6, #16\n\t"
  141418. "lsl r6, r6, #16\n\t"
  141419. "adds r5, r5, r6\n\t"
  141420. "adc r3, r3, r7\n\t"
  141421. #else
  141422. "umlal r5, r3, %[b], r8\n\t"
  141423. #endif
  141424. "stm %[r]!, {r5}\n\t"
  141425. "mov r4, #0\n\t"
  141426. /* A[27] * B */
  141427. "ldm %[a]!, {r8}\n\t"
  141428. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  141429. "lsl r6, %[b], #16\n\t"
  141430. "lsl r7, r8, #16\n\t"
  141431. "lsr r6, r6, #16\n\t"
  141432. "lsr r7, r7, #16\n\t"
  141433. "mul r7, r6, r7\n\t"
  141434. "adds r3, r3, r7\n\t"
  141435. "adc r4, r4, #0\n\t"
  141436. "lsr r7, r8, #16\n\t"
  141437. "mul r6, r7, r6\n\t"
  141438. "lsr r7, r6, #16\n\t"
  141439. "lsl r6, r6, #16\n\t"
  141440. "adds r3, r3, r6\n\t"
  141441. "adc r4, r4, r7\n\t"
  141442. "lsr r6, %[b], #16\n\t"
  141443. "lsr r7, r8, #16\n\t"
  141444. "mul r7, r6, r7\n\t"
  141445. "add r4, r4, r7\n\t"
  141446. "lsl r7, r8, #16\n\t"
  141447. "lsr r7, r7, #16\n\t"
  141448. "mul r6, r7, r6\n\t"
  141449. "lsr r7, r6, #16\n\t"
  141450. "lsl r6, r6, #16\n\t"
  141451. "adds r3, r3, r6\n\t"
  141452. "adc r4, r4, r7\n\t"
  141453. #else
  141454. "umlal r3, r4, %[b], r8\n\t"
  141455. #endif
  141456. "stm %[r]!, {r3}\n\t"
  141457. "mov r5, #0\n\t"
  141458. /* A[28] * B */
  141459. "ldm %[a]!, {r8}\n\t"
  141460. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  141461. "lsl r6, %[b], #16\n\t"
  141462. "lsl r7, r8, #16\n\t"
  141463. "lsr r6, r6, #16\n\t"
  141464. "lsr r7, r7, #16\n\t"
  141465. "mul r7, r6, r7\n\t"
  141466. "adds r4, r4, r7\n\t"
  141467. "adc r5, r5, #0\n\t"
  141468. "lsr r7, r8, #16\n\t"
  141469. "mul r6, r7, r6\n\t"
  141470. "lsr r7, r6, #16\n\t"
  141471. "lsl r6, r6, #16\n\t"
  141472. "adds r4, r4, r6\n\t"
  141473. "adc r5, r5, r7\n\t"
  141474. "lsr r6, %[b], #16\n\t"
  141475. "lsr r7, r8, #16\n\t"
  141476. "mul r7, r6, r7\n\t"
  141477. "add r5, r5, r7\n\t"
  141478. "lsl r7, r8, #16\n\t"
  141479. "lsr r7, r7, #16\n\t"
  141480. "mul r6, r7, r6\n\t"
  141481. "lsr r7, r6, #16\n\t"
  141482. "lsl r6, r6, #16\n\t"
  141483. "adds r4, r4, r6\n\t"
  141484. "adc r5, r5, r7\n\t"
  141485. #else
  141486. "umlal r4, r5, %[b], r8\n\t"
  141487. #endif
  141488. "stm %[r]!, {r4}\n\t"
  141489. "mov r3, #0\n\t"
  141490. /* A[29] * B */
  141491. "ldm %[a]!, {r8}\n\t"
  141492. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  141493. "lsl r6, %[b], #16\n\t"
  141494. "lsl r7, r8, #16\n\t"
  141495. "lsr r6, r6, #16\n\t"
  141496. "lsr r7, r7, #16\n\t"
  141497. "mul r7, r6, r7\n\t"
  141498. "adds r5, r5, r7\n\t"
  141499. "adc r3, r3, #0\n\t"
  141500. "lsr r7, r8, #16\n\t"
  141501. "mul r6, r7, r6\n\t"
  141502. "lsr r7, r6, #16\n\t"
  141503. "lsl r6, r6, #16\n\t"
  141504. "adds r5, r5, r6\n\t"
  141505. "adc r3, r3, r7\n\t"
  141506. "lsr r6, %[b], #16\n\t"
  141507. "lsr r7, r8, #16\n\t"
  141508. "mul r7, r6, r7\n\t"
  141509. "add r3, r3, r7\n\t"
  141510. "lsl r7, r8, #16\n\t"
  141511. "lsr r7, r7, #16\n\t"
  141512. "mul r6, r7, r6\n\t"
  141513. "lsr r7, r6, #16\n\t"
  141514. "lsl r6, r6, #16\n\t"
  141515. "adds r5, r5, r6\n\t"
  141516. "adc r3, r3, r7\n\t"
  141517. #else
  141518. "umlal r5, r3, %[b], r8\n\t"
  141519. #endif
  141520. "stm %[r]!, {r5}\n\t"
  141521. "mov r4, #0\n\t"
  141522. /* A[30] * B */
  141523. "ldm %[a]!, {r8}\n\t"
  141524. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  141525. "lsl r6, %[b], #16\n\t"
  141526. "lsl r7, r8, #16\n\t"
  141527. "lsr r6, r6, #16\n\t"
  141528. "lsr r7, r7, #16\n\t"
  141529. "mul r7, r6, r7\n\t"
  141530. "adds r3, r3, r7\n\t"
  141531. "adc r4, r4, #0\n\t"
  141532. "lsr r7, r8, #16\n\t"
  141533. "mul r6, r7, r6\n\t"
  141534. "lsr r7, r6, #16\n\t"
  141535. "lsl r6, r6, #16\n\t"
  141536. "adds r3, r3, r6\n\t"
  141537. "adc r4, r4, r7\n\t"
  141538. "lsr r6, %[b], #16\n\t"
  141539. "lsr r7, r8, #16\n\t"
  141540. "mul r7, r6, r7\n\t"
  141541. "add r4, r4, r7\n\t"
  141542. "lsl r7, r8, #16\n\t"
  141543. "lsr r7, r7, #16\n\t"
  141544. "mul r6, r7, r6\n\t"
  141545. "lsr r7, r6, #16\n\t"
  141546. "lsl r6, r6, #16\n\t"
  141547. "adds r3, r3, r6\n\t"
  141548. "adc r4, r4, r7\n\t"
  141549. #else
  141550. "umlal r3, r4, %[b], r8\n\t"
  141551. #endif
  141552. "stm %[r]!, {r3}\n\t"
  141553. "mov r5, #0\n\t"
  141554. /* A[31] * B */
  141555. "ldm %[a]!, {r8}\n\t"
  141556. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  141557. "lsl r6, %[b], #16\n\t"
  141558. "lsl r7, r8, #16\n\t"
  141559. "lsr r6, r6, #16\n\t"
  141560. "lsr r7, r7, #16\n\t"
  141561. "mul r7, r6, r7\n\t"
  141562. "adds r4, r4, r7\n\t"
  141563. "adc r5, r5, #0\n\t"
  141564. "lsr r7, r8, #16\n\t"
  141565. "mul r6, r7, r6\n\t"
  141566. "lsr r7, r6, #16\n\t"
  141567. "lsl r6, r6, #16\n\t"
  141568. "adds r4, r4, r6\n\t"
  141569. "adc r5, r5, r7\n\t"
  141570. "lsr r6, %[b], #16\n\t"
  141571. "lsr r7, r8, #16\n\t"
  141572. "mul r7, r6, r7\n\t"
  141573. "add r5, r5, r7\n\t"
  141574. "lsl r7, r8, #16\n\t"
  141575. "lsr r7, r7, #16\n\t"
  141576. "mul r6, r7, r6\n\t"
  141577. "lsr r7, r6, #16\n\t"
  141578. "lsl r6, r6, #16\n\t"
  141579. "adds r4, r4, r6\n\t"
  141580. "adc r5, r5, r7\n\t"
  141581. #else
  141582. "umlal r4, r5, %[b], r8\n\t"
  141583. #endif
  141584. "stm %[r]!, {r4}\n\t"
  141585. "str r5, [%[r]]\n\t"
  141586. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  141587. :
  141588. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "cc"
  141589. );
  141590. }
  141591. #endif /* WOLFSSL_SP_SMALL */
  141592. #ifdef WOLFSSL_SP_USE_UDIV
  141593. /* Divide the double width number (d1|d0) by the divisor. (d1|d0 / div)
  141594. *
  141595. * d1 The high order half of the number to divide.
  141596. * d0 The low order half of the number to divide.
  141597. * div The divisor.
  141598. * returns the result of the division.
  141599. *
  141600. * Note that this is an approximate div. It may give an answer 1 larger.
  141601. */
  141602. static sp_digit div_1024_word_32(sp_digit d1_p, sp_digit d0_p, sp_digit div_p)
  141603. {
  141604. register sp_digit d1 asm ("r0") = (sp_digit)d1_p;
  141605. register sp_digit d0 asm ("r1") = (sp_digit)d0_p;
  141606. register sp_digit div asm ("r2") = (sp_digit)div_p;
  141607. __asm__ __volatile__ (
  141608. "lsr r6, %[div], #16\n\t"
  141609. "add lr, r6, #1\n\t"
  141610. "udiv r4, %[d1], lr\n\t"
  141611. "lsl r5, %[div], #16\n\t"
  141612. "lsl r4, r4, #16\n\t"
  141613. "umull r3, r12, %[div], r4\n\t"
  141614. "subs %[d0], %[d0], r3\n\t"
  141615. "sbc %[d1], %[d1], r12\n\t"
  141616. "subs r3, %[d1], lr\n\t"
  141617. "sbc r7, r7, r7\n\t"
  141618. "add r7, r7, #1\n\t"
  141619. "rsb r8, r7, #0\n\t"
  141620. "lsl r7, r7, #16\n\t"
  141621. "and r5, r5, r8\n\t"
  141622. "and r6, r6, r8\n\t"
  141623. "subs %[d0], %[d0], r5\n\t"
  141624. "add r4, r4, r7\n\t"
  141625. "sbc %[d1], %[d1], r6\n\t"
  141626. "lsl r12, %[d1], #16\n\t"
  141627. "lsr r3, %[d0], #16\n\t"
  141628. "orr r3, r3, r12\n\t"
  141629. "udiv r3, r3, lr\n\t"
  141630. "add r4, r4, r3\n\t"
  141631. "umull r3, r12, %[div], r3\n\t"
  141632. "subs %[d0], %[d0], r3\n\t"
  141633. "sbc %[d1], %[d1], r12\n\t"
  141634. "lsl r12, %[d1], #16\n\t"
  141635. "lsr r3, %[d0], #16\n\t"
  141636. "orr r3, r3, r12\n\t"
  141637. "udiv r3, r3, lr\n\t"
  141638. "add r4, r4, r3\n\t"
  141639. "mul r3, %[div], r3\n\t"
  141640. "sub %[d0], %[d0], r3\n\t"
  141641. "udiv r3, %[d0], %[div]\n\t"
  141642. "add %[d1], r4, r3\n\t"
  141643. : [d1] "+r" (d1), [d0] "+r" (d0), [div] "+r" (div)
  141644. :
  141645. : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8", "cc"
  141646. );
  141647. return (uint32_t)(size_t)d1;
  141648. }
  141649. #else
  141650. /* Divide the double width number (d1|d0) by the divisor. (d1|d0 / div)
  141651. *
  141652. * d1 The high order half of the number to divide.
  141653. * d0 The low order half of the number to divide.
  141654. * div The divisor.
  141655. * returns the result of the division.
  141656. *
  141657. * Note that this is an approximate div. It may give an answer 1 larger.
  141658. */
  141659. static sp_digit div_1024_word_32(sp_digit d1_p, sp_digit d0_p, sp_digit div_p)
  141660. {
  141661. register sp_digit d1 asm ("r0") = (sp_digit)d1_p;
  141662. register sp_digit d0 asm ("r1") = (sp_digit)d0_p;
  141663. register sp_digit div asm ("r2") = (sp_digit)div_p;
  141664. __asm__ __volatile__ (
  141665. "lsr lr, %[div], #1\n\t"
  141666. "add lr, lr, #1\n\t"
  141667. "mov r4, %[d0]\n\t"
  141668. "mov r5, %[d1]\n\t"
  141669. /* Do top 32 */
  141670. "subs r6, lr, r5\n\t"
  141671. "sbc r6, r6, r6\n\t"
  141672. "mov r3, #0\n\t"
  141673. "sub r3, r3, r6\n\t"
  141674. "and r6, r6, lr\n\t"
  141675. "subs r5, r5, r6\n\t"
  141676. /* Next 30 bits */
  141677. "mov r12, #29\n\t"
  141678. "\n"
  141679. "L_div_1024_word_32_bit_%=: \n\t"
  141680. "lsls r4, r4, #1\n\t"
  141681. "adc r5, r5, r5\n\t"
  141682. "subs r6, lr, r5\n\t"
  141683. "sbc r6, r6, r6\n\t"
  141684. "add r3, r3, r3\n\t"
  141685. "sub r3, r3, r6\n\t"
  141686. "and r6, r6, lr\n\t"
  141687. "subs r5, r5, r6\n\t"
  141688. "subs r12, r12, #1\n\t"
  141689. "bpl L_div_1024_word_32_bit_%=\n\t"
  141690. "add r3, r3, r3\n\t"
  141691. "add r3, r3, #1\n\t"
  141692. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  141693. "lsl r7, r3, #16\n\t"
  141694. "lsl r4, %[div], #16\n\t"
  141695. "lsr r7, r7, #16\n\t"
  141696. "lsr r4, r4, #16\n\t"
  141697. "mul r4, r7, r4\n\t"
  141698. "lsr r8, %[div], #16\n\t"
  141699. "mul r7, r8, r7\n\t"
  141700. "lsr r5, r7, #16\n\t"
  141701. "lsl r7, r7, #16\n\t"
  141702. "adds r4, r4, r7\n\t"
  141703. "adc r5, r5, #0\n\t"
  141704. "lsr r7, r3, #16\n\t"
  141705. "mul r8, r7, r8\n\t"
  141706. "add r5, r5, r8\n\t"
  141707. "lsl r8, %[div], #16\n\t"
  141708. "lsr r8, r8, #16\n\t"
  141709. "mul r7, r8, r7\n\t"
  141710. "lsr r8, r7, #16\n\t"
  141711. "lsl r7, r7, #16\n\t"
  141712. "adds r4, r4, r7\n\t"
  141713. "adc r5, r5, r8\n\t"
  141714. #else
  141715. "umull r4, r5, r3, %[div]\n\t"
  141716. #endif
  141717. "subs r7, %[d0], r4\n\t"
  141718. "sbc r8, %[d1], r5\n\t"
  141719. "add r3, r3, r8\n\t"
  141720. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  141721. "lsl r7, r3, #16\n\t"
  141722. "lsl r4, %[div], #16\n\t"
  141723. "lsr r7, r7, #16\n\t"
  141724. "lsr r4, r4, #16\n\t"
  141725. "mul r4, r7, r4\n\t"
  141726. "lsr r8, %[div], #16\n\t"
  141727. "mul r7, r8, r7\n\t"
  141728. "lsr r5, r7, #16\n\t"
  141729. "lsl r7, r7, #16\n\t"
  141730. "adds r4, r4, r7\n\t"
  141731. "adc r5, r5, #0\n\t"
  141732. "lsr r7, r3, #16\n\t"
  141733. "mul r8, r7, r8\n\t"
  141734. "add r5, r5, r8\n\t"
  141735. "lsl r8, %[div], #16\n\t"
  141736. "lsr r8, r8, #16\n\t"
  141737. "mul r7, r8, r7\n\t"
  141738. "lsr r8, r7, #16\n\t"
  141739. "lsl r7, r7, #16\n\t"
  141740. "adds r4, r4, r7\n\t"
  141741. "adc r5, r5, r8\n\t"
  141742. #else
  141743. "umull r4, r5, r3, %[div]\n\t"
  141744. #endif
  141745. "subs r7, %[d0], r4\n\t"
  141746. "sbc r8, %[d1], r5\n\t"
  141747. "add r3, r3, r8\n\t"
  141748. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  141749. "lsl r7, r3, #16\n\t"
  141750. "lsl r4, %[div], #16\n\t"
  141751. "lsr r7, r7, #16\n\t"
  141752. "lsr r4, r4, #16\n\t"
  141753. "mul r4, r7, r4\n\t"
  141754. "lsr r8, %[div], #16\n\t"
  141755. "mul r7, r8, r7\n\t"
  141756. "lsr r5, r7, #16\n\t"
  141757. "lsl r7, r7, #16\n\t"
  141758. "adds r4, r4, r7\n\t"
  141759. "adc r5, r5, #0\n\t"
  141760. "lsr r7, r3, #16\n\t"
  141761. "mul r8, r7, r8\n\t"
  141762. "add r5, r5, r8\n\t"
  141763. "lsl r8, %[div], #16\n\t"
  141764. "lsr r8, r8, #16\n\t"
  141765. "mul r7, r8, r7\n\t"
  141766. "lsr r8, r7, #16\n\t"
  141767. "lsl r7, r7, #16\n\t"
  141768. "adds r4, r4, r7\n\t"
  141769. "adc r5, r5, r8\n\t"
  141770. #else
  141771. "umull r4, r5, r3, %[div]\n\t"
  141772. #endif
  141773. "subs r7, %[d0], r4\n\t"
  141774. "sbc r8, %[d1], r5\n\t"
  141775. "add r3, r3, r8\n\t"
  141776. "subs r6, %[div], r7\n\t"
  141777. "sbc r6, r6, r6\n\t"
  141778. "sub %[d1], r3, r6\n\t"
  141779. : [d1] "+r" (d1), [d0] "+r" (d0), [div] "+r" (div)
  141780. :
  141781. : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8", "cc"
  141782. );
  141783. return (uint32_t)(size_t)d1;
  141784. }
  141785. #endif
  141786. /* AND m into each word of a and store in r.
  141787. *
  141788. * r A single precision integer.
  141789. * a A single precision integer.
  141790. * m Mask to AND against each digit.
  141791. */
  141792. static void sp_1024_mask_32(sp_digit* r, const sp_digit* a, sp_digit m)
  141793. {
  141794. #ifdef WOLFSSL_SP_SMALL
  141795. int i;
  141796. for (i=0; i<32; i++) {
  141797. r[i] = a[i] & m;
  141798. }
  141799. #else
  141800. int i;
  141801. for (i = 0; i < 32; i += 8) {
  141802. r[i+0] = a[i+0] & m;
  141803. r[i+1] = a[i+1] & m;
  141804. r[i+2] = a[i+2] & m;
  141805. r[i+3] = a[i+3] & m;
  141806. r[i+4] = a[i+4] & m;
  141807. r[i+5] = a[i+5] & m;
  141808. r[i+6] = a[i+6] & m;
  141809. r[i+7] = a[i+7] & m;
  141810. }
  141811. #endif
  141812. }
  141813. /* Compare a with b in constant time.
  141814. *
  141815. * a A single precision integer.
  141816. * b A single precision integer.
  141817. * return -ve, 0 or +ve if a is less than, equal to or greater than b
  141818. * respectively.
  141819. */
  141820. static sp_int32 sp_1024_cmp_32(const sp_digit* a_p, const sp_digit* b_p)
  141821. {
  141822. register const sp_digit* a asm ("r0") = (const sp_digit*)a_p;
  141823. register const sp_digit* b asm ("r1") = (const sp_digit*)b_p;
  141824. __asm__ __volatile__ (
  141825. "mov r2, #-1\n\t"
  141826. "mov r6, #1\n\t"
  141827. "mov r5, #0\n\t"
  141828. "mov r3, #-1\n\t"
  141829. #ifdef WOLFSSL_SP_SMALL
  141830. "mov r4, #0x7c\n\t"
  141831. "\n"
  141832. "L_sp_1024_cmp_32_words_%=: \n\t"
  141833. "ldr r12, [%[a], r4]\n\t"
  141834. "ldr lr, [%[b], r4]\n\t"
  141835. "and r12, r12, r3\n\t"
  141836. "and lr, lr, r3\n\t"
  141837. "subs r12, r12, lr\n\t"
  141838. "it hi\n\t"
  141839. "movhi r2, r6\n\t"
  141840. "it lo\n\t"
  141841. "movlo r2, r3\n\t"
  141842. "it ne\n\t"
  141843. "movne r3, r5\n\t"
  141844. "subs r4, r4, #4\n\t"
  141845. "bcs L_sp_1024_cmp_32_words_%=\n\t"
  141846. "eor r2, r2, r3\n\t"
  141847. #else
  141848. "ldr r12, [%[a], #124]\n\t"
  141849. "ldr lr, [%[b], #124]\n\t"
  141850. "and r12, r12, r3\n\t"
  141851. "and lr, lr, r3\n\t"
  141852. "subs r12, r12, lr\n\t"
  141853. "it hi\n\t"
  141854. "movhi r2, r6\n\t"
  141855. "it lo\n\t"
  141856. "movlo r2, r3\n\t"
  141857. "it ne\n\t"
  141858. "movne r3, r5\n\t"
  141859. "ldr r12, [%[a], #120]\n\t"
  141860. "ldr lr, [%[b], #120]\n\t"
  141861. "and r12, r12, r3\n\t"
  141862. "and lr, lr, r3\n\t"
  141863. "subs r12, r12, lr\n\t"
  141864. "it hi\n\t"
  141865. "movhi r2, r6\n\t"
  141866. "it lo\n\t"
  141867. "movlo r2, r3\n\t"
  141868. "it ne\n\t"
  141869. "movne r3, r5\n\t"
  141870. "ldr r12, [%[a], #116]\n\t"
  141871. "ldr lr, [%[b], #116]\n\t"
  141872. "and r12, r12, r3\n\t"
  141873. "and lr, lr, r3\n\t"
  141874. "subs r12, r12, lr\n\t"
  141875. "it hi\n\t"
  141876. "movhi r2, r6\n\t"
  141877. "it lo\n\t"
  141878. "movlo r2, r3\n\t"
  141879. "it ne\n\t"
  141880. "movne r3, r5\n\t"
  141881. "ldr r12, [%[a], #112]\n\t"
  141882. "ldr lr, [%[b], #112]\n\t"
  141883. "and r12, r12, r3\n\t"
  141884. "and lr, lr, r3\n\t"
  141885. "subs r12, r12, lr\n\t"
  141886. "it hi\n\t"
  141887. "movhi r2, r6\n\t"
  141888. "it lo\n\t"
  141889. "movlo r2, r3\n\t"
  141890. "it ne\n\t"
  141891. "movne r3, r5\n\t"
  141892. "ldr r12, [%[a], #108]\n\t"
  141893. "ldr lr, [%[b], #108]\n\t"
  141894. "and r12, r12, r3\n\t"
  141895. "and lr, lr, r3\n\t"
  141896. "subs r12, r12, lr\n\t"
  141897. "it hi\n\t"
  141898. "movhi r2, r6\n\t"
  141899. "it lo\n\t"
  141900. "movlo r2, r3\n\t"
  141901. "it ne\n\t"
  141902. "movne r3, r5\n\t"
  141903. "ldr r12, [%[a], #104]\n\t"
  141904. "ldr lr, [%[b], #104]\n\t"
  141905. "and r12, r12, r3\n\t"
  141906. "and lr, lr, r3\n\t"
  141907. "subs r12, r12, lr\n\t"
  141908. "it hi\n\t"
  141909. "movhi r2, r6\n\t"
  141910. "it lo\n\t"
  141911. "movlo r2, r3\n\t"
  141912. "it ne\n\t"
  141913. "movne r3, r5\n\t"
  141914. "ldr r12, [%[a], #100]\n\t"
  141915. "ldr lr, [%[b], #100]\n\t"
  141916. "and r12, r12, r3\n\t"
  141917. "and lr, lr, r3\n\t"
  141918. "subs r12, r12, lr\n\t"
  141919. "it hi\n\t"
  141920. "movhi r2, r6\n\t"
  141921. "it lo\n\t"
  141922. "movlo r2, r3\n\t"
  141923. "it ne\n\t"
  141924. "movne r3, r5\n\t"
  141925. "ldr r12, [%[a], #96]\n\t"
  141926. "ldr lr, [%[b], #96]\n\t"
  141927. "and r12, r12, r3\n\t"
  141928. "and lr, lr, r3\n\t"
  141929. "subs r12, r12, lr\n\t"
  141930. "it hi\n\t"
  141931. "movhi r2, r6\n\t"
  141932. "it lo\n\t"
  141933. "movlo r2, r3\n\t"
  141934. "it ne\n\t"
  141935. "movne r3, r5\n\t"
  141936. "ldr r12, [%[a], #92]\n\t"
  141937. "ldr lr, [%[b], #92]\n\t"
  141938. "and r12, r12, r3\n\t"
  141939. "and lr, lr, r3\n\t"
  141940. "subs r12, r12, lr\n\t"
  141941. "it hi\n\t"
  141942. "movhi r2, r6\n\t"
  141943. "it lo\n\t"
  141944. "movlo r2, r3\n\t"
  141945. "it ne\n\t"
  141946. "movne r3, r5\n\t"
  141947. "ldr r12, [%[a], #88]\n\t"
  141948. "ldr lr, [%[b], #88]\n\t"
  141949. "and r12, r12, r3\n\t"
  141950. "and lr, lr, r3\n\t"
  141951. "subs r12, r12, lr\n\t"
  141952. "it hi\n\t"
  141953. "movhi r2, r6\n\t"
  141954. "it lo\n\t"
  141955. "movlo r2, r3\n\t"
  141956. "it ne\n\t"
  141957. "movne r3, r5\n\t"
  141958. "ldr r12, [%[a], #84]\n\t"
  141959. "ldr lr, [%[b], #84]\n\t"
  141960. "and r12, r12, r3\n\t"
  141961. "and lr, lr, r3\n\t"
  141962. "subs r12, r12, lr\n\t"
  141963. "it hi\n\t"
  141964. "movhi r2, r6\n\t"
  141965. "it lo\n\t"
  141966. "movlo r2, r3\n\t"
  141967. "it ne\n\t"
  141968. "movne r3, r5\n\t"
  141969. "ldr r12, [%[a], #80]\n\t"
  141970. "ldr lr, [%[b], #80]\n\t"
  141971. "and r12, r12, r3\n\t"
  141972. "and lr, lr, r3\n\t"
  141973. "subs r12, r12, lr\n\t"
  141974. "it hi\n\t"
  141975. "movhi r2, r6\n\t"
  141976. "it lo\n\t"
  141977. "movlo r2, r3\n\t"
  141978. "it ne\n\t"
  141979. "movne r3, r5\n\t"
  141980. "ldr r12, [%[a], #76]\n\t"
  141981. "ldr lr, [%[b], #76]\n\t"
  141982. "and r12, r12, r3\n\t"
  141983. "and lr, lr, r3\n\t"
  141984. "subs r12, r12, lr\n\t"
  141985. "it hi\n\t"
  141986. "movhi r2, r6\n\t"
  141987. "it lo\n\t"
  141988. "movlo r2, r3\n\t"
  141989. "it ne\n\t"
  141990. "movne r3, r5\n\t"
  141991. "ldr r12, [%[a], #72]\n\t"
  141992. "ldr lr, [%[b], #72]\n\t"
  141993. "and r12, r12, r3\n\t"
  141994. "and lr, lr, r3\n\t"
  141995. "subs r12, r12, lr\n\t"
  141996. "it hi\n\t"
  141997. "movhi r2, r6\n\t"
  141998. "it lo\n\t"
  141999. "movlo r2, r3\n\t"
  142000. "it ne\n\t"
  142001. "movne r3, r5\n\t"
  142002. "ldr r12, [%[a], #68]\n\t"
  142003. "ldr lr, [%[b], #68]\n\t"
  142004. "and r12, r12, r3\n\t"
  142005. "and lr, lr, r3\n\t"
  142006. "subs r12, r12, lr\n\t"
  142007. "it hi\n\t"
  142008. "movhi r2, r6\n\t"
  142009. "it lo\n\t"
  142010. "movlo r2, r3\n\t"
  142011. "it ne\n\t"
  142012. "movne r3, r5\n\t"
  142013. "ldr r12, [%[a], #64]\n\t"
  142014. "ldr lr, [%[b], #64]\n\t"
  142015. "and r12, r12, r3\n\t"
  142016. "and lr, lr, r3\n\t"
  142017. "subs r12, r12, lr\n\t"
  142018. "it hi\n\t"
  142019. "movhi r2, r6\n\t"
  142020. "it lo\n\t"
  142021. "movlo r2, r3\n\t"
  142022. "it ne\n\t"
  142023. "movne r3, r5\n\t"
  142024. "ldr r12, [%[a], #60]\n\t"
  142025. "ldr lr, [%[b], #60]\n\t"
  142026. "and r12, r12, r3\n\t"
  142027. "and lr, lr, r3\n\t"
  142028. "subs r12, r12, lr\n\t"
  142029. "it hi\n\t"
  142030. "movhi r2, r6\n\t"
  142031. "it lo\n\t"
  142032. "movlo r2, r3\n\t"
  142033. "it ne\n\t"
  142034. "movne r3, r5\n\t"
  142035. "ldr r12, [%[a], #56]\n\t"
  142036. "ldr lr, [%[b], #56]\n\t"
  142037. "and r12, r12, r3\n\t"
  142038. "and lr, lr, r3\n\t"
  142039. "subs r12, r12, lr\n\t"
  142040. "it hi\n\t"
  142041. "movhi r2, r6\n\t"
  142042. "it lo\n\t"
  142043. "movlo r2, r3\n\t"
  142044. "it ne\n\t"
  142045. "movne r3, r5\n\t"
  142046. "ldr r12, [%[a], #52]\n\t"
  142047. "ldr lr, [%[b], #52]\n\t"
  142048. "and r12, r12, r3\n\t"
  142049. "and lr, lr, r3\n\t"
  142050. "subs r12, r12, lr\n\t"
  142051. "it hi\n\t"
  142052. "movhi r2, r6\n\t"
  142053. "it lo\n\t"
  142054. "movlo r2, r3\n\t"
  142055. "it ne\n\t"
  142056. "movne r3, r5\n\t"
  142057. "ldr r12, [%[a], #48]\n\t"
  142058. "ldr lr, [%[b], #48]\n\t"
  142059. "and r12, r12, r3\n\t"
  142060. "and lr, lr, r3\n\t"
  142061. "subs r12, r12, lr\n\t"
  142062. "it hi\n\t"
  142063. "movhi r2, r6\n\t"
  142064. "it lo\n\t"
  142065. "movlo r2, r3\n\t"
  142066. "it ne\n\t"
  142067. "movne r3, r5\n\t"
  142068. "ldr r12, [%[a], #44]\n\t"
  142069. "ldr lr, [%[b], #44]\n\t"
  142070. "and r12, r12, r3\n\t"
  142071. "and lr, lr, r3\n\t"
  142072. "subs r12, r12, lr\n\t"
  142073. "it hi\n\t"
  142074. "movhi r2, r6\n\t"
  142075. "it lo\n\t"
  142076. "movlo r2, r3\n\t"
  142077. "it ne\n\t"
  142078. "movne r3, r5\n\t"
  142079. "ldr r12, [%[a], #40]\n\t"
  142080. "ldr lr, [%[b], #40]\n\t"
  142081. "and r12, r12, r3\n\t"
  142082. "and lr, lr, r3\n\t"
  142083. "subs r12, r12, lr\n\t"
  142084. "it hi\n\t"
  142085. "movhi r2, r6\n\t"
  142086. "it lo\n\t"
  142087. "movlo r2, r3\n\t"
  142088. "it ne\n\t"
  142089. "movne r3, r5\n\t"
  142090. "ldr r12, [%[a], #36]\n\t"
  142091. "ldr lr, [%[b], #36]\n\t"
  142092. "and r12, r12, r3\n\t"
  142093. "and lr, lr, r3\n\t"
  142094. "subs r12, r12, lr\n\t"
  142095. "it hi\n\t"
  142096. "movhi r2, r6\n\t"
  142097. "it lo\n\t"
  142098. "movlo r2, r3\n\t"
  142099. "it ne\n\t"
  142100. "movne r3, r5\n\t"
  142101. "ldr r12, [%[a], #32]\n\t"
  142102. "ldr lr, [%[b], #32]\n\t"
  142103. "and r12, r12, r3\n\t"
  142104. "and lr, lr, r3\n\t"
  142105. "subs r12, r12, lr\n\t"
  142106. "it hi\n\t"
  142107. "movhi r2, r6\n\t"
  142108. "it lo\n\t"
  142109. "movlo r2, r3\n\t"
  142110. "it ne\n\t"
  142111. "movne r3, r5\n\t"
  142112. "ldr r12, [%[a], #28]\n\t"
  142113. "ldr lr, [%[b], #28]\n\t"
  142114. "and r12, r12, r3\n\t"
  142115. "and lr, lr, r3\n\t"
  142116. "subs r12, r12, lr\n\t"
  142117. "it hi\n\t"
  142118. "movhi r2, r6\n\t"
  142119. "it lo\n\t"
  142120. "movlo r2, r3\n\t"
  142121. "it ne\n\t"
  142122. "movne r3, r5\n\t"
  142123. "ldr r12, [%[a], #24]\n\t"
  142124. "ldr lr, [%[b], #24]\n\t"
  142125. "and r12, r12, r3\n\t"
  142126. "and lr, lr, r3\n\t"
  142127. "subs r12, r12, lr\n\t"
  142128. "it hi\n\t"
  142129. "movhi r2, r6\n\t"
  142130. "it lo\n\t"
  142131. "movlo r2, r3\n\t"
  142132. "it ne\n\t"
  142133. "movne r3, r5\n\t"
  142134. "ldr r12, [%[a], #20]\n\t"
  142135. "ldr lr, [%[b], #20]\n\t"
  142136. "and r12, r12, r3\n\t"
  142137. "and lr, lr, r3\n\t"
  142138. "subs r12, r12, lr\n\t"
  142139. "it hi\n\t"
  142140. "movhi r2, r6\n\t"
  142141. "it lo\n\t"
  142142. "movlo r2, r3\n\t"
  142143. "it ne\n\t"
  142144. "movne r3, r5\n\t"
  142145. "ldr r12, [%[a], #16]\n\t"
  142146. "ldr lr, [%[b], #16]\n\t"
  142147. "and r12, r12, r3\n\t"
  142148. "and lr, lr, r3\n\t"
  142149. "subs r12, r12, lr\n\t"
  142150. "it hi\n\t"
  142151. "movhi r2, r6\n\t"
  142152. "it lo\n\t"
  142153. "movlo r2, r3\n\t"
  142154. "it ne\n\t"
  142155. "movne r3, r5\n\t"
  142156. "ldr r12, [%[a], #12]\n\t"
  142157. "ldr lr, [%[b], #12]\n\t"
  142158. "and r12, r12, r3\n\t"
  142159. "and lr, lr, r3\n\t"
  142160. "subs r12, r12, lr\n\t"
  142161. "it hi\n\t"
  142162. "movhi r2, r6\n\t"
  142163. "it lo\n\t"
  142164. "movlo r2, r3\n\t"
  142165. "it ne\n\t"
  142166. "movne r3, r5\n\t"
  142167. "ldr r12, [%[a], #8]\n\t"
  142168. "ldr lr, [%[b], #8]\n\t"
  142169. "and r12, r12, r3\n\t"
  142170. "and lr, lr, r3\n\t"
  142171. "subs r12, r12, lr\n\t"
  142172. "it hi\n\t"
  142173. "movhi r2, r6\n\t"
  142174. "it lo\n\t"
  142175. "movlo r2, r3\n\t"
  142176. "it ne\n\t"
  142177. "movne r3, r5\n\t"
  142178. "ldr r12, [%[a], #4]\n\t"
  142179. "ldr lr, [%[b], #4]\n\t"
  142180. "and r12, r12, r3\n\t"
  142181. "and lr, lr, r3\n\t"
  142182. "subs r12, r12, lr\n\t"
  142183. "it hi\n\t"
  142184. "movhi r2, r6\n\t"
  142185. "it lo\n\t"
  142186. "movlo r2, r3\n\t"
  142187. "it ne\n\t"
  142188. "movne r3, r5\n\t"
  142189. "ldr r12, [%[a]]\n\t"
  142190. "ldr lr, [%[b]]\n\t"
  142191. "and r12, r12, r3\n\t"
  142192. "and lr, lr, r3\n\t"
  142193. "subs r12, r12, lr\n\t"
  142194. "it hi\n\t"
  142195. "movhi r2, r6\n\t"
  142196. "it lo\n\t"
  142197. "movlo r2, r3\n\t"
  142198. "it ne\n\t"
  142199. "movne r3, r5\n\t"
  142200. "eor r2, r2, r3\n\t"
  142201. #endif /*WOLFSSL_SP_SMALL */
  142202. "mov %[a], r2\n\t"
  142203. : [a] "+r" (a), [b] "+r" (b)
  142204. :
  142205. : "memory", "r2", "r3", "r12", "lr", "r4", "r5", "r6", "cc"
  142206. );
  142207. return (uint32_t)(size_t)a;
  142208. }
  142209. /* Divide d in a and put remainder into r (m*d + r = a)
  142210. * m is not calculated as it is not needed at this time.
  142211. *
  142212. * a Number to be divided.
  142213. * d Number to divide with.
  142214. * m Multiplier result.
  142215. * r Remainder from the division.
  142216. * returns MP_OKAY indicating success.
  142217. */
  142218. static WC_INLINE int sp_1024_div_32(const sp_digit* a, const sp_digit* d,
  142219. sp_digit* m, sp_digit* r)
  142220. {
  142221. sp_digit t1[64], t2[33];
  142222. sp_digit div, r1;
  142223. int i;
  142224. (void)m;
  142225. div = d[31];
  142226. XMEMCPY(t1, a, sizeof(*t1) * 2 * 32);
  142227. r1 = sp_1024_cmp_32(&t1[32], d) >= 0;
  142228. sp_1024_cond_sub_32(&t1[32], &t1[32], d, (sp_digit)0 - r1);
  142229. for (i = 31; i >= 0; i--) {
  142230. volatile sp_digit mask = (sp_digit)0 - (t1[32 + i] == div);
  142231. sp_digit hi = t1[32 + i] + mask;
  142232. r1 = div_1024_word_32(hi, t1[32 + i - 1], div);
  142233. r1 |= mask;
  142234. sp_1024_mul_d_32(t2, d, r1);
  142235. t1[32 + i] += sp_1024_sub_in_place_32(&t1[i], t2);
  142236. t1[32 + i] -= t2[32];
  142237. sp_1024_mask_32(t2, d, t1[32 + i]);
  142238. t1[32 + i] += sp_1024_add_32(&t1[i], &t1[i], t2);
  142239. sp_1024_mask_32(t2, d, t1[32 + i]);
  142240. t1[32 + i] += sp_1024_add_32(&t1[i], &t1[i], t2);
  142241. }
  142242. r1 = sp_1024_cmp_32(t1, d) >= 0;
  142243. sp_1024_cond_sub_32(r, t1, d, (sp_digit)0 - r1);
  142244. return MP_OKAY;
  142245. }
  142246. /* Reduce a modulo m into r. (r = a mod m)
  142247. *
  142248. * r A single precision number that is the reduced result.
  142249. * a A single precision number that is to be reduced.
  142250. * m A single precision number that is the modulus to reduce with.
  142251. * returns MP_OKAY indicating success.
  142252. */
  142253. static WC_INLINE int sp_1024_mod_32(sp_digit* r, const sp_digit* a,
  142254. const sp_digit* m)
  142255. {
  142256. return sp_1024_div_32(a, m, NULL, r);
  142257. }
  142258. /* Multiply a number by Montgomery normalizer mod modulus (prime).
  142259. *
  142260. * r The resulting Montgomery form number.
  142261. * a The number to convert.
  142262. * m The modulus (prime).
  142263. * returns MEMORY_E when memory allocation fails and MP_OKAY otherwise.
  142264. */
  142265. static int sp_1024_mod_mul_norm_32(sp_digit* r, const sp_digit* a,
  142266. const sp_digit* m)
  142267. {
  142268. sp_1024_mul_32(r, a, p1024_norm_mod);
  142269. return sp_1024_mod_32(r, r, m);
  142270. }
  142271. #ifdef WOLFCRYPT_HAVE_SAKKE
  142272. /* Create a new point.
  142273. *
  142274. * heap [in] Buffer to allocate dynamic memory from.
  142275. * sp [in] Data for point - only if not allocating.
  142276. * p [out] New point.
  142277. * returns MEMORY_E when dynamic memory allocation fails and 0 otherwise.
  142278. */
  142279. static int sp_1024_point_new_ex_32(void* heap, sp_point_1024* sp,
  142280. sp_point_1024** p)
  142281. {
  142282. int ret = MP_OKAY;
  142283. (void)heap;
  142284. #if (defined(WOLFSSL_SP_SMALL) && !defined(WOLFSSL_SP_NO_MALLOC)) || \
  142285. defined(WOLFSSL_SP_SMALL_STACK)
  142286. (void)sp;
  142287. *p = (sp_point_1024*)XMALLOC(sizeof(sp_point_1024), heap, DYNAMIC_TYPE_ECC);
  142288. #else
  142289. *p = sp;
  142290. #endif
  142291. if (*p == NULL) {
  142292. ret = MEMORY_E;
  142293. }
  142294. return ret;
  142295. }
  142296. #if (defined(WOLFSSL_SP_SMALL) && !defined(WOLFSSL_SP_NO_MALLOC)) || \
  142297. defined(WOLFSSL_SP_SMALL_STACK)
  142298. /* Allocate memory for point and return error. */
  142299. #define sp_1024_point_new_32(heap, sp, p) sp_1024_point_new_ex_32((heap), NULL, &(p))
  142300. #else
  142301. /* Set pointer to data and return no error. */
  142302. #define sp_1024_point_new_32(heap, sp, p) sp_1024_point_new_ex_32((heap), &(sp), &(p))
  142303. #endif
  142304. #endif /* WOLFCRYPT_HAVE_SAKKE */
  142305. #ifdef WOLFCRYPT_HAVE_SAKKE
  142306. /* Free the point.
  142307. *
  142308. * p [in,out] Point to free.
  142309. * clear [in] Indicates whether to zeroize point.
  142310. * heap [in] Buffer from which dynamic memory was allocate from.
  142311. */
  142312. static void sp_1024_point_free_32(sp_point_1024* p, int clear, void* heap)
  142313. {
  142314. #if (defined(WOLFSSL_SP_SMALL) && !defined(WOLFSSL_SP_NO_MALLOC)) || \
  142315. defined(WOLFSSL_SP_SMALL_STACK)
  142316. /* If valid pointer then clear point data if requested and free data. */
  142317. if (p != NULL) {
  142318. if (clear != 0) {
  142319. XMEMSET(p, 0, sizeof(*p));
  142320. }
  142321. XFREE(p, heap, DYNAMIC_TYPE_ECC);
  142322. }
  142323. #else
  142324. /* Clear point data if requested. */
  142325. if ((p != NULL) && (clear != 0)) {
  142326. XMEMSET(p, 0, sizeof(*p));
  142327. }
  142328. #endif
  142329. (void)heap;
  142330. }
  142331. #endif /* WOLFCRYPT_HAVE_SAKKE */
  142332. /* Convert an mp_int to an array of sp_digit.
  142333. *
  142334. * r A single precision integer.
  142335. * size Maximum number of bytes to convert
  142336. * a A multi-precision integer.
  142337. */
  142338. static void sp_1024_from_mp(sp_digit* r, int size, const mp_int* a)
  142339. {
  142340. #if DIGIT_BIT == 32
  142341. int i;
  142342. sp_digit j = (sp_digit)0 - (sp_digit)a->used;
  142343. int o = 0;
  142344. for (i = 0; i < size; i++) {
  142345. sp_digit mask = (sp_digit)0 - (j >> 31);
  142346. r[i] = a->dp[o] & mask;
  142347. j++;
  142348. o += (int)(j >> 31);
  142349. }
  142350. #elif DIGIT_BIT > 32
  142351. unsigned int i;
  142352. int j = 0;
  142353. word32 s = 0;
  142354. r[0] = 0;
  142355. for (i = 0; i < (unsigned int)a->used && j < size; i++) {
  142356. r[j] |= ((sp_digit)a->dp[i] << s);
  142357. r[j] &= 0xffffffff;
  142358. s = 32U - s;
  142359. if (j + 1 >= size) {
  142360. break;
  142361. }
  142362. /* lint allow cast of mismatch word32 and mp_digit */
  142363. r[++j] = (sp_digit)(a->dp[i] >> s); /*lint !e9033*/
  142364. while ((s + 32U) <= (word32)DIGIT_BIT) {
  142365. s += 32U;
  142366. r[j] &= 0xffffffff;
  142367. if (j + 1 >= size) {
  142368. break;
  142369. }
  142370. if (s < (word32)DIGIT_BIT) {
  142371. /* lint allow cast of mismatch word32 and mp_digit */
  142372. r[++j] = (sp_digit)(a->dp[i] >> s); /*lint !e9033*/
  142373. }
  142374. else {
  142375. r[++j] = (sp_digit)0;
  142376. }
  142377. }
  142378. s = (word32)DIGIT_BIT - s;
  142379. }
  142380. for (j++; j < size; j++) {
  142381. r[j] = 0;
  142382. }
  142383. #else
  142384. unsigned int i;
  142385. int j = 0;
  142386. int s = 0;
  142387. r[0] = 0;
  142388. for (i = 0; i < (unsigned int)a->used && j < size; i++) {
  142389. r[j] |= ((sp_digit)a->dp[i]) << s;
  142390. if (s + DIGIT_BIT >= 32) {
  142391. r[j] &= 0xffffffff;
  142392. if (j + 1 >= size) {
  142393. break;
  142394. }
  142395. s = 32 - s;
  142396. if (s == DIGIT_BIT) {
  142397. r[++j] = 0;
  142398. s = 0;
  142399. }
  142400. else {
  142401. r[++j] = a->dp[i] >> s;
  142402. s = DIGIT_BIT - s;
  142403. }
  142404. }
  142405. else {
  142406. s += DIGIT_BIT;
  142407. }
  142408. }
  142409. for (j++; j < size; j++) {
  142410. r[j] = 0;
  142411. }
  142412. #endif
  142413. }
  142414. /* Convert a point of type ecc_point to type sp_point_1024.
  142415. *
  142416. * p Point of type sp_point_1024 (result).
  142417. * pm Point of type ecc_point.
  142418. */
  142419. static void sp_1024_point_from_ecc_point_32(sp_point_1024* p,
  142420. const ecc_point* pm)
  142421. {
  142422. XMEMSET(p->x, 0, sizeof(p->x));
  142423. XMEMSET(p->y, 0, sizeof(p->y));
  142424. XMEMSET(p->z, 0, sizeof(p->z));
  142425. sp_1024_from_mp(p->x, 32, pm->x);
  142426. sp_1024_from_mp(p->y, 32, pm->y);
  142427. sp_1024_from_mp(p->z, 32, pm->z);
  142428. p->infinity = 0;
  142429. }
  142430. /* Convert an array of sp_digit to an mp_int.
  142431. *
  142432. * a A single precision integer.
  142433. * r A multi-precision integer.
  142434. */
  142435. static int sp_1024_to_mp(const sp_digit* a, mp_int* r)
  142436. {
  142437. int err;
  142438. err = mp_grow(r, (1024 + DIGIT_BIT - 1) / DIGIT_BIT);
  142439. if (err == MP_OKAY) { /*lint !e774 case where err is always MP_OKAY*/
  142440. #if DIGIT_BIT == 32
  142441. XMEMCPY(r->dp, a, sizeof(sp_digit) * 32);
  142442. r->used = 32;
  142443. mp_clamp(r);
  142444. #elif DIGIT_BIT < 32
  142445. int i;
  142446. int j = 0;
  142447. int s = 0;
  142448. r->dp[0] = 0;
  142449. for (i = 0; i < 32; i++) {
  142450. r->dp[j] |= (mp_digit)(a[i] << s);
  142451. r->dp[j] &= ((sp_digit)1 << DIGIT_BIT) - 1;
  142452. s = DIGIT_BIT - s;
  142453. r->dp[++j] = (mp_digit)(a[i] >> s);
  142454. while (s + DIGIT_BIT <= 32) {
  142455. s += DIGIT_BIT;
  142456. r->dp[j++] &= ((sp_digit)1 << DIGIT_BIT) - 1;
  142457. if (s == SP_WORD_SIZE) {
  142458. r->dp[j] = 0;
  142459. }
  142460. else {
  142461. r->dp[j] = (mp_digit)(a[i] >> s);
  142462. }
  142463. }
  142464. s = 32 - s;
  142465. }
  142466. r->used = (1024 + DIGIT_BIT - 1) / DIGIT_BIT;
  142467. mp_clamp(r);
  142468. #else
  142469. int i;
  142470. int j = 0;
  142471. int s = 0;
  142472. r->dp[0] = 0;
  142473. for (i = 0; i < 32; i++) {
  142474. r->dp[j] |= ((mp_digit)a[i]) << s;
  142475. if (s + 32 >= DIGIT_BIT) {
  142476. #if DIGIT_BIT != 32 && DIGIT_BIT != 64
  142477. r->dp[j] &= ((sp_digit)1 << DIGIT_BIT) - 1;
  142478. #endif
  142479. s = DIGIT_BIT - s;
  142480. r->dp[++j] = a[i] >> s;
  142481. s = 32 - s;
  142482. }
  142483. else {
  142484. s += 32;
  142485. }
  142486. }
  142487. r->used = (1024 + DIGIT_BIT - 1) / DIGIT_BIT;
  142488. mp_clamp(r);
  142489. #endif
  142490. }
  142491. return err;
  142492. }
  142493. /* Convert a point of type sp_point_1024 to type ecc_point.
  142494. *
  142495. * p Point of type sp_point_1024.
  142496. * pm Point of type ecc_point (result).
  142497. * returns MEMORY_E when allocation of memory in ecc_point fails otherwise
  142498. * MP_OKAY.
  142499. */
  142500. static int sp_1024_point_to_ecc_point_32(const sp_point_1024* p, ecc_point* pm)
  142501. {
  142502. int err;
  142503. err = sp_1024_to_mp(p->x, pm->x);
  142504. if (err == MP_OKAY) {
  142505. err = sp_1024_to_mp(p->y, pm->y);
  142506. }
  142507. if (err == MP_OKAY) {
  142508. err = sp_1024_to_mp(p->z, pm->z);
  142509. }
  142510. return err;
  142511. }
  142512. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  142513. /* Reduce the number back to 1024 bits using Montgomery reduction.
  142514. *
  142515. * a A single precision number to reduce in place.
  142516. * m The single precision number representing the modulus.
  142517. * mp The digit representing the negative inverse of m mod 2^n.
  142518. */
  142519. static SP_NOINLINE void sp_1024_mont_reduce_32(sp_digit* a_p, const sp_digit* m_p, sp_digit mp_p)
  142520. {
  142521. register sp_digit* a asm ("r0") = (sp_digit*)a_p;
  142522. register const sp_digit* m asm ("r1") = (const sp_digit*)m_p;
  142523. register sp_digit mp asm ("r2") = (sp_digit)mp_p;
  142524. __asm__ __volatile__ (
  142525. #if !(defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4))
  142526. "ldr r11, [%[m]]\n\t"
  142527. #endif
  142528. /* i = 0 */
  142529. "mov r9, #0\n\t"
  142530. "mov r3, #0\n\t"
  142531. "ldr r12, [%[a]]\n\t"
  142532. "ldr lr, [%[a], #4]\n\t"
  142533. "\n"
  142534. "L_sp_1024_mont_reduce_32_word_%=: \n\t"
  142535. /* mu = a[i] * mp */
  142536. "mul r8, %[mp], r12\n\t"
  142537. /* a[i+0] += m[0] * mu */
  142538. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  142539. "ldr r11, [%[m]]\n\t"
  142540. #endif
  142541. "lsr r7, r11, #16\n\t"
  142542. "lsr r6, r8, #16\n\t"
  142543. "mul r5, r6, r7\n\t"
  142544. "lsl r7, r11, #16\n\t"
  142545. "lsr r7, r7, #16\n\t"
  142546. "mul r6, r7, r6\n\t"
  142547. "lsr r7, r6, #16\n\t"
  142548. "lsl r6, r6, #16\n\t"
  142549. "adds r12, r12, r6\n\t"
  142550. "adc r5, r5, r7\n\t"
  142551. "lsl r6, r8, #16\n\t"
  142552. "lsl r7, r11, #16\n\t"
  142553. "lsr r6, r6, #16\n\t"
  142554. "lsr r7, r7, #16\n\t"
  142555. "mul r7, r6, r7\n\t"
  142556. "adds r12, r12, r7\n\t"
  142557. "adc r5, r5, #0\n\t"
  142558. "lsr r7, r11, #16\n\t"
  142559. "mul r6, r7, r6\n\t"
  142560. "lsr r7, r6, #16\n\t"
  142561. "lsl r6, r6, #16\n\t"
  142562. "adds r12, r12, r6\n\t"
  142563. "adc r5, r5, r7\n\t"
  142564. /* a[i+1] += m[1] * mu */
  142565. "ldr r7, [%[m], #4]\n\t"
  142566. "lsr r10, r7, #16\n\t"
  142567. "lsr r6, r8, #16\n\t"
  142568. "mul r4, r6, r10\n\t"
  142569. "lsl r10, r7, #16\n\t"
  142570. "lsr r10, r10, #16\n\t"
  142571. "mul r6, r10, r6\n\t"
  142572. "lsr r10, r6, #16\n\t"
  142573. "lsl r6, r6, #16\n\t"
  142574. "adds lr, lr, r6\n\t"
  142575. "adc r4, r4, r10\n\t"
  142576. "lsl r6, r8, #16\n\t"
  142577. "lsl r10, r7, #16\n\t"
  142578. "lsr r6, r6, #16\n\t"
  142579. "lsr r10, r10, #16\n\t"
  142580. "mul r10, r6, r10\n\t"
  142581. "adds lr, lr, r10\n\t"
  142582. "adc r4, r4, #0\n\t"
  142583. "lsr r10, r7, #16\n\t"
  142584. "mul r6, r10, r6\n\t"
  142585. "lsr r10, r6, #16\n\t"
  142586. "lsl r6, r6, #16\n\t"
  142587. "adds lr, lr, r6\n\t"
  142588. "adc r4, r4, r10\n\t"
  142589. "mov r12, lr\n\t"
  142590. "adds r12, r12, r5\n\t"
  142591. "adc r4, r4, #0\n\t"
  142592. /* a[i+2] += m[2] * mu */
  142593. "ldr r7, [%[m], #8]\n\t"
  142594. "ldr lr, [%[a], #8]\n\t"
  142595. "lsr r10, r7, #16\n\t"
  142596. "lsr r6, r8, #16\n\t"
  142597. "mul r5, r6, r10\n\t"
  142598. "lsl r10, r7, #16\n\t"
  142599. "lsr r10, r10, #16\n\t"
  142600. "mul r6, r10, r6\n\t"
  142601. "lsr r10, r6, #16\n\t"
  142602. "lsl r6, r6, #16\n\t"
  142603. "adds lr, lr, r6\n\t"
  142604. "adc r5, r5, r10\n\t"
  142605. "lsl r6, r8, #16\n\t"
  142606. "lsl r10, r7, #16\n\t"
  142607. "lsr r6, r6, #16\n\t"
  142608. "lsr r10, r10, #16\n\t"
  142609. "mul r10, r6, r10\n\t"
  142610. "adds lr, lr, r10\n\t"
  142611. "adc r5, r5, #0\n\t"
  142612. "lsr r10, r7, #16\n\t"
  142613. "mul r6, r10, r6\n\t"
  142614. "lsr r10, r6, #16\n\t"
  142615. "lsl r6, r6, #16\n\t"
  142616. "adds lr, lr, r6\n\t"
  142617. "adc r5, r5, r10\n\t"
  142618. "adds lr, lr, r4\n\t"
  142619. "adc r5, r5, #0\n\t"
  142620. /* a[i+3] += m[3] * mu */
  142621. "ldr r7, [%[m], #12]\n\t"
  142622. "ldr r10, [%[a], #12]\n\t"
  142623. "lsr r11, r7, #16\n\t"
  142624. "lsr r6, r8, #16\n\t"
  142625. "mul r4, r6, r11\n\t"
  142626. "lsl r11, r7, #16\n\t"
  142627. "lsr r11, r11, #16\n\t"
  142628. "mul r6, r11, r6\n\t"
  142629. "lsr r11, r6, #16\n\t"
  142630. "lsl r6, r6, #16\n\t"
  142631. "adds r10, r10, r6\n\t"
  142632. "adc r4, r4, r11\n\t"
  142633. "lsl r6, r8, #16\n\t"
  142634. "lsl r11, r7, #16\n\t"
  142635. "lsr r6, r6, #16\n\t"
  142636. "lsr r11, r11, #16\n\t"
  142637. "mul r11, r6, r11\n\t"
  142638. "adds r10, r10, r11\n\t"
  142639. "adc r4, r4, #0\n\t"
  142640. "lsr r11, r7, #16\n\t"
  142641. "mul r6, r11, r6\n\t"
  142642. "lsr r11, r6, #16\n\t"
  142643. "lsl r6, r6, #16\n\t"
  142644. "adds r10, r10, r6\n\t"
  142645. "adc r4, r4, r11\n\t"
  142646. "adds r10, r10, r5\n\t"
  142647. "str r10, [%[a], #12]\n\t"
  142648. "adc r4, r4, #0\n\t"
  142649. /* a[i+4] += m[4] * mu */
  142650. "ldr r7, [%[m], #16]\n\t"
  142651. "ldr r10, [%[a], #16]\n\t"
  142652. "lsr r11, r7, #16\n\t"
  142653. "lsr r6, r8, #16\n\t"
  142654. "mul r5, r6, r11\n\t"
  142655. "lsl r11, r7, #16\n\t"
  142656. "lsr r11, r11, #16\n\t"
  142657. "mul r6, r11, r6\n\t"
  142658. "lsr r11, r6, #16\n\t"
  142659. "lsl r6, r6, #16\n\t"
  142660. "adds r10, r10, r6\n\t"
  142661. "adc r5, r5, r11\n\t"
  142662. "lsl r6, r8, #16\n\t"
  142663. "lsl r11, r7, #16\n\t"
  142664. "lsr r6, r6, #16\n\t"
  142665. "lsr r11, r11, #16\n\t"
  142666. "mul r11, r6, r11\n\t"
  142667. "adds r10, r10, r11\n\t"
  142668. "adc r5, r5, #0\n\t"
  142669. "lsr r11, r7, #16\n\t"
  142670. "mul r6, r11, r6\n\t"
  142671. "lsr r11, r6, #16\n\t"
  142672. "lsl r6, r6, #16\n\t"
  142673. "adds r10, r10, r6\n\t"
  142674. "adc r5, r5, r11\n\t"
  142675. "adds r10, r10, r4\n\t"
  142676. "str r10, [%[a], #16]\n\t"
  142677. "adc r5, r5, #0\n\t"
  142678. /* a[i+5] += m[5] * mu */
  142679. "ldr r7, [%[m], #20]\n\t"
  142680. "ldr r10, [%[a], #20]\n\t"
  142681. "lsr r11, r7, #16\n\t"
  142682. "lsr r6, r8, #16\n\t"
  142683. "mul r4, r6, r11\n\t"
  142684. "lsl r11, r7, #16\n\t"
  142685. "lsr r11, r11, #16\n\t"
  142686. "mul r6, r11, r6\n\t"
  142687. "lsr r11, r6, #16\n\t"
  142688. "lsl r6, r6, #16\n\t"
  142689. "adds r10, r10, r6\n\t"
  142690. "adc r4, r4, r11\n\t"
  142691. "lsl r6, r8, #16\n\t"
  142692. "lsl r11, r7, #16\n\t"
  142693. "lsr r6, r6, #16\n\t"
  142694. "lsr r11, r11, #16\n\t"
  142695. "mul r11, r6, r11\n\t"
  142696. "adds r10, r10, r11\n\t"
  142697. "adc r4, r4, #0\n\t"
  142698. "lsr r11, r7, #16\n\t"
  142699. "mul r6, r11, r6\n\t"
  142700. "lsr r11, r6, #16\n\t"
  142701. "lsl r6, r6, #16\n\t"
  142702. "adds r10, r10, r6\n\t"
  142703. "adc r4, r4, r11\n\t"
  142704. "adds r10, r10, r5\n\t"
  142705. "str r10, [%[a], #20]\n\t"
  142706. "adc r4, r4, #0\n\t"
  142707. /* a[i+6] += m[6] * mu */
  142708. "ldr r7, [%[m], #24]\n\t"
  142709. "ldr r10, [%[a], #24]\n\t"
  142710. "lsr r11, r7, #16\n\t"
  142711. "lsr r6, r8, #16\n\t"
  142712. "mul r5, r6, r11\n\t"
  142713. "lsl r11, r7, #16\n\t"
  142714. "lsr r11, r11, #16\n\t"
  142715. "mul r6, r11, r6\n\t"
  142716. "lsr r11, r6, #16\n\t"
  142717. "lsl r6, r6, #16\n\t"
  142718. "adds r10, r10, r6\n\t"
  142719. "adc r5, r5, r11\n\t"
  142720. "lsl r6, r8, #16\n\t"
  142721. "lsl r11, r7, #16\n\t"
  142722. "lsr r6, r6, #16\n\t"
  142723. "lsr r11, r11, #16\n\t"
  142724. "mul r11, r6, r11\n\t"
  142725. "adds r10, r10, r11\n\t"
  142726. "adc r5, r5, #0\n\t"
  142727. "lsr r11, r7, #16\n\t"
  142728. "mul r6, r11, r6\n\t"
  142729. "lsr r11, r6, #16\n\t"
  142730. "lsl r6, r6, #16\n\t"
  142731. "adds r10, r10, r6\n\t"
  142732. "adc r5, r5, r11\n\t"
  142733. "adds r10, r10, r4\n\t"
  142734. "str r10, [%[a], #24]\n\t"
  142735. "adc r5, r5, #0\n\t"
  142736. /* a[i+7] += m[7] * mu */
  142737. "ldr r7, [%[m], #28]\n\t"
  142738. "ldr r10, [%[a], #28]\n\t"
  142739. "lsr r11, r7, #16\n\t"
  142740. "lsr r6, r8, #16\n\t"
  142741. "mul r4, r6, r11\n\t"
  142742. "lsl r11, r7, #16\n\t"
  142743. "lsr r11, r11, #16\n\t"
  142744. "mul r6, r11, r6\n\t"
  142745. "lsr r11, r6, #16\n\t"
  142746. "lsl r6, r6, #16\n\t"
  142747. "adds r10, r10, r6\n\t"
  142748. "adc r4, r4, r11\n\t"
  142749. "lsl r6, r8, #16\n\t"
  142750. "lsl r11, r7, #16\n\t"
  142751. "lsr r6, r6, #16\n\t"
  142752. "lsr r11, r11, #16\n\t"
  142753. "mul r11, r6, r11\n\t"
  142754. "adds r10, r10, r11\n\t"
  142755. "adc r4, r4, #0\n\t"
  142756. "lsr r11, r7, #16\n\t"
  142757. "mul r6, r11, r6\n\t"
  142758. "lsr r11, r6, #16\n\t"
  142759. "lsl r6, r6, #16\n\t"
  142760. "adds r10, r10, r6\n\t"
  142761. "adc r4, r4, r11\n\t"
  142762. "adds r10, r10, r5\n\t"
  142763. "str r10, [%[a], #28]\n\t"
  142764. "adc r4, r4, #0\n\t"
  142765. /* a[i+8] += m[8] * mu */
  142766. "ldr r7, [%[m], #32]\n\t"
  142767. "ldr r10, [%[a], #32]\n\t"
  142768. "lsr r11, r7, #16\n\t"
  142769. "lsr r6, r8, #16\n\t"
  142770. "mul r5, r6, r11\n\t"
  142771. "lsl r11, r7, #16\n\t"
  142772. "lsr r11, r11, #16\n\t"
  142773. "mul r6, r11, r6\n\t"
  142774. "lsr r11, r6, #16\n\t"
  142775. "lsl r6, r6, #16\n\t"
  142776. "adds r10, r10, r6\n\t"
  142777. "adc r5, r5, r11\n\t"
  142778. "lsl r6, r8, #16\n\t"
  142779. "lsl r11, r7, #16\n\t"
  142780. "lsr r6, r6, #16\n\t"
  142781. "lsr r11, r11, #16\n\t"
  142782. "mul r11, r6, r11\n\t"
  142783. "adds r10, r10, r11\n\t"
  142784. "adc r5, r5, #0\n\t"
  142785. "lsr r11, r7, #16\n\t"
  142786. "mul r6, r11, r6\n\t"
  142787. "lsr r11, r6, #16\n\t"
  142788. "lsl r6, r6, #16\n\t"
  142789. "adds r10, r10, r6\n\t"
  142790. "adc r5, r5, r11\n\t"
  142791. "adds r10, r10, r4\n\t"
  142792. "str r10, [%[a], #32]\n\t"
  142793. "adc r5, r5, #0\n\t"
  142794. /* a[i+9] += m[9] * mu */
  142795. "ldr r7, [%[m], #36]\n\t"
  142796. "ldr r10, [%[a], #36]\n\t"
  142797. "lsr r11, r7, #16\n\t"
  142798. "lsr r6, r8, #16\n\t"
  142799. "mul r4, r6, r11\n\t"
  142800. "lsl r11, r7, #16\n\t"
  142801. "lsr r11, r11, #16\n\t"
  142802. "mul r6, r11, r6\n\t"
  142803. "lsr r11, r6, #16\n\t"
  142804. "lsl r6, r6, #16\n\t"
  142805. "adds r10, r10, r6\n\t"
  142806. "adc r4, r4, r11\n\t"
  142807. "lsl r6, r8, #16\n\t"
  142808. "lsl r11, r7, #16\n\t"
  142809. "lsr r6, r6, #16\n\t"
  142810. "lsr r11, r11, #16\n\t"
  142811. "mul r11, r6, r11\n\t"
  142812. "adds r10, r10, r11\n\t"
  142813. "adc r4, r4, #0\n\t"
  142814. "lsr r11, r7, #16\n\t"
  142815. "mul r6, r11, r6\n\t"
  142816. "lsr r11, r6, #16\n\t"
  142817. "lsl r6, r6, #16\n\t"
  142818. "adds r10, r10, r6\n\t"
  142819. "adc r4, r4, r11\n\t"
  142820. "adds r10, r10, r5\n\t"
  142821. "str r10, [%[a], #36]\n\t"
  142822. "adc r4, r4, #0\n\t"
  142823. /* a[i+10] += m[10] * mu */
  142824. "ldr r7, [%[m], #40]\n\t"
  142825. "ldr r10, [%[a], #40]\n\t"
  142826. "lsr r11, r7, #16\n\t"
  142827. "lsr r6, r8, #16\n\t"
  142828. "mul r5, r6, r11\n\t"
  142829. "lsl r11, r7, #16\n\t"
  142830. "lsr r11, r11, #16\n\t"
  142831. "mul r6, r11, r6\n\t"
  142832. "lsr r11, r6, #16\n\t"
  142833. "lsl r6, r6, #16\n\t"
  142834. "adds r10, r10, r6\n\t"
  142835. "adc r5, r5, r11\n\t"
  142836. "lsl r6, r8, #16\n\t"
  142837. "lsl r11, r7, #16\n\t"
  142838. "lsr r6, r6, #16\n\t"
  142839. "lsr r11, r11, #16\n\t"
  142840. "mul r11, r6, r11\n\t"
  142841. "adds r10, r10, r11\n\t"
  142842. "adc r5, r5, #0\n\t"
  142843. "lsr r11, r7, #16\n\t"
  142844. "mul r6, r11, r6\n\t"
  142845. "lsr r11, r6, #16\n\t"
  142846. "lsl r6, r6, #16\n\t"
  142847. "adds r10, r10, r6\n\t"
  142848. "adc r5, r5, r11\n\t"
  142849. "adds r10, r10, r4\n\t"
  142850. "str r10, [%[a], #40]\n\t"
  142851. "adc r5, r5, #0\n\t"
  142852. /* a[i+11] += m[11] * mu */
  142853. "ldr r7, [%[m], #44]\n\t"
  142854. "ldr r10, [%[a], #44]\n\t"
  142855. "lsr r11, r7, #16\n\t"
  142856. "lsr r6, r8, #16\n\t"
  142857. "mul r4, r6, r11\n\t"
  142858. "lsl r11, r7, #16\n\t"
  142859. "lsr r11, r11, #16\n\t"
  142860. "mul r6, r11, r6\n\t"
  142861. "lsr r11, r6, #16\n\t"
  142862. "lsl r6, r6, #16\n\t"
  142863. "adds r10, r10, r6\n\t"
  142864. "adc r4, r4, r11\n\t"
  142865. "lsl r6, r8, #16\n\t"
  142866. "lsl r11, r7, #16\n\t"
  142867. "lsr r6, r6, #16\n\t"
  142868. "lsr r11, r11, #16\n\t"
  142869. "mul r11, r6, r11\n\t"
  142870. "adds r10, r10, r11\n\t"
  142871. "adc r4, r4, #0\n\t"
  142872. "lsr r11, r7, #16\n\t"
  142873. "mul r6, r11, r6\n\t"
  142874. "lsr r11, r6, #16\n\t"
  142875. "lsl r6, r6, #16\n\t"
  142876. "adds r10, r10, r6\n\t"
  142877. "adc r4, r4, r11\n\t"
  142878. "adds r10, r10, r5\n\t"
  142879. "str r10, [%[a], #44]\n\t"
  142880. "adc r4, r4, #0\n\t"
  142881. /* a[i+12] += m[12] * mu */
  142882. "ldr r7, [%[m], #48]\n\t"
  142883. "ldr r10, [%[a], #48]\n\t"
  142884. "lsr r11, r7, #16\n\t"
  142885. "lsr r6, r8, #16\n\t"
  142886. "mul r5, r6, r11\n\t"
  142887. "lsl r11, r7, #16\n\t"
  142888. "lsr r11, r11, #16\n\t"
  142889. "mul r6, r11, r6\n\t"
  142890. "lsr r11, r6, #16\n\t"
  142891. "lsl r6, r6, #16\n\t"
  142892. "adds r10, r10, r6\n\t"
  142893. "adc r5, r5, r11\n\t"
  142894. "lsl r6, r8, #16\n\t"
  142895. "lsl r11, r7, #16\n\t"
  142896. "lsr r6, r6, #16\n\t"
  142897. "lsr r11, r11, #16\n\t"
  142898. "mul r11, r6, r11\n\t"
  142899. "adds r10, r10, r11\n\t"
  142900. "adc r5, r5, #0\n\t"
  142901. "lsr r11, r7, #16\n\t"
  142902. "mul r6, r11, r6\n\t"
  142903. "lsr r11, r6, #16\n\t"
  142904. "lsl r6, r6, #16\n\t"
  142905. "adds r10, r10, r6\n\t"
  142906. "adc r5, r5, r11\n\t"
  142907. "adds r10, r10, r4\n\t"
  142908. "str r10, [%[a], #48]\n\t"
  142909. "adc r5, r5, #0\n\t"
  142910. /* a[i+13] += m[13] * mu */
  142911. "ldr r7, [%[m], #52]\n\t"
  142912. "ldr r10, [%[a], #52]\n\t"
  142913. "lsr r11, r7, #16\n\t"
  142914. "lsr r6, r8, #16\n\t"
  142915. "mul r4, r6, r11\n\t"
  142916. "lsl r11, r7, #16\n\t"
  142917. "lsr r11, r11, #16\n\t"
  142918. "mul r6, r11, r6\n\t"
  142919. "lsr r11, r6, #16\n\t"
  142920. "lsl r6, r6, #16\n\t"
  142921. "adds r10, r10, r6\n\t"
  142922. "adc r4, r4, r11\n\t"
  142923. "lsl r6, r8, #16\n\t"
  142924. "lsl r11, r7, #16\n\t"
  142925. "lsr r6, r6, #16\n\t"
  142926. "lsr r11, r11, #16\n\t"
  142927. "mul r11, r6, r11\n\t"
  142928. "adds r10, r10, r11\n\t"
  142929. "adc r4, r4, #0\n\t"
  142930. "lsr r11, r7, #16\n\t"
  142931. "mul r6, r11, r6\n\t"
  142932. "lsr r11, r6, #16\n\t"
  142933. "lsl r6, r6, #16\n\t"
  142934. "adds r10, r10, r6\n\t"
  142935. "adc r4, r4, r11\n\t"
  142936. "adds r10, r10, r5\n\t"
  142937. "str r10, [%[a], #52]\n\t"
  142938. "adc r4, r4, #0\n\t"
  142939. /* a[i+14] += m[14] * mu */
  142940. "ldr r7, [%[m], #56]\n\t"
  142941. "ldr r10, [%[a], #56]\n\t"
  142942. "lsr r11, r7, #16\n\t"
  142943. "lsr r6, r8, #16\n\t"
  142944. "mul r5, r6, r11\n\t"
  142945. "lsl r11, r7, #16\n\t"
  142946. "lsr r11, r11, #16\n\t"
  142947. "mul r6, r11, r6\n\t"
  142948. "lsr r11, r6, #16\n\t"
  142949. "lsl r6, r6, #16\n\t"
  142950. "adds r10, r10, r6\n\t"
  142951. "adc r5, r5, r11\n\t"
  142952. "lsl r6, r8, #16\n\t"
  142953. "lsl r11, r7, #16\n\t"
  142954. "lsr r6, r6, #16\n\t"
  142955. "lsr r11, r11, #16\n\t"
  142956. "mul r11, r6, r11\n\t"
  142957. "adds r10, r10, r11\n\t"
  142958. "adc r5, r5, #0\n\t"
  142959. "lsr r11, r7, #16\n\t"
  142960. "mul r6, r11, r6\n\t"
  142961. "lsr r11, r6, #16\n\t"
  142962. "lsl r6, r6, #16\n\t"
  142963. "adds r10, r10, r6\n\t"
  142964. "adc r5, r5, r11\n\t"
  142965. "adds r10, r10, r4\n\t"
  142966. "str r10, [%[a], #56]\n\t"
  142967. "adc r5, r5, #0\n\t"
  142968. /* a[i+15] += m[15] * mu */
  142969. "ldr r7, [%[m], #60]\n\t"
  142970. "ldr r10, [%[a], #60]\n\t"
  142971. "lsr r11, r7, #16\n\t"
  142972. "lsr r6, r8, #16\n\t"
  142973. "mul r4, r6, r11\n\t"
  142974. "lsl r11, r7, #16\n\t"
  142975. "lsr r11, r11, #16\n\t"
  142976. "mul r6, r11, r6\n\t"
  142977. "lsr r11, r6, #16\n\t"
  142978. "lsl r6, r6, #16\n\t"
  142979. "adds r10, r10, r6\n\t"
  142980. "adc r4, r4, r11\n\t"
  142981. "lsl r6, r8, #16\n\t"
  142982. "lsl r11, r7, #16\n\t"
  142983. "lsr r6, r6, #16\n\t"
  142984. "lsr r11, r11, #16\n\t"
  142985. "mul r11, r6, r11\n\t"
  142986. "adds r10, r10, r11\n\t"
  142987. "adc r4, r4, #0\n\t"
  142988. "lsr r11, r7, #16\n\t"
  142989. "mul r6, r11, r6\n\t"
  142990. "lsr r11, r6, #16\n\t"
  142991. "lsl r6, r6, #16\n\t"
  142992. "adds r10, r10, r6\n\t"
  142993. "adc r4, r4, r11\n\t"
  142994. "adds r10, r10, r5\n\t"
  142995. "str r10, [%[a], #60]\n\t"
  142996. "adc r4, r4, #0\n\t"
  142997. /* a[i+16] += m[16] * mu */
  142998. "ldr r7, [%[m], #64]\n\t"
  142999. "ldr r10, [%[a], #64]\n\t"
  143000. "lsr r11, r7, #16\n\t"
  143001. "lsr r6, r8, #16\n\t"
  143002. "mul r5, r6, r11\n\t"
  143003. "lsl r11, r7, #16\n\t"
  143004. "lsr r11, r11, #16\n\t"
  143005. "mul r6, r11, r6\n\t"
  143006. "lsr r11, r6, #16\n\t"
  143007. "lsl r6, r6, #16\n\t"
  143008. "adds r10, r10, r6\n\t"
  143009. "adc r5, r5, r11\n\t"
  143010. "lsl r6, r8, #16\n\t"
  143011. "lsl r11, r7, #16\n\t"
  143012. "lsr r6, r6, #16\n\t"
  143013. "lsr r11, r11, #16\n\t"
  143014. "mul r11, r6, r11\n\t"
  143015. "adds r10, r10, r11\n\t"
  143016. "adc r5, r5, #0\n\t"
  143017. "lsr r11, r7, #16\n\t"
  143018. "mul r6, r11, r6\n\t"
  143019. "lsr r11, r6, #16\n\t"
  143020. "lsl r6, r6, #16\n\t"
  143021. "adds r10, r10, r6\n\t"
  143022. "adc r5, r5, r11\n\t"
  143023. "adds r10, r10, r4\n\t"
  143024. "str r10, [%[a], #64]\n\t"
  143025. "adc r5, r5, #0\n\t"
  143026. /* a[i+17] += m[17] * mu */
  143027. "ldr r7, [%[m], #68]\n\t"
  143028. "ldr r10, [%[a], #68]\n\t"
  143029. "lsr r11, r7, #16\n\t"
  143030. "lsr r6, r8, #16\n\t"
  143031. "mul r4, r6, r11\n\t"
  143032. "lsl r11, r7, #16\n\t"
  143033. "lsr r11, r11, #16\n\t"
  143034. "mul r6, r11, r6\n\t"
  143035. "lsr r11, r6, #16\n\t"
  143036. "lsl r6, r6, #16\n\t"
  143037. "adds r10, r10, r6\n\t"
  143038. "adc r4, r4, r11\n\t"
  143039. "lsl r6, r8, #16\n\t"
  143040. "lsl r11, r7, #16\n\t"
  143041. "lsr r6, r6, #16\n\t"
  143042. "lsr r11, r11, #16\n\t"
  143043. "mul r11, r6, r11\n\t"
  143044. "adds r10, r10, r11\n\t"
  143045. "adc r4, r4, #0\n\t"
  143046. "lsr r11, r7, #16\n\t"
  143047. "mul r6, r11, r6\n\t"
  143048. "lsr r11, r6, #16\n\t"
  143049. "lsl r6, r6, #16\n\t"
  143050. "adds r10, r10, r6\n\t"
  143051. "adc r4, r4, r11\n\t"
  143052. "adds r10, r10, r5\n\t"
  143053. "str r10, [%[a], #68]\n\t"
  143054. "adc r4, r4, #0\n\t"
  143055. /* a[i+18] += m[18] * mu */
  143056. "ldr r7, [%[m], #72]\n\t"
  143057. "ldr r10, [%[a], #72]\n\t"
  143058. "lsr r11, r7, #16\n\t"
  143059. "lsr r6, r8, #16\n\t"
  143060. "mul r5, r6, r11\n\t"
  143061. "lsl r11, r7, #16\n\t"
  143062. "lsr r11, r11, #16\n\t"
  143063. "mul r6, r11, r6\n\t"
  143064. "lsr r11, r6, #16\n\t"
  143065. "lsl r6, r6, #16\n\t"
  143066. "adds r10, r10, r6\n\t"
  143067. "adc r5, r5, r11\n\t"
  143068. "lsl r6, r8, #16\n\t"
  143069. "lsl r11, r7, #16\n\t"
  143070. "lsr r6, r6, #16\n\t"
  143071. "lsr r11, r11, #16\n\t"
  143072. "mul r11, r6, r11\n\t"
  143073. "adds r10, r10, r11\n\t"
  143074. "adc r5, r5, #0\n\t"
  143075. "lsr r11, r7, #16\n\t"
  143076. "mul r6, r11, r6\n\t"
  143077. "lsr r11, r6, #16\n\t"
  143078. "lsl r6, r6, #16\n\t"
  143079. "adds r10, r10, r6\n\t"
  143080. "adc r5, r5, r11\n\t"
  143081. "adds r10, r10, r4\n\t"
  143082. "str r10, [%[a], #72]\n\t"
  143083. "adc r5, r5, #0\n\t"
  143084. /* a[i+19] += m[19] * mu */
  143085. "ldr r7, [%[m], #76]\n\t"
  143086. "ldr r10, [%[a], #76]\n\t"
  143087. "lsr r11, r7, #16\n\t"
  143088. "lsr r6, r8, #16\n\t"
  143089. "mul r4, r6, r11\n\t"
  143090. "lsl r11, r7, #16\n\t"
  143091. "lsr r11, r11, #16\n\t"
  143092. "mul r6, r11, r6\n\t"
  143093. "lsr r11, r6, #16\n\t"
  143094. "lsl r6, r6, #16\n\t"
  143095. "adds r10, r10, r6\n\t"
  143096. "adc r4, r4, r11\n\t"
  143097. "lsl r6, r8, #16\n\t"
  143098. "lsl r11, r7, #16\n\t"
  143099. "lsr r6, r6, #16\n\t"
  143100. "lsr r11, r11, #16\n\t"
  143101. "mul r11, r6, r11\n\t"
  143102. "adds r10, r10, r11\n\t"
  143103. "adc r4, r4, #0\n\t"
  143104. "lsr r11, r7, #16\n\t"
  143105. "mul r6, r11, r6\n\t"
  143106. "lsr r11, r6, #16\n\t"
  143107. "lsl r6, r6, #16\n\t"
  143108. "adds r10, r10, r6\n\t"
  143109. "adc r4, r4, r11\n\t"
  143110. "adds r10, r10, r5\n\t"
  143111. "str r10, [%[a], #76]\n\t"
  143112. "adc r4, r4, #0\n\t"
  143113. /* a[i+20] += m[20] * mu */
  143114. "ldr r7, [%[m], #80]\n\t"
  143115. "ldr r10, [%[a], #80]\n\t"
  143116. "lsr r11, r7, #16\n\t"
  143117. "lsr r6, r8, #16\n\t"
  143118. "mul r5, r6, r11\n\t"
  143119. "lsl r11, r7, #16\n\t"
  143120. "lsr r11, r11, #16\n\t"
  143121. "mul r6, r11, r6\n\t"
  143122. "lsr r11, r6, #16\n\t"
  143123. "lsl r6, r6, #16\n\t"
  143124. "adds r10, r10, r6\n\t"
  143125. "adc r5, r5, r11\n\t"
  143126. "lsl r6, r8, #16\n\t"
  143127. "lsl r11, r7, #16\n\t"
  143128. "lsr r6, r6, #16\n\t"
  143129. "lsr r11, r11, #16\n\t"
  143130. "mul r11, r6, r11\n\t"
  143131. "adds r10, r10, r11\n\t"
  143132. "adc r5, r5, #0\n\t"
  143133. "lsr r11, r7, #16\n\t"
  143134. "mul r6, r11, r6\n\t"
  143135. "lsr r11, r6, #16\n\t"
  143136. "lsl r6, r6, #16\n\t"
  143137. "adds r10, r10, r6\n\t"
  143138. "adc r5, r5, r11\n\t"
  143139. "adds r10, r10, r4\n\t"
  143140. "str r10, [%[a], #80]\n\t"
  143141. "adc r5, r5, #0\n\t"
  143142. /* a[i+21] += m[21] * mu */
  143143. "ldr r7, [%[m], #84]\n\t"
  143144. "ldr r10, [%[a], #84]\n\t"
  143145. "lsr r11, r7, #16\n\t"
  143146. "lsr r6, r8, #16\n\t"
  143147. "mul r4, r6, r11\n\t"
  143148. "lsl r11, r7, #16\n\t"
  143149. "lsr r11, r11, #16\n\t"
  143150. "mul r6, r11, r6\n\t"
  143151. "lsr r11, r6, #16\n\t"
  143152. "lsl r6, r6, #16\n\t"
  143153. "adds r10, r10, r6\n\t"
  143154. "adc r4, r4, r11\n\t"
  143155. "lsl r6, r8, #16\n\t"
  143156. "lsl r11, r7, #16\n\t"
  143157. "lsr r6, r6, #16\n\t"
  143158. "lsr r11, r11, #16\n\t"
  143159. "mul r11, r6, r11\n\t"
  143160. "adds r10, r10, r11\n\t"
  143161. "adc r4, r4, #0\n\t"
  143162. "lsr r11, r7, #16\n\t"
  143163. "mul r6, r11, r6\n\t"
  143164. "lsr r11, r6, #16\n\t"
  143165. "lsl r6, r6, #16\n\t"
  143166. "adds r10, r10, r6\n\t"
  143167. "adc r4, r4, r11\n\t"
  143168. "adds r10, r10, r5\n\t"
  143169. "str r10, [%[a], #84]\n\t"
  143170. "adc r4, r4, #0\n\t"
  143171. /* a[i+22] += m[22] * mu */
  143172. "ldr r7, [%[m], #88]\n\t"
  143173. "ldr r10, [%[a], #88]\n\t"
  143174. "lsr r11, r7, #16\n\t"
  143175. "lsr r6, r8, #16\n\t"
  143176. "mul r5, r6, r11\n\t"
  143177. "lsl r11, r7, #16\n\t"
  143178. "lsr r11, r11, #16\n\t"
  143179. "mul r6, r11, r6\n\t"
  143180. "lsr r11, r6, #16\n\t"
  143181. "lsl r6, r6, #16\n\t"
  143182. "adds r10, r10, r6\n\t"
  143183. "adc r5, r5, r11\n\t"
  143184. "lsl r6, r8, #16\n\t"
  143185. "lsl r11, r7, #16\n\t"
  143186. "lsr r6, r6, #16\n\t"
  143187. "lsr r11, r11, #16\n\t"
  143188. "mul r11, r6, r11\n\t"
  143189. "adds r10, r10, r11\n\t"
  143190. "adc r5, r5, #0\n\t"
  143191. "lsr r11, r7, #16\n\t"
  143192. "mul r6, r11, r6\n\t"
  143193. "lsr r11, r6, #16\n\t"
  143194. "lsl r6, r6, #16\n\t"
  143195. "adds r10, r10, r6\n\t"
  143196. "adc r5, r5, r11\n\t"
  143197. "adds r10, r10, r4\n\t"
  143198. "str r10, [%[a], #88]\n\t"
  143199. "adc r5, r5, #0\n\t"
  143200. /* a[i+23] += m[23] * mu */
  143201. "ldr r7, [%[m], #92]\n\t"
  143202. "ldr r10, [%[a], #92]\n\t"
  143203. "lsr r11, r7, #16\n\t"
  143204. "lsr r6, r8, #16\n\t"
  143205. "mul r4, r6, r11\n\t"
  143206. "lsl r11, r7, #16\n\t"
  143207. "lsr r11, r11, #16\n\t"
  143208. "mul r6, r11, r6\n\t"
  143209. "lsr r11, r6, #16\n\t"
  143210. "lsl r6, r6, #16\n\t"
  143211. "adds r10, r10, r6\n\t"
  143212. "adc r4, r4, r11\n\t"
  143213. "lsl r6, r8, #16\n\t"
  143214. "lsl r11, r7, #16\n\t"
  143215. "lsr r6, r6, #16\n\t"
  143216. "lsr r11, r11, #16\n\t"
  143217. "mul r11, r6, r11\n\t"
  143218. "adds r10, r10, r11\n\t"
  143219. "adc r4, r4, #0\n\t"
  143220. "lsr r11, r7, #16\n\t"
  143221. "mul r6, r11, r6\n\t"
  143222. "lsr r11, r6, #16\n\t"
  143223. "lsl r6, r6, #16\n\t"
  143224. "adds r10, r10, r6\n\t"
  143225. "adc r4, r4, r11\n\t"
  143226. "adds r10, r10, r5\n\t"
  143227. "str r10, [%[a], #92]\n\t"
  143228. "adc r4, r4, #0\n\t"
  143229. /* a[i+24] += m[24] * mu */
  143230. "ldr r7, [%[m], #96]\n\t"
  143231. "ldr r10, [%[a], #96]\n\t"
  143232. "lsr r11, r7, #16\n\t"
  143233. "lsr r6, r8, #16\n\t"
  143234. "mul r5, r6, r11\n\t"
  143235. "lsl r11, r7, #16\n\t"
  143236. "lsr r11, r11, #16\n\t"
  143237. "mul r6, r11, r6\n\t"
  143238. "lsr r11, r6, #16\n\t"
  143239. "lsl r6, r6, #16\n\t"
  143240. "adds r10, r10, r6\n\t"
  143241. "adc r5, r5, r11\n\t"
  143242. "lsl r6, r8, #16\n\t"
  143243. "lsl r11, r7, #16\n\t"
  143244. "lsr r6, r6, #16\n\t"
  143245. "lsr r11, r11, #16\n\t"
  143246. "mul r11, r6, r11\n\t"
  143247. "adds r10, r10, r11\n\t"
  143248. "adc r5, r5, #0\n\t"
  143249. "lsr r11, r7, #16\n\t"
  143250. "mul r6, r11, r6\n\t"
  143251. "lsr r11, r6, #16\n\t"
  143252. "lsl r6, r6, #16\n\t"
  143253. "adds r10, r10, r6\n\t"
  143254. "adc r5, r5, r11\n\t"
  143255. "adds r10, r10, r4\n\t"
  143256. "str r10, [%[a], #96]\n\t"
  143257. "adc r5, r5, #0\n\t"
  143258. /* a[i+25] += m[25] * mu */
  143259. "ldr r7, [%[m], #100]\n\t"
  143260. "ldr r10, [%[a], #100]\n\t"
  143261. "lsr r11, r7, #16\n\t"
  143262. "lsr r6, r8, #16\n\t"
  143263. "mul r4, r6, r11\n\t"
  143264. "lsl r11, r7, #16\n\t"
  143265. "lsr r11, r11, #16\n\t"
  143266. "mul r6, r11, r6\n\t"
  143267. "lsr r11, r6, #16\n\t"
  143268. "lsl r6, r6, #16\n\t"
  143269. "adds r10, r10, r6\n\t"
  143270. "adc r4, r4, r11\n\t"
  143271. "lsl r6, r8, #16\n\t"
  143272. "lsl r11, r7, #16\n\t"
  143273. "lsr r6, r6, #16\n\t"
  143274. "lsr r11, r11, #16\n\t"
  143275. "mul r11, r6, r11\n\t"
  143276. "adds r10, r10, r11\n\t"
  143277. "adc r4, r4, #0\n\t"
  143278. "lsr r11, r7, #16\n\t"
  143279. "mul r6, r11, r6\n\t"
  143280. "lsr r11, r6, #16\n\t"
  143281. "lsl r6, r6, #16\n\t"
  143282. "adds r10, r10, r6\n\t"
  143283. "adc r4, r4, r11\n\t"
  143284. "adds r10, r10, r5\n\t"
  143285. "str r10, [%[a], #100]\n\t"
  143286. "adc r4, r4, #0\n\t"
  143287. /* a[i+26] += m[26] * mu */
  143288. "ldr r7, [%[m], #104]\n\t"
  143289. "ldr r10, [%[a], #104]\n\t"
  143290. "lsr r11, r7, #16\n\t"
  143291. "lsr r6, r8, #16\n\t"
  143292. "mul r5, r6, r11\n\t"
  143293. "lsl r11, r7, #16\n\t"
  143294. "lsr r11, r11, #16\n\t"
  143295. "mul r6, r11, r6\n\t"
  143296. "lsr r11, r6, #16\n\t"
  143297. "lsl r6, r6, #16\n\t"
  143298. "adds r10, r10, r6\n\t"
  143299. "adc r5, r5, r11\n\t"
  143300. "lsl r6, r8, #16\n\t"
  143301. "lsl r11, r7, #16\n\t"
  143302. "lsr r6, r6, #16\n\t"
  143303. "lsr r11, r11, #16\n\t"
  143304. "mul r11, r6, r11\n\t"
  143305. "adds r10, r10, r11\n\t"
  143306. "adc r5, r5, #0\n\t"
  143307. "lsr r11, r7, #16\n\t"
  143308. "mul r6, r11, r6\n\t"
  143309. "lsr r11, r6, #16\n\t"
  143310. "lsl r6, r6, #16\n\t"
  143311. "adds r10, r10, r6\n\t"
  143312. "adc r5, r5, r11\n\t"
  143313. "adds r10, r10, r4\n\t"
  143314. "str r10, [%[a], #104]\n\t"
  143315. "adc r5, r5, #0\n\t"
  143316. /* a[i+27] += m[27] * mu */
  143317. "ldr r7, [%[m], #108]\n\t"
  143318. "ldr r10, [%[a], #108]\n\t"
  143319. "lsr r11, r7, #16\n\t"
  143320. "lsr r6, r8, #16\n\t"
  143321. "mul r4, r6, r11\n\t"
  143322. "lsl r11, r7, #16\n\t"
  143323. "lsr r11, r11, #16\n\t"
  143324. "mul r6, r11, r6\n\t"
  143325. "lsr r11, r6, #16\n\t"
  143326. "lsl r6, r6, #16\n\t"
  143327. "adds r10, r10, r6\n\t"
  143328. "adc r4, r4, r11\n\t"
  143329. "lsl r6, r8, #16\n\t"
  143330. "lsl r11, r7, #16\n\t"
  143331. "lsr r6, r6, #16\n\t"
  143332. "lsr r11, r11, #16\n\t"
  143333. "mul r11, r6, r11\n\t"
  143334. "adds r10, r10, r11\n\t"
  143335. "adc r4, r4, #0\n\t"
  143336. "lsr r11, r7, #16\n\t"
  143337. "mul r6, r11, r6\n\t"
  143338. "lsr r11, r6, #16\n\t"
  143339. "lsl r6, r6, #16\n\t"
  143340. "adds r10, r10, r6\n\t"
  143341. "adc r4, r4, r11\n\t"
  143342. "adds r10, r10, r5\n\t"
  143343. "str r10, [%[a], #108]\n\t"
  143344. "adc r4, r4, #0\n\t"
  143345. /* a[i+28] += m[28] * mu */
  143346. "ldr r7, [%[m], #112]\n\t"
  143347. "ldr r10, [%[a], #112]\n\t"
  143348. "lsr r11, r7, #16\n\t"
  143349. "lsr r6, r8, #16\n\t"
  143350. "mul r5, r6, r11\n\t"
  143351. "lsl r11, r7, #16\n\t"
  143352. "lsr r11, r11, #16\n\t"
  143353. "mul r6, r11, r6\n\t"
  143354. "lsr r11, r6, #16\n\t"
  143355. "lsl r6, r6, #16\n\t"
  143356. "adds r10, r10, r6\n\t"
  143357. "adc r5, r5, r11\n\t"
  143358. "lsl r6, r8, #16\n\t"
  143359. "lsl r11, r7, #16\n\t"
  143360. "lsr r6, r6, #16\n\t"
  143361. "lsr r11, r11, #16\n\t"
  143362. "mul r11, r6, r11\n\t"
  143363. "adds r10, r10, r11\n\t"
  143364. "adc r5, r5, #0\n\t"
  143365. "lsr r11, r7, #16\n\t"
  143366. "mul r6, r11, r6\n\t"
  143367. "lsr r11, r6, #16\n\t"
  143368. "lsl r6, r6, #16\n\t"
  143369. "adds r10, r10, r6\n\t"
  143370. "adc r5, r5, r11\n\t"
  143371. "adds r10, r10, r4\n\t"
  143372. "str r10, [%[a], #112]\n\t"
  143373. "adc r5, r5, #0\n\t"
  143374. /* a[i+29] += m[29] * mu */
  143375. "ldr r7, [%[m], #116]\n\t"
  143376. "ldr r10, [%[a], #116]\n\t"
  143377. "lsr r11, r7, #16\n\t"
  143378. "lsr r6, r8, #16\n\t"
  143379. "mul r4, r6, r11\n\t"
  143380. "lsl r11, r7, #16\n\t"
  143381. "lsr r11, r11, #16\n\t"
  143382. "mul r6, r11, r6\n\t"
  143383. "lsr r11, r6, #16\n\t"
  143384. "lsl r6, r6, #16\n\t"
  143385. "adds r10, r10, r6\n\t"
  143386. "adc r4, r4, r11\n\t"
  143387. "lsl r6, r8, #16\n\t"
  143388. "lsl r11, r7, #16\n\t"
  143389. "lsr r6, r6, #16\n\t"
  143390. "lsr r11, r11, #16\n\t"
  143391. "mul r11, r6, r11\n\t"
  143392. "adds r10, r10, r11\n\t"
  143393. "adc r4, r4, #0\n\t"
  143394. "lsr r11, r7, #16\n\t"
  143395. "mul r6, r11, r6\n\t"
  143396. "lsr r11, r6, #16\n\t"
  143397. "lsl r6, r6, #16\n\t"
  143398. "adds r10, r10, r6\n\t"
  143399. "adc r4, r4, r11\n\t"
  143400. "adds r10, r10, r5\n\t"
  143401. "str r10, [%[a], #116]\n\t"
  143402. "adc r4, r4, #0\n\t"
  143403. /* a[i+30] += m[30] * mu */
  143404. "ldr r7, [%[m], #120]\n\t"
  143405. "ldr r10, [%[a], #120]\n\t"
  143406. "lsr r11, r7, #16\n\t"
  143407. "lsr r6, r8, #16\n\t"
  143408. "mul r5, r6, r11\n\t"
  143409. "lsl r11, r7, #16\n\t"
  143410. "lsr r11, r11, #16\n\t"
  143411. "mul r6, r11, r6\n\t"
  143412. "lsr r11, r6, #16\n\t"
  143413. "lsl r6, r6, #16\n\t"
  143414. "adds r10, r10, r6\n\t"
  143415. "adc r5, r5, r11\n\t"
  143416. "lsl r6, r8, #16\n\t"
  143417. "lsl r11, r7, #16\n\t"
  143418. "lsr r6, r6, #16\n\t"
  143419. "lsr r11, r11, #16\n\t"
  143420. "mul r11, r6, r11\n\t"
  143421. "adds r10, r10, r11\n\t"
  143422. "adc r5, r5, #0\n\t"
  143423. "lsr r11, r7, #16\n\t"
  143424. "mul r6, r11, r6\n\t"
  143425. "lsr r11, r6, #16\n\t"
  143426. "lsl r6, r6, #16\n\t"
  143427. "adds r10, r10, r6\n\t"
  143428. "adc r5, r5, r11\n\t"
  143429. "adds r10, r10, r4\n\t"
  143430. "str r10, [%[a], #120]\n\t"
  143431. "adc r5, r5, #0\n\t"
  143432. /* a[i+31] += m[31] * mu */
  143433. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  143434. "ldr r11, [%[m], #124]\n\t"
  143435. #else
  143436. "ldr r7, [%[m], #124]\n\t"
  143437. #endif
  143438. "ldr r10, [%[a], #124]\n\t"
  143439. "lsl r6, r8, #16\n\t"
  143440. "lsl r7, r11, #16\n\t"
  143441. "lsr r6, r6, #16\n\t"
  143442. "lsr r7, r7, #16\n\t"
  143443. "mul r7, r6, r7\n\t"
  143444. "adds r5, r5, r7\n\t"
  143445. "adcs r4, r3, #0\n\t"
  143446. "mov r3, #0\n\t"
  143447. "adc r3, r3, r3\n\t"
  143448. "lsr r7, r11, #16\n\t"
  143449. "mul r6, r7, r6\n\t"
  143450. "lsr r7, r6, #16\n\t"
  143451. "lsl r6, r6, #16\n\t"
  143452. "adds r5, r5, r6\n\t"
  143453. "adcs r4, r4, r7\n\t"
  143454. "adc r3, r3, #0\n\t"
  143455. "mov r6, r8\n\t"
  143456. "lsr r7, r11, #16\n\t"
  143457. "lsr r6, r6, #16\n\t"
  143458. "mul r7, r6, r7\n\t"
  143459. "adds r4, r4, r7\n\t"
  143460. "lsl r7, r11, #16\n\t"
  143461. "adc r3, r3, #0\n\t"
  143462. "lsr r7, r7, #16\n\t"
  143463. "mul r6, r7, r6\n\t"
  143464. "lsr r7, r6, #16\n\t"
  143465. "lsl r6, r6, #16\n\t"
  143466. "adds r5, r5, r6\n\t"
  143467. "adcs r4, r4, r7\n\t"
  143468. "adc r3, r3, #0\n\t"
  143469. "adds r10, r10, r5\n\t"
  143470. "str r10, [%[a], #124]\n\t"
  143471. "ldr r10, [%[a], #128]\n\t"
  143472. "adcs r10, r10, r4\n\t"
  143473. "str r10, [%[a], #128]\n\t"
  143474. "adc r3, r3, #0\n\t"
  143475. /* i += 1 */
  143476. "add r9, r9, #4\n\t"
  143477. "add %[a], %[a], #4\n\t"
  143478. "cmp r9, #0x80\n\t"
  143479. "blt L_sp_1024_mont_reduce_32_word_%=\n\t"
  143480. /* Loop Done */
  143481. "str r12, [%[a]]\n\t"
  143482. "str lr, [%[a], #4]\n\t"
  143483. "ldr r6, [%[m], #124]\n\t"
  143484. "subs r10, r6, r10\n\t"
  143485. "neg r3, r3\n\t"
  143486. "sbc r10, r10, r10\n\t"
  143487. "orr r3, r3, r10\n\t"
  143488. "mov %[mp], r3\n\t"
  143489. : [a] "+r" (a), [m] "+r" (m), [mp] "+r" (mp)
  143490. :
  143491. : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "cc"
  143492. );
  143493. sp_1024_cond_sub_32(a - 32, a, m, mp);
  143494. }
  143495. #elif defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  143496. /* Reduce the number back to 1024 bits using Montgomery reduction.
  143497. *
  143498. * a A single precision number to reduce in place.
  143499. * m The single precision number representing the modulus.
  143500. * mp The digit representing the negative inverse of m mod 2^n.
  143501. */
  143502. static SP_NOINLINE void sp_1024_mont_reduce_32(sp_digit* a_p, const sp_digit* m_p, sp_digit mp_p)
  143503. {
  143504. register sp_digit* a asm ("r0") = (sp_digit*)a_p;
  143505. register const sp_digit* m asm ("r1") = (const sp_digit*)m_p;
  143506. register sp_digit mp asm ("r2") = (sp_digit)mp_p;
  143507. __asm__ __volatile__ (
  143508. "ldr r11, [%[m]]\n\t"
  143509. /* i = 0 */
  143510. "mov r9, #0\n\t"
  143511. "mov r3, #0\n\t"
  143512. "ldr r12, [%[a]]\n\t"
  143513. "ldr lr, [%[a], #4]\n\t"
  143514. "\n"
  143515. "L_sp_1024_mont_reduce_32_word_%=: \n\t"
  143516. /* mu = a[i] * mp */
  143517. "mul r8, %[mp], r12\n\t"
  143518. /* a[i+0] += m[0] * mu */
  143519. "mov r5, #0\n\t"
  143520. "umlal r12, r5, r8, r11\n\t"
  143521. /* a[i+1] += m[1] * mu */
  143522. "ldr r7, [%[m], #4]\n\t"
  143523. "mov r4, #0\n\t"
  143524. "umlal lr, r4, r8, r7\n\t"
  143525. "mov r12, lr\n\t"
  143526. "adds r12, r12, r5\n\t"
  143527. "adc r4, r4, #0\n\t"
  143528. /* a[i+2] += m[2] * mu */
  143529. "ldr r7, [%[m], #8]\n\t"
  143530. "ldr lr, [%[a], #8]\n\t"
  143531. "mov r5, #0\n\t"
  143532. "umlal lr, r5, r8, r7\n\t"
  143533. "adds lr, lr, r4\n\t"
  143534. "adc r5, r5, #0\n\t"
  143535. /* a[i+3] += m[3] * mu */
  143536. "ldr r7, [%[m], #12]\n\t"
  143537. "ldr r10, [%[a], #12]\n\t"
  143538. "mov r4, #0\n\t"
  143539. "umlal r10, r4, r8, r7\n\t"
  143540. "adds r10, r10, r5\n\t"
  143541. "str r10, [%[a], #12]\n\t"
  143542. "adc r4, r4, #0\n\t"
  143543. /* a[i+4] += m[4] * mu */
  143544. "ldr r7, [%[m], #16]\n\t"
  143545. "ldr r10, [%[a], #16]\n\t"
  143546. "mov r5, #0\n\t"
  143547. "umlal r10, r5, r8, r7\n\t"
  143548. "adds r10, r10, r4\n\t"
  143549. "str r10, [%[a], #16]\n\t"
  143550. "adc r5, r5, #0\n\t"
  143551. /* a[i+5] += m[5] * mu */
  143552. "ldr r7, [%[m], #20]\n\t"
  143553. "ldr r10, [%[a], #20]\n\t"
  143554. "mov r4, #0\n\t"
  143555. "umlal r10, r4, r8, r7\n\t"
  143556. "adds r10, r10, r5\n\t"
  143557. "str r10, [%[a], #20]\n\t"
  143558. "adc r4, r4, #0\n\t"
  143559. /* a[i+6] += m[6] * mu */
  143560. "ldr r7, [%[m], #24]\n\t"
  143561. "ldr r10, [%[a], #24]\n\t"
  143562. "mov r5, #0\n\t"
  143563. "umlal r10, r5, r8, r7\n\t"
  143564. "adds r10, r10, r4\n\t"
  143565. "str r10, [%[a], #24]\n\t"
  143566. "adc r5, r5, #0\n\t"
  143567. /* a[i+7] += m[7] * mu */
  143568. "ldr r7, [%[m], #28]\n\t"
  143569. "ldr r10, [%[a], #28]\n\t"
  143570. "mov r4, #0\n\t"
  143571. "umlal r10, r4, r8, r7\n\t"
  143572. "adds r10, r10, r5\n\t"
  143573. "str r10, [%[a], #28]\n\t"
  143574. "adc r4, r4, #0\n\t"
  143575. /* a[i+8] += m[8] * mu */
  143576. "ldr r7, [%[m], #32]\n\t"
  143577. "ldr r10, [%[a], #32]\n\t"
  143578. "mov r5, #0\n\t"
  143579. "umlal r10, r5, r8, r7\n\t"
  143580. "adds r10, r10, r4\n\t"
  143581. "str r10, [%[a], #32]\n\t"
  143582. "adc r5, r5, #0\n\t"
  143583. /* a[i+9] += m[9] * mu */
  143584. "ldr r7, [%[m], #36]\n\t"
  143585. "ldr r10, [%[a], #36]\n\t"
  143586. "mov r4, #0\n\t"
  143587. "umlal r10, r4, r8, r7\n\t"
  143588. "adds r10, r10, r5\n\t"
  143589. "str r10, [%[a], #36]\n\t"
  143590. "adc r4, r4, #0\n\t"
  143591. /* a[i+10] += m[10] * mu */
  143592. "ldr r7, [%[m], #40]\n\t"
  143593. "ldr r10, [%[a], #40]\n\t"
  143594. "mov r5, #0\n\t"
  143595. "umlal r10, r5, r8, r7\n\t"
  143596. "adds r10, r10, r4\n\t"
  143597. "str r10, [%[a], #40]\n\t"
  143598. "adc r5, r5, #0\n\t"
  143599. /* a[i+11] += m[11] * mu */
  143600. "ldr r7, [%[m], #44]\n\t"
  143601. "ldr r10, [%[a], #44]\n\t"
  143602. "mov r4, #0\n\t"
  143603. "umlal r10, r4, r8, r7\n\t"
  143604. "adds r10, r10, r5\n\t"
  143605. "str r10, [%[a], #44]\n\t"
  143606. "adc r4, r4, #0\n\t"
  143607. /* a[i+12] += m[12] * mu */
  143608. "ldr r7, [%[m], #48]\n\t"
  143609. "ldr r10, [%[a], #48]\n\t"
  143610. "mov r5, #0\n\t"
  143611. "umlal r10, r5, r8, r7\n\t"
  143612. "adds r10, r10, r4\n\t"
  143613. "str r10, [%[a], #48]\n\t"
  143614. "adc r5, r5, #0\n\t"
  143615. /* a[i+13] += m[13] * mu */
  143616. "ldr r7, [%[m], #52]\n\t"
  143617. "ldr r10, [%[a], #52]\n\t"
  143618. "mov r4, #0\n\t"
  143619. "umlal r10, r4, r8, r7\n\t"
  143620. "adds r10, r10, r5\n\t"
  143621. "str r10, [%[a], #52]\n\t"
  143622. "adc r4, r4, #0\n\t"
  143623. /* a[i+14] += m[14] * mu */
  143624. "ldr r7, [%[m], #56]\n\t"
  143625. "ldr r10, [%[a], #56]\n\t"
  143626. "mov r5, #0\n\t"
  143627. "umlal r10, r5, r8, r7\n\t"
  143628. "adds r10, r10, r4\n\t"
  143629. "str r10, [%[a], #56]\n\t"
  143630. "adc r5, r5, #0\n\t"
  143631. /* a[i+15] += m[15] * mu */
  143632. "ldr r7, [%[m], #60]\n\t"
  143633. "ldr r10, [%[a], #60]\n\t"
  143634. "mov r4, #0\n\t"
  143635. "umlal r10, r4, r8, r7\n\t"
  143636. "adds r10, r10, r5\n\t"
  143637. "str r10, [%[a], #60]\n\t"
  143638. "adc r4, r4, #0\n\t"
  143639. /* a[i+16] += m[16] * mu */
  143640. "ldr r7, [%[m], #64]\n\t"
  143641. "ldr r10, [%[a], #64]\n\t"
  143642. "mov r5, #0\n\t"
  143643. "umlal r10, r5, r8, r7\n\t"
  143644. "adds r10, r10, r4\n\t"
  143645. "str r10, [%[a], #64]\n\t"
  143646. "adc r5, r5, #0\n\t"
  143647. /* a[i+17] += m[17] * mu */
  143648. "ldr r7, [%[m], #68]\n\t"
  143649. "ldr r10, [%[a], #68]\n\t"
  143650. "mov r4, #0\n\t"
  143651. "umlal r10, r4, r8, r7\n\t"
  143652. "adds r10, r10, r5\n\t"
  143653. "str r10, [%[a], #68]\n\t"
  143654. "adc r4, r4, #0\n\t"
  143655. /* a[i+18] += m[18] * mu */
  143656. "ldr r7, [%[m], #72]\n\t"
  143657. "ldr r10, [%[a], #72]\n\t"
  143658. "mov r5, #0\n\t"
  143659. "umlal r10, r5, r8, r7\n\t"
  143660. "adds r10, r10, r4\n\t"
  143661. "str r10, [%[a], #72]\n\t"
  143662. "adc r5, r5, #0\n\t"
  143663. /* a[i+19] += m[19] * mu */
  143664. "ldr r7, [%[m], #76]\n\t"
  143665. "ldr r10, [%[a], #76]\n\t"
  143666. "mov r4, #0\n\t"
  143667. "umlal r10, r4, r8, r7\n\t"
  143668. "adds r10, r10, r5\n\t"
  143669. "str r10, [%[a], #76]\n\t"
  143670. "adc r4, r4, #0\n\t"
  143671. /* a[i+20] += m[20] * mu */
  143672. "ldr r7, [%[m], #80]\n\t"
  143673. "ldr r10, [%[a], #80]\n\t"
  143674. "mov r5, #0\n\t"
  143675. "umlal r10, r5, r8, r7\n\t"
  143676. "adds r10, r10, r4\n\t"
  143677. "str r10, [%[a], #80]\n\t"
  143678. "adc r5, r5, #0\n\t"
  143679. /* a[i+21] += m[21] * mu */
  143680. "ldr r7, [%[m], #84]\n\t"
  143681. "ldr r10, [%[a], #84]\n\t"
  143682. "mov r4, #0\n\t"
  143683. "umlal r10, r4, r8, r7\n\t"
  143684. "adds r10, r10, r5\n\t"
  143685. "str r10, [%[a], #84]\n\t"
  143686. "adc r4, r4, #0\n\t"
  143687. /* a[i+22] += m[22] * mu */
  143688. "ldr r7, [%[m], #88]\n\t"
  143689. "ldr r10, [%[a], #88]\n\t"
  143690. "mov r5, #0\n\t"
  143691. "umlal r10, r5, r8, r7\n\t"
  143692. "adds r10, r10, r4\n\t"
  143693. "str r10, [%[a], #88]\n\t"
  143694. "adc r5, r5, #0\n\t"
  143695. /* a[i+23] += m[23] * mu */
  143696. "ldr r7, [%[m], #92]\n\t"
  143697. "ldr r10, [%[a], #92]\n\t"
  143698. "mov r4, #0\n\t"
  143699. "umlal r10, r4, r8, r7\n\t"
  143700. "adds r10, r10, r5\n\t"
  143701. "str r10, [%[a], #92]\n\t"
  143702. "adc r4, r4, #0\n\t"
  143703. /* a[i+24] += m[24] * mu */
  143704. "ldr r7, [%[m], #96]\n\t"
  143705. "ldr r10, [%[a], #96]\n\t"
  143706. "mov r5, #0\n\t"
  143707. "umlal r10, r5, r8, r7\n\t"
  143708. "adds r10, r10, r4\n\t"
  143709. "str r10, [%[a], #96]\n\t"
  143710. "adc r5, r5, #0\n\t"
  143711. /* a[i+25] += m[25] * mu */
  143712. "ldr r7, [%[m], #100]\n\t"
  143713. "ldr r10, [%[a], #100]\n\t"
  143714. "mov r4, #0\n\t"
  143715. "umlal r10, r4, r8, r7\n\t"
  143716. "adds r10, r10, r5\n\t"
  143717. "str r10, [%[a], #100]\n\t"
  143718. "adc r4, r4, #0\n\t"
  143719. /* a[i+26] += m[26] * mu */
  143720. "ldr r7, [%[m], #104]\n\t"
  143721. "ldr r10, [%[a], #104]\n\t"
  143722. "mov r5, #0\n\t"
  143723. "umlal r10, r5, r8, r7\n\t"
  143724. "adds r10, r10, r4\n\t"
  143725. "str r10, [%[a], #104]\n\t"
  143726. "adc r5, r5, #0\n\t"
  143727. /* a[i+27] += m[27] * mu */
  143728. "ldr r7, [%[m], #108]\n\t"
  143729. "ldr r10, [%[a], #108]\n\t"
  143730. "mov r4, #0\n\t"
  143731. "umlal r10, r4, r8, r7\n\t"
  143732. "adds r10, r10, r5\n\t"
  143733. "str r10, [%[a], #108]\n\t"
  143734. "adc r4, r4, #0\n\t"
  143735. /* a[i+28] += m[28] * mu */
  143736. "ldr r7, [%[m], #112]\n\t"
  143737. "ldr r10, [%[a], #112]\n\t"
  143738. "mov r5, #0\n\t"
  143739. "umlal r10, r5, r8, r7\n\t"
  143740. "adds r10, r10, r4\n\t"
  143741. "str r10, [%[a], #112]\n\t"
  143742. "adc r5, r5, #0\n\t"
  143743. /* a[i+29] += m[29] * mu */
  143744. "ldr r7, [%[m], #116]\n\t"
  143745. "ldr r10, [%[a], #116]\n\t"
  143746. "mov r4, #0\n\t"
  143747. "umlal r10, r4, r8, r7\n\t"
  143748. "adds r10, r10, r5\n\t"
  143749. "str r10, [%[a], #116]\n\t"
  143750. "adc r4, r4, #0\n\t"
  143751. /* a[i+30] += m[30] * mu */
  143752. "ldr r7, [%[m], #120]\n\t"
  143753. "ldr r10, [%[a], #120]\n\t"
  143754. "mov r5, #0\n\t"
  143755. "umlal r10, r5, r8, r7\n\t"
  143756. "adds r10, r10, r4\n\t"
  143757. "str r10, [%[a], #120]\n\t"
  143758. "adc r5, r5, #0\n\t"
  143759. /* a[i+31] += m[31] * mu */
  143760. "ldr r7, [%[m], #124]\n\t"
  143761. "ldr r10, [%[a], #124]\n\t"
  143762. "umull r6, r7, r8, r7\n\t"
  143763. "adds r5, r5, r6\n\t"
  143764. "adcs r4, r7, r3\n\t"
  143765. "mov r3, #0\n\t"
  143766. "adc r3, r3, r3\n\t"
  143767. "adds r10, r10, r5\n\t"
  143768. "str r10, [%[a], #124]\n\t"
  143769. "ldr r10, [%[a], #128]\n\t"
  143770. "adcs r10, r10, r4\n\t"
  143771. "str r10, [%[a], #128]\n\t"
  143772. "adc r3, r3, #0\n\t"
  143773. /* i += 1 */
  143774. "add r9, r9, #4\n\t"
  143775. "add %[a], %[a], #4\n\t"
  143776. "cmp r9, #0x80\n\t"
  143777. "blt L_sp_1024_mont_reduce_32_word_%=\n\t"
  143778. /* Loop Done */
  143779. "str r12, [%[a]]\n\t"
  143780. "str lr, [%[a], #4]\n\t"
  143781. "ldr r6, [%[m], #124]\n\t"
  143782. "subs r10, r6, r10\n\t"
  143783. "neg r3, r3\n\t"
  143784. "sbc r10, r10, r10\n\t"
  143785. "orr r3, r3, r10\n\t"
  143786. "mov %[mp], r3\n\t"
  143787. : [a] "+r" (a), [m] "+r" (m), [mp] "+r" (mp)
  143788. :
  143789. : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "cc"
  143790. );
  143791. sp_1024_cond_sub_32(a - 32, a, m, mp);
  143792. }
  143793. #else
  143794. /* Reduce the number back to 1024 bits using Montgomery reduction.
  143795. *
  143796. * a A single precision number to reduce in place.
  143797. * m The single precision number representing the modulus.
  143798. * mp The digit representing the negative inverse of m mod 2^n.
  143799. */
  143800. static SP_NOINLINE void sp_1024_mont_reduce_32(sp_digit* a_p, const sp_digit* m_p, sp_digit mp_p)
  143801. {
  143802. register sp_digit* a asm ("r0") = (sp_digit*)a_p;
  143803. register const sp_digit* m asm ("r1") = (const sp_digit*)m_p;
  143804. register sp_digit mp asm ("r2") = (sp_digit)mp_p;
  143805. __asm__ __volatile__ (
  143806. /* i = 0 */
  143807. "mov r12, #0\n\t"
  143808. "mov lr, #0\n\t"
  143809. "ldr r4, [%[a]]\n\t"
  143810. "ldr r5, [%[a], #4]\n\t"
  143811. "ldr r6, [%[a], #8]\n\t"
  143812. "ldr r7, [%[a], #12]\n\t"
  143813. "ldr r8, [%[a], #16]\n\t"
  143814. "\n"
  143815. "L_sp_1024_mont_reduce_32_word_%=: \n\t"
  143816. /* mu = a[i] * mp */
  143817. "mul r11, %[mp], r4\n\t"
  143818. /* a[i+0] += m[0] * mu */
  143819. "ldr r10, [%[m]]\n\t"
  143820. "mov r3, #0\n\t"
  143821. "umaal r4, r3, r11, r10\n\t"
  143822. /* a[i+1] += m[1] * mu */
  143823. "ldr r10, [%[m], #4]\n\t"
  143824. "mov r4, r5\n\t"
  143825. "umaal r4, r3, r11, r10\n\t"
  143826. /* a[i+2] += m[2] * mu */
  143827. "ldr r10, [%[m], #8]\n\t"
  143828. "mov r5, r6\n\t"
  143829. "umaal r5, r3, r11, r10\n\t"
  143830. /* a[i+3] += m[3] * mu */
  143831. "ldr r10, [%[m], #12]\n\t"
  143832. "mov r6, r7\n\t"
  143833. "umaal r6, r3, r11, r10\n\t"
  143834. /* a[i+4] += m[4] * mu */
  143835. "ldr r10, [%[m], #16]\n\t"
  143836. "mov r7, r8\n\t"
  143837. "umaal r7, r3, r11, r10\n\t"
  143838. /* a[i+5] += m[5] * mu */
  143839. "ldr r10, [%[m], #20]\n\t"
  143840. "ldr r8, [%[a], #20]\n\t"
  143841. "umaal r8, r3, r11, r10\n\t"
  143842. /* a[i+6] += m[6] * mu */
  143843. "ldr r10, [%[m], #24]\n\t"
  143844. "ldr r9, [%[a], #24]\n\t"
  143845. "umaal r9, r3, r11, r10\n\t"
  143846. "str r9, [%[a], #24]\n\t"
  143847. /* a[i+7] += m[7] * mu */
  143848. "ldr r10, [%[m], #28]\n\t"
  143849. "ldr r9, [%[a], #28]\n\t"
  143850. "umaal r9, r3, r11, r10\n\t"
  143851. "str r9, [%[a], #28]\n\t"
  143852. /* a[i+8] += m[8] * mu */
  143853. "ldr r10, [%[m], #32]\n\t"
  143854. "ldr r9, [%[a], #32]\n\t"
  143855. "umaal r9, r3, r11, r10\n\t"
  143856. "str r9, [%[a], #32]\n\t"
  143857. /* a[i+9] += m[9] * mu */
  143858. "ldr r10, [%[m], #36]\n\t"
  143859. "ldr r9, [%[a], #36]\n\t"
  143860. "umaal r9, r3, r11, r10\n\t"
  143861. "str r9, [%[a], #36]\n\t"
  143862. /* a[i+10] += m[10] * mu */
  143863. "ldr r10, [%[m], #40]\n\t"
  143864. "ldr r9, [%[a], #40]\n\t"
  143865. "umaal r9, r3, r11, r10\n\t"
  143866. "str r9, [%[a], #40]\n\t"
  143867. /* a[i+11] += m[11] * mu */
  143868. "ldr r10, [%[m], #44]\n\t"
  143869. "ldr r9, [%[a], #44]\n\t"
  143870. "umaal r9, r3, r11, r10\n\t"
  143871. "str r9, [%[a], #44]\n\t"
  143872. /* a[i+12] += m[12] * mu */
  143873. "ldr r10, [%[m], #48]\n\t"
  143874. "ldr r9, [%[a], #48]\n\t"
  143875. "umaal r9, r3, r11, r10\n\t"
  143876. "str r9, [%[a], #48]\n\t"
  143877. /* a[i+13] += m[13] * mu */
  143878. "ldr r10, [%[m], #52]\n\t"
  143879. "ldr r9, [%[a], #52]\n\t"
  143880. "umaal r9, r3, r11, r10\n\t"
  143881. "str r9, [%[a], #52]\n\t"
  143882. /* a[i+14] += m[14] * mu */
  143883. "ldr r10, [%[m], #56]\n\t"
  143884. "ldr r9, [%[a], #56]\n\t"
  143885. "umaal r9, r3, r11, r10\n\t"
  143886. "str r9, [%[a], #56]\n\t"
  143887. /* a[i+15] += m[15] * mu */
  143888. "ldr r10, [%[m], #60]\n\t"
  143889. "ldr r9, [%[a], #60]\n\t"
  143890. "umaal r9, r3, r11, r10\n\t"
  143891. "str r9, [%[a], #60]\n\t"
  143892. /* a[i+16] += m[16] * mu */
  143893. "ldr r10, [%[m], #64]\n\t"
  143894. "ldr r9, [%[a], #64]\n\t"
  143895. "umaal r9, r3, r11, r10\n\t"
  143896. "str r9, [%[a], #64]\n\t"
  143897. /* a[i+17] += m[17] * mu */
  143898. "ldr r10, [%[m], #68]\n\t"
  143899. "ldr r9, [%[a], #68]\n\t"
  143900. "umaal r9, r3, r11, r10\n\t"
  143901. "str r9, [%[a], #68]\n\t"
  143902. /* a[i+18] += m[18] * mu */
  143903. "ldr r10, [%[m], #72]\n\t"
  143904. "ldr r9, [%[a], #72]\n\t"
  143905. "umaal r9, r3, r11, r10\n\t"
  143906. "str r9, [%[a], #72]\n\t"
  143907. /* a[i+19] += m[19] * mu */
  143908. "ldr r10, [%[m], #76]\n\t"
  143909. "ldr r9, [%[a], #76]\n\t"
  143910. "umaal r9, r3, r11, r10\n\t"
  143911. "str r9, [%[a], #76]\n\t"
  143912. /* a[i+20] += m[20] * mu */
  143913. "ldr r10, [%[m], #80]\n\t"
  143914. "ldr r9, [%[a], #80]\n\t"
  143915. "umaal r9, r3, r11, r10\n\t"
  143916. "str r9, [%[a], #80]\n\t"
  143917. /* a[i+21] += m[21] * mu */
  143918. "ldr r10, [%[m], #84]\n\t"
  143919. "ldr r9, [%[a], #84]\n\t"
  143920. "umaal r9, r3, r11, r10\n\t"
  143921. "str r9, [%[a], #84]\n\t"
  143922. /* a[i+22] += m[22] * mu */
  143923. "ldr r10, [%[m], #88]\n\t"
  143924. "ldr r9, [%[a], #88]\n\t"
  143925. "umaal r9, r3, r11, r10\n\t"
  143926. "str r9, [%[a], #88]\n\t"
  143927. /* a[i+23] += m[23] * mu */
  143928. "ldr r10, [%[m], #92]\n\t"
  143929. "ldr r9, [%[a], #92]\n\t"
  143930. "umaal r9, r3, r11, r10\n\t"
  143931. "str r9, [%[a], #92]\n\t"
  143932. /* a[i+24] += m[24] * mu */
  143933. "ldr r10, [%[m], #96]\n\t"
  143934. "ldr r9, [%[a], #96]\n\t"
  143935. "umaal r9, r3, r11, r10\n\t"
  143936. "str r9, [%[a], #96]\n\t"
  143937. /* a[i+25] += m[25] * mu */
  143938. "ldr r10, [%[m], #100]\n\t"
  143939. "ldr r9, [%[a], #100]\n\t"
  143940. "umaal r9, r3, r11, r10\n\t"
  143941. "str r9, [%[a], #100]\n\t"
  143942. /* a[i+26] += m[26] * mu */
  143943. "ldr r10, [%[m], #104]\n\t"
  143944. "ldr r9, [%[a], #104]\n\t"
  143945. "umaal r9, r3, r11, r10\n\t"
  143946. "str r9, [%[a], #104]\n\t"
  143947. /* a[i+27] += m[27] * mu */
  143948. "ldr r10, [%[m], #108]\n\t"
  143949. "ldr r9, [%[a], #108]\n\t"
  143950. "umaal r9, r3, r11, r10\n\t"
  143951. "str r9, [%[a], #108]\n\t"
  143952. /* a[i+28] += m[28] * mu */
  143953. "ldr r10, [%[m], #112]\n\t"
  143954. "ldr r9, [%[a], #112]\n\t"
  143955. "umaal r9, r3, r11, r10\n\t"
  143956. "str r9, [%[a], #112]\n\t"
  143957. /* a[i+29] += m[29] * mu */
  143958. "ldr r10, [%[m], #116]\n\t"
  143959. "ldr r9, [%[a], #116]\n\t"
  143960. "umaal r9, r3, r11, r10\n\t"
  143961. "str r9, [%[a], #116]\n\t"
  143962. /* a[i+30] += m[30] * mu */
  143963. "ldr r10, [%[m], #120]\n\t"
  143964. "ldr r9, [%[a], #120]\n\t"
  143965. "umaal r9, r3, r11, r10\n\t"
  143966. "str r9, [%[a], #120]\n\t"
  143967. /* a[i+31] += m[31] * mu */
  143968. "ldr r10, [%[m], #124]\n\t"
  143969. "ldr r9, [%[a], #124]\n\t"
  143970. "umaal r9, r3, r11, r10\n\t"
  143971. "ldr r11, [%[a], #128]\n\t"
  143972. "mov r10, #0\n\t"
  143973. "umaal r3, r11, r10, r10\n\t"
  143974. "str r9, [%[a], #124]\n\t"
  143975. "adds r3, r3, lr\n\t"
  143976. "adc lr, r11, #0\n\t"
  143977. "str r3, [%[a], #128]\n\t"
  143978. /* i += 1 */
  143979. "add r12, r12, #4\n\t"
  143980. "add %[a], %[a], #4\n\t"
  143981. "cmp r12, #0x80\n\t"
  143982. "blt L_sp_1024_mont_reduce_32_word_%=\n\t"
  143983. /* Loop Done */
  143984. "str r4, [%[a]]\n\t"
  143985. "str r5, [%[a], #4]\n\t"
  143986. "str r6, [%[a], #8]\n\t"
  143987. "str r7, [%[a], #12]\n\t"
  143988. "str r8, [%[a], #16]\n\t"
  143989. "ldr r10, [%[m], #124]\n\t"
  143990. "subs r3, r10, r3\n\t"
  143991. "neg lr, lr\n\t"
  143992. "sbc r3, r3, r3\n\t"
  143993. "orr lr, lr, r3\n\t"
  143994. "mov %[mp], lr\n\t"
  143995. : [a] "+r" (a), [m] "+r" (m), [mp] "+r" (mp)
  143996. :
  143997. : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "cc"
  143998. );
  143999. sp_1024_cond_sub_32(a - 32, a, m, mp);
  144000. }
  144001. #endif
  144002. /* Multiply two Montgomery form numbers mod the modulus (prime).
  144003. * (r = a * b mod m)
  144004. *
  144005. * r Result of multiplication.
  144006. * a First number to multiply in Montgomery form.
  144007. * b Second number to multiply in Montgomery form.
  144008. * m Modulus (prime).
  144009. * mp Montgomery multiplier.
  144010. */
  144011. SP_NOINLINE static void sp_1024_mont_mul_32(sp_digit* r, const sp_digit* a,
  144012. const sp_digit* b, const sp_digit* m, sp_digit mp)
  144013. {
  144014. sp_1024_mul_32(r, a, b);
  144015. sp_1024_mont_reduce_32(r, m, mp);
  144016. }
  144017. /* Square the Montgomery form number. (r = a * a mod m)
  144018. *
  144019. * r Result of squaring.
  144020. * a Number to square in Montgomery form.
  144021. * m Modulus (prime).
  144022. * mp Montgomery multiplier.
  144023. */
  144024. SP_NOINLINE static void sp_1024_mont_sqr_32(sp_digit* r, const sp_digit* a,
  144025. const sp_digit* m, sp_digit mp)
  144026. {
  144027. sp_1024_sqr_32(r, a);
  144028. sp_1024_mont_reduce_32(r, m, mp);
  144029. }
  144030. /* Mod-2 for the P1024 curve. */
  144031. static const uint8_t p1024_mod_minus_2[] = {
  144032. 6,0x06, 7,0x0f, 7,0x0b, 6,0x0c, 7,0x1e, 9,0x09, 7,0x0c, 7,0x1f,
  144033. 6,0x16, 6,0x06, 7,0x0e, 8,0x10, 6,0x03, 8,0x11, 6,0x0d, 7,0x14,
  144034. 9,0x12, 6,0x0f, 7,0x04, 9,0x0d, 6,0x00, 7,0x13, 6,0x01, 6,0x07,
  144035. 8,0x0d, 8,0x00, 6,0x06, 9,0x17, 6,0x14, 6,0x15, 6,0x11, 6,0x0b,
  144036. 9,0x0c, 6,0x1e, 13,0x14, 7,0x0e, 6,0x1d, 12,0x0a, 6,0x0b, 8,0x07,
  144037. 6,0x18, 6,0x0f, 6,0x10, 8,0x1c, 7,0x16, 7,0x02, 6,0x01, 6,0x13,
  144038. 10,0x15, 7,0x06, 8,0x14, 6,0x0c, 6,0x19, 7,0x10, 6,0x19, 6,0x19,
  144039. 9,0x16, 7,0x19, 6,0x1f, 6,0x17, 6,0x12, 8,0x02, 6,0x01, 6,0x04,
  144040. 6,0x15, 7,0x16, 6,0x04, 6,0x1f, 6,0x09, 7,0x06, 7,0x13, 7,0x09,
  144041. 6,0x0d, 10,0x18, 6,0x06, 6,0x11, 6,0x04, 6,0x01, 6,0x13, 8,0x06,
  144042. 6,0x0d, 8,0x13, 7,0x08, 6,0x08, 6,0x05, 7,0x0c, 7,0x0e, 7,0x15,
  144043. 6,0x05, 7,0x14, 10,0x19, 6,0x10, 6,0x16, 6,0x15, 7,0x1f, 6,0x14,
  144044. 6,0x0a, 10,0x11, 6,0x01, 7,0x05, 7,0x08, 8,0x0a, 7,0x1e, 7,0x1c,
  144045. 6,0x1c, 7,0x09, 10,0x18, 7,0x1c, 10,0x06, 6,0x0a, 6,0x07, 6,0x19,
  144046. 7,0x06, 6,0x0d, 7,0x0f, 7,0x0b, 7,0x05, 6,0x11, 6,0x1c, 7,0x1f,
  144047. 6,0x1e, 7,0x18, 6,0x1e, 6,0x00, 6,0x03, 6,0x02, 7,0x10, 6,0x0b,
  144048. 6,0x1b, 7,0x10, 6,0x00, 8,0x11, 7,0x1b, 6,0x18, 6,0x01, 7,0x0c,
  144049. 7,0x1d, 7,0x13, 6,0x08, 7,0x1b, 8,0x13, 7,0x16, 13,0x1d, 7,0x1f,
  144050. 6,0x0a, 6,0x01, 7,0x1f, 6,0x14, 1,0x01
  144051. };
  144052. /* Invert the number, in Montgomery form, modulo the modulus (prime) of the
  144053. * P1024 curve. (r = 1 / a mod m)
  144054. *
  144055. * r Inverse result.
  144056. * a Number to invert.
  144057. * td Temporary data.
  144058. */
  144059. static void sp_1024_mont_inv_32(sp_digit* r, const sp_digit* a,
  144060. sp_digit* td)
  144061. {
  144062. sp_digit* t = &td[32 * 2 * 32];
  144063. int i;
  144064. int j;
  144065. sp_digit* table[32];
  144066. for (i = 0; i < 32; i++) {
  144067. table[i] = &td[2 * 32 * i];
  144068. }
  144069. XMEMCPY(table[0], a, sizeof(sp_digit) * 32);
  144070. for (i = 1; i < 6; i++) {
  144071. sp_1024_mont_sqr_32(table[0], table[0], p1024_mod, p1024_mp_mod);
  144072. }
  144073. for (i = 1; i < 32; i++) {
  144074. sp_1024_mont_mul_32(table[i], table[i-1], a, p1024_mod, p1024_mp_mod);
  144075. }
  144076. XMEMCPY(t, table[p1024_mod_minus_2[1]], sizeof(sp_digit) * 32);
  144077. for (i = 2; i < (int)sizeof(p1024_mod_minus_2) - 2; i += 2) {
  144078. for (j = 0; j < p1024_mod_minus_2[i]; j++) {
  144079. sp_1024_mont_sqr_32(t, t, p1024_mod, p1024_mp_mod);
  144080. }
  144081. sp_1024_mont_mul_32(t, t, table[p1024_mod_minus_2[i+1]], p1024_mod,
  144082. p1024_mp_mod);
  144083. }
  144084. sp_1024_mont_sqr_32(t, t, p1024_mod, p1024_mp_mod);
  144085. sp_1024_mont_mul_32(r, t, a, p1024_mod, p1024_mp_mod);
  144086. }
  144087. /* Normalize the values in each word to 32.
  144088. *
  144089. * a Array of sp_digit to normalize.
  144090. */
  144091. #define sp_1024_norm_32(a)
  144092. /* Map the Montgomery form projective coordinate point to an affine point.
  144093. *
  144094. * r Resulting affine coordinate point.
  144095. * p Montgomery form projective coordinate point.
  144096. * t Temporary ordinate data.
  144097. */
  144098. static void sp_1024_map_32(sp_point_1024* r, const sp_point_1024* p,
  144099. sp_digit* t)
  144100. {
  144101. sp_digit* t1 = t;
  144102. sp_digit* t2 = t + 2*32;
  144103. sp_int32 n;
  144104. sp_1024_mont_inv_32(t1, p->z, t + 2*32);
  144105. sp_1024_mont_sqr_32(t2, t1, p1024_mod, p1024_mp_mod);
  144106. sp_1024_mont_mul_32(t1, t2, t1, p1024_mod, p1024_mp_mod);
  144107. /* x /= z^2 */
  144108. sp_1024_mont_mul_32(r->x, p->x, t2, p1024_mod, p1024_mp_mod);
  144109. XMEMSET(r->x + 32, 0, sizeof(sp_digit) * 32U);
  144110. sp_1024_mont_reduce_32(r->x, p1024_mod, p1024_mp_mod);
  144111. /* Reduce x to less than modulus */
  144112. n = sp_1024_cmp_32(r->x, p1024_mod);
  144113. sp_1024_cond_sub_32(r->x, r->x, p1024_mod, ~(n >> 31));
  144114. sp_1024_norm_32(r->x);
  144115. /* y /= z^3 */
  144116. sp_1024_mont_mul_32(r->y, p->y, t1, p1024_mod, p1024_mp_mod);
  144117. XMEMSET(r->y + 32, 0, sizeof(sp_digit) * 32U);
  144118. sp_1024_mont_reduce_32(r->y, p1024_mod, p1024_mp_mod);
  144119. /* Reduce y to less than modulus */
  144120. n = sp_1024_cmp_32(r->y, p1024_mod);
  144121. sp_1024_cond_sub_32(r->y, r->y, p1024_mod, ~(n >> 31));
  144122. sp_1024_norm_32(r->y);
  144123. XMEMSET(r->z, 0, sizeof(r->z) / 2);
  144124. r->z[0] = 1;
  144125. }
  144126. /* Add two Montgomery form numbers (r = a + b % m).
  144127. *
  144128. * r Result of addition.
  144129. * a First number to add in Montgomery form.
  144130. * b Second number to add in Montgomery form.
  144131. * m Modulus (prime).
  144132. */
  144133. 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)
  144134. {
  144135. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  144136. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  144137. register const sp_digit* b asm ("r2") = (const sp_digit*)b_p;
  144138. register const sp_digit* m asm ("r3") = (const sp_digit*)m_p;
  144139. __asm__ __volatile__ (
  144140. "mov r12, #0\n\t"
  144141. "ldm %[a]!, {r4, r5, r6, r7}\n\t"
  144142. "ldm %[b]!, {r8, r9, r10, r11}\n\t"
  144143. "adds r4, r4, r8\n\t"
  144144. "adcs r5, r5, r9\n\t"
  144145. "adcs r6, r6, r10\n\t"
  144146. "adcs r7, r7, r11\n\t"
  144147. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  144148. "ldm %[a]!, {r4, r5, r6, r7}\n\t"
  144149. "ldm %[b]!, {r8, r9, r10, r11}\n\t"
  144150. "adcs r4, r4, r8\n\t"
  144151. "adcs r5, r5, r9\n\t"
  144152. "adcs r6, r6, r10\n\t"
  144153. "adcs r7, r7, r11\n\t"
  144154. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  144155. "ldm %[a]!, {r4, r5, r6, r7}\n\t"
  144156. "ldm %[b]!, {r8, r9, r10, r11}\n\t"
  144157. "adcs r4, r4, r8\n\t"
  144158. "adcs r5, r5, r9\n\t"
  144159. "adcs r6, r6, r10\n\t"
  144160. "adcs r7, r7, r11\n\t"
  144161. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  144162. "ldm %[a]!, {r4, r5, r6, r7}\n\t"
  144163. "ldm %[b]!, {r8, r9, r10, r11}\n\t"
  144164. "adcs r4, r4, r8\n\t"
  144165. "adcs r5, r5, r9\n\t"
  144166. "adcs r6, r6, r10\n\t"
  144167. "adcs r7, r7, r11\n\t"
  144168. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  144169. "ldm %[a]!, {r4, r5, r6, r7}\n\t"
  144170. "ldm %[b]!, {r8, r9, r10, r11}\n\t"
  144171. "adcs r4, r4, r8\n\t"
  144172. "adcs r5, r5, r9\n\t"
  144173. "adcs r6, r6, r10\n\t"
  144174. "adcs r7, r7, r11\n\t"
  144175. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  144176. "ldm %[a]!, {r4, r5, r6, r7}\n\t"
  144177. "ldm %[b]!, {r8, r9, r10, r11}\n\t"
  144178. "adcs r4, r4, r8\n\t"
  144179. "adcs r5, r5, r9\n\t"
  144180. "adcs r6, r6, r10\n\t"
  144181. "adcs r7, r7, r11\n\t"
  144182. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  144183. "ldm %[a]!, {r4, r5, r6, r7}\n\t"
  144184. "ldm %[b]!, {r8, r9, r10, r11}\n\t"
  144185. "adcs r4, r4, r8\n\t"
  144186. "adcs r5, r5, r9\n\t"
  144187. "adcs r6, r6, r10\n\t"
  144188. "adcs r7, r7, r11\n\t"
  144189. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  144190. "ldm %[a]!, {r4, r5, r6, r7}\n\t"
  144191. "ldm %[b]!, {r8, r9, r10, r11}\n\t"
  144192. "adcs r4, r4, r8\n\t"
  144193. "adcs r5, r5, r9\n\t"
  144194. "adcs r6, r6, r10\n\t"
  144195. "adcs r7, r7, r11\n\t"
  144196. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  144197. "ldr r11, [%[m], #124]\n\t"
  144198. "adc r12, r12, #0\n\t"
  144199. "subs r11, r11, r7\n\t"
  144200. "neg r12, r12\n\t"
  144201. "sbc r11, r11, r11\n\t"
  144202. "sub %[r], %[r], #0x80\n\t"
  144203. "orr r12, r12, r11\n\t"
  144204. "ldm %[r], {r4, r5, r6, r7}\n\t"
  144205. "ldm %[m]!, {r8, r9, r10, r11}\n\t"
  144206. "and r8, r8, r12\n\t"
  144207. "and r9, r9, r12\n\t"
  144208. "and r10, r10, r12\n\t"
  144209. "and r11, r11, r12\n\t"
  144210. "subs r4, r4, r8\n\t"
  144211. "sbcs r5, r5, r9\n\t"
  144212. "sbcs r6, r6, r10\n\t"
  144213. "sbcs r7, r7, r11\n\t"
  144214. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  144215. "ldm %[r], {r4, r5, r6, r7}\n\t"
  144216. "ldm %[m]!, {r8, r9, r10, r11}\n\t"
  144217. "and r8, r8, r12\n\t"
  144218. "and r9, r9, r12\n\t"
  144219. "and r10, r10, r12\n\t"
  144220. "and r11, r11, r12\n\t"
  144221. "sbcs r4, r4, r8\n\t"
  144222. "sbcs r5, r5, r9\n\t"
  144223. "sbcs r6, r6, r10\n\t"
  144224. "sbcs r7, r7, r11\n\t"
  144225. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  144226. "ldm %[r], {r4, r5, r6, r7}\n\t"
  144227. "ldm %[m]!, {r8, r9, r10, r11}\n\t"
  144228. "and r8, r8, r12\n\t"
  144229. "and r9, r9, r12\n\t"
  144230. "and r10, r10, r12\n\t"
  144231. "and r11, r11, r12\n\t"
  144232. "sbcs r4, r4, r8\n\t"
  144233. "sbcs r5, r5, r9\n\t"
  144234. "sbcs r6, r6, r10\n\t"
  144235. "sbcs r7, r7, r11\n\t"
  144236. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  144237. "ldm %[r], {r4, r5, r6, r7}\n\t"
  144238. "ldm %[m]!, {r8, r9, r10, r11}\n\t"
  144239. "and r8, r8, r12\n\t"
  144240. "and r9, r9, r12\n\t"
  144241. "and r10, r10, r12\n\t"
  144242. "and r11, r11, r12\n\t"
  144243. "sbcs r4, r4, r8\n\t"
  144244. "sbcs r5, r5, r9\n\t"
  144245. "sbcs r6, r6, r10\n\t"
  144246. "sbcs r7, r7, r11\n\t"
  144247. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  144248. "ldm %[r], {r4, r5, r6, r7}\n\t"
  144249. "ldm %[m]!, {r8, r9, r10, r11}\n\t"
  144250. "and r8, r8, r12\n\t"
  144251. "and r9, r9, r12\n\t"
  144252. "and r10, r10, r12\n\t"
  144253. "and r11, r11, r12\n\t"
  144254. "sbcs r4, r4, r8\n\t"
  144255. "sbcs r5, r5, r9\n\t"
  144256. "sbcs r6, r6, r10\n\t"
  144257. "sbcs r7, r7, r11\n\t"
  144258. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  144259. "ldm %[r], {r4, r5, r6, r7}\n\t"
  144260. "ldm %[m]!, {r8, r9, r10, r11}\n\t"
  144261. "and r8, r8, r12\n\t"
  144262. "and r9, r9, r12\n\t"
  144263. "and r10, r10, r12\n\t"
  144264. "and r11, r11, r12\n\t"
  144265. "sbcs r4, r4, r8\n\t"
  144266. "sbcs r5, r5, r9\n\t"
  144267. "sbcs r6, r6, r10\n\t"
  144268. "sbcs r7, r7, r11\n\t"
  144269. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  144270. "ldm %[r], {r4, r5, r6, r7}\n\t"
  144271. "ldm %[m]!, {r8, r9, r10, r11}\n\t"
  144272. "and r8, r8, r12\n\t"
  144273. "and r9, r9, r12\n\t"
  144274. "and r10, r10, r12\n\t"
  144275. "and r11, r11, r12\n\t"
  144276. "sbcs r4, r4, r8\n\t"
  144277. "sbcs r5, r5, r9\n\t"
  144278. "sbcs r6, r6, r10\n\t"
  144279. "sbcs r7, r7, r11\n\t"
  144280. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  144281. "ldm %[r], {r4, r5, r6, r7}\n\t"
  144282. "ldm %[m]!, {r8, r9, r10, r11}\n\t"
  144283. "and r8, r8, r12\n\t"
  144284. "and r9, r9, r12\n\t"
  144285. "and r10, r10, r12\n\t"
  144286. "and r11, r11, r12\n\t"
  144287. "sbcs r4, r4, r8\n\t"
  144288. "sbcs r5, r5, r9\n\t"
  144289. "sbcs r6, r6, r10\n\t"
  144290. "sbc r7, r7, r11\n\t"
  144291. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  144292. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b), [m] "+r" (m)
  144293. :
  144294. : "memory", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "cc"
  144295. );
  144296. }
  144297. /* Double a Montgomery form number (r = a + a % m).
  144298. *
  144299. * r Result of doubling.
  144300. * a Number to double in Montgomery form.
  144301. * m Modulus (prime).
  144302. */
  144303. static void sp_1024_mont_dbl_32(sp_digit* r_p, const sp_digit* a_p, const sp_digit* m_p)
  144304. {
  144305. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  144306. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  144307. register const sp_digit* m asm ("r2") = (const sp_digit*)m_p;
  144308. __asm__ __volatile__ (
  144309. "mov r12, #0\n\t"
  144310. "ldm %[a]!, {r4, r5, r6, r7, r8, r9, r10, r11}\n\t"
  144311. "adds r4, r4, r4\n\t"
  144312. "adcs r5, r5, r5\n\t"
  144313. "adcs r6, r6, r6\n\t"
  144314. "adcs r7, r7, r7\n\t"
  144315. "adcs r8, r8, r8\n\t"
  144316. "adcs r9, r9, r9\n\t"
  144317. "adcs r10, r10, r10\n\t"
  144318. "adcs r11, r11, r11\n\t"
  144319. "stm %[r]!, {r4, r5, r6, r7, r8, r9, r10, r11}\n\t"
  144320. "ldm %[a]!, {r4, r5, r6, r7, r8, r9, r10, r11}\n\t"
  144321. "adcs r4, r4, r4\n\t"
  144322. "adcs r5, r5, r5\n\t"
  144323. "adcs r6, r6, r6\n\t"
  144324. "adcs r7, r7, r7\n\t"
  144325. "adcs r8, r8, r8\n\t"
  144326. "adcs r9, r9, r9\n\t"
  144327. "adcs r10, r10, r10\n\t"
  144328. "adcs r11, r11, r11\n\t"
  144329. "stm %[r]!, {r4, r5, r6, r7, r8, r9, r10, r11}\n\t"
  144330. "ldm %[a]!, {r4, r5, r6, r7, r8, r9, r10, r11}\n\t"
  144331. "adcs r4, r4, r4\n\t"
  144332. "adcs r5, r5, r5\n\t"
  144333. "adcs r6, r6, r6\n\t"
  144334. "adcs r7, r7, r7\n\t"
  144335. "adcs r8, r8, r8\n\t"
  144336. "adcs r9, r9, r9\n\t"
  144337. "adcs r10, r10, r10\n\t"
  144338. "adcs r11, r11, r11\n\t"
  144339. "stm %[r]!, {r4, r5, r6, r7, r8, r9, r10, r11}\n\t"
  144340. "ldm %[a]!, {r4, r5, r6, r7, r8, r9, r10, r11}\n\t"
  144341. "adcs r4, r4, r4\n\t"
  144342. "adcs r5, r5, r5\n\t"
  144343. "adcs r6, r6, r6\n\t"
  144344. "adcs r7, r7, r7\n\t"
  144345. "adcs r8, r8, r8\n\t"
  144346. "adcs r9, r9, r9\n\t"
  144347. "adcs r10, r10, r10\n\t"
  144348. "adcs r11, r11, r11\n\t"
  144349. "stm %[r]!, {r4, r5, r6, r7, r8, r9, r10, r11}\n\t"
  144350. "ldr r4, [%[m], #124]\n\t"
  144351. "adc r12, r12, #0\n\t"
  144352. "subs r4, r4, r11\n\t"
  144353. "neg r12, r12\n\t"
  144354. "sbc r4, r4, r4\n\t"
  144355. "sub %[r], %[r], #0x80\n\t"
  144356. "orr r12, r12, r4\n\t"
  144357. "ldm %[r], {r4, r5, r6, r7}\n\t"
  144358. "ldm %[m]!, {r8, r9, r10, r11}\n\t"
  144359. "and r8, r8, r12\n\t"
  144360. "and r9, r9, r12\n\t"
  144361. "and r10, r10, r12\n\t"
  144362. "and r11, r11, r12\n\t"
  144363. "subs r4, r4, r8\n\t"
  144364. "sbcs r5, r5, r9\n\t"
  144365. "sbcs r6, r6, r10\n\t"
  144366. "sbcs r7, r7, r11\n\t"
  144367. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  144368. "ldm %[r], {r4, r5, r6, r7}\n\t"
  144369. "ldm %[m]!, {r8, r9, r10, r11}\n\t"
  144370. "and r8, r8, r12\n\t"
  144371. "and r9, r9, r12\n\t"
  144372. "and r10, r10, r12\n\t"
  144373. "and r11, r11, r12\n\t"
  144374. "sbcs r4, r4, r8\n\t"
  144375. "sbcs r5, r5, r9\n\t"
  144376. "sbcs r6, r6, r10\n\t"
  144377. "sbcs r7, r7, r11\n\t"
  144378. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  144379. "ldm %[r], {r4, r5, r6, r7}\n\t"
  144380. "ldm %[m]!, {r8, r9, r10, r11}\n\t"
  144381. "and r8, r8, r12\n\t"
  144382. "and r9, r9, r12\n\t"
  144383. "and r10, r10, r12\n\t"
  144384. "and r11, r11, r12\n\t"
  144385. "sbcs r4, r4, r8\n\t"
  144386. "sbcs r5, r5, r9\n\t"
  144387. "sbcs r6, r6, r10\n\t"
  144388. "sbcs r7, r7, r11\n\t"
  144389. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  144390. "ldm %[r], {r4, r5, r6, r7}\n\t"
  144391. "ldm %[m]!, {r8, r9, r10, r11}\n\t"
  144392. "and r8, r8, r12\n\t"
  144393. "and r9, r9, r12\n\t"
  144394. "and r10, r10, r12\n\t"
  144395. "and r11, r11, r12\n\t"
  144396. "sbcs r4, r4, r8\n\t"
  144397. "sbcs r5, r5, r9\n\t"
  144398. "sbcs r6, r6, r10\n\t"
  144399. "sbcs r7, r7, r11\n\t"
  144400. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  144401. "ldm %[r], {r4, r5, r6, r7}\n\t"
  144402. "ldm %[m]!, {r8, r9, r10, r11}\n\t"
  144403. "and r8, r8, r12\n\t"
  144404. "and r9, r9, r12\n\t"
  144405. "and r10, r10, r12\n\t"
  144406. "and r11, r11, r12\n\t"
  144407. "sbcs r4, r4, r8\n\t"
  144408. "sbcs r5, r5, r9\n\t"
  144409. "sbcs r6, r6, r10\n\t"
  144410. "sbcs r7, r7, r11\n\t"
  144411. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  144412. "ldm %[r], {r4, r5, r6, r7}\n\t"
  144413. "ldm %[m]!, {r8, r9, r10, r11}\n\t"
  144414. "and r8, r8, r12\n\t"
  144415. "and r9, r9, r12\n\t"
  144416. "and r10, r10, r12\n\t"
  144417. "and r11, r11, r12\n\t"
  144418. "sbcs r4, r4, r8\n\t"
  144419. "sbcs r5, r5, r9\n\t"
  144420. "sbcs r6, r6, r10\n\t"
  144421. "sbcs r7, r7, r11\n\t"
  144422. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  144423. "ldm %[r], {r4, r5, r6, r7}\n\t"
  144424. "ldm %[m]!, {r8, r9, r10, r11}\n\t"
  144425. "and r8, r8, r12\n\t"
  144426. "and r9, r9, r12\n\t"
  144427. "and r10, r10, r12\n\t"
  144428. "and r11, r11, r12\n\t"
  144429. "sbcs r4, r4, r8\n\t"
  144430. "sbcs r5, r5, r9\n\t"
  144431. "sbcs r6, r6, r10\n\t"
  144432. "sbcs r7, r7, r11\n\t"
  144433. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  144434. "ldm %[r], {r4, r5, r6, r7}\n\t"
  144435. "ldm %[m]!, {r8, r9, r10, r11}\n\t"
  144436. "and r8, r8, r12\n\t"
  144437. "and r9, r9, r12\n\t"
  144438. "and r10, r10, r12\n\t"
  144439. "and r11, r11, r12\n\t"
  144440. "sbcs r4, r4, r8\n\t"
  144441. "sbcs r5, r5, r9\n\t"
  144442. "sbcs r6, r6, r10\n\t"
  144443. "sbc r7, r7, r11\n\t"
  144444. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  144445. : [r] "+r" (r), [a] "+r" (a), [m] "+r" (m)
  144446. :
  144447. : "memory", "r8", "r9", "r10", "r11", "r4", "r5", "r6", "r7", "r12", "cc"
  144448. );
  144449. }
  144450. /* Triple a Montgomery form number (r = a + a + a % m).
  144451. *
  144452. * r Result of Tripling.
  144453. * a Number to triple in Montgomery form.
  144454. * m Modulus (prime).
  144455. */
  144456. static void sp_1024_mont_tpl_32(sp_digit* r_p, const sp_digit* a_p, const sp_digit* m_p)
  144457. {
  144458. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  144459. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  144460. register const sp_digit* m asm ("r2") = (const sp_digit*)m_p;
  144461. __asm__ __volatile__ (
  144462. "mov r12, #0\n\t"
  144463. "ldm %[a]!, {r4, r5, r6, r7, r8, r9, r10, r11}\n\t"
  144464. "adds r4, r4, r4\n\t"
  144465. "adcs r5, r5, r5\n\t"
  144466. "adcs r6, r6, r6\n\t"
  144467. "adcs r7, r7, r7\n\t"
  144468. "adcs r8, r8, r8\n\t"
  144469. "adcs r9, r9, r9\n\t"
  144470. "adcs r10, r10, r10\n\t"
  144471. "adcs r11, r11, r11\n\t"
  144472. "stm %[r]!, {r4, r5, r6, r7, r8, r9, r10, r11}\n\t"
  144473. "ldm %[a]!, {r4, r5, r6, r7, r8, r9, r10, r11}\n\t"
  144474. "adcs r4, r4, r4\n\t"
  144475. "adcs r5, r5, r5\n\t"
  144476. "adcs r6, r6, r6\n\t"
  144477. "adcs r7, r7, r7\n\t"
  144478. "adcs r8, r8, r8\n\t"
  144479. "adcs r9, r9, r9\n\t"
  144480. "adcs r10, r10, r10\n\t"
  144481. "adcs r11, r11, r11\n\t"
  144482. "stm %[r]!, {r4, r5, r6, r7, r8, r9, r10, r11}\n\t"
  144483. "ldm %[a]!, {r4, r5, r6, r7, r8, r9, r10, r11}\n\t"
  144484. "adcs r4, r4, r4\n\t"
  144485. "adcs r5, r5, r5\n\t"
  144486. "adcs r6, r6, r6\n\t"
  144487. "adcs r7, r7, r7\n\t"
  144488. "adcs r8, r8, r8\n\t"
  144489. "adcs r9, r9, r9\n\t"
  144490. "adcs r10, r10, r10\n\t"
  144491. "adcs r11, r11, r11\n\t"
  144492. "stm %[r]!, {r4, r5, r6, r7, r8, r9, r10, r11}\n\t"
  144493. "ldm %[a]!, {r4, r5, r6, r7, r8, r9, r10, r11}\n\t"
  144494. "adcs r4, r4, r4\n\t"
  144495. "adcs r5, r5, r5\n\t"
  144496. "adcs r6, r6, r6\n\t"
  144497. "adcs r7, r7, r7\n\t"
  144498. "adcs r8, r8, r8\n\t"
  144499. "adcs r9, r9, r9\n\t"
  144500. "adcs r10, r10, r10\n\t"
  144501. "adcs r11, r11, r11\n\t"
  144502. "stm %[r]!, {r4, r5, r6, r7, r8, r9, r10, r11}\n\t"
  144503. "ldr r4, [%[m], #124]\n\t"
  144504. "adc r12, r12, #0\n\t"
  144505. "subs r4, r4, r11\n\t"
  144506. "neg r12, r12\n\t"
  144507. "sbc r4, r4, r4\n\t"
  144508. "sub %[r], %[r], #0x80\n\t"
  144509. "orr r12, r12, r4\n\t"
  144510. "ldm %[r], {r4, r5, r6, r7}\n\t"
  144511. "ldm %[m]!, {r8, r9, r10, r11}\n\t"
  144512. "and r8, r8, r12\n\t"
  144513. "and r9, r9, r12\n\t"
  144514. "and r10, r10, r12\n\t"
  144515. "and r11, r11, r12\n\t"
  144516. "subs r4, r4, r8\n\t"
  144517. "sbcs r5, r5, r9\n\t"
  144518. "sbcs r6, r6, r10\n\t"
  144519. "sbcs r7, r7, r11\n\t"
  144520. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  144521. "ldm %[r], {r4, r5, r6, r7}\n\t"
  144522. "ldm %[m]!, {r8, r9, r10, r11}\n\t"
  144523. "and r8, r8, r12\n\t"
  144524. "and r9, r9, r12\n\t"
  144525. "and r10, r10, r12\n\t"
  144526. "and r11, r11, r12\n\t"
  144527. "sbcs r4, r4, r8\n\t"
  144528. "sbcs r5, r5, r9\n\t"
  144529. "sbcs r6, r6, r10\n\t"
  144530. "sbcs r7, r7, r11\n\t"
  144531. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  144532. "ldm %[r], {r4, r5, r6, r7}\n\t"
  144533. "ldm %[m]!, {r8, r9, r10, r11}\n\t"
  144534. "and r8, r8, r12\n\t"
  144535. "and r9, r9, r12\n\t"
  144536. "and r10, r10, r12\n\t"
  144537. "and r11, r11, r12\n\t"
  144538. "sbcs r4, r4, r8\n\t"
  144539. "sbcs r5, r5, r9\n\t"
  144540. "sbcs r6, r6, r10\n\t"
  144541. "sbcs r7, r7, r11\n\t"
  144542. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  144543. "ldm %[r], {r4, r5, r6, r7}\n\t"
  144544. "ldm %[m]!, {r8, r9, r10, r11}\n\t"
  144545. "and r8, r8, r12\n\t"
  144546. "and r9, r9, r12\n\t"
  144547. "and r10, r10, r12\n\t"
  144548. "and r11, r11, r12\n\t"
  144549. "sbcs r4, r4, r8\n\t"
  144550. "sbcs r5, r5, r9\n\t"
  144551. "sbcs r6, r6, r10\n\t"
  144552. "sbcs r7, r7, r11\n\t"
  144553. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  144554. "ldm %[r], {r4, r5, r6, r7}\n\t"
  144555. "ldm %[m]!, {r8, r9, r10, r11}\n\t"
  144556. "and r8, r8, r12\n\t"
  144557. "and r9, r9, r12\n\t"
  144558. "and r10, r10, r12\n\t"
  144559. "and r11, r11, r12\n\t"
  144560. "sbcs r4, r4, r8\n\t"
  144561. "sbcs r5, r5, r9\n\t"
  144562. "sbcs r6, r6, r10\n\t"
  144563. "sbcs r7, r7, r11\n\t"
  144564. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  144565. "ldm %[r], {r4, r5, r6, r7}\n\t"
  144566. "ldm %[m]!, {r8, r9, r10, r11}\n\t"
  144567. "and r8, r8, r12\n\t"
  144568. "and r9, r9, r12\n\t"
  144569. "and r10, r10, r12\n\t"
  144570. "and r11, r11, r12\n\t"
  144571. "sbcs r4, r4, r8\n\t"
  144572. "sbcs r5, r5, r9\n\t"
  144573. "sbcs r6, r6, r10\n\t"
  144574. "sbcs r7, r7, r11\n\t"
  144575. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  144576. "ldm %[r], {r4, r5, r6, r7}\n\t"
  144577. "ldm %[m]!, {r8, r9, r10, r11}\n\t"
  144578. "and r8, r8, r12\n\t"
  144579. "and r9, r9, r12\n\t"
  144580. "and r10, r10, r12\n\t"
  144581. "and r11, r11, r12\n\t"
  144582. "sbcs r4, r4, r8\n\t"
  144583. "sbcs r5, r5, r9\n\t"
  144584. "sbcs r6, r6, r10\n\t"
  144585. "sbcs r7, r7, r11\n\t"
  144586. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  144587. "ldm %[r], {r4, r5, r6, r7}\n\t"
  144588. "ldm %[m]!, {r8, r9, r10, r11}\n\t"
  144589. "and r8, r8, r12\n\t"
  144590. "and r9, r9, r12\n\t"
  144591. "and r10, r10, r12\n\t"
  144592. "and r11, r11, r12\n\t"
  144593. "sbcs r4, r4, r8\n\t"
  144594. "sbcs r5, r5, r9\n\t"
  144595. "sbcs r6, r6, r10\n\t"
  144596. "sbc r7, r7, r11\n\t"
  144597. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  144598. "sub %[r], %[r], #0x80\n\t"
  144599. "sub %[m], %[m], #0x80\n\t"
  144600. "sub %[a], %[a], #0x80\n\t"
  144601. "mov r12, #0\n\t"
  144602. "ldm %[a]!, {r4, r5, r6, r7}\n\t"
  144603. "ldm %[r], {r8, r9, r10, r11}\n\t"
  144604. "adds r8, r8, r4\n\t"
  144605. "adcs r9, r9, r5\n\t"
  144606. "adcs r10, r10, r6\n\t"
  144607. "adcs r11, r11, r7\n\t"
  144608. "stm %[r]!, {r8, r9, r10, r11}\n\t"
  144609. "ldm %[a]!, {r4, r5, r6, r7}\n\t"
  144610. "ldm %[r], {r8, r9, r10, r11}\n\t"
  144611. "adcs r8, r8, r4\n\t"
  144612. "adcs r9, r9, r5\n\t"
  144613. "adcs r10, r10, r6\n\t"
  144614. "adcs r11, r11, r7\n\t"
  144615. "stm %[r]!, {r8, r9, r10, r11}\n\t"
  144616. "ldm %[a]!, {r4, r5, r6, r7}\n\t"
  144617. "ldm %[r], {r8, r9, r10, r11}\n\t"
  144618. "adcs r8, r8, r4\n\t"
  144619. "adcs r9, r9, r5\n\t"
  144620. "adcs r10, r10, r6\n\t"
  144621. "adcs r11, r11, r7\n\t"
  144622. "stm %[r]!, {r8, r9, r10, r11}\n\t"
  144623. "ldm %[a]!, {r4, r5, r6, r7}\n\t"
  144624. "ldm %[r], {r8, r9, r10, r11}\n\t"
  144625. "adcs r8, r8, r4\n\t"
  144626. "adcs r9, r9, r5\n\t"
  144627. "adcs r10, r10, r6\n\t"
  144628. "adcs r11, r11, r7\n\t"
  144629. "stm %[r]!, {r8, r9, r10, r11}\n\t"
  144630. "ldm %[a]!, {r4, r5, r6, r7}\n\t"
  144631. "ldm %[r], {r8, r9, r10, r11}\n\t"
  144632. "adcs r8, r8, r4\n\t"
  144633. "adcs r9, r9, r5\n\t"
  144634. "adcs r10, r10, r6\n\t"
  144635. "adcs r11, r11, r7\n\t"
  144636. "stm %[r]!, {r8, r9, r10, r11}\n\t"
  144637. "ldm %[a]!, {r4, r5, r6, r7}\n\t"
  144638. "ldm %[r], {r8, r9, r10, r11}\n\t"
  144639. "adcs r8, r8, r4\n\t"
  144640. "adcs r9, r9, r5\n\t"
  144641. "adcs r10, r10, r6\n\t"
  144642. "adcs r11, r11, r7\n\t"
  144643. "stm %[r]!, {r8, r9, r10, r11}\n\t"
  144644. "ldm %[a]!, {r4, r5, r6, r7}\n\t"
  144645. "ldm %[r], {r8, r9, r10, r11}\n\t"
  144646. "adcs r8, r8, r4\n\t"
  144647. "adcs r9, r9, r5\n\t"
  144648. "adcs r10, r10, r6\n\t"
  144649. "adcs r11, r11, r7\n\t"
  144650. "stm %[r]!, {r8, r9, r10, r11}\n\t"
  144651. "ldm %[a]!, {r4, r5, r6, r7}\n\t"
  144652. "ldm %[r], {r8, r9, r10, r11}\n\t"
  144653. "adcs r8, r8, r4\n\t"
  144654. "adcs r9, r9, r5\n\t"
  144655. "adcs r10, r10, r6\n\t"
  144656. "adcs r11, r11, r7\n\t"
  144657. "stm %[r]!, {r8, r9, r10, r11}\n\t"
  144658. "ldr r7, [%[m], #124]\n\t"
  144659. "adc r12, r12, #0\n\t"
  144660. "subs r7, r7, r11\n\t"
  144661. "neg r12, r12\n\t"
  144662. "sbc r7, r7, r7\n\t"
  144663. "sub %[r], %[r], #0x80\n\t"
  144664. "orr r12, r12, r7\n\t"
  144665. "ldm %[r], {r4, r5, r6, r7}\n\t"
  144666. "ldm %[m]!, {r8, r9, r10, r11}\n\t"
  144667. "and r8, r8, r12\n\t"
  144668. "and r9, r9, r12\n\t"
  144669. "and r10, r10, r12\n\t"
  144670. "and r11, r11, r12\n\t"
  144671. "subs r4, r4, r8\n\t"
  144672. "sbcs r5, r5, r9\n\t"
  144673. "sbcs r6, r6, r10\n\t"
  144674. "sbcs r7, r7, r11\n\t"
  144675. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  144676. "ldm %[r], {r4, r5, r6, r7}\n\t"
  144677. "ldm %[m]!, {r8, r9, r10, r11}\n\t"
  144678. "and r8, r8, r12\n\t"
  144679. "and r9, r9, r12\n\t"
  144680. "and r10, r10, r12\n\t"
  144681. "and r11, r11, r12\n\t"
  144682. "sbcs r4, r4, r8\n\t"
  144683. "sbcs r5, r5, r9\n\t"
  144684. "sbcs r6, r6, r10\n\t"
  144685. "sbcs r7, r7, r11\n\t"
  144686. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  144687. "ldm %[r], {r4, r5, r6, r7}\n\t"
  144688. "ldm %[m]!, {r8, r9, r10, r11}\n\t"
  144689. "and r8, r8, r12\n\t"
  144690. "and r9, r9, r12\n\t"
  144691. "and r10, r10, r12\n\t"
  144692. "and r11, r11, r12\n\t"
  144693. "sbcs r4, r4, r8\n\t"
  144694. "sbcs r5, r5, r9\n\t"
  144695. "sbcs r6, r6, r10\n\t"
  144696. "sbcs r7, r7, r11\n\t"
  144697. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  144698. "ldm %[r], {r4, r5, r6, r7}\n\t"
  144699. "ldm %[m]!, {r8, r9, r10, r11}\n\t"
  144700. "and r8, r8, r12\n\t"
  144701. "and r9, r9, r12\n\t"
  144702. "and r10, r10, r12\n\t"
  144703. "and r11, r11, r12\n\t"
  144704. "sbcs r4, r4, r8\n\t"
  144705. "sbcs r5, r5, r9\n\t"
  144706. "sbcs r6, r6, r10\n\t"
  144707. "sbcs r7, r7, r11\n\t"
  144708. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  144709. "ldm %[r], {r4, r5, r6, r7}\n\t"
  144710. "ldm %[m]!, {r8, r9, r10, r11}\n\t"
  144711. "and r8, r8, r12\n\t"
  144712. "and r9, r9, r12\n\t"
  144713. "and r10, r10, r12\n\t"
  144714. "and r11, r11, r12\n\t"
  144715. "sbcs r4, r4, r8\n\t"
  144716. "sbcs r5, r5, r9\n\t"
  144717. "sbcs r6, r6, r10\n\t"
  144718. "sbcs r7, r7, r11\n\t"
  144719. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  144720. "ldm %[r], {r4, r5, r6, r7}\n\t"
  144721. "ldm %[m]!, {r8, r9, r10, r11}\n\t"
  144722. "and r8, r8, r12\n\t"
  144723. "and r9, r9, r12\n\t"
  144724. "and r10, r10, r12\n\t"
  144725. "and r11, r11, r12\n\t"
  144726. "sbcs r4, r4, r8\n\t"
  144727. "sbcs r5, r5, r9\n\t"
  144728. "sbcs r6, r6, r10\n\t"
  144729. "sbcs r7, r7, r11\n\t"
  144730. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  144731. "ldm %[r], {r4, r5, r6, r7}\n\t"
  144732. "ldm %[m]!, {r8, r9, r10, r11}\n\t"
  144733. "and r8, r8, r12\n\t"
  144734. "and r9, r9, r12\n\t"
  144735. "and r10, r10, r12\n\t"
  144736. "and r11, r11, r12\n\t"
  144737. "sbcs r4, r4, r8\n\t"
  144738. "sbcs r5, r5, r9\n\t"
  144739. "sbcs r6, r6, r10\n\t"
  144740. "sbcs r7, r7, r11\n\t"
  144741. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  144742. "ldm %[r], {r4, r5, r6, r7}\n\t"
  144743. "ldm %[m]!, {r8, r9, r10, r11}\n\t"
  144744. "and r8, r8, r12\n\t"
  144745. "and r9, r9, r12\n\t"
  144746. "and r10, r10, r12\n\t"
  144747. "and r11, r11, r12\n\t"
  144748. "sbcs r4, r4, r8\n\t"
  144749. "sbcs r5, r5, r9\n\t"
  144750. "sbcs r6, r6, r10\n\t"
  144751. "sbc r7, r7, r11\n\t"
  144752. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  144753. : [r] "+r" (r), [a] "+r" (a), [m] "+r" (m)
  144754. :
  144755. : "memory", "r8", "r9", "r10", "r11", "r4", "r5", "r6", "r7", "r12", "cc"
  144756. );
  144757. }
  144758. /* Subtract two Montgomery form numbers (r = a - b % m).
  144759. *
  144760. * r Result of subtration.
  144761. * a Number to subtract from in Montgomery form.
  144762. * b Number to subtract with in Montgomery form.
  144763. * m Modulus (prime).
  144764. */
  144765. 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)
  144766. {
  144767. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  144768. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  144769. register const sp_digit* b asm ("r2") = (const sp_digit*)b_p;
  144770. register const sp_digit* m asm ("r3") = (const sp_digit*)m_p;
  144771. __asm__ __volatile__ (
  144772. "ldm %[a]!, {r4, r5, r6, r7}\n\t"
  144773. "ldm %[b]!, {r8, r9, r10, r11}\n\t"
  144774. "subs r4, r4, r8\n\t"
  144775. "sbcs r5, r5, r9\n\t"
  144776. "sbcs r6, r6, r10\n\t"
  144777. "sbcs r7, r7, r11\n\t"
  144778. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  144779. "ldm %[a]!, {r4, r5, r6, r7}\n\t"
  144780. "ldm %[b]!, {r8, r9, r10, r11}\n\t"
  144781. "sbcs r4, r4, r8\n\t"
  144782. "sbcs r5, r5, r9\n\t"
  144783. "sbcs r6, r6, r10\n\t"
  144784. "sbcs r7, r7, r11\n\t"
  144785. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  144786. "ldm %[a]!, {r4, r5, r6, r7}\n\t"
  144787. "ldm %[b]!, {r8, r9, r10, r11}\n\t"
  144788. "sbcs r4, r4, r8\n\t"
  144789. "sbcs r5, r5, r9\n\t"
  144790. "sbcs r6, r6, r10\n\t"
  144791. "sbcs r7, r7, r11\n\t"
  144792. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  144793. "ldm %[a]!, {r4, r5, r6, r7}\n\t"
  144794. "ldm %[b]!, {r8, r9, r10, r11}\n\t"
  144795. "sbcs r4, r4, r8\n\t"
  144796. "sbcs r5, r5, r9\n\t"
  144797. "sbcs r6, r6, r10\n\t"
  144798. "sbcs r7, r7, r11\n\t"
  144799. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  144800. "ldm %[a]!, {r4, r5, r6, r7}\n\t"
  144801. "ldm %[b]!, {r8, r9, r10, r11}\n\t"
  144802. "sbcs r4, r4, r8\n\t"
  144803. "sbcs r5, r5, r9\n\t"
  144804. "sbcs r6, r6, r10\n\t"
  144805. "sbcs r7, r7, r11\n\t"
  144806. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  144807. "ldm %[a]!, {r4, r5, r6, r7}\n\t"
  144808. "ldm %[b]!, {r8, r9, r10, r11}\n\t"
  144809. "sbcs r4, r4, r8\n\t"
  144810. "sbcs r5, r5, r9\n\t"
  144811. "sbcs r6, r6, r10\n\t"
  144812. "sbcs r7, r7, r11\n\t"
  144813. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  144814. "ldm %[a]!, {r4, r5, r6, r7}\n\t"
  144815. "ldm %[b]!, {r8, r9, r10, r11}\n\t"
  144816. "sbcs r4, r4, r8\n\t"
  144817. "sbcs r5, r5, r9\n\t"
  144818. "sbcs r6, r6, r10\n\t"
  144819. "sbcs r7, r7, r11\n\t"
  144820. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  144821. "ldm %[a]!, {r4, r5, r6, r7}\n\t"
  144822. "ldm %[b]!, {r8, r9, r10, r11}\n\t"
  144823. "sbcs r4, r4, r8\n\t"
  144824. "sbcs r5, r5, r9\n\t"
  144825. "sbcs r6, r6, r10\n\t"
  144826. "sbcs r7, r7, r11\n\t"
  144827. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  144828. "sbc r12, r12, r12\n\t"
  144829. "sub %[r], %[r], #0x80\n\t"
  144830. "ldm %[r], {r4, r5, r6, r7}\n\t"
  144831. "ldm %[m]!, {r8, r9, r10, r11}\n\t"
  144832. "and r8, r8, r12\n\t"
  144833. "and r9, r9, r12\n\t"
  144834. "and r10, r10, r12\n\t"
  144835. "and r11, r11, r12\n\t"
  144836. "adds r4, r4, r8\n\t"
  144837. "adcs r5, r5, r9\n\t"
  144838. "adcs r6, r6, r10\n\t"
  144839. "adcs r7, r7, r11\n\t"
  144840. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  144841. "ldm %[r], {r4, r5, r6, r7}\n\t"
  144842. "ldm %[m]!, {r8, r9, r10, r11}\n\t"
  144843. "and r8, r8, r12\n\t"
  144844. "and r9, r9, r12\n\t"
  144845. "and r10, r10, r12\n\t"
  144846. "and r11, r11, r12\n\t"
  144847. "adcs r4, r4, r8\n\t"
  144848. "adcs r5, r5, r9\n\t"
  144849. "adcs r6, r6, r10\n\t"
  144850. "adcs r7, r7, r11\n\t"
  144851. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  144852. "ldm %[r], {r4, r5, r6, r7}\n\t"
  144853. "ldm %[m]!, {r8, r9, r10, r11}\n\t"
  144854. "and r8, r8, r12\n\t"
  144855. "and r9, r9, r12\n\t"
  144856. "and r10, r10, r12\n\t"
  144857. "and r11, r11, r12\n\t"
  144858. "adcs r4, r4, r8\n\t"
  144859. "adcs r5, r5, r9\n\t"
  144860. "adcs r6, r6, r10\n\t"
  144861. "adcs r7, r7, r11\n\t"
  144862. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  144863. "ldm %[r], {r4, r5, r6, r7}\n\t"
  144864. "ldm %[m]!, {r8, r9, r10, r11}\n\t"
  144865. "and r8, r8, r12\n\t"
  144866. "and r9, r9, r12\n\t"
  144867. "and r10, r10, r12\n\t"
  144868. "and r11, r11, r12\n\t"
  144869. "adcs r4, r4, r8\n\t"
  144870. "adcs r5, r5, r9\n\t"
  144871. "adcs r6, r6, r10\n\t"
  144872. "adcs r7, r7, r11\n\t"
  144873. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  144874. "ldm %[r], {r4, r5, r6, r7}\n\t"
  144875. "ldm %[m]!, {r8, r9, r10, r11}\n\t"
  144876. "and r8, r8, r12\n\t"
  144877. "and r9, r9, r12\n\t"
  144878. "and r10, r10, r12\n\t"
  144879. "and r11, r11, r12\n\t"
  144880. "adcs r4, r4, r8\n\t"
  144881. "adcs r5, r5, r9\n\t"
  144882. "adcs r6, r6, r10\n\t"
  144883. "adcs r7, r7, r11\n\t"
  144884. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  144885. "ldm %[r], {r4, r5, r6, r7}\n\t"
  144886. "ldm %[m]!, {r8, r9, r10, r11}\n\t"
  144887. "and r8, r8, r12\n\t"
  144888. "and r9, r9, r12\n\t"
  144889. "and r10, r10, r12\n\t"
  144890. "and r11, r11, r12\n\t"
  144891. "adcs r4, r4, r8\n\t"
  144892. "adcs r5, r5, r9\n\t"
  144893. "adcs r6, r6, r10\n\t"
  144894. "adcs r7, r7, r11\n\t"
  144895. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  144896. "ldm %[r], {r4, r5, r6, r7}\n\t"
  144897. "ldm %[m]!, {r8, r9, r10, r11}\n\t"
  144898. "and r8, r8, r12\n\t"
  144899. "and r9, r9, r12\n\t"
  144900. "and r10, r10, r12\n\t"
  144901. "and r11, r11, r12\n\t"
  144902. "adcs r4, r4, r8\n\t"
  144903. "adcs r5, r5, r9\n\t"
  144904. "adcs r6, r6, r10\n\t"
  144905. "adcs r7, r7, r11\n\t"
  144906. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  144907. "ldm %[r], {r4, r5, r6, r7}\n\t"
  144908. "ldm %[m]!, {r8, r9, r10, r11}\n\t"
  144909. "and r8, r8, r12\n\t"
  144910. "and r9, r9, r12\n\t"
  144911. "and r10, r10, r12\n\t"
  144912. "and r11, r11, r12\n\t"
  144913. "adcs r4, r4, r8\n\t"
  144914. "adcs r5, r5, r9\n\t"
  144915. "adcs r6, r6, r10\n\t"
  144916. "adc r7, r7, r11\n\t"
  144917. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  144918. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b), [m] "+r" (m)
  144919. :
  144920. : "memory", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "cc"
  144921. );
  144922. }
  144923. #ifdef WOLFSSL_SP_SMALL
  144924. /* Conditionally add a and b using the mask m.
  144925. * m is -1 to add and 0 when not.
  144926. *
  144927. * r A single precision number representing conditional add result.
  144928. * a A single precision number to add with.
  144929. * b A single precision number to add.
  144930. * m Mask value to apply.
  144931. */
  144932. 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)
  144933. {
  144934. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  144935. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  144936. register const sp_digit* b asm ("r2") = (const sp_digit*)b_p;
  144937. register sp_digit m asm ("r3") = (sp_digit)m_p;
  144938. __asm__ __volatile__ (
  144939. "mov lr, #0\n\t"
  144940. "mov r6, #0\n\t"
  144941. "mov r12, #0\n\t"
  144942. "\n"
  144943. "L_sp_1024_cond_add_32_words_%=: \n\t"
  144944. "adds lr, lr, #-1\n\t"
  144945. "ldr r4, [%[a], r12]\n\t"
  144946. "ldr r5, [%[b], r12]\n\t"
  144947. "and r5, r5, %[m]\n\t"
  144948. "adcs r4, r4, r5\n\t"
  144949. "adc lr, r6, r6\n\t"
  144950. "str r4, [%[r], r12]\n\t"
  144951. "add r12, r12, #4\n\t"
  144952. "cmp r12, #0x80\n\t"
  144953. "blt L_sp_1024_cond_add_32_words_%=\n\t"
  144954. "mov %[r], lr\n\t"
  144955. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b), [m] "+r" (m)
  144956. :
  144957. : "memory", "r12", "lr", "r4", "r5", "r6", "cc"
  144958. );
  144959. return (uint32_t)(size_t)r;
  144960. }
  144961. #else
  144962. /* Conditionally add a and b using the mask m.
  144963. * m is -1 to add and 0 when not.
  144964. *
  144965. * r A single precision number representing conditional add result.
  144966. * a A single precision number to add with.
  144967. * b A single precision number to add.
  144968. * m Mask value to apply.
  144969. */
  144970. 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)
  144971. {
  144972. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  144973. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  144974. register const sp_digit* b asm ("r2") = (const sp_digit*)b_p;
  144975. register sp_digit m asm ("r3") = (sp_digit)m_p;
  144976. __asm__ __volatile__ (
  144977. "mov r8, #0\n\t"
  144978. "ldm %[a]!, {r4, r5}\n\t"
  144979. "ldm %[b]!, {r6, r7}\n\t"
  144980. "and r6, r6, %[m]\n\t"
  144981. "and r7, r7, %[m]\n\t"
  144982. "adds r4, r4, r6\n\t"
  144983. "adcs r5, r5, r7\n\t"
  144984. "stm %[r]!, {r4, r5}\n\t"
  144985. "ldm %[a]!, {r4, r5}\n\t"
  144986. "ldm %[b]!, {r6, r7}\n\t"
  144987. "and r6, r6, %[m]\n\t"
  144988. "and r7, r7, %[m]\n\t"
  144989. "adcs r4, r4, r6\n\t"
  144990. "adcs r5, r5, r7\n\t"
  144991. "stm %[r]!, {r4, r5}\n\t"
  144992. "ldm %[a]!, {r4, r5}\n\t"
  144993. "ldm %[b]!, {r6, r7}\n\t"
  144994. "and r6, r6, %[m]\n\t"
  144995. "and r7, r7, %[m]\n\t"
  144996. "adcs r4, r4, r6\n\t"
  144997. "adcs r5, r5, r7\n\t"
  144998. "stm %[r]!, {r4, r5}\n\t"
  144999. "ldm %[a]!, {r4, r5}\n\t"
  145000. "ldm %[b]!, {r6, r7}\n\t"
  145001. "and r6, r6, %[m]\n\t"
  145002. "and r7, r7, %[m]\n\t"
  145003. "adcs r4, r4, r6\n\t"
  145004. "adcs r5, r5, r7\n\t"
  145005. "stm %[r]!, {r4, r5}\n\t"
  145006. "ldm %[a]!, {r4, r5}\n\t"
  145007. "ldm %[b]!, {r6, r7}\n\t"
  145008. "and r6, r6, %[m]\n\t"
  145009. "and r7, r7, %[m]\n\t"
  145010. "adcs r4, r4, r6\n\t"
  145011. "adcs r5, r5, r7\n\t"
  145012. "stm %[r]!, {r4, r5}\n\t"
  145013. "ldm %[a]!, {r4, r5}\n\t"
  145014. "ldm %[b]!, {r6, r7}\n\t"
  145015. "and r6, r6, %[m]\n\t"
  145016. "and r7, r7, %[m]\n\t"
  145017. "adcs r4, r4, r6\n\t"
  145018. "adcs r5, r5, r7\n\t"
  145019. "stm %[r]!, {r4, r5}\n\t"
  145020. "ldm %[a]!, {r4, r5}\n\t"
  145021. "ldm %[b]!, {r6, r7}\n\t"
  145022. "and r6, r6, %[m]\n\t"
  145023. "and r7, r7, %[m]\n\t"
  145024. "adcs r4, r4, r6\n\t"
  145025. "adcs r5, r5, r7\n\t"
  145026. "stm %[r]!, {r4, r5}\n\t"
  145027. "ldm %[a]!, {r4, r5}\n\t"
  145028. "ldm %[b]!, {r6, r7}\n\t"
  145029. "and r6, r6, %[m]\n\t"
  145030. "and r7, r7, %[m]\n\t"
  145031. "adcs r4, r4, r6\n\t"
  145032. "adcs r5, r5, r7\n\t"
  145033. "stm %[r]!, {r4, r5}\n\t"
  145034. "ldm %[a]!, {r4, r5}\n\t"
  145035. "ldm %[b]!, {r6, r7}\n\t"
  145036. "and r6, r6, %[m]\n\t"
  145037. "and r7, r7, %[m]\n\t"
  145038. "adcs r4, r4, r6\n\t"
  145039. "adcs r5, r5, r7\n\t"
  145040. "stm %[r]!, {r4, r5}\n\t"
  145041. "ldm %[a]!, {r4, r5}\n\t"
  145042. "ldm %[b]!, {r6, r7}\n\t"
  145043. "and r6, r6, %[m]\n\t"
  145044. "and r7, r7, %[m]\n\t"
  145045. "adcs r4, r4, r6\n\t"
  145046. "adcs r5, r5, r7\n\t"
  145047. "stm %[r]!, {r4, r5}\n\t"
  145048. "ldm %[a]!, {r4, r5}\n\t"
  145049. "ldm %[b]!, {r6, r7}\n\t"
  145050. "and r6, r6, %[m]\n\t"
  145051. "and r7, r7, %[m]\n\t"
  145052. "adcs r4, r4, r6\n\t"
  145053. "adcs r5, r5, r7\n\t"
  145054. "stm %[r]!, {r4, r5}\n\t"
  145055. "ldm %[a]!, {r4, r5}\n\t"
  145056. "ldm %[b]!, {r6, r7}\n\t"
  145057. "and r6, r6, %[m]\n\t"
  145058. "and r7, r7, %[m]\n\t"
  145059. "adcs r4, r4, r6\n\t"
  145060. "adcs r5, r5, r7\n\t"
  145061. "stm %[r]!, {r4, r5}\n\t"
  145062. "ldm %[a]!, {r4, r5}\n\t"
  145063. "ldm %[b]!, {r6, r7}\n\t"
  145064. "and r6, r6, %[m]\n\t"
  145065. "and r7, r7, %[m]\n\t"
  145066. "adcs r4, r4, r6\n\t"
  145067. "adcs r5, r5, r7\n\t"
  145068. "stm %[r]!, {r4, r5}\n\t"
  145069. "ldm %[a]!, {r4, r5}\n\t"
  145070. "ldm %[b]!, {r6, r7}\n\t"
  145071. "and r6, r6, %[m]\n\t"
  145072. "and r7, r7, %[m]\n\t"
  145073. "adcs r4, r4, r6\n\t"
  145074. "adcs r5, r5, r7\n\t"
  145075. "stm %[r]!, {r4, r5}\n\t"
  145076. "ldm %[a]!, {r4, r5}\n\t"
  145077. "ldm %[b]!, {r6, r7}\n\t"
  145078. "and r6, r6, %[m]\n\t"
  145079. "and r7, r7, %[m]\n\t"
  145080. "adcs r4, r4, r6\n\t"
  145081. "adcs r5, r5, r7\n\t"
  145082. "stm %[r]!, {r4, r5}\n\t"
  145083. "ldm %[a]!, {r4, r5}\n\t"
  145084. "ldm %[b]!, {r6, r7}\n\t"
  145085. "and r6, r6, %[m]\n\t"
  145086. "and r7, r7, %[m]\n\t"
  145087. "adcs r4, r4, r6\n\t"
  145088. "adcs r5, r5, r7\n\t"
  145089. "stm %[r]!, {r4, r5}\n\t"
  145090. "adc %[r], r8, r8\n\t"
  145091. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b), [m] "+r" (m)
  145092. :
  145093. : "memory", "r12", "lr", "r4", "r5", "r6", "r7", "r8", "cc"
  145094. );
  145095. return (uint32_t)(size_t)r;
  145096. }
  145097. #endif /* WOLFSSL_SP_SMALL */
  145098. static void sp_1024_rshift1_32(sp_digit* r_p, const sp_digit* a_p)
  145099. {
  145100. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  145101. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  145102. __asm__ __volatile__ (
  145103. "ldm %[a], {r2, r3}\n\t"
  145104. "lsr r2, r2, #1\n\t"
  145105. "orr r2, r2, r3, lsl #31\n\t"
  145106. "lsr r3, r3, #1\n\t"
  145107. "ldr r4, [%[a], #8]\n\t"
  145108. "str r2, [%[r]]\n\t"
  145109. "orr r3, r3, r4, lsl #31\n\t"
  145110. "lsr r4, r4, #1\n\t"
  145111. "ldr r2, [%[a], #12]\n\t"
  145112. "str r3, [%[r], #4]\n\t"
  145113. "orr r4, r4, r2, lsl #31\n\t"
  145114. "lsr r2, r2, #1\n\t"
  145115. "ldr r3, [%[a], #16]\n\t"
  145116. "str r4, [%[r], #8]\n\t"
  145117. "orr r2, r2, r3, lsl #31\n\t"
  145118. "lsr r3, r3, #1\n\t"
  145119. "ldr r4, [%[a], #20]\n\t"
  145120. "str r2, [%[r], #12]\n\t"
  145121. "orr r3, r3, r4, lsl #31\n\t"
  145122. "lsr r4, r4, #1\n\t"
  145123. "ldr r2, [%[a], #24]\n\t"
  145124. "str r3, [%[r], #16]\n\t"
  145125. "orr r4, r4, r2, lsl #31\n\t"
  145126. "lsr r2, r2, #1\n\t"
  145127. "ldr r3, [%[a], #28]\n\t"
  145128. "str r4, [%[r], #20]\n\t"
  145129. "orr r2, r2, r3, lsl #31\n\t"
  145130. "lsr r3, r3, #1\n\t"
  145131. "ldr r4, [%[a], #32]\n\t"
  145132. "str r2, [%[r], #24]\n\t"
  145133. "orr r3, r3, r4, lsl #31\n\t"
  145134. "lsr r4, r4, #1\n\t"
  145135. "ldr r2, [%[a], #36]\n\t"
  145136. "str r3, [%[r], #28]\n\t"
  145137. "orr r4, r4, r2, lsl #31\n\t"
  145138. "lsr r2, r2, #1\n\t"
  145139. "ldr r3, [%[a], #40]\n\t"
  145140. "str r4, [%[r], #32]\n\t"
  145141. "orr r2, r2, r3, lsl #31\n\t"
  145142. "lsr r3, r3, #1\n\t"
  145143. "ldr r4, [%[a], #44]\n\t"
  145144. "str r2, [%[r], #36]\n\t"
  145145. "orr r3, r3, r4, lsl #31\n\t"
  145146. "lsr r4, r4, #1\n\t"
  145147. "ldr r2, [%[a], #48]\n\t"
  145148. "str r3, [%[r], #40]\n\t"
  145149. "orr r4, r4, r2, lsl #31\n\t"
  145150. "lsr r2, r2, #1\n\t"
  145151. "ldr r3, [%[a], #52]\n\t"
  145152. "str r4, [%[r], #44]\n\t"
  145153. "orr r2, r2, r3, lsl #31\n\t"
  145154. "lsr r3, r3, #1\n\t"
  145155. "ldr r4, [%[a], #56]\n\t"
  145156. "str r2, [%[r], #48]\n\t"
  145157. "orr r3, r3, r4, lsl #31\n\t"
  145158. "lsr r4, r4, #1\n\t"
  145159. "ldr r2, [%[a], #60]\n\t"
  145160. "str r3, [%[r], #52]\n\t"
  145161. "orr r4, r4, r2, lsl #31\n\t"
  145162. "lsr r2, r2, #1\n\t"
  145163. "ldr r3, [%[a], #64]\n\t"
  145164. "str r4, [%[r], #56]\n\t"
  145165. "orr r2, r2, r3, lsl #31\n\t"
  145166. "lsr r3, r3, #1\n\t"
  145167. "ldr r4, [%[a], #68]\n\t"
  145168. "str r2, [%[r], #60]\n\t"
  145169. "orr r3, r3, r4, lsl #31\n\t"
  145170. "lsr r4, r4, #1\n\t"
  145171. "ldr r2, [%[a], #72]\n\t"
  145172. "str r3, [%[r], #64]\n\t"
  145173. "orr r4, r4, r2, lsl #31\n\t"
  145174. "lsr r2, r2, #1\n\t"
  145175. "ldr r3, [%[a], #76]\n\t"
  145176. "str r4, [%[r], #68]\n\t"
  145177. "orr r2, r2, r3, lsl #31\n\t"
  145178. "lsr r3, r3, #1\n\t"
  145179. "ldr r4, [%[a], #80]\n\t"
  145180. "str r2, [%[r], #72]\n\t"
  145181. "orr r3, r3, r4, lsl #31\n\t"
  145182. "lsr r4, r4, #1\n\t"
  145183. "ldr r2, [%[a], #84]\n\t"
  145184. "str r3, [%[r], #76]\n\t"
  145185. "orr r4, r4, r2, lsl #31\n\t"
  145186. "lsr r2, r2, #1\n\t"
  145187. "ldr r3, [%[a], #88]\n\t"
  145188. "str r4, [%[r], #80]\n\t"
  145189. "orr r2, r2, r3, lsl #31\n\t"
  145190. "lsr r3, r3, #1\n\t"
  145191. "ldr r4, [%[a], #92]\n\t"
  145192. "str r2, [%[r], #84]\n\t"
  145193. "orr r3, r3, r4, lsl #31\n\t"
  145194. "lsr r4, r4, #1\n\t"
  145195. "ldr r2, [%[a], #96]\n\t"
  145196. "str r3, [%[r], #88]\n\t"
  145197. "orr r4, r4, r2, lsl #31\n\t"
  145198. "lsr r2, r2, #1\n\t"
  145199. "ldr r3, [%[a], #100]\n\t"
  145200. "str r4, [%[r], #92]\n\t"
  145201. "orr r2, r2, r3, lsl #31\n\t"
  145202. "lsr r3, r3, #1\n\t"
  145203. "ldr r4, [%[a], #104]\n\t"
  145204. "str r2, [%[r], #96]\n\t"
  145205. "orr r3, r3, r4, lsl #31\n\t"
  145206. "lsr r4, r4, #1\n\t"
  145207. "ldr r2, [%[a], #108]\n\t"
  145208. "str r3, [%[r], #100]\n\t"
  145209. "orr r4, r4, r2, lsl #31\n\t"
  145210. "lsr r2, r2, #1\n\t"
  145211. "ldr r3, [%[a], #112]\n\t"
  145212. "str r4, [%[r], #104]\n\t"
  145213. "orr r2, r2, r3, lsl #31\n\t"
  145214. "lsr r3, r3, #1\n\t"
  145215. "ldr r4, [%[a], #116]\n\t"
  145216. "str r2, [%[r], #108]\n\t"
  145217. "orr r3, r3, r4, lsl #31\n\t"
  145218. "lsr r4, r4, #1\n\t"
  145219. "ldr r2, [%[a], #120]\n\t"
  145220. "str r3, [%[r], #112]\n\t"
  145221. "orr r4, r4, r2, lsl #31\n\t"
  145222. "lsr r2, r2, #1\n\t"
  145223. "ldr r3, [%[a], #124]\n\t"
  145224. "str r4, [%[r], #116]\n\t"
  145225. "orr r2, r2, r3, lsl #31\n\t"
  145226. "lsr r3, r3, #1\n\t"
  145227. "str r2, [%[r], #120]\n\t"
  145228. "str r3, [%[r], #124]\n\t"
  145229. : [r] "+r" (r), [a] "+r" (a)
  145230. :
  145231. : "memory", "r2", "r3", "r4", "cc"
  145232. );
  145233. }
  145234. /* Divide the number by 2 mod the modulus (prime). (r = a / 2 % m)
  145235. *
  145236. * r Result of division by 2.
  145237. * a Number to divide.
  145238. * m Modulus (prime).
  145239. */
  145240. static void sp_1024_mont_div2_32(sp_digit* r, const sp_digit* a, const sp_digit* m)
  145241. {
  145242. sp_digit o;
  145243. o = sp_1024_cond_add_32(r, a, m, 0 - (a[0] & 1));
  145244. sp_1024_rshift1_32(r, r);
  145245. r[31] |= o << 31;
  145246. }
  145247. /* Double the Montgomery form projective point p.
  145248. *
  145249. * r Result of doubling point.
  145250. * p Point to double.
  145251. * t Temporary ordinate data.
  145252. */
  145253. static void sp_1024_proj_point_dbl_32(sp_point_1024* r, const sp_point_1024* p,
  145254. sp_digit* t)
  145255. {
  145256. sp_digit* t1 = t;
  145257. sp_digit* t2 = t + 2*32;
  145258. sp_digit* x;
  145259. sp_digit* y;
  145260. sp_digit* z;
  145261. x = r->x;
  145262. y = r->y;
  145263. z = r->z;
  145264. /* Put infinity into result. */
  145265. if (r != p) {
  145266. r->infinity = p->infinity;
  145267. }
  145268. /* T1 = Z * Z */
  145269. sp_1024_mont_sqr_32(t1, p->z, p1024_mod, p1024_mp_mod);
  145270. /* Z = Y * Z */
  145271. sp_1024_mont_mul_32(z, p->y, p->z, p1024_mod, p1024_mp_mod);
  145272. /* Z = 2Z */
  145273. sp_1024_mont_dbl_32(z, z, p1024_mod);
  145274. /* T2 = X - T1 */
  145275. sp_1024_mont_sub_32(t2, p->x, t1, p1024_mod);
  145276. /* T1 = X + T1 */
  145277. sp_1024_mont_add_32(t1, p->x, t1, p1024_mod);
  145278. /* T2 = T1 * T2 */
  145279. sp_1024_mont_mul_32(t2, t1, t2, p1024_mod, p1024_mp_mod);
  145280. /* T1 = 3T2 */
  145281. sp_1024_mont_tpl_32(t1, t2, p1024_mod);
  145282. /* Y = 2Y */
  145283. sp_1024_mont_dbl_32(y, p->y, p1024_mod);
  145284. /* Y = Y * Y */
  145285. sp_1024_mont_sqr_32(y, y, p1024_mod, p1024_mp_mod);
  145286. /* T2 = Y * Y */
  145287. sp_1024_mont_sqr_32(t2, y, p1024_mod, p1024_mp_mod);
  145288. /* T2 = T2/2 */
  145289. sp_1024_mont_div2_32(t2, t2, p1024_mod);
  145290. /* Y = Y * X */
  145291. sp_1024_mont_mul_32(y, y, p->x, p1024_mod, p1024_mp_mod);
  145292. /* X = T1 * T1 */
  145293. sp_1024_mont_sqr_32(x, t1, p1024_mod, p1024_mp_mod);
  145294. /* X = X - Y */
  145295. sp_1024_mont_sub_32(x, x, y, p1024_mod);
  145296. /* X = X - Y */
  145297. sp_1024_mont_sub_32(x, x, y, p1024_mod);
  145298. /* Y = Y - X */
  145299. sp_1024_mont_sub_32(y, y, x, p1024_mod);
  145300. /* Y = Y * T1 */
  145301. sp_1024_mont_mul_32(y, y, t1, p1024_mod, p1024_mp_mod);
  145302. /* Y = Y - T2 */
  145303. sp_1024_mont_sub_32(y, y, t2, p1024_mod);
  145304. }
  145305. #ifdef WOLFSSL_SP_NONBLOCK
  145306. typedef struct sp_1024_proj_point_dbl_32_ctx {
  145307. int state;
  145308. sp_digit* t1;
  145309. sp_digit* t2;
  145310. sp_digit* x;
  145311. sp_digit* y;
  145312. sp_digit* z;
  145313. } sp_1024_proj_point_dbl_32_ctx;
  145314. /* Double the Montgomery form projective point p.
  145315. *
  145316. * r Result of doubling point.
  145317. * p Point to double.
  145318. * t Temporary ordinate data.
  145319. */
  145320. static int sp_1024_proj_point_dbl_32_nb(sp_ecc_ctx_t* sp_ctx, sp_point_1024* r,
  145321. const sp_point_1024* p, sp_digit* t)
  145322. {
  145323. int err = FP_WOULDBLOCK;
  145324. sp_1024_proj_point_dbl_32_ctx* ctx = (sp_1024_proj_point_dbl_32_ctx*)sp_ctx->data;
  145325. typedef char ctx_size_test[sizeof(sp_1024_proj_point_dbl_32_ctx) >= sizeof(*sp_ctx) ? -1 : 1];
  145326. (void)sizeof(ctx_size_test);
  145327. switch (ctx->state) {
  145328. case 0:
  145329. ctx->t1 = t;
  145330. ctx->t2 = t + 2*32;
  145331. ctx->x = r->x;
  145332. ctx->y = r->y;
  145333. ctx->z = r->z;
  145334. /* Put infinity into result. */
  145335. if (r != p) {
  145336. r->infinity = p->infinity;
  145337. }
  145338. ctx->state = 1;
  145339. break;
  145340. case 1:
  145341. /* T1 = Z * Z */
  145342. sp_1024_mont_sqr_32(ctx->t1, p->z, p1024_mod, p1024_mp_mod);
  145343. ctx->state = 2;
  145344. break;
  145345. case 2:
  145346. /* Z = Y * Z */
  145347. sp_1024_mont_mul_32(ctx->z, p->y, p->z, p1024_mod, p1024_mp_mod);
  145348. ctx->state = 3;
  145349. break;
  145350. case 3:
  145351. /* Z = 2Z */
  145352. sp_1024_mont_dbl_32(ctx->z, ctx->z, p1024_mod);
  145353. ctx->state = 4;
  145354. break;
  145355. case 4:
  145356. /* T2 = X - T1 */
  145357. sp_1024_mont_sub_32(ctx->t2, p->x, ctx->t1, p1024_mod);
  145358. ctx->state = 5;
  145359. break;
  145360. case 5:
  145361. /* T1 = X + T1 */
  145362. sp_1024_mont_add_32(ctx->t1, p->x, ctx->t1, p1024_mod);
  145363. ctx->state = 6;
  145364. break;
  145365. case 6:
  145366. /* T2 = T1 * T2 */
  145367. sp_1024_mont_mul_32(ctx->t2, ctx->t1, ctx->t2, p1024_mod, p1024_mp_mod);
  145368. ctx->state = 7;
  145369. break;
  145370. case 7:
  145371. /* T1 = 3T2 */
  145372. sp_1024_mont_tpl_32(ctx->t1, ctx->t2, p1024_mod);
  145373. ctx->state = 8;
  145374. break;
  145375. case 8:
  145376. /* Y = 2Y */
  145377. sp_1024_mont_dbl_32(ctx->y, p->y, p1024_mod);
  145378. ctx->state = 9;
  145379. break;
  145380. case 9:
  145381. /* Y = Y * Y */
  145382. sp_1024_mont_sqr_32(ctx->y, ctx->y, p1024_mod, p1024_mp_mod);
  145383. ctx->state = 10;
  145384. break;
  145385. case 10:
  145386. /* T2 = Y * Y */
  145387. sp_1024_mont_sqr_32(ctx->t2, ctx->y, p1024_mod, p1024_mp_mod);
  145388. ctx->state = 11;
  145389. break;
  145390. case 11:
  145391. /* T2 = T2/2 */
  145392. sp_1024_mont_div2_32(ctx->t2, ctx->t2, p1024_mod);
  145393. ctx->state = 12;
  145394. break;
  145395. case 12:
  145396. /* Y = Y * X */
  145397. sp_1024_mont_mul_32(ctx->y, ctx->y, p->x, p1024_mod, p1024_mp_mod);
  145398. ctx->state = 13;
  145399. break;
  145400. case 13:
  145401. /* X = T1 * T1 */
  145402. sp_1024_mont_sqr_32(ctx->x, ctx->t1, p1024_mod, p1024_mp_mod);
  145403. ctx->state = 14;
  145404. break;
  145405. case 14:
  145406. /* X = X - Y */
  145407. sp_1024_mont_sub_32(ctx->x, ctx->x, ctx->y, p1024_mod);
  145408. ctx->state = 15;
  145409. break;
  145410. case 15:
  145411. /* X = X - Y */
  145412. sp_1024_mont_sub_32(ctx->x, ctx->x, ctx->y, p1024_mod);
  145413. ctx->state = 16;
  145414. break;
  145415. case 16:
  145416. /* Y = Y - X */
  145417. sp_1024_mont_sub_32(ctx->y, ctx->y, ctx->x, p1024_mod);
  145418. ctx->state = 17;
  145419. break;
  145420. case 17:
  145421. /* Y = Y * T1 */
  145422. sp_1024_mont_mul_32(ctx->y, ctx->y, ctx->t1, p1024_mod, p1024_mp_mod);
  145423. ctx->state = 18;
  145424. break;
  145425. case 18:
  145426. /* Y = Y - T2 */
  145427. sp_1024_mont_sub_32(ctx->y, ctx->y, ctx->t2, p1024_mod);
  145428. ctx->state = 19;
  145429. /* fall-through */
  145430. case 19:
  145431. err = MP_OKAY;
  145432. break;
  145433. }
  145434. if (err == MP_OKAY && ctx->state != 19) {
  145435. err = FP_WOULDBLOCK;
  145436. }
  145437. return err;
  145438. }
  145439. #endif /* WOLFSSL_SP_NONBLOCK */
  145440. /* Compare two numbers to determine if they are equal.
  145441. * Constant time implementation.
  145442. *
  145443. * a First number to compare.
  145444. * b Second number to compare.
  145445. * returns 1 when equal and 0 otherwise.
  145446. */
  145447. static int sp_1024_cmp_equal_32(const sp_digit* a, const sp_digit* b)
  145448. {
  145449. return ((a[0] ^ b[0]) | (a[1] ^ b[1]) | (a[2] ^ b[2]) |
  145450. (a[3] ^ b[3]) | (a[4] ^ b[4]) | (a[5] ^ b[5]) |
  145451. (a[6] ^ b[6]) | (a[7] ^ b[7]) | (a[8] ^ b[8]) |
  145452. (a[9] ^ b[9]) | (a[10] ^ b[10]) | (a[11] ^ b[11]) |
  145453. (a[12] ^ b[12]) | (a[13] ^ b[13]) | (a[14] ^ b[14]) |
  145454. (a[15] ^ b[15]) | (a[16] ^ b[16]) | (a[17] ^ b[17]) |
  145455. (a[18] ^ b[18]) | (a[19] ^ b[19]) | (a[20] ^ b[20]) |
  145456. (a[21] ^ b[21]) | (a[22] ^ b[22]) | (a[23] ^ b[23]) |
  145457. (a[24] ^ b[24]) | (a[25] ^ b[25]) | (a[26] ^ b[26]) |
  145458. (a[27] ^ b[27]) | (a[28] ^ b[28]) | (a[29] ^ b[29]) |
  145459. (a[30] ^ b[30]) | (a[31] ^ b[31])) == 0;
  145460. }
  145461. /* Returns 1 if the number of zero.
  145462. * Implementation is constant time.
  145463. *
  145464. * a Number to check.
  145465. * returns 1 if the number is zero and 0 otherwise.
  145466. */
  145467. static int sp_1024_iszero_32(const sp_digit* a)
  145468. {
  145469. return (a[0] | a[1] | a[2] | a[3] | a[4] | a[5] | a[6] | a[7] |
  145470. a[8] | a[9] | a[10] | a[11] | a[12] | a[13] | a[14] | a[15] |
  145471. a[16] | a[17] | a[18] | a[19] | a[20] | a[21] | a[22] | a[23] |
  145472. a[24] | a[25] | a[26] | a[27] | a[28] | a[29] | a[30] | a[31]) == 0;
  145473. }
  145474. /* Add two Montgomery form projective points.
  145475. *
  145476. * r Result of addition.
  145477. * p First point to add.
  145478. * q Second point to add.
  145479. * t Temporary ordinate data.
  145480. */
  145481. static void sp_1024_proj_point_add_32(sp_point_1024* r,
  145482. const sp_point_1024* p, const sp_point_1024* q, sp_digit* t)
  145483. {
  145484. sp_digit* t6 = t;
  145485. sp_digit* t1 = t + 2*32;
  145486. sp_digit* t2 = t + 4*32;
  145487. sp_digit* t3 = t + 6*32;
  145488. sp_digit* t4 = t + 8*32;
  145489. sp_digit* t5 = t + 10*32;
  145490. /* U1 = X1*Z2^2 */
  145491. sp_1024_mont_sqr_32(t1, q->z, p1024_mod, p1024_mp_mod);
  145492. sp_1024_mont_mul_32(t3, t1, q->z, p1024_mod, p1024_mp_mod);
  145493. sp_1024_mont_mul_32(t1, t1, p->x, p1024_mod, p1024_mp_mod);
  145494. /* U2 = X2*Z1^2 */
  145495. sp_1024_mont_sqr_32(t2, p->z, p1024_mod, p1024_mp_mod);
  145496. sp_1024_mont_mul_32(t4, t2, p->z, p1024_mod, p1024_mp_mod);
  145497. sp_1024_mont_mul_32(t2, t2, q->x, p1024_mod, p1024_mp_mod);
  145498. /* S1 = Y1*Z2^3 */
  145499. sp_1024_mont_mul_32(t3, t3, p->y, p1024_mod, p1024_mp_mod);
  145500. /* S2 = Y2*Z1^3 */
  145501. sp_1024_mont_mul_32(t4, t4, q->y, p1024_mod, p1024_mp_mod);
  145502. /* Check double */
  145503. if ((~p->infinity) & (~q->infinity) &
  145504. sp_1024_cmp_equal_32(t2, t1) &
  145505. sp_1024_cmp_equal_32(t4, t3)) {
  145506. sp_1024_proj_point_dbl_32(r, p, t);
  145507. }
  145508. else {
  145509. sp_digit* x = t6;
  145510. sp_digit* y = t1;
  145511. sp_digit* z = t2;
  145512. /* H = U2 - U1 */
  145513. sp_1024_mont_sub_32(t2, t2, t1, p1024_mod);
  145514. /* R = S2 - S1 */
  145515. sp_1024_mont_sub_32(t4, t4, t3, p1024_mod);
  145516. /* X3 = R^2 - H^3 - 2*U1*H^2 */
  145517. sp_1024_mont_sqr_32(t5, t2, p1024_mod, p1024_mp_mod);
  145518. sp_1024_mont_mul_32(y, t1, t5, p1024_mod, p1024_mp_mod);
  145519. sp_1024_mont_mul_32(t5, t5, t2, p1024_mod, p1024_mp_mod);
  145520. /* Z3 = H*Z1*Z2 */
  145521. sp_1024_mont_mul_32(z, p->z, t2, p1024_mod, p1024_mp_mod);
  145522. sp_1024_mont_mul_32(z, z, q->z, p1024_mod, p1024_mp_mod);
  145523. sp_1024_mont_sqr_32(x, t4, p1024_mod, p1024_mp_mod);
  145524. sp_1024_mont_sub_32(x, x, t5, p1024_mod);
  145525. sp_1024_mont_mul_32(t5, t5, t3, p1024_mod, p1024_mp_mod);
  145526. sp_1024_mont_dbl_32(t3, y, p1024_mod);
  145527. sp_1024_mont_sub_32(x, x, t3, p1024_mod);
  145528. /* Y3 = R*(U1*H^2 - X3) - S1*H^3 */
  145529. sp_1024_mont_sub_32(y, y, x, p1024_mod);
  145530. sp_1024_mont_mul_32(y, y, t4, p1024_mod, p1024_mp_mod);
  145531. sp_1024_mont_sub_32(y, y, t5, p1024_mod);
  145532. {
  145533. int i;
  145534. sp_digit maskp = 0 - (q->infinity & (!p->infinity));
  145535. sp_digit maskq = 0 - (p->infinity & (!q->infinity));
  145536. sp_digit maskt = ~(maskp | maskq);
  145537. sp_digit inf = (sp_digit)(p->infinity & q->infinity);
  145538. for (i = 0; i < 32; i++) {
  145539. r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) |
  145540. (x[i] & maskt);
  145541. }
  145542. for (i = 0; i < 32; i++) {
  145543. r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) |
  145544. (y[i] & maskt);
  145545. }
  145546. for (i = 0; i < 32; i++) {
  145547. r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) |
  145548. (z[i] & maskt);
  145549. }
  145550. r->z[0] |= inf;
  145551. r->infinity = (word32)inf;
  145552. }
  145553. }
  145554. }
  145555. #ifdef WOLFSSL_SP_NONBLOCK
  145556. typedef struct sp_1024_proj_point_add_32_ctx {
  145557. int state;
  145558. sp_1024_proj_point_dbl_32_ctx dbl_ctx;
  145559. const sp_point_1024* ap[2];
  145560. sp_point_1024* rp[2];
  145561. sp_digit* t1;
  145562. sp_digit* t2;
  145563. sp_digit* t3;
  145564. sp_digit* t4;
  145565. sp_digit* t5;
  145566. sp_digit* t6;
  145567. sp_digit* x;
  145568. sp_digit* y;
  145569. sp_digit* z;
  145570. } sp_1024_proj_point_add_32_ctx;
  145571. /* Add two Montgomery form projective points.
  145572. *
  145573. * r Result of addition.
  145574. * p First point to add.
  145575. * q Second point to add.
  145576. * t Temporary ordinate data.
  145577. */
  145578. static int sp_1024_proj_point_add_32_nb(sp_ecc_ctx_t* sp_ctx, sp_point_1024* r,
  145579. const sp_point_1024* p, const sp_point_1024* q, sp_digit* t)
  145580. {
  145581. int err = FP_WOULDBLOCK;
  145582. sp_1024_proj_point_add_32_ctx* ctx = (sp_1024_proj_point_add_32_ctx*)sp_ctx->data;
  145583. /* Ensure only the first point is the same as the result. */
  145584. if (q == r) {
  145585. const sp_point_1024* a = p;
  145586. p = q;
  145587. q = a;
  145588. }
  145589. typedef char ctx_size_test[sizeof(sp_1024_proj_point_add_32_ctx) >= sizeof(*sp_ctx) ? -1 : 1];
  145590. (void)sizeof(ctx_size_test);
  145591. switch (ctx->state) {
  145592. case 0: /* INIT */
  145593. ctx->t6 = t;
  145594. ctx->t1 = t + 2*32;
  145595. ctx->t2 = t + 4*32;
  145596. ctx->t3 = t + 6*32;
  145597. ctx->t4 = t + 8*32;
  145598. ctx->t5 = t + 10*32;
  145599. ctx->x = ctx->t6;
  145600. ctx->y = ctx->t1;
  145601. ctx->z = ctx->t2;
  145602. ctx->state = 1;
  145603. break;
  145604. case 1:
  145605. /* U1 = X1*Z2^2 */
  145606. sp_1024_mont_sqr_32(ctx->t1, q->z, p1024_mod, p1024_mp_mod);
  145607. ctx->state = 2;
  145608. break;
  145609. case 2:
  145610. sp_1024_mont_mul_32(ctx->t3, ctx->t1, q->z, p1024_mod, p1024_mp_mod);
  145611. ctx->state = 3;
  145612. break;
  145613. case 3:
  145614. sp_1024_mont_mul_32(ctx->t1, ctx->t1, p->x, p1024_mod, p1024_mp_mod);
  145615. ctx->state = 4;
  145616. break;
  145617. case 4:
  145618. /* U2 = X2*Z1^2 */
  145619. sp_1024_mont_sqr_32(ctx->t2, p->z, p1024_mod, p1024_mp_mod);
  145620. ctx->state = 5;
  145621. break;
  145622. case 5:
  145623. sp_1024_mont_mul_32(ctx->t4, ctx->t2, p->z, p1024_mod, p1024_mp_mod);
  145624. ctx->state = 6;
  145625. break;
  145626. case 6:
  145627. sp_1024_mont_mul_32(ctx->t2, ctx->t2, q->x, p1024_mod, p1024_mp_mod);
  145628. ctx->state = 7;
  145629. break;
  145630. case 7:
  145631. /* S1 = Y1*Z2^3 */
  145632. sp_1024_mont_mul_32(ctx->t3, ctx->t3, p->y, p1024_mod, p1024_mp_mod);
  145633. ctx->state = 8;
  145634. break;
  145635. case 8:
  145636. /* S2 = Y2*Z1^3 */
  145637. sp_1024_mont_mul_32(ctx->t4, ctx->t4, q->y, p1024_mod, p1024_mp_mod);
  145638. ctx->state = 9;
  145639. break;
  145640. case 9:
  145641. /* Check double */
  145642. if ((~p->infinity) & (~q->infinity) &
  145643. sp_1024_cmp_equal_32(ctx->t2, ctx->t1) &
  145644. sp_1024_cmp_equal_32(ctx->t4, ctx->t3)) {
  145645. XMEMSET(&ctx->dbl_ctx, 0, sizeof(ctx->dbl_ctx));
  145646. sp_1024_proj_point_dbl_32(r, p, t);
  145647. ctx->state = 25;
  145648. }
  145649. else {
  145650. ctx->state = 10;
  145651. }
  145652. break;
  145653. case 10:
  145654. /* H = U2 - U1 */
  145655. sp_1024_mont_sub_32(ctx->t2, ctx->t2, ctx->t1, p1024_mod);
  145656. ctx->state = 11;
  145657. break;
  145658. case 11:
  145659. /* R = S2 - S1 */
  145660. sp_1024_mont_sub_32(ctx->t4, ctx->t4, ctx->t3, p1024_mod);
  145661. ctx->state = 12;
  145662. break;
  145663. case 12:
  145664. /* X3 = R^2 - H^3 - 2*U1*H^2 */
  145665. sp_1024_mont_sqr_32(ctx->t5, ctx->t2, p1024_mod, p1024_mp_mod);
  145666. ctx->state = 13;
  145667. break;
  145668. case 13:
  145669. sp_1024_mont_mul_32(ctx->y, ctx->t1, ctx->t5, p1024_mod, p1024_mp_mod);
  145670. ctx->state = 14;
  145671. break;
  145672. case 14:
  145673. sp_1024_mont_mul_32(ctx->t5, ctx->t5, ctx->t2, p1024_mod, p1024_mp_mod);
  145674. ctx->state = 15;
  145675. break;
  145676. case 15:
  145677. /* Z3 = H*Z1*Z2 */
  145678. sp_1024_mont_mul_32(ctx->z, p->z, ctx->t2, p1024_mod, p1024_mp_mod);
  145679. ctx->state = 16;
  145680. break;
  145681. case 16:
  145682. sp_1024_mont_mul_32(ctx->z, ctx->z, q->z, p1024_mod, p1024_mp_mod);
  145683. ctx->state = 17;
  145684. break;
  145685. case 17:
  145686. sp_1024_mont_sqr_32(ctx->x, ctx->t4, p1024_mod, p1024_mp_mod);
  145687. ctx->state = 18;
  145688. break;
  145689. case 18:
  145690. sp_1024_mont_sub_32(ctx->x, ctx->x, ctx->t5, p1024_mod);
  145691. ctx->state = 19;
  145692. break;
  145693. case 19:
  145694. sp_1024_mont_mul_32(ctx->t5, ctx->t5, ctx->t3, p1024_mod, p1024_mp_mod);
  145695. ctx->state = 20;
  145696. break;
  145697. case 20:
  145698. sp_1024_mont_dbl_32(ctx->t3, ctx->y, p1024_mod);
  145699. sp_1024_mont_sub_32(ctx->x, ctx->x, ctx->t3, p1024_mod);
  145700. ctx->state = 21;
  145701. break;
  145702. case 21:
  145703. /* Y3 = R*(U1*H^2 - X3) - S1*H^3 */
  145704. sp_1024_mont_sub_32(ctx->y, ctx->y, ctx->x, p1024_mod);
  145705. ctx->state = 22;
  145706. break;
  145707. case 22:
  145708. sp_1024_mont_mul_32(ctx->y, ctx->y, ctx->t4, p1024_mod, p1024_mp_mod);
  145709. ctx->state = 23;
  145710. break;
  145711. case 23:
  145712. sp_1024_mont_sub_32(ctx->y, ctx->y, ctx->t5, p1024_mod);
  145713. ctx->state = 24;
  145714. break;
  145715. case 24:
  145716. {
  145717. {
  145718. int i;
  145719. sp_digit maskp = 0 - (q->infinity & (!p->infinity));
  145720. sp_digit maskq = 0 - (p->infinity & (!q->infinity));
  145721. sp_digit maskt = ~(maskp | maskq);
  145722. sp_digit inf = (sp_digit)(p->infinity & q->infinity);
  145723. for (i = 0; i < 32; i++) {
  145724. r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) |
  145725. (ctx->x[i] & maskt);
  145726. }
  145727. for (i = 0; i < 32; i++) {
  145728. r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) |
  145729. (ctx->y[i] & maskt);
  145730. }
  145731. for (i = 0; i < 32; i++) {
  145732. r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) |
  145733. (ctx->z[i] & maskt);
  145734. }
  145735. r->z[0] |= inf;
  145736. r->infinity = (word32)inf;
  145737. }
  145738. ctx->state = 25;
  145739. break;
  145740. }
  145741. case 25:
  145742. err = MP_OKAY;
  145743. break;
  145744. }
  145745. if (err == MP_OKAY && ctx->state != 25) {
  145746. err = FP_WOULDBLOCK;
  145747. }
  145748. return err;
  145749. }
  145750. #endif /* WOLFSSL_SP_NONBLOCK */
  145751. /* Multiply the point by the scalar and return the result.
  145752. * If map is true then convert result to affine coordinates.
  145753. *
  145754. * Fast implementation that generates a pre-computation table.
  145755. * 4 bits of window (no sliding!).
  145756. * Uses add and double for calculating table.
  145757. * 1024 doubles.
  145758. * 268 adds.
  145759. *
  145760. * r Resulting point.
  145761. * g Point to multiply.
  145762. * k Scalar to multiply by.
  145763. * map Indicates whether to convert result to affine.
  145764. * ct Constant time required.
  145765. * heap Heap to use for allocation.
  145766. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  145767. */
  145768. static int sp_1024_ecc_mulmod_fast_32(sp_point_1024* r, const sp_point_1024* g, const sp_digit* k,
  145769. int map, int ct, void* heap)
  145770. {
  145771. #ifdef WOLFSSL_SP_SMALL_STACK
  145772. sp_point_1024* t = NULL;
  145773. sp_digit* tmp = NULL;
  145774. #else
  145775. sp_point_1024 t[16 + 1];
  145776. sp_digit tmp[2 * 32 * 37];
  145777. #endif
  145778. sp_point_1024* rt = NULL;
  145779. sp_digit n;
  145780. int i;
  145781. int c;
  145782. int y;
  145783. int err = MP_OKAY;
  145784. /* Constant time used for cache attack resistance implementation. */
  145785. (void)ct;
  145786. (void)heap;
  145787. #ifdef WOLFSSL_SP_SMALL_STACK
  145788. t = (sp_point_1024*)XMALLOC(sizeof(sp_point_1024) * (16 + 1),
  145789. heap, DYNAMIC_TYPE_ECC);
  145790. if (t == NULL)
  145791. err = MEMORY_E;
  145792. if (err == MP_OKAY) {
  145793. tmp = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 32 * 37, heap,
  145794. DYNAMIC_TYPE_ECC);
  145795. if (tmp == NULL)
  145796. err = MEMORY_E;
  145797. }
  145798. #endif
  145799. if (err == MP_OKAY) {
  145800. rt = t + 16;
  145801. /* t[0] = {0, 0, 1} * norm */
  145802. XMEMSET(&t[0], 0, sizeof(t[0]));
  145803. t[0].infinity = 1;
  145804. /* t[1] = {g->x, g->y, g->z} * norm */
  145805. (void)sp_1024_mod_mul_norm_32(t[1].x, g->x, p1024_mod);
  145806. (void)sp_1024_mod_mul_norm_32(t[1].y, g->y, p1024_mod);
  145807. (void)sp_1024_mod_mul_norm_32(t[1].z, g->z, p1024_mod);
  145808. t[1].infinity = 0;
  145809. sp_1024_proj_point_dbl_32(&t[ 2], &t[ 1], tmp);
  145810. t[ 2].infinity = 0;
  145811. sp_1024_proj_point_add_32(&t[ 3], &t[ 2], &t[ 1], tmp);
  145812. t[ 3].infinity = 0;
  145813. sp_1024_proj_point_dbl_32(&t[ 4], &t[ 2], tmp);
  145814. t[ 4].infinity = 0;
  145815. sp_1024_proj_point_add_32(&t[ 5], &t[ 3], &t[ 2], tmp);
  145816. t[ 5].infinity = 0;
  145817. sp_1024_proj_point_dbl_32(&t[ 6], &t[ 3], tmp);
  145818. t[ 6].infinity = 0;
  145819. sp_1024_proj_point_add_32(&t[ 7], &t[ 4], &t[ 3], tmp);
  145820. t[ 7].infinity = 0;
  145821. sp_1024_proj_point_dbl_32(&t[ 8], &t[ 4], tmp);
  145822. t[ 8].infinity = 0;
  145823. sp_1024_proj_point_add_32(&t[ 9], &t[ 5], &t[ 4], tmp);
  145824. t[ 9].infinity = 0;
  145825. sp_1024_proj_point_dbl_32(&t[10], &t[ 5], tmp);
  145826. t[10].infinity = 0;
  145827. sp_1024_proj_point_add_32(&t[11], &t[ 6], &t[ 5], tmp);
  145828. t[11].infinity = 0;
  145829. sp_1024_proj_point_dbl_32(&t[12], &t[ 6], tmp);
  145830. t[12].infinity = 0;
  145831. sp_1024_proj_point_add_32(&t[13], &t[ 7], &t[ 6], tmp);
  145832. t[13].infinity = 0;
  145833. sp_1024_proj_point_dbl_32(&t[14], &t[ 7], tmp);
  145834. t[14].infinity = 0;
  145835. sp_1024_proj_point_add_32(&t[15], &t[ 8], &t[ 7], tmp);
  145836. t[15].infinity = 0;
  145837. i = 30;
  145838. n = k[i+1] << 0;
  145839. c = 28;
  145840. y = (int)(n >> 28);
  145841. XMEMCPY(rt, &t[y], sizeof(sp_point_1024));
  145842. n <<= 4;
  145843. for (; i>=0 || c>=4; ) {
  145844. if (c < 4) {
  145845. n |= k[i--];
  145846. c += 32;
  145847. }
  145848. y = (n >> 28) & 0xf;
  145849. n <<= 4;
  145850. c -= 4;
  145851. sp_1024_proj_point_dbl_32(rt, rt, tmp);
  145852. sp_1024_proj_point_dbl_32(rt, rt, tmp);
  145853. sp_1024_proj_point_dbl_32(rt, rt, tmp);
  145854. sp_1024_proj_point_dbl_32(rt, rt, tmp);
  145855. sp_1024_proj_point_add_32(rt, rt, &t[y], tmp);
  145856. }
  145857. if (map != 0) {
  145858. sp_1024_map_32(r, rt, tmp);
  145859. }
  145860. else {
  145861. XMEMCPY(r, rt, sizeof(sp_point_1024));
  145862. }
  145863. }
  145864. #ifdef WOLFSSL_SP_SMALL_STACK
  145865. if (tmp != NULL)
  145866. #endif
  145867. {
  145868. ForceZero(tmp, sizeof(sp_digit) * 2 * 32 * 37);
  145869. #ifdef WOLFSSL_SP_SMALL_STACK
  145870. XFREE(tmp, heap, DYNAMIC_TYPE_ECC);
  145871. #endif
  145872. }
  145873. #ifdef WOLFSSL_SP_SMALL_STACK
  145874. if (t != NULL)
  145875. #endif
  145876. {
  145877. ForceZero(t, sizeof(sp_point_1024) * 17);
  145878. #ifdef WOLFSSL_SP_SMALL_STACK
  145879. XFREE(t, heap, DYNAMIC_TYPE_ECC);
  145880. #endif
  145881. }
  145882. return err;
  145883. }
  145884. #if defined(FP_ECC) || !defined(WOLFSSL_SP_SMALL)
  145885. /* Double the Montgomery form projective point p a number of times.
  145886. *
  145887. * r Result of repeated doubling of point.
  145888. * p Point to double.
  145889. * n Number of times to double
  145890. * t Temporary ordinate data.
  145891. */
  145892. static void sp_1024_proj_point_dbl_n_32(sp_point_1024* p, int i,
  145893. sp_digit* t)
  145894. {
  145895. sp_digit* w = t;
  145896. sp_digit* a = t + 2*32;
  145897. sp_digit* b = t + 4*32;
  145898. sp_digit* t1 = t + 6*32;
  145899. sp_digit* t2 = t + 8*32;
  145900. sp_digit* x;
  145901. sp_digit* y;
  145902. sp_digit* z;
  145903. volatile int n = i;
  145904. x = p->x;
  145905. y = p->y;
  145906. z = p->z;
  145907. /* Y = 2*Y */
  145908. sp_1024_mont_dbl_32(y, y, p1024_mod);
  145909. /* W = Z^4 */
  145910. sp_1024_mont_sqr_32(w, z, p1024_mod, p1024_mp_mod);
  145911. sp_1024_mont_sqr_32(w, w, p1024_mod, p1024_mp_mod);
  145912. #ifndef WOLFSSL_SP_SMALL
  145913. while (--n > 0)
  145914. #else
  145915. while (--n >= 0)
  145916. #endif
  145917. {
  145918. /* A = 3*(X^2 - W) */
  145919. sp_1024_mont_sqr_32(t1, x, p1024_mod, p1024_mp_mod);
  145920. sp_1024_mont_sub_32(t1, t1, w, p1024_mod);
  145921. sp_1024_mont_tpl_32(a, t1, p1024_mod);
  145922. /* B = X*Y^2 */
  145923. sp_1024_mont_sqr_32(t1, y, p1024_mod, p1024_mp_mod);
  145924. sp_1024_mont_mul_32(b, t1, x, p1024_mod, p1024_mp_mod);
  145925. /* X = A^2 - 2B */
  145926. sp_1024_mont_sqr_32(x, a, p1024_mod, p1024_mp_mod);
  145927. sp_1024_mont_dbl_32(t2, b, p1024_mod);
  145928. sp_1024_mont_sub_32(x, x, t2, p1024_mod);
  145929. /* B = 2.(B - X) */
  145930. sp_1024_mont_sub_32(t2, b, x, p1024_mod);
  145931. sp_1024_mont_dbl_32(b, t2, p1024_mod);
  145932. /* Z = Z*Y */
  145933. sp_1024_mont_mul_32(z, z, y, p1024_mod, p1024_mp_mod);
  145934. /* t1 = Y^4 */
  145935. sp_1024_mont_sqr_32(t1, t1, p1024_mod, p1024_mp_mod);
  145936. #ifdef WOLFSSL_SP_SMALL
  145937. if (n != 0)
  145938. #endif
  145939. {
  145940. /* W = W*Y^4 */
  145941. sp_1024_mont_mul_32(w, w, t1, p1024_mod, p1024_mp_mod);
  145942. }
  145943. /* y = 2*A*(B - X) - Y^4 */
  145944. sp_1024_mont_mul_32(y, b, a, p1024_mod, p1024_mp_mod);
  145945. sp_1024_mont_sub_32(y, y, t1, p1024_mod);
  145946. }
  145947. #ifndef WOLFSSL_SP_SMALL
  145948. /* A = 3*(X^2 - W) */
  145949. sp_1024_mont_sqr_32(t1, x, p1024_mod, p1024_mp_mod);
  145950. sp_1024_mont_sub_32(t1, t1, w, p1024_mod);
  145951. sp_1024_mont_tpl_32(a, t1, p1024_mod);
  145952. /* B = X*Y^2 */
  145953. sp_1024_mont_sqr_32(t1, y, p1024_mod, p1024_mp_mod);
  145954. sp_1024_mont_mul_32(b, t1, x, p1024_mod, p1024_mp_mod);
  145955. /* X = A^2 - 2B */
  145956. sp_1024_mont_sqr_32(x, a, p1024_mod, p1024_mp_mod);
  145957. sp_1024_mont_dbl_32(t2, b, p1024_mod);
  145958. sp_1024_mont_sub_32(x, x, t2, p1024_mod);
  145959. /* B = 2.(B - X) */
  145960. sp_1024_mont_sub_32(t2, b, x, p1024_mod);
  145961. sp_1024_mont_dbl_32(b, t2, p1024_mod);
  145962. /* Z = Z*Y */
  145963. sp_1024_mont_mul_32(z, z, y, p1024_mod, p1024_mp_mod);
  145964. /* t1 = Y^4 */
  145965. sp_1024_mont_sqr_32(t1, t1, p1024_mod, p1024_mp_mod);
  145966. /* y = 2*A*(B - X) - Y^4 */
  145967. sp_1024_mont_mul_32(y, b, a, p1024_mod, p1024_mp_mod);
  145968. sp_1024_mont_sub_32(y, y, t1, p1024_mod);
  145969. #endif /* WOLFSSL_SP_SMALL */
  145970. /* Y = Y/2 */
  145971. sp_1024_mont_div2_32(y, y, p1024_mod);
  145972. }
  145973. /* Convert the projective point to affine.
  145974. * Ordinates are in Montgomery form.
  145975. *
  145976. * a Point to convert.
  145977. * t Temporary data.
  145978. */
  145979. static void sp_1024_proj_to_affine_32(sp_point_1024* a, sp_digit* t)
  145980. {
  145981. sp_digit* t1 = t;
  145982. sp_digit* t2 = t + 2 * 32;
  145983. sp_digit* tmp = t + 4 * 32;
  145984. sp_1024_mont_inv_32(t1, a->z, tmp);
  145985. sp_1024_mont_sqr_32(t2, t1, p1024_mod, p1024_mp_mod);
  145986. sp_1024_mont_mul_32(t1, t2, t1, p1024_mod, p1024_mp_mod);
  145987. sp_1024_mont_mul_32(a->x, a->x, t2, p1024_mod, p1024_mp_mod);
  145988. sp_1024_mont_mul_32(a->y, a->y, t1, p1024_mod, p1024_mp_mod);
  145989. XMEMCPY(a->z, p1024_norm_mod, sizeof(p1024_norm_mod));
  145990. }
  145991. #endif /* FP_ECC || !WOLFSSL_SP_SMALL */
  145992. /* A table entry for pre-computed points. */
  145993. typedef struct sp_table_entry_1024 {
  145994. sp_digit x[32];
  145995. sp_digit y[32];
  145996. } sp_table_entry_1024;
  145997. #ifdef FP_ECC
  145998. #endif /* FP_ECC */
  145999. /* Add two Montgomery form projective points. The second point has a q value of
  146000. * one.
  146001. * Only the first point can be the same pointer as the result point.
  146002. *
  146003. * r Result of addition.
  146004. * p First point to add.
  146005. * q Second point to add.
  146006. * t Temporary ordinate data.
  146007. */
  146008. static void sp_1024_proj_point_add_qz1_32(sp_point_1024* r,
  146009. const sp_point_1024* p, const sp_point_1024* q, sp_digit* t)
  146010. {
  146011. sp_digit* t2 = t;
  146012. sp_digit* t3 = t + 2*32;
  146013. sp_digit* t6 = t + 4*32;
  146014. sp_digit* t1 = t + 6*32;
  146015. sp_digit* t4 = t + 8*32;
  146016. sp_digit* t5 = t + 10*32;
  146017. /* Calculate values to subtract from P->x and P->y. */
  146018. /* U2 = X2*Z1^2 */
  146019. sp_1024_mont_sqr_32(t2, p->z, p1024_mod, p1024_mp_mod);
  146020. sp_1024_mont_mul_32(t4, t2, p->z, p1024_mod, p1024_mp_mod);
  146021. sp_1024_mont_mul_32(t2, t2, q->x, p1024_mod, p1024_mp_mod);
  146022. /* S2 = Y2*Z1^3 */
  146023. sp_1024_mont_mul_32(t4, t4, q->y, p1024_mod, p1024_mp_mod);
  146024. if ((~p->infinity) & (~q->infinity) &
  146025. sp_1024_cmp_equal_32(p->x, t2) &
  146026. sp_1024_cmp_equal_32(p->y, t4)) {
  146027. sp_1024_proj_point_dbl_32(r, p, t);
  146028. }
  146029. else {
  146030. sp_digit* x = t2;
  146031. sp_digit* y = t3;
  146032. sp_digit* z = t6;
  146033. /* H = U2 - X1 */
  146034. sp_1024_mont_sub_32(t2, t2, p->x, p1024_mod);
  146035. /* R = S2 - Y1 */
  146036. sp_1024_mont_sub_32(t4, t4, p->y, p1024_mod);
  146037. /* Z3 = H*Z1 */
  146038. sp_1024_mont_mul_32(z, p->z, t2, p1024_mod, p1024_mp_mod);
  146039. /* X3 = R^2 - H^3 - 2*X1*H^2 */
  146040. sp_1024_mont_sqr_32(t1, t2, p1024_mod, p1024_mp_mod);
  146041. sp_1024_mont_mul_32(t3, p->x, t1, p1024_mod, p1024_mp_mod);
  146042. sp_1024_mont_mul_32(t1, t1, t2, p1024_mod, p1024_mp_mod);
  146043. sp_1024_mont_sqr_32(t2, t4, p1024_mod, p1024_mp_mod);
  146044. sp_1024_mont_sub_32(t2, t2, t1, p1024_mod);
  146045. sp_1024_mont_dbl_32(t5, t3, p1024_mod);
  146046. sp_1024_mont_sub_32(x, t2, t5, p1024_mod);
  146047. /* Y3 = R*(X1*H^2 - X3) - Y1*H^3 */
  146048. sp_1024_mont_sub_32(t3, t3, x, p1024_mod);
  146049. sp_1024_mont_mul_32(t3, t3, t4, p1024_mod, p1024_mp_mod);
  146050. sp_1024_mont_mul_32(t1, t1, p->y, p1024_mod, p1024_mp_mod);
  146051. sp_1024_mont_sub_32(y, t3, t1, p1024_mod);
  146052. {
  146053. int i;
  146054. sp_digit maskp = 0 - (q->infinity & (!p->infinity));
  146055. sp_digit maskq = 0 - (p->infinity & (!q->infinity));
  146056. sp_digit maskt = ~(maskp | maskq);
  146057. sp_digit inf = (sp_digit)(p->infinity & q->infinity);
  146058. for (i = 0; i < 32; i++) {
  146059. r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) |
  146060. (x[i] & maskt);
  146061. }
  146062. for (i = 0; i < 32; i++) {
  146063. r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) |
  146064. (y[i] & maskt);
  146065. }
  146066. for (i = 0; i < 32; i++) {
  146067. r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) |
  146068. (z[i] & maskt);
  146069. }
  146070. r->z[0] |= inf;
  146071. r->infinity = (word32)inf;
  146072. }
  146073. }
  146074. }
  146075. #ifdef WOLFSSL_SP_SMALL
  146076. #if defined(FP_ECC) || !defined(WOLFSSL_SP_SMALL)
  146077. /* Generate the pre-computed table of points for the base point.
  146078. *
  146079. * width = 4
  146080. * 16 entries
  146081. * 256 bits between
  146082. *
  146083. * a The base point.
  146084. * table Place to store generated point data.
  146085. * tmp Temporary data.
  146086. * heap Heap to use for allocation.
  146087. */
  146088. static int sp_1024_gen_stripe_table_32(const sp_point_1024* a,
  146089. sp_table_entry_1024* table, sp_digit* tmp, void* heap)
  146090. {
  146091. #ifdef WOLFSSL_SP_SMALL_STACK
  146092. sp_point_1024* t = NULL;
  146093. #else
  146094. sp_point_1024 t[3];
  146095. #endif
  146096. sp_point_1024* s1 = NULL;
  146097. sp_point_1024* s2 = NULL;
  146098. int i;
  146099. int j;
  146100. int err = MP_OKAY;
  146101. (void)heap;
  146102. #ifdef WOLFSSL_SP_SMALL_STACK
  146103. t = (sp_point_1024*)XMALLOC(sizeof(sp_point_1024) * 3, heap,
  146104. DYNAMIC_TYPE_ECC);
  146105. if (t == NULL)
  146106. err = MEMORY_E;
  146107. #endif
  146108. if (err == MP_OKAY) {
  146109. s1 = t + 1;
  146110. s2 = t + 2;
  146111. err = sp_1024_mod_mul_norm_32(t->x, a->x, p1024_mod);
  146112. }
  146113. if (err == MP_OKAY) {
  146114. err = sp_1024_mod_mul_norm_32(t->y, a->y, p1024_mod);
  146115. }
  146116. if (err == MP_OKAY) {
  146117. err = sp_1024_mod_mul_norm_32(t->z, a->z, p1024_mod);
  146118. }
  146119. if (err == MP_OKAY) {
  146120. t->infinity = 0;
  146121. sp_1024_proj_to_affine_32(t, tmp);
  146122. XMEMCPY(s1->z, p1024_norm_mod, sizeof(p1024_norm_mod));
  146123. s1->infinity = 0;
  146124. XMEMCPY(s2->z, p1024_norm_mod, sizeof(p1024_norm_mod));
  146125. s2->infinity = 0;
  146126. /* table[0] = {0, 0, infinity} */
  146127. XMEMSET(&table[0], 0, sizeof(sp_table_entry_1024));
  146128. /* table[1] = Affine version of 'a' in Montgomery form */
  146129. XMEMCPY(table[1].x, t->x, sizeof(table->x));
  146130. XMEMCPY(table[1].y, t->y, sizeof(table->y));
  146131. for (i=1; i<4; i++) {
  146132. sp_1024_proj_point_dbl_n_32(t, 256, tmp);
  146133. sp_1024_proj_to_affine_32(t, tmp);
  146134. XMEMCPY(table[1<<i].x, t->x, sizeof(table->x));
  146135. XMEMCPY(table[1<<i].y, t->y, sizeof(table->y));
  146136. }
  146137. for (i=1; i<4; i++) {
  146138. XMEMCPY(s1->x, table[1<<i].x, sizeof(table->x));
  146139. XMEMCPY(s1->y, table[1<<i].y, sizeof(table->y));
  146140. for (j=(1<<i)+1; j<(1<<(i+1)); j++) {
  146141. XMEMCPY(s2->x, table[j-(1<<i)].x, sizeof(table->x));
  146142. XMEMCPY(s2->y, table[j-(1<<i)].y, sizeof(table->y));
  146143. sp_1024_proj_point_add_qz1_32(t, s1, s2, tmp);
  146144. sp_1024_proj_to_affine_32(t, tmp);
  146145. XMEMCPY(table[j].x, t->x, sizeof(table->x));
  146146. XMEMCPY(table[j].y, t->y, sizeof(table->y));
  146147. }
  146148. }
  146149. }
  146150. #ifdef WOLFSSL_SP_SMALL_STACK
  146151. if (t != NULL)
  146152. XFREE(t, heap, DYNAMIC_TYPE_ECC);
  146153. #endif
  146154. return err;
  146155. }
  146156. #endif /* FP_ECC || !WOLFSSL_SP_SMALL */
  146157. /* Multiply the point by the scalar and return the result.
  146158. * If map is true then convert result to affine coordinates.
  146159. *
  146160. * Stripe implementation.
  146161. * Pre-generated: 2^0, 2^256, ...
  146162. * Pre-generated: products of all combinations of above.
  146163. * 4 doubles and adds (with qz=1)
  146164. *
  146165. * r Resulting point.
  146166. * k Scalar to multiply by.
  146167. * table Pre-computed table.
  146168. * map Indicates whether to convert result to affine.
  146169. * ct Constant time required.
  146170. * heap Heap to use for allocation.
  146171. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  146172. */
  146173. static int sp_1024_ecc_mulmod_stripe_32(sp_point_1024* r, const sp_point_1024* g,
  146174. const sp_table_entry_1024* table, const sp_digit* k, int map,
  146175. int ct, void* heap)
  146176. {
  146177. #ifdef WOLFSSL_SP_SMALL_STACK
  146178. sp_point_1024* rt = NULL;
  146179. sp_digit* t = NULL;
  146180. #else
  146181. sp_point_1024 rt[2];
  146182. sp_digit t[2 * 32 * 37];
  146183. #endif
  146184. sp_point_1024* p = NULL;
  146185. int i;
  146186. int j;
  146187. int y;
  146188. int x;
  146189. int err = MP_OKAY;
  146190. (void)g;
  146191. /* Constant time used for cache attack resistance implementation. */
  146192. (void)ct;
  146193. (void)heap;
  146194. #ifdef WOLFSSL_SP_SMALL_STACK
  146195. rt = (sp_point_1024*)XMALLOC(sizeof(sp_point_1024) * 2, heap,
  146196. DYNAMIC_TYPE_ECC);
  146197. if (rt == NULL)
  146198. err = MEMORY_E;
  146199. if (err == MP_OKAY) {
  146200. t = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 32 * 37, heap,
  146201. DYNAMIC_TYPE_ECC);
  146202. if (t == NULL)
  146203. err = MEMORY_E;
  146204. }
  146205. #endif
  146206. if (err == MP_OKAY) {
  146207. p = rt + 1;
  146208. XMEMCPY(p->z, p1024_norm_mod, sizeof(p1024_norm_mod));
  146209. XMEMCPY(rt->z, p1024_norm_mod, sizeof(p1024_norm_mod));
  146210. y = 0;
  146211. x = 255;
  146212. for (j=0; j<4; j++) {
  146213. y |= (int)(((k[x / 32] >> (x % 32)) & 1) << j);
  146214. x += 256;
  146215. }
  146216. XMEMCPY(rt->x, table[y].x, sizeof(table[y].x));
  146217. XMEMCPY(rt->y, table[y].y, sizeof(table[y].y));
  146218. rt->infinity = !y;
  146219. for (i=254; i>=0; i--) {
  146220. y = 0;
  146221. x = i;
  146222. for (j=0; j<4; j++) {
  146223. y |= (int)(((k[x / 32] >> (x % 32)) & 1) << j);
  146224. x += 256;
  146225. }
  146226. sp_1024_proj_point_dbl_32(rt, rt, t);
  146227. XMEMCPY(p->x, table[y].x, sizeof(table[y].x));
  146228. XMEMCPY(p->y, table[y].y, sizeof(table[y].y));
  146229. p->infinity = !y;
  146230. sp_1024_proj_point_add_qz1_32(rt, rt, p, t);
  146231. }
  146232. if (map != 0) {
  146233. sp_1024_map_32(r, rt, t);
  146234. }
  146235. else {
  146236. XMEMCPY(r, rt, sizeof(sp_point_1024));
  146237. }
  146238. }
  146239. #ifdef WOLFSSL_SP_SMALL_STACK
  146240. if (t != NULL)
  146241. XFREE(t, heap, DYNAMIC_TYPE_ECC);
  146242. if (rt != NULL)
  146243. XFREE(rt, heap, DYNAMIC_TYPE_ECC);
  146244. #endif
  146245. return err;
  146246. }
  146247. #ifdef FP_ECC
  146248. #ifndef FP_ENTRIES
  146249. #define FP_ENTRIES 16
  146250. #endif
  146251. /* Cache entry - holds precomputation tables for a point. */
  146252. typedef struct sp_cache_1024_t {
  146253. /* X ordinate of point that table was generated from. */
  146254. sp_digit x[32];
  146255. /* Y ordinate of point that table was generated from. */
  146256. sp_digit y[32];
  146257. /* Precomputation table for point. */
  146258. sp_table_entry_1024 table[16];
  146259. /* Count of entries in table. */
  146260. uint32_t cnt;
  146261. /* Point and table set in entry. */
  146262. int set;
  146263. } sp_cache_1024_t;
  146264. /* Cache of tables. */
  146265. static THREAD_LS_T sp_cache_1024_t sp_cache_1024[FP_ENTRIES];
  146266. /* Index of last entry in cache. */
  146267. static THREAD_LS_T int sp_cache_1024_last = -1;
  146268. /* Cache has been initialized. */
  146269. static THREAD_LS_T int sp_cache_1024_inited = 0;
  146270. #ifndef HAVE_THREAD_LS
  146271. static volatile int initCacheMutex_1024 = 0;
  146272. static wolfSSL_Mutex sp_cache_1024_lock;
  146273. #endif
  146274. /* Get the cache entry for the point.
  146275. *
  146276. * g [in] Point scalar multiplying.
  146277. * cache [out] Cache table to use.
  146278. */
  146279. static void sp_ecc_get_cache_1024(const sp_point_1024* g, sp_cache_1024_t** cache)
  146280. {
  146281. int i;
  146282. int j;
  146283. uint32_t least;
  146284. if (sp_cache_1024_inited == 0) {
  146285. for (i=0; i<FP_ENTRIES; i++) {
  146286. sp_cache_1024[i].set = 0;
  146287. }
  146288. sp_cache_1024_inited = 1;
  146289. }
  146290. /* Compare point with those in cache. */
  146291. for (i=0; i<FP_ENTRIES; i++) {
  146292. if (!sp_cache_1024[i].set)
  146293. continue;
  146294. if (sp_1024_cmp_equal_32(g->x, sp_cache_1024[i].x) &
  146295. sp_1024_cmp_equal_32(g->y, sp_cache_1024[i].y)) {
  146296. sp_cache_1024[i].cnt++;
  146297. break;
  146298. }
  146299. }
  146300. /* No match. */
  146301. if (i == FP_ENTRIES) {
  146302. /* Find empty entry. */
  146303. i = (sp_cache_1024_last + 1) % FP_ENTRIES;
  146304. for (; i != sp_cache_1024_last; i=(i+1)%FP_ENTRIES) {
  146305. if (!sp_cache_1024[i].set) {
  146306. break;
  146307. }
  146308. }
  146309. /* Evict least used. */
  146310. if (i == sp_cache_1024_last) {
  146311. least = sp_cache_1024[0].cnt;
  146312. for (j=1; j<FP_ENTRIES; j++) {
  146313. if (sp_cache_1024[j].cnt < least) {
  146314. i = j;
  146315. least = sp_cache_1024[i].cnt;
  146316. }
  146317. }
  146318. }
  146319. XMEMCPY(sp_cache_1024[i].x, g->x, sizeof(sp_cache_1024[i].x));
  146320. XMEMCPY(sp_cache_1024[i].y, g->y, sizeof(sp_cache_1024[i].y));
  146321. sp_cache_1024[i].set = 1;
  146322. sp_cache_1024[i].cnt = 1;
  146323. }
  146324. *cache = &sp_cache_1024[i];
  146325. sp_cache_1024_last = i;
  146326. }
  146327. #endif /* FP_ECC */
  146328. /* Multiply the base point of P1024 by the scalar and return the result.
  146329. * If map is true then convert result to affine coordinates.
  146330. *
  146331. * r Resulting point.
  146332. * g Point to multiply.
  146333. * k Scalar to multiply by.
  146334. * map Indicates whether to convert result to affine.
  146335. * ct Constant time required.
  146336. * heap Heap to use for allocation.
  146337. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  146338. */
  146339. static int sp_1024_ecc_mulmod_32(sp_point_1024* r, const sp_point_1024* g,
  146340. const sp_digit* k, int map, int ct, void* heap)
  146341. {
  146342. #ifndef FP_ECC
  146343. return sp_1024_ecc_mulmod_fast_32(r, g, k, map, ct, heap);
  146344. #else
  146345. #ifdef WOLFSSL_SP_SMALL_STACK
  146346. sp_digit* tmp;
  146347. #else
  146348. sp_digit tmp[2 * 32 * 38];
  146349. #endif
  146350. sp_cache_1024_t* cache;
  146351. int err = MP_OKAY;
  146352. #ifdef WOLFSSL_SP_SMALL_STACK
  146353. tmp = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 32 * 38, heap, DYNAMIC_TYPE_ECC);
  146354. if (tmp == NULL) {
  146355. err = MEMORY_E;
  146356. }
  146357. #endif
  146358. #ifndef HAVE_THREAD_LS
  146359. if (err == MP_OKAY) {
  146360. if (initCacheMutex_1024 == 0) {
  146361. wc_InitMutex(&sp_cache_1024_lock);
  146362. initCacheMutex_1024 = 1;
  146363. }
  146364. if (wc_LockMutex(&sp_cache_1024_lock) != 0) {
  146365. err = BAD_MUTEX_E;
  146366. }
  146367. }
  146368. #endif /* HAVE_THREAD_LS */
  146369. if (err == MP_OKAY) {
  146370. sp_ecc_get_cache_1024(g, &cache);
  146371. if (cache->cnt == 2)
  146372. sp_1024_gen_stripe_table_32(g, cache->table, tmp, heap);
  146373. #ifndef HAVE_THREAD_LS
  146374. wc_UnLockMutex(&sp_cache_1024_lock);
  146375. #endif /* HAVE_THREAD_LS */
  146376. if (cache->cnt < 2) {
  146377. err = sp_1024_ecc_mulmod_fast_32(r, g, k, map, ct, heap);
  146378. }
  146379. else {
  146380. err = sp_1024_ecc_mulmod_stripe_32(r, g, cache->table, k,
  146381. map, ct, heap);
  146382. }
  146383. }
  146384. #ifdef WOLFSSL_SP_SMALL_STACK
  146385. XFREE(tmp, heap, DYNAMIC_TYPE_ECC);
  146386. #endif
  146387. return err;
  146388. #endif
  146389. }
  146390. #else
  146391. #if defined(FP_ECC) || !defined(WOLFSSL_SP_SMALL)
  146392. /* Generate the pre-computed table of points for the base point.
  146393. *
  146394. * width = 8
  146395. * 256 entries
  146396. * 128 bits between
  146397. *
  146398. * a The base point.
  146399. * table Place to store generated point data.
  146400. * tmp Temporary data.
  146401. * heap Heap to use for allocation.
  146402. */
  146403. static int sp_1024_gen_stripe_table_32(const sp_point_1024* a,
  146404. sp_table_entry_1024* table, sp_digit* tmp, void* heap)
  146405. {
  146406. #ifdef WOLFSSL_SP_SMALL_STACK
  146407. sp_point_1024* t = NULL;
  146408. #else
  146409. sp_point_1024 t[3];
  146410. #endif
  146411. sp_point_1024* s1 = NULL;
  146412. sp_point_1024* s2 = NULL;
  146413. int i;
  146414. int j;
  146415. int err = MP_OKAY;
  146416. (void)heap;
  146417. #ifdef WOLFSSL_SP_SMALL_STACK
  146418. t = (sp_point_1024*)XMALLOC(sizeof(sp_point_1024) * 3, heap,
  146419. DYNAMIC_TYPE_ECC);
  146420. if (t == NULL)
  146421. err = MEMORY_E;
  146422. #endif
  146423. if (err == MP_OKAY) {
  146424. s1 = t + 1;
  146425. s2 = t + 2;
  146426. err = sp_1024_mod_mul_norm_32(t->x, a->x, p1024_mod);
  146427. }
  146428. if (err == MP_OKAY) {
  146429. err = sp_1024_mod_mul_norm_32(t->y, a->y, p1024_mod);
  146430. }
  146431. if (err == MP_OKAY) {
  146432. err = sp_1024_mod_mul_norm_32(t->z, a->z, p1024_mod);
  146433. }
  146434. if (err == MP_OKAY) {
  146435. t->infinity = 0;
  146436. sp_1024_proj_to_affine_32(t, tmp);
  146437. XMEMCPY(s1->z, p1024_norm_mod, sizeof(p1024_norm_mod));
  146438. s1->infinity = 0;
  146439. XMEMCPY(s2->z, p1024_norm_mod, sizeof(p1024_norm_mod));
  146440. s2->infinity = 0;
  146441. /* table[0] = {0, 0, infinity} */
  146442. XMEMSET(&table[0], 0, sizeof(sp_table_entry_1024));
  146443. /* table[1] = Affine version of 'a' in Montgomery form */
  146444. XMEMCPY(table[1].x, t->x, sizeof(table->x));
  146445. XMEMCPY(table[1].y, t->y, sizeof(table->y));
  146446. for (i=1; i<8; i++) {
  146447. sp_1024_proj_point_dbl_n_32(t, 128, tmp);
  146448. sp_1024_proj_to_affine_32(t, tmp);
  146449. XMEMCPY(table[1<<i].x, t->x, sizeof(table->x));
  146450. XMEMCPY(table[1<<i].y, t->y, sizeof(table->y));
  146451. }
  146452. for (i=1; i<8; i++) {
  146453. XMEMCPY(s1->x, table[1<<i].x, sizeof(table->x));
  146454. XMEMCPY(s1->y, table[1<<i].y, sizeof(table->y));
  146455. for (j=(1<<i)+1; j<(1<<(i+1)); j++) {
  146456. XMEMCPY(s2->x, table[j-(1<<i)].x, sizeof(table->x));
  146457. XMEMCPY(s2->y, table[j-(1<<i)].y, sizeof(table->y));
  146458. sp_1024_proj_point_add_qz1_32(t, s1, s2, tmp);
  146459. sp_1024_proj_to_affine_32(t, tmp);
  146460. XMEMCPY(table[j].x, t->x, sizeof(table->x));
  146461. XMEMCPY(table[j].y, t->y, sizeof(table->y));
  146462. }
  146463. }
  146464. }
  146465. #ifdef WOLFSSL_SP_SMALL_STACK
  146466. if (t != NULL)
  146467. XFREE(t, heap, DYNAMIC_TYPE_ECC);
  146468. #endif
  146469. return err;
  146470. }
  146471. #endif /* FP_ECC || !WOLFSSL_SP_SMALL */
  146472. /* Multiply the point by the scalar and return the result.
  146473. * If map is true then convert result to affine coordinates.
  146474. *
  146475. * Stripe implementation.
  146476. * Pre-generated: 2^0, 2^128, ...
  146477. * Pre-generated: products of all combinations of above.
  146478. * 8 doubles and adds (with qz=1)
  146479. *
  146480. * r Resulting point.
  146481. * k Scalar to multiply by.
  146482. * table Pre-computed table.
  146483. * map Indicates whether to convert result to affine.
  146484. * ct Constant time required.
  146485. * heap Heap to use for allocation.
  146486. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  146487. */
  146488. static int sp_1024_ecc_mulmod_stripe_32(sp_point_1024* r, const sp_point_1024* g,
  146489. const sp_table_entry_1024* table, const sp_digit* k, int map,
  146490. int ct, void* heap)
  146491. {
  146492. #ifdef WOLFSSL_SP_SMALL_STACK
  146493. sp_point_1024* rt = NULL;
  146494. sp_digit* t = NULL;
  146495. #else
  146496. sp_point_1024 rt[2];
  146497. sp_digit t[2 * 32 * 37];
  146498. #endif
  146499. sp_point_1024* p = NULL;
  146500. int i;
  146501. int j;
  146502. int y;
  146503. int x;
  146504. int err = MP_OKAY;
  146505. (void)g;
  146506. /* Constant time used for cache attack resistance implementation. */
  146507. (void)ct;
  146508. (void)heap;
  146509. #ifdef WOLFSSL_SP_SMALL_STACK
  146510. rt = (sp_point_1024*)XMALLOC(sizeof(sp_point_1024) * 2, heap,
  146511. DYNAMIC_TYPE_ECC);
  146512. if (rt == NULL)
  146513. err = MEMORY_E;
  146514. if (err == MP_OKAY) {
  146515. t = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 32 * 37, heap,
  146516. DYNAMIC_TYPE_ECC);
  146517. if (t == NULL)
  146518. err = MEMORY_E;
  146519. }
  146520. #endif
  146521. if (err == MP_OKAY) {
  146522. p = rt + 1;
  146523. XMEMCPY(p->z, p1024_norm_mod, sizeof(p1024_norm_mod));
  146524. XMEMCPY(rt->z, p1024_norm_mod, sizeof(p1024_norm_mod));
  146525. y = 0;
  146526. x = 127;
  146527. for (j=0; j<8; j++) {
  146528. y |= (int)(((k[x / 32] >> (x % 32)) & 1) << j);
  146529. x += 128;
  146530. }
  146531. XMEMCPY(rt->x, table[y].x, sizeof(table[y].x));
  146532. XMEMCPY(rt->y, table[y].y, sizeof(table[y].y));
  146533. rt->infinity = !y;
  146534. for (i=126; i>=0; i--) {
  146535. y = 0;
  146536. x = i;
  146537. for (j=0; j<8; j++) {
  146538. y |= (int)(((k[x / 32] >> (x % 32)) & 1) << j);
  146539. x += 128;
  146540. }
  146541. sp_1024_proj_point_dbl_32(rt, rt, t);
  146542. XMEMCPY(p->x, table[y].x, sizeof(table[y].x));
  146543. XMEMCPY(p->y, table[y].y, sizeof(table[y].y));
  146544. p->infinity = !y;
  146545. sp_1024_proj_point_add_qz1_32(rt, rt, p, t);
  146546. }
  146547. if (map != 0) {
  146548. sp_1024_map_32(r, rt, t);
  146549. }
  146550. else {
  146551. XMEMCPY(r, rt, sizeof(sp_point_1024));
  146552. }
  146553. }
  146554. #ifdef WOLFSSL_SP_SMALL_STACK
  146555. if (t != NULL)
  146556. XFREE(t, heap, DYNAMIC_TYPE_ECC);
  146557. if (rt != NULL)
  146558. XFREE(rt, heap, DYNAMIC_TYPE_ECC);
  146559. #endif
  146560. return err;
  146561. }
  146562. #ifdef FP_ECC
  146563. #ifndef FP_ENTRIES
  146564. #define FP_ENTRIES 16
  146565. #endif
  146566. /* Cache entry - holds precomputation tables for a point. */
  146567. typedef struct sp_cache_1024_t {
  146568. /* X ordinate of point that table was generated from. */
  146569. sp_digit x[32];
  146570. /* Y ordinate of point that table was generated from. */
  146571. sp_digit y[32];
  146572. /* Precomputation table for point. */
  146573. sp_table_entry_1024 table[256];
  146574. /* Count of entries in table. */
  146575. uint32_t cnt;
  146576. /* Point and table set in entry. */
  146577. int set;
  146578. } sp_cache_1024_t;
  146579. /* Cache of tables. */
  146580. static THREAD_LS_T sp_cache_1024_t sp_cache_1024[FP_ENTRIES];
  146581. /* Index of last entry in cache. */
  146582. static THREAD_LS_T int sp_cache_1024_last = -1;
  146583. /* Cache has been initialized. */
  146584. static THREAD_LS_T int sp_cache_1024_inited = 0;
  146585. #ifndef HAVE_THREAD_LS
  146586. static volatile int initCacheMutex_1024 = 0;
  146587. static wolfSSL_Mutex sp_cache_1024_lock;
  146588. #endif
  146589. /* Get the cache entry for the point.
  146590. *
  146591. * g [in] Point scalar multiplying.
  146592. * cache [out] Cache table to use.
  146593. */
  146594. static void sp_ecc_get_cache_1024(const sp_point_1024* g, sp_cache_1024_t** cache)
  146595. {
  146596. int i;
  146597. int j;
  146598. uint32_t least;
  146599. if (sp_cache_1024_inited == 0) {
  146600. for (i=0; i<FP_ENTRIES; i++) {
  146601. sp_cache_1024[i].set = 0;
  146602. }
  146603. sp_cache_1024_inited = 1;
  146604. }
  146605. /* Compare point with those in cache. */
  146606. for (i=0; i<FP_ENTRIES; i++) {
  146607. if (!sp_cache_1024[i].set)
  146608. continue;
  146609. if (sp_1024_cmp_equal_32(g->x, sp_cache_1024[i].x) &
  146610. sp_1024_cmp_equal_32(g->y, sp_cache_1024[i].y)) {
  146611. sp_cache_1024[i].cnt++;
  146612. break;
  146613. }
  146614. }
  146615. /* No match. */
  146616. if (i == FP_ENTRIES) {
  146617. /* Find empty entry. */
  146618. i = (sp_cache_1024_last + 1) % FP_ENTRIES;
  146619. for (; i != sp_cache_1024_last; i=(i+1)%FP_ENTRIES) {
  146620. if (!sp_cache_1024[i].set) {
  146621. break;
  146622. }
  146623. }
  146624. /* Evict least used. */
  146625. if (i == sp_cache_1024_last) {
  146626. least = sp_cache_1024[0].cnt;
  146627. for (j=1; j<FP_ENTRIES; j++) {
  146628. if (sp_cache_1024[j].cnt < least) {
  146629. i = j;
  146630. least = sp_cache_1024[i].cnt;
  146631. }
  146632. }
  146633. }
  146634. XMEMCPY(sp_cache_1024[i].x, g->x, sizeof(sp_cache_1024[i].x));
  146635. XMEMCPY(sp_cache_1024[i].y, g->y, sizeof(sp_cache_1024[i].y));
  146636. sp_cache_1024[i].set = 1;
  146637. sp_cache_1024[i].cnt = 1;
  146638. }
  146639. *cache = &sp_cache_1024[i];
  146640. sp_cache_1024_last = i;
  146641. }
  146642. #endif /* FP_ECC */
  146643. /* Multiply the base point of P1024 by the scalar and return the result.
  146644. * If map is true then convert result to affine coordinates.
  146645. *
  146646. * r Resulting point.
  146647. * g Point to multiply.
  146648. * k Scalar to multiply by.
  146649. * map Indicates whether to convert result to affine.
  146650. * ct Constant time required.
  146651. * heap Heap to use for allocation.
  146652. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  146653. */
  146654. static int sp_1024_ecc_mulmod_32(sp_point_1024* r, const sp_point_1024* g,
  146655. const sp_digit* k, int map, int ct, void* heap)
  146656. {
  146657. #ifndef FP_ECC
  146658. return sp_1024_ecc_mulmod_fast_32(r, g, k, map, ct, heap);
  146659. #else
  146660. #ifdef WOLFSSL_SP_SMALL_STACK
  146661. sp_digit* tmp;
  146662. #else
  146663. sp_digit tmp[2 * 32 * 38];
  146664. #endif
  146665. sp_cache_1024_t* cache;
  146666. int err = MP_OKAY;
  146667. #ifdef WOLFSSL_SP_SMALL_STACK
  146668. tmp = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 32 * 38, heap, DYNAMIC_TYPE_ECC);
  146669. if (tmp == NULL) {
  146670. err = MEMORY_E;
  146671. }
  146672. #endif
  146673. #ifndef HAVE_THREAD_LS
  146674. if (err == MP_OKAY) {
  146675. if (initCacheMutex_1024 == 0) {
  146676. wc_InitMutex(&sp_cache_1024_lock);
  146677. initCacheMutex_1024 = 1;
  146678. }
  146679. if (wc_LockMutex(&sp_cache_1024_lock) != 0) {
  146680. err = BAD_MUTEX_E;
  146681. }
  146682. }
  146683. #endif /* HAVE_THREAD_LS */
  146684. if (err == MP_OKAY) {
  146685. sp_ecc_get_cache_1024(g, &cache);
  146686. if (cache->cnt == 2)
  146687. sp_1024_gen_stripe_table_32(g, cache->table, tmp, heap);
  146688. #ifndef HAVE_THREAD_LS
  146689. wc_UnLockMutex(&sp_cache_1024_lock);
  146690. #endif /* HAVE_THREAD_LS */
  146691. if (cache->cnt < 2) {
  146692. err = sp_1024_ecc_mulmod_fast_32(r, g, k, map, ct, heap);
  146693. }
  146694. else {
  146695. err = sp_1024_ecc_mulmod_stripe_32(r, g, cache->table, k,
  146696. map, ct, heap);
  146697. }
  146698. }
  146699. #ifdef WOLFSSL_SP_SMALL_STACK
  146700. XFREE(tmp, heap, DYNAMIC_TYPE_ECC);
  146701. #endif
  146702. return err;
  146703. #endif
  146704. }
  146705. #endif /* WOLFSSL_SP_SMALL */
  146706. /* Multiply the point by the scalar and return the result.
  146707. * If map is true then convert result to affine coordinates.
  146708. *
  146709. * km Scalar to multiply by.
  146710. * p Point to multiply.
  146711. * r Resulting point.
  146712. * map Indicates whether to convert result to affine.
  146713. * heap Heap to use for allocation.
  146714. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  146715. */
  146716. int sp_ecc_mulmod_1024(const mp_int* km, const ecc_point* gm, ecc_point* r,
  146717. int map, void* heap)
  146718. {
  146719. #ifdef WOLFSSL_SP_SMALL_STACK
  146720. sp_point_1024* point = NULL;
  146721. sp_digit* k = NULL;
  146722. #else
  146723. sp_point_1024 point[1];
  146724. sp_digit k[32];
  146725. #endif
  146726. int err = MP_OKAY;
  146727. #ifdef WOLFSSL_SP_SMALL_STACK
  146728. point = (sp_point_1024*)XMALLOC(sizeof(sp_point_1024), heap,
  146729. DYNAMIC_TYPE_ECC);
  146730. if (point == NULL)
  146731. err = MEMORY_E;
  146732. if (err == MP_OKAY) {
  146733. k = (sp_digit*)XMALLOC(sizeof(sp_digit) * 32, heap,
  146734. DYNAMIC_TYPE_ECC);
  146735. if (k == NULL)
  146736. err = MEMORY_E;
  146737. }
  146738. #endif
  146739. if (err == MP_OKAY) {
  146740. sp_1024_from_mp(k, 32, km);
  146741. sp_1024_point_from_ecc_point_32(point, gm);
  146742. err = sp_1024_ecc_mulmod_32(point, point, k, map, 1, heap);
  146743. }
  146744. if (err == MP_OKAY) {
  146745. err = sp_1024_point_to_ecc_point_32(point, r);
  146746. }
  146747. #ifdef WOLFSSL_SP_SMALL_STACK
  146748. if (k != NULL)
  146749. XFREE(k, heap, DYNAMIC_TYPE_ECC);
  146750. if (point != NULL)
  146751. XFREE(point, heap, DYNAMIC_TYPE_ECC);
  146752. #endif
  146753. return err;
  146754. }
  146755. #ifdef WOLFSSL_SP_SMALL
  146756. /* Striping precomputation table.
  146757. * 4 points combined into a table of 16 points.
  146758. * Distance of 256 between points.
  146759. */
  146760. static const sp_table_entry_1024 p1024_table[16] = {
  146761. /* 0 */
  146762. { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  146763. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  146764. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
  146765. { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  146766. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  146767. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },
  146768. /* 1 */
  146769. { { 0xe0162bc2,0xbf9c7ec6,0x10a89289,0xddecc6e3,0x9e499d81,0x5d599df0,
  146770. 0x6d358218,0x9a96ea28,0x70c5f8db,0x01aec7d3,0x8cf5d066,0xe72e4995,
  146771. 0x3e91d7f8,0xc2e7297d,0xda9f2f5a,0x8621db92,0x5a5679ed,0x4b26c867,
  146772. 0x2c56aac1,0x233385df,0xc6a13f99,0xb88e74d4,0xffa8ec11,0x1214b173,
  146773. 0x1f3f9fef,0xa0386a27,0xc0e7b44e,0xbd9b1b4e,0xeecd3496,0xafe528dc,
  146774. 0x1c49f80b,0x8dfff96a },
  146775. { 0xc03c0c83,0xb4a4753a,0xabcdcd75,0x68e69d18,0xf775b649,0xe3839b88,
  146776. 0xbf58f352,0x803f949a,0xbd0bc15c,0x5f702679,0x8ff298c2,0x85bf5d16,
  146777. 0xc6c7976e,0x3f6ebd98,0x45e3e1b4,0x20618af4,0x54e64093,0x67d5598e,
  146778. 0x504fed9e,0xb047283b,0x70d87517,0x450cabfd,0x3f5addbe,0x47d628bf,
  146779. 0x78cb4cca,0x0037ef30,0x6b1c4908,0x4e148d3c,0x4fcfd837,0xe256d329,
  146780. 0xde3c01f3,0x2aa1207b } },
  146781. /* 2 */
  146782. { { 0x755c2a27,0xcf3e0bb2,0x59585c44,0xd38e42f9,0x19285e60,0x46b13e0f,
  146783. 0x76273d0f,0xc3ecd0c0,0x193c569a,0x7800f085,0x4351818a,0xf04e74ab,
  146784. 0x8496363b,0x9258aa38,0xb8c894fe,0x8456617c,0x2af969a0,0x8bc62aaa,
  146785. 0x5a4668d9,0x66c2280b,0xa992f4fa,0xbc9df58e,0x3f401e99,0x5db0b7d9,
  146786. 0xc4c38c0e,0xe0614fe1,0x2ccdf6b3,0xd531151c,0xe143b618,0x1c7575ec,
  146787. 0xdf9398a4,0x40247985 },
  146788. { 0x8f055746,0xfba25178,0x0ab1e6e0,0xc5ba0040,0xac292697,0xe1b194fb,
  146789. 0x5b4f4740,0x77152119,0x9bb7ba54,0x250091d0,0xb9a139a4,0x7a674861,
  146790. 0xf353aa7e,0xba8413b3,0x2443ceee,0xafe77192,0x3847bbd0,0x14468d36,
  146791. 0x3da4942d,0x61f79ff6,0xd425b456,0x1563a1c1,0x75ff4630,0x3c270fcd,
  146792. 0xeb2802c9,0x42072090,0xc85c7004,0x68f0cdcb,0xfa032e74,0xca4372fb,
  146793. 0xc8b79d80,0x1a6fd1e6 } },
  146794. /* 3 */
  146795. { { 0x8d5116a3,0x967a901a,0xb2f5f47f,0x0b844394,0x60ebaf3b,0xe39ad452,
  146796. 0x60ccfc0c,0x1e1be617,0xcc3f53f2,0xac07e3d2,0x1ed11bb6,0xdd838e0e,
  146797. 0x1c15b0c2,0x45475307,0x920fe5b8,0x70dd4748,0xe471896d,0x1a20be2d,
  146798. 0x59276c7c,0x3c3fad8a,0xc886ee07,0x026a1cc3,0x6e831ac4,0x9fdb6f37,
  146799. 0xac501d65,0x26a35d1a,0x40da8574,0x0ae98905,0xabd734e5,0x65dde0a4,
  146800. 0x15614750,0x29b7d4dc },
  146801. { 0xcbf4e20b,0x44b3c2cb,0x58cc44c5,0x1c3f548f,0x5b0cac1f,0x39809b54,
  146802. 0x00f80621,0x0c0f02b5,0x066905e0,0xe612b890,0x8350188c,0x8f158ed7,
  146803. 0x3f5576b2,0xc01dc458,0xa45492e0,0x29803272,0x0ff92443,0x77a5623a,
  146804. 0x29d0dc41,0xd12a2b00,0x2780e87a,0xb4125459,0x0d53f272,0x1ebcf903,
  146805. 0x24301e8d,0xbae6ea40,0xa37d0798,0x1e5f3f2f,0x22b4126c,0x9342c310,
  146806. 0x5382497e,0x5d092802 } },
  146807. /* 4 */
  146808. { { 0x4b59213a,0xf5b495d0,0x8d70200e,0xca672039,0x2b6771c1,0x4bcb09a6,
  146809. 0x2b9eb0cb,0x26adeed4,0x8cdba212,0xeb544754,0xf08890d1,0x0e1abfcd,
  146810. 0x698e46b4,0x52509963,0x82e9c138,0xe1bff0b0,0x51099a71,0xa189e4cd,
  146811. 0xc9b91cc7,0x2360c9bc,0x137ec4be,0x9bd4d7dc,0xd1519f6e,0xd0356521,
  146812. 0xcf832503,0xbf5f6d78,0x8deea2b4,0xe4301031,0xef4c319c,0xc3132494,
  146813. 0x0f1fa7d7,0x2ab3bd47 },
  146814. { 0x922c9fbb,0x5753b680,0x0f16c6d1,0x869e7dc8,0xbac16efc,0x83445135,
  146815. 0x846d1d9b,0x4326a3b4,0xb2d62c21,0xb517fee3,0x0b292ad5,0x6905afa2,
  146816. 0x2cadac13,0x2a57131a,0xebdbca8d,0xcd904d8f,0x3f365fb2,0xdfeda86f,
  146817. 0xdc7eaa1c,0x7097b208,0xa45e77c0,0x89a35a84,0xcf5d118e,0x417a062c,
  146818. 0x1f6e99e8,0x3c0c04a8,0xba7a087d,0xc44704b0,0x3ea22ad2,0x6f8a27d1,
  146819. 0x4c27d229,0x93a4b416 } },
  146820. /* 5 */
  146821. { { 0x1f1efb7a,0xd4271bc1,0x33fccc0d,0xae4e68e6,0xb11f50a8,0x9d9bc8f1,
  146822. 0xaf076089,0x5430398f,0x443d0e03,0x45e242fb,0xf6e3d4c1,0x73ec2519,
  146823. 0xba9bad09,0xab70f790,0xf9add10f,0xde612ad5,0x14e942b4,0xb837e54e,
  146824. 0xddb8b68a,0x175a56d3,0x1ac2a408,0xe85b233c,0xf0c80f94,0xf8ff6c30,
  146825. 0x898db4f9,0x4b7f3fb7,0x45a7dcdd,0xa2c6044f,0xfe3d3895,0xf3abb2f6,
  146826. 0x32ee7763,0x342ce0d7 },
  146827. { 0xcf491b1f,0xeb261394,0x1909e395,0xdcaaeed7,0x9fe4dbea,0xdcc4055a,
  146828. 0x493d604d,0x17a6611d,0x1ce5ebef,0xba445a3a,0xe3989cb5,0xe82e2858,
  146829. 0x83f58406,0xb96f4282,0xa156cf55,0x99877b99,0x4e166a0e,0xaf906a66,
  146830. 0xb2976d13,0xcea1d353,0x36c61a01,0xefc16f27,0xb0f55d86,0xdb04c433,
  146831. 0x8eb34c01,0x3cb4b269,0x2ae60280,0x38d07f78,0x43be3ec5,0x43ac3bcb,
  146832. 0xe156fd20,0x455f4af3 } },
  146833. /* 6 */
  146834. { { 0x95532833,0x2e6fe0a6,0xd626d067,0xabca228e,0x649e73bd,0x22aef3d9,
  146835. 0xf03c4c0c,0x2083a87a,0x35169b45,0xe954e75d,0x74506a89,0x577509ee,
  146836. 0x2aeacf90,0x49cb276e,0xfa409f91,0x08275d77,0xf0bbd6b9,0x61eb6f3d,
  146837. 0xe4132704,0x948202cb,0xb1c498b1,0x35f3fc21,0x361fee59,0x76c68ba8,
  146838. 0x50e051f3,0xa18cbbd9,0x318e7042,0x2384a879,0x80dd1e8b,0x292abead,
  146839. 0x5c37c334,0x65713c29 },
  146840. { 0xceb77b9a,0xdccca8e9,0x23b69469,0x2f97e727,0xa01d6b28,0xc76abee6,
  146841. 0x5abecdfe,0x3925203d,0x29290d70,0x89448082,0xb0314438,0xf9931424,
  146842. 0x7cd447c3,0x04209df1,0xc855c827,0x7c6f2059,0x56c0e069,0xd97d7862,
  146843. 0x412d94c4,0x5a9db6fe,0x994c41dd,0x19a64591,0xc89e21a3,0x12348aa1,
  146844. 0xc6a03f0e,0xd6904b50,0xa616feac,0x55c15156,0x7cc7693b,0x4e36d1b5,
  146845. 0x3bae3c38,0x6b0e996c } },
  146846. /* 7 */
  146847. { { 0xcceced00,0x32789fab,0xe5b7aa66,0x3237e71a,0x2ddebcdf,0x87b2e269,
  146848. 0xb61dad8f,0xb7245120,0xd35f803c,0xe11e5e48,0x98e50f0d,0xfb4df5d7,
  146849. 0xbcd2ab92,0x60ee68b4,0x1ce3363d,0x98ab2f5c,0x7cd42647,0x15ba39da,
  146850. 0x83f4fb3f,0x1a6572eb,0xe56f08db,0x0f77de88,0x172562c2,0x1743761e,
  146851. 0x8a58f0f4,0xbe349ff8,0x84d1d6e2,0xe04da71b,0x9e9ff3b4,0x368f0342,
  146852. 0x678223f8,0x4022a205 },
  146853. { 0x83847375,0x527bbd05,0x3f451af0,0x3ae56b62,0x4b2c7f18,0x6198f24d,
  146854. 0x4525b98d,0xee323f5b,0x0e0884b5,0xa9d8d39a,0xfb12c776,0xd005d7f6,
  146855. 0x708bc154,0xd71c483e,0x742541bc,0x8ca6fd28,0xf8397ddb,0x0af3dccd,
  146856. 0x3eccf243,0xb80d3125,0x58d81b8d,0xc743a108,0x71391f68,0x3f48eb21,
  146857. 0x33bb657f,0x493aff88,0x07e47e31,0x1d15ed66,0xe08279f6,0x10159b11,
  146858. 0x24a6a956,0x312179cb } },
  146859. /* 8 */
  146860. { { 0xfb99cfe6,0x950323d3,0xc9334178,0x7b09bc26,0x7cbdfb6f,0x64111e41,
  146861. 0x89a75760,0x91141744,0x10919cb0,0x4c633df9,0x396bfd2f,0x715fc7c7,
  146862. 0x8cab62db,0x8ca19512,0x4db81aac,0x30672473,0xb4c4c54a,0xe67a246b,
  146863. 0xbf229646,0xd77ea0fa,0xfa5b5d70,0x5bed15f1,0xc2f192f3,0xa5686da5,
  146864. 0x7f6690ad,0xdecac72a,0xcaa50b7d,0x0c4af2a2,0x6049ad2f,0xf44631c1,
  146865. 0x04ecf056,0x325d2796 },
  146866. { 0x4848c144,0xee11fb55,0xb6a7af32,0x4e062925,0x369e0f9a,0x125b68e1,
  146867. 0xca53b21e,0xad9bdae6,0x2e98ea1b,0xf50d605c,0x9f2fa395,0xbdb9e153,
  146868. 0xe91532f5,0x4570e32d,0x46a250d7,0x810698ae,0xad9d9145,0x7fd9546c,
  146869. 0x11e97a5e,0xabf67721,0x249f82e9,0xca29f7d5,0x9851df63,0xa9c539a9,
  146870. 0x71d0e3e5,0xfd84d54b,0x041d2b56,0xd1e0459c,0xfd80096a,0xceb3eb6e,
  146871. 0xe32a79d3,0x19d48546 } },
  146872. /* 9 */
  146873. { { 0xb540f5e5,0xfe19ee8f,0x04e68d17,0x86d2a52f,0xadbdc871,0xd2320db0,
  146874. 0xd03a7fc8,0xa83ad5a8,0x08bcb916,0x54bf83c7,0x2e51e840,0x092133ea,
  146875. 0xcb52dddf,0xbce38424,0x31063583,0xd5c7be40,0x458e3176,0xc1ebb9df,
  146876. 0xbc4dabbf,0xafb19639,0xc05725a8,0x36350fe4,0x84e1cd24,0xac4a0634,
  146877. 0xc145b8de,0xadf73154,0xb3483237,0x0aa6dd9e,0xcbff2720,0xa3345c3d,
  146878. 0xb4e453b0,0x1b3ace6c },
  146879. { 0x90a8bdc5,0x0343e5e9,0x6306a089,0xa203bf9d,0x8e48520e,0x98489a35,
  146880. 0xde7d1d06,0xbd17debe,0x5f795d3f,0x8fafa6d7,0x387b0a3f,0xa4ceb630,
  146881. 0xffddeafa,0xe0166b32,0x7e764e02,0xa2fe2054,0xe871f304,0x55ab9824,
  146882. 0x952ec45e,0xa2bd36bb,0xa90d20ca,0x7b4c1484,0x75bcfb53,0x5319f387,
  146883. 0x6982c4e5,0x34238a4a,0xa102921d,0xa2bb61c7,0xdb3ab17e,0x1e061b64,
  146884. 0x192f0a14,0x538ec33e } },
  146885. /* 10 */
  146886. { { 0x576374c2,0xe53c7785,0x84727040,0xe60526d1,0x228ca044,0x8a066dc8,
  146887. 0xf1ce1313,0x1fe1c1b2,0xcdeb0c5d,0x2aeec832,0x9cbf826f,0xa7596699,
  146888. 0xde77a589,0xcd188e81,0x118d1254,0xe5ce0fe0,0x0790b86a,0xa142a984,
  146889. 0x39ac28ce,0xe28f043f,0x87de5804,0x4eef8290,0xf639a8c5,0x83c31b32,
  146890. 0x5887794f,0xd70454a7,0x18b1b391,0xca635d50,0x31d9c795,0xcefea076,
  146891. 0xb6f8aa25,0x13cbee76 },
  146892. { 0x8d3f34f3,0x79cabe0f,0xa3617fe3,0xbda9c31c,0xdd9426a1,0xb26dee23,
  146893. 0xf29c9104,0xe9dd9627,0xe2c6cd3b,0x033eb169,0xfcba2196,0x8a73f492,
  146894. 0xb858c83c,0x92e37e0b,0x23b3fbb7,0xe4f2aca6,0x64be00a2,0x8101fb1e,
  146895. 0x948f6448,0x91a7826a,0x907260e7,0x414067b4,0xe30bb835,0xf774aa50,
  146896. 0xc999c06e,0xf922ca80,0x0ba08511,0x6b8635b9,0x25fa04f0,0xbf936b5c,
  146897. 0xe02e8967,0x4e0a1ada } },
  146898. /* 11 */
  146899. { { 0x8ba29c4d,0x00ca6670,0x22988094,0xc08240ce,0x16dda752,0x21c5ca67,
  146900. 0xabbbfa34,0x689c0e45,0x3ed28b72,0x1d7545fd,0xd7c56ab4,0x5f221198,
  146901. 0x38759d65,0x4b3d8f74,0x8fe50b89,0x93490dfb,0xe80eba16,0xb641f5d7,
  146902. 0x79acb537,0x7b0da5eb,0x0c1d5e5e,0xab6b1497,0xa5da429a,0x2338e68d,
  146903. 0x2f6d2f25,0xe010c437,0x6530f3a7,0x226f16d2,0xcbef08bc,0xefb0f7b6,
  146904. 0x9f99c999,0x733e30d9 },
  146905. { 0xa42a38f9,0xecfe1582,0x4730b500,0xaec2d58e,0xde976b2c,0x2ee2f2a7,
  146906. 0xa969c1bb,0xf0539db5,0xfcecdb4a,0x31954168,0xe7a8e902,0xf2f7348a,
  146907. 0x3121541f,0x1d58d7cc,0x2202ae52,0x5d25b75c,0xf40835a7,0xdea9965a,
  146908. 0x529b4e46,0x3feb6a41,0xbd27ad9b,0x5c97fb6f,0x261f900b,0xd87554c0,
  146909. 0x04d5b19e,0xb43031d9,0xcb219b9c,0x33d5e9b8,0x3ee00bcf,0x7a43d492,
  146910. 0xb79a5c0c,0x56facb39 } },
  146911. /* 12 */
  146912. { { 0x7c834915,0x667eaed6,0xbc5eb64d,0x9f77aa6a,0x25d62011,0x729ebcb6,
  146913. 0x699fd9c2,0x0aee24f2,0x2b8d4f6c,0xe1eb5874,0x14c976d6,0x7f12710c,
  146914. 0xf6d9ea65,0x91390335,0x06b50064,0x668b7049,0x0876ee4f,0x65969a0e,
  146915. 0x2f9d9360,0xf901bf3f,0xb499e3ce,0xfb1a8651,0xf2dbcaaa,0x80b953fb,
  146916. 0x973b06b6,0x312cc566,0x3af36c64,0x3534d9c3,0x10ffd815,0xe4463a52,
  146917. 0xf18c2b91,0x57ea2b4b },
  146918. { 0x8aa0f2f2,0x00f5e162,0x0e46bcaa,0x8c7e75c5,0xa4a2c42d,0x97ab479a,
  146919. 0x14baa202,0xb4f308ea,0x6943cc2e,0xa901bd14,0xeed58804,0xbb125fee,
  146920. 0x9d180f7c,0x6502c8f9,0x1580c61c,0xe5353919,0x27101ee3,0x7e278069,
  146921. 0xfaa72717,0x7a0a40a1,0x4c75b153,0x32edce02,0x538f1c22,0xda23660b,
  146922. 0xbe307d2e,0x4d511e98,0x9baee0b4,0x24276e40,0x7ff1f307,0xa78c3927,
  146923. 0xea7935c9,0x60480b46 } },
  146924. /* 13 */
  146925. { { 0x3872ece3,0x31087d66,0x955b70f8,0x5f29be7d,0x9cf95bb8,0xb50b4fc7,
  146926. 0xdbffa621,0xbae3b58d,0xe022ba5d,0x0e61d280,0x4181449c,0x78ae5117,
  146927. 0xcf555485,0x0b132840,0xb8ce0b0e,0x800ed1b6,0x78d5de3d,0x35dffdd5,
  146928. 0x69a56b47,0xf7e42374,0x8d910ae7,0xd5e32369,0x6313c7c7,0xb6ff52a0,
  146929. 0xa92de9e5,0x5a2fe20d,0xd12110bb,0x41b347d3,0x40c16f23,0xc5905edb,
  146930. 0x9a8f88cc,0x0774a0d3 },
  146931. { 0xe3b6c106,0x3ae181ab,0x8de150b7,0x4ebe163f,0x6f354836,0xcf75b82f,
  146932. 0x3ac7ac16,0xaa0d2063,0x291722af,0x5c680668,0x11545553,0x73941e61,
  146933. 0xbf5de3f7,0x17127e38,0x1afb41da,0x32cfdf03,0x87bc8663,0xc6893c91,
  146934. 0xa62c9c99,0x75046744,0x962c1947,0x96866e2d,0x378cdf4c,0x489ec8df,
  146935. 0x3407fa32,0x3a60709b,0x551290d1,0xd37d2159,0xbab92273,0x9623d303,
  146936. 0x2432014b,0x08151954 } },
  146937. /* 14 */
  146938. { { 0xb05f2b26,0x569044f3,0x80b9f76c,0xb35a294a,0x4290f6ae,0x8839fe28,
  146939. 0x026a5877,0x761cfb23,0x2e5ff9c3,0x768926b6,0x0b11c576,0xbae6cd20,
  146940. 0x72a03efe,0xdc857756,0xe1bad63a,0x0cae074a,0xd709d99c,0x3fe491a1,
  146941. 0x6501d9c1,0x76c5ded6,0xc32aeff7,0x1da6eca1,0xc57683e8,0x50849d55,
  146942. 0xdf98d847,0x9e392e9c,0x64d9a564,0xfad7982f,0xa37b98b2,0xf7c3bdb7,
  146943. 0xf0860497,0x1fe09f94 },
  146944. { 0x7648cc63,0x49a7eaae,0x67cfa714,0x13ea2511,0x653f4559,0xfc8b923c,
  146945. 0x81a16e86,0xd957619b,0x3c864674,0x0c7e804b,0x1616599a,0xfc88134a,
  146946. 0x0a652328,0x366ea969,0x4bc9029e,0x41532960,0xae2aad2b,0xef9e1994,
  146947. 0x7f10bef5,0x9e2a8c52,0xc67bf860,0x73dcb586,0x844cc25d,0xf61a43fa,
  146948. 0x74eb3653,0xd74e7eea,0xdd240f02,0xf3356706,0xfd83bcb4,0xeec7694c,
  146949. 0xdb62526a,0x4de95786 } },
  146950. /* 15 */
  146951. { { 0x3deac2f7,0x4867d315,0xb61d9a8e,0xa084778a,0x0ab7b2d5,0xf3b76f96,
  146952. 0xcfdf4f79,0x00b30056,0x31ab8f4b,0xd0701e15,0x9c779d01,0x07f948d5,
  146953. 0x82675371,0x7c994ebc,0x48bad4c0,0x1104d4ee,0xbfc9d058,0x798ce0b5,
  146954. 0x309fa80b,0xc7ca898d,0xacb33eaf,0x0244f225,0x5b2f3175,0xd51e8dfc,
  146955. 0xa4d7be34,0x3e49ba6b,0xbda02b43,0x1760f4c7,0x4435275a,0x37e36a7e,
  146956. 0xe636980c,0x1c94418b },
  146957. { 0x09dc1414,0x43a21313,0x43c93537,0x060765fc,0xdf5f79ce,0x6ff3207a,
  146958. 0x85d4cfca,0x6f18b1fa,0x63e995ab,0xf5c4272e,0xa82b3002,0x121a09e4,
  146959. 0x97147f16,0x82b65d1b,0x20a7fe26,0x4993c20c,0xe6716726,0x99c9cb98,
  146960. 0xfeb440a0,0x5a02d673,0x251b4bc5,0x3f3fa9e1,0xa05338ea,0x75dbc474,
  146961. 0x7b09f6cb,0x3cb4044b,0x80434609,0x6767da18,0x098ceac2,0x97851422,
  146962. 0xb55235ba,0x611bfbb2 } },
  146963. };
  146964. /* Multiply the base point of P1024 by the scalar and return the result.
  146965. * If map is true then convert result to affine coordinates.
  146966. *
  146967. * Stripe implementation.
  146968. * Pre-generated: 2^0, 2^256, ...
  146969. * Pre-generated: products of all combinations of above.
  146970. * 4 doubles and adds (with qz=1)
  146971. *
  146972. * r Resulting point.
  146973. * k Scalar to multiply by.
  146974. * map Indicates whether to convert result to affine.
  146975. * ct Constant time required.
  146976. * heap Heap to use for allocation.
  146977. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  146978. */
  146979. static int sp_1024_ecc_mulmod_base_32(sp_point_1024* r, const sp_digit* k,
  146980. int map, int ct, void* heap)
  146981. {
  146982. return sp_1024_ecc_mulmod_stripe_32(r, &p1024_base, p1024_table,
  146983. k, map, ct, heap);
  146984. }
  146985. #else
  146986. /* Striping precomputation table.
  146987. * 8 points combined into a table of 256 points.
  146988. * Distance of 128 between points.
  146989. */
  146990. static const sp_table_entry_1024 p1024_table[256] = {
  146991. /* 0 */
  146992. { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  146993. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  146994. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
  146995. { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  146996. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  146997. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },
  146998. /* 1 */
  146999. { { 0xe0162bc2,0xbf9c7ec6,0x10a89289,0xddecc6e3,0x9e499d81,0x5d599df0,
  147000. 0x6d358218,0x9a96ea28,0x70c5f8db,0x01aec7d3,0x8cf5d066,0xe72e4995,
  147001. 0x3e91d7f8,0xc2e7297d,0xda9f2f5a,0x8621db92,0x5a5679ed,0x4b26c867,
  147002. 0x2c56aac1,0x233385df,0xc6a13f99,0xb88e74d4,0xffa8ec11,0x1214b173,
  147003. 0x1f3f9fef,0xa0386a27,0xc0e7b44e,0xbd9b1b4e,0xeecd3496,0xafe528dc,
  147004. 0x1c49f80b,0x8dfff96a },
  147005. { 0xc03c0c83,0xb4a4753a,0xabcdcd75,0x68e69d18,0xf775b649,0xe3839b88,
  147006. 0xbf58f352,0x803f949a,0xbd0bc15c,0x5f702679,0x8ff298c2,0x85bf5d16,
  147007. 0xc6c7976e,0x3f6ebd98,0x45e3e1b4,0x20618af4,0x54e64093,0x67d5598e,
  147008. 0x504fed9e,0xb047283b,0x70d87517,0x450cabfd,0x3f5addbe,0x47d628bf,
  147009. 0x78cb4cca,0x0037ef30,0x6b1c4908,0x4e148d3c,0x4fcfd837,0xe256d329,
  147010. 0xde3c01f3,0x2aa1207b } },
  147011. /* 2 */
  147012. { { 0x01900955,0xa95b6dae,0xceb4656d,0xa5dc9cc1,0xe72fe95b,0x50c78907,
  147013. 0xa040c334,0xa1ae5447,0x7952ea6e,0x91191370,0x6d097305,0x54ff7343,
  147014. 0xbda4d10f,0xa4db0074,0x91644070,0xfd5306f1,0x8b24522c,0x14b9fe73,
  147015. 0x7849f762,0x1468dad6,0xb0dcd2e4,0x87b29a18,0x5e1ad492,0xadd7f1a1,
  147016. 0xdbba2a1a,0x9ac63a81,0x81223379,0x01379c5b,0xb0e53bc8,0xf402b2f0,
  147017. 0x0bf13b61,0x8c3eb27f },
  147018. { 0xe513696f,0x9a4ad3e1,0x18c81ffa,0x0350ba5c,0x3c033d13,0x1e2fc136,
  147019. 0x17a531bc,0x53da6e71,0x1aed610d,0x42ec6490,0xe99ff567,0xd33e8df7,
  147020. 0x3deed12a,0xe4aad73e,0x180f4deb,0xd983b465,0x502f30b4,0x99365269,
  147021. 0xa8918d7f,0x7e2799ab,0x700fc79a,0x0ffe84b6,0x40bfd8c2,0x7b4400d6,
  147022. 0x5d2641bd,0xc3a21d21,0xc32621cb,0x79839442,0xb1401e83,0xace6500b,
  147023. 0x251c4310,0x7bf4163e } },
  147024. /* 3 */
  147025. { { 0xe3fd589e,0x1c174f88,0xdf974a03,0xdb501790,0x3e70549f,0xd09623e3,
  147026. 0x15924f34,0x8d091eff,0xf9b65ac5,0xeef79cad,0x3f69c2cf,0xd2cc4262,
  147027. 0x52cd82bc,0x817d9032,0xa5f1dddd,0xacf4f4d9,0x5011b6bd,0xd0612635,
  147028. 0x2ed140c9,0x9f74490d,0x4db686d2,0x64092e8c,0x776b0fcc,0x225eef16,
  147029. 0xdf16aeb6,0x0e8c01e9,0x84bbd82a,0x62836741,0x8956e337,0x757574e2,
  147030. 0x705a7f07,0x9871edc6 },
  147031. { 0x776535f7,0xbd0b76d5,0x2635b3b8,0x5214d602,0x9d216f64,0xc0c25ad9,
  147032. 0x5515bf75,0xfd4df3a7,0x5e9f1675,0x24a625bc,0x406873e7,0x3c35efb7,
  147033. 0xbb2e5c4a,0xef5c9a33,0x806b198a,0xa971b35e,0xa3c690ed,0x9f5c0ca5,
  147034. 0x8e1e2341,0xa8d5dd89,0x955ad9e4,0x4cecbcce,0x248d3416,0x2ecf4407,
  147035. 0x45c0af6e,0x1abb3811,0x1c780fff,0x3f4bee82,0xc272ed57,0xd14df768,
  147036. 0x371637ad,0x397ed10a } },
  147037. /* 4 */
  147038. { { 0x755c2a27,0xcf3e0bb2,0x59585c44,0xd38e42f9,0x19285e60,0x46b13e0f,
  147039. 0x76273d0f,0xc3ecd0c0,0x193c569a,0x7800f085,0x4351818a,0xf04e74ab,
  147040. 0x8496363b,0x9258aa38,0xb8c894fe,0x8456617c,0x2af969a0,0x8bc62aaa,
  147041. 0x5a4668d9,0x66c2280b,0xa992f4fa,0xbc9df58e,0x3f401e99,0x5db0b7d9,
  147042. 0xc4c38c0e,0xe0614fe1,0x2ccdf6b3,0xd531151c,0xe143b618,0x1c7575ec,
  147043. 0xdf9398a4,0x40247985 },
  147044. { 0x8f055746,0xfba25178,0x0ab1e6e0,0xc5ba0040,0xac292697,0xe1b194fb,
  147045. 0x5b4f4740,0x77152119,0x9bb7ba54,0x250091d0,0xb9a139a4,0x7a674861,
  147046. 0xf353aa7e,0xba8413b3,0x2443ceee,0xafe77192,0x3847bbd0,0x14468d36,
  147047. 0x3da4942d,0x61f79ff6,0xd425b456,0x1563a1c1,0x75ff4630,0x3c270fcd,
  147048. 0xeb2802c9,0x42072090,0xc85c7004,0x68f0cdcb,0xfa032e74,0xca4372fb,
  147049. 0xc8b79d80,0x1a6fd1e6 } },
  147050. /* 5 */
  147051. { { 0x8d5116a3,0x967a901a,0xb2f5f47f,0x0b844394,0x60ebaf3b,0xe39ad452,
  147052. 0x60ccfc0c,0x1e1be617,0xcc3f53f2,0xac07e3d2,0x1ed11bb6,0xdd838e0e,
  147053. 0x1c15b0c2,0x45475307,0x920fe5b8,0x70dd4748,0xe471896d,0x1a20be2d,
  147054. 0x59276c7c,0x3c3fad8a,0xc886ee07,0x026a1cc3,0x6e831ac4,0x9fdb6f37,
  147055. 0xac501d65,0x26a35d1a,0x40da8574,0x0ae98905,0xabd734e5,0x65dde0a4,
  147056. 0x15614750,0x29b7d4dc },
  147057. { 0xcbf4e20b,0x44b3c2cb,0x58cc44c5,0x1c3f548f,0x5b0cac1f,0x39809b54,
  147058. 0x00f80621,0x0c0f02b5,0x066905e0,0xe612b890,0x8350188c,0x8f158ed7,
  147059. 0x3f5576b2,0xc01dc458,0xa45492e0,0x29803272,0x0ff92443,0x77a5623a,
  147060. 0x29d0dc41,0xd12a2b00,0x2780e87a,0xb4125459,0x0d53f272,0x1ebcf903,
  147061. 0x24301e8d,0xbae6ea40,0xa37d0798,0x1e5f3f2f,0x22b4126c,0x9342c310,
  147062. 0x5382497e,0x5d092802 } },
  147063. /* 6 */
  147064. { { 0xff2f780d,0x583a2b7e,0xd7d76b1d,0x34d26820,0x86f74aec,0xe3c32847,
  147065. 0x10823feb,0x0fd42212,0xfb5e7bf4,0x227e417e,0xa568f8cd,0x510d49b6,
  147066. 0x1781bbec,0x53bce7d6,0x2f3718b7,0x9cfe3f22,0xd9de6c1f,0x7f44e89f,
  147067. 0x3fac9b55,0xf1cc553f,0xe6f300bc,0x9d2d0846,0x9f0ae6b1,0x976c82a2,
  147068. 0x24b8bbe0,0xe63dbf5e,0x973a5aa7,0x4cac7f45,0x84dd33c7,0xc6eb6237,
  147069. 0x142fee5d,0x0a26e434 },
  147070. { 0xacaa9a08,0x8081339f,0x5246ece1,0x40f31105,0x61393747,0x892c8170,
  147071. 0x242f02e1,0x8d8d4103,0x3b5de98a,0x482bfd20,0x5abbe952,0x89ef946b,
  147072. 0x37698249,0xb8d218b9,0x66617c7a,0xd5268e89,0x8b7d2b91,0x962e7551,
  147073. 0xfe8d67c3,0x2c5c7973,0x2b017c51,0x42e3150a,0xc1a29469,0x6f4e5ebc,
  147074. 0x531c7083,0xa39910ce,0xb77b9e50,0xaf4f6eb4,0xda120ad0,0x68cbb175,
  147075. 0xb92636ec,0x19497c61 } },
  147076. /* 7 */
  147077. { { 0x417659a8,0x6920b0c6,0x92cb28ff,0xc77ab9c7,0xb687797f,0x55b67180,
  147078. 0xe7759363,0x4caf58c1,0x5561b186,0x5155bdb6,0x780f4946,0x2e64e355,
  147079. 0x229a8b20,0xeb0ac9b7,0x2571bd60,0x88594d78,0xe3fa78f9,0x5dcc0939,
  147080. 0x2ac2d379,0x7b8b4830,0xb90f1444,0x505fbf60,0x3ce4b3c1,0xac610e81,
  147081. 0xd59b5c18,0x39a4f27a,0x7cea0222,0x5fa33973,0x8dff1c7b,0xe578730b,
  147082. 0x517bf7a6,0x96b91b8b },
  147083. { 0x9aac087c,0xc1a991f4,0x6cfdb28d,0xce62f74e,0x5f7600d6,0x08d6ff9a,
  147084. 0xf917f9c9,0xd781cd04,0x3de52dbf,0x7796f5f6,0x2ed72180,0xe7db64e0,
  147085. 0x6fa4137d,0x0f0876f6,0x3ca1f716,0x3271ee64,0x7c4ab8a3,0xcb9b2058,
  147086. 0x39481047,0xcba17107,0x598c5c37,0xdf9a190d,0x6f20e125,0x0cb6e72a,
  147087. 0xf4f2902d,0xa3142204,0x7ce2dcfb,0x42d28cb9,0xa3d3c351,0xdf261b8a,
  147088. 0xcffc249d,0x73f3d315 } },
  147089. /* 8 */
  147090. { { 0xe6fd3673,0x5d86855b,0x9d214b7b,0x309b70af,0xdcc46cd3,0x8d332f90,
  147091. 0x595510de,0xe553c015,0x38c1251c,0x5746a096,0x85cc1bc9,0xcd7cea5b,
  147092. 0x002eba8f,0x4ffa1468,0x22fcd77c,0x10a3cb70,0xc4ea05e3,0xb6999dfb,
  147093. 0x4efa756e,0x3375a0d0,0xdced5fd8,0x4d90279e,0x251fd56e,0x48192403,
  147094. 0x82a4c5f1,0xe87633a4,0x1b34105b,0x3170d130,0x7247e578,0x93998b0f,
  147095. 0x436ba1fa,0x88934f64 },
  147096. { 0x4713eabc,0xf09f43b0,0xaccdc517,0x4ca7dd91,0xef13ca7c,0x27daa63b,
  147097. 0x2588184b,0x8b2e5a7a,0xd95dc269,0x0a8cb612,0xe1f2f14c,0x346975a2,
  147098. 0xe172935c,0x1f29b8ed,0xd40bc1e3,0xc3cbfd6e,0x132623da,0xd3f46b3f,
  147099. 0xfb0b7681,0xc115be6d,0x56da4344,0x5e31c345,0xa8e43d98,0xa7c63f18,
  147100. 0x4bddb4ea,0x55cb2083,0x4a54f58c,0xb16a0c38,0x46fd69d9,0x74eacca2,
  147101. 0x153548e1,0x0d1898bb } },
  147102. /* 9 */
  147103. { { 0xe35ef043,0x4ea73461,0x3496b564,0x107b67d9,0xd0f83a3c,0xd62c173b,
  147104. 0x51d29c35,0xfad4b038,0x71b1c1a4,0x3f42882a,0x54b43b9e,0x5d2bcf66,
  147105. 0x2abdf543,0xc77b15aa,0xdabe3dc1,0x5cb38a80,0xa481673b,0x15fda0ae,
  147106. 0xe7b90ebe,0x86996b4d,0x2bc8f3d8,0x84f87e25,0x37c4e424,0xaded03d6,
  147107. 0xd7a7afd8,0xe5ede666,0xa1ccb93a,0x80dd95a2,0x46fba391,0xa55cfd25,
  147108. 0x46f82e60,0x2bdab1dc },
  147109. { 0xfa6fed61,0x7a4de22b,0xcc8dd94e,0xca458aa5,0x071222f5,0x3e372df1,
  147110. 0xe5aff377,0x06a4b44f,0x4a738e6d,0xbc2d0ba7,0x5f31f136,0x1a470e1d,
  147111. 0xe102a911,0x77ff933a,0x310c7885,0x8b380a50,0x783fc5ac,0x9f3c0228,
  147112. 0x44725d06,0xec668925,0x5ac84221,0x878f0e16,0xcfda6e8a,0x9a3af1af,
  147113. 0x78cd2aba,0x0183ed37,0x826d0eae,0x32cdbd60,0xcbee6415,0xb3234661,
  147114. 0xb9c10120,0x353eb892 } },
  147115. /* 10 */
  147116. { { 0x10b5521e,0xc8fdcad6,0x52e702f0,0x1a11b440,0x8ffda49c,0x6302680d,
  147117. 0xcbf36bad,0xcdb9654a,0x4c10a2d7,0x7b58ce11,0xe630e7e0,0x1e5d1f7d,
  147118. 0x6760a813,0x8cbe3d7d,0x6480d77f,0xeb35866b,0x7f036219,0x58728cf3,
  147119. 0x42a8a757,0xdd5865ed,0x906a2870,0x283f1f1d,0xa51f906b,0x79e23fa4,
  147120. 0x543b20a8,0xf2ac6e83,0xb81e7754,0x4f0b6379,0x840016ee,0x57fbc0d4,
  147121. 0xe621b67d,0x8da20771 },
  147122. { 0xecce65ec,0x3c855004,0xb748185e,0x76d10d1f,0x78797ad2,0x64be7bca,
  147123. 0x77e54aad,0x43444db0,0xbe0df0ff,0x17b6b0c9,0x055086a4,0x8fc4256c,
  147124. 0xfd74d5a3,0xf952c43b,0x01c4edb8,0x501e005a,0x4a57e328,0xd5172dfc,
  147125. 0x535d6ee3,0xdb40ce4e,0x0c650918,0xbaef1e5c,0x857561fc,0xe85145e7,
  147126. 0x34a224c6,0xe468536a,0x0ec0e0a2,0x69a8e227,0x242b03fc,0xb3f52247,
  147127. 0xc3bebd5f,0x862f55e2 } },
  147128. /* 11 */
  147129. { { 0x226049fe,0x2d6a390f,0xdcbbc9fb,0xcc92a578,0x97634fb7,0xa52feca4,
  147130. 0x3dea5893,0x2b340cb6,0x2a49e916,0xa39f338a,0x949e41f3,0x26b2df3d,
  147131. 0x065a7e40,0xc71c7cdb,0x468281a2,0x4a9b84a0,0x731eeeca,0x63eeb503,
  147132. 0x76cbb725,0xe6d09134,0xb94a678c,0x0cf979a9,0x808fd9f1,0xb44d8c3b,
  147133. 0xe0afc5b9,0xe60da613,0x3ea5be69,0x52dce7de,0xdc1ee74f,0x3a5d6864,
  147134. 0x3bc80790,0x71ab2891 },
  147135. { 0x3b5b60ad,0xcf618fc4,0x4a0c3184,0x0afb5e30,0xbc403302,0xd22381cc,
  147136. 0xdb1c0c66,0x33cf8953,0xa6112a8d,0x9c994e4d,0xd1967a86,0xd7aae2c3,
  147137. 0x5b7acd29,0xc28d5493,0x6c9a57fb,0x8075bd13,0x9c8427f9,0xc9c0373e,
  147138. 0x193225f5,0x2cbca18d,0x442c018c,0x73777d13,0xfbb3a727,0xebe5ed47,
  147139. 0x1962dc18,0x70437d49,0x2dc08806,0xf39c1e09,0x15fff35c,0x03e9c6f7,
  147140. 0x5e360a65,0x8d087bb6 } },
  147141. /* 12 */
  147142. { { 0x3fdc1844,0xbe212302,0x105eac56,0x6eca27ef,0xf168a348,0x2183a606,
  147143. 0xe1d7a4cb,0x295f807d,0x7ef5d43e,0x7246a632,0xc77025c7,0xae143205,
  147144. 0xf3484e3e,0x4bdfc7ca,0xdf52c075,0xec939895,0xd7a9cac0,0x82e655f6,
  147145. 0x8baeddb0,0x985dfe20,0x527de731,0x79c817e4,0x313de1ea,0x30ce0fbc,
  147146. 0xcc4f6cbb,0x9df95b89,0xf5bb20cd,0xf2aedf1e,0x1a8cfb01,0xfc1e0a89,
  147147. 0x63edb7ec,0x225ed34a },
  147148. { 0xbabb1a85,0x3e13154d,0x1e6a565a,0xd3d8dae7,0xab4b100f,0xd3217d56,
  147149. 0xebc78e1a,0xd44d934e,0x48e73d37,0x0215321b,0x201e43cb,0xbbc90bfa,
  147150. 0x27500905,0x3c23f1d0,0xc86691a1,0x2a2e5000,0x6065841c,0x08b2bad2,
  147151. 0x30026b60,0x15d41caf,0x5276ce61,0x1712c2f4,0x15932ffb,0x01c4c3e7,
  147152. 0x6a74caf2,0x7894e13d,0x0c0537a4,0x02d6f5df,0xc2b1c97e,0xa8fb7602,
  147153. 0xd0887c7b,0x612b60e5 } },
  147154. /* 13 */
  147155. { { 0xba245d6b,0xefd495cf,0xa2ce3ff6,0x5cf0cbb7,0xdff5feee,0x24da2ac0,
  147156. 0xcf28c6a3,0x90c914f8,0x4308a56b,0x72fdb50d,0x13d72034,0x03dbf779,
  147157. 0x822ac9e9,0xcfa5ec91,0x3aea3e81,0x0dde73c8,0x66289139,0x545ba962,
  147158. 0xca6acbd3,0xa52f648b,0x98a0683a,0xff6f276e,0xa378ed52,0x2536d3ac,
  147159. 0x885ac1d9,0x353c2c54,0x00bc84a7,0xcaff52da,0x37684167,0x3971f81c,
  147160. 0xd2d7986e,0x0f7334e1 },
  147161. { 0x6596067e,0xafbb5c83,0x38c19806,0x33e54e19,0x39cb0dcc,0x8285d967,
  147162. 0x424035f9,0x2b53f43d,0xdfef9095,0x38c531f8,0xdb0f571a,0x90fbe8e4,
  147163. 0xa39ca787,0x9a0c1ed2,0x606f2620,0x2fecc1d6,0x72b7cb4a,0x9dc890b1,
  147164. 0xccbb7868,0xc33ca6fb,0xfe73ee49,0xd1b11082,0xfcb66c48,0x590b7d17,
  147165. 0x86e14573,0x9356b0a6,0x053ead85,0x75d682c4,0xc54d30fb,0xb2ae55fa,
  147166. 0xf8aee949,0x67636a72 } },
  147167. /* 14 */
  147168. { { 0xb91d6bea,0x638063bc,0x923ecb96,0xae263a2e,0xc627aca6,0x9d7b0992,
  147169. 0x77af9e7e,0xc6ed001a,0x24aafebb,0x9214accf,0x78055a90,0xa3564b96,
  147170. 0xe027499d,0x00999b1c,0xe46a06a5,0xe413a4e1,0x2e51efe7,0xa05d13f6,
  147171. 0x9ba843be,0x35e87d34,0x3183159e,0x0a633825,0x54601923,0x6023e8ba,
  147172. 0xb7fd1cf2,0x9b107721,0xfdf2fd53,0x46b5542b,0x1c18af38,0xb314f4f8,
  147173. 0x60ac8965,0x086f9876 },
  147174. { 0x8cbb9850,0x76701954,0xa20d2c8c,0x6210b730,0x5335670c,0x4084d057,
  147175. 0x0324baea,0x3ecdc595,0xc76ee9b4,0x607fc5f2,0x440ffa64,0xf393d00f,
  147176. 0x2dc1463c,0xe0111796,0x9c7725e7,0xf00b8251,0x5bd1d186,0x35e60736,
  147177. 0x2cf72aac,0xf3d8554c,0xefa3497d,0xb4dd0fde,0xf646ad11,0xd712268c,
  147178. 0x9f7b8ead,0x07c20afb,0xfc06dfe5,0x630969d4,0x7245549a,0x76b7df1c,
  147179. 0xe61ae810,0x681f9403 } },
  147180. /* 15 */
  147181. { { 0xc9a0623b,0x7cad5163,0x67fab8d4,0xdbf82957,0x81af7c7c,0x2ccab0ec,
  147182. 0xe966d5c2,0x469e38c8,0xf0d4e41c,0x34430d52,0xa52b359c,0x426075a2,
  147183. 0x33bd0127,0x242dd3e3,0x9fed2341,0xcda3f635,0xd7d52ffa,0x4df33730,
  147184. 0x7640c3ef,0x5fff56f0,0x1bbde57c,0x4783c21c,0xeb8bb336,0xd8784a2a,
  147185. 0xead08405,0x1ec7c533,0xf9b62bd4,0x4b7f1423,0x7075d4af,0x5543145c,
  147186. 0xba60590a,0x0c9de94a },
  147187. { 0x95d5682b,0x8ed72735,0x2ec276ed,0x711c4283,0x8b36a0d2,0xd1f4aed5,
  147188. 0x8498a88f,0x62ab40c4,0x4480f451,0x58c8fc62,0xb79cffe2,0x8bc8ca4b,
  147189. 0x701a359d,0x90ab583c,0x3fd5d15d,0xaee31a73,0xc912333c,0x02a5597b,
  147190. 0xb6c3e3c2,0x1019cae4,0x29938088,0xe513042c,0xf47c8199,0x0e00283d,
  147191. 0xf2a00e92,0x90d68e58,0xa775ae3b,0x69e2df41,0x871c30b2,0xb8d2eca5,
  147192. 0xbb1de396,0x733dca0e } },
  147193. /* 16 */
  147194. { { 0x4b59213a,0xf5b495d0,0x8d70200e,0xca672039,0x2b6771c1,0x4bcb09a6,
  147195. 0x2b9eb0cb,0x26adeed4,0x8cdba212,0xeb544754,0xf08890d1,0x0e1abfcd,
  147196. 0x698e46b4,0x52509963,0x82e9c138,0xe1bff0b0,0x51099a71,0xa189e4cd,
  147197. 0xc9b91cc7,0x2360c9bc,0x137ec4be,0x9bd4d7dc,0xd1519f6e,0xd0356521,
  147198. 0xcf832503,0xbf5f6d78,0x8deea2b4,0xe4301031,0xef4c319c,0xc3132494,
  147199. 0x0f1fa7d7,0x2ab3bd47 },
  147200. { 0x922c9fbb,0x5753b680,0x0f16c6d1,0x869e7dc8,0xbac16efc,0x83445135,
  147201. 0x846d1d9b,0x4326a3b4,0xb2d62c21,0xb517fee3,0x0b292ad5,0x6905afa2,
  147202. 0x2cadac13,0x2a57131a,0xebdbca8d,0xcd904d8f,0x3f365fb2,0xdfeda86f,
  147203. 0xdc7eaa1c,0x7097b208,0xa45e77c0,0x89a35a84,0xcf5d118e,0x417a062c,
  147204. 0x1f6e99e8,0x3c0c04a8,0xba7a087d,0xc44704b0,0x3ea22ad2,0x6f8a27d1,
  147205. 0x4c27d229,0x93a4b416 } },
  147206. /* 17 */
  147207. { { 0x1f1efb7a,0xd4271bc1,0x33fccc0d,0xae4e68e6,0xb11f50a8,0x9d9bc8f1,
  147208. 0xaf076089,0x5430398f,0x443d0e03,0x45e242fb,0xf6e3d4c1,0x73ec2519,
  147209. 0xba9bad09,0xab70f790,0xf9add10f,0xde612ad5,0x14e942b4,0xb837e54e,
  147210. 0xddb8b68a,0x175a56d3,0x1ac2a408,0xe85b233c,0xf0c80f94,0xf8ff6c30,
  147211. 0x898db4f9,0x4b7f3fb7,0x45a7dcdd,0xa2c6044f,0xfe3d3895,0xf3abb2f6,
  147212. 0x32ee7763,0x342ce0d7 },
  147213. { 0xcf491b1f,0xeb261394,0x1909e395,0xdcaaeed7,0x9fe4dbea,0xdcc4055a,
  147214. 0x493d604d,0x17a6611d,0x1ce5ebef,0xba445a3a,0xe3989cb5,0xe82e2858,
  147215. 0x83f58406,0xb96f4282,0xa156cf55,0x99877b99,0x4e166a0e,0xaf906a66,
  147216. 0xb2976d13,0xcea1d353,0x36c61a01,0xefc16f27,0xb0f55d86,0xdb04c433,
  147217. 0x8eb34c01,0x3cb4b269,0x2ae60280,0x38d07f78,0x43be3ec5,0x43ac3bcb,
  147218. 0xe156fd20,0x455f4af3 } },
  147219. /* 18 */
  147220. { { 0x754ec21c,0xc057f262,0xe3a1ba38,0x3eacd4c9,0x116c1fe9,0x3a0210d1,
  147221. 0xeacc8ab6,0xe4ea4e94,0xea6f32ca,0x31c00c9a,0x86b975ce,0x5cb6239d,
  147222. 0xa14ea1e9,0x654d5d8c,0x5067fc8b,0x230d31f4,0x6355fecb,0x48bb90cb,
  147223. 0xdc172e8e,0x78f81ece,0xcb006737,0x288380a8,0xe162d012,0x19b02e01,
  147224. 0xc5af145c,0x0e087a06,0xb72dc354,0xf04dc8b7,0x8de3c066,0xf70ef214,
  147225. 0x13009fb7,0x4f148243 },
  147226. { 0x6e2055e2,0x5e004fce,0x86c32067,0x89e247ea,0x5f9daaa2,0x4ebcbd95,
  147227. 0xceb7f63b,0xd15f212f,0x863784a0,0x5ecc5c1f,0x75760251,0x53b3800b,
  147228. 0x8a6a2954,0xeb9301c3,0xa13cdd19,0x0f16ba18,0x887c2d24,0x8313d251,
  147229. 0x9a9413f6,0xf9923585,0xfe3fd7c5,0x423405e6,0x16e0ee05,0x678aeb34,
  147230. 0x3fadaab0,0x1f3be7bb,0x82884471,0x7901fa2c,0x4d662ff6,0xc950db30,
  147231. 0x3c01170b,0x74d5d2d4 } },
  147232. /* 19 */
  147233. { { 0x2b5bfe11,0xa3002dc0,0x52d321e7,0x0733410d,0x9679ba89,0x15920f65,
  147234. 0x685b236e,0x0e248c14,0x346f6040,0x8cfab594,0x40c717f0,0x9f57afb7,
  147235. 0x66044576,0x0dbab28c,0x9cdc3247,0x0fa09968,0xc230ed05,0x41e02ae2,
  147236. 0xe45bef74,0x0d961554,0xce4d7b6f,0x9688a982,0x5e62d22e,0xfadefac7,
  147237. 0xbd2cba28,0xaf1512a6,0xbe7c749f,0x78868e62,0xae9f5a6b,0x88048d81,
  147238. 0xc5857a29,0x6b1a5442 },
  147239. { 0x43242066,0x9f5ab9ad,0x2ccca2ae,0x0afef1b5,0x988edc4e,0xb1b43ec7,
  147240. 0x0341b0d5,0x0d0c00f1,0xb50aab37,0x4d68b8f7,0xf3a64a99,0x9a8e4e6f,
  147241. 0x7f1a684e,0x198338fb,0x351a0f5c,0x8bc0e748,0xdac44515,0x2cacf2cd,
  147242. 0x5e9ff76b,0xc14d3999,0x16393055,0x54a01b3f,0x888d8376,0x6ac3eea5,
  147243. 0x723277b1,0xb84d9a9a,0xe11dbbbf,0x99132691,0xabb67178,0x597717ae,
  147244. 0x8bb14ac8,0x4c213526 } },
  147245. /* 20 */
  147246. { { 0x95532833,0x2e6fe0a6,0xd626d067,0xabca228e,0x649e73bd,0x22aef3d9,
  147247. 0xf03c4c0c,0x2083a87a,0x35169b45,0xe954e75d,0x74506a89,0x577509ee,
  147248. 0x2aeacf90,0x49cb276e,0xfa409f91,0x08275d77,0xf0bbd6b9,0x61eb6f3d,
  147249. 0xe4132704,0x948202cb,0xb1c498b1,0x35f3fc21,0x361fee59,0x76c68ba8,
  147250. 0x50e051f3,0xa18cbbd9,0x318e7042,0x2384a879,0x80dd1e8b,0x292abead,
  147251. 0x5c37c334,0x65713c29 },
  147252. { 0xceb77b9a,0xdccca8e9,0x23b69469,0x2f97e727,0xa01d6b28,0xc76abee6,
  147253. 0x5abecdfe,0x3925203d,0x29290d70,0x89448082,0xb0314438,0xf9931424,
  147254. 0x7cd447c3,0x04209df1,0xc855c827,0x7c6f2059,0x56c0e069,0xd97d7862,
  147255. 0x412d94c4,0x5a9db6fe,0x994c41dd,0x19a64591,0xc89e21a3,0x12348aa1,
  147256. 0xc6a03f0e,0xd6904b50,0xa616feac,0x55c15156,0x7cc7693b,0x4e36d1b5,
  147257. 0x3bae3c38,0x6b0e996c } },
  147258. /* 21 */
  147259. { { 0xcceced00,0x32789fab,0xe5b7aa66,0x3237e71a,0x2ddebcdf,0x87b2e269,
  147260. 0xb61dad8f,0xb7245120,0xd35f803c,0xe11e5e48,0x98e50f0d,0xfb4df5d7,
  147261. 0xbcd2ab92,0x60ee68b4,0x1ce3363d,0x98ab2f5c,0x7cd42647,0x15ba39da,
  147262. 0x83f4fb3f,0x1a6572eb,0xe56f08db,0x0f77de88,0x172562c2,0x1743761e,
  147263. 0x8a58f0f4,0xbe349ff8,0x84d1d6e2,0xe04da71b,0x9e9ff3b4,0x368f0342,
  147264. 0x678223f8,0x4022a205 },
  147265. { 0x83847375,0x527bbd05,0x3f451af0,0x3ae56b62,0x4b2c7f18,0x6198f24d,
  147266. 0x4525b98d,0xee323f5b,0x0e0884b5,0xa9d8d39a,0xfb12c776,0xd005d7f6,
  147267. 0x708bc154,0xd71c483e,0x742541bc,0x8ca6fd28,0xf8397ddb,0x0af3dccd,
  147268. 0x3eccf243,0xb80d3125,0x58d81b8d,0xc743a108,0x71391f68,0x3f48eb21,
  147269. 0x33bb657f,0x493aff88,0x07e47e31,0x1d15ed66,0xe08279f6,0x10159b11,
  147270. 0x24a6a956,0x312179cb } },
  147271. /* 22 */
  147272. { { 0x07615ac2,0xa94cc3ca,0x121ad581,0x85865e64,0xa7986b79,0xae47616f,
  147273. 0x9d5e0f1d,0x395a40eb,0x3d9457ea,0xa9143264,0xfa2865d9,0x8de6d6a3,
  147274. 0x1014ae8c,0x0771db96,0x976a87cb,0x77a7cce6,0x143a0f60,0xa7de42e1,
  147275. 0xd993d934,0xe203cc09,0x98ec4c3d,0x92018693,0x3a25df4b,0xd77546d8,
  147276. 0x62b02d6b,0x0ad9eb47,0xd05a7189,0xfaaaf208,0x431221bb,0x5238181f,
  147277. 0x733511ea,0x417d6c78 },
  147278. { 0x0e91e9a8,0x3cbd81b7,0xc370d6b3,0x73340418,0x8eaa2373,0x825db10a,
  147279. 0x6c7d6756,0x8f2b09e4,0x94c33ded,0xe288ee9b,0x1695e3fb,0xcd8426bb,
  147280. 0xdce9e888,0xa6176c86,0x6165e362,0x3f4c8922,0x6063fb09,0x514e411f,
  147281. 0xc8f9e04c,0x6907ac20,0xdfd2ad61,0xcef7469c,0x8452199a,0xba30bae4,
  147282. 0x12ac3462,0x30681293,0xc92d482d,0x011be873,0xe8330995,0xff4cbf89,
  147283. 0xd1470a0a,0x02189d52 } },
  147284. /* 23 */
  147285. { { 0x92599c69,0x73e419dd,0x7fec32ca,0x5b94221b,0x09bbfbfd,0xb2bf9bd2,
  147286. 0x63ed895b,0x61ea97a4,0x3f486f79,0x6609146b,0xfd141a39,0xbd1c7a05,
  147287. 0x83d64135,0xc79ec8cf,0x9883507b,0x7f8fd42f,0x17b3d027,0xafcb53b7,
  147288. 0x67ca5a21,0x86658dcd,0xcd149786,0xa6a6c0ac,0x34b95067,0x16f3d70e,
  147289. 0xdf44958c,0x371208e3,0xec280212,0xd2dd64e6,0x30782c71,0x33b2c4ab,
  147290. 0x521176fa,0x7bbf8abd },
  147291. { 0xa78b981a,0xbe9e4aaf,0x304ec828,0x788b4e36,0x3959dea3,0x0c45cf39,
  147292. 0x240b39c7,0x70a9bdd3,0x28383b7d,0x499cd7dd,0x307a1026,0x30690b2e,
  147293. 0xee92f1b3,0x2262d598,0xb4725a48,0xc62d77de,0x7bc3aa0e,0xa16f25bc,
  147294. 0xd15ef7fa,0x62dd8b65,0x0b96d68f,0xd979221d,0xa00f1906,0xb92885c3,
  147295. 0xeb74c740,0xfa476b9b,0xc7576222,0x217ddbb5,0x5788504f,0xc2782c30,
  147296. 0xf812716b,0x860d096c } },
  147297. /* 24 */
  147298. { { 0x4d79bbf9,0xfebc337d,0x69f74f80,0x5d53eab8,0x33104d53,0xff36a095,
  147299. 0x196f8b97,0x2ab820da,0x75ce6909,0x961d3d1f,0x04683754,0xb197ec04,
  147300. 0x93a6cb9b,0xa68ce1bf,0xc5f021a3,0x503456ff,0x8940ffdb,0xb50a2db1,
  147301. 0xef004209,0x77c50f8f,0x04965875,0xd635d177,0x8bb8770a,0x725766d9,
  147302. 0xa078e53e,0x8e19b028,0xf9fc8378,0x364d4cca,0xf0dd39a0,0x1a3df411,
  147303. 0x03adf920,0x7e80e442 },
  147304. { 0x539a1ddf,0x4b5f8a57,0xee486562,0xd248e7ae,0x816021e1,0x1c7b491d,
  147305. 0xfd36d2c4,0x2e7b871b,0x0aec00d9,0xda38b504,0x6193f1b3,0xf2827612,
  147306. 0xfb1f78d6,0x69c3fe86,0xe827ac33,0x56c8b786,0x3487c8f7,0x1687f6c7,
  147307. 0x19dee5bc,0xab8f2217,0xff399418,0x04e8473f,0xa9027c80,0xf384c014,
  147308. 0xaa1d2e28,0x9967be9a,0xe065eef1,0x869686d3,0xc7bd837c,0x737c6b08,
  147309. 0x9e8bd863,0x5dcab5d1 } },
  147310. /* 25 */
  147311. { { 0x9a7d772b,0x0784283a,0xe540959b,0x6b49e525,0x86414ab5,0x546bb008,
  147312. 0x9d74b2a9,0xd4448162,0x203b0b1b,0x267890ad,0xc8d3f86b,0x1e7a82bc,
  147313. 0xd85a83c7,0x1352bfb5,0xfad07ccf,0xf29f16e3,0x41e0c43f,0xc02a63b8,
  147314. 0x6b379fef,0x904f22c5,0xb1244f26,0x19d8a653,0x3a28bdea,0x6635b6df,
  147315. 0xf6d455ce,0x18b68851,0x9cff3735,0x74ac2818,0x8b2cbdab,0xad40f9df,
  147316. 0xadc9d498,0x08cc2d9e },
  147317. { 0xc170c84b,0x2e6a6866,0x5a49a484,0xbb989e8b,0xd04c8992,0x7b0e00e0,
  147318. 0x61b3a423,0x55ad3478,0xb0d01899,0x3c952450,0xe3100cb3,0xe3922155,
  147319. 0xf03276d0,0x19265b6e,0x76d42b53,0x0fe8595a,0xfc6353b6,0x0a96dee0,
  147320. 0x246f893e,0x761e0dc8,0xf0a74cba,0x4ec902be,0x3fdfad9b,0x61008684,
  147321. 0x4fdb6975,0x5d6a60e4,0x7ef7590a,0x3f53aac8,0x12870a37,0xd29e6be0,
  147322. 0x55aa55b0,0x991fadc1 } },
  147323. /* 26 */
  147324. { { 0xb4844ffe,0x82bc4b0f,0x60f8b871,0x73922714,0x4ce3f1f3,0x8ac000e2,
  147325. 0x163519ec,0xf0d548b4,0x88288b5f,0x7aaf842b,0x2bdc9a70,0x9e8b0c4c,
  147326. 0x4ba5fd67,0xa06d5152,0xf93cdec3,0xd0b1afa0,0xdf89f8f0,0x280955ba,
  147327. 0xeea32c92,0x86cbe92d,0x3fe05be4,0x0cae3f99,0xfa6919aa,0xf2607095,
  147328. 0x6e0f1b8b,0x0f54741e,0x30ecf988,0x2aed1f74,0x734991d7,0x9296f76b,
  147329. 0x259f0fe9,0x66cf8d28 },
  147330. { 0x226f5868,0x9b01905b,0x16909e9e,0xc102e88c,0x4a37eb54,0x2bd08916,
  147331. 0xc9816323,0xf72253e8,0x86bac53c,0x37f84e9d,0xafeaaaf7,0x2e352454,
  147332. 0x2ca0046e,0x67c86f77,0x6663372e,0x86bce50e,0xb6950a04,0xf6a3a960,
  147333. 0xfc1aba93,0x61f994d7,0xc1326e6e,0x1957c12b,0x2e56b005,0x9b658fe4,
  147334. 0x8592740c,0x9cd297fc,0x177f26a5,0x7654ce9b,0xa79d2ebb,0xaaa699db,
  147335. 0x0ecb6448,0x5fca0c5a } },
  147336. /* 27 */
  147337. { { 0x569a6663,0xe26e25f3,0xe6aa4ca7,0x09597ee7,0x8d18b80c,0x25a4cda6,
  147338. 0x22926730,0x450602b5,0x07387209,0x9af5f650,0x26733a53,0xfeeedb34,
  147339. 0x86572951,0x0f5ce768,0x8398ae9a,0x872a360b,0x2b30f6c3,0x60347a80,
  147340. 0x1a162158,0xd2113b23,0xee6c6dec,0x6fd9cf92,0x5cbcf9e6,0x85f0a5a8,
  147341. 0x2ba3fe84,0xd7a5a6e4,0x51ecd727,0xaafe6720,0xa2081a10,0xe09c6bb2,
  147342. 0xb973b0b4,0x657acbf0 },
  147343. { 0xc274c8d4,0x3130466f,0x30a994d1,0x42765176,0x7079435f,0x217258ca,
  147344. 0xeb897a06,0x44850406,0x561ee130,0xf38dfeee,0xaa1778bb,0x11f4facf,
  147345. 0xb9abb9e9,0x765c6617,0xd8f10932,0xb135499b,0xa73b9159,0xc0eb6337,
  147346. 0x6f7e8b6a,0xf2c1ccf1,0x187def53,0x5b32c03a,0x830b9c62,0x89ad1d49,
  147347. 0x2f10e538,0x1735eae3,0x9d5f55bc,0xb1cbd9c2,0xe539db0d,0x42428c47,
  147348. 0xc852b3bb,0x3d2da412 } },
  147349. /* 28 */
  147350. { { 0x871f2865,0x97702b6e,0x142920d6,0x56cb639f,0x45b58611,0x328522a0,
  147351. 0xf3b13812,0xf3943ad1,0x712206e8,0xe6c2200a,0xa34d59ea,0xc2890e5a,
  147352. 0xf6b7f759,0xab52fd40,0x180bf567,0xf522c8de,0xaccee396,0x181e97b2,
  147353. 0xc4ea5cbb,0xe0375819,0xab51d3ef,0x0d9985e8,0xbcb50fd8,0xe26c96ca,
  147354. 0x97e1c80d,0xfb9d6b13,0xf796357d,0x582b1814,0x07f4c7fb,0x89a78221,
  147355. 0xc0357e61,0x02aeef2d },
  147356. { 0x2c7ec9be,0x2ba7926f,0x7258b201,0x292f307e,0xc6fa6b4a,0x74e62a10,
  147357. 0xe2bcc5ab,0x80c08549,0x7bb8c073,0xb4160db8,0x329f194d,0xd5ef0529,
  147358. 0x6dda4a9c,0x0eb8da14,0x15ea23d1,0x0b5d43d2,0xfc34bfae,0x6cebef02,
  147359. 0x848757a7,0xacd364d0,0x2d34cca3,0xc1401368,0x1d2d95e2,0x09ca6742,
  147360. 0x786eaa28,0xc3fd1d6e,0xa2965fec,0x9eb1136d,0xc0779203,0x48871baa,
  147361. 0x4b15aeb0,0x6b446c01 } },
  147362. /* 29 */
  147363. { { 0x25e8fe80,0xc819eb2e,0x98238a17,0x2b5f7906,0x81e41849,0xd6f1e996,
  147364. 0x98ea6d45,0x58ad8ad6,0xbfd02e40,0x5bae5ad4,0xa812416d,0x016dc327,
  147365. 0xa3347ca1,0x8b31a985,0x82a65391,0x0b4da610,0xb48c35fb,0x1cb91b2d,
  147366. 0xd2aaf8c4,0x9e96817c,0xcdfdcdc0,0x1a630483,0x12b69254,0x70559361,
  147367. 0xf8a2a097,0x5fdcd712,0x35cc5281,0x59ab623a,0x932b6095,0x30c8ebe0,
  147368. 0xb08e052f,0x8613424b },
  147369. { 0xb2231d8a,0x28902063,0xd9a61667,0xb0f62329,0x071a9f27,0xaafa0fe7,
  147370. 0x603f047e,0x6bcd8960,0xfd92a1c3,0x118cca76,0x71d483b6,0x3414e62b,
  147371. 0xba705262,0xa123ccdd,0xfd9b5c5a,0x1a576437,0x4c8d0fa3,0xa5301bc2,
  147372. 0x102427cd,0x96f0ad44,0xd3aa6c02,0x0e6fb5e0,0x072a3996,0xcd8c4880,
  147373. 0x840d3fad,0x4dafca12,0xde91d541,0x29f4ca3d,0x8441734d,0x0037c598,
  147374. 0x9ccfe57c,0x86333a99 } },
  147375. /* 30 */
  147376. { { 0xecf53b40,0xd213a751,0x2f78a542,0xcff2c6f2,0xf13ae56d,0x0f59f0e2,
  147377. 0x0e61748e,0x91f8ccbf,0xd72c4145,0x0aadecb9,0x4c9cdcb7,0x6b2ed852,
  147378. 0x1eaffc70,0x8e00b72c,0xaa728102,0x89b24285,0xb679cafa,0xaa7ea7e0,
  147379. 0x4f0a6f6f,0x5d2b8c26,0x0e804397,0x7ed7b173,0xc8573049,0x5a93eb45,
  147380. 0x0986e93e,0xc92bf5d4,0x6a20c0af,0x526b5a9c,0xb99dc3af,0x0adf47c9,
  147381. 0xba202cc9,0x12b25fe2 },
  147382. { 0x33eea395,0x09b8d78a,0xf633fc5c,0xc7a93618,0x270eceef,0x7e821629,
  147383. 0xc628ed0c,0x524779b8,0xa1d68939,0x91db5ca1,0x586edc90,0x8626e18e,
  147384. 0xfeb3f3bf,0xfe023e8b,0x0250171c,0x6279fde1,0x55e172de,0xe52ec7dc,
  147385. 0xc6d4ca45,0x445e8695,0xbdbc10f1,0x42de3878,0x6fc3835e,0x2b114de8,
  147386. 0x7e10b652,0x9faba456,0x390e78fe,0x4111d82a,0xaedf0aca,0x576b61c2,
  147387. 0x74accb74,0x216279a9 } },
  147388. /* 31 */
  147389. { { 0x4047f747,0xc14cdabf,0xc1315a1e,0x03ca233d,0x40e5d0a7,0x59e7cbd3,
  147390. 0xbb413869,0x1fd0c4e9,0x0f01fbd8,0x189d08b1,0xa76b823d,0x50449c42,
  147391. 0x398b00a1,0x81c224a1,0x8e8179e4,0x08084e4f,0x698e41e9,0xfd8af994,
  147392. 0x5610bf2e,0x1e30e37c,0xa7d2790f,0x4e6a043f,0xb3195388,0x9d96e60c,
  147393. 0x03799dfd,0xe75f986d,0xf8ff902f,0x3b4a8f11,0x7588416e,0xfa945378,
  147394. 0x9827535e,0x20683e3f },
  147395. { 0xd0378878,0xcb582e26,0xa7945787,0x9e214c23,0x8f6688b3,0x13d000bf,
  147396. 0x40515270,0x7548d4f5,0x40111f5d,0x7113c15d,0xa8bff902,0x3bf5a526,
  147397. 0x9b4945cc,0xbda6b010,0xbc2f3a05,0x83dcc74e,0x43efdfa1,0x2aef6284,
  147398. 0x565c5bf4,0xd2e60ee9,0x592f243a,0x4f0fa10d,0x1bc3bf51,0x6ae58b32,
  147399. 0x60576a74,0x813b0868,0x4d73081a,0x0bc023f8,0x32dcee59,0x9fd03aa0,
  147400. 0x27d6c795,0x5e416bf5 } },
  147401. /* 32 */
  147402. { { 0x026cc23c,0x24313760,0xb5b29058,0xf819aaee,0xc5d2ee17,0xa92272f8,
  147403. 0xee5cc402,0x8048e7cb,0x77def07d,0xdbc7d6ee,0xf6af821e,0x61d69244,
  147404. 0x996cbb89,0x5f7966ed,0x96a155a4,0xf81b17ea,0x03f3ed56,0xb2d9ef70,
  147405. 0xe882a5b2,0x5e6e5906,0xae947180,0x86fa1072,0x658c76f4,0x34d9fc51,
  147406. 0xcb035aa0,0x9f603dc0,0x75be6481,0xb7b39feb,0xcf04a9ef,0xca87554a,
  147407. 0x87b4fde3,0x4ff682ec },
  147408. { 0xd0a10ad5,0x3125627f,0x968e6f45,0x7fd45c72,0x806a1163,0x2981bd6b,
  147409. 0xde5033e3,0xb92de1cd,0xbf4f8988,0x3b44b45e,0xdae7e1dc,0xca1b9896,
  147410. 0x0778d878,0x52166e5a,0xa5116847,0x82d472be,0xf2895445,0xfbdd382a,
  147411. 0x5d6ec4c9,0x22ed1602,0xb6552b02,0x3614eb1c,0xa1e6210f,0x63c5df73,
  147412. 0x021a74a7,0xe9160285,0xc65cbd4d,0xa44ca400,0x0f15e299,0x48cb187e,
  147413. 0x3402507c,0x51eb818e } },
  147414. /* 33 */
  147415. { { 0xb92100ab,0x1fc1d178,0x9605b839,0xdf2e3d60,0xb71e59d0,0x12a7c255,
  147416. 0x14fcbe04,0x3f8b6675,0x59fd06af,0x0e8a3935,0x12020d07,0x56326502,
  147417. 0x528e7be5,0x6696fcd1,0x0c7b7654,0x6588514b,0x5912a5b5,0x0cd80f8c,
  147418. 0xf324cb7f,0x8bafef04,0xc6da3d75,0x6b53eecf,0x31d1df2f,0xedef48d8,
  147419. 0x73812b6d,0xf336b965,0xee626031,0xc82eae4a,0xd244f09b,0x300abd32,
  147420. 0x31d9647f,0x8b0af955 },
  147421. { 0x2e603544,0xb770180a,0x221acd9e,0x2b573ac3,0x62407032,0x3a17f665,
  147422. 0xb89abc3d,0xad3e74ad,0xd793225a,0x8a3d2e3a,0xef02564b,0x457bba04,
  147423. 0xfc2dd2b5,0x8875652f,0xe67143e8,0xd2905d15,0x02e48d70,0x6d884b42,
  147424. 0xc7636a57,0x06f99219,0x35e378df,0xa8dc3421,0x10c64a02,0x95c1d73d,
  147425. 0xcc157a66,0xcd6a4ece,0x8e24a354,0xbadcc1c8,0x9839329d,0x8024f1b2,
  147426. 0x4da48ad0,0x5363e549 } },
  147427. /* 34 */
  147428. { { 0xe23fc641,0x1f5523b7,0x86667063,0xfe54e72f,0x8e009d2f,0x294a15f5,
  147429. 0x8c57f5e1,0xf203997f,0xb16d64dc,0xa229724c,0x4baa2ffb,0x697be4fd,
  147430. 0x0a6e8ed6,0x3f507e46,0x78508536,0x0afe3a5d,0x95408208,0xeeef6cdd,
  147431. 0xf2c4237c,0x701fd889,0x5c385253,0x496d883a,0x72a212f1,0xe25c67ed,
  147432. 0x1ff78fcd,0x4b416783,0xc16f4146,0xe9967004,0xc45b0697,0xfa45c3a1,
  147433. 0x3fbd30c3,0x63334018 },
  147434. { 0xa2fbbbce,0x39c9a0cc,0xaa0cb744,0x876f6e5c,0x3438ece3,0x9ce6010e,
  147435. 0x13802d82,0x0aad148e,0x9cd45a1b,0x9c3e5c60,0x7bcfc1e0,0x875cb859,
  147436. 0xd8584dd0,0xb19ff790,0xd81c2a2b,0x2598b81e,0x02be07e3,0x118bdf2f,
  147437. 0xb9765ce9,0x074fc8ee,0xb24f95ae,0x125e9d88,0x0c98f09d,0x3bb12cdc,
  147438. 0xa0b74b27,0x4a6aee07,0xc08077ce,0x4723d2f9,0xbea8026f,0x959447d6,
  147439. 0x16280b73,0x93a7075c } },
  147440. /* 35 */
  147441. { { 0x715b27f9,0x26bbefe2,0x2a280923,0xa935a5e2,0xfd58a26a,0x5ddf23af,
  147442. 0x7c138694,0x54c83e16,0x892a2153,0x44799bc9,0x9b8d09f5,0x4e6e4710,
  147443. 0xd588ea68,0xc63af616,0x883ab1b6,0x5e896706,0x3d209336,0x3c1393a0,
  147444. 0x92c23dda,0xd02f2921,0xdcf6ea43,0xab70cb7a,0x791559e1,0x12434ea8,
  147445. 0x6d70ff0b,0x040680db,0x2832ba45,0x1a10fe52,0xe5f0cb8f,0xd69f9c08,
  147446. 0x44b141fd,0x1a7422ac },
  147447. { 0x9f40b675,0xc3a9dd2e,0xfcc71f39,0x2a7c6603,0x1948e342,0x18939a61,
  147448. 0xed0ab484,0x8f3b6158,0xee31ca6b,0xa3aa7d97,0xf7a8db63,0xbc1e865e,
  147449. 0x2c7c62e4,0x315f8c09,0x9f5c6d0f,0xa260788f,0x4b6f3ec5,0xb1833129,
  147450. 0x36b4d849,0x73adbcd6,0xbc699a9b,0x66e14890,0x2a1175e7,0xbf3790d8,
  147451. 0xfc53ca4f,0x7f43605a,0x87ff6091,0x577f6c47,0x600c82b6,0x827c7552,
  147452. 0x9d25599c,0x0944d630 } },
  147453. /* 36 */
  147454. { { 0xe6ab9620,0xcfdeb63e,0x786cd808,0xdff4fa6d,0x456320b3,0x145edd82,
  147455. 0xc4943915,0x2ae5f862,0xb73b3f87,0x9508e813,0xe52f97a9,0x3bd805f3,
  147456. 0xc9829b62,0xf71b5c28,0x86e0cefc,0xb394c70e,0x23bdb36e,0x534fb1a9,
  147457. 0xdbe27e5a,0xd64f5862,0x83ab6169,0xbae23df3,0x27c828cb,0xdd6df1b1,
  147458. 0x3a307a8a,0x1901899f,0x811ddf66,0x36cc8659,0x79943b77,0xa3cb7774,
  147459. 0x6fd86576,0x7d89f383 },
  147460. { 0xc9f92b2b,0xf8564242,0xc46e32bd,0x700c6a75,0x7f99a5c5,0x93e768b7,
  147461. 0x03149568,0xb6efe858,0xc2ce6709,0xbbfe8a19,0xee6ec493,0x721a3b1b,
  147462. 0xc371c28d,0x26eeeea9,0x15177e1d,0xd798115e,0xb068a5a5,0xd7bf3bce,
  147463. 0x46d2b4b2,0xdf8da220,0x59be9dfc,0x3df0995b,0x77640b79,0xc96897bc,
  147464. 0x5a2bd3c5,0xce0cf4c2,0x89afe744,0x16f45d6e,0x3a8509bb,0xb53f3acb,
  147465. 0x63f2a6e6,0x449af81f } },
  147466. /* 37 */
  147467. { { 0xa16d9377,0xc2fcf132,0x7e1a2f9e,0x9ab377b3,0x86d19ae5,0x72e1a12e,
  147468. 0xd013bbb1,0xd2b12e66,0xcb5f66ba,0x0972e055,0x399eab50,0xd11de1c0,
  147469. 0xc65f5ec2,0xc1f314fd,0x8a9ff593,0xfc311841,0xe05246e6,0xdf73c1ec,
  147470. 0x1625056d,0xc28d1363,0x6fb25e19,0x30a9dbd7,0x845cd2d7,0x049ed244,
  147471. 0xd36e852d,0xc779b83f,0xf68c8a83,0x85a35fc7,0xc95e8033,0x299bf1e1,
  147472. 0x20891af5,0x0e8617c3 },
  147473. { 0x67c81b5c,0x53720602,0xe737873c,0x2fa89dcd,0xa8144fd0,0x2a7430b0,
  147474. 0x26208c83,0x3006c5a7,0xd8ea40f5,0x4e066660,0x896413a4,0x9dd025f9,
  147475. 0x46b9149f,0xbdf380cc,0x0a125cc2,0x80156619,0x52793c37,0x04d6a3b7,
  147476. 0x6b7a62f2,0xb6001374,0x585d5978,0xa9cfe268,0x8395fe66,0xdcad0cb8,
  147477. 0x46b261f6,0xbab468fc,0x9d9d9218,0xca0ef5ef,0x5e452402,0xc507d4a8,
  147478. 0x326cf687,0x6f4404f1 } },
  147479. /* 38 */
  147480. { { 0x4febd3ff,0xa3e1920b,0xfdfd2bba,0xca6234d8,0xe19a9829,0xb7d1af2a,
  147481. 0xc6f5bc20,0x23de1610,0xdaa39ca9,0xe204dbf3,0x6d8c70ab,0x2a2de9b8,
  147482. 0x7c9d370b,0x272e0c37,0xe565510e,0x80914c06,0x57cbb6b0,0xb611e7a8,
  147483. 0xd8266a6e,0x076fc6ef,0x3095801c,0xdfac34ee,0xb9e24063,0x69ff40a2,
  147484. 0x787aa5c5,0xa7ba31a9,0x33c70cd2,0x0e4d1fdf,0x6895f074,0x903e3132,
  147485. 0x7fb671e2,0x905771f8 },
  147486. { 0xa4062bee,0x5199ba0d,0x94d7d9f9,0x18e7238c,0x1e0922c0,0xf53f29bc,
  147487. 0xb12d855f,0xde9b2a81,0x6d68ca29,0x649f3eed,0xc50c097f,0x64adfc34,
  147488. 0x9db398a0,0x81964ab9,0x7a587224,0x00d59c47,0x74c5903a,0x09fea396,
  147489. 0x15043dd0,0x6aafd8ee,0x5f1ecc20,0xc5721a6e,0x0db9b7b4,0xb6d6a483,
  147490. 0x66c8d52a,0x06ffc617,0xacc82a27,0x3de241d6,0x27f2f7a8,0x0605f052,
  147491. 0x6404decc,0x6a22953b } },
  147492. /* 39 */
  147493. { { 0x74fce389,0x92452d8f,0x2afa5564,0x059634c0,0xf0ed7825,0x9377ccbb,
  147494. 0x37718e0d,0x89f4045b,0x9fa69a4d,0x11074e7d,0x7295b0ba,0x5d70bb07,
  147495. 0xf107ede6,0xb22d54ad,0xa1a29c7b,0x5c39a3d8,0xd795e3ab,0x37236c02,
  147496. 0x2b589951,0xf7282d00,0x5790bee2,0x5e2265be,0xa8e65ea2,0x91e0ea11,
  147497. 0x6001cebd,0x0e71a708,0x2c1c5402,0x16900f5a,0x357f6981,0xc3b2d5c0,
  147498. 0x619e3427,0x528c9ea0 },
  147499. { 0x5f26c577,0x1edc86b4,0x9438bd45,0xf8074708,0x792582a7,0x2dfe1013,
  147500. 0xde1e569f,0xe08eaca0,0x9a55a356,0x5f952efa,0xe4976216,0xa4d80b53,
  147501. 0xcd5d71f2,0xd2b65855,0x66cea3f0,0x246704bf,0x492323ca,0x193f641f,
  147502. 0x9adb1325,0xa681855c,0x2d19d652,0x86d522ce,0x5b82ed7b,0x53609f10,
  147503. 0x8e150d29,0x3b0f0094,0x0b13e891,0x23ad8bfb,0xf794b449,0xcbb1556c,
  147504. 0x738bcf57,0x200f9093 } },
  147505. /* 40 */
  147506. { { 0x8388387f,0xf9b22fc5,0x28e883c5,0xcf26f170,0xd1b7973c,0x447cab90,
  147507. 0xf6ec9171,0x8d5d4ea2,0xc30cdbc0,0x2e16f498,0x48623c2b,0xdc92910c,
  147508. 0x30dbc545,0xeb1491b0,0x14de21b0,0x631deb2e,0x2fe830f4,0x04a21066,
  147509. 0x379c1f3f,0xa4c6979c,0xfb06a795,0x8a732b68,0x1619dfa9,0x3a44327a,
  147510. 0x8dbe2c9b,0x91a307d3,0x03989fea,0x939bc8d2,0x0f4a331f,0x3daabaf2,
  147511. 0xdd0f55dc,0x5c307e98 },
  147512. { 0x35b233da,0xbbc4e0c4,0x22f6f985,0xe3d29085,0xa8b02468,0x99dd2d21,
  147513. 0xa96916e7,0x978f40e9,0x614bcced,0x0327d86c,0xb290762c,0x95e95502,
  147514. 0xa879f2ed,0x0ffd2197,0x50e0bd33,0xc4365137,0x0827c4c4,0x26c3148a,
  147515. 0x3fcfc0b2,0xc79812a8,0x31928589,0xc3d8d17e,0x8830f42d,0x8b572cfe,
  147516. 0x4b07f83f,0x7cd9ff92,0x0a51148f,0x331ca950,0x4c59f9ac,0xd0c53968,
  147517. 0xc1434785,0x1df16dfa } },
  147518. /* 41 */
  147519. { { 0x68bcacc3,0xcc7bb4ac,0x430f58cf,0x06ded34f,0xd461855a,0xc59f9f4f,
  147520. 0x45c9f0bc,0xf5491994,0x4375c892,0xdc5f7ec6,0x3c85983a,0x1b8708f1,
  147521. 0x82fcd087,0xb32a5cc4,0x2d6b4c0f,0xefdcdc35,0x8ac6fb2d,0x4bb24f04,
  147522. 0x33906471,0x5982d4f5,0xb83a3ac4,0x162eb52f,0x2337a223,0x7130df28,
  147523. 0xcbc3dbd3,0xdce7b802,0x2467ac0e,0x8b395959,0x1b56717e,0x21d3d2e8,
  147524. 0x46512617,0x729a7f50 },
  147525. { 0x8420f90a,0x874ed1aa,0x0fe4c855,0x6368e19e,0xb0be74af,0xb62d4aaa,
  147526. 0x8ca60ca9,0x76fcc480,0x7645a867,0xf310b5a5,0xddb1b24c,0x131bac9b,
  147527. 0x2dea5b44,0xef77d71d,0x72fcc64e,0x4706d210,0x673d77f0,0x29b92691,
  147528. 0xe89e0663,0x22e00bf3,0x74077d40,0x472d0cd3,0x829232e2,0x3e21040d,
  147529. 0x38dc8533,0x2f916dfb,0x14b8f667,0x48bbb59b,0xd44be19d,0x19de9f4a,
  147530. 0x232d9d5c,0x7f6d3649 } },
  147531. /* 42 */
  147532. { { 0x6e794819,0x3bd064de,0xf82ebda1,0x5a6b694e,0xb91e2804,0x1f017fe0,
  147533. 0x07a43cd2,0x190d31f3,0x630433e9,0x6c26f226,0x0abfdcb4,0xba488aa7,
  147534. 0xa46411c0,0x418d9085,0xbffb5880,0x1b934fe6,0xe200f849,0x75d1e237,
  147535. 0xa55413db,0xdf04d63f,0xe23b3f77,0xe216ed75,0x0f91bd30,0xa05866cb,
  147536. 0x7729c509,0x84c395d9,0x452ab2d7,0xec97e188,0x0093d686,0x8cb7c1f9,
  147537. 0x628f086c,0x2d032395 },
  147538. { 0x4a44b4c5,0xa81c9407,0xcc702c98,0xb9846879,0xceb0dc97,0xcb502287,
  147539. 0x6e3aa321,0x30301126,0xe4c256c2,0xc0ac8763,0xe55b4845,0x65034d20,
  147540. 0xf240f35b,0xaa96a040,0x7cf7eedc,0x046d26d3,0x3b810656,0x62a5a8e1,
  147541. 0x83d70c2b,0x86044b97,0x59e4da8f,0x2fbaff88,0x5457f5d1,0x929d901a,
  147542. 0xb531b757,0xd29e1eb2,0x9e4e9739,0x214dabdc,0x4eaa9bd9,0x5bd724fc,
  147543. 0x1ef9bb9b,0x734c12b3 } },
  147544. /* 43 */
  147545. { { 0x92f9b086,0x98fe3c2e,0xb3fd4544,0x4641b93e,0x5c02c65c,0x47ce208b,
  147546. 0xc4f03242,0x8a52dca1,0x679d29f6,0xb5ec17d9,0x9406f5f4,0x11d2fed0,
  147547. 0x0d9ba811,0x260f63dc,0x15472a3f,0xde2b056f,0x007290e6,0x1b170d9f,
  147548. 0xb6b5c8f9,0xa2e23e8d,0xcf34c3ee,0x345a2839,0x1b973ee2,0x9bdc5461,
  147549. 0xbb24d1c5,0x65bda6c2,0x3c6141a1,0x97d52ba3,0x9d2eb201,0x47bb1612,
  147550. 0x21fbe49f,0x7c558a87 },
  147551. { 0x3f350fec,0xb9485a52,0x6a38d4c0,0x016678c5,0x0d5aa64d,0x8ef346a2,
  147552. 0xd96da2e4,0xb85daa02,0x4f647b3c,0x845ec4ea,0x0d5e946c,0xc0d1a6ca,
  147553. 0x4fa9f4ab,0x41d8d1c1,0x9c8b1303,0x43972cc5,0x434ffbfb,0x67e1f48d,
  147554. 0x819d2318,0x350ce93a,0x6ddef23f,0x49f53090,0x200cf12c,0x3c2e6cf9,
  147555. 0x640432fc,0x42691cc1,0x72496b52,0xbfff74b4,0x020a97be,0x44527c9f,
  147556. 0x7b3c4348,0x34cd7dca } },
  147557. /* 44 */
  147558. { { 0x59e7fe87,0xf031761a,0x0047cd72,0xb1eae31a,0xfae30f62,0x27902e68,
  147559. 0xb71db143,0xa666f48d,0x0e0038f4,0x75ee6678,0x02bdd76d,0x3b45ac67,
  147560. 0xa0d6cd5c,0x0d2fb828,0x9d8c5b11,0x27ce7f1d,0x120b5e96,0x141fe0e4,
  147561. 0xb9267c37,0x95a1b984,0xd60312cd,0x5206e589,0xda549356,0x1867342e,
  147562. 0x070c74ac,0x374520b9,0x9557b0b3,0x2703cbb5,0xa6ed8c14,0xf621f59c,
  147563. 0xabf7b887,0x7ceb1cc2 },
  147564. { 0xdb7fd65b,0x0647a5bb,0x36c9457c,0xd8d45cc0,0x9e12718a,0xc6da99db,
  147565. 0xe93a7fb1,0xed1dbbf4,0xbd1566a1,0x4512c95c,0xdbc0c919,0x4861ba00,
  147566. 0x9e7f5269,0x3c6cc298,0x0941aaae,0x67196150,0xc8c538e3,0xbfcf5d0f,
  147567. 0xa25a551f,0xad6e9929,0x17ca0f26,0x90710985,0xfa89ef7e,0x743b78ea,
  147568. 0x71ab4549,0x39d5ea31,0xe6d1c36d,0x7442f3f3,0x059d568d,0x25a683e0,
  147569. 0x227ced5c,0x1f629a99 } },
  147570. /* 45 */
  147571. { { 0xe45a1c3e,0x8925ddac,0x41f7545f,0x72d29365,0x37e7f828,0x45622fcb,
  147572. 0x3e4c79d2,0x88234513,0x9c2645d6,0x5dffaf84,0x994802b9,0x3078f4dd,
  147573. 0x9d339fa0,0x566927f0,0x9fd91dcc,0x9a500a1e,0x0ab0abd7,0xce008180,
  147574. 0x8194e5df,0xd97135a3,0x98adf088,0x9e876307,0x9a45a2a7,0x3baf01b8,
  147575. 0x788b4399,0x6fed6154,0xe77a997d,0x980e5722,0x2a378eed,0xaac90ffa,
  147576. 0x8bd805a2,0x4a75fda2 },
  147577. { 0x55e74cbc,0xd09a8fbb,0xfab18f25,0x737738ce,0x9764ec3a,0x0fc23ad6,
  147578. 0xe7e0ad31,0xc5a7d35b,0xe481cc9b,0xe75e068e,0x3d4aec34,0xf0c2ea99,
  147579. 0x0d4a63c4,0xf1324fe8,0x99b0592c,0x5dbb7c16,0xa7e0f46b,0x442d674d,
  147580. 0xa300faea,0x5a5d66c7,0x3333ac83,0xe83dc821,0x8c408496,0x70ef812e,
  147581. 0x99ef5fc1,0x96e1dcb6,0x1734e862,0x6e2b771b,0x583507d8,0x04629cdc,
  147582. 0x23d8179a,0x5819f9ae } },
  147583. /* 46 */
  147584. { { 0x6aa78811,0xd9969121,0x2103e7c3,0xf64ee8f4,0x22b9e698,0xddf01070,
  147585. 0x4f582cde,0xe6001f9e,0x2ecfac1a,0x24a608af,0x06393009,0x6ef4c784,
  147586. 0xebf72911,0x5262eae6,0x8c4ee5a0,0xddbd0af5,0xecd87bc7,0x875aff90,
  147587. 0x6f24f114,0x2fddb34c,0xe865f172,0x48104281,0x886c1b9a,0x95692426,
  147588. 0x9ef4231f,0x6f5f3208,0xd0a7e82e,0xaf587acf,0x9ac395c8,0xd6571917,
  147589. 0x1364a750,0x7459603c },
  147590. { 0xf41ae519,0x1c2475bf,0x4af8f251,0x34401fb1,0xaefb2c3d,0x70ddfcd2,
  147591. 0x51cdaf08,0x9b2d385b,0x8208bb19,0x8531c256,0x4c33f3f6,0x16c89df6,
  147592. 0x24571769,0xc23cfa99,0x86d010ba,0x2339b51e,0x22638313,0x08db0e8d,
  147593. 0x00fedeb7,0xf769e179,0xa3687ef1,0x3fd96dcb,0x91476475,0xcd046b23,
  147594. 0x0c45c8dd,0xf3ff2064,0xb8343d78,0xefd167bd,0x4b77ee90,0x493ccb6d,
  147595. 0xb3cf7b45,0x33025513 } },
  147596. /* 47 */
  147597. { { 0x35eaaca1,0x36f00469,0x89119102,0x0c384b75,0xe6d2954c,0xcb375665,
  147598. 0xb1e9d6d7,0xcb9199b9,0xc29c2757,0x75852349,0xb8e738d0,0x89cbd1ba,
  147599. 0x5923a427,0x9b8dbe90,0x18fe1889,0xa237793e,0xa742e083,0xa4271757,
  147600. 0x4eebd613,0x8c4979d2,0xd4f2cf77,0x40325054,0x958705de,0xa3b8a091,
  147601. 0x33d999ba,0x1b191bd9,0x3b0fee1e,0xbafefba4,0x3facdf14,0xb3bad184,
  147602. 0x4387561c,0x9328adb0 },
  147603. { 0xf906b872,0xabe84e80,0x78262665,0x705523a0,0x3398ccf7,0xd89c6a7e,
  147604. 0xf55b5323,0x2fab551d,0x0554dea8,0xa0578eca,0x375589cd,0xef26523d,
  147605. 0x864ad750,0xd8fd6242,0x178fe1fe,0x93f27fc5,0x9df87422,0x7b3e6f30,
  147606. 0x3750d054,0x2862e49e,0x5dc038a1,0x7d90c6b2,0x84db682b,0xc1a1ae22,
  147607. 0x9881930a,0x47f3dab7,0xbaf3e0a4,0x30e6bd52,0xf62d25c5,0x0680025b,
  147608. 0xadd0d5e7,0x0aa1f3cf } },
  147609. /* 48 */
  147610. { { 0x22a10453,0xa9822190,0x2a03a10b,0xdd1eb91c,0x96646f3b,0xafbb5d95,
  147611. 0xf38b6fc6,0xa58de344,0xb8cfca1d,0xce47c3e5,0x0f70da04,0xfcd8e16d,
  147612. 0xda262ed6,0xac44349b,0xc56e2f8e,0x9320d87b,0x19138e58,0x9ce3ea08,
  147613. 0xa2b236c0,0xa5862dff,0x8e7efb0d,0x6b0f9a5c,0x16ac78eb,0x4b53432b,
  147614. 0x709b51af,0x6ff43105,0x8f519628,0x08e236f8,0xeed403ad,0x1f93f176,
  147615. 0x9636545e,0x559337e0 },
  147616. { 0xd8fd807a,0x30ddf738,0xab131222,0xf4e0ec9d,0x625afbc3,0x14a2f4db,
  147617. 0x9f12f895,0xd5b70604,0xac3044fd,0xb46f3c23,0xf540148f,0x1b232d1f,
  147618. 0x39b4e554,0x61b458f5,0x0dd70b75,0xf694b24a,0x289581d9,0x0fc64299,
  147619. 0xee5fe22d,0xc05d49be,0x6a18bf63,0x7af3447f,0x7f1929d6,0xe96a1dc2,
  147620. 0xc1551e8c,0x6afe6028,0x2b5d4fa2,0x27dacaf3,0x545c2cb4,0x4a1631bc,
  147621. 0xb0c914d3,0x930070f9 } },
  147622. /* 49 */
  147623. { { 0x69a9bc05,0xd2f32c5e,0x589c4b73,0x0a5c19c6,0x94665f9c,0x095c9e5e,
  147624. 0xbcfb4c39,0x8ab0f293,0x1ddb7c31,0xb9070877,0x66b38048,0x894e9658,
  147625. 0x606bd9bd,0xf19a90cf,0xb6fd2d69,0xcc1d58df,0x461d8a69,0x886dcc4e,
  147626. 0xf9ce4831,0xc455c277,0x765f8a82,0x749a5996,0xc3badc8d,0x2ffc668c,
  147627. 0x9112cdab,0x38018396,0xb243c7cb,0xa98795c3,0x010a2224,0x8775f310,
  147628. 0x587b5e14,0x043a2141 },
  147629. { 0x3a873752,0x7bbe9dbc,0x2f442fee,0xee1493f4,0xc18c2181,0x981ca2c8,
  147630. 0xe29769e7,0x00ce3090,0xde768c5f,0xb4626ac8,0x34d7677e,0x33e9ce46,
  147631. 0xe0fa94e6,0xf89c2cad,0x41f5b5bf,0x04f5cc11,0x2228c12c,0x2565f736,
  147632. 0x0c05cce5,0xf1bf706a,0xbe487c4f,0x5d07ffff,0xa499f1a4,0x3ec43c09,
  147633. 0x98d94800,0x4f4e79bb,0x073f12f8,0x8a335a16,0x0f970d6d,0x4bb5eaf7,
  147634. 0xf24d0ae8,0x18d0747b } },
  147635. /* 50 */
  147636. { { 0x84601faf,0x58d3c77c,0xaf1c1f72,0xc9465be2,0xd116d806,0xff626798,
  147637. 0xd5b0d93c,0x3996c0c6,0x5ec6723a,0x2fa1ad75,0x03ba5349,0x966a8144,
  147638. 0x2ac34d8a,0xdc4c9422,0xed675865,0xddf471de,0x953d528f,0xd8aca597,
  147639. 0x24ebf67d,0xb2e463b5,0x7e25b4d3,0x25824871,0x43159daa,0x23c5adba,
  147640. 0x83357540,0x5458f9c6,0xf938b1a6,0xcf685da7,0xcefed231,0x981a4fda,
  147641. 0x08bb5e59,0x711093ed },
  147642. { 0x401f161a,0x12aa3fc6,0x974c5e87,0xf7358560,0x17b5df82,0x4aa252fb,
  147643. 0xa48e6299,0xb0b82b07,0x29dd847d,0x00234157,0x4529c5a6,0xf1e54d00,
  147644. 0x6d98f538,0xcc1c539e,0x28d3abcb,0x36162b53,0x2a84f0cd,0x75a37938,
  147645. 0x4dee7484,0xf717a81b,0x4c23bf1b,0x16cf35fb,0x787e8b3e,0x7fd1c29f,
  147646. 0x59b79ab0,0xb7da7e68,0x85f6c60b,0x072100a0,0xe7ed48b5,0x31840159,
  147647. 0x4d9c97d4,0x17898bda } },
  147648. /* 51 */
  147649. { { 0xae1b8cf8,0xcd8483d8,0xe9a28856,0x323d4b42,0x204a4bc2,0x7633584f,
  147650. 0xca7a69fa,0x4e0b2228,0xf757bab2,0x8afbda8b,0x6cc5f9ca,0x85b24088,
  147651. 0xd41a95c3,0x47fb4813,0xc2aabe6b,0x3f1bc53c,0x1ad1599d,0xf22cda3f,
  147652. 0xc31ea9b1,0x1b2ec081,0x01614ac1,0x048f304b,0xc6afa7ab,0xce31cee9,
  147653. 0x4140dc3d,0x55af7633,0xdce8abba,0x84b7ab37,0xc7cf3efe,0x50de7648,
  147654. 0x15356ab2,0x73a88dcf },
  147655. { 0x06e83b39,0x3f868288,0x9f44037d,0x477a4413,0x17dbc841,0xf9058b0f,
  147656. 0x54d17549,0x2db64f4f,0xf2307ffe,0xa23cea6a,0x4f126261,0x393efd55,
  147657. 0x10f37f26,0x2f4e658a,0xf4ee1e35,0xa4437ce3,0xa93cde8b,0x64ef42a7,
  147658. 0x939aa901,0x1debc9f4,0x3d7b5cd4,0x44223d6a,0xf88a3acc,0x789a6a11,
  147659. 0x2c608a2d,0x56fb9df8,0xbbf56c06,0xe79db8e3,0x668fa300,0x73c56af2,
  147660. 0xae396a1e,0x52f32b17 } },
  147661. /* 52 */
  147662. { { 0xe714f71a,0x56f524c1,0x9add8519,0xc1be1262,0x65cadbe3,0xad9189d8,
  147663. 0x5a0fb649,0xd88bf5c8,0x21d192d9,0x9efa6a92,0x6f724b6f,0xe3fe8389,
  147664. 0xb250119c,0xec3fae24,0x2ae0d3c0,0x4b6af9f6,0xd619624d,0x8fceba0b,
  147665. 0x2fdb6e3a,0x7dc3092b,0x3263cd29,0xc91da376,0xf95c43bd,0x30c0761e,
  147666. 0xcdeb44d9,0x89136400,0x43c0d31d,0xfd7dce84,0x9871899f,0x78fec3b1,
  147667. 0xefdf58c1,0x79e14d28 },
  147668. { 0x9bb40c55,0xe3822235,0x0ed07a42,0x0a27202d,0x4838c1f4,0x48e6c1a9,
  147669. 0xd864a78e,0x2b5f24a7,0x0c6c55c9,0x7e7f140a,0xce12d508,0xe62c104a,
  147670. 0xc11b1e10,0x9b0a1a7e,0xafbb3dd5,0xfd8a275f,0x9a3b6b30,0xdff354fe,
  147671. 0x46602a01,0x5a105d9e,0x93bb65f7,0x3d371b4d,0x0f82fdeb,0xda5cbf0b,
  147672. 0xde468545,0x4601229b,0xc73d517e,0x505e10b9,0x672ff492,0x77cfa541,
  147673. 0x99566ce2,0x0d8ec28a } },
  147674. /* 53 */
  147675. { { 0xcbeee995,0x014cf73e,0xd491e80c,0xb2eb88bc,0xd9aba5d4,0x615a6cad,
  147676. 0x9304c84d,0x2f7d4633,0x8ab03c9a,0xba0501d2,0x91babb94,0xc8f723de,
  147677. 0x50405772,0xc885f977,0xc7fcb094,0xb5e1d2b3,0xdf96c71a,0x61ee7995,
  147678. 0x3464499e,0xb8c8daab,0x5f607932,0xdb425ddd,0xb1243587,0x70251ca1,
  147679. 0x9fc74340,0x26d7d3be,0xc902ac89,0x8c179310,0x4559a74f,0x72522c15,
  147680. 0xc3734afc,0x86001e27 },
  147681. { 0xe7693947,0x13b00ba5,0x012c062b,0x6478641e,0xe85490a8,0xe1a438e0,
  147682. 0xd9574d5e,0x5173dbbf,0x9bd3ba61,0x9532eb8c,0x5f3ea075,0x1f41bcb8,
  147683. 0x8cbb92b9,0xac1cc247,0x1ef901b4,0x0f34648e,0xd2b3b2ee,0xdd929d1e,
  147684. 0xc3d75bfc,0x470f1eab,0x139cf4d2,0x5cdbc6f7,0xf0424953,0xcd86454d,
  147685. 0x47fcb383,0x1e079812,0x17df930c,0xb9f209b4,0x114ebc00,0x4225fc31,
  147686. 0x347946c1,0x020591cb } },
  147687. /* 54 */
  147688. { { 0x275e0af4,0xe3003721,0xe78a4a4b,0x721141ef,0xd1757485,0x666cfcf6,
  147689. 0x168e659e,0x5fa1d737,0x0e2842ee,0x263e3e54,0x948bd5f6,0xadecc3d4,
  147690. 0x246b104a,0x019de03d,0xf343d818,0xf8a9e903,0x5b0c0d31,0xcb57ba4a,
  147691. 0x51e2765f,0x8246c506,0x6519bf67,0x80c5751f,0xf2119a01,0x5f05c200,
  147692. 0x7821d4f4,0x7e6487b8,0x261c3a06,0x262f94aa,0x72146052,0x56cfe489,
  147693. 0xa1df05ef,0x5119985f },
  147694. { 0xb18586c0,0x5819497d,0xc6eeaa62,0x004415d6,0x97cda28b,0x7c6a46b6,
  147695. 0x7c194594,0x9a149b28,0x4ed3a506,0xb56369fa,0x43c94cb4,0x7092aa66,
  147696. 0xa9e9eee2,0x55bce73a,0x77893509,0x34bb2870,0x06eb5326,0x8af95fb0,
  147697. 0x9638f485,0x87cd0323,0x5ba75bf8,0x29376268,0x9d42d581,0xf32d6f3d,
  147698. 0x65c6d64d,0xa4cad574,0xb2cded41,0x985f50fb,0x9006a067,0xcf34ce0e,
  147699. 0x58a57f9a,0x59eaf265 } },
  147700. /* 55 */
  147701. { { 0x6ec3876f,0x7b407efb,0xf0f48648,0x780c6123,0xbf893039,0x2abb56ff,
  147702. 0x45a91ab0,0x9592eaa0,0x78811b82,0xce5b84d7,0x1f9f3fc9,0x86a71a34,
  147703. 0xf0e7e13b,0xc17fdd86,0x655a0880,0x88ed8297,0x81d5e666,0x75d6dc74,
  147704. 0x1d171797,0xeffc9df6,0xe3f79e1f,0x36ad4c8d,0x2046192e,0xdb15317d,
  147705. 0x274fda62,0x78c9fa7a,0x82dd9914,0x04ec924f,0x3a64971c,0x059d1e38,
  147706. 0x2620bbfb,0x3b4450ea },
  147707. { 0xc776dcdb,0x3db7a955,0x81c8ba47,0x35c4a57c,0x505760fb,0xae285003,
  147708. 0xb3aec353,0xe3e80691,0x47117be5,0x380335be,0x056ccf61,0xe1c47e3a,
  147709. 0x33977916,0x253cfdeb,0xf5cb7ee1,0x3decdfba,0x7cf4b704,0xf3c9794f,
  147710. 0x9ff81462,0x2401680c,0xbe3daa9f,0x4e440e11,0x69f91d8a,0xc5d04377,
  147711. 0xcb5e9c5d,0x4106c7a8,0x33b7d24d,0x191909a1,0x3764b4a2,0xe893c838,
  147712. 0xc429b614,0x4a7fe30c } },
  147713. /* 56 */
  147714. { { 0x2455c7c5,0xe78f3a70,0x70157754,0x5b7636e8,0x7623262c,0xf32c4524,
  147715. 0x1bc780c7,0x2c98b11e,0x915ed877,0xd48eaeac,0x199265f4,0xbb04d3c0,
  147716. 0xcfa5200f,0x6b52b19b,0x93ea3fe8,0xc46a0981,0xba758059,0xd82c733d,
  147717. 0x1896aacc,0xd324bbd6,0xce8ecd51,0xac09a2fc,0x02fc44b3,0x529918fd,
  147718. 0xaaa1784b,0xf0c45e4a,0xfe22085c,0x35626340,0xc50c7d61,0x53cbb676,
  147719. 0x65126b23,0x83fa1ea3 },
  147720. { 0x10ccc646,0x60ac86da,0x7b0451e9,0x2ce0637f,0x8a088610,0xbbbcf630,
  147721. 0x20349982,0x23c19019,0xfc0bcda0,0x707fc39c,0x1bd4fd7d,0x7f4d1f15,
  147722. 0x44713bbb,0xd6a64e74,0xc5ac9e60,0x57bdc676,0x37b61169,0x456c5303,
  147723. 0xdcf40a1d,0xd3451396,0x4997d2c7,0xf3edec25,0xc2c4a739,0x534ae9a4,
  147724. 0x6a6ad2e2,0x1401397e,0x23e95f81,0x20769d4d,0xde98fabf,0xcee007c6,
  147725. 0x931c51e0,0x61409779 } },
  147726. /* 57 */
  147727. { { 0x15156623,0x3ddb32db,0xab7a67c2,0x68137fbc,0x6f19e3c2,0x26011f50,
  147728. 0x89924c61,0x34218b02,0xc6804c1c,0x492a0b0f,0xafaae6a7,0xd65be706,
  147729. 0x0d01be61,0x3b13d23e,0xf87f4c69,0x44545b47,0x04dc1aa3,0xd42236e2,
  147730. 0x3c5161ec,0x6135261d,0xbd88bc07,0x1eb46a63,0x1599d720,0x78c6d836,
  147731. 0x69baf0f3,0xf6955fe1,0x17072820,0x467eebd6,0x3e3a340a,0x2f1b8a2a,
  147732. 0x2d0b5f88,0x636dac76 },
  147733. { 0xb4c80af3,0x94280db9,0x4e3892ab,0x9a189cd1,0xd1477ddc,0x26e702e0,
  147734. 0x68f9f14f,0xe91aee38,0x80baa0b2,0x2864f63a,0x8b714a29,0xacd81f73,
  147735. 0xc5fe7cb6,0x30e1b870,0xb10837fd,0x883ea1c3,0x6b20489f,0x2da27953,
  147736. 0x58a2da5f,0x3aeb2a68,0x03a8fa14,0xe2330bf2,0xdc70b1c4,0xb5c488b5,
  147737. 0x299678f4,0x0a78c4d9,0x25df675c,0x233bd098,0x7b67d368,0x37b5c076,
  147738. 0x4d0bef3f,0x2f6dbdfe } },
  147739. /* 58 */
  147740. { { 0x2e4da7c7,0x2f8472fd,0xae677932,0x708cfc91,0x3dc268e2,0x364af08a,
  147741. 0x799a2424,0x0f10dfe0,0x71d58bff,0xef912d58,0x988962e6,0x6bf35dfc,
  147742. 0x5f47ea0a,0x28b96fa9,0xaad308c1,0x734a79ea,0x9f437bba,0x95730337,
  147743. 0x6cf54f75,0x002cbd8e,0xe7632eec,0x47606dcf,0x53193104,0x404b5ecb,
  147744. 0x0acf729d,0x0ae0897c,0x3bddf1de,0x89628b86,0xf87d7448,0xeced154e,
  147745. 0x458d5d4e,0x5cb6e197 },
  147746. { 0x008c75ed,0x98cef197,0xf6eeaaf8,0x7cf49d3e,0x1875e96d,0x1d6f9e02,
  147747. 0xdd9b0d8a,0xfcec2cfe,0xb9576daa,0x38a61cfe,0x36a7dbb8,0x10003f39,
  147748. 0x23b814f4,0xb37c3868,0xb80e3153,0x9fb66dcb,0x059847a8,0x9e7e2eba,
  147749. 0x35a72770,0xa4ec63fd,0xfc9e0ed0,0x311f3d91,0xd515baa4,0x3c1dc094,
  147750. 0xa08cd4e3,0x75a06ebc,0x2ed5eeaa,0xab617238,0xe1f52c1f,0x2e82bbb0,
  147751. 0x5175d6e5,0x2149d630 } },
  147752. /* 59 */
  147753. { { 0x5f9311f6,0xee1a8e6f,0xbabc1f85,0xc97e3c9f,0xb494209a,0x4fa7c52e,
  147754. 0x19774fe1,0x04c2f51c,0x8555844f,0x5cefd122,0xb5873ab3,0xb53862a3,
  147755. 0xcbed19fc,0x768efdd6,0xee58469a,0xcdc12479,0x3d80c09c,0x11237e31,
  147756. 0xc044c28c,0xdd74a290,0xbd47e287,0x9ee6517a,0xad0ffeef,0xc2421228,
  147757. 0x818d281f,0x4273088f,0x43ec0de1,0xebc744bc,0xb415bd73,0x5b26eccf,
  147758. 0xcb07c26c,0x14e2f350 },
  147759. { 0x4216946b,0x548d2a10,0x7a4bd92d,0x6e801f07,0x43695160,0x5996d0a3,
  147760. 0x63a197c9,0x0f1b5c2f,0x061f77c9,0x79da3c4f,0x93ff7b22,0x1c1cd634,
  147761. 0xa234123f,0x5e61b650,0xf284033c,0x826b34c5,0xc2f34214,0x718b90e8,
  147762. 0xae806ec5,0xa5f35620,0xe324a9b4,0xa2fae345,0x8b53cb51,0x8c0bb95e,
  147763. 0xf9965778,0xc94f6ac2,0x6b9def32,0x07ec607d,0xd0ed8f27,0x63bf1dba,
  147764. 0xdcb61e4f,0x58537e02 } },
  147765. /* 60 */
  147766. { { 0x64f80ba2,0x1f64b064,0x0559a45b,0xe8e055e7,0xf1f4b634,0xc3262b34,
  147767. 0xde8c8482,0xef4f7d5f,0xc30c780a,0x9d55dea0,0xcfa1e693,0x1740afb9,
  147768. 0x7460c34b,0x2cfe6a66,0x1187c1ee,0xf6695941,0x5f974d94,0x1382f277,
  147769. 0x004549eb,0x1ca0ace4,0xbabded02,0xf8244b3f,0x4e3653ea,0xc36f4d06,
  147770. 0xc55c5f83,0xeab9f0dc,0xacebce90,0xd93b9cef,0x19061425,0x16658e72,
  147771. 0x82d7970d,0x4857835f },
  147772. { 0xd2576210,0xdcd525bc,0xd51b5443,0x9f378aa7,0x1bd83994,0xfe97bf17,
  147773. 0xf38ac621,0x930d0f63,0x818408cc,0xaf8f2c17,0x260f53f6,0x2692c87e,
  147774. 0xdb0a75e4,0x0ee45407,0xffdb1b37,0x0ec47ae5,0x7aa6a44b,0x769129dc,
  147775. 0x2e40b75d,0xb6f932b2,0x95ef3b77,0xe06764d0,0x68bc63e8,0x28fd47f5,
  147776. 0x9c0014c0,0xd1810494,0xd7995d8e,0x90e2d3fd,0x6c2a85af,0xeb39a05d,
  147777. 0xa21f3128,0x6c0277bd } },
  147778. /* 61 */
  147779. { { 0xb509e7ef,0xe41b7086,0x3d7f9f91,0x8842ec7b,0x5526b88b,0xcd285f94,
  147780. 0x051dd0ab,0x6e44e064,0x774f1ceb,0x90198c10,0x123e661b,0x6ecabe98,
  147781. 0x32f647d9,0x44811136,0x26c52aee,0x1dd82b45,0x939dc9d5,0xd650907f,
  147782. 0xfcd455bf,0xbd5eeef2,0x8d2e5d7c,0x7815a4dd,0x88bc9f2a,0x5ad4ec92,
  147783. 0x57a3b322,0xc6f10d0b,0x20b9cbdb,0xe8d0c1e7,0x9b774ee8,0x5a0b071a,
  147784. 0xf22fcf8f,0x3067bc9a },
  147785. { 0xb7ca9326,0xe0e589f2,0xb1224f63,0x17a106fd,0x747a57bd,0xb2354521,
  147786. 0x62b0882e,0x2614982d,0x4391ffcf,0x7f3af544,0xa84e440d,0x1aaa337b,
  147787. 0x941bb071,0x28ea37b0,0x2e4a7f54,0xa957dcb4,0x1a6ad5fb,0xe7ab662c,
  147788. 0xf7c36a20,0xd135e381,0x9baa0b6b,0x42e7980c,0x94e4671f,0x4237030c,
  147789. 0x8b0922e3,0x24cc63ff,0x445a589f,0xd10d5279,0xa870ff6c,0xbb99d316,
  147790. 0xa996c195,0x390c83ca } },
  147791. /* 62 */
  147792. { { 0xffc4a73f,0x50d3fa82,0x3bd53303,0x2665d635,0x264bb77d,0x80a06f8a,
  147793. 0x22d73d84,0x81c04a6e,0x0323b8aa,0x2409cff5,0x8c4c4d5a,0x31dce217,
  147794. 0x0c0f9c19,0x374aa80e,0x00186bb8,0x0b25a387,0xaaf1487f,0xd0b77a10,
  147795. 0xab498de1,0x15f39ad5,0x1aa0c116,0x92e32da6,0x96e25ce8,0x228e3dbd,
  147796. 0x5e8646d1,0xb57c88dc,0x267b1c68,0x672b1164,0x600bdec5,0x5d0d807f,
  147797. 0x223e573a,0x3ea4007d },
  147798. { 0xa595d0a3,0xd76debd0,0xaff0b3b4,0xa6bd76cb,0x9b1bdb97,0xbf2c154f,
  147799. 0x4c714c71,0x62b19ab4,0x221af663,0xc9bf33b9,0x8c941ef6,0x23d87c49,
  147800. 0xd79f0f6d,0x255804c3,0x2a7acbc1,0x6f1a1005,0x550528af,0x5dab79d9,
  147801. 0xc8d16213,0xfd77a6f0,0xde5e1029,0x40508b6d,0xf95da12b,0xd95ac0f2,
  147802. 0x758a8ba1,0x8860af71,0x7160c8fb,0x0b194c83,0xce004d34,0xa40e6c80,
  147803. 0x6b14aaa0,0x09f82a17 } },
  147804. /* 63 */
  147805. { { 0xc21366dc,0x60abe588,0xaf75daf9,0x729c0a4f,0xacb93ed4,0x70501fd9,
  147806. 0x87a16d70,0xb97e744e,0x98e7361b,0xa42e0a7a,0x28b54cf3,0x1acdaff2,
  147807. 0xb7bd9078,0xf087ccbb,0x663250e7,0xda6f3983,0xbaf07c09,0x66d693ee,
  147808. 0x8cbaf157,0x79baf4c3,0xdfca99d0,0x5a984e07,0xf26d8dab,0xab4d3247,
  147809. 0x7eba36f9,0x4d0be701,0x0e8dd216,0x37bb9e65,0x531c4f03,0x72aa4e24,
  147810. 0xb753d85a,0x77d1e984 },
  147811. { 0xd8e62367,0xd9373239,0xb9820cf1,0x3361848b,0x5a9c97c4,0x00c7e344,
  147812. 0x14f960fc,0x9a0ec9ae,0x740474b5,0xcf41f0cf,0xece065d5,0xa5eede8f,
  147813. 0x9e808610,0xb1de5a4e,0xae0cf75d,0x17c44ae4,0x6b148d0b,0x2fa56323,
  147814. 0xd29ff2dc,0x64fa740f,0x88cb212e,0xc605eb8a,0x6a863016,0xf2c771ad,
  147815. 0x607b4c17,0x6d6112e7,0x40d49785,0xfe90ec07,0xe256e0e5,0x599be18b,
  147816. 0xca54adb0,0x4e6eabec } },
  147817. /* 64 */
  147818. { { 0xfb99cfe6,0x950323d3,0xc9334178,0x7b09bc26,0x7cbdfb6f,0x64111e41,
  147819. 0x89a75760,0x91141744,0x10919cb0,0x4c633df9,0x396bfd2f,0x715fc7c7,
  147820. 0x8cab62db,0x8ca19512,0x4db81aac,0x30672473,0xb4c4c54a,0xe67a246b,
  147821. 0xbf229646,0xd77ea0fa,0xfa5b5d70,0x5bed15f1,0xc2f192f3,0xa5686da5,
  147822. 0x7f6690ad,0xdecac72a,0xcaa50b7d,0x0c4af2a2,0x6049ad2f,0xf44631c1,
  147823. 0x04ecf056,0x325d2796 },
  147824. { 0x4848c144,0xee11fb55,0xb6a7af32,0x4e062925,0x369e0f9a,0x125b68e1,
  147825. 0xca53b21e,0xad9bdae6,0x2e98ea1b,0xf50d605c,0x9f2fa395,0xbdb9e153,
  147826. 0xe91532f5,0x4570e32d,0x46a250d7,0x810698ae,0xad9d9145,0x7fd9546c,
  147827. 0x11e97a5e,0xabf67721,0x249f82e9,0xca29f7d5,0x9851df63,0xa9c539a9,
  147828. 0x71d0e3e5,0xfd84d54b,0x041d2b56,0xd1e0459c,0xfd80096a,0xceb3eb6e,
  147829. 0xe32a79d3,0x19d48546 } },
  147830. /* 65 */
  147831. { { 0xb540f5e5,0xfe19ee8f,0x04e68d17,0x86d2a52f,0xadbdc871,0xd2320db0,
  147832. 0xd03a7fc8,0xa83ad5a8,0x08bcb916,0x54bf83c7,0x2e51e840,0x092133ea,
  147833. 0xcb52dddf,0xbce38424,0x31063583,0xd5c7be40,0x458e3176,0xc1ebb9df,
  147834. 0xbc4dabbf,0xafb19639,0xc05725a8,0x36350fe4,0x84e1cd24,0xac4a0634,
  147835. 0xc145b8de,0xadf73154,0xb3483237,0x0aa6dd9e,0xcbff2720,0xa3345c3d,
  147836. 0xb4e453b0,0x1b3ace6c },
  147837. { 0x90a8bdc5,0x0343e5e9,0x6306a089,0xa203bf9d,0x8e48520e,0x98489a35,
  147838. 0xde7d1d06,0xbd17debe,0x5f795d3f,0x8fafa6d7,0x387b0a3f,0xa4ceb630,
  147839. 0xffddeafa,0xe0166b32,0x7e764e02,0xa2fe2054,0xe871f304,0x55ab9824,
  147840. 0x952ec45e,0xa2bd36bb,0xa90d20ca,0x7b4c1484,0x75bcfb53,0x5319f387,
  147841. 0x6982c4e5,0x34238a4a,0xa102921d,0xa2bb61c7,0xdb3ab17e,0x1e061b64,
  147842. 0x192f0a14,0x538ec33e } },
  147843. /* 66 */
  147844. { { 0xa19b56cf,0x193496fe,0x7bb99acd,0x663d77f4,0x57d0a881,0x8f04afa8,
  147845. 0x082835fd,0xcced3da2,0x5d82cec7,0x7e21faed,0xf8009c85,0x6e175b99,
  147846. 0x2d05a307,0xd9c6e31b,0x81487d82,0x96948d4a,0xd46f6655,0x86ebd3f2,
  147847. 0x773ccc49,0x86851aa8,0x8b1640a6,0x3e220f22,0x41a20b75,0x9f06e3a8,
  147848. 0x90ac0a6f,0x2cfffe5e,0x8ebeb3fb,0xf5a9b1da,0x6e08e2c9,0x2587d997,
  147849. 0x03e9f401,0x6fd60298 },
  147850. { 0x8eb7516a,0x54709f8d,0xbdc598ab,0x83058a74,0x87e801ce,0xd234dd98,
  147851. 0xd17b8a96,0xfd0f9d90,0x6e90f6ab,0xaa1e549f,0x5a7ed55b,0x2496ff80,
  147852. 0x6c254c19,0x0d9f657a,0xb8962575,0x3cdea49c,0x2dff27de,0xb685a3f0,
  147853. 0xdb8bc04b,0x3c50e7fd,0x987236b0,0x904ff0ff,0xbb0d5055,0x494298fd,
  147854. 0xe14be8d0,0x34b3386d,0x7c3d30d6,0x7ad34e9c,0xe159fdd9,0x1f2b32bd,
  147855. 0xc761e5c0,0x84cfa23c } },
  147856. /* 67 */
  147857. { { 0x8b99b964,0x13bc11eb,0x58e2fc47,0x8e280c0a,0xd4c9a54b,0x870fbc49,
  147858. 0xbf6e20fa,0x37a334a2,0xd7c88cfa,0xee583d0d,0xef4af1da,0x05e029a8,
  147859. 0x0c2ef8a6,0x6d55e234,0x209e9b62,0x61b6fdfe,0xbb8e080f,0x3b1dad26,
  147860. 0x9392fc1a,0x5adbc162,0x0aae3f4e,0x02ac0fe6,0xc2bf4d5b,0x8d99801a,
  147861. 0xc282fed2,0x2333f93f,0xb52db33f,0x16dcb10c,0xc55752e7,0x09f90f84,
  147862. 0xc84a0d8e,0x287d4c51 },
  147863. { 0x0e9867da,0x5fa58201,0x1a874cda,0x614589b3,0xfbdee22e,0x005e27c5,
  147864. 0xe612bda8,0xe357fef5,0x2d3635f9,0x4e0dbedf,0x6f125a86,0x62be70e4,
  147865. 0x0d94a2e5,0xa09b9884,0x28b5e5d1,0x7eb99a15,0x751028b5,0x21b9416e,
  147866. 0xe06d2cc4,0x1b137fd7,0xfea09845,0x6fa1f517,0xffcecbd7,0x3ba1e966,
  147867. 0x832f453e,0xd4c89a4a,0xeca68fa1,0x07b1e2af,0x4bd395a3,0xd0fb4453,
  147868. 0xd8ef9e13,0x0132a3dc } },
  147869. /* 68 */
  147870. { { 0x576374c2,0xe53c7785,0x84727040,0xe60526d1,0x228ca044,0x8a066dc8,
  147871. 0xf1ce1313,0x1fe1c1b2,0xcdeb0c5d,0x2aeec832,0x9cbf826f,0xa7596699,
  147872. 0xde77a589,0xcd188e81,0x118d1254,0xe5ce0fe0,0x0790b86a,0xa142a984,
  147873. 0x39ac28ce,0xe28f043f,0x87de5804,0x4eef8290,0xf639a8c5,0x83c31b32,
  147874. 0x5887794f,0xd70454a7,0x18b1b391,0xca635d50,0x31d9c795,0xcefea076,
  147875. 0xb6f8aa25,0x13cbee76 },
  147876. { 0x8d3f34f3,0x79cabe0f,0xa3617fe3,0xbda9c31c,0xdd9426a1,0xb26dee23,
  147877. 0xf29c9104,0xe9dd9627,0xe2c6cd3b,0x033eb169,0xfcba2196,0x8a73f492,
  147878. 0xb858c83c,0x92e37e0b,0x23b3fbb7,0xe4f2aca6,0x64be00a2,0x8101fb1e,
  147879. 0x948f6448,0x91a7826a,0x907260e7,0x414067b4,0xe30bb835,0xf774aa50,
  147880. 0xc999c06e,0xf922ca80,0x0ba08511,0x6b8635b9,0x25fa04f0,0xbf936b5c,
  147881. 0xe02e8967,0x4e0a1ada } },
  147882. /* 69 */
  147883. { { 0x8ba29c4d,0x00ca6670,0x22988094,0xc08240ce,0x16dda752,0x21c5ca67,
  147884. 0xabbbfa34,0x689c0e45,0x3ed28b72,0x1d7545fd,0xd7c56ab4,0x5f221198,
  147885. 0x38759d65,0x4b3d8f74,0x8fe50b89,0x93490dfb,0xe80eba16,0xb641f5d7,
  147886. 0x79acb537,0x7b0da5eb,0x0c1d5e5e,0xab6b1497,0xa5da429a,0x2338e68d,
  147887. 0x2f6d2f25,0xe010c437,0x6530f3a7,0x226f16d2,0xcbef08bc,0xefb0f7b6,
  147888. 0x9f99c999,0x733e30d9 },
  147889. { 0xa42a38f9,0xecfe1582,0x4730b500,0xaec2d58e,0xde976b2c,0x2ee2f2a7,
  147890. 0xa969c1bb,0xf0539db5,0xfcecdb4a,0x31954168,0xe7a8e902,0xf2f7348a,
  147891. 0x3121541f,0x1d58d7cc,0x2202ae52,0x5d25b75c,0xf40835a7,0xdea9965a,
  147892. 0x529b4e46,0x3feb6a41,0xbd27ad9b,0x5c97fb6f,0x261f900b,0xd87554c0,
  147893. 0x04d5b19e,0xb43031d9,0xcb219b9c,0x33d5e9b8,0x3ee00bcf,0x7a43d492,
  147894. 0xb79a5c0c,0x56facb39 } },
  147895. /* 70 */
  147896. { { 0xa3018bfa,0x019165a2,0x9ffad984,0x100c6b24,0x55341a9b,0xbbf1b1f6,
  147897. 0x25dc4cc9,0xe6bd1d97,0x2bfffe60,0x52850ed5,0x7e5509ab,0x24e992cc,
  147898. 0x4ceb59f1,0xff6c502e,0x1aa7d148,0x2f0b3573,0xe7e3aa46,0xe90c1ddd,
  147899. 0xd1142880,0xbaec9f45,0x65be5dd5,0x475cfd26,0x1febce13,0x83abb14e,
  147900. 0x80942d30,0x6aba4829,0x297e82c8,0x1e1b235d,0x50d8218d,0xb771cdbe,
  147901. 0xd94d6cbb,0x88599266 },
  147902. { 0x155ccaf2,0x08847290,0x7c5b773e,0x8679ebc7,0xb2dd08ed,0xa88b2dd1,
  147903. 0x87d475db,0x960a180e,0x6694d02a,0x80fdb6b7,0x3f3f9e96,0x3e8758c9,
  147904. 0x4ad836c4,0xbda3f6fa,0x32fb387d,0x9400c581,0x2550200f,0x25a78542,
  147905. 0x776ecf18,0x2a97c351,0x566db59a,0x03ebf46e,0x26545eda,0x4743a280,
  147906. 0xcf74ab44,0xed169d84,0x88cb3f69,0xbaab931d,0xd8257196,0x70ae932c,
  147907. 0xa0c09719,0x797224a6 } },
  147908. /* 71 */
  147909. { { 0x441f3567,0x632923f8,0x2e24bf1d,0xc11c3168,0xb7671fff,0x4b97726b,
  147910. 0x7a5e1a22,0x601746a7,0x3addb417,0x53dddea0,0x7f59b846,0x57867a3c,
  147911. 0x56cd7ff7,0xb012a987,0xf19ba9a8,0x1bd5fec9,0xf8306748,0x750379a2,
  147912. 0xab8c05d1,0x7763445d,0x7903f42a,0x5d7f441b,0xa903e46d,0xc011674d,
  147913. 0xadd126c1,0x1b1d3c4d,0x61455b40,0xa2752aac,0x555c356e,0x4da42a68,
  147914. 0xd820852c,0x3ff09c15 },
  147915. { 0xf9cb7784,0x4c0a1bce,0x2422f305,0xaec539bc,0x0c414aa7,0x5f40f9fd,
  147916. 0xffd42bc4,0xd3aa316c,0x2f358e15,0x42f5a4c3,0xd6e27682,0x00bdcd9e,
  147917. 0xf8a5ecee,0x069f789f,0x05e14f5d,0x8078018e,0x8b40c741,0x2bb3e493,
  147918. 0x7917f72d,0x5dbc8c1d,0xcc57150c,0xe0eea664,0xc3fa8920,0xa25ecc5a,
  147919. 0x1c797164,0x3c21b0f5,0x634ad16b,0x8f09a2f2,0x58391d9a,0x8e730fc5,
  147920. 0x4fdfae4c,0x47ef1805 } },
  147921. /* 72 */
  147922. { { 0x3da285e4,0x9965f3d1,0x3a01e3f4,0xba7d4dba,0x61214ad0,0x4738413a,
  147923. 0x22397549,0xd3b7d535,0x5a730b92,0xa53dbdcf,0x332d165d,0x3130d92b,
  147924. 0x82f97ef4,0x44a28541,0x44dce1b6,0xbf62221c,0x7e2a0ec9,0xbba13858,
  147925. 0xcbfad998,0x33f32c8d,0xb5fed44b,0x409e5f3f,0xc66217bb,0x5c328c65,
  147926. 0xfcdf71a9,0xb00db69f,0xb8920788,0xa23c2a21,0x3ae6464b,0xf8ab28e6,
  147927. 0xb8de0861,0x1a6b6e9c },
  147928. { 0x06af77aa,0xaf6ec2b6,0xa887f065,0x2e60f5cd,0x9f498c56,0x87d21400,
  147929. 0xfcbaaf4b,0xdb595b59,0x271ab855,0x0fb592a1,0xd4349b0c,0xa0ce10e5,
  147930. 0x887d8c9c,0x9d6187d8,0x154bd6db,0x03ee95f9,0x5d06c999,0x8fe53213,
  147931. 0xfb6a64d0,0xf4a7bc30,0x66a4cb60,0x3d22af0d,0x5d37367c,0x16952cef,
  147932. 0x997d8e55,0x6f0ea734,0x731732d0,0xb447c70f,0xa9cb3942,0x00ab3034,
  147933. 0x28510fd0,0x79dd0180 } },
  147934. /* 73 */
  147935. { { 0x3ac7424e,0x04e0033a,0x60fda4d0,0xdb06b688,0xbcb772fb,0x236a9766,
  147936. 0xf297cda4,0x294a8e2b,0xdb013c6e,0x4b0aab85,0x8723a3ad,0x3d2aec98,
  147937. 0x13c84a6b,0x0cae32cd,0x70ec169e,0x21888f5e,0x42a88262,0x739633bd,
  147938. 0x7b60d9b8,0x68ac792e,0x10769fe1,0x89f2b722,0xd24bed34,0x8f3fcfe6,
  147939. 0xa3eb24aa,0xd35efb88,0x484c706b,0xddecfa3f,0x929ece0d,0x7cc119a9,
  147940. 0x8d405436,0x87e5ad45 },
  147941. { 0x7d1000a7,0xba99aa9d,0xae823833,0x8b94affc,0xdfb83dc5,0xc8229628,
  147942. 0x845a418d,0x2f59fe11,0x5d417054,0xa8b970f8,0x72b71581,0x8918c265,
  147943. 0xc0d1dd17,0xe4ef477d,0x3afad7c0,0xb50b4cf3,0x01870a5b,0x21baea79,
  147944. 0xbb3a2868,0xc77087f9,0x124a59cd,0x7857531e,0x57f43239,0xed74c26f,
  147945. 0x0164c94a,0xd5f5ae25,0xf094bf74,0x6608b7e2,0xfdceea32,0xf4cdb5ba,
  147946. 0x990cc045,0x0b712519 } },
  147947. /* 74 */
  147948. { { 0x88d5c64d,0x5a290ca1,0xa7492534,0x0596d749,0x2a00e925,0xa04b0d3d,
  147949. 0xcaf7b66b,0x082cd02c,0xecdded83,0x912b50c2,0xff31646e,0x813ce9de,
  147950. 0xc75fff95,0x62ae70c7,0x7e2a4615,0x6f6852e0,0x03804fd1,0x320fd7d0,
  147951. 0x8218e8d9,0xb1a2a4dd,0xafc645d7,0x4918a6fb,0xe8d9fdbe,0xfb080fa1,
  147952. 0x4470b6ee,0x33d4d08a,0x6d974ef7,0xd2ba2077,0x69dae5d2,0x8ecb95a7,
  147953. 0x7d69596d,0x7a3f423a },
  147954. { 0x9a929387,0x362d2ca6,0xcb1c1fff,0xabdb7581,0x7e51b6cb,0xd892ec9f,
  147955. 0x3a4e131f,0xee8d8632,0x5bd87561,0x4680e3f1,0xd4e7e732,0xe3a597e1,
  147956. 0x5581fefe,0x3cc72b7c,0xca8cae0b,0xf3e77f8a,0x5e2fd4af,0xfcc7d7dc,
  147957. 0x21355b79,0xdd3a4552,0xa2c07177,0x546b24f2,0x0689621f,0x415b532d,
  147958. 0x3f78163e,0x2be9af51,0x33d7ed21,0x27d63b9b,0x96802943,0xab019ef2,
  147959. 0x1623faf4,0x2da5fc55 } },
  147960. /* 75 */
  147961. { { 0xc8a5c600,0x62429cf3,0x3fe33e7c,0xa7a80c22,0x0a57ddcb,0x9ffda740,
  147962. 0x925b0c74,0xd1ae156d,0x6b100eb0,0x097a43f9,0xef943c81,0x169e945c,
  147963. 0x1128cf24,0xa1f734e5,0x419f0133,0x04387c4a,0x01044024,0xc007868b,
  147964. 0x90359cf2,0xe5416abf,0x478d54e3,0xf9c76fee,0x42a2173e,0x66219da6,
  147965. 0x9fe30141,0x61e03156,0x93ef247e,0xa0ff5ce3,0x072b6592,0x811792ba,
  147966. 0x70c854d3,0x855f0219 },
  147967. { 0x847314c4,0x61fbfb6c,0xeb45b96a,0x97906155,0x6ba2afac,0x7102e146,
  147968. 0xab949781,0xed51f975,0xc110c4fe,0x9d2f5b17,0xaff57667,0x7ac8ce70,
  147969. 0x6eb244e7,0xe7366a21,0x551c65c7,0xdd1bbcec,0xe1a859de,0xb525060a,
  147970. 0x8ba7d2e7,0x7a048174,0xab8ea8c4,0xe1a2c541,0x6fdff078,0x6e7824c3,
  147971. 0x14874b04,0x79b49fc7,0x06b1f733,0x22ae337f,0x6f8fe6cf,0x1c352192,
  147972. 0x525d0797,0x292236cf } },
  147973. /* 76 */
  147974. { { 0x7d8b29dc,0xcdb8d80a,0x08ea648a,0xd17a2024,0xae92be91,0x7db12c5e,
  147975. 0xfda72fbc,0x1f347d18,0x9e760c6f,0x11374b40,0xd8e38d91,0x7361e8f1,
  147976. 0x739ac1f4,0x7714be9d,0xb4df5c4e,0xc1f9701c,0x6f72cae1,0xd9138ed8,
  147977. 0x6ad180c4,0x1c7fe1f7,0x9e2dbf9c,0xf8c185be,0x7c70c44d,0x835db269,
  147978. 0xb0d15b5f,0xf997cfea,0x61e6545e,0x5101445a,0x25184e5e,0x16b06884,
  147979. 0x7521e7aa,0x7cfac359 },
  147980. { 0x3c0bc53a,0x81182167,0x7e751367,0x84b5ede3,0xa3657a18,0x3ca255fd,
  147981. 0xba1fdd98,0x096abbf4,0xc5da77d8,0x9ce8369f,0xaab342c5,0xf27b9ae7,
  147982. 0x972059f1,0x06c91bd6,0x914ecfe9,0xee0dab30,0x93f53f12,0xbb647fbb,
  147983. 0xffa57e0e,0x30c38a7a,0x9f2ad607,0x517d06ef,0xbb99dcc9,0x49728d87,
  147984. 0x446080a1,0xb0034af1,0x12b9c17d,0xcc810c3f,0x772a22a0,0x7225f14f,
  147985. 0x1ddf82bd,0x6ce3dc7f } },
  147986. /* 77 */
  147987. { { 0xa4397830,0xc07cd835,0xf4733306,0x4dd9290c,0x29989e8c,0xdd35d3a8,
  147988. 0x563d8152,0x79902559,0xe87de61b,0xf278d911,0x1024e35c,0x9c7340c7,
  147989. 0x4a0d0e59,0x2d444461,0xf32626a1,0x63e7608f,0xc4c9baa9,0x627a37e9,
  147990. 0x76fffd25,0x0c56dc51,0xcef2a1cd,0xcb6defc8,0xefc559d9,0xcbcc0d56,
  147991. 0x041cb692,0xe45f3fc5,0xe5161e09,0xcd05c239,0x5c3b559c,0x2a731ee9,
  147992. 0xa3d0a16d,0x85151122 },
  147993. { 0x86ff19e2,0x782d0335,0x1da28603,0xc2c60daa,0x557c7eed,0xb2e78cfe,
  147994. 0x1bc4e8b0,0xa8f6f984,0x3df35c67,0xcc1f9b4b,0x4764462a,0x96e13603,
  147995. 0x7c7ae0b0,0xbf910b97,0x51435956,0x27c7f305,0xf631eae5,0xc14db15c,
  147996. 0x7e69b34c,0xa51d6142,0x5fc12ff2,0xdec82851,0xfb887162,0xfcceae13,
  147997. 0xde1488bd,0xda332ac1,0x2ee3e74c,0xa20374e2,0xf0ae069c,0x597ea1a1,
  147998. 0x77bdec04,0x8b1159f2 } },
  147999. /* 78 */
  148000. { { 0x2f961d30,0x4af71a44,0x7ac7248f,0xbdf968a8,0xb1a906cd,0xd32df87c,
  148001. 0x04abf925,0x00c10e26,0xb9f04d4c,0xb8711759,0x939705da,0x00d54e60,
  148002. 0xc9f80849,0xf7587433,0x6a7a2375,0x2e9abade,0x94ac17ac,0x5676d478,
  148003. 0xc202d99c,0x4ca0525b,0xabfae73d,0x95b8bcad,0x3405991b,0x2371ed38,
  148004. 0x458a99c3,0x2b69e47a,0x2b78c866,0x7cac0b18,0xe0232c7c,0x6ceaa79b,
  148005. 0x588f7459,0x0bd86433 },
  148006. { 0x7e734189,0xdea1a8b4,0xcfe5fa17,0x52c5ac88,0x11437664,0x444a4d4e,
  148007. 0xaf9e9750,0xc2522308,0xd30c6b3b,0x78b1d0c3,0x4c6df477,0x2edae5f0,
  148008. 0x2ee88dd7,0x53131d9a,0xacc93e34,0xc4e380ee,0xa8db0e8e,0xd499b1ac,
  148009. 0x7f5d49d7,0x77348c16,0x1556ccd7,0xc9663257,0x2611d13d,0x65ce0e8c,
  148010. 0xb5a2fdcc,0x2c95fe66,0x8658faa1,0x26698832,0x31c32c98,0xda87d1f4,
  148011. 0xfcd91907,0x46650598 } },
  148012. /* 79 */
  148013. { { 0x6b4a5efa,0x4c6c13cc,0x1d07b265,0xc481989b,0x8bdc69c0,0x10b966ce,
  148014. 0x2c2531d4,0xf54cfaa2,0xcad0a100,0xcb5f1808,0xee5da449,0xbeb52538,
  148015. 0xbedd83cc,0xa6240085,0xd6255c78,0xe792dacf,0x2062058f,0x88371906,
  148016. 0xed1658c1,0x96615e83,0x7d28d542,0x4b549b27,0x83b75df3,0xeaf127db,
  148017. 0x17fbb942,0x4f60df6d,0xf6f7c930,0xd08631db,0x6018789f,0x17c38f98,
  148018. 0xb9a9280c,0x0c43574a },
  148019. { 0x1d20cad0,0x76eb324c,0x8c61108a,0x90decb09,0x6f06d36d,0xa6e9d39c,
  148020. 0xbc0da197,0x6cd978ba,0x507ac5ce,0x5948b1c0,0xc5497eb5,0x2bd47164,
  148021. 0x4d5914e3,0x2a9c4c0f,0xa759f03c,0x772c5046,0x69ac847e,0xe7d7328a,
  148022. 0x3048b330,0xa8d57d0c,0x40f7bace,0xe60034e0,0xa85f1790,0x823d9193,
  148023. 0x5c859736,0xa6e9b66c,0x679e1022,0x22ca2c7a,0x09023fa4,0x00e7a19c,
  148024. 0x2726d5b9,0x324999f1 } },
  148025. /* 80 */
  148026. { { 0x7c834915,0x667eaed6,0xbc5eb64d,0x9f77aa6a,0x25d62011,0x729ebcb6,
  148027. 0x699fd9c2,0x0aee24f2,0x2b8d4f6c,0xe1eb5874,0x14c976d6,0x7f12710c,
  148028. 0xf6d9ea65,0x91390335,0x06b50064,0x668b7049,0x0876ee4f,0x65969a0e,
  148029. 0x2f9d9360,0xf901bf3f,0xb499e3ce,0xfb1a8651,0xf2dbcaaa,0x80b953fb,
  148030. 0x973b06b6,0x312cc566,0x3af36c64,0x3534d9c3,0x10ffd815,0xe4463a52,
  148031. 0xf18c2b91,0x57ea2b4b },
  148032. { 0x8aa0f2f2,0x00f5e162,0x0e46bcaa,0x8c7e75c5,0xa4a2c42d,0x97ab479a,
  148033. 0x14baa202,0xb4f308ea,0x6943cc2e,0xa901bd14,0xeed58804,0xbb125fee,
  148034. 0x9d180f7c,0x6502c8f9,0x1580c61c,0xe5353919,0x27101ee3,0x7e278069,
  148035. 0xfaa72717,0x7a0a40a1,0x4c75b153,0x32edce02,0x538f1c22,0xda23660b,
  148036. 0xbe307d2e,0x4d511e98,0x9baee0b4,0x24276e40,0x7ff1f307,0xa78c3927,
  148037. 0xea7935c9,0x60480b46 } },
  148038. /* 81 */
  148039. { { 0x3872ece3,0x31087d66,0x955b70f8,0x5f29be7d,0x9cf95bb8,0xb50b4fc7,
  148040. 0xdbffa621,0xbae3b58d,0xe022ba5d,0x0e61d280,0x4181449c,0x78ae5117,
  148041. 0xcf555485,0x0b132840,0xb8ce0b0e,0x800ed1b6,0x78d5de3d,0x35dffdd5,
  148042. 0x69a56b47,0xf7e42374,0x8d910ae7,0xd5e32369,0x6313c7c7,0xb6ff52a0,
  148043. 0xa92de9e5,0x5a2fe20d,0xd12110bb,0x41b347d3,0x40c16f23,0xc5905edb,
  148044. 0x9a8f88cc,0x0774a0d3 },
  148045. { 0xe3b6c106,0x3ae181ab,0x8de150b7,0x4ebe163f,0x6f354836,0xcf75b82f,
  148046. 0x3ac7ac16,0xaa0d2063,0x291722af,0x5c680668,0x11545553,0x73941e61,
  148047. 0xbf5de3f7,0x17127e38,0x1afb41da,0x32cfdf03,0x87bc8663,0xc6893c91,
  148048. 0xa62c9c99,0x75046744,0x962c1947,0x96866e2d,0x378cdf4c,0x489ec8df,
  148049. 0x3407fa32,0x3a60709b,0x551290d1,0xd37d2159,0xbab92273,0x9623d303,
  148050. 0x2432014b,0x08151954 } },
  148051. /* 82 */
  148052. { { 0xfb7b2108,0xf9236d89,0xad75f9aa,0x3ecc83cc,0xb4e1da11,0xf7c72b15,
  148053. 0x0315c362,0x552aeaef,0xf272fe3f,0x11e140ed,0x87843ee8,0x99d79bf6,
  148054. 0x1d9bb25b,0xce6b54fd,0x5b1bad74,0xb20b0e21,0x5b84c90d,0x54a0214f,
  148055. 0xfca6cec9,0x459bbf52,0x9e4df76f,0xe363c48d,0xd64cf17e,0x3045f84e,
  148056. 0xf62ada48,0x8402a167,0x6a74ca01,0x2c9e1bf3,0xf691c42d,0xe8cf9d41,
  148057. 0xc2c4b874,0x5abf2178 },
  148058. { 0xf3b3bccd,0x4777966b,0xbe3e0caa,0x0047e0f0,0x8c7d5043,0xcb8383b3,
  148059. 0x946fd5fc,0xe77e3baf,0xe9ec0e87,0x79baa785,0xc8a18d25,0xd83c557c,
  148060. 0x25befcfe,0x9b96e5af,0x98c71b61,0x4f05d15e,0x77e62da1,0x081f991a,
  148061. 0xcbaa3821,0x1c6ec781,0xe54d9bfb,0x7522f65d,0x44ed1430,0xf5d05573,
  148062. 0x95cafdda,0x3035b31f,0x6378f5bf,0x47e67f43,0x5270b9d9,0x029f7cad,
  148063. 0x4d916a48,0x15ad1587 } },
  148064. /* 83 */
  148065. { { 0xaa588ae4,0x00de2ece,0xa371a232,0x552ebc58,0x71230444,0xd00ea934,
  148066. 0xe4b1832d,0xafbfa67d,0xb689e843,0x29216341,0x61f4e2e8,0x1f96bbbd,
  148067. 0x04c29dc5,0x95420684,0x42317fd1,0xc7fe3827,0x63483162,0xe0a0aec6,
  148068. 0x0700184f,0xfc2b94d1,0xfe1fbd85,0x07219973,0xfb074352,0x648b6ab1,
  148069. 0xc46e5392,0x23bbdaad,0x00fa56ff,0x0db8dd1f,0x866725f6,0x104815eb,
  148070. 0x52e81963,0x3f9c4cca },
  148071. { 0x32ce637e,0xff36b297,0xf5d25cdd,0x81a15f2d,0x8b02ad97,0x1a1d052d,
  148072. 0xcfbab3e9,0x2e5f3bbc,0x614eeb75,0x60d2cbd7,0xcd5a793a,0xd4491843,
  148073. 0xcdba2144,0x2242cf75,0x88b99766,0xa20705e7,0xec77e132,0x64e12cc0,
  148074. 0xb61a9b05,0xb1c14df6,0x74825b5a,0x8fd97f04,0x3da31223,0x95604821,
  148075. 0x4d30c70d,0xde486727,0x1c12ee69,0xbcab8f15,0x668d893d,0x5dc638b4,
  148076. 0x223f574b,0x6479dad6 } },
  148077. /* 84 */
  148078. { { 0xb05f2b26,0x569044f3,0x80b9f76c,0xb35a294a,0x4290f6ae,0x8839fe28,
  148079. 0x026a5877,0x761cfb23,0x2e5ff9c3,0x768926b6,0x0b11c576,0xbae6cd20,
  148080. 0x72a03efe,0xdc857756,0xe1bad63a,0x0cae074a,0xd709d99c,0x3fe491a1,
  148081. 0x6501d9c1,0x76c5ded6,0xc32aeff7,0x1da6eca1,0xc57683e8,0x50849d55,
  148082. 0xdf98d847,0x9e392e9c,0x64d9a564,0xfad7982f,0xa37b98b2,0xf7c3bdb7,
  148083. 0xf0860497,0x1fe09f94 },
  148084. { 0x7648cc63,0x49a7eaae,0x67cfa714,0x13ea2511,0x653f4559,0xfc8b923c,
  148085. 0x81a16e86,0xd957619b,0x3c864674,0x0c7e804b,0x1616599a,0xfc88134a,
  148086. 0x0a652328,0x366ea969,0x4bc9029e,0x41532960,0xae2aad2b,0xef9e1994,
  148087. 0x7f10bef5,0x9e2a8c52,0xc67bf860,0x73dcb586,0x844cc25d,0xf61a43fa,
  148088. 0x74eb3653,0xd74e7eea,0xdd240f02,0xf3356706,0xfd83bcb4,0xeec7694c,
  148089. 0xdb62526a,0x4de95786 } },
  148090. /* 85 */
  148091. { { 0x3deac2f7,0x4867d315,0xb61d9a8e,0xa084778a,0x0ab7b2d5,0xf3b76f96,
  148092. 0xcfdf4f79,0x00b30056,0x31ab8f4b,0xd0701e15,0x9c779d01,0x07f948d5,
  148093. 0x82675371,0x7c994ebc,0x48bad4c0,0x1104d4ee,0xbfc9d058,0x798ce0b5,
  148094. 0x309fa80b,0xc7ca898d,0xacb33eaf,0x0244f225,0x5b2f3175,0xd51e8dfc,
  148095. 0xa4d7be34,0x3e49ba6b,0xbda02b43,0x1760f4c7,0x4435275a,0x37e36a7e,
  148096. 0xe636980c,0x1c94418b },
  148097. { 0x09dc1414,0x43a21313,0x43c93537,0x060765fc,0xdf5f79ce,0x6ff3207a,
  148098. 0x85d4cfca,0x6f18b1fa,0x63e995ab,0xf5c4272e,0xa82b3002,0x121a09e4,
  148099. 0x97147f16,0x82b65d1b,0x20a7fe26,0x4993c20c,0xe6716726,0x99c9cb98,
  148100. 0xfeb440a0,0x5a02d673,0x251b4bc5,0x3f3fa9e1,0xa05338ea,0x75dbc474,
  148101. 0x7b09f6cb,0x3cb4044b,0x80434609,0x6767da18,0x098ceac2,0x97851422,
  148102. 0xb55235ba,0x611bfbb2 } },
  148103. /* 86 */
  148104. { { 0xf00ad2a1,0xbdbaa55e,0x14a290d7,0x29efa85e,0xe92b1694,0x3b4a4768,
  148105. 0x11ec8130,0x67111bcd,0x88bd27b2,0x0e425702,0xd9a03c06,0xf28cf2a3,
  148106. 0xf318884a,0xbb7c8d2d,0xe3aaeb20,0xe2ea1462,0x43b85d77,0x33535804,
  148107. 0x554ee9bd,0x81ee4482,0xe6aa198f,0xeb2eee9e,0xc26c5944,0x7a5aa804,
  148108. 0x82ab167c,0xa0ef2da5,0x02fe21a5,0x5a2ab476,0x3370298e,0x169cb3b8,
  148109. 0x0eb3aa8d,0x86e6c544 },
  148110. { 0x0b793d9b,0xede03321,0x1ddb5ece,0xf79fade1,0x68930b64,0xf73fda92,
  148111. 0xfe4fd1b2,0x06aad97d,0x92a4dc88,0x073a5b1d,0xbc976d75,0x8af8cbd8,
  148112. 0x63ce26c0,0x60b4abb1,0xdcb1fb06,0x9c8300a9,0xda95b3d3,0x335a594c,
  148113. 0xb37eac87,0x1f97d7d4,0x20eefaab,0xa3d2eba2,0xf3e828c8,0x3258c906,
  148114. 0x85ab7781,0xc832616f,0x8c28b617,0x72597192,0x3233b82d,0xcd7196bc,
  148115. 0x19fa126d,0x83867eb9 } },
  148116. /* 87 */
  148117. { { 0x22474edb,0x774fe73e,0x1a84e1ae,0x2a766394,0x9c6dd6e3,0x270329ad,
  148118. 0x14f8bf5d,0x00c4a415,0xd2267b90,0x3ce2ea37,0x11d24fae,0x12753015,
  148119. 0x263a1b78,0x7c14d854,0x1ae0b206,0x20c8401b,0x081f49fc,0xf32a011b,
  148120. 0x959c6df8,0x1e8123fb,0x800e1d06,0xa328dc7c,0x24259a9a,0x5876a378,
  148121. 0xb7ef6c37,0x23ada8b5,0xa93d4c9f,0x023f6b6e,0xffb6389f,0x89f5414d,
  148122. 0xe628b39e,0x4b26bba2 },
  148123. { 0x5d318454,0xd30b1cb4,0xd7436cb6,0x123b749f,0x568a7461,0x3110c726,
  148124. 0x1c84fd1e,0xc85de123,0x08403d55,0xa5f8d6e6,0x9b1fabf8,0x395b6e13,
  148125. 0x3cfedce0,0xfe6d68c3,0x94b91110,0x1d90381f,0x2dcc6eb7,0xf0a8ea81,
  148126. 0x7e90ca2b,0x59e80413,0xc8a25c5a,0xbeb5fc07,0x5d84663c,0x009c253a,
  148127. 0x910b6a7c,0x00b15073,0x4108f8d5,0x8607da4c,0xcb901e65,0x02c3d9c3,
  148128. 0x2c9615c6,0x4d697bc5 } },
  148129. /* 88 */
  148130. { { 0xefa8fb40,0xe0db1ef0,0x5ba3989c,0x29021c5b,0x809d19df,0xa8d6fb15,
  148131. 0x4c1219e1,0x6b787b73,0x14ef05e2,0x6417e168,0x8f9796e2,0x449342db,
  148132. 0xbf84421b,0x2f878a5e,0xe94a4536,0xe71916d7,0xae119693,0x9818bba3,
  148133. 0x5768804e,0xec674be9,0xf8424f8a,0x0a26074c,0x466ce6ab,0xdbc93b9d,
  148134. 0xc920078b,0xb3f15a98,0x3870f1a3,0x9d10fd0d,0xe4e785a7,0xa61241d9,
  148135. 0xe6c8cd80,0x76ca87a1 },
  148136. { 0xe02e48b7,0x4357fb56,0xcc09e9c6,0xfbd14b13,0x24069cf0,0xdb5f2435,
  148137. 0x2c3b01a9,0xf878165c,0xe6956dad,0xe549e7c4,0xbbd60b68,0xf2fe9538,
  148138. 0x059dc653,0x952f856b,0xb377fe9b,0xd3f60225,0xbfe908c4,0x6a0c7328,
  148139. 0xbc8f5f2d,0xce6aa2d3,0x24425050,0xf7213443,0x3d3b3ce5,0x17e1266a,
  148140. 0xc1677512,0x75b5e43f,0x37fb894a,0x15927062,0x2be3e375,0x15260753,
  148141. 0x6da3b7be,0x27e7f2c6 } },
  148142. /* 89 */
  148143. { { 0xe6a15883,0x638f65ad,0x66afdb33,0xd4a7e68c,0xd3f12de5,0x6207b6ab,
  148144. 0x37b87810,0x1c6ff950,0x64acf6d3,0xc0d44cb2,0xf2be78c2,0x163ac601,
  148145. 0x1636980e,0x1c63cc5a,0x95c9349b,0x3e92cfe8,0x41ec7220,0x7738e0d8,
  148146. 0x2d5fa961,0x6169d764,0xc3e028e9,0x2aa776c1,0xb16d5409,0x93dc5646,
  148147. 0x706df4d9,0xa0b27fb5,0xce9c6b97,0x9e991170,0x53c85f40,0xea8e42be,
  148148. 0x83246528,0x02e96437 },
  148149. { 0xae78ea1f,0x91540add,0x7b670e96,0x51a1b74d,0xf7006826,0xf9936441,
  148150. 0x7d7520c7,0x8f97d6ea,0x69ce12e1,0x0faa6a02,0x79208342,0x2590aca8,
  148151. 0x75614436,0x7a483863,0xf381408f,0x07c6149e,0xd7853406,0x733bf584,
  148152. 0x9abbb6f7,0x8761b010,0xf528a09a,0xe4eb249f,0x2e00ae3c,0x08781ed8,
  148153. 0x2178effa,0x864c1b25,0x9d513a7e,0xcc1e62a2,0x1919062f,0xedb8b94e,
  148154. 0x4f16527d,0x739f53da } },
  148155. /* 90 */
  148156. { { 0x924adc5f,0x7a5f4a88,0xa818f56d,0x95646c16,0x7795f954,0x0ec49129,
  148157. 0xd19c5400,0x2b48753d,0x205912b4,0x16fa236b,0xe87a4946,0x6b3d65f3,
  148158. 0x045fd066,0xa7174a01,0x12a5e140,0xb6350313,0xa96b8623,0xa79c4b44,
  148159. 0x9ab003d5,0x7a339d65,0x3826f31a,0xc72f30c6,0x6f7090cd,0xb4e7390c,
  148160. 0x906ebe24,0x59ac6c36,0xbba4505a,0x39a7f06d,0xc58c413a,0x839991e1,
  148161. 0xa20e0e84,0x020c23ff },
  148162. { 0xafc74661,0x120e4ada,0x277fc065,0x37bbcf63,0xb6dce799,0x41049cf6,
  148163. 0x7b161ba1,0x5b8d6b53,0xa9610fb2,0x22218431,0xdfdde769,0xde9ec9d1,
  148164. 0x42d80630,0xd32bfa4d,0x6244df4b,0x3885702a,0x45592dfb,0xcdedd1ed,
  148165. 0xfb4e01b8,0x0e1df45b,0x86e215b0,0x8f4bded2,0x6a937e6a,0x80935487,
  148166. 0x8130f723,0x415278ba,0x38a821f8,0xc6dc4692,0xfd8b4f8a,0x2207b119,
  148167. 0xf9269cef,0x76e7bf53 } },
  148168. /* 91 */
  148169. { { 0x27ebd187,0x5f128428,0xb65aadbb,0x8d3320ab,0x72258695,0xb042765a,
  148170. 0x8f0986ab,0xda3f33f9,0xaebff503,0x411807a7,0x825f71a5,0x25c776ca,
  148171. 0xff7df24b,0xc0de7bed,0x165f1fb4,0xda8b0f42,0x731f3ae3,0x5f3ff737,
  148172. 0x193e0a52,0x4cd1d7e7,0xb6b3ba46,0x8df84aa3,0xaa1f3782,0xba84b897,
  148173. 0xe7733ac7,0x6e7960cc,0x50981a21,0x4d46d6ab,0x7cbb80ed,0x1ec12c25,
  148174. 0x2b96ef09,0x79e7ad27 },
  148175. { 0x8f30caae,0x3cd970dc,0x0a6ebef4,0x85cabcf1,0xc714616d,0x63c1863e,
  148176. 0x519e3a98,0x1c50db0b,0x64cb13d6,0xf39b8963,0x22547b69,0xdf67d81f,
  148177. 0xd67db0cc,0x7157abb9,0x889491b7,0xccca25ba,0x7a27e0dc,0xf689207c,
  148178. 0x0fd43281,0x34ae8fbe,0x5720ec09,0xa5d91f73,0xcdfd7bed,0xb2f61909,
  148179. 0x4a039e32,0x1ec10232,0xdb0d8fdc,0xd3c3d65e,0x4fe5005d,0x32c916c8,
  148180. 0x4c0bea94,0x7f8c37ac } },
  148181. /* 92 */
  148182. { { 0x43ac05e5,0x33ec1e54,0xcd8d3825,0xda4a4da4,0x88bf9e2b,0x86d88c0b,
  148183. 0xb53811dc,0x34d71dd0,0xa3c3aba4,0x655040d2,0xb61611be,0x2bc40949,
  148184. 0x279a4fa0,0x1c2d426e,0x3b065ac3,0x535a5aa2,0xc52ea890,0xdaa8a32f,
  148185. 0x9fddad22,0x5a5deca7,0x2ab3b26f,0x911f05fd,0xf37cd81e,0x5dace7db,
  148186. 0x90d16b8c,0x0e0e44e7,0xe4f5894e,0x15e68aed,0xfc92a74f,0xafe04999,
  148187. 0x970e7c2f,0x1d7703aa },
  148188. { 0x3f0062a9,0xa8a4c81d,0xd96a20ba,0xe31eb2b8,0x864bd101,0x66dd98df,
  148189. 0x4413b614,0xba05f592,0xe9a555f8,0x51a67a0d,0x2e4b52d1,0xacc2f097,
  148190. 0x7184ab23,0xab5daaec,0x7c7f691b,0xce08b43e,0x76c427f4,0x520e530b,
  148191. 0xe423ebdc,0x7d352069,0x34df14ce,0x6b5e39e8,0x446305ac,0x3dcbf295,
  148192. 0xfe34cdc1,0x682cb2e1,0x111f5afb,0xd4ac45d1,0x47f296f9,0xc5ef63cd,
  148193. 0x93c20871,0x0a2c40ec } },
  148194. /* 93 */
  148195. { { 0xaf5747db,0x09bc384f,0xc06ab86b,0x3bad6086,0x9e7c1547,0xa406882e,
  148196. 0x55977abf,0x2d5326d1,0xda81deb0,0x063a9a05,0x524b6111,0x9a86e4a7,
  148197. 0x4ab2eb90,0x1402f87a,0xd5c600ba,0x7d0721d4,0xf289fdbf,0x1a2fd9a9,
  148198. 0xecde6f07,0xf5dce66d,0xdab9fa73,0x62171277,0x6c474bab,0x6d2dc49f,
  148199. 0x76eed033,0xdc017e1f,0x4da825d3,0xb97175c0,0x54b05e43,0x6c297e3d,
  148200. 0x56c9c87e,0x2efb4546 },
  148201. { 0x8b21c064,0xa4712b00,0x4a70629e,0xd186fe42,0x9b74f0af,0x6435b340,
  148202. 0x7ec9e629,0x6965aa43,0xc4c60d08,0xdda14673,0xbf3057aa,0x0b656670,
  148203. 0x3ce86f60,0x7f05e840,0x04401a16,0xc05073a9,0x294e607e,0x16b1e638,
  148204. 0x69cf7046,0x20783252,0xe8ce7d3a,0x2941141b,0x7577053d,0xd38ad8d3,
  148205. 0xcaa6630d,0xdba68fb3,0xe9504350,0xecbeaff1,0x1d2d760b,0x9f5166d5,
  148206. 0x462891e4,0x337532ce } },
  148207. /* 94 */
  148208. { { 0x3a00bb9b,0x3f111853,0x45f66685,0x2d2ffbae,0xd4aee24d,0x9ae11a85,
  148209. 0x0341856e,0x18ba1e1b,0x2731349f,0xa9ac8178,0x545715b5,0xc13dfd4a,
  148210. 0x5daad2ea,0xa5f7423c,0x535b76a7,0x30a483b9,0xff873e9b,0x92e9ada4,
  148211. 0x723a1055,0x15662d84,0x8edac4e0,0xb935497b,0x39d8fa70,0x61b6441a,
  148212. 0x40d1589f,0x1541d756,0xf0a05f0a,0x62994237,0x6bb28908,0xfd8b0034,
  148213. 0xd4cd32bf,0x192a2b5d },
  148214. { 0x365ced07,0x63576628,0x05de1d1f,0x029f32fb,0xbf40a7aa,0x6d17b9bc,
  148215. 0x9bb50a47,0x1b1b2a08,0x795a6278,0x9389abbb,0xb34fc19b,0x52cff60f,
  148216. 0x387d8739,0xf3ab9492,0x6920ccd6,0xa8f053e6,0x63a9b4f0,0x3ef2dd4b,
  148217. 0x51e82129,0x9ab0ede1,0x0838bfa1,0xafba0c0b,0x9ffc11be,0x2bd5a7ac,
  148218. 0x95cc0878,0x058bfd95,0xf8c2f0c6,0x686d48a3,0x1d9b31ba,0xc33abaaf,
  148219. 0x3bc0c268,0x632e2289 } },
  148220. /* 95 */
  148221. { { 0x15a1ccca,0x1c851d20,0x7e522bc3,0x4efe290c,0x18eab053,0x0b741d55,
  148222. 0xbc85e217,0xae656197,0x01cf8b29,0xae13141e,0x66948478,0x2e2cb593,
  148223. 0xc31bd8ae,0xeb57bb0f,0xc264e788,0xdecef5d6,0x9cb96d86,0x6fa856cc,
  148224. 0x279183da,0x2db16813,0x383d796a,0xf03f3820,0x1d0c6fed,0x58a456ff,
  148225. 0x8a6abd9b,0x25589805,0x83f96f19,0x339f52c5,0xda7e9ea7,0xcf6ded8f,
  148226. 0x5d1ccd45,0x68c3d9c1 },
  148227. { 0xe6b392b7,0x67e26265,0x775d9509,0xcec1d9bf,0xd76514f7,0xe16abcd4,
  148228. 0x0de72e1c,0xd86f59b2,0x1adfb033,0xa66e43cd,0x05e457cc,0xdb344340,
  148229. 0x5681daa2,0xb67a7916,0xf0114731,0xc32e7bab,0xd3b1e961,0x066fe16e,
  148230. 0xf63d26e6,0x924e298e,0x541add6d,0x9bea0dd8,0x9982f971,0xef9500df,
  148231. 0xc5f076ac,0x5c876e63,0xb23d396b,0x55e12ae5,0x2ec6747a,0x09efbb36,
  148232. 0x233286a5,0x8f2055ee } },
  148233. /* 96 */
  148234. { { 0xb82c1af0,0x4a4ab9e3,0xf2cae264,0xfc65e9e7,0x60187d46,0x4feaac0a,
  148235. 0xe393b363,0x27d3f335,0x819bacce,0x9c9f7c00,0xb8aa6611,0x3f7418b5,
  148236. 0x372aae95,0xffa94557,0x8db38589,0x937d7804,0x6f1fbc1c,0xd10c86df,
  148237. 0xa2f0a0ce,0x48aebd89,0x367439eb,0xae5d5fa2,0x3f17d2d8,0x103a6a0b,
  148238. 0x411d9894,0xf233f68a,0x218b67a2,0x7fece8b3,0x2319bf06,0x0422540f,
  148239. 0x340d322e,0x1292c8c9 },
  148240. { 0x0386463d,0xf5eb5587,0x0371d97f,0xd4bbc2b2,0x0b819c5a,0x1b364571,
  148241. 0xcf04ad41,0x0cbb42d6,0x66939ec1,0x5d819c76,0xa01847e7,0x8745ac13,
  148242. 0x1c7232e4,0x4f704b02,0xacb05780,0x2c9e58a0,0xb561e295,0x9523b8b3,
  148243. 0x79f9ba35,0x3384df00,0x1eaa9628,0x78231fc2,0x8aea2b90,0xa2eac54f,
  148244. 0x30d1c263,0x8075ed77,0xfb339000,0xacb44ed5,0xf011293a,0x92546ac2,
  148245. 0xeb821764,0x7c78762b } },
  148246. /* 97 */
  148247. { { 0x067902b6,0xb8f7d6fb,0xd1735980,0xb2823a43,0x59741ddd,0x062cfb12,
  148248. 0x4033f95c,0x6e391b07,0x68589b8c,0x3831d0a3,0x522290f2,0xe3474d49,
  148249. 0x222e1f3a,0x4dab14d6,0x53f08d39,0x8f00fcde,0x707f28f5,0x559917ae,
  148250. 0x068e607c,0x166aa0ba,0xd7e1f824,0x602713e7,0x4d6a328f,0x7c255540,
  148251. 0x9890cd2a,0x0d2e3264,0xeca0b20a,0xf2207944,0x52f4e09c,0x5c98dc07,
  148252. 0xd84de81d,0x69403504 },
  148253. { 0xe5407206,0xf8b7b366,0x0d88fa8c,0x1ecf54cf,0xf7272e6f,0x6fefe548,
  148254. 0x81ab4468,0xd6531372,0x4e474408,0x52cb5f0e,0x6490737f,0x9e426b3a,
  148255. 0x4980d071,0x2576c19b,0x0f272caf,0x91f34628,0x468f31c9,0x78e60a4f,
  148256. 0x90844d89,0x8776a329,0xb951582b,0x8a55700c,0x14b1adbf,0xab1af365,
  148257. 0xfbd343ef,0x22ebff92,0xb7d81f34,0x32f9fb01,0xba6b30e1,0xad850e06,
  148258. 0xbc5f9546,0x6da9e027 } },
  148259. /* 98 */
  148260. { { 0x5c9490ce,0x21eee4c2,0x0df68381,0xa96ec4a3,0xa4a9368e,0xe6c607e0,
  148261. 0x4bc262f3,0xd8b0492a,0x460c34ff,0x0846a210,0x28df33cd,0xf7ff7a64,
  148262. 0x21827612,0x10c55044,0x149bcd01,0x9d25fce9,0xcfc613dc,0x725611cd,
  148263. 0x97f51ce5,0x159f7e88,0x4e8c08b5,0x3fa3bf31,0x75e7538f,0xea156115,
  148264. 0x91c84020,0xd1e0a951,0xcf02ad0a,0x0d2268ba,0x058b8e5f,0xa04c6ac4,
  148265. 0xb3515912,0x773b40b9 },
  148266. { 0x3631cfd2,0x00ff2cdc,0x807737bc,0x14c4c2d3,0x338a5270,0xd600616a,
  148267. 0xb32cabde,0xd0e3306d,0xa70b17ca,0x336738ea,0x79f353ee,0xf2f4aa8d,
  148268. 0x576f3ad3,0x712f6ad9,0x89b2bce0,0xe4279852,0xda92ca30,0x05d8f94d,
  148269. 0xd8492dd9,0x9891d475,0x4d15e4bd,0x3e06a5ca,0x254eabbd,0x4725d4eb,
  148270. 0xc0ed513c,0x31394ace,0xbbfaae6c,0x7e0f9859,0x833fd137,0xdc125546,
  148271. 0xc56c4f75,0x12b46385 } },
  148272. /* 99 */
  148273. { { 0x932951de,0x810dbebd,0x5aa69c94,0x96959d42,0xecb2f08d,0x5fc49c04,
  148274. 0x2250b82c,0xac74f0cc,0x3aec4e1d,0x96a439a5,0x90499acd,0xc33cab9a,
  148275. 0x54d9b3af,0x2fccde66,0x3863ae8b,0xf4af285c,0x46febf88,0x2373373e,
  148276. 0x3c9ab7ed,0x751d672c,0xfe12020c,0xc1c51130,0x52f3e56e,0xad82402f,
  148277. 0xa4a64a81,0x3489ab7a,0xd9f163f2,0x0a1fb661,0x0e553317,0x17c69be1,
  148278. 0x7d88d417,0x61c1935e },
  148279. { 0x3492ae43,0x2e722d9b,0x0538f05a,0x1ef89d95,0x200aab63,0xae77e588,
  148280. 0xeba4b117,0x2872c120,0x3a461cb8,0x5c2432c8,0xcb938f26,0x315b3434,
  148281. 0x8c4c7dc0,0x05bf2ac5,0x596b378d,0xd2e501dd,0xcb890c30,0xa8506c9f,
  148282. 0x7c361f0c,0x3d0af461,0x5a35cbae,0x21f7b718,0xf3fc0138,0xbd1035f1,
  148283. 0x8b248edf,0x74628af5,0x48c9cae0,0x8d6421d0,0x2ca18773,0x75e3da39,
  148284. 0x71d3db94,0x27ad0df2 } },
  148285. /* 100 */
  148286. { { 0x305b5aed,0x9e3bda79,0x5998d6a7,0x2c67d4a4,0x0f7eb700,0xc855e1d3,
  148287. 0x147d1c44,0xc18a7e9e,0xc89540ed,0x3ea99618,0x7e6bfd20,0xa53be20a,
  148288. 0xecc14437,0xc9487e64,0x34ef85c6,0x72979207,0xd5e1ebd5,0xfa0d4e71,
  148289. 0x4d48d6b6,0xfda2b1e6,0x66e200d4,0x782a1e05,0x5a5366a1,0x2a3c70da,
  148290. 0x1a473738,0xfe3fbd2b,0x7fe020e8,0xd7ef8c06,0xeacfb665,0xec686fde,
  148291. 0x6dd1542f,0x5d9b5e27 },
  148292. { 0xcb3e472e,0x3637c5a5,0x30a1405e,0x2153d927,0xb4498558,0x009992e5,
  148293. 0xf39a0851,0x18f00ccd,0xb5c6c560,0x26237c11,0x1343540e,0x418ed408,
  148294. 0x7e7f3184,0xfef7cbf0,0xbf48576b,0xecd92366,0xbc94c91a,0x1b75be1a,
  148295. 0x4a162276,0x8e1778de,0xc5c6bcb8,0xc52e57d3,0x5ab71858,0x5cc382c7,
  148296. 0x3f6e39f9,0xe12c2c28,0xd62735fc,0x4c7e0ef2,0x835a5996,0xe071deb1,
  148297. 0xcbb8c766,0x24f891cd } },
  148298. /* 101 */
  148299. { { 0x6778c1e2,0x24ef60bf,0x00d5be5c,0xff49c03d,0x2f01a09f,0xec11986e,
  148300. 0xae096e58,0x59a728a4,0x7077984c,0xaabbcedb,0x870ca5a5,0xfb473bd2,
  148301. 0x4de30e3d,0x8c928c61,0x4f67abca,0x3fae7f9a,0xec21a9cf,0x83c2b2eb,
  148302. 0x9cd9b5de,0xafa70d62,0xc60b18df,0xadeaea59,0x4049b54c,0xd5fef7be,
  148303. 0x6dd310e3,0xfceebc76,0x8f6321cc,0x7748efe3,0x18ee8af5,0xfe9c32b1,
  148304. 0xd42df612,0x863ac3cf },
  148305. { 0xb85a2fe2,0x0a36fca7,0xee429dc6,0xf3e70d08,0x141c3944,0x8c9ba209,
  148306. 0x67272a0a,0x306a8106,0xf968bd06,0xe69a1555,0x153c603d,0xb86f7e47,
  148307. 0xef56e4fa,0x9706614a,0x98780b4c,0xc0dc36b8,0x3a1d3263,0x43657fe2,
  148308. 0x435522c9,0x01f97a86,0xedfef679,0xd91897f6,0x6daa17a0,0xebbe31d4,
  148309. 0x85accfbd,0x6f179100,0x8f9fc1de,0xe0da6e32,0xe1e7142c,0x1c9d53db,
  148310. 0x8b86725a,0x3e3f1b1e } },
  148311. /* 102 */
  148312. { { 0x7b7fbf05,0xb7ea15c0,0x1f1a3882,0x992f11b6,0xd1dcd1bc,0xc9ddd95a,
  148313. 0xad0f7e8b,0x31f5b7fa,0xfca7ab79,0x2936e5eb,0x19a55be6,0x30f417dc,
  148314. 0x43cde554,0x1f6f4e43,0x82f044bf,0x971f5e65,0x4288c408,0x73c3b8e4,
  148315. 0xb807f575,0x61aac59f,0x818b58f0,0xa64ee2dd,0x97a3b0d3,0x6f7a0a60,
  148316. 0x0394b058,0x8b85ecc8,0xbfb3517d,0x9a059474,0xa79c3f06,0x89ad5977,
  148317. 0x700a8025,0x81208ed8 },
  148318. { 0x14c4ce37,0x10935099,0xa1aa48a6,0xf34bb843,0x580d58e8,0x86007024,
  148319. 0xb375b8ba,0x6db42c49,0xed3bde83,0xac365524,0x649233b6,0x5521e1b4,
  148320. 0x64dd946f,0xbc7cc5d5,0xbfb5b6ae,0x9c14b035,0x0146c1a3,0x7f22ba18,
  148321. 0x872214f5,0x0b62fbbc,0xb4921764,0x3acfd7f7,0xcb4d6df1,0x5ff10da1,
  148322. 0x62600a91,0x660e2620,0x81d9167f,0x7ac7da9d,0xb6e7a199,0x6e8e260c,
  148323. 0x80deb3c2,0x44383fb8 } },
  148324. /* 103 */
  148325. { { 0xe44f9af6,0xe107f01d,0x8cb1fa1c,0x36381a4d,0xfb7dd493,0xe65be3ec,
  148326. 0x26a8839f,0xd0b8435a,0x3ec789d8,0xee60f915,0x2bcc5e1f,0xe25fea50,
  148327. 0x7e44a81c,0x0477c0c5,0x230ba5b8,0x349e9f83,0xde180dd9,0xdd42f32f,
  148328. 0x64a3d11c,0x8b039eaf,0xbeb7083a,0x80ef884e,0xf12742cb,0x288e60c4,
  148329. 0x720a0262,0x44156cc5,0x7253b77f,0xcd547de6,0xa6013a59,0x9829a6ec,
  148330. 0x0d548445,0x8aee708f },
  148331. { 0x32c54409,0x18f22d9c,0x75ebaac4,0xa9ebfa46,0x86284981,0x90e2e928,
  148332. 0x6b3a8e0c,0xd0201f6f,0xbd77641e,0xc973016c,0x70170575,0xf926f2f0,
  148333. 0xfec0ce01,0x4984048f,0xf319d304,0xbf696211,0xc91a88c4,0x74b5c844,
  148334. 0xe0030a82,0x4c40fbce,0xe4f6d521,0xbed67525,0x29d67d1e,0xaf7e47cc,
  148335. 0xc21d3536,0xfa307db8,0xbbb29405,0x56b6c46a,0x033e805f,0xf059a7e3,
  148336. 0x6096a5a0,0x970f61fe } },
  148337. /* 104 */
  148338. { { 0x1bec8e4a,0x1bc53d23,0x35a6034c,0x8809ac14,0x509e464d,0x4ee081da,
  148339. 0x8a488235,0x496ae1fd,0x325864b6,0xa1ae9863,0x74cd069f,0xbaca13e9,
  148340. 0xb1d8a6b4,0x3738cc58,0xe76b9da4,0x5fa71f58,0xc7eb16fb,0xc919be88,
  148341. 0xad4e429d,0xf5c8f13f,0x2499f9ed,0x4583b671,0xa10d8bd7,0xbce20115,
  148342. 0x5790bb7e,0xf66d7605,0x482b78dd,0x9316aede,0x75f855fa,0xe0d8fb2d,
  148343. 0x5a7dcca7,0x404b5b94 },
  148344. { 0x517a15c7,0xf9ee682a,0xef880202,0xaae4cfbc,0x5106a354,0xcee2c139,
  148345. 0x170febe7,0x5de60192,0x73d0c54b,0x589e39fd,0x8c9092b7,0x195c7135,
  148346. 0x0a7bfe5f,0xcb7ed53f,0xf61cc979,0x2bd9242a,0x5395f7d9,0x8d2ef16c,
  148347. 0x70b32f09,0x0d4ac1ca,0x52d185c1,0xa587526d,0x942d6195,0x2932b04a,
  148348. 0xa500b0ac,0xfe25a979,0x562fd230,0x5fa1f4ae,0x20da253c,0x60f55af2,
  148349. 0x83146002,0x7faa11b5 } },
  148350. /* 105 */
  148351. { { 0x6e402149,0xb0ba4f0c,0x963cc119,0x3584cc1d,0xa6527476,0x7740dc1a,
  148352. 0xc95715f2,0x3f77ff75,0x3f89fb0e,0xb2f234ad,0xef9be3ff,0x55159032,
  148353. 0x04237e82,0xfc9fb21d,0xa153ed93,0xeb2eff38,0x10041d13,0x89d53ae0,
  148354. 0x7f1bd828,0xcf2e545b,0x43953ea5,0xdd4a27ce,0xd85e75c8,0x00d2e5d4,
  148355. 0x241be1c3,0xeb93ed62,0x0242032d,0x1e53f25f,0xc3a4e701,0xb9957636,
  148356. 0xed98febf,0x14b63a52 },
  148357. { 0x71c43336,0x7610b553,0x23a4824b,0x19dfd4a6,0x0286051b,0x7b97a2e0,
  148358. 0x8f5f1edb,0x86abbb9c,0x9b67daad,0x67a57d77,0xcd5ffafb,0x8ace506d,
  148359. 0x89ac3c63,0x85da9f95,0x75a3d150,0x081cbaa8,0xe9346ed2,0x03353d8f,
  148360. 0xa1f9a02d,0xb2ab61f1,0x3a659c71,0xb0cb0937,0x4f5df8a1,0xb7e0e30b,
  148361. 0xeb7d5a1d,0x77c4c741,0x728e5cf0,0x8f046c9c,0xf7c171ac,0x32dd0bc7,
  148362. 0x836d2655,0x02485873 } },
  148363. /* 106 */
  148364. { { 0x75a4cd8d,0xcd40dd23,0x97bcba78,0x132ca433,0x258d61f5,0x30c5cd84,
  148365. 0xda1e8e68,0x0a7ec059,0x1d65d40a,0x07a8f171,0xf4350d76,0x869e655e,
  148366. 0x5983ae42,0xb98ce6f0,0x9d8bebd0,0x7b61391d,0xb1ba5d49,0x3a529e25,
  148367. 0x1f6b2cf6,0x46f732e9,0x3fa3b629,0xbd66ec6a,0xc3ef0ed2,0x397950ec,
  148368. 0x5f08b476,0xee9008cb,0x965a0e2e,0xfd6be425,0x1177bc87,0x78ed513c,
  148369. 0xfe512dae,0x6798cedf },
  148370. { 0x1b97c5c6,0x49e3f8fd,0x78c3b33f,0x39fbab3e,0x40f595ba,0x44274412,
  148371. 0x5d7d4376,0x174225b9,0x79c44777,0x880b3fcc,0x3296b245,0xdc3aca83,
  148372. 0x1734e184,0x55913df7,0x9c934472,0xa4db23d3,0xd1420a11,0xcebb3733,
  148373. 0xf3608bdc,0xb9d20cf9,0x30cfe13f,0xa618acf6,0x5f30874c,0x75f06b31,
  148374. 0x9f0005a5,0x506efe7f,0x01bfc9db,0x8aaea78c,0xf78e7c41,0xf9179255,
  148375. 0x52e96395,0x3ea7aed2 } },
  148376. /* 107 */
  148377. { { 0x5b06ae25,0x98617e04,0xcb5750ef,0xbcac148d,0x604c2ba2,0x91ea2f0e,
  148378. 0x76b78975,0x00c19f6b,0x651da181,0x79b9b6d0,0xc945705b,0xf3225beb,
  148379. 0x5c005bf1,0x30b435f3,0xbc24d86d,0x440b4482,0xd6373777,0x2b8f0996,
  148380. 0x1c44b4dc,0x65fd6c56,0x30906999,0xe9405ee6,0x08aa1ec1,0x19ff0924,
  148381. 0x3d2f2895,0xeef3246a,0xbc746797,0x016c3765,0xd0705f7e,0x62d2569f,
  148382. 0x05250044,0x6a8ad39c },
  148383. { 0x46be7282,0xe45f020d,0x21380f12,0x9405afed,0xd5da6ad0,0x4cdca5bd,
  148384. 0x7f8be61e,0xc2d6f184,0x596b8178,0x20132953,0x7a8df954,0x8d3b1e7b,
  148385. 0x39572b4d,0x757c61bb,0x80cc3b56,0xd749b57b,0x37b3ffec,0x9590ff93,
  148386. 0x145dc94d,0x39bbb653,0x2335e573,0x70c1c606,0xf763feba,0x9c2e72d7,
  148387. 0xcc61b732,0x4768e424,0xaa73f2ca,0x777d2fa6,0xc5cb58cd,0xdee4dbaa,
  148388. 0x9cfae1aa,0x1a181179 } },
  148389. /* 108 */
  148390. { { 0x77575ed0,0x6f6ff62f,0x7d1da99b,0x18f14fa9,0x69efd7f6,0x2e72aefb,
  148391. 0xddc28633,0xc45ab4cb,0x586c5834,0xb0e20d48,0x39775dd8,0xd397011a,
  148392. 0xf4134498,0x0130c808,0xf5115ed8,0x2d408eba,0x0260ded9,0xc506a05c,
  148393. 0x19cab911,0x9e5b7362,0xe8693a86,0x4cf508c6,0xcc773617,0x4e71245f,
  148394. 0x95d89ca3,0x2f71aa1f,0x607bbc98,0x4bba7c6a,0x212b7fd2,0xf3a515e7,
  148395. 0x9230f5a8,0x7d2ddc75 },
  148396. { 0x4ed2cae8,0x3d05816d,0xb9c00377,0x4cf6bc7d,0x646b08d4,0xc23e98e6,
  148397. 0x4b9c0180,0xf9ee6c61,0xef9179c1,0xe11c9a13,0x8ed9688a,0xa5b6147e,
  148398. 0xd06670a7,0x7afeb648,0x17685275,0xd670333c,0x75f9e8f2,0xa89dd969,
  148399. 0x37a68ade,0xbb57228d,0x454cb186,0x21a05d5e,0x063dd550,0x4810158f,
  148400. 0x4cb6caf3,0x92dd4f08,0x7854abe7,0x70c4d852,0x6e729d76,0x845969dc,
  148401. 0xb1bf40ba,0x5a52f87a } },
  148402. /* 109 */
  148403. { { 0x09ecacbd,0xed019e91,0x7b89bdea,0x6544023d,0x5707371e,0x7cc51f0b,
  148404. 0x16c8e217,0x14832b04,0x81259ab5,0xb1aa6682,0x23e361d4,0x6e100f92,
  148405. 0xe3a95c2a,0xe593eee9,0x16c10e26,0x699b6bbd,0x9473a13f,0xad487873,
  148406. 0xb274987c,0xf1c14dc5,0x2559e2e9,0x57dc0075,0xc3d47ad2,0x8449849d,
  148407. 0xdd527793,0x83df278a,0xeefd5b99,0x770e3ec8,0x76bd02a0,0x2ae58446,
  148408. 0x3e705ffe,0x17f02764 },
  148409. { 0x29abea1f,0xdda4010d,0x2407ac4c,0x636b9695,0x0433218b,0x96a60129,
  148410. 0x163d534a,0xf221fc3b,0xccc20565,0x05ba15be,0x96285577,0x1238e54d,
  148411. 0x878804d3,0x1b144257,0xa89a9fe4,0x96fbf304,0x4be642b1,0xc8a7f06c,
  148412. 0x6e2b085e,0xdd1a20e8,0xff4a591d,0x8f7f27c2,0xa4a343b8,0xc17b0753,
  148413. 0xbb173d4d,0x684b1e88,0x3dc07bbe,0x3accea44,0x4c441d77,0xdb15c88d,
  148414. 0x53e5957e,0x0ef0309a } },
  148415. /* 110 */
  148416. { { 0xfa8e5b60,0x4fc25721,0x691c0bb2,0x646938ad,0x0b0a2248,0xe46d4b76,
  148417. 0x7de16877,0x863f9ac2,0x2721c630,0x503bb6ef,0x0b67fb02,0xf8c199df,
  148418. 0xe07abd39,0x78c1ed72,0xb32f0dda,0xcf9deb7b,0x6c3c89f3,0xaff726f0,
  148419. 0x1972225a,0xb7008b2d,0x4f145f5c,0x8f5a6117,0x457c4f37,0x4e0e6f8c,
  148420. 0x1c453c64,0x8bbdaa44,0xa6e92c80,0x57be326d,0x5d773561,0xa9bc3fd9,
  148421. 0xbb37b72a,0x3d3b6cc6 },
  148422. { 0x9722c880,0x6e6f12cc,0x286b6889,0x3a1b6ae7,0xad2fafec,0xba1cc09b,
  148423. 0x43bb8bef,0xad64ad7a,0x97c3f4c3,0xa5af6a00,0xc353a91b,0x2afcb0d9,
  148424. 0x69ccbf6b,0xca13fcab,0xf2abc190,0x699a1391,0x23a247e5,0x2dbd5542,
  148425. 0x95488d9a,0xe206180f,0x1244cc3c,0xba9e7bff,0x87d3a365,0x29297abe,
  148426. 0xfa4ca5e2,0x4054fa38,0x67be1b6c,0xb390623d,0x78f41a44,0x1fa67c57,
  148427. 0xc7b544e7,0x2e946e43 } },
  148428. /* 111 */
  148429. { { 0xc60934ae,0x2980fddf,0x164206d1,0x2c3e7eff,0x416ed75a,0xf75e7f96,
  148430. 0x5cd0b2dc,0xfac60cf3,0x1faad87b,0xddc4bece,0x9849e5dd,0x753fa87c,
  148431. 0x2c1bf1ae,0xc5d516a3,0x14732b4b,0x565dbea8,0xce48696b,0x007ebe3a,
  148432. 0xcdb97694,0x40ca74d6,0x65e4e7be,0x3f5cd270,0x3aac4ebc,0x74847c01,
  148433. 0x43d6c3a1,0x6762e034,0x467a076a,0x690d8c95,0x1eda677d,0x768d78d6,
  148434. 0x0181d8c2,0x0997ce55 },
  148435. { 0x965a0b81,0x9297746c,0xe5e12dfa,0x48b58be6,0x715f437f,0x5573b3c4,
  148436. 0xb565c459,0xe425e907,0x1582797c,0x4f43f512,0x8ea5474f,0xe5dafa6f,
  148437. 0x13de04ac,0x2aeb8fbe,0xe8a07c83,0xed7f95f0,0x662c09fe,0x3e012a6e,
  148438. 0xc742cf17,0xbf96e9b8,0xe28a1c45,0x8ea5759a,0x5cf4e2f3,0x475941b4,
  148439. 0xf901a019,0x7dd3c02d,0x70916b2e,0xe7a4deea,0x2fa9b988,0x50b272b5,
  148440. 0xd0917fe6,0x96f9f09f } },
  148441. /* 112 */
  148442. { { 0x2c310a96,0x78e8aac4,0xf7a2a734,0x32a98303,0x23962207,0xc46ca83d,
  148443. 0xd9541280,0xad131e6e,0x2cabe911,0x5791fc5e,0x841b6c68,0x50cb77eb,
  148444. 0x3d3c8878,0xaff93dea,0xf1007bce,0x06541f1d,0x55cdf1fd,0x4ee729c2,
  148445. 0x323e3972,0xe0f71317,0xad4d08c1,0xa2de7a41,0xa35e22bf,0xa9912abf,
  148446. 0x89b03325,0xa050122b,0x06514d4e,0x8b9e51f4,0x79d3e0ab,0x423c7aad,
  148447. 0x40b8fea5,0x71998e26 },
  148448. { 0xceb6ed78,0x40140fcd,0x18534516,0x653cf377,0xe8d60dcc,0x0450b65a,
  148449. 0x9dac55f8,0xce6c1a76,0xae05686c,0x8a96a92d,0x12712562,0x2fe44762,
  148450. 0xa4f39425,0x747bcb50,0xfc531fc2,0xf0ec6ff2,0x10fe9ff0,0xc97c3447,
  148451. 0x9c792cff,0xfb488783,0x026fb019,0x552c5248,0xd804c290,0x4001a29c,
  148452. 0x35c8ca73,0x742b5ad8,0x6ee5dfa0,0xc3781f17,0x3dfa4ab1,0xca6b85f0,
  148453. 0x0b0d32ac,0x8389941a } },
  148454. /* 113 */
  148455. { { 0xde067dff,0xc0f062a2,0xbcb80162,0xd4f32690,0x0707a2bd,0x98cd990d,
  148456. 0xfae4a391,0x5afc63b8,0xb32ad814,0x684f1b7b,0xf199dfb1,0xb0a2dce2,
  148457. 0x48f25848,0x2260e17f,0xc2d5e862,0x7393db00,0x338cf171,0x9e88f854,
  148458. 0x02acf522,0x00679429,0x6835af3d,0x19157cb8,0xb8a2614c,0x2faa6f92,
  148459. 0x134ec46c,0x04ff95f5,0xfb7a8135,0xcf00626e,0xb37a4704,0x454b3d05,
  148460. 0x2694ec25,0x1fbfda31 },
  148461. { 0xc8f69c77,0xfdebb657,0xa3df88fa,0x92a8278b,0xc1fb78b4,0x463b5571,
  148462. 0x11c71a33,0xd2066a1a,0x089958b0,0x10c88143,0xcf9d67a6,0xb975c7e0,
  148463. 0x73037b8f,0xdaa5d208,0x40bf5861,0x5ee5005d,0x7dba69a9,0x300e6ce7,
  148464. 0xc962cc74,0x893c3cb3,0x4cf84055,0x0ac98629,0x225c9d70,0x0a7ef63a,
  148465. 0xb91e47e8,0xfe184869,0x8c2f84be,0x1b9d7deb,0xc0e278bf,0x67788915,
  148466. 0xc426f19e,0x4f9488ca } },
  148467. /* 114 */
  148468. { { 0xdd51b8ce,0x610dfcd4,0x36230e80,0x08579278,0x36599562,0xedc7ff1c,
  148469. 0xe2cae877,0x905ead4b,0xe7967608,0xa1c325d9,0xbd38926c,0x3e39eddd,
  148470. 0x5f6f0a4e,0xda92c868,0xf47a0fa4,0xe16f800a,0xe5f60aab,0x50b4db5b,
  148471. 0x983853d3,0x3665412f,0x9b79789c,0x64b62250,0x4e0e72b2,0xea560058,
  148472. 0xe555c2bb,0xabbd4901,0x17292e11,0x378419a7,0xe174218f,0x6e0b5aaa,
  148473. 0x8f796b92,0x688e0684 },
  148474. { 0x313b8f64,0xcdfef641,0x942c7462,0xaef11b7b,0x5c0d8abd,0x067cfb77,
  148475. 0xaf4041a9,0x608ea5f0,0x6935210f,0x23d5bd82,0x27917a08,0x5ab904fc,
  148476. 0x45d22d21,0x85dbb1fe,0x4d36159f,0xc3d5e509,0x1d39b8f2,0xaebb528e,
  148477. 0xf44acef0,0xdd5ca828,0x20c57a54,0x24209adf,0x78f95f44,0x5742b433,
  148478. 0xa9337d37,0xd11fa7d9,0xc64cfdb7,0xd66a0c09,0x9bb817ec,0x56e55b8f,
  148479. 0xe4c41265,0x1723c7e3 } },
  148480. /* 115 */
  148481. { { 0xdc8b43f3,0x9a6486d8,0x26409e68,0xfc3e0e61,0xd9b46003,0x1889c437,
  148482. 0x6284ec7b,0x3a850335,0x6a9dbaea,0x5a3665c4,0xe978933c,0x7bf6941d,
  148483. 0x69341490,0x1ed5a510,0x8cb8002d,0x664a7b7a,0x60ed0a59,0x603f76e4,
  148484. 0x1f4ebf27,0xc3e06ba3,0xf2c38a7f,0x296ced41,0xcf1db08a,0x2ac18f79,
  148485. 0xcde7a3b6,0xc919e882,0xdbf68b06,0x15e77d29,0x4e947cb5,0x21978baa,
  148486. 0x7630993a,0x84bf542b },
  148487. { 0xe364f21e,0xc1decda9,0x012e557e,0x0d6cf345,0x588f90e1,0xba246848,
  148488. 0xe3b104b8,0x9f6dda4b,0xe3aef57a,0x6bf7a346,0xe8327ea9,0x210299fe,
  148489. 0xda95e6c7,0xaa99f487,0xd2cdf645,0x24ff813e,0x8bd414b8,0xd1dbb2d2,
  148490. 0xcafa1a61,0x065101af,0x9cdebda4,0x7d9f4b9a,0xe41039e4,0xaf41b395,
  148491. 0xc50adf42,0xe3e9e6ba,0x341e9e49,0x4f2133ae,0xcb157f23,0x4968c0f3,
  148492. 0xda068153,0x383f827b } },
  148493. /* 116 */
  148494. { { 0x6583ff4c,0x2ec46a21,0x4ad709e7,0x4e645a29,0xc04ca12a,0xdc66e9cf,
  148495. 0x9160a7e5,0x82f128f4,0x569c762e,0xbfb227b1,0xc2edb8e7,0xf80c7963,
  148496. 0x49a0f688,0xa7dafe06,0x2d14b8cc,0xb7e41754,0x86de40be,0x3a0c5c53,
  148497. 0x1db79331,0xf0d05286,0xfbfe071b,0xb902ce69,0x210e9903,0x61e46956,
  148498. 0xf703ebb8,0xfaef874e,0xdd5f78b6,0xf668947e,0x5af5ea3a,0x6fe86547,
  148499. 0x43f94625,0x3b121f15 },
  148500. { 0x659275e9,0x5b26e847,0x6d0fce50,0x47581cfd,0x8aa3f1ef,0x55f5cbfd,
  148501. 0xe484e60e,0x1e7be315,0xfe9698e4,0xd8f1a20f,0x7ab04784,0x25d46da9,
  148502. 0x834cdb3e,0xa526db75,0x8d08a009,0x1fd408d9,0x5b5ca816,0xfc004b20,
  148503. 0x65e4bbe8,0x5b3e3bb3,0x759bb6ef,0xf50cc125,0xc2fac737,0xf05fa817,
  148504. 0xd273951a,0x9ee102d2,0xfecb3367,0x2a8e540b,0x2a6a515f,0x673446fb,
  148505. 0x37290c83,0x5505e1d1 } },
  148506. /* 117 */
  148507. { { 0xd15e68a6,0x0c3014a1,0x64dd35e5,0x6f9f0b26,0x03ad67f9,0x18c3742d,
  148508. 0xd2c14484,0x74818c0e,0x0d41a3cb,0xc5181169,0xc49f3e9e,0x65c8c83f,
  148509. 0x2c279386,0x9b260c61,0xced04e9c,0xf6086fae,0xfd7c4758,0xa7b2cceb,
  148510. 0x90297fd8,0x4b3c3133,0x09701ac8,0xca8264e8,0x508b3762,0x9f976a87,
  148511. 0x983a8dfe,0x5d582714,0xd9d598e9,0x350d2669,0x0f6fd348,0x85cb89cb,
  148512. 0xa574317c,0x617d80d4 },
  148513. { 0x70022b67,0x4cef267e,0x3768b94a,0x80536bb5,0xd2784462,0x3153a566,
  148514. 0x38243919,0x49054d44,0x5df78c4a,0x8d11e172,0xd5a1e35a,0x9b252a71,
  148515. 0x8171e31d,0x07866c80,0x1b38a00e,0x0a8501db,0xce770236,0x2ed932b8,
  148516. 0x8edaf7d0,0xa2d77609,0xb93006e9,0x3aee5dab,0xbbfeb036,0xfaffc8c4,
  148517. 0x4e21b38b,0x077b9678,0xdca8e069,0x491fc59f,0x0e938471,0x3f624f55,
  148518. 0x7cd1780b,0x5156f508 } },
  148519. /* 118 */
  148520. { { 0x0206e8d0,0x58234e22,0x7f15af32,0xf5f6f5d4,0xd638950f,0xafab7289,
  148521. 0x7d4495f4,0x66ec4d09,0x68da80a9,0xad890c5d,0x64f8a36b,0xe4aa0920,
  148522. 0x0f4d5c5f,0x799e257e,0x24495e31,0x44c677ae,0xa5b8e352,0x720387b3,
  148523. 0x75a287b9,0x703790f4,0xc3c1f2f7,0x54895cc5,0x41a7fa41,0xb8680f9b,
  148524. 0xb00b008b,0xfcd47458,0xba6473cb,0x149cc838,0xac9be19a,0x78ed5f7a,
  148525. 0xb33765ba,0x5254599c },
  148526. { 0xa21b54c4,0x08739679,0xb6497d9d,0x029ece2a,0xc8488640,0xf14f1a92,
  148527. 0xe9fa79d9,0xae48dcff,0x46c208db,0x14b911c2,0xdae3f69e,0x5ab0fbf2,
  148528. 0xd1edb838,0x180ac87e,0x188586bb,0x146fd718,0x5467cbd0,0x210eb654,
  148529. 0x1667cfee,0xaa239408,0xb73d1a60,0xdb125c1a,0x881c1cbe,0xde685300,
  148530. 0x37c30232,0xfe34c713,0x6f3c8d18,0xc6c6070e,0xb4af4e83,0x07e365ba,
  148531. 0xdcf82b45,0x22f0a7ed } },
  148532. /* 119 */
  148533. { { 0xea7f1b7f,0xe262791f,0xdcff09d4,0x9c3d8c5d,0x39c7dc58,0x86c2a9c3,
  148534. 0x4276e8c0,0x4dad4017,0xe9fe1d56,0x0a918f59,0x2aa810c9,0xb8d79670,
  148535. 0x4aa5cdc4,0xeb7a8836,0xe7afa72e,0xfc4c23bb,0x4ac86908,0x4dbb5c9e,
  148536. 0x6a0c7e6f,0x37e39013,0x49c218d2,0x855d7001,0x94b324a2,0xe475bc67,
  148537. 0x6287a071,0xc98a8dc6,0x5fb4323c,0x395a299b,0x0c0389e9,0xe186c3ee,
  148538. 0x16734c46,0x79f81e6f },
  148539. { 0x364f3c4e,0x83f2c1f3,0x1367e14b,0x536b2ac5,0x5933e43d,0x44a6dcfc,
  148540. 0x10d961fe,0x34e59475,0x7e3f2aae,0x08234ece,0xbdea7f25,0xcb92e00a,
  148541. 0xa791a124,0x1efba4f0,0x1192d53a,0xc2086fd2,0xb51c8af6,0xfec0d0fc,
  148542. 0xdc0f1b5f,0x48d1b2ca,0x812dbe19,0xb07a388f,0xdedbdd45,0x40873a6a,
  148543. 0xd702589a,0xbc2a1268,0x17e27b64,0xbbf6e3a8,0x6d386e85,0x73ee5663,
  148544. 0x9de7c000,0x442ecd37 } },
  148545. /* 120 */
  148546. { { 0x8a2f90a6,0xb4cd1ae6,0x6f5ad0cc,0xf277d41d,0x401d4b8e,0x6a3828c4,
  148547. 0xd8376631,0xe817a134,0xf5e1124b,0x142b758d,0xfd6b95e4,0x25fbc69d,
  148548. 0xd74a9e3e,0xa30c9f5f,0xd89663ce,0x5ac0f163,0x0ce6386d,0x32a9eef7,
  148549. 0xd8ed5544,0x7a690ea5,0x9889427a,0x5de23ff0,0xeaaced58,0x75ad36a5,
  148550. 0xd3e18465,0x3514a6c1,0x7f093910,0x3d9162c3,0xe33d56e8,0x5c10add9,
  148551. 0x06aa691e,0x85176b73 },
  148552. { 0x28a21e38,0xa32110fa,0x5773d538,0x97b6379d,0x2d020dc4,0xd3697bbf,
  148553. 0x961833cd,0x59177593,0xe5fa8516,0x6d7045fa,0x786ab5d2,0x3390f29a,
  148554. 0xdc4f5b70,0xac0bda30,0xdcc615c6,0xcca0240a,0xc5146d91,0x8e1f1702,
  148555. 0xa72cef87,0xceb472d0,0x0b669ba1,0x84840708,0x7e61aa0a,0x79b08f9d,
  148556. 0x4669560b,0x388160be,0x948eb71e,0x23935c2d,0x9431590c,0xd7fd83c0,
  148557. 0x6e5768b3,0x8ab154bb } },
  148558. /* 121 */
  148559. { { 0x353c4a96,0x28686003,0x905cd835,0x4e5c60e8,0x8f66f8cc,0xbd591364,
  148560. 0x9faccf9e,0xb6b80b98,0xe32639e5,0xbc1c1fae,0x278aadeb,0x2f6396d2,
  148561. 0x1898202d,0x00a796d0,0x3a474835,0x18ab548f,0xb31b0e3e,0xacd056c3,
  148562. 0x0164512d,0x15ba68dd,0x4b03f3bc,0x203836d9,0xd8f206c5,0xd64eca6b,
  148563. 0x9f1779b6,0x931a361e,0x52ab34a8,0xd82690fc,0x92922e22,0x342bb8e0,
  148564. 0xe00b02a9,0x1bfcdd84 },
  148565. { 0x75a365d9,0x310b9a43,0x08d8fb03,0xd4ade15e,0xd742df83,0x9c9753d7,
  148566. 0xde318742,0xcf7309d4,0x3360ace0,0x1228e212,0xf7669643,0x1043d238,
  148567. 0xf90f5a53,0xfc2adbed,0x7b5f9397,0x41d64cb7,0xc446d010,0x5200b30a,
  148568. 0x231720fe,0xc3c8642d,0xb9aa2075,0xfcc0122d,0x041eae47,0x856e3b12,
  148569. 0x68c876a4,0x45864455,0x233606b1,0x1a1c7842,0x227757bf,0x9b766d1f,
  148570. 0xf7b9d4f1,0x25b78a3b } },
  148571. /* 122 */
  148572. { { 0x156707ce,0x90835718,0x4314f90a,0x9bdc2398,0x8be57dbd,0x017c885a,
  148573. 0xad63a4b8,0xd4bba225,0x15aacffd,0x5ce71b86,0x72954722,0x5f266475,
  148574. 0x4f0ad3dd,0x0a80f1f7,0xfc352ed7,0x010538a3,0x4203c6ca,0xf8a64045,
  148575. 0x330c73b4,0x2b2c7a88,0x02dcac1b,0xb3433ee6,0xed2b17c7,0x2e0499cf,
  148576. 0xbd6329c7,0x9f8681a4,0x36fadc37,0x38979946,0x92b7895b,0xdc5650c8,
  148577. 0x65a51cf0,0x70ab9570 },
  148578. { 0x7b585d93,0x46778ec4,0xa633fe4e,0xca6d3610,0x4ea0311a,0x21da154e,
  148579. 0xbd64002f,0xaf22190b,0xd91cb7a9,0x9e633ac7,0xee6837d7,0xed13c31f,
  148580. 0x1616ee8a,0xda4a07d7,0x3afcd616,0xd78a2732,0xba14d694,0xc06696e5,
  148581. 0x4df58420,0x733754d7,0x2778e3c9,0xe85e504e,0x55b5a5c2,0x3055aa0c,
  148582. 0x8a3acb5c,0x313df538,0x2a088eda,0x5896acb5,0x84c85dde,0xfc8842a0,
  148583. 0x51dde6be,0x5fec9f79 } },
  148584. /* 123 */
  148585. { { 0xfe519f99,0x5ebc2c7c,0xe5410353,0xe396bd80,0x8a3988f3,0xaded9402,
  148586. 0xd601bda1,0x1c03b735,0x14ce64ac,0xfd302036,0x01240290,0x5837ebe9,
  148587. 0xa554097d,0xcaaea1a3,0xb0b88139,0xdce73d25,0xecb090b9,0x35ed412b,
  148588. 0xd63dab3c,0x99029ff7,0x062db071,0x555437d9,0x42a4c11d,0x277d2f56,
  148589. 0x24fc9109,0x477fa645,0x2799254d,0x7b12e9b7,0xd84c618c,0x7ad2ae22,
  148590. 0xce8ed195,0x0a8d5663 },
  148591. { 0x0a21fde1,0x43ac5163,0x6903d849,0xcfcf5dd6,0x5fdd6281,0x6d2499ee,
  148592. 0x77a49a34,0x4dedc6f0,0x2875c06f,0x46bda2c0,0x347b8046,0xd0e0e0f6,
  148593. 0x5e67836f,0x1058169b,0xde8a8042,0xc961912a,0xa93b3d32,0xdf3fea0a,
  148594. 0x0c576bc5,0x9f138edb,0xd8d37e47,0x7971ad6e,0xcce5e7cb,0xeab85739,
  148595. 0x1d202b40,0x88a4b434,0xe3a1fd26,0x5d842557,0xb3a86f91,0x872fabd5,
  148596. 0x6aa4629f,0x95b93493 } },
  148597. /* 124 */
  148598. { { 0x99f951de,0x9998a701,0xf058db45,0x8fade596,0xf3d03dd3,0x4d479c1e,
  148599. 0x33b141d3,0x6e928d5d,0xacfe8a40,0x9a465800,0xc1cefa3d,0xd108ad2f,
  148600. 0xe013726e,0x64b96921,0x8e83bb9f,0xb9b6a6b6,0x1242e544,0x29f1e6dc,
  148601. 0x2f65966b,0xd3f8f676,0x5e105b41,0xa34dd096,0x16011e1c,0xd4e9139a,
  148602. 0x2515541b,0xeea4dc68,0xc822166d,0x6f8030ac,0x31d16124,0xbdc7ae1d,
  148603. 0x621afa7d,0x2e25ef51 },
  148604. { 0xdd8e7357,0x2533cf8f,0xeaceddb8,0x333ba218,0x0784d2ac,0x68e3e31d,
  148605. 0xf2804ae2,0x1c927f36,0x77e7ad7e,0x01433d22,0x587f78a0,0x0b401cf0,
  148606. 0xaa0027ae,0x9dfcf036,0x1d9a46b5,0xc9e46c8b,0x1f288d32,0xaa6de486,
  148607. 0x1b8a043d,0xdd56da2f,0xf2d0bb56,0x346230e5,0x19defb56,0x19f0b6e4,
  148608. 0x21d2c874,0x55ec37cd,0xb70e45b3,0x3dbf0397,0xac7ce852,0xf0862a8d,
  148609. 0xe141f3d6,0x87979ea7 } },
  148610. /* 125 */
  148611. { { 0x7f1c747f,0x9b7e7b3f,0xc6e63369,0x151a4c1d,0xb372dba0,0x4273ff70,
  148612. 0xd3ee54fe,0xca6d2234,0xd33cae0f,0x12fc8e0c,0x5dd6f10c,0x27328538,
  148613. 0xf01a9cf9,0xc86f3fbd,0xe36cae91,0x5322677f,0x2fefea44,0x39a70033,
  148614. 0xce8af217,0x2c9ca328,0xf6a731f4,0xc0256776,0x66a96813,0xc687b3df,
  148615. 0x8db2eda8,0x194aab12,0xeec4febd,0xde30dc5a,0x979241b2,0xc052236a,
  148616. 0xc23d4c16,0x3ec98802 },
  148617. { 0x4072f74d,0x0f9e760c,0xab594059,0xe78eb0de,0xc9b009c2,0xdb3dea40,
  148618. 0x38b59ae5,0x47e875f0,0x2b4daa06,0xf40eb436,0x090f3788,0x9a6a4f92,
  148619. 0xedbfaf8b,0xefebe9af,0x9867e256,0xf87f96a5,0x75ab6aeb,0x1e6fed23,
  148620. 0x3fdb13cb,0x17f2782a,0x70fa2621,0x5102c71e,0xfd4c0dbe,0x5d2b06ec,
  148621. 0x30347297,0x537cc268,0x2b67e780,0x8dbf5e2b,0xba25da32,0x2f633f3a,
  148622. 0xefaec914,0x3e9315e8 } },
  148623. /* 126 */
  148624. { { 0x239a9ea9,0x9255cfa5,0x0be33a62,0x20f3c690,0x9cb642bd,0x759eeb4b,
  148625. 0x00bae718,0x3316c546,0xf3410f84,0x874a76d5,0x90f129b6,0x123b502e,
  148626. 0x12851f1c,0xadc8f9a8,0x1b62408c,0xf57b764a,0x1a80777b,0x116ec01f,
  148627. 0x1f0ddc5c,0x746ecef2,0xe5a6a5a7,0x3c49d47c,0x06e955ba,0x1e15dbe7,
  148628. 0xb45d79b0,0x629c0c79,0x778d1087,0x11278308,0x8c6a22d7,0x22585dc7,
  148629. 0x0a682791,0x2ed02a0d },
  148630. { 0x4daa2682,0x53043416,0x01359625,0x0e26d32b,0xbd867097,0x449c834a,
  148631. 0xee77ae2e,0x11a19d2b,0x3af6c169,0x39bd529a,0x5cd61054,0x36cca5c0,
  148632. 0xdc6c0fe1,0x6370a59b,0xb93d5135,0xca420d27,0x554c451a,0xd8730d45,
  148633. 0x96cdebf2,0xebd258c9,0xa50f9a05,0x0cb1b990,0x7b0f0151,0x69a8c97a,
  148634. 0x11d217e1,0x2cc36d34,0x752f75e8,0xf117688a,0xa09b2a61,0x1db01394,
  148635. 0xa9efd7dd,0x14627844 } },
  148636. /* 127 */
  148637. { { 0x232803cf,0x6bca3aed,0x9a96ff34,0xc1e4398b,0x74ab788b,0xcaf6757f,
  148638. 0x7e68c04d,0xc3a53e00,0x5cb7cd20,0x5f969c19,0xdc068bca,0xf28b65a6,
  148639. 0x1d863032,0xe3ca01d3,0x87808e14,0x9b733b81,0xefe618be,0xb5d704d9,
  148640. 0xb01b946d,0x276f3542,0xfbedddbf,0xe057e19e,0x903275ce,0x7d182f2b,
  148641. 0x880f7bc6,0x3cdc5f77,0x78476c14,0xd6f03d3f,0xa9ba5072,0x035f5557,
  148642. 0xb4029628,0x7acb57b6 },
  148643. { 0x44e6b07c,0xd2413569,0xe1c7345d,0x451c4cc9,0xe273b9fb,0x407444d8,
  148644. 0xb88e34fc,0xfe496079,0xf152776d,0x77d184cf,0xc742299c,0x6d1033b9,
  148645. 0x77bf2897,0x29a0a684,0xee8f0420,0x59ffdf10,0x44bb56d6,0x4e17146c,
  148646. 0xfb9ae855,0x831d06c2,0xd93e7cd5,0xb2cb82db,0x3c96b607,0x83381c46,
  148647. 0x7549e2a8,0x06aed251,0x774a21d4,0xef97891c,0x8675fbdd,0xae9807c7,
  148648. 0x6363516c,0x6a5a05b9 } },
  148649. /* 128 */
  148650. { { 0x6a8f4f33,0x92e71ea6,0x4dea8f4a,0xf2fc6fc6,0xfee88461,0xd356252c,
  148651. 0x08954d08,0x59b0a83e,0x468ab766,0x5bd68c23,0x900f8d04,0x40281357,
  148652. 0x52b867ae,0x181c19c0,0x18764c41,0x986a5169,0x13575d24,0xcb01dfae,
  148653. 0x593677b7,0x17269ae5,0x46dc9b19,0xf6d17025,0xc40097c8,0x8de68499,
  148654. 0x259c407b,0x76df0032,0x17d29d8b,0x4091aad9,0x4a7ab5f6,0xa7f46d21,
  148655. 0x70ece48c,0x688054b4 },
  148656. { 0x51a5b86c,0xf0d168aa,0x95777247,0x2437e4d8,0xf1720329,0xae844076,
  148657. 0x9647a54e,0x0a7ac87d,0x0405622c,0x1e597a4b,0xf0a79f2f,0xedefe5c6,
  148658. 0x4d55156d,0xaf3ef0c2,0xef047cf6,0x917fb04e,0x54b62137,0x3792799f,
  148659. 0x314be0b8,0x875ea32f,0x0c466b0c,0xe157c65b,0x7e218978,0xd28c90ce,
  148660. 0xcde587af,0xb90fc3ba,0x8b877bed,0xdd32d71c,0xca8e10cd,0x3b432200,
  148661. 0xd94f6e53,0x0021f419 } },
  148662. /* 129 */
  148663. { { 0x43519d26,0x2191122c,0x40a51845,0xbdafac1d,0x548bb89f,0xcc6f71e9,
  148664. 0x16844bf9,0x9ef3375c,0x178e8d55,0xe7789f79,0x1f8be1c5,0x04f599b6,
  148665. 0x2cbbde40,0x8088c99a,0x893206c9,0x8939a260,0xfcd30851,0xa1ae4bff,
  148666. 0xe08feafe,0x664cb3fe,0xff14aabc,0x61f38099,0x2a841ef9,0x0d8394cc,
  148667. 0x17f01db6,0x75fad8ad,0x6debb773,0x6fc34576,0xa4252512,0x1e716b05,
  148668. 0x29e1ed9f,0x79855880 },
  148669. { 0x95106473,0xa2cb3aaa,0x5a61da04,0x95fafa41,0x539563c0,0xfd3c9362,
  148670. 0x95312b87,0xbaa48091,0xbf885c76,0x6c7e7582,0x230c78d5,0x70f6dab6,
  148671. 0x7747440d,0x8ce3051c,0xffdb6186,0x6dbebd14,0x190e4096,0xb0e041fa,
  148672. 0x6ee62e2a,0xba10c466,0x74f333d6,0x93d57e2a,0xfe7b9b66,0x006aadc4,
  148673. 0x06d2837d,0xfaf72f6c,0x910741ea,0x318cc5e6,0x65692477,0x9c502609,
  148674. 0x1d0fb08d,0x95d823c3 } },
  148675. /* 130 */
  148676. { { 0x140528a5,0x6aeebd86,0x53979bc8,0xf268c2ba,0x4ec144ab,0xb1bc9b8a,
  148677. 0x82a7d7ed,0x1efabb0d,0x4e0118d8,0xf12c70d1,0xa1c1558e,0x31607168,
  148678. 0xe4b7e73e,0x33e428b7,0x83aec9dd,0x63176637,0xe12ac35c,0x5172ffbe,
  148679. 0xbc17b2a4,0x37df0bfb,0x741f812a,0x4212f870,0xe2888f9c,0x3dcecbdb,
  148680. 0x756ca55d,0xa9dc15aa,0xb9028e41,0xf31918ec,0x6aeadb03,0x7ede0285,
  148681. 0x78654f54,0x0e2708d5 },
  148682. { 0xcde20f88,0x2270cc53,0x5f5b1039,0x9338272c,0x5dcb1dbf,0x5042e19e,
  148683. 0xb72d74c1,0x4b3de219,0x2aaaaa55,0x16c49a8b,0xbba86ba6,0x008443e5,
  148684. 0x20cf1695,0xee6bcd72,0xa89abd11,0x59ffac6b,0xf115639d,0x2831217b,
  148685. 0xf34cba52,0xe4d28af2,0x0727a906,0xf27f03e7,0x69017766,0x6842c79f,
  148686. 0x7a81123e,0xcb3469bd,0xa42973b8,0x48c0f346,0x23990dbd,0xfc5784a6,
  148687. 0xfb299678,0x0d3dab3b } },
  148688. /* 131 */
  148689. { { 0xce29c3cc,0x8f8376e6,0xf016cbc6,0xcb0507ec,0x5e394ce1,0xdebff996,
  148690. 0x73c50d41,0x24fc526f,0x2d16ce3d,0x4edd5a54,0x91c13141,0xbb37bdd9,
  148691. 0xe33a8606,0xe3442ef2,0xc0629da8,0x2ae90337,0x592ab331,0x57faec64,
  148692. 0xd82b857b,0x1a938997,0xa3373176,0xad6c8cb9,0x9086751f,0x82595de2,
  148693. 0x18c17196,0xa81e97fb,0xbf697357,0xe4f48a13,0x5cb89f69,0xa1387c2e,
  148694. 0x5874b426,0x530b4eeb },
  148695. { 0xbab7b5ae,0xe9f275a1,0x03a57bf4,0xbb69dc4d,0xa45c505b,0xc974dc4a,
  148696. 0x416ac402,0x726369f3,0xaed985dc,0x735e4e78,0xcdd446a1,0x0548d879,
  148697. 0x9e16b02a,0x84ceb069,0x789b11a6,0xf73f6fa4,0xb2a4e784,0x6aa0c41f,
  148698. 0x93a9b697,0xb1f76902,0xf03a8ab2,0x814cce00,0x844d66c1,0x64cb255b,
  148699. 0x30952201,0xb794e7d6,0x3da32271,0xe052d4e4,0x08b6a4d9,0x5278b2e7,
  148700. 0x80c6577f,0x90942552 } },
  148701. /* 132 */
  148702. { { 0x0d5b4c2f,0xd269a14d,0x5c8a649c,0x2b8fc59b,0xb0e37d4a,0x95becb3a,
  148703. 0x9111037e,0xfda1a768,0x94e35322,0x5810e05a,0xa178fafc,0xa24dcc12,
  148704. 0x8e3dce62,0x5c2c63b2,0x9452c444,0x995c3f17,0x42d45161,0x35330ec3,
  148705. 0xb4ef8129,0xa025a60a,0x8bae9c13,0x85493252,0xe2e3caf8,0x25d1a606,
  148706. 0x3649bf47,0xd44091ab,0x704ec5f1,0xc7d0afbf,0xbd8b3333,0x27bd1d62,
  148707. 0xcfe616f5,0x50570111 },
  148708. { 0xf534356b,0xd0084ace,0x4b4b0fbc,0x9df1de05,0xcee04dc1,0x021afe05,
  148709. 0x361b78e1,0x64bde688,0xef78d38b,0xa324fcc7,0xeb0a5e4e,0xfeb372ce,
  148710. 0x65811996,0xef04fcb3,0x5eb0ab4e,0x7dce5d50,0x238c586e,0x1e29b588,
  148711. 0xbcd80037,0xde5e3197,0x4806b9cf,0x8bf5e451,0xd18e67ab,0x4330968b,
  148712. 0xf9f63fad,0x26a7d04e,0xb5c18bb4,0xa1c7f123,0x25dce22c,0x485b8482,
  148713. 0xd540e79f,0x8ff0b36f } },
  148714. /* 133 */
  148715. { { 0x3ff42cff,0x99f2e2f4,0x1c35317c,0xa3c19f9d,0xaba1b545,0xdb749392,
  148716. 0x4afa9a32,0x84232b05,0xd7dcd436,0x0b855d46,0x45cf9915,0x8ac35e20,
  148717. 0xf001a218,0xd7cf22c7,0xed408305,0x057d35ae,0x553ccfcd,0x25a4a519,
  148718. 0x93e2b939,0x5e565793,0x3422ec27,0xa20332b0,0x3ac53958,0x9b09005e,
  148719. 0x79e9b163,0x628051a3,0xfc6618d6,0xb4a0dc09,0x6748e7af,0x9e0e857f,
  148720. 0xc577d63e,0x71b28eee },
  148721. { 0x99726bf8,0x4942b0cd,0x1c208f3c,0x1290a3b9,0xb0598eaa,0xfd7290e7,
  148722. 0xa25a9128,0xc6a7791f,0xc037d7da,0x2d33db24,0x70e2837b,0xc21efeb0,
  148723. 0xe3dae2a0,0xbf70d96e,0x85076027,0x43ed8191,0x4d4ad7e3,0x4aeb0aa8,
  148724. 0xe8c5b74c,0xbc75101f,0xad26ebdd,0xdbfb2a6e,0x6b78aa4e,0xba812068,
  148725. 0xe1159848,0xc94aa8f2,0x3eba5c4e,0x0d10d9db,0x6318295a,0xce7fec47,
  148726. 0x330d925a,0x7294711a } },
  148727. /* 134 */
  148728. { { 0x32bbd495,0xfce45904,0xbe54973f,0x330f4dd1,0x5d9c3f4e,0x006bee1d,
  148729. 0x59ba7204,0x40ee6078,0x42c2c768,0xc194fd3f,0xe9fe88be,0xa0e76b12,
  148730. 0xec2b0210,0x17cddddb,0x00811ec7,0x689d436b,0x284be9e4,0xa6a6ba37,
  148731. 0x007d4114,0xabc395b2,0x0f11e744,0xf8cdf9f3,0xe9396402,0xc5febec8,
  148732. 0xeeb46285,0x8a751743,0xc6e0d137,0x99bf8782,0xbeb292e3,0x3965e170,
  148733. 0x5801fd5f,0x001c39d8 },
  148734. { 0xda4a0912,0xf4805cb9,0x4410bca4,0xd27cb76a,0xec71d65b,0xef3dcb8e,
  148735. 0x4816849a,0x780fbb2b,0xa8b24635,0xef6a7026,0x12c44e68,0x15625c88,
  148736. 0x4d7a74a8,0x624c232c,0x4b1631e4,0x81a77037,0xdb917c2e,0x04e4f7f1,
  148737. 0x1f61ed95,0x1d0465fd,0xcbde6e3d,0xb1048049,0xd7131fcf,0x637ce0c1,
  148738. 0x8ada4715,0x22e4dbc2,0xace99726,0xf7530c5c,0xee287450,0xa0160dcc,
  148739. 0xbb91af13,0x9132e670 } },
  148740. /* 135 */
  148741. { { 0x7996099d,0x8057efe2,0xa06e608c,0xb72344db,0xd0958588,0xeb4a8740,
  148742. 0x79e5aee9,0xe53daf06,0x908a2fad,0xc9560a9a,0x107e706a,0x7f4be131,
  148743. 0x2830246a,0x6d5f3d9b,0x27cca3e6,0xa5f8e8da,0x4c28f292,0xeb51dca6,
  148744. 0xf31dfd78,0x4cfa310e,0x2ca073e5,0x92e0c7c2,0xa40da683,0x102f1694,
  148745. 0x750d38fc,0x16bb07cc,0xbadae035,0x703e83e2,0xb4d3c9dd,0xea93c066,
  148746. 0x79940ed1,0x7d0b03e5 },
  148747. { 0x4dd94c63,0x5fe7ea30,0x738b0b3a,0x57ef01c5,0xa14e6b4b,0x9534a78c,
  148748. 0xa5353276,0x07622cde,0x7c22d006,0xaf696a07,0x7d46b209,0x733c1886,
  148749. 0x626c2b4a,0x9654ccbb,0xa84f3c4c,0xa098d3a1,0x2d734b74,0x3596f9ed,
  148750. 0x5d551c90,0xdfd3021a,0x1ec5123f,0xe2ba7d2f,0xb2c1aa39,0xf9726925,
  148751. 0xf8eb2927,0xd2e75d0e,0x19192a6f,0xfaba712e,0x9b83e50e,0xa606b43a,
  148752. 0xdab5de60,0x31b1782f } },
  148753. /* 136 */
  148754. { { 0x4034db92,0x878dba45,0x8f34dc4d,0xa3977901,0xdf754c33,0x8d004f2e,
  148755. 0xcd563a88,0xeaa5954a,0xbb5ffad1,0xa29d6c89,0xb0d8bdb8,0xa8adf655,
  148756. 0x8cdbdb47,0xf7fb842d,0x80d3205b,0xb72e3a03,0x7cac7ca9,0xc335b0b2,
  148757. 0xd8a5475d,0xffc60bcb,0xeba4d25f,0x736f7719,0x0c50fca6,0x3d901c38,
  148758. 0x80c01900,0x1fdacf7b,0x5681f84d,0x75cf658f,0x5cefbbc1,0x57a7e634,
  148759. 0x3e07ed1f,0x6fc0fbe5 },
  148760. { 0xb81b0e5f,0x496d116b,0x2ac853b8,0xd82dd2a5,0x327387f0,0x357e22d4,
  148761. 0xba912c59,0x3e332a84,0x49d5dcc1,0x8b71c643,0x438d85d3,0x0c982ee9,
  148762. 0xbf7fcd4e,0x90b9553c,0x38fed5e3,0x2cb39bbc,0x5ac42903,0xa2c67c9c,
  148763. 0xbf07da55,0xebf21217,0xa0b9e4ee,0x55ac05ad,0x8ee9e0c6,0x10bb12c2,
  148764. 0x48bb6e3f,0x5cf3aee5,0x8b046e91,0x4ae7269c,0xaa0e553f,0xcb266012,
  148765. 0xa94c8fc8,0x701935a1 } },
  148766. /* 137 */
  148767. { { 0xa4626dea,0xde58d41d,0x15b9039f,0x25ef66ca,0x3164e65b,0x99a810a4,
  148768. 0x748cfccf,0x9fe6daad,0x2f142fa9,0x7ab9a6bd,0x5d471796,0xa4cba168,
  148769. 0x6bc3a39b,0x12d30b36,0x8bf45076,0x1f46a5dc,0x1421ac0e,0xb868e529,
  148770. 0x59bba1c4,0x7a686206,0xda698b90,0x2b4b552e,0xe5453707,0x5039dcd4,
  148771. 0x9e90165f,0x42a07a9e,0xd7d45dfc,0xa838fff3,0x3b5ceb30,0x41991e5a,
  148772. 0x969ca600,0x6c961ec8 },
  148773. { 0xc4e7eb46,0x703bdc1b,0x596c7b48,0xd6bac557,0x66afd74d,0x4f9917cd,
  148774. 0x656ce6f3,0x56355105,0x32497175,0x3d1fb50c,0x63effb2d,0xfda6783e,
  148775. 0xeefaa2bd,0xbd79f1f3,0x17af9ef7,0xa4efbe54,0x5a55b7a4,0x6cef6462,
  148776. 0x1a713304,0x116f3238,0xb95625a3,0xdb2a2a7f,0x0b027e96,0x6a0aa43a,
  148777. 0x4832b3bc,0x458fe5d2,0x5adfaac0,0x523418df,0xc49e7f9a,0xc05a89cb,
  148778. 0x69e24b53,0x830883d8 } },
  148779. /* 138 */
  148780. { { 0x02557389,0x959b1c62,0xadefc0bc,0x5fe5ce97,0x8330f383,0x893bbe7f,
  148781. 0x16cfb81e,0x27e0c6af,0xd04428fd,0x6f64e65b,0xb79e6182,0x53de9245,
  148782. 0x487e11ca,0x08a313c1,0x445bce93,0x65cec3b9,0xd67ed49e,0x33bc0314,
  148783. 0x30782352,0x69f36b24,0x93ad31d2,0xd78e5daf,0xc780890c,0xf2682b70,
  148784. 0x9e45efe9,0x7015c34f,0xe6cbafea,0x135d4ba4,0x7e3fcc6c,0x43a378a4,
  148785. 0x96638f8c,0x2376f97f },
  148786. { 0xae575b99,0x0a6e1ec0,0x81b970dc,0x7e14cb4f,0xd3a73947,0xf00a3824,
  148787. 0xfb235a9d,0x0b4b9c81,0x5bf62944,0x8d15115f,0x1e165d7a,0xcfd35b43,
  148788. 0xb2ee3e3b,0x5d12fea2,0xf5182e7b,0x629984a6,0xc365d08e,0x4e43e2f3,
  148789. 0x30f36e72,0x99327091,0xfd345401,0x698b4a00,0xbaf96dce,0x23c4fd0e,
  148790. 0x23675554,0xa60ba0ae,0xb0325784,0x51bdac2d,0x215464a1,0x8ab4190a,
  148791. 0x6bf10296,0x8c461661 } },
  148792. /* 139 */
  148793. { { 0x2d1f36a5,0xeffca258,0x894c5f2d,0x0eded2b2,0x43ced84f,0x35a5cdb8,
  148794. 0xdb0e3b9b,0x290f8982,0x0719a112,0xcce0eaf0,0x39a362d6,0xd0e657e4,
  148795. 0x62697e47,0x5516a55d,0x8e636514,0x269e1f77,0xd50269bc,0x5e3dedcb,
  148796. 0x441c57c5,0xecec2300,0xc705578d,0xdb83f31c,0x1e489eab,0x1bdefb73,
  148797. 0x395fcdb4,0x20b678cf,0xff9db001,0x908cf91c,0x55f52cc8,0xcbebc6f4,
  148798. 0xb4c61162,0x155ea622 },
  148799. { 0x876fa42e,0x94be2f1f,0x7fadeee7,0xab5e8749,0x38c865af,0x692e70f5,
  148800. 0xdf8059b0,0x16e99b84,0x8b5a7ac9,0x0ceb606e,0x2d463d2b,0xced23357,
  148801. 0x2a9a09a0,0x2d0f2623,0x3861fbdf,0x2529998c,0xc1be310b,0x711888a7,
  148802. 0x0d8aade3,0x9b1229c5,0x3b13533d,0xdbcf9b78,0xff029708,0x3ca746f8,
  148803. 0xda83ef88,0xa5a013a1,0x4ab28444,0x8e904d18,0xbcbd4aba,0x2fe84b3d,
  148804. 0x259058c3,0x8f570f24 } },
  148805. /* 140 */
  148806. { { 0x2ca9c508,0xdeb66c8a,0x69d6b780,0x2dc5bec2,0x88ead600,0x16d61266,
  148807. 0x49d72614,0x61841b97,0xce472e6f,0x41e40e6c,0x1fa7a876,0xada24264,
  148808. 0xcc3997a0,0x45b9fd33,0x7c15dcf4,0xb25e8fa9,0x12e9629d,0x0124ceb2,
  148809. 0x7db3d956,0x3a8c72c6,0x7c1a7844,0x8e2ded2b,0x6dd027ff,0x94ab09c6,
  148810. 0x7e7a2bc6,0xf89a057d,0xcf70c763,0xad8bf226,0xc8a26212,0x4cb268e7,
  148811. 0xb2c44c1d,0x3d171e87 },
  148812. { 0x8ce49820,0x382ac16e,0xc0c44dc9,0x24ee45e2,0x73e858c4,0x0ec67912,
  148813. 0x46327cf9,0x918cb25c,0xc6159c1f,0x43e3876b,0x37545cb3,0xb6b6e0e0,
  148814. 0x5d12347e,0x64b839ab,0xa300d541,0x72e09274,0x881c1169,0x26ab28e6,
  148815. 0xeb75a843,0x4a580fff,0x359120df,0x0a5802ca,0x3209f4a3,0x7fee82d0,
  148816. 0x8e6a9380,0xb518016b,0xc2ee11ca,0xb99c6c70,0xab9d4ec7,0x16105af1,
  148817. 0x34cd9004,0x234e98f8 } },
  148818. /* 141 */
  148819. { { 0x14db9cda,0xff435208,0x96adec90,0x99cfdc47,0xaf458b6d,0x843aaa6f,
  148820. 0x743eaa31,0x3f1f7415,0x61735d81,0x915e192e,0x0ac595d5,0x3441a22d,
  148821. 0xc044bc8d,0x704bbf67,0xbe23a236,0x2f960471,0x15d1d557,0xcc326388,
  148822. 0x76b1dd94,0x9410230b,0x0c1c8a67,0xf2e5439f,0x833c910d,0x56b141ac,
  148823. 0x865b84df,0x467c999f,0x21f02b7b,0x1b0251fa,0x96216950,0xde5b5260,
  148824. 0xce3a1e93,0x6a2130e3 },
  148825. { 0x4b3ca1a7,0xd21b67a0,0x00c0ce80,0xaf42ed53,0x932cf07a,0x22ccd368,
  148826. 0x5c25c35a,0x36523a81,0x8dd04d06,0xecdd3958,0xb2f93a3b,0x73da3502,
  148827. 0xd5e5b530,0x4c5e0c3c,0x13268777,0xef9f5486,0x1e742292,0xed87fefc,
  148828. 0xa24e5ede,0x6d9ac29e,0x33849f1a,0x08abc9f0,0x40f23905,0xb09b2292,
  148829. 0x7f934353,0x6791072c,0xe6aeb550,0x102a6381,0x96feb870,0x3ee07409,
  148830. 0x9c4d2830,0x34f06faa } },
  148831. /* 142 */
  148832. { { 0x2348f005,0x869dc79f,0xdf4920b1,0x9b5c5d71,0x6dee64a4,0xfd1b57ca,
  148833. 0xe82a4fb4,0x21b7f734,0xb9578366,0x637cb834,0x7d287d96,0xc934101b,
  148834. 0x0392ecab,0x1590f8ac,0x7f75f4e3,0x280dc373,0x6a61ac62,0x8b36f50f,
  148835. 0xa65568da,0x74f58304,0xd930870a,0x80d792a9,0xfc8895cc,0x6d17b192,
  148836. 0x4914939f,0x498392fa,0xd41d5b9e,0xaf36027d,0x5caa82b5,0x452d79e2,
  148837. 0xf4115d1a,0x764d47b1 },
  148838. { 0xa2ee8b9c,0x5df22303,0x85dfcd48,0x1b9f72d3,0x10813a37,0x6b42b983,
  148839. 0x3de741f5,0xe28c523b,0xf303bb5b,0x0857625a,0xac9bf9af,0x926f299a,
  148840. 0x0d445b34,0x21beac08,0xd6ba2c0e,0x6a523a02,0x7fce2864,0xe302a1b1,
  148841. 0xe300c1ea,0x4516a235,0x7b4a9311,0x4543736a,0xc0cc89f7,0xd3c0b9e8,
  148842. 0x40ed88de,0x0481904f,0x3cb7fc70,0x4f269b56,0x321b9738,0x09a1d53a,
  148843. 0x230a3810,0x1c0dd9c3 } },
  148844. /* 143 */
  148845. { { 0xc46a7d9a,0xffaa1f67,0xbedf91cc,0x64743334,0x47a42f2e,0x45833a74,
  148846. 0x241ffaa9,0x67980051,0x335efe6b,0x70979a84,0xf08b2403,0x5f0613f5,
  148847. 0x64f211dc,0x6bb22fcd,0xa0572cfc,0xe1b8b2a3,0x7950a14a,0x19e0eb41,
  148848. 0x3eb6cd4c,0xe634bb29,0x470a25ff,0x31a04b25,0xa3d15a0a,0xa41f7ac9,
  148849. 0xbf2fede9,0xefed85ec,0x81b94a00,0x1f581f5f,0x9ef4a15c,0xaa3996b0,
  148850. 0xb06041bc,0x52d8be39 },
  148851. { 0xfd631a2f,0xbd1536f6,0xb351a8dc,0x91fae7f0,0x9b126212,0xd1a590c7,
  148852. 0x2bd0f435,0x52d4875f,0x92b0ea70,0x9aedb6d3,0xb83ab89e,0x0bd0abdc,
  148853. 0x89fe192c,0x827a1062,0x102a0bda,0x6566a960,0xce036814,0xda083037,
  148854. 0x58639405,0x30bed79f,0xdbca8df9,0x972019b6,0xefdaa3f5,0x89201286,
  148855. 0x5236b892,0xb337b996,0x28fc2e73,0x11d3e38e,0x880e8da3,0x70787f41,
  148856. 0xdae4a45d,0x6cff6367 } },
  148857. /* 144 */
  148858. { { 0xf89a8bb4,0xbd3d0433,0x93b98f71,0x42144c33,0x03470a2d,0x82b616c8,
  148859. 0xe5da089e,0x98fcc757,0x7bf5fda6,0x542354ef,0x9ebd34cc,0x1885c253,
  148860. 0xbec5dd0d,0x2e20b285,0x782a1bca,0xe71bbbe1,0x9b854ef0,0x959ded30,
  148861. 0x8997fa6a,0x17249979,0xd81f3c45,0x50cf8fa8,0x60c11152,0xa9a3b517,
  148862. 0xecf845ea,0xc9b0ef7d,0xb9fed11b,0xc9339e23,0x28256080,0xc93e9c5c,
  148863. 0x613ec1e7,0x1d2c8217 },
  148864. { 0x987cfc93,0x7381347d,0xf187f810,0x047603bb,0x1250ca31,0x3fa6bc9d,
  148865. 0xbb055bf3,0x480091e0,0x3a3af87c,0xbdf95f1a,0x140540ab,0xe2687770,
  148866. 0xd7fe045b,0x998df730,0xb723bc2d,0xb398135f,0x15ebec46,0xac230f8c,
  148867. 0x5f5561c0,0xe08e1830,0xda60a47f,0x7c0fbf4c,0xe16d4bfc,0x06e95c24,
  148868. 0x74617e92,0x74163495,0x4ae0c20e,0x39719869,0x2131e2b6,0xfe269312,
  148869. 0x0a537722,0x25486e36 } },
  148870. /* 145 */
  148871. { { 0x53572806,0x618795ca,0x656968e1,0xb2c89449,0x3fb323ae,0x149c2c97,
  148872. 0x409bc7d6,0xfb15de26,0xc79121b3,0xa90cda72,0x204cabbb,0x6d2fa14e,
  148873. 0x91604125,0xcbcda6f7,0xb435f947,0x25086261,0xc282eb10,0xdb686c38,
  148874. 0xf1a791cb,0x51016d62,0x61a2266c,0x6b1c7ed1,0x271d74a6,0x26780666,
  148875. 0x824287a4,0xb5ffeda1,0xbbe4f0f3,0xcbe503ff,0xb9482a74,0xd7f7f0be,
  148876. 0x088493f1,0x751b2358 },
  148877. { 0xe9c9be68,0xd597b9d6,0x67d10c6c,0x1794b5c4,0x7762b2f4,0xa88cdc3d,
  148878. 0xa1b44e11,0x6d94a63a,0xaaa8eca8,0xfb0bbbb9,0xc963d87f,0xf4b0f2d0,
  148879. 0x5dc7075d,0xb753062c,0x49933989,0xfed726ac,0x57f9ccde,0x5da60638,
  148880. 0x75f8c766,0x221c392a,0x5dc672ca,0xcd264d95,0xb66ecc8d,0x7004ff22,
  148881. 0x18a458ba,0xfb1aa9ae,0x8babd653,0xea9644df,0x2ba0de7c,0xa9378e80,
  148882. 0xca2c6c75,0x144cc12d } },
  148883. /* 146 */
  148884. { { 0x2989aa3a,0x593a0a1d,0x59e6e64d,0xd83f2283,0xd32e732e,0xe938b0cb,
  148885. 0x3c3cb249,0xf4c464c5,0xf89ea6ac,0x9750a5f8,0x346cfc32,0x467e5bbf,
  148886. 0x37b2b809,0xc9bfab9d,0x3b339c6d,0xf8eb7453,0x3b766dee,0x3fe01fbe,
  148887. 0xef6aea27,0xb3154254,0x7be61b10,0x555c3df2,0xdd818488,0x70fb6d81,
  148888. 0xbbe714f9,0xda1af3a4,0x9d18f693,0x575f2017,0x2465b839,0xdc08fc6b,
  148889. 0x6b84a951,0x874ecf33 },
  148890. { 0xbbb3f6be,0x624af83e,0x08bb423d,0xf578fbb9,0xd7873527,0x5623b0ba,
  148891. 0xa62e0442,0xc3659bd8,0xfe236f79,0x2903b167,0xe53f26a6,0x55a430c6,
  148892. 0x3ad712cf,0x222547ae,0x76eb272b,0xb73890d7,0x3d628df9,0x95b4f70b,
  148893. 0x53eae4ac,0x9f0e13b0,0xe7f2174e,0x5b4f5138,0x98dbae17,0x75482cf9,
  148894. 0x44518480,0x2b69bbde,0xcafef15c,0x4f279652,0xb6bcaf19,0xa0a3ef2b,
  148895. 0xce4c634f,0x31fb8581 } },
  148896. /* 147 */
  148897. { { 0x615cd607,0x398306d1,0xaa32c3a6,0x680c9faa,0x7779131d,0xe87a705b,
  148898. 0x36708b00,0x1031013a,0x9445297f,0x814fa0e1,0xa6a79b56,0x70c5583a,
  148899. 0x4b16bed4,0x03039cbf,0xaaaaf8d3,0x18a7ca8d,0x5cdb68a5,0xf33159e7,
  148900. 0xd23814fa,0xdea0e738,0x8d0f4f9f,0xeb352718,0xdcdff032,0xb0b76609,
  148901. 0x3d48338b,0x65ba8ea9,0x55dd507a,0x18044d82,0x4a4a50b4,0x844a223e,
  148902. 0x18e19e54,0x98323000 },
  148903. { 0x57f3d5a6,0x28a21027,0x6e8cadcd,0xffce5648,0x02551f3b,0x9590381b,
  148904. 0x935ebdf1,0xb26cc64f,0xc083aa6e,0x60611291,0x88e4cf41,0xcd988a66,
  148905. 0xdd53b1b5,0x581c3f73,0x77fc621d,0x78c804a9,0xfadca2fa,0x31874330,
  148906. 0xc83ccf02,0xf7008da4,0xa79a4707,0xc4122a1d,0x4a915eb5,0x9a8e0d3f,
  148907. 0xd0123660,0xa2de157d,0x65ead2a0,0x45ef43b2,0x188db285,0xd0a22ade,
  148908. 0x922e0caa,0x8abbe39e } },
  148909. /* 148 */
  148910. { { 0x3a2d2f01,0xb4446905,0x5dc6685c,0xd27c3193,0x1d74a027,0x6a908bbf,
  148911. 0x5b50ec1d,0x01da350f,0x3f3c2e26,0x1d3dd45e,0xb836ee92,0xf66e11d0,
  148912. 0x474b979c,0x7e03908f,0x98b87834,0x19e7c5b9,0xbd3d1de9,0xa741d3fe,
  148913. 0x1ef6059b,0x63c68e8d,0x3674e247,0x9b9ff939,0x3e7e67f6,0x1d7d53e7,
  148914. 0xaee9e248,0x698dc326,0xb3bd984c,0x52f23eda,0x6f8fe8a7,0xf95e31b0,
  148915. 0xc3d0ba95,0x0f15b4d0 },
  148916. { 0x790a8d85,0x8f2f6635,0xe2595af1,0x51bffbae,0x24b51287,0xd15b7ec6,
  148917. 0x3234715d,0x7639b6ab,0x2bc5441d,0x0cdd5299,0xf6d05833,0x54800ea4,
  148918. 0xf6d6e360,0x21efd752,0x19290613,0xc0b7ffe5,0xeea898cd,0xb68a5825,
  148919. 0x22982266,0xecedba92,0xbbd06bb2,0x678a91b0,0x4bb6b0cb,0xb2436dc0,
  148920. 0xcaf8ea98,0xcf7a99e7,0x71aa05bb,0xb92d0e6e,0xf5993eb1,0xbf8d0471,
  148921. 0x20385ddb,0x515db378 } },
  148922. /* 149 */
  148923. { { 0x6f5bef22,0xee43eaaa,0x20348712,0x952d2698,0x7a3af6c6,0x1e4c484e,
  148924. 0x9a8c9403,0x18d434c6,0x5001899a,0x63e5d741,0xfe8ea40c,0x5238dbbc,
  148925. 0x96798721,0xca6cc8d2,0x04acbde8,0x73db6aee,0xb7f993ce,0xbf69328d,
  148926. 0xad45e334,0xa3f79bbf,0x7c1f1630,0x8c51ec93,0x9b00a6de,0x4907325f,
  148927. 0x12d82bc3,0x49e6acb4,0x0ec59fc9,0x5901b36d,0x9cf34e3b,0xcb09b710,
  148928. 0x1abf4c02,0x2de0487e },
  148929. { 0x8dd9d484,0x18b722f3,0x7c77bacc,0x83349393,0x93d92b8a,0x58dbb8f1,
  148930. 0x8e3fac25,0x80d78d50,0x745f4a7d,0xf0500981,0x877cc29d,0xd072bfed,
  148931. 0xc30a89f8,0x67abf8f2,0x9a0820d7,0x92c567ea,0x8a3a5738,0x425ab12e,
  148932. 0xf055521b,0xc162faeb,0xb94ea5e9,0xee1c4f26,0x3d71e546,0x1e414994,
  148933. 0x43e8be1d,0x258183b8,0xef9eae0b,0x44917c82,0x73874a30,0x6813a457,
  148934. 0xcc42f86e,0x6f6ac071 } },
  148935. /* 150 */
  148936. { { 0x4dd6e3b1,0xd38822ad,0xad620869,0xfc78e1cc,0x2cacde80,0xe7843845,
  148937. 0xa8469fe3,0x121cc14a,0xe67e8ef2,0x8e8f3da7,0x4d347448,0xdb83d16e,
  148938. 0x798631f4,0x3ba1dd98,0x0a4c4c17,0xdfab5977,0x3edc701f,0x1f0a1306,
  148939. 0x6cd8ff28,0x4649d601,0xbcc55bc9,0x2267230b,0x5760412a,0x02a19c60,
  148940. 0x328faef6,0xc719d5f1,0xf67eaad9,0x27cb969e,0x719bafb5,0xf342530e,
  148941. 0xff5a82cb,0x6e2c24cc },
  148942. { 0xadaf8793,0x6313024b,0x035c948e,0x944bccf1,0x953500bf,0xe9a066b7,
  148943. 0x1d116765,0x7991a946,0x9fd93c78,0x95addb2e,0xe92e5495,0x05d2c037,
  148944. 0x9f03e5cf,0xcb145b18,0x95aa1f72,0x81ae48ca,0x135a6e4f,0x203f2702,
  148945. 0x49b2a7d5,0x2bcef5a2,0x02d7f2a3,0x0687a900,0x6c6745b0,0x2f7d3228,
  148946. 0x86507305,0x3da8a875,0x2e8dc58f,0xbe38b884,0xdbf11185,0x6b48bf34,
  148947. 0x97c08f91,0x5af7fd0d } },
  148948. /* 151 */
  148949. { { 0xf4a224a5,0x55f9b950,0xcc50273a,0x41904574,0x643f1fd5,0x34f81330,
  148950. 0x0e50f783,0x996801bb,0x89581712,0x866d7403,0xa4091d36,0xdb9a405d,
  148951. 0x16a46fe7,0xf1e379df,0x83bf9168,0x8d04a93f,0x32b20bca,0xae4c8335,
  148952. 0xf72a1c10,0x99d334b1,0xd8195db4,0x8fbc9977,0xfba14b5d,0xcaeb3dff,
  148953. 0x76daf476,0x60fef022,0xdb5b72f4,0x4b948dfe,0xb6dfb062,0x5185c925,
  148954. 0x9609d4ae,0x27a9c381 },
  148955. { 0xf12a93af,0x73c37346,0x5536634d,0x028b707c,0x498193d1,0x8efa58d5,
  148956. 0xef21b69d,0x4f83a5cc,0xa788a0e2,0x05cbb0a3,0x65b13c98,0x01031781,
  148957. 0x2b73784c,0xfea20e58,0xe50361f2,0xdf9713a0,0xd0cc22d9,0x31449a0f,
  148958. 0x7c5e2e1b,0x183752e7,0xb67044cf,0x6e44d6bd,0x733e177a,0x012dde95,
  148959. 0x08ee2c23,0x68b49669,0x1f5f1949,0xd9bb0541,0x6acd886f,0x95182c71,
  148960. 0xfbde9244,0x1c690694 } },
  148961. /* 152 */
  148962. { { 0x3a880026,0x5db67d17,0x125d95f2,0x89c4f0a0,0x3f6cb7a4,0x29050551,
  148963. 0x5cbbdca5,0x3eb231d1,0x972bcbd3,0xf8cffc99,0xad55a03a,0xcb4ef4d4,
  148964. 0x22867c2f,0x944d47ca,0x0ead1aa5,0x96d88548,0xcbc8b045,0x76a57cf8,
  148965. 0x005e55a0,0xdfe5844b,0x1d18a097,0x5e9e7e19,0x52923c74,0x957a26e8,
  148966. 0x7f5db339,0xd0867b79,0x63bed0c8,0x2553408e,0x689ad23c,0x1596e5d5,
  148967. 0xa504c339,0x7b8c13d6 },
  148968. { 0x52fb6901,0x2fc43aad,0x16ca253b,0x1c0313f9,0x515aadc6,0x1475830a,
  148969. 0x7f577dc2,0xc93d1926,0xf723c0dd,0x26e52e8e,0x3eb9f6da,0x2f1e0eb8,
  148970. 0xf180376d,0x9979de82,0xb0834939,0x43e28ecb,0xa39c38e7,0x9a2d51dc,
  148971. 0xa8e3f6b5,0x6e6063a9,0x4b9b3270,0x4cf1da3a,0xd2f8915d,0x6e5348a2,
  148972. 0x50507912,0x5e75e3e0,0x20d383fa,0xaeffce57,0x8fd2fb29,0x1d6d53cc,
  148973. 0x696f4cd0,0x0e3c3ef6 } },
  148974. /* 153 */
  148975. { { 0x21ee1d83,0x3bc337c1,0x787b7788,0x97e08f6d,0x138fa4ce,0xbf709fcc,
  148976. 0xa0348e58,0xbaf77647,0xa55e672d,0x04f8babc,0x7d5ec5dd,0x0ed2919d,
  148977. 0x33e99218,0x8ce64bff,0x24b059af,0xac09fc57,0xdc5e32ba,0x506831f9,
  148978. 0x465af6a9,0x26a22677,0xc97f1ff8,0x3c5efe66,0xbc6087fd,0x1515e0d6,
  148979. 0xaa8edc6b,0xb1a39c5e,0x0e79ed29,0x3dd816bb,0xbc3788b8,0x6cc13769,
  148980. 0xc092a51c,0x463098e3 },
  148981. { 0xc8bd0fa7,0x3a6408c7,0xce6bde49,0xd1764311,0x283ef7be,0xe315e108,
  148982. 0x99b5d938,0x8213cc77,0x45a49a6b,0xaf7f1581,0xe529e4d1,0xd00fdb0f,
  148983. 0xce66c9d6,0x55d38f77,0x1bd4b952,0xb4f7ccc0,0xaf71f986,0x8d975b49,
  148984. 0xcd64d00a,0x12b59fcb,0xa5a3bad7,0x1860e504,0x2b5c89f1,0x6d976044,
  148985. 0x7a3e231f,0xfed0c659,0x178cba92,0x58114c33,0x6698e11e,0xe2e74c06,
  148986. 0xa348b85a,0x7f8fd093 } },
  148987. /* 154 */
  148988. { { 0xc19428af,0xf24592ca,0x3a308665,0x192a1c81,0xe30bbd7f,0x42589812,
  148989. 0x836c6bb9,0x10db0723,0x598e4987,0x9c7a41e9,0x6ead6f4b,0x8aff179e,
  148990. 0x75862c44,0x70f8f9b9,0x6f21983e,0x6b3b0237,0x98e65152,0x25d83e9b,
  148991. 0xd751218a,0x3b2d26a8,0x9d6f1da6,0x9508281a,0xa5a81f74,0x8df78d05,
  148992. 0xe4687471,0xd79ee559,0x6787d8cc,0x2060ca57,0xa8476c95,0x427a84ff,
  148993. 0xe6435131,0x87b64c51 },
  148994. { 0x4b30d3c4,0x87f46f65,0x23b4ef14,0xcdec4c5c,0x63ca4d68,0xb3b74766,
  148995. 0xcf3fb56d,0x1df34269,0x0fd7d46a,0xd4f139c4,0x6a69a8bd,0xa3b7c7c7,
  148996. 0xcbadd7d2,0xee56b4c9,0xac942334,0xb28ff342,0x786f1da3,0x0046fdfa,
  148997. 0xb700c82e,0xce5d149c,0x50966597,0xca30ef81,0xfcff4bdd,0x44a20609,
  148998. 0x44925268,0x0f2f65e7,0xd4021f38,0xe5b6552c,0x042dbbd0,0x77ea9c2a,
  148999. 0xd9c062f5,0x8c95267c } },
  149000. /* 155 */
  149001. { { 0x5fc1abb1,0x6655032e,0x12fe4743,0x2215af54,0x29f05ef5,0xfd657560,
  149002. 0xdc191be9,0xb0e73325,0xc08639b0,0x7ab3c65e,0x1c3e6673,0x67507f51,
  149003. 0xc8615555,0x638befc3,0x42f0c4ad,0x5d0188cf,0xd896186d,0x843a301c,
  149004. 0xb2c6741e,0x045603f7,0xfa3cd1d0,0xf7545c0c,0x4a40672e,0xf612affd,
  149005. 0x45b9e8dd,0x56197c9f,0x87922d74,0xb453237d,0x4b2d59bf,0xbf132e3a,
  149006. 0xb84a6a16,0x8afa1b73 },
  149007. { 0xe793ac70,0x6b3596ea,0xeef6dd10,0x4c94ef8e,0x70422e40,0x926b4fa2,
  149008. 0xe9e5d763,0xc8c71dce,0xf512aadf,0x352fcb70,0xa883975f,0x1b7ba138,
  149009. 0x058c3b13,0x57991390,0x97740fd1,0x9692092a,0x160b0697,0x19ad945b,
  149010. 0x10837ab2,0xbc634388,0xf174bb71,0x76ee11c4,0xab1b80eb,0x6111bfc1,
  149011. 0x70ec458a,0xbc82bac8,0x312d3325,0xeee60127,0xb240adc8,0xb4118b1a,
  149012. 0x2b5a093c,0x67211191 } },
  149013. /* 156 */
  149014. { { 0xf55cf9bf,0x91e99306,0xa46b96d9,0x9b045308,0x9e7a65df,0xae3c1e1d,
  149015. 0xc731bcbb,0x453cb151,0xa4d58a61,0x14be5227,0x97c74cc2,0x39dac922,
  149016. 0x822e00d6,0x4d0f7a45,0xc62b03df,0xafeb1d51,0xbaa18b2d,0xbb1dc3a4,
  149017. 0xdf2b74f0,0x7f3c7178,0x896b6a33,0xfcd328a6,0x1dce055f,0xe95ed454,
  149018. 0x6a4e2b87,0x97fbc76b,0xfa59dce9,0xe5ec67f1,0xcc0367c1,0x052368ac,
  149019. 0x54e4a3fe,0x7c863916 },
  149020. { 0xca7388cf,0x55e94b5e,0xc0335d38,0x17cc0a60,0x616f85ba,0x9b69b78b,
  149021. 0x10122980,0x705d02ef,0x1cfd0a79,0x565a6e80,0x7d1ee352,0xeb74a96d,
  149022. 0x427b9dad,0x5c8832ed,0xe6d5330f,0x96ea8528,0x18d24ee8,0x30d8862b,
  149023. 0x9ff939f7,0x9cd38ed5,0x01060252,0x690fc9a2,0x2303b3ff,0xc62d88b8,
  149024. 0xdd52b469,0xfc42d7a4,0x8cad2d93,0x06f8dfa2,0x60920438,0x50236090,
  149025. 0xfce855ad,0x32582758 } },
  149026. /* 157 */
  149027. { { 0x359e8c60,0xeb20e45f,0x364ca186,0xc71bb8a5,0xdff8e110,0x02b15071,
  149028. 0x4c93e578,0x074e91d3,0xb829d0d8,0xc0326e00,0x626a83fa,0x3c192258,
  149029. 0xfb29a09e,0x387a64d5,0xe5ac5c82,0xcaaa3d34,0xada2da29,0x8ed685e5,
  149030. 0xeb29650e,0x92720267,0x763802f3,0xf7184b19,0xdf6b1aea,0x23f5dd0e,
  149031. 0x25e6125d,0xbe1fa347,0x0c872a1a,0xd6287f9d,0xac57c3af,0x49aa93d2,
  149032. 0x5bda7656,0x1a4e6a71 },
  149033. { 0x554d1267,0x1a126ede,0x1cd02b48,0x37f94533,0xce31fb1d,0xd70af04c,
  149034. 0x097dc012,0xcf410b0b,0x36c7b6c5,0x930e1d17,0xc6891085,0x902fee41,
  149035. 0x79fb638f,0x349ba4a7,0xacd6f8df,0xa16c5821,0x2e076ace,0xfb3b83c1,
  149036. 0xe501d14d,0x6b8d033b,0x20f2d2da,0x0593d452,0x99df1880,0x3752526d,
  149037. 0x9feb33a6,0xca32351c,0x1f6ef456,0xd91343bc,0x35b9dc8a,0xc74857db,
  149038. 0x85b4e832,0x856a7c93 } },
  149039. /* 158 */
  149040. { { 0x0d0a5583,0xa007d002,0xeda4658a,0x2f1301dd,0x34d939be,0x91c07964,
  149041. 0xa70c0836,0xa0cb6780,0xbe81e540,0xc0b4df95,0x5d4ac8b8,0x6cbbcd34,
  149042. 0x54756239,0x57c52ed0,0x1805ceb6,0xcac2dca4,0x79344255,0x915ee6ab,
  149043. 0x24c9a2a6,0x366def31,0x8c12c674,0xbd3b962f,0x7dbb7c3b,0xaab64f1b,
  149044. 0xe22bb95b,0x3c0e4553,0xc4c63b74,0x2408feba,0x2a4da631,0x3ca77312,
  149045. 0xc636da40,0x62889084 },
  149046. { 0x8cb8d208,0xa457fd53,0x543f06d4,0x7a8f8009,0xf2eff2ab,0xb66de154,
  149047. 0xf72517e7,0xfddb28eb,0xf9389d2c,0x0149fe66,0xd85b88ce,0x79e8773f,
  149048. 0x0ba543f7,0x452e090b,0xb0b03fc0,0xdeb9b5cf,0x6c5ed77b,0x3113448a,
  149049. 0x8ffc0372,0x3609f3cf,0x5c1b4c4a,0x2bc9c46d,0x8fa59be9,0xe66f3bf3,
  149050. 0xcdb02691,0x1396bf5f,0x009f88f9,0xf1ec59d4,0x2ad9dfe3,0xc2903456,
  149051. 0x5ada4d58,0x79d8122c } },
  149052. /* 159 */
  149053. { { 0xaa529507,0x14d4e4ce,0x74655d00,0x056a0814,0x4f0fc474,0xc0d30a38,
  149054. 0x3443cb8e,0x8a8203ea,0x97f1728d,0x33c62fb0,0xb520ef52,0x8a38dcfd,
  149055. 0x7cac9d3e,0xa0f90d5d,0x873cea50,0x28a7b0bf,0x6c6c41cb,0xd115ae3a,
  149056. 0xa13812c1,0xa35171da,0x624d507e,0x25d4bba5,0x7e98f42f,0x91dad289,
  149057. 0x96a41371,0xffd6b1e9,0xb69e5b77,0xd46c2125,0x20c4f707,0xc7d2b424,
  149058. 0x8142557a,0x2ab3af95 },
  149059. { 0x6a5372a6,0x86ca074c,0x56292ba7,0x728fb83e,0x77741cf5,0x745596dc,
  149060. 0x520ef49d,0x70b4cea1,0x61e46472,0x1472fe34,0x3fb8ac5d,0xf4d6bd66,
  149061. 0xc10bc071,0x46e52cc9,0x371a3461,0x28794efe,0x276fe877,0xa4850718,
  149062. 0x9bef5ab4,0xedad5773,0x3f15c815,0x24c2d9ff,0x8f8395c3,0x188950e5,
  149063. 0x80b6a855,0xbae40996,0x8a8803e1,0x4f53e22c,0x039d25ee,0xaf233f61,
  149064. 0x250409ca,0x07db2c35 } },
  149065. /* 160 */
  149066. { { 0x037d4703,0xc7f3b8db,0xc5f488b9,0xe83708df,0x8471d402,0x1fba830f,
  149067. 0x5a2faae9,0xa55ee8d2,0x5404fc1e,0xc2e5bf10,0xaa2d5651,0x647d5027,
  149068. 0x7ebaf5f9,0x37a53c0c,0x95b30abf,0x7adf0bb2,0xd64c93ba,0x5a62e1fe,
  149069. 0xe2ef4a78,0x7ffc18c0,0x4d2cd04f,0x139dd9d9,0x5ea0af02,0x253fbab7,
  149070. 0x0fef9acf,0x7c8100ea,0xc8615aa7,0x74c5384d,0x9fe52069,0xcb28682d,
  149071. 0xcf7dd759,0x08b6ca8f },
  149072. { 0x036c3b5a,0xe04e5bea,0x7f9f2b4b,0x38726102,0x29797c0f,0xa9fca570,
  149073. 0x82879ea3,0x1656180b,0x607f0ddf,0x153389bb,0x67b0e087,0x99a1223c,
  149074. 0x9d897fc7,0x0d1808ec,0x916edf19,0x9470711a,0x07217118,0xf8f52f2b,
  149075. 0xd18888b6,0x5d8b29ff,0x4cc6f900,0xef1e22c5,0xeb24877f,0xc4036165,
  149076. 0x35479525,0xfda95233,0x6861468a,0xd622a421,0x74faba08,0x5d043b07,
  149077. 0x0d31a7d2,0x2c337b02 } },
  149078. /* 161 */
  149079. { { 0xea22fa65,0x7b2305bc,0xd159f63a,0xbe183ef4,0x3f35923f,0x3473d87d,
  149080. 0xc11d7753,0xb27fb306,0x2a054cff,0x702e7e6b,0xaf185619,0x3ce9f97c,
  149081. 0x4e7d51c5,0x83550243,0xf356ac5b,0xa63e3d82,0xd7645131,0x867b7caa,
  149082. 0xa671fc9d,0xee85e6af,0x2b07cd77,0x3b985ede,0xffda5193,0x07d598b0,
  149083. 0xa942dc36,0xb10eca39,0x506218a9,0x17f3dcee,0x06b7d5ca,0x3d94e8d1,
  149084. 0xed8831c9,0x509b2634 },
  149085. { 0x48caed54,0xb1b9414e,0xcbf51e97,0x77a78c6c,0x4de9b258,0xa4688c8d,
  149086. 0x91ee3d78,0x0024137c,0xe30ee64c,0xa68f9234,0x88190d78,0x573255bc,
  149087. 0xba80690b,0x41e8e05f,0xec354f4c,0x50038d84,0xdfa52816,0xb18f02d6,
  149088. 0xccb63fda,0xc47f9007,0xe98ae455,0x29d480fb,0x5d0e319d,0x4ac45d22,
  149089. 0x026db719,0xd06f3575,0x2c3587b9,0x733b9e20,0x2c317727,0x22483992,
  149090. 0x54bb8752,0x1592d5a7 } },
  149091. /* 162 */
  149092. { { 0xcf7453f0,0x5778d9a2,0xed83c1f0,0xaffb899a,0xe0a82ba7,0xae6506d3,
  149093. 0xea3d5081,0x32c84e1a,0x810aa38b,0x9ad528c0,0xbd37d041,0xb1fdb020,
  149094. 0xd06ce41f,0x78d6cbe1,0x2e74b7f6,0xd287f0f0,0xc43bb022,0xf5cd2575,
  149095. 0xf81a71b3,0x6d28f2f3,0xc633e7f4,0xe65bb1f5,0xc4fc580e,0x32e5fc1c,
  149096. 0xbb7b07a5,0xcd55539f,0xc3caaf3a,0xb5a94471,0x4cc22d2d,0xb958bdf4,
  149097. 0x77a2777c,0x1614bdbd },
  149098. { 0xed0ab04d,0x4c1f0230,0x6e2082ea,0xae347b00,0xc42c5b5f,0x9f10bc63,
  149099. 0xde019935,0xb0539e6f,0x65dd0825,0xd89bd4e7,0xbbceda16,0x92260fef,
  149100. 0xe62aca32,0x8aaa755c,0x5ec82c5f,0xed762fa9,0x18650768,0x99e64c01,
  149101. 0xc92e348c,0x57dd6245,0x31ea6d68,0x0db88a77,0x07b44736,0xef0012ab,
  149102. 0x171d70fe,0xb9356b94,0x03f891b0,0xe68b0628,0xb79c20a2,0x3a54a53a,
  149103. 0xb00b0728,0x489656c7 } },
  149104. /* 163 */
  149105. { { 0x71353c25,0xe43649ba,0x13f67e24,0x517f27a1,0x1c1eb9e3,0x10bd333a,
  149106. 0x78e29bf9,0x94e1c05c,0x4743f15d,0x84fe7d97,0x90da2df0,0x9c874908,
  149107. 0x53673be1,0x82403fa7,0x1baea1b1,0x7ebf5db4,0x24180ead,0xcfe0ae35,
  149108. 0xc2f50c3f,0x1d15873f,0x70661cd9,0x16851ad6,0xa51e8c2c,0x802968d9,
  149109. 0xe0161099,0xe7d1a9cd,0xa8a7ea56,0x2b153c89,0x06e3c498,0x6d41b789,
  149110. 0xd6769dcb,0x082bb2e9 },
  149111. { 0xc4d6615f,0x6180ef46,0x01b9829c,0xfc629dc1,0x0fb264ca,0xde222ec0,
  149112. 0x10ecc2c4,0xc5457e06,0x1eea2c4d,0x95ce599f,0x8f9c5b2c,0x0433fa72,
  149113. 0xcd6310f9,0xee035462,0xce2e2253,0x84c57c3b,0x96d87e44,0x6c8ec31a,
  149114. 0xa452c5a7,0x30bfe393,0xa047b235,0xc592b140,0xc018545e,0x7bd8be18,
  149115. 0x5c178c46,0x794e0107,0x2e23005b,0x48471946,0x622a54f3,0x2665e237,
  149116. 0x901c9042,0x36451a46 } },
  149117. /* 164 */
  149118. { { 0x19893e71,0x17802d18,0x539a2082,0xa1765d8b,0x2302ecfc,0xfc6aea01,
  149119. 0x365bf59d,0x8d4cf51b,0x0d232a80,0x87741d72,0x18e80427,0xac343eb3,
  149120. 0xe74739ec,0x553ecb2f,0x1a8b07ca,0xaeca79a8,0x56f4ab3a,0x089ff322,
  149121. 0x3fa1d1f7,0x5e95d729,0xf62a9a16,0x260569ae,0xaa08ddc2,0x5e776232,
  149122. 0x1b7bb54a,0x93fabec3,0x743d56e7,0x48a20956,0xeb0ebeff,0x749cdb12,
  149123. 0x69b8fcf1,0x705307a4 },
  149124. { 0xe488310b,0x7a8e4c04,0x5325cd7b,0x12726e32,0x4983efac,0x5d0fd8b0,
  149125. 0x02ddb913,0x796e552c,0x77b9685c,0x0eeca3f7,0xb15f24a3,0x9b766e89,
  149126. 0x48efc979,0x7c2736d6,0xa8021c6c,0x3d619685,0xa0b2f1ea,0xfe33e278,
  149127. 0xb676d6b0,0x95c69879,0x1af4e0be,0xa0747319,0x36c4ee55,0xa2fab5f1,
  149128. 0x59e5f3b9,0x6938b8ff,0x39cafe6e,0x1e114da4,0x6a6ad120,0xc9595ec3,
  149129. 0x57e62aec,0x80f79bd0 } },
  149130. /* 165 */
  149131. { { 0x60af09b3,0x3cef42a7,0x933dfe14,0x3c016ebd,0xed85eaa8,0x720cf1e0,
  149132. 0xceaa3bc9,0xd4f5e99f,0xb7106f97,0x7216b9d2,0xc9668ad2,0x65f34c36,
  149133. 0x5b0c651f,0xa8fb82bc,0xf2fda4de,0x20f42f1c,0xd21f659e,0xeb31ab2c,
  149134. 0xa13d1618,0xb7a776c7,0x38662be5,0xec441022,0xcad08e0b,0xc825da70,
  149135. 0x022c0180,0x99299079,0x2aef9ffd,0x7623bda0,0xf5c58b50,0xde84f4f3,
  149136. 0xd824ff19,0x5f5a5da4 },
  149137. { 0x7e8311dc,0x5737257e,0x466cf136,0xdef94f51,0xb05ca21a,0xa73e1645,
  149138. 0x02e4ab37,0x38ea9b3c,0x8579165b,0x7760eac9,0xc24b01a4,0xdffdd047,
  149139. 0x3fb95584,0x188d4fd1,0x25548bda,0xfaac38b8,0x59e9dcac,0x1a79a6f0,
  149140. 0x09a2700f,0x983f720f,0xfb8a7e48,0x8cbba554,0x47a1fad5,0x38a19968,
  149141. 0x5abd6b5e,0x11856547,0xf3716ec2,0x75113d31,0x4212907b,0x1391e781,
  149142. 0x0dc15889,0x5319c801 } },
  149143. /* 166 */
  149144. { { 0x6b61c3af,0x2320136e,0x07b4bb68,0x1d40f2de,0x380c97f0,0x651dee7f,
  149145. 0x6a8c313a,0xa978ba70,0x2011ca10,0x22c587d6,0xab1f445b,0x48bba218,
  149146. 0xe50444e6,0x8c5eaf07,0x442fccf9,0x5549f02a,0x3d80493d,0x2564746f,
  149147. 0x79c04591,0x42d24f61,0xabdc8887,0x1600fa18,0xded38f8f,0x5cb8600a,
  149148. 0x923aeb46,0xa4bf9b90,0x1e1c578a,0xd63fee35,0xebb9ea14,0xf3c9c5ac,
  149149. 0xf11a4ff0,0x3d13314d },
  149150. { 0xb4513d1e,0xe5cc662d,0xd55952bd,0xde78a8c5,0xe7f86d0a,0xe8a37a3f,
  149151. 0x7a04f0c5,0xca2d12a4,0x2e25d06c,0x4c6696e4,0xb2136071,0x52614698,
  149152. 0x89f6e1cb,0xf4d2701b,0x80efd95e,0xaafd6177,0xc5bb6907,0xe6d73ac4,
  149153. 0x420db35a,0x49e874ac,0xf2751fa0,0x11631de4,0xa1fa2edd,0xb29f7336,
  149154. 0xb7fd794d,0x4c406864,0xe22f92a6,0x73cb21d3,0x2043cc76,0xeae904e6,
  149155. 0xb322c6ad,0x67f28a9f } },
  149156. /* 167 */
  149157. { { 0xca148ab5,0x7c17b258,0xb3c60051,0xb9a1976f,0xc8f28df9,0xea260698,
  149158. 0xe8d45017,0x87b2cc74,0x0578a422,0x37257329,0x17bec732,0x81d5ee25,
  149159. 0x1d48bbc4,0xd7411fcf,0x487f5cfe,0x46217e6b,0x41eb8e1b,0xcb007ac5,
  149160. 0xe05a00c8,0xc41c57a6,0xd2f9fa99,0x1f954d2b,0x40941cad,0x370bd5db,
  149161. 0x3829509d,0xe487879c,0x5ceca5ee,0x4c137552,0xfd3efb9e,0xe8ef7fa4,
  149162. 0x1bd1bdb2,0x5ff09174 },
  149163. { 0x579c6632,0x791912a4,0xb8a20815,0xbb19a44f,0x535639d3,0xf4f97b84,
  149164. 0xbc3c9bce,0xe57e2bcb,0xf19e6410,0x122b3f2b,0x1357d9ad,0x1f0189da,
  149165. 0x79e5ff66,0x675573bb,0xef2f3c4c,0x444e5c98,0x04d10731,0xd6f61e20,
  149166. 0xac75d635,0x0dfa366f,0x2c854f23,0x9fc47c86,0x0ad0850b,0xc04ae43e,
  149167. 0x2f720c32,0x5ce94f64,0xa753bc9d,0x67efae65,0xb0373a63,0xc27d30d3,
  149168. 0x29721646,0x6681013a } },
  149169. /* 168 */
  149170. { { 0xe84509df,0x1385d913,0xcf339376,0xe978bedd,0x3423a148,0x2df425d3,
  149171. 0xee8cb579,0x43fa0ae3,0x31c4553c,0xf015369d,0xdfbf1d48,0x05cf08bb,
  149172. 0x9444244a,0xadff4be6,0xa35dda33,0x01635f81,0xe76fab7c,0x085c8949,
  149173. 0x16737783,0x4bd7fcde,0xa254f8d2,0xfd8cb52c,0x413ec985,0x62168a66,
  149174. 0x7a9026cc,0xf2db9741,0x50e1e1b7,0x3962ee56,0xd3beffde,0xbee0a346,
  149175. 0x0bdfab1f,0x3b35b72f },
  149176. { 0x535c3749,0xbff8de9f,0x8add9c48,0x23c1f20f,0xc8f8f663,0xa975b37b,
  149177. 0xe8f3ae49,0x2529e475,0x1d5e2628,0xc32f10d5,0x67862f1d,0x5ac0d297,
  149178. 0x854cbe36,0x13c79338,0x4b67e462,0x48f004ef,0xe5d10ee1,0xfa37a150,
  149179. 0xd28288a0,0x4974778d,0xcfb73f4d,0x96830a66,0x07804952,0x9f444013,
  149180. 0x9760b694,0x8233c709,0x25b75c99,0x8340cca5,0xc771f99c,0x3f62e40b,
  149181. 0xcd95c685,0x47d0a1eb } },
  149182. /* 169 */
  149183. { { 0x652811f1,0x266f4fff,0x62ef3002,0xeaacaa93,0x50cba0ca,0x6c387a55,
  149184. 0x007f5467,0xa350142a,0x202f2673,0xc7fd102a,0x33dc6e65,0x5daee570,
  149185. 0x064a63d9,0x60682ec3,0x462b251e,0x46cf0bb0,0x5da936e7,0x0e030ca5,
  149186. 0x434265b5,0xc87a60f2,0x69b4e8f5,0x9637b2bb,0x7ad7770a,0x601fb58c,
  149187. 0xed3a15a6,0x1f2147f6,0x2995e961,0x05b47d5e,0x83213a16,0xcb0ca9b3,
  149188. 0x4995a85c,0x8f4b614a },
  149189. { 0x4b4eb3c1,0x5aa8ec19,0x20323a70,0x8c549ac4,0x4f6cc6aa,0x00d49322,
  149190. 0x45f9a5a3,0x0e53b9bb,0x0897abbb,0xe46ef110,0xd7acd7d0,0xfe873e57,
  149191. 0x0f7cb588,0x7cfccfe5,0xc85557d1,0x0ea53d65,0x7288f2e2,0xfdd9eb44,
  149192. 0xc0eb68a8,0xab2dedfa,0x08603a0c,0x58221470,0x00feb06c,0x69464689,
  149193. 0x25e5caac,0x804cf5bf,0x9fc91ae9,0xd8559858,0x73c45eae,0xed9378b1,
  149194. 0x524c9801,0x8f942d02 } },
  149195. /* 170 */
  149196. { { 0x8e845808,0x1f1ec302,0xb77abfc5,0xc302bffa,0xf8d97dc7,0x26afd4b9,
  149197. 0x3aac594b,0x3d3a83c4,0x674d94dc,0xe3b74bd1,0xcaa5911c,0x4464b737,
  149198. 0x871c2cd2,0x62925773,0x3b4440fe,0x419f2485,0xe052ad7d,0xdda6a0f3,
  149199. 0x846c86c0,0x645280d6,0xf8324f42,0xa25689fa,0x07cf117a,0xc74ad1e8,
  149200. 0x8ddc9db7,0x5626dea0,0x966fc85d,0x52620373,0xf3b1eb53,0xe0ad57c3,
  149201. 0x949c1acb,0x38300252 },
  149202. { 0x5e744723,0xa0ef5a40,0x1ae08481,0xdb5bcf75,0xfec1f76f,0xabfad8cc,
  149203. 0xfab37fc6,0xfba5d831,0xc8fedb78,0xbe39e248,0xad93f310,0xa5cfad5f,
  149204. 0x913d5c24,0x747fdb1e,0x4518b7f5,0x052a47c9,0x7cfb4327,0x9e208d6c,
  149205. 0x70e538be,0xb135cb9c,0x5bb17916,0x36352759,0x5b3106c7,0xa2c07880,
  149206. 0xc209bb06,0xd2d42a06,0xd3c504ad,0xb525b471,0x822ce034,0xc9f4b368,
  149207. 0xeb4185a5,0x15f18796 } },
  149208. /* 171 */
  149209. { { 0x0aee4684,0x094dea06,0x7cdbdbc8,0x42b21f06,0xb1931319,0xa439e149,
  149210. 0x81a7dba6,0xea4bdd41,0x3c2ae80f,0xc6213706,0x12823dc2,0xb58b0967,
  149211. 0x832611b1,0x7443d515,0x13c20384,0x2e16f831,0x2bd992d2,0x0ce204d6,
  149212. 0xf419388b,0x499dbcd6,0x1d3778c7,0x492ded1d,0xc5ddae73,0x9d5bd74f,
  149213. 0x994b6259,0xd4813d52,0x0e86ca68,0x191d9cf6,0xf3e9c2ac,0x562179ea,
  149214. 0x9fee1238,0x6146f1f3 },
  149215. { 0x078e2aa6,0xbd06d33e,0x9dee9265,0x693af7f7,0xdaa40e84,0xd56e0f81,
  149216. 0x9b9a407e,0x05fbbb88,0xede99519,0xdcf44adc,0x092dba39,0x7f71f8d3,
  149217. 0x4231774b,0x675b5da5,0xa5f605eb,0x7456a251,0x87a39a9e,0x9031d4af,
  149218. 0x05b474bd,0xdb430006,0xb665aa91,0xbda5dbf2,0x6631eeb4,0x5d1a3df5,
  149219. 0x62377c58,0x028149ef,0x685d0bff,0x2e1af4e9,0x82a465de,0xe0ea0875,
  149220. 0x06bd0050,0x95543f9e } },
  149221. /* 172 */
  149222. { { 0x85d7c6ef,0xf7cbc6f4,0x63b1bc24,0xcad8084d,0xbf8cba62,0xdf90ce88,
  149223. 0xb455c192,0x98e4b686,0x774fc6ed,0x6146b8d5,0x7ae20077,0x70e2389e,
  149224. 0x61c22529,0x5241c479,0x3884e5f5,0x7d221510,0x17e28273,0xd6d20ce2,
  149225. 0x4f2674f8,0xe3119f51,0x70c011db,0x85459055,0xfcfb760e,0xdfab75d9,
  149226. 0x9e8c2a19,0x9546362a,0x4a7d4b27,0x4b6d3f8a,0xee5d698c,0xa5c87104,
  149227. 0x2ba296ff,0x6db43478 },
  149228. { 0x5c3f0d95,0x06486493,0x4e748895,0x8917db82,0x6b2f3e44,0xf73fdf62,
  149229. 0x2b7f574b,0xc60edc54,0xaf732723,0xbe1c09a2,0x7cad114c,0x7d34669d,
  149230. 0x321aaff9,0x9646600a,0xed0cd61c,0xb94e2bba,0xdec4750e,0x866e1a41,
  149231. 0xb1a89f58,0xa1be990d,0xf2759693,0xc39e4d6c,0xc0e0dddf,0x11cfb780,
  149232. 0xd99c8a41,0xf0afcd7f,0x6e1c3050,0xcebffadb,0x96d2c6e4,0x4f3981b0,
  149233. 0x2ae27a94,0x07a791e7 } },
  149234. /* 173 */
  149235. { { 0x1e9f0300,0xe70e9047,0xbccdf904,0xe0253ad9,0xff053078,0x51c0289d,
  149236. 0xae893462,0xf1ef092e,0xa4846845,0x2c90a91a,0xf1dad4b4,0x1946eda0,
  149237. 0x33df67b2,0xf07650f3,0x0b15a014,0xc6e988db,0xb542f0f9,0x72e0c66e,
  149238. 0xe0c0378f,0x5d4b6311,0xae86950d,0x548badaa,0xb35f1c8f,0x6801638d,
  149239. 0x944d1ad4,0x129e3216,0x40471d32,0x9951bac8,0x85e94dde,0x03cc29f3,
  149240. 0x4543ecac,0x6d6acc2e },
  149241. { 0x57b2d299,0xeb999e95,0xe3d721cd,0x3a2bcd9b,0xbb4cb444,0x2e60384f,
  149242. 0xdc060faa,0xae177709,0x8c987cde,0x74f0e6d3,0x1076fbed,0x9a237cf8,
  149243. 0x7983fbff,0x69af1513,0x323f9584,0x6c3f7a1d,0x6db64398,0x3e21cacf,
  149244. 0x96703d92,0x7cd8134f,0xb8393f76,0x0755898f,0x2e825222,0x1b5b28bc,
  149245. 0x7924aa7c,0xb78799c1,0x81427a8a,0x1db378f2,0xff289492,0xd5a451b1,
  149246. 0x3d3c46ee,0x79d18212 } },
  149247. /* 174 */
  149248. { { 0x109d5589,0x1a3edff9,0x029b4499,0xded52eb4,0xb4b54adf,0x13eb9d30,
  149249. 0xa27bff67,0x4f9214c1,0x67f0f460,0x4c817ee7,0xc3a50e28,0xbadf8d83,
  149250. 0x94026237,0xc5dc03c9,0x966647c1,0x5f29581b,0x8a0687f3,0x10b6a089,
  149251. 0x31634517,0xae787cec,0x62e75188,0x2001dba5,0x45e2c3fb,0x55d4e1a7,
  149252. 0xb67d3395,0xbfcacdeb,0xbc6842ee,0xa1a0af9c,0x3e88580b,0x50590a2b,
  149253. 0xa784cdc8,0x73104491 },
  149254. { 0x2648d676,0x44ca2cdf,0x4f1b12b1,0x9a85eca5,0x2980e1eb,0x1b9dac94,
  149255. 0x1ac8aa89,0xf30d3709,0xc719e195,0x73072ab7,0x2f703797,0xba518c82,
  149256. 0xac0067f6,0xac090e14,0x8dcd2927,0x0e6cfc70,0x21e7da63,0x4f5889e2,
  149257. 0x8371c7c6,0xb4aaa40b,0x8f7878c9,0x1f9dabe2,0xd84caf3f,0xf78aed6b,
  149258. 0x9e0e1d92,0x3c39dd07,0x122424dc,0x680be5fb,0x0bdc0099,0xf41b214d,
  149259. 0x5180c54f,0x6a8f8fc9 } },
  149260. /* 175 */
  149261. { { 0x53235132,0x62a1ed63,0x59dba88b,0x1db233f1,0x291efdd8,0x85625452,
  149262. 0xb25111ae,0xc7505297,0x1d701bd8,0xb5921af9,0x9774f45d,0xb4d05d72,
  149263. 0xf18e73ff,0x6e3d4c5e,0x899b3038,0x897d985f,0xc89b1558,0x8a9c30fb,
  149264. 0x4d13181c,0x3c92d1a3,0x2223320e,0x292e86ba,0x01ceed02,0xcf2454c2,
  149265. 0x583f309f,0x27a45f74,0xad0fd1a3,0x75a6102c,0xcb9c7538,0xdb4f45d2,
  149266. 0xdb283fd7,0x4752d8c1 },
  149267. { 0xd5dff4d5,0x514d6cea,0x45a827f4,0x74cd5fdb,0x4fc7135e,0x1070a60c,
  149268. 0x1be5778e,0xdec0bb78,0x58dc6b08,0x271e12cd,0x54bc2496,0xb765089b,
  149269. 0x619098ac,0x6ddf2c63,0x67528832,0xfd6ebac6,0xc2508af1,0xeaa2d025,
  149270. 0x4dcfc1f0,0x13c2cda8,0x45510be0,0x1c7836a8,0x1a886801,0x3904688d,
  149271. 0xafaf2545,0x643132aa,0x2830a88d,0x49685577,0x8744b470,0x569491ca,
  149272. 0x75fb8552,0x3a6518f3 } },
  149273. /* 176 */
  149274. { { 0x224042a0,0xaaa8ed50,0x2452f1e6,0x6cb4e3b0,0x768211d8,0xedca5f4c,
  149275. 0xef4d5d3f,0x4e0fe3f9,0x522d46e5,0x33a8e2a4,0xf1446775,0x5998e21f,
  149276. 0xf592d01b,0x1496c50e,0x83a67739,0x69104c2f,0x472bbf00,0x28670bcb,
  149277. 0x503177bd,0x8ea883b2,0x7d2712a2,0xc5d8bc05,0xb439c994,0x41ef9317,
  149278. 0xdcda1aff,0x9801d3a8,0x7038f6fb,0xd686eeb5,0xfbfbf820,0xe80c5cd0,
  149279. 0xedc25817,0x540ac363 },
  149280. { 0xfe7f43df,0xa71969a9,0x2c1b9e4c,0xe6653808,0x859c2917,0xad9677d8,
  149281. 0x96aa4404,0xbaca9545,0xff1297da,0x0e9d855f,0x22aea7de,0x1f61897b,
  149282. 0x36f13f8e,0x96edccfd,0x16e200df,0x627d3070,0xc98988a4,0x729f0736,
  149283. 0x97f231d2,0x95e25e60,0xf6048752,0xaf7f221b,0x4019b299,0xd6682609,
  149284. 0x26b4b1d9,0x1d99de09,0x1acdd7a3,0xec47cf66,0x6ebe15e9,0x4de9f2b3,
  149285. 0xfa16974f,0x17db32ec } },
  149286. /* 177 */
  149287. { { 0x6cf40599,0x75ef6919,0x00c020ea,0x7ea10dfb,0xfcaaf679,0x3da5ae7b,
  149288. 0x88ddd678,0x0d663ca3,0x255bcfcd,0x5a21f8fe,0xe344bc7e,0xe9c3f538,
  149289. 0x548e0632,0x35f62b1d,0x43c6e64d,0x654f2425,0x26993627,0xc755a7a6,
  149290. 0xb0f41324,0xa3b7c5f7,0x3a2180f3,0x05697f79,0x1e81675b,0x6cf85fb1,
  149291. 0xe53428f5,0x6d3cdb35,0x52d28b02,0xe3aa1591,0xf7a3fb78,0xa8470255,
  149292. 0xa194445d,0x460bd01b },
  149293. { 0xc24d8077,0xbc34dc23,0x4c720d2c,0x82f4b580,0x6f5d1ffe,0xa29da911,
  149294. 0x92783ce2,0x578af520,0xb5904af3,0xe29f51ab,0xf7aa1190,0x46c570d7,
  149295. 0x571bddf0,0x4a522fba,0xae89bb51,0xbf4e2a06,0x59f3444d,0x799b35cc,
  149296. 0x26cc2557,0xc3028367,0xafcec177,0x94a4e985,0x7c36cbd0,0xadaf7dcb,
  149297. 0x75d39077,0xed31b787,0x2d3e24bc,0x52d6904f,0x1f95421b,0xc5ca2669,
  149298. 0x1734878d,0x7d342c3c } },
  149299. /* 178 */
  149300. { { 0x11fd127f,0xe5cf2c0a,0x119e4c5e,0x66d36bb8,0x6ef56ac3,0x621ab252,
  149301. 0xe5430675,0x30cfeaee,0xac3e9619,0x2ede27d2,0xf8fce671,0x6413513a,
  149302. 0x075f4c3d,0x6159c61b,0x59069d98,0xd447efe9,0xea76aea9,0xaf8d6f68,
  149303. 0x0f5bd164,0xac5dc61b,0x1e88bb98,0xdbab446e,0x1ba92320,0x618b8b16,
  149304. 0x78989865,0xa0eafb3c,0xc08b7e82,0x0c7abcc2,0x20d160bb,0x10f09b6e,
  149305. 0x8e4c63a7,0x5be0afa6 },
  149306. { 0x1bbbf49c,0x82ab6d38,0x8c0703fe,0x3e09ce49,0xe10f4263,0xeca58b5d,
  149307. 0xda5a4532,0xd9cc6581,0xf618f7b7,0x07e18876,0x250f7fe7,0x0419a5e3,
  149308. 0xde6b86be,0xbb1a9e90,0x37359169,0x584a7deb,0x5149db2c,0x38eb3489,
  149309. 0xb0ebabb8,0x14546a33,0xc2f88a92,0x0067f0b0,0x0a2db019,0xbde0dfe7,
  149310. 0xc63e6f3e,0xba51b06c,0xe9206fad,0xa19127b9,0xfe80dc0a,0xe4eb5e87,
  149311. 0xd4de30ae,0x1e6fccf5 } },
  149312. /* 179 */
  149313. { { 0xaa8ac924,0xb57dff66,0xc298b3e8,0x06e9ad31,0x65fb080c,0xd140e329,
  149314. 0x1d95c93f,0x7dab211d,0x8a180caa,0x6d68d842,0xa20ded69,0x1a929408,
  149315. 0x38df461f,0xa8151753,0x60eae932,0xff5604ae,0x7dae4c0b,0x901b9e49,
  149316. 0xde262e89,0x4573a97f,0xf1084983,0xed69d9a4,0x64724f1d,0x8ffa022f,
  149317. 0xea85a15f,0xd5f1c2e4,0x01453794,0x4c626ce9,0xbf0907dd,0x80440cd6,
  149318. 0x5ddaa837,0x4522d461 },
  149319. { 0xebfbe7c5,0x8895f079,0x84ef3446,0x30ea1ded,0xd4a1ab96,0x716a9eb6,
  149320. 0x50a30c68,0x1a4a5d22,0x0043bbaa,0x5a16631c,0x5010e5f5,0xbd107502,
  149321. 0x3d8c0556,0xbffe3e9d,0x07772419,0x31b30b18,0x84b82297,0x90ff7ef0,
  149322. 0xf21a18c3,0x00c37d75,0x565bb8f8,0x18d0a635,0x45e3bceb,0xbac1da2a,
  149323. 0x23f0b08d,0x1c38e90c,0x5fbc5ac5,0xf1ba1aa2,0xdda71fc6,0x09d5256b,
  149324. 0x6d7e40ba,0x346501a9 } },
  149325. /* 180 */
  149326. { { 0xcc2b0f1d,0x86be448c,0xac4c3703,0xe3eb45c9,0x9fc96bbf,0x5387f65d,
  149327. 0x5ae27fda,0xcef3c4e9,0x1bc18089,0xa008f776,0x22ca18a1,0xf374a084,
  149328. 0x53b73371,0xee882842,0x7cc09354,0xcb6fc6d8,0x61496d6b,0x8489ec1b,
  149329. 0x49e325c4,0xa92c29b9,0x7bdec166,0x15c6ca52,0xdcea2813,0x95444eee,
  149330. 0x3a21154f,0x34683eb3,0xd39061cf,0x8fb26f98,0x06c940bb,0xc3b08aa8,
  149331. 0xe554c96d,0x7c1d42cf },
  149332. { 0xdc110aa7,0x766e703f,0xf362e378,0xab7b79d7,0x5aadca3c,0xd259c75d,
  149333. 0x60be3373,0x2a6eca79,0x06c4e8ff,0xf4744a4b,0xf3b705bf,0xb2842cce,
  149334. 0xae304b53,0x1a3af5aa,0x1b2d31b8,0x7bbfa201,0x4bee88d9,0xc4ba6eba,
  149335. 0x565cb839,0x2d3565ce,0xdaf7ece8,0x24808696,0xe6959745,0x2c7ccce7,
  149336. 0xe94f9837,0xefd6eb3c,0x3811a326,0x0a33b4cf,0xfffa93a6,0x14203f43,
  149337. 0x73c31d90,0x031e9828 } },
  149338. /* 181 */
  149339. { { 0x765a17ff,0x4fefecfc,0xd1290a65,0xa09f3888,0x938da038,0xbf265c46,
  149340. 0xa169ad46,0x4bb6145d,0x23a62fe8,0x33cf8214,0xabc860a5,0x562df571,
  149341. 0x815c38c4,0xbf2a90fa,0x17eda875,0x45ba1d6e,0x946fa5e1,0x799d881a,
  149342. 0xb90f5a3b,0x6c1be784,0xb10ff52a,0x0910a37c,0xa4f4fd36,0xc38c1fe4,
  149343. 0x8e2d3ba0,0xc3180fc5,0xb17a6187,0x3e2ff050,0x943a35c2,0x3a00059b,
  149344. 0xa28cc51c,0x494d3645 },
  149345. { 0x4ba021f8,0x398426b6,0x796deb6c,0xd14c9083,0x7e36c762,0x6d2e5395,
  149346. 0x751cf216,0x8f556eca,0x19b24a19,0xdaca1e00,0x4b20c2ae,0x47887da4,
  149347. 0xff41a733,0x93ed4ccd,0x5c7c0cd7,0x8d717c44,0x91bf7009,0xcc48634a,
  149348. 0x3b59bbaf,0xa1f146f9,0xe5624f15,0xdd38bb39,0x303f8443,0x96d41aad,
  149349. 0x4bf104fc,0x6b670f03,0x29706582,0x0503f9ed,0xb34200f5,0x768e1f47,
  149350. 0xbbd4c6f3,0x3cfdcc5e } },
  149351. /* 182 */
  149352. { { 0xb523e13d,0x536c2a86,0x2920d0a0,0x1014a458,0xe7571296,0x3d52b478,
  149353. 0x7eb51bea,0x05746066,0x87b0e919,0x709f7861,0x686888e8,0x028aed88,
  149354. 0xd94afcd4,0x79a809d7,0xe2129af3,0x50c6032f,0x983c4082,0x75e4be72,
  149355. 0x7ab3be8e,0x98331bbb,0xb618c728,0xd31a032c,0x3f59c4a4,0x36dd85a1,
  149356. 0xed4f61e2,0xdbece345,0x1e571715,0xba7aaccd,0x64a1ebd7,0x138c58da,
  149357. 0x3d1aeea1,0x89296d0f },
  149358. { 0xcca82c97,0xb165288f,0x1427e8dc,0x26c6c12d,0x4c3edda9,0x66a94f07,
  149359. 0xeaa01ebe,0x94600e1e,0x30f5e86d,0x14abce7c,0xcb456a31,0x741d7020,
  149360. 0x279f42c2,0xab05aa13,0xd4238468,0x70b60faf,0x318d39e6,0xa18efec1,
  149361. 0x8920b318,0xeb07f1ac,0xd8399e03,0x01e3cba8,0x3c81a301,0x65f8932e,
  149362. 0xccc667d8,0xae8bca7d,0xa268607c,0xcee1ae79,0xcac0a12c,0x3182e64c,
  149363. 0x2b1a4c54,0x9233a2f7 } },
  149364. /* 183 */
  149365. { { 0x0acbee17,0x717e8df6,0x5c24fcdc,0x0f0959c2,0xe54ffcb0,0x46f09887,
  149366. 0xd285116b,0xb993deca,0xbba1fa51,0x0bfaa4f8,0xd0f2183e,0x9c9249ef,
  149367. 0x96847779,0xf93cb358,0x2322d421,0x284bfb7f,0xd42af009,0x40cc709a,
  149368. 0x9bb1d615,0xc69f2274,0x717c3c6a,0x76f50b3a,0xbb9c5eeb,0x8b21e985,
  149369. 0xa4783b5f,0x58fb19ae,0x52e1c3e7,0x04c86b9b,0xf2971ac8,0xaca59092,
  149370. 0x21ed8291,0x2bb26a69 },
  149371. { 0x15f81416,0x98a34435,0xaaff5bb4,0x086e72e7,0x0317261c,0x3d1f64de,
  149372. 0x5c0a1cfe,0x31c0786c,0xb3683401,0x542ea4d8,0x1a39b4cd,0x2f77273a,
  149373. 0xcbef27f1,0x14fe7ee1,0x16bb27dc,0xee7fc09e,0x410e5dc7,0xc0dccc17,
  149374. 0x1943b3dd,0xa3466742,0x3f31c1b7,0x92934b60,0xc22c1070,0x0186ded9,
  149375. 0x799f966b,0xa37ee8ba,0x249b0893,0x0f3bfcb4,0x2e92d4de,0xbae61447,
  149376. 0xe196eb08,0x937cb3f8 } },
  149377. /* 184 */
  149378. { { 0x16fbfdce,0x57c0e77c,0xc98d4cc0,0xea034cc9,0x42572d20,0xe7606d72,
  149379. 0x0019a83c,0x9861b55c,0xf1597162,0x80ba2803,0x05a0fd7b,0x0f4141dd,
  149380. 0x4b0daaa2,0x8865913b,0xaa3848ec,0xe6685746,0x3e0485d2,0x16d15a5a,
  149381. 0x3b6905dd,0x81c0c774,0x818af2ba,0xcec31b7d,0xd2b74b78,0x80d8f194,
  149382. 0x543e2f28,0xca659db2,0x9fb07c1c,0x31b83a7d,0x1f1048c0,0x86537fdc,
  149383. 0x78586a11,0x4d57bb07 },
  149384. { 0x53b396b6,0xbc4b768a,0x93b51dac,0xbc8b24c4,0xa30ae1b3,0x33e511eb,
  149385. 0x945147c5,0x893bbd95,0x179fe3ce,0x6cc86031,0x3f920bd4,0x34b0a167,
  149386. 0x6b256160,0xb32912eb,0x9d168d83,0xbc69a2a4,0xef0dd128,0xb4949e7a,
  149387. 0x872699e1,0x2613419a,0xbf21376b,0x06c58477,0xa4f97147,0xe55b1909,
  149388. 0x7b9b745f,0x63d6eb75,0x08df3c85,0xb5365b29,0x55fcfae3,0x0e257e43,
  149389. 0x979f2aa8,0x1067c118 } },
  149390. /* 185 */
  149391. { { 0x32bf8883,0xc8455084,0x6fd06667,0x4755286a,0x77c2335d,0xd70b0f8f,
  149392. 0x2f4a2c94,0x678e60da,0xd118acf5,0xa468d8ac,0xbf5b90d9,0xce93830b,
  149393. 0xed4e9104,0xea4b1c74,0x27776ea4,0xac67316d,0x361bab12,0xb98ad75c,
  149394. 0x99122451,0xc323d482,0x530a43ae,0x26440220,0x3292d5a5,0x3a44532e,
  149395. 0x5fecf1bc,0xdb48694b,0xc667b8b8,0xe4e0516e,0xa4306ade,0xb3aa595f,
  149396. 0xf34e9725,0x7e4f7091 },
  149397. { 0xb7f70919,0x3f3816e9,0x16b003f5,0x765216ed,0x778c99e5,0x46c6cff4,
  149398. 0x30a51810,0xe6a5abe8,0x45e728db,0xef6f49e6,0xcaccefd6,0x6fdd73ea,
  149399. 0x8c37f3f7,0xec394e6f,0xb6407fc3,0x73320802,0x96625cbd,0x988e8f7a,
  149400. 0x7cabfb00,0x83292363,0x407f359a,0x258ba9df,0xccbfae50,0xff01aee5,
  149401. 0xfe251813,0xfbeaeace,0x83f1cba1,0x9c69f161,0x9eadcdb5,0x512c58ad,
  149402. 0x6ccce8bd,0x2ae49cd4 } },
  149403. /* 186 */
  149404. { { 0xc40849f2,0x1239b0e3,0xa441098c,0x5136a4cd,0xe547f649,0x61535a99,
  149405. 0x7a9bbac6,0x92e4bdc4,0x53547af6,0x195a1646,0x8b47a74a,0x85ecb319,
  149406. 0x9de6a2b2,0x278553fc,0x0e2ba52d,0x471c038a,0x35bcba93,0x12ba1b88,
  149407. 0x6f31eca2,0xd4bf50da,0x802b32c6,0xd146e3f6,0x3c64c8c4,0x0c9c0131,
  149408. 0xeed21297,0xad30f12d,0x9c68530f,0x9b75bffb,0x8918de51,0x23c0ad3e,
  149409. 0xa73771b7,0x180e9d52 },
  149410. { 0x29ab77b0,0xc316542f,0xf7aee628,0xdd411d9c,0x353c2f40,0x044c0685,
  149411. 0x4b0ae4cf,0x638dc7e4,0x95fc266f,0xa0924185,0xfd2feb7d,0x639da671,
  149412. 0x5ea39798,0x56858ed5,0x58f3832a,0x7a694f31,0xd316d831,0xa94233c6,
  149413. 0x30a35a7b,0x2fcacb26,0xf1ff713b,0xfef8f7dd,0x59eee2f3,0x8b9b4525,
  149414. 0x156d064a,0xd1b4f91b,0x2f5cfcfc,0x177866c2,0x3777eb41,0x12bc2566,
  149415. 0xd8ab85b4,0x21ca6f3c } },
  149416. /* 187 */
  149417. { { 0xa3e66635,0x0e162b13,0x2a9f76af,0x1ef20a2b,0x46db3356,0xab473a30,
  149418. 0x7802bb8d,0x0840bd77,0xa699b44c,0x5b6baf5e,0x1b2207f1,0xc6e11900,
  149419. 0x790b0105,0xe5de16a9,0xdb67f004,0x22b12f15,0x8a025d25,0x185fad45,
  149420. 0xdf0a1142,0xbccf6953,0xf45034c0,0x4c42129b,0x1c277bff,0x0f740400,
  149421. 0x280a9e18,0x6e440b4c,0x842aa2b4,0x767de8f5,0x05e8d94f,0x3de20ab8,
  149422. 0x20227635,0x5aff5859 },
  149423. { 0xa8458e40,0x805acd20,0x149732bd,0x5a5557d8,0x5f1ca72d,0xc7074131,
  149424. 0x952b5323,0x7f2e269c,0x6494fadf,0x5c592556,0x1a7d2666,0x153b7acd,
  149425. 0x86fe2865,0xa6df063d,0x57d53b6b,0x1e91db13,0xe93ead01,0x9195bb89,
  149426. 0x2963bfe6,0x3d71e1af,0x88278886,0xfab2b9c2,0x3b859b6f,0x77836692,
  149427. 0xf7029dd1,0x6e695174,0x7b984561,0xc7987876,0x5907d849,0x64fb4f1d,
  149428. 0x88d8a977,0x3eab7e1c } },
  149429. /* 188 */
  149430. { { 0x52e5718b,0xc73a94b6,0xf4cee1e9,0xe3aefa54,0x553eedea,0x654e9e63,
  149431. 0x5f3aca1a,0xf2541e1b,0x0d083316,0xd7129489,0xfb7f950e,0x7965af63,
  149432. 0xc74e3e4a,0xd8fc9e0d,0xeaf79ebc,0xb4ee48d2,0x8b7787e6,0xa458a86a,
  149433. 0xf7cceaf0,0xd8c7621f,0xdf67980d,0x8228eeff,0xf9106727,0x210d4742,
  149434. 0xb07e3629,0x91f63501,0x7971e29d,0x441761c6,0x03a3b8a5,0xc0ccc65f,
  149435. 0x38e09544,0x3491da4f },
  149436. { 0xcb062eae,0x6706d046,0x5d08776d,0xee7db735,0x292315d2,0x80de8052,
  149437. 0xc402bbdb,0x40785662,0x26ed3337,0x5f93525c,0x7d568ed3,0x6cea14d6,
  149438. 0x66888b1e,0x916a1189,0x5dc71675,0x0fbd5205,0xe4575df2,0x833d1077,
  149439. 0xec092335,0x4e93100a,0x6cd85389,0x2f9e1d01,0x43226368,0xeebd3725,
  149440. 0x1ba4cfd7,0x401d172b,0x574c5838,0x377dab9d,0x80d517de,0xaeaa6958,
  149441. 0x6ad15a18,0x0c843dfd } },
  149442. /* 189 */
  149443. { { 0xc9373300,0x455811ff,0x99fdc300,0x1c39332a,0x353cb655,0xe19bb81c,
  149444. 0x96a83d27,0x774b924a,0xb2ee3f1a,0xcbfc8fcb,0x010d56c7,0xaf278ec4,
  149445. 0xe0abaf79,0x6fde682f,0x7339aebf,0x7566d072,0x71205db6,0xbd35ad5d,
  149446. 0x7051c9d0,0xb5bbe694,0xd3a3067c,0x577db480,0x572d7530,0x2c70ff54,
  149447. 0xe06d853d,0xe8615aec,0x05abfb5d,0x71999ccb,0xea0a8ed7,0xeeefc96b,
  149448. 0x35f6df69,0x2dcc469d },
  149449. { 0xc65f0e77,0xcca6cd06,0xbd71b14a,0xddcc7980,0x3c93cc00,0xb6221f8b,
  149450. 0xae8cbf57,0xddfcd5b3,0x76f8e63f,0xbc92973f,0x06e132b7,0xe9848a34,
  149451. 0xd51ec9e2,0x4cc59a03,0x3a33081a,0x9c9d32bb,0x80e8466b,0x00121052,
  149452. 0x1bbe7295,0xc2b0032a,0x24938448,0xdbfc6572,0xb6bba0ff,0xe972a0ce,
  149453. 0xc0a94802,0xf60c0a4f,0x599d8bc7,0xf62c41cc,0x312da0b8,0x820c96ee,
  149454. 0xcdbdf9fc,0x5a1a65db } },
  149455. /* 190 */
  149456. { { 0x42485684,0xbfba691a,0x29c470c9,0x613116b9,0xe62a0519,0xb4b01971,
  149457. 0x5ff499da,0xf3245aa6,0xa5238eff,0xc2ef87f4,0xcc9d5515,0xc16dc6ba,
  149458. 0x2dbdacac,0x5a7f227e,0xa9bbaecb,0x8dedaac4,0x2e7c9885,0xff308a6d,
  149459. 0xe6895593,0x4c6f2fc2,0x177e0611,0x3655f285,0x300b1bee,0xa63e8d06,
  149460. 0x13c17b54,0xbed0ce79,0xc4974262,0xca4abe35,0xbc4e4037,0xf4b44a17,
  149461. 0xefe5fbd9,0x5ae95099 },
  149462. { 0x804f7455,0x122e5ee7,0x22066682,0x341a4997,0x7795e333,0x97d24c31,
  149463. 0xe48efced,0x12f4123c,0x19fbc21c,0xe8738d92,0x0663a3ae,0xbb3bdc61,
  149464. 0x8593a6db,0x3603d8c2,0xe3c1ac75,0x926227f2,0x5eaae519,0xfea92ac0,
  149465. 0xfd6812ac,0x5b596f0b,0xfc2a82dc,0x3ce7e844,0x63522b27,0x3840481a,
  149466. 0x52867895,0x836088b1,0x26588688,0x21ffb7cc,0x2f4a7cac,0x0ca33161,
  149467. 0xa3edd298,0x4110667e } },
  149468. /* 191 */
  149469. { { 0xc2d04b63,0x81830357,0xf4929a18,0x3fc5a34d,0x22d195df,0xc73bf6da,
  149470. 0xcb432473,0x14df2f89,0xe997f138,0x345afe5c,0x8b9604f4,0xd8e3f5f9,
  149471. 0x50c10ae5,0xad7942e9,0xeed25ff3,0xcefd5447,0x0e73c0cc,0xbf68e51e,
  149472. 0xab54fa4c,0x5b1ad591,0x12b61c8c,0x8bbc1105,0xb5abf760,0xbb932913,
  149473. 0x01e79649,0xdb1231be,0x040ccbe7,0xd0a83e91,0x90a96db9,0x3dde426f,
  149474. 0x34df11ea,0x1cceb645 },
  149475. { 0x0c6d0f55,0x2d210c4f,0x9c673c9d,0x6cadf61b,0xa9ce3fbb,0xdd7f9919,
  149476. 0x93b063e4,0x135f494c,0x145a93be,0x580bdb3c,0x0f52ef7c,0x4d872332,
  149477. 0x8814bb6a,0x74d876e8,0xc7a97dee,0x4f6f723a,0x3e3cd833,0x7de2b8f0,
  149478. 0xae720270,0x6162f082,0xddfa486e,0xe88ec2d4,0x8d3a17c6,0xd965c859,
  149479. 0x3980171a,0x62e59e54,0xbbef6b22,0x0ab6285d,0x4d48b203,0x3cf45195,
  149480. 0x4ea25ea3,0x1f175233 } },
  149481. /* 192 */
  149482. { { 0x3467ea91,0x808a765b,0xfd2d9c45,0x3f4632ee,0x9cf2bc6f,0x7b75dc6d,
  149483. 0x359813ae,0xefc8d240,0xe44cbd8d,0x23ecb209,0x21525622,0x59ba10e3,
  149484. 0x3f1ee19a,0xfa14d934,0xfb0c48f7,0xdf97c21b,0xea30d437,0xc4e62890,
  149485. 0x651475c2,0xb286e2a4,0x126672a5,0x291f01e4,0x31aab3b8,0x9c6fda5c,
  149486. 0xe17d22ec,0xb7277a5a,0x914f0bad,0xbd88ed83,0x6a2392e1,0xd0b05d1b,
  149487. 0x65893c2b,0x4cb8af90 },
  149488. { 0xbb4b1953,0xa2b02057,0xf597f6ee,0x4ce08b44,0x5e6412c8,0x854f5d9b,
  149489. 0xb3cd4919,0x1913262d,0x6e42bb5d,0x902762e4,0xd78e7f60,0x8355c8e6,
  149490. 0x38b6c16c,0x8efaa824,0xe550f618,0xd0173790,0xe57d778e,0x118af462,
  149491. 0x715b4714,0xa16ad5e8,0x41dea4f9,0x900596c3,0x280ca610,0x2a957c32,
  149492. 0x374c65a1,0x2faee800,0x50080414,0xdb105127,0xff080fa1,0x8c1db931,
  149493. 0xd79878fc,0x486a5c25 } },
  149494. /* 193 */
  149495. { { 0x941b4f36,0x0521e213,0xf803b4f9,0xbaacfb14,0x52a54ba8,0xfdf1e22e,
  149496. 0x8fe4796c,0xacfabbba,0x58dbacb6,0xae0788db,0xc19dfa51,0xdf98d736,
  149497. 0x35a716ee,0x155c286a,0x9c86461b,0xbe7d4676,0x63a64a5e,0x50b6380f,
  149498. 0x9f609262,0x14b41914,0xa2dfc5b3,0x0919a7d0,0xcef466ac,0xc454da55,
  149499. 0x6986aaec,0x93fa4a24,0x71a49ced,0x5090b171,0xc1fa75ad,0x602f1d6c,
  149500. 0x78e4c054,0x5d269f89 },
  149501. { 0x14920419,0x3a74030c,0x90968739,0x0845d868,0xeeb70fa6,0x81b994c4,
  149502. 0xd9fc5bcb,0xabcaa06d,0xf58f8f2d,0x06539427,0xb1dc52aa,0x35c85f67,
  149503. 0x2c911baa,0x5a7d8d72,0xaec2d834,0x4041005c,0x7a8e5347,0xb5868a44,
  149504. 0x8de512c3,0x04ee180b,0x211168eb,0x4daa66e5,0x2317cd8a,0xc0bd5dab,
  149505. 0x61164df6,0xa1d4185d,0x1dbad7c9,0xacedca26,0x09b02683,0x0fe4b5ac,
  149506. 0x26d9550f,0x8ac9995a } },
  149507. /* 194 */
  149508. { { 0x2640a39d,0xb2c8dc9b,0xede0c9f9,0x21ff0b38,0xa1ecba0a,0x74f469bd,
  149509. 0x080d0417,0x8a902ccd,0xf4994604,0xe956fa32,0x9776ab15,0x348f85cf,
  149510. 0x0066f492,0xc21fc6ee,0xfeeef367,0x35b1ebfe,0x4613e5ed,0x7804581c,
  149511. 0xea6ba071,0xcbdfe8e6,0x950d73ed,0xddfcaa32,0x1da48889,0xc9747936,
  149512. 0xdbaffbd1,0xce867c8c,0x1cbaeae7,0xd267431f,0x897912c8,0x68255045,
  149513. 0xd7ea1e4d,0x0c7c1ddc },
  149514. { 0x1ce963a7,0x53aa30cc,0xc4c5fade,0x7352f64c,0x2828afbf,0x2b9aa2f8,
  149515. 0xca212107,0x64273c56,0x85a576dc,0xaadd7654,0x90b5c77c,0x6196ac3e,
  149516. 0xd1aaf39b,0x20d43e9f,0xcd05cbc4,0xfc392062,0x4c0ff2fd,0x14163872,
  149517. 0x2ae821e6,0xcf32b8d8,0x3fa7a3f0,0x5f58f943,0xf644ca92,0xaebf1d2d,
  149518. 0x1918a75f,0x0c061563,0x6b876118,0x7989b5ed,0xad412441,0xbf342445,
  149519. 0x1df633ab,0x24ffc9ae } },
  149520. /* 195 */
  149521. { { 0x93c7cb2b,0x89fcdc05,0x590053fb,0xc1243b95,0x6182343c,0x601debcf,
  149522. 0x66c18a63,0x364546ef,0xec913287,0xa5290701,0xf9788c31,0xc35b8026,
  149523. 0x92d1f7d7,0x852b862a,0x0aa79728,0x1809cb05,0xa3cb2005,0x897d467c,
  149524. 0x9ef5b946,0xf20c77c0,0xf2241984,0xc3372c42,0xf35bb206,0xda053e0d,
  149525. 0xa9c140b5,0xbc26c6d0,0xcb56fb33,0x61cfcc0c,0x299b3968,0x1c3cf9ef,
  149526. 0x40621ba4,0x89e4d3d1 },
  149527. { 0xa45a9be3,0xd35e80e7,0x07356fbd,0xc4daa578,0xb967bc2f,0x0186d62e,
  149528. 0x47cd16e3,0xa702679e,0x5f30ce9b,0xca2f1c02,0x1f864f50,0xf1205b46,
  149529. 0x85061d66,0x7fd6d797,0x8a08809e,0x47edc4f6,0x9a4d3ae2,0x5dac0449,
  149530. 0x6d1f9da8,0xf844664a,0xd7a83a71,0x9f30ce84,0xeaac33f1,0xe9382bac,
  149531. 0x948622ab,0x1f033831,0xf7681eb2,0xb037a4ba,0x99a1b5c7,0xd156a908,
  149532. 0xe6f1d0fb,0x675d3e6f } },
  149533. /* 196 */
  149534. { { 0x707193e5,0xd9767ffd,0x810358e5,0xe478aa91,0x328d8ef7,0x5634f9ff,
  149535. 0x6dbbd9a7,0x913a0ee8,0x7e215686,0x379b2968,0x89d9da38,0x903f410a,
  149536. 0x1b1334d2,0xd9f8d7b9,0xbd82efb5,0x9fe74229,0x3803c778,0xdb568b62,
  149537. 0xd3d25344,0x93e9a350,0x724497e8,0x559c35b0,0xa169e23b,0xc472d436,
  149538. 0xcc5b4c69,0x09864632,0x83c7f531,0x9f6d759d,0x1e497888,0xa91cf1db,
  149539. 0x60af1a4b,0x5f7f92fe },
  149540. { 0x0545167e,0xf18a1cc6,0xaffa88e0,0x55ee2e02,0x432a7bcf,0x24cdff51,
  149541. 0xa7510866,0x7382da42,0x40511af7,0xe894c11f,0x2aaf1423,0xaa4e4e31,
  149542. 0xf63dd2ae,0x8c3d36f0,0xd7660635,0xfc5c9550,0x37ea7eab,0x01253731,
  149543. 0x39b950f6,0x2a5cd598,0x40e63442,0x95a0f601,0xf2ac7045,0x905e238e,
  149544. 0x446b0f73,0x44bacc0e,0xc448578a,0x4cd4206e,0xa5bd7803,0x367b1aaa,
  149545. 0x0a2b458d,0x25beced9 } },
  149546. /* 197 */
  149547. { { 0x0c33a8fb,0x079a7382,0x0f25dc1d,0xcfbf6cd1,0xc6d482b6,0x4ffc73f8,
  149548. 0x07bf844a,0x3e51f18c,0x599162f0,0xa7651236,0x14013811,0xac59a74e,
  149549. 0xe55018a0,0x957a6865,0xe3ca09b1,0xe1ec51bd,0xa960253f,0xbc0c7eb3,
  149550. 0x7de03f84,0xe83bfd14,0x52fbdb09,0xc0540ed1,0xcea15ec1,0x6ba52edd,
  149551. 0x4b261307,0xf3d30ed5,0xe8397206,0x9bd7bae8,0x096373aa,0xf20d8692,
  149552. 0xc3b0bf63,0x0a616a4b },
  149553. { 0x6e1339c9,0x2075f3ed,0xbf8b00a6,0x7afaa072,0xbccd9b47,0xdfafec82,
  149554. 0x00ca54c7,0x4713158f,0x38bc31ae,0x449102f1,0x310dfc8a,0xaf98f158,
  149555. 0x59e954d4,0xc9ef2075,0xc527a0c4,0xe8021af9,0x7a192023,0x6e801277,
  149556. 0x7fb02377,0x635f538c,0xe8c9e951,0x5df1974f,0x15cc9097,0x0287faed,
  149557. 0xf7a5115c,0xfa0728f0,0x0fac623d,0x90dbfbe6,0x0311ba09,0xa8d40fd4,
  149558. 0x07c6464c,0x876d154e } },
  149559. /* 198 */
  149560. { { 0xc2d3ea8a,0xd3a4d6d2,0xa842600e,0x36be681b,0xe4070672,0xc53f100d,
  149561. 0x6a7d7a7b,0xe3e5b6fe,0x5d5e1a83,0x6e6994f9,0x76097c2a,0x07cacd22,
  149562. 0xa6791011,0x12d98dba,0x102e0e24,0xddfc4461,0xd493272a,0x4815dbc2,
  149563. 0xa9436696,0x7e38e64b,0x32b2bf90,0x4960eb1a,0xd928e28b,0xda457525,
  149564. 0x2a077c9e,0x72f75b39,0x7fd61d00,0x27760cbb,0x0f4b1456,0xaf235d1b,
  149565. 0xe76d1700,0x3040c23b },
  149566. { 0x4efa9a70,0xb10dc55b,0x53e86610,0xd4de414f,0x09f8a27f,0x3d95c113,
  149567. 0x06661d3c,0x505109a5,0x60eb513e,0xcaa2994a,0x1e7d338b,0x3ee41537,
  149568. 0x4651e71f,0x4fd145fc,0xcbc313b4,0x51bbf838,0x1eb92150,0xb039e078,
  149569. 0x14bf5ac7,0xe8696b44,0x8be0d48c,0x2d667188,0xdd8f2b6f,0xbe93b2f5,
  149570. 0xeb8a7f8a,0xc1dfd1e7,0x90f751c5,0x862b3dd9,0xa32a74be,0x1eb1ad58,
  149571. 0x1ebbc9a2,0x5486d79a } },
  149572. /* 199 */
  149573. { { 0xa1359e13,0xcb2e34ff,0x28196051,0x202d8dbf,0x23564b5e,0xe95e023d,
  149574. 0x42f6ac12,0xfb1340b6,0xb653725d,0x543ba852,0x8d2466ad,0x81aedcd6,
  149575. 0x547c728b,0xbf780224,0x9569fb65,0x559f8a11,0xdfb22ec9,0x505b7a62,
  149576. 0x9eed5e52,0x07107540,0x299f6f11,0x9c899288,0x3db6f8c7,0xa7d69261,
  149577. 0xb3ca79a9,0x30eb7fb3,0xfb2160b0,0xcab99bb8,0xd28b409a,0xd2012568,
  149578. 0x5ac45f8b,0x380f1b0f },
  149579. { 0xe6a0068f,0xc0b99e6b,0xc8a73753,0x4b67cf2a,0xb2faeb7c,0xa6c9a548,
  149580. 0x340260c3,0x7f417f99,0xcc0f739e,0x8ee56855,0x780949da,0xf08b510f,
  149581. 0x8d5c6eff,0xb1770fc2,0xfd96a7bb,0xb4f5abee,0xf2665a2a,0xa07b1136,
  149582. 0xb601dcf9,0x2fb380a4,0x162becc6,0xcc803614,0xee6b83b3,0x3498fb96,
  149583. 0xa8c17eeb,0xea9b0fd6,0xa177efc2,0x5834b5ba,0x5b110b3e,0x929044f5,
  149584. 0xebd7285e,0x4abedded } },
  149585. /* 200 */
  149586. { { 0x700ef376,0x3355e1b9,0x66cdabff,0xd56e5d9a,0x47e87646,0xb3dc2575,
  149587. 0x00f79369,0x28f44b8a,0xa0c52e29,0x08c32b1e,0x3729b392,0x5a78de12,
  149588. 0xb26d239d,0x4184519a,0xe0ce4a6b,0x23f6b4b7,0xacb2a9f9,0x235f6f8a,
  149589. 0xe2064a59,0xbb8bc454,0x1bf3062e,0x37efd034,0x94dff6f9,0x6bac683b,
  149590. 0x8aa7fa06,0xc3364b1e,0xce0b3745,0x0616772a,0xd1e3fb0f,0x46f08d08,
  149591. 0x18e132d3,0x6a20abb3 },
  149592. { 0x6a85cbc7,0xea831016,0x934f9aa7,0xd0990946,0xe778f1b3,0xc2211088,
  149593. 0x2247b799,0x7ea4ff8f,0x454484ce,0xb3171d71,0x4f98c364,0x29403949,
  149594. 0x97df1458,0x5da911f3,0x09439116,0xa6b58093,0x174238bc,0x75f9509a,
  149595. 0x8209758d,0xfeb51821,0xa47925d0,0xae0c6021,0xaf8a315e,0x0e946694,
  149596. 0x6bad04b7,0xae7af8a3,0xf072447d,0x44c15e7f,0xa5456ffe,0x5184668a,
  149597. 0xbf36b977,0x45e353a7 } },
  149598. /* 201 */
  149599. { { 0x93092f71,0x76056764,0xf5b92d71,0xeb66b6c2,0xe2c8b6c5,0x9db3149b,
  149600. 0x20c0363e,0xf62f583a,0x03cd7097,0x688acd33,0xebb916ac,0x85d0c0f8,
  149601. 0x84c19b0e,0x1bf7462c,0x7c4a6ad1,0xc76ed5f9,0xd119f369,0xec8b88ba,
  149602. 0xebe50b83,0x59b8371b,0x866706a6,0x0cc69508,0xf8373d2c,0x531c75a3,
  149603. 0x2a5a02fb,0x4e1cd3a3,0xda39a1d0,0xe8274778,0x75da333e,0xedfc5bbb,
  149604. 0xca79bd36,0x15941f24 },
  149605. { 0xa77dd512,0x42e8c0f8,0x1dc365f6,0xa91b59a7,0x08753862,0xe80d14cd,
  149606. 0xd272faca,0x1624230d,0x4027cb5a,0xeea3ec16,0xc1ef9f03,0xc1700b59,
  149607. 0x0da3148d,0xd411c127,0xc4181af1,0x801ee448,0x9e3a900b,0xedf28559,
  149608. 0x0d09affd,0x5d67b0bd,0x8b370024,0xd839df96,0xe6f836b8,0x3b6307e0,
  149609. 0xbd3201c9,0x5382e588,0x7a1d02bb,0x636d8a6b,0x968641e9,0x70b7db76,
  149610. 0x118fad03,0x6d17c34a } },
  149611. /* 202 */
  149612. { { 0xc181c99b,0xcf608841,0xc87bdcaf,0xb65dc901,0x3720dabe,0xb460b447,
  149613. 0x5377515b,0x4c79c396,0x0a96c277,0xd447f22e,0x2ac0f440,0x0d952130,
  149614. 0xc90583ad,0x8330b26b,0x928904a0,0xe25e977a,0x85c50b18,0x1deaffd9,
  149615. 0xa5ad5f6a,0xcf4dbcb7,0xc8a37ed5,0xcbcd0019,0x1e9850b6,0x7846dd90,
  149616. 0xb0b8e605,0x1ac8194a,0x34132f90,0xb9728571,0xf56ee28b,0x4ce9f149,
  149617. 0x3e9e1d4e,0x1ab9b5a4 },
  149618. { 0x314fa7a3,0x206dab92,0x478ff963,0xcc4af0f0,0x904d9fdb,0x4cce1713,
  149619. 0x12c045fe,0xac20a2eb,0xfd8f6d7d,0x44fc5478,0xca7b6ffa,0x886e72c5,
  149620. 0x6fd6f758,0x7fa4529b,0x92a820d5,0x4df1d1b1,0x2789f149,0x3d812f9f,
  149621. 0xaabb53d2,0x9842f083,0x2a03ab32,0x2648539b,0xb1512502,0x631ce090,
  149622. 0x731f6bd5,0xe1294d15,0x9436e634,0xb229361d,0x3ca966af,0x8c4281c4,
  149623. 0xc21ab3ed,0x24b34956 } },
  149624. /* 203 */
  149625. { { 0x659824e2,0x49bdcb86,0x4e13e74c,0x6dc4ce48,0x6bbe1eea,0xa4c01a26,
  149626. 0x1e3ec457,0x47b2b8e7,0x2f5a8e4b,0x7e8b15e0,0xe333530d,0xe81eb6e6,
  149627. 0x17a45202,0xacba369e,0xd70e4c9f,0x81241431,0x3e12beb8,0xc190af4b,
  149628. 0x11f486fd,0x53270523,0x29fb2bce,0x9f6c41e1,0xb70f6c08,0xbe6287eb,
  149629. 0x3feb4477,0x1479850a,0x9bcf18bb,0xfcfdfb11,0xda80d040,0x925c292f,
  149630. 0x7e3c5bf9,0x212d65e5 },
  149631. { 0xca15cf08,0x23adb386,0x81e172eb,0x4dfa4ac4,0x4d42d0c0,0x9d1dbf93,
  149632. 0x74404dc7,0xd9cf6073,0xe932bfcd,0x60508441,0x1c682a98,0x9ae910ca,
  149633. 0x41ac1cc0,0x9528fc18,0xdbbed630,0xe6a120ae,0x30ccf250,0x94e0e1ec,
  149634. 0xe58bbf2f,0xfe84ba54,0x9faa4415,0xc66d0b4f,0xecee7ce5,0x0c58f1e7,
  149635. 0x6fa6873a,0x7a1d43eb,0x399f1348,0x96c6c5a0,0xe6727ab7,0xe6ef9aaa,
  149636. 0x9a5c2447,0x66afa554 } },
  149637. /* 204 */
  149638. { { 0xc980e91d,0xda5aaba8,0x6ac98efa,0xa93cf509,0x8da32662,0xb0990e0a,
  149639. 0x0081453e,0x01d21530,0x3d71de84,0x2bb0d33e,0x3e19a012,0x465f6d80,
  149640. 0x78a838e7,0x5902ff4c,0x1931348c,0x74e2afb7,0x9cfb057b,0xa4932757,
  149641. 0x3ad03f8f,0x761ea642,0x58ffa40a,0xb7d4c245,0x77a87e30,0xb5e9c0d9,
  149642. 0xc9c84d26,0xd1c5edba,0x3d1963a0,0xeca8839a,0xebf6bf0d,0xbc6f2f35,
  149643. 0x0d58abdf,0x01ef0631 },
  149644. { 0x3ecdcbb0,0x2bf90316,0x27c1c955,0x19e2d728,0x9575c930,0x9e527030,
  149645. 0x96983930,0x0dc1c5a9,0x7cd082df,0xef9f80ff,0xdf97e051,0xcd915075,
  149646. 0x9cc61b55,0xf286fffe,0x80f24cc4,0x352db38f,0x36523ae3,0xed9b99ec,
  149647. 0x10b104a9,0x109a8ca8,0x305203ad,0xc2700fe7,0x769400f5,0x2a2ee24e,
  149648. 0xee0c452c,0xd595d399,0xf7f02a41,0x0ab75d6a,0x0db730b7,0x34108099,
  149649. 0x5e8d1202,0x0e4f5ffd } },
  149650. /* 205 */
  149651. { { 0x0ff14c38,0xbd1c6444,0xaece11f2,0x9a5b59fa,0x22af6330,0xaa4605a7,
  149652. 0x82af24ee,0xddc9f65a,0xeb9a1159,0xf4ee4bfe,0x74e84eaf,0x2463d076,
  149653. 0x0e0baace,0x88cbe1e0,0xd5fabdcb,0x7ca568ea,0xc57eb99d,0xbd80d524,
  149654. 0xe9be9873,0x9c46572c,0x7300b85e,0x918a1dcd,0x40f54176,0x49221312,
  149655. 0xb5b14236,0xf7e324ff,0x2434f16a,0x40dda501,0xa133d97c,0x08833421,
  149656. 0x0876f020,0x33d41161 },
  149657. { 0x9878e5ec,0x7531a36b,0x46918232,0x5de3e321,0xd0a30464,0xd15f9a33,
  149658. 0xaa173659,0x734c1b87,0xf925d4fe,0xac2094a2,0xc262b0f4,0x43c965a1,
  149659. 0x447d5cbc,0x759c903e,0x05239300,0x92af215e,0x1f593f34,0xfffb6d5f,
  149660. 0xc3cddb5f,0x65943b4b,0xbfdd5408,0x9d03a29c,0x198d76c0,0x8f7cda6b,
  149661. 0xc0f27b59,0xc0790a22,0x8cb58ccf,0xba557a84,0x76c54fdc,0x5922052d,
  149662. 0x47b6b466,0x2d3de7aa } },
  149663. /* 206 */
  149664. { { 0x65add3b7,0xaade7462,0xabf24c2a,0xe5888f35,0xe1a57d93,0xd41549ca,
  149665. 0x2c76f7bf,0x0e22e18e,0xbe3202b3,0x67f288ea,0x1d1d0f0a,0xb79a66ba,
  149666. 0x2881ad18,0x0e0ab749,0xc7adb0e9,0x7d424086,0x2842132f,0x870c32c5,
  149667. 0x58f9a09e,0x858477f1,0xec025589,0x422a9372,0xa5098777,0xbe428c5c,
  149668. 0x57660058,0x45b79564,0x957f37cf,0x6c7fc631,0xd6316289,0x8b7023dd,
  149669. 0x5b1c12a6,0x47003bb6 },
  149670. { 0xc91c1c96,0xd99401c1,0x27a12970,0xaa5dcdf9,0xc3c29107,0x3ab92e17,
  149671. 0xa3fe4710,0x26fce8f7,0x4ee998ee,0xb0d09d5e,0x8e3a41f8,0xafa62204,
  149672. 0xa26ca506,0xb1c012a5,0x99b57252,0x2c6f734c,0x512f7fe1,0x1093d79f,
  149673. 0xacee19a6,0x2f30906e,0x056d1ea6,0x6bff8381,0xeff35f21,0x61c75856,
  149674. 0xc1ad2224,0x6e07e978,0x6b20fde8,0x2cca6ca1,0x633fe81b,0xab4d6d2d,
  149675. 0xb06a2ce6,0x73dff504 } },
  149676. /* 207 */
  149677. { { 0xd8e20fb8,0x8b615805,0x82b533f0,0x7c6873e4,0x56a854ca,0x5205f001,
  149678. 0xcb369211,0x87fec6ac,0xc7f092b7,0x1fa3c0ec,0xe845fe4c,0x5b36647e,
  149679. 0xf8b1f112,0xd4781e85,0x8b0f1a6f,0xc6526839,0xdcb8eb92,0xceeb8c6c,
  149680. 0x8e5f6d52,0x133f0ead,0xc8d934dc,0x31883e23,0x428ac45a,0x214ed5bd,
  149681. 0xdbbfca85,0xf77ca492,0x07e5ae13,0xdf4113fe,0x72ab05fb,0x63e4a0d2,
  149682. 0x7148f535,0x7544d0b7 },
  149683. { 0x80797ace,0x4fe8d134,0xaf86d97e,0x216d6aa0,0xef5a68fc,0xdbf0a688,
  149684. 0x9f9b2684,0x18b26f45,0x8999d2fc,0x52fefcfa,0x62423955,0xd5af8d82,
  149685. 0xf63a3780,0x8f123469,0xdcd4feaf,0x2933454f,0xa73b5d09,0xba8018b7,
  149686. 0xe5552c18,0x9af1f276,0xff26bb1c,0xc5d4773d,0x06dd4f44,0x9ef49410,
  149687. 0x5f39ba49,0xad8f12f9,0xf66ca4f2,0x5767f6dc,0x7922f59a,0xba8773f1,
  149688. 0xc1e42d49,0x220081ea } },
  149689. /* 208 */
  149690. { { 0xba37a0ba,0x3043d573,0xdd176df6,0x05a431bc,0xc42070f7,0x03322cfc,
  149691. 0x67c2d109,0x5cabd30e,0xcbf8bcfa,0x362c95de,0x7787b10b,0xd767d277,
  149692. 0x6ec05e64,0x612c915e,0xce69c30e,0x9e669631,0x682e2635,0x27c9dd8f,
  149693. 0x95ffcc38,0x79021f12,0x8a2adca2,0x06a8ee79,0x4b5d500a,0x8e00e784,
  149694. 0x8d80d6c5,0x87746fc7,0x915f10cc,0x246053be,0x219f6fd8,0x844e328b,
  149695. 0x11bd3733,0x620541ac },
  149696. { 0x509e5a29,0x0f7fd382,0xb432531e,0x8748d7d0,0xcd3883b9,0x8f749354,
  149697. 0x8bfbb17a,0xc6b8ac74,0x05f2d2c5,0xa4616a66,0x1bcb1b83,0xb3d96625,
  149698. 0x2fee265a,0xcf753104,0xdb225058,0xc70d73fb,0xf0c2d556,0x1211d434,
  149699. 0x54b259b3,0x862061d8,0xc42b3f7d,0xffe4606d,0xe86a4949,0x4c5c8585,
  149700. 0x160eedac,0x04ddcc8b,0x568e2420,0x1804ce67,0x42141656,0x91f3855a,
  149701. 0xf932be97,0x7f378198 } },
  149702. /* 209 */
  149703. { { 0xdfa6639a,0x9a374bda,0x02ab7391,0x0cbd48d4,0x47031e2d,0x5c5ef236,
  149704. 0xd0599d1f,0xb49ee2bc,0xe0d38443,0xd285eb60,0x269392e8,0xdbbea92f,
  149705. 0xb8bc538f,0x91455fbf,0xe469b768,0xae259ff1,0x41de5682,0xc1cecb1f,
  149706. 0x9952d1ae,0xc876f071,0xe7bf7446,0x1ce25181,0x282ad2f1,0xcb93ad86,
  149707. 0x6ba4ef67,0x8fa3cd31,0xe507aa3e,0xfce68a04,0xa61bb608,0xced74170,
  149708. 0xf6ac10d0,0x6de716b3 },
  149709. { 0x172d6dc5,0xd4e58d04,0x6397c65c,0xbed2cde6,0x0c9eb4e8,0x7ae77e18,
  149710. 0x75fa2edb,0x56275468,0xa91e6738,0x4b30324e,0x235c8b2e,0x6023a856,
  149711. 0xa8f92887,0x9df6d6c2,0xf6f5e8b5,0xec2c185f,0x3ad5748a,0x7892e12b,
  149712. 0xd54aefbc,0x7aebb4f2,0xee868821,0x14915448,0xb1d9bd5b,0xa26c5f71,
  149713. 0x2ff00df7,0xe5ccd166,0xb95b1dee,0xebc99f17,0x3fe1f774,0x90983616,
  149714. 0xbb3d25b0,0x51f90830 } },
  149715. /* 210 */
  149716. { { 0xf2922461,0x49376fa1,0x1650d0d1,0xdbb1b1c3,0x0dd8608d,0x92b91c33,
  149717. 0x36b89906,0x3e612c4b,0xdf560052,0xe1977b0b,0x636a2545,0xf8afff70,
  149718. 0x11723d8e,0xcda7d278,0x81bde7ba,0x0b0bc4bb,0xed2a578e,0x3cb080b2,
  149719. 0x171b2e02,0x5bda0d0d,0x941bb9ae,0xf6df38cf,0xc14a65c5,0x85dd81db,
  149720. 0xc19dd98e,0x7f98c82d,0x52206f93,0xc613747f,0x5f5bbe78,0x9e13a2c2,
  149721. 0x0aa34be7,0x5eed218e },
  149722. { 0x01d4dc0b,0xe1565754,0xf566bb07,0xa1ae5f27,0xb82225d5,0xe985ebeb,
  149723. 0x1189ec6b,0x5f3ad21c,0xecce4d9d,0x17da518c,0xd6b65b59,0xc84a2d3e,
  149724. 0x8ffa771c,0x7f988175,0x2ac69a7a,0x50d6ae12,0xc6e6846d,0xcb7f30b1,
  149725. 0x5bd0bb13,0x8c023a60,0xd73f2407,0x9a10fecd,0xe5f0a996,0x8c5158cc,
  149726. 0xbd8f5806,0xd26bf615,0x915a46e1,0xaf32ea87,0x0287d308,0xeaf74e81,
  149727. 0xa6264254,0x8c14ba06 } },
  149728. /* 211 */
  149729. { { 0xb17ee201,0x0c877895,0x88e57a77,0xc05aa471,0x97822456,0x19c3e763,
  149730. 0xc9c3ba1d,0x0be6f8c0,0xb4389ebe,0xfe85f4ff,0x0ce7fbb6,0x538bccce,
  149731. 0x65266c64,0x876eab2a,0xcf9a3842,0x5c9ac690,0xccc8f981,0x9f5cf3b1,
  149732. 0x9cf687de,0xfa17be6a,0x83835c15,0xfcfc10fc,0x150ef2eb,0x086b0fdb,
  149733. 0x884a52e6,0x9f97ecd9,0xb0cd1eb8,0x416e6fa2,0x3ecc03ba,0xe2bd1599,
  149734. 0xeabb165e,0x645c0a5d },
  149735. { 0x50aa7e31,0xd94c4205,0x2f851da5,0xaec8df0c,0x3c726e6a,0x99646909,
  149736. 0x2619bf9a,0x72dbdc36,0xe253fbd5,0x1b4260e0,0x8c709e06,0x97c259fb,
  149737. 0xcddaec5b,0xfabf7cbb,0xe4b703e9,0xb4d5e8b1,0x0734efdd,0x1b06e56e,
  149738. 0x1f55f8a5,0x02d4a4f9,0x3f565c8d,0x7f8608ba,0x816d1d94,0x822f47d2,
  149739. 0x5ce7b136,0x0cc36156,0x31d04242,0xe46ee5ef,0x683567f6,0xb2a65f70,
  149740. 0xd2fa6c91,0x27e9ff40 } },
  149741. /* 212 */
  149742. { { 0xd7e952e7,0x75251893,0xc735bf18,0x15b30583,0x96fe0491,0x732b5992,
  149743. 0x806d2fca,0x27451858,0x1b885ed9,0x71ab76a0,0x6d9f55ec,0xbdce9d97,
  149744. 0x48f2ba9c,0x3da60b20,0x592b132b,0x6977c086,0x099051d7,0xb6dca9cb,
  149745. 0xd188ae25,0xd9c2ab23,0xe20aaf3d,0x9f469f3f,0x5aad74d0,0xdbd1f7cf,
  149746. 0x22a9eb3b,0x3d5efe5c,0x137010c4,0x8c5edfa2,0x57870260,0xada2217b,
  149747. 0x3dac9776,0x4feee567 },
  149748. { 0xb5d3d780,0x30e18d52,0x07166744,0x4dadb5d3,0x5a742156,0x320d386e,
  149749. 0x8d6bbb86,0x5d8c290e,0x2d263dd1,0x981a4323,0x98984636,0x33d0e7ca,
  149750. 0xa519acb1,0x5138784d,0xdddc81ff,0x832e3fab,0x3199a43a,0xfc278594,
  149751. 0x32743163,0x5b4cabcf,0x74f94fa7,0x9fa010bd,0x5694a627,0xc28a743d,
  149752. 0xcb657a24,0xc1d2a888,0xe86a25ea,0x7eef2503,0x04c561ff,0xed11a5d3,
  149753. 0x9c9ede0e,0x4fe818e7 } },
  149754. /* 213 */
  149755. { { 0x7fc1c7ff,0x00252c9d,0x9fa89ad1,0xa9bd419d,0x4064e9cc,0xc93a124a,
  149756. 0x43942ecc,0x384cbcb8,0x8749695b,0x004c21fd,0x421165bf,0x69c81d9f,
  149757. 0xdde01102,0xe2325628,0x5a9b004d,0xec937457,0xf6dcfc21,0xfb3346bf,
  149758. 0x4d372c7d,0xac4da64b,0xf20494e2,0xcecb7ad3,0xe867c150,0x562c41b5,
  149759. 0xc2b723d8,0x299395ce,0x7ee53231,0xc91adfc5,0xf10b6597,0xe06f1161,
  149760. 0xb74d3ffc,0x81915529 },
  149761. { 0x6ed9d4ee,0x8ec12431,0x689aff01,0x3dffa154,0x2a89a3f4,0x4aba349f,
  149762. 0xd467efb2,0x2db1e8e2,0x039102e2,0x18dea354,0xe52f082b,0x422ab853,
  149763. 0xed36dd47,0x7130a2c1,0x0295d1ee,0xca60e86d,0x7c7f5ad3,0xe6ac6808,
  149764. 0xde864658,0x0f83cecf,0x461d1265,0x72e66c21,0xbd385099,0xfeef4150,
  149765. 0xa6632289,0x0f183f3a,0x792dc795,0x275454be,0x11367702,0x2744c11b,
  149766. 0xe8ea6ef3,0x7d06bcc7 } },
  149767. /* 214 */
  149768. { { 0x7090212f,0x89285942,0x5521e844,0x691b7d4c,0xbe2dbb92,0x4c038422,
  149769. 0xbd81f880,0x317721ed,0xac89bc36,0xc136cbee,0x7b8f004d,0x4f71b60b,
  149770. 0x4e218ab8,0x269132d0,0xe6cc814d,0xb0e2496e,0x75fadc15,0x0b2ce317,
  149771. 0x66d223c5,0x82e3c084,0x4c612f8b,0x9721caa6,0xa4b65355,0x59a751eb,
  149772. 0xc7d3d9d1,0x3433aad5,0xe80d4246,0x1e61b9d2,0xfc673caa,0x149f655f,
  149773. 0xd0f9cb92,0x48b52b99 },
  149774. { 0xefdc05be,0xa3915399,0x13e095e9,0xde70db18,0xcddb3fda,0x447862e9,
  149775. 0x1a009451,0xa2b03162,0x23920ea3,0x4b27980c,0xa23b8feb,0xac5394f1,
  149776. 0x3e5616d4,0x163f7256,0xb714219a,0xaa0ff93f,0x93d62474,0xd26f96d2,
  149777. 0x7dcfe276,0xdd212ea8,0x47038d15,0xab27bf2f,0xf418168e,0xe58c8325,
  149778. 0xb32a989a,0xe3704222,0xbfc9f13b,0xa3694390,0x0d0684ad,0xf16e2606,
  149779. 0x9d8c76ec,0x17c0de87 } },
  149780. /* 215 */
  149781. { { 0xdcc01958,0xbca5f453,0x1ce88393,0x7d945954,0x561f5b6d,0x5e6350a1,
  149782. 0x7e2d36bc,0x291c3c86,0xa5ac3a6c,0xf6c7ed84,0xd98006cd,0x7913c40b,
  149783. 0x5671ec3b,0xf78bb087,0xb43e89a9,0x1c928f6e,0xae1ea1ed,0xfdf28df3,
  149784. 0xb924b2b5,0x62bba5b1,0x1a116e05,0x491d2705,0x167ed3e3,0x08ec02b7,
  149785. 0x5bc0b046,0xe291cf7b,0x8c5d7f59,0x30e50169,0xf5c799b7,0x0c7c350d,
  149786. 0x0ac6e1d7,0x6862b9e2 },
  149787. { 0x9ffa1f64,0x56c6f4e7,0xa1e24349,0xfed6a91a,0xcdb75232,0xe9a0ee0c,
  149788. 0x0322d607,0xbfc90b37,0x462fef87,0x29480ad2,0xc2bfcf34,0xfc214969,
  149789. 0xa539e38f,0x6e5211e0,0x12a5149c,0x2a59ec26,0xd706b532,0x195fe212,
  149790. 0xe99c8429,0xf77fb108,0x5dc80482,0x74ceaea3,0xbd92d298,0xa5a6030b,
  149791. 0xaaea15ee,0xad42dca5,0x4987109c,0xd6ac3bc7,0x290af649,0xc64e1c40,
  149792. 0x51f8de6c,0x5093fa2d } },
  149793. /* 216 */
  149794. { { 0x4c2d553b,0xc4cf3280,0x3b966c29,0xdc1abe22,0x2296914a,0x556a549c,
  149795. 0x999976c9,0xd8c9f8b5,0x776e83f3,0xc22c57bd,0x7c85ec57,0x4f2942ab,
  149796. 0x6e2c61f5,0xef3407e5,0xf213db48,0xf005e8ca,0xf32698c7,0x470c853d,
  149797. 0xcac0a54b,0xe6f488d7,0x60b7501e,0xb6bd6bed,0x714a4bd9,0xf0103106,
  149798. 0x6e098894,0x5285bc3b,0xf5f92a00,0xec06741a,0xef7ef24a,0x32f16426,
  149799. 0x6c77a438,0x12f9c44d },
  149800. { 0x83313a1c,0x1951e964,0x33c58b37,0x98edd3da,0xc7ac4044,0x4edbbf52,
  149801. 0x0dcb5ee8,0x866ca6f7,0x6dd422f8,0xec0ae8f5,0x0661ec2e,0x1077bc54,
  149802. 0xd422523c,0x6d39913a,0x58e7cb3e,0xd105e1e8,0xc979bb45,0x47c9397f,
  149803. 0x0997b592,0x3221d4a9,0xe8952fe7,0x0ef628a3,0x4e946241,0xd08d5827,
  149804. 0x59780f40,0x64cbed0f,0x08e110ec,0x13d7c227,0x7679b1a3,0xd186d866,
  149805. 0x26ae1d18,0x02f75e4e } },
  149806. /* 217 */
  149807. { { 0x47f307d7,0x1b637ebf,0xd0141477,0x6b644a6a,0x2e05a80c,0x82a33d65,
  149808. 0xfed07b31,0xc8f1a0f3,0x3696e597,0xc09ee7f9,0xc7ffc01e,0xcdaa7ec3,
  149809. 0xf8f373b9,0x549f88fe,0xc3bb8989,0xc88d1961,0xdfcaa7b7,0xd92a4fe9,
  149810. 0x3ae4ab20,0x12ff9ee2,0xf5ecb1a5,0xf5aea641,0xe32fb47d,0xe769237f,
  149811. 0x25d085c0,0x96a5c420,0x26c755a2,0xdc912558,0x9bce9723,0x580b985f,
  149812. 0x63961941,0x72b1b566 },
  149813. { 0x790e5558,0x9d708a08,0x0689af80,0x98536041,0x42313b5f,0xe85e7b8a,
  149814. 0x55a49d1a,0xe6ba1292,0xac371b0b,0x5e76c4b0,0x938e6e19,0x58504f39,
  149815. 0x60ae9a21,0x8dd41422,0x968485ce,0xd8b04e9b,0x887efe43,0xf94c4ba5,
  149816. 0xf11c5e73,0x11268e67,0xcf6b99c4,0x92623e28,0x7a0a9662,0xf2d0aaa8,
  149817. 0x4ca02ed3,0xb266772a,0x2d63b551,0x68ee8e4e,0x2e78b5b5,0xcdebb299,
  149818. 0xe17225ad,0x5df19216 } },
  149819. /* 218 */
  149820. { { 0x8df2e7e3,0x20027e1e,0xd8da07de,0xb183cc68,0x4b4ae694,0xce35ba69,
  149821. 0x3ca62e88,0x896d97df,0x52efed2c,0x3de4713b,0x26bd084f,0xd006c40e,
  149822. 0xfc81923b,0x1e9b71bb,0x1aacc6b0,0x9991c7b6,0x8f656840,0x650c9364,
  149823. 0x87f47524,0x138561d1,0xbffd3ca2,0x610f2b11,0xfa191418,0x96915faf,
  149824. 0x955e5309,0x8f1236de,0xa1872d79,0x613cbeea,0x66a2a48b,0x7f7b44ea,
  149825. 0xe0a89c32,0x452265c2 },
  149826. { 0x25430010,0x4ad5ec79,0xebd090c0,0xcac786ff,0x20a9d3f5,0xa5f9f4ff,
  149827. 0xa3edc65f,0xfcbf4112,0x0cf3eb11,0x8824839c,0x8aa5b700,0xb8dd6d4e,
  149828. 0xb7568ab8,0xe2271dfd,0xb744560e,0xe43ec373,0x1cf75296,0x78eaf926,
  149829. 0x3fa96d9b,0x1809ae0e,0xdc25dfd5,0x0b312d2d,0x6bab7711,0x6b8f78b4,
  149830. 0xb5ecf1e4,0x069efc8d,0x609fecaa,0xc1952bae,0x5f4dbde1,0x43e302ed,
  149831. 0x1e078555,0x14b02bf9 } },
  149832. /* 219 */
  149833. { { 0xb87e5b57,0x2c71c768,0xf531a557,0x0bcc78f7,0xf7597dc8,0x4ff93f8b,
  149834. 0x139e175f,0xb28e026d,0xcb94ca6c,0x6b83b727,0x0079f7fc,0x2eafe3b2,
  149835. 0xcf3bd170,0x2aca54de,0x6af0dc6c,0x17c4133c,0xccf5e35e,0xbea1e665,
  149836. 0x345505c6,0xa6691a48,0xe6100b89,0x2633abd0,0xc17d0388,0x966c6706,
  149837. 0x1a0cf90c,0x7aefffbe,0xd0add64c,0x4d847be7,0xaea2aa46,0xd49bcdfb,
  149838. 0x2cc7d0a5,0x85e07e74 },
  149839. { 0x0bc25bca,0x23aae0a6,0xe44f64ec,0x6e8e55f1,0xb607b773,0xe1e696d8,
  149840. 0xd3005909,0xaa90a746,0x2cbc4990,0x072b1ccd,0xc68e2f5d,0x0d0fe6c6,
  149841. 0x53e28ec9,0x920ec5f0,0xf0040cc1,0x79b21fb4,0xfcc4a2c7,0xa7375bd3,
  149842. 0xe1bac7dd,0xf5f5def9,0x35c0f8d3,0xdc315d79,0x2cacd318,0x7117c170,
  149843. 0xe926f71c,0x6f2823c4,0xed02f39a,0x38db58bb,0x7db69323,0xe5b49231,
  149844. 0x8d49f430,0x0964039f } },
  149845. /* 220 */
  149846. { { 0x56999eba,0x21774f16,0xb1de6305,0x3d8ee287,0xde0b2669,0xd81af726,
  149847. 0x3f8942a1,0x37446939,0xea03e13c,0xbcf6b615,0x94e273cf,0xd30c0c35,
  149848. 0xc6725c56,0x4fd33a56,0xa8be97a2,0xa57534ad,0x7c22a251,0x799242a6,
  149849. 0x9d0c5c49,0x4e51bdb5,0xc6a42768,0xd7cd76cc,0xd426bf59,0x914097ac,
  149850. 0x66e9beb2,0x59404a2c,0x5c96e3e9,0x4738fe98,0xaad666d0,0xbcbb3e0e,
  149851. 0x63bc5e56,0x626b0fd2 },
  149852. { 0xe1a1ec42,0x47217dba,0xab5acc50,0xaa6ae7db,0x865331d1,0xb7e1ab1e,
  149853. 0x3d30126f,0xb8453070,0xdee61851,0x280649e0,0xea689544,0x8806f4a3,
  149854. 0xcb56f632,0x4bbe43ad,0xbcaff94f,0x036b9bda,0xbd0637be,0x0d941e65,
  149855. 0x686f3abb,0x82179d44,0xaad6afd6,0x1486912c,0xff7e1534,0x9a3b891e,
  149856. 0xeb86fd96,0x88c426ce,0x117928c3,0xb56e6a81,0x96399e00,0x933e7135,
  149857. 0xa17b6ac1,0x09bbddd9 } },
  149858. /* 221 */
  149859. { { 0xe4fd3673,0x75e39c1d,0xa65c8e07,0xf880d9d1,0x7289c7fe,0x4725c1dc,
  149860. 0x3529d200,0x5b6735ee,0x3c747af3,0xc1f8f2ed,0x912efdf5,0x5cf3998f,
  149861. 0x49859c39,0xed722618,0x0e69795d,0x23793a2f,0x86b1d2a7,0x8a6ab8d6,
  149862. 0x22a882e4,0x00c815de,0xf9db8d7e,0xbe77d6fc,0x02267547,0x0886fb32,
  149863. 0x49c10edc,0xb62687d4,0x7c83ed4c,0x9f1c3e17,0x5af366ea,0xe6d5d7f0,
  149864. 0xd1efad24,0x2eaa01b8 },
  149865. { 0x1f357c74,0x5e47fb70,0xa9e3b794,0x93085c4a,0x6e85a905,0x4f098733,
  149866. 0xbe0244c9,0xf53808ff,0xa3b5660d,0x91dddf93,0xf3b95ed6,0x8b76377b,
  149867. 0xbb3920d4,0x91b911b7,0x86a13cf3,0x7ccf08bf,0xea018e58,0x53ed8f97,
  149868. 0x78c55194,0xb1ea4343,0xe0d2d5a6,0x8e6adde9,0x9b96259a,0xfc2b248f,
  149869. 0xeef17ddd,0x96ebceae,0x557f9c85,0xf694b443,0x07d5bba8,0x48cd150f,
  149870. 0xb4c1986b,0x02d31de9 } },
  149871. /* 222 */
  149872. { { 0xde79499d,0xa6bb9e1e,0xfd0fc2ad,0xf6ca8ff8,0x1a7d9356,0xbec0f8e8,
  149873. 0xe8f06327,0xbc3d1c9f,0x3b300beb,0x805c7217,0x413c181b,0x00420a08,
  149874. 0xf0ca9d01,0x9e9a167e,0x1aeeddd6,0x076c909d,0x8e3a8a72,0x64a1997f,
  149875. 0xa77b429e,0x3ce7f7a7,0x5c94d3e9,0xaac0fbf4,0xe6d48407,0xf37694a7,
  149876. 0xa91921e7,0xf56679e2,0xee1dbbd6,0xf23fe0f3,0xcbf9fa99,0xc7917566,
  149877. 0xe0f4d765,0x965860f2 },
  149878. { 0x7fa5f79c,0xe734702b,0x5af2d26d,0x930bd426,0x6c73e0ce,0x45bd8b98,
  149879. 0x4ee44a2d,0x7dbe7bed,0x956c8a1a,0xc129e024,0x77cdf80e,0x6fdc05ac,
  149880. 0x589ca59b,0x70a6ba2b,0x999825af,0xfc484021,0x7a23f0b6,0x1d284b54,
  149881. 0x28a0a8af,0xb1da10a4,0x2b2af6d8,0xb1eb1b31,0x33935ee3,0xf051443a,
  149882. 0x8effa6ec,0x7a07eb26,0xd662654c,0x16ee4086,0x4549ee4c,0x7a7bc501,
  149883. 0x1fa98a52,0x65081032 } },
  149884. /* 223 */
  149885. { { 0xb67ed9b2,0x49f0e460,0xc36d93d2,0x0cda0fd0,0x88c75e1c,0xbb5963e9,
  149886. 0x614bc0c9,0x757bbe93,0x9a768605,0x9a9b8801,0x48edc544,0xa8b7e2af,
  149887. 0xb51a5985,0x9e77ed9e,0xebbf024c,0xdd025274,0x1545c636,0x598b6288,
  149888. 0x4800dba0,0x39bdaed0,0x81e2a23a,0x7fc20139,0x550cb4f2,0xdc66fd5c,
  149889. 0xb52068c7,0xad27032f,0x8169fa15,0xc9a0bcae,0x3a7ca8a2,0x60606f21,
  149890. 0x9862652f,0x98295046 },
  149891. { 0x2e11c128,0x3e374600,0x0e6dca7e,0x80dfae5d,0xd9552264,0xe44016e2,
  149892. 0x880b7143,0xf65f88f2,0x526b881c,0xca3d28d4,0xdfb86afe,0xf9c59dd1,
  149893. 0x4c74f958,0x548860c2,0x9cb69f4f,0xd06ea43c,0x7334ecec,0x5343c9ae,
  149894. 0x35329713,0x5cc2ccd6,0x5f3a6c0c,0xa95ff403,0xb372653b,0x2e01a1cc,
  149895. 0xa250523d,0x31510fdf,0xa6227eb2,0xeee538e2,0xca23cd10,0xeadfc8a0,
  149896. 0x3e78f54b,0x4b7e6e1b } },
  149897. /* 224 */
  149898. { { 0xdb5f928b,0x79c9076f,0xb7347cec,0xe6250bb6,0xac00ec41,0x54b67798,
  149899. 0x9d9619c7,0x900d20ba,0x59e4343f,0xed42c0d0,0x451935d7,0x3df39e85,
  149900. 0x64f701ce,0x26391182,0xe1f87aac,0xce8f2554,0x65f91aaa,0xfddd6789,
  149901. 0xa324539f,0x96cd163f,0x4bace995,0x5c815f2c,0xa94f9ea5,0xd78c8c2a,
  149902. 0xef24e455,0x7ab2aff4,0x1cddc26a,0xf0ed6409,0x00ca2822,0x954a420b,
  149903. 0xd3297658,0x0611c4c5 },
  149904. { 0xa9e81829,0xf192001c,0x08a282cc,0xded33320,0x8f9ded9b,0x0bfd7de1,
  149905. 0xb7889003,0x6793ac0d,0x3577a5dd,0xbb00d91d,0x802d3c2b,0xe17a23a7,
  149906. 0xfb549014,0xff95f88c,0xc71b6e07,0x7cd1bf4b,0x23588c8b,0x2e3b24a0,
  149907. 0xa4112076,0x9b5335b8,0xc4056d30,0x2481c05e,0xe916a1b5,0x55c7410c,
  149908. 0x850179f4,0xbbe03271,0xb3cd1208,0x15e6c177,0x90cbfe50,0x509a24c0,
  149909. 0x1c108566,0x82079529 } },
  149910. /* 225 */
  149911. { { 0x1c7d353e,0x5d2d3cff,0x7de0ce3b,0xd5e7eccd,0x6ca87635,0xb4b1075f,
  149912. 0x25f9ad3e,0xda8404e0,0x205cb5ae,0x6b963e89,0x09f221a1,0x9e5ee0d8,
  149913. 0xea41aca4,0xd64c85d9,0x34442a34,0x6a46c4e9,0x3cf655a4,0xac6ff97e,
  149914. 0xe5417d7c,0x76565c1e,0xeebf9c4c,0x681009a9,0x88da6388,0x95b61d39,
  149915. 0xf6b472c6,0x6402b46a,0x0b7f1171,0x1fde5165,0xbe0c05e3,0x94f8f273,
  149916. 0xa88344a7,0x7487b036 },
  149917. { 0x9c3e2370,0xa860e575,0xf8048719,0x19d58193,0xa6e2f9aa,0x3a0dbf3c,
  149918. 0x6144719b,0xb6c7e959,0xdeffec21,0xa9049c74,0x3f50cebf,0x8ba064b2,
  149919. 0x49a1de15,0xb12822c0,0xb1d527f2,0xb654b7d9,0x0ffd0430,0xc470859d,
  149920. 0x4f05446b,0x37c74a67,0xa3add995,0xe553251b,0xe33533b5,0x4a3ed6cb,
  149921. 0x27e419ce,0x2f2f44d0,0xa5d1b979,0x2d84ee82,0xdb6fa69f,0xcc76b123,
  149922. 0x21fa3bdd,0x834f85c5 } },
  149923. /* 226 */
  149924. { { 0x2ce9b31a,0x329347c1,0xfe3fb3b7,0x1d88522a,0x52ff90fd,0x4bcefb4d,
  149925. 0x2b1a081d,0x53b17386,0x2a411f08,0x538c11ba,0x141b603a,0x7895b93c,
  149926. 0xb10bd741,0x2993b9aa,0x09912986,0xccbbd046,0xeea0aba5,0x669fafb0,
  149927. 0x35661897,0xd4844622,0x367ffa54,0x4a63b89c,0x1c3478da,0xcbad5d1d,
  149928. 0xaa6034f7,0xc5339227,0xe61b1391,0x0e6d705f,0xf74ff515,0xdd14b660,
  149929. 0x5332b54c,0x639d8b0a },
  149930. { 0x162217cd,0xfa423162,0x811c28e6,0x2e0e4a2a,0x21766dc0,0x68d9ce18,
  149931. 0x046a06ef,0x51263739,0xdde92101,0x44eea231,0x114298d3,0x0607c8f2,
  149932. 0x63d957e9,0x27f272ba,0xa5e8cae1,0xe7ce80cc,0x24f7a63f,0x5816ebe2,
  149933. 0x89673e34,0x4dece5a7,0x536babd4,0x13756a22,0xe3bf77af,0x644d61ae,
  149934. 0x2bcf98bc,0x60b2bf6e,0x29fa962c,0x3b0b59f3,0xabb50023,0xb0769a1a,
  149935. 0x0c75402c,0x40903136 } },
  149936. /* 227 */
  149937. { { 0x1670433f,0x84d2873a,0x25493dfc,0xc9394df6,0x80fcf89e,0xeb05a19a,
  149938. 0xdb297616,0xe39e4310,0xd9e63046,0x50742dc9,0x1de9ca9e,0xf31ad8c8,
  149939. 0xfb7b1d0d,0x86aabf94,0x1b3c82d1,0x36cda27a,0x39702d84,0xfb1a2ef4,
  149940. 0x46081299,0x280bfddc,0xd2396238,0xe4b2b48d,0x7b3c9353,0x2db2c2f3,
  149941. 0x12fb8a69,0xd5b5b317,0x08180474,0xf9b87a3b,0x1e952578,0xd8590986,
  149942. 0xf37a2bc8,0x80668eed },
  149943. { 0xb39a0249,0xe2edcd35,0xb2f8aeae,0xaf230cd4,0x7223df05,0x295b15e4,
  149944. 0xe0e937f4,0xbb66982a,0x8cbc9162,0x019d2b72,0xcf49dca1,0x5c512ae9,
  149945. 0x630f07b4,0x11b491a7,0xa03874e9,0x48d4f34c,0x44cb7433,0xc1fd0ea6,
  149946. 0xf95b30c3,0x13f79ae1,0xed8b60ac,0x40362d4d,0x61ead81c,0x9e8314ff,
  149947. 0x498c3d28,0xed600dd4,0xc2521702,0x5fcb1c19,0x3a9c1f33,0x592329fc,
  149948. 0x1bde6ce9,0x04677548 } },
  149949. /* 228 */
  149950. { { 0x39233c96,0xee3de56e,0x80737eaf,0x868c409c,0x201abc68,0xacae11bd,
  149951. 0x2b486205,0x0f2cea9b,0x6f19056c,0xe32387e1,0xa5dc2a41,0xea75365a,
  149952. 0x12b4be86,0x76c29acc,0x8d63294d,0xa01fcab7,0x0cab9f24,0x81dbe88b,
  149953. 0xf414c054,0x76646e5b,0xcb96b7aa,0xfe111893,0x7664e097,0xb649f5b1,
  149954. 0x53fcf5a9,0xa196422e,0x0b7ff634,0x5978c9bd,0x3c229895,0xb5feb38e,
  149955. 0x0833c456,0x038a49fb },
  149956. { 0x13e93257,0x35e3818c,0xa612741b,0x14cebc9d,0x7caac06b,0x4f6e9249,
  149957. 0x3daa1116,0x82278e33,0x4de2034a,0xe7cc565e,0x0a1ba630,0xbb7dc95f,
  149958. 0x66956fbd,0x81dd9f23,0xbb132dd6,0xc63e6319,0xfc241337,0x6e22b022,
  149959. 0x7e8beb1c,0x23848193,0xd8c938ac,0x83b1994d,0xa6bb5644,0xb54cfaca,
  149960. 0x06f91807,0x1a7cd44e,0xa8f8d9f3,0x1dd439bb,0x7f74a8e6,0x660c2a78,
  149961. 0x121b5660,0x4bb76e22 } },
  149962. /* 229 */
  149963. { { 0xe6354817,0x7a151e8a,0xf038b438,0x33d494ea,0x85958986,0x4c86c688,
  149964. 0x1dcbac12,0x72153827,0xc0edad06,0xf487af8c,0xe500e5d6,0xad33051f,
  149965. 0xd6e47f55,0x0a711b1b,0x8c746ad5,0xa68709a7,0x6402f35e,0x27f17262,
  149966. 0xfb30c130,0xc6d08efa,0xc06c7497,0x9ef1c041,0xdcc3e2da,0xd0c74ece,
  149967. 0x092e1073,0x30c5f96e,0x2aa12b74,0x0f1393cf,0x2107eb02,0x24584016,
  149968. 0x7b76f98b,0x8843d25f },
  149969. { 0xedb2a83e,0x4e1501dc,0x2bb8d724,0xbcfe8fb0,0xd925df62,0x09020659,
  149970. 0x42ab6fc3,0x3c715dcf,0xa0f09dfd,0x73c05055,0xe3590aea,0x126745d8,
  149971. 0x76ff749e,0x5382f4d8,0xa920c663,0xfc69feef,0x9fd711ca,0xde160211,
  149972. 0x9075c4d5,0x4219c3bd,0x3ded6bf2,0x3800cbd1,0x6263a116,0x8c7ea0eb,
  149973. 0x7d264c37,0x35bd7958,0x7159c98c,0x56e22e45,0xfa7373b5,0x71bf2a2d,
  149974. 0x8935c949,0x0503f939 } },
  149975. /* 230 */
  149976. { { 0x71dad4f6,0x65addc66,0x024bea1b,0x238e4889,0xf605d3dd,0xfb76c8e2,
  149977. 0xb0d96b89,0x13d5f5de,0x6601b2cb,0xe0b5ba35,0x83e3d254,0xe37d491d,
  149978. 0x240c8ea7,0xe8860423,0xe91c99ba,0x374182f3,0xa87ad919,0x26c2caf9,
  149979. 0xf574f295,0x4b13040a,0x944000a3,0x5b9bced1,0x06df42e7,0x4ccc57be,
  149980. 0x4bd1089d,0x22e8ec50,0xdddbb500,0x0c53177a,0x9ecfeadb,0x690d31d2,
  149981. 0x176668f9,0x735778fe },
  149982. { 0x843c1137,0x0f86ee3e,0x3f0b73cd,0x3c1c42fa,0x8ab20e3a,0x0e75679d,
  149983. 0x16242fae,0x6f95f1f4,0x39b092e4,0x7b88e11c,0x4c236ac0,0x1629403e,
  149984. 0x2dac02e6,0x66105f41,0x862e0632,0x74dc28a7,0xf3b23c8d,0x2118ffb2,
  149985. 0x0745ffbf,0x1182417c,0x4c05711e,0x49b55a04,0xcefbe4de,0x2c665b74,
  149986. 0x97bf7107,0x1cc4c01d,0xc54f0676,0xb2ca06da,0x7450d0f8,0xfc599daa,
  149987. 0x1a3182a1,0x52e637a6 } },
  149988. /* 231 */
  149989. { { 0x6bebc6db,0x481700f1,0xf9503d92,0x4a6b45db,0x5d153919,0xc715cd3c,
  149990. 0xe5ad2abc,0x942a1c05,0xab7b466f,0x36a82433,0xba13918b,0xba413bed,
  149991. 0x90f4e6ce,0x698a5624,0xf3f1f3ca,0xbb720da6,0x63471ab3,0x2116d41d,
  149992. 0x303d3609,0xe00d2227,0x463ba69e,0x7fd4cc00,0x62845fd1,0xac609e4d,
  149993. 0x80adc9c7,0x63603b2c,0x45fafbca,0xbf16fc9a,0xc4bc94ab,0x41007f7f,
  149994. 0xa74b1698,0x7c916b4f },
  149995. { 0x78bac2d4,0xc1026f91,0x2601a875,0x8a2e8098,0x0073d640,0xad2f276e,
  149996. 0xfcc1fb88,0x443610c4,0xca6b291f,0x5727b822,0x88ec60fc,0x0645532c,
  149997. 0xed9ad48b,0x51e48899,0xf543f103,0x841b48b5,0xd591ceeb,0xa6ccb1be,
  149998. 0x9dcf5a8b,0xfc4adf0f,0xb347ddb4,0x3a7ca020,0xcb44c521,0xaa1accc2,
  149999. 0x0527c0c4,0x773b6828,0x7023cf50,0xaa374c10,0x6b74c926,0x733d1000,
  150000. 0x77a8d07c,0x1ff3916f } },
  150001. /* 232 */
  150002. { { 0xf997939d,0xaa218fe4,0x791583b3,0x3d4dfbbb,0x87f7560b,0xb3a7b5da,
  150003. 0x5da92c98,0xa9c02801,0x46666f4a,0xe1eb4aad,0x14ce9dd7,0x2eb17a51,
  150004. 0xef8f3076,0xf46a66a4,0x810e546e,0x900b45c6,0x4baf04dd,0xf7af2258,
  150005. 0x5c84d42f,0x3cc1c872,0x8e4c83de,0x3093f225,0x170d88b2,0x62fade41,
  150006. 0xac076e44,0xe19612e4,0x32dd141b,0xf48d7346,0x925e34da,0xc1b1f759,
  150007. 0x072b90c9,0x19ed1a56 },
  150008. { 0x6c735473,0x9cf7fcde,0x6003bc3e,0xaab88e67,0xfb199bb8,0x12187cbc,
  150009. 0x9accccbd,0xbb730441,0xb0f65459,0x214aff3c,0x6f926282,0x6aec81a3,
  150010. 0x9f9d20b8,0xaa82cb32,0x5773cc90,0x82f3f90f,0xf62257e1,0x4af60e6b,
  150011. 0xbd4762df,0xf18b44bf,0xdb970753,0x3948b129,0x7c22c18e,0xc6e920e9,
  150012. 0x57be97ad,0x393d6208,0x46b637f9,0xe8d7382c,0xf1fed1d5,0xf6625ccb,
  150013. 0x68681599,0x6f31e0f9 } },
  150014. /* 233 */
  150015. { { 0x82b8f204,0xc45afe55,0xd358b54a,0xac0441b6,0xacd5f5ed,0x7213e7bf,
  150016. 0x139bcd93,0x1914c70b,0x96dbcbb0,0x714b4581,0x1ed35d21,0xe9297d35,
  150017. 0x6a3e1f20,0x8f640837,0x2f3cd705,0x150a8a9d,0xdcdd9f6d,0xfb36e801,
  150018. 0x5cf56d82,0x5a54eb65,0x92aa5a21,0x7610500c,0x3b089f03,0xd10d0ae2,
  150019. 0xc42b66e8,0x491b2079,0x0eee8d48,0x4af1ae3d,0x41556f45,0x137e4c28,
  150020. 0x63d8a7e6,0x875e3308 },
  150021. { 0xaf6c0acc,0xdc80fddc,0xbb1e7c08,0xd5ad1e66,0x828585ad,0xdc717ae1,
  150022. 0x275c7da6,0xbdc54340,0xd26b9e15,0xf4b4c852,0x6a05fa50,0x5f0a1fbf,
  150023. 0x817bcb32,0xc6f81e47,0x70ff2e1d,0x2cbd4328,0x67c7f7fc,0x8a249016,
  150024. 0xb585a6c4,0xd045acb7,0x4666c057,0x2e972ad4,0xe6d7d63d,0xc74d87cf,
  150025. 0x0e274144,0xf7067d87,0x8b2584ae,0xb2ca157a,0x75f0fdeb,0x495c5bfb,
  150026. 0xf386e009,0x5abb0581 } },
  150027. /* 234 */
  150028. { { 0xf0c97f57,0x8be62d2b,0x962f28c7,0x0fe04871,0x47b50abb,0xc548a467,
  150029. 0x44fa09ed,0xf6b26e03,0xab05a96e,0xfd44c6e3,0x70e6ae82,0xedb0032c,
  150030. 0xd7e4899d,0x28bd402b,0x9b7c11c2,0x43f2e963,0xce913716,0x0ec3fc0e,
  150031. 0x02fd0f8c,0x769b8bc9,0x7cabc3ac,0x9d9cb3aa,0x06924cc9,0xe88a8892,
  150032. 0x42609014,0xa51461aa,0x962e79e0,0xc7f4aa8b,0x8b1b3e80,0x4ef0210a,
  150033. 0x1bfee4bc,0x70544680 },
  150034. { 0x121901c1,0xfab3d713,0xfead54aa,0xe90a2627,0xbc08ba23,0x64f6d285,
  150035. 0x36ec227e,0x8d993015,0x06c191ab,0x99a16ab9,0xf649ce2c,0x86b1cf5b,
  150036. 0x66be3a80,0x59206759,0xccba2cf0,0x18836279,0xeff53486,0x2c157b87,
  150037. 0x4b223af2,0xbfac9896,0x0aae7a57,0xcd0fd4f0,0x63218a80,0xdaddb940,
  150038. 0xdf88f14e,0x3844bb79,0xb71ed9fd,0xc1b3e3d4,0xd6205036,0x6c634a13,
  150039. 0xb8680a6b,0x6f56aecf } },
  150040. /* 235 */
  150041. { { 0xd9205c5d,0xb01dc803,0x67123929,0x68955f7d,0x9d9b6565,0x3debbffd,
  150042. 0xd3b1acfe,0xb844395e,0x6094eeff,0x04328b21,0x22991feb,0x6631ffa8,
  150043. 0x190dd075,0x0dde66e6,0xe8577c05,0x75b03c55,0x91722407,0x6c91ce5f,
  150044. 0x8ebb3a3f,0x9a288a40,0x058a1396,0x1d376f8a,0x9a6e0676,0xf3a59457,
  150045. 0x7b71d288,0x103029c5,0xb44c30c0,0x0843f428,0x730e0b9c,0xd8e6aff8,
  150046. 0x4ed644ad,0x7b6be811 },
  150047. { 0x3d3aa54e,0x3ec38e4a,0xd83d509a,0x10233943,0x243955e2,0xf84aa621,
  150048. 0xf51d3d44,0x29104717,0x7eca4e37,0x62d2442c,0x85fa55de,0x8c5a523d,
  150049. 0x851da1b5,0xc6f5ccda,0x20001468,0x044bcaa8,0xe01702e0,0xf7501e68,
  150050. 0xe6a0acec,0xf0819359,0xac0ef0b2,0x33dda6ad,0xfd964f01,0x97aeedc8,
  150051. 0x530b90d8,0x48dacd0e,0xb84122eb,0x4c5fad6f,0xd700a1de,0x2284ec1e,
  150052. 0xdbca5474,0x86f9a835 } },
  150053. /* 236 */
  150054. { { 0x450cc69f,0x0e1d9055,0xc9edf98f,0x50eb14bc,0xee7eba01,0x1bb94e77,
  150055. 0x998f8e53,0x5f7a6737,0x1b16eef0,0x588384e3,0xd85c5e15,0xbb928723,
  150056. 0xcbd952aa,0xfe51e345,0x7e241674,0xc5d0ee28,0x100182f0,0xfdc146ef,
  150057. 0xe7f5be2c,0x0f739e92,0xb656bd3e,0x501ab3af,0x5168e289,0xb1552dde,
  150058. 0xb8ee104a,0x940dfe31,0xc4304475,0x42923603,0xc460a913,0x9306f114,
  150059. 0x03b51f86,0x5bfa9faf },
  150060. { 0x107b258e,0x2a23f52c,0xd66341dc,0x989e82bb,0x823cff1a,0x54a3ced8,
  150061. 0x719b491f,0xf45b7794,0x2433dfb8,0x898c2218,0xc49250ee,0x0f9dd91c,
  150062. 0x4fa17655,0x50c2a2ae,0x2c327f45,0xf7aa1ce4,0x583b1e41,0x13a15ad6,
  150063. 0xa1bfad9e,0x9aa0d5a5,0x8e1fbdcd,0x9b1caa28,0x915f7f87,0xaf9283b6,
  150064. 0x87e81a1e,0xc10e4e0c,0x1080d296,0x04fdca56,0x12755bd8,0x6acc9616,
  150065. 0x828feeda,0x1b1266aa } },
  150066. /* 237 */
  150067. { { 0x774ee49c,0x4ebc0a00,0xcb6237d7,0x776f6852,0x5df938a3,0xfc0544ac,
  150068. 0xb6fbfbbd,0xc3388ec8,0x745f2eae,0x84ac8bcd,0xb1ece937,0xa9c56609,
  150069. 0x7de8fa13,0x656fb6ac,0xa532b871,0x5f8ded74,0xaa889f09,0xab0d428b,
  150070. 0x10b7aec2,0x43b27f28,0xfeecb34c,0x26426e1e,0x9e89c2db,0x44431b6b,
  150071. 0x39211090,0xaac4bc5d,0x4fd81058,0x926f7368,0x471ef60e,0x452fa691,
  150072. 0x218d7a23,0x33517fdb },
  150073. { 0x593c4a36,0xa9c33f46,0x36b1a9ee,0xac69d718,0x4277beec,0x55a20c1d,
  150074. 0x7e4f179c,0x3e8ca24e,0xd46d88a2,0x57373369,0x730702f8,0x71ceb1cc,
  150075. 0x35eed574,0x8b184d97,0x0704cec2,0x7f4517a2,0xd7062a53,0x7f129d18,
  150076. 0xb1d77e1c,0x07a4571b,0x8350d8b2,0x774ac309,0x61fab8ef,0x27b2919f,
  150077. 0xb5dd801b,0xa7c4cc13,0x1434591f,0xe7e6255b,0x5a3592b3,0x349937b8,
  150078. 0x30c77549,0x31fac63d } },
  150079. /* 238 */
  150080. { { 0x04913fb6,0x2ee8cf1b,0x1769a6b3,0x7e401350,0x783e61f0,0x790ebb71,
  150081. 0xe27f2ffe,0x1e5107f9,0xedaf89bf,0x124ba67f,0xe58de68d,0x189200e1,
  150082. 0x6df5abee,0x962732a3,0xacbeb4aa,0x72cc37cf,0xe93c5a76,0xb0c5fa96,
  150083. 0xde63393b,0x4c2a317c,0x830b2d6c,0x97f65e67,0x1be5b96a,0x4afc3504,
  150084. 0x730ce66d,0x0bf40a60,0x9340d84f,0x96a1ba79,0x07626b08,0x3ee18254,
  150085. 0x7ab0cbf5,0x01db35db },
  150086. { 0xac0efee2,0x6e0fbc2d,0xd71dbb45,0x8406ebcd,0x19b69abe,0xe72bde3e,
  150087. 0x37e01822,0x49cb7e61,0x11458b4c,0xcbb8c01c,0x687c5d63,0x420b4847,
  150088. 0x454c6776,0x1847dfa1,0xd1839d18,0xbede911d,0x278df046,0x1b9dc9c9,
  150089. 0x881a336c,0x294bd62b,0x93e77adc,0x7f096879,0x43ce3ba7,0x7ac90665,
  150090. 0x7764eefc,0x148695fd,0x9ac465cf,0xe0c20f0b,0xa6e2cdb1,0x636e8d28,
  150091. 0xd755341d,0x7b6ba98c } },
  150092. /* 239 */
  150093. { { 0xc1881ab4,0xcb1d9e03,0xb3168c88,0x19c25d55,0x282364ce,0xa82d3d47,
  150094. 0xf161aa24,0x95994390,0xe1ebb2c9,0x7838bc00,0xbdec7a75,0x8fd5dfcc,
  150095. 0x4ff7220a,0x4dd203c2,0x0efeff48,0x5ec173b3,0x16428b35,0x99f1d2b3,
  150096. 0x056e813f,0xc06bd9e5,0xc0b319f1,0x929172ba,0xfd223b15,0x6ae0e384,
  150097. 0x98d091ed,0xbd01059e,0xa654648e,0x6b3168e4,0x3375e798,0x2211447f,
  150098. 0x71eb4508,0x47e81019 },
  150099. { 0xbc8c290d,0x7045d45a,0x810fb33a,0xa33d1355,0x46fbbf2f,0x2baf0092,
  150100. 0x385c7cd9,0xacff3f1b,0xe161985c,0xc5b150ec,0x2a888748,0xc6ee0a7f,
  150101. 0x5e88dcc8,0x9d888c8e,0xccb86443,0x4dd735f2,0x3c40f6f2,0xcc1e13b7,
  150102. 0xf3fed691,0xfc3a25ff,0x257ee5c7,0x4cb43b17,0xf32db135,0xaa654f93,
  150103. 0x02dff2d3,0x44f58d0a,0xa8ca6394,0x78e3f188,0xf3e86697,0x39646cce,
  150104. 0xe0dce87b,0x785b1902 } },
  150105. /* 240 */
  150106. { { 0xa92f9a20,0xfcce2361,0x9d64540e,0xb7bdca87,0x1d00d7c5,0xd4739a85,
  150107. 0x2e97c926,0x067ac8dc,0x78da6a8b,0x2aea3ffe,0x63c51b69,0x6828bf54,
  150108. 0x7155141a,0x76f1c479,0x3977d810,0xf4bcbef6,0x541bce7a,0x75bc4949,
  150109. 0xd17041a5,0xe01f4066,0x87755eaf,0xd282d5bd,0x59e7ae80,0x6e2107dd,
  150110. 0x382ab36f,0xaa56e166,0xb9d1d634,0x65ee8ef6,0xce4ed844,0x99a2160a,
  150111. 0xb7712c27,0x6557c367 },
  150112. { 0xd75b6e52,0x561b0268,0x118d0e89,0xb0813640,0x6a2eb1ae,0xcff53330,
  150113. 0x6d090894,0x4e462226,0xb5fc1d48,0xbb351227,0x57a3062d,0x9365ea07,
  150114. 0xd66e2dc5,0x4caca37b,0xb9095887,0x220d7d23,0x8c4473bf,0x9c0fd393,
  150115. 0x6787da4f,0xadff370a,0xd057f4b8,0xef0aebcc,0x1173f33a,0x205e744c,
  150116. 0x925a26b4,0xb8d1f0a5,0x722fbbfd,0xa9364f49,0x8227d284,0xc891ae77,
  150117. 0xa0e08ab4,0x15c40d04 } },
  150118. /* 241 */
  150119. { { 0x2a0e18d1,0x9baf169a,0x4c0327c2,0x9971c017,0x7bc262ce,0xd81a323f,
  150120. 0x818ff379,0x2099db8d,0x4cd3c330,0x663f663d,0x011a0553,0xef5325c3,
  150121. 0xf980a470,0x9cd70bdc,0x1c9ed070,0xe64452d1,0xac676e13,0xafbf43f4,
  150122. 0xae85c2a5,0x97bec0a6,0x470490c4,0x2faae550,0x491e6ba9,0x0ab97a87,
  150123. 0xaafa9914,0x4055f537,0x36726557,0xfc95adbb,0xd119d6bf,0x646343b9,
  150124. 0x9d341e37,0x788e94a0 },
  150125. { 0x9c53461a,0x053a6fe5,0x08e3b6ed,0x75ec897e,0x0768d939,0xa8f5d2f3,
  150126. 0xcc213d4f,0x9bd6bff6,0x05b0147c,0x590c7b41,0x7c7b8169,0x20a3628b,
  150127. 0x5bce78e9,0xc66a086e,0x4dec1d8f,0x3dd4d282,0xc19dcce9,0x890acf44,
  150128. 0xd8435a7e,0x6632d875,0xea6381b2,0x590167c1,0xf0dcc128,0xb2259797,
  150129. 0x46f8d463,0x91a612b4,0xc15efa39,0x42185d78,0x119f6788,0xdf55ec37,
  150130. 0x780dea93,0x91b19cc6 } },
  150131. /* 242 */
  150132. { { 0xcb5d8b80,0xebf2709d,0xfc35660e,0x03b96182,0x055ef969,0xb873d991,
  150133. 0xe47c4342,0xd1ea4b4d,0xd54f8867,0xcc4b9244,0xfd8d77ef,0x93b1a2ca,
  150134. 0xe8c1f563,0x068d24e7,0x49973056,0x5f5fabb6,0x0542374f,0x83248c50,
  150135. 0x3f38e913,0xc36de2b5,0x7bb680be,0xed07e8eb,0xd8f313b5,0x964813d7,
  150136. 0xafd2d392,0x7bb6a069,0x0848a31a,0xc06d848e,0xe4f0c325,0x6867fb2f,
  150137. 0x067343af,0x3c2ba834 },
  150138. { 0x9d3ad63b,0xab62d775,0x59e0eb1f,0x3f9cab97,0x3885e117,0x70332a63,
  150139. 0xe20b2f9e,0xf22cafce,0x49eca947,0xb529ba7e,0x6228d88d,0x24954216,
  150140. 0x39239561,0x80ea23ec,0xd4370644,0x1b8907e7,0x563e4e44,0x4b7fa455,
  150141. 0xb2a4b0fa,0xcca9829e,0x48060792,0xd0a720a4,0x246991ce,0x8ccdda0c,
  150142. 0x348d086b,0x37a2325b,0xf60aee13,0x566ed509,0x147f253f,0x3d30e091,
  150143. 0xc1073bd8,0x1fa627a5 } },
  150144. /* 243 */
  150145. { { 0x42478fd4,0xa11222a2,0x670b2000,0xacf4c6f1,0x8359c6de,0xf71bb04f,
  150146. 0x7b93cdbc,0x618e2829,0x230db60b,0x96e1bae3,0x965b3b29,0xf17fd3b4,
  150147. 0xbc7055dd,0xa58639c6,0x4b817d7f,0xc3ea92ed,0xd23b08a4,0x9082b2a6,
  150148. 0xdc17010e,0x8471228a,0x20e89d97,0x753b9e46,0x03ff77c9,0xcf7e4f97,
  150149. 0x2bbe60e5,0x6c3f8245,0xb80e017d,0x9e432cbc,0xc0a45edb,0x150a5acd,
  150150. 0x4798743e,0x67b8bd05 },
  150151. { 0xf4797cf7,0xe66079b4,0xd03fde02,0xe31c998a,0x54caaef1,0x5aa3763a,
  150152. 0xf7649711,0x64d9a1fe,0xaf29b1a7,0x7ce0dc73,0xfb66ca93,0x6661b083,
  150153. 0x32fb6a78,0xbf4d74fe,0xdf00a561,0x25f6ef09,0x831d1159,0x2bc4383f,
  150154. 0x536bde37,0x6d5cc10c,0x882cc65b,0xd4945f9f,0x451a99b8,0x81f48f13,
  150155. 0x6bac11a4,0x140161cd,0xf18a4a0a,0x9d94d4ed,0xa467a824,0x65363165,
  150156. 0xa4c9aedf,0x74297aa9 } },
  150157. /* 244 */
  150158. { { 0xe21124ba,0xc49758a4,0xa87ffbd2,0x99bd8198,0x3d6638a8,0x45fbcdd1,
  150159. 0x15f7bf76,0x94645ff8,0xc4e6d57e,0x5fa6736f,0x92e61db9,0x1eae6475,
  150160. 0xcbdf944a,0x79575c0c,0x25b31d74,0xa3d13047,0x4cab5ae6,0x7881df22,
  150161. 0x1a2887f2,0x8dbfd299,0xa26ac459,0x23d07590,0xd8661d4a,0x2e589852,
  150162. 0x8a0140f7,0x37b5c13b,0x3fb3782a,0x0f94199e,0x1bc14e90,0x722aa059,
  150163. 0xd55bbb12,0x89aab7ba },
  150164. { 0xd656bdc7,0x8b345a96,0xe176cd3b,0x43bdc8af,0x32d64c43,0xd69518b6,
  150165. 0x79b82b41,0xfcf364a7,0xffb0cf82,0x907b344e,0x5101287b,0xf3d0c83c,
  150166. 0x34cd90ef,0xe9f26a59,0x07082b5c,0xe5f5aaf2,0xece7c165,0x4eb72c75,
  150167. 0xbe986cd6,0xe9590a81,0xff1536aa,0xfeef498f,0xa8263d5e,0x04560243,
  150168. 0x54ae872b,0x940be14f,0xe3207686,0xbee7bcc9,0xc1bc4d7a,0xd496a27d,
  150169. 0x5940ab46,0x002dc297 } },
  150170. /* 245 */
  150171. { { 0xb69d60c3,0xee533937,0xfe972755,0x260be552,0xc0c725a6,0xb11fb78d,
  150172. 0xcab2e7c2,0x6982c27e,0xee2322cb,0x4bceedd9,0x122704f7,0x952b19ed,
  150173. 0x854a6165,0x2df4c285,0x7b192485,0xba40b5bf,0x0119f52a,0xfcbca950,
  150174. 0xe5add86f,0x7467d1cb,0xd9d0f2c1,0x9bf536fb,0xb8d4ebc9,0x3c296e34,
  150175. 0x05a81317,0x0495f8f4,0x73335f76,0x8c59e8d6,0xe0542122,0x0b53d324,
  150176. 0x3c3bda73,0x4d564535 },
  150177. { 0x7e5c0877,0x7322f800,0x0ca9a764,0x481b43e6,0xa2c12716,0x231f4f4b,
  150178. 0xed3136c2,0x09596857,0x38db30de,0xae826322,0x99908ebc,0x652fad40,
  150179. 0xaf0d231e,0x0b8d1814,0x09cbc349,0x2680c54b,0x4bf3bf8e,0xfd4562f3,
  150180. 0x092b595f,0x2985090b,0x5e15fc34,0xe6f39ca4,0xbc378168,0x70175191,
  150181. 0x845a4a87,0x906944b3,0x82a1541a,0xacc6d74a,0xb155c8b4,0xadc9bab3,
  150182. 0x77306c62,0x1f2f89ce } },
  150183. /* 246 */
  150184. { { 0x9affefdf,0x8253ef41,0x4cf9256b,0x05d7ece5,0xb444e483,0x377002f2,
  150185. 0xcba5471f,0xb189755f,0xd5cbe015,0xc88483cb,0x6a0b8429,0x254f7c69,
  150186. 0x61f3f61d,0x18850bd4,0x0a247157,0x7ba21089,0xd92eeb0d,0x35abbc2e,
  150187. 0x965dec89,0xfb56cabe,0xbc55684a,0x9da23724,0x6a7a7492,0xd8ba396f,
  150188. 0x2ef4ba46,0xfcb90db7,0x9909b27a,0xdd234fe0,0x76f4366e,0xbdf3c164,
  150189. 0x17e50d47,0x09c8097f },
  150190. { 0x60050c07,0x6a04b140,0x43a8e37e,0xc29e8318,0xbb55e41f,0xcb9429b2,
  150191. 0x2ce60e3a,0xed2fea5a,0xdb9d82f4,0xdc7b1ff3,0x687d37fa,0x48ebecc3,
  150192. 0xecb07539,0x79153e32,0x57075692,0x6a60054f,0x800759ba,0x3871cd0c,
  150193. 0x30922df1,0x17a7386f,0x83357b7c,0x4e9fc59e,0x39415186,0x1d26b3a9,
  150194. 0xd34db889,0x912a0222,0x59fcdb71,0x6672fcf4,0x44ff3036,0x5a3f268d,
  150195. 0x6911e16c,0x6f113ed3 } },
  150196. /* 247 */
  150197. { { 0x1836f1c9,0x52a9df59,0x4232307d,0xfa6519f5,0x5ded285a,0x8406c701,
  150198. 0xaf627f75,0x0a1545ca,0xace0417d,0xae1111ee,0xa6113443,0xfb28bdf6,
  150199. 0x52dbcbcb,0xde9ef0ab,0x7813e658,0xe9dc181b,0x99127225,0x0b1dabdb,
  150200. 0x22814c59,0x5f0598e3,0xd934ee7e,0x5c3b966e,0xb99ba4bf,0x4eb84eda,
  150201. 0x3c1b55e7,0xb2919a34,0x94aa860f,0xa9addb49,0xf6811ff6,0x1b7220df,
  150202. 0xd1a183e2,0x6636a23b },
  150203. { 0x20587283,0xdf5d5a2d,0xef07fc5d,0x0b3822c9,0x0ef6de38,0x1786bd55,
  150204. 0x25d1671d,0x163cf907,0x1cdb1def,0x74bf971f,0x0842fc4a,0x5749e830,
  150205. 0x27f854f7,0x0e2edbc7,0xbce24acb,0xbb27bbda,0x05bed08d,0xc1b19cec,
  150206. 0xf7c904bc,0xaada123e,0xd89982db,0x02429f1b,0x65f6e632,0x49d3616e,
  150207. 0xee59fd32,0xa3789fa8,0xfe9f29f5,0x160ba3ba,0xaf5378a0,0x0f2d3b61,
  150208. 0x73c2a6f8,0x7aeecc76 } },
  150209. /* 248 */
  150210. { { 0xdc43b0db,0xf3a4757c,0x98119cad,0x3d8a4e85,0x4616c156,0xf8095bf6,
  150211. 0x4f533e97,0x3e2a07bc,0x39cfc5ad,0xa9824367,0xcd68052c,0x18a6ba3a,
  150212. 0x8a1cec66,0xbd60e590,0x02b1b695,0xae3841a5,0x190a195b,0x986dff12,
  150213. 0xad31fd9b,0x2df2beac,0xcc728f7b,0x7d893224,0x0cf0a992,0xc38ea738,
  150214. 0x586a44ea,0xa8439a80,0x1615f03c,0xede7f7f0,0x27a1f885,0x48249908,
  150215. 0xb78a7645,0x28ec4006 },
  150216. { 0xa2fe0009,0xe1820c2e,0xf13874e9,0xe11ba5d2,0xc524db52,0x97522454,
  150217. 0x7fede529,0x4d477426,0x9b2500d4,0x01d3419a,0x1869244b,0xce08a492,
  150218. 0xdd1be1b9,0xba169023,0x32a301e0,0x242c3e54,0x70906788,0x9b56f7ba,
  150219. 0xc74a8cc4,0xf0ad2a09,0xd76f9439,0x99cd1841,0x621fb60e,0xeddafe0b,
  150220. 0xbc397634,0x056bee54,0xff7f0a84,0x4653f860,0x2011c0af,0x6bd4876f,
  150221. 0x0c9525c3,0x134f4cc7 } },
  150222. /* 249 */
  150223. { { 0xe938dff4,0x9621a3ec,0x486a79a3,0x7d101a7b,0xde950537,0xf2c4ef97,
  150224. 0xe65d87db,0xf3184099,0x373b8cfa,0xb89c7ffb,0xe842916e,0x68baa505,
  150225. 0x4ebea764,0xa790fd09,0xe592892b,0x679df6d4,0xfcfed741,0x2023331c,
  150226. 0x9880ff21,0x0bf4efd2,0xd0344501,0x7ca78ddd,0x342858c8,0x2cb09ecb,
  150227. 0x2575487a,0x9e5eb6dc,0xebcb0491,0x50675a15,0x7381d471,0x09d2e74f,
  150228. 0x83d3d6f4,0x6ea37829 },
  150229. { 0x4e5cc40a,0xc65c094b,0x1af37dfb,0x7a2e3f6a,0xf9026e44,0xef677e9d,
  150230. 0x93880f53,0xb7878c95,0x7f644aa9,0x4aa30b07,0x2f208c3c,0xa0c51683,
  150231. 0x658d663b,0x7c0277ae,0xae1d9130,0xef0b3c38,0x695c3ea4,0x302f37a7,
  150232. 0x6a0c5e0d,0xe004c1c5,0x20cbcf9f,0x9fd495c4,0x568a0e7c,0x706d5b9d,
  150233. 0x59286454,0x8b225dff,0x8d9a709c,0x527d4465,0x87c08d68,0x47c558da,
  150234. 0xbb4ef07d,0x606ee6e6 } },
  150235. /* 250 */
  150236. { { 0x57c621f6,0x02d99fc7,0x7fe83d48,0x292e40c1,0x9ef199b0,0x1bdfc7a1,
  150237. 0xe62c7666,0x78a04102,0xe6738753,0x16cda370,0x1e3a65af,0xbc81974d,
  150238. 0xf78fe209,0x19742048,0xbf5981c6,0xc83a058a,0x9c89702d,0xf26b2434,
  150239. 0x9d1a678a,0x988b2f1e,0xff29ae29,0x472bf9b0,0x1d7cf5ec,0xa143e398,
  150240. 0xb268ddd8,0x9c9d7e45,0x5fc4ff76,0x166cda55,0xa4aa7673,0x6044cdf0,
  150241. 0xe9148707,0x49dba6f7 },
  150242. { 0xa758e37a,0x20e47fb2,0x2d8eaf66,0xaf6b31d7,0x6f9c2210,0x352ad5f9,
  150243. 0x90efc32b,0x0093f727,0x41e4b264,0x435c99dc,0x05b15795,0xbfa878e0,
  150244. 0x0e673575,0x99c520a4,0x87eea759,0xca682594,0xf12a348b,0x029f7b81,
  150245. 0x2aa2ce35,0xa547cc18,0xead5e2c5,0xa11d874b,0x55682cdf,0x9af0349b,
  150246. 0x8bbe8e66,0xf86ebfea,0xf55394ab,0x3dab8782,0xebc8eb8f,0x458bf797,
  150247. 0x9b7de78c,0x4890a7a4 } },
  150248. /* 251 */
  150249. { { 0x8da995f6,0xd7299689,0xec6156ef,0xd39eaae7,0x356a82d5,0x6959040c,
  150250. 0xc135bcfe,0xb2046b21,0x0f595c78,0xea720b64,0xe7c5fb40,0x02824efa,
  150251. 0x0edb3bfc,0x97d8fd4c,0x79f24ebe,0x12f02905,0x187ea6b9,0x16fc47cf,
  150252. 0x789d5c23,0xc219fd27,0x89263ecc,0x233a6b6c,0x8b6d30a6,0x823634b2,
  150253. 0xc9b33680,0xca352e25,0x40c77456,0x9388d6ca,0x3c92065b,0xf8e55b0b,
  150254. 0x02439a76,0x5c17474b },
  150255. { 0x8aaccab5,0xd888e7c2,0xaaced05b,0x18027836,0xccec0f65,0x185b877d,
  150256. 0x125c2882,0x93cadc1c,0x67fdc54c,0x45df540a,0xc2788a33,0x4f3c86e2,
  150257. 0xe3a0fa2c,0x3e874469,0x273983cf,0xc59daa47,0x4a96d8a5,0x3063c48b,
  150258. 0xc2e58915,0xc38d2bcf,0x84e428c3,0x90e78b87,0xf0c4fd53,0x900a292c,
  150259. 0x941e6005,0xb7f92db7,0x6ca53a1c,0x95679241,0xb1ab0fa7,0x35f6f31d,
  150260. 0x7b58408c,0x5d675eb4 } },
  150261. /* 252 */
  150262. { { 0x870c6025,0xaeee1a77,0x91a2dfca,0xfc4a23b7,0x386b64c4,0x7b0e60c4,
  150263. 0xe5ae72b1,0xd5d5b17d,0x9eefa212,0x6dfc88ac,0xd4038b96,0x4feaefbe,
  150264. 0x8e2d2ecc,0x099ac356,0x012af207,0x548ea612,0x89c31218,0x4ffed9db,
  150265. 0xe0e67331,0x1c1e91c4,0xaf8300e0,0x009bb64f,0x6773c3be,0x8780501c,
  150266. 0xc08219fa,0xe0cd6ede,0xf81b06ff,0x7c055e07,0xe080b36f,0x82b63f9c,
  150267. 0x0a9feca3,0x02fccbaf },
  150268. { 0xb47cac61,0x9991d4d1,0xab86e12c,0x2e9d1687,0x2b94f042,0x8c6855ec,
  150269. 0x48e648e5,0xca400519,0xef89ac57,0x9ba91fb2,0x1be792cd,0x4f419206,
  150270. 0xbd0f1e15,0x82d221cb,0xfc444019,0x062eb13b,0x99790fdc,0xf3a97c32,
  150271. 0x6067a64b,0x4e796d94,0x6d23775a,0xc46dd300,0xed7f0f23,0x8672c4d5,
  150272. 0x3b4f63d7,0x821851dc,0xd26273f2,0x50a3ae0c,0xeac60f6f,0x800e58fc,
  150273. 0x13845545,0x56f1e456 } },
  150274. /* 253 */
  150275. { { 0x32c24f3b,0x01ccb3f6,0x06d817e6,0x99eb1c7f,0x6aa26776,0x8dc640bb,
  150276. 0x0845d5e0,0x7838affe,0xf81a79a8,0xf34fecb1,0x3e6819b0,0x6a2e282d,
  150277. 0x8237a4b8,0xc4b977ce,0x87636439,0x0f46b3db,0x97970497,0xa465f540,
  150278. 0x8791be43,0xd7e08762,0x34198ec6,0x00220b6c,0x093d94bb,0x57b38637,
  150279. 0x29d690b2,0x84012e16,0x20aad1a4,0x02ec9db5,0x85dc34e3,0xafee2fc6,
  150280. 0x25500cf8,0x911d1936 },
  150281. { 0xf5e5af5b,0x13b1bd58,0x7b6a22a7,0xa7ca263b,0xf3af2adc,0xab6bec4d,
  150282. 0xa04420bd,0x16651e59,0x4ba36c11,0x3b448b3b,0xff424310,0x3c62bfcd,
  150283. 0xf1a96cbb,0xde15c4a5,0xe4d1f980,0xbe0ad8a1,0x36673a3a,0x812bd14e,
  150284. 0x9212acdd,0x40303af6,0x576095ce,0x8f6dab9c,0x107f5ca5,0x7df1882a,
  150285. 0x8896a3b0,0xb903e63c,0xd863b3f0,0xf5048544,0xc09887de,0x5e5019b9,
  150286. 0xa0f53865,0x2be744fe } },
  150287. /* 254 */
  150288. { { 0x5b50f324,0x054cd05f,0x1ea3c7a2,0xb9b1eb24,0x7ff8e6b7,0x4a858a5c,
  150289. 0xec040882,0xd83902fe,0xd0cba9bd,0x72b26494,0xb29c9e1e,0xd0176f90,
  150290. 0xcebadb81,0x05d4eb02,0x372b8bfc,0x874405b1,0x79ead190,0x5c412881,
  150291. 0xec2b48cd,0xd44a3dd3,0x3f4d5033,0x84499a77,0x564c3a09,0xb37b38cd,
  150292. 0xf42e803b,0x80e99497,0xb8f518b2,0xc07b47a0,0x3568fde4,0xc710e3c5,
  150293. 0xcead0e7a,0x735f542f },
  150294. { 0x38380039,0xcaa9a171,0xf74d19c8,0xadfafe17,0xccbc1a8b,0x92d4393e,
  150295. 0xfe029705,0x3c5dbf39,0x930e9b36,0x4552b5ab,0x2afd494a,0x7ee63032,
  150296. 0x3f02ac43,0x826a9ad7,0x99356298,0x98c53562,0x7342bb39,0x0c869f87,
  150297. 0xe4f9b79a,0xd7510020,0xd34789a9,0x6361d1a4,0xcfa85637,0xf0ded5ba,
  150298. 0x88ac07e4,0x407ee73f,0x09ef1cbd,0xfac7d03f,0x4d475bad,0x25d697cb,
  150299. 0x14bd399e,0x1e984c9d } },
  150300. /* 255 */
  150301. { { 0x4850c817,0xc76d0561,0x3489812d,0xb08a5b19,0x5e58cbbe,0x7273d154,
  150302. 0x4be61e5a,0x8900b5fa,0xd7aeb8e1,0xaa088691,0xd35a3d4b,0xe66666af,
  150303. 0x57ec7d3d,0x38a2c199,0x668d6f5c,0xa0648e8f,0x7adc1746,0x1f9fc92c,
  150304. 0x843065c3,0x23a116c0,0x61e6ae69,0x36370a20,0x2aa47e73,0x626c3736,
  150305. 0xdeff6d84,0x540c25f2,0xcdbed2d4,0x9804824c,0x039a9492,0x4b5bfce0,
  150306. 0x76942e01,0x6c474a56 },
  150307. { 0x7d88e3a1,0x3aeb9a41,0xc484742a,0x105d3c88,0x3fe61131,0xe59de8d1,
  150308. 0x1a869e8b,0x148f5b6b,0xaa75d90a,0x7a8abc59,0x62146013,0x2f0c9bc7,
  150309. 0xc3824cd9,0x43faa747,0x6a5d0b92,0x81763a18,0x9bcbaebc,0xbbc341bc,
  150310. 0xf745d1dd,0xe1813160,0xb75ce5f4,0xa53ce52d,0xd50de4c2,0x15eae66c,
  150311. 0x75d7656d,0x5ed8996c,0xc4ca552a,0xe4ff5711,0x3c5305b4,0x215e985a,
  150312. 0xfa1ba2ce,0x6b258954 } },
  150313. };
  150314. /* Multiply the base point of P1024 by the scalar and return the result.
  150315. * If map is true then convert result to affine coordinates.
  150316. *
  150317. * Stripe implementation.
  150318. * Pre-generated: 2^0, 2^128, ...
  150319. * Pre-generated: products of all combinations of above.
  150320. * 8 doubles and adds (with qz=1)
  150321. *
  150322. * r Resulting point.
  150323. * k Scalar to multiply by.
  150324. * map Indicates whether to convert result to affine.
  150325. * ct Constant time required.
  150326. * heap Heap to use for allocation.
  150327. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  150328. */
  150329. static int sp_1024_ecc_mulmod_base_32(sp_point_1024* r, const sp_digit* k,
  150330. int map, int ct, void* heap)
  150331. {
  150332. return sp_1024_ecc_mulmod_stripe_32(r, &p1024_base, p1024_table,
  150333. k, map, ct, heap);
  150334. }
  150335. #endif
  150336. /* Multiply the base point of P1024 by the scalar and return the result.
  150337. * If map is true then convert result to affine coordinates.
  150338. *
  150339. * km Scalar to multiply by.
  150340. * r Resulting point.
  150341. * map Indicates whether to convert result to affine.
  150342. * heap Heap to use for allocation.
  150343. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  150344. */
  150345. int sp_ecc_mulmod_base_1024(const mp_int* km, ecc_point* r, int map, void* heap)
  150346. {
  150347. #ifdef WOLFSSL_SP_SMALL_STACK
  150348. sp_point_1024* point = NULL;
  150349. sp_digit* k = NULL;
  150350. #else
  150351. sp_point_1024 point[1];
  150352. sp_digit k[32];
  150353. #endif
  150354. int err = MP_OKAY;
  150355. #ifdef WOLFSSL_SP_SMALL_STACK
  150356. point = (sp_point_1024*)XMALLOC(sizeof(sp_point_1024), heap,
  150357. DYNAMIC_TYPE_ECC);
  150358. if (point == NULL)
  150359. err = MEMORY_E;
  150360. if (err == MP_OKAY) {
  150361. k = (sp_digit*)XMALLOC(sizeof(sp_digit) * 32, heap,
  150362. DYNAMIC_TYPE_ECC);
  150363. if (k == NULL)
  150364. err = MEMORY_E;
  150365. }
  150366. #endif
  150367. if (err == MP_OKAY) {
  150368. sp_1024_from_mp(k, 32, km);
  150369. err = sp_1024_ecc_mulmod_base_32(point, k, map, 1, heap);
  150370. }
  150371. if (err == MP_OKAY) {
  150372. err = sp_1024_point_to_ecc_point_32(point, r);
  150373. }
  150374. #ifdef WOLFSSL_SP_SMALL_STACK
  150375. if (k != NULL)
  150376. XFREE(k, heap, DYNAMIC_TYPE_ECC);
  150377. if (point != NULL)
  150378. XFREE(point, heap, DYNAMIC_TYPE_ECC);
  150379. #endif
  150380. return err;
  150381. }
  150382. /* Multiply the base point of P1024 by the scalar, add point a and return
  150383. * the result. If map is true then convert result to affine coordinates.
  150384. *
  150385. * km Scalar to multiply by.
  150386. * am Point to add to scalar multiply result.
  150387. * inMont Point to add is in montgomery form.
  150388. * r Resulting point.
  150389. * map Indicates whether to convert result to affine.
  150390. * heap Heap to use for allocation.
  150391. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  150392. */
  150393. int sp_ecc_mulmod_base_add_1024(const mp_int* km, const ecc_point* am,
  150394. int inMont, ecc_point* r, int map, void* heap)
  150395. {
  150396. #ifdef WOLFSSL_SP_SMALL_STACK
  150397. sp_point_1024* point = NULL;
  150398. sp_digit* k = NULL;
  150399. #else
  150400. sp_point_1024 point[2];
  150401. sp_digit k[32 + 32 * 2 * 37];
  150402. #endif
  150403. sp_point_1024* addP = NULL;
  150404. sp_digit* tmp = NULL;
  150405. int err = MP_OKAY;
  150406. #ifdef WOLFSSL_SP_SMALL_STACK
  150407. point = (sp_point_1024*)XMALLOC(sizeof(sp_point_1024) * 2, heap,
  150408. DYNAMIC_TYPE_ECC);
  150409. if (point == NULL)
  150410. err = MEMORY_E;
  150411. if (err == MP_OKAY) {
  150412. k = (sp_digit*)XMALLOC(
  150413. sizeof(sp_digit) * (32 + 32 * 2 * 37),
  150414. heap, DYNAMIC_TYPE_ECC);
  150415. if (k == NULL)
  150416. err = MEMORY_E;
  150417. }
  150418. #endif
  150419. if (err == MP_OKAY) {
  150420. addP = point + 1;
  150421. tmp = k + 32;
  150422. sp_1024_from_mp(k, 32, km);
  150423. sp_1024_point_from_ecc_point_32(addP, am);
  150424. }
  150425. if ((err == MP_OKAY) && (!inMont)) {
  150426. err = sp_1024_mod_mul_norm_32(addP->x, addP->x, p1024_mod);
  150427. }
  150428. if ((err == MP_OKAY) && (!inMont)) {
  150429. err = sp_1024_mod_mul_norm_32(addP->y, addP->y, p1024_mod);
  150430. }
  150431. if ((err == MP_OKAY) && (!inMont)) {
  150432. err = sp_1024_mod_mul_norm_32(addP->z, addP->z, p1024_mod);
  150433. }
  150434. if (err == MP_OKAY) {
  150435. err = sp_1024_ecc_mulmod_base_32(point, k, 0, 0, heap);
  150436. }
  150437. if (err == MP_OKAY) {
  150438. sp_1024_proj_point_add_32(point, point, addP, tmp);
  150439. if (map) {
  150440. sp_1024_map_32(point, point, tmp);
  150441. }
  150442. err = sp_1024_point_to_ecc_point_32(point, r);
  150443. }
  150444. #ifdef WOLFSSL_SP_SMALL_STACK
  150445. if (k != NULL)
  150446. XFREE(k, heap, DYNAMIC_TYPE_ECC);
  150447. if (point)
  150448. XFREE(point, heap, DYNAMIC_TYPE_ECC);
  150449. #endif
  150450. return err;
  150451. }
  150452. #ifndef WOLFSSL_SP_SMALL
  150453. /* Generate a pre-computation table for the point.
  150454. *
  150455. * gm Point to generate table for.
  150456. * table Buffer to hold pre-computed points table.
  150457. * len Length of table.
  150458. * heap Heap to use for allocation.
  150459. * returns BAD_FUNC_ARG when gm or len is NULL, LENGTH_ONLY_E when table is
  150460. * NULL and length is returned, BUFFER_E if length is too small and 0 otherwise.
  150461. */
  150462. int sp_ecc_gen_table_1024(const ecc_point* gm, byte* table, word32* len,
  150463. void* heap)
  150464. {
  150465. #ifdef WOLFSSL_SP_SMALL_STACK
  150466. sp_point_1024* point = NULL;
  150467. sp_digit* t = NULL;
  150468. #else
  150469. sp_point_1024 point[1];
  150470. sp_digit t[38 * 2 * 32];
  150471. #endif
  150472. int err = MP_OKAY;
  150473. if ((gm == NULL) || (len == NULL)) {
  150474. err = BAD_FUNC_ARG;
  150475. }
  150476. if ((err == MP_OKAY) && (table == NULL)) {
  150477. *len = sizeof(sp_table_entry_1024) * 256;
  150478. err = LENGTH_ONLY_E;
  150479. }
  150480. if ((err == MP_OKAY) && (*len < (int)(sizeof(sp_table_entry_1024) * 256))) {
  150481. err = BUFFER_E;
  150482. }
  150483. #ifdef WOLFSSL_SP_SMALL_STACK
  150484. if (err == MP_OKAY) {
  150485. point = (sp_point_1024*)XMALLOC(sizeof(sp_point_1024), heap,
  150486. DYNAMIC_TYPE_ECC);
  150487. if (point == NULL)
  150488. err = MEMORY_E;
  150489. }
  150490. if (err == MP_OKAY) {
  150491. t = (sp_digit*)XMALLOC(sizeof(sp_digit) * 38 * 2 * 32, heap,
  150492. DYNAMIC_TYPE_ECC);
  150493. if (t == NULL)
  150494. err = MEMORY_E;
  150495. }
  150496. #endif
  150497. if (err == MP_OKAY) {
  150498. sp_1024_point_from_ecc_point_32(point, gm);
  150499. err = sp_1024_gen_stripe_table_32(point,
  150500. (sp_table_entry_1024*)table, t, heap);
  150501. }
  150502. if (err == 0) {
  150503. *len = sizeof(sp_table_entry_1024) * 256;
  150504. }
  150505. #ifdef WOLFSSL_SP_SMALL_STACK
  150506. if (t != NULL)
  150507. XFREE(t, heap, DYNAMIC_TYPE_ECC);
  150508. if (point != NULL)
  150509. XFREE(point, heap, DYNAMIC_TYPE_ECC);
  150510. #endif
  150511. return err;
  150512. }
  150513. #else
  150514. /* Generate a pre-computation table for the point.
  150515. *
  150516. * gm Point to generate table for.
  150517. * table Buffer to hold pre-computed points table.
  150518. * len Length of table.
  150519. * heap Heap to use for allocation.
  150520. * returns BAD_FUNC_ARG when gm or len is NULL, LENGTH_ONLY_E when table is
  150521. * NULL and length is returned, BUFFER_E if length is too small and 0 otherwise.
  150522. */
  150523. int sp_ecc_gen_table_1024(const ecc_point* gm, byte* table, word32* len,
  150524. void* heap)
  150525. {
  150526. int err = 0;
  150527. if ((gm == NULL) || (len == NULL)) {
  150528. err = BAD_FUNC_ARG;
  150529. }
  150530. if ((err == 0) && (table == NULL)) {
  150531. *len = 0;
  150532. err = LENGTH_ONLY_E;
  150533. }
  150534. if ((err == 0) && (*len != 0)) {
  150535. err = BUFFER_E;
  150536. }
  150537. if (err == 0) {
  150538. *len = 0;
  150539. }
  150540. (void)heap;
  150541. return err;
  150542. }
  150543. #endif
  150544. /* Multiply the point by the scalar and return the result.
  150545. * If map is true then convert result to affine coordinates.
  150546. *
  150547. * km Scalar to multiply by.
  150548. * gm Point to multiply.
  150549. * table Pre-computed points.
  150550. * r Resulting point.
  150551. * map Indicates whether to convert result to affine.
  150552. * heap Heap to use for allocation.
  150553. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  150554. */
  150555. int sp_ecc_mulmod_table_1024(const mp_int* km, const ecc_point* gm, byte* table,
  150556. ecc_point* r, int map, void* heap)
  150557. {
  150558. #ifdef WOLFSSL_SP_SMALL_STACK
  150559. sp_point_1024* point = NULL;
  150560. sp_digit* k = NULL;
  150561. #else
  150562. sp_point_1024 point[1];
  150563. sp_digit k[32];
  150564. #endif
  150565. int err = MP_OKAY;
  150566. #ifdef WOLFSSL_SP_SMALL_STACK
  150567. point = (sp_point_1024*)XMALLOC(sizeof(sp_point_1024), heap,
  150568. DYNAMIC_TYPE_ECC);
  150569. if (point == NULL) {
  150570. err = MEMORY_E;
  150571. }
  150572. if (err == MP_OKAY) {
  150573. k = (sp_digit*)XMALLOC(sizeof(sp_digit) * 32, heap, DYNAMIC_TYPE_ECC);
  150574. if (k == NULL)
  150575. err = MEMORY_E;
  150576. }
  150577. #endif
  150578. if (err == MP_OKAY) {
  150579. sp_1024_from_mp(k, 32, km);
  150580. sp_1024_point_from_ecc_point_32(point, gm);
  150581. #ifndef WOLFSSL_SP_SMALL
  150582. err = sp_1024_ecc_mulmod_stripe_32(point, point,
  150583. (const sp_table_entry_1024*)table, k, map, 0, heap);
  150584. #else
  150585. (void)table;
  150586. err = sp_1024_ecc_mulmod_32(point, point, k, map, 0, heap);
  150587. #endif
  150588. }
  150589. if (err == MP_OKAY) {
  150590. err = sp_1024_point_to_ecc_point_32(point, r);
  150591. }
  150592. #ifdef WOLFSSL_SP_SMALL_STACK
  150593. if (k != NULL)
  150594. XFREE(k, heap, DYNAMIC_TYPE_ECC);
  150595. if (point != NULL)
  150596. XFREE(point, heap, DYNAMIC_TYPE_ECC);
  150597. #endif
  150598. return err;
  150599. }
  150600. /* Multiply p* in projective coordinates by q*.
  150601. *
  150602. * r.x = p.x - (p.y * q.y)
  150603. * r.y = (p.x * q.y) + p.y
  150604. *
  150605. * px [in,out] A single precision integer - X ordinate of number to multiply.
  150606. * py [in,out] A single precision integer - Y ordinate of number to multiply.
  150607. * q [in] A single precision integer - multiplier.
  150608. * t [in] Two single precision integers - temps.
  150609. */
  150610. static void sp_1024_proj_mul_qx1_32(sp_digit* px, sp_digit* py,
  150611. const sp_digit* q, sp_digit* t)
  150612. {
  150613. sp_digit* t1 = t;
  150614. sp_digit* t2 = t + 2 * 32;
  150615. /* t1 = p.x * q.y */
  150616. sp_1024_mont_mul_32(t1, px, q, p1024_mod, p1024_mp_mod);
  150617. /* t2 = p.y * q.y */
  150618. sp_1024_mont_mul_32(t2, py, q, p1024_mod, p1024_mp_mod);
  150619. /* r.x = p.x - (p.y * q.y) */
  150620. sp_1024_mont_sub_32(px, px, t2, p1024_mod);
  150621. /* r.y = (p.x * q.y) + p.y */
  150622. sp_1024_mont_add_32(py, t1, py, p1024_mod);
  150623. }
  150624. /* Square p* in projective coordinates.
  150625. *
  150626. * px' = (p.x + p.y) * (p.x - p.y) = p.x^2 - p.y^2
  150627. * py' = 2 * p.x * p.y
  150628. *
  150629. * px [in,out] A single precision integer - X ordinate of number to square.
  150630. * py [in,out] A single precision integer - Y ordinate of number to square.
  150631. * t [in] Two single precision integers - temps.
  150632. */
  150633. static void sp_1024_proj_sqr_32(sp_digit* px, sp_digit* py, sp_digit* t)
  150634. {
  150635. sp_digit* t1 = t;
  150636. sp_digit* t2 = t + 2 * 32;
  150637. /* t1 = p.x + p.y */
  150638. sp_1024_mont_add_32(t1, px, py, p1024_mod);
  150639. /* t2 = p.x - p.y */
  150640. sp_1024_mont_sub_32(t2, px, py, p1024_mod);
  150641. /* r.y = p.x * p.y */
  150642. sp_1024_mont_mul_32(py, px, py, p1024_mod, p1024_mp_mod);
  150643. /* r.x = (p.x + p.y) * (p.x - p.y) */
  150644. sp_1024_mont_mul_32(px, t1, t2, p1024_mod, p1024_mp_mod);
  150645. /* r.y = (p.x * p.y) * 2 */
  150646. sp_1024_mont_dbl_32(py, py, p1024_mod);
  150647. }
  150648. #ifdef WOLFSSL_SP_SMALL
  150649. /* Perform the modular exponentiation in Fp* for SAKKE.
  150650. *
  150651. * Simple square and multiply when expontent bit is one algorithm.
  150652. * Square and multiply performed in Fp*.
  150653. *
  150654. * base [in] Base. MP integer.
  150655. * exp [in] Exponent. MP integer.
  150656. * res [out] Result. MP integer.
  150657. * returns 0 on success and MEMORY_E if memory allocation fails.
  150658. */
  150659. int sp_ModExp_Fp_star_1024(const mp_int* base, mp_int* exp, mp_int* res)
  150660. {
  150661. #if (defined(WOLFSSL_SP_SMALL) && !defined(WOLFSSL_SP_NO_MALLOC)) || \
  150662. defined(WOLFSSL_SP_SMALL_STACK)
  150663. sp_digit* td;
  150664. sp_digit* t;
  150665. sp_digit* tx;
  150666. sp_digit* ty;
  150667. sp_digit* b;
  150668. sp_digit* e;
  150669. #else
  150670. sp_digit t[36 * 2 * 32];
  150671. sp_digit tx[2 * 32];
  150672. sp_digit ty[2 * 32];
  150673. sp_digit b[2 * 32];
  150674. sp_digit e[2 * 32];
  150675. #endif
  150676. sp_digit* r;
  150677. int err = MP_OKAY;
  150678. int bits;
  150679. int i;
  150680. #if (defined(WOLFSSL_SP_SMALL) && !defined(WOLFSSL_SP_NO_MALLOC)) || \
  150681. defined(WOLFSSL_SP_SMALL_STACK)
  150682. td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 40 * 32 * 2, NULL,
  150683. DYNAMIC_TYPE_TMP_BUFFER);
  150684. if (td == NULL) {
  150685. err = MEMORY_E;
  150686. }
  150687. #endif
  150688. if (err == MP_OKAY) {
  150689. #if (defined(WOLFSSL_SP_SMALL) && !defined(WOLFSSL_SP_NO_MALLOC)) || \
  150690. defined(WOLFSSL_SP_SMALL_STACK)
  150691. t = td;
  150692. tx = td + 36 * 32 * 2;
  150693. ty = td + 37 * 32 * 2;
  150694. b = td + 38 * 32 * 2;
  150695. e = td + 39 * 32 * 2;
  150696. #endif
  150697. r = ty;
  150698. bits = mp_count_bits(exp);
  150699. sp_1024_from_mp(b, 32, base);
  150700. sp_1024_from_mp(e, 32, exp);
  150701. XMEMCPY(tx, p1024_norm_mod, sizeof(sp_digit) * 32);
  150702. sp_1024_mul_32(b, b, p1024_norm_mod);
  150703. err = sp_1024_mod_32(b, b, p1024_mod);
  150704. }
  150705. if (err == MP_OKAY) {
  150706. XMEMCPY(ty, b, sizeof(sp_digit) * 32);
  150707. for (i = bits - 2; i >= 0; i--) {
  150708. sp_1024_proj_sqr_32(tx, ty, t);
  150709. if ((e[i / 32] >> (i % 32)) & 1) {
  150710. sp_1024_proj_mul_qx1_32(tx, ty, b, t);
  150711. }
  150712. }
  150713. }
  150714. if (err == MP_OKAY) {
  150715. sp_1024_mont_inv_32(tx, tx, t);
  150716. XMEMSET(tx + 32, 0, sizeof(sp_digit) * 32);
  150717. sp_1024_mont_reduce_32(tx, p1024_mod, p1024_mp_mod);
  150718. XMEMSET(ty + 32, 0, sizeof(sp_digit) * 32);
  150719. sp_1024_mont_reduce_32(ty, p1024_mod, p1024_mp_mod);
  150720. sp_1024_mul_32(r, tx, ty);
  150721. err = sp_1024_mod_32(r, r, p1024_mod);
  150722. }
  150723. if (err == MP_OKAY) {
  150724. err = sp_1024_to_mp(r, res);
  150725. }
  150726. #if (defined(WOLFSSL_SP_SMALL) && !defined(WOLFSSL_SP_NO_MALLOC)) || \
  150727. defined(WOLFSSL_SP_SMALL_STACK)
  150728. if (td != NULL) {
  150729. XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  150730. }
  150731. #endif
  150732. return err;
  150733. }
  150734. #else
  150735. /* Pre-computed table for exponentiating g.
  150736. * Striping: 8 points at a distance of (128 combined for
  150737. * a total of 256 points.
  150738. */
  150739. static const sp_digit sp_1024_g_table[256][32] = {
  150740. { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
  150741. 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
  150742. 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
  150743. 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
  150744. 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
  150745. 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
  150746. 0x00000000, 0x00000000 },
  150747. { 0x335c1685, 0x170a46d2, 0xe1007a58, 0xeac9e971, 0x43ca4a73,
  150748. 0x40e8f3df, 0x82642475, 0x2646f815, 0xb36576d1, 0x3af49bb4,
  150749. 0x72bf1afb, 0xd89e2d14, 0x2fd151e6, 0x27be882c, 0x8f88717c,
  150750. 0xaddedc85, 0x16ac6c6f, 0xd6d859bf, 0x2d8eae58, 0x0e741a1b,
  150751. 0x61c1f30d, 0x6faf7a00, 0x9b67e096, 0x66dbd09a, 0x7d3b4f7d,
  150752. 0x21f11c06, 0xc727c98e, 0x6152ba02, 0xe86cb221, 0xafd58891,
  150753. 0x6bd3baf4, 0x59e93c6a },
  150754. { 0x71dd4594, 0xe54dd36f, 0x00aef1e6, 0xbbc9cc9f, 0xa19f6530,
  150755. 0x9ea5a44e, 0x3f520928, 0x8588aa99, 0x8f5c1418, 0x9753794c,
  150756. 0xc11399fa, 0x118bd792, 0xf5cb6ab5, 0xb9bd3afd, 0x2ecb9652,
  150757. 0x813d1cb2, 0x40389813, 0xfd456267, 0x4ac8431c, 0x51f7119b,
  150758. 0x0a180eb6, 0xdd9f6a91, 0x9f7bfa2e, 0x13946d17, 0x50a9d0d9,
  150759. 0x16f18631, 0x6f8373d3, 0x5f19c20d, 0x9b6a52b9, 0xbe85ac6a,
  150760. 0x74f62e03, 0x63ef187b },
  150761. { 0x016f45e7, 0x7c376b7f, 0x2bec82f8, 0x1c1bdb57, 0xce429b60,
  150762. 0x7392f741, 0xc7afd81d, 0x6fdbf0a2, 0x7241098b, 0xbda41b1f,
  150763. 0xbb60f8cf, 0x5b407474, 0xb330bc4d, 0x933e0d41, 0x733fa3be,
  150764. 0xae182830, 0x0f5c6cd1, 0xa0ed299b, 0x3f9860c8, 0x7ff3354e,
  150765. 0x15559c41, 0xb1360986, 0x129f85cb, 0xab0cb63c, 0x47685fbe,
  150766. 0x682ecc49, 0xeb199633, 0x505e8ec2, 0xddac2cda, 0x90dcc794,
  150767. 0xf192da23, 0x4fe6791c },
  150768. { 0x05e8733c, 0x94a423d5, 0x1d5717c1, 0xcc845e65, 0xe961b322,
  150769. 0x237c7e88, 0xdb4181cc, 0x0c4471c6, 0x713bd721, 0x00c875e2,
  150770. 0xb2c17b09, 0x9dfde9ed, 0xe88ceaf6, 0x430a6de5, 0x7b81cea6,
  150771. 0xaaa7a61a, 0x233f98d5, 0xea52d026, 0x60689a9a, 0xb55efdd0,
  150772. 0x5cac4aab, 0x30cfa7ce, 0x8e950761, 0xfa4db114, 0x4e9a1e52,
  150773. 0x309570c4, 0x1a040170, 0x18c21f61, 0xbe78d9d2, 0x555d1ffe,
  150774. 0x561db297, 0x04482a18 },
  150775. { 0x73d486d8, 0xe7758ac2, 0x61cdc1e7, 0x8169f946, 0x2188ab4f,
  150776. 0x723c99fc, 0xf3373630, 0xa0e54f02, 0xbd8c2260, 0x560bee25,
  150777. 0x4531bc60, 0x28fc307c, 0x7e44feb5, 0xd6f21f1a, 0x57128d37,
  150778. 0xc8e4499c, 0xd7b2ea45, 0x963b053e, 0x32a3d222, 0x40c27a04,
  150779. 0x35459668, 0x5b51854d, 0xd73557e9, 0x66e1a49f, 0x8692077a,
  150780. 0x0d267fd9, 0xe7342702, 0xfa1350d3, 0x68ccdb44, 0x1a9c3f25,
  150781. 0xdedbf89f, 0x833a0ff8 },
  150782. { 0xab376b76, 0xa8c419c7, 0x27d0f0cc, 0x3b7294f3, 0xa90c514d,
  150783. 0xe56bb9e2, 0xa62575a6, 0x931ba51e, 0x098c0a88, 0x56fee07b,
  150784. 0xb4c16a2a, 0x04be5aee, 0xe6eb260b, 0xe513350b, 0xa1d5c270,
  150785. 0x339edad6, 0xe9dbadd1, 0xf366ed59, 0x2dd06ec0, 0x4213be88,
  150786. 0xcb1187db, 0x22d639c8, 0xd8a1058a, 0x1fec95e1, 0xa2b744f1,
  150787. 0x03f73ea6, 0xf4f05c0c, 0x741fd51a, 0x85f811a0, 0x2e2df95a,
  150788. 0xeb24965f, 0x692b3ce3 },
  150789. { 0xd2a127b4, 0x0ce6cb72, 0x8f92816f, 0x66a46ea5, 0x47a37616,
  150790. 0x43ecf463, 0xe0ab96ee, 0x163d9a01, 0xb2edbe8c, 0xc8145c6d,
  150791. 0x4de4e665, 0x2f426cae, 0x74e252f9, 0x174d0b40, 0x7d2af831,
  150792. 0x54c240d7, 0x3d652936, 0x581fa397, 0xa09d4695, 0x05b9491c,
  150793. 0x5452643c, 0x8c4e8533, 0xd4128327, 0x32d64331, 0x70361f25,
  150794. 0x64479038, 0x89ef09f2, 0x774191b1, 0x81de5fe0, 0xc0cf0aaf,
  150795. 0xf40042d6, 0x333e430a },
  150796. { 0xcf26d3b7, 0x5df04de4, 0xb53f79be, 0x57a77306, 0x1808b664,
  150797. 0xa4013c5f, 0x85037360, 0xef291ea4, 0x0b061037, 0x1ffc9d7d,
  150798. 0x65c913bb, 0xd9d04dd9, 0xf13b8587, 0x948a37af, 0xfe3ee755,
  150799. 0xb5443483, 0x04631386, 0x3fc21e74, 0xcddeb58c, 0xb3a104e5,
  150800. 0x6572cd52, 0x94fe1862, 0x15aaa408, 0xeb9a71a1, 0x459ea462,
  150801. 0x8adc6fe5, 0x4aeb02a3, 0xbb18d175, 0x2f7791d1, 0xae127636,
  150802. 0xd6bbd708, 0x10e8b31d },
  150803. { 0x3ed9f1af, 0xb87f03e5, 0x56676166, 0x03ad2477, 0x74ce15b8,
  150804. 0x38dcd630, 0x26b1e85b, 0x1877e2b0, 0x1af99c15, 0xb1654d17,
  150805. 0x9382547a, 0x9782e9e4, 0x26d55ef5, 0x6dc7fc7c, 0x2fbeb54c,
  150806. 0x9038f95d, 0x036c0357, 0xfe590dfe, 0x4fdc3f7f, 0xcfcb6eae,
  150807. 0xf35e1a88, 0xcb1fbc54, 0xda0a5568, 0x3c8e1db2, 0x5b6f5557,
  150808. 0x9a87393f, 0xe7ac0a06, 0x38646b32, 0x2a8495ab, 0xfd261c83,
  150809. 0x0cdcc4bc, 0x6485524c },
  150810. { 0xc4a6ff2a, 0x1abfb3e2, 0x35a6428a, 0x2aa03fba, 0x89aff742,
  150811. 0x884227f0, 0xba5dbd93, 0x2337883a, 0xd2a182cb, 0x38186ae9,
  150812. 0x49a01f05, 0xb9f0764d, 0x917b1e7a, 0x92411feb, 0x570cbb5b,
  150813. 0x700b1903, 0xb914be7c, 0x5d5181d5, 0x1981182d, 0x135c4437,
  150814. 0x574b9997, 0x32758d24, 0x632d28b2, 0xa650a8f5, 0xfa383f09,
  150815. 0x24078bac, 0x00a33d80, 0x6546a60c, 0x2df8b449, 0xa4061c7a,
  150816. 0xf234563c, 0x1f76f3f2 },
  150817. { 0x44c436b0, 0x9aa2c143, 0x1f69c87a, 0x79070556, 0x5f6db2df,
  150818. 0x35f3117b, 0xed56ba82, 0x85761f41, 0x7d0afa48, 0xf831464f,
  150819. 0x3adce71e, 0xa99f2915, 0x116b7488, 0xb27bf693, 0x9bb9443a,
  150820. 0xa98a5a8c, 0x2ee5fde8, 0x7f878026, 0x1812acb7, 0x3a6f93dd,
  150821. 0xdc84bc92, 0xaf92a4cc, 0xf1d4995a, 0x3c2562af, 0x04ed899d,
  150822. 0xfd9fc33c, 0x4ed2a538, 0xc028ca94, 0x049ea726, 0xd0f367bb,
  150823. 0x3d108e05, 0x04924ffb },
  150824. { 0xc673562f, 0x06548e3d, 0xe2eae48c, 0xd3b33025, 0x5e1c6977,
  150825. 0xe61fd32b, 0x6ebe557b, 0x424e2064, 0x41d6e18e, 0x767391c0,
  150826. 0x14d7e95b, 0x4b8ebb8e, 0x20991b8c, 0x4ae8b7d4, 0xe01290d3,
  150827. 0xf8a0df66, 0x925e5f4e, 0xc97e24a3, 0x1508272a, 0x79a7b2cb,
  150828. 0x25072661, 0xb40b072e, 0x9062fa49, 0xdad9e182, 0xf3c53bce,
  150829. 0x8780a784, 0x9f142799, 0x58a82b76, 0xc1468426, 0x08cd849c,
  150830. 0xc380ae35, 0x4dfce809 },
  150831. { 0xd527b780, 0x45069cb2, 0x977930dd, 0xd52da015, 0xe27d0263,
  150832. 0x10cc600b, 0xbb2d1b2b, 0x34102c26, 0x554adf3c, 0x4c652623,
  150833. 0x45f0ff47, 0xd6891382, 0xca916e7c, 0x83fa8cc5, 0xd15c8d8a,
  150834. 0x1e10f139, 0x81dc56b3, 0xf173dc2e, 0x5c4ed9ba, 0x7fcecb04,
  150835. 0x47d01228, 0x307fd7d8, 0x9f3a532f, 0x24a57153, 0xe2153c22,
  150836. 0x59e9e81d, 0xe428a408, 0xc562595d, 0x9339bd23, 0xdc7daff8,
  150837. 0xb8a06802, 0x0d075908 },
  150838. { 0xde085f2a, 0x870af2a7, 0xbe99b2e5, 0x88fcd24f, 0x59ca413b,
  150839. 0x88c0d261, 0x8559f851, 0x1f02a2e4, 0xf622da0d, 0x83b96021,
  150840. 0x6dca3615, 0x5c05c2f5, 0x7910c682, 0x0148cf1c, 0x272695be,
  150841. 0x392f2896, 0xa8d64ef6, 0x883d0bb5, 0x1cfcbc52, 0xef0d2244,
  150842. 0x526117e5, 0xf5dafcec, 0xf04928e9, 0xb68612b9, 0x393f2e2a,
  150843. 0x283f744d, 0x700c1151, 0xfbeed7ed, 0xa4360dfe, 0xf2cde215,
  150844. 0x2f08535a, 0x24fa961c },
  150845. { 0x616df7f6, 0x0767db3f, 0xfbd90326, 0x643057d8, 0x6e82d544,
  150846. 0x174daa90, 0x689643db, 0x2284f345, 0xcc89a060, 0x18b191df,
  150847. 0xd6c27d12, 0xbab46af4, 0xc9895145, 0x5a57f486, 0xcc942f9e,
  150848. 0xc03214e9, 0x41950158, 0x273e1c8f, 0x39ad43ab, 0x8ceb759f,
  150849. 0xe50ee173, 0x5e1b8b7f, 0x8f4d7d4e, 0xf635b1fc, 0x755603f3,
  150850. 0x8eff77e3, 0x7752fa60, 0x201f61d1, 0x4a6fb6e1, 0x94d7a03d,
  150851. 0xfc4f0114, 0x371cc23d },
  150852. { 0xda90c351, 0x289b115d, 0x364d9c06, 0x6d196ebf, 0xf650b31b,
  150853. 0x77a89202, 0x6f57642f, 0xcc28c164, 0x08100127, 0xdc4f7e36,
  150854. 0xdc4c807b, 0x8836cd08, 0xe00240f2, 0x1280f156, 0x99cb3953,
  150855. 0x3f9a6d78, 0x3a802038, 0x40a494d3, 0xe87d3474, 0x45697e91,
  150856. 0x26dde24a, 0x70d97d07, 0x7640c30e, 0x06f6a58d, 0x5ba6e6c6,
  150857. 0x03c2c0e8, 0xf1bc13e8, 0x330f6a7a, 0xc9f4d78f, 0x3e602e4f,
  150858. 0x0c80fb7f, 0x92b6bca0 },
  150859. { 0x5f00822e, 0x2e3d5c83, 0xb8b16f12, 0x0e825712, 0x92b0a330,
  150860. 0x81c329c4, 0xa7cc1954, 0x6b4e32ad, 0x1bb1413f, 0x0bee9cee,
  150861. 0x4a92ca27, 0xedfb7baa, 0xea3b9153, 0xcd472afa, 0x00f0c0f9,
  150862. 0xe8f09e7e, 0x5cdebb70, 0xa4e1d872, 0x4a9b63b6, 0xfe2bae08,
  150863. 0x3fd58f65, 0xf40141b8, 0xa3b62759, 0xd7ec5eda, 0x790e3088,
  150864. 0x9aaf6e67, 0x1f277e31, 0x215ad830, 0xcf33871c, 0xe7db4b98,
  150865. 0x4f02f89d, 0x71ff62c9 },
  150866. { 0x2a4a84d9, 0xaa4c7102, 0x5ebc71e6, 0xe2ee4acd, 0xf1cd6578,
  150867. 0x3b11a8a5, 0xfff120a5, 0x83f5ef9f, 0x09e65033, 0xa4c598e1,
  150868. 0xca044180, 0xe1e9f990, 0xf59828c1, 0x8b832d46, 0x33af536b,
  150869. 0x753f28a0, 0xb6d4f68a, 0x92edc4b1, 0x72ccd1f0, 0xedde692a,
  150870. 0xd2226432, 0xd3aa0f7d, 0xa3d2661c, 0x38dbb63e, 0xfdc37dda,
  150871. 0xf1e19fc6, 0x84ef6b4c, 0x6c18b350, 0xdf1bba69, 0xe6a83fe9,
  150872. 0x5f958273, 0x40fd47e7 },
  150873. { 0x267140a4, 0x5b88b746, 0xeab6f2fb, 0x6dbbfc1e, 0x69862548,
  150874. 0xdd9ec88e, 0x2eb6efc2, 0x69beeba1, 0x8ac8ff88, 0xcfc2214a,
  150875. 0xb5a21950, 0x95d5c96e, 0x4171fb69, 0x93389c05, 0x1b468337,
  150876. 0x2d85d452, 0x4113425c, 0x14d68a08, 0xec6c2174, 0xe52c0139,
  150877. 0xf730084d, 0x20cf0b97, 0x1f578aa3, 0x1ac16a26, 0xf9b6ae43,
  150878. 0x18b9fab3, 0xd854a695, 0x68d82111, 0xdffbe286, 0x0b334d98,
  150879. 0xe639338c, 0x5b1c1157 },
  150880. { 0x72b6bb8f, 0x90edaab1, 0x02fc92c2, 0x8dc64ed2, 0xfe694c73,
  150881. 0xf42ba3c5, 0xcb54dce4, 0x316dc65f, 0x632420dc, 0xcb2d66a3,
  150882. 0x056dcf94, 0x16e706e7, 0xa4f32c9d, 0x2809c764, 0xea6edca8,
  150883. 0xab18d830, 0x81c65f57, 0x4fd1ace6, 0x7da12c10, 0x1f91651c,
  150884. 0xc7791a48, 0x0ac3bd66, 0x785e67a3, 0xb6ad1cf4, 0xda0fd591,
  150885. 0xe4d3fc44, 0x6e1c6344, 0xce164801, 0x33e50ab3, 0x84de9cb8,
  150886. 0xa756eef4, 0x963ab83a },
  150887. { 0xdf4ea5a3, 0x944b47d8, 0x5cfe45fe, 0x96568815, 0x8a3c3564,
  150888. 0xd16e7d58, 0xe7c99e15, 0x84e55b3e, 0xf55071bc, 0x3fee204d,
  150889. 0x04057dce, 0x71006f29, 0xbba75570, 0xfe8c390d, 0x3319adac,
  150890. 0x3645bcb6, 0x7c20bfd8, 0x8189e8b0, 0x7d7d9578, 0x8e550969,
  150891. 0xb99f4e3b, 0x037d1321, 0xa60cfb6a, 0x011b2521, 0x837382da,
  150892. 0x66594aaa, 0x83c1dc07, 0xc89b91fd, 0x076b9884, 0x6b82b899,
  150893. 0xbe45c558, 0x443480fc },
  150894. { 0x9114221a, 0xf8ffffb4, 0x3e857a7a, 0x4aec4f2e, 0x0fa54787,
  150895. 0x42e2d0e4, 0xd6f96152, 0xef3e6b31, 0xfbfe9b77, 0xb2296537,
  150896. 0xfb43a86a, 0xc2a9d0f2, 0x24572ac6, 0x241284ed, 0xe721ba7b,
  150897. 0xa3868917, 0xc117a78d, 0xdbef7c00, 0xd31605ac, 0x38149071,
  150898. 0x065a8ee9, 0xc2dada9e, 0xc442be82, 0xd5b138d8, 0xf6d72b58,
  150899. 0x9b6c224b, 0x8eb03e6d, 0xb9d355cf, 0xa1700371, 0xab6d1eb0,
  150900. 0xcffaa7eb, 0x97118a88 },
  150901. { 0xcdecb5d8, 0xbf9c59a2, 0xa93a6866, 0x8083c81b, 0x04774fbf,
  150902. 0x24e0dd81, 0xa02070b4, 0xe779a3ca, 0x0fbfb781, 0x9d352fbb,
  150903. 0x3ef2a1c4, 0xa8b0d820, 0x14b3e501, 0xb858637b, 0x8a882ff2,
  150904. 0x5ba70a49, 0x3b06efa5, 0xa2730083, 0x102fee2a, 0xa42c02f4,
  150905. 0x8a0223a5, 0xe4e76299, 0x85c3fc72, 0xdba2ba26, 0xfe52eae7,
  150906. 0x554fe763, 0x270f45f6, 0x30b5405a, 0xa573387c, 0xd56a177a,
  150907. 0x4b71fa82, 0x17c0778d },
  150908. { 0x2735e37b, 0x0e6dff1d, 0x656ec572, 0xc9884e56, 0x9ebba978,
  150909. 0xa2f5ac9d, 0xba09f3c4, 0x40fa4518, 0xf5b04377, 0x8c3fa177,
  150910. 0x967a2eca, 0xa1a1decd, 0x0528bd40, 0x768bca70, 0x18691c4a,
  150911. 0xf224952b, 0xe86d5fd5, 0x16e12c45, 0x37859a6a, 0x7a0d9157,
  150912. 0xa0ffce0e, 0x723f4309, 0xa96cc9a3, 0x5a8db79b, 0x1ad23a38,
  150913. 0x6dd12ae0, 0xe2bf5d84, 0x9ffec3a1, 0xa452ed66, 0xd6ce84e1,
  150914. 0x571fe4c6, 0x1219d5c8 },
  150915. { 0x262969eb, 0x43eaa67f, 0x2f03e773, 0x3a3ab39d, 0x57bb0909,
  150916. 0xe6127e51, 0x8d150274, 0x0f82b0ed, 0xe580bdbd, 0xffffcad8,
  150917. 0xa9743e6b, 0x51d3d075, 0x8bac11d6, 0x1484bdb1, 0xeb24c388,
  150918. 0x95cd9990, 0x7fac67c6, 0x216a61d0, 0xa04e6b87, 0x4308f762,
  150919. 0xcba57cc8, 0x2865dd61, 0xd234a07a, 0x3c296b0d, 0x3a0793f9,
  150920. 0x76f92839, 0x0be29ece, 0x70b57e1f, 0x7e626f42, 0x1314a82f,
  150921. 0xd657f230, 0x2c8d7ab2 },
  150922. { 0x0825e4d6, 0x67cf5892, 0x6ef83b44, 0xdf51eaa5, 0x1310108d,
  150923. 0x63e665d8, 0x8dd0963f, 0x229f89f5, 0x9df6436a, 0x8c4b14dd,
  150924. 0xd45ebba7, 0x99dae469, 0x5a4df381, 0x118aab77, 0x29e37feb,
  150925. 0xda8978bd, 0xaca2d7ef, 0x69ced5aa, 0xc67d6a8a, 0x6c98d05d,
  150926. 0x77f84a34, 0x7474bf0d, 0xed8cd59a, 0xd4428b2e, 0xd1d398fb,
  150927. 0xb0fd1cd5, 0x94a20b11, 0x596013db, 0x1b404c44, 0x96eb705a,
  150928. 0x4b09d958, 0x2299d277 },
  150929. { 0xc64397e6, 0x5b9cd58d, 0xbf6dd31e, 0xac198f1e, 0x3e9f1db2,
  150930. 0x5866d8e1, 0x8fcdc68c, 0x405ae287, 0xe53c01fd, 0xa4b280cd,
  150931. 0x411db5f6, 0xdc963f2d, 0xbec4f8a0, 0xed5d5189, 0x916ee98b,
  150932. 0x336fd13d, 0x042df48e, 0x6925b1b3, 0xace0074e, 0x0cf56291,
  150933. 0x25317e95, 0xe8d38b48, 0x821c446b, 0xc7ad1d2b, 0xf0b65934,
  150934. 0x71c44135, 0x52ca0d50, 0x971b736f, 0x27b46c26, 0xaf9ffa57,
  150935. 0x1936618e, 0x21ac6779 },
  150936. { 0x2d7fbcd2, 0xab420e3f, 0x97bdfc18, 0x12722473, 0x4df5d4b4,
  150937. 0x492033f8, 0x3807b7d3, 0x6fcd4236, 0xb33c3625, 0xdfc19b09,
  150938. 0xa0f22814, 0x13d6f375, 0x037c19b8, 0x70978a59, 0x0ff27b9c,
  150939. 0x4f398997, 0x615a4389, 0xfc0e1a45, 0x3e602f74, 0xffa3496a,
  150940. 0xb261ca1c, 0xc3f1c431, 0xee0164cd, 0x612211db, 0xe7f7be9f,
  150941. 0x30463ee4, 0x92c2e1bb, 0x015f7e78, 0x24483a56, 0x663d88d6,
  150942. 0x0e62d9d8, 0x0e8ec1e7 },
  150943. { 0x8a0878dd, 0xa88ccc29, 0x6640071a, 0x99ac175d, 0xa5173617,
  150944. 0x90344820, 0xdd58a315, 0x316d023e, 0x88d221a1, 0x30785bd4,
  150945. 0x959c48e3, 0xb74b3de7, 0x4c67a771, 0x42ee0382, 0xe0b91453,
  150946. 0x59ef6cdd, 0x9b237e91, 0x7830ae28, 0x495d8325, 0xe1847a4c,
  150947. 0xd0773666, 0x67b1217e, 0xa294a325, 0x58192c86, 0x864d8326,
  150948. 0x76aa0f56, 0xf4b13e5b, 0xe2a2bd12, 0x1b6b73fd, 0xd850c1c0,
  150949. 0x5d103635, 0x653a795f },
  150950. { 0x50dcb199, 0xcfe28985, 0x7fa02b60, 0xb35b8e5e, 0xc97603d0,
  150951. 0xbca7d7c3, 0x27f131b5, 0xb0e5288d, 0xe2b12d52, 0x3aa704de,
  150952. 0x1db725c7, 0xe206b1d8, 0xc5d1b113, 0x0b12839a, 0xdb45d763,
  150953. 0x14f970cb, 0xb2125e8e, 0xc997f93e, 0xee7daa26, 0xbd75739c,
  150954. 0x1fef20e9, 0x46ecbd3f, 0x7c6a42b1, 0xf994a114, 0x27fb0fd1,
  150955. 0xd289eb4f, 0x9a40da4b, 0x11186d31, 0xfb9d7976, 0x083f65a5,
  150956. 0xd444675e, 0x30dfc47b },
  150957. { 0x9eaadfe8, 0xbcfc5ae2, 0xb4d4e812, 0x25027e54, 0x8b533561,
  150958. 0xab0702df, 0x56a6a214, 0xa2b9c204, 0x3059068e, 0xb1a3df7a,
  150959. 0x9883110f, 0xa3514b21, 0xc4b78e1c, 0xb7be2336, 0x3e2f6984,
  150960. 0x17073ce6, 0x2ddf7ac6, 0x86e114a6, 0x07d7c3c8, 0x276192bf,
  150961. 0xeb1ae289, 0x5da69e0b, 0x25184939, 0x983af175, 0x407a3aa0,
  150962. 0x9ac52a4d, 0xae0fe218, 0x1535c7da, 0x397f2501, 0xe16fe872,
  150963. 0x54c212cf, 0x572a591f },
  150964. { 0x09a5553a, 0x49668419, 0x327733bc, 0x3f054318, 0x3eefd690,
  150965. 0xf9ceb4b2, 0xf22126d4, 0xbd3cbf9b, 0x2fed9578, 0x6d9671c0,
  150966. 0xca0306d8, 0xbba597ce, 0x3d674fe5, 0xb705ed61, 0x67f33f76,
  150967. 0xf1d3622b, 0x11cb8c31, 0x15bcf3c6, 0xe53d1aa9, 0xa38467dc,
  150968. 0xf908ab43, 0x902fe929, 0x8d15767a, 0x6e3e499d, 0x90afd07b,
  150969. 0x8142db5c, 0x6c8b190e, 0x120c6fbc, 0x24919a4e, 0x80c86553,
  150970. 0xd8c82c3c, 0x65c2cbe1 },
  150971. { 0xa660bb63, 0x684cda20, 0x86e86245, 0x27dc3b0a, 0x6ba0eed7,
  150972. 0x76472cf6, 0x679dd158, 0x79c162e5, 0x08452d44, 0xb6884277,
  150973. 0x413f579e, 0x829bc6b3, 0x95011770, 0x92ea15ec, 0x47738183,
  150974. 0x5e34e300, 0x73e1d2f1, 0x8c3ca349, 0x229bd3de, 0xa5c4f1dc,
  150975. 0x94ef7ed3, 0x783eff1b, 0xdfae7a1a, 0x46db738d, 0x1a099852,
  150976. 0x4353d72e, 0xa0dcf4ab, 0x2533ad58, 0x0e7888b9, 0xd8055016,
  150977. 0x3ba77f66, 0x831440d5 },
  150978. { 0xf611b2da, 0xf43e2e32, 0xd0fa46ac, 0x5d066e29, 0x820b3c0d,
  150979. 0xe897f3e8, 0x1d3e44f0, 0xc45c28e6, 0xdfd27a66, 0x929d7f66,
  150980. 0x101e8517, 0x735b860a, 0x3de078dd, 0xea3fce98, 0x638ce11a,
  150981. 0xc9977db5, 0x48536b3b, 0x0488382f, 0x64cadfc6, 0x7e0c7a3c,
  150982. 0x82147b71, 0x3cd17f7f, 0x1b411e3e, 0xe95663cc, 0x985fb46d,
  150983. 0x5739ac8f, 0xbcf119ca, 0x385399cd, 0xe15a2815, 0x4a985a70,
  150984. 0x6d5f4566, 0x504c3a8a },
  150985. { 0xb8fa53c7, 0x00b55283, 0x509474e3, 0x985cff38, 0x437ce25f,
  150986. 0x234d241c, 0xe5a129ed, 0x29832430, 0xaabcc674, 0x6ad38956,
  150987. 0x7ee81ee1, 0xa2dc001d, 0x670b2702, 0x4c23c6b6, 0xa6e8a3bb,
  150988. 0xb35e567e, 0xa69673ea, 0xbc70b3ce, 0xe6e28eac, 0x85a7a9c3,
  150989. 0x5537b7da, 0x2ae684de, 0x6de937dc, 0x5ecac3e5, 0xf8430422,
  150990. 0xbf2ea6c9, 0x77fdc520, 0x38caf7d0, 0x69f56add, 0xc27af0b1,
  150991. 0xc71d21d2, 0x496e4699 },
  150992. { 0x9fa93467, 0xba14fc82, 0x0eb2a614, 0xc2e37684, 0x4833e09b,
  150993. 0x659bcfaf, 0x3686bdcc, 0xbc859752, 0x81f3216a, 0x40bfd080,
  150994. 0x17c081b8, 0xc463bda6, 0xbb04793b, 0xbd01fa86, 0x2cd640c5,
  150995. 0x5a21ece6, 0x2203d5c4, 0x97bf6a54, 0x951167b7, 0xceb40edc,
  150996. 0x765ba268, 0xd67aacaf, 0xaeab51f9, 0x8ba0d9e9, 0xb0d6863a,
  150997. 0xc14b215e, 0xe5f06952, 0x354cdcdb, 0xcb3744b5, 0x4f2b5ccf,
  150998. 0x13037fe8, 0x13389173 },
  150999. { 0x45003cd1, 0xee680640, 0x44ae2ac6, 0xfdac17bc, 0xde8e5314,
  151000. 0x4bcd419f, 0xc7cea95c, 0x81e34eb9, 0x38f37e01, 0xbb57762d,
  151001. 0x260990c8, 0xecc4cfb0, 0x50a34a7b, 0x0bc493f9, 0x543304ef,
  151002. 0x68074172, 0x6bc8aa2a, 0xaec0fcb2, 0x3b45fea5, 0x9e7a9b46,
  151003. 0x55fbdbac, 0x4bb2952e, 0x0485dff4, 0x50f0c0a6, 0x4dea4796,
  151004. 0x02c5104d, 0x695e3a02, 0xd2cefa09, 0x6da1f345, 0x4c8102b4,
  151005. 0xf3833fbd, 0x422eb573 },
  151006. { 0xa6ad3f47, 0xac592eb6, 0x9714ba0e, 0xb0861f6d, 0x07281459,
  151007. 0x57c1e919, 0x64ea5803, 0xcf7c94e2, 0x54b12723, 0x725376ac,
  151008. 0xdafb736a, 0xf2a6ba41, 0xcba03cdc, 0xc89e8920, 0x5b0fd3ad,
  151009. 0xf2e20cb4, 0xd66059fe, 0x26ea5a54, 0x889df8bc, 0xee63fa8b,
  151010. 0x66a3f2bf, 0x40f1c7e1, 0x747312e1, 0x09febc9c, 0x727999ff,
  151011. 0x7d19b9c2, 0xb7fd2b05, 0xa9fbbb4c, 0xa0da2dc6, 0xcfba27d7,
  151012. 0x2c252582, 0x368541cf },
  151013. { 0x22799d37, 0x510d3c9e, 0xacfa333a, 0x1b677de5, 0x080f795b,
  151014. 0x4e6ae18f, 0xafc8dfc2, 0x69b53c2a, 0x0e842dc2, 0x797541b6,
  151015. 0xac067fe8, 0xd5a6f2af, 0xbd07d877, 0xd0208a03, 0x654be2f2,
  151016. 0x34b473f0, 0xf515e23e, 0xe67c102a, 0x2ac1af48, 0xb00dbf9d,
  151017. 0xb6a13d00, 0xe264fa41, 0x97e94c11, 0x1669786a, 0x86a586f4,
  151018. 0x09d8cf2d, 0xc7f927e9, 0x073bf869, 0x2241a566, 0xb8977880,
  151019. 0x22261334, 0x59a5bf59 },
  151020. { 0x81347191, 0xe9d1c91e, 0xeb969972, 0x186c1abc, 0xa9d46a7f,
  151021. 0x07888767, 0xdaa7d397, 0xda93cfcc, 0xd91b9aa0, 0x08bee9f1,
  151022. 0xf8dd3c6c, 0x8267fd78, 0x94228100, 0xf93860d0, 0xdadb47fb,
  151023. 0x6a6a71aa, 0xa6156f8a, 0x9caa06b7, 0x39848bc9, 0xaa1b05e0,
  151024. 0x2aaa9135, 0x36ddc237, 0xb13f3bd1, 0x77e7e079, 0x4acc5f4d,
  151025. 0x8d0b5cbe, 0x984cfd36, 0x04da45f8, 0xd3d3e0f8, 0xf14ef618,
  151026. 0x43eb799c, 0x467564c1 },
  151027. { 0xb6fff5d7, 0x8d725904, 0x92dc4752, 0x037f33af, 0x6d20b8aa,
  151028. 0x9095d575, 0x43baec39, 0x32235fc1, 0x68a2b9b0, 0xa2feb4af,
  151029. 0x94d35c61, 0x61c50318, 0xea877486, 0xac92b6a2, 0x011bc6f3,
  151030. 0x8eb48b15, 0xc79edcb2, 0xa28fe128, 0xa5d2a006, 0x9f71bc0c,
  151031. 0x2f15b850, 0xf3167732, 0x7a036218, 0xfe8d728c, 0x4f81e09e,
  151032. 0x068f39cb, 0x7b7c50d9, 0x1773f016, 0xed6a1e03, 0x0d0f7adb,
  151033. 0x4ee984d5, 0x8a0dee16 },
  151034. { 0x47366e6f, 0x504991bf, 0xe86c3005, 0xb8084d9f, 0xa40cce36,
  151035. 0x14c4c751, 0x3f1961e2, 0xbbb46aa6, 0x40445e43, 0x56a785f9,
  151036. 0xc91e215f, 0xdb8d1b57, 0xc7ee808d, 0x6a8e453e, 0xbbaa1e8c,
  151037. 0xc0367ef8, 0xe3e18109, 0x310d91f1, 0x7e20a2c3, 0xf97cfd0e,
  151038. 0x554cc277, 0xf1e80c84, 0x7b628403, 0xe89bbc1d, 0x3fe0a17c,
  151039. 0x7778a966, 0xc1f00073, 0x9e9db19f, 0xb6f6bed2, 0x2ce7fe7d,
  151040. 0xee97ce23, 0x7b04b5d2 },
  151041. { 0x82c5faf8, 0x5b546bc7, 0x8eb81097, 0x1a734c5e, 0xe77851e0,
  151042. 0x3d566861, 0xe956d51f, 0x833a1013, 0xc3c3c37c, 0xc7351731,
  151043. 0xe0c148ec, 0x607738fb, 0xe1bbef41, 0x2ec6f0bb, 0xcfa51857,
  151044. 0x0aa2ac6e, 0x66e3adf0, 0x072902d7, 0xc622d6e3, 0xcd4d5089,
  151045. 0xa6dd802f, 0x3ae21b23, 0x33886372, 0xe5465a55, 0xa8d81822,
  151046. 0xd85119a0, 0x3786977a, 0x4f14d032, 0x9c7b272c, 0x515b081c,
  151047. 0xc99be31c, 0x1c6a95a4 },
  151048. { 0xc2821363, 0xa6b14ad5, 0x4d17de1c, 0x829c1823, 0xccade848,
  151049. 0xaef5d2c4, 0x82489e27, 0xf412ab39, 0xf081d927, 0x92c9c098,
  151050. 0x75cbad1f, 0x6f87bdf4, 0x1a1d9fb1, 0xf4aadab8, 0xb75f3b76,
  151051. 0x475a7923, 0xdbbba8fe, 0x99dd0ad6, 0x4b70ab45, 0x836f6164,
  151052. 0x34bd9af1, 0x2a464881, 0xba9abda3, 0x5c91226e, 0xe65625fb,
  151053. 0x4cec8709, 0x0818e4be, 0xd4b3919e, 0x14f6879c, 0xa5c09c84,
  151054. 0x30a864c9, 0x72708a02 },
  151055. { 0xf34a466c, 0x4f33c0b1, 0x7f9d45ba, 0xa1bae09c, 0x0e28785c,
  151056. 0xd70f0fee, 0x90880881, 0x824c7146, 0xbb043da3, 0xe2416c2a,
  151057. 0xcec6f432, 0x733da713, 0xc9793e1c, 0x2b590649, 0xb35c9365,
  151058. 0xdb62d5b0, 0x3e5c1b2a, 0x355eb6e2, 0xbb16b515, 0xcfe8b5ce,
  151059. 0xf709691c, 0x9e081869, 0x61a85bd5, 0xc865f9fb, 0xfae103f7,
  151060. 0xf169d3cc, 0x73467e9d, 0x9525c473, 0x43695113, 0x7db55c0b,
  151061. 0x73265d21, 0x7491c74c },
  151062. { 0x80d2b94d, 0x312ed5bf, 0xba4b260b, 0x1b8ac633, 0xd62219a1,
  151063. 0xac86c58c, 0xaeb82c8e, 0x317ccf6b, 0x59ef9ced, 0x2dfb29ee,
  151064. 0xe42bcd5a, 0xdaa7d898, 0x5974b201, 0x93e295c8, 0xd9fc5adc,
  151065. 0x69e75784, 0x012aa3ba, 0xd6c4709f, 0xc85d3cb9, 0x1fda9f37,
  151066. 0xd3dd4abd, 0xe5487e25, 0x0b3ba22e, 0x00fd4b01, 0xc6e8dcbb,
  151067. 0xcb591493, 0xbce68664, 0xb7329fab, 0x68906b76, 0x6829d1c2,
  151068. 0x74176841, 0x8bcfd3e5 },
  151069. { 0xd3c8c314, 0x06882734, 0x11870833, 0x95f0b2f1, 0xc068ba16,
  151070. 0xb937f7c3, 0x77924787, 0x5365e0d8, 0x1f992227, 0x15527e5e,
  151071. 0x27dffd4f, 0x0a069648, 0x2f586389, 0xd58b3df2, 0x6af20ead,
  151072. 0x83446b89, 0x50746257, 0x09d7970b, 0x4022a691, 0xd9e8d206,
  151073. 0x671ec379, 0xd1e5f8af, 0x057fe91e, 0x6f542509, 0x52890418,
  151074. 0xf14dda81, 0x1db932ad, 0xbd78010e, 0x905a9378, 0x3e18d1e4,
  151075. 0xbd37ab49, 0x53cadcf7 },
  151076. { 0x5e53d0ff, 0x1bb5edf7, 0x888abf67, 0xd886606c, 0x12206d15,
  151077. 0x6491b0f8, 0xe22b6a33, 0xb3018345, 0xb173b317, 0xaba6794b,
  151078. 0x7dc9e595, 0x8c1e5867, 0x239624d1, 0x4e106482, 0xda55dd53,
  151079. 0x61752e59, 0x9e42879c, 0x018b4eab, 0x491f2bed, 0xcaf6784b,
  151080. 0x1e79429e, 0x3dcdb9d2, 0x10f26224, 0x36941485, 0xa650ec5c,
  151081. 0x106f190a, 0xb69a9760, 0x7542a5ae, 0xc32d1046, 0x69bd75e9,
  151082. 0xbf8c62b1, 0x90849964 },
  151083. { 0x5a93c661, 0xb1390cf6, 0x9db5f056, 0x18486264, 0xa51a1788,
  151084. 0x92a93a9d, 0x6772de9a, 0x1b0cbb8f, 0x7c71487c, 0x6e67febd,
  151085. 0x4e62423e, 0xf9b4382d, 0xbb5a42f8, 0x96fda50e, 0x6089a4f2,
  151086. 0xc921b337, 0x875ec516, 0x49d32d7b, 0xc410124b, 0xbd86d2ca,
  151087. 0xc421fb7a, 0xf6862209, 0xf6b7de33, 0x3e1949ab, 0xe93c9268,
  151088. 0xcdee18f0, 0x08dc4cc0, 0xd4edbd5e, 0x73580d22, 0xc2b75be4,
  151089. 0x468cd7e8, 0x3d7f6ffa },
  151090. { 0xdffbd5d1, 0xea7b290c, 0x970338df, 0x9d759da6, 0x90feedc9,
  151091. 0x56680b08, 0x42dce68e, 0xbc690af5, 0xb2ae4d82, 0x8519df2b,
  151092. 0x7f195b60, 0x5612467f, 0xd83c21f4, 0x659a342c, 0x55651633,
  151093. 0x55771bf5, 0x548ba562, 0x5fc68935, 0x9492f23a, 0xb5419203,
  151094. 0x9c9c6017, 0x567528e3, 0x511e6019, 0x3f064ed4, 0x1d16a555,
  151095. 0x303f9eb9, 0x2254abee, 0x3e18c4fd, 0xfd434e7c, 0x40994d6f,
  151096. 0x6dde74e6, 0x8fb12d3f },
  151097. { 0x293cb7a4, 0x6c6381a2, 0xb87b7e4d, 0x453e09f0, 0x078ac3ef,
  151098. 0x4f212823, 0x578cae91, 0xe89ffad0, 0x716ba4dd, 0x4a2b696a,
  151099. 0xf6f580a0, 0x14681a14, 0x4c2f1307, 0x1358f97b, 0x2932fb89,
  151100. 0x87896996, 0x268a5af7, 0x29dd850a, 0xfe239f83, 0xaf771f6d,
  151101. 0x4f47499d, 0x5f20fd2e, 0x867ca0e9, 0x9b643e77, 0x375981ec,
  151102. 0xe7858ecd, 0x19ab1c97, 0xbe946a59, 0x06ff3453, 0x4f9303a2,
  151103. 0x75d237b1, 0x3fcc6731 },
  151104. { 0xdf21f920, 0x509debd5, 0xc1401b90, 0xfaf70e1f, 0x95a64aaf,
  151105. 0x2429cbfd, 0x2c37a122, 0xf2120855, 0x7deb926b, 0x1d4c93f4,
  151106. 0x9fb3f1dc, 0x12f3e4c0, 0x5b51bc46, 0x56085a59, 0xf10fdbd2,
  151107. 0x2a2f5d62, 0xdf0cb3c2, 0x60dd62cf, 0x6b0f254b, 0x154424a3,
  151108. 0x564612b7, 0xc3a5a05d, 0xa1f5249c, 0xbebe30cf, 0x7e62a188,
  151109. 0x24ec6903, 0xaf429939, 0x75f0fbac, 0xb3fa8685, 0xd41345dc,
  151110. 0xc7151c34, 0x645146fd },
  151111. { 0xba1924f9, 0xecec633a, 0x006326e1, 0xbba6f136, 0x7e50fc17,
  151112. 0x203757ac, 0xef3d8e00, 0xca531919, 0x51dc5a74, 0x9545a6aa,
  151113. 0xd31412b8, 0x6e21d58f, 0x7bb1d000, 0x01bc3005, 0x6ed1a9c3,
  151114. 0xf1789c69, 0x9858fa48, 0x7af2d35f, 0x8197be85, 0x434d09b9,
  151115. 0x29aa265d, 0x1dc07755, 0xc058fa80, 0xcad03be7, 0x54ba14ce,
  151116. 0x92d70a9f, 0x6c050a74, 0x6dc78505, 0x4d005dda, 0x2a7ca4a9,
  151117. 0xabfb9f2e, 0x448d3d72 },
  151118. { 0x29b33989, 0xdc56f145, 0xa9ae815a, 0x868351bc, 0x4b074414,
  151119. 0xb3f45613, 0x3cd9f33b, 0x955ce42a, 0x5ff6e4a3, 0x13ade4ec,
  151120. 0xa50eaa91, 0xd3aac715, 0x5666efdf, 0x0c61ec99, 0xf6a4470a,
  151121. 0x108a28b8, 0xe54844c9, 0x402ef584, 0xd0e2f337, 0xb825b162,
  151122. 0xb46f7cbc, 0x3dcd131f, 0x96f2fd89, 0x208178ec, 0x25928c78,
  151123. 0x4d8c5d67, 0x9963c459, 0x285a33df, 0xd92a309f, 0x72497175,
  151124. 0xcb7019a5, 0x76881479 },
  151125. { 0x91767eed, 0xba43a114, 0x92bf65db, 0x5e11b9ad, 0x03a5e21a,
  151126. 0xe8a22ce0, 0x2a335415, 0x63604421, 0x4a9ead62, 0xc2c563b4,
  151127. 0xa0b2aee5, 0x4bc06264, 0x8bf2e1d7, 0x75b8d575, 0xd08a265d,
  151128. 0x1cff0ee7, 0xb0b712a7, 0x17914e1d, 0x4b18692d, 0xc35925d0,
  151129. 0x56cce815, 0xde253f4c, 0x9fff0e3a, 0xa479241c, 0xddabed19,
  151130. 0x50b9d06e, 0x59fae506, 0x67135260, 0x532ce180, 0xf37600fb,
  151131. 0x5e5a8626, 0x670eb01c },
  151132. { 0x73cdbb43, 0xdf73c0af, 0x7f2431ad, 0xcf08ecc5, 0x2a1a3845,
  151133. 0x91780541, 0x9224ddf1, 0x69a104f2, 0xbeac7eff, 0x4352f38d,
  151134. 0x7c2d1322, 0xfc3b3b4e, 0xb5e4b476, 0xa69e9430, 0x975a46f0,
  151135. 0x7d932340, 0x5d64eece, 0x8093899e, 0xdb2345e9, 0x7b821250,
  151136. 0x7f4b796b, 0x23552932, 0x4bb90b1f, 0x2ee9cc15, 0x9112f7d6,
  151137. 0x1fa9c8f5, 0x1cbaae32, 0x2d0f2f98, 0x0075166a, 0xb77f0366,
  151138. 0x635dff27, 0x504852e7 },
  151139. { 0xa2f392fa, 0x2f0f3ce5, 0xec6c9078, 0x326c076a, 0x84baaaf6,
  151140. 0xad01de92, 0xcbe8e993, 0xb01b16d3, 0x2d950908, 0x71305c24,
  151141. 0x3853af38, 0xc66fd617, 0xd3c429a0, 0x7735140e, 0x1fabf027,
  151142. 0x8a31b12a, 0x058b3177, 0xa0530002, 0xa9c7deb9, 0xabffd9fc,
  151143. 0xe8667d30, 0xd05ef69b, 0xe9a9e13f, 0x2f3a7308, 0xb91eae9c,
  151144. 0x3f4c9a19, 0x618ce6c4, 0x50d0cee7, 0x5240f8b0, 0xfb24dc40,
  151145. 0xf7e90cc4, 0x992fe151 },
  151146. { 0x38f197aa, 0x4454db31, 0x87872f98, 0xa4ded69d, 0x44f0a828,
  151147. 0x97b427b0, 0xa31e48c6, 0x9821e1ae, 0xdd98efec, 0xe38cb09f,
  151148. 0x480cb3ae, 0x20b84fa8, 0x47475573, 0xba5bb4a8, 0xcd50e96b,
  151149. 0xa9be080a, 0xef103550, 0xc4451e9c, 0xc441325c, 0x626ee75f,
  151150. 0x38a5e33d, 0x6eea5e98, 0xa2b0abd2, 0x7321beb9, 0x9b6082a9,
  151151. 0xca92e484, 0x992bcc2a, 0x1dc8168a, 0x9c8eb9fb, 0x134ecf4b,
  151152. 0x4c5b71e0, 0x5a68bfa8 },
  151153. { 0xff0a2bfb, 0xb4ff3b45, 0x5502f8b0, 0xd105fff9, 0x5b1c0c26,
  151154. 0x14de5885, 0x0d3b9d04, 0xed16865b, 0x026d3917, 0x2f5a2453,
  151155. 0xf4db3c0e, 0x6a22f493, 0xe2418f2e, 0x4871548a, 0x509bef61,
  151156. 0x6ab363a8, 0xb8cbbbec, 0x91ca1e3a, 0x4011a396, 0x71e0dc98,
  151157. 0x0d5ca577, 0xff982e0a, 0x81897bc1, 0xeb40b045, 0x085ad5e7,
  151158. 0x4bc24a46, 0xa6337b7c, 0xd15c8fa0, 0xbef1628f, 0x56ce6ef7,
  151159. 0x9f5ef439, 0x78acfdf9 },
  151160. { 0xf8520189, 0x45bf7f15, 0xc77f61c4, 0x954202a0, 0xdfa22e1b,
  151161. 0x39edc6b9, 0x1f4a3487, 0xd2d60267, 0x4814cc52, 0xcd933929,
  151162. 0x05e9f123, 0xde76a124, 0xae36b6f7, 0xe2306ea0, 0xb83a58e0,
  151163. 0x53815218, 0xa041231a, 0x9862bb76, 0xbf31be71, 0xe8da253c,
  151164. 0x37de861f, 0x2dfc5332, 0x90ae4890, 0xf25c93f6, 0x8baa6ed2,
  151165. 0x66bcb8f0, 0x908b4a29, 0x6f10ae0f, 0xb061c949, 0x8cb4b48c,
  151166. 0xd075a366, 0x0ad92d73 },
  151167. { 0xc2ca548a, 0xbfb95fed, 0x80cd89ab, 0x4778c620, 0x3466c280,
  151168. 0xbe99154b, 0xd4be8902, 0xea3be093, 0x13e681ed, 0x847b7995,
  151169. 0x02f40161, 0xf22a8f4b, 0x4aeb7fe8, 0x3ef2cb4d, 0xb3aed5f6,
  151170. 0x9adc5151, 0x98c31163, 0xec1ccfd1, 0xa3d7d88f, 0xdc2ac17b,
  151171. 0x46421097, 0x08fa64d3, 0x94b90bcf, 0x5ebf80b7, 0x0b50a9eb,
  151172. 0x1b78b4ba, 0x279aa66b, 0x1a4fe934, 0x075b3ced, 0x8ef4dcaf,
  151173. 0x70a6e9ae, 0x95bbd8a0 },
  151174. { 0xe614bbd0, 0x59f92495, 0xb823e363, 0x7567a887, 0xfc1bd6a7,
  151175. 0xe247c9ec, 0x8e835c42, 0x2bfaaf47, 0xaade066a, 0x314ef4e0,
  151176. 0x5c16d336, 0x072baa63, 0xe2f0e389, 0xfa429c71, 0xbd07d90f,
  151177. 0xcac1e5d0, 0x514f5c04, 0x69ff35ea, 0xc0554ec1, 0x893053fc,
  151178. 0x2a35947f, 0xab1d86b7, 0x2aebe487, 0xe29fb060, 0xdfb9cf21,
  151179. 0xa0a10d6d, 0xf20dfcf5, 0xad147059, 0xb8867a2a, 0x480dc66f,
  151180. 0xc125a919, 0x375a884f },
  151181. { 0x1217f7ea, 0x178cbe2e, 0x875c6dab, 0x1a161e2a, 0x1bdb1a54,
  151182. 0xf7707ec0, 0xe4fd73ca, 0x678864a0, 0xd13a0d86, 0xbaebc664,
  151183. 0xc8d30668, 0x40325f99, 0x2f1c5950, 0xb93ed9c9, 0x541e0667,
  151184. 0xfdf36763, 0xb91a6763, 0xfd97fbb0, 0x6079c9a0, 0x26aa69ea,
  151185. 0x1eaa8c47, 0xc7303c80, 0xafa63c55, 0xdec75c81, 0x4fd12adb,
  151186. 0x01cdcde2, 0x1968838a, 0x9fe0dda7, 0x38415379, 0x66bb093b,
  151187. 0x08cb84ec, 0x268d818b },
  151188. { 0x41580555, 0x73dae358, 0x473d103b, 0x4fc32e67, 0xbeccc1ab,
  151189. 0x240c1013, 0xb24ee9de, 0xda4099f2, 0x9fa8e066, 0x37b0cb5b,
  151190. 0x6438d7ee, 0xb5ae04e4, 0x2b720140, 0x7f7d3164, 0x339e4a78,
  151191. 0x86ef4edb, 0x3a7d8375, 0xa5e77eed, 0xbd707c2e, 0x883fad37,
  151192. 0x0f979189, 0x816b633a, 0x2e7a208e, 0xe24c028a, 0x4435516a,
  151193. 0x1171fe3c, 0x4f5f2bf5, 0x3eb93b33, 0x01b53a56, 0x8419ed4b,
  151194. 0x056ca44b, 0x8b02735c },
  151195. { 0xe1019195, 0xb89bb464, 0xf3fc28c1, 0x1de4c026, 0x2bfc3b21,
  151196. 0xac120e6e, 0x91bdf92f, 0xec71bc5a, 0x0d995bc9, 0x485d7ab4,
  151197. 0xe6491ffe, 0x97c6768e, 0xafbce265, 0xd9552d19, 0x8e1b76c2,
  151198. 0xbae6c7fe, 0xd7e3ad1b, 0x167d8281, 0x5e989734, 0x3e149af9,
  151199. 0x8a0c8182, 0xd1f0024c, 0xc3006c0d, 0xf571ffdb, 0x58773d4c,
  151200. 0xb32ecf7e, 0xfd3540d8, 0x5822a782, 0x04365042, 0x5ab45c3f,
  151201. 0x4b4d85fe, 0x400e3aa0 },
  151202. { 0x5e46e4a2, 0x47321649, 0x24136074, 0x37a2ed64, 0xc60ec77d,
  151203. 0x659223b1, 0xe5e0ac2e, 0x5e13aac3, 0xc5107ab7, 0xda17c41b,
  151204. 0x73c253db, 0x65b22ec9, 0xa5012296, 0xff3867b8, 0x0621a99b,
  151205. 0xfed660d5, 0xc89fc3f5, 0xa3c28506, 0xf16451a7, 0x3ed350b9,
  151206. 0x67cb586f, 0x27c3e032, 0x967185b1, 0xc807c779, 0x4a13009b,
  151207. 0x09c157d4, 0xadaf1f4d, 0x362f7647, 0xf3a6a198, 0x4a42b9ac,
  151208. 0x8da6e039, 0x131c3da2 },
  151209. { 0xa7da83ba, 0x4a785ff1, 0xd04f4436, 0xf415b425, 0xec03f812,
  151210. 0x7c0899bd, 0x80f5f4a2, 0xc58d411a, 0xfda251b9, 0x3d32d610,
  151211. 0xcd3b2f32, 0x99bb4504, 0xf4c2083c, 0x198c444b, 0x730e83fd,
  151212. 0x60c261af, 0xcb02db90, 0x060ca4df, 0x9df1e7c8, 0x0ff7838b,
  151213. 0xc4c690c9, 0x6b79cf97, 0x5d75f154, 0x131514d7, 0x1cb0e8ff,
  151214. 0xa7c074f1, 0xb2c17615, 0xb920aac1, 0x44aa0ff0, 0xde8098ad,
  151215. 0x34545ce9, 0x71d1a46a },
  151216. { 0xfa1b382e, 0x76178f76, 0x772dda0d, 0xa0d8ecc3, 0xc5d4d130,
  151217. 0xaa5aab2a, 0x8d72622c, 0x27d38ba4, 0xca3bed06, 0xc5410db6,
  151218. 0x793ceccf, 0xf637a588, 0x6e65e3d7, 0x1f65dafd, 0x60a45641,
  151219. 0xc3b44a85, 0x4f78540b, 0x0f47b3a8, 0x5e4d60f6, 0x824fdadd,
  151220. 0x17d3b6d5, 0xd8ccf90c, 0x325fc13a, 0x008eabdf, 0x3648fab9,
  151221. 0x3e90d716, 0x24c52d4b, 0x3964ff3a, 0x533d0acb, 0xb95cc416,
  151222. 0x1167f521, 0x6cd2699f },
  151223. { 0x12f4f3ac, 0x2d8c0b3b, 0x99d1bdfb, 0xb03dcfe2, 0x30f37326,
  151224. 0x540034f8, 0x7c5a8c82, 0x22dd6893, 0xcd8f1442, 0xeb7093d0,
  151225. 0x585742f2, 0x892795a7, 0x087adadd, 0xe15f282c, 0x16ab7b5e,
  151226. 0x7bbdc749, 0xa58acbb4, 0xd30fe40b, 0xe2bac39b, 0x0de417eb,
  151227. 0xc61a04bc, 0x4b4b19a6, 0xf2735569, 0x9338c34d, 0x30ab196f,
  151228. 0xe8f03742, 0x6c88c965, 0xfa2efcb8, 0xc7eeb826, 0x19eee274,
  151229. 0xda345dc2, 0x327c063f },
  151230. { 0x5b47cd53, 0xab399eff, 0x1943aefe, 0xbbe9869d, 0x1402a866,
  151231. 0xe64ecc7b, 0xb1c25a16, 0xc3e7c2aa, 0x022de271, 0xc4216b79,
  151232. 0x366d6a5f, 0xe58dfcc8, 0xda813336, 0xd159509e, 0x130bfb7c,
  151233. 0x370400f2, 0x93b48780, 0x1be4e059, 0x39f3cd22, 0x0623a1fe,
  151234. 0xeecb4f87, 0x72aa22b2, 0x6c27b83b, 0x1af4c496, 0xda5fa5bf,
  151235. 0x7a42a94b, 0x48b01af2, 0x9afba822, 0x3670112c, 0xeb6b9d2a,
  151236. 0xc0df6856, 0x020f19d1 },
  151237. { 0xa4dbba20, 0x37051a86, 0xdb1de5c5, 0xb618ebc6, 0xe6525840,
  151238. 0x9a780a19, 0xd2bccc4d, 0x9440302d, 0x10285a24, 0xe9ff023d,
  151239. 0x3a486268, 0x3b937ee3, 0x4cd61147, 0xe37ee2f2, 0xa3d057cf,
  151240. 0x79fbbfd3, 0xccddefce, 0x5fba16d3, 0x5b231727, 0x916058ec,
  151241. 0x720c3adb, 0x47699ebe, 0x8b4f6bba, 0x26274386, 0xf18a0770,
  151242. 0x54b0092a, 0xacca1160, 0x99d090eb, 0x0c888f60, 0xf757e1ff,
  151243. 0xb0050544, 0x79e72720 },
  151244. { 0x2820a239, 0x632acf25, 0xaae6b310, 0xb1a3974e, 0x48c0a1df,
  151245. 0xd61fd6ba, 0x5a3ee7aa, 0xd2453c39, 0xb980446d, 0x548455a0,
  151246. 0xde16676f, 0x9f29d97b, 0x789375a1, 0xf252ca0c, 0x7743a985,
  151247. 0xe961af3e, 0x66cdbd8d, 0x70c79c56, 0xcbc538f9, 0x14a3854e,
  151248. 0xa126851c, 0x58daa73a, 0x2a9f558c, 0xe9b5bb45, 0xfbd15e05,
  151249. 0x37af7f83, 0x38a1939d, 0xa4487927, 0x9511a056, 0xe428b2b5,
  151250. 0x7015846d, 0x001d3ce3 },
  151251. { 0xe145b1d7, 0xd6be36b9, 0x009c5664, 0xf3e3938a, 0xe7c0f6db,
  151252. 0x2e562e7d, 0xc343f539, 0x951044e6, 0xd90897b1, 0xa5ab62b8,
  151253. 0x512f797c, 0xb1a1f70b, 0x750f28e4, 0x91cdd754, 0xffb8165d,
  151254. 0xb4c80e2f, 0x594d02b3, 0x65ed39c7, 0x56833edc, 0xcc12a49d,
  151255. 0xf3693a18, 0xe73694bc, 0xfcd2c404, 0x34cc134a, 0x11d40194,
  151256. 0x071bd5fc, 0xfc585e46, 0x05759047, 0x790b7a04, 0xb3280360,
  151257. 0x40afc684, 0x4bb8c6fc },
  151258. { 0xfd0f8796, 0x3120e2dd, 0xb133c9de, 0x6968a40d, 0xa9369c6e,
  151259. 0xfea366c0, 0x6007273b, 0x37e5b6d6, 0x8cb81439, 0x39e4ecf0,
  151260. 0x9febc005, 0x487fe9cd, 0x0199b53c, 0xeb8af444, 0x293519eb,
  151261. 0x2f124e3b, 0xc82c9c16, 0x860c218a, 0x709dc590, 0xacd1d6f2,
  151262. 0x36d50529, 0x5696d545, 0x59120bfc, 0xc03f5df9, 0x10ffa690,
  151263. 0x99a3e88d, 0x6c432827, 0xd4f9cfa5, 0x9a135d89, 0x2e8fea9e,
  151264. 0xb6a77e78, 0x3699a881 },
  151265. { 0x1eb1c64d, 0x5bca3372, 0xf1d28154, 0xe9cf3a2d, 0x6537106f,
  151266. 0xb7e2e9b3, 0x4f7cbf4d, 0x06c17151, 0x2058b37f, 0xcbde416e,
  151267. 0x8834e9c5, 0x82c53a7e, 0xe9ac3a75, 0x94dbdfe2, 0xc5e67c02,
  151268. 0x795ec6cb, 0x1426a80d, 0x8c23c25f, 0x6a8d4f9f, 0xee2cd20d,
  151269. 0xd3b7c235, 0x838daa54, 0x3d7a4d52, 0xb9e08ec0, 0x781cb473,
  151270. 0xca9475e9, 0x5ec31caa, 0x7271f39e, 0x82535187, 0x1df08e9f,
  151271. 0x208aff8b, 0x4f3a4b03 },
  151272. { 0x1ed095f8, 0x0f7b8107, 0xda226d4e, 0x23e37fa6, 0xafb36d1d,
  151273. 0x8b0f9852, 0x07d8e311, 0xb114634e, 0xe3e0f16e, 0xb9634a97,
  151274. 0x421eec37, 0x2454bb9c, 0xd72b21c1, 0xb4ecd5db, 0x6df20d7c,
  151275. 0xf9603868, 0xdf86e0a2, 0x9f5359fd, 0x5ac488aa, 0xc43d54fa,
  151276. 0xd1049df4, 0x56d714ab, 0xb020607a, 0x13152b3e, 0x7a02325e,
  151277. 0x49be1c18, 0x52ae84db, 0x44f24f4a, 0x0b5a7b80, 0x9e525c03,
  151278. 0xa6d179fd, 0x6d874446 },
  151279. { 0xbe9a42f5, 0xd29d07aa, 0x3781ccc8, 0x1fd5316c, 0x9dc69ea1,
  151280. 0x71a75a6d, 0x88fee91a, 0x4e19e0df, 0xf8d44f12, 0x99c2b4dc,
  151281. 0x31ae94e4, 0x05f6df92, 0xcf28ccc2, 0x27fba876, 0xf57f7ceb,
  151282. 0x6e1a0f01, 0xf3fd3b74, 0xe03f1f34, 0x42c1d213, 0xa0edc4a7,
  151283. 0x7deb8580, 0x5caac270, 0xaf0848bc, 0x0f5d791f, 0x07ac759d,
  151284. 0x17f514ad, 0x904fc531, 0x95a39734, 0x7bb70f3d, 0x95a4aca9,
  151285. 0xff9c5609, 0x3cf384c9 },
  151286. { 0xce1fc9e3, 0x700506ba, 0x676b0399, 0x49721742, 0xe72bf7b3,
  151287. 0x2b4a1b8d, 0x79b209f7, 0xca8602a8, 0xce26a8e1, 0x90580b90,
  151288. 0xfe24f39a, 0x1ef339b7, 0x629362e1, 0xb6c5d991, 0x577b24f4,
  151289. 0x51174e1a, 0x05e451e9, 0xf380fcb5, 0x148321bd, 0xf4d97afb,
  151290. 0x747e5d2a, 0x099806bb, 0xbe99a608, 0x85525d65, 0xd455e820,
  151291. 0x264828d9, 0xd8560a65, 0x8c8c5405, 0x71030770, 0x3c67e73c,
  151292. 0xee73df26, 0x2b248850 },
  151293. { 0x8541159f, 0x2173cde6, 0x4fb410b2, 0x78224c18, 0x1f2ca1c7,
  151294. 0x07a28619, 0xa8b23e40, 0x52c207d6, 0xa6b2344a, 0x071a0210,
  151295. 0xb5ed2945, 0xdb0e587c, 0x810fcc6c, 0x6c56b8ef, 0x62d843b9,
  151296. 0x1248c58f, 0x74c66975, 0x4b90363d, 0xe66c66f6, 0x6348f7f2,
  151297. 0xc126bcbe, 0xb2f9d441, 0x73ce49e8, 0xac07f2a3, 0xe81b0df0,
  151298. 0x52486758, 0x1d4621d1, 0xa108b54d, 0x74414a1c, 0x17261ece,
  151299. 0x6a3ac215, 0x938b3bcc },
  151300. { 0xe4ded340, 0xa9e4a16b, 0x80e88036, 0x8e65fb2a, 0xdcd73acb,
  151301. 0x97089606, 0xaaa657a9, 0x1c3a0434, 0x49101b06, 0xf304fc58,
  151302. 0xda0bb64c, 0xe60fb61a, 0xf5542df5, 0x818c2aec, 0x56f76d5f,
  151303. 0x74020576, 0x92533d97, 0xb566b790, 0x74d6eb5f, 0xae4655e5,
  151304. 0xa55b44b7, 0x60f7a1b5, 0x93747ea5, 0x7970179b, 0xf2dace56,
  151305. 0x8ae7e0e8, 0x84e83c06, 0x98474607, 0x15307341, 0x24e8c9ed,
  151306. 0xd9e89d6b, 0x6cff58a5 },
  151307. { 0x03e51f68, 0x508c01b0, 0x1d2fe7d6, 0xe1d1f225, 0x09bd8805,
  151308. 0xf7998d0b, 0x03e415b7, 0x255e907a, 0x607d9798, 0xd148467d,
  151309. 0x9b453896, 0x055c3b1e, 0x809f50f4, 0x35001013, 0xd0233fdc,
  151310. 0xfbbb2fa6, 0xff1820b8, 0x0b680b0a, 0x38d317e0, 0xb1d404dc,
  151311. 0xccc8c7df, 0x133d5444, 0x6ec13f84, 0x7fa847e6, 0x046e2e48,
  151312. 0xc33f83d8, 0x4863b3ac, 0x3c627fc5, 0xeb936af7, 0x5f67f8aa,
  151313. 0x31b79327, 0x5fe4ac8f },
  151314. { 0x8b6f401e, 0x581aa4bf, 0xad5c7ed4, 0x05db12a3, 0x6fb07b4a,
  151315. 0x7b018726, 0x9c22bcd4, 0xfdd11f04, 0x69371c95, 0x5454a7d4,
  151316. 0x99a46eaf, 0x066c55fb, 0x7fef96d0, 0x18637c7c, 0x6b83e95c,
  151317. 0xbafc1d34, 0x00bb42dc, 0x55c38593, 0x34e7e712, 0xdd8dec2b,
  151318. 0xb184cee8, 0x69c9cfb0, 0x49a27864, 0x8dcc0c42, 0x2010f2e7,
  151319. 0x290d95f2, 0x6977a420, 0x86e254c9, 0xeb2abdad, 0x20931c89,
  151320. 0x121c0548, 0x81377164 },
  151321. { 0x9c5a8edf, 0x6266b25e, 0x1078a7ad, 0x6e1388c2, 0x4876eedf,
  151322. 0x5f02737d, 0x62744617, 0x242fa7f9, 0xb385382a, 0x3e2cfbd9,
  151323. 0x02f71bef, 0xbadad7b1, 0x677d0a92, 0x562abcfa, 0x51fdff34,
  151324. 0x573ebd17, 0x7c250c78, 0xd7f65852, 0xc47ca896, 0xe0cf16ee,
  151325. 0x67622c9e, 0x8ccd79b0, 0xf8f2c075, 0x31fc5882, 0xa6008515,
  151326. 0x9232b37e, 0x82e8c5ba, 0x4d7bb361, 0xd2f146fe, 0xbf24735c,
  151327. 0x9cd2db98, 0x79c280ee },
  151328. { 0xf2b48122, 0xbdcc8203, 0xb04ac48e, 0xa8c04916, 0x9fc4885e,
  151329. 0xacf064dc, 0x82c1001c, 0xab838997, 0x676de250, 0x7339e721,
  151330. 0x8e1ab820, 0x17aa5aea, 0x6bc14b2e, 0x24d28ca0, 0x816b6230,
  151331. 0x570c5bb7, 0xcee6b606, 0x6c51235c, 0x183eae42, 0x1b2bf89f,
  151332. 0x9c66274b, 0x3e3af3c6, 0xb51e38bc, 0xe0b04426, 0x73e40e3b,
  151333. 0x26dbc58e, 0xb5be5be4, 0x3f9dd578, 0x52c8f408, 0x9fd9f791,
  151334. 0xa9e3ff4f, 0x758073a4 },
  151335. { 0x8691ca22, 0x7d27b057, 0x13a2a1b6, 0xf206bfd6, 0xac795413,
  151336. 0xe84bd385, 0x75536607, 0xc5d18a2a, 0xc8a0e24c, 0x2e166de7,
  151337. 0x3c474dbd, 0x56d5750c, 0x1366843a, 0xdef444c1, 0xcf4b8432,
  151338. 0x14646e53, 0xa9fd9783, 0x4bc0d030, 0x297ee203, 0xbda4c824,
  151339. 0xfd7be6c7, 0x3d0b10bf, 0x08c7f3ff, 0x2d216476, 0xb4fd4c45,
  151340. 0x06e52599, 0x49e9e104, 0xfbab9fa1, 0x8661d32d, 0x9342a7fa,
  151341. 0xfaf66aa8, 0x3f3e3458 },
  151342. { 0x951597aa, 0x51ec35af, 0x49df64eb, 0xb677d4ac, 0x9bf4eff5,
  151343. 0x0276cd9c, 0x515a2935, 0x423eca49, 0xfd9bb9c3, 0x8a696553,
  151344. 0xede1f09c, 0xf99ee9df, 0x199e5f98, 0xb8fa2956, 0x35292c32,
  151345. 0xb7638758, 0xfc40e81b, 0x8734eddc, 0x65457d95, 0xd82d5e9f,
  151346. 0x30c78d2b, 0xc8ee323e, 0xc1433d67, 0xe77b2e4c, 0x3c8314ae,
  151347. 0x56d9f807, 0x2a0e2f63, 0x441eede2, 0x6c48295e, 0x1e9e17ed,
  151348. 0x34c294ef, 0x640d20c4 },
  151349. { 0x3284d513, 0x4e9a0b8e, 0xf315053a, 0x074c3545, 0x45acd52a,
  151350. 0xb36e7407, 0x1de50db7, 0xd80bdcfc, 0x2549fc46, 0x8d9d47dc,
  151351. 0x303f07a8, 0x29b6ef13, 0x6d4ad4c2, 0x4e461aca, 0xfc9f1b73,
  151352. 0xca8e351d, 0x57460e65, 0x8bc4094d, 0x0f32d367, 0xb6302b33,
  151353. 0x285742e8, 0x69a074b6, 0x876c29c3, 0xdfe52b11, 0x912bd17a,
  151354. 0xf39e4609, 0x349aa639, 0x8ee40d66, 0xc72e05c1, 0xb968902a,
  151355. 0xc0d92816, 0x0f9c1ca8 },
  151356. { 0x67433df3, 0x1ebbaab3, 0x15d3628c, 0xb6aa5347, 0x97f0c5cc,
  151357. 0x13a320d8, 0x65e408f9, 0x72c918cb, 0xd5373451, 0x4b638854,
  151358. 0x0b4dca09, 0x731399a3, 0x0a3b1326, 0xcf256730, 0x6608b388,
  151359. 0x5ea60dfa, 0x7b290dfd, 0x58ad74b0, 0xd7694f9b, 0x83202789,
  151360. 0xb6630fb1, 0x48593db8, 0xc65e3eaf, 0x3db47f70, 0x3e7263f8,
  151361. 0x63949c91, 0xe6e6ff33, 0x9b9acec6, 0x098a8240, 0x34bd9ba7,
  151362. 0x45d36ec5, 0x7e31c12f },
  151363. { 0x0dfd2dd7, 0xbe281d68, 0x24ab61d8, 0x1efacb00, 0x94431f97,
  151364. 0xb9c3005f, 0x959cb3bc, 0x660c8dfa, 0xcffbb406, 0xfdd5fc30,
  151365. 0x7969a10d, 0x7a4631be, 0xde13fd1b, 0x336e309e, 0xfc947076,
  151366. 0x76b3bfad, 0xdcc72223, 0xfa91925d, 0x156c4ee1, 0x741f0d73,
  151367. 0x0e2b3747, 0x4f64ee41, 0xefc4d93c, 0x86be92d3, 0xfc4fbb2e,
  151368. 0xc53b7e03, 0x337ca1bb, 0xac196cf5, 0x7e23ba60, 0x4de41a30,
  151369. 0x326d5357, 0x1a219c45 },
  151370. { 0xaa4db0bc, 0xfdcf7ef8, 0x7b6c9963, 0x2e231806, 0x3d8a192f,
  151371. 0xc2639067, 0xffdc7771, 0xc0cec2e2, 0xa2fc0edb, 0x997c8e35,
  151372. 0x82cc6043, 0x78e10ec1, 0x2b0c8120, 0xfd0de2cb, 0x69e57f8e,
  151373. 0x4d6c457f, 0x5b53f1c3, 0x953e69b2, 0xc4f89cb8, 0x422a330a,
  151374. 0x95566be6, 0x92ff2329, 0x437442d1, 0x73cd502d, 0xbea69403,
  151375. 0xf04ce590, 0xf8030662, 0x6ac1537e, 0xb6d0bf93, 0xe02bcf77,
  151376. 0xbc90192f, 0x17aaa999 },
  151377. { 0x8e55db2e, 0x0d3d5643, 0x3b946851, 0x835dee43, 0x5b88462f,
  151378. 0x1a1440e5, 0xea17e27c, 0xa6ff3b35, 0xdd95f7a9, 0x23f99c36,
  151379. 0xbdd672cf, 0x7217fdd9, 0xdd2045c0, 0xf400ac1e, 0x4ff06b25,
  151380. 0x94b55c87, 0x0e4a49be, 0x0a44a0e5, 0xb43b6813, 0xe8925e91,
  151381. 0x214f96c5, 0x78bedde1, 0x0f97fa97, 0x0f456a4c, 0xa5bfd267,
  151382. 0xa28fd86b, 0xbe7608ef, 0x3b4b2d8f, 0x226474bc, 0xfbd5ff8c,
  151383. 0xa5f3b24a, 0x6b282af0 },
  151384. { 0x6341a595, 0x78fc025f, 0xa445e28c, 0x591c38d6, 0xeb446842,
  151385. 0x72bd6e3d, 0x75547833, 0x3f9466d3, 0x083e16c4, 0x911414d3,
  151386. 0x95a7acb4, 0x145d9466, 0x8fd2fb64, 0x102ddf09, 0x0bfd87b1,
  151387. 0x2a2b2d2d, 0x59455088, 0x69e9be5c, 0xa80245de, 0xee378bf4,
  151388. 0xb2306b0e, 0x80b0bd68, 0xc2be9f3d, 0x76a545c6, 0x4802c245,
  151389. 0x429d167b, 0x2b412dfb, 0x13e64427, 0xee8d9762, 0xb664f529,
  151390. 0x54706ebf, 0x6d4f5d23 },
  151391. { 0x00ba9f88, 0x35c8f2b6, 0x7bb6d0bf, 0xfdc807e0, 0xb3b81e5b,
  151392. 0x0a126d42, 0xa7ac781e, 0x335ce6ce, 0xf37dcba6, 0x3e308e6f,
  151393. 0x63c96487, 0x028dca62, 0x8818434d, 0x72eba57e, 0x79b78a26,
  151394. 0xa9e3d59f, 0x2f07aea3, 0xd2f0a7dd, 0x24d05f74, 0xe0fe4678,
  151395. 0x0116deb6, 0xb2085170, 0x58f37580, 0x9c2a5e92, 0x74070bb3,
  151396. 0xe78bd7a5, 0xb9977d90, 0x551fc872, 0x40db81b4, 0x6eda93c4,
  151397. 0xd65d34ad, 0x4aaf0b4f },
  151398. { 0x3514c7af, 0x9bef2506, 0xbc181ead, 0xb09e7dad, 0x8fa3ec58,
  151399. 0xef3cae87, 0x173b8685, 0xd8dbfab5, 0x921d32dd, 0xb2490fc0,
  151400. 0x8bd9c466, 0x4eef386b, 0xa061dbdb, 0xc1cdd52f, 0x25bc04db,
  151401. 0x64de989a, 0x85728636, 0x06f9836b, 0x8be44aa0, 0x11a5a804,
  151402. 0x097018c7, 0x16dede4e, 0xb2c11fb1, 0x72aec577, 0xa721ecd9,
  151403. 0x144dade1, 0xd6ebf3a9, 0xf99c526b, 0x1c2e14d7, 0xa1d4165b,
  151404. 0x82bc6337, 0x8b2cbd39 },
  151405. { 0x8a52e991, 0x28ec1bf2, 0xcf9d42ec, 0x0ba202f6, 0xc634ea45,
  151406. 0x8307d130, 0xc5762b9c, 0x3fc257b3, 0x487c2a2d, 0xbd3298d1,
  151407. 0xa319488a, 0xca14f1a7, 0x06ba06d2, 0xc70ca93b, 0xee405e89,
  151408. 0x9aa3f4b3, 0x35deeae7, 0xcc64eeb3, 0x03bf1d4c, 0xd155f578,
  151409. 0x45616bfd, 0x041ec0b5, 0x086e33f6, 0x23df80e6, 0xf0243cf5,
  151410. 0x399a79c8, 0x874ccd58, 0x86c2824e, 0x8fc5c831, 0x220eeaec,
  151411. 0x7dbe3670, 0x57e28304 },
  151412. { 0xfbcdf666, 0x6e60b698, 0x8bebb1d2, 0xbdd06a99, 0x80498436,
  151413. 0x4044adba, 0x522bc88d, 0xd76bf75e, 0x28423b20, 0x655c4b9b,
  151414. 0x53398a72, 0x65c0f492, 0x0ca37601, 0x76d4f2b7, 0x2030fa5a,
  151415. 0x46989925, 0xb6054705, 0x96b37e87, 0x53de1b2f, 0xef96f731,
  151416. 0xad54ef05, 0x5ecbbc8c, 0xa93617b0, 0xeb289d0a, 0x7cba217d,
  151417. 0x3ac0fbd5, 0x19d4a2d7, 0xd0d3cb56, 0xc91d6063, 0xe8bee9d4,
  151418. 0x696ffda6, 0x4f12e037 },
  151419. { 0x15f1a610, 0x4ccfa422, 0x3786519a, 0x804a5c55, 0x73838134,
  151420. 0x1246a454, 0x4b284e2a, 0xfa15b484, 0x146d1320, 0x36464c65,
  151421. 0x70a8a0fa, 0xfb6ba88c, 0x93c4804e, 0x74e7cee7, 0xb95ae16a,
  151422. 0x8c34d22c, 0xf9c1d4dd, 0x9d9ed89f, 0x32025371, 0x61a0866d,
  151423. 0x9bd6444a, 0x45b232b2, 0xf277bab1, 0xf888e92c, 0xa9448b02,
  151424. 0x73e69c6e, 0x5b521ecb, 0x1a496ea9, 0x5858afb2, 0xa8f78ea7,
  151425. 0xb1266f91, 0x83d2333e },
  151426. { 0x67b478d7, 0x1c633288, 0x50a2fc9c, 0xa1ee1ae1, 0x18d2241b,
  151427. 0x05b6ab30, 0x893cd696, 0x69f1f288, 0xa8117a87, 0x159d6660,
  151428. 0x70e73d77, 0xe8120119, 0x93f55f0a, 0x528fef00, 0xd854dfb2,
  151429. 0xb3978db8, 0xf45d9fbb, 0xd6b43ef6, 0xd5bee397, 0x17de4bfe,
  151430. 0x6bf76dad, 0xa01e0f59, 0x3d40754c, 0x28b2280e, 0xf8e86ef3,
  151431. 0x8edb6122, 0xb7d1e586, 0x8226b6af, 0x2f40a55b, 0x46353215,
  151432. 0xc5a31621, 0x7362f13e },
  151433. { 0x73c0c430, 0x792eb27c, 0xa51c3657, 0x8cc0a65f, 0xd2194f1b,
  151434. 0x50a5cece, 0x814b4947, 0x18945688, 0x4b6fbbf4, 0xbbf0a81a,
  151435. 0xf0aa8608, 0x376f4f58, 0x3987795e, 0xd9361d68, 0xe3a8d0d5,
  151436. 0xb6510cd8, 0xb6c1a455, 0x63e2fdbf, 0xaec891f9, 0x2c91154e,
  151437. 0xff568f64, 0x0eb1e715, 0x2f2b399e, 0xe7af9cd7, 0x89f0bf0b,
  151438. 0x1fc39bac, 0x90983695, 0xf0861d92, 0xda0a20a8, 0xd9b16f02,
  151439. 0xa38c0ead, 0x2f10693f },
  151440. { 0x0c06ded2, 0x07a6ce91, 0x2fd9087b, 0xf974842f, 0xa9f635a6,
  151441. 0xe468bfd6, 0x1ed60626, 0x04b61891, 0x369ee548, 0x1fb2f89f,
  151442. 0xdc96a201, 0x9cbd1113, 0x10d633ac, 0x6759acfe, 0x8faa629e,
  151443. 0x64ba66fc, 0x47f38283, 0xa686ae49, 0xd59cda99, 0x828c3a05,
  151444. 0x08ea2f6e, 0x7c7afb14, 0xaf3953c8, 0x2551c8e4, 0x9daa9e4f,
  151445. 0x5b53d279, 0xad6f1940, 0x1eff68d4, 0x96437cdb, 0x2775dbdd,
  151446. 0x4fe7a043, 0x985f83e4 },
  151447. { 0xeaf45294, 0x89603c16, 0xc24b5751, 0x70131160, 0x39d6b52d,
  151448. 0x4c112018, 0xed943340, 0x7079cf02, 0x74f41b68, 0x0c5b028b,
  151449. 0x9c8ac1e1, 0x3dc3f076, 0xf8b24f0e, 0x5ac5eea3, 0xe34c5c22,
  151450. 0xee6684ba, 0x9abc452a, 0xa5259e63, 0xe9df45cc, 0xb07d2cd1,
  151451. 0x1a443cfa, 0x07019c93, 0x92c003b3, 0x68fddaa9, 0x0d8cbc2e,
  151452. 0x2d9f179c, 0x1e781ca7, 0xbbf15a6f, 0x50dcc799, 0x54d779d5,
  151453. 0x0fe962f1, 0x0c88e540 },
  151454. { 0xe8f44357, 0x84f71a6a, 0x3a3cab6a, 0xf75b4bf6, 0x5aebc680,
  151455. 0x334c9d9e, 0x8a753ef2, 0xcecaf084, 0x075e3c8e, 0xe28014c1,
  151456. 0xf74f8d3a, 0xbb9d5a38, 0xb80e32ae, 0x75988464, 0xf2bc3792,
  151457. 0x7b328e6f, 0xeed0e197, 0xebbb1faf, 0x5a33065a, 0x674eac95,
  151458. 0x922dbce8, 0x8c19fd8f, 0x987b907a, 0x8c17ae85, 0x3b3a2cd7,
  151459. 0x89f33627, 0xfa87772f, 0xebaea019, 0x3a25ced6, 0x4e5de499,
  151460. 0xaf110715, 0x8e2560b8 },
  151461. { 0x3141aba6, 0x56d3746c, 0xbab2cf9e, 0x45a1079f, 0x9cdd27c7,
  151462. 0xb6382831, 0x9dfd950e, 0x22237632, 0x3a9408ff, 0x1e0b15cd,
  151463. 0xb1160118, 0x49a80200, 0xa383bba7, 0x2719db5d, 0x651046d5,
  151464. 0x6078340a, 0x97523b1f, 0x8929d4de, 0x8e0a28ab, 0x4040345c,
  151465. 0x0adf09c7, 0x61275ac2, 0x2331d611, 0xb41ab265, 0x5391ca50,
  151466. 0x230cc77c, 0x8f922315, 0x88be0c92, 0x92fd9a29, 0xfef3d92b,
  151467. 0x8324f2e5, 0x59005f22 },
  151468. { 0x3c4c1c74, 0x6bb1750c, 0xe966fb79, 0xbe73aac0, 0x66c5973f,
  151469. 0x85a75d92, 0x3a8656b6, 0x8c97f932, 0x50446cde, 0x2b7043b1,
  151470. 0x3ff3897f, 0x548916f7, 0xb18b72b2, 0x913dd01c, 0x488c0de6,
  151471. 0xd0a751f1, 0x8558ca58, 0x19175714, 0x44a663da, 0x97714301,
  151472. 0xb0e08618, 0x2df190ac, 0xf39ead9c, 0x0080fc0c, 0x17382da1,
  151473. 0x0085ac6e, 0x3262a338, 0xe9791851, 0xb43bae8d, 0xe4495936,
  151474. 0xd783df6e, 0x57a78e26 },
  151475. { 0x40dbddd8, 0x161b346f, 0x9410c3ac, 0x2b49a927, 0x1886cf3b,
  151476. 0x8c542783, 0x33b93deb, 0x72df3232, 0x40df579d, 0x9c8d59f5,
  151477. 0xc20ef500, 0xe5d7a67d, 0x67f08643, 0xc46b3918, 0xad96adc3,
  151478. 0xecfa2445, 0x0c4544d0, 0x658f589b, 0xe08417d7, 0xe6ec9301,
  151479. 0xc454e288, 0x6ca5ef6a, 0xac0f462d, 0x4191048f, 0x08d8a036,
  151480. 0x852407d8, 0xf6d35b7e, 0xb4c533a7, 0x8f6ada87, 0x3251e412,
  151481. 0x81c472e8, 0x1ca370c5 },
  151482. { 0xa801b68a, 0x94bd5171, 0xfd1998b3, 0x7312879c, 0x41163202,
  151483. 0x4905aabf, 0xf5b01fdb, 0xb5fe87f4, 0x9cda128b, 0x78de523a,
  151484. 0xc7bd31f7, 0x0bf161a1, 0x23904c35, 0xb5decfd0, 0xe188f12d,
  151485. 0x224b2882, 0xf99dae74, 0x0dd2801d, 0x08cd1cd2, 0xcad467b5,
  151486. 0xc0867e39, 0x6c311c3d, 0x2b425072, 0x71a11720, 0x2efd9003,
  151487. 0x83bf464e, 0x1dbd3b03, 0x53d0448a, 0xe6265baa, 0x32db52f4,
  151488. 0x4c33ac79, 0x2584b34c },
  151489. { 0x2aeec688, 0x3cb86389, 0x45fbe523, 0xa5e740ba, 0xfd60b5f8,
  151490. 0x422e71f7, 0x4874913d, 0x455d185c, 0xfa17d80d, 0x04c2bb36,
  151491. 0xac054524, 0x3f271854, 0xa8b9a657, 0x76dd3045, 0x62ee7cc8,
  151492. 0x2e42c3e1, 0x4df6c7d0, 0x00266706, 0xdc7cb488, 0x5927dd51,
  151493. 0x187897e0, 0x6b3faabe, 0xf2d5737c, 0xfe6ad22e, 0xff51a9ff,
  151494. 0xafb60269, 0x69807baa, 0xe1c83545, 0x951ca49a, 0xacddb6ff,
  151495. 0x3f9ab085, 0x7e811374 },
  151496. { 0x830a88b1, 0xad722a8b, 0xce1117e1, 0x91918ea8, 0x0409b47d,
  151497. 0x3e02d0b8, 0x6c46d1d3, 0xb53812d3, 0xe589669c, 0x2fd09db0,
  151498. 0x15b0cd5e, 0x9845cd06, 0x2386c453, 0x0c1c155a, 0xf5ff43cb,
  151499. 0xda774de5, 0xe391c0cd, 0xbb076b98, 0x5004f286, 0x97d71eff,
  151500. 0xaeec0bfe, 0x23e0b46c, 0x32a1ad94, 0xe4538667, 0x396da422,
  151501. 0xfe0c9f81, 0x63db2bfe, 0x6376c1a2, 0xba56fa91, 0x001c7918,
  151502. 0xdf8485a6, 0x436b8c64 },
  151503. { 0x8ab764bc, 0x88117e9d, 0xa077df84, 0xdfa61e94, 0x0c18eebd,
  151504. 0x5a7765d3, 0xfc9451dc, 0x548916af, 0x071a347a, 0x01a52e33,
  151505. 0xb23b41df, 0x633b95de, 0x43c8c286, 0xdd7d68c9, 0x18d97068,
  151506. 0xe4f9d41e, 0x8c92799d, 0x79908b90, 0xd47394a3, 0xe614148e,
  151507. 0xcd51e53f, 0xe5018517, 0x0243dcb6, 0x5060075e, 0x17954405,
  151508. 0xe5dcde62, 0x537da5ff, 0x6f7c90e1, 0x0768cb66, 0x1df7aae4,
  151509. 0x6dbe95e1, 0x5266ca9e },
  151510. { 0x1386b3db, 0x84ddee6d, 0x7c38e540, 0xf9e4af5a, 0xeb04f49d,
  151511. 0xb3418440, 0xfde5a4fd, 0x2138a1e8, 0x30257cfc, 0x3e6e6924,
  151512. 0x19fd70c1, 0x3519c6e3, 0x86c31ff0, 0x8f34e174, 0x940ce1e8,
  151513. 0xf1e298fd, 0x14960d7c, 0x6fb8cb1d, 0x2b2f3bff, 0x207c1347,
  151514. 0x146ef8ff, 0x899a20b4, 0x7bd3e220, 0x7dec362b, 0x626bea27,
  151515. 0xa975044e, 0x4fb4cb67, 0x0f32b449, 0x1fc6703a, 0xc17a0920,
  151516. 0x9cd84a2b, 0x41f325b9 },
  151517. { 0xce2843a4, 0x312ed513, 0x00728afc, 0xe748498e, 0x4d864ce5,
  151518. 0xa8ef2822, 0xa620083b, 0x34064704, 0x4bed338d, 0x5905e1d9,
  151519. 0x063e7b38, 0x2a578cb5, 0x289e7bb9, 0x98276d96, 0xf17b7341,
  151520. 0xdfe2dc47, 0x1dac8944, 0x5923521f, 0x23400aa7, 0x3db6d28d,
  151521. 0xa761ba43, 0xc647705e, 0x9bfd07dd, 0x8947ba6d, 0x242ca8fd,
  151522. 0x00f2e3ac, 0xeb8c3468, 0x49ef4670, 0xd9aa18fd, 0x7db3d37b,
  151523. 0xe58cea9e, 0x56b30fb6 },
  151524. { 0xcd80a428, 0x07ecdcaa, 0x8732c891, 0x7af922dc, 0x3ada441f,
  151525. 0x20d88798, 0x924b008a, 0x3bed9a44, 0xb2e81c3a, 0x2123533c,
  151526. 0x65f807d3, 0xc34e4075, 0x1f2faecb, 0x0bfaefa5, 0xade8a88d,
  151527. 0x78b634a5, 0x94392a91, 0xc4e0b7f8, 0x90bb1cd8, 0x30922377,
  151528. 0xf87204ae, 0xdea9b4fa, 0x85d3cd83, 0x3edf81f5, 0xc6523a79,
  151529. 0x58f88c51, 0x17c0d969, 0xe472fb8b, 0xdccf7f07, 0x899081e5,
  151530. 0x58bdd146, 0x1353cc57 },
  151531. { 0x39bf6e18, 0x28a56497, 0x649b89c7, 0x59e8b5a2, 0xdce8b8e7,
  151532. 0x8d9434a0, 0x2047040c, 0xd935bf51, 0x6a7b8e82, 0x2ab3a164,
  151533. 0x27f81294, 0xf1583ed6, 0x72d67297, 0x8416a7e0, 0xcd39e42b,
  151534. 0x49685d86, 0x958ddbad, 0x8a797fc7, 0x155ce6de, 0xa558f928,
  151535. 0xf8a36235, 0x75f4e570, 0x52877ae5, 0xbc69cfc0, 0xa6b16ebd,
  151536. 0x8f4193a9, 0xbb1cc1f1, 0x8d1df43c, 0x5a21e789, 0x723a830e,
  151537. 0xf451df58, 0x3ec2185d },
  151538. { 0x1f0bc2d7, 0xb9d4c7d7, 0x6e51d412, 0x6982c6cc, 0xa09f80f6,
  151539. 0x92e02d93, 0x047ae09c, 0xb7dd2d25, 0x37f351f9, 0x3503149f,
  151540. 0xc77850be, 0x69d49ce1, 0x12f0d2c8, 0x60242acb, 0x7bc28b9d,
  151541. 0xba188c56, 0x06bc0550, 0x8e406121, 0x8d7d4329, 0xb0d84b1f,
  151542. 0xd38951e0, 0xb4a67ae7, 0x8bc97607, 0xb527c57b, 0x5497aa72,
  151543. 0xbc93c5f3, 0x39bdd666, 0x5f1de8cc, 0xe9d447a3, 0x3087dc5c,
  151544. 0xa211abe5, 0x89b356b6 },
  151545. { 0xdfdcc837, 0xed6db0af, 0xa871b7a9, 0x0fb80baa, 0x1c1d4b72,
  151546. 0x413abfc9, 0xadac9e5c, 0xf5b56bf7, 0x8b8657a3, 0x5664a2da,
  151547. 0x0e41d94e, 0x11b04f72, 0x37433658, 0x63e11d26, 0xf426daea,
  151548. 0xee628ece, 0xcb162dc2, 0x011619c9, 0x87648643, 0x9cf5817f,
  151549. 0x5584bc86, 0xe1bb9702, 0x00bf7928, 0x2cc27cef, 0xdc60eee5,
  151550. 0x4ef3a80e, 0x87adc2f9, 0x7e1202be, 0x8a0d4f52, 0x656f18e0,
  151551. 0x57c5d126, 0x39c4f10d },
  151552. { 0xe88aecd3, 0xb3a9b68c, 0xa518aa9d, 0x555b0918, 0x4bd4ee54,
  151553. 0xedc1cdad, 0x02068d84, 0x79b68b67, 0x811ac72d, 0x7dac80d0,
  151554. 0xa81a0a78, 0x6d1e6d35, 0x3bd16283, 0xc841e9ea, 0x894c4444,
  151555. 0xa7bc1775, 0xf1aa1202, 0xf2b63725, 0xc7d4c556, 0xbec7767e,
  151556. 0xd46ff51b, 0x2817ebb3, 0x73f7e339, 0xfde5be8d, 0x5aed24c4,
  151557. 0x44c6c977, 0xb6e579cf, 0x0b9a1707, 0x9069fbcc, 0xcff16478,
  151558. 0x49152b00, 0x414b542d },
  151559. { 0x606e173b, 0x33c31e58, 0x90e6713a, 0x5b7f4e1b, 0xdebb20af,
  151560. 0x425fb512, 0x05120e70, 0xc788c617, 0x9013e4ec, 0x3ef05602,
  151561. 0x81c6e6d7, 0x9f9d35ac, 0x9450690a, 0xe131e88f, 0x44af082e,
  151562. 0x708f9b32, 0x1ba2aea9, 0xb2e4d66c, 0x740db29c, 0xaf1f4a6e,
  151563. 0xd1843007, 0x74ab9248, 0xed556a6c, 0x13338ef8, 0x270d17a6,
  151564. 0xf48e623e, 0x9608f5bf, 0x3c7362fa, 0x444e8515, 0x43977874,
  151565. 0xe00b8b2a, 0x52678d6a },
  151566. { 0xdf36aeb4, 0x5dff1c59, 0xa92bc0ab, 0x52d6653c, 0x927a5f81,
  151567. 0x0e03f496, 0x2dfd491f, 0x8509d414, 0xa571f89b, 0x258c2c52,
  151568. 0x93334485, 0x2bd61804, 0x3f7d9e09, 0x1a33e94f, 0x2c1bf906,
  151569. 0xfab418d3, 0x5aa5695c, 0xf39c490e, 0xf6d2d7ff, 0x0e41196e,
  151570. 0x0f7948a9, 0x3ecd4075, 0xd3053b4f, 0x4b58f9b2, 0x5d9974c9,
  151571. 0xb8ee842a, 0xbf22f682, 0x23a59c1d, 0xc8efcea6, 0x045ac614,
  151572. 0xc10ceedd, 0x7040ba5b },
  151573. { 0x515a1a96, 0x2c364f81, 0x184327e0, 0x31a63503, 0x1ad93d4f,
  151574. 0x0a096650, 0x273b6173, 0x9d7694f1, 0xd2cda9d2, 0x8886d876,
  151575. 0x2814c177, 0x1e01a742, 0x8667696b, 0x3492276b, 0x5b25f006,
  151576. 0x2fd4f0c6, 0xfb294c4a, 0x6527349f, 0xde1d336f, 0xc1fe0d8a,
  151577. 0xe7e3860e, 0xaf9a23e8, 0xb774c31e, 0x97d2b721, 0x4365784a,
  151578. 0xfac3e582, 0x70f4eaa3, 0xff2dff4e, 0xfe873248, 0x3d281e1a,
  151579. 0x0bd1c9c1, 0x9043a6d6 },
  151580. { 0x766c7937, 0x1511a0fe, 0xabbc3be3, 0x1b2ded5c, 0xe00888ac,
  151581. 0x2ac160cc, 0x616200f3, 0x928754bd, 0x34a2ea06, 0xb801c83d,
  151582. 0x9cbe106f, 0x8ad7a03a, 0xcedfcd94, 0x996b0822, 0xe4069880,
  151583. 0xc3c3463a, 0xf597f663, 0xfb12ea4d, 0x40c92af9, 0x2c8d3834,
  151584. 0x4e8da154, 0x79bc85c6, 0xdb4e801a, 0x95771fa2, 0x1e3579b2,
  151585. 0x7bd2c138, 0xffaad078, 0xe45c75df, 0xb73eac46, 0xb0760a3c,
  151586. 0x3a125f35, 0x26362b48 },
  151587. { 0xeefc3e89, 0x25c68d28, 0x69e9ee71, 0x2d0ee877, 0xaf5e4b75,
  151588. 0x8b07bb86, 0xcb86b333, 0xdb709072, 0xff552bac, 0xfd3d20ea,
  151589. 0x4c0da1e9, 0xa5eeb2b1, 0x44f97145, 0x391f688a, 0x1e06d485,
  151590. 0x21fbd310, 0xbea9cd49, 0x45e4f2a5, 0xa7bf21da, 0x7b60d464,
  151591. 0x054d5471, 0x193f88c8, 0xbee0f2e9, 0x5ace53d1, 0xc1439273,
  151592. 0x92c26563, 0x96c6b5ee, 0x9c86e0b2, 0x09ff59ba, 0x452fe231,
  151593. 0x555c935e, 0x2e952b20 },
  151594. { 0xd75f886e, 0x2a846bca, 0xd43dfc58, 0xe68a5dbe, 0x007b1b86,
  151595. 0x103e45b6, 0x355ff2b5, 0x580e2ec9, 0xa263ecc9, 0xbc702f26,
  151596. 0x181e5e33, 0x2835b386, 0x6c122076, 0x025113ec, 0x7fbd856d,
  151597. 0xa5c26e3a, 0x9d6ebcb1, 0x8ef83fb3, 0xa44d2fa8, 0x7aaa53f2,
  151598. 0x53b1fa97, 0x7c14ef33, 0x17559a30, 0xff604a11, 0xb09377e0,
  151599. 0x2bcd96b0, 0xdb2f0273, 0xa5c14896, 0xeb53ef06, 0x1c0a84c9,
  151600. 0x30378e4b, 0x1236d017 },
  151601. { 0xc084373b, 0xd7481c8f, 0x646097ae, 0x29ae4768, 0x613bc34b,
  151602. 0x1300dfa0, 0x934bc2b0, 0x3712714c, 0x0e2be7e2, 0x86524629,
  151603. 0xed010800, 0x554fbb9f, 0x42314576, 0xf0ec0b38, 0x330a3282,
  151604. 0x65baf594, 0x706ef817, 0x3bdde1a8, 0xba7530e9, 0x7d2c727d,
  151605. 0x74cc95cb, 0xbb0c5d66, 0x2438906d, 0xb3fcd365, 0xd14658f3,
  151606. 0x19881941, 0x6c97f0e9, 0xe616f555, 0x4b9ec7ea, 0x353c2d85,
  151607. 0x620cb56e, 0x02a48014 },
  151608. { 0x506ccd38, 0x11d6d23d, 0x9059baa6, 0x229a1c54, 0x69d011c5,
  151609. 0x717c9c27, 0xd828937d, 0xe87e1b46, 0x83835083, 0xf5d63bbb,
  151610. 0xaadac258, 0xf0a7b427, 0x9f154d1f, 0x99ab26bd, 0x8ec955fd,
  151611. 0xdec0ffbf, 0x49fcb880, 0xee957c67, 0x1e0114de, 0x32395dee,
  151612. 0x369f46c7, 0x192a64b7, 0x91eb2599, 0x43044660, 0xa2e8c3da,
  151613. 0xbe2da887, 0xc3556d18, 0xa44e2c25, 0xb55f75f3, 0x31390414,
  151614. 0x8f217fe0, 0x1d8bde6f },
  151615. { 0xa2028924, 0x03cd39f8, 0xb06ecb9f, 0x6e54f19c, 0xd6f05846,
  151616. 0x862bbcb7, 0x5a060776, 0xdbe06716, 0xb10fec10, 0x9397c97a,
  151617. 0x6f1bb65c, 0xf4213826, 0xa672ba38, 0x414deccb, 0xf88b05e6,
  151618. 0x594d4d43, 0xac94d4d1, 0x7993f57a, 0xbfb17638, 0x74fc2a6a,
  151619. 0xb6fc655a, 0xd8196b5b, 0xee8d2139, 0xdc375c84, 0x360d3a26,
  151620. 0xb9b00a02, 0xdeb93b87, 0xb36ed35c, 0xcc83209e, 0xf565b28b,
  151621. 0xc61013c1, 0x349c6943 },
  151622. { 0x4de6c88a, 0xd1b39444, 0x4700207e, 0xd5c2c471, 0x21c2b780,
  151623. 0xb6f458a2, 0x0850993e, 0x749f7564, 0xbaef0c18, 0x400ba579,
  151624. 0x737c70f0, 0x2d742938, 0x21467ebf, 0xc5a8e2ec, 0x5337f453,
  151625. 0x243a666e, 0xed0bd50a, 0xc991f1c7, 0xf4bd1f91, 0x3a7f3e90,
  151626. 0x5f0e129b, 0x96089e8a, 0x07389635, 0xd0d3a177, 0x27182ac9,
  151627. 0x9cf842d5, 0x0817c5c2, 0x21195299, 0x87255769, 0xa32f327e,
  151628. 0x89c2d8fa, 0x056587ab },
  151629. { 0x1ce4733d, 0x008562ed, 0x98e51444, 0x5faff7cb, 0xa9ab46b9,
  151630. 0x5f03021f, 0xb61a8c13, 0x89494c5e, 0x36b35976, 0x57c95036,
  151631. 0x2ac2d2f6, 0x6be84c8f, 0x9bd2703e, 0x0e5b34d8, 0x7e872abb,
  151632. 0xc4ad918f, 0xc4052ee1, 0xc2a89e9f, 0x3190b51e, 0xc2caee3f,
  151633. 0x6fff254f, 0x58fd1437, 0x883e0972, 0x6f3c0d68, 0x0fb15438,
  151634. 0x63d0a0e9, 0xf6caae00, 0xc438764b, 0x3f1d0f6c, 0x815f1565,
  151635. 0xb86cdbde, 0x1b87f2ed },
  151636. { 0x2b0b15b1, 0x35792bbb, 0xce6ba779, 0xa3e4b5a7, 0xdd8f3779,
  151637. 0xfbacffd9, 0xc298d1ef, 0x005450bd, 0xc47031c6, 0x0e3f5556,
  151638. 0x95d68066, 0x0770f07a, 0x2d1052c2, 0xce3e84e0, 0x7aa8cc54,
  151639. 0xb050791e, 0xba3223a3, 0x4d621e73, 0x39632990, 0x87b9b94d,
  151640. 0x7eb8056d, 0x8df9cb47, 0xedfca0cc, 0xe2430de8, 0x9712a0ca,
  151641. 0x374bf416, 0x88848a99, 0xbe3f3c77, 0xc4a3e59e, 0xb22b87b1,
  151642. 0x3e95bc23, 0x8e0227c4 },
  151643. { 0x3210964d, 0x000e22a8, 0xff056eeb, 0xdccd5df5, 0xdaf1ead7,
  151644. 0x02173a1f, 0x67cdcae3, 0xd02833e0, 0x8bdcc90c, 0x1cc574cb,
  151645. 0x3224b4f5, 0x86eca714, 0xbb3f8298, 0xd00e603a, 0x0c1a8deb,
  151646. 0xb98ece1b, 0x378c261d, 0x228a46e4, 0xa6165e5d, 0xc6f9dd0d,
  151647. 0x4b7ef0e2, 0xb3ae3899, 0xbda9f306, 0x3a3c16b3, 0x38a084db,
  151648. 0x5e9a26d3, 0x5394e950, 0x528e5993, 0x4ea206bc, 0x848ecb11,
  151649. 0x40545d6e, 0x14b15ab5 },
  151650. { 0x664c59a2, 0x0f6d86c9, 0x60fd7aa5, 0x3dfe2be1, 0x9072cb8e,
  151651. 0x33f9b569, 0x8176a7e0, 0x5f2325d9, 0x4587080b, 0x79a0d4e7,
  151652. 0x0d5d4e05, 0xa4ee0def, 0xc87b28e1, 0xc0ad9ffa, 0x3f09b4ee,
  151653. 0xd6f18d2f, 0x292e9d87, 0xcc896ae7, 0x6094763c, 0xca88953d,
  151654. 0x18fbf9fa, 0xdbee97a8, 0x4b63d701, 0xdf20e0e9, 0x47ea722f,
  151655. 0xcbba6e30, 0x612b571f, 0xce57e1ca, 0x009a55f5, 0x1e16ac76,
  151656. 0xc4389e2e, 0x742bbed8 },
  151657. { 0xc1dc2c73, 0x23ea86dc, 0xc1643abf, 0x4bbbfd5b, 0x24d8ca1f,
  151658. 0x07f8fa1f, 0x8cb5cac7, 0xde68a6e0, 0x54e66a7d, 0x7d54c64b,
  151659. 0xa9b7ad78, 0x789dba22, 0xe364ab94, 0x4d88d540, 0x1f72e011,
  151660. 0xc8c2e02d, 0x46e2a278, 0x4c826057, 0x4b187c7d, 0xe6c35bb3,
  151661. 0xeb8fe0c9, 0xed8b3dfe, 0x7d11e415, 0xb6bc34e8, 0xb865c7f9,
  151662. 0xb3908bbf, 0xe1ecc17c, 0x717d1ce6, 0xf7cdd69b, 0x151e3308,
  151663. 0xb5c94124, 0x97bd5a14 },
  151664. { 0x81e82861, 0xe01c62fe, 0xdd42c40e, 0x703d4b6d, 0xe65e91e5,
  151665. 0x7e52e55b, 0x5abbbfdd, 0xb8b49374, 0xc72a45f4, 0xb4f15f52,
  151666. 0x550f29d8, 0xce8435a8, 0x582de75f, 0x9df76b9b, 0xa20c8b96,
  151667. 0x52e84c5f, 0x0a8a0af4, 0xaf77d2d1, 0xca6013c3, 0x0389bbd8,
  151668. 0x26f8305f, 0xb0d9b9ba, 0x0cec8b9a, 0xf053e848, 0xffabda18,
  151669. 0x4d63367a, 0xa6424c2a, 0x50f53be4, 0x864fba2e, 0xf892c58c,
  151670. 0x48cc5469, 0x317c6d31 },
  151671. { 0x2cb7d42b, 0x0c3525b0, 0x310facae, 0x55240bc9, 0xff20408f,
  151672. 0x8d5d2022, 0xe0c10ea0, 0x6b01402f, 0x718eb23d, 0x7fbef68a,
  151673. 0x41252a19, 0xa0146b5a, 0x110e0d6e, 0x59afce48, 0x022de181,
  151674. 0xe9a1d27f, 0xdc3f49da, 0x6db96d16, 0xefbe4008, 0xfc1ae3f5,
  151675. 0xeccbc11c, 0xf9d70641, 0x525f8636, 0x49022279, 0xc2763c30,
  151676. 0x3769796a, 0x1d90630b, 0x9cc3483c, 0xee3d3f17, 0x451651f0,
  151677. 0x9da0b8fd, 0x6ae59739 },
  151678. { 0xbff4d2ee, 0x57b13bc7, 0x30b173d8, 0x20754229, 0x0794936c,
  151679. 0xb6254bd5, 0x5efd55be, 0x1d5f232a, 0x4e0c3389, 0xc06f4a85,
  151680. 0x8e61f944, 0xcf2c5b59, 0xfd5f87b7, 0xc564861f, 0x5a2afa4c,
  151681. 0xee261fb1, 0x2d97a774, 0xb0ff7226, 0xd6cf007a, 0x1a89ae22,
  151682. 0xd346f214, 0x28880534, 0x97b6497e, 0x8fe73bff, 0xfa2afffc,
  151683. 0x8a8595b2, 0xf151a726, 0x9ef9cf3e, 0xe744b82b, 0xa84ee5f1,
  151684. 0xbc63fe72, 0x6649048d },
  151685. { 0x1e8b760d, 0x91b7bb78, 0x25aadaa0, 0xd47b0bd8, 0xfab5226f,
  151686. 0x81493d9f, 0xbffc148e, 0x4a6dd226, 0xa29be3db, 0x5a032f8a,
  151687. 0x34b0ab0b, 0x318dbc70, 0x7d654868, 0xdcccbfb5, 0x9c581e46,
  151688. 0x8506ab37, 0x2830ece2, 0x09136a6e, 0xcf6c80c7, 0x48b79356,
  151689. 0xef6b1e86, 0xfa176377, 0x83f0f1c9, 0x2c9c1cc1, 0x16abeddd,
  151690. 0x96f0526d, 0xa93b0de4, 0x3e0e98e2, 0x0f13873a, 0x6f2d7ada,
  151691. 0xf3fa49ec, 0x4eb93b5c },
  151692. { 0xe11fae32, 0xbd89f7e5, 0xc4023f51, 0xd13d74f5, 0x491c3f6f,
  151693. 0x1b0014df, 0x555279b7, 0x1d849a57, 0x05ba0068, 0xbb9e8897,
  151694. 0xc13ca2ca, 0x82222419, 0xfd33676f, 0xafbbb685, 0x75878a2a,
  151695. 0x931c3f52, 0xef3d5173, 0x12aeefef, 0xbd8a6878, 0x189a5cc8,
  151696. 0xd99f0c16, 0x82cffdb3, 0xa19d48b6, 0xbf565406, 0xe9c6c4e0,
  151697. 0x5605e223, 0x86804172, 0x53e781de, 0xc7001cc8, 0xcdf5c90b,
  151698. 0x7c043f68, 0x2b582d93 },
  151699. { 0x81abc2ae, 0xa1165c82, 0xe2b69eca, 0xa73380f5, 0x07fff66f,
  151700. 0xc097b3d2, 0x54776506, 0x5d603826, 0xb57fa21c, 0xdcbac9f3,
  151701. 0xc98dbdd5, 0x78750db4, 0xd9eff32a, 0x85e21103, 0x2f11c41c,
  151702. 0xceed172c, 0x9e348c09, 0xa8e39264, 0x831eddfb, 0x71cb936b,
  151703. 0xf50864a3, 0x915c3d06, 0xe93acfcd, 0xfe8e33cd, 0xb3f2f7aa,
  151704. 0x4bee10d7, 0xeb7cee9a, 0xc1d8eb48, 0xfa574afd, 0x4fa49ce3,
  151705. 0x862db4c0, 0x78615109 },
  151706. { 0x7ae72c21, 0x3fe3f480, 0xfd0f0da5, 0x631aa144, 0xf8c3a454,
  151707. 0xc76ee1e8, 0x51b4f1ab, 0x379ae094, 0xd7cdbb24, 0x2a3a4397,
  151708. 0x82bd5fcd, 0x7a14cffe, 0xf427ef5a, 0xbbe4ed12, 0x284d3ccf,
  151709. 0x9b0a43ee, 0x8eec6e1e, 0x57b78b93, 0x67b8e87b, 0x18d404e4,
  151710. 0x34374c20, 0x0c8adc05, 0x5428deb5, 0x64373605, 0xc3afa2cf,
  151711. 0xb4d80ec0, 0x3aa956f9, 0x6d51f93c, 0x84161c68, 0x9f9a28ab,
  151712. 0x6bc9c025, 0x540b6bb7 },
  151713. { 0x321d315d, 0x04e1734c, 0xd86e05d0, 0x4ef56612, 0xbba8cd81,
  151714. 0xeafae145, 0xacdc789a, 0x1fb07a49, 0x5877570f, 0x6a21e9ad,
  151715. 0xb9bc53de, 0x2e4a837e, 0x1d6298eb, 0x436db293, 0xea362f45,
  151716. 0x43afbc78, 0xaabf6585, 0x2a973d97, 0x0c924d60, 0xdce7dabe,
  151717. 0x7cadf0e9, 0xf69d98f0, 0x75020538, 0xe0b505a1, 0x4461cd29,
  151718. 0x3db7d1a3, 0x5e20e818, 0xe1c28776, 0x52dd50f6, 0x2ca25867,
  151719. 0x92e0388c, 0x897cab14 },
  151720. { 0x0d8bab8a, 0x59ed3813, 0xa438200a, 0xc11d364c, 0x40581415,
  151721. 0x0687bf2c, 0x7ac89674, 0x86ad0d3a, 0xb97411a0, 0x44928105,
  151722. 0xf383371c, 0x74984b11, 0x0d1a831e, 0x70d2ed84, 0x6c912fe0,
  151723. 0xd883628b, 0x14fa88d2, 0x44f8f7fb, 0xcf0ac93e, 0x564f2a4d,
  151724. 0xa6c24fa6, 0x82f629aa, 0xbf6cd949, 0xab906ba3, 0x20a5182d,
  151725. 0x2c822e67, 0x30eb93a5, 0x2ff47dac, 0xfff673aa, 0xdc62c4a4,
  151726. 0x476b0ec5, 0x64b00763 },
  151727. { 0xb3c9a404, 0x1e3f533e, 0xb7ef9952, 0xb1db7f73, 0x6c253693,
  151728. 0xc7f13e29, 0x0738eed4, 0x7ce7f4c4, 0xce26cad0, 0xccfd3b33,
  151729. 0x01ec5cf1, 0xd8784935, 0xdc084e01, 0x3f8fc09d, 0xc39b5acf,
  151730. 0x217cab32, 0x9ef5551c, 0x42daf0bb, 0xe1217a95, 0xfbc76f56,
  151731. 0xc237002a, 0x80178b12, 0xb070a293, 0x0b52c39f, 0x576ca964,
  151732. 0xe3925153, 0x19d68e36, 0x25559424, 0x09e50e84, 0x291fb82c,
  151733. 0x6618ed8c, 0x7dd22ea6 },
  151734. { 0x49cbb3bf, 0x7ffe844b, 0x5562fb25, 0xde0cc704, 0x9f5a845a,
  151735. 0x1e6ee537, 0xe51277fc, 0x956d7f26, 0x30635718, 0x2c75d4b9,
  151736. 0x96957f34, 0x39a14892, 0x82e5742b, 0x8cf4eb32, 0x83247b72,
  151737. 0x6b0d3ddd, 0x201a4237, 0x67a9f633, 0x1414a485, 0x416403c1,
  151738. 0xb6f6a916, 0x60afd447, 0xdac6f790, 0x95f94930, 0xbd3b9d82,
  151739. 0x685ff94b, 0x51cadf0f, 0x5c8f98fc, 0xb13b7489, 0x9559c88a,
  151740. 0x5f18fcc8, 0x31377c66 },
  151741. { 0x7dcfb35f, 0x35c5de09, 0x01cc36f8, 0x2dccca9f, 0x7576cb63,
  151742. 0x7e93e85d, 0xf7b4b375, 0x0c2dd48a, 0xb09a19b5, 0x9d95cd4f,
  151743. 0x71bfe607, 0x752ed159, 0x2596dad2, 0x439880cf, 0x69e90a6f,
  151744. 0xe52efb53, 0x03d3e60a, 0x44097663, 0xa95070e0, 0xfcf364fa,
  151745. 0x05624dd2, 0xd8f993b6, 0x00d5e467, 0xb35a9824, 0x0c8f4524,
  151746. 0xe289d024, 0x648a0179, 0xef45423c, 0x587edabd, 0x3a5fd695,
  151747. 0xa11e5271, 0x3dacc50c },
  151748. { 0x6499ae4c, 0xcb3e4f94, 0x7053c527, 0xa46dcbe1, 0xbe782e8a,
  151749. 0x807f5ce9, 0xd8481e45, 0xb6c64d28, 0xaa286fd0, 0xf35e4518,
  151750. 0xdf1cdb49, 0xf7b7b9ba, 0xaec23eaf, 0xf3fb6210, 0xb9bfd2fb,
  151751. 0x0a9ba385, 0x8807f3a0, 0xe51a0d53, 0xb17b2842, 0x7ab24404,
  151752. 0xf9dd9f0a, 0x6fd57687, 0xf3e9df64, 0xcd1efdb4, 0x60df194d,
  151753. 0x5dd2df7a, 0xe069df05, 0xbed3f2c3, 0x23248a31, 0x469b7561,
  151754. 0x694744f7, 0x866949e1 },
  151755. { 0x3f4ab07a, 0x3a9a0da5, 0xf54a6fbf, 0x2cd6f333, 0xb23cf290,
  151756. 0x0c92e921, 0x848e3d58, 0xc9581c3e, 0xd3b218ab, 0x93af1fbd,
  151757. 0x066cb4d7, 0x38598ea1, 0x990c03a0, 0x5001394e, 0x7d0877b5,
  151758. 0x3b664b1e, 0xd74c7091, 0xd79db1bb, 0x4e2d5dd0, 0x852d4435,
  151759. 0x3329db82, 0x0d2b841b, 0x7b96d480, 0xfa844eb0, 0xc295dc46,
  151760. 0x37a50569, 0x94f7ec4e, 0xc2d38373, 0x5b083177, 0xdc3884ff,
  151761. 0x8b1fa598, 0x574352b8 },
  151762. { 0x0d5d7ce9, 0xed2193f7, 0x0b487eaf, 0x3c19fd26, 0x7be65fd0,
  151763. 0x7c44ab59, 0x78270d56, 0xdd9da860, 0xbaa70198, 0x8a84ec00,
  151764. 0x285985df, 0x2ec27e49, 0xde2028d8, 0x996ccaf0, 0x61c2201d,
  151765. 0x4e7648c7, 0x091c19eb, 0xa96335bc, 0xf0d6782b, 0x253a3a69,
  151766. 0xd2946493, 0x3f204340, 0x099f6873, 0x444521a1, 0x6996011a,
  151767. 0x5fcbcc09, 0xf853a94e, 0x3884d5d8, 0xd3b6a3a1, 0x2418c624,
  151768. 0x06ae3c4f, 0x3e431af2 },
  151769. { 0x83d381f1, 0xf967d939, 0xd0c033c3, 0x36501aae, 0x54410768,
  151770. 0xbf3af4d0, 0x5093a6d3, 0xa86d1598, 0xd92f2900, 0x43ae0741,
  151771. 0x36f0b755, 0xfeb2afa6, 0xaa456d6f, 0xd090a6a3, 0xaefdb646,
  151772. 0x336a4fda, 0x1a942f7d, 0xfd1bfe44, 0x851ee41e, 0x7fc2a3ed,
  151773. 0x11e935c5, 0x4f1c9686, 0x53bbb343, 0xcd577666, 0xad896c2a,
  151774. 0xf26931ba, 0x86bbfa41, 0x8a0fbbd1, 0xa203cef1, 0x1c3d7d82,
  151775. 0xe2664d35, 0x6dad3f15 },
  151776. { 0x12ec35a1, 0xd1940b7d, 0xe7dfb128, 0x6219c5b6, 0xf13321d5,
  151777. 0x2cc278c6, 0x33c58eb6, 0x5e76904a, 0xd9903c43, 0x15090f55,
  151778. 0xc3d96a19, 0x061bc926, 0x8c0acba7, 0x974a9f03, 0x7198b21b,
  151779. 0x7a414021, 0xf8958c6f, 0xb069599d, 0xbebd0129, 0x517f2f1d,
  151780. 0xdf3a8dc3, 0x1109a613, 0x672375c5, 0x08e58448, 0x9383d2d3,
  151781. 0x56590ba4, 0x0bff837c, 0xfc3ee7c6, 0x27d2d55f, 0xc87a5390,
  151782. 0x5f517a3f, 0x2438e9d4 },
  151783. { 0x8815af3c, 0xc4a45308, 0xf3c9bed5, 0xe55f1a32, 0x97b65ddf,
  151784. 0xaef1cdc9, 0x12e51eb5, 0x61c61d94, 0xe63f2490, 0xbd0dac54,
  151785. 0xd0b3e231, 0x6f14429c, 0xf1da6010, 0xf737c3c2, 0x6bbc4fb1,
  151786. 0x7150e04b, 0x1be281cb, 0x205b4c89, 0xd7701f5b, 0xf1b4633c,
  151787. 0x2a513490, 0x8b33ef46, 0x68f1f7f2, 0xddb47c73, 0xbd416b67,
  151788. 0xf4ada511, 0xff795bb3, 0x9d2a97cd, 0x96200e67, 0x00a8b7b2,
  151789. 0xafe30e01, 0x13f39011 },
  151790. { 0x7bd0c827, 0x3dd296ef, 0x4a29ff46, 0x506110f3, 0x1c9a515a,
  151791. 0xf8793068, 0x268bca77, 0xde8d8045, 0x998045df, 0xcbb83024,
  151792. 0x68c0e584, 0x3f90d710, 0x263b6062, 0x2a838ca8, 0x535c5d0b,
  151793. 0x293bb5e7, 0x56415110, 0xceea99d5, 0x1bbda005, 0xfe311ad0,
  151794. 0xa4d8d018, 0x2497e0bf, 0x1cf2b866, 0x33dd77a0, 0xd8c4ba8b,
  151795. 0xbc075b73, 0x722b7bc9, 0x298466d4, 0xcbda1b0b, 0x17a7ce24,
  151796. 0x680703b6, 0x458d4b6b },
  151797. { 0x4d54d8b2, 0x8a26a20e, 0x4d320a0d, 0x05a5696e, 0xf994f700,
  151798. 0x698b5858, 0x2f6549a8, 0x7a4adc3c, 0x3694d00d, 0x1812e819,
  151799. 0x730402bd, 0x46b9b000, 0xa1b36410, 0xe10a1449, 0x99230220,
  151800. 0xeae95ea5, 0x1b4820c3, 0x3efc2e9b, 0x85c9eb8a, 0xfe5b5cb5,
  151801. 0x97847064, 0x21ae0319, 0x8f27d49f, 0x68ef0b70, 0x2f72556b,
  151802. 0x3259ef18, 0x624db01a, 0x00ae0457, 0x5668f95c, 0x628e3b06,
  151803. 0xb6fbbf91, 0x5f13f5fa },
  151804. { 0x3a9b0dc6, 0x7c6ed9ae, 0x6f883ec8, 0xaea1bde9, 0xea8b3677,
  151805. 0xea66bf88, 0x9a66e3ab, 0xdefa6abc, 0x68217ffd, 0xc4d3317b,
  151806. 0x290df05c, 0xf741c8f2, 0x7d11674e, 0x1f0fdf17, 0xc35989ca,
  151807. 0xfdf0ece7, 0x6b9c482d, 0x0eed92df, 0x55bf1ca7, 0x73713e66,
  151808. 0x25cec99c, 0x90acb290, 0xe803e69c, 0x37c9e3a2, 0x17713a1a,
  151809. 0x7c0a3c53, 0x6f5a174d, 0x350dc565, 0x05f802f6, 0x11625a44,
  151810. 0xa37ba4a2, 0x2196495d },
  151811. { 0x13142680, 0x00cb2fd3, 0x65d14cf4, 0xab9e91d7, 0xdfe2669e,
  151812. 0xc6a0ceab, 0x0ae22bc5, 0xbeefce58, 0xcb6ec250, 0x3c2b7986,
  151813. 0xd738f1ff, 0x84adb1a2, 0x516ec8ec, 0x9709bc28, 0x8e8f7db5,
  151814. 0xf3693129, 0x95b197f9, 0xc48efc6b, 0x9aaaa404, 0x9ff10952,
  151815. 0x144154b0, 0x2c3c8cbd, 0x427f3435, 0x33ef7bc3, 0xd21897c1,
  151816. 0x04a17940, 0x6ce548a0, 0x5aa0c47d, 0x3d56fa62, 0x2971cea7,
  151817. 0x04475f08, 0x93ad0eb0 },
  151818. { 0x988a9963, 0x7a0b6967, 0x6515e8dd, 0x61e477f7, 0x3b6b50f2,
  151819. 0x6274e386, 0xd33922de, 0x63a9b8d5, 0x687a5b3d, 0x3c38d3fb,
  151820. 0x1302e323, 0x18f6f09c, 0xe02fcccf, 0x254c05c3, 0x26e662f7,
  151821. 0xc04ed0b7, 0x143fe079, 0x1d5646b8, 0xc9016c8c, 0xef8a9448,
  151822. 0xf823d797, 0xe5674c4b, 0xbccde451, 0x0586f72f, 0x4417eade,
  151823. 0xc5fc88d5, 0x576e588d, 0x2b952209, 0x5844d1f9, 0x4408dd42,
  151824. 0xea41c034, 0x73f8c3f0 },
  151825. { 0x5df763dd, 0x89534fc8, 0x3ac71836, 0x3b1427f3, 0x6e8f15a0,
  151826. 0x0db5be17, 0xcb20888e, 0x1d390944, 0x857caea6, 0x7804c9ad,
  151827. 0x519f7bf3, 0xaa584428, 0x293aa8cf, 0x626eecf1, 0xea36a015,
  151828. 0x749e0d98, 0x3321edcd, 0xefff6dae, 0x28b791cc, 0x963deea6,
  151829. 0x2d16e361, 0xa14e0552, 0xb15ae206, 0xa2e058fc, 0xfca325e4,
  151830. 0x0f268745, 0x21341a8a, 0x7cf9d407, 0x7caa51b8, 0xdfed25d9,
  151831. 0xadbedd75, 0x0108ae39 },
  151832. { 0xa9e88f63, 0x54d178f3, 0xab0c7325, 0xaa05b11e, 0xe261d8a6,
  151833. 0x773a53e6, 0x8d0b91c8, 0x24db7dae, 0xe9bb004d, 0xde10b073,
  151834. 0x54e3090b, 0xfc8befe7, 0x0cc69c89, 0x16af0599, 0x9d59511a,
  151835. 0xddc83803, 0x46c5dafc, 0xc3f65b99, 0x1ee0a599, 0xfbbe4be8,
  151836. 0xfb3a9b17, 0x88891e36, 0x445dad00, 0x0c9aad75, 0xd5097e1f,
  151837. 0xdffc46ab, 0xac85a4e1, 0x8848089b, 0xa0c45233, 0x348bb42f,
  151838. 0xeb13c1df, 0x807c06d8 },
  151839. { 0x98ee0ef6, 0x00a969ec, 0x8bb7b7af, 0xba9d5483, 0xa02f8fdb,
  151840. 0x24484c92, 0x8b70557c, 0x7bdb201a, 0x60ad1af2, 0xe59343e4,
  151841. 0x998c95fb, 0x53a9a942, 0xda861d3b, 0x974db3de, 0xed399c0e,
  151842. 0xce1525c9, 0xf72109bd, 0x89b56881, 0x998211a4, 0x08ff7d15,
  151843. 0xef0f275a, 0x5df76b3a, 0xfa2f358b, 0x93f180f7, 0xc39b0634,
  151844. 0xaac4ffcf, 0x17583b53, 0x2692c626, 0xb55399fc, 0xb2fdfa36,
  151845. 0x99607a61, 0x16424c6c },
  151846. { 0xdd2744a9, 0x5dd65c55, 0xfe3af418, 0x2544c1c2, 0xefe8b089,
  151847. 0x32c82e99, 0xa9df691a, 0x30b7ab25, 0x9be99674, 0x98384550,
  151848. 0xcaf2d122, 0xbcecd258, 0xbcc77272, 0x88ae4098, 0x4b8efa0c,
  151849. 0xd4396141, 0xed64d12c, 0x44ff67b9, 0x2e7f3404, 0xa9e655e4,
  151850. 0x45b0e9eb, 0x3d16fc45, 0xf03ded28, 0x474a3e14, 0xacccb85c,
  151851. 0xa3c9adff, 0x7253a51b, 0x3dfe6bc1, 0xfb5831b1, 0xdddaf4b9,
  151852. 0xa4f4478a, 0x5544e602 },
  151853. { 0xbaa80b4f, 0x897c5313, 0x63bdc8ef, 0x0122716f, 0x7b42c5a8,
  151854. 0xae2742db, 0x0883308c, 0xe9d9e1e9, 0x2d341ab1, 0x352c8c3f,
  151855. 0xed945870, 0x163d0500, 0xc290d9d8, 0x8349dd73, 0x1f6c7d29,
  151856. 0x2053c5e0, 0xcb42033c, 0x83107446, 0x09d09af1, 0x76c88bd2,
  151857. 0xb2794681, 0xd0f70e6e, 0x19b1b540, 0x720b59de, 0x22994b43,
  151858. 0x80b7ecdc, 0x2dec53cf, 0xc1a4cdce, 0x1ed60f42, 0xdd7d3edd,
  151859. 0xe241d261, 0x5735995c },
  151860. { 0xa0237056, 0xdc4ba3fb, 0x33ab3388, 0x6856c164, 0x271ec612,
  151861. 0xc01eebbd, 0xe3031bec, 0xabdeb033, 0x6118a1f5, 0x4eee4419,
  151862. 0x5b600f33, 0xec497421, 0x08868773, 0x1b7185cf, 0x7c1b7dfd,
  151863. 0x7b0c46cd, 0x4a4c5e89, 0xd143b2da, 0xbb1ff94d, 0xdb9a5984,
  151864. 0xc9cf3465, 0xac3904e4, 0xeace64c9, 0xf8729bc0, 0x768ad99a,
  151865. 0x5cc22821, 0x8a9540c2, 0xbbd3b081, 0x049a6917, 0xe468ed5f,
  151866. 0x3ec45ef0, 0x885486df },
  151867. { 0x4bdff464, 0x6a942c93, 0x25a7b451, 0x3db2719f, 0x325be324,
  151868. 0xccb0070b, 0x19fe3339, 0x2055a31b, 0x241ee8ff, 0xaca69ae8,
  151869. 0x55ef8def, 0x7607dd08, 0x1a1b73c6, 0x9e24960f, 0x71d36810,
  151870. 0xbcb0e8a2, 0x6885e6b9, 0x29e11aa2, 0x185eae19, 0x98b5d0ab,
  151871. 0x0f81f91c, 0x1a0b96e4, 0x994fc503, 0x4d0e8bcf, 0xf119d6e0,
  151872. 0x33d81697, 0xaaa4ce0c, 0x29083287, 0xc91ff9d7, 0xc5dd4d3e,
  151873. 0xd4ab962d, 0x31cecfe8 },
  151874. { 0xfc8b21e8, 0x437bfd9a, 0xb19436df, 0xe5dd32b3, 0x921c36a0,
  151875. 0xfe5902d4, 0xa3d0fa90, 0x8e9de84d, 0x5bb523bd, 0x9663e6ad,
  151876. 0xaecd6975, 0x9800a23f, 0xb4fbb59c, 0x1009c0d9, 0xc9d20ff1,
  151877. 0x839aa7bd, 0xecd6fa3d, 0xf502f66d, 0xc5516ca9, 0x480ed4fb,
  151878. 0x6c742ac4, 0x65ffa5f6, 0xff3252f8, 0x2b7c7945, 0x75d9cb3d,
  151879. 0x72fefc05, 0xd6d6f1d2, 0x11b0863b, 0x9a6a4ec3, 0x5d8f3cf0,
  151880. 0xda2547b3, 0x6961b46a },
  151881. { 0xcb35e2ac, 0xd07b587e, 0x57af14d9, 0x1ed5546b, 0xdb28a04c,
  151882. 0xeca17a5b, 0x709d54f0, 0xa1f91d44, 0x9c6f400e, 0xa6e719fd,
  151883. 0xfb8ce190, 0x4e4b88ed, 0x246e3fd2, 0xf9781edd, 0xb655af5d,
  151884. 0xd67120e6, 0x93413ca7, 0xda782d1d, 0x9707fa21, 0x697e20a2,
  151885. 0x54e84123, 0x1eb51f32, 0x36051f9f, 0x2e254d9e, 0x73ce5be9,
  151886. 0xddaec42b, 0xcd3f794f, 0x89a9a32e, 0x0781aad9, 0x1964e22f,
  151887. 0x53755212, 0x6a63a90c },
  151888. { 0x3d7acbbb, 0x76554e00, 0xb74f6108, 0x2c01668a, 0x388c519b,
  151889. 0xe4a29672, 0x3eb94d4f, 0x01667714, 0x0cd6d2f6, 0x086a3cdf,
  151890. 0x7b370f7f, 0xf8658021, 0x5a4d3e7c, 0x658880c1, 0x5ba3f4a1,
  151891. 0xd6ed5816, 0x5ca471dd, 0xabcc7813, 0xe844a576, 0x809bf074,
  151892. 0x6ea502ea, 0xa53a81b3, 0x0e021ed3, 0xc20b9307, 0x8617f165,
  151893. 0x8c27f892, 0x8235cd0b, 0xa5476446, 0x82552961, 0xffc89ffd,
  151894. 0xd151d90e, 0x51ed4a22 },
  151895. { 0x449701b4, 0x37d6963a, 0xbb27caf2, 0xea8d91a3, 0xb572965f,
  151896. 0x3ef9be15, 0xdb50bf7d, 0x75a7a055, 0xce643b9b, 0xfd67480e,
  151897. 0x6ceb5d5e, 0xf2a60d2d, 0x5ed7c897, 0x68fc320c, 0x28ce685f,
  151898. 0x41c53cf6, 0x7106615e, 0x0e29711f, 0x23500ecc, 0x7a872138,
  151899. 0x6c29fe48, 0xaf0a9260, 0xe1ef9712, 0x93df3f2a, 0xd2d169bf,
  151900. 0x0d5f6fb1, 0x74a9793c, 0xeb7afe26, 0xe9f49256, 0x4173d94a,
  151901. 0x2b8b5ce5, 0x2d6951bc },
  151902. { 0x904e222e, 0xdd007d9f, 0x86f4e109, 0x333f248f, 0x8f429eee,
  151903. 0xd4994e8b, 0xcfc77518, 0x29573415, 0x0b0f42f1, 0x6e7fea3a,
  151904. 0xc2743519, 0xc795cb7d, 0x711e71a0, 0x820a8f66, 0x2b874f55,
  151905. 0x83d95d9c, 0xe70e1627, 0xd4b64d78, 0x8b92a742, 0x924353f5,
  151906. 0x447b5e6d, 0x322048b1, 0xbcf931a0, 0x0bad730c, 0xa7af2268,
  151907. 0x75c4d089, 0xb83b93f9, 0x464904c1, 0x165b3aee, 0xa24eba02,
  151908. 0xe08cc5f0, 0x65c48e78 },
  151909. { 0xde222c22, 0x1a1c73ce, 0xfcea23b4, 0x5683d8cd, 0xb2143b06,
  151910. 0x0301cb14, 0x59fcec77, 0x284adf8f, 0x31204cef, 0xfb1c581c,
  151911. 0x94735107, 0xf54d3eee, 0x4d3188c0, 0xdbf67f0b, 0x10f18d12,
  151912. 0x76a3f2d1, 0x07d3e013, 0x3809fa28, 0x25e7ece0, 0xf06f0a46,
  151913. 0xb2895d2e, 0xd82867ed, 0x08b0553a, 0xe106f489, 0xef245445,
  151914. 0xe2280fa6, 0xa8d9a3cb, 0x402d5785, 0xd438ba2d, 0xf63dd9ff,
  151915. 0x7a6b226f, 0x36b5cd2c },
  151916. { 0x545679a7, 0x87ff4e20, 0x4520c750, 0x64d80b41, 0x9b459cd8,
  151917. 0x90a357fa, 0xc85af1a3, 0xa19eaf39, 0x8d935a5e, 0x0d475d79,
  151918. 0x781a678a, 0x74501983, 0x0cc2e810, 0x74839779, 0x2f412244,
  151919. 0xc6a21d11, 0x36a51a37, 0x8d0e85f9, 0xeaa74df8, 0xff50151e,
  151920. 0x93cf99c4, 0x14e182a7, 0x376a9ab6, 0x45593df1, 0x522389ff,
  151921. 0x18f73caf, 0xf7445e8a, 0xd27cc960, 0x39a51dc8, 0x0692f4c5,
  151922. 0xdb39bfd8, 0x08d7c144 },
  151923. { 0x3ecca773, 0x809c0d96, 0xd48c2156, 0x87ea9192, 0xdb6bd641,
  151924. 0xf0eccd74, 0x2a678cdf, 0x77312374, 0xd1587b7e, 0x7a966d8b,
  151925. 0x6130a4c6, 0xf3c1a101, 0x5fce17bd, 0x7cc6e838, 0xa8de7aa4,
  151926. 0x95e95bb8, 0x898308e3, 0x3fe1e8b5, 0xe347694a, 0x0197243e,
  151927. 0xbb0cd2bf, 0xf3fe9c42, 0x0f9b2b49, 0xb5905264, 0xc7367d1f,
  151928. 0x4c385e8b, 0xb5ee147b, 0x1d3050ae, 0x04004ad9, 0x8e2c3879,
  151929. 0xbab70202, 0x5f2aa8ee },
  151930. { 0x1266524b, 0xe208d464, 0xd0a19f66, 0xb7bf3880, 0xda106ebf,
  151931. 0xa5aa685e, 0xe642dd46, 0x0a69e8d3, 0xc682e4d6, 0xef349c61,
  151932. 0x0fcb534c, 0x26f6ee3b, 0x05eb67b8, 0x7daba127, 0x18be05f6,
  151933. 0x2babb27e, 0x8e2d85d1, 0x959afcba, 0xe2d9d386, 0xedcf2d1a,
  151934. 0x1ea6f06e, 0x59dc52e6, 0x866e5ae8, 0xc28278b4, 0x02bcd3c7,
  151935. 0xd9ff0340, 0x784be82f, 0xe884ac76, 0x83c9f224, 0xa3164980,
  151936. 0xb46ff949, 0x62501a98 },
  151937. { 0xad264086, 0x563f7d9a, 0xa5e0e4bd, 0xca6a33db, 0x8c8d3d67,
  151938. 0xe8253002, 0x46e64b19, 0xa288dac8, 0x20aa4536, 0xfa3c9197,
  151939. 0xed553eac, 0x8130c9b0, 0x2ea8abd3, 0x622806e0, 0xceccfe77,
  151940. 0x52fbf54d, 0x4f0d1b70, 0xbd9a8e31, 0xd59b1741, 0x519d2133,
  151941. 0x9a6fea8a, 0xfd74101c, 0xb5c4eb10, 0xd1acf7a0, 0x91f9da5e,
  151942. 0x78499b73, 0xc0dea586, 0xabaa4c49, 0xa1f3531a, 0xcc9c5f73,
  151943. 0xfd3fc665, 0x497b15fe },
  151944. { 0xf45568e9, 0x8a56cbaa, 0xc7192a6f, 0xf491a0fe, 0x9ab2539a,
  151945. 0xdbb03dd3, 0x4ac37da9, 0xc86522f8, 0x02a0f5b4, 0x8c8cdba2,
  151946. 0xa29c539f, 0x8109fc75, 0xca90f02e, 0x9cd06d31, 0x3e216dbf,
  151947. 0x8f31f044, 0xba3ebd91, 0x99aa68ac, 0x42c007f4, 0x2a80d0d2,
  151948. 0x86a9b7ce, 0xdd8dffbf, 0xd6308edc, 0x405d3e84, 0x068012ca,
  151949. 0xdafa33fe, 0xedea1071, 0xc2eebd13, 0x2ff637e6, 0xb7ae7e5c,
  151950. 0x9e514cb7, 0x18d46a6c },
  151951. { 0xa78b7802, 0x868cbb22, 0x497cbaf4, 0x0745ddb2, 0x42ae8add,
  151952. 0xc4eb2f3e, 0xb4ceb4e4, 0xac0abcda, 0xa325fd40, 0x2e0d8325,
  151953. 0x13ac7345, 0x6cfe0571, 0xb14171b9, 0x7407a788, 0x6da7a52b,
  151954. 0x70eb0603, 0xd85176ac, 0xab0b36f9, 0x7c2954f3, 0x14109d29,
  151955. 0xdcd705ad, 0x370de9c8, 0x7bb5e751, 0x3f0db5cd, 0xa06e708c,
  151956. 0x45f93d41, 0x7e93050d, 0x10d54f8a, 0x5a38fef9, 0x69e6f8e4,
  151957. 0xd3f62e40, 0x55044601 },
  151958. { 0x06cb9cc9, 0xd1c5c910, 0x41d00014, 0x542074d7, 0x11236fb8,
  151959. 0x7cd8663e, 0x29ad5f82, 0x39721ffe, 0x2951fc83, 0x1d21fbfa,
  151960. 0x400d144f, 0x1cde06e7, 0x91792e6b, 0x9042596b, 0x29ad5166,
  151961. 0x3365c8e5, 0x9aeefe98, 0xe2220e85, 0x70c2aee3, 0xbcb53189,
  151962. 0x9ff100bc, 0x477ca3db, 0xf532973f, 0x27074176, 0x9a2bd01b,
  151963. 0xa12118ac, 0x3dd79f93, 0xf3425209, 0xc6f5d7db, 0x563a8ff7,
  151964. 0xd7b0ec4f, 0x0da313fc },
  151965. { 0x15aa2557, 0x37125a8c, 0x00893e9c, 0xca21d70c, 0x67b8a823,
  151966. 0x48713994, 0x7cb0042a, 0x0d3e9a74, 0xc9e2ce18, 0x2d2bf4ff,
  151967. 0x049aeac2, 0xd5531a0d, 0xf03d0660, 0x4d29a616, 0x1f1b7f00,
  151968. 0x473d50d6, 0xca3de50c, 0x3af0ecbb, 0x09c28f27, 0xe2959bea,
  151969. 0xf8704664, 0x6d7c2ea0, 0x731083ef, 0xadfae4e1, 0x941c2554,
  151970. 0x50940c26, 0xa1162d03, 0x44167410, 0x1e82290e, 0x620230d8,
  151971. 0xdb414acc, 0x63630be8 },
  151972. { 0x8a7d2e41, 0xbf8d5222, 0xeb62f879, 0x49e75823, 0x6c402d89,
  151973. 0x1b4d33dd, 0xde2c59ad, 0x883e04d6, 0x49b9dc38, 0xbf3f38f4,
  151974. 0xb4b70c4c, 0x9d997d18, 0x13cea045, 0x1f69b20c, 0x58e2606d,
  151975. 0xca3d7025, 0x261d1b79, 0x3d4fd977, 0x5a1436fa, 0x56aeafa8,
  151976. 0xbb443c07, 0x369b3e98, 0xe558f6be, 0xfce5186c, 0xf8ac8f89,
  151977. 0xeb0cd478, 0xd5e5aa72, 0x68074f37, 0x68544eb0, 0x295845c0,
  151978. 0xf16688ed, 0x306a9871 },
  151979. { 0x634ec136, 0xbc451e9d, 0x0e6f658f, 0x1edf27ca, 0xc0db4120,
  151980. 0xa9be0152, 0xc5bfee67, 0x87b6ef20, 0x9a2d6023, 0x35283238,
  151981. 0xc7afb899, 0x60e564d8, 0x0ac9c2de, 0x4af22bc0, 0x82a9d22b,
  151982. 0x28e6f631, 0xf532701b, 0xc075c701, 0x82075f91, 0xf6d418f8,
  151983. 0x1beaa511, 0xf9fa628d, 0x6e72a13d, 0x551e7a17, 0x77f4c01c,
  151984. 0x9306215b, 0x93c9d588, 0x71aba731, 0x58e57cd4, 0x6443ebe0,
  151985. 0xe8103e37, 0x2833ac41 },
  151986. { 0x8da5ec5c, 0x7e564b86, 0x1c08db24, 0xac3d9da8, 0x8c57a728,
  151987. 0x9d7c1f0b, 0x9d343dc2, 0x3512afe7, 0xfdc60339, 0xb438e4cf,
  151988. 0xdcfa1941, 0x7d5a2700, 0x27320449, 0xd5f323f8, 0x1393c6e6,
  151989. 0x1b87a58e, 0x04baa431, 0xecb68bd1, 0x4722b4d7, 0xc09c1c5a,
  151990. 0x206b5faa, 0xf42faa97, 0x9976327e, 0xe1dcbcd6, 0x087787d9,
  151991. 0x655ba9e4, 0xde5c0191, 0xbd59c757, 0x0bcf3538, 0x673020ed,
  151992. 0xa49d6303, 0x120cd454 },
  151993. { 0xcab0f9ee, 0xebfdb8f4, 0x2cce58ee, 0xbc003ef0, 0x5a8d0665,
  151994. 0x9b6a6841, 0x9b957774, 0x642ed3a6, 0x4721ab5c, 0x3de487f0,
  151995. 0x21a4f0d3, 0xef2ff380, 0x29dbddcd, 0xbd16f558, 0x0e93dff2,
  151996. 0x2ef05b4b, 0x0bc9aec1, 0xde1faa12, 0xd467fa92, 0x66dae2c2,
  151997. 0x5eb33e34, 0x758daf64, 0x8f0103cb, 0xa67ad9f6, 0x9be02430,
  151998. 0x151f693a, 0xeb4054bc, 0xd5698496, 0x7019336e, 0x8ef1677e,
  151999. 0x7fdeea3e, 0x021cfd16 },
  152000. { 0xdf5c36f3, 0x5c73715f, 0xd64ad254, 0x703bde37, 0xf2cf7713,
  152001. 0x55368d10, 0x0f3993c8, 0x1e5ec7b7, 0x304ae4ca, 0xfdb16776,
  152002. 0x3d3bb18b, 0x0d8f717e, 0x66343d5a, 0x5267073f, 0x156008b5,
  152003. 0xfaeb52ef, 0x224a470f, 0xb97ad5f9, 0xed2ab51a, 0xaf86e391,
  152004. 0x9974302c, 0xdc0c7e57, 0xfd0ae28a, 0xc88fa817, 0xbf8ed59c,
  152005. 0x807c22df, 0xeb128bb6, 0x5dedc231, 0xa20595a3, 0x71edcd9c,
  152006. 0xc73cf78e, 0x07265b46 },
  152007. { 0xbd66232f, 0x73dd99f0, 0xc4027716, 0xc59aaf89, 0x5b860fc4,
  152008. 0xaf826dfa, 0x7a943f3b, 0x239ea8aa, 0x523c428d, 0x0e0e1b1a,
  152009. 0x6973b95a, 0x55ea0e3a, 0x2557753b, 0xea399caa, 0x06957b1f,
  152010. 0xf8adf72f, 0x3bd34302, 0x0389f341, 0xf8a43a97, 0x333f27d0,
  152011. 0xadaf796f, 0xcd9c0c08, 0x49c12aa2, 0x6dcca49b, 0x7a0ac6e9,
  152012. 0xdd88deee, 0x0644080e, 0x8f47575d, 0x0cc2f4bd, 0x6e9d667d,
  152013. 0x31d1496c, 0x36c5754b },
  152014. { 0xf323d84b, 0x9120046e, 0x7e789c4f, 0xa6991122, 0x921b8055,
  152015. 0x4b0eaf4e, 0x8079974e, 0x6339844a, 0x740f8c79, 0xc905466a,
  152016. 0xcd6def49, 0x1c18d0f7, 0x4b23e4ba, 0x5297da6b, 0xc41800c5,
  152017. 0x1c09dff3, 0x37ef6777, 0x6c49075b, 0x50513ded, 0xa94c3a40,
  152018. 0x6b0b1705, 0x3d6742e9, 0xc48af5ae, 0xc0784494, 0xc95822de,
  152019. 0x40c01532, 0xc164d94f, 0xa2ddade5, 0xa2975eb5, 0xfc8a8ac9,
  152020. 0x1946944e, 0x06fbf861 },
  152021. { 0x3f45aa97, 0x2d65338e, 0x1d040feb, 0xd83b58c8, 0x0fdef8b9,
  152022. 0x05fef59b, 0xe4d7417c, 0x7beb071a, 0xb30a1a23, 0x982b61f5,
  152023. 0xfb65bd03, 0x4c5f2a2a, 0x5cbf6bf3, 0xe40abc9d, 0xf06612a5,
  152024. 0x422c326d, 0x9571ae28, 0xc921e69d, 0x23d3434e, 0x7c88b10b,
  152025. 0x9da07933, 0x96d2e957, 0x3619cf4d, 0x833d46a1, 0xd95eefa1,
  152026. 0xd9d19653, 0xa03e8f0e, 0x2a7d8411, 0x04bb5ab1, 0x5e642953,
  152027. 0x1f0fa9ea, 0x5e9ca0fd },
  152028. { 0x197c5dc4, 0x5bd54571, 0xe78a95a2, 0xe2da40bf, 0xffdb0eb2,
  152029. 0x65fb9efc, 0x0d17467c, 0xe952dc2c, 0xc758c6a3, 0xc1fc9c7b,
  152030. 0xd4034a9a, 0xfc79562c, 0x61f64b56, 0x26e36fbe, 0x1e84728b,
  152031. 0x6adc4b9e, 0xa8f9ac8a, 0x7f165fd3, 0x03e3e013, 0x7bc93a45,
  152032. 0x656478e3, 0xeacc5513, 0x064ddc77, 0xd3391717, 0x76936914,
  152033. 0x75b318dc, 0x362424a6, 0x69b1f1c7, 0x49955f34, 0x8cc2045b,
  152034. 0xc6836af8, 0x940622b3 },
  152035. { 0x0d997973, 0x4710ccb7, 0xd3f8f115, 0x3b29625d, 0x5b97abd5,
  152036. 0x8cf0c4d5, 0x673e14a5, 0xc6321e0a, 0x3d262246, 0x0541af9d,
  152037. 0x6fc83b11, 0xde6d8754, 0xf01652a4, 0x47e97da8, 0xad9802b6,
  152038. 0x0f82b3a6, 0xae9c44b2, 0x69aa4075, 0xced2bf77, 0xaf3f5de2,
  152039. 0x497a40da, 0x1ef1ea8a, 0x3c23ba9c, 0x2e0f8608, 0xf190a2c8,
  152040. 0xd8a998a4, 0xcfde3368, 0xe2b49c8c, 0xbde6bd71, 0xb9f49824,
  152041. 0x785bedb6, 0x80bb1664 },
  152042. { 0xfd145cb5, 0x05e575fe, 0xac5e6883, 0x155ee561, 0x8793b273,
  152043. 0x461e70cf, 0x133b2338, 0x9f1553de, 0xa2a7ba07, 0x2fb9e0c3,
  152044. 0x3e7086fa, 0xc3bfd6a8, 0x8bb4cb93, 0xb6ba8500, 0x76f82dbd,
  152045. 0x0b66d789, 0x54eb49ff, 0x7d5a6ff6, 0x1f20b322, 0xcd65d237,
  152046. 0x54e29cdc, 0x79ea49c2, 0xcb118ff9, 0x64975963, 0xcc58000b,
  152047. 0x969598dd, 0x110c779c, 0x95107918, 0x63b85a35, 0xedfc1548,
  152048. 0x41212350, 0x077ba5ea },
  152049. { 0xcdd86f61, 0x0b3a38d3, 0x0502a0ab, 0x43121445, 0x806d0272,
  152050. 0x1912edc5, 0x8a32f10f, 0x01dc1f98, 0x0e80c760, 0xbb1d31d1,
  152051. 0xf464e8b3, 0xd46ec7e5, 0x9abf49ee, 0xd569af36, 0x2cdade77,
  152052. 0x9d286ea7, 0x45ad5920, 0x2be7020d, 0x6299ae7f, 0xabe5236e,
  152053. 0xd3f55c07, 0xc93179bd, 0x52350e80, 0x8138995a, 0xaff07586,
  152054. 0x0901265c, 0xf4739653, 0x5b3c81b2, 0x9bc77d21, 0xbaf7581d,
  152055. 0x4591a2e2, 0x6b2006df },
  152056. { 0x965b1bc1, 0xb2fe50a8, 0x962bb4fd, 0x931f536a, 0x000e7f99,
  152057. 0xd5718d33, 0x53d5125e, 0x84728f25, 0xd2125caf, 0x4f8a6184,
  152058. 0x357f679e, 0x54f1a701, 0x1531c05a, 0x70a9f40c, 0x6fa8b775,
  152059. 0x10d0cb97, 0x9dc12ce9, 0xb476f41e, 0x2755f894, 0x5c8d7a75,
  152060. 0x625741a4, 0xd6c12e10, 0xc917b16c, 0x262a6fb8, 0x38d6b0a0,
  152061. 0x24d116e6, 0x32c38e83, 0x849540c0, 0x66868afc, 0x855b911c,
  152062. 0xbd26b550, 0x53217ea6 },
  152063. { 0x259f52b4, 0xfc840473, 0xe621146c, 0x968da9cb, 0xcacbd26e,
  152064. 0x964eb85e, 0xe4a54344, 0xab7daa2d, 0x381a4ff7, 0x6dc3b848,
  152065. 0x41c815ef, 0xa07a96b3, 0xc3d4b1e1, 0xc4fae9e8, 0x42ce9ea8,
  152066. 0x0f938d1e, 0x35cc052f, 0xa727dacc, 0xe9a06f07, 0xc81e01c9,
  152067. 0x4a6d65a1, 0xa9e08dcb, 0x6044a9a6, 0xf8e2d173, 0xf2bd295b,
  152068. 0x99893dd0, 0xf9781b12, 0xa08d3379, 0x61830ac2, 0x64bd6001,
  152069. 0xd9adbeef, 0x0386931e },
  152070. { 0xd09885a5, 0xd0d7abb3, 0xe355bb07, 0xed9d2b67, 0x536ebaed,
  152071. 0x3bc238cf, 0x699ce4d6, 0x61ca2e78, 0x111594cd, 0x354ff447,
  152072. 0x03316ad2, 0x55cbe709, 0x49fff5c4, 0x418679fd, 0x0f9c6c40,
  152073. 0x75bacd75, 0x2972721a, 0x677edc88, 0xe5ef502f, 0x82596887,
  152074. 0xbf320e0e, 0x459e9367, 0x8bbdccb2, 0x81ce36ef, 0xb766863d,
  152075. 0x1ba097fc, 0xd58c6db8, 0xcd3a21d6, 0xb4a8748b, 0x0e4967cd,
  152076. 0x15041c20, 0x2caaf749 },
  152077. { 0x6ed20424, 0x44f98006, 0x22471545, 0xb3e4ea23, 0x781a8c86,
  152078. 0x268ed1a5, 0x7ae5b70b, 0x48d0ab75, 0x356d3982, 0x6ca8b320,
  152079. 0x2df31fa4, 0x9ce8e681, 0xd925dcf2, 0xb909d232, 0xf56723de,
  152080. 0x302c8f78, 0xabac96f9, 0x11725d69, 0x57d1a170, 0x656a47ca,
  152081. 0xc18a2be7, 0x6bb5d511, 0xad50d9d9, 0xb56e45f1, 0x70b05518,
  152082. 0x36e886e2, 0x09d8ff91, 0xc7c71f3d, 0x9350361e, 0x65a1bbe2,
  152083. 0x45fe3bd8, 0x86d7f532 },
  152084. { 0xb0bf719a, 0x99f16eb6, 0x8bc3d913, 0xb6975098, 0x26cd01b4,
  152085. 0xfae50e52, 0x90898d1c, 0xd3e3ac54, 0x887ec666, 0x4da3b9db,
  152086. 0xfbea45b8, 0x58300644, 0x8355b058, 0x369f3bd9, 0x579bcc13,
  152087. 0x0fb239a8, 0x6e2bd811, 0x4f5b4539, 0x24198fd2, 0x007f3baf,
  152088. 0x8837d51d, 0x68a676db, 0xeae75b16, 0x68eeea62, 0x3db6083c,
  152089. 0x5ffe5f94, 0x7d836c5a, 0x52c94d0f, 0xcbc1ff85, 0x5a4c3c6f,
  152090. 0x86c0b4dd, 0x682a55e3 },
  152091. { 0x587495aa, 0xc8f235a4, 0x34c7245d, 0x2276026c, 0xb75a46e3,
  152092. 0xd6ae0cc5, 0xecc3e5e7, 0x890d3965, 0x14296629, 0x1b13342f,
  152093. 0x8a877227, 0xc89927e6, 0x2324a68b, 0x1543f27e, 0x49cdc21a,
  152094. 0x6c447684, 0x1452d0ac, 0x9bc7fd4f, 0xff4b045c, 0x2cc30a31,
  152095. 0x852f7611, 0x415d46a0, 0xc6fdd7a6, 0xad737052, 0x7b4c7c91,
  152096. 0xdcecc3ab, 0x7688d70c, 0xd2cdf01b, 0xe40d3905, 0x054f2542,
  152097. 0xfefe4dcd, 0x02227fa6 },
  152098. { 0xb751948b, 0x1805efd9, 0xfdfd225d, 0x8efeed46, 0x4f2c8b22,
  152099. 0xcb128e09, 0x96f7c5e5, 0x9d1090bf, 0xb4cbeca0, 0x0959d044,
  152100. 0x8e08cb04, 0x21c955f9, 0x68fa4fce, 0xbc1f279d, 0x0710ae9a,
  152101. 0xb021e14e, 0x881167f4, 0x64d16e9f, 0xbbc9f1a5, 0xf5a5c22e,
  152102. 0xe3420eea, 0x5f3716df, 0xd5c4e843, 0x971eb915, 0x28ffba81,
  152103. 0x64fc55fc, 0x7dd37578, 0x3427e54d, 0x15ebc7d0, 0x446e6a62,
  152104. 0x29269778, 0x547e249a },
  152105. { 0xa1ffda27, 0x4706868a, 0x7955cf50, 0xb4e6cdcc, 0x0a63f3d8,
  152106. 0xf65151e1, 0x9de5e70a, 0x5b4127ea, 0xf9342823, 0x3d2c09ba,
  152107. 0xaa2f7d51, 0x18c99d83, 0xddeec025, 0xa0c5bb1d, 0x03dcf1ce,
  152108. 0x7ffddf84, 0x616fdeda, 0xe57e4d29, 0x7932a1f0, 0xd2456569,
  152109. 0x3191d4e3, 0x7475e0e8, 0xc220218b, 0x3479bea1, 0x8bcb2505,
  152110. 0xfceb5c90, 0x3c6132e6, 0x1c685cea, 0xbfe6c1eb, 0xc42dc745,
  152111. 0xd2b08eea, 0x45a41cc0 },
  152112. { 0x4dbbf0e1, 0x3ea9b2c7, 0xa17cf70e, 0x41ff962f, 0x5eeb4c66,
  152113. 0xdc1ea758, 0xa9beb17e, 0x4f5412d2, 0xa285741a, 0x2c9e4f52,
  152114. 0x984fd11f, 0x93df7da4, 0x0df3184e, 0xb2afbddc, 0x2421e375,
  152115. 0x96323d25, 0x49df781e, 0xc87be1e4, 0x3d589bea, 0x145601ed,
  152116. 0x28fff6dd, 0x0f0bd9bd, 0x8a0f298c, 0x2d3259d4, 0xd88e6944,
  152117. 0x362d7a77, 0xb6ac2af6, 0xa84c06b6, 0xd087da02, 0xba850ac9,
  152118. 0x42ee40c8, 0x128763c9 },
  152119. { 0xacbac178, 0x29a80f07, 0x34b08f6e, 0x7cc20044, 0x70feded2,
  152120. 0xe9631d14, 0x86615767, 0xb2115da3, 0xcb088548, 0x7c75f5c4,
  152121. 0x9a2e8e03, 0x5b29d213, 0x8b881752, 0xfe9fda66, 0xc1de7ebc,
  152122. 0x3f1d8d88, 0x03218123, 0xb476565e, 0xb1c995f3, 0x07365561,
  152123. 0xb13eb71b, 0x2160cb18, 0x99b3a0eb, 0x7e8da513, 0xb20fcd74,
  152124. 0x5e8ca1f9, 0xb4126d72, 0x6a7e0067, 0x68bb637f, 0x1e8204b7,
  152125. 0xfc4f74d2, 0x75e96bcc },
  152126. { 0x0d19716e, 0x189d1fdc, 0x7c384525, 0xdf585058, 0xea987d2a,
  152127. 0x64a846d1, 0x6c07150f, 0x12b6bf83, 0x4d6fd5b7, 0x91d85d46,
  152128. 0x4f53f55f, 0xa9788836, 0x81509129, 0x60083bd8, 0xea876f48,
  152129. 0xa7672683, 0xc15b2489, 0xe80b2e7a, 0x42d1d992, 0x985ef8d2,
  152130. 0xcf3de492, 0x9c57b029, 0xb1487627, 0xfe02f83c, 0x8ae5b687,
  152131. 0xaeba4fe4, 0x5d6b8196, 0x8a86f09b, 0xa16e523d, 0xd88f566b,
  152132. 0xba268949, 0x309a6e9a },
  152133. { 0xbdfbe97a, 0xef27ee50, 0xb8c50c4d, 0x1a5fe70f, 0x7fe09f5c,
  152134. 0xcc7beb01, 0xbed36cc5, 0x8fa15a85, 0x7550ed3a, 0xc0c3acdb,
  152135. 0xeb908681, 0xc581ef87, 0xc49d5ccb, 0xa15b3362, 0x1fa264e8,
  152136. 0x0fbb1714, 0x8e1eee88, 0x267f8d8f, 0x21c2b63d, 0xd31ccfd6,
  152137. 0x53be7efd, 0x924dbe7d, 0xdb2a358a, 0xd42e877f, 0x75d68ac1,
  152138. 0xcf9673c7, 0x714fea55, 0xe35978fd, 0x5769b202, 0xeeb36653,
  152139. 0xd7593789, 0x0458258a },
  152140. { 0xa042dbdf, 0x5df71a74, 0x5779dfa2, 0x2d405857, 0x0d2e6657,
  152141. 0x0e66cba7, 0xca2e892e, 0x285d6745, 0x0f0e6b5f, 0xf56a8def,
  152142. 0xa30767c3, 0xe0ee851d, 0x43346b9c, 0x98c05658, 0xd6b3c742,
  152143. 0xb35fce26, 0x39777e00, 0xc0895bff, 0xe7b6d886, 0x83c8f6a6,
  152144. 0x4f02904b, 0xbee14843, 0x2e84ec34, 0x7f74915b, 0x96d10991,
  152145. 0xbaaf663c, 0xe41facc0, 0x004b8757, 0x6f86c029, 0xa2b880e5,
  152146. 0x95b77358, 0x53f4a3e0 },
  152147. { 0x89fc48e7, 0x11bb08ce, 0xafab5aeb, 0xba60c577, 0xa0c1cb5a,
  152148. 0xf06bcbf8, 0x79757cb6, 0x7d2efaea, 0x76319160, 0xe26d90b1,
  152149. 0x2b77b7a9, 0x42aa1ab6, 0x285df2bf, 0x38eec0cd, 0xf3a8f7f0,
  152150. 0xd35947f5, 0xfc1cb5b5, 0x97c8dc0e, 0xc45845cf, 0xfeb8cca0,
  152151. 0x249e26f2, 0x16e8d989, 0x483ed89a, 0x7c264e6d, 0x51d91073,
  152152. 0x13a3f145, 0x305e99f0, 0x8501562e, 0x6908d563, 0xaaf98d74,
  152153. 0xd723d236, 0x0a99e653 },
  152154. { 0xabbc0559, 0x23536f46, 0x9aa1a160, 0xc163067b, 0x0c1681b5,
  152155. 0x229fd229, 0x1378e907, 0x61254be1, 0xab793a2d, 0xc60ff57a,
  152156. 0x466552db, 0xa6f2df8b, 0x8c170a36, 0x9ad31893, 0x29b74d9a,
  152157. 0xc5cd9abe, 0xf7848523, 0xcf747273, 0x0d0e3063, 0xc126a93a,
  152158. 0x4248e3d8, 0xfe2021e3, 0x8323ddfa, 0xd97343ee, 0x332639e7,
  152159. 0x9f768775, 0x75325548, 0x9650fc31, 0x3eebf7ea, 0xb595dbd1,
  152160. 0x010fcbc0, 0x3a95cb45 },
  152161. { 0x39d7ff2e, 0x954e68cb, 0xc1d5c48f, 0x8dd1cb4b, 0x7169438a,
  152162. 0x02a92c77, 0x91cad8ce, 0x7965c0b0, 0x32cd08d2, 0x0c5798ab,
  152163. 0xa6902bda, 0x1a5bc3c3, 0x5186d218, 0x545d0925, 0xd27e64db,
  152164. 0xf0077cdb, 0x8cd092da, 0x0157caa4, 0x24532ab3, 0x2a2fa3a0,
  152165. 0x41ccaba3, 0xa5fb639b, 0x4744aee6, 0x01702dc1, 0xcdba93da,
  152166. 0x485bb436, 0x329784f1, 0x93597f66, 0xdad672c3, 0x5d713c1d,
  152167. 0x030b7245, 0x366d222e },
  152168. { 0x573ea5b2, 0xd50b4875, 0xa90da44d, 0x0fce401b, 0x7a1a0310,
  152169. 0x7b53fa65, 0xcf114460, 0x722a80a5, 0xa538bf49, 0x0b8ebf05,
  152170. 0xd32acd21, 0xae141147, 0x7b5ad07d, 0x6692712c, 0x3f48ca07,
  152171. 0x6dc5fee7, 0x2b8a78d8, 0x98ed1499, 0xdd2f1759, 0x4e8b3145,
  152172. 0x5f971b8e, 0x43408de1, 0xadf1b368, 0x055ea6dd, 0xe5932b7e,
  152173. 0x4bb76e73, 0xd30893fd, 0x44287153, 0x0661bfda, 0x173dccd2,
  152174. 0x79defd25, 0x9072ba99 },
  152175. { 0x9620ea39, 0x474de4dd, 0xc831cee8, 0xfbf1649f, 0xcd3a9c43,
  152176. 0x0b0e8bb1, 0x3f3df1d5, 0x6a38286f, 0x8f0ec9b3, 0x4ed072b3,
  152177. 0x729c09e3, 0xa6e4c987, 0x8ad12242, 0xea3e8ac6, 0xfbdfa5ba,
  152178. 0x6ae0e22b, 0xb0a0f592, 0x56171ecf, 0x6b871f8d, 0x33b2886d,
  152179. 0x35e11bda, 0x6b19bea9, 0x7f0f153f, 0x4d815a40, 0x7d6c02ee,
  152180. 0x7e608d97, 0xb6a88f46, 0x7e8f23d9, 0x439d1654, 0x26ac9652,
  152181. 0x35546c29, 0x8d92c6bd },
  152182. { 0xabeb0ff7, 0xb3e0d7ce, 0x3e0e42f8, 0xfbe35254, 0xde808499,
  152183. 0x57d1b226, 0x1cd44bc3, 0x9ece2e1f, 0x435cfee1, 0x1245adbc,
  152184. 0xf93f581c, 0x874ee840, 0xbda0b947, 0x916a779c, 0xfa57ae0a,
  152185. 0xabcc815a, 0xf0a621b0, 0x97adec2d, 0x81f90bdc, 0xbe6a502b,
  152186. 0x53bde63d, 0x54bf9de1, 0x78884c25, 0xa88fdabf, 0xcbbb5470,
  152187. 0x30aa52b1, 0x29053ef5, 0xf805396c, 0x8dd827ea, 0x8d43d898,
  152188. 0x5c1ae5c0, 0x4e4bec17 },
  152189. { 0xfcc09676, 0xbf8483a2, 0x19ea9a94, 0x457c4a3f, 0xd702a5dd,
  152190. 0xa6852ef3, 0x843fe7d8, 0xe7915fd2, 0x16e35158, 0x644bba98,
  152191. 0x9ed746f0, 0x8d1b95d0, 0xb90af0b5, 0x47704581, 0xd4fd135e,
  152192. 0x0bd4bc6b, 0xb4e833a5, 0xa6dce067, 0xff56a9a1, 0x2c0e8f30,
  152193. 0xec2c63fe, 0xa9c80800, 0x98f508a8, 0x449c20a5, 0x3292813a,
  152194. 0x02b94cb3, 0xec7e81a2, 0x647e3d28, 0xb4877677, 0x72e67d1a,
  152195. 0x6f9ded24, 0x7a4aa3f5 },
  152196. { 0xe27a0045, 0x559ef1ba, 0xb242cb50, 0xdc812d4f, 0x39cf8d24,
  152197. 0x23a478e4, 0x9b3f9c54, 0x97544fc5, 0xaffa1fcf, 0x5ac68132,
  152198. 0x34a2c83b, 0x74f8fee0, 0xcd3f4bb7, 0x96cc640f, 0xb0512ea6,
  152199. 0x775dce9d, 0xcdce381e, 0x67dca19d, 0xa9d3fe55, 0xc1eeb3f3,
  152200. 0x1a19274f, 0x38e0bf42, 0x28d69b12, 0x15992fb4, 0x9fd09df8,
  152201. 0x48fcebde, 0xb41ab5df, 0xdc9dfa4f, 0xc0a269c5, 0x0cbd7dc8,
  152202. 0xf7f0ade1, 0x60282a7b },
  152203. { 0xdceea2e7, 0x7c07e538, 0x3c42061d, 0x38a322c8, 0x4f1f6516,
  152204. 0x676828f9, 0xc7776a10, 0xf21b69fb, 0xb5e6b405, 0xc63a3417,
  152205. 0x91a7b642, 0x4c99f258, 0x2cad1440, 0x38692ca8, 0x00869bcd,
  152206. 0xf1e82ffe, 0x16fe466a, 0xc30b714e, 0x19019138, 0x5fb742f9,
  152207. 0x0fa516ae, 0xe90166d0, 0xd8c73a43, 0x5550f7ac, 0xfbc5c372,
  152208. 0x2d6a407d, 0x68cc39ed, 0xe47a7539, 0x4a5fbe70, 0x3fd286d9,
  152209. 0x23c6b942, 0x5f4ae9c7 },
  152210. { 0x53f4d561, 0xd96a2dda, 0x16da1992, 0x286d45d0, 0xfdd4b051,
  152211. 0x449a01fb, 0x9f2195ea, 0x25488a0d, 0xa37661b3, 0xc4151b0a,
  152212. 0xf9e5ee02, 0xb98c471e, 0xa8658817, 0xa4bca86e, 0x7a68fc0a,
  152213. 0xbbcadb87, 0x6b7366a9, 0x88b34649, 0x15661c2d, 0x32ee98d4,
  152214. 0xc901420c, 0xf5b3b4c6, 0x2f2752af, 0xa2352735, 0x510e4d9c,
  152215. 0x2f64ce73, 0xaca4aa80, 0x939a7f26, 0x401aa503, 0x9cd3e291,
  152216. 0xdc46afd2, 0x92a01423 },
  152217. { 0x1c2f7dbd, 0xe9f24be1, 0xb7d527fa, 0xda8c900f, 0x8648f128,
  152218. 0x963e25bb, 0x48141941, 0x9ab713e2, 0x7a6756fb, 0xe87f7d01,
  152219. 0x058d90bd, 0x274dd85e, 0x82566abd, 0x823fee7a, 0x74240195,
  152220. 0x9f6230d7, 0xacb5e46e, 0x04579f2c, 0x16a4c87e, 0x2a226263,
  152221. 0xd99b0857, 0x9ca19a43, 0xe488789e, 0x86dc2ba3, 0x9406c3bd,
  152222. 0xf960b5b9, 0x8960957e, 0x6f2c428b, 0x161c515b, 0x90748706,
  152223. 0xaa88cb9b, 0x0fc8fe1e },
  152224. { 0xfeb90f2d, 0x68ae1bed, 0xa48b1559, 0xf393bb3c, 0xf64e9635,
  152225. 0x2be62f9c, 0xf8be75c2, 0x354c2410, 0x5e6f7529, 0xbd7ea703,
  152226. 0x162cab31, 0xc264868e, 0xc860f3ff, 0xb1391e70, 0x1d89837e,
  152227. 0xdf367c75, 0x2bf32941, 0xe150b6b4, 0x78c1318f, 0x95e8f46e,
  152228. 0xa2c4b160, 0x2b3f1dab, 0x701afbf3, 0xc6ccf5ce, 0x5e8874c5,
  152229. 0x3ad27530, 0x5dc6dcbe, 0x39285e51, 0xd99892dd, 0x3c954d86,
  152230. 0xdfd3789f, 0x2d0ba862 },
  152231. { 0xb472e1af, 0xeacd8ee8, 0xb76abbcc, 0xeb354eae, 0xd0d93fbd,
  152232. 0x9b520bf8, 0xfe6fc706, 0xfccd60d7, 0xa4ee2f39, 0xa9353dde,
  152233. 0x9a81e51e, 0x5eb0925e, 0xd1366777, 0xee334da1, 0xd5354d69,
  152234. 0xc1d28c9f, 0x92a5ed54, 0xb9771755, 0xb7f70d81, 0x5d3e367f,
  152235. 0xa933ae7a, 0x7be7eeca, 0xe23cfbb7, 0x264cf1f9, 0x89497681,
  152236. 0x0d129f4a, 0x09b6235b, 0x705375a4, 0x48a376da, 0xccf64c75,
  152237. 0x4d41dbfc, 0x963c8712 },
  152238. { 0xde36a814, 0xbae290cb, 0x733b12b5, 0x9bdb0195, 0xf77fe0e1,
  152239. 0x0ebad867, 0x29720cea, 0x0a7d19fd, 0x9029ec72, 0x434d7651,
  152240. 0xbb51911e, 0x856aff17, 0xd80a7f60, 0xd0a25d9a, 0xf848c106,
  152241. 0xffca86af, 0x43ad749c, 0x53e8bdf9, 0xe3e696bb, 0xfb9e0284,
  152242. 0xeeee4215, 0x3eb6630a, 0x2ecf3c63, 0x9d8fbb9e, 0x4e00c0c0,
  152243. 0x71da4ffa, 0x5d57beac, 0xb296be59, 0xa8cec7ef, 0x1751fbad,
  152244. 0xff55d7bd, 0x2d03eb3c },
  152245. { 0x04f2ec1d, 0xeb16925f, 0x0d147ee2, 0xa878f276, 0xaad9d9e0,
  152246. 0x442df604, 0x3f71035b, 0x891df44b, 0x8cb95d5b, 0xc28272b3,
  152247. 0x5ee8ed23, 0x6f14efb5, 0x13b0f3e3, 0xf3c4460f, 0x6bd7335e,
  152248. 0x889f9bd7, 0xf755ba6e, 0x889ee771, 0xed219b6c, 0x626984fe,
  152249. 0xec2ee411, 0x2d44c737, 0x63efcd37, 0xb94385a2, 0x6637826b,
  152250. 0xd909321b, 0x3ee6b7a7, 0xc24f8a79, 0xa7cf61b7, 0xa3ca8d24,
  152251. 0xc54bacd9, 0x842e40c1 },
  152252. { 0xa661d843, 0x5a268ed6, 0x4f5b30cd, 0x02328cca, 0x1311e177,
  152253. 0x16e6fed1, 0xc6695967, 0x690decb4, 0x57b2e280, 0xbdac5bf6,
  152254. 0x1efe42d0, 0x827f82ca, 0xca5fca2f, 0xc554ec0a, 0xdde45506,
  152255. 0xac5276c1, 0xe3077513, 0xb7f4cb08, 0xcc8797cc, 0x8caf6d9a,
  152256. 0x0d9332d2, 0xd5964814, 0x285a409f, 0xcc6ae297, 0x6223d093,
  152257. 0x7773c2a5, 0x5128fc09, 0x2d5266ac, 0xbc31fe6c, 0xa596b7cb,
  152258. 0xcac91328, 0x0e63319a },
  152259. { 0xf0360ac2, 0xb5cd2fad, 0x285e605a, 0x86b660de, 0xe25b9b14,
  152260. 0x82c6cf10, 0xaa9ac554, 0x9d5fa38d, 0x526c070e, 0x3dfcf1b8,
  152261. 0x3fccc52d, 0x0379a96b, 0x0bfcc7f5, 0xe3659c29, 0x69d3e6a1,
  152262. 0x5b1a3db5, 0x9b7b42d5, 0xb41528b5, 0x9c22a006, 0x934defa4,
  152263. 0x9b4ce3b6, 0x90f38018, 0xb3abaf32, 0xb073bc04, 0xff8389e2,
  152264. 0x27a5a222, 0xffa5a35b, 0x0b7a9d51, 0x28e1a7c2, 0x4939ecef,
  152265. 0x1872705a, 0x88839da2 },
  152266. { 0x701ce29a, 0x56b66c30, 0x58981d50, 0x3acaf126, 0x105f9f21,
  152267. 0xd4dafc0c, 0x373e3d13, 0xfee571e6, 0xfa2ee3ca, 0xe7269c86,
  152268. 0xdd20385a, 0xf5cca64a, 0x3000e9ac, 0x217f2757, 0x0e7273ef,
  152269. 0xc934db47, 0x355b6776, 0x4294f4f7, 0x6fc05180, 0x1faa36b9,
  152270. 0xb052190b, 0x8f88b1db, 0xe9eaef52, 0x35791b90, 0xdb681b90,
  152271. 0xf37fb2eb, 0x4415c369, 0x39d0a51d, 0x1d2e21c9, 0xfc59cca7,
  152272. 0xa1f50c26, 0x64128cfe },
  152273. { 0xe8f5b0b5, 0xf03678a2, 0xd340f059, 0x5c7e249c, 0x93ca7cec,
  152274. 0x41440441, 0xbc83af98, 0x075ca346, 0xfaa8bbb0, 0xf39f0033,
  152275. 0xf38230f7, 0x3d18f0ed, 0xd448f345, 0x78dff00c, 0xd51aa475,
  152276. 0x849228c0, 0x30c928d1, 0xdd4e2708, 0x8f12cfd3, 0xc66ba686,
  152277. 0x88b3a206, 0x091049db, 0x016dae01, 0xd865d059, 0xe253e37d,
  152278. 0x4599e905, 0x7ce9871b, 0x322cf0c2, 0x174a132e, 0x014f54da,
  152279. 0xbdabcbda, 0x93634a09 },
  152280. { 0xa9a2e304, 0x62826b27, 0xc1a4c124, 0xc57e1866, 0x22381710,
  152281. 0x913ab832, 0xa9847cfe, 0x7e9b6b85, 0x2b5f46fd, 0x29655cf1,
  152282. 0x8038e66d, 0x7295572b, 0x6fa95eab, 0xe4cba601, 0xb9deda81,
  152283. 0xbbc11071, 0x3f1cf61e, 0x97f0009a, 0x373e0cfb, 0x5372777b,
  152284. 0xd139d63b, 0x302f909c, 0x4f87d78e, 0x1ed672da, 0xb4048763,
  152285. 0x362077a3, 0x9dcc22b2, 0xc408c32d, 0x26deeee7, 0x4b4c5bf2,
  152286. 0xbc06357e, 0x266cb467 },
  152287. { 0xb56363e8, 0x6faa4154, 0x3c1aa4db, 0x4b4fd078, 0x2b9e6597,
  152288. 0x14358dde, 0xfa004b84, 0x5b34ae3e, 0xf19911a6, 0xcf44b2ec,
  152289. 0xa536bf78, 0x55caa833, 0x8870dc95, 0x606e1eb9, 0x09f3511d,
  152290. 0xe3c3287d, 0x9d5cf364, 0x68b2f4eb, 0x63ab8c9e, 0xc154e892,
  152291. 0xc36ab611, 0x1548828e, 0xa1b7d120, 0x0932bfcb, 0x5315b8d7,
  152292. 0x7ee7b5bc, 0xf7473ac1, 0x782fd0d1, 0x3c8f2af3, 0xbcb029a8,
  152293. 0x52454ee1, 0x4b1d5a1b },
  152294. { 0x63d52c0c, 0x12fe5174, 0x188c099d, 0x3735525e, 0x360e3956,
  152295. 0x5c621563, 0xacfa5a43, 0x88b3f1ca, 0x797e8107, 0x90123a0a,
  152296. 0xb15e080a, 0xba31f6b5, 0xfca3dada, 0xd7de5e12, 0x0df511c8,
  152297. 0x3287361b, 0x65757d4e, 0x7cc800d4, 0x5207ec91, 0x10810f3d,
  152298. 0x30eea0e3, 0x0d4e56f1, 0x3ea5a2ec, 0xbbf7ee13, 0xbe6abbd0,
  152299. 0x6fc07762, 0x120bf619, 0xc831fdce, 0xb622d42a, 0xe07439fa,
  152300. 0x508e4b27, 0x8186b93f },
  152301. { 0x09312867, 0xc619d154, 0xbfaf7db4, 0x7e042c05, 0x1f5f5dda,
  152302. 0xc1cf1668, 0xa4fc3d82, 0x50aa5057, 0xce68b8fe, 0xed30ed65,
  152303. 0xbeb4d644, 0xecb01c0b, 0x831c0497, 0x7b5dc444, 0x9b7d9b1c,
  152304. 0x351e6a00, 0xd9477c91, 0x4bb863b9, 0x05d4110a, 0xaba65891,
  152305. 0x43580b7a, 0x30086cf4, 0x90be357e, 0xb139c076, 0x27b5214e,
  152306. 0x12bfff1a, 0x22c3ab57, 0x79cfc6d7, 0xf34a9bfa, 0x4743de57,
  152307. 0xc9ee2b2a, 0x0bf97e97 },
  152308. { 0xdda19e96, 0x96ec4ec8, 0x6c306e8b, 0x54ce18ea, 0x65f6918a,
  152309. 0x7e83612b, 0x0d9a0d99, 0x1ac6f68b, 0x62fdcc09, 0x98a697a4,
  152310. 0x95bc3e13, 0x65ce25f1, 0xb3939730, 0x1896ecda, 0x32f12806,
  152311. 0x9eb81a0f, 0x1d2dc7df, 0xd3d7416e, 0xad473599, 0xe22c7976,
  152312. 0x9f5ef439, 0x3de37a9a, 0x9e69d94e, 0x6b7ac0ab, 0x0a9d0bc8,
  152313. 0xe6bfa9e0, 0x5676f120, 0x576a870d, 0xfeaac23f, 0x3bd91bb4,
  152314. 0x3e40aabb, 0x8fe5482c },
  152315. { 0xce9a4d1e, 0x85ae67c2, 0x4f1d2038, 0x4c3eb803, 0x25d06192,
  152316. 0x5c6c8f3a, 0x308fb41c, 0x803de0ad, 0xe71c294e, 0x9961f5bc,
  152317. 0xf02eb0da, 0xdc62078d, 0xb64ae8b6, 0xc87ef515, 0x50b4d18f,
  152318. 0x69679f1e, 0x52199f43, 0xc5c009a1, 0x0f640a5f, 0xa7d484be,
  152319. 0x23dab566, 0x4c918bb1, 0x64275d2c, 0xa67c114c, 0xcad2ded6,
  152320. 0x95a913b9, 0x6b4b5c8d, 0x189ed18b, 0xb42d3bf6, 0x4aeb6206,
  152321. 0xbbc8bc3f, 0x3928c669 },
  152322. { 0xdacb4b64, 0xde4bea4a, 0xf26179a1, 0x03f62a44, 0x7a9112a4,
  152323. 0xf3aac94e, 0xd36f331e, 0x90448fbd, 0x407b85c4, 0x426042bc,
  152324. 0x2121b77b, 0x5ad8a596, 0x67cee984, 0x31674a4f, 0x4e3b2f0d,
  152325. 0x7fae8bbe, 0xa7c930eb, 0x681df6dd, 0xc259d0d4, 0xadeefa98,
  152326. 0xbea1c1fd, 0x1b14d9e6, 0x21d405d1, 0x3baadc8b, 0x73892754,
  152327. 0xf01dff93, 0xf071cde4, 0x81c35b3e, 0x9150d0d9, 0x1704d2e1,
  152328. 0x355134f6, 0x6ccc888f },
  152329. { 0x7ad7504c, 0xf8d36f0e, 0xf7959ddd, 0xbca3265f, 0xfede67aa,
  152330. 0x0dcd1ede, 0xbaebf32f, 0x1276f4ce, 0x014edcfc, 0x6825a6e6,
  152331. 0x99ad8eb7, 0x0b8c1a82, 0x09b8ce1e, 0x312024a9, 0x9cbd351a,
  152332. 0xcb8fd98b, 0xfab1e8be, 0xa4841378, 0x3973cacf, 0x17ed0f5d,
  152333. 0x259d5254, 0xa17e1484, 0x74b91393, 0x53d5b843, 0x1aca3ce9,
  152334. 0x8f792b21, 0xc8c0f815, 0x035ff110, 0xad4ed7bd, 0x6afa6357,
  152335. 0xb26faef9, 0x2f151980 },
  152336. { 0x29d2d439, 0x0c8631da, 0xbc039955, 0x121fbbc2, 0x6c05b75b,
  152337. 0x3e5a9792, 0xb6ce47ec, 0x6d6cf4c0, 0x9d88c658, 0xbaaa1767,
  152338. 0xf3355a17, 0x031db9e7, 0x0aef5a85, 0x8381e3d8, 0x15a31bdf,
  152339. 0xc71db290, 0x9498fd7d, 0x638f6b74, 0x13beeef6, 0x44edf3f9,
  152340. 0xf4ab67b3, 0xe6173271, 0xfd22df11, 0x3a202c70, 0x205c4e92,
  152341. 0xf7be0389, 0xa8eb9920, 0x1c219085, 0xbeb54aaa, 0x6c805ce8,
  152342. 0x0ac58d65, 0x354b05b7 },
  152343. { 0x7a9170e9, 0x7171e236, 0x4cad50cd, 0x01eec42d, 0x3cddccfb,
  152344. 0xffbe824f, 0xa66cae1a, 0xa73e8ce3, 0x965c7d01, 0xb7138a7f,
  152345. 0x5c3d971e, 0x00058e3f, 0x2ff0a72b, 0x52591ac3, 0xbbbce76f,
  152346. 0xa32fb5bc, 0xa9f81a18, 0xf3241ab8, 0xeca68630, 0xf31d3332,
  152347. 0x4482f13b, 0x847af9fc, 0xa4681be2, 0x6196e217, 0xe55efcf9,
  152348. 0x9938f932, 0x70acc705, 0x3e7dacb8, 0xcf09fac2, 0xd41be893,
  152349. 0xae3523a1, 0x48dc55c4 },
  152350. { 0xa5092193, 0x8e623826, 0x6898970c, 0xe46ec362, 0x25c9eb41,
  152351. 0x2f1356af, 0x83c7d245, 0x41780640, 0x97d00e38, 0x982def67,
  152352. 0xa512151c, 0x382eb6e7, 0x8af58869, 0x154e1077, 0x8a51cf02,
  152353. 0x18707075, 0x71313c58, 0xcdeba9f7, 0xba155904, 0x5d67b973,
  152354. 0x1d0d7b3a, 0x851c9f4b, 0x8b8af2cd, 0x19f29d71, 0x986b8d62,
  152355. 0xcb94ccff, 0xb93b9c33, 0x8725e24b, 0x66e38c68, 0x405ce4c5,
  152356. 0x0b6dc021, 0x5f6a8edd },
  152357. { 0x8f9a8690, 0x83704ca5, 0x2f76a407, 0x3f369766, 0x69201028,
  152358. 0xfbc12d8c, 0xbce3a4cf, 0x4cd58f16, 0x04aab26d, 0x7804664a,
  152359. 0x4ea457a8, 0x005cfbba, 0xb8a59794, 0x537951b3, 0x4fe1f739,
  152360. 0x4ca2b9e4, 0xdf325797, 0xe4428acd, 0x0ea243db, 0x648da342,
  152361. 0xf43ce01e, 0xcce6562b, 0xf27db490, 0x840f0421, 0x8bfb7cf0,
  152362. 0x156ccb70, 0x5a8797d3, 0x9b33480d, 0x9eb814bb, 0x2e12e07a,
  152363. 0xca7f87ac, 0x1ca65072 },
  152364. { 0x2b9d25a0, 0xfbb321cf, 0x40a746db, 0x66affdca, 0x59e368b5,
  152365. 0xc1c1530e, 0x7d80068f, 0x56ed1ea4, 0x5647dd68, 0x9b74d8fe,
  152366. 0x89b78da8, 0x1d96b507, 0x8bbe3391, 0x39b75243, 0x0d858c5f,
  152367. 0xef8d443e, 0x9646aa34, 0x4dd2db49, 0xe667543c, 0x7fad3bd1,
  152368. 0x68980985, 0xd0d710c0, 0x49facaba, 0x9f7aff32, 0x14f9a192,
  152369. 0x055dec1c, 0x1fb307a1, 0xaca66399, 0x35ffff64, 0xac44fd91,
  152370. 0xcbad3cee, 0x462cafb6 },
  152371. { 0xde3237dd, 0x1660a647, 0x82b87404, 0x95f735cc, 0xddfa55f8,
  152372. 0xf7879f59, 0x726b914a, 0x15ef043e, 0x1c93e298, 0x1875393d,
  152373. 0x6ef18331, 0xa1a2be74, 0x25a9a12b, 0x4e7e8dfc, 0xa9c3917f,
  152374. 0xdfefc97d, 0x0a2ebe41, 0xbc875d03, 0xa732d1cc, 0x0f75d235,
  152375. 0xd9baa6d3, 0x06fee7fe, 0x65f48576, 0xaa784fab, 0x513f83c0,
  152376. 0x23155e22, 0x3e8f9d13, 0xd2fb7718, 0xb546eafd, 0x2a291503,
  152377. 0x6cd93608, 0x1293c98c },
  152378. { 0x49d53b77, 0x72781251, 0x96eafac7, 0xa6ab403d, 0x4a36b711,
  152379. 0xb7d7c7db, 0x87e771c1, 0x8238c708, 0x33b37522, 0x495f6abf,
  152380. 0x8c87530d, 0xb0b0289c, 0xe77b111a, 0xca83cb86, 0xa1bd189e,
  152381. 0xbe1c0fb8, 0x1ae9d7c7, 0x58cfb2fb, 0x4940c3e8, 0xd05c23c5,
  152382. 0x74ad9107, 0x16e79e41, 0x064e7142, 0xa0a47f05, 0xfdfd614f,
  152383. 0xc6929cd4, 0x3946988b, 0xedb2584c, 0xe46f8fb1, 0x73e4b5f3,
  152384. 0x68ea94ba, 0x53b79aa1 },
  152385. { 0x44bbb6a1, 0x216fafce, 0x67821728, 0xd3a5bba0, 0xa9dd939a,
  152386. 0xef1e4b30, 0xf19efafe, 0x022eaf3d, 0x7b4ec014, 0xfed5abce,
  152387. 0x512c6738, 0x64968ee6, 0x29fe89a2, 0x23119869, 0x47397c05,
  152388. 0x0d539d8d, 0x234596c4, 0x6400bc54, 0x5346611d, 0xb9287f58,
  152389. 0xc9d5da0f, 0x04099903, 0xc83af2a8, 0xe5ef4997, 0x328151e1,
  152390. 0xc89dc01b, 0x58401104, 0x150fb4a9, 0xf3872c9d, 0x40a6f7d5,
  152391. 0x56c2e833, 0x8290d6d1 },
  152392. { 0xd8546946, 0xf84637c6, 0x69ec57fa, 0xda134a39, 0xd789007e,
  152393. 0xd42359a4, 0x0dc7b809, 0xb42557fe, 0x2d6784a9, 0xe62ae52d,
  152394. 0x0bcadb5f, 0xa2714ca6, 0x33aafca5, 0xcc208de6, 0xed967811,
  152395. 0x2380ed5c, 0xdb321660, 0x6e6b55e9, 0xa675235a, 0x1bead02c,
  152396. 0xb33fa0e1, 0x51cc6ef9, 0xf06a2a08, 0xfd223e26, 0xec47b3cf,
  152397. 0x00f332e1, 0xa0aa984e, 0x459f297b, 0xee952e14, 0x6fa1d969,
  152398. 0x304fabb0, 0x506ef1ab },
  152399. { 0x35bff163, 0x11b4eb27, 0xea9fa984, 0x7130b96f, 0x9deb27ce,
  152400. 0x66aceb3f, 0x9dd1c3d5, 0xa2daf1a5, 0xa73075aa, 0xf5090a7e,
  152401. 0xe3071b58, 0x36a6af39, 0xdf73ad9c, 0xa28d633d, 0xbdc89a16,
  152402. 0xdd354cac, 0xd4dcbc3c, 0xdfea3423, 0x379d92d1, 0x6eec74d2,
  152403. 0x8eed6765, 0xe14a456f, 0xfa8feb1f, 0xfabe7743, 0xb98fcbc7,
  152404. 0x1404ccf8, 0xf71a706e, 0x6ccd2fbf, 0x4d85c678, 0xdaaf3fdb,
  152405. 0x15200344, 0x415b7dbf },
  152406. { 0x7d8377a7, 0x97010586, 0xcb803272, 0x068a3d68, 0xf03a4c32,
  152407. 0xfd67d289, 0x93c8f290, 0x4bc7095d, 0xe9e5a2b8, 0x712fa13c,
  152408. 0x0feb9f3b, 0xfc6ac6c6, 0x6e0e54c2, 0x0cda36d9, 0x86320a01,
  152409. 0x45499751, 0x97f00f11, 0xf9318c91, 0xe6936508, 0x01dc4c3f,
  152410. 0x85f068aa, 0x769a2ef9, 0xa2b5511c, 0x3522cef0, 0xb4122e05,
  152411. 0x006965ed, 0xc175d43f, 0xfce0fafc, 0xec831d59, 0x525dc9bd,
  152412. 0xaf58879d, 0x1ec314f1 },
  152413. { 0x2c8310c2, 0x0663feef, 0x457e3f74, 0xaa7e14da, 0xe5346887,
  152414. 0x392b10fc, 0x637ec2c5, 0xcde4a38f, 0xb542f8df, 0x50773320,
  152415. 0xf7de1711, 0x341302f9, 0xae4b9bc6, 0x018b1c63, 0xdd2f9e6f,
  152416. 0xf001c46e, 0x26eccfa0, 0xd3bb0a97, 0x7746e0c7, 0xa931b99d,
  152417. 0xf5875aec, 0xe0c8b6f7, 0x96939c82, 0xbb32f17c, 0x3de5a664,
  152418. 0x765135d2, 0x52abfa6b, 0x71936cb4, 0x2dc105de, 0xad5cc08f,
  152419. 0x7fff5788, 0x17e91d12 },
  152420. { 0xb7e051ca, 0xbe92ced3, 0x19c776d4, 0xc644d4fd, 0x0086784b,
  152421. 0xc8ab4b52, 0xce9d6b31, 0x3ea66227, 0xd289e9c7, 0x395249a3,
  152422. 0xd12a19ee, 0x54509e65, 0x8c365aec, 0xa7bd4692, 0x77963e0e,
  152423. 0x354997e4, 0xb599732d, 0x0d765957, 0x91d4a3b6, 0x99584aeb,
  152424. 0x1deb3e28, 0x6e653ea4, 0x572571df, 0xca7c98ed, 0xb18ae1f9,
  152425. 0xf301a38f, 0x63f7b97e, 0x1629f7c2, 0xafc4a0d5, 0xdf242282,
  152426. 0x3ddd0c01, 0x118f3b4b },
  152427. { 0x7ad4762b, 0x74a0a0a8, 0x8c58d175, 0x1aef84da, 0x4cf76d86,
  152428. 0x16ff4960, 0x7e60d98b, 0xc0be8786, 0x3ecc1dba, 0x83637ffb,
  152429. 0x5dd6147a, 0xc244a609, 0x5b0846e5, 0xa3e17834, 0xe77a4c05,
  152430. 0x735eb686, 0xdf758695, 0x5bc18b4f, 0x1bdfe52f, 0x15618d0b,
  152431. 0x00715ba1, 0x878ecc0d, 0xc2dd617f, 0x1dbdbd1a, 0x21b61710,
  152432. 0x21d2b631, 0x44f593c2, 0x22ce8a79, 0x44f17024, 0x3b9b536a,
  152433. 0x8d03e727, 0x01d0a67c },
  152434. { 0x1e46533c, 0x7b964236, 0xfb88c2ae, 0xe9477990, 0xa42c4a18,
  152435. 0x019b5d16, 0xd83c7a45, 0x7135e81d, 0x4cb663e3, 0x74a69bdd,
  152436. 0xe76c0d63, 0x7b67ecdb, 0x11e68da6, 0x03d54521, 0xd2e8650a,
  152437. 0x596cceb5, 0x2af03b37, 0xcd572dfd, 0xfabd5952, 0x52364ba1,
  152438. 0xb4ed8569, 0x7f47d456, 0xc950d5d4, 0x5ad8b572, 0x486e2f84,
  152439. 0xcadd2dfa, 0xc56bb044, 0xdd527b43, 0x997c08e6, 0xc9adba24,
  152440. 0x7da6320f, 0x1b625b06 },
  152441. { 0x4fd8446d, 0x44dfaa7b, 0xaf6febeb, 0xc01b2f01, 0xfe8838b5,
  152442. 0xbf444388, 0xbba9758b, 0xf33c434f, 0x87156bc9, 0x2b971cba,
  152443. 0x1f49098b, 0x6b245e5c, 0x2b41c5dd, 0x87dcb534, 0x34d852d7,
  152444. 0xdb1f80c6, 0x2433da34, 0x6d6e3258, 0x3f7df0c2, 0xf6682065,
  152445. 0x360cb365, 0xc4ca567c, 0x9826656a, 0x321faac2, 0xbf069768,
  152446. 0x13f5ca6f, 0xa7076639, 0x15397921, 0x8400736e, 0xbdf14328,
  152447. 0x19fc948d, 0x333eca96 },
  152448. { 0xac775d81, 0x23337948, 0xd41dbbca, 0x38c2518f, 0xbcfce948,
  152449. 0x623c7a4f, 0x54703fe7, 0xaad36236, 0x13fb3b5b, 0x2b3a13a4,
  152450. 0x7f5c01f0, 0x5db3565a, 0x52359661, 0xd72408dc, 0x1d616e91,
  152451. 0x5a17f8e5, 0xcb25b999, 0x90c16eeb, 0x3393743e, 0xf35e8cf1,
  152452. 0xe54b64a7, 0x987da74a, 0x65cd449d, 0x557b322a, 0x37e7b15d,
  152453. 0x765082a5, 0xf2cd134f, 0x4d25c742, 0x4ccf0746, 0xae9d9c07,
  152454. 0x8728d135, 0x72fc2110 },
  152455. { 0xf96004c8, 0xa906b203, 0x458055ff, 0xd83f95cf, 0x55f35909,
  152456. 0xd77d5867, 0xe550c8ee, 0x4a9ea6fb, 0x55a06081, 0x91c8cca9,
  152457. 0xbce82062, 0x4a1fee78, 0x9a3df85e, 0xeb9ade06, 0x7d3de666,
  152458. 0xfbbdcf0c, 0x5d336d51, 0x228a391b, 0x5c2ffc3c, 0x760f8d28,
  152459. 0x2f7b165b, 0x1ee48de3, 0x56177040, 0x03803d84, 0x9deff9a0,
  152460. 0xe573f648, 0xa17e35a4, 0xe1a2738e, 0x8840a6c6, 0x238ef17c,
  152461. 0xb11ed92d, 0x480946f8 },
  152462. { 0xfd71f119, 0x84c747a8, 0x53eb3695, 0x19e65c5e, 0x6298587a,
  152463. 0x0e2f6786, 0xab18d6f4, 0x48a48899, 0xc630b8c0, 0xa1a99024,
  152464. 0x2caaf892, 0x84975096, 0xe20fd624, 0xc8869aba, 0x6c2b7dd4,
  152465. 0x3b72b04d, 0x0992f7d0, 0xe2775eb6, 0x7d06e684, 0x0089c06e,
  152466. 0xe4bbd007, 0xcb3b4361, 0x4ba846e4, 0xa1ae666b, 0x46464d9e,
  152467. 0xc01c2eb2, 0xc1f8539f, 0xf86f2be6, 0xcf68afc7, 0x16e8e8ae,
  152468. 0xc7386902, 0x8dab61fd },
  152469. { 0xd54d1d45, 0x42a5c903, 0xff4f9ba2, 0xacd4297e, 0x34d478b4,
  152470. 0x2d88b520, 0x08c4621a, 0x35b2ba2b, 0x34865402, 0xd3d239bb,
  152471. 0x911f32e6, 0x1de76aed, 0x3f06fdc2, 0x877f8bcf, 0x9ec51502,
  152472. 0x802714c1, 0xa590700d, 0xa10444eb, 0x31dcc957, 0x8694229f,
  152473. 0xb8169fed, 0x5ece77ab, 0x2caf080e, 0x55be8a15, 0xcbd7cef1,
  152474. 0x3eb21b14, 0x67b97ee1, 0x9def7ad1, 0x118f690c, 0xe03ca879,
  152475. 0xf99b29e7, 0x6f77e62d },
  152476. { 0xe40bbf59, 0xa271bded, 0x6401aad6, 0x177ba453, 0x73541cd1,
  152477. 0x1755e035, 0x4b71b02f, 0x3465b466, 0xa813359f, 0x22eb7113,
  152478. 0x6f38eac7, 0x9792a8fd, 0xff3bf3b5, 0x11aa012f, 0xf85c3fbf,
  152479. 0x99aafabf, 0x06c0cc42, 0x91e0a2ef, 0x773b7b3a, 0x314d5d57,
  152480. 0xd669840a, 0xae5e2e76, 0x2e5a8be6, 0x86136073, 0xc1cf5580,
  152481. 0xee6d7578, 0x68bed102, 0x2344e00f, 0x8184f0eb, 0x799d7886,
  152482. 0xc3d2cf80, 0x63819c91 },
  152483. { 0x7884b073, 0xca5392e1, 0xeb1267ea, 0x9ec3a1fc, 0x907038a7,
  152484. 0x3d07f5f0, 0xe4c47b70, 0xcb2ac07c, 0x1bf96b91, 0xf96664ee,
  152485. 0x2aea4fbf, 0xebf57589, 0xfade6500, 0x5aabf391, 0x171d1204,
  152486. 0xc5b3376f, 0xa0d3d81a, 0x1ff60c51, 0x976a844b, 0x10b2cfe7,
  152487. 0xbda6125a, 0xe131cc9a, 0x4ebd453e, 0xe0fc16d3, 0x504b6bc1,
  152488. 0xc0d0319a, 0x0a2f8cab, 0xe43a0be7, 0x55e49b47, 0xc80afeec,
  152489. 0x8265d7ee, 0x67d48d12 },
  152490. { 0xea2d56d6, 0x068d59a7, 0x27480a63, 0xd71abd0e, 0xae7366cd,
  152491. 0x6bd11db0, 0x07204ebc, 0xfbb639ca, 0xf77e6293, 0x89a242e7,
  152492. 0x75ba8c3d, 0xdee7ca2b, 0x64a2f9a8, 0x472ddc3d, 0x7561a010,
  152493. 0x84229df4, 0xc5b649d4, 0x95f62c85, 0x4dc927cd, 0xfdd56b1b,
  152494. 0x5ee60596, 0xfe8bb120, 0xabf29401, 0x3efcaa50, 0x10d1c184,
  152495. 0xd4900d0f, 0x28b01df5, 0x2cf113a9, 0x1f0e43f5, 0xa3d7ebc3,
  152496. 0xe8384dc7, 0x27950e38 },
  152497. { 0xe1d0fa79, 0xeab21ff0, 0x048b5de9, 0x4b9fd033, 0x2fe374cb,
  152498. 0x4c934689, 0x4eb21f6b, 0xbb4827fa, 0xa925e7e7, 0x46716f79,
  152499. 0x7dd4c531, 0x1442bf36, 0xd2e96ddf, 0x2073954c, 0x8502aa89,
  152500. 0x4e0141ae, 0x8eef6cc9, 0x8ee00e1a, 0x5880cdaf, 0x55ce8491,
  152501. 0x69628046, 0xff3aba5c, 0x5d15dfbf, 0x335cc4f8, 0x9f684f25,
  152502. 0xa7f0440c, 0xbb1e5bd8, 0xae80453f, 0xff2225ab, 0xa1c99813,
  152503. 0x79b25d71, 0x54ff7884 },
  152504. { 0xde40b068, 0x27c6ee30, 0xe6f3a51e, 0x9226465b, 0xfa3b21f6,
  152505. 0xe24a4604, 0xc0418115, 0x50a5a5ad, 0x8df90d2b, 0xe3285441,
  152506. 0xdcb0c00f, 0xbb74e58f, 0x4a2c08e3, 0xc68f1b3b, 0x0ccd9ec9,
  152507. 0x339df081, 0xb786ea9f, 0x915362dc, 0xc955aead, 0x28945e31,
  152508. 0x8b6a6c6b, 0xd6a2c01d, 0x3678a427, 0x069e82dc, 0x28c9302c,
  152509. 0x17875500, 0x9fa101e6, 0x8acda965, 0xee30b286, 0x4e4e4573,
  152510. 0x3f1830fe, 0x8adbad85 },
  152511. { 0x0969d524, 0x060ae11f, 0xf39bcc79, 0xf42fdaf7, 0x7cc1fcc2,
  152512. 0x3cec6766, 0xe2336d4f, 0x456b9cf2, 0x8e1c0f7f, 0x6aa1f5de,
  152513. 0x0984fb0e, 0xcdbc2ad2, 0x1b464b28, 0x4090cfa6, 0x1243f3ef,
  152514. 0x40d86f30, 0xcd5e87e7, 0x95b16ccc, 0x3026cd41, 0x403f168c,
  152515. 0x816c0730, 0xdbe386cb, 0x58407a1d, 0x14eb86f3, 0x1717e1af,
  152516. 0xf588b4f8, 0x66cbc96c, 0xb75c41a6, 0x027e71c1, 0xf342c1aa,
  152517. 0xc0945e5f, 0x73930036 },
  152518. { 0x22cdaf42, 0x954f757d, 0xf4181aab, 0x788b591d, 0xf5514f25,
  152519. 0x8b986819, 0xf18fd5bc, 0x69642e08, 0x022ceb91, 0x92b305d1,
  152520. 0x6a4f6985, 0x1715903e, 0x61179cae, 0x4bd7d69d, 0xd29c01aa,
  152521. 0xdacdfd5d, 0xd91108cc, 0x705ddd5a, 0x64ac8f15, 0x434ac7b1,
  152522. 0xb524632f, 0x61a514e1, 0x731fc447, 0x45b9e61b, 0xe0961b31,
  152523. 0xcf561348, 0x73eaf223, 0x9c28a967, 0xaa7c99d3, 0x5bd10182,
  152524. 0xe42965e2, 0x8bc6ec4a },
  152525. { 0xe7f2a32b, 0xd096e5c0, 0x09388a30, 0xff54800c, 0x401e360c,
  152526. 0x06fe437c, 0xbb6054a6, 0x6655fc9c, 0x8457aa6e, 0x510e1860,
  152527. 0x2b29b2b7, 0xa0acfca2, 0x51b7da61, 0x732483e3, 0x6be6c8ca,
  152528. 0xe31471ee, 0x8b65c9a1, 0xe565431c, 0x48d65cbb, 0xfc9ac3b9,
  152529. 0xae9b2aa8, 0xd308fc21, 0xaa60aa6a, 0xd6a7df0d, 0x982fc0d4,
  152530. 0x2844d96a, 0x5847a4d7, 0xab012c2c, 0xdceb8955, 0x2b3c8f71,
  152531. 0xbe9c7e15, 0x8e85437d },
  152532. };
  152533. /* Perform the modular exponentiation in Fp* for SAKKE.
  152534. *
  152535. * Base is fixed to be the g parameter - a precomputed table is used.
  152536. *
  152537. * Striping: 128 points at a distance of 8 combined.
  152538. * Total of 256 points in table.
  152539. * Square and multiply performed in Fp*.
  152540. *
  152541. * base [in] Base. MP integer.
  152542. * exp [in] Exponent. MP integer.
  152543. * res [out] Result. MP integer.
  152544. * returns 0 on success, MP_READ_E if there are too many bytes in an array
  152545. * and MEMORY_E if memory allocation fails.
  152546. */
  152547. int sp_ModExp_Fp_star_1024(const mp_int* base, mp_int* exp, mp_int* res)
  152548. {
  152549. #if (defined(WOLFSSL_SP_SMALL) && !defined(WOLFSSL_SP_NO_MALLOC)) || \
  152550. defined(WOLFSSL_SP_SMALL_STACK)
  152551. sp_digit* td;
  152552. sp_digit* t;
  152553. sp_digit* tx;
  152554. sp_digit* ty;
  152555. #else
  152556. sp_digit t[36 * 2 * 32];
  152557. sp_digit tx[2 * 32];
  152558. sp_digit ty[2 * 32];
  152559. #endif
  152560. sp_digit* r = NULL;
  152561. unsigned char e[128];
  152562. int err = MP_OKAY;
  152563. int i;
  152564. int y;
  152565. (void)base;
  152566. #if (defined(WOLFSSL_SP_SMALL) && !defined(WOLFSSL_SP_NO_MALLOC)) || \
  152567. defined(WOLFSSL_SP_SMALL_STACK)
  152568. td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 38 * 32 * 2, NULL,
  152569. DYNAMIC_TYPE_TMP_BUFFER);
  152570. if (td == NULL) {
  152571. err = MEMORY_E;
  152572. }
  152573. #endif
  152574. if (err == MP_OKAY) {
  152575. #if (defined(WOLFSSL_SP_SMALL) && !defined(WOLFSSL_SP_NO_MALLOC)) || \
  152576. defined(WOLFSSL_SP_SMALL_STACK)
  152577. t = td;
  152578. tx = td + 36 * 32 * 2;
  152579. ty = td + 37 * 32 * 2;
  152580. #endif
  152581. r = ty;
  152582. (void)mp_to_unsigned_bin_len(exp, e, 128);
  152583. XMEMCPY(tx, p1024_norm_mod, sizeof(sp_digit) * 32);
  152584. y = e[112] >> 7;
  152585. y |= (e[96] >> 7) << 1;
  152586. y |= (e[80] >> 7) << 2;
  152587. y |= (e[64] >> 7) << 3;
  152588. y |= (e[48] >> 7) << 4;
  152589. y |= (e[32] >> 7) << 5;
  152590. y |= (e[16] >> 7) << 6;
  152591. y |= (e[0] >> 7) << 7;
  152592. XMEMCPY(ty, sp_1024_g_table[y], sizeof(sp_digit) * 32);
  152593. for (i = 126; i >= 0; i--) {
  152594. y = (e[127 - (i / 8)] >> (i & 0x7)) & 1;
  152595. y |= ((e[111 - (i / 8)] >> (i & 0x7)) & 1) << 1;
  152596. y |= ((e[95 - (i / 8)] >> (i & 0x7)) & 1) << 2;
  152597. y |= ((e[79 - (i / 8)] >> (i & 0x7)) & 1) << 3;
  152598. y |= ((e[63 - (i / 8)] >> (i & 0x7)) & 1) << 4;
  152599. y |= ((e[47 - (i / 8)] >> (i & 0x7)) & 1) << 5;
  152600. y |= ((e[31 - (i / 8)] >> (i & 0x7)) & 1) << 6;
  152601. y |= ((e[15 - (i / 8)] >> (i & 0x7)) & 1) << 7;
  152602. sp_1024_proj_sqr_32(tx, ty, t);
  152603. sp_1024_proj_mul_qx1_32(tx, ty, sp_1024_g_table[y], t);
  152604. }
  152605. }
  152606. if (err == MP_OKAY) {
  152607. sp_1024_mont_inv_32(tx, tx, t);
  152608. sp_1024_mont_mul_32(r, tx, ty, p1024_mod, p1024_mp_mod);
  152609. XMEMSET(r + 32, 0, sizeof(sp_digit) * 32);
  152610. sp_1024_mont_reduce_32(r, p1024_mod, p1024_mp_mod);
  152611. err = sp_1024_to_mp(r, res);
  152612. }
  152613. #if (defined(WOLFSSL_SP_SMALL) && !defined(WOLFSSL_SP_NO_MALLOC)) || \
  152614. defined(WOLFSSL_SP_SMALL_STACK)
  152615. if (td != NULL) {
  152616. XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  152617. }
  152618. #endif
  152619. return err;
  152620. }
  152621. #endif /* WOLFSSL_SP_SMALL */
  152622. /* Multiply p* by q* in projective coordinates.
  152623. *
  152624. * p.x' = (p.x * q.x) - (p.y * q.y)
  152625. * p.y' = (p.x * q.y) + (p.y * q.x)
  152626. * But applying Karatsuba:
  152627. * v0 = p.x * q.x
  152628. * v1 = p.y * q.y
  152629. * p.x' = v0 - v1
  152630. * p.y' = (px + py) * (qx + qy) - v0 - v1
  152631. *
  152632. * px [in,out] A single precision integer - X ordinate of number to multiply.
  152633. * py [in,out] A single precision integer - Y ordinate of number to multiply.
  152634. * qx [in] A single precision integer - X ordinate of number of
  152635. * multiplier.
  152636. * qy [in] A single precision integer - Y ordinate of number of
  152637. * multiplier.
  152638. * t [in] Two single precision integers - temps.
  152639. */
  152640. static void sp_1024_proj_mul_32(sp_digit* px, sp_digit* py,
  152641. const sp_digit* qx, const sp_digit* qy, sp_digit* t)
  152642. {
  152643. sp_digit* t1 = t;
  152644. sp_digit* t2 = t + 2 * 32;
  152645. /* t1 = px + py */
  152646. sp_1024_mont_add_32(t1, px, py, p1024_mod);
  152647. /* t2 = qx + qy */
  152648. sp_1024_mont_add_32(t2, qx, qy, p1024_mod);
  152649. /* t2 = (px + py) * (qx + qy) */
  152650. sp_1024_mont_mul_32(t2, t1, t2, p1024_mod, p1024_mp_mod);
  152651. /* t1 = py * qy */
  152652. sp_1024_mont_mul_32(t1, py, qy, p1024_mod, p1024_mp_mod);
  152653. /* t2 = (px + py) * (qx + qy) - (py * qy) */
  152654. sp_1024_mont_sub_32(t2, t2, t1, p1024_mod);
  152655. /* px = px * qx */
  152656. sp_1024_mont_mul_32(px, px, qx, p1024_mod, p1024_mp_mod);
  152657. /* py = (px + py) * (qx + qy) - (py * qy) - (px * qx) */
  152658. sp_1024_mont_sub_32(py, t2, px, p1024_mod);
  152659. /* px = (px * qx) - (py * qy)*/
  152660. sp_1024_mont_sub_32(px, px, t1, p1024_mod);
  152661. }
  152662. #ifndef WOLFSSL_SP_SMALL
  152663. /*
  152664. * Convert point from projective to affine but keep in Montgomery form.
  152665. *
  152666. * p [in,out] Point to convert.
  152667. * t [in] Temporary numbers: 2.
  152668. */
  152669. static void sp_1024_mont_map_32(sp_point_1024* p, sp_digit* t)
  152670. {
  152671. sp_digit* t1 = t;
  152672. sp_digit* t2 = t + 2 * 32;
  152673. sp_1024_mont_inv_32(t1, p->z, t2);
  152674. sp_1024_mont_sqr_32(t2, t1, p1024_mod, p1024_mp_mod);
  152675. sp_1024_mont_mul_32(t1, t2, t1, p1024_mod, p1024_mp_mod);
  152676. sp_1024_mont_mul_32(p->x, p->x, t2, p1024_mod, p1024_mp_mod);
  152677. sp_1024_mont_mul_32(p->y, p->y, t1, p1024_mod, p1024_mp_mod);
  152678. XMEMCPY(p->z, p1024_norm_mod, sizeof(sp_digit) * 32);
  152679. }
  152680. #endif /* WOLFSSL_SP_SMALL */
  152681. /*
  152682. * Calculate gradient of line through P, P and [-2]P, accumulate line and
  152683. * double P.
  152684. *
  152685. * Calculations:
  152686. * l = 3 * (p.x^2 - p.z^4) = 3 * (p.x - p.z^2) * (p.x + p.z^2)
  152687. * r.x = l * (p.x + q.x * p.z^2) - 2 * p.y^2
  152688. * r.y = 2 * p.y * p.z^3 * q.y (= p'.z * p.z^2 * q.y)
  152689. * v* = v*^2 * r*
  152690. * p'.x = l^2 - 8 * p.y^2 * p.x
  152691. * p'.y = (4 * p.y^2 * p.x - p'.x) * l - 8 * p.y^4
  152692. * p'.z = 2 * p.y * p.z
  152693. *
  152694. * @param [in,out] vx X-ordinate of projective value in F*.
  152695. * @param [in,out] vy Y-ordinate of projective value in F*.
  152696. * @param [in,out] p ECC point - point on E(F_p^2) to double.
  152697. * @param [in] q ECC point - second point on E(F_P^2).
  152698. * @param [in] t SP temporaries (6 used).
  152699. */
  152700. static void sp_1024_accumulate_line_dbl_32(sp_digit* vx, sp_digit* vy,
  152701. sp_point_1024* p, const sp_point_1024* q, sp_digit* t)
  152702. {
  152703. sp_digit* t1 = t + 0 * 32;
  152704. sp_digit* pz2 = t + 2 * 32;
  152705. sp_digit* rx = t + 4 * 32;
  152706. sp_digit* ry = t + 6 * 32;
  152707. sp_digit* l = t + 8 * 32;
  152708. sp_digit* ty = t + 10 * 32;
  152709. /* v = v^2 */
  152710. sp_1024_proj_sqr_32(vx, vy, t);
  152711. /* pz2 = p.z^2 */
  152712. sp_1024_mont_sqr_32(pz2, p->z, p1024_mod, p1024_mp_mod);
  152713. /* t1 = p.x + p.z^2 */
  152714. sp_1024_mont_add_32(ty, p->x, pz2, p1024_mod);
  152715. /* l = p.x - p.z^2 */
  152716. sp_1024_mont_sub_32(l, p->x, pz2, p1024_mod);
  152717. /* t1 = (p.x + p.z^2) * (p.x - p.z^2) = p.x^2 - p.z^4 */
  152718. sp_1024_mont_mul_32(t1, l, ty, p1024_mod, p1024_mp_mod);
  152719. /* l = 3 * (p.x^2 - p.z^4) */
  152720. sp_1024_mont_tpl_32(l, t1, p1024_mod);
  152721. /* t1 = q.x * p.z^2 */
  152722. sp_1024_mont_mul_32(t1, q->x, pz2, p1024_mod, p1024_mp_mod);
  152723. /* t1 = p.x + q.x * p.z^2 */
  152724. sp_1024_mont_add_32(t1, p->x, t1, p1024_mod);
  152725. /* r.x = l * (p.x + q.x * p.z^2) */
  152726. sp_1024_mont_mul_32(rx, l, t1, p1024_mod, p1024_mp_mod);
  152727. /* r.y = 2 * p.y */
  152728. sp_1024_mont_dbl_32(ry, p->y, p1024_mod);
  152729. /* ty = 4 * p.y ^ 2 */
  152730. sp_1024_mont_sqr_32(ty, ry, p1024_mod, p1024_mp_mod);
  152731. /* t1 = 2 * p.y ^ 2 */
  152732. sp_1024_mont_div2_32(t1, ty, p1024_mod);
  152733. /* r.x -= 2 * (p.y ^ 2) */
  152734. sp_1024_mont_sub_32(rx, rx, t1, p1024_mod);
  152735. /* p'.z = p.y * 2 * p.z */
  152736. sp_1024_mont_mul_32(p->z, p->z, ry, p1024_mod, p1024_mp_mod);
  152737. /* r.y = p'.z * p.z^2 */
  152738. sp_1024_mont_mul_32(t1, p->z, pz2, p1024_mod, p1024_mp_mod);
  152739. /* r.y = p'.z * p.z^2 * q.y */
  152740. sp_1024_mont_mul_32(ry, t1, q->y, p1024_mod, p1024_mp_mod);
  152741. /* v = v^2 * r */
  152742. sp_1024_proj_mul_32(vx, vy, rx, ry, t);
  152743. /* Double point using previously calculated values
  152744. * l = 3 * (p.x - p.z^2).(p.x + p.z^2)
  152745. * ty = 4 * p.y^2
  152746. * p'.z = 2 * p.y * p.z
  152747. */
  152748. /* t1 = (4 * p.y^2) ^ 2 = 16 * p.y^4 */
  152749. sp_1024_mont_sqr_32(t1, ty, p1024_mod, p1024_mp_mod);
  152750. /* t1 = 16 * p.y^4 / 2 = 8 * p.y^4 */
  152751. sp_1024_mont_div2_32(t1, t1, p1024_mod);
  152752. /* p'.y = 4 * p.y^2 * p.x */
  152753. sp_1024_mont_mul_32(p->y, ty, p->x, p1024_mod, p1024_mp_mod);
  152754. /* p'.x = l^2 */
  152755. sp_1024_mont_sqr_32(p->x, l, p1024_mod, p1024_mp_mod);
  152756. /* p'.x = l^2 - 4 * p.y^2 * p.x */
  152757. sp_1024_mont_sub_32(p->x, p->x, p->y, p1024_mod);
  152758. /* p'.x = l^2 - 8 * p.y^2 * p.x */
  152759. sp_1024_mont_sub_32(p->x, p->x, p->y, p1024_mod);
  152760. /* p'.y = 4 * p.y^2 * p.x - p.x' */
  152761. sp_1024_mont_sub_32(ty, p->y, p->x, p1024_mod);
  152762. /* p'.y = (4 * p.y^2 * p.x - p'.x) * l */
  152763. sp_1024_mont_mul_32(p->y, ty, l, p1024_mod, p1024_mp_mod);
  152764. /* p'.y = (4 * p.y^2 * p.x - p'.x) * l - 8 * p.y^4 */
  152765. sp_1024_mont_sub_32(p->y, p->y, t1, p1024_mod);
  152766. }
  152767. #ifdef WOLFSSL_SP_SMALL
  152768. /*
  152769. * Calculate gradient of line through C, P and -C-P, accumulate line and
  152770. * add P to C.
  152771. *
  152772. * Calculations:
  152773. * r.x = (q.x + p.x) * c.y - (q.x * c.z^2 + c.x) * p.y * c.z
  152774. * r.y = (c.x - p.x * c.z^2) * q.y * c.z
  152775. * v* = v* * r*
  152776. * r = p.y * c.z^3 - c.y
  152777. * c'.x = r^2 + h^3 - 2 * c.x * h^2
  152778. * c'.y = r * (c'.x - c.x * h^2) - c.y * h^3
  152779. * c'.z = (c.x - p.x * c.z^2) * c.z
  152780. *
  152781. * @param [in,out] vx X-ordinate of projective value in F*.
  152782. * @param [in,out] vy Y-ordinate of projective value in F*.
  152783. * @param [in,out] c ECC point - current point on E(F_p^2) to be added
  152784. * to.
  152785. * @param [in] p ECC point - point on E(F_p^2) to add.
  152786. * @param [in] q ECC point - second point on E(F_P^2).
  152787. * @param [in] qx_px SP that is a constant value across adds.
  152788. * @param [in] t SP temporaries (6 used).
  152789. */
  152790. static void sp_1024_accumulate_line_add_one_32(sp_digit* vx, sp_digit* vy,
  152791. sp_point_1024* c, sp_point_1024* p, sp_point_1024* q, sp_digit* qx_px,
  152792. sp_digit* t)
  152793. {
  152794. sp_digit* t1 = t;
  152795. sp_digit* t2 = t + 2 * 32;
  152796. sp_digit* rx = t + 4 * 32;
  152797. sp_digit* ry = t + 6 * 32;
  152798. sp_digit* h = t + 8 * 32;
  152799. sp_digit* r = t + 10 * 32;
  152800. /* r.x = (q.x + p.x) * c.y */
  152801. sp_1024_mont_mul_32(rx, qx_px, c->y, p1024_mod, p1024_mp_mod);
  152802. /* t2 = c.z^2 */
  152803. sp_1024_mont_sqr_32(t2, c->z, p1024_mod, p1024_mp_mod);
  152804. /* t1 = q.x * c.z^2 */
  152805. sp_1024_mont_mul_32(t1, q->x, t2, p1024_mod, p1024_mp_mod);
  152806. /* t1 = q.x * c.z^2 + c.x */
  152807. sp_1024_mont_add_32(h, t1, c->x, p1024_mod);
  152808. /* r = p.y * c.z */
  152809. sp_1024_mont_mul_32(ry, p->y, c->z, p1024_mod, p1024_mp_mod);
  152810. /* t1 = (q.x * c.z^2 + c.x) * p.y * c.z */
  152811. sp_1024_mont_mul_32(t1, h, ry, p1024_mod, p1024_mp_mod);
  152812. /* r = p.y * c.z * c.z^2 = p.y * c.z^3 */
  152813. sp_1024_mont_mul_32(r, ry, t2, p1024_mod, p1024_mp_mod);
  152814. /* r.x -= (q.x * c.z^2 + c.x) * p.y * c.z */
  152815. sp_1024_mont_sub_32(rx, rx, t1, p1024_mod);
  152816. /* t1 = p.x * c.z^2 */
  152817. sp_1024_mont_mul_32(t1, p->x, t2, p1024_mod, p1024_mp_mod);
  152818. /* h = c.x - p.x * c.z^2 */
  152819. sp_1024_mont_sub_32(h, c->x, t1, p1024_mod);
  152820. /* c'.z = (c.x - p.x * c.z^2) * c.z */
  152821. sp_1024_mont_mul_32(c->z, h, c->z, p1024_mod, p1024_mp_mod);
  152822. /* r.y = (c.x - p.x * c.z^2) * c.z * q.y */
  152823. sp_1024_mont_mul_32(ry, c->z, q->y, p1024_mod, p1024_mp_mod);
  152824. /* v = v * r */
  152825. sp_1024_proj_mul_32(vx, vy, rx, ry, t);
  152826. /* Add p to c using previously calculated values.
  152827. * h = c.x - p.x * c.z^2
  152828. * r = p.y * c.z^3
  152829. * c'.z = (c.x - p.x * c.z^2) * c.z
  152830. */
  152831. /* r = p.y * c.z^3 - c.y */
  152832. sp_1024_mont_sub_32(r, r, c->y, p1024_mod);
  152833. /* t1 = r^2 */
  152834. sp_1024_mont_sqr_32(t1, r, p1024_mod, p1024_mp_mod);
  152835. /* t2 = h^2 */
  152836. sp_1024_mont_sqr_32(rx, h, p1024_mod, p1024_mp_mod);
  152837. /* ry = c.x * h^2 */
  152838. sp_1024_mont_mul_32(ry, c->x, rx, p1024_mod, p1024_mp_mod);
  152839. /* t2 = h^3 */
  152840. sp_1024_mont_mul_32(t2, rx, h, p1024_mod, p1024_mp_mod);
  152841. /* c->x = r^2 + h^3 */
  152842. sp_1024_mont_add_32(c->x, t1, t2, p1024_mod);
  152843. /* t1 = 2 * c.x * h^2 */
  152844. sp_1024_mont_dbl_32(t1, ry, p1024_mod);
  152845. /* c'.x = r^2 + h^3 - 2 * c.x * h^2 */
  152846. sp_1024_mont_sub_32(c->x, c->x, t1, p1024_mod);
  152847. /* ry = c'.x - c.x * h^2 */
  152848. sp_1024_mont_sub_32(t1, c->x, ry, p1024_mod);
  152849. /* ry = r * (c'.x - c.x * h^2) */
  152850. sp_1024_mont_mul_32(ry, t1, r, p1024_mod, p1024_mp_mod);
  152851. /* t2 = c.y * h^3 */
  152852. sp_1024_mont_mul_32(t1, t2, c->y, p1024_mod, p1024_mp_mod);
  152853. /* c'.y = r * (c'.x - c.x * h^2) - c.y * h^3 */
  152854. sp_1024_mont_sub_32(c->y, ry, t1, p1024_mod);
  152855. }
  152856. /*
  152857. * Calculate r = pairing <P, Q>.
  152858. *
  152859. * That is, multiply base in PF_p[q] by the scalar s, such that s.P = Q.
  152860. *
  152861. * @param [in] key SAKKE key.
  152862. * @param [in] p First point on E(F_p)[q].
  152863. * @param [in] q Second point on E(F_p)[q].
  152864. * @param [in] r Result of calculation.
  152865. * @return 0 on success.
  152866. * @return MEMORY_E when dynamic memory allocation fails.
  152867. * @return Other -ve value on internal failure.
  152868. */
  152869. int sp_Pairing_1024(const ecc_point* pm, const ecc_point* qm, mp_int* res)
  152870. {
  152871. int err = MP_OKAY;
  152872. #if (defined(WOLFSSL_SP_SMALL) && !defined(WOLFSSL_SP_NO_MALLOC)) || \
  152873. defined(WOLFSSL_SP_SMALL_STACK)
  152874. sp_digit* td = NULL;
  152875. sp_digit* t;
  152876. sp_digit* vx;
  152877. sp_digit* vy;
  152878. sp_digit* qx_px;
  152879. #else
  152880. sp_digit t[36 * 2 * 32];
  152881. sp_digit vx[2 * 32];
  152882. sp_digit vy[2 * 32];
  152883. sp_digit qx_px[2 * 32];
  152884. sp_point_1024 pd;
  152885. sp_point_1024 qd;
  152886. sp_point_1024 cd;
  152887. #endif
  152888. sp_point_1024* p = NULL;
  152889. sp_point_1024* q = NULL;
  152890. sp_point_1024* c = NULL;
  152891. sp_digit* r = NULL;
  152892. int i;
  152893. err = sp_1024_point_new_32(NULL, pd, p);
  152894. if (err == MP_OKAY) {
  152895. err = sp_1024_point_new_32(NULL, qd, q);
  152896. }
  152897. if (err == MP_OKAY) {
  152898. err = sp_1024_point_new_32(NULL, cd, c);
  152899. }
  152900. #if (defined(WOLFSSL_SP_SMALL) && !defined(WOLFSSL_SP_NO_MALLOC)) || \
  152901. defined(WOLFSSL_SP_SMALL_STACK)
  152902. if (err == MP_OKAY) {
  152903. td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 39 * 32 * 2, NULL,
  152904. DYNAMIC_TYPE_TMP_BUFFER);
  152905. if (td == NULL) {
  152906. err = MEMORY_E;
  152907. }
  152908. }
  152909. #endif
  152910. if (err == MP_OKAY) {
  152911. #if (defined(WOLFSSL_SP_SMALL) && !defined(WOLFSSL_SP_NO_MALLOC)) || \
  152912. defined(WOLFSSL_SP_SMALL_STACK)
  152913. t = td;
  152914. vx = td + 36 * 32 * 2;
  152915. vy = td + 37 * 32 * 2;
  152916. qx_px = td + 38 * 32 * 2;
  152917. #endif
  152918. r = vy;
  152919. sp_1024_point_from_ecc_point_32(p, pm);
  152920. sp_1024_point_from_ecc_point_32(q, qm);
  152921. err = sp_1024_mod_mul_norm_32(p->x, p->x, p1024_mod);
  152922. }
  152923. if (err == MP_OKAY) {
  152924. err = sp_1024_mod_mul_norm_32(p->y, p->y, p1024_mod);
  152925. }
  152926. if (err == MP_OKAY) {
  152927. err = sp_1024_mod_mul_norm_32(p->z, p->z, p1024_mod);
  152928. }
  152929. if (err == MP_OKAY) {
  152930. err = sp_1024_mod_mul_norm_32(q->x, q->x, p1024_mod);
  152931. }
  152932. if (err == MP_OKAY) {
  152933. err = sp_1024_mod_mul_norm_32(q->y, q->y, p1024_mod);
  152934. }
  152935. if (err == MP_OKAY) {
  152936. XMEMCPY(c, p, sizeof(sp_point_1024));
  152937. XMEMSET(vx, 0, sizeof(sp_digit) * 2 * 32);
  152938. vx[0] = 1;
  152939. XMEMSET(vy, 0, sizeof(sp_digit) * 2 * 32);
  152940. sp_1024_mont_add_32(qx_px, q->x, p->x, p1024_mod);
  152941. for (i = 1020; i >= 0; i--) {
  152942. /* Accumulate line into v and double point. */
  152943. sp_1024_accumulate_line_dbl_32(vx, vy, c, q, t);
  152944. if ((i > 0) && ((p1024_order[i / 32] >> (i % 32)) & 1)) {
  152945. /* Accumulate line into v and add P into C. */
  152946. sp_1024_accumulate_line_add_one_32(vx, vy, c, p, q, qx_px, t);
  152947. }
  152948. }
  152949. /* Final exponentiation */
  152950. sp_1024_proj_sqr_32(vx, vy, t);
  152951. sp_1024_proj_sqr_32(vx, vy, t);
  152952. /* Convert from PF_p[q] to F_p */
  152953. sp_1024_mont_inv_32(vx, vx, t);
  152954. sp_1024_mont_mul_32(r, vx, vy, p1024_mod, p1024_mp_mod);
  152955. XMEMSET(r + 32, 0, sizeof(sp_digit) * 32);
  152956. sp_1024_mont_reduce_32(r, p1024_mod, p1024_mp_mod);
  152957. err = sp_1024_to_mp(r, res);
  152958. }
  152959. #if (defined(WOLFSSL_SP_SMALL) && !defined(WOLFSSL_SP_NO_MALLOC)) || \
  152960. defined(WOLFSSL_SP_SMALL_STACK)
  152961. if (td != NULL) {
  152962. XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  152963. }
  152964. #endif
  152965. sp_1024_point_free_32(c, 1, NULL);
  152966. sp_1024_point_free_32(q, 1, NULL);
  152967. sp_1024_point_free_32(p, 1, NULL);
  152968. return err;
  152969. }
  152970. #else
  152971. /*
  152972. * Calculate gradient of line through C, P and -C-P, accumulate line and
  152973. * add P to C.
  152974. *
  152975. * Both C and P have z ordinates to use in the calculation.
  152976. *
  152977. * Calculations:
  152978. * r.x = (q.x * c.z^2 + c.x) * p.y * c.z - (q.x * p.z^2 + p.x) * c.y * p.z
  152979. * r.y = (p.x * c.z^2 - c.x * p.z^2) * q.y * p.z * c.z
  152980. * v* = v* * r*
  152981. * h = p.x * c.z^2 - c.x * p.z^2
  152982. * r = p.y * c.z^3 - c.y * p.z^3
  152983. * c'.x = r^2 - h^3 - 2 * c.x * p.z^2 * h^2
  152984. * c'.y = r * (c.x * p.z^2 * h^2 - c'.x) - c.y * p.z^3 * h^3
  152985. * c'.z = (p.x * c.z^2 - c.x * p.z^2) * c.z
  152986. *
  152987. * @param [in,out] vx X-ordinate of projective value in F*.
  152988. * @param [in,out] vy Y-ordinate of projective value in F*.
  152989. * @param [in,out] c ECC point - current point on E(F_p^2) to be added
  152990. * to.
  152991. * @param [in,out] p ECC point - point on E(F_p^2) to add.
  152992. * @param [in,out] q ECC point - second point on E(F_P^2).
  152993. * @param [in,out] t SP temporaries (6 used).
  152994. * @param [in,out] neg Indicates to use negative P.
  152995. * @return 0 on success.
  152996. * @return MEMORY_E when dynamic memory allocation fails.
  152997. * @return Other -ve value on internal failure.
  152998. */
  152999. static void sp_1024_accumulate_line_add_n_32(sp_digit* vx, sp_digit* vy,
  153000. const sp_point_1024* p, const sp_point_1024* q,
  153001. sp_point_1024* c, sp_digit* t, int neg)
  153002. {
  153003. sp_digit* t1 = t;
  153004. sp_digit* t2 = t + 2 * 32;
  153005. sp_digit* rx = t + 4 * 32;
  153006. sp_digit* ry = t + 6 * 32;
  153007. sp_digit* h = t + 8 * 32;
  153008. sp_digit* r = t + 10 * 32;
  153009. /* h = p.z^2 */
  153010. sp_1024_mont_sqr_32(h, p->z, p1024_mod, p1024_mp_mod);
  153011. /* rx = q.x * p.z^2 */
  153012. sp_1024_mont_mul_32(rx, q->x, h, p1024_mod, p1024_mp_mod);
  153013. /* rx = q.x * p.z^2 + p.x */
  153014. sp_1024_mont_add_32(t2, rx, p->x, p1024_mod);
  153015. /* c.y = c.y * p.z */
  153016. sp_1024_mont_mul_32(t1, c->y, p->z, p1024_mod, p1024_mp_mod);
  153017. /* r.x = (q.x * p.z^2 + p.x) * c.y * p.z */
  153018. sp_1024_mont_mul_32(rx, t2, t1, p1024_mod, p1024_mp_mod);
  153019. /* c.y = c.y * p.z^3 */
  153020. sp_1024_mont_mul_32(c->y, t1, h, p1024_mod, p1024_mp_mod);
  153021. /* t2 = c.z^2 */
  153022. sp_1024_mont_sqr_32(t2, c->z, p1024_mod, p1024_mp_mod);
  153023. /* t1 = q.x * c.z^2 */
  153024. sp_1024_mont_mul_32(t1, q->x, t2, p1024_mod, p1024_mp_mod);
  153025. /* t1 = q.x * c.z^2 + c.x */
  153026. sp_1024_mont_add_32(t1, t1, c->x, p1024_mod);
  153027. /* c.x = c.x * p.z^2 */
  153028. sp_1024_mont_mul_32(c->x, c->x, h, p1024_mod, p1024_mp_mod);
  153029. /* r = p.y * c.z */
  153030. sp_1024_mont_mul_32(r, p->y, c->z, p1024_mod, p1024_mp_mod);
  153031. if (neg) {
  153032. /* r = -p.y * c.z */
  153033. sp_1024_mont_sub_32(r, p1024_mod, r, p1024_mod);
  153034. }
  153035. /* t1 = (q.x * c.z^2 + c.x) * p.y * c.z */
  153036. sp_1024_mont_mul_32(ry, t1, r, p1024_mod, p1024_mp_mod);
  153037. /* r.x -= (q.x * c.z^2 + c.x) * p.y * c.z */
  153038. sp_1024_mont_sub_32(rx, ry, rx, p1024_mod);
  153039. /* t1 = p.x * c.z^2 */
  153040. sp_1024_mont_mul_32(t1, p->x, t2, p1024_mod, p1024_mp_mod);
  153041. /* h = p.x * c.z^2 - c.x * p.z^2 */
  153042. sp_1024_mont_sub_32(h, t1, c->x, p1024_mod);
  153043. /* c'.z = (p.x * c.z^2 - c.x * p.z^2) * c.z */
  153044. sp_1024_mont_mul_32(t1, h, c->z, p1024_mod, p1024_mp_mod);
  153045. /* c'.z = (p.x * c.z^2 - c.x * p.z^2) * c.z * p.z */
  153046. sp_1024_mont_mul_32(c->z, t1, p->z, p1024_mod, p1024_mp_mod);
  153047. /* r.y = (p.x * c.z^2 - c.x * p.z^2) * c.z * p.z * q.y */
  153048. sp_1024_mont_mul_32(ry, c->z, q->y, p1024_mod, p1024_mp_mod);
  153049. /* r = p.y * c.z^3 */
  153050. sp_1024_mont_mul_32(t1, r, t2, p1024_mod, p1024_mp_mod);
  153051. /* r = p.y * c.z^3 - c.y * p.z^3 */
  153052. sp_1024_mont_sub_32(r, t1, c->y, p1024_mod);
  153053. /* v = v * r */
  153054. sp_1024_proj_mul_32(vx, vy, rx, ry, t);
  153055. /* Add p to c using previously calculated values.
  153056. * h = p.x * c.z^2 - c.x * p.z^2
  153057. * r = p.y * c.z^3 - c.y * p.z^3
  153058. * c'.z = (p.x * c.z^2 - c.x * p.z^2) * c.z
  153059. */
  153060. /* t1 = r^2 */
  153061. sp_1024_mont_sqr_32(t1, r, p1024_mod, p1024_mp_mod);
  153062. /* t2 = h^2 */
  153063. sp_1024_mont_sqr_32(rx, h, p1024_mod, p1024_mp_mod);
  153064. /* ry = c.x * p.z^2 * h^2 */
  153065. sp_1024_mont_mul_32(ry, rx, c->x, p1024_mod, p1024_mp_mod);
  153066. /* t2 = h^3 */
  153067. sp_1024_mont_mul_32(t2, rx, h, p1024_mod, p1024_mp_mod);
  153068. /* c'.x = r^2 - h^3 */
  153069. sp_1024_mont_sub_32(c->x, t1, t2, p1024_mod);
  153070. /* t1 = 2 * c.x * p.z^2 * h^2 */
  153071. sp_1024_mont_dbl_32(t1, ry, p1024_mod);
  153072. /* c'.x = r^2 - h^3 - 2 * c.x * p.z^2 * h^2 */
  153073. sp_1024_mont_sub_32(c->x, c->x, t1, p1024_mod);
  153074. /* ry = c.x * p.z^2 * h^2 - c'.x */
  153075. sp_1024_mont_sub_32(t1, ry, c->x, p1024_mod);
  153076. /* ry = r * (c.x * p.z^2 * h^2 - c'.x) */
  153077. sp_1024_mont_mul_32(ry, t1, r, p1024_mod, p1024_mp_mod);
  153078. /* t2 = c.y * p.z^3 * h^3 */
  153079. sp_1024_mont_mul_32(t1, t2, c->y, p1024_mod, p1024_mp_mod);
  153080. /* c'.y = r * (c.x * p.z^2 * h^2 - c'.x) - c.y * p.z^3 * h^3 */
  153081. sp_1024_mont_sub_32(c->y, ry, t1, p1024_mod);
  153082. }
  153083. /*
  153084. * Perform n accumulate doubles and doubles of P.
  153085. *
  153086. * py = 2 * p.y
  153087. *
  153088. * For each double:
  153089. * Calculate gradient of line through P, P and [-2]P, accumulate line and
  153090. * double P.
  153091. *
  153092. * Calculations:
  153093. * l = 3 * (p.x^2 - p.z^4) = 3 * (p.x - p.z^2) * (p.x + p.z^2)
  153094. * r.x = l * (p.x + q.x * p.z^2) - py^2 / 2
  153095. * r.y = py * p.z^3 * q.y (= p'.z * p.z^2 * q.y)
  153096. * v* = v*^2 * r*
  153097. * p'.x = l^2 - 2 * py^2 * p.x
  153098. * py' = (py^2 * p.x - p'.x) * l - py^4 (= 2 * p'.y)
  153099. * p'.z = py * p.z
  153100. *
  153101. * Finally:
  153102. * p'.y = py' / 2
  153103. *
  153104. * @param [in,out] vx X-ordinate of projective value in F*.
  153105. * @param [in,out] vy Y-ordinate of projective value in F*.
  153106. * @param [in,out] p ECC point - point on E(F_p^2) to double.
  153107. * @param [in] q ECC point - second point on E(F_P^2).
  153108. * @param [in] n Number of times to double.
  153109. * @param [in] t SP temporaries (6 used).
  153110. */
  153111. static void sp_1024_accumulate_line_dbl_n_32(sp_digit* vx, sp_digit* vy,
  153112. sp_point_1024* p, const sp_point_1024* q, int n, sp_digit* t)
  153113. {
  153114. sp_digit* t1 = t + 0 * 32;
  153115. sp_digit* pz2 = t + 2 * 32;
  153116. sp_digit* rx = t + 4 * 32;
  153117. sp_digit* ry = t + 6 * 32;
  153118. sp_digit* l = t + 8 * 32;
  153119. sp_digit* ty = t + 10 * 32;
  153120. int i;
  153121. /* py = 2 * p.y */
  153122. sp_1024_mont_dbl_32(p->y, p->y, p1024_mod);
  153123. for (i = 0; i < n; i++) {
  153124. /* v = v^2 */
  153125. sp_1024_proj_sqr_32(vx, vy, t);
  153126. /* pz2 = p.z^2 */
  153127. sp_1024_mont_sqr_32(pz2, p->z, p1024_mod, p1024_mp_mod);
  153128. /* t1 = p.x + p.z^2 */
  153129. sp_1024_mont_add_32(t1, p->x, pz2, p1024_mod);
  153130. /* l = p.x - p.z^2 */
  153131. sp_1024_mont_sub_32(l, p->x, pz2, p1024_mod);
  153132. /* t1 = (p.x + p.z^2) * (p.x - p.z^2) = p.x^2 - p.z^4 */
  153133. sp_1024_mont_mul_32(ty, l, t1, p1024_mod, p1024_mp_mod);
  153134. /* l = 3 * (p.x^2 - p.z^4) */
  153135. sp_1024_mont_tpl_32(l, ty, p1024_mod);
  153136. /* t1 = q.x * p.z^2 */
  153137. sp_1024_mont_mul_32(t1, q->x, pz2, p1024_mod, p1024_mp_mod);
  153138. /* t1 = p.x + q.x * p.z^2 */
  153139. sp_1024_mont_add_32(t1, p->x, t1, p1024_mod);
  153140. /* r.x = l * (p.x + q.x * p.z^2) */
  153141. sp_1024_mont_mul_32(rx, l, t1, p1024_mod, p1024_mp_mod);
  153142. /* ty = py ^ 2 */
  153143. sp_1024_mont_sqr_32(ty, p->y, p1024_mod, p1024_mp_mod);
  153144. /* t1 = py ^ 2 / 2 */
  153145. sp_1024_mont_div2_32(t1, ty, p1024_mod);
  153146. /* r.x -= py ^ 2 / 2 */
  153147. sp_1024_mont_sub_32(rx, rx, t1, p1024_mod);
  153148. /* p'.z = py * pz */
  153149. sp_1024_mont_mul_32(p->z, p->z, p->y, p1024_mod, p1024_mp_mod);
  153150. /* r.y = p'.z * p.z^2 */
  153151. sp_1024_mont_mul_32(t1, p->z, pz2, p1024_mod, p1024_mp_mod);
  153152. /* r.y = p'.z * p.z^2 * q.y */
  153153. sp_1024_mont_mul_32(ry, t1, q->y, p1024_mod, p1024_mp_mod);
  153154. /* v = v^2 * r */
  153155. sp_1024_proj_mul_32(vx, vy, rx, ry, t);
  153156. /* Double point using previously calculated values
  153157. * l = 3 * (p.x - p.z^2).(p.x + p.z^2)
  153158. * ty = py^2
  153159. * p'.z = py * p.z
  153160. */
  153161. /* t1 = py^2 ^ 2 = py^4 */
  153162. sp_1024_mont_sqr_32(t1, ty, p1024_mod, p1024_mp_mod);
  153163. /* py' = py^2 * p. x */
  153164. sp_1024_mont_mul_32(p->y, ty, p->x, p1024_mod, p1024_mp_mod);
  153165. /* p'.x = l^2 */
  153166. sp_1024_mont_sqr_32(p->x, l, p1024_mod, p1024_mp_mod);
  153167. /* p'.x = l^2 - py^2 * p.x */
  153168. sp_1024_mont_sub_32(p->x, p->x, p->y, p1024_mod);
  153169. /* p'.x = l^2 - 2 * p.y^2 * p.x */
  153170. sp_1024_mont_sub_32(p->x, p->x, p->y, p1024_mod);
  153171. /* py' = py^2 * p.x - p.x' */
  153172. sp_1024_mont_sub_32(ty, p->y, p->x, p1024_mod);
  153173. /* py' = (p.y^2 * p.x - p'.x) * l */
  153174. sp_1024_mont_mul_32(p->y, ty, l, p1024_mod, p1024_mp_mod);
  153175. /* py' = (p.y^2 * p.x - p'.x) * l * 2 */
  153176. sp_1024_mont_dbl_32(p->y, p->y, p1024_mod);
  153177. /* py' = (p.y^2 * p.x - p'.x) * l * 2 - p.y^4 */
  153178. sp_1024_mont_sub_32(p->y, p->y, t1, p1024_mod);
  153179. }
  153180. /* p'.y = py' / 2 */
  153181. sp_1024_mont_div2_32(p->y, p->y, p1024_mod);
  153182. }
  153183. /* Operations to perform based on order - 1.
  153184. * Sliding window. Start at bottom and stop when bottom bit is one.
  153185. * Subtract if top bit in window is one.
  153186. * Width of 6 bits.
  153187. * Pairs: #dbls, add/subtract window value
  153188. */
  153189. static const signed char sp_1024_order_op[] = {
  153190. 5, 6, -13, 9, -21, 6, -5, 8, 31, 6, 3, 6, -27, 6, 25, 9,
  153191. -1, 6, -11, 6, -13, 6, -7, 6, -15, 6, -29, 7, 25, 6, -9, 6,
  153192. -19, 7, 3, 6, 11, 9, -23, 6, 1, 6, 27, 6, 1, 7, -25, 8,
  153193. 13, 7, -13, 7, -23, 10, 19, 7, 7, 7, -3, 7, 27, 6, -7, 7,
  153194. -21, 7, 11, 7, 31, 8, 1, 7, -23, 6, -17, 6, -3, 10, 11, 6,
  153195. -21, 7, -27, 11, -29, 6, -1, 10, 15, 8, 27, 7, 17, 6, 17, 7,
  153196. -13, 8, 13, 6, 21, 7, -29, 6, 19, 7, -25, 6, 11, 9, 29, 7,
  153197. -7, 8, 27, 7, 29, 10, -1, 8, -7, 8, 17, 6, 17, 7, -27, 7,
  153198. -21, 6, -9, 6, -27, 12, -23, 6, 19, 6, 13, 6, -11, 7, 27, 6,
  153199. 17, 6, -7, 6, -25, 7, -29, 6, 9, 7, 7, 6, 13, 6, -25, 6,
  153200. -19, 6, 13, 6, -11, 6, 5, 8, 19, 6, -21, 8, 23, 7, 27, 6,
  153201. -13, 6, -19, 11, 29, 7, -15, 6, -9, 7, -21, 10, -3, 7, 21, 10,
  153202. 25, 6, -15, 6, -23, 6, 21, 6, 1, 6, 21, 7, -3, 6, -3, 7,
  153203. -7, 6, -23, 7, 7, 8, 15, 9, 5, 6, -11, 6, 21, 11, -27, 7,
  153204. 27, 6, -11, 6, 31, 6, -21, 6, 19, 6, -7, 8, -7, 13, -3, 6,
  153205. -7, 7, -3, 6, 1, 6, 7, 8, 19, 8, 11, 9, -9, 7, -31, 12,
  153206. 25, 6, -17, 9, -15, 7, 5, 6, 25, 7, -5, 7, -25, 6, 17, 8,
  153207. -19, 6, -13, 6, 27, 8, 1, 7, -5, 7, -1, 6, 21, 6, 3, 10,
  153208. -3, 1,
  153209. };
  153210. /*
  153211. * Calculate r = pairing <P, Q>.
  153212. *
  153213. * That is, multiply base in PF_p[q] by the scalar s, such that s.P = Q.
  153214. *
  153215. * Sliding window. Start at bottom and stop when bottom bit is one.
  153216. * Subtract if top bit in window is one.
  153217. * Width of 6 bits.
  153218. *
  153219. * @param [in] pm First point on E(F_p)[q].
  153220. * @param [in] qm Second point on E(F_p)[q].
  153221. * @param [in] res Result of calculation.
  153222. * @return 0 on success.
  153223. * @return MEMORY_E when dynamic memory allocation fails.
  153224. */
  153225. int sp_Pairing_1024(const ecc_point* pm, const ecc_point* qm, mp_int* res)
  153226. {
  153227. int err;
  153228. #if (defined(WOLFSSL_SP_SMALL) && !defined(WOLFSSL_SP_NO_MALLOC)) || \
  153229. defined(WOLFSSL_SP_SMALL_STACK)
  153230. sp_digit* td = NULL;
  153231. sp_digit* t;
  153232. sp_digit* vx;
  153233. sp_digit* vy;
  153234. sp_digit (*pre_vx)[64];
  153235. sp_digit (*pre_vy)[64];
  153236. sp_digit (*pre_nvy)[64];
  153237. sp_point_1024* pre_p;
  153238. #else
  153239. sp_digit t[36 * 2 * 32];
  153240. sp_digit vx[2 * 32];
  153241. sp_digit vy[2 * 32];
  153242. sp_digit pre_vx[16][64];
  153243. sp_digit pre_vy[16][64];
  153244. sp_digit pre_nvy[16][64];
  153245. sp_point_1024 pre_p[16];
  153246. sp_point_1024 pd;
  153247. sp_point_1024 qd;
  153248. sp_point_1024 cd;
  153249. #endif
  153250. sp_point_1024* p = NULL;
  153251. sp_point_1024* q = NULL;
  153252. sp_point_1024* c = NULL;
  153253. sp_digit* r = NULL;
  153254. int i;
  153255. int j;
  153256. err = sp_1024_point_new_32(NULL, pd, p);
  153257. if (err == MP_OKAY) {
  153258. err = sp_1024_point_new_32(NULL, qd, q);
  153259. }
  153260. if (err == MP_OKAY) {
  153261. err = sp_1024_point_new_32(NULL, cd, c);
  153262. }
  153263. #if (defined(WOLFSSL_SP_SMALL) && !defined(WOLFSSL_SP_NO_MALLOC)) || \
  153264. defined(WOLFSSL_SP_SMALL_STACK)
  153265. if (err == MP_OKAY) {
  153266. td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 86 * 32 * 2 + 16 * sizeof(sp_point_1024), NULL,
  153267. DYNAMIC_TYPE_TMP_BUFFER);
  153268. if (td == NULL) {
  153269. err = MEMORY_E;
  153270. }
  153271. }
  153272. #endif
  153273. if (err == MP_OKAY) {
  153274. #if (defined(WOLFSSL_SP_SMALL) && !defined(WOLFSSL_SP_NO_MALLOC)) || \
  153275. defined(WOLFSSL_SP_SMALL_STACK)
  153276. t = td;
  153277. vx = td + 36 * 32 * 2;
  153278. vy = td + 37 * 32 * 2;
  153279. pre_vx = (sp_digit(*)[64])(td + 38 * 32 * 2);
  153280. pre_vy = (sp_digit(*)[64])(td + 54 * 32 * 2);
  153281. pre_nvy = (sp_digit(*)[64])(td + 70 * 32 * 2);
  153282. pre_p = (sp_point_1024*)(td + 86 * 32 * 2);
  153283. #endif
  153284. r = vy;
  153285. sp_1024_point_from_ecc_point_32(p, pm);
  153286. sp_1024_point_from_ecc_point_32(q, qm);
  153287. err = sp_1024_mod_mul_norm_32(p->x, p->x, p1024_mod);
  153288. }
  153289. if (err == MP_OKAY) {
  153290. err = sp_1024_mod_mul_norm_32(p->y, p->y, p1024_mod);
  153291. }
  153292. if (err == MP_OKAY) {
  153293. err = sp_1024_mod_mul_norm_32(p->z, p->z, p1024_mod);
  153294. }
  153295. if (err == MP_OKAY) {
  153296. err = sp_1024_mod_mul_norm_32(q->x, q->x, p1024_mod);
  153297. }
  153298. if (err == MP_OKAY) {
  153299. err = sp_1024_mod_mul_norm_32(q->y, q->y, p1024_mod);
  153300. }
  153301. if (err == MP_OKAY) {
  153302. /* Generate pre-computation table: 1, 3, ... , 31 */
  153303. XMEMCPY(&pre_p[0], p, sizeof(sp_point_1024));
  153304. XMEMSET(pre_vx[0], 0, sizeof(sp_digit) * 2 * 32);
  153305. pre_vx[0][0] = 1;
  153306. XMEMSET(pre_vy[0], 0, sizeof(sp_digit) * 2 * 32);
  153307. sp_1024_mont_sub_32(pre_nvy[0], p1024_mod, pre_vy[0], p1024_mod);
  153308. /* [2]P for adding */
  153309. XMEMCPY(c, p, sizeof(sp_point_1024));
  153310. XMEMSET(vx, 0, sizeof(sp_digit) * 2 * 32);
  153311. vx[0] = 1;
  153312. XMEMSET(vy, 0, sizeof(sp_digit) * 2 * 32);
  153313. sp_1024_accumulate_line_dbl_32(vx, vy, c, q, t);
  153314. /* 3, 5, ... */
  153315. for (i = 1; i < 16; i++) {
  153316. XMEMCPY(&pre_p[i], &pre_p[i-1], sizeof(sp_point_1024));
  153317. XMEMCPY(pre_vx[i], pre_vx[i-1], sizeof(sp_digit) * 2 * 32);
  153318. XMEMCPY(pre_vy[i], pre_vy[i-1], sizeof(sp_digit) * 2 * 32);
  153319. sp_1024_proj_mul_32(pre_vx[i], pre_vy[i], vx, vy, t);
  153320. sp_1024_accumulate_line_add_n_32(pre_vx[i], pre_vy[i], c,
  153321. q, &pre_p[i], t, 0);
  153322. sp_1024_mont_sub_32(pre_nvy[i], p1024_mod, pre_vy[i], p1024_mod);
  153323. }
  153324. j = sp_1024_order_op[0] / 2;
  153325. XMEMCPY(c, &pre_p[j], sizeof(sp_point_1024));
  153326. XMEMCPY(vx, pre_vx[j], sizeof(sp_digit) * 2 * 32);
  153327. XMEMCPY(vy, pre_vy[j], sizeof(sp_digit) * 2 * 32);
  153328. /* Accumulate line into v and double point n times. */
  153329. sp_1024_accumulate_line_dbl_n_32(vx, vy, c, q,
  153330. sp_1024_order_op[1], t);
  153331. for (i = 2; i < 290; i += 2) {
  153332. j = sp_1024_order_op[i];
  153333. if (j > 0) {
  153334. j /= 2;
  153335. /* Accumulate line into v and add P into C. */
  153336. sp_1024_proj_mul_32(vx, vy, pre_vx[j], pre_vy[j], t);
  153337. sp_1024_accumulate_line_add_n_32(vx, vy, &pre_p[j], q, c,
  153338. t, 0);
  153339. }
  153340. else {
  153341. j = -j / 2;
  153342. /* Accumulate line into v and add P into C. */
  153343. sp_1024_proj_mul_32(vx, vy, pre_vx[j], pre_nvy[j], t);
  153344. sp_1024_accumulate_line_add_n_32(vx, vy, &pre_p[j], q, c,
  153345. t, 1);
  153346. }
  153347. /* Accumulate line into v and double point n times. */
  153348. sp_1024_accumulate_line_dbl_n_32(vx, vy, c, q,
  153349. sp_1024_order_op[i + 1], t);
  153350. }
  153351. /* Final exponentiation */
  153352. sp_1024_proj_sqr_32(vx, vy, t);
  153353. sp_1024_proj_sqr_32(vx, vy, t);
  153354. /* Convert from PF_p[q] to F_p */
  153355. sp_1024_mont_inv_32(vx, vx, t);
  153356. sp_1024_mont_mul_32(r, vx, vy, p1024_mod, p1024_mp_mod);
  153357. XMEMSET(r + 32, 0, sizeof(sp_digit) * 32);
  153358. sp_1024_mont_reduce_32(r, p1024_mod, p1024_mp_mod);
  153359. err = sp_1024_to_mp(r, res);
  153360. }
  153361. #if (defined(WOLFSSL_SP_SMALL) && !defined(WOLFSSL_SP_NO_MALLOC)) || \
  153362. defined(WOLFSSL_SP_SMALL_STACK)
  153363. if (td != NULL) {
  153364. XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  153365. }
  153366. #endif
  153367. sp_1024_point_free_32(c, 1, NULL);
  153368. sp_1024_point_free_32(q, 1, NULL);
  153369. sp_1024_point_free_32(p, 1, NULL);
  153370. return err;
  153371. }
  153372. #endif /* WOLFSSL_SP_SMALL */
  153373. #ifdef WOLFSSL_SP_SMALL
  153374. /*
  153375. * Generate table for pairing.
  153376. *
  153377. * Small implementation does not use a table - returns 0 length.
  153378. *
  153379. * pm [in] Point to generate table for.
  153380. * table [in] Generated table.
  153381. * len [in,out] On in, the size of the buffer.
  153382. * On out, length of table generated.
  153383. * @return 0 on success.
  153384. * LENGTH_ONLY_E when table is NULL and only length returned.
  153385. * BUFFER_E when len is too small.
  153386. */
  153387. int sp_Pairing_gen_precomp_1024(const ecc_point* pm, byte* table,
  153388. word32* len)
  153389. {
  153390. int err = 0;
  153391. if (table == NULL) {
  153392. *len = 0;
  153393. err = LENGTH_ONLY_E;
  153394. }
  153395. else if (*len != 0) {
  153396. err = BUFFER_E;
  153397. }
  153398. (void)*pm;
  153399. return err;
  153400. }
  153401. /*
  153402. * Calculate r = pairing <P, Q>.
  153403. *
  153404. * That is, multiply base in PF_p[q] by the scalar s, such that s.P = Q.
  153405. *
  153406. * Small implementation does not use a table - use the normal implementation.
  153407. *
  153408. * @param [in] pm First point on E(F_p)[q].
  153409. * @param [in] qm Second point on E(F_p)[q].
  153410. * @param [in] res Result of calculation.
  153411. * @param [in] table Precomputed table of values.
  153412. * @param [in] len Length of precomputed table of values in bytes.
  153413. * @return 0 on success.
  153414. * @return MEMORY_E when dynamic memory allocation fails.
  153415. */
  153416. int sp_Pairing_precomp_1024(const ecc_point* pm, const ecc_point* qm,
  153417. mp_int* res, const byte* table, word32 len)
  153418. {
  153419. (void)table;
  153420. (void)len;
  153421. return sp_Pairing_1024(pm, qm, res);
  153422. }
  153423. #else
  153424. /*
  153425. * Calc l and c for the point when doubling p.
  153426. *
  153427. * l = 3 * (p.x^2 - 1) / (2 * p.y)
  153428. * c = l * p.x - p.y
  153429. *
  153430. * @param [out] lr Gradient result - table entry.
  153431. * @param [out] cr Constant result - table entry.
  153432. * @param [in] px X-ordinate of point to double.
  153433. * @param [in] py Y-ordinate of point to double.
  153434. * @param [in] t SP temporaries (3 used).
  153435. */
  153436. static void sp_1024_accum_dbl_calc_lc_32(sp_digit* lr, sp_digit* cr,
  153437. const sp_digit* px, const sp_digit* py, sp_digit* t)
  153438. {
  153439. sp_digit* t1 = t + 33 * 2 * 32;
  153440. sp_digit* t2 = t + 34 * 2 * 32;
  153441. sp_digit* l = t + 35 * 2 * 32;
  153442. /* l = 1 / 2 * p.y */
  153443. sp_1024_mont_dbl_32(l, py, p1024_mod);
  153444. sp_1024_mont_inv_32(l, l, t);
  153445. /* t1 = p.x^2 */
  153446. sp_1024_mont_sqr_32(t1, px, p1024_mod, p1024_mp_mod);
  153447. /* t1 = p.x - 1 */
  153448. sp_1024_mont_sub_32(t1, t1, p1024_norm_mod, p1024_mod);
  153449. /* t1 = 3 * (p.x^2 - 1) */
  153450. sp_1024_mont_dbl_32(t2, t1, p1024_mod);
  153451. sp_1024_mont_add_32(t1, t1, t2, p1024_mod);
  153452. /* t1 = 3 * (p.x^2 - 1) / (2 * p.y) */
  153453. sp_1024_mont_mul_32(l, l, t1, p1024_mod, p1024_mp_mod);
  153454. /* t2 = l * p.x */
  153455. sp_1024_mont_mul_32(t2, l, px, p1024_mod, p1024_mp_mod);
  153456. /* c = t2 = l * p.x - p.y */
  153457. sp_1024_mont_sub_32(t2, t2, py, p1024_mod);
  153458. XMEMCPY(lr, l, sizeof(sp_digit) * 32);
  153459. XMEMCPY(cr, t2, sizeof(sp_digit) * 32);
  153460. }
  153461. /*
  153462. * Calc l and c when adding p and c.
  153463. *
  153464. * l = (c.y - p.y) / (c.x - p.x)
  153465. * c = (p.x * c.y - cx * p.y) / (cx - p.x)
  153466. *
  153467. * @param [out] lr Gradient result - table entry.
  153468. * @param [out] cr Constant result - table entry.
  153469. * @param [in] px X-ordinate of point to add.
  153470. * @param [in] py Y-ordinate of point to add.
  153471. * @param [in] cx X-ordinate of current point.
  153472. * @param [in] cy Y-ordinate of current point.
  153473. * @param [in] t SP temporaries (3 used).
  153474. */
  153475. static void sp_1024_accum_add_calc_lc_32(sp_digit* lr, sp_digit* cr,
  153476. const sp_digit* px, const sp_digit* py, const sp_digit* cx,
  153477. const sp_digit* cy, sp_digit* t)
  153478. {
  153479. sp_digit* t1 = t + 33 * 2 * 32;
  153480. sp_digit* c = t + 34 * 2 * 32;
  153481. sp_digit* l = t + 35 * 2 * 32;
  153482. /* l = 1 / (c.x - p.x) */
  153483. sp_1024_mont_sub_32(l, cx, px, p1024_mod);
  153484. sp_1024_mont_inv_32(l, l, t);
  153485. /* c = p.x * c.y */
  153486. sp_1024_mont_mul_32(c, px, cy, p1024_mod, p1024_mp_mod);
  153487. /* t1 = c.x * p.y */
  153488. sp_1024_mont_mul_32(t1, cx, py, p1024_mod, p1024_mp_mod);
  153489. /* c = (p.x * c.y) - (c.x * p.y) */
  153490. sp_1024_mont_sub_32(c, c, t1, p1024_mod);
  153491. /* c = ((p.x * c.y) - (c.x * p.y)) / (c.x - p.x) */
  153492. sp_1024_mont_mul_32(c, c, l, p1024_mod, p1024_mp_mod);
  153493. /* t1 = c.y - p.y */
  153494. sp_1024_mont_sub_32(t1, cy, py, p1024_mod);
  153495. /* l = (c.y - p.y) / (c.x - p.x) */
  153496. sp_1024_mont_mul_32(l, t1, l, p1024_mod, p1024_mp_mod);
  153497. XMEMCPY(lr, l, sizeof(sp_digit) * 32);
  153498. XMEMCPY(cr, c, sizeof(sp_digit) * 32);
  153499. }
  153500. /*
  153501. * Calculate vx and vy given gradient l and constant c and point q.
  153502. *
  153503. * l is a the gradient and is multiplied by q->x.
  153504. * c is a the constant that is added to the multiplicative result.
  153505. * q->y is the y-ordinate in result to multiply.
  153506. *
  153507. * if dbl
  153508. * v* = v*^2
  153509. * r.x = l * q.x + c
  153510. * r.y = q->y
  153511. * v* = v* * r*
  153512. *
  153513. * @param [in,out] vx X-ordinate of projective value in F*.
  153514. * @param [in,out] vy Y-ordinate of projective value in F*.
  153515. * @param [in] l Gradient to multiply with.
  153516. * @param [in] c Constant to add with.
  153517. * @param [in] q ECC point - second point on E(F_P^2).
  153518. * @param [in] t SP temporaries (3 used).
  153519. * @param [in] dbl Indicates whether this is for doubling. Otherwise
  153520. * adding.
  153521. */
  153522. static void sp_1024_accumulate_line_lc_32(sp_digit* vx, sp_digit* vy,
  153523. const sp_digit* l, const sp_digit* c, const sp_point_1024* q,
  153524. sp_digit* t, int dbl)
  153525. {
  153526. sp_digit* rx = t + 4 * 2 * 32;
  153527. /* v = v^2 */
  153528. if (dbl) {
  153529. sp_1024_proj_sqr_32(vx, vy, t);
  153530. }
  153531. /* rx = l * q.x + c */
  153532. sp_1024_mont_mul_32(rx, l, q->x, p1024_mod, p1024_mp_mod);
  153533. sp_1024_mont_add_32(rx, rx, c, p1024_mod);
  153534. /* v = v^2 * r */
  153535. sp_1024_proj_mul_32(vx, vy, rx, q->y, t);
  153536. }
  153537. /* Operations to perform based on order - 1.
  153538. * Sliding window. Start at bottom and stop when bottom bit is one.
  153539. * Subtract if top bit in window is one.
  153540. * Width of 6 bits.
  153541. * Pairs: #dbls, add/subtract window value
  153542. */
  153543. static const signed char sp_1024_order_op_pre[] = {
  153544. 5, 6, -13, 9, -21, 6, -5, 8, 31, 6, 3, 6, -27, 6, 25, 9,
  153545. -1, 6, -11, 6, -13, 6, -7, 6, -15, 6, -29, 7, 25, 6, -9, 6,
  153546. -19, 7, 3, 6, 11, 9, -23, 6, 1, 6, 27, 6, 1, 7, -25, 8,
  153547. 13, 7, -13, 7, -23, 10, 19, 7, 7, 7, -3, 7, 27, 6, -7, 7,
  153548. -21, 7, 11, 7, 31, 8, 1, 7, -23, 6, -17, 6, -3, 10, 11, 6,
  153549. -21, 7, -27, 11, -29, 6, -1, 10, 15, 8, 27, 7, 17, 6, 17, 7,
  153550. -13, 8, 13, 6, 21, 7, -29, 6, 19, 7, -25, 6, 11, 9, 29, 7,
  153551. -7, 8, 27, 7, 29, 10, -1, 8, -7, 8, 17, 6, 17, 7, -27, 7,
  153552. -21, 6, -9, 6, -27, 12, -23, 6, 19, 6, 13, 6, -11, 7, 27, 6,
  153553. 17, 6, -7, 6, -25, 7, -29, 6, 9, 7, 7, 6, 13, 6, -25, 6,
  153554. -19, 6, 13, 6, -11, 6, 5, 8, 19, 6, -21, 8, 23, 7, 27, 6,
  153555. -13, 6, -19, 11, 29, 7, -15, 6, -9, 7, -21, 10, -3, 7, 21, 10,
  153556. 25, 6, -15, 6, -23, 6, 21, 6, 1, 6, 21, 7, -3, 6, -3, 7,
  153557. -7, 6, -23, 7, 7, 8, 15, 9, 5, 6, -11, 6, 21, 11, -27, 7,
  153558. 27, 6, -11, 6, 31, 6, -21, 6, 19, 6, -7, 8, -7, 13, -3, 6,
  153559. -7, 7, -3, 6, 1, 6, 7, 8, 19, 8, 11, 9, -9, 7, -31, 12,
  153560. 25, 6, -17, 9, -15, 7, 5, 6, 25, 7, -5, 7, -25, 6, 17, 8,
  153561. -19, 6, -13, 6, 27, 8, 1, 7, -5, 7, -1, 6, 21, 6, 3, 10,
  153562. -3, 1,
  153563. };
  153564. /*
  153565. * Generate table for pairing.
  153566. *
  153567. * Calculate the graident (l) and constant (c) at each step of the way.
  153568. * Sliding window. Start at bottom and stop when bottom bit is one.
  153569. * Subtract if top bit in window is one.
  153570. * Width of 6 bits.
  153571. *
  153572. * pm [in] Point to generate table for.
  153573. * table [in] Generated table.
  153574. * len [in,out] On in, the size of the buffer.
  153575. * On out, length of table generated.
  153576. * @return 0 on success.
  153577. * LENGTH_ONLY_E when table is NULL and only length returned.
  153578. * BUFFER_E when len is too small.
  153579. * MEMORY_E when dynamic memory allocation fauls.
  153580. */
  153581. int sp_Pairing_gen_precomp_1024(const ecc_point* pm, byte* table,
  153582. word32* len)
  153583. {
  153584. int err = 0;
  153585. #if (defined(WOLFSSL_SP_SMALL) && !defined(WOLFSSL_SP_NO_MALLOC)) || \
  153586. defined(WOLFSSL_SP_SMALL_STACK)
  153587. sp_digit* td = NULL;
  153588. sp_digit* t;
  153589. sp_point_1024* pre_p;
  153590. #else
  153591. sp_digit t[36 * 2 * 32];
  153592. sp_point_1024 pre_p[16];
  153593. sp_point_1024 pd;
  153594. sp_point_1024 cd;
  153595. sp_point_1024 negd;
  153596. #endif
  153597. sp_point_1024* p = NULL;
  153598. sp_point_1024* c = NULL;
  153599. sp_point_1024* neg = NULL;
  153600. int i;
  153601. int j;
  153602. int k;
  153603. sp_table_entry_1024* precomp = (sp_table_entry_1024*)table;
  153604. if (table == NULL) {
  153605. *len = sizeof(sp_table_entry_1024) * 1167;
  153606. err = LENGTH_ONLY_E;
  153607. }
  153608. if ((err == MP_OKAY) &&
  153609. (*len < (int)(sizeof(sp_table_entry_1024) * 1167))) {
  153610. err = BUFFER_E;
  153611. }
  153612. if (err == MP_OKAY) {
  153613. err = sp_1024_point_new_32(NULL, pd, p);
  153614. }
  153615. if (err == MP_OKAY) {
  153616. err = sp_1024_point_new_32(NULL, cd, c);
  153617. }
  153618. if (err == MP_OKAY) {
  153619. err = sp_1024_point_new_32(NULL, negd, neg);
  153620. }
  153621. #if (defined(WOLFSSL_SP_SMALL) && !defined(WOLFSSL_SP_NO_MALLOC)) || \
  153622. defined(WOLFSSL_SP_SMALL_STACK)
  153623. if (err == MP_OKAY) {
  153624. td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 36 * 32 * 2 + 16 *
  153625. sizeof(sp_point_1024), NULL, DYNAMIC_TYPE_TMP_BUFFER);
  153626. if (td == NULL) {
  153627. err = MEMORY_E;
  153628. }
  153629. }
  153630. #endif
  153631. if (err == MP_OKAY) {
  153632. #if (defined(WOLFSSL_SP_SMALL) && !defined(WOLFSSL_SP_NO_MALLOC)) || \
  153633. defined(WOLFSSL_SP_SMALL_STACK)
  153634. t = td;
  153635. pre_p = (sp_point_1024*)(td + 36 * 32 * 2);
  153636. #endif
  153637. sp_1024_point_from_ecc_point_32(p, pm);
  153638. err = sp_1024_mod_mul_norm_32(p->x, p->x, p1024_mod);
  153639. }
  153640. if (err == MP_OKAY) {
  153641. err = sp_1024_mod_mul_norm_32(p->y, p->y, p1024_mod);
  153642. }
  153643. if (err == MP_OKAY) {
  153644. XMEMCPY(p->z, p1024_norm_mod, sizeof(p1024_norm_mod));
  153645. neg->infinity = 0;
  153646. c->infinity = 0;
  153647. /* Generate pre-computation table: 1, 3, ... , 31 */
  153648. XMEMCPY(&pre_p[0], p, sizeof(sp_point_1024));
  153649. /* [2]P for adding */
  153650. sp_1024_proj_point_dbl_32(c, p, t);
  153651. /* 1, 3, ... */
  153652. for (i = 1; i < 16; i++) {
  153653. sp_1024_proj_point_add_32(&pre_p[i], &pre_p[i-1], c, t);
  153654. sp_1024_mont_map_32(&pre_p[i], t);
  153655. }
  153656. k = 0;
  153657. j = sp_1024_order_op_pre[0] / 2;
  153658. XMEMCPY(c, &pre_p[j], sizeof(sp_point_1024));
  153659. for (j = 0; j < sp_1024_order_op_pre[1]; j++) {
  153660. sp_1024_accum_dbl_calc_lc_32(precomp[k].x, precomp[k].y, c->x,
  153661. c->y, t);
  153662. k++;
  153663. sp_1024_proj_point_dbl_32(c, c, t);
  153664. sp_1024_mont_map_32(c, t);
  153665. }
  153666. for (i = 2; i < 290; i += 2) {
  153667. j = sp_1024_order_op_pre[i];
  153668. if (j > 0) {
  153669. sp_1024_accum_add_calc_lc_32(precomp[k].x, precomp[k].y,
  153670. pre_p[j/2].x, pre_p[j/2].y, c->x, c->y, t);
  153671. k++;
  153672. sp_1024_proj_point_add_32(c, c, &pre_p[j/2], t);
  153673. sp_1024_mont_map_32(c, t);
  153674. }
  153675. else {
  153676. XMEMCPY(neg->x, pre_p[-j / 2].x, sizeof(pre_p->x));
  153677. sp_1024_mont_sub_32(neg->y, p1024_mod, pre_p[-j / 2].y,
  153678. p1024_mod);
  153679. XMEMCPY(neg->z, pre_p[-j / 2].z, sizeof(pre_p->z));
  153680. sp_1024_accum_add_calc_lc_32(precomp[k].x, precomp[k].y,
  153681. neg->x, neg->y, c->x, c->y, t);
  153682. k++;
  153683. sp_1024_proj_point_add_32(c, c, neg, t);
  153684. sp_1024_mont_map_32(c, t);
  153685. }
  153686. for (j = 0; j < sp_1024_order_op_pre[i + 1]; j++) {
  153687. sp_1024_accum_dbl_calc_lc_32(precomp[k].x, precomp[k].y, c->x,
  153688. c->y, t);
  153689. k++;
  153690. sp_1024_proj_point_dbl_32(c, c, t);
  153691. sp_1024_mont_map_32(c, t);
  153692. }
  153693. }
  153694. *len = sizeof(sp_table_entry_1024) * 1167;
  153695. }
  153696. #if (defined(WOLFSSL_SP_SMALL) && !defined(WOLFSSL_SP_NO_MALLOC)) || \
  153697. defined(WOLFSSL_SP_SMALL_STACK)
  153698. if (td != NULL) {
  153699. XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  153700. }
  153701. #endif
  153702. sp_1024_point_free_32(neg, 1, NULL);
  153703. sp_1024_point_free_32(c, 1, NULL);
  153704. sp_1024_point_free_32(p, 1, NULL);
  153705. return err;
  153706. }
  153707. /*
  153708. * Calculate r = pairing <P, Q>.
  153709. *
  153710. * That is, multiply base in PF_p[q] by the scalar s, such that s.P = Q.
  153711. *
  153712. * Sliding window. Start at bottom and stop when bottom bit is one.
  153713. * Subtract if top bit in window is one.
  153714. * Width of 6 bits.
  153715. * Pre-generate values in window (1, 3, ...) - only V.
  153716. * Table contains all gradient l and a constant for each point on the path.
  153717. *
  153718. * @param [in] pm First point on E(F_p)[q].
  153719. * @param [in] qm Second point on E(F_p)[q].
  153720. * @param [in] res Result of calculation.
  153721. * @param [in] table Precomputed table of values.
  153722. * @param [in] len Length of precomputed table of values in bytes.
  153723. * @return 0 on success.
  153724. * @return MEMORY_E when dynamic memory allocation fails.
  153725. */
  153726. int sp_Pairing_precomp_1024(const ecc_point* pm, const ecc_point* qm,
  153727. mp_int* res, const byte* table, word32 len)
  153728. {
  153729. int err = 0;
  153730. #if (defined(WOLFSSL_SP_SMALL) && !defined(WOLFSSL_SP_NO_MALLOC)) || \
  153731. defined(WOLFSSL_SP_SMALL_STACK)
  153732. sp_digit* td = NULL;
  153733. sp_digit* t;
  153734. sp_digit* vx;
  153735. sp_digit* vy;
  153736. sp_digit (*pre_vx)[64];
  153737. sp_digit (*pre_vy)[64];
  153738. sp_digit (*pre_nvy)[64];
  153739. #else
  153740. sp_digit t[36 * 2 * 32];
  153741. sp_digit vx[2 * 32];
  153742. sp_digit vy[2 * 32];
  153743. sp_digit pre_vx[16][64];
  153744. sp_digit pre_vy[16][64];
  153745. sp_digit pre_nvy[16][64];
  153746. sp_point_1024 pd;
  153747. sp_point_1024 qd;
  153748. sp_point_1024 cd;
  153749. #endif
  153750. sp_point_1024* p = NULL;
  153751. sp_point_1024* q = NULL;
  153752. sp_point_1024* c = NULL;
  153753. sp_digit* r = NULL;
  153754. int i;
  153755. int j;
  153756. int k;
  153757. const sp_table_entry_1024* precomp = (const sp_table_entry_1024*)table;
  153758. if (len < (int)(sizeof(sp_table_entry_1024) * 1167)) {
  153759. err = BUFFER_E;
  153760. }
  153761. if (err == MP_OKAY) {
  153762. err = sp_1024_point_new_32(NULL, pd, p);
  153763. }
  153764. if (err == MP_OKAY) {
  153765. err = sp_1024_point_new_32(NULL, qd, q);
  153766. }
  153767. if (err == MP_OKAY) {
  153768. err = sp_1024_point_new_32(NULL, cd, c);
  153769. }
  153770. #if (defined(WOLFSSL_SP_SMALL) && !defined(WOLFSSL_SP_NO_MALLOC)) || \
  153771. defined(WOLFSSL_SP_SMALL_STACK)
  153772. if (err == MP_OKAY) {
  153773. td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 86 * 32 * 2, NULL,
  153774. DYNAMIC_TYPE_TMP_BUFFER);
  153775. if (td == NULL) {
  153776. err = MEMORY_E;
  153777. }
  153778. }
  153779. #endif
  153780. if (err == MP_OKAY) {
  153781. #if (defined(WOLFSSL_SP_SMALL) && !defined(WOLFSSL_SP_NO_MALLOC)) || \
  153782. defined(WOLFSSL_SP_SMALL_STACK)
  153783. t = td;
  153784. vx = td + 36 * 32 * 2;
  153785. vy = td + 37 * 32 * 2;
  153786. pre_vx = (sp_digit(*)[64])(td + 38 * 32 * 2);
  153787. pre_vy = (sp_digit(*)[64])(td + 54 * 32 * 2);
  153788. pre_nvy = (sp_digit(*)[64])(td + 70 * 32 * 2);
  153789. #endif
  153790. r = vy;
  153791. sp_1024_point_from_ecc_point_32(p, pm);
  153792. sp_1024_point_from_ecc_point_32(q, qm);
  153793. err = sp_1024_mod_mul_norm_32(p->x, p->x, p1024_mod);
  153794. }
  153795. if (err == MP_OKAY) {
  153796. err = sp_1024_mod_mul_norm_32(p->y, p->y, p1024_mod);
  153797. }
  153798. if (err == MP_OKAY) {
  153799. err = sp_1024_mod_mul_norm_32(p->z, p->z, p1024_mod);
  153800. }
  153801. if (err == MP_OKAY) {
  153802. err = sp_1024_mod_mul_norm_32(q->x, q->x, p1024_mod);
  153803. }
  153804. if (err == MP_OKAY) {
  153805. err = sp_1024_mod_mul_norm_32(q->y, q->y, p1024_mod);
  153806. }
  153807. if (err == MP_OKAY) {
  153808. /* Generate pre-computation table: 1, 3, ... , 31 */
  153809. XMEMSET(pre_vx[0], 0, sizeof(sp_digit) * 2 * 32);
  153810. pre_vx[0][0] = 1;
  153811. XMEMSET(pre_vy[0], 0, sizeof(sp_digit) * 2 * 32);
  153812. sp_1024_mont_sub_32(pre_nvy[0], p1024_mod, pre_vy[0], p1024_mod);
  153813. /* [2]P for adding */
  153814. XMEMCPY(c, p, sizeof(sp_point_1024));
  153815. XMEMSET(vx, 0, sizeof(sp_digit) * 2 * 32);
  153816. vx[0] = 1;
  153817. XMEMSET(vy, 0, sizeof(sp_digit) * 2 * 32);
  153818. sp_1024_accumulate_line_dbl_32(vx, vy, c, q, t);
  153819. /* 3, 5, ... */
  153820. for (i = 1; i < 16; i++) {
  153821. XMEMCPY(pre_vx[i], pre_vx[i-1], sizeof(sp_digit) * 2 * 32);
  153822. XMEMCPY(pre_vy[i], pre_vy[i-1], sizeof(sp_digit) * 2 * 32);
  153823. sp_1024_proj_mul_32(pre_vx[i], pre_vy[i], vx, vy, t);
  153824. sp_1024_accumulate_line_add_n_32(pre_vx[i], pre_vy[i], c,
  153825. q, p, t, 0);
  153826. sp_1024_mont_sub_32(pre_nvy[i], p1024_mod, pre_vy[i],
  153827. p1024_mod);
  153828. }
  153829. XMEMCPY(c->z, p1024_norm_mod, sizeof(sp_digit) * 32);
  153830. c->infinity = 0;
  153831. j = sp_1024_order_op_pre[0] / 2;
  153832. XMEMCPY(vx, pre_vx[j], sizeof(sp_digit) * 2 * 32);
  153833. XMEMCPY(vy, pre_vy[j], sizeof(sp_digit) * 2 * 32);
  153834. k = 0;
  153835. for (j = 0; j < sp_1024_order_op_pre[1]; j++) {
  153836. /* Accumulate line into v and double point. */
  153837. sp_1024_accumulate_line_lc_32(vx, vy, precomp[k].x,
  153838. precomp[k].y, q, t, 1);
  153839. k++;
  153840. }
  153841. for (i = 2; i < 290; i += 2) {
  153842. sp_1024_accumulate_line_lc_32(vx, vy, precomp[k].x,
  153843. precomp[k].y, q, t, 0);
  153844. k++;
  153845. j = sp_1024_order_op_pre[i];
  153846. if (j > 0) {
  153847. j /= 2;
  153848. /* Accumulate line into v. */
  153849. sp_1024_proj_mul_32(vx, vy, pre_vx[j], pre_vy[j], t);
  153850. }
  153851. else {
  153852. j = -j / 2;
  153853. /* Accumulate line into v. */
  153854. sp_1024_proj_mul_32(vx, vy, pre_vx[j], pre_nvy[j], t);
  153855. }
  153856. for (j = 0; j < sp_1024_order_op_pre[i + 1]; j++) {
  153857. /* Accumulate line into v and double point. */
  153858. sp_1024_accumulate_line_lc_32(vx, vy, precomp[k].x,
  153859. precomp[k].y, q, t, 1);
  153860. k++;
  153861. }
  153862. }
  153863. /* Final exponentiation */
  153864. sp_1024_proj_sqr_32(vx, vy, t);
  153865. sp_1024_proj_sqr_32(vx, vy, t);
  153866. /* Convert from PF_p[q] to F_p */
  153867. sp_1024_mont_inv_32(vx, vx, t);
  153868. sp_1024_mont_mul_32(r, vx, vy, p1024_mod, p1024_mp_mod);
  153869. XMEMSET(r + 32, 0, sizeof(sp_digit) * 32);
  153870. sp_1024_mont_reduce_32(r, p1024_mod, p1024_mp_mod);
  153871. err = sp_1024_to_mp(r, res);
  153872. }
  153873. #if (defined(WOLFSSL_SP_SMALL) && !defined(WOLFSSL_SP_NO_MALLOC)) || \
  153874. defined(WOLFSSL_SP_SMALL_STACK)
  153875. if (td != NULL) {
  153876. XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  153877. }
  153878. #endif
  153879. sp_1024_point_free_32(c, 1, NULL);
  153880. sp_1024_point_free_32(q, 1, NULL);
  153881. sp_1024_point_free_32(p, 1, NULL);
  153882. return err;
  153883. }
  153884. #endif /* WOLFSSL_SP_SMALL */
  153885. #ifdef HAVE_ECC_CHECK_KEY
  153886. /* Read big endian unsigned byte array into r.
  153887. *
  153888. * r A single precision integer.
  153889. * size Maximum number of bytes to convert
  153890. * a Byte array.
  153891. * n Number of bytes in array to read.
  153892. */
  153893. static void sp_1024_from_bin(sp_digit* r, int size, const byte* a, int n)
  153894. {
  153895. int i;
  153896. int j;
  153897. byte* d;
  153898. for (i = n - 1,j = 0; i >= 3; i -= 4) {
  153899. r[j] = ((sp_digit)a[i - 0] << 0) |
  153900. ((sp_digit)a[i - 1] << 8) |
  153901. ((sp_digit)a[i - 2] << 16) |
  153902. ((sp_digit)a[i - 3] << 24);
  153903. j++;
  153904. }
  153905. if (i >= 0) {
  153906. r[j] = 0;
  153907. d = (byte*)r;
  153908. switch (i) {
  153909. case 2: d[n - 1 - 2] = a[2]; //fallthrough
  153910. case 1: d[n - 1 - 1] = a[1]; //fallthrough
  153911. case 0: d[n - 1 - 0] = a[0]; //fallthrough
  153912. }
  153913. j++;
  153914. }
  153915. for (; j < size; j++) {
  153916. r[j] = 0;
  153917. }
  153918. }
  153919. /* Check that the x and y ordinates are a valid point on the curve.
  153920. *
  153921. * point EC point.
  153922. * heap Heap to use if dynamically allocating.
  153923. * returns MEMORY_E if dynamic memory allocation fails, MP_VAL if the point is
  153924. * not on the curve and MP_OKAY otherwise.
  153925. */
  153926. static int sp_1024_ecc_is_point_32(const sp_point_1024* point,
  153927. void* heap)
  153928. {
  153929. #ifdef WOLFSSL_SP_SMALL_STACK
  153930. sp_digit* t1 = NULL;
  153931. #else
  153932. sp_digit t1[32 * 4];
  153933. #endif
  153934. sp_digit* t2 = NULL;
  153935. sp_int32 n;
  153936. int err = MP_OKAY;
  153937. #ifdef WOLFSSL_SP_SMALL_STACK
  153938. t1 = (sp_digit*)XMALLOC(sizeof(sp_digit) * 32 * 4, heap, DYNAMIC_TYPE_ECC);
  153939. if (t1 == NULL)
  153940. err = MEMORY_E;
  153941. #endif
  153942. (void)heap;
  153943. if (err == MP_OKAY) {
  153944. t2 = t1 + 2 * 32;
  153945. /* y^2 - x^3 - a.x = b */
  153946. sp_1024_sqr_32(t1, point->y);
  153947. (void)sp_1024_mod_32(t1, t1, p1024_mod);
  153948. sp_1024_sqr_32(t2, point->x);
  153949. (void)sp_1024_mod_32(t2, t2, p1024_mod);
  153950. sp_1024_mul_32(t2, t2, point->x);
  153951. (void)sp_1024_mod_32(t2, t2, p1024_mod);
  153952. sp_1024_mont_sub_32(t1, t1, t2, p1024_mod);
  153953. /* y^2 - x^3 + 3.x = b, when a = -3 */
  153954. sp_1024_mont_add_32(t1, t1, point->x, p1024_mod);
  153955. sp_1024_mont_add_32(t1, t1, point->x, p1024_mod);
  153956. sp_1024_mont_add_32(t1, t1, point->x, p1024_mod);
  153957. n = sp_1024_cmp_32(t1, p1024_mod);
  153958. sp_1024_cond_sub_32(t1, t1, p1024_mod, ~(n >> 31));
  153959. sp_1024_norm_32(t1);
  153960. if (!sp_1024_iszero_32(t1)) {
  153961. err = MP_VAL;
  153962. }
  153963. }
  153964. #ifdef WOLFSSL_SP_SMALL_STACK
  153965. if (t1 != NULL)
  153966. XFREE(t1, heap, DYNAMIC_TYPE_ECC);
  153967. #endif
  153968. return err;
  153969. }
  153970. /* Check that the x and y ordinates are a valid point on the curve.
  153971. *
  153972. * pX X ordinate of EC point.
  153973. * pY Y ordinate of EC point.
  153974. * returns MEMORY_E if dynamic memory allocation fails, MP_VAL if the point is
  153975. * not on the curve and MP_OKAY otherwise.
  153976. */
  153977. int sp_ecc_is_point_1024(const mp_int* pX, const mp_int* pY)
  153978. {
  153979. #ifdef WOLFSSL_SP_SMALL_STACK
  153980. sp_point_1024* pub = NULL;
  153981. #else
  153982. sp_point_1024 pub[1];
  153983. #endif
  153984. const byte one[1] = { 1 };
  153985. int err = MP_OKAY;
  153986. #ifdef WOLFSSL_SP_SMALL_STACK
  153987. pub = (sp_point_1024*)XMALLOC(sizeof(sp_point_1024), NULL,
  153988. DYNAMIC_TYPE_ECC);
  153989. if (pub == NULL)
  153990. err = MEMORY_E;
  153991. #endif
  153992. if (err == MP_OKAY) {
  153993. sp_1024_from_mp(pub->x, 32, pX);
  153994. sp_1024_from_mp(pub->y, 32, pY);
  153995. sp_1024_from_bin(pub->z, 32, one, (int)sizeof(one));
  153996. err = sp_1024_ecc_is_point_32(pub, NULL);
  153997. }
  153998. #ifdef WOLFSSL_SP_SMALL_STACK
  153999. if (pub != NULL)
  154000. XFREE(pub, NULL, DYNAMIC_TYPE_ECC);
  154001. #endif
  154002. return err;
  154003. }
  154004. /* Check that the private scalar generates the EC point (px, py), the point is
  154005. * on the curve and the point has the correct order.
  154006. *
  154007. * pX X ordinate of EC point.
  154008. * pY Y ordinate of EC point.
  154009. * privm Private scalar that generates EC point.
  154010. * returns MEMORY_E if dynamic memory allocation fails, MP_VAL if the point is
  154011. * not on the curve, ECC_INF_E if the point does not have the correct order,
  154012. * ECC_PRIV_KEY_E when the private scalar doesn't generate the EC point and
  154013. * MP_OKAY otherwise.
  154014. */
  154015. int sp_ecc_check_key_1024(const mp_int* pX, const mp_int* pY,
  154016. const mp_int* privm, void* heap)
  154017. {
  154018. #ifdef WOLFSSL_SP_SMALL_STACK
  154019. sp_digit* priv = NULL;
  154020. sp_point_1024* pub = NULL;
  154021. #else
  154022. sp_digit priv[32];
  154023. sp_point_1024 pub[2];
  154024. #endif
  154025. sp_point_1024* p = NULL;
  154026. const byte one[1] = { 1 };
  154027. int err = MP_OKAY;
  154028. /* Quick check the lengs of public key ordinates and private key are in
  154029. * range. Proper check later.
  154030. */
  154031. if (((mp_count_bits(pX) > 1024) ||
  154032. (mp_count_bits(pY) > 1024) ||
  154033. ((privm != NULL) && (mp_count_bits(privm) > 1024)))) {
  154034. err = ECC_OUT_OF_RANGE_E;
  154035. }
  154036. #ifdef WOLFSSL_SP_SMALL_STACK
  154037. if (err == MP_OKAY) {
  154038. pub = (sp_point_1024*)XMALLOC(sizeof(sp_point_1024) * 2, heap,
  154039. DYNAMIC_TYPE_ECC);
  154040. if (pub == NULL)
  154041. err = MEMORY_E;
  154042. }
  154043. if (err == MP_OKAY && privm) {
  154044. priv = (sp_digit*)XMALLOC(sizeof(sp_digit) * 32, heap,
  154045. DYNAMIC_TYPE_ECC);
  154046. if (priv == NULL)
  154047. err = MEMORY_E;
  154048. }
  154049. #endif
  154050. if (err == MP_OKAY) {
  154051. p = pub + 1;
  154052. sp_1024_from_mp(pub->x, 32, pX);
  154053. sp_1024_from_mp(pub->y, 32, pY);
  154054. sp_1024_from_bin(pub->z, 32, one, (int)sizeof(one));
  154055. if (privm)
  154056. sp_1024_from_mp(priv, 32, privm);
  154057. /* Check point at infinitiy. */
  154058. if ((sp_1024_iszero_32(pub->x) != 0) &&
  154059. (sp_1024_iszero_32(pub->y) != 0)) {
  154060. err = ECC_INF_E;
  154061. }
  154062. }
  154063. /* Check range of X and Y */
  154064. if ((err == MP_OKAY) &&
  154065. ((sp_1024_cmp_32(pub->x, p1024_mod) >= 0) ||
  154066. (sp_1024_cmp_32(pub->y, p1024_mod) >= 0))) {
  154067. err = ECC_OUT_OF_RANGE_E;
  154068. }
  154069. if (err == MP_OKAY) {
  154070. /* Check point is on curve */
  154071. err = sp_1024_ecc_is_point_32(pub, heap);
  154072. }
  154073. if (err == MP_OKAY) {
  154074. /* Point * order = infinity */
  154075. err = sp_1024_ecc_mulmod_32(p, pub, p1024_order, 1, 1, heap);
  154076. }
  154077. /* Check result is infinity */
  154078. if ((err == MP_OKAY) && ((sp_1024_iszero_32(p->x) == 0) ||
  154079. (sp_1024_iszero_32(p->y) == 0))) {
  154080. err = ECC_INF_E;
  154081. }
  154082. if (privm) {
  154083. if (err == MP_OKAY) {
  154084. /* Base * private = point */
  154085. err = sp_1024_ecc_mulmod_base_32(p, priv, 1, 1, heap);
  154086. }
  154087. /* Check result is public key */
  154088. if ((err == MP_OKAY) &&
  154089. ((sp_1024_cmp_32(p->x, pub->x) != 0) ||
  154090. (sp_1024_cmp_32(p->y, pub->y) != 0))) {
  154091. err = ECC_PRIV_KEY_E;
  154092. }
  154093. }
  154094. #ifdef WOLFSSL_SP_SMALL_STACK
  154095. if (pub != NULL)
  154096. XFREE(pub, heap, DYNAMIC_TYPE_ECC);
  154097. if (priv != NULL)
  154098. XFREE(priv, heap, DYNAMIC_TYPE_ECC);
  154099. #endif
  154100. return err;
  154101. }
  154102. #endif
  154103. #endif /* WOLFSSL_SP_1024 */
  154104. #endif /* WOLFCRYPT_HAVE_SAKKE */
  154105. #endif /* WOLFSSL_HAVE_SP_ECC */
  154106. #endif /* WOLFSSL_SP_ARM32_ASM */
  154107. #endif /* WOLFSSL_HAVE_SP_RSA | WOLFSSL_HAVE_SP_DH | WOLFSSL_HAVE_SP_ECC */